{"version":3,"file":"as-tool.mjs","names":[],"sources":["../../../../../../../ai/src/rag/as-tool.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { tool } from \"../tool/tool\";\nimport type { RetrieveOptions, RetrieveResult } from \"./contracts/citation.type\";\nimport type { RagAsToolOptions } from \"./contracts/rag-config.type\";\n\n/** The validated input shape of a rag tool. */\ntype RagToolInput = { query: string };\n\n/**\n * A minimal, schema-library-agnostic Standard Schema for `{ query: string }`.\n *\n * Built by hand (no `seal` / `zod` import) so `asTool()` stays dependency-\n * free and matches the framework's own `passthroughSchema` style — the\n * `~standard.validate` returns `{ issues }` on a bad shape so the tool\n * runtime surfaces a `SchemaValidationError` exactly like any other tool.\n */\nfunction ragToolSchema(): StandardSchemaV1<RagToolInput> {\n  return {\n    \"~standard\": {\n      version: 1,\n      vendor: \"warlock-ai-rag\",\n      validate: (value: unknown) => {\n        if (\n          !value ||\n          typeof value !== \"object\" ||\n          typeof (value as { query?: unknown }).query !== \"string\"\n        ) {\n          return {\n            issues: [{ message: \"rag tool input must be { query: string }\" }],\n          };\n        }\n\n        return { value: { query: (value as RagToolInput).query } };\n      },\n    },\n  };\n}\n\n/**\n * Build a `ToolContract<{ query: string }, RetrieveResult>` that exposes a\n * rag's `retrieve()` to an agent's `tools: []` loop.\n *\n * `retrieve()` is a leaf operation (no inner executable report to nest),\n * so the plain `tool()` factory is the right shape — not `compositeAsTool`.\n * The resulting contract has `invoke`, so `isExecutableTool` returns false\n * and `normalizeAgentTools` passes it through untouched. On a thrown\n * retrieval error the runtime serializes `{ error }` back to the agent for\n * self-correction; the run does not abort.\n *\n * The tool name defaults to `retrieve_<name>` — namespaced by the rag's\n * name because the agent tool surface has no duplicate-name collision\n * guard (first match wins silently).\n */\nexport function ragAsTool(\n  name: string,\n  retrieveFn: (query: string, options?: RetrieveOptions) => Promise<RetrieveResult>,\n  options: RagAsToolOptions = {},\n): ToolContract<RagToolInput, RetrieveResult> {\n  const toolName = options.name ?? `retrieve_${name}`;\n\n  return tool<RagToolInput, RetrieveResult>({\n    name: toolName,\n    description:\n      options.description ??\n      `Search the \"${name}\" knowledge base and return the most relevant cited passages for a query.`,\n    input: ragToolSchema(),\n    execute: async ({ query }) => retrieveFn(query, options.retrieve),\n  });\n}\n"],"mappings":";;;;;;;;;;;AAiBA,SAAS,gBAAgD;CACvD,OAAO,EACL,aAAa;EACX,SAAS;EACT,QAAQ;EACR,WAAW,UAAmB;GAC5B,IACE,CAAC,SACD,OAAO,UAAU,YACjB,OAAQ,MAA8B,UAAU,UAEhD,OAAO,EACL,QAAQ,CAAC,EAAE,SAAS,2CAA2C,CAAC,EAClE;GAGF,OAAO,EAAE,OAAO,EAAE,OAAQ,MAAuB,MAAM,EAAE;EAC3D;CACF,EACF;AACF;;;;;;;;;;;;;;;;AAiBA,SAAgB,UACd,MACA,YACA,UAA4B,CAAC,GACe;CAG5C,OAAO,KAAmC;EACxC,MAHe,QAAQ,QAAQ,YAAY;EAI3C,aACE,QAAQ,eACR,eAAe,KAAK;EACtB,OAAO,cAAc;EACrB,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,QAAQ,QAAQ;CAClE,CAAC;AACH"}