->>>>>>> theirs
-=======
->>>>>>> theirs
@@ -703,15 +687,7 @@ export function ServicesNavigatorPage() {
{[
{ label: "Best fit", query: defaultQuery },
{ label: "Crisis", query: "crisis" },
-<<<<<<< ours
-<<<<<<< ours
- { label: "Culturally safe", query: "Aboriginal and Torres Strait Islander" },
-=======
- { label: "Culturally safe", query: "Aboriginal Torres Strait Islander" },
->>>>>>> theirs
-=======
{ label: "Culturally safe", query: "Aboriginal Torres Strait Islander" },
->>>>>>> theirs
{ label: "Phone referral", query: "phone referral" },
{ label: "Free", query: "free" },
{ label: "WA", query: "WA" },
diff --git a/src/components/ui-primitives.tsx b/src/components/ui-primitives.tsx
index c546c5ec8..a65bdb0d4 100644
--- a/src/components/ui-primitives.tsx
+++ b/src/components/ui-primitives.tsx
@@ -17,7 +17,7 @@ export function cn(...classes: Array) {
export const textMuted = "text-[color:var(--text-muted)]";
export const raisedCard = "rounded-lg border border-[color:var(--border)] bg-[color:var(--surface-raised)]";
-export const insetCard = "rounded-lg border border-[color:var(--border)] bg-[color:var(--surface-inset)]";
+const insetCard = "rounded-lg border border-[color:var(--border)] bg-[color:var(--surface-inset)]";
export const appBackdrop = "app-edge-backdrop";
export const glassPanel =
"rounded-lg border border-[color:var(--border-lux)] bg-[color:var(--surface-raised)] shadow-[var(--shadow-soft)]";
@@ -32,7 +32,7 @@ export const evidenceSurface =
"rounded-lg border border-[color:var(--border)] border-l-[3px] border-l-[color:var(--clinical-accent)] bg-[color:var(--surface-raised)] shadow-[var(--shadow-tight)]";
export const panel =
"rounded-lg border border-[color:var(--border-lux)] bg-[color:var(--surface-lux)] shadow-[var(--shadow-soft)] ring-1 ring-[color:var(--border-strong)]/20 dark:ring-[color:var(--border-strong)]/10";
-export const controlBase =
+const controlBase =
"inline-flex min-h-tap items-center justify-center gap-2 rounded-lg text-sm font-semibold transition active:translate-y-px focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:shadow-none";
export const primaryControl = `${controlBase} bg-[color:var(--command)] px-5 text-[color:var(--command-contrast)] shadow-[var(--shadow-tight)] hover:bg-[color:var(--command-hover)] hover:shadow-[var(--shadow-hover)]`;
export const floatingControl =
@@ -56,11 +56,11 @@ export const metadataPill =
export const subtleStatusPill =
"inline-flex min-h-7 items-center rounded-md border border-[color:var(--border)] bg-[color:var(--surface-wash)] px-2 text-xs font-semibold text-[color:var(--text-muted)]";
export const clinicalDivider = "border-t border-[color:var(--border)]/80";
-export const iconTile =
+const iconTile =
"grid h-9 w-9 shrink-0 place-items-center rounded-lg bg-[color:var(--clinical-accent-soft)] text-[color:var(--clinical-accent)]";
export const iconTilePremium =
"grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-[color:var(--clinical-accent-border)] bg-[color:var(--clinical-accent-soft)] text-[color:var(--clinical-accent)]";
-export const compactMetadataRow =
+const compactMetadataRow =
"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs font-semibold tabular-nums text-[color:var(--text-muted)]";
export const sheetSurface =
"rounded-t-xl border border-[color:var(--border-lux)] bg-[color:var(--surface-lux)] shadow-[var(--shadow-lux)] ring-1 ring-[color:var(--border-strong)]/20 backdrop-blur-xl dark:ring-[color:var(--border-strong)]/10 sm:rounded-lg";
@@ -98,7 +98,7 @@ export const clinicalNotesRow =
* exports are semantic handles only, so recipes and cascade rules cannot fight
* over input/button dimensions, states, or paint. */
export const chatComposerShellBase = "chat-composer-shell-base";
-export const chatComposerShellDelta = "chat-composer-shell-delta";
+const chatComposerShellDelta = "chat-composer-shell-delta";
export const chatComposerShell = `${chatComposerShellBase} ${chatComposerShellDelta}`;
export const chatComposerInput = "chat-composer-input";
export const chatComposerIconButton = "chat-composer-icon-button";
@@ -113,7 +113,7 @@ export const sidebarItem =
"flex min-h-tap min-w-0 w-full items-center gap-2 overflow-hidden rounded-lg px-2.5 text-sm font-semibold text-[color:var(--text-muted)] transition hover:bg-[color:var(--surface-subtle)] hover:text-[color:var(--text)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)] disabled:cursor-not-allowed disabled:opacity-50";
export const sidebarToolTile =
"grid min-h-16 place-items-center gap-1 rounded-lg border border-[color:var(--border)] bg-[color:var(--surface)] px-2 py-2 text-center text-xs font-semibold text-[color:var(--text)] shadow-[var(--shadow-inset)] transition hover:border-[color:var(--border-strong)] hover:bg-[color:var(--surface-subtle)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)]";
-export const statusDotBase = "inline-block h-2 w-2 shrink-0 rounded-full";
+const statusDotBase = "inline-block h-2 w-2 shrink-0 rounded-full";
export const statusDotReady = `${statusDotBase} bg-[color:var(--success)]`;
export const statusDotReview = `${statusDotBase} bg-[color:var(--warning)]`;
export const statusDotMuted = `${statusDotBase} bg-[color:var(--text-soft)]`;
@@ -125,7 +125,7 @@ export const toneDanger =
export const toneInfo = "border-[color:var(--info-border)] bg-[color:var(--info-soft)] text-[color:var(--info)]";
export const toneWarning =
"border-[color:var(--warning-border)] bg-[color:var(--warning-soft)] text-[color:var(--warning)]";
-export const toneWarningQuiet =
+const toneWarningQuiet =
"border-[color:var(--warning-border)]/60 bg-[color:var(--warning-soft)]/45 text-[color:var(--warning)]";
export const toneNeutral =
"border-[color:var(--border)] bg-[color:var(--surface-subtle)] text-[color:var(--text-muted)]";
diff --git a/src/lib/service-catalog-mapper.ts b/src/lib/service-catalog-mapper.ts
index 185677cc0..0ae6d7fe7 100644
--- a/src/lib/service-catalog-mapper.ts
+++ b/src/lib/service-catalog-mapper.ts
@@ -173,32 +173,14 @@ function buildSummaryCards(service: CatalogService): ServiceSummaryCard[] {
const bestUse = cleanField(service.best_use_indication) ?? cleanField(service.discharge_planning_usefulness);
if (bestUse) {
-<<<<<<< ours
-<<<<<<< ours
- cards.push({
- id: "best-use",
- label: "Best use",
- title: bestUse,
- detail: cleanField(service.patient_group) ?? cleanField(service.sections[0]) ?? "Clinical fit and referral priority",
-=======
- const title = compactBestUseTitle(bestUse);
- cards.push({
- id: "best-use",
- label: "Best use",
-=======
const title = compactBestUseTitle(bestUse);
cards.push({
id: "best-use",
label: "Best use",
->>>>>>> theirs
title,
detail:
compactBestUseTitle(cleanField(service.patient_group) ?? cleanField(service.sections[0]) ?? "") ||
(title === bestUse ? "Clinical fit and referral priority" : bestUse),
-<<<<<<< ours
->>>>>>> theirs
-=======
->>>>>>> theirs
});
}
diff --git a/supabase/functions/indexing-v3-agent/index.ts b/supabase/functions/indexing-v3-agent/index.ts
index 0fb407e86..f1c721ec0 100644
--- a/supabase/functions/indexing-v3-agent/index.ts
+++ b/supabase/functions/indexing-v3-agent/index.ts
@@ -1,5 +1,23 @@
import "jsr:@supabase/functions-js/edge-runtime.d.ts";
import postgres from "npm:postgres@3.4.7";
+import {
+ normalizeText,
+ tokenize,
+ safeRecord,
+ compactString,
+ uniqueStrings,
+ structuredProfileFromMetadata,
+ stringArrayFrom,
+ textItemsFrom,
+ sourceRegionsFromMetadata,
+ phraseLabelCandidates,
+ sha256Hex,
+ sleep,
+ normalizeLabelCandidate,
+ canonicalUnitType,
+ canonicalFieldType,
+} from "./utils.ts";
+
import {
completionGateFromRow,
deferralDecision,
@@ -214,10 +232,6 @@ async function authorizeRequest(req: Request): Promise {
return null;
}
-function normalizeText(v: string): string {
- return v.replace(/\s+/g, " ").trim();
-}
-
function assertEmbeddingDim(vec: unknown, context: string): asserts vec is number[] {
if (!Array.isArray(vec)) {
throw new Error(`${context} embedding must be an array`);
@@ -231,191 +245,6 @@ function assertEmbeddingDim(vec: unknown, context: string): asserts vec is numbe
}
}
-function tokenize(v: string): string[] {
- return Array.from(
- new Set(
- normalizeText(v)
- .toLowerCase()
- .split(/[^a-z0-9]+/g)
- .filter((x) => x.length > 2),
- ),
- ).slice(0, 40);
-}
-
-function safeRecord(value: unknown): Record {
- return value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {};
-}
-
-function compactString(value: unknown, limit = 180): string {
- const text = normalizeText(String(value ?? ""));
- return text.length > limit ? text.slice(0, limit).trim() : text;
-}
-
-function uniqueStrings(values: string[], limit = 20): string[] {
- const seen = new Set();
- const out: string[] = [];
- for (const value of values) {
- const normalized = normalizeText(value);
- const key = normalized.toLowerCase();
- if (!normalized || seen.has(key)) continue;
- seen.add(key);
- out.push(normalized);
- if (out.length >= limit) break;
- }
- return out;
-}
-
-function structuredProfileFromMetadata(metadata: Record): Record {
- return safeRecord(metadata.structured_visual_profile ?? metadata.v3_structured_visual);
-}
-
-function stringArrayFrom(value: unknown, limit = 20): string[] {
- if (!Array.isArray(value)) return [];
- return uniqueStrings(value.map((entry) => compactString(entry, 180)).filter(Boolean), limit);
-}
-
-function textItemsFrom(value: unknown): string[] {
- if (!Array.isArray(value)) return [];
- return value.flatMap((entry) => {
- if (typeof entry === "string") return [entry];
- const row = safeRecord(entry);
- return [row.label, row.name, row.parameter, row.value, row.threshold, row.action, row.management, row.source_text]
- .map((part) => compactString(part, 180))
- .filter(Boolean);
- });
-}
-
-function sourceRegionsFromMetadata(metadata: Record): Array> {
- const profile = structuredProfileFromMetadata(metadata);
- const regions = Array.isArray(profile.source_regions) ? profile.source_regions.map(safeRecord) : [];
- const metadataRegions = Array.isArray(metadata.source_regions) ? metadata.source_regions.map(safeRecord) : [];
- const directRegion = safeRecord(metadata.source_region);
- const bbox = Array.isArray(metadata.bbox) ? { bbox: metadata.bbox } : {};
- return [
- ...regions,
- ...metadataRegions,
- ...(Object.keys(directRegion).length ? [directRegion] : []),
- ...(Object.keys(bbox).length ? [bbox] : []),
- ].slice(0, 12);
-}
-
-const LABEL_STOPWORDS = new Set([
- "about",
- "above",
- "after",
- "again",
- "against",
- "also",
- "and",
- "are",
- "because",
- "been",
- "before",
- "being",
- "between",
- "both",
- "can",
- "for",
- "from",
- "has",
- "have",
- "how",
- "into",
- "not",
- "off",
- "onto",
- "other",
- "our",
- "out",
- "over",
- "should",
- "than",
- "that",
- "the",
- "their",
- "then",
- "there",
- "these",
- "this",
- "those",
- "under",
- "was",
- "were",
- "when",
- "where",
- "which",
- "while",
- "with",
- "within",
- "without",
-]);
-
-const GENERIC_LABELS = new Set([
- "document",
- "documents",
- "information",
- "guidance",
- "content",
- "summary",
- "section",
- "sections",
- "page",
- "table",
- "figure",
- "clinical",
- "patient",
- "patients",
- "management",
- "treatment",
-]);
-
-const CLINICAL_PHRASE_PATTERN =
- /\b(?:clozapine|lithium|olanzapine|haloperidol|benzodiazepine|lorazepam|diazepam|antipsychotic|antidepressant|insulin|heparin|warfarin|digoxin|dose|route|threshold|monitoring|observation|escalation|self harm|suicide|violence|agitation|risk matrix|flowchart|care plan|discharge|admission|assessment|screening|contraindication|side effect|adverse effect|fbc|anc|wbc|mmol|mg)\b(?:[\s:/-]+[a-z0-9]{3,}){0,3}/gi;
-
-function isLowQualityLabel(normalized: string): boolean {
- const tokens = normalized.split(/\s+/).filter(Boolean);
- if (tokens.length === 0 || tokens.length > 8) return true;
- if (!/[a-z]/.test(normalized)) return true;
- if (tokens.every((token) => LABEL_STOPWORDS.has(token))) return true;
- if (tokens.length === 1 && (LABEL_STOPWORDS.has(tokens[0]) || GENERIC_LABELS.has(tokens[0]))) return true;
- if (tokens.filter((token) => !LABEL_STOPWORDS.has(token)).length === 0) return true;
- return false;
-}
-
-function phraseLabelCandidates(text: string, limit = 6): string[] {
- const phrases = Array.from(text.matchAll(CLINICAL_PHRASE_PATTERN)).map((match) => match[0]);
- const tokens = normalizeText(text)
- .toLowerCase()
- .split(/[^a-z0-9]+/g)
- .filter((token) => token.length > 2 && !LABEL_STOPWORDS.has(token));
-
- for (let index = 0; index < tokens.length && phrases.length < limit * 2; index += 1) {
- const token = tokens[index];
- if (GENERIC_LABELS.has(token) && !/(risk|dose|monitor|threshold|flowchart|clozapine|lithium|agitation)/.test(token))
- continue;
- const next = tokens[index + 1];
- const third = tokens[index + 2];
- if (next) phrases.push([token, next, third].filter(Boolean).join(" "));
- }
-
- return uniqueStrings(
- phrases.map((phrase) => normalizeLabel(phrase)).filter((phrase) => !isLowQualityLabel(phrase)),
- limit,
- );
-}
-
-async function sha256Hex(input: string): Promise {
- const data = new TextEncoder().encode(input);
- const digest = await crypto.subtle.digest("SHA-256", data);
- return Array.from(new Uint8Array(digest))
- .map((b) => b.toString(16).padStart(2, "0"))
- .join("");
-}
-
-function sleep(ms: number): Promise {
- return new Promise((resolve) => setTimeout(resolve, ms));
-}
-
async function fetchEmbeddingBatch(texts: string[]): Promise {
let lastError: unknown = null;
@@ -878,52 +707,6 @@ function unitsFromStructured(image: ImageRow, structured: ReturnType,
rawLabel: string,
diff --git a/supabase/functions/indexing-v3-agent/utils.ts b/supabase/functions/indexing-v3-agent/utils.ts
new file mode 100644
index 000000000..24587d8ea
--- /dev/null
+++ b/supabase/functions/indexing-v3-agent/utils.ts
@@ -0,0 +1,241 @@
+// Extracted utilities for indexing-v3-agent
+
+export const LABEL_STOPWORDS = new Set([
+ "about",
+ "above",
+ "after",
+ "again",
+ "against",
+ "also",
+ "and",
+ "are",
+ "because",
+ "been",
+ "before",
+ "being",
+ "between",
+ "both",
+ "can",
+ "for",
+ "from",
+ "has",
+ "have",
+ "how",
+ "into",
+ "not",
+ "off",
+ "onto",
+ "other",
+ "our",
+ "out",
+ "over",
+ "should",
+ "than",
+ "that",
+ "the",
+ "their",
+ "then",
+ "there",
+ "these",
+ "this",
+ "those",
+ "under",
+ "was",
+ "were",
+ "when",
+ "where",
+ "which",
+ "while",
+ "with",
+ "within",
+ "without",
+]);
+
+export const GENERIC_LABELS = new Set([
+ "document",
+ "documents",
+ "information",
+ "guidance",
+ "content",
+ "summary",
+ "section",
+ "sections",
+ "page",
+ "table",
+ "figure",
+ "clinical",
+ "patient",
+ "patients",
+ "management",
+ "treatment",
+]);
+
+export function normalizeText(v: string): string {
+ return v.replace(/\s+/g, " ").trim();
+}
+
+export function tokenize(v: string): string[] {
+ return Array.from(
+ new Set(
+ normalizeText(v)
+ .toLowerCase()
+ .split(/[^a-z0-9]+/g)
+ .filter((x) => x.length > 2),
+ ),
+ ).slice(0, 40);
+}
+
+export function safeRecord(value: unknown): Record {
+ return value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {};
+}
+
+export function compactString(value: unknown, limit = 180): string {
+ const text = normalizeText(String(value ?? ""));
+ return text.length > limit ? text.slice(0, limit).trim() : text;
+}
+
+export function uniqueStrings(values: string[], limit = 20): string[] {
+ const seen = new Set();
+ const out: string[] = [];
+ for (const value of values) {
+ const normalized = normalizeText(value);
+ const key = normalized.toLowerCase();
+ if (!normalized || seen.has(key)) continue;
+ seen.add(key);
+ out.push(normalized);
+ if (out.length >= limit) break;
+ }
+ return out;
+}
+
+export function structuredProfileFromMetadata(metadata: Record): Record {
+ return safeRecord(metadata.structured_visual_profile ?? metadata.v3_structured_visual);
+}
+
+export function stringArrayFrom(value: unknown, limit = 20): string[] {
+ if (!Array.isArray(value)) return [];
+ return uniqueStrings(value.map((entry) => compactString(entry, 180)).filter(Boolean), limit);
+}
+
+export function textItemsFrom(value: unknown): string[] {
+ if (!Array.isArray(value)) return [];
+ return value.flatMap((entry) => {
+ if (typeof entry === "string") return [entry];
+ const row = safeRecord(entry);
+ return [row.label, row.name, row.parameter, row.value, row.threshold, row.action, row.management, row.source_text]
+ .map((part) => compactString(part, 180))
+ .filter(Boolean);
+ });
+}
+
+export function sourceRegionsFromMetadata(metadata: Record): Array> {
+ const profile = structuredProfileFromMetadata(metadata);
+ const regions = Array.isArray(profile.source_regions) ? profile.source_regions.map(safeRecord) : [];
+ const metadataRegions = Array.isArray(metadata.source_regions) ? metadata.source_regions.map(safeRecord) : [];
+ const directRegion = safeRecord(metadata.source_region);
+ const bbox = Array.isArray(metadata.bbox) ? { bbox: metadata.bbox } : {};
+ return [
+ ...regions,
+ ...metadataRegions,
+ ...(Object.keys(directRegion).length ? [directRegion] : []),
+ ...(Object.keys(bbox).length ? [bbox] : []),
+ ].slice(0, 12);
+}
+
+export function isLowQualityLabel(normalized: string): boolean {
+ const tokens = normalized.split(/\s+/).filter(Boolean);
+ if (tokens.length === 0 || tokens.length > 8) return true;
+ if (!/[a-z]/.test(normalized)) return true;
+ if (tokens.every((token) => LABEL_STOPWORDS.has(token))) return true;
+ if (tokens.length === 1 && (LABEL_STOPWORDS.has(tokens[0]) || GENERIC_LABELS.has(tokens[0]))) return true;
+ if (tokens.filter((token) => !LABEL_STOPWORDS.has(token)).length === 0) return true;
+ return false;
+}
+
+export function phraseLabelCandidates(text: string, limit = 6): string[] {
+ const phrases = Array.from(text.matchAll(CLINICAL_PHRASE_PATTERN)).map((match) => match[0]);
+ const tokens = normalizeText(text)
+ .toLowerCase()
+ .split(/[^a-z0-9]+/g)
+ .filter((token) => token.length > 2 && !LABEL_STOPWORDS.has(token));
+
+ for (let index = 0; index < tokens.length && phrases.length < limit * 2; index += 1) {
+ const token = tokens[index];
+ if (GENERIC_LABELS.has(token) && !/(risk|dose|monitor|threshold|flowchart|clozapine|lithium|agitation)/.test(token))
+ continue;
+ const next = tokens[index + 1];
+ const third = tokens[index + 2];
+ if (next) phrases.push([token, next, third].filter(Boolean).join(" "));
+ }
+
+ return uniqueStrings(
+ phrases.map((phrase) => normalizeLabel(phrase)).filter((phrase) => !isLowQualityLabel(phrase)),
+ limit,
+ );
+}
+
+export async function sha256Hex(input: string): Promise {
+ const data = new TextEncoder().encode(input);
+ const digest = await crypto.subtle.digest("SHA-256", data);
+ return Array.from(new Uint8Array(digest))
+ .map((b) => b.toString(16).padStart(2, "0"))
+ .join("");
+}
+
+export function sleep(ms: number): Promise {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+export function normalizeLabel(value: string): string {
+ const cleaned = normalizeText(
+ value
+ .toLowerCase()
+ .replace(/["'`]|[().,:;!?[\]{}]/g, " ")
+ .replace(/\s+/g, " "),
+ );
+ return cleaned.slice(0, 72).trim();
+}
+
+export function normalizeLabelCandidate(rawLabel: string): string | null {
+ const normalized = normalizeLabel(rawLabel);
+ if (!normalized || normalized.length < 3) return null;
+ if (["unknown", "n/a", "na", "tbc", "nil"].includes(normalized)) return null;
+ if (isLowQualityLabel(normalized)) return null;
+ return normalized;
+}
+
+export function canonicalUnitType(unitType: string): string {
+ switch (unitType) {
+ case "flowchart_step":
+ case "diagram_decision":
+ return "workflow_step";
+ case "table_threshold":
+ case "risk_matrix_cell":
+ return "threshold";
+ case "medication_chart_row":
+ return "medication_monitoring";
+ case "visual_askable_question":
+ return "askable_question";
+ case "visual_summary":
+ case "chart_finding":
+ default:
+ return "clinical_fact";
+ }
+}
+
+export function canonicalFieldType(unitType: string): string {
+ switch (unitType) {
+ case "flowchart_step":
+ case "diagram_decision":
+ case "medication_chart_row":
+ return "clinical_action";
+ case "table_threshold":
+ case "risk_matrix_cell":
+ return "threshold_fact";
+ case "visual_summary":
+ case "chart_finding":
+ case "visual_askable_question":
+ default:
+ return "image_caption";
+ }
+}
diff --git a/tests/private-access-routes.test.ts b/tests/private-access-routes.test.ts
index 9d64c5718..3a0547415 100644
--- a/tests/private-access-routes.test.ts
+++ b/tests/private-access-routes.test.ts
@@ -4921,7 +4921,6 @@ describe("private document API access", () => {
expectFeedbackTokenBoundToAnswer(body);
});
-<<<<<<< ours
it("runs non-stream document summaries through the governed summary path", async () => {
const answerQuestionWithScope = vi.fn();
const summarizeDocument = vi.fn(async () => ({
@@ -4931,11 +4930,6 @@ describe("private document API access", () => {
citations: [],
sources: [],
}));
-=======
- it("rejects non-stream document summaries before RAG/provider work", async () => {
- const answerQuestionWithScope = vi.fn();
- const summarizeDocument = vi.fn();
->>>>>>> theirs
const client = createSupabaseMock();
mockRuntime(client, { answerQuestionWithScope, summarizeDocument });
const { POST } = await import("../src/app/api/answer/route");
@@ -4950,7 +4944,6 @@ describe("private document API access", () => {
}),
}),
);
-<<<<<<< ours
const body = await payload(response);
expect(response.status).toBe(200);
@@ -4972,16 +4965,6 @@ describe("private document API access", () => {
p_summary_limit: 12,
}),
);
-=======
-
- expect(response.status).toBe(400);
- await expect(payload(response)).resolves.toMatchObject({
- error: "Document summaries require the streaming answer endpoint.",
- code: "summary_mode_stream_required",
- });
- expect(client.rpc).not.toHaveBeenCalled();
- expect(summarizeDocument).not.toHaveBeenCalled();
->>>>>>> theirs
expect(answerQuestionWithScope).not.toHaveBeenCalled();
});
diff --git a/tests/ui-tools.spec.ts b/tests/ui-tools.spec.ts
index a1e688348..7d152cad3 100644
--- a/tests/ui-tools.spec.ts
+++ b/tests/ui-tools.spec.ts
@@ -931,7 +931,9 @@ test.describe("Clinical KB tools launcher", () => {
await gotoLauncher(page, "/services?q=13YARN&focus=1&run=1");
await expect(page.getByRole("heading", { level: 1, name: /referral matches/i })).toBeVisible();
- await expect(page.getByText("Prioritised for crisis support, culturally safe access, and phone referral.")).toBeVisible();
+ await expect(
+ page.getByText("Prioritised for crisis support, culturally safe access, and phone referral."),
+ ).toBeVisible();
await expect(page.getByRole("button", { name: "Advanced service filters" })).toBeDisabled();
await expect(page.getByText("Advanced service filters are coming soon.")).toHaveCount(1);
diff --git a/tests/visual-evidence-tabs.dom.test.tsx b/tests/visual-evidence-tabs.dom.test.tsx
index 8bbaaaa84..5ee3fc5cc 100644
--- a/tests/visual-evidence-tabs.dom.test.tsx
+++ b/tests/visual-evidence-tabs.dom.test.tsx
@@ -3,6 +3,7 @@ import userEvent from "@testing-library/user-event";
import { describe, expect, it, vi } from "vitest";
import { MobileEvidenceSheetContent } from "@/components/clinical-dashboard/visual-evidence";
+import { ClinicalNotesChecklistPanel } from "@/components/clinical-dashboard/evidence-panels";
import type { AnswerRenderModel } from "@/lib/answer-render-policy";
import type { RagAnswer } from "@/lib/types";
import type { AnswerEvidenceMapRow } from "@/lib/ward-output";
@@ -137,8 +138,6 @@ describe("MobileEvidenceSheetContent tabs (jsdom)", () => {
expect(claims).toHaveAttribute("tabindex", "-1");
});
});
-<<<<<<< ours
-=======
describe("ClinicalNotesChecklistPanel visual-evidence boundary (jsdom)", () => {
it("does not expose raw table evidence suppressed by the render model", () => {
@@ -376,4 +375,3 @@ describe("ClinicalNotesChecklistPanel visual-evidence boundary (jsdom)", () => {
expect(screen.queryByText("monthly when stable")).not.toBeInTheDocument();
});
});
->>>>>>> theirs
diff --git a/worker/main.ts b/worker/main.ts
index 79b053481..87fcfca8e 100644
--- a/worker/main.ts
+++ b/worker/main.ts
@@ -1061,7 +1061,8 @@ async function uploadAndCaptionImages(
const { task, classificationCacheHit } = resolved;
const { candidate, index, image, perceptualHash, imageHash, nearbyText, tableMetadata, contextHash } = task;
let classification = redactImageClassification(resolved.classification);
- const retainedWithoutCaptioning = task.presetClassification?.skip_reason === "retained for document view without captioning";
+ const retainedWithoutCaptioning =
+ task.presetClassification?.skip_reason === "retained for document view without captioning";
const policyAssessment = assessClinicalImageUse({
imageType: classification.image_type,
searchable: classification.searchable,