import { test } from "node:test"; import assert from "node:assert/strict"; import { parseScriptedDecision, supportsNativeTools, pickTransport, formatResultsForModel, } from "./searchAgent"; import type { RetrievedVideo } from "./askRetrieval"; test("parseScriptedDecision reads a SEARCH line and strips quotes", () => { assert.deepEqual(parseScriptedDecision("SEARCH: graham platner"), { kind: "search", query: "graham platner", }); assert.deepEqual(parseScriptedDecision('SEARCH: "travel ban"'), { kind: "search", query: "travel ban", }); }); test("parseScriptedDecision tolerates code fences and surrounding prose", () => { const reply = "Sure, let me look.\n```\nSEARCH: senate campaign\n```"; assert.deepEqual(parseScriptedDecision(reply), { kind: "search", query: "senate campaign", }); }); test("parseScriptedDecision treats DONE or plain prose as done", () => { assert.deepEqual(parseScriptedDecision("DONE"), { kind: "done" }); assert.deepEqual(parseScriptedDecision("I have enough to answer."), { kind: "done", }); // A degenerate "SEARCH: done" is not a real query. assert.deepEqual(parseScriptedDecision("SEARCH: done"), { kind: "done" }); }); test("supportsNativeTools recognises tool-capable model families", () => { assert.equal(supportsNativeTools("anthropic", "claude-haiku-4-5"), true); assert.equal(supportsNativeTools("openai", "gpt-4o-mini"), true); assert.equal(supportsNativeTools("gemini", "gemini-2.5-flash"), true); assert.equal(supportsNativeTools("openai", "text-babbage-001"), false); assert.equal(supportsNativeTools("gemini", "palm-2"), false); }); test("pickTransport: auto by capability, explicit modes override", () => { assert.equal(pickTransport("openai", "gpt-4o", "auto"), "native"); assert.equal(pickTransport("openai", "mystery-model", "auto"), "scripted"); assert.equal(pickTransport("openai", "gpt-4o", "scripted"), "scripted"); assert.equal(pickTransport("gemini", "palm-2", "native"), "native"); }); test("formatResultsForModel numbers videos with channel, date, and clocks", () => { const videos: RetrievedVideo[] = [ { key: "a", videoId: "a", title: "Timeline of the trial", channel: "Rekieta", uploadDate: "20200101", snippets: [{ clock: "0:05", seconds: 5, text: "opening" }], }, ]; const out = formatResultsForModel(videos); assert.match(out, /1\. "Timeline of the trial" — Rekieta \[20200101\]/); assert.match(out, /0:05 opening/); assert.equal( formatResultsForModel([]), "No transcript excerpts matched that query.", ); });