{"version":3,"file":"matchers.mjs","names":[],"sources":["../../../../../../../ai/src/testing/matchers.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { expect } from \"vitest\";\nimport {\n  matchConverge,\n  matchOutputShape,\n  matchPassStep,\n  matchRouteTo,\n} from \"./matcher-logic\";\n\n/**\n * Custom Vitest matchers over the unified `@warlock.js/ai` report tree.\n *\n * - `toRouteTo(intent)` — a supervisor dispatched the named intent.\n * - `toConverge()` — a supervisor terminated cleanly on its own\n *   decision (not max-iterations / cancelled / error).\n * - `toPassStep(name)` — a workflow step completed successfully.\n * - `toOutputShape(schema)` — a result's `data` validates against a\n *   Standard Schema.\n *\n * @example\n * import { registerAiMatchers } from \"@warlock.js/ai\";\n * registerAiMatchers();\n *\n * expect(await supervisor.execute(input)).toRouteTo(\"critic\");\n * expect(await supervisor.execute(input)).toConverge();\n * expect(await workflow.execute(input)).toPassStep(\"draft\");\n * expect(await agent.execute(input, { output: schema })).toOutputShape(schema);\n */\nexport interface AiMatchers<R = unknown> {\n  /** Assert a supervisor dispatched the named intent across its run. */\n  toRouteTo(intent: string): R;\n  /** Assert a supervisor terminated cleanly on its own decision. */\n  toConverge(): R;\n  /** Assert a named workflow step completed successfully. */\n  toPassStep(stepName: string): R;\n  /** Assert a result's `data` validates against a Standard Schema. */\n  toOutputShape(schema: StandardSchemaV1): R;\n}\n\ndeclare module \"vitest\" {\n  // Vitest 4's augmentable `Matchers` interface is `Matchers<T = any>`\n  // — the type parameter must match exactly (TS2428) or the\n  // declaration is rejected. `T` is the assertion-chain return type.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  interface Matchers<T = any> extends AiMatchers<T> {}\n}\n\nlet registered = false;\n\n/**\n * Register the `@warlock.js/ai` custom matchers on Vitest's global\n * `expect`. Call once per test file (or in a shared import) before\n * using `toRouteTo` / `toConverge` / `toPassStep` / `toOutputShape`.\n * Idempotent — repeated calls are a no-op.\n *\n * @example\n * import { registerAiMatchers } from \"@warlock.js/ai\";\n * registerAiMatchers();\n */\nexport function registerAiMatchers(): void {\n  if (registered) {\n    return;\n  }\n\n  registered = true;\n\n  expect.extend({\n    toRouteTo(received: unknown, intent: string) {\n      return matchRouteTo(received as never, intent);\n    },\n    toConverge(received: unknown) {\n      return matchConverge(received as never);\n    },\n    toPassStep(received: unknown, stepName: string) {\n      return matchPassStep(received as never, stepName);\n    },\n    toOutputShape(received: unknown, schema: StandardSchemaV1) {\n      return matchOutputShape(received as never, schema);\n    },\n  });\n}\n"],"mappings":";;;;AA+CA,IAAI,aAAa;;;;;;;;;;;AAYjB,SAAgB,qBAA2B;CACzC,IAAI,YACF;CAGF,aAAa;CAEb,aAAO,OAAO;EACZ,UAAU,UAAmB,QAAgB;GAC3C,OAAO,aAAa,UAAmB,MAAM;EAC/C;EACA,WAAW,UAAmB;GAC5B,OAAO,cAAc,QAAiB;EACxC;EACA,WAAW,UAAmB,UAAkB;GAC9C,OAAO,cAAc,UAAmB,QAAQ;EAClD;EACA,cAAc,UAAmB,QAA0B;GACzD,OAAO,iBAAiB,UAAmB,MAAM;EACnD;CACF,CAAC;AACH"}