gauss-ai 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +489 -0
- package/LICENSE +21 -0
- package/README.md +269 -0
- package/dist/a2a/index.cjs +7 -0
- package/dist/a2a/index.cjs.map +1 -0
- package/dist/a2a/index.d.cts +30 -0
- package/dist/a2a/index.d.ts +30 -0
- package/dist/a2a/index.js +7 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/agent-UIQDSYCE.js +16 -0
- package/dist/agent-UIQDSYCE.js.map +1 -0
- package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
- package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
- package/dist/agent-graph-AMQYAWNF.js +1422 -0
- package/dist/agent-graph-AMQYAWNF.js.map +1 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
- package/dist/chat-A3XMRPJL.js +129 -0
- package/dist/chat-A3XMRPJL.js.map +1 -0
- package/dist/chunk-2ZRU47NC.js +91 -0
- package/dist/chunk-2ZRU47NC.js.map +1 -0
- package/dist/chunk-3LD3JTH4.cjs +18 -0
- package/dist/chunk-3LD3JTH4.cjs.map +1 -0
- package/dist/chunk-5FE5TG2W.cjs +16 -0
- package/dist/chunk-5FE5TG2W.cjs.map +1 -0
- package/dist/chunk-6XF673YC.cjs +436 -0
- package/dist/chunk-6XF673YC.cjs.map +1 -0
- package/dist/chunk-7CKWZJNS.js +230 -0
- package/dist/chunk-7CKWZJNS.js.map +1 -0
- package/dist/chunk-BI2G665F.js +4588 -0
- package/dist/chunk-BI2G665F.js.map +1 -0
- package/dist/chunk-C5NLWJS2.js +139 -0
- package/dist/chunk-C5NLWJS2.js.map +1 -0
- package/dist/chunk-CJZ66SU3.cjs +4321 -0
- package/dist/chunk-CJZ66SU3.cjs.map +1 -0
- package/dist/chunk-DAMT2CXW.cjs +91 -0
- package/dist/chunk-DAMT2CXW.cjs.map +1 -0
- package/dist/chunk-E7WG3MO5.js +18 -0
- package/dist/chunk-E7WG3MO5.js.map +1 -0
- package/dist/chunk-EFDM6R4J.js +99 -0
- package/dist/chunk-EFDM6R4J.js.map +1 -0
- package/dist/chunk-F7WIPPEO.js +256 -0
- package/dist/chunk-F7WIPPEO.js.map +1 -0
- package/dist/chunk-FAYDE67N.js +6927 -0
- package/dist/chunk-FAYDE67N.js.map +1 -0
- package/dist/chunk-GAE2KKCM.js +21 -0
- package/dist/chunk-GAE2KKCM.js.map +1 -0
- package/dist/chunk-INLNGRXM.cjs +130 -0
- package/dist/chunk-INLNGRXM.cjs.map +1 -0
- package/dist/chunk-JKXKXB5O.js +130 -0
- package/dist/chunk-JKXKXB5O.js.map +1 -0
- package/dist/chunk-K6SAETGP.js +375 -0
- package/dist/chunk-K6SAETGP.js.map +1 -0
- package/dist/chunk-KEASLAYR.js +157 -0
- package/dist/chunk-KEASLAYR.js.map +1 -0
- package/dist/chunk-KKJVNM6O.js +436 -0
- package/dist/chunk-KKJVNM6O.js.map +1 -0
- package/dist/chunk-KYIMVRIM.js +16 -0
- package/dist/chunk-KYIMVRIM.js.map +1 -0
- package/dist/chunk-MB7NXIZD.js +4321 -0
- package/dist/chunk-MB7NXIZD.js.map +1 -0
- package/dist/chunk-MHHDXPGE.js +209 -0
- package/dist/chunk-MHHDXPGE.js.map +1 -0
- package/dist/chunk-NE6JJA5W.js +401 -0
- package/dist/chunk-NE6JJA5W.js.map +1 -0
- package/dist/chunk-PF46XZBF.cjs +6927 -0
- package/dist/chunk-PF46XZBF.cjs.map +1 -0
- package/dist/chunk-PSJIAGDE.cjs +375 -0
- package/dist/chunk-PSJIAGDE.cjs.map +1 -0
- package/dist/chunk-PWOQDXNQ.js +16 -0
- package/dist/chunk-PWOQDXNQ.js.map +1 -0
- package/dist/chunk-QYOMQBBZ.cjs +230 -0
- package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
- package/dist/chunk-UDFXLC4J.cjs +16 -0
- package/dist/chunk-UDFXLC4J.cjs.map +1 -0
- package/dist/chunk-UO4NGXRT.cjs +259 -0
- package/dist/chunk-UO4NGXRT.cjs.map +1 -0
- package/dist/chunk-UPFDFLEW.js +40 -0
- package/dist/chunk-UPFDFLEW.js.map +1 -0
- package/dist/chunk-V55JSQS7.cjs +16 -0
- package/dist/chunk-V55JSQS7.cjs.map +1 -0
- package/dist/chunk-VJADHXZL.cjs +16 -0
- package/dist/chunk-VJADHXZL.cjs.map +1 -0
- package/dist/chunk-VRWD7LCI.js +59 -0
- package/dist/chunk-VRWD7LCI.js.map +1 -0
- package/dist/chunk-WKKQ443C.js +487 -0
- package/dist/chunk-WKKQ443C.js.map +1 -0
- package/dist/chunk-X2GHUHAF.js +436 -0
- package/dist/chunk-X2GHUHAF.js.map +1 -0
- package/dist/chunk-XLGW3XNI.cjs +256 -0
- package/dist/chunk-XLGW3XNI.cjs.map +1 -0
- package/dist/chunk-ZFJKX4DP.js +16 -0
- package/dist/chunk-ZFJKX4DP.js.map +1 -0
- package/dist/chunk-ZM2OEWM2.js +259 -0
- package/dist/chunk-ZM2OEWM2.js.map +1 -0
- package/dist/chunk-ZNAIP2XV.js +16 -0
- package/dist/chunk-ZNAIP2XV.js.map +1 -0
- package/dist/chunk-ZYFAZYSL.js +42 -0
- package/dist/chunk-ZYFAZYSL.js.map +1 -0
- package/dist/cli/index.js +421 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-4MHT6TQW.js +153 -0
- package/dist/config-4MHT6TQW.js.map +1 -0
- package/dist/config-REERQFK4.cjs +153 -0
- package/dist/config-REERQFK4.cjs.map +1 -0
- package/dist/cost-tracker-JLOU7IZJ.js +7 -0
- package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
- package/dist/demo-C52GMSYH.js +188 -0
- package/dist/demo-C52GMSYH.js.map +1 -0
- package/dist/deno/index.js +306 -0
- package/dist/deno/index.js.map +1 -0
- package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
- package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
- package/dist/dev-D7DDVDA4.js +218 -0
- package/dist/dev-D7DDVDA4.js.map +1 -0
- package/dist/edge/index.js +10 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
- package/dist/graph-MGFAQZ5W.js +50 -0
- package/dist/graph-MGFAQZ5W.js.map +1 -0
- package/dist/graph-visualization-HBSVQXJK.js +9 -0
- package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
- package/dist/index-BRgqNnh3.d.cts +982 -0
- package/dist/index-CZxpYUxZ.d.ts +982 -0
- package/dist/index.cjs +14789 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10275 -0
- package/dist/index.d.ts +10275 -0
- package/dist/index.js +14789 -0
- package/dist/index.js.map +1 -0
- package/dist/init-CFWXTQ35.js +133 -0
- package/dist/init-CFWXTQ35.js.map +1 -0
- package/dist/llm-VWO4MC7J.cjs +17 -0
- package/dist/llm-VWO4MC7J.cjs.map +1 -0
- package/dist/llm-XLXVSPBI.js +17 -0
- package/dist/llm-XLXVSPBI.js.map +1 -0
- package/dist/logging-WRAK5ZXT.js +33 -0
- package/dist/logging-WRAK5ZXT.js.map +1 -0
- package/dist/metrics-FAHZVVD4.js +47 -0
- package/dist/metrics-FAHZVVD4.js.map +1 -0
- package/dist/node/index.cjs +280 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +51 -0
- package/dist/node/index.d.ts +51 -0
- package/dist/node/index.js +280 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
- package/dist/persist-usage-WTBTCWEF.js +7 -0
- package/dist/persist-usage-WTBTCWEF.js.map +1 -0
- package/dist/plugin-RCPBWUUA.js +207 -0
- package/dist/plugin-RCPBWUUA.js.map +1 -0
- package/dist/plugins/index.cjs +75 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +8 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.js +75 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins-L4ING3CX.js +4625 -0
- package/dist/plugins-L4ING3CX.js.map +1 -0
- package/dist/providers/index.cjs +189 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +168 -0
- package/dist/providers/index.d.ts +168 -0
- package/dist/providers/index.js +189 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers-3RNQ5CKZ.js +59 -0
- package/dist/providers-3RNQ5CKZ.js.map +1 -0
- package/dist/providers-66GPXUGQ.cjs +59 -0
- package/dist/providers-66GPXUGQ.cjs.map +1 -0
- package/dist/repl-K6QN4I2S.js +678 -0
- package/dist/repl-K6QN4I2S.js.map +1 -0
- package/dist/rest/index.cjs +17 -0
- package/dist/rest/index.cjs.map +1 -0
- package/dist/rest/index.d.cts +102 -0
- package/dist/rest/index.d.ts +102 -0
- package/dist/rest/index.js +17 -0
- package/dist/rest/index.js.map +1 -0
- package/dist/runtime-deno.js +15 -0
- package/dist/runtime-deno.js.map +1 -0
- package/dist/runtime-edge.js +15 -0
- package/dist/runtime-edge.js.map +1 -0
- package/dist/runtime-node.js +15 -0
- package/dist/runtime-node.js.map +1 -0
- package/dist/scraping/index.cjs +11 -0
- package/dist/scraping/index.cjs.map +1 -0
- package/dist/scraping/index.d.cts +17 -0
- package/dist/scraping/index.d.ts +17 -0
- package/dist/scraping/index.js +11 -0
- package/dist/scraping/index.js.map +1 -0
- package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
- package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
- package/dist/server/index.js +166 -0
- package/dist/server/index.js.map +1 -0
- package/dist/testing/index.cjs +25 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +63 -0
- package/dist/testing/index.d.ts +63 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
- package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
- package/dist/tools-BZM33OBZ.js +10 -0
- package/dist/tools-BZM33OBZ.js.map +1 -0
- package/dist/tracing-XA3TEWP4.js +48 -0
- package/dist/tracing-XA3TEWP4.js.map +1 -0
- package/dist/types-CVsP7gFI.d.cts +235 -0
- package/dist/types-CVsP7gFI.d.ts +235 -0
- package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
- package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
- package/dist/workflow/index.cjs +9 -0
- package/dist/workflow/index.cjs.map +1 -0
- package/dist/workflow/index.d.cts +62 -0
- package/dist/workflow/index.d.ts +62 -0
- package/dist/workflow/index.js +9 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow.port-BaCttxrw.d.cts +153 -0
- package/dist/workflow.port-BaCttxrw.d.ts +153 -0
- package/package.json +230 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins/base.plugin.ts","../src/plugins/agent-card.plugin.ts","../src/plugins/a2a.plugin.ts","../src/plugins/a2a-handler.ts","../src/plugins/a2a-delegation.ts","../src/plugins/a2a-push.ts","../src/plugins/a2a-durable-task-queue.ts","../src/adapters/validation/zod-validation.adapter.ts","../src/plugins/utils/get-validator.ts","../src/plugins/guardrails.plugin.ts","../src/plugins/onecrawl.plugin.ts","../src/plugins/vectorless.plugin.ts","../src/adapters/chunking/default-chunking.adapter.ts","../src/adapters/reranking/default-reranking.adapter.ts","../src/plugins/evals.plugin.ts","../src/adapters/workflow/default-workflow.engine.ts","../src/plugins/workflow.plugin.ts","../src/plugins/utils/default-metrics.ts","../src/plugins/observability.plugin.ts","../src/plugins/semantic-scraping.plugin.ts","../src/adapters/semantic-scraping/semantic-scraping.adapter.ts","../src/plugins/semantic-web-search.plugin.ts","../src/plugins/mcp-server.plugin.ts","../src/adapters/mcp-server/default-mcp-server.adapter.ts"],"sourcesContent":["// =============================================================================\n// BasePlugin — Abstract base class for Agent plugins\n// =============================================================================\n\nimport type { Plugin, PluginHooks } from \"../ports/plugin.port.js\";\n\nexport abstract class BasePlugin implements Plugin {\n abstract readonly name: string;\n readonly version = \"1.0.0\";\n readonly hooks: PluginHooks;\n\n constructor() {\n this.hooks = this.buildHooks();\n }\n\n protected abstract buildHooks(): PluginHooks;\n}\n","// =============================================================================\n// AgentCardPlugin — Generates and serves agents.md / skills.md\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type {\n Plugin,\n PluginContext,\n PluginSetupContext,\n} from \"../ports/plugin.port.js\";\nimport type { FilesystemZone } from \"../types.js\";\n\nexport type AgentCardSource = \"manual\" | \"override\" | \"auto\";\n\nexport interface AgentCardSnapshot {\n agentsMd: string;\n skillsMd: string;\n source: {\n agents: AgentCardSource;\n skills: AgentCardSource;\n };\n}\n\nexport interface AgentCardProvider {\n getAgentCard(): Promise<AgentCardSnapshot>;\n}\n\ninterface AgentCardDocument {\n title: string;\n name: string;\n sessionId: string;\n maxSteps: number;\n summary: string;\n instructions: string;\n tools: string[];\n generatedAt: string;\n}\n\ninterface SkillsDocument {\n title: string;\n name: string;\n summary: string;\n skills: string[];\n generatedAt: string;\n}\n\nexport interface AgentCardPluginOptions {\n paths?: {\n agents?: string;\n skills?: string;\n };\n readZones?: FilesystemZone[];\n overrides?: {\n agents?: string | Partial<AgentCardDocument>;\n skills?: string | Partial<SkillsDocument>;\n };\n}\n\nconst DEFAULT_AGENTS_PATH = \"agents.md\";\nconst DEFAULT_SKILLS_PATH = \"skills.md\";\nconst DEFAULT_ZONES: FilesystemZone[] = [\"persistent\", \"transient\"];\n\nexport class AgentCardPlugin implements Plugin, AgentCardProvider {\n readonly name = \"agent-card\";\n readonly version = \"1.0.0\";\n readonly tools: Record<string, Tool<any, any>>;\n\n private readonly options: {\n paths: {\n agents: string;\n skills: string;\n };\n readZones: FilesystemZone[];\n overrides?: AgentCardPluginOptions[\"overrides\"];\n };\n\n private setupCtx?: PluginSetupContext;\n private latestCtx?: PluginContext;\n\n readonly hooks = {\n beforeRun: async (ctx: PluginContext, _params: { prompt: string }): Promise<void> => {\n this.latestCtx = ctx;\n },\n afterRun: async (\n ctx: PluginContext,\n _params: { result: { text: string; steps: unknown[]; sessionId: string } },\n ): Promise<void> => {\n this.latestCtx = ctx;\n },\n };\n\n constructor(options: AgentCardPluginOptions = {}) {\n this.options = {\n paths: {\n agents: options.paths?.agents ?? DEFAULT_AGENTS_PATH,\n skills: options.paths?.skills ?? DEFAULT_SKILLS_PATH,\n },\n readZones: options.readZones ?? DEFAULT_ZONES,\n overrides: options.overrides,\n };\n\n this.tools = {\n \"agent-card:get\": tool({\n description: \"Return generated or manual agent card documents.\",\n inputSchema: z.object({\n target: z.enum([\"agents\", \"skills\", \"all\"]).default(\"all\"),\n }),\n execute: async (args: unknown) => {\n const parsed = z\n .object({ target: z.enum([\"agents\", \"skills\", \"all\"]).default(\"all\") })\n .parse(args ?? {});\n\n const snapshot = await this.getAgentCard();\n\n if (parsed.target === \"agents\") {\n return {\n target: \"agents\",\n markdown: snapshot.agentsMd,\n source: snapshot.source.agents,\n };\n }\n\n if (parsed.target === \"skills\") {\n return {\n target: \"skills\",\n markdown: snapshot.skillsMd,\n source: snapshot.source.skills,\n };\n }\n\n return snapshot;\n },\n }),\n };\n }\n\n setup(ctx: PluginSetupContext): void {\n this.setupCtx = ctx;\n }\n\n async getAgentCard(): Promise<AgentCardSnapshot> {\n const ctx = this.latestCtx ?? this.setupCtx;\n if (!ctx) {\n throw new Error(\"AgentCardPlugin has not been initialized by a Agent instance\");\n }\n\n const agents = await this.resolveAgentsMarkdown(ctx);\n const skills = await this.resolveSkillsMarkdown(ctx);\n\n return {\n agentsMd: agents.markdown,\n skillsMd: skills.markdown,\n source: {\n agents: agents.source,\n skills: skills.source,\n },\n };\n }\n\n private async resolveAgentsMarkdown(\n ctx: PluginContext | PluginSetupContext,\n ): Promise<{ markdown: string; source: AgentCardSource }> {\n const manual = await this.tryReadManual(ctx, this.options.paths.agents);\n if (manual) return { markdown: manual, source: \"manual\" };\n\n const auto = this.createAutoAgentCard(ctx);\n const override = this.options.overrides?.agents;\n\n if (override !== undefined) {\n if (typeof override === \"string\") {\n return { markdown: override, source: \"override\" };\n }\n\n const merged = this.mergeAgentCard(auto, override);\n return { markdown: this.renderAgentCard(merged), source: \"override\" };\n }\n\n return { markdown: this.renderAgentCard(auto), source: \"auto\" };\n }\n\n private async resolveSkillsMarkdown(\n ctx: PluginContext | PluginSetupContext,\n ): Promise<{ markdown: string; source: AgentCardSource }> {\n const manual = await this.tryReadManual(ctx, this.options.paths.skills);\n if (manual) return { markdown: manual, source: \"manual\" };\n\n const auto = this.createAutoSkillsCard(ctx);\n const override = this.options.overrides?.skills;\n\n if (override !== undefined) {\n if (typeof override === \"string\") {\n return { markdown: override, source: \"override\" };\n }\n\n const merged = this.mergeSkillsCard(auto, override);\n return { markdown: this.renderSkillsCard(merged), source: \"override\" };\n }\n\n return { markdown: this.renderSkillsCard(auto), source: \"auto\" };\n }\n\n private async tryReadManual(\n ctx: PluginContext | PluginSetupContext,\n path: string,\n ): Promise<string | null> {\n for (const zone of this.options.readZones) {\n try {\n const exists = await ctx.filesystem.exists(path, zone);\n if (!exists) continue;\n return await ctx.filesystem.read(path, zone);\n } catch {\n // Ignore zone-level I/O errors and continue fallback order\n }\n }\n\n return null;\n }\n\n private createAutoAgentCard(ctx: PluginContext | PluginSetupContext): AgentCardDocument {\n const name = ctx.agentName ?? \"Agent\";\n const tools = [...ctx.toolNames].sort();\n\n return {\n title: \"Agent Card\",\n name,\n sessionId: ctx.sessionId,\n maxSteps: ctx.config.maxSteps,\n summary: `${name} exposes ${tools.length} tool${tools.length === 1 ? \"\" : \"s\"}.`,\n instructions: ctx.config.instructions,\n tools,\n generatedAt: new Date().toISOString(),\n };\n }\n\n private createAutoSkillsCard(ctx: PluginContext | PluginSetupContext): SkillsDocument {\n const name = ctx.agentName ?? \"Agent\";\n const skills = [...ctx.toolNames].sort();\n\n return {\n title: \"Skills Card\",\n name,\n summary: `${name} can invoke ${skills.length} callable skills/tools.`,\n skills,\n generatedAt: new Date().toISOString(),\n };\n }\n\n private mergeAgentCard(\n base: AgentCardDocument,\n override: Partial<AgentCardDocument>,\n ): AgentCardDocument {\n return {\n ...base,\n ...override,\n tools: override.tools ? [...override.tools] : base.tools,\n };\n }\n\n private mergeSkillsCard(\n base: SkillsDocument,\n override: Partial<SkillsDocument>,\n ): SkillsDocument {\n return {\n ...base,\n ...override,\n skills: override.skills ? [...override.skills] : base.skills,\n };\n }\n\n private renderAgentCard(doc: AgentCardDocument): string {\n const tools = doc.tools.length > 0\n ? doc.tools.map((toolName) => `- \\`${toolName}\\``)\n : [\"- _No tools registered_\"];\n\n return [\n `# ${doc.title}`,\n \"\",\n `- Name: ${doc.name}`,\n `- Session: ${doc.sessionId}`,\n `- Max Steps: ${doc.maxSteps}`,\n `- Generated At: ${doc.generatedAt}`,\n \"\",\n \"## Summary\",\n doc.summary,\n \"\",\n \"## Instructions\",\n doc.instructions,\n \"\",\n \"## Tools\",\n ...tools,\n \"\",\n ].join(\"\\n\");\n }\n\n private renderSkillsCard(doc: SkillsDocument): string {\n const skills = doc.skills.length > 0\n ? doc.skills.map((skill) => `- \\`${skill}\\``)\n : [\"- _No skills registered_\"];\n\n return [\n `# ${doc.title}`,\n \"\",\n `- Agent: ${doc.name}`,\n `- Generated At: ${doc.generatedAt}`,\n \"\",\n \"## Summary\",\n doc.summary,\n \"\",\n \"## Skills\",\n ...skills,\n \"\",\n ].join(\"\\n\");\n }\n}\n\nexport function createAgentCardPlugin(options?: AgentCardPluginOptions): AgentCardPlugin {\n return new AgentCardPlugin(options);\n}\n","// =============================================================================\n// A2APlugin — A2A server integration + remote A2A call tool\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type { AgentResult, AgentRunOptions } from \"../agent/agent.js\";\nimport type {\n Plugin,\n PluginContext,\n PluginSetupContext,\n} from \"../ports/plugin.port.js\";\nimport {\n createA2AHttpHandler,\n createA2AJsonRpcHandler,\n type A2AJsonRpcRequest,\n type A2AJsonRpcResponse,\n type A2ATask,\n type A2ATaskEvent,\n type A2ATasksSendParams,\n} from \"./a2a-handler.js\";\nimport type { AgentCardProvider } from \"./agent-card.plugin.js\";\nimport { A2ADelegationManager, type AgentCapability, type DelegationResult } from \"./a2a-delegation.js\";\nimport { A2APushNotifier, type PushNotificationConfig } from \"./a2a-push.js\";\nimport {\n A2ADurableTaskQueue,\n type A2ATaskLease,\n type A2ATaskQueueConfig,\n type A2ATaskQueueSnapshot,\n type A2ATaskRetryConfig,\n} from \"./a2a-durable-task-queue.js\";\n\n/** Default timeout for outbound A2A requests in ms (30 seconds) */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nconst DEFAULT_RETRY_CONFIG: A2ATaskRetryConfig = {\n maxAttempts: 3,\n initialBackoffMs: 250,\n backoffMultiplier: 2,\n maxBackoffMs: 30_000,\n jitterRatio: 0,\n};\n\nexport interface A2AAgentRuntime {\n sessionId: string;\n run(prompt: string, options?: AgentRunOptions): Promise<AgentResult>;\n}\n\nexport interface A2APluginOptions {\n fetch?: typeof fetch;\n requestTimeoutMs?: number;\n agentCardProvider?: AgentCardProvider;\n retry?: Partial<A2ATaskRetryConfig>;\n queue?: Partial<Pick<A2ATaskQueueConfig, \"leaseDurationMs\" | \"retentionMs\" | \"maxTerminalTasks\">>;\n taskQueue?: A2ADurableTaskQueue;\n persistQueueState?: boolean;\n}\n\nconst A2A_CALL_SCHEMA = z.object({\n endpoint: z.string().url(),\n method: z.enum([\"tasks/send\", \"tasks/get\", \"tasks/list\", \"tasks/cancel\", \"agent/card\", \"health\"]).default(\"tasks/send\"),\n prompt: z.string().optional(),\n taskId: z.string().optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst A2A_DELEGATE_SCHEMA = z.object({\n prompt: z.string(),\n requiredSkills: z.array(z.string()).default([]),\n});\n\nconst A2A_DISCOVER_SCHEMA = z.object({\n endpoint: z.string().url(),\n});\n\nconst A2A_SUBSCRIBE_SCHEMA = z.object({\n endpoint: z.string().url(),\n prompt: z.string(),\n taskId: z.string().optional(),\n});\n\nexport class A2APlugin implements Plugin {\n readonly name = \"a2a\";\n readonly version = \"1.0.0\";\n readonly tools: Record<string, Tool<any, any>>;\n\n private readonly fetchImpl: typeof fetch;\n private readonly requestTimeoutMs: number;\n private readonly agentCardProvider?: AgentCardProvider;\n private readonly taskQueue: A2ADurableTaskQueue;\n private readonly persistQueueStateEnabled: boolean;\n private readonly delegationManager: A2ADelegationManager;\n private readonly pushNotifier: A2APushNotifier;\n private readonly taskEventListeners = new Set<(event: A2ATaskEvent) => void>();\n\n private static readonly QUEUE_SNAPSHOT_KEY = \"a2a:durable-task-queue:v1\";\n private static readonly DEFAULT_MAX_TERMINAL_TASKS = 1000;\n private static readonly DEFAULT_RETENTION_MS = 3_600_000; // 1 hour\n\n private evictionTimer?: ReturnType<typeof setInterval>;\n private queueHydrated = false;\n private queueHydrationPromise: Promise<void> | null = null;\n\n private setupCtx?: PluginSetupContext;\n private latestCtx?: PluginContext;\n\n readonly hooks = {\n beforeRun: async (ctx: PluginContext, _params: { prompt: string }): Promise<void> => {\n this.latestCtx = ctx;\n if (this.isQueueManagedRun(ctx)) return;\n const taskId = this.getTaskIdFromContext(ctx);\n if (!taskId) return;\n this.markTaskRunning(taskId, this.getLeaseIdFromContext(ctx));\n },\n afterRun: async (\n ctx: PluginContext,\n params: { result: { text: string } },\n ): Promise<void> => {\n this.latestCtx = ctx;\n if (this.isQueueManagedRun(ctx)) return;\n const taskId = this.getTaskIdFromContext(ctx);\n if (!taskId) return;\n this.markTaskCompleted(taskId, params.result.text, this.getLeaseIdFromContext(ctx));\n },\n onError: async (\n ctx: PluginContext,\n params: { error: unknown; phase: \"run\" | \"stream\" | \"tool\" | \"step\" | \"setup\" },\n ): Promise<void> => {\n if (this.isQueueManagedRun(ctx)) return;\n const taskId = this.getTaskIdFromContext(ctx);\n if (!taskId) return;\n this.markTaskFailed(taskId, params.error, this.getLeaseIdFromContext(ctx));\n },\n };\n\n constructor(options: A2APluginOptions = {}) {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\"A2APlugin requires a fetch implementation\");\n }\n\n this.fetchImpl = fetchImpl;\n this.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.agentCardProvider = options.agentCardProvider;\n this.persistQueueStateEnabled = options.persistQueueState ?? true;\n this.delegationManager = new A2ADelegationManager(fetchImpl);\n this.pushNotifier = new A2APushNotifier(fetchImpl);\n\n const normalizedRetry: A2ATaskRetryConfig | undefined = options.retry\n ? {\n maxAttempts: options.retry.maxAttempts ?? DEFAULT_RETRY_CONFIG.maxAttempts,\n initialBackoffMs: options.retry.initialBackoffMs ?? DEFAULT_RETRY_CONFIG.initialBackoffMs,\n backoffMultiplier: options.retry.backoffMultiplier ?? DEFAULT_RETRY_CONFIG.backoffMultiplier,\n maxBackoffMs: options.retry.maxBackoffMs ?? DEFAULT_RETRY_CONFIG.maxBackoffMs,\n jitterRatio: options.retry.jitterRatio ?? DEFAULT_RETRY_CONFIG.jitterRatio,\n }\n : undefined;\n\n this.taskQueue = options.taskQueue ?? new A2ADurableTaskQueue({\n leaseDurationMs: options.queue?.leaseDurationMs,\n retentionMs: options.queue?.retentionMs ?? A2APlugin.DEFAULT_RETENTION_MS,\n maxTerminalTasks: options.queue?.maxTerminalTasks ?? A2APlugin.DEFAULT_MAX_TERMINAL_TASKS,\n retry: normalizedRetry,\n });\n\n this.evictionTimer = setInterval(() => this.evictStaleTasks(), 60_000);\n\n this.tools = {\n \"a2a:call\": tool({\n description: \"Call an external A2A-compatible JSON-RPC endpoint.\",\n inputSchema: A2A_CALL_SCHEMA,\n execute: async (input: unknown) => {\n const args = A2A_CALL_SCHEMA.parse(input ?? {});\n\n const params = this.normalizeCallParams(args);\n const payload: A2AJsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: args.method,\n params,\n };\n\n const response = await this.callRemoteEndpoint(args.endpoint, payload);\n\n if (response.error) {\n throw new Error(`[A2A ${response.error.code}] ${response.error.message}`);\n }\n\n return response.result;\n },\n }),\n \"a2a:delegate\": tool({\n description: \"Delegate a task to a registered agent based on required skills.\",\n inputSchema: A2A_DELEGATE_SCHEMA,\n execute: async (input: unknown) => {\n const args = A2A_DELEGATE_SCHEMA.parse(input ?? {});\n return await this.delegationManager.delegate(args.prompt, args.requiredSkills, this.fetchImpl);\n },\n }),\n \"a2a:discover\": tool({\n description: \"Discover agent capabilities at an A2A endpoint.\",\n inputSchema: A2A_DISCOVER_SCHEMA,\n execute: async (input: unknown) => {\n const args = A2A_DISCOVER_SCHEMA.parse(input ?? {});\n return await this.discoverAgent(args.endpoint);\n },\n }),\n \"a2a:subscribe\": tool({\n description: \"Subscribe to task status updates via Server-Sent Events.\",\n inputSchema: A2A_SUBSCRIBE_SCHEMA,\n execute: async (input: unknown) => {\n const args = A2A_SUBSCRIBE_SCHEMA.parse(input ?? {});\n return await this.subscribeToTask(args.endpoint, args.prompt, args.taskId);\n },\n }),\n };\n }\n\n setup(ctx: PluginSetupContext): void {\n this.setupCtx = ctx;\n void this.ensureQueueHydrated();\n }\n\n dispose(): void {\n if (this.evictionTimer) {\n clearInterval(this.evictionTimer);\n this.evictionTimer = undefined;\n }\n void this.persistQueueState();\n }\n\n createJsonRpcHandler(\n agent: A2AAgentRuntime,\n ): (request: A2AJsonRpcRequest) => Promise<A2AJsonRpcResponse> & { sendTaskSubscribe?: (params: A2ATasksSendParams) => AsyncGenerator<A2ATaskEvent, void, unknown> } {\n const plugin = this;\n\n const sendTaskSubscribe = async function* (params: A2ATasksSendParams): AsyncGenerator<A2ATaskEvent, void, unknown> {\n await plugin.ensureQueueHydrated();\n const taskId = params.taskId ?? crypto.randomUUID();\n\n const eventQueue: A2ATaskEvent[] = [];\n let completed = false;\n let pending: { promise: Promise<void>; resolve: () => void };\n\n function createDeferred(): { promise: Promise<void>; resolve: () => void } {\n let resolve!: () => void;\n const promise = new Promise<void>((r) => {\n resolve = r;\n });\n return { promise, resolve };\n }\n pending = createDeferred();\n\n const eventListener = (event: A2ATaskEvent) => {\n if (event.taskId === taskId) {\n eventQueue.push(event);\n if (event.type === \"task:completed\" || event.type === \"task:failed\" || event.type === \"task:cancelled\") {\n completed = true;\n }\n pending.resolve();\n pending = createDeferred();\n }\n };\n\n plugin.taskEventListeners.add(eventListener);\n plugin.queueTask(taskId, params.prompt, params.metadata);\n\n try {\n const runPromise = plugin.executeTaskWithRetry(agent, taskId, params);\n\n let lastEventIndex = 0;\n while (!completed) {\n if (eventQueue.length <= lastEventIndex) {\n await pending.promise;\n }\n\n for (let i = lastEventIndex; i < eventQueue.length; i++) {\n yield eventQueue[i];\n }\n\n lastEventIndex = eventQueue.length;\n }\n\n await runPromise;\n\n if (eventQueue.length > lastEventIndex) {\n for (let i = lastEventIndex; i < eventQueue.length; i++) {\n yield eventQueue[i];\n }\n }\n } finally {\n plugin.taskEventListeners.delete(eventListener);\n }\n };\n\n const jsonRpcHandler = createA2AJsonRpcHandler({\n sendTask: async (params) => {\n await plugin.ensureQueueHydrated();\n const taskId = params.taskId ?? crypto.randomUUID();\n plugin.queueTask(taskId, params.prompt, params.metadata);\n await plugin.executeTaskWithRetry(agent, taskId, params);\n return plugin.cloneTask(taskId);\n },\n sendTaskSubscribe,\n getTask: async (taskId) => {\n await plugin.ensureQueueHydrated();\n return plugin.getTask(taskId);\n },\n listTasks: async () => {\n await plugin.ensureQueueHydrated();\n return plugin.listTasks();\n },\n cancelTask: async (taskId) => {\n await plugin.ensureQueueHydrated();\n\n const previous = plugin.taskQueue.get(taskId);\n if (!previous) return null;\n\n const cancelled = plugin.taskQueue.cancel(taskId);\n if (!cancelled) return null;\n\n if (previous.status !== \"cancelled\" && previous.status !== \"completed\" && previous.status !== \"failed\") {\n plugin.emitTaskEvent(\"task:cancelled\", taskId);\n }\n void plugin.persistQueueState();\n return cancelled;\n },\n getAgentCard: async () => {\n return plugin.resolveAgentCard();\n },\n });\n\n (jsonRpcHandler as any).sendTaskSubscribe = sendTaskSubscribe;\n return jsonRpcHandler as any;\n }\n\n createHttpHandler(agent: A2AAgentRuntime): (request: Request) => Promise<Response> {\n const handler = this.createJsonRpcHandler(agent) as any;\n return createA2AHttpHandler(handler, {\n sendTaskSubscribe: async function* (params: A2ATasksSendParams): AsyncGenerator<A2ATaskEvent, void, unknown> {\n for await (const event of handler.sendTaskSubscribe(params)) {\n yield event;\n }\n },\n });\n }\n\n getTask(taskId: string): A2ATask | null {\n return this.taskQueue.get(taskId);\n }\n\n listTasks(): A2ATask[] {\n return this.taskQueue.list();\n }\n\n // Delegation methods\n registerAgent(agent: AgentCapability): void {\n this.delegationManager.register(agent);\n }\n\n unregisterAgent(name: string): void {\n this.delegationManager.unregister(name);\n }\n\n listAgents(): AgentCapability[] {\n return this.delegationManager.listAgents();\n }\n\n async delegateTask(prompt: string, requiredSkills: string[]): Promise<DelegationResult> {\n return await this.delegationManager.delegate(prompt, requiredSkills, this.fetchImpl);\n }\n\n // Push notification methods\n subscribeToTaskNotifications(taskId: string, config: PushNotificationConfig): void {\n this.pushNotifier.subscribe(taskId, config);\n }\n\n unsubscribeFromTaskNotifications(taskId: string, url: string): void {\n this.pushNotifier.unsubscribe(taskId, url);\n }\n\n private normalizeCallParams(args: z.infer<typeof A2A_CALL_SCHEMA>): Record<string, unknown> {\n if (args.params) {\n return {\n ...args.params,\n ...(args.prompt !== undefined ? { prompt: args.prompt } : {}),\n ...(args.taskId !== undefined ? { taskId: args.taskId } : {}),\n };\n }\n\n if (args.method === \"tasks/send\") {\n if (!args.prompt) {\n throw new Error(\"a2a:call requires `prompt` for tasks/send requests\");\n }\n return {\n prompt: args.prompt,\n ...(args.taskId !== undefined ? { taskId: args.taskId } : {}),\n };\n }\n\n if (args.method === \"tasks/get\" || args.method === \"tasks/cancel\") {\n if (!args.taskId) {\n throw new Error(`a2a:call requires \\`taskId\\` for ${args.method}`);\n }\n return { taskId: args.taskId };\n }\n\n return {};\n }\n\n private async callRemoteEndpoint(\n endpoint: string,\n payload: A2AJsonRpcRequest,\n ): Promise<A2AJsonRpcResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n\n try {\n const response = await this.fetchImpl(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`A2A endpoint returned HTTP ${response.status}`);\n }\n\n return await response.json() as A2AJsonRpcResponse;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private queueTask(\n taskId: string,\n prompt: string,\n metadata?: Record<string, unknown>,\n ): void {\n const now = new Date().toISOString();\n this.taskQueue.enqueue({\n id: taskId,\n status: \"queued\",\n prompt,\n metadata,\n createdAt: now,\n updatedAt: now,\n });\n this.emitTaskEvent(\"task:queued\", taskId);\n void this.persistQueueState();\n }\n\n private markTaskRunning(taskId: string, _leaseId?: string): A2ATaskLease | null {\n const lease = this.taskQueue.acquire(taskId, this.createWorkerId(taskId));\n if (!lease) return null;\n this.emitTaskEvent(\"task:running\", taskId);\n void this.persistQueueState();\n return lease;\n }\n\n private markTaskCompleted(taskId: string, output: string, leaseId?: string): void {\n const before = this.taskQueue.get(taskId);\n const completed = this.taskQueue.complete(taskId, output, leaseId);\n if (!completed) return;\n\n if (before?.status !== \"completed\") {\n this.emitTaskEvent(\"task:completed\", taskId);\n }\n void this.persistQueueState();\n }\n\n private markTaskFailed(taskId: string, error: unknown, leaseId?: string): void {\n const result = this.taskQueue.fail(taskId, this.normalizeError(error), leaseId);\n if (!result) return;\n\n if (result.willRetry) {\n this.emitTaskEvent(\"task:queued\", taskId);\n } else {\n this.emitTaskEvent(\"task:failed\", taskId);\n }\n void this.persistQueueState();\n }\n\n private async executeTaskWithRetry(\n agent: A2AAgentRuntime,\n taskId: string,\n params: A2ATasksSendParams,\n ): Promise<void> {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const task = this.taskQueue.get(taskId);\n if (!task || task.status === \"cancelled\" || task.status === \"completed\" || task.status === \"failed\") {\n return;\n }\n\n const lease = this.markTaskRunning(taskId);\n if (!lease) {\n await this.sleep(10);\n continue;\n }\n\n const runMetadata: Record<string, unknown> = {\n ...(params.metadata ?? {}),\n a2aTaskId: taskId,\n a2aLeaseId: lease.leaseId,\n a2aAttempt: lease.attempt,\n a2aManagedByQueue: true,\n };\n\n try {\n const result = await agent.run(params.prompt, { pluginMetadata: runMetadata });\n this.markTaskCompleted(taskId, result.text, lease.leaseId);\n return;\n } catch (error) {\n const failed = this.taskQueue.fail(taskId, this.normalizeError(error), lease.leaseId);\n if (!failed) return;\n\n if (!failed.willRetry) {\n this.emitTaskEvent(\"task:failed\", taskId);\n void this.persistQueueState();\n return;\n }\n\n this.emitTaskEvent(\"task:queued\", taskId);\n void this.persistQueueState();\n await this.sleep(failed.retryDelayMs);\n }\n }\n }\n\n private evictStaleTasks(): void {\n const before = new Set(this.taskQueue.list().map((task) => task.id));\n this.taskQueue.evictExpired();\n const after = new Set(this.taskQueue.list().map((task) => task.id));\n\n for (const taskId of before) {\n if (!after.has(taskId)) {\n this.pushNotifier.cleanup(taskId);\n }\n }\n\n void this.persistQueueState();\n }\n\n private emitTaskEvent(type: A2ATaskEvent[\"type\"], taskId: string): void {\n const task = this.taskQueue.get(taskId);\n if (!task) return;\n\n const event: A2ATaskEvent = {\n type,\n taskId,\n task,\n timestamp: new Date().toISOString(),\n };\n\n for (const listener of this.taskEventListeners) {\n try {\n listener(event);\n } catch (error) {\n console.warn(\"Task event listener error:\", error);\n }\n }\n\n this.pushNotifier.notify(event).catch((error) => {\n console.warn(\"Push notification error:\", error);\n });\n }\n\n private createWorkerId(taskId: string): string {\n const sessionId = this.latestCtx?.sessionId ?? this.setupCtx?.sessionId ?? \"a2a\";\n return `${sessionId}:${taskId}`;\n }\n\n private normalizeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private async ensureQueueHydrated(): Promise<void> {\n if (this.queueHydrated) return;\n if (this.queueHydrationPromise) {\n await this.queueHydrationPromise;\n return;\n }\n\n this.queueHydrationPromise = this.hydrateQueueFromMemory();\n try {\n await this.queueHydrationPromise;\n this.queueHydrated = true;\n } finally {\n this.queueHydrationPromise = null;\n }\n }\n\n private async hydrateQueueFromMemory(): Promise<void> {\n if (!this.persistQueueStateEnabled || !this.setupCtx) return;\n\n try {\n const snapshot = await this.setupCtx.memory.loadMetadata<A2ATaskQueueSnapshot>(\n this.setupCtx.sessionId,\n A2APlugin.QUEUE_SNAPSHOT_KEY,\n );\n\n if (snapshot) {\n this.taskQueue.hydrate(snapshot);\n }\n } catch (error) {\n console.warn(\"A2A queue hydration failed:\", error);\n }\n }\n\n private async persistQueueState(): Promise<void> {\n if (!this.persistQueueStateEnabled || !this.setupCtx) return;\n\n try {\n await this.setupCtx.memory.saveMetadata(\n this.setupCtx.sessionId,\n A2APlugin.QUEUE_SNAPSHOT_KEY,\n this.taskQueue.snapshot(),\n );\n } catch (error) {\n console.warn(\"A2A queue persistence failed:\", error);\n }\n }\n\n private sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private async discoverAgent(endpoint: string): Promise<AgentCapability> {\n try {\n const discoveryUrl = new URL(\"/.well-known/agent.json\", endpoint).toString();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n try {\n const discoveryResponse = await this.fetchImpl(discoveryUrl, { signal: controller.signal });\n if (discoveryResponse.ok) {\n const discoveryData = await discoveryResponse.json() as any;\n return {\n name: discoveryData.name,\n description: discoveryData.description,\n skills: discoveryData.skills?.map((s: any) => s.name) ?? [],\n endpoint,\n };\n }\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // Fall back to JSON-RPC agent/card.\n }\n\n const payload: A2AJsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"agent/card\",\n };\n\n const response = await this.callRemoteEndpoint(endpoint, payload);\n if (response.error) {\n throw new Error(`Failed to discover agent: ${response.error.message}`);\n }\n\n const card = response.result as any;\n return {\n name: card?.name ?? \"Unknown Agent\",\n description: card?.instructions ?? \"No description\",\n skills: card?.tools ?? [],\n endpoint,\n };\n }\n\n private async subscribeToTask(endpoint: string, prompt: string, taskId?: string): Promise<{ message: string; events: A2ATaskEvent[] }> {\n const payload = {\n jsonrpc: \"2.0\",\n id: crypto.randomUUID(),\n method: \"tasks/sendSubscribe\",\n params: { prompt, taskId },\n };\n\n // SSE streams get 5x the normal timeout\n const sseTimeoutMs = this.requestTimeoutMs * 5;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), sseTimeoutMs);\n\n try {\n const response = await this.fetchImpl(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"text/event-stream\",\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE subscription failed with HTTP ${response.status}`);\n }\n\n const events: A2ATaskEvent[] = [];\n let sseCompleted = false;\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error(\"No response body for SSE stream\");\n }\n\n let buffer = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const segments = buffer.split(\"\\n\");\n buffer = segments.pop() ?? \"\";\n\n for (const line of segments) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.substring(6));\n events.push(eventData);\n if (eventData.type === \"task:completed\" || eventData.type === \"task:failed\" || eventData.type === \"task:cancelled\") {\n sseCompleted = true;\n }\n } catch {\n // Ignore malformed event payloads.\n }\n }\n }\n\n if (sseCompleted) {\n break;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return {\n message: \"Task subscription completed\",\n events,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private getTaskIdFromContext(ctx: PluginContext): string | undefined {\n const raw = ctx.runMetadata?.a2aTaskId;\n return typeof raw === \"string\" && raw.length > 0 ? raw : undefined;\n }\n\n private getLeaseIdFromContext(ctx: PluginContext): string | undefined {\n const raw = ctx.runMetadata?.a2aLeaseId;\n return typeof raw === \"string\" && raw.length > 0 ? raw : undefined;\n }\n\n private isQueueManagedRun(ctx: PluginContext): boolean {\n return ctx.runMetadata?.a2aManagedByQueue === true;\n }\n\n private async resolveAgentCard(): Promise<unknown> {\n if (this.agentCardProvider) {\n return this.agentCardProvider.getAgentCard();\n }\n\n const ctx = this.latestCtx ?? this.setupCtx;\n if (!ctx) {\n return {\n name: \"Agent\",\n instructions: \"\",\n tools: [],\n };\n }\n\n return {\n name: ctx.agentName ?? \"Agent\",\n sessionId: ctx.sessionId,\n instructions: ctx.config.instructions,\n maxSteps: ctx.config.maxSteps,\n tools: [...ctx.toolNames],\n };\n }\n\n private cloneTask(taskId: string): A2ATask {\n const task = this.taskQueue.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return task;\n }\n}\n\nexport function createA2APlugin(options?: A2APluginOptions): A2APlugin {\n return new A2APlugin(options);\n}\n","// =============================================================================\n// A2A Handler — JSON-RPC request router for tasks + discovery\n// =============================================================================\n\nexport interface A2AJsonRpcRequest {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n method: string;\n params?: unknown;\n}\n\nexport interface A2AJsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport interface A2AJsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: A2AJsonRpcError;\n}\n\nexport type A2ATaskStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\n\nexport interface A2ATask {\n id: string;\n status: A2ATaskStatus;\n prompt: string;\n output?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n completedAt?: string;\n}\n\nexport interface A2ATasksSendParams {\n prompt: string;\n taskId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface A2ATaskEvent {\n type: 'task:queued' | 'task:running' | 'task:completed' | 'task:failed' | 'task:cancelled';\n taskId: string;\n task: A2ATask;\n timestamp: string;\n}\n\nexport type TaskEventListener = (event: A2ATaskEvent) => void;\n\nexport interface A2ARequestHandlers {\n sendTask(params: A2ATasksSendParams): Promise<A2ATask>;\n getTask(taskId: string): Promise<A2ATask | null>;\n listTasks?(): Promise<A2ATask[]>;\n cancelTask?(taskId: string): Promise<A2ATask | null>;\n getAgentCard?(): Promise<unknown>;\n sendTaskSubscribe?(params: A2ATasksSendParams): AsyncIterable<A2ATaskEvent>;\n}\n\nfunction createError(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown,\n): A2AJsonRpcResponse {\n const error: A2AJsonRpcError = data === undefined\n ? { code, message }\n : { code, message, data };\n\n return {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function createA2AJsonRpcHandler(\n handlers: A2ARequestHandlers,\n): (request: A2AJsonRpcRequest) => Promise<A2AJsonRpcResponse> {\n return async (request: A2AJsonRpcRequest): Promise<A2AJsonRpcResponse> => {\n const id = request.id ?? null;\n\n if (request.jsonrpc !== \"2.0\" || typeof request.method !== \"string\") {\n return createError(id, -32600, \"Invalid Request\");\n }\n\n try {\n switch (request.method) {\n case \"tasks/send\": {\n const params = asRecord(request.params);\n if (!params) {\n return createError(id, -32602, \"Invalid params: expected object\");\n }\n\n const prompt = asString(params.prompt);\n if (!prompt) {\n return createError(id, -32602, \"Invalid params: prompt is required\");\n }\n\n const parsedTaskId = params.taskId === undefined ? undefined : asString(params.taskId);\n if (params.taskId !== undefined && !parsedTaskId) {\n return createError(id, -32602, \"Invalid params: taskId must be a non-empty string\");\n }\n const taskId = parsedTaskId ?? undefined;\n\n const metadata = params.metadata === undefined ? undefined : asRecord(params.metadata);\n if (params.metadata !== undefined && !metadata) {\n return createError(id, -32602, \"Invalid params: metadata must be an object\");\n }\n\n const task = await handlers.sendTask({ prompt, taskId, metadata: metadata ?? undefined });\n return {\n jsonrpc: \"2.0\",\n id,\n result: task,\n };\n }\n\n case \"tasks/get\": {\n const params = asRecord(request.params);\n if (!params) {\n return createError(id, -32602, \"Invalid params: expected object\");\n }\n\n const taskId = asString(params.taskId);\n if (!taskId) {\n return createError(id, -32602, \"Invalid params: taskId is required\");\n }\n\n const task = await handlers.getTask(taskId);\n if (!task) {\n return createError(id, -32004, \"Task not found\", { taskId });\n }\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: task,\n };\n }\n\n case \"tasks/list\": {\n if (!handlers.listTasks) {\n return createError(id, -32601, \"Method not found: tasks/list\");\n }\n\n const tasks = await handlers.listTasks();\n return {\n jsonrpc: \"2.0\",\n id,\n result: { tasks },\n };\n }\n\n case \"tasks/cancel\": {\n if (!handlers.cancelTask) {\n return createError(id, -32601, \"Method not found: tasks/cancel\");\n }\n\n const params = asRecord(request.params);\n if (!params) {\n return createError(id, -32602, \"Invalid params: expected object\");\n }\n\n const taskId = asString(params.taskId);\n if (!taskId) {\n return createError(id, -32602, \"Invalid params: taskId is required\");\n }\n\n const task = await handlers.cancelTask(taskId);\n if (!task) {\n return createError(id, -32004, \"Task not found\", { taskId });\n }\n\n return {\n jsonrpc: \"2.0\",\n id,\n result: task,\n };\n }\n\n case \"agent/card\": {\n if (!handlers.getAgentCard) {\n return createError(id, -32601, \"Method not found: agent/card\");\n }\n\n const card = await handlers.getAgentCard();\n return {\n jsonrpc: \"2.0\",\n id,\n result: card,\n };\n }\n\n case \"tasks/sendSubscribe\": {\n if (!handlers.sendTaskSubscribe) {\n return createError(id, -32601, \"Method not found: tasks/sendSubscribe\");\n }\n\n const params = asRecord(request.params);\n if (!params) {\n return createError(id, -32602, \"Invalid params: expected object\");\n }\n\n const prompt = asString(params.prompt);\n if (!prompt) {\n return createError(id, -32602, \"Invalid params: prompt is required\");\n }\n\n const parsedTaskId = params.taskId === undefined ? undefined : asString(params.taskId);\n if (params.taskId !== undefined && !parsedTaskId) {\n return createError(id, -32602, \"Invalid params: taskId must be a non-empty string\");\n }\n const taskId = parsedTaskId ?? undefined;\n\n const metadata = params.metadata === undefined ? undefined : asRecord(params.metadata);\n if (params.metadata !== undefined && !metadata) {\n return createError(id, -32602, \"Invalid params: metadata must be an object\");\n }\n\n // tasks/sendSubscribe is handled via SSE HTTP endpoint, not JSON-RPC\n return createError(id, -32601, \"Use SSE endpoint for tasks/sendSubscribe\");\n }\n\n case \"health\": {\n return {\n jsonrpc: \"2.0\",\n id,\n result: { ok: true },\n };\n }\n\n default:\n return createError(id, -32601, `Method not found: ${request.method}`);\n }\n } catch (error) {\n return createError(\n id,\n -32603,\n error instanceof Error ? error.message : \"Internal error\",\n );\n }\n };\n}\n\nexport function createA2AHttpHandler(\n jsonRpcHandler: (request: A2AJsonRpcRequest) => Promise<A2AJsonRpcResponse>,\n sseHandlers?: {\n sendTaskSubscribe?: (params: A2ATasksSendParams) => AsyncIterable<A2ATaskEvent>;\n }\n): (request: Request) => Promise<Response> {\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n \n // Handle agent discovery endpoint\n if (request.method === \"GET\" && url.pathname === \"/.well-known/agent.json\") {\n try {\n const cardResponse = await jsonRpcHandler({\n jsonrpc: \"2.0\",\n id: \"agent-discovery\",\n method: \"agent/card\"\n });\n \n if (cardResponse.error) {\n return new Response(\n JSON.stringify({ error: \"Agent card not available\" }),\n { status: 500, headers: { \"Content-Type\": \"application/json\" } }\n );\n }\n\n const agentCard = cardResponse.result as any;\n // Support both AgentCardSnapshot (agentsMd/skillsMd) and plain card (name/instructions/tools)\n const cardName = agentCard?.name ?? agentCard?.source?.name ?? \"Agent\";\n const cardDescription = agentCard?.instructions ?? agentCard?.agentsMd ?? \"A2A-compatible agent\";\n const cardTools: string[] = agentCard?.tools ?? [];\n const cardSkills: string[] = agentCard?.skillsMd \n ? agentCard.skillsMd.split('\\n').filter((l: string) => l.startsWith('- ')).map((l: string) => l.slice(2))\n : [];\n const allSkills = cardTools.length > 0 ? cardTools : cardSkills;\n\n const discoveryCard = {\n name: cardName,\n description: cardDescription,\n url: url.origin + \"/a2a\",\n version: \"1.0.0\",\n capabilities: {\n streaming: true,\n pushNotifications: true\n },\n skills: allSkills.map((skill: string, index: number) => ({\n id: `skill-${index}`,\n name: skill,\n description: `Skill: ${skill}`\n })),\n authentication: { schemes: [\"none\"] }\n };\n\n return new Response(JSON.stringify(discoveryCard), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" }\n });\n } catch (error) {\n return new Response(\n JSON.stringify({ error: \"Failed to generate agent card\" }),\n { status: 500, headers: { \"Content-Type\": \"application/json\" } }\n );\n }\n }\n\n // Parse body once for POST requests\n if (request.method !== \"POST\") {\n return new Response(null, { status: 405 });\n }\n\n let parsed: unknown;\n try {\n parsed = await request.json();\n } catch {\n return new Response(\n JSON.stringify(createError(null, -32700, \"Parse error\")),\n { status: 400, headers: { \"Content-Type\": \"application/json\" } },\n );\n }\n\n // Handle SSE subscription endpoint\n if (sseHandlers?.sendTaskSubscribe) {\n const requestObject = asRecord(parsed);\n if (requestObject?.method === \"tasks/sendSubscribe\") {\n const params = asRecord(requestObject.params);\n if (!params) {\n return new Response(\"Invalid params\", { status: 400 });\n }\n\n const prompt = asString(params.prompt);\n if (!prompt) {\n return new Response(\"Prompt required\", { status: 400 });\n }\n\n const taskId = params.taskId ? asString(params.taskId) : undefined;\n const metadata = params.metadata ? asRecord(params.metadata) : undefined;\n\n const eventStream = sseHandlers.sendTaskSubscribe({\n prompt,\n taskId: taskId ?? undefined,\n metadata: metadata ?? undefined\n });\n\n return createSseResponse(eventStream);\n }\n }\n\n if (Array.isArray(parsed)) {\n return new Response(\n JSON.stringify(createError(null, -32600, \"Batch requests are not supported\")),\n { status: 400, headers: { \"Content-Type\": \"application/json\" } },\n );\n }\n\n const requestObject = asRecord(parsed);\n if (!requestObject) {\n return new Response(\n JSON.stringify(createError(null, -32600, \"Invalid Request\")),\n { status: 400, headers: { \"Content-Type\": \"application/json\" } },\n );\n }\n\n // JSON-RPC notification: request without an id field\n const hasId = 'id' in requestObject;\n\n const normalizedRequest: A2AJsonRpcRequest = {\n jsonrpc: requestObject.jsonrpc as \"2.0\",\n id: hasId ? (requestObject.id as string | number | null) ?? null : null,\n method: requestObject.method as string,\n params: requestObject.params,\n };\n\n if (!hasId) {\n await jsonRpcHandler({ ...normalizedRequest, id: null });\n return new Response(null, { status: 202 });\n }\n\n const response = await jsonRpcHandler(normalizedRequest);\n return new Response(\n JSON.stringify(response),\n {\n status: response.error ? 400 : 200,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n };\n}\n\nfunction createSseResponse(eventStream: AsyncIterable<A2ATaskEvent>): Response {\n const encoder = new TextEncoder();\n \n const readableStream = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of eventStream) {\n const sseData = `event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`;\n controller.enqueue(encoder.encode(sseData));\n }\n controller.close();\n } catch (error) {\n const errorEvent = `event: error\\ndata: ${JSON.stringify({ error: String(error) })}\\n\\n`;\n controller.enqueue(encoder.encode(errorEvent));\n controller.close();\n }\n }\n });\n\n return new Response(readableStream, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n },\n });\n}\n\nexport function createA2ASseHandler(\n handlers: Pick<A2ARequestHandlers, 'sendTaskSubscribe'>\n): (params: A2ATasksSendParams) => AsyncIterable<A2ATaskEvent> {\n return (params: A2ATasksSendParams) => {\n if (!handlers.sendTaskSubscribe) {\n throw new Error(\"sendTaskSubscribe handler not available\");\n }\n return handlers.sendTaskSubscribe(params);\n };\n}\n","// =============================================================================\n// A2A Delegation — Multi-Agent Capability-based Delegation\n// =============================================================================\n\nimport type { A2AJsonRpcRequest, A2AJsonRpcResponse, A2ATask } from \"./a2a-handler.js\";\n\nexport interface AgentCapability {\n name: string;\n description: string;\n skills: string[];\n endpoint: string;\n}\n\nexport interface DelegationResult {\n selectedAgent: AgentCapability;\n taskId: string;\n result: unknown;\n}\n\nexport class A2ADelegationManager {\n private readonly agents = new Map<string, AgentCapability>();\n private readonly fetchImpl: typeof fetch;\n\n constructor(fetchImpl: typeof fetch = globalThis.fetch) {\n if (!fetchImpl) {\n throw new Error(\"A2ADelegationManager requires a fetch implementation\");\n }\n this.fetchImpl = fetchImpl;\n }\n\n register(agent: AgentCapability): void {\n this.agents.set(agent.name, agent);\n }\n\n unregister(name: string): void {\n this.agents.delete(name);\n }\n\n listAgents(): AgentCapability[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Find the best agent for a task based on required skills.\n * Uses a simple skill overlap scoring system.\n */\n findAgent(requiredSkills: string[]): AgentCapability | null {\n if (requiredSkills.length === 0) {\n const agents = Array.from(this.agents.values());\n return agents.length > 0 ? agents[0] : null;\n }\n\n let bestAgent: AgentCapability | null = null;\n let bestScore = 0;\n\n for (const agent of this.agents.values()) {\n const overlap = requiredSkills.filter(skill =>\n agent.skills.some(agentSkill =>\n agentSkill.toLowerCase().includes(skill.toLowerCase()) ||\n skill.toLowerCase().includes(agentSkill.toLowerCase())\n )\n );\n \n const score = overlap.length / requiredSkills.length;\n if (score > bestScore) {\n bestScore = score;\n bestAgent = agent;\n }\n }\n\n return bestAgent;\n }\n\n /**\n * Delegate a task to the best matching agent.\n */\n async delegate(\n prompt: string,\n requiredSkills: string[],\n fetchImpl: typeof fetch = this.fetchImpl\n ): Promise<DelegationResult> {\n const selectedAgent = this.findAgent(requiredSkills);\n if (!selectedAgent) {\n throw new Error(\"No suitable agent found for delegation\");\n }\n\n const taskId = crypto.randomUUID();\n const payload: A2AJsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: taskId,\n method: \"tasks/send\",\n params: {\n prompt,\n taskId,\n metadata: { delegatedSkills: requiredSkills }\n }\n };\n\n try {\n const response = await fetchImpl(selectedAgent.endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload)\n });\n\n if (!response.ok) {\n throw new Error(`Agent endpoint returned HTTP ${response.status}`);\n }\n\n const result = await response.json() as A2AJsonRpcResponse;\n \n if (result.error) {\n throw new Error(`Agent error [${result.error.code}]: ${result.error.message}`);\n }\n\n return {\n selectedAgent,\n taskId,\n result: result.result\n };\n } catch (error) {\n throw new Error(`Delegation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}","// =============================================================================\n// A2A Push Notifications — Webhook-based Push Notifications\n// =============================================================================\n\nimport type { A2ATaskEvent } from \"./a2a-handler.js\";\n\nexport interface PushNotificationConfig {\n url: string;\n headers?: Record<string, string>;\n events?: A2ATaskEvent['type'][];\n}\n\nexport class A2APushNotifier {\n private readonly subscriptions = new Map<string, PushNotificationConfig[]>();\n private readonly fetchImpl: typeof fetch;\n\n constructor(fetchImpl: typeof fetch = globalThis.fetch) {\n if (!fetchImpl) {\n throw new Error(\"A2APushNotifier requires a fetch implementation\");\n }\n this.fetchImpl = fetchImpl;\n }\n\n private static readonly BLOCKED_HEADERS = new Set(['host', 'authorization', 'cookie', 'content-type']);\n private static readonly LOCAL_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]', '0.0.0.0']);\n\n subscribe(taskId: string, config: PushNotificationConfig): void {\n const parsed = new URL(config.url);\n const isLocal = A2APushNotifier.LOCAL_HOSTS.has(parsed.hostname)\n || parsed.hostname.startsWith('127.');\n if (parsed.protocol !== 'https:' && !isLocal) {\n throw new Error('Push notification URL must use HTTPS');\n }\n // Block non-HTTPS access to any local address except explicit localhost\n if (parsed.protocol !== 'https:' && isLocal && parsed.hostname !== 'localhost' && parsed.hostname !== '127.0.0.1') {\n throw new Error('Push notification URL must use HTTPS for non-standard local addresses');\n }\n\n // Sanitize headers — block security-sensitive headers\n if (config.headers) {\n for (const key of Object.keys(config.headers)) {\n if (A2APushNotifier.BLOCKED_HEADERS.has(key.toLowerCase())) {\n throw new Error(`Header \"${key}\" is not allowed in push notifications`);\n }\n }\n }\n\n const existing = this.subscriptions.get(taskId) ?? [];\n existing.push(config);\n this.subscriptions.set(taskId, existing);\n }\n\n unsubscribe(taskId: string, url: string): void {\n const existing = this.subscriptions.get(taskId) ?? [];\n const filtered = existing.filter(config => config.url !== url);\n \n if (filtered.length === 0) {\n this.subscriptions.delete(taskId);\n } else {\n this.subscriptions.set(taskId, filtered);\n }\n }\n\n async notify(event: A2ATaskEvent): Promise<void> {\n const configs = this.subscriptions.get(event.taskId) ?? [];\n \n const promises = configs.map(async (config) => {\n // Skip if this event type is not in the config's event filter\n if (config.events && !config.events.includes(event.type)) {\n return;\n }\n\n try {\n await this.fetchImpl(config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers\n },\n body: JSON.stringify(event)\n });\n } catch (error) {\n // Log but don't throw - failed webhooks shouldn't break the main flow\n console.warn(`Push notification failed for ${config.url}:`, error);\n }\n });\n\n await Promise.allSettled(promises);\n }\n\n cleanup(taskId: string): void {\n this.subscriptions.delete(taskId);\n }\n}","// =============================================================================\n// A2A Durable Task Queue — lease/ack/retry foundation for distributed execution\n// =============================================================================\n\nimport type { A2ATask } from \"./a2a-handler.js\";\n\nexport interface A2ATaskRetryConfig {\n maxAttempts: number;\n initialBackoffMs: number;\n backoffMultiplier: number;\n maxBackoffMs: number;\n jitterRatio: number;\n}\n\nexport interface A2ATaskQueueConfig {\n leaseDurationMs: number;\n retentionMs: number;\n maxTerminalTasks: number;\n retry: A2ATaskRetryConfig;\n now?: () => number;\n idFactory?: () => string;\n}\n\nexport interface A2ATaskLease {\n taskId: string;\n leaseId: string;\n workerId: string;\n expiresAt: string;\n attempt: number;\n maxAttempts: number;\n}\n\nexport interface A2ATaskFailResult {\n task: A2ATask;\n willRetry: boolean;\n retryDelayMs: number;\n attempts: number;\n maxAttempts: number;\n}\n\nexport interface A2ATaskQueueSnapshot {\n version: 1;\n entries: Array<{\n task: A2ATask;\n attempts: number;\n maxAttempts: number;\n nextAttemptAt: number;\n finishedAt?: number;\n lease?: {\n leaseId: string;\n workerId: string;\n expiresAt: number;\n };\n }>;\n}\n\ninterface QueueEntry {\n task: A2ATask;\n attempts: number;\n maxAttempts: number;\n nextAttemptAt: number;\n finishedAt?: number;\n lease?: {\n leaseId: string;\n workerId: string;\n expiresAt: number;\n };\n}\n\nconst DEFAULT_RETRY_CONFIG: A2ATaskRetryConfig = {\n maxAttempts: 3,\n initialBackoffMs: 250,\n backoffMultiplier: 2,\n maxBackoffMs: 30_000,\n jitterRatio: 0,\n};\n\nconst DEFAULT_QUEUE_CONFIG: A2ATaskQueueConfig = {\n leaseDurationMs: 60_000,\n retentionMs: 3_600_000,\n maxTerminalTasks: 1_000,\n retry: DEFAULT_RETRY_CONFIG,\n};\n\nfunction cloneTask(task: A2ATask): A2ATask {\n return {\n ...task,\n metadata: task.metadata ? { ...task.metadata } : undefined,\n };\n}\n\nfunction isTerminalStatus(status: A2ATask[\"status\"]): boolean {\n return status === \"completed\" || status === \"failed\" || status === \"cancelled\";\n}\n\nexport class A2ADurableTaskQueue {\n private readonly entries = new Map<string, QueueEntry>();\n private readonly now: () => number;\n private readonly idFactory: () => string;\n private readonly config: A2ATaskQueueConfig;\n\n constructor(config: Partial<A2ATaskQueueConfig> = {}) {\n const retry: A2ATaskRetryConfig = {\n ...DEFAULT_RETRY_CONFIG,\n ...(config.retry ?? {}),\n };\n\n this.config = {\n leaseDurationMs: config.leaseDurationMs ?? DEFAULT_QUEUE_CONFIG.leaseDurationMs,\n retentionMs: config.retentionMs ?? DEFAULT_QUEUE_CONFIG.retentionMs,\n maxTerminalTasks: config.maxTerminalTasks ?? DEFAULT_QUEUE_CONFIG.maxTerminalTasks,\n retry,\n now: config.now,\n idFactory: config.idFactory,\n };\n\n this.now = config.now ?? (() => Date.now());\n this.idFactory = config.idFactory ?? (() => crypto.randomUUID());\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n enqueue(task: A2ATask, options: { maxAttempts?: number } = {}): A2ATask {\n if (this.entries.has(task.id)) {\n throw new Error(`Task already exists: ${task.id}`);\n }\n\n const now = this.now();\n const maxAttempts = Math.max(1, options.maxAttempts ?? this.config.retry.maxAttempts);\n\n const normalizedTask: A2ATask = {\n ...cloneTask(task),\n status: \"queued\",\n updatedAt: new Date(now).toISOString(),\n completedAt: undefined,\n };\n\n this.entries.set(task.id, {\n task: normalizedTask,\n attempts: 0,\n maxAttempts,\n nextAttemptAt: now,\n });\n\n return cloneTask(normalizedTask);\n }\n\n get(taskId: string): A2ATask | null {\n this.resolveExpiredLeases();\n const entry = this.entries.get(taskId);\n if (!entry) return null;\n return cloneTask(entry.task);\n }\n\n list(): A2ATask[] {\n this.resolveExpiredLeases();\n return [...this.entries.values()].map((entry) => cloneTask(entry.task));\n }\n\n acquire(taskId: string, workerId: string): A2ATaskLease | null {\n this.resolveExpiredLeases();\n\n const entry = this.entries.get(taskId);\n if (!entry) return null;\n\n const now = this.now();\n if (entry.task.status !== \"queued\") return null;\n if (entry.nextAttemptAt > now) return null;\n\n entry.attempts += 1;\n const leaseId = this.idFactory();\n entry.lease = {\n leaseId,\n workerId,\n expiresAt: now + this.config.leaseDurationMs,\n };\n entry.task.status = \"running\";\n entry.task.updatedAt = new Date(now).toISOString();\n\n return {\n taskId,\n leaseId,\n workerId,\n expiresAt: new Date(entry.lease.expiresAt).toISOString(),\n attempt: entry.attempts,\n maxAttempts: entry.maxAttempts,\n };\n }\n\n extendLease(taskId: string, leaseId: string, leaseDurationMs?: number): boolean {\n const entry = this.entries.get(taskId);\n if (!entry || !entry.lease) return false;\n if (entry.lease.leaseId !== leaseId) return false;\n\n const duration = Math.max(1, leaseDurationMs ?? this.config.leaseDurationMs);\n entry.lease.expiresAt = this.now() + duration;\n return true;\n }\n\n complete(taskId: string, output: string, leaseId?: string): A2ATask | null {\n const entry = this.entries.get(taskId);\n if (!entry) return null;\n\n if (isTerminalStatus(entry.task.status)) {\n return cloneTask(entry.task);\n }\n\n if (!this.validateLease(entry, leaseId)) {\n return null;\n }\n\n const nowIso = new Date(this.now()).toISOString();\n entry.task.status = \"completed\";\n entry.task.output = output;\n entry.task.error = undefined;\n entry.task.updatedAt = nowIso;\n entry.task.completedAt = nowIso;\n entry.lease = undefined;\n entry.finishedAt = this.now();\n\n return cloneTask(entry.task);\n }\n\n fail(taskId: string, error: string, leaseId?: string): A2ATaskFailResult | null {\n const entry = this.entries.get(taskId);\n if (!entry) return null;\n\n if (isTerminalStatus(entry.task.status)) {\n return {\n task: cloneTask(entry.task),\n willRetry: false,\n retryDelayMs: 0,\n attempts: entry.attempts,\n maxAttempts: entry.maxAttempts,\n };\n }\n\n if (!this.validateLease(entry, leaseId)) {\n return null;\n }\n\n const now = this.now();\n const nowIso = new Date(now).toISOString();\n entry.task.error = error;\n entry.task.updatedAt = nowIso;\n entry.lease = undefined;\n\n if (entry.attempts < entry.maxAttempts) {\n const retryDelayMs = this.computeBackoffDelay(entry.attempts);\n entry.task.status = \"queued\";\n entry.task.completedAt = undefined;\n entry.nextAttemptAt = now + retryDelayMs;\n\n return {\n task: cloneTask(entry.task),\n willRetry: true,\n retryDelayMs,\n attempts: entry.attempts,\n maxAttempts: entry.maxAttempts,\n };\n }\n\n entry.task.status = \"failed\";\n entry.task.completedAt = nowIso;\n entry.finishedAt = now;\n\n return {\n task: cloneTask(entry.task),\n willRetry: false,\n retryDelayMs: 0,\n attempts: entry.attempts,\n maxAttempts: entry.maxAttempts,\n };\n }\n\n cancel(taskId: string): A2ATask | null {\n const entry = this.entries.get(taskId);\n if (!entry) return null;\n\n if (isTerminalStatus(entry.task.status)) {\n return cloneTask(entry.task);\n }\n\n const nowIso = new Date(this.now()).toISOString();\n entry.task.status = \"cancelled\";\n entry.task.updatedAt = nowIso;\n entry.task.completedAt = nowIso;\n entry.lease = undefined;\n entry.finishedAt = this.now();\n\n return cloneTask(entry.task);\n }\n\n evictExpired(): void {\n const now = this.now();\n this.resolveExpiredLeases();\n\n const terminals: Array<{ taskId: string; finishedAt: number }> = [];\n\n for (const [taskId, entry] of this.entries) {\n if (!isTerminalStatus(entry.task.status)) continue;\n\n const finishedAt = entry.finishedAt ?? Date.parse(entry.task.updatedAt);\n if (now - finishedAt > this.config.retentionMs) {\n this.entries.delete(taskId);\n continue;\n }\n\n terminals.push({ taskId, finishedAt });\n }\n\n if (terminals.length <= this.config.maxTerminalTasks) return;\n\n terminals\n .sort((a, b) => a.finishedAt - b.finishedAt)\n .slice(0, terminals.length - this.config.maxTerminalTasks)\n .forEach(({ taskId }) => this.entries.delete(taskId));\n }\n\n snapshot(): A2ATaskQueueSnapshot {\n this.resolveExpiredLeases();\n return {\n version: 1,\n entries: [...this.entries.values()].map((entry) => ({\n task: cloneTask(entry.task),\n attempts: entry.attempts,\n maxAttempts: entry.maxAttempts,\n nextAttemptAt: entry.nextAttemptAt,\n finishedAt: entry.finishedAt,\n lease: entry.lease\n ? {\n leaseId: entry.lease.leaseId,\n workerId: entry.lease.workerId,\n expiresAt: entry.lease.expiresAt,\n }\n : undefined,\n })),\n };\n }\n\n hydrate(snapshot: A2ATaskQueueSnapshot | null | undefined): void {\n this.entries.clear();\n if (!snapshot || snapshot.version !== 1) return;\n\n for (const item of snapshot.entries) {\n this.entries.set(item.task.id, {\n task: cloneTask(item.task),\n attempts: item.attempts,\n maxAttempts: item.maxAttempts,\n nextAttemptAt: item.nextAttemptAt,\n finishedAt: item.finishedAt,\n lease: item.lease\n ? {\n leaseId: item.lease.leaseId,\n workerId: item.lease.workerId,\n expiresAt: item.lease.expiresAt,\n }\n : undefined,\n });\n }\n\n this.resolveExpiredLeases();\n }\n\n private validateLease(entry: QueueEntry, leaseId?: string): boolean {\n if (!entry.lease) return true;\n if (!leaseId) return false;\n if (entry.lease.leaseId !== leaseId) return false;\n if (entry.lease.expiresAt <= this.now()) return false;\n return true;\n }\n\n private resolveExpiredLeases(): void {\n const now = this.now();\n\n for (const entry of this.entries.values()) {\n if (!entry.lease) continue;\n if (entry.lease.expiresAt > now) continue;\n if (entry.task.status !== \"running\") {\n entry.lease = undefined;\n continue;\n }\n\n entry.lease = undefined;\n entry.task.error = \"Task lease expired before completion\";\n entry.task.updatedAt = new Date(now).toISOString();\n\n if (entry.attempts < entry.maxAttempts) {\n const retryDelayMs = this.computeBackoffDelay(entry.attempts);\n entry.task.status = \"queued\";\n entry.task.completedAt = undefined;\n entry.nextAttemptAt = now + retryDelayMs;\n } else {\n entry.task.status = \"failed\";\n entry.task.completedAt = new Date(now).toISOString();\n entry.finishedAt = now;\n }\n }\n }\n\n private computeBackoffDelay(attempt: number): number {\n const base = Math.max(1, this.config.retry.initialBackoffMs);\n const multiplier = Math.max(1, this.config.retry.backoffMultiplier);\n const capped = Math.min(\n this.config.retry.maxBackoffMs,\n Math.round(base * Math.pow(multiplier, Math.max(0, attempt - 1))),\n );\n\n const jitterRatio = Math.max(0, Math.min(1, this.config.retry.jitterRatio));\n if (jitterRatio === 0) return capped;\n\n const jitterMax = Math.round(capped * jitterRatio);\n const jitter = Math.floor(Math.random() * (jitterMax + 1));\n return Math.min(this.config.retry.maxBackoffMs, capped + jitter);\n }\n}\n","// =============================================================================\n// ZodValidationAdapter — Zod-based implementation of ValidationPort\n// =============================================================================\n\nimport { type ZodType } from \"zod\";\nimport type { ValidationPort, ValidationResult } from \"../../ports/validation.port.js\";\n\nexport class ZodValidationAdapter implements ValidationPort {\n validate<T>(schema: unknown, data: unknown): ValidationResult<T> {\n const zodSchema = schema as ZodType<T>;\n const result = zodSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: result.error.message };\n }\n\n validateOrThrow<T>(schema: unknown, data: unknown): T {\n const zodSchema = schema as ZodType<T>;\n return zodSchema.parse(data) as T;\n }\n}\n","import type { ValidationPort } from \"../../ports/validation.port.js\";\nimport { ZodValidationAdapter } from \"../../adapters/validation/zod-validation.adapter.js\";\n\n/** Resolve the validator from plugin options, defaulting to ZodValidationAdapter. */\nexport function getValidator(options: { validator?: ValidationPort }): ValidationPort {\n return options.validator ?? new ZodValidationAdapter();\n}\n","// =============================================================================\n// GuardrailsPlugin — Input/output validation and content filtering\n// =============================================================================\n\nimport type {\n PluginHooks,\n PluginContext,\n BeforeRunParams,\n BeforeRunResult,\n AfterRunParams,\n BeforeToolParams,\n BeforeToolResult,\n} from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport type { ZodType } from \"zod\";\nimport type { ValidationPort } from \"../ports/validation.port.js\";\nimport { getValidator } from \"./utils/get-validator.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ContentFilter {\n readonly name: string;\n test(content: string): boolean;\n}\n\nexport interface GuardrailsPluginOptions {\n /** Zod schema to validate the input prompt */\n inputSchema?: ZodType;\n /** Zod schema to validate the output text */\n outputSchema?: ZodType;\n /** Per-tool argument validation schemas (keyed by tool name) */\n toolSchemas?: Record<string, ZodType>;\n /** Content filters applied to both input and output */\n contentFilters?: ContentFilter[];\n /** Custom input validators */\n inputValidators?: Array<(prompt: string) => string | null>;\n /** Custom output validators */\n outputValidators?: Array<(output: string) => string | null>;\n /** Action on validation failure: 'throw' (default) or 'warn' */\n onFailure?: \"throw\" | \"warn\";\n /** Validation adapter (defaults to ZodValidationAdapter) */\n validator?: ValidationPort;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class GuardrailsError extends Error {\n readonly code: \"input_validation\" | \"output_validation\" | \"content_filter\" | \"tool_validation\";\n\n constructor(code: GuardrailsError[\"code\"], message: string) {\n super(message);\n this.name = \"GuardrailsError\";\n this.code = code;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class GuardrailsPlugin extends BasePlugin {\n readonly name = \"guardrails\";\n\n private readonly options: Required<\n Pick<GuardrailsPluginOptions, \"onFailure\" | \"contentFilters\" | \"inputValidators\" | \"outputValidators\">\n > &\n Pick<GuardrailsPluginOptions, \"inputSchema\" | \"outputSchema\" | \"toolSchemas\">;\n\n private readonly validator: ValidationPort;\n\n constructor(options: GuardrailsPluginOptions = {}) {\n super();\n this.validator = getValidator(options);\n this.options = {\n onFailure: options.onFailure ?? \"throw\",\n contentFilters: options.contentFilters ?? [],\n inputValidators: options.inputValidators ?? [],\n outputValidators: options.outputValidators ?? [],\n inputSchema: options.inputSchema,\n outputSchema: options.outputSchema,\n toolSchemas: options.toolSchemas,\n };\n }\n\n protected buildHooks(): PluginHooks {\n return {\n beforeRun: this.beforeRun.bind(this),\n afterRun: this.afterRun.bind(this),\n beforeTool: this.beforeTool.bind(this),\n };\n }\n\n // ── Hook implementations ──────────────────────────────────────────────────\n\n private beforeRun(_ctx: PluginContext, params: BeforeRunParams): BeforeRunResult | void {\n const { prompt } = params;\n\n for (const filter of this.options.contentFilters) {\n if (filter.test(prompt)) {\n this.fail(\"content_filter\", `Content filter \"${filter.name}\" matched input`);\n }\n }\n\n for (const validator of this.options.inputValidators) {\n const error = validator(prompt);\n if (error) {\n this.fail(\"input_validation\", error);\n }\n }\n\n if (this.options.inputSchema) {\n const result = this.validator.validate(this.options.inputSchema, prompt);\n if (!result.success) {\n this.fail(\"input_validation\", `Input schema validation failed: ${result.error}`);\n }\n }\n\n return { prompt };\n }\n\n private afterRun(_ctx: PluginContext, params: AfterRunParams): void {\n const { text } = params.result;\n\n for (const filter of this.options.contentFilters) {\n if (filter.test(text)) {\n this.fail(\"content_filter\", `Content filter \"${filter.name}\" matched output`);\n }\n }\n\n for (const validator of this.options.outputValidators) {\n const error = validator(text);\n if (error) {\n this.fail(\"output_validation\", error);\n }\n }\n\n if (this.options.outputSchema) {\n const result = this.validator.validate(this.options.outputSchema, text);\n if (!result.success) {\n this.fail(\"output_validation\", `Output schema validation failed: ${result.error}`);\n }\n }\n }\n\n private beforeTool(_ctx: PluginContext, params: BeforeToolParams): BeforeToolResult | void {\n const schema = this.options.toolSchemas?.[params.toolName];\n if (!schema) return;\n\n const result = this.validator.validate(schema, params.args);\n if (!result.success) {\n this.fail(\"tool_validation\", `Tool \"${params.toolName}\" args validation failed: ${result.error}`);\n }\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n private fail(code: GuardrailsError[\"code\"], message: string): void {\n if (this.options.onFailure === \"warn\") {\n console.warn(`[guardrails] ${message}`);\n return;\n }\n throw new GuardrailsError(code, message);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createGuardrailsPlugin(options: GuardrailsPluginOptions = {}): GuardrailsPlugin {\n return new GuardrailsPlugin(options);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Built-in Content Filters\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createPiiFilter(): ContentFilter {\n return {\n name: \"pii\",\n test(content: string): boolean {\n const patterns = [\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/, // email\n /\\b\\d{3}[-.]?\\d{2}[-.]?\\d{4}\\b/, // SSN\n /\\b\\d{16}\\b/, // credit card (basic)\n ];\n return patterns.some((p) => p.test(content));\n },\n };\n}\n","// =============================================================================\n// OneCrawlPlugin — Web scraping and search tools via onecrawl\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type { PluginHooks } from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport type { ValidationPort } from \"../ports/validation.port.js\";\nimport { getValidator } from \"./utils/get-validator.js\";\n\n/** Default HTTP request timeout in ms (30 seconds) */\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface CrawlResult {\n content?: string;\n text?: string;\n title?: string;\n url?: string;\n link?: string;\n snippet?: string;\n description?: string;\n}\n\nexport interface OneCrawlPluginOptions {\n /** onecrawl Crawler instance — if not provided, one will be created lazily */\n crawler?: unknown;\n /** Maximum content length per scraped page (default: 10000) */\n maxContentLength?: number;\n /** Timeout per request in ms (default: 30000) */\n timeout?: number;\n /** Validation adapter (defaults to ZodValidationAdapter) */\n validator?: ValidationPort;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class OneCrawlPlugin extends BasePlugin {\n readonly name = \"crawl\";\n\n private readonly options: OneCrawlPluginOptions;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private crawlerPromise: Promise<any> | null = null;\n private readonly validator: ValidationPort;\n\n constructor(options: OneCrawlPluginOptions = {}) {\n super();\n this.options = options;\n this.validator = getValidator(options);\n }\n\n protected buildHooks(): PluginHooks {\n return {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private getCrawler(): Promise<any> {\n if (!this.crawlerPromise) {\n this.crawlerPromise = this.initCrawler();\n }\n return this.crawlerPromise;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async initCrawler(): Promise<any> {\n if (this.options.crawler) {\n return this.options.crawler;\n }\n try {\n // @ts-expect-error — onecrawl is an optional peer dependency\n const mod = await import(\"onecrawl\");\n const CrawlerClass = mod.Crawler ?? mod.default?.Crawler ?? mod.default;\n return new CrawlerClass({\n timeout: this.options.timeout ?? DEFAULT_REQUEST_TIMEOUT_MS,\n });\n } catch {\n throw new Error(\n 'OneCrawlPlugin requires \"onecrawl\" package. Install it: pnpm add onecrawl',\n );\n }\n }\n\n get tools(): Record<string, Tool<any, any>> {\n const maxLen = this.options.maxContentLength ?? 10000;\n const getCrawler = this.getCrawler.bind(this);\n const validator = this.validator;\n\n return {\n scrape: tool({\n description: \"Scrape a web page and extract its text content\",\n inputSchema: z.object({\n url: z.string().url().describe(\"The URL to scrape\"),\n }),\n execute: async (args: unknown) => {\n const { url } = validator.validateOrThrow<{ url: string }>(\n z.object({ url: z.string().url() }),\n args,\n );\n const crawler = await getCrawler();\n const result = await crawler.crawl(url);\n const content =\n typeof result === \"string\"\n ? result\n : (result?.content ?? result?.text ?? JSON.stringify(result));\n return content.length > maxLen\n ? content.slice(0, maxLen) + \"\\n...[truncated]\"\n : content;\n },\n }),\n\n search: tool({\n description: \"Search the web and return results\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query\"),\n limit: z.number().min(1).max(20).default(5).describe(\"Max results to return\"),\n }),\n execute: async (args: unknown) => {\n const { query, limit } = validator.validateOrThrow<{ query: string; limit: number }>(\n z.object({\n query: z.string(),\n limit: z.number().min(1).max(20).default(5),\n }),\n args,\n );\n const crawler = await getCrawler();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const results = await crawler.search(query, { limit });\n if (Array.isArray(results)) {\n return results.map((r: CrawlResult) => ({\n title: r.title ?? \"\",\n url: r.url ?? r.link ?? \"\",\n snippet: r.snippet ?? r.description ?? \"\",\n }));\n }\n return results;\n },\n }),\n\n batch: tool({\n description: \"Scrape multiple web pages in parallel\",\n inputSchema: z.object({\n urls: z.array(z.string().url()).min(1).max(10).describe(\"URLs to scrape\"),\n }),\n execute: async (args: unknown) => {\n const { urls } = validator.validateOrThrow<{ urls: string[] }>(\n z.object({ urls: z.array(z.string().url()).min(1).max(10) }),\n args,\n );\n const crawler = await getCrawler();\n if (typeof crawler.batchCrawl === \"function\") {\n const results = await crawler.batchCrawl(urls);\n return Array.isArray(results)\n ? results.map((r: string | CrawlResult, i: number) => ({\n url: urls[i],\n content: (\n typeof r === \"string\" ? r : (r?.content ?? r?.text ?? \"\")\n ).slice(0, maxLen),\n }))\n : results;\n }\n // Fallback: parallel crawl\n const results = await Promise.all(\n urls.map(async (u: string) => {\n try {\n const r = await crawler.crawl(u);\n const content =\n typeof r === \"string\" ? r : (r?.content ?? r?.text ?? \"\");\n return { url: u, content: content.slice(0, maxLen) };\n } catch (error) {\n return { url: u, error: String(error) };\n }\n }),\n );\n return results;\n },\n }),\n };\n }\n\n async dispose(): Promise<void> {\n if (this.crawlerPromise) {\n try {\n const crawler = await this.crawlerPromise;\n if (crawler && typeof crawler.close === \"function\") {\n await crawler.close();\n }\n } catch {\n // Ignore errors during cleanup\n }\n this.crawlerPromise = null;\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createOneCrawlPlugin(\n options: OneCrawlPluginOptions = {},\n): OneCrawlPlugin {\n return new OneCrawlPlugin(options);\n}\n","// =============================================================================\n// VectorlessPlugin — RAG/knowledge tools via @giulio-leone/gaussflow-vectorless\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type { PluginHooks } from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport type { ValidationPort } from \"../ports/validation.port.js\";\nimport { getValidator } from \"./utils/get-validator.js\";\nimport type { Chunk, ChunkingPort } from \"../ports/chunking.port.js\";\nimport type { ReRankingPort, ScoredResult, SourceAttribution } from \"../ports/reranking.port.js\";\nimport { DefaultChunkingAdapter } from \"../adapters/chunking/index.js\";\nimport { DefaultReRankingAdapter } from \"../adapters/reranking/index.js\";\n\n/** Default maximum token count per RAG chunk */\nconst DEFAULT_MAX_TOKENS_PER_CHUNK = 512;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface Entity {\n name?: string;\n label?: string;\n type?: string;\n category?: string;\n}\n\ninterface KnowledgeBase {\n entities?: Entity[];\n relations?: unknown[];\n quotes?: unknown[];\n}\n\nexport interface VectorlessPluginOptions {\n /** Pre-configured vectorless instance */\n vectorless?: unknown;\n /** Knowledge base — pre-loaded knowledge to query against */\n knowledgeBase?: unknown;\n /** Model to use for knowledge generation (default: uses vectorless default) */\n model?: unknown;\n /** Validation adapter (defaults to ZodValidationAdapter) */\n validator?: ValidationPort;\n /** Custom chunking adapter (defaults to DefaultChunkingAdapter) */\n chunkingAdapter?: ChunkingPort;\n /** Custom re-ranking adapter (defaults to DefaultReRankingAdapter) */\n rerankingAdapter?: ReRankingPort;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class VectorlessPlugin extends BasePlugin {\n readonly name = \"knowledge\";\n\n private readonly options: VectorlessPluginOptions;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private vectorlessPromise: Promise<any> | null = null;\n private currentKnowledge: unknown = null;\n private readonly validator: ValidationPort;\n readonly chunks: Map<string, Chunk> = new Map();\n readonly chunkingAdapter: ChunkingPort;\n readonly rerankingAdapter: ReRankingPort;\n private _toolsCache?: Record<string, Tool<any, any>>;\n\n constructor(options: VectorlessPluginOptions = {}) {\n super();\n this.options = options;\n this.currentKnowledge = options.knowledgeBase ?? null;\n this.validator = getValidator(options);\n this.chunkingAdapter = options.chunkingAdapter ?? new DefaultChunkingAdapter();\n this.rerankingAdapter = options.rerankingAdapter ?? new DefaultReRankingAdapter();\n }\n\n protected buildHooks(): PluginHooks {\n return {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private getVectorless(): Promise<any> {\n if (!this.vectorlessPromise) {\n this.vectorlessPromise = this.initVectorless();\n }\n return this.vectorlessPromise;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async initVectorless(): Promise<any> {\n if (this.options.vectorless) {\n return this.options.vectorless;\n }\n try {\n // @ts-expect-error — @giulio-leone/gaussflow-vectorless is an optional peer dependency\n const mod = await import(\"@giulio-leone/gaussflow-vectorless\");\n return mod.default ?? mod;\n } catch {\n throw new Error(\n 'VectorlessPlugin requires \"@giulio-leone/gaussflow-vectorless\" package. Install it: pnpm add @giulio-leone/gaussflow-vectorless',\n );\n }\n }\n\n get tools(): Record<string, Tool<any, any>> {\n if (this._toolsCache) return this._toolsCache;\n const getVectorless = this.getVectorless.bind(this);\n const getKnowledge = () => this.currentKnowledge;\n const setKnowledge = (k: unknown) => { this.currentKnowledge = k; };\n const mergeKnowledge = (newK: unknown) => {\n const existing = this.currentKnowledge as Record<string, unknown> | null;\n const incoming = newK as Record<string, unknown> | null;\n if (!existing || !incoming) { this.currentKnowledge = incoming ?? existing; return; }\n const merged: Record<string, unknown> = { ...existing };\n for (const key of ['entities', 'relations', 'quotes']) {\n const a = Array.isArray(existing[key]) ? existing[key] as unknown[] : [];\n const b = Array.isArray(incoming[key]) ? incoming[key] as unknown[] : [];\n if (a.length > 0 || b.length > 0) merged[key] = [...a, ...b];\n }\n this.currentKnowledge = merged;\n };\n const validator = this.validator;\n const chunks = this.chunks;\n const chunkingAdapter = this.chunkingAdapter;\n const rerankingAdapter = this.rerankingAdapter;\n\n const toolsMap: Record<string, Tool<any, any>> = {\n generate: tool({\n description: \"Extract knowledge (entities, relations, quotes) from text. Must be called before query/search.\",\n inputSchema: z.object({\n text: z.string().describe(\"The text to extract knowledge from\"),\n topic: z.string().optional().describe(\"Optional topic to focus extraction on\"),\n }),\n execute: async (args: unknown) => {\n const { text, topic } = validator.validateOrThrow<{ text: string; topic?: string }>(\n z.object({\n text: z.string(),\n topic: z.string().optional(),\n }),\n args,\n );\n const vl = await getVectorless();\n const generate = vl.generateKnowledge ?? vl.generate ?? vl.extract;\n if (!generate) throw new Error(\"vectorless: generateKnowledge function not found\");\n const knowledge = await generate(text, { topic });\n setKnowledge(knowledge);\n const summary = {\n entities: Array.isArray(knowledge?.entities) ? knowledge.entities.length : 0,\n relations: Array.isArray(knowledge?.relations) ? knowledge.relations.length : 0,\n quotes: Array.isArray(knowledge?.quotes) ? knowledge.quotes.length : 0,\n };\n return `Knowledge extracted: ${summary.entities} entities, ${summary.relations} relations, ${summary.quotes} quotes`;\n },\n }),\n\n query: tool({\n description: \"Answer a question using the extracted knowledge base\",\n inputSchema: z.object({\n question: z.string().describe(\"The question to answer\"),\n }),\n execute: async (args: unknown) => {\n const { question } = validator.validateOrThrow<{ question: string }>(\n z.object({ question: z.string() }),\n args,\n );\n const knowledge = getKnowledge();\n if (!knowledge) return \"No knowledge base loaded. Use knowledge:generate first.\";\n const vl = await getVectorless();\n const query = vl.queryKnowledge ?? vl.query ?? vl.ask;\n if (!query) throw new Error(\"vectorless: queryKnowledge function not found\");\n const result = await query(question, knowledge);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n }),\n\n \"search-entities\": tool({\n description: \"Search for entities in the extracted knowledge base\",\n inputSchema: z.object({\n query: z.string().describe(\"Search query for entities\"),\n limit: z.number().min(1).max(50).default(10).describe(\"Max results\"),\n }),\n execute: async (args: unknown) => {\n const { query, limit } = validator.validateOrThrow<{ query: string; limit: number }>(\n z.object({\n query: z.string(),\n limit: z.number().min(1).max(50).default(10),\n }),\n args,\n );\n const knowledge = getKnowledge();\n if (!knowledge) return \"No knowledge base loaded. Use knowledge:generate first.\";\n const vl = await getVectorless();\n if (typeof vl.searchEntities === \"function\") {\n return await vl.searchEntities(query, knowledge, { limit });\n }\n // Fallback: filter entities by name match\n const kb = knowledge as KnowledgeBase | null;\n const entities: Entity[] = Array.isArray(kb?.entities) ? kb.entities : [];\n const lower = query.toLowerCase();\n return entities\n .filter((e: Entity) => (e.name ?? e.label ?? \"\").toLowerCase().includes(lower))\n .slice(0, limit);\n },\n }),\n\n list: tool({\n description: \"List all entities in the current knowledge base\",\n inputSchema: z.object({}),\n execute: async () => {\n const knowledge = getKnowledge();\n if (!knowledge) return \"No knowledge base loaded. Use knowledge:generate first.\";\n const kb = knowledge as KnowledgeBase;\n const entities: Entity[] = Array.isArray(kb.entities) ? kb.entities : [];\n return entities.map((e: Entity) => ({\n name: e.name ?? e.label ?? \"unknown\",\n type: e.type ?? e.category ?? \"unknown\",\n }));\n },\n }),\n\n // ─── Advanced RAG tools ──────────────────────────────────────────\n\n \"rag:ingest\": tool({\n description: \"Chunk a document and extract knowledge from each chunk\",\n inputSchema: z.object({\n text: z.string().describe(\"The document text to ingest\"),\n source: z.string().optional().describe(\"Source identifier for attribution\"),\n chunkingStrategy: z.enum([\"fixed\", \"sliding-window\", \"semantic\", \"recursive\"]).default(\"recursive\").describe(\"Chunking strategy\"),\n maxTokens: z.number().min(1).default(DEFAULT_MAX_TOKENS_PER_CHUNK).describe(\"Max tokens per chunk\"),\n overlap: z.number().min(0).default(50).describe(\"Token overlap for sliding-window\"),\n }),\n execute: async (args: unknown) => {\n const { text, source, chunkingStrategy, maxTokens, overlap } = validator.validateOrThrow<{\n text: string; source?: string; chunkingStrategy: string; maxTokens: number; overlap: number;\n }>(\n z.object({\n text: z.string(),\n source: z.string().optional(),\n chunkingStrategy: z.enum([\"fixed\", \"sliding-window\", \"semantic\", \"recursive\"]).default(\"recursive\"),\n maxTokens: z.number().min(1).default(DEFAULT_MAX_TOKENS_PER_CHUNK),\n overlap: z.number().min(0).default(50),\n }),\n args,\n );\n\n const produced = chunkingAdapter.chunk(text, {\n strategy: chunkingStrategy as \"fixed\" | \"sliding-window\" | \"semantic\" | \"recursive\",\n maxTokens,\n overlap,\n });\n\n for (const c of produced) {\n c.metadata.source = source;\n chunks.set(c.id, c);\n }\n\n // Also extract knowledge via vectorless if available\n try {\n const vl = await getVectorless();\n const generate = vl.generateKnowledge ?? vl.generate ?? vl.extract;\n if (generate) {\n const knowledge = await generate(text, { topic: source });\n mergeKnowledge(knowledge);\n }\n } catch {\n // vectorless not available — chunks-only mode\n }\n\n return `Ingested ${produced.length} chunks (strategy: ${chunkingStrategy}, maxTokens: ${maxTokens})${source ? ` from \"${source}\"` : \"\"}`;\n },\n }),\n\n \"rag:search\": tool({\n description: \"Hybrid search: combine entity search + keyword search, then re-rank results\",\n inputSchema: z.object({\n query: z.string().describe(\"Search query\"),\n limit: z.number().min(1).max(100).default(10).describe(\"Max results\"),\n rerankerStrategy: z.enum([\"tfidf\", \"bm25\", \"mmr\"]).default(\"bm25\").describe(\"Re-ranking strategy\"),\n includeAttribution: z.boolean().default(true).describe(\"Include source attribution\"),\n }),\n execute: async (args: unknown) => {\n const { query, limit, rerankerStrategy, includeAttribution } = validator.validateOrThrow<{\n query: string; limit: number; rerankerStrategy: string; includeAttribution: boolean;\n }>(\n z.object({\n query: z.string(),\n limit: z.number().min(1).max(100).default(10),\n rerankerStrategy: z.enum([\"tfidf\", \"bm25\", \"mmr\"]).default(\"bm25\"),\n includeAttribution: z.boolean().default(true),\n }),\n args,\n );\n\n const candidates: ScoredResult[] = [];\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/);\n\n // 1. Entity search from knowledge base\n const knowledge = getKnowledge();\n if (knowledge) {\n const kb = knowledge as KnowledgeBase | null;\n const entities: Entity[] = Array.isArray(kb?.entities) ? kb.entities : [];\n for (const e of entities) {\n const name = (e.name ?? e.label ?? \"\").toLowerCase();\n if (name.includes(queryLower) || queryLower.includes(name)) {\n candidates.push({\n id: `entity:${e.name ?? e.label}`,\n text: `${e.name ?? e.label} (${e.type ?? e.category ?? \"unknown\"})`,\n score: 0,\n });\n }\n }\n }\n\n // 2. Full-text keyword search across chunks\n for (const [, chunk] of chunks) {\n const chunkLower = chunk.text.toLowerCase();\n if (chunkLower.includes(queryLower) || queryWords.some((w) => chunkLower.includes(w))) {\n const result: ScoredResult = {\n id: chunk.id,\n text: chunk.text,\n score: 0,\n };\n if (includeAttribution) {\n result.source = {\n chunkId: chunk.id,\n chunkIndex: chunk.index,\n documentId: chunk.metadata.source,\n startOffset: chunk.metadata.startOffset,\n endOffset: chunk.metadata.endOffset,\n relevanceScore: 0,\n };\n }\n candidates.push(result);\n }\n }\n\n if (candidates.length === 0) return [];\n\n // 3. Re-rank\n const reranked = rerankingAdapter.rerank(query, candidates, {\n strategy: rerankerStrategy as \"tfidf\" | \"bm25\" | \"mmr\",\n });\n\n // Update attribution relevance scores\n const top = reranked.slice(0, limit);\n for (const r of top) {\n if (r.source) r.source.relevanceScore = r.score;\n }\n\n return top;\n },\n }),\n\n \"rag:search-chunks\": tool({\n description: \"Search directly against stored chunks\",\n inputSchema: z.object({\n query: z.string().describe(\"Search query\"),\n limit: z.number().min(1).max(100).default(10).describe(\"Max results\"),\n }),\n execute: async (args: unknown) => {\n const { query, limit } = validator.validateOrThrow<{ query: string; limit: number }>(\n z.object({\n query: z.string(),\n limit: z.number().min(1).max(100).default(10),\n }),\n args,\n );\n\n const queryWords = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const results: Array<Chunk & { matchScore: number }> = [];\n\n for (const [, chunk] of chunks) {\n const chunkLower = chunk.text.toLowerCase();\n const matchCount = queryWords.filter((w) => chunkLower.includes(w)).length;\n if (matchCount > 0) {\n results.push({ ...chunk, matchScore: matchCount / queryWords.length });\n }\n }\n\n return results\n .sort((a, b) => b.matchScore - a.matchScore)\n .slice(0, limit)\n .map(({ matchScore, ...chunk }) => chunk);\n },\n }),\n };\n this._toolsCache = toolsMap;\n return toolsMap;\n }\n\n async dispose(): Promise<void> {\n this.currentKnowledge = null;\n this.vectorlessPromise = null;\n this.chunks.clear();\n this._toolsCache = undefined;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createVectorlessPlugin(\n options: VectorlessPluginOptions = {},\n): VectorlessPlugin {\n return new VectorlessPlugin(options);\n}\n","// =============================================================================\n// DefaultChunkingAdapter — Implements fixed, sliding-window, semantic, recursive\n// =============================================================================\n\nimport { randomUUID } from \"node:crypto\";\nimport type { Chunk, ChunkingPort, ChunkOptions } from \"../../ports/chunking.port.js\";\n\nconst DEFAULT_MAX_TOKENS = 512;\nconst DEFAULT_OVERLAP = 50;\nconst DEFAULT_SEPARATORS = [\"\\n\\n\", \"\\n\", \". \", \" \"];\n\nfunction wordCount(text: string): number {\n let count = 0;\n const re = /\\S+/g;\n while (re.exec(text) !== null) count++;\n return count;\n}\n\nfunction makeChunk(text: string, index: number, startOffset: number, source?: string): Chunk {\n return {\n id: randomUUID(),\n text,\n index,\n metadata: {\n startOffset,\n endOffset: startOffset + text.length,\n tokenCount: wordCount(text),\n source,\n },\n };\n}\n\n// Track word positions for accurate chunk offsets\ninterface WordPosition { word: string; start: number; end: number; }\n\nfunction getWordPositions(text: string): WordPosition[] {\n const positions: WordPosition[] = [];\n const regex = /\\S+/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n positions.push({ word: match[0], start: match.index, end: match.index + match[0].length });\n }\n return positions;\n}\n\nfunction splitByWordsMaxWithPositions(positions: WordPosition[], maxTokens: number): { text: string; start: number; end: number }[] {\n const parts: { text: string; start: number; end: number }[] = [];\n for (let i = 0; i < positions.length; i += maxTokens) {\n const slice = positions.slice(i, i + maxTokens);\n parts.push({\n text: slice.map(p => p.word).join(\" \"),\n start: slice[0]!.start,\n end: slice[slice.length - 1]!.end,\n });\n }\n return parts;\n}\n\nfunction splitByWordsMax(text: string, maxTokens: number): string[] {\n const words = text.split(/\\s+/).filter(Boolean);\n const parts: string[] = [];\n for (let i = 0; i < words.length; i += maxTokens) {\n parts.push(words.slice(i, i + maxTokens).join(\" \"));\n }\n return parts;\n}\n\nfunction chunkFixed(text: string, maxTokens: number): string[] {\n return splitByWordsMax(text, maxTokens);\n}\n\nfunction chunkSlidingWindow(text: string, maxTokens: number, overlap: number): string[] {\n const words = text.split(/\\s+/).filter(Boolean);\n if (words.length === 0) return [];\n const step = Math.max(1, maxTokens - overlap);\n const chunks: string[] = [];\n for (let i = 0; i < words.length; i += step) {\n chunks.push(words.slice(i, i + maxTokens).join(\" \"));\n if (i + maxTokens >= words.length) break;\n }\n return chunks;\n}\n\nfunction chunkSemantic(text: string, maxTokens: number): string[] {\n // Split on paragraph boundaries first, then sentence boundaries\n const paragraphs = text.split(/\\n\\n+/).filter(Boolean);\n const chunks: string[] = [];\n let current = \"\";\n\n for (const para of paragraphs) {\n const candidate = current ? `${current}\\n\\n${para}` : para;\n const candidateWc = wordCount(candidate);\n if (candidateWc <= maxTokens) {\n current = candidate;\n } else {\n if (current) chunks.push(current);\n // If a single paragraph exceeds maxTokens, split by sentences\n // When current was empty, candidate === para, so reuse candidateWc\n const paraWc = current ? wordCount(para) : candidateWc;\n if (paraWc > maxTokens) {\n const sentences = para.split(/(?<=[.!?])\\s+/).filter(Boolean);\n let sentBuf = \"\";\n for (const s of sentences) {\n const next = sentBuf ? `${sentBuf} ${s}` : s;\n const nextWc = wordCount(next);\n if (nextWc <= maxTokens) {\n sentBuf = next;\n } else {\n if (sentBuf) chunks.push(sentBuf);\n // If a single sentence exceeds maxTokens, force split by words\n // When sentBuf was empty, next === s, so reuse nextWc\n const sWc = sentBuf ? wordCount(s) : nextWc;\n if (sWc > maxTokens) {\n chunks.push(...splitByWordsMax(s, maxTokens));\n sentBuf = \"\";\n } else {\n sentBuf = s;\n }\n }\n }\n current = sentBuf;\n } else {\n current = para;\n }\n }\n }\n if (current) chunks.push(current);\n return chunks;\n}\n\nfunction chunkRecursive(text: string, maxTokens: number, separators: string[]): string[] {\n const wc = wordCount(text);\n if (wc <= maxTokens || separators.length === 0) {\n // If no separators left and still too large, force split by words\n if (wc > maxTokens) return splitByWordsMax(text, maxTokens);\n return [text];\n }\n\n const sep = separators[0]!;\n const rest = separators.slice(1);\n const parts = text.split(sep).filter(Boolean);\n\n const results: string[] = [];\n let buffer = \"\";\n\n for (const part of parts) {\n const candidate = buffer ? `${buffer}${sep}${part}` : part;\n const candidateWc = wordCount(candidate);\n if (candidateWc <= maxTokens) {\n buffer = candidate;\n } else {\n if (buffer) results.push(buffer);\n // When buffer was empty, candidate === part, so reuse candidateWc\n const partWc = buffer ? wordCount(part) : candidateWc;\n if (partWc > maxTokens) {\n results.push(...chunkRecursive(part, maxTokens, rest));\n buffer = \"\";\n } else {\n buffer = part;\n }\n }\n }\n if (buffer) results.push(buffer);\n return results;\n}\n\nexport class DefaultChunkingAdapter implements ChunkingPort {\n chunk(text: string, options?: ChunkOptions): Chunk[] {\n if (!text || !text.trim()) return [];\n\n const strategy = options?.strategy ?? \"fixed\";\n const maxTokens = options?.maxTokens ?? DEFAULT_MAX_TOKENS;\n const overlap = options?.overlap ?? DEFAULT_OVERLAP;\n const separators = options?.separators ?? DEFAULT_SEPARATORS;\n\n let rawChunks: string[];\n\n switch (strategy) {\n case \"fixed\":\n rawChunks = chunkFixed(text, maxTokens);\n break;\n case \"sliding-window\":\n rawChunks = chunkSlidingWindow(text, maxTokens, overlap);\n break;\n case \"semantic\":\n rawChunks = chunkSemantic(text, maxTokens);\n break;\n case \"recursive\":\n rawChunks = chunkRecursive(text, maxTokens, separators);\n break;\n default:\n rawChunks = chunkFixed(text, maxTokens);\n }\n\n // Build chunks with accurate offsets using word positions\n const wordPositions = getWordPositions(text);\n const chunks: Chunk[] = [];\n let searchWordIdx = 0;\n for (let i = 0; i < rawChunks.length; i++) {\n const raw = rawChunks[i]!;\n const chunkWords = raw.split(/\\s+/).filter(Boolean);\n if (chunkWords.length === 0) continue;\n\n // Find the first word of this chunk in wordPositions from searchWordIdx\n let matchIdx = searchWordIdx;\n for (let j = searchWordIdx; j < wordPositions.length; j++) {\n if (wordPositions[j]!.word === chunkWords[0]) { matchIdx = j; break; }\n }\n\n const startPos = matchIdx < wordPositions.length ? wordPositions[matchIdx]!.start : 0;\n const lastWordIdx = Math.min(matchIdx + chunkWords.length - 1, wordPositions.length - 1);\n const endPos = lastWordIdx >= 0 ? wordPositions[lastWordIdx]!.end : startPos + raw.length;\n chunks.push(makeChunk(raw, i, startPos));\n chunks[chunks.length - 1]!.metadata.endOffset = endPos;\n // For sliding-window, don't advance past overlap\n searchWordIdx = matchIdx + 1;\n }\n return chunks;\n }\n}\n","// =============================================================================\n// DefaultReRankingAdapter — Implements TF-IDF, BM25, MMR re-ranking\n// =============================================================================\n\nimport type { ReRankingPort, ReRankingOptions, ScoredResult } from \"../../ports/reranking.port.js\";\n\n// BM25 parameters\nconst K1 = 1.2;\nconst B = 0.75;\n\n/** Module-level compiled regex for punctuation removal. */\nconst PUNCTUATION_RE = /[^\\w\\s]/g;\n\nfunction tokenize(text: string): string[] {\n return text.toLowerCase().replace(PUNCTUATION_RE, \"\").split(/\\s+/).filter(Boolean);\n}\n\n/**\n * Build a term-frequency map from a token list in a single O(n) pass.\n * Each value is the raw count of that term in the token list.\n */\nfunction buildTermFrequencyMap(tokens: string[]): Map<string, number> {\n const freq = new Map<string, number>();\n for (const t of tokens) {\n freq.set(t, (freq.get(t) ?? 0) + 1);\n }\n return freq;\n}\n\nfunction computeTfIdf(query: string, results: ScoredResult[]): ScoredResult[] {\n const queryTokens = tokenize(query);\n const docTokenSets = results.map((r) => tokenize(r.text));\n const docFreqMaps = docTokenSets.map(buildTermFrequencyMap);\n const n = results.length;\n\n // Compute IDF for each query term\n const idf = new Map<string, number>();\n for (const term of queryTokens) {\n let df = 0;\n for (const fm of docFreqMaps) {\n if (fm.has(term)) df++;\n }\n idf.set(term, Math.log((n + 1) / (df + 1)) + 1);\n }\n\n return results.map((r, i) => {\n const tokens = docTokenSets[i]!;\n const freqMap = docFreqMaps[i]!;\n let score = 0;\n for (const term of queryTokens) {\n const tf = (freqMap.get(term) ?? 0) / (tokens.length || 1);\n score += tf * (idf.get(term) ?? 0);\n }\n return { ...r, score };\n }).sort((a, b) => b.score - a.score);\n}\n\nfunction computeBm25(query: string, results: ScoredResult[]): ScoredResult[] {\n const queryTokens = tokenize(query);\n const docTokenSets = results.map((r) => tokenize(r.text));\n const docFreqMaps = docTokenSets.map(buildTermFrequencyMap);\n const n = results.length;\n const avgDl = docTokenSets.reduce((sum, t) => sum + t.length, 0) / (n || 1) || 1;\n\n // IDF\n const idf = new Map<string, number>();\n for (const term of queryTokens) {\n let df = 0;\n for (const fm of docFreqMaps) {\n if (fm.has(term)) df++;\n }\n idf.set(term, Math.log((n - df + 0.5) / (df + 0.5) + 1));\n }\n\n return results.map((r, i) => {\n const tokens = docTokenSets[i]!;\n const freqMap = docFreqMaps[i]!;\n const dl = tokens.length;\n let score = 0;\n for (const term of queryTokens) {\n const tf = freqMap.get(term) ?? 0;\n const idfVal = idf.get(term) ?? 0;\n score += idfVal * ((tf * (K1 + 1)) / (tf + K1 * (1 - B + B * (dl / avgDl))));\n }\n return { ...r, score };\n }).sort((a, b) => b.score - a.score);\n}\n\n/** A TF vector with a pre-computed L2 norm for fast cosine similarity. */\ninterface TfVector {\n vec: Map<string, number>;\n norm: number;\n}\n\n/**\n * Compute cosine similarity between two pre-normed TF vectors.\n * Iterates the smaller vector and looks up in the larger one — O(min(|a|,|b|)).\n */\nfunction cosineSimilarity(a: TfVector, b: TfVector): number {\n const denom = a.norm * b.norm;\n if (denom === 0) return 0;\n\n // Iterate the smaller map, lookup in the larger\n const [small, large] = a.vec.size <= b.vec.size ? [a.vec, b.vec] : [b.vec, a.vec];\n let dot = 0;\n for (const [k, v] of small) {\n const other = large.get(k);\n if (other !== undefined) dot += v * other;\n }\n return dot / denom;\n}\n\n/**\n * Build a normalized TF vector with pre-computed L2 norm from tokens.\n */\nfunction toTfVector(tokens: string[]): TfVector {\n const freqMap = buildTermFrequencyMap(tokens);\n const len = tokens.length;\n // Normalize counts to frequencies and compute norm in one pass\n let normSq = 0;\n for (const [k, v] of freqMap) {\n const tf = v / len;\n freqMap.set(k, tf);\n normSq += tf * tf;\n }\n return { vec: freqMap, norm: Math.sqrt(normSq) };\n}\n\nfunction computeMmr(query: string, results: ScoredResult[], lambda: number): ScoredResult[] {\n if (results.length === 0) return [];\n\n const queryVec = toTfVector(tokenize(query));\n const docVecs = results.map((r) => toTfVector(tokenize(r.text)));\n\n // Pre-compute relevance scores (cosine similarity to query)\n const relevances = docVecs.map((dv) => cosineSimilarity(queryVec, dv));\n\n // Pre-compute pairwise similarities and cache them\n const pairwiseSim = new Map<string, number>();\n const pairKey = (i: number, j: number): string => i < j ? `${i},${j}` : `${j},${i}`;\n\n const selected: number[] = [];\n const remaining = new Set(results.map((_, i) => i));\n const reranked: ScoredResult[] = [];\n\n while (remaining.size > 0) {\n let bestIdx = -1;\n let bestScore = -Infinity;\n\n for (const idx of remaining) {\n const rel = relevances[idx]!;\n let maxSim = 0;\n for (const selIdx of selected) {\n const key = pairKey(idx, selIdx);\n let sim = pairwiseSim.get(key);\n if (sim === undefined) {\n sim = cosineSimilarity(docVecs[idx]!, docVecs[selIdx]!);\n pairwiseSim.set(key, sim);\n }\n if (sim > maxSim) maxSim = sim;\n }\n const mmrScore = lambda * rel - (1 - lambda) * maxSim;\n if (mmrScore > bestScore) {\n bestScore = mmrScore;\n bestIdx = idx;\n }\n }\n\n if (bestIdx >= 0) {\n selected.push(bestIdx);\n remaining.delete(bestIdx);\n reranked.push({ ...results[bestIdx]!, score: bestScore });\n }\n }\n\n return reranked;\n}\n\nexport class DefaultReRankingAdapter implements ReRankingPort {\n rerank(query: string, results: ScoredResult[], options?: ReRankingOptions): ScoredResult[] {\n if (results.length === 0) return [];\n\n const strategy = options?.strategy ?? \"bm25\";\n\n switch (strategy) {\n case \"tfidf\":\n return computeTfIdf(query, results);\n case \"bm25\":\n return computeBm25(query, results);\n case \"mmr\":\n return computeMmr(query, results, options?.lambda ?? 0.7);\n default:\n return computeBm25(query, results);\n }\n }\n}\n","// =============================================================================\n// EvalsPlugin — Evaluation metrics collection\n// =============================================================================\n\nimport type {\n PluginHooks,\n PluginContext,\n BeforeRunParams,\n BeforeRunResult,\n AfterRunParams,\n AfterToolParams,\n OnErrorParams,\n} from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport type { EvalResult, EvalMetrics } from \"../domain/eval.schema.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface EvalScorer {\n readonly name: string;\n score(prompt: string, output: string, metrics: EvalMetrics): Promise<number> | number;\n}\n\nexport interface EvalsPluginOptions {\n /** Custom scoring functions */\n scorers?: EvalScorer[];\n /** Whether to persist results via MemoryPort metadata (default: false) */\n persist?: boolean;\n /** Callback invoked after each evaluation */\n onEval?: (result: EvalResult) => void | Promise<void>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface RunState {\n startTime: number;\n prompt: string;\n toolCallCounts: Record<string, number>;\n}\n\nexport class EvalsPlugin extends BasePlugin {\n readonly name = \"evals\";\n\n private readonly options: EvalsPluginOptions;\n private readonly results: EvalResult[] = [];\n private readonly runStates = new Map<string, RunState>();\n\n constructor(options: EvalsPluginOptions = {}) {\n super();\n this.options = options;\n }\n\n protected buildHooks(): PluginHooks {\n return {\n beforeRun: this.beforeRun.bind(this),\n afterRun: this.afterRun.bind(this),\n afterTool: this.afterTool.bind(this),\n onError: this.onError.bind(this),\n };\n }\n\n private beforeRun(ctx: PluginContext, params: BeforeRunParams): BeforeRunResult | void {\n this.runStates.set(ctx.sessionId, {\n startTime: Date.now(),\n prompt: params.prompt,\n toolCallCounts: {},\n });\n }\n\n private async afterRun(ctx: PluginContext, params: AfterRunParams): Promise<void> {\n const state = this.runStates.get(ctx.sessionId);\n const latencyMs = state ? Date.now() - state.startTime : 0;\n const prompt = state?.prompt ?? \"\";\n const toolCalls = state ? { ...state.toolCallCounts } : {};\n this.runStates.delete(ctx.sessionId);\n\n const steps = params.result.steps;\n\n // Extract token usage from steps if available\n let promptTokens = 0;\n let completionTokens = 0;\n for (const step of steps) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const usage = (step as any)?.usage;\n if (usage) {\n promptTokens += usage.promptTokens ?? 0;\n completionTokens += usage.completionTokens ?? 0;\n }\n }\n\n const metrics: EvalMetrics = {\n latencyMs,\n stepCount: steps.length,\n toolCalls,\n tokenUsage: {\n prompt: promptTokens,\n completion: completionTokens,\n total: promptTokens + completionTokens,\n },\n customScores: {},\n };\n\n // Run custom scorers\n for (const scorer of this.options.scorers ?? []) {\n try {\n metrics.customScores[scorer.name] = await scorer.score(\n prompt,\n params.result.text,\n metrics,\n );\n } catch {\n metrics.customScores[scorer.name] = -1;\n }\n }\n\n const evalResult: EvalResult = {\n id: crypto.randomUUID(),\n sessionId: params.result.sessionId,\n prompt,\n output: params.result.text,\n metrics,\n createdAt: Date.now(),\n };\n\n this.results.push(evalResult);\n\n // Persist via MemoryPort if configured\n if (this.options.persist) {\n await ctx.memory.saveMetadata(\n ctx.sessionId,\n `eval:${evalResult.id}`,\n evalResult,\n );\n }\n\n // Invoke callback\n if (this.options.onEval) {\n await this.options.onEval(evalResult);\n }\n }\n\n private afterTool(ctx: PluginContext, params: AfterToolParams): void {\n const state = this.runStates.get(ctx.sessionId);\n if (state) {\n state.toolCallCounts[params.toolName] = (state.toolCallCounts[params.toolName] ?? 0) + 1;\n }\n }\n\n private onError(ctx: PluginContext, params: OnErrorParams): void {\n if (params.phase === \"run\") {\n this.runStates.delete(ctx.sessionId);\n }\n }\n\n /** Get all collected eval results */\n getResults(): readonly EvalResult[] {\n return this.results;\n }\n\n /** Get the most recent eval result */\n getLastResult(): EvalResult | undefined {\n return this.results[this.results.length - 1];\n }\n\n /** Clear collected results */\n clearResults(): void {\n this.results.length = 0;\n }\n}\n\nexport function createEvalsPlugin(options: EvalsPluginOptions = {}): EvalsPlugin {\n return new EvalsPlugin(options);\n}\n","// =============================================================================\n// DefaultWorkflowEngine — Implements WorkflowPort with all step types\n// =============================================================================\n\nimport type {\n WorkflowStep,\n WorkflowContext,\n WorkflowResult,\n WorkflowDefinition,\n AnyStep,\n ParallelStep,\n ConditionalStep,\n LoopStep,\n ForeachStep,\n MapStep,\n AgentStep,\n RetryConfig,\n WorkflowEvent,\n} from \"../../domain/workflow.schema.js\";\nimport type { WorkflowPort, ValidationResult, WorkflowEventListener } from \"../../ports/workflow.port.js\";\n\nconst DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 3,\n backoffMs: 1000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_MAX_ITERATIONS = 10;\nconst DEFAULT_MAX_CONCURRENCY = 1;\n\nexport type AgentExecutor = (prompt: string, ctx: WorkflowContext) => Promise<unknown>;\n\nexport interface DefaultWorkflowEngineOptions {\n agentExecutor?: AgentExecutor;\n onEvent?: WorkflowEventListener;\n}\n\nexport class DefaultWorkflowEngine implements WorkflowPort {\n private readonly agentExecutor?: AgentExecutor;\n private readonly onEvent?: WorkflowEventListener;\n\n constructor(options: DefaultWorkflowEngineOptions = {}) {\n this.agentExecutor = options.agentExecutor;\n this.onEvent = options.onEvent;\n }\n\n async execute(definition: WorkflowDefinition, context?: WorkflowContext): Promise<WorkflowResult> {\n const start = Date.now();\n let ctx = structuredClone(definition.initialContext ?? {});\n if (context) {\n ctx = { ...ctx, ...structuredClone(context) };\n }\n\n const completedSteps: string[] = [];\n const skippedSteps: string[] = [];\n // Registry of all executed steps (including nested) for rollback\n const executedRegistry: Map<string, WorkflowStep> = new Map();\n\n const timeoutMs = definition.maxDurationMs;\n const deadline = timeoutMs ? start + timeoutMs : undefined;\n\n for (const step of definition.steps) {\n if (deadline && Date.now() >= deadline) {\n await this.rollbackSteps(executedRegistry, completedSteps, ctx);\n return {\n status: \"failed\",\n context: ctx,\n completedSteps,\n skippedSteps,\n failedStep: step.id,\n error: `Workflow timeout exceeded (${timeoutMs}ms)`,\n totalDurationMs: Date.now() - start,\n };\n }\n\n try {\n const stepResult = await this.executeStep(step, ctx, completedSteps, skippedSteps, executedRegistry, deadline);\n if (skippedSteps.includes(step.id)) {\n continue;\n }\n ctx = stepResult;\n completedSteps.push(step.id);\n } catch (error) {\n await this.rollbackSteps(executedRegistry, completedSteps, ctx);\n return {\n status: \"failed\",\n context: ctx,\n completedSteps,\n skippedSteps,\n failedStep: step.id,\n error: error instanceof Error ? error.message : String(error),\n totalDurationMs: Date.now() - start,\n };\n }\n }\n\n return {\n status: \"completed\",\n context: ctx,\n completedSteps,\n skippedSteps,\n totalDurationMs: Date.now() - start,\n };\n }\n\n validate(definition: WorkflowDefinition): ValidationResult {\n const errors: string[] = [];\n\n if (!definition.id) errors.push(\"Workflow must have an id\");\n if (!definition.name) errors.push(\"Workflow must have a name\");\n if (!definition.steps || !Array.isArray(definition.steps)) {\n errors.push(\"Workflow must have a steps array\");\n } else if (definition.steps.length === 0) {\n errors.push(\"Workflow must have at least one step\");\n }\n\n const ids = new Set<string>();\n for (const step of definition.steps ?? []) {\n if (!step.id) errors.push(\"Every step must have an id\");\n if (!step.name) errors.push(`Step \"${step.id}\" must have a name`);\n if (ids.has(step.id)) errors.push(`Duplicate step id: \"${step.id}\"`);\n ids.add(step.id);\n\n this.validateStep(step, errors);\n }\n\n if (definition.maxDurationMs !== undefined && definition.maxDurationMs <= 0) {\n errors.push(\"maxDurationMs must be positive\");\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ── Step execution ──────────────────────────────────────────────────────\n\n private async executeStep(\n step: AnyStep,\n ctx: WorkflowContext,\n completedSteps: string[],\n skippedSteps: string[],\n registry: Map<string, WorkflowStep>,\n deadline?: number,\n ): Promise<WorkflowContext> {\n this.emit({ type: 'step:start', stepId: step.id, stepName: step.name, timestamp: Date.now() });\n\n try {\n let result: WorkflowContext;\n\n if (this.isParallelStep(step)) {\n result = await this.executeParallel(step, ctx, registry, deadline);\n } else if (this.isConditionalStep(step)) {\n result = await this.executeConditional(step, ctx, completedSteps, skippedSteps, registry, deadline);\n } else if (this.isLoopStep(step)) {\n result = await this.executeLoop(step, ctx, registry, deadline);\n } else if (this.isForeachStep(step)) {\n result = await this.executeForeach(step, ctx, registry, deadline);\n } else if (this.isMapStep(step)) {\n result = await this.executeMap(step, ctx, registry, deadline);\n } else if (this.isAgentStep(step)) {\n result = await this.executeAgent(step, ctx);\n // Register agent steps for rollback\n if ('rollback' in step && typeof (step as WorkflowStep).rollback === 'function') {\n registry.set(step.id, step as unknown as WorkflowStep);\n }\n } else {\n const ws = step as WorkflowStep;\n if (ws.condition && !ws.condition(ctx)) {\n skippedSteps.push(step.id);\n this.emit({ type: 'step:complete', stepId: step.id, stepName: step.name, timestamp: Date.now(), context: ctx });\n return ctx;\n }\n const projectedCtx = this.applyInputMapping(ws, ctx);\n const rawResult = await this.executeWithRetry(ws, projectedCtx);\n result = ws.inputMapping ? { ...ctx, ...rawResult } : rawResult;\n result = this.applyOutputMappings(ws, result);\n // Register for rollback\n if (ws.rollback) {\n registry.set(step.id, ws);\n }\n }\n\n this.emit({ type: 'step:complete', stepId: step.id, stepName: step.name, timestamp: Date.now(), context: result });\n return result;\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n this.emit({ type: 'step:error', stepId: step.id, stepName: step.name, timestamp: Date.now(), error: errMsg });\n throw error;\n }\n }\n\n private async executeParallel(step: ParallelStep, ctx: WorkflowContext, registry: Map<string, WorkflowStep>, deadline?: number): Promise<WorkflowContext> {\n const strategy = step.mergeStrategy ?? 'all';\n const branchCtx = structuredClone(ctx);\n\n const wrapWithTimeout = (promise: Promise<WorkflowContext>): Promise<WorkflowContext> => {\n if (!deadline) return promise;\n const remaining = deadline - Date.now();\n if (remaining <= 0) return Promise.reject(new Error(\"Workflow timeout exceeded\"));\n let timer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<WorkflowContext>((_, reject) => {\n timer = setTimeout(() => reject(new Error(\"Workflow timeout exceeded\")), remaining);\n });\n return Promise.race([promise, timeoutPromise]).finally(() => clearTimeout(timer!));\n };\n\n const promises = step.branches.map((branch) => {\n // Register branch for rollback\n if (branch.rollback) registry.set(branch.id, branch);\n return wrapWithTimeout(this.executeWithRetry(branch, structuredClone(branchCtx)));\n });\n\n if (strategy === 'race') {\n return await Promise.race(promises);\n }\n\n if (strategy === 'first') {\n return await Promise.any(promises);\n }\n\n // 'all' — merge all branch results\n const results = await Promise.all(promises);\n let merged = structuredClone(ctx);\n for (const r of results) {\n merged = { ...merged, ...r };\n }\n return merged;\n }\n\n private async executeConditional(\n step: ConditionalStep,\n ctx: WorkflowContext,\n completedSteps: string[],\n skippedSteps: string[],\n registry: Map<string, WorkflowStep>,\n deadline?: number,\n ): Promise<WorkflowContext> {\n if (step.condition(ctx)) {\n return this.executeStep(step.ifTrue, structuredClone(ctx), completedSteps, skippedSteps, registry, deadline);\n } else if (step.ifFalse) {\n return this.executeStep(step.ifFalse, structuredClone(ctx), completedSteps, skippedSteps, registry, deadline);\n }\n return ctx;\n }\n\n private async executeLoop(step: LoopStep, ctx: WorkflowContext, registry: Map<string, WorkflowStep>, deadline?: number): Promise<WorkflowContext> {\n const maxIter = step.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n let current = structuredClone(ctx);\n\n // Register loop body for rollback\n if (step.body.rollback) {\n registry.set(step.body.id, step.body);\n }\n\n for (let i = 0; i < maxIter; i++) {\n if (!step.condition(current)) break;\n if (deadline && Date.now() >= deadline) {\n throw new Error(\"Workflow timeout exceeded\");\n }\n current = await this.executeWithRetry(step.body, current);\n }\n\n return current;\n }\n\n private async executeForeach(\n step: ForeachStep,\n ctx: WorkflowContext,\n registry: Map<string, WorkflowStep>,\n deadline?: number,\n ): Promise<WorkflowContext> {\n const iterable = this.getByPath(ctx, step.iterable);\n if (!Array.isArray(iterable)) {\n throw new Error(`Foreach step \"${step.id}\": iterable path \"${step.iterable}\" is not an array`);\n }\n\n const maxIter = step.maxIterations\n ? Math.min(step.maxIterations, iterable.length)\n : iterable.length;\n const items = iterable.slice(0, maxIter);\n const itemKey = step.itemKey ?? \"item\";\n const indexKey = step.indexKey ?? \"index\";\n\n const outputs = await this.executeItemsWithConcurrency(\n items,\n step.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY,\n async (item, index) => {\n if (deadline && Date.now() >= deadline) {\n throw new Error(\"Workflow timeout exceeded\");\n }\n\n const itemCtx: WorkflowContext = {\n ...ctx,\n [itemKey]: item,\n [indexKey]: index,\n };\n\n if (step.step.rollback) {\n registry.set(step.step.id, step.step);\n }\n\n const projectedCtx = this.applyInputMapping(step.step, itemCtx);\n const rawResult = await this.executeWithRetry(step.step, projectedCtx);\n const mergedResult = step.step.inputMapping\n ? { ...itemCtx, ...rawResult }\n : rawResult;\n const mappedResult = this.applyOutputMappings(step.step, mergedResult);\n return this.extractStepOutput(mappedResult, step.step.id);\n },\n );\n\n const aggregateKey = step.aggregateOutputKey ?? step.id;\n return {\n ...ctx,\n [aggregateKey]: this.aggregateOutputs(outputs, step.aggregationMode ?? \"array\"),\n };\n }\n\n private async executeMap(\n step: MapStep,\n ctx: WorkflowContext,\n registry: Map<string, WorkflowStep>,\n deadline?: number,\n ): Promise<WorkflowContext> {\n const source = this.getByPath(ctx, step.input);\n if (!Array.isArray(source)) {\n throw new Error(`Map step \"${step.id}\": input path \"${step.input}\" is not an array`);\n }\n\n const filtered = source.filter((item, index) =>\n step.filter ? step.filter(item, index, ctx) : true,\n );\n const itemKey = step.itemKey ?? \"item\";\n const indexKey = step.indexKey ?? \"index\";\n\n const transformed = await this.executeItemsWithConcurrency(\n filtered,\n step.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY,\n async (item, index) => {\n if (deadline && Date.now() >= deadline) {\n throw new Error(\"Workflow timeout exceeded\");\n }\n\n const itemCtx: WorkflowContext = {\n ...ctx,\n [itemKey]: item,\n [indexKey]: index,\n };\n\n if (step.transform.rollback) {\n registry.set(step.transform.id, step.transform);\n }\n\n const projectedCtx = this.applyInputMapping(step.transform, itemCtx);\n const rawResult = await this.executeWithRetry(step.transform, projectedCtx);\n const mergedResult = step.transform.inputMapping\n ? { ...itemCtx, ...rawResult }\n : rawResult;\n const mappedResult = this.applyOutputMappings(step.transform, mergedResult);\n return this.extractStepOutput(mappedResult, step.transform.id);\n },\n );\n\n return {\n ...ctx,\n [step.outputKey]: transformed,\n };\n }\n\n private async executeAgent(step: AgentStep, ctx: WorkflowContext): Promise<WorkflowContext> {\n // If the step has a custom execute, use retry logic\n if (step.execute) {\n return this.executeWithRetry(step as unknown as WorkflowStep, ctx);\n }\n\n if (!this.agentExecutor) {\n throw new Error(`AgentStep \"${step.id}\" requires an agentExecutor`);\n }\n\n const prompt = typeof step.prompt === 'function' ? step.prompt(ctx) : step.prompt;\n const retry = { ...DEFAULT_RETRY, ...step.retry };\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n const result = await this.agentExecutor(prompt, structuredClone(ctx));\n return { ...ctx, [step.outputKey]: result };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt < retry.maxAttempts) {\n const delay = retry.backoffMs * Math.pow(retry.backoffMultiplier, attempt - 1);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n throw lastError;\n }\n\n // ── Retry ───────────────────────────────────────────────────────────────\n\n private async executeWithRetry(step: WorkflowStep, ctx: WorkflowContext): Promise<WorkflowContext> {\n const retry = { ...DEFAULT_RETRY, ...step.retry };\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n return await step.execute(structuredClone(ctx));\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt < retry.maxAttempts) {\n const delay = retry.backoffMs * Math.pow(retry.backoffMultiplier, attempt - 1);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n throw lastError;\n }\n\n // ── Rollback ────────────────────────────────────────────────────────────\n\n private async rollbackSteps(\n registry: Map<string, WorkflowStep>,\n completedStepIds: string[],\n ctx: WorkflowContext,\n ): Promise<void> {\n // Rollback all registered steps in reverse order\n const allIds = [...completedStepIds, ...Array.from(registry.keys())];\n const uniqueIds = [...new Set(allIds)].reverse();\n for (const stepId of uniqueIds) {\n const step = registry.get(stepId);\n if (step?.rollback) {\n try {\n await step.rollback(ctx);\n } catch {\n // Swallow rollback errors to ensure all rollbacks are attempted\n }\n }\n }\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────\n\n private emit(event: WorkflowEvent): void {\n this.onEvent?.(event);\n }\n\n private isParallelStep(step: AnyStep): step is ParallelStep {\n return (step as ParallelStep).type === 'parallel';\n }\n\n private isConditionalStep(step: AnyStep): step is ConditionalStep {\n return (step as ConditionalStep).type === 'conditional';\n }\n\n private isLoopStep(step: AnyStep): step is LoopStep {\n return (step as LoopStep).type === 'loop';\n }\n\n private isForeachStep(step: AnyStep): step is ForeachStep {\n return (step as ForeachStep).type === 'foreach';\n }\n\n private isMapStep(step: AnyStep): step is MapStep {\n return (step as MapStep).type === 'map';\n }\n\n private isAgentStep(step: AnyStep): step is AgentStep {\n return (step as AgentStep).type === 'agent';\n }\n\n private validateStep(step: AnyStep, errors: string[]): void {\n if (this.isParallelStep(step)) {\n if (!step.branches || step.branches.length === 0) {\n errors.push(`Parallel step \"${step.id}\" must have at least one branch`);\n }\n } else if (this.isConditionalStep(step)) {\n if (!step.condition) errors.push(`Conditional step \"${step.id}\" must have a condition`);\n if (!step.ifTrue) errors.push(`Conditional step \"${step.id}\" must have an ifTrue step`);\n } else if (this.isLoopStep(step)) {\n if (!step.body) errors.push(`Loop step \"${step.id}\" must have a body`);\n if (!step.condition) errors.push(`Loop step \"${step.id}\" must have a condition`);\n } else if (this.isForeachStep(step)) {\n if (!step.iterable) errors.push(`Foreach step \"${step.id}\" must define iterable path`);\n if (!step.step) errors.push(`Foreach step \"${step.id}\" must define an item step`);\n if (step.maxConcurrency !== undefined && step.maxConcurrency < 1) {\n errors.push(`Foreach step \"${step.id}\" maxConcurrency must be >= 1`);\n }\n if (step.maxIterations !== undefined && step.maxIterations < 1) {\n errors.push(`Foreach step \"${step.id}\" maxIterations must be >= 1`);\n }\n } else if (this.isMapStep(step)) {\n if (!step.input) errors.push(`Map step \"${step.id}\" must define input path`);\n if (!step.transform) errors.push(`Map step \"${step.id}\" must define transform step`);\n if (!step.outputKey) errors.push(`Map step \"${step.id}\" must define outputKey`);\n if (step.maxConcurrency !== undefined && step.maxConcurrency < 1) {\n errors.push(`Map step \"${step.id}\" maxConcurrency must be >= 1`);\n }\n } else if (this.isAgentStep(step)) {\n if (!step.prompt) errors.push(`Agent step \"${step.id}\" must have a prompt`);\n if (!step.outputKey) errors.push(`Agent step \"${step.id}\" must have an outputKey`);\n } else {\n const ws = step as WorkflowStep;\n if (!ws.execute) errors.push(`Step \"${step.id}\" must have an execute function`);\n }\n }\n\n private getByPath(ctx: WorkflowContext, path: string): unknown {\n if (!path) return undefined;\n const normalized = path.replace(/\\[(\\d+)\\]/g, \".$1\");\n const segments = normalized.split(\".\").filter(Boolean);\n let current: unknown = ctx;\n\n for (const segment of segments) {\n if (current === null || current === undefined) return undefined;\n if (Array.isArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index)) return undefined;\n current = current[index];\n continue;\n }\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n }\n\n private applyInputMapping(step: WorkflowStep, ctx: WorkflowContext): WorkflowContext {\n const mapping = step.inputMapping;\n if (!mapping) {\n return ctx;\n }\n\n let projected: WorkflowContext = mapping.defaults\n ? { ...mapping.defaults }\n : {};\n\n if (mapping.keys) {\n for (const key of mapping.keys) {\n if (key in ctx) {\n projected[key] = ctx[key];\n }\n }\n }\n\n if (mapping.paths) {\n for (const [targetKey, path] of Object.entries(mapping.paths)) {\n projected[targetKey] = this.getByPath(ctx, path);\n }\n }\n\n if (mapping.overrides) {\n projected = {\n ...projected,\n ...mapping.overrides,\n };\n }\n\n return projected;\n }\n\n private applyOutputMappings(step: WorkflowStep, result: WorkflowContext): WorkflowContext {\n if (!step.outputMapping || step.outputMapping.length === 0) {\n return result;\n }\n\n const mapped: WorkflowContext = { ...result };\n\n for (const mapping of step.outputMapping) {\n let value = this.getByPath(result, mapping.source);\n if (mapping.transform) {\n value = mapping.transform(value, result);\n }\n if (value === undefined) {\n value = mapping.defaultValue;\n }\n mapped[mapping.targetKey] = value;\n }\n\n return mapped;\n }\n\n private extractStepOutput(result: WorkflowContext, stepId: string): unknown {\n if (stepId in result) {\n return result[stepId];\n }\n return result;\n }\n\n private aggregateOutputs(\n outputs: unknown[],\n mode: \"array\" | \"concat\" | \"merge\",\n ): unknown {\n if (mode === \"concat\") {\n return outputs.flatMap((output) =>\n Array.isArray(output) ? output : [output],\n );\n }\n\n if (mode === \"merge\") {\n const merged: Record<string, unknown> = {};\n for (const output of outputs) {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n Object.assign(merged, output as Record<string, unknown>);\n }\n }\n return merged;\n }\n\n return outputs;\n }\n\n private async executeItemsWithConcurrency<T, TResult>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<TResult>,\n ): Promise<TResult[]> {\n const safeConcurrency = Math.max(1, Math.floor(concurrency));\n if (safeConcurrency === 1 || items.length <= 1) {\n const sequential: TResult[] = [];\n for (let i = 0; i < items.length; i++) {\n sequential.push(await worker(items[i]!, i));\n }\n return sequential;\n }\n\n const results = new Array<TResult>(items.length);\n let nextIndex = 0;\n const workers = Array.from(\n { length: Math.min(safeConcurrency, items.length) },\n async () => {\n while (true) {\n const current = nextIndex;\n nextIndex++;\n if (current >= items.length) return;\n results[current] = await worker(items[current]!, current);\n }\n },\n );\n\n await Promise.all(workers);\n return results;\n }\n}\n","// =============================================================================\n// WorkflowPlugin — Multi-step workflow execution with retry and rollback\n// =============================================================================\n\nimport type {\n PluginHooks,\n PluginContext,\n BeforeRunParams,\n BeforeRunResult,\n} from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport type {\n WorkflowStep,\n WorkflowContext,\n WorkflowResult,\n WorkflowDefinition,\n RetryConfig,\n} from \"../domain/workflow.schema.js\";\nimport type { WorkflowPort } from \"../ports/workflow.port.js\";\nimport { DefaultWorkflowEngine } from \"../adapters/workflow/default-workflow.engine.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_RETRY: RetryConfig = {\n maxAttempts: 3,\n backoffMs: 1000,\n backoffMultiplier: 2,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface WorkflowPluginConfig {\n steps: WorkflowStep[];\n initialContext?: WorkflowContext;\n}\n\nexport type WorkflowPluginInput = WorkflowPluginConfig | WorkflowDefinition;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class WorkflowError extends Error {\n readonly result: WorkflowResult;\n\n constructor(message: string, result: WorkflowResult) {\n super(message);\n this.name = \"WorkflowError\";\n this.result = result;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isWorkflowDefinition(input: WorkflowPluginInput): input is WorkflowDefinition {\n return 'id' in input && 'name' in input;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class WorkflowPlugin extends BasePlugin {\n readonly name = \"workflow\";\n\n private readonly steps: WorkflowStep[];\n private readonly initialContext: WorkflowContext;\n private readonly definition?: WorkflowDefinition;\n private readonly engine?: WorkflowPort;\n private lastResult: WorkflowResult | undefined;\n\n constructor(config: WorkflowPluginInput, engine?: WorkflowPort) {\n super();\n if (isWorkflowDefinition(config)) {\n this.definition = config;\n this.steps = config.steps as WorkflowStep[];\n this.initialContext = config.initialContext ?? {};\n this.engine = engine ?? new DefaultWorkflowEngine();\n } else {\n this.steps = config.steps;\n this.initialContext = config.initialContext ?? {};\n }\n }\n\n protected buildHooks(): PluginHooks {\n return {\n beforeRun: this.beforeRun.bind(this),\n };\n }\n\n getLastResult(): WorkflowResult | undefined {\n return this.lastResult;\n }\n\n // ── Hook implementation ─────────────────────────────────────────────────\n\n private async beforeRun(\n _ctx: PluginContext,\n params: BeforeRunParams,\n ): Promise<BeforeRunResult> {\n const result = this.definition && this.engine\n ? await this.engine.execute(this.definition)\n : await this.executeWorkflow();\n this.lastResult = result;\n\n if (result.status === \"failed\") {\n throw new WorkflowError(\n `Workflow failed at step \"${result.failedStep}\": ${result.error}`,\n result,\n );\n }\n\n const contextSummary = Object.entries(result.context)\n .map(([k, v]) => `${k}: ${JSON.stringify(v)}`)\n .join(\"\\n\");\n\n return {\n prompt: `${params.prompt}\\n\\n--- Workflow Context ---\\n${contextSummary}`,\n };\n }\n\n // ── Built-in workflow engine (backward compatible) ──────────────────────\n\n private async executeWorkflow(): Promise<WorkflowResult> {\n const start = Date.now();\n let context = structuredClone(this.initialContext);\n const completedSteps: string[] = [];\n const skippedSteps: string[] = [];\n\n for (const step of this.steps) {\n if (step.condition && !step.condition(context)) {\n skippedSteps.push(step.id);\n continue;\n }\n\n try {\n context = await this.executeWithRetry(step, context);\n completedSteps.push(step.id);\n } catch (error) {\n await this.rollback(completedSteps, context);\n\n return {\n status: \"failed\",\n context,\n completedSteps,\n skippedSteps,\n failedStep: step.id,\n error: error instanceof Error ? error.message : String(error),\n totalDurationMs: Date.now() - start,\n };\n }\n }\n\n return {\n status: \"completed\",\n context,\n completedSteps,\n skippedSteps,\n totalDurationMs: Date.now() - start,\n };\n }\n\n private async executeWithRetry(\n step: WorkflowStep,\n context: WorkflowContext,\n ): Promise<WorkflowContext> {\n const retry = { ...DEFAULT_RETRY, ...step.retry };\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= retry.maxAttempts; attempt++) {\n try {\n return await step.execute(context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt < retry.maxAttempts) {\n const delay =\n retry.backoffMs * Math.pow(retry.backoffMultiplier, attempt - 1);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n throw lastError;\n }\n\n private async rollback(\n completedStepIds: string[],\n context: WorkflowContext,\n ): Promise<void> {\n for (const stepId of [...completedStepIds].reverse()) {\n const step = this.steps.find((s) => s.id === stepId);\n if (step?.rollback) {\n try {\n await step.rollback(context);\n } catch {\n // Rollback errors are swallowed to ensure all rollbacks are attempted\n }\n }\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createWorkflowPlugin(\n config: WorkflowPluginInput,\n engine?: WorkflowPort,\n): WorkflowPlugin {\n return new WorkflowPlugin(config, engine);\n}\n","import type { AgentMetrics } from \"../observability.plugin.js\";\n\n/** Create a fresh empty AgentMetrics object. */\nexport function createDefaultMetrics(): AgentMetrics {\n return {\n totalTokens: { input: 0, output: 0 },\n totalLatencyMs: 0,\n toolCalls: [],\n llmCalls: [],\n };\n}\n","// =============================================================================\n// ObservabilityPlugin — Tracing, metrics, and cost estimation for Gauss\n// =============================================================================\n\nimport { BasePlugin } from \"./base.plugin.js\";\nimport { createDefaultMetrics } from \"./utils/default-metrics.js\";\nimport type { \n PluginContext, \n PluginHooks, \n BeforeRunParams, \n BeforeRunResult,\n AfterRunParams,\n BeforeToolParams,\n BeforeToolResult,\n AfterToolParams,\n OnErrorParams,\n OnErrorResult\n} from \"../ports/plugin.port.js\";\n\nexport interface ObservabilityConfig {\n enableTracing?: boolean;\n enableMetrics?: boolean;\n enableCostEstimation?: boolean;\n costPerInputToken?: number;\n costPerOutputToken?: number;\n maxSpans?: number; // Max spans to retain (oldest evicted). Default: 10000\n}\n\nexport interface Span {\n id: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n attributes: Record<string, unknown>;\n parentId?: string;\n status: 'ok' | 'error';\n children: Span[];\n}\n\nexport interface AgentMetrics {\n totalTokens: { input: number; output: number };\n totalLatencyMs: number;\n toolCalls: { name: string; latencyMs: number; success: boolean }[];\n llmCalls: { latencyMs: number; inputTokens: number; outputTokens: number }[];\n estimatedCostUsd?: number;\n}\n\nexport class ObservabilityPlugin extends BasePlugin {\n readonly name = \"observability\";\n readonly version = \"1.0.0\";\n\n private config: ObservabilityConfig;\n private spans: Map<string, Span> = new Map();\n private rootSpans: Span[] = [];\n private activeSpans: Map<string, Span> = new Map(); // sessionId → current root span\n private sessionMetrics: Map<string, AgentMetrics> = new Map(); // sessionId → metrics\n private sessionStartTimes: Map<string, number> = new Map(); // sessionId → run start time\n private toolStartTimes = new Map<string, number[]>(); // sessionId:toolName → start time stack (LIFO)\n private readonly toolSpanStack = new Map<string, string[]>(); // sessionId:toolName → spanId stack (LIFO)\n private readonly maxSpans: number;\n\n constructor(config: ObservabilityConfig = {}) {\n super();\n this.config = {\n enableTracing: true,\n enableMetrics: true,\n enableCostEstimation: false,\n ...config\n };\n this.maxSpans = config.maxSpans ?? 10000;\n }\n\n protected buildHooks(): PluginHooks {\n return {\n beforeRun: this.onRequest.bind(this),\n afterRun: this.onResponse.bind(this),\n beforeTool: this.onToolStart.bind(this),\n afterTool: this.onToolEnd.bind(this),\n onError: this.onError.bind(this)\n };\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n }\n\n private createSpan(name: string, traceId: string, parentId?: string): Span {\n // Evict oldest spans if at capacity\n if (this.spans.size >= this.maxSpans) {\n const oldestKey = this.spans.keys().next().value;\n if (oldestKey) {\n const oldSpan = this.spans.get(oldestKey);\n this.spans.delete(oldestKey);\n // Remove from rootSpans if it was a root\n if (oldSpan && !oldSpan.parentId) {\n const idx = this.rootSpans.indexOf(oldSpan);\n if (idx >= 0) this.rootSpans.splice(idx, 1);\n }\n }\n }\n\n const span: Span = {\n id: this.generateId(),\n traceId,\n name,\n startTime: Date.now(),\n attributes: {},\n parentId,\n status: 'ok',\n children: []\n };\n\n this.spans.set(span.id, span);\n\n if (parentId) {\n const parent = this.spans.get(parentId);\n if (parent) {\n parent.children.push(span);\n }\n } else {\n this.rootSpans.push(span);\n }\n\n return span;\n }\n\n private endSpan(spanId: string, status: 'ok' | 'error' = 'ok'): void {\n const span = this.spans.get(spanId);\n if (span) {\n span.endTime = Date.now();\n span.status = status;\n }\n }\n\n private getOrCreateMetrics(sessionId: string): AgentMetrics {\n let metrics = this.sessionMetrics.get(sessionId);\n if (!metrics) {\n metrics = createDefaultMetrics();\n this.sessionMetrics.set(sessionId, metrics);\n }\n return metrics;\n }\n\n private async onRequest(ctx: PluginContext, params: BeforeRunParams): Promise<BeforeRunResult | void> {\n if (!this.config.enableTracing && !this.config.enableMetrics) {\n return;\n }\n\n const sessionId = ctx.sessionId;\n\n if (this.config.enableTracing) {\n const traceId = this.generateId();\n const span = this.createSpan('agent.run', traceId);\n span.attributes = {\n sessionId,\n agentName: ctx.agentName,\n prompt: params.prompt,\n maxSteps: ctx.config.maxSteps\n };\n this.activeSpans.set(sessionId, span);\n }\n\n if (this.config.enableMetrics) {\n this.sessionStartTimes.set(sessionId, Date.now());\n this.sessionMetrics.set(sessionId, createDefaultMetrics());\n }\n }\n\n private async onResponse(ctx: PluginContext, params: AfterRunParams): Promise<void> {\n if (!this.config.enableTracing && !this.config.enableMetrics) {\n return;\n }\n\n const sessionId = ctx.sessionId;\n const rootSpan = this.activeSpans.get(sessionId);\n\n if (this.config.enableTracing && rootSpan) {\n this.endSpan(rootSpan.id);\n rootSpan.attributes.result = params.result.text;\n rootSpan.attributes.steps = params.result.steps?.length || 0;\n }\n\n if (this.config.enableMetrics) {\n const metrics = this.getOrCreateMetrics(sessionId);\n const startTime = this.sessionStartTimes.get(sessionId);\n if (startTime) {\n metrics.totalLatencyMs = Date.now() - startTime;\n }\n \n if (this.config.enableCostEstimation && this.config.costPerInputToken && this.config.costPerOutputToken) {\n metrics.estimatedCostUsd = \n (metrics.totalTokens.input * this.config.costPerInputToken) +\n (metrics.totalTokens.output * this.config.costPerOutputToken);\n }\n\n this.sessionStartTimes.delete(sessionId);\n }\n\n this.activeSpans.delete(sessionId);\n }\n\n private async onToolStart(ctx: PluginContext, params: BeforeToolParams): Promise<BeforeToolResult | void> {\n if (!this.config.enableTracing && !this.config.enableMetrics) {\n return;\n }\n\n if (this.config.enableMetrics) {\n const metricsKey = `${ctx.sessionId}:${params.toolName}`;\n const stack = this.toolStartTimes.get(metricsKey) ?? [];\n stack.push(Date.now());\n this.toolStartTimes.set(metricsKey, stack);\n }\n\n if (this.config.enableTracing) {\n const rootSpan = this.activeSpans.get(ctx.sessionId);\n const traceId = rootSpan?.traceId ?? this.generateId();\n const toolSpan = this.createSpan(`tool.${params.toolName}`, traceId, rootSpan?.id);\n toolSpan.attributes = {\n toolName: params.toolName,\n args: params.args\n };\n const stackKey = `${ctx.sessionId}:${params.toolName}`;\n const stack = this.toolSpanStack.get(stackKey) ?? [];\n stack.push(toolSpan.id);\n this.toolSpanStack.set(stackKey, stack);\n }\n }\n\n private async onToolEnd(ctx: PluginContext, params: AfterToolParams): Promise<void> {\n if (!this.config.enableTracing && !this.config.enableMetrics) {\n return;\n }\n\n if (this.config.enableTracing) {\n const spanKey = `${ctx.sessionId}:${params.toolName}`;\n const stack = this.toolSpanStack.get(spanKey);\n const spanId = stack?.pop();\n if (spanId) {\n const toolSpan = this.spans.get(spanId);\n if (toolSpan) {\n this.endSpan(toolSpan.id);\n toolSpan.attributes.result = params.result;\n }\n if (stack && stack.length === 0) {\n this.toolSpanStack.delete(spanKey);\n }\n }\n }\n\n if (this.config.enableMetrics) {\n const key = `${ctx.sessionId}:${params.toolName}`;\n const stack = this.toolStartTimes.get(key);\n const startTime = stack?.pop();\n const latencyMs = startTime ? Date.now() - startTime : 0;\n if (stack && stack.length === 0) {\n this.toolStartTimes.delete(key);\n }\n\n const metrics = this.getOrCreateMetrics(ctx.sessionId);\n metrics.toolCalls.push({\n name: params.toolName,\n latencyMs,\n success: true\n });\n }\n }\n\n private async onError(ctx: PluginContext, params: OnErrorParams): Promise<OnErrorResult | void> {\n if (!this.config.enableTracing) {\n return;\n }\n\n const rootSpan = this.activeSpans.get(ctx.sessionId);\n const unfinishedSpans = Array.from(this.spans.values())\n .filter(s => !s.endTime && s.traceId === rootSpan?.traceId)\n .sort((a, b) => b.startTime - a.startTime);\n\n if (unfinishedSpans.length > 0) {\n const span = unfinishedSpans[0];\n this.endSpan(span.id, 'error');\n span.attributes.error = {\n message: params.error instanceof Error ? params.error.message : String(params.error),\n phase: params.phase\n };\n }\n }\n\n // Public methods\n public getTraces(): Span[] {\n return this.config.enableTracing ? [...this.rootSpans] : [];\n }\n\n public getMetrics(sessionId?: string): AgentMetrics {\n if (!this.config.enableMetrics) {\n return createDefaultMetrics();\n }\n if (sessionId) {\n const m = this.sessionMetrics.get(sessionId);\n return m ? this.deepCopyMetrics(m) : createDefaultMetrics();\n }\n // Return last session's metrics for backward compat\n const entries = Array.from(this.sessionMetrics.values());\n const last = entries[entries.length - 1];\n return last ? this.deepCopyMetrics(last) : createDefaultMetrics();\n }\n\n private deepCopyMetrics(m: AgentMetrics): AgentMetrics {\n return {\n totalTokens: { ...m.totalTokens },\n totalLatencyMs: m.totalLatencyMs,\n toolCalls: m.toolCalls.map(t => ({ ...t })),\n llmCalls: m.llmCalls.map(l => ({ ...l })),\n estimatedCostUsd: m.estimatedCostUsd\n };\n }\n\n public exportOpenTelemetry(): object {\n if (!this.config.enableTracing) {\n return { resourceSpans: [] };\n }\n\n const spans = Array.from(this.spans.values()).map(span => ({\n traceId: span.traceId,\n spanId: span.id,\n parentSpanId: span.parentId,\n name: span.name,\n startTimeUnixNano: span.startTime * 1_000_000,\n endTimeUnixNano: span.endTime ? span.endTime * 1_000_000 : undefined,\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: { stringValue: String(value) }\n })),\n status: {\n code: span.status === 'ok' ? 1 : 2\n }\n }));\n\n return {\n resourceSpans: [{\n resource: {\n attributes: [\n { key: 'service.name', value: { stringValue: 'deepagent' } },\n { key: 'service.version', value: { stringValue: this.version } }\n ]\n },\n scopeSpans: [{\n scope: {\n name: 'deepagent-observability',\n version: this.version\n },\n spans\n }]\n }]\n };\n }\n\n public reset(): void {\n this.spans.clear();\n this.rootSpans = [];\n this.activeSpans.clear();\n this.sessionMetrics.clear();\n this.sessionStartTimes.clear();\n this.toolStartTimes.clear();\n this.toolSpanStack.clear();\n }\n}\n\n/** @deprecated Use `ObservabilityConfig` instead */\nexport type ObservabilityPluginConfig = ObservabilityConfig;\n\n/** @deprecated Use `new ObservabilityPlugin(config)` instead */\nexport function createObservabilityPlugin(config?: ObservabilityConfig): ObservabilityPlugin {\n return new ObservabilityPlugin(config);\n}\n","// =============================================================================\n// SemanticScrapingPlugin — Semantic scraping & MCP manifest tools\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type { PluginHooks } from \"../ports/plugin.port.js\";\nimport { BasePlugin } from \"./base.plugin.js\";\nimport { SemanticScrapingAdapter } from \"../adapters/semantic-scraping/index.js\";\nimport type { ISemanticScrapingPort, SemanticTool } from \"../ports/semantic-scraping.port.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SemanticScrapingPluginOptions {\n /** Custom adapter — if not provided, an in-memory adapter is created. */\n adapter?: ISemanticScrapingPort;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Zod Schemas\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SemanticToolSchema = z.object({\n name: z.string(),\n description: z.string(),\n inputSchema: z.union([z.string(), z.record(z.string(), z.unknown())]),\n confidence: z.number().optional(),\n category: z.string().optional(),\n annotations: z.record(z.string(), z.boolean()).optional(),\n});\n\nconst ScanPageInputSchema = z.object({\n url: z.string().url().describe(\"The page URL that was scanned\"),\n tools: z\n .array(SemanticToolSchema)\n .describe(\"Semantic tools extracted from the page HTML\"),\n});\n\nconst GetManifestInputSchema = z.object({\n origin: z.string().describe(\"Site origin (e.g., https://example.com)\"),\n});\n\nconst GetToolsForUrlInputSchema = z.object({\n origin: z.string().describe(\"Site origin (e.g., https://example.com)\"),\n url: z.string().url().describe(\"The URL to get tools for\"),\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class SemanticScrapingPlugin extends BasePlugin {\n readonly name = \"semantic-scraping\";\n\n private readonly adapter: ISemanticScrapingPort;\n\n constructor(options: SemanticScrapingPluginOptions = {}) {\n super();\n this.adapter = options.adapter ?? new SemanticScrapingAdapter();\n }\n\n protected buildHooks(): PluginHooks {\n return {};\n }\n\n get tools(): Record<string, Tool<any, any>> {\n const adapter = this.adapter;\n\n return {\n semantic_scan_page: tool({\n description:\n \"Register semantic tools extracted from a web page into the site manifest\",\n inputSchema: ScanPageInputSchema,\n execute: async (args) => {\n const { url, tools: rawTools } = args;\n const origin = new URL(url).origin;\n const semanticTools: SemanticTool[] = rawTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n confidence: t.confidence,\n category: t.category,\n annotations: t.annotations,\n }));\n const manifest = adapter.updatePage(origin, url, semanticTools);\n return {\n origin,\n version: manifest.version,\n toolCount: manifest.tools.length,\n pageCount: Object.keys(manifest.pages).length,\n };\n },\n }),\n\n get_site_manifest: tool({\n description:\n \"Get the MCP-compatible JSON manifest for a site\",\n inputSchema: GetManifestInputSchema,\n execute: async (args) => {\n const { origin } = args;\n return adapter.toMCPJson(origin);\n },\n }),\n\n get_tools_for_url: tool({\n description:\n \"Get the semantic tools available at a specific URL\",\n inputSchema: GetToolsForUrlInputSchema,\n execute: async (args) => {\n const { origin, url } = args;\n return adapter.getToolsForUrl(origin, url);\n },\n }),\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function createSemanticScrapingPlugin(\n options: SemanticScrapingPluginOptions = {},\n): SemanticScrapingPlugin {\n return new SemanticScrapingPlugin(options);\n}\n","// =============================================================================\n// SemanticScrapingAdapter — In-memory ISemanticScrapingPort implementation\n//\n// Maintains per-site MCP tool manifests with:\n// - URL pattern normalization (query values → wildcards)\n// - Cross-page tool deduplication\n// - Incremental diff-based updates\n// - MCP-compatible JSON export\n// =============================================================================\n\nimport type {\n ISemanticScrapingPort,\n SiteToolManifest,\n PageToolSet,\n ManifestTool,\n SemanticTool,\n} from \"../../ports/semantic-scraping.port.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Convert a concrete URL to a pattern for grouping (strips query values). */\nexport function urlToPattern(url: string): string {\n try {\n const u = new URL(url);\n const path = u.pathname.replace(/\\/+$/, \"\") || \"/\";\n if (!u.search) return path;\n const params = new URLSearchParams(u.search);\n const wildcarded = [...params.keys()].sort().map((k) => `${k}=*`);\n return `${path}?${wildcarded.join(\"&\")}`;\n } catch {\n return url;\n }\n}\n\n/** Deterministic hash for a set of tools (DJB2-like). */\nexport function hashTools(\n tools: readonly Pick<SemanticTool, \"name\" | \"description\" | \"inputSchema\">[],\n): string {\n const keys = tools\n .map(\n (t) =>\n `${t.name}:${t.description ?? \"\"}:${JSON.stringify(t.inputSchema ?? {})}`,\n )\n .sort();\n let h = 0;\n const s = keys.join(\"|\");\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n }\n return h.toString(36);\n}\n\n/** Parse a potentially stringified inputSchema into an object. */\nfunction parseSchema(\n schema: string | Record<string, unknown> | object,\n): Record<string, unknown> {\n if (typeof schema === \"string\") {\n try {\n return JSON.parse(schema) as Record<string, unknown>;\n } catch {\n return { type: \"object\", properties: {} };\n }\n }\n return schema as Record<string, unknown>;\n}\n\n/** Convert a SemanticTool to a ManifestTool with a single page pattern. */\nfunction toManifestTool(tool: SemanticTool, pattern: string): ManifestTool {\n const schema = parseSchema(tool.inputSchema);\n const annotations: Record<string, boolean> | undefined = tool.annotations\n ? { ...tool.annotations }\n : undefined;\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: schema,\n category: tool.category,\n annotations,\n pagePatterns: [pattern],\n };\n}\n\n/** Rebuild the deduplicated tools array from all page tool sets. */\nfunction rebuildTools(\n pages: Record<string, PageToolSet>,\n toolsByName: Map<string, { tool: ManifestTool; patterns: Set<string> }>,\n): readonly ManifestTool[] {\n const consolidated = new Map<\n string,\n { tool: ManifestTool; patterns: Set<string> }\n >();\n\n for (const [, entry] of toolsByName) {\n const existing = consolidated.get(entry.tool.name);\n if (existing) {\n for (const p of entry.patterns) existing.patterns.add(p);\n } else {\n consolidated.set(entry.tool.name, {\n tool: entry.tool,\n patterns: new Set(entry.patterns),\n });\n }\n }\n\n // Drop tools that no longer appear on any page\n const activeToolNames = new Set<string>();\n for (const page of Object.values(pages)) {\n for (const name of page.tools) activeToolNames.add(name);\n }\n\n const result: ManifestTool[] = [];\n for (const [name, entry] of consolidated) {\n if (!activeToolNames.has(name)) continue;\n result.push({\n ...entry.tool,\n pagePatterns: [...entry.patterns].sort(),\n });\n }\n\n return result.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class SemanticScrapingAdapter implements ISemanticScrapingPort {\n private readonly manifests = new Map<\n string,\n {\n manifest: SiteToolManifest;\n toolIndex: Map<string, { tool: ManifestTool; patterns: Set<string> }>;\n }\n >();\n\n getManifest(origin: string): SiteToolManifest | null {\n return this.manifests.get(origin)?.manifest ?? null;\n }\n\n updatePage(\n origin: string,\n url: string,\n tools: SemanticTool[],\n ): SiteToolManifest {\n const pattern = urlToPattern(url);\n const hash = hashTools(\n tools.map((t) => ({\n ...t,\n inputSchema: parseSchema(t.inputSchema),\n })),\n );\n const now = Date.now();\n\n const existing = this.manifests.get(origin);\n const toolIndex = existing?.toolIndex ?? new Map();\n const oldPages = existing?.manifest.pages ?? {};\n\n // Remove old tool entries for this pattern from the index\n const oldPage = oldPages[pattern];\n if (oldPage) {\n for (const toolName of oldPage.tools) {\n const entry = toolIndex.get(toolName);\n if (entry) {\n entry.patterns.delete(pattern);\n if (entry.patterns.size === 0) toolIndex.delete(toolName);\n }\n }\n }\n\n // Add new tools to the index\n const toolNames: string[] = [];\n for (const tool of tools) {\n toolNames.push(tool.name);\n const entry = toolIndex.get(tool.name);\n if (entry) {\n entry.patterns.add(pattern);\n entry.tool = toManifestTool(tool, pattern);\n } else {\n toolIndex.set(tool.name, {\n tool: toManifestTool(tool, pattern),\n patterns: new Set([pattern]),\n });\n }\n }\n\n const pageToolSet: PageToolSet = {\n urlPattern: pattern,\n tools: toolNames,\n lastScanned: now,\n hash,\n };\n\n const pages: Record<string, PageToolSet> = {\n ...oldPages,\n [pattern]: pageToolSet,\n };\n const deduped = rebuildTools(pages, toolIndex);\n\n const manifest: SiteToolManifest = {\n origin,\n version: (existing?.manifest.version ?? 0) + 1,\n generatedAt: now,\n pages,\n tools: deduped,\n };\n\n this.manifests.set(origin, { manifest, toolIndex });\n return manifest;\n }\n\n applyDiff(\n origin: string,\n url: string,\n added: SemanticTool[],\n removed: string[],\n ): SiteToolManifest {\n const pattern = urlToPattern(url);\n const now = Date.now();\n\n const existing = this.manifests.get(origin);\n const toolIndex = existing?.toolIndex ?? new Map();\n const oldPages = existing?.manifest.pages ?? {};\n const oldPage = oldPages[pattern];\n const currentTools = new Set(oldPage?.tools ?? []);\n\n // Remove tools\n for (const name of removed) {\n currentTools.delete(name);\n const entry = toolIndex.get(name);\n if (entry) {\n entry.patterns.delete(pattern);\n if (entry.patterns.size === 0) toolIndex.delete(name);\n }\n }\n\n // Add tools\n for (const tool of added) {\n currentTools.add(tool.name);\n const entry = toolIndex.get(tool.name);\n if (entry) {\n entry.patterns.add(pattern);\n entry.tool = toManifestTool(tool, pattern);\n } else {\n toolIndex.set(tool.name, {\n tool: toManifestTool(tool, pattern),\n patterns: new Set([pattern]),\n });\n }\n }\n\n const toolNames = [...currentTools];\n const hash = hashTools(\n toolNames\n .map((n) => toolIndex.get(n)?.tool)\n .filter(Boolean)\n .map((t) => ({\n name: t!.name,\n description: t!.description,\n inputSchema: t!.inputSchema,\n })),\n );\n\n const pageToolSet: PageToolSet = {\n urlPattern: pattern,\n tools: toolNames,\n lastScanned: now,\n hash,\n };\n\n const pages: Record<string, PageToolSet> = {\n ...oldPages,\n [pattern]: pageToolSet,\n };\n const deduped = rebuildTools(pages, toolIndex);\n\n const manifest: SiteToolManifest = {\n origin,\n version: (existing?.manifest.version ?? 0) + 1,\n generatedAt: now,\n pages,\n tools: deduped,\n };\n\n this.manifests.set(origin, { manifest, toolIndex });\n return manifest;\n }\n\n toMCPJson(origin: string): string {\n const manifest = this.getManifest(origin);\n if (!manifest) return JSON.stringify({ tools: [] });\n\n const mcpTools = manifest.tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations ? { annotations: t.annotations } : {}),\n }));\n\n return JSON.stringify({\n tools: mcpTools,\n _meta: {\n origin: manifest.origin,\n version: manifest.version,\n generatedAt: manifest.generatedAt,\n pageCount: Object.keys(manifest.pages).length,\n toolCount: manifest.tools.length,\n },\n });\n }\n\n getToolsForUrl(origin: string, url: string): ManifestTool[] {\n const manifest = this.getManifest(origin);\n if (!manifest) return [];\n\n const pattern = urlToPattern(url);\n const page = manifest.pages[pattern];\n if (!page) return [];\n\n const toolNames = new Set(page.tools);\n return manifest.tools.filter((t) => toolNames.has(t.name));\n }\n}\n","import { tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport { BasePlugin } from \"./base.plugin.js\";\nimport { DefaultReRankingAdapter } from \"../adapters/reranking/default-reranking.adapter.js\";\nimport { CircuitBreaker } from \"../adapters/resilience/circuit-breaker.js\";\nimport { ToolCache } from \"../adapters/resilience/tool-cache.js\";\nimport type {\n CostTokenUsage,\n CostTrackerPort,\n} from \"../ports/cost-tracker.port.js\";\nimport type {\n ReRankingOptions,\n ReRankingPort,\n ScoredResult,\n} from \"../ports/reranking.port.js\";\nimport type { TelemetryPort } from \"../ports/telemetry.port.js\";\n\nconst strategySchema = z.enum([\"tfidf\", \"bm25\", \"mmr\"]);\n\ntype ReRankingStrategy = NonNullable<ReRankingOptions[\"strategy\"]>;\n\ninterface CrawledSearchResult {\n title?: string;\n url?: string;\n link?: string;\n snippet?: string;\n description?: string;\n content?: string;\n text?: string;\n}\n\ninterface NormalizedCandidate {\n id: string;\n title: string;\n url: string;\n snippet: string;\n content: string;\n}\n\ninterface SemanticWebSearchQuality {\n traceId: string;\n cacheServed: boolean;\n durationMs: number;\n strategyRequested: ReRankingStrategy;\n strategyUsed: ReRankingStrategy;\n fallbackUsed: boolean;\n candidates: number;\n reranked: number;\n averageScore: number;\n searchAttempts: number;\n scrapeAttempts: number;\n scrapeFailures: number;\n}\n\ninterface SemanticWebSearchResponse {\n query: string;\n results: Array<{\n rank: number;\n score: number;\n title: string;\n url: string;\n snippet: string;\n citation: string;\n }>;\n citations: string[];\n quality: SemanticWebSearchQuality;\n cost?: {\n model: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n totalCost: number;\n currency: \"USD\";\n };\n cacheHit: boolean;\n}\n\nexport interface SemanticWebSearchPluginOptions {\n apiKey?: string;\n crawler?: {\n search: (query: string, options?: { limit?: number }) => Promise<unknown>;\n crawl?: (url: string) => Promise<unknown>;\n close?: () => Promise<void>;\n };\n reranker?: ReRankingPort;\n telemetry?: TelemetryPort;\n costTracker?: CostTrackerPort;\n costModel?: string;\n emitTelemetry?: boolean;\n cache?: ToolCache;\n circuitBreaker?: CircuitBreaker;\n defaultLimit?: number;\n defaultScrapeTopK?: number;\n defaultStrategy?: ReRankingStrategy;\n fallbackStrategy?: ReRankingStrategy;\n fallbackOnRerankError?: boolean;\n requestTimeoutMs?: number;\n maxRetries?: number;\n retryDelayMs?: number;\n cacheTtlMs?: number;\n}\n\nexport class SemanticWebSearchPlugin extends BasePlugin {\n readonly name = \"Semantic Web Search\";\n readonly description =\n \"Native search→rerank→citation pipeline for high-quality web evidence.\";\n\n private crawlerPromise: Promise<\n NonNullable<SemanticWebSearchPluginOptions[\"crawler\"]>\n > | null = null;\n private readonly reranker: ReRankingPort;\n private readonly telemetry?: TelemetryPort;\n private readonly costTracker?: CostTrackerPort;\n private readonly costModel: string;\n private readonly emitTelemetry: boolean;\n private readonly cache: ToolCache;\n private readonly circuitBreaker: CircuitBreaker;\n\n private readonly defaultLimit: number;\n private readonly defaultScrapeTopK: number;\n private readonly defaultStrategy: ReRankingStrategy;\n private readonly fallbackStrategy: ReRankingStrategy;\n private readonly fallbackOnRerankError: boolean;\n private readonly requestTimeoutMs: number;\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly cacheTtlMs: number;\n\n constructor(private readonly options: SemanticWebSearchPluginOptions = {}) {\n super();\n this.reranker = options.reranker ?? new DefaultReRankingAdapter();\n this.telemetry = options.telemetry;\n this.costTracker = options.costTracker;\n this.costModel = options.costModel ?? \"gpt-5.2-mini\";\n this.emitTelemetry = options.emitTelemetry ?? true;\n this.cache = options.cache ?? new ToolCache();\n this.circuitBreaker = options.circuitBreaker ?? new CircuitBreaker();\n this.defaultLimit = options.defaultLimit ?? 5;\n this.defaultScrapeTopK = options.defaultScrapeTopK ?? 2;\n this.defaultStrategy = options.defaultStrategy ?? \"bm25\";\n this.fallbackStrategy = options.fallbackStrategy ?? \"tfidf\";\n this.fallbackOnRerankError = options.fallbackOnRerankError ?? true;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 10_000;\n this.maxRetries = options.maxRetries ?? 2;\n this.retryDelayMs = options.retryDelayMs ?? 200;\n this.cacheTtlMs = options.cacheTtlMs ?? 60_000;\n }\n\n protected buildHooks() {\n return {};\n }\n\n get tools() {\n return {\n semantic_web_search: tool({\n description:\n \"Search the web, rerank semantically and return ranked citations.\",\n inputSchema: z.object({\n query: z.string().min(1),\n limit: z.number().int().min(1).max(20).optional(),\n scrapeTopK: z.number().int().min(0).max(10).optional(),\n strategy: strategySchema.optional(),\n }),\n execute: async (input: {\n query: string;\n limit?: number;\n scrapeTopK?: number;\n strategy?: ReRankingStrategy;\n }) => {\n const limit = input.limit ?? this.defaultLimit;\n const scrapeTopK = input.scrapeTopK ?? this.defaultScrapeTopK;\n const strategy = input.strategy ?? this.defaultStrategy;\n const startedAt = Date.now();\n const traceId = crypto.randomUUID();\n\n this.emitEvent(\"semantic_search_started\", {\n traceId,\n query: input.query,\n limit,\n scrapeTopK,\n strategy,\n });\n\n const cacheKey = `semantic-web:${input.query}:${limit}:${scrapeTopK}:${strategy}`;\n const cached = this.cache.get(cacheKey) as SemanticWebSearchResponse | undefined;\n if (cached) {\n const cacheResponse: SemanticWebSearchResponse = {\n ...cached,\n quality: {\n ...cached.quality,\n traceId,\n cacheServed: true,\n },\n cacheHit: true,\n };\n\n this.emitEvent(\"semantic_search_cache_hit\", {\n traceId,\n query: input.query,\n resultCount: cacheResponse.results.length,\n });\n this.emitMetric(\"semantic_search_cache_hit\", 1, {\n strategy,\n });\n\n return {\n ...cacheResponse,\n };\n }\n\n try {\n const crawler = await this.getCrawler();\n const {\n value: rawSearch,\n attempts: searchAttempts,\n } = await this.executeWithRetry(\"search\", async () =>\n crawler.search(input.query, { limit }),\n );\n\n const normalized = this.normalizeResults(rawSearch, limit);\n const { failures: scrapeFailures, attempts: scrapeAttempts } =\n await this.enrichTopResults(normalized, scrapeTopK, crawler);\n\n const byId = new Map(normalized.map((candidate) => [candidate.id, candidate]));\n const toRank: ScoredResult[] = normalized.map((candidate) => ({\n id: candidate.id,\n text: candidate.content,\n score: 1,\n }));\n\n let reranked: ScoredResult[];\n let strategyUsed: ReRankingStrategy = strategy;\n let fallbackUsed = false;\n\n try {\n reranked = this.reranker.rerank(input.query, toRank, {\n strategy,\n });\n } catch (error) {\n if (!this.fallbackOnRerankError || strategy === this.fallbackStrategy) {\n throw error;\n }\n\n reranked = this.reranker.rerank(input.query, toRank, {\n strategy: this.fallbackStrategy,\n });\n strategyUsed = this.fallbackStrategy;\n fallbackUsed = true;\n }\n\n const results = reranked.slice(0, limit).map((result, index) => {\n const source = byId.get(result.id);\n const title = source?.title ?? result.id;\n const url = source?.url ?? \"\";\n const snippet = source?.snippet ?? result.text.slice(0, 300);\n const citation = `[${index + 1}] ${title} — ${url}`;\n\n return {\n rank: index + 1,\n score: result.score,\n title,\n url,\n snippet,\n citation,\n };\n });\n\n const durationMs = Date.now() - startedAt;\n const quality: SemanticWebSearchQuality = {\n traceId,\n cacheServed: false,\n durationMs,\n strategyRequested: strategy,\n strategyUsed,\n fallbackUsed,\n candidates: normalized.length,\n reranked: reranked.length,\n averageScore: this.calculateAverageScore(reranked),\n searchAttempts,\n scrapeAttempts,\n scrapeFailures,\n };\n\n const cost = this.buildCostRecord(\n input.query,\n results,\n quality,\n );\n\n const response: SemanticWebSearchResponse = {\n query: input.query,\n results,\n citations: results.map((result) => result.citation),\n quality,\n ...(cost\n ? {\n cost: {\n model: this.costModel,\n promptTokens: cost.promptTokens,\n completionTokens: cost.completionTokens,\n totalTokens: cost.totalTokens,\n totalCost: cost.totalCost,\n currency: \"USD\",\n },\n }\n : {}),\n cacheHit: false,\n };\n\n this.emitEvent(\"semantic_search_completed\", {\n traceId,\n query: input.query,\n resultCount: results.length,\n durationMs,\n fallbackUsed,\n strategyUsed,\n cacheHit: false,\n ...(cost ? { totalCost: cost.totalCost, totalTokens: cost.totalTokens } : {}),\n });\n this.emitMetric(\"semantic_search_duration_ms\", durationMs, {\n strategy: strategyUsed,\n fallback: fallbackUsed ? \"true\" : \"false\",\n });\n if (cost) {\n this.emitMetric(\"semantic_search_cost_usd\", cost.totalCost, {\n model: this.costModel,\n });\n }\n\n this.cache.set(cacheKey, response, this.cacheTtlMs);\n return response;\n } catch (error) {\n this.emitEvent(\"semantic_search_failed\", {\n traceId,\n query: input.query,\n durationMs: Date.now() - startedAt,\n error: error instanceof Error ? error.message : String(error),\n }, \"ERROR\");\n this.emitMetric(\"semantic_search_failure\", 1, {\n strategy,\n });\n throw error;\n }\n },\n }),\n };\n }\n\n async dispose(): Promise<void> {\n if (!this.crawlerPromise) return;\n const crawler = await this.crawlerPromise;\n await crawler?.close?.();\n }\n\n private getCrawler(): Promise<\n NonNullable<SemanticWebSearchPluginOptions[\"crawler\"]>\n > {\n if (!this.crawlerPromise) {\n this.crawlerPromise = this.initCrawler();\n }\n return this.crawlerPromise;\n }\n\n private async initCrawler(): Promise<\n NonNullable<SemanticWebSearchPluginOptions[\"crawler\"]>\n > {\n if (this.options.crawler) {\n return this.options.crawler;\n }\n\n try {\n // @ts-expect-error optional peer dependency loaded lazily\n const mod = await import(\"onecrawl\");\n const CrawlerClass = mod.Crawler ?? mod.default?.Crawler ?? mod.default;\n return new CrawlerClass({\n ...(this.options.apiKey ? { apiKey: this.options.apiKey } : {}),\n });\n } catch {\n throw new Error(\n 'SemanticWebSearchPlugin requires \"onecrawl\" package. Install it: pnpm add onecrawl',\n );\n }\n }\n\n private normalizeResults(raw: unknown, limit: number): NormalizedCandidate[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .slice(0, limit)\n .map((entry, index) => this.normalizeEntry(entry, index))\n .filter((entry): entry is NormalizedCandidate => entry !== null);\n }\n\n private normalizeEntry(\n entry: unknown,\n index: number,\n ): NormalizedCandidate | null {\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const item = entry as CrawledSearchResult;\n const url = item.url ?? item.link;\n if (!url) {\n return null;\n }\n\n const title = item.title ?? `Result ${index + 1}`;\n const snippet = item.snippet ?? item.description ?? \"\";\n const content = item.content ?? item.text ?? snippet ?? title;\n\n return {\n id: `result-${index + 1}`,\n title,\n url,\n snippet,\n content,\n };\n }\n\n private async enrichTopResults(\n candidates: NormalizedCandidate[],\n scrapeTopK: number,\n crawler: NonNullable<SemanticWebSearchPluginOptions[\"crawler\"]>,\n ): Promise<{ failures: number; attempts: number }> {\n if (!crawler.crawl || scrapeTopK <= 0) {\n return { failures: 0, attempts: 0 };\n }\n\n const targets = candidates.slice(0, Math.min(scrapeTopK, candidates.length));\n let failures = 0;\n let attempts = 0;\n\n await Promise.all(\n targets.map(async (candidate) => {\n try {\n const result = await this.executeWithRetry(\"scrape\", async () =>\n crawler.crawl!(candidate.url),\n );\n attempts += result.attempts;\n const raw = result.value;\n const normalized = this.normalizeCrawlContent(raw);\n if (normalized.length > 0) {\n candidate.content = normalized;\n }\n } catch {\n failures += 1;\n attempts += this.maxRetries + 1;\n // Best-effort enrichment: keep original candidate content\n }\n }),\n );\n\n return { failures, attempts };\n }\n\n private normalizeCrawlContent(raw: unknown): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n\n if (raw && typeof raw === \"object\") {\n const item = raw as CrawledSearchResult;\n return item.content ?? item.text ?? item.snippet ?? item.description ?? \"\";\n }\n\n return \"\";\n }\n\n private async executeWithRetry<T>(\n label: string,\n operation: () => Promise<T>,\n ): Promise<{ value: T; attempts: number }> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\n try {\n const value = await this.circuitBreaker.execute(() =>\n this.withTimeout(operation(), `${label} attempt ${attempt}`),\n );\n return { value, attempts: attempt };\n } catch (error) {\n lastError = error;\n if (attempt <= this.maxRetries) {\n await this.sleep(this.retryDelayMs * attempt);\n }\n }\n }\n\n throw lastError;\n }\n\n private async withTimeout<T>(\n promise: Promise<T>,\n label: string,\n ): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`${label} timed out after ${this.requestTimeoutMs}ms`));\n }, this.requestTimeoutMs);\n\n promise\n .then((value) => {\n clearTimeout(timer);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n }\n\n private async sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private calculateAverageScore(results: ScoredResult[]): number {\n if (results.length === 0) return 0;\n const sum = results.reduce((acc, item) => acc + item.score, 0);\n return sum / results.length;\n }\n\n private buildCostRecord(\n query: string,\n results: Array<{ title: string; snippet: string; citation: string }>,\n quality: SemanticWebSearchQuality,\n ):\n | {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n totalCost: number;\n }\n | undefined {\n if (!this.costTracker) {\n return undefined;\n }\n\n const promptTokens = this.estimateTokens(query);\n const completionText = results\n .map((result) => `${result.title}\\n${result.snippet}\\n${result.citation}`)\n .join(\"\\n\\n\");\n const completionTokens = this.estimateTokens(completionText);\n const totalTokens = promptTokens + completionTokens;\n\n const usage: CostTokenUsage = {\n model: this.costModel,\n provider: \"semantic-web-search\",\n inputTokens: promptTokens,\n outputTokens: completionTokens,\n timestamp: Date.now(),\n };\n\n const totalBefore = this.costTracker.getEstimate().totalCost;\n this.costTracker.recordUsage(usage);\n const totalAfter = this.costTracker.getEstimate().totalCost;\n const totalCost = Math.max(0, totalAfter - totalBefore);\n\n this.emitEvent(\"semantic_search_cost_recorded\", {\n traceId: quality.traceId,\n model: this.costModel,\n promptTokens,\n completionTokens,\n totalTokens,\n totalCost,\n });\n\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n totalCost,\n };\n }\n\n private estimateTokens(text: string): number {\n if (text.trim().length === 0) {\n return 0;\n }\n return Math.max(1, Math.ceil(text.length / 4));\n }\n\n private emitEvent(\n name: string,\n properties: Record<string, unknown>,\n status: \"OK\" | \"ERROR\" = \"OK\",\n ): void {\n if (!this.emitTelemetry || !this.telemetry) {\n return;\n }\n\n try {\n const span = this.telemetry.startSpan(name);\n for (const [key, value] of Object.entries(properties)) {\n span.setAttribute(key, this.toTelemetryAttribute(value));\n }\n span.setStatus(status);\n span.end();\n } catch {\n // Never break primary flow due to observability side effects.\n }\n }\n\n private emitMetric(\n name: string,\n value: number,\n tags?: Record<string, string>,\n ): void {\n if (!this.emitTelemetry || !this.telemetry) {\n return;\n }\n\n try {\n this.telemetry.recordMetric(name, value, tags);\n } catch {\n // Never break primary flow due to observability side effects.\n }\n }\n\n private toTelemetryAttribute(value: unknown): string | number | boolean {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (value === null || value === undefined) {\n return \"\";\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n}\n\nexport function createSemanticWebSearchPlugin(\n options: SemanticWebSearchPluginOptions = {},\n): SemanticWebSearchPlugin {\n return new SemanticWebSearchPlugin(options);\n}\n","// =============================================================================\n// McpServerPlugin — Exposes agent tools as an MCP server\n// =============================================================================\n\nimport { tool, type Tool } from \"../core/llm/index.js\";\nimport { z } from \"zod\";\n\nimport type {\n Plugin,\n PluginSetupContext,\n} from \"../ports/plugin.port.js\";\nimport type { McpToolServerDefinition } from \"../ports/mcp-server.port.js\";\nimport { DefaultMcpServerAdapter } from \"../adapters/mcp-server/default-mcp-server.adapter.js\";\n\nexport interface McpServerPluginOptions {\n /** Default server name (default: \"gaussflow-mcp-server\") */\n name?: string;\n /** Default server version (default: \"1.0.0\") */\n version?: string;\n /** Additional static tool definitions to expose */\n extraTools?: McpToolServerDefinition[];\n /** Custom tool executor; defaults to looking up tools from setupContext */\n executor?: (name: string, args: Record<string, unknown>) => Promise<{\n content: Array<{ type: string; text?: string }>;\n isError?: boolean;\n }>;\n}\n\nconst START_SCHEMA = z.object({\n transport: z.enum([\"stdio\", \"sse\"]).default(\"stdio\"),\n port: z.number().optional(),\n toolFilter: z.array(z.string()).optional(),\n});\n\nconst STOP_SCHEMA = z.object({});\n\nexport class McpServerPlugin implements Plugin {\n readonly name = \"mcp-server\";\n readonly version = \"1.0.0\";\n readonly tools: Record<string, Tool<any, any>>;\n\n private adapter?: DefaultMcpServerAdapter;\n private readonly pluginOptions: McpServerPluginOptions;\n private collectedTools: McpToolServerDefinition[] = [];\n\n constructor(options: McpServerPluginOptions = {}) {\n this.pluginOptions = options;\n\n this.tools = {\n \"mcp:start-server\": tool({\n description:\n \"Start an MCP server that exposes the agent's tools via MCP protocol. \" +\n \"Supports stdio (default) and sse transports.\",\n inputSchema: START_SCHEMA,\n execute: async (input: unknown) => {\n const args = START_SCHEMA.parse(input ?? {});\n\n if (this.adapter) {\n await this.adapter.stop();\n }\n\n this.adapter = new DefaultMcpServerAdapter(\n this.collectedTools,\n this.pluginOptions.executor ?? this.defaultExecutor.bind(this),\n );\n\n await this.adapter.start({\n name: this.pluginOptions.name ?? \"gaussflow-mcp-server\",\n version: this.pluginOptions.version ?? \"1.0.0\",\n transport: args.transport,\n port: args.port,\n toolFilter: args.toolFilter,\n });\n\n const tools = this.adapter.getRegisteredTools();\n return {\n status: \"started\",\n transport: args.transport,\n port: args.transport === \"sse\" ? (args.port ?? 3100) : undefined,\n toolCount: tools.length,\n tools: tools.map((t) => t.name),\n };\n },\n }),\n\n \"mcp:stop-server\": tool({\n description: \"Stop the running MCP server.\",\n inputSchema: STOP_SCHEMA,\n execute: async () => {\n if (!this.adapter) {\n return { status: \"not_running\" };\n }\n await this.adapter.stop();\n this.adapter = undefined;\n return { status: \"stopped\" };\n },\n }),\n };\n }\n\n async setup(ctx: PluginSetupContext): Promise<void> {\n // Collect tool definitions from the agent context\n this.collectedTools = ctx.toolNames.map((name) => ({\n name,\n description: `Agent tool: ${name}`,\n inputSchema: { type: \"object\", properties: {} },\n }));\n\n // Merge extra tools\n if (this.pluginOptions.extraTools) {\n this.collectedTools.push(...this.pluginOptions.extraTools);\n }\n }\n\n async dispose(): Promise<void> {\n if (this.adapter) {\n await this.adapter.stop();\n this.adapter = undefined;\n }\n }\n\n /** Expose the underlying adapter for testing */\n getAdapter(): DefaultMcpServerAdapter | undefined {\n return this.adapter;\n }\n\n /** Expose collected tools for testing */\n getCollectedTools(): McpToolServerDefinition[] {\n return [...this.collectedTools];\n }\n\n private async defaultExecutor(\n name: string,\n _args: Record<string, unknown>,\n ): Promise<{ content: Array<{ type: string; text?: string }>; isError?: boolean }> {\n // Default executor returns a descriptive message.\n // In production use, a custom executor wired to the agent's ToolManager should be provided.\n return {\n content: [{ type: \"text\", text: `Tool \"${name}\" executed (no custom executor provided)` }],\n };\n }\n}\n\nexport function createMcpServerPlugin(options?: McpServerPluginOptions): McpServerPlugin {\n return new McpServerPlugin(options);\n}\n","// =============================================================================\n// DefaultMcpServerAdapter — Lightweight MCP server (stdio + SSE transports)\n// =============================================================================\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type {\n McpServerPort,\n McpServerOptions,\n McpToolServerDefinition,\n} from \"../../ports/mcp-server.port.js\";\n\n// ── JSON-RPC types ──────────────────────────────────────────────────────────\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number | null;\n method: string;\n params?: Record<string, unknown>;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\n// ── Tool executor function ──────────────────────────────────────────────────\n\nexport type McpToolExecutor = (\n name: string,\n args: Record<string, unknown>,\n) => Promise<{ content: Array<{ type: string; text?: string }>; isError?: boolean }>;\n\n// ── Adapter ─────────────────────────────────────────────────────────────────\n\nexport class DefaultMcpServerAdapter implements McpServerPort {\n private tools: McpToolServerDefinition[] = [];\n private toolsByName = new Map<string, McpToolServerDefinition>();\n private executor: McpToolExecutor;\n private options?: McpServerOptions;\n\n // stdio\n private stdinHandler?: (data: Buffer) => void;\n private stdinBuffer = \"\";\n\n // sse\n private httpServer?: Server;\n private sseClients = new Map<string, ServerResponse>();\n\n constructor(\n tools: McpToolServerDefinition[],\n executor: McpToolExecutor,\n ) {\n this.tools = tools;\n this.rebuildToolIndex();\n this.executor = executor;\n }\n\n private rebuildToolIndex(): void {\n this.toolsByName.clear();\n for (const t of this.tools) {\n this.toolsByName.set(t.name, t);\n }\n }\n\n // ── Public API ──────────────────────────────────────────────────────────\n\n getRegisteredTools(): McpToolServerDefinition[] {\n return [...this.tools];\n }\n\n setTools(tools: McpToolServerDefinition[]): void {\n this.tools = tools;\n this.rebuildToolIndex();\n }\n\n async start(options: McpServerOptions): Promise<void> {\n this.options = options;\n\n const filtered = options.toolFilter\n ? this.tools.filter((t) => options.toolFilter!.includes(t.name))\n : this.tools;\n this.tools = filtered;\n this.rebuildToolIndex();\n\n if (options.transport === \"stdio\") {\n this.startStdio();\n } else {\n await this.startSse(options.port ?? 3100);\n }\n }\n\n async stop(): Promise<void> {\n if (this.stdinHandler) {\n process.stdin.removeListener(\"data\", this.stdinHandler);\n this.stdinHandler = undefined;\n this.stdinBuffer = \"\";\n }\n\n if (this.httpServer) {\n for (const [, client] of this.sseClients) {\n client.end();\n }\n this.sseClients.clear();\n await new Promise<void>((resolve, reject) => {\n this.httpServer!.close((err) => (err ? reject(err) : resolve()));\n });\n this.httpServer = undefined;\n }\n }\n\n // ── JSON-RPC handler ──────────────────────────────────────────────────\n\n async handleRequest(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const { id, method, params } = request;\n\n switch (method) {\n case \"initialize\":\n return {\n jsonrpc: \"2.0\",\n id,\n result: {\n protocolVersion: \"2024-11-05\",\n serverInfo: {\n name: this.options?.name ?? \"gaussflow-mcp-server\",\n version: this.options?.version ?? \"1.0.0\",\n },\n capabilities: {\n tools: { listChanged: false },\n },\n },\n };\n\n case \"tools/list\":\n return {\n jsonrpc: \"2.0\",\n id,\n result: {\n tools: this.tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n },\n };\n\n case \"tools/call\": {\n const toolName = (params?.name as string) ?? \"\";\n const toolArgs = (params?.arguments as Record<string, unknown>) ?? {};\n\n const toolDef = this.toolsByName.get(toolName);\n if (!toolDef) {\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32601, message: `Unknown tool: ${toolName}` },\n };\n }\n\n try {\n const result = await this.executor(toolName, toolArgs);\n return { jsonrpc: \"2.0\", id, result };\n } catch (err) {\n return {\n jsonrpc: \"2.0\",\n id,\n result: {\n content: [{ type: \"text\", text: String(err) }],\n isError: true,\n },\n };\n }\n }\n\n case \"notifications/initialized\":\n // Client notification, no response needed — return empty result\n return { jsonrpc: \"2.0\", id, result: {} };\n\n default:\n return {\n jsonrpc: \"2.0\",\n id,\n error: { code: -32601, message: `Method not found: ${method}` },\n };\n }\n }\n\n // ── Stdio transport ───────────────────────────────────────────────────\n\n private startStdio(): void {\n this.stdinBuffer = \"\";\n\n this.stdinHandler = (data: Buffer) => {\n this.stdinBuffer += data.toString(\"utf-8\");\n\n let newlineIdx: number;\n while ((newlineIdx = this.stdinBuffer.indexOf(\"\\n\")) !== -1) {\n const line = this.stdinBuffer.slice(0, newlineIdx).trim();\n this.stdinBuffer = this.stdinBuffer.slice(newlineIdx + 1);\n\n if (!line) continue;\n\n this.processStdioLine(line).catch((err: unknown) => {\n // fire-and-forget: stdio line processing must not crash the server\n console.warn(\"[mcp-stdio] Unhandled error processing line:\", err instanceof Error ? err.message : String(err));\n });\n }\n };\n\n process.stdin.on(\"data\", this.stdinHandler);\n }\n\n private async processStdioLine(line: string): Promise<void> {\n let request: JsonRpcRequest;\n try {\n request = JSON.parse(line) as JsonRpcRequest;\n } catch {\n const errResponse: JsonRpcResponse = {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n };\n process.stdout.write(JSON.stringify(errResponse) + \"\\n\");\n return;\n }\n\n // Notifications (id === null/undefined) don't require a response per spec,\n // but we still process them and skip sending if id is absent.\n const response = await this.handleRequest(request);\n if (request.id !== null && request.id !== undefined) {\n process.stdout.write(JSON.stringify(response) + \"\\n\");\n }\n }\n\n // ── SSE transport ─────────────────────────────────────────────────────\n\n private startSse(port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n this.httpServer = createServer((req, res) => {\n this.handleHttpRequest(req, res).catch((err: unknown) => {\n console.warn(\"[mcp-sse] Unhandled request error:\", err instanceof Error ? err.message : String(err));\n if (!res.headersSent) {\n res.writeHead(500);\n res.end();\n }\n });\n });\n\n this.httpServer.once(\"error\", reject);\n this.httpServer.listen(port, \"127.0.0.1\", () => resolve());\n });\n }\n\n private async handleHttpRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n res.setHeader(\"Access-Control-Allow-Origin\", \"http://localhost\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n\n if (url.pathname === \"/sse\" && req.method === \"GET\") {\n const clientId = randomUUID();\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(`data: ${JSON.stringify({ type: \"endpoint\", url: `/message?clientId=${clientId}` })}\\n\\n`);\n this.sseClients.set(clientId, res);\n req.on(\"close\", () => this.sseClients.delete(clientId));\n return;\n }\n\n if (url.pathname === \"/message\" && req.method === \"POST\") {\n const body = await this.readBody(req);\n let request: JsonRpcRequest;\n try {\n request = JSON.parse(body) as JsonRpcRequest;\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", id: null, error: { code: -32700, message: \"Parse error\" } }));\n return;\n }\n\n const response = await this.handleRequest(request);\n const responseJson = JSON.stringify(response);\n\n // Send via SSE only to the originating client\n const clientId = url.searchParams.get(\"clientId\");\n if (clientId) {\n const client = this.sseClients.get(clientId);\n if (client) client.write(`data: ${responseJson}\\n\\n`);\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(responseJson);\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n\n private static readonly MAX_BODY_SIZE = 1_048_576; // 1 MB\n\n private readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > DefaultMcpServerAdapter.MAX_BODY_SIZE) {\n req.destroy(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n }\n}\n"],"mappings":"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","names":["z","requestObject","DEFAULT_RETRY_CONFIG","z","z","DEFAULT_REQUEST_TIMEOUT_MS","z","results","z","z","DEFAULT_RETRY","z","tool","z","z","z","z","randomUUID","z"]}
|