/** * 3 个留接口适配器(code_models / data / user_uploads)— 调用必抛 * NotImplementedAdapter 且 telemetry 必登记 error。 * * 这是反欺骗的关键 — 严禁返空数组让上游误以为查到 0 条。 */ import test from "node:test"; import assert from "node:assert/strict"; import { queryExternalKnowledge, NotImplementedAdapter } from "../index.ts"; import { _setTelemetryTestHook } from "../telemetry.ts"; const CAP = "cap_test_stubs"; test.beforeEach(() => { _setTelemetryTestHook(null); }); for (const kind of ["code_models", "data", "user_uploads"] as const) { test(`stub adapter '${kind}' throws NotImplementedAdapter + 登记 telemetry`, async () => { const calls: { adapter: string; error: string | null }[] = []; _setTelemetryTestHook((rec) => calls.push({ adapter: rec.adapter, error: rec.error }), ); await assert.rejects( () => queryExternalKnowledge({ kind, capabilityId: CAP, params: { foo: "bar" }, }), (err: unknown) => { assert.ok( err instanceof NotImplementedAdapter, "must throw NotImplementedAdapter, not return empty array", ); assert.equal((err as NotImplementedAdapter).kind, kind); return true; }, ); assert.equal(calls.length, 1, "telemetry must record exactly one call"); assert.equal(calls[0]?.adapter, kind); assert.ok( calls[0]?.error?.includes("interface-only"), `telemetry error must mention interface-only, got: ${calls[0]?.error}`, ); }); }