@lssm/lib.ai-agent 0.0.0-canary-20251217083314 → 0.0.0-canary-20251219202229

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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent/agent-factory.d.ts +2 -1
  3. package/dist/agent/agent-factory.d.ts.map +1 -0
  4. package/dist/agent/agent-factory.js +2 -1
  5. package/dist/agent/agent-factory.js.map +1 -0
  6. package/dist/agent/contract-spec-agent.d.ts +2 -1
  7. package/dist/agent/contract-spec-agent.d.ts.map +1 -0
  8. package/dist/agent/contract-spec-agent.js +2 -1
  9. package/dist/agent/contract-spec-agent.js.map +1 -0
  10. package/dist/approval/workflow.d.ts +2 -1
  11. package/dist/approval/workflow.d.ts.map +1 -0
  12. package/dist/approval/workflow.js +2 -1
  13. package/dist/approval/workflow.js.map +1 -0
  14. package/dist/knowledge/injector.d.ts +2 -1
  15. package/dist/knowledge/injector.d.ts.map +1 -0
  16. package/dist/knowledge/injector.js +2 -1
  17. package/dist/knowledge/injector.js.map +1 -0
  18. package/dist/memory/in-memory.d.ts +2 -1
  19. package/dist/memory/in-memory.d.ts.map +1 -0
  20. package/dist/memory/in-memory.js +2 -1
  21. package/dist/memory/in-memory.js.map +1 -0
  22. package/dist/memory/manager.d.ts +2 -1
  23. package/dist/memory/manager.d.ts.map +1 -0
  24. package/dist/memory/manager.js +2 -1
  25. package/dist/memory/manager.js.map +1 -0
  26. package/dist/schema/json-schema-to-zod.d.ts +2 -1
  27. package/dist/schema/json-schema-to-zod.d.ts.map +1 -0
  28. package/dist/schema/json-schema-to-zod.js +2 -1
  29. package/dist/schema/json-schema-to-zod.js.map +1 -0
  30. package/dist/schema/schema-output.d.ts +2 -1
  31. package/dist/schema/schema-output.d.ts.map +1 -0
  32. package/dist/schema/schema-output.js +2 -1
  33. package/dist/schema/schema-output.js.map +1 -0
  34. package/dist/session/store.d.ts +2 -1
  35. package/dist/session/store.d.ts.map +1 -0
  36. package/dist/session/store.js +2 -1
  37. package/dist/session/store.js.map +1 -0
  38. package/dist/spec/registry.d.ts +2 -1
  39. package/dist/spec/registry.d.ts.map +1 -0
  40. package/dist/spec/registry.js +2 -1
  41. package/dist/spec/registry.js.map +1 -0
  42. package/dist/spec/spec.d.ts +2 -1
  43. package/dist/spec/spec.d.ts.map +1 -0
  44. package/dist/spec/spec.js +2 -1
  45. package/dist/spec/spec.js.map +1 -0
  46. package/dist/telemetry/adapter.d.ts +2 -1
  47. package/dist/telemetry/adapter.d.ts.map +1 -0
  48. package/dist/telemetry/adapter.js +2 -1
  49. package/dist/telemetry/adapter.js.map +1 -0
  50. package/dist/tools/knowledge-tool.d.ts +2 -1
  51. package/dist/tools/knowledge-tool.d.ts.map +1 -0
  52. package/dist/tools/knowledge-tool.js +2 -1
  53. package/dist/tools/knowledge-tool.js.map +1 -0
  54. package/dist/tools/mcp-client.d.ts +2 -1
  55. package/dist/tools/mcp-client.d.ts.map +1 -0
  56. package/dist/tools/mcp-client.js +2 -1
  57. package/dist/tools/mcp-client.js.map +1 -0
  58. package/dist/tools/mcp-server.d.ts +2 -1
  59. package/dist/tools/mcp-server.d.ts.map +1 -0
  60. package/dist/tools/mcp-server.js +2 -1
  61. package/dist/tools/mcp-server.js.map +1 -0
  62. package/dist/tools/tool-adapter.d.ts +2 -1
  63. package/dist/tools/tool-adapter.d.ts.map +1 -0
  64. package/dist/tools/tool-adapter.js +2 -1
  65. package/dist/tools/tool-adapter.js.map +1 -0
  66. package/dist/types.d.ts +2 -1
  67. package/dist/types.d.ts.map +1 -0
  68. package/package.json +8 -7
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Chaman Ventures, SASU
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -100,4 +100,5 @@ declare class AgentFactory {
100
100
  */
101
101
  declare function createAgentFactory(config: AgentFactoryConfig): AgentFactory;
102
102
  //#endregion
103
- export { AgentFactory, AgentFactoryConfig, CreateAgentOptions, createAgentFactory };
103
+ export { AgentFactory, AgentFactoryConfig, CreateAgentOptions, createAgentFactory };
104
+ //# sourceMappingURL=agent-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.d.ts","names":[],"sources":["../../src/agent/agent-factory.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAYA;AAEgB,UAFC,kBAAA,CAED;EAEJ;EAEgB,YAAA,EAJZ,aAIY;EAAZ;EAEO,QAAA,EAJX,aAIW;EAEN;EAEM,YAAA,EANP,GAMO,CAAA,MAAA,EANK,WAML,CAAA;EAEY;EAAf,kBAAA,CAAA,EANG,kBAMH;EAAM;EAMT,YAAA,CAAA,EAVA,iBAUkB;EAEzB;EAEmB,kBAAA,CAAA,EAZN,kBAYM;EAAZ;EAEkB,eAAA,CAAA,EAZf,MAYe,CAAA,MAAA,EAZA,IAYA,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA;;;AAsBnC;;AAkBc,UA9CG,kBAAA,CA8CH;EACD;EAAR,KAAA,CAAA,EA7CK,aA6CL;EAYK;EACI,YAAA,CAAA,EAxDG,GAwDH,CAAA,MAAA,EAxDe,WAwDf,CAAA;EACD;EAAR,eAAA,CAAA,EAvDe,MAuDf,CAAA,MAAA,EAvD8B,IAuD9B,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA;;;;AAsEL;;;;;;;;;;;;;;;;;cAvGa,YAAA;;;sBAIS;;;;;;;;mDAcR,qBACT,QAAQ;;;;;;;uBAYH,qBACI,qBACT,QAAQ;;;;;;;;;+CAuCR,QAAQ;;;;;;;;;;;;;iBA+BG,kBAAA,SAA2B,qBAAqB"}
@@ -99,4 +99,5 @@ function createAgentFactory(config) {
99
99
  }
100
100
 
101
101
  //#endregion
102
- export { AgentFactory, createAgentFactory };
102
+ export { AgentFactory, createAgentFactory };
103
+ //# sourceMappingURL=agent-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.js","names":[],"sources":["../../src/agent/agent-factory.ts"],"sourcesContent":["import type { LanguageModel, Tool } from 'ai';\nimport type { KnowledgeRetriever } from '@lssm/lib.knowledge/retriever';\nimport type { AgentSpec } from '../spec/spec';\nimport type { AgentRegistry } from '../spec/registry';\nimport type { ToolHandler } from '../types';\nimport type { AgentSessionStore } from '../session/store';\nimport type { TelemetryCollector } from '../telemetry/adapter';\nimport { ContractSpecAgent } from './contract-spec-agent';\n\n/**\n * Factory configuration for creating agents.\n */\nexport interface AgentFactoryConfig {\n /** Default language model to use */\n defaultModel: LanguageModel;\n /** Agent registry for looking up specs */\n registry: AgentRegistry;\n /** Global tool handlers map */\n toolHandlers: Map<string, ToolHandler>;\n /** Optional knowledge retriever */\n knowledgeRetriever?: KnowledgeRetriever;\n /** Optional session store */\n sessionStore?: AgentSessionStore;\n /** Optional telemetry collector */\n telemetryCollector?: TelemetryCollector;\n /** Additional tools to provide to all agents */\n additionalTools?: Record<string, Tool<unknown, unknown>>;\n}\n\n/**\n * Options for creating an agent instance.\n */\nexport interface CreateAgentOptions {\n /** Override the default model */\n model?: LanguageModel;\n /** Additional tool handlers specific to this instance */\n toolHandlers?: Map<string, ToolHandler>;\n /** Additional tools for this instance */\n additionalTools?: Record<string, Tool<unknown, unknown>>;\n}\n\n/**\n * Factory for creating ContractSpec agents from specs.\n *\n * Provides a centralized way to instantiate agents with\n * consistent configuration.\n *\n * @example\n * ```typescript\n * const factory = createAgentFactory({\n * defaultModel: mistral('mistral-large-latest'),\n * registry: agentRegistry,\n * toolHandlers: globalToolHandlers,\n * sessionStore: mySessionStore,\n * });\n *\n * const agent = await factory.create('support.bot');\n * const result = await agent.generate({ prompt: 'Help me with...' });\n * ```\n */\nexport class AgentFactory {\n private readonly config: AgentFactoryConfig;\n private readonly cache = new Map<string, ContractSpecAgent>();\n\n constructor(config: AgentFactoryConfig) {\n this.config = config;\n }\n\n /**\n * Create an agent by name.\n *\n * @param name - Agent name (e.g., \"support.bot\")\n * @param version - Optional specific version\n * @param options - Optional creation options\n */\n async create(\n name: string,\n version?: number,\n options?: CreateAgentOptions\n ): Promise<ContractSpecAgent> {\n const spec = this.config.registry.require(name, version);\n return this.createFromSpec(spec, options);\n }\n\n /**\n * Create an agent from a spec directly.\n *\n * @param spec - Agent specification\n * @param options - Optional creation options\n */\n async createFromSpec(\n spec: AgentSpec,\n options?: CreateAgentOptions\n ): Promise<ContractSpecAgent> {\n // Merge tool handlers\n const mergedHandlers = new Map<string, ToolHandler>(\n this.config.toolHandlers\n );\n if (options?.toolHandlers) {\n for (const [key, handler] of options.toolHandlers) {\n mergedHandlers.set(key, handler);\n }\n }\n\n // Merge additional tools\n const mergedTools = {\n ...this.config.additionalTools,\n ...options?.additionalTools,\n };\n\n return ContractSpecAgent.create({\n spec,\n model: options?.model ?? this.config.defaultModel,\n toolHandlers: mergedHandlers,\n knowledgeRetriever: this.config.knowledgeRetriever,\n sessionStore: this.config.sessionStore,\n telemetryCollector: this.config.telemetryCollector,\n additionalTools: mergedTools,\n });\n }\n\n /**\n * Get or create a cached agent instance.\n *\n * Use this when you want to reuse agent instances.\n *\n * @param name - Agent name\n * @param version - Optional specific version\n */\n async getOrCreate(\n name: string,\n version?: number\n ): Promise<ContractSpecAgent> {\n const spec = this.config.registry.require(name, version);\n const cacheKey = `${spec.meta.name}.v${spec.meta.version}`;\n\n let agent = this.cache.get(cacheKey);\n if (!agent) {\n agent = await this.createFromSpec(spec);\n this.cache.set(cacheKey, agent);\n }\n\n return agent;\n }\n\n /**\n * Clear the agent cache.\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * List all available agent names.\n */\n listAvailable(): string[] {\n return this.config.registry.listNames();\n }\n}\n\n/**\n * Create an agent factory.\n */\nexport function createAgentFactory(config: AgentFactoryConfig): AgentFactory {\n return new AgentFactory(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4DA,IAAa,eAAb,MAA0B;CACxB,AAAiB;CACjB,AAAiB,wBAAQ,IAAI,KAAgC;CAE7D,YAAY,QAA4B;AACtC,OAAK,SAAS;;;;;;;;;CAUhB,MAAM,OACJ,MACA,SACA,SAC4B;EAC5B,MAAM,OAAO,KAAK,OAAO,SAAS,QAAQ,MAAM,QAAQ;AACxD,SAAO,KAAK,eAAe,MAAM,QAAQ;;;;;;;;CAS3C,MAAM,eACJ,MACA,SAC4B;EAE5B,MAAM,iBAAiB,IAAI,IACzB,KAAK,OAAO,aACb;AACD,MAAI,SAAS,aACX,MAAK,MAAM,CAAC,KAAK,YAAY,QAAQ,aACnC,gBAAe,IAAI,KAAK,QAAQ;EAKpC,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG,SAAS;GACb;AAED,SAAO,kBAAkB,OAAO;GAC9B;GACA,OAAO,SAAS,SAAS,KAAK,OAAO;GACrC,cAAc;GACd,oBAAoB,KAAK,OAAO;GAChC,cAAc,KAAK,OAAO;GAC1B,oBAAoB,KAAK,OAAO;GAChC,iBAAiB;GAClB,CAAC;;;;;;;;;;CAWJ,MAAM,YACJ,MACA,SAC4B;EAC5B,MAAM,OAAO,KAAK,OAAO,SAAS,QAAQ,MAAM,QAAQ;EACxD,MAAM,WAAW,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;EAEjD,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS;AACpC,MAAI,CAAC,OAAO;AACV,WAAQ,MAAM,KAAK,eAAe,KAAK;AACvC,QAAK,MAAM,IAAI,UAAU,MAAM;;AAGjC,SAAO;;;;;CAMT,aAAmB;AACjB,OAAK,MAAM,OAAO;;;;;CAMpB,gBAA0B;AACxB,SAAO,KAAK,OAAO,SAAS,WAAW;;;;;;AAO3C,SAAgB,mBAAmB,QAA0C;AAC3E,QAAO,IAAI,aAAa,OAAO"}
@@ -71,4 +71,5 @@ declare class ContractSpecAgent {
71
71
  private handleStepFinish;
72
72
  }
73
73
  //#endregion
74
- export { ContractSpecAgent, ContractSpecAgentConfig };
74
+ export { ContractSpecAgent, ContractSpecAgentConfig };
75
+ //# sourceMappingURL=contract-spec-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-spec-agent.d.ts","names":[],"sources":["../../src/agent/contract-spec-agent.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAuB+E;AAuB/E,KALK,cAAA,GAAiB,IAKL,CAAA,GAAuB,EAAA,GAAA,CAAA;;;;AAMxB,UANC,uBAAA,CAMD;EAEO;EAEN,IAAA,EART,SAQS;EAEM;EAEY,KAAA,EAV1B,aAU0B;EAAf;EAAM,YAAA,EARV,GAQU,CAAA,MAAA,EARE,WAQF,CAAA;EAcb;EAGI,kBAAA,CAAA,EAvBM,kBAuBN;EACgB;EAAf,YAAA,CAAA,EAtBD,iBAsBC;EA0CN;EACC,kBAAA,CAAA,EA/DU,kBA+DV;EAAR;EAoCoB,eAAA,CAAA,EAjGL,MAiGK,CAAA,MAAA,EAjGU,cAiGV,CAAA;;;;;;;;;;;;;cAnFZ,iBAAA;;;iBAGI;kBACC,eAAe;;;;;;;;;wBA0CrB,0BACP,QAAQ;;;;mBAoCY,sBAAsB,QAAQ;;;;iBAoEhC,oBAAiB,QAAA,GAAA,CAAA,iBAAA"}
@@ -144,4 +144,5 @@ var ContractSpecAgent = class ContractSpecAgent {
144
144
  };
145
145
 
146
146
  //#endregion
147
- export { ContractSpecAgent };
147
+ export { ContractSpecAgent };
148
+ //# sourceMappingURL=contract-spec-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-spec-agent.js","names":["z","ToolLoopAgent"],"sources":["../../src/agent/contract-spec-agent.ts"],"sourcesContent":["import {\n Experimental_Agent as ToolLoopAgent,\n type LanguageModel,\n stepCountIs,\n type StepResult,\n type Tool,\n type ToolSet,\n} from 'ai';\nimport * as z from 'zod';\nimport type { KnowledgeRetriever } from '@lssm/lib.knowledge/retriever';\nimport type { AgentSpec } from '../spec/spec';\nimport { agentKey } from '../spec/spec';\nimport type {\n AgentCallOptions,\n AgentGenerateParams,\n AgentGenerateResult,\n AgentStreamParams,\n ToolHandler,\n} from '../types';\nimport { specToolsToAISDKTools } from '../tools/tool-adapter';\nimport { createKnowledgeQueryTool } from '../tools/knowledge-tool';\nimport { injectStaticKnowledge } from '../knowledge/injector';\nimport { type AgentSessionStore, generateSessionId } from '../session/store';\nimport { type TelemetryCollector, trackAgentStep } from '../telemetry/adapter';\n\n/**\n * Call options schema for AI SDK v6.\n * Maps ContractSpec's tenant/actor system to AI SDK callOptionsSchema.\n */\nconst ContractSpecCallOptionsSchema = z.object({\n tenantId: z.string().optional(),\n actorId: z.string().optional(),\n sessionId: z.string().optional(),\n // Zod v4: z.record() requires both key and value schemas\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Type for tool with execute function (compatible with AI SDK Tool)\n * Using `any` for broad compatibility with AI SDK tool types\n */\ntype ExecutableTool = Tool<any, any>;\n\n/**\n * Configuration for creating a ContractSpecAgent.\n */\nexport interface ContractSpecAgentConfig {\n /** The agent specification */\n spec: AgentSpec;\n /** AI SDK language model */\n model: LanguageModel;\n /** Map of tool name to handler function */\n toolHandlers: Map<string, ToolHandler>;\n /** Optional knowledge retriever for RAG */\n knowledgeRetriever?: KnowledgeRetriever;\n /** Optional session store for persistence */\n sessionStore?: AgentSessionStore;\n /** Optional telemetry collector for evolution */\n telemetryCollector?: TelemetryCollector;\n /** Additional AI SDK tools (e.g., from MCP servers) */\n additionalTools?: Record<string, ExecutableTool>;\n}\n\n/**\n * ContractSpec Agent implementation using AI SDK v6.\n *\n * Integrates ContractSpec's spec-first governance with AI SDK's\n * ToolLoopAgent, providing:\n * - Spec-defined tools with type-safe handlers\n * - Hybrid knowledge injection (static + dynamic RAG)\n * - Session persistence\n * - Telemetry for evolution\n * - MCP interoperability\n */\nexport class ContractSpecAgent {\n readonly version = 'agent-v1';\n readonly id: string;\n readonly spec: AgentSpec;\n readonly tools: Record<string, ExecutableTool>;\n\n private readonly inner: ToolLoopAgent<\n z.infer<typeof ContractSpecCallOptionsSchema>,\n ToolSet,\n never\n >;\n private readonly config: ContractSpecAgentConfig;\n private instructions: string;\n\n private constructor(\n config: ContractSpecAgentConfig,\n instructions: string,\n tools: Record<string, ExecutableTool>\n ) {\n this.config = config;\n this.spec = config.spec;\n this.id = agentKey(config.spec.meta);\n this.tools = tools;\n this.instructions = instructions;\n\n // Create the inner ToolLoopAgent with AI SDK v6 settings\n this.inner = new ToolLoopAgent({\n model: config.model,\n instructions,\n tools: tools as ToolSet,\n // Use stopWhen instead of maxSteps (AI SDK v6 API)\n stopWhen: stepCountIs(config.spec.maxSteps ?? 10),\n // Schema for call options (tenant/actor context)\n callOptionsSchema: ContractSpecCallOptionsSchema,\n // Step-level telemetry callback\n onStepFinish: async (step: StepResult<ToolSet>) => {\n await this.handleStepFinish(step);\n },\n });\n }\n\n /**\n * Create a ContractSpecAgent instance.\n * This is async because knowledge injection may need to fetch static content.\n */\n static async create(\n config: ContractSpecAgentConfig\n ): Promise<ContractSpecAgent> {\n // 1. Inject static knowledge into instructions\n const instructions = await injectStaticKnowledge(\n config.spec.instructions,\n config.spec.knowledge ?? [],\n config.knowledgeRetriever\n );\n\n // 2. Build tools from spec\n const specTools = specToolsToAISDKTools(\n config.spec.tools,\n config.toolHandlers,\n { agentId: agentKey(config.spec.meta) }\n );\n\n // 3. Add dynamic knowledge query tool\n const knowledgeTool = config.knowledgeRetriever\n ? createKnowledgeQueryTool(\n config.knowledgeRetriever,\n config.spec.knowledge ?? []\n )\n : null;\n\n // 4. Combine all tools\n const tools: Record<string, ExecutableTool> = {\n ...specTools,\n ...(knowledgeTool ? { query_knowledge: knowledgeTool } : {}),\n ...(config.additionalTools ?? {}),\n };\n\n return new ContractSpecAgent(config, instructions, tools);\n }\n\n /**\n * Generate a response (non-streaming).\n */\n async generate(params: AgentGenerateParams): Promise<AgentGenerateResult> {\n const sessionId = params.options?.sessionId ?? generateSessionId();\n\n // Ensure session exists\n if (this.config.sessionStore) {\n const existing = await this.config.sessionStore.get(sessionId);\n if (!existing) {\n await this.config.sessionStore.create({\n sessionId,\n agentId: this.id,\n tenantId: params.options?.tenantId,\n actorId: params.options?.actorId,\n status: 'running',\n messages: [],\n steps: [],\n metadata: params.options?.metadata,\n });\n }\n }\n\n // Build prompt with optional system override\n const prompt = params.systemOverride\n ? `${this.instructions}\\n\\n${params.systemOverride}\\n\\n${params.prompt}`\n : params.prompt;\n\n // AI SDK v6: maxSteps is controlled via stopWhen in agent settings\n const result = await this.inner.generate({\n prompt,\n abortSignal: params.signal,\n options: {\n tenantId: params.options?.tenantId,\n actorId: params.options?.actorId,\n sessionId,\n metadata: params.options?.metadata,\n },\n });\n\n // Update session status\n if (this.config.sessionStore) {\n await this.config.sessionStore.update(sessionId, {\n status: 'completed',\n });\n }\n\n return {\n text: result.text,\n steps: result.steps,\n // Map AI SDK types to our simplified types\n toolCalls: result.toolCalls.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: 'args' in tc ? tc.args : 'input' in tc ? tc.input : undefined,\n })),\n toolResults: result.toolResults.map((tr) => ({\n type: 'tool-result' as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n output: tr.output,\n })),\n finishReason: result.finishReason,\n usage: result.usage,\n };\n }\n\n /**\n * Stream a response with real-time updates.\n */\n async stream(params: AgentStreamParams) {\n const sessionId = params.options?.sessionId ?? generateSessionId();\n\n const prompt = params.systemOverride\n ? `${this.instructions}\\n\\n${params.systemOverride}\\n\\n${params.prompt}`\n : params.prompt;\n\n // AI SDK v6: maxSteps is controlled via stopWhen in agent settings\n // onStepFinish callback is already set in agent construction\n return this.inner.stream({\n prompt,\n abortSignal: params.signal,\n options: {\n tenantId: params.options?.tenantId,\n actorId: params.options?.actorId,\n sessionId,\n metadata: params.options?.metadata,\n },\n });\n }\n\n /**\n * Handle step completion for persistence and telemetry.\n */\n private async handleStepFinish(step: StepResult<ToolSet>): Promise<void> {\n // 1. Persist to session store\n const sessionId = (step as { options?: AgentCallOptions }).options\n ?.sessionId;\n if (sessionId && this.config.sessionStore) {\n await this.config.sessionStore.appendStep(sessionId, step);\n }\n\n // 2. Feed telemetry to evolution engine\n if (this.config.telemetryCollector) {\n await trackAgentStep(this.config.telemetryCollector, this.id, step);\n }\n }\n}\n"],"mappings":"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"}
@@ -152,4 +152,5 @@ declare class ApprovalWorkflow {
152
152
  */
153
153
  declare function createApprovalWorkflow(store?: ApprovalStore): ApprovalWorkflow;
154
154
  //#endregion
155
- export { ApprovalRequest, ApprovalStatus, ApprovalStore, ApprovalWorkflow, InMemoryApprovalStore, createApprovalWorkflow };
155
+ export { ApprovalRequest, ApprovalStatus, ApprovalStore, ApprovalWorkflow, InMemoryApprovalStore, createApprovalWorkflow };
156
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","names":[],"sources":["../../src/approval/workflow.ts"],"sourcesContent":[],"mappings":";;;KAGY,cAAA;;AAAZ;AAQA;;;;AA0Be,UA1BE,eAAA,CA0BF;EAAI;EAQF,EAAA,EAAA,MAAA;EACC;EAAkB,SAAA,EAAA,MAAA;EACT;EAAR,OAAA,EAAA,MAAA;EAC4B;EAAR,QAAA,CAAA,EAAA,MAAA;EAGb;EAAL,QAAA,EAAA,MAAA;EAAR;EACR,UAAA,EAAA,MAAA;EAEQ;EAGC,QAAA,EAAA,OAAA;EAAR;EAAO,MAAA,EAAA,MAAA;EAMA;EAGW,WAAA,EArCT,IAqCS;EAAkB;EAIT,MAAA,EAvCvB,cAuCuB;EAAR;EAI4B,OAAA,CAAA,EAzCzC,MAyCyC,CAAA,MAAA,EAAA,OAAA,CAAA;EAAR;EAWnB,QAAA,CAAA,EAAA,MAAA;EAAL;EAAR,UAAA,CAAA,EAhDE,IAgDF;EACR;EAQQ,KAAA,CAAA,EAAA,MAAA;;;;;AAoDA,UArGI,aAAA,CAqGY;EAED,MAAA,CAAA,OAAA,EAtGV,eAsGU,CAAA,EAtGQ,OAsGR,CAAA,IAAA,CAAA;EAcd,GAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EAnHK,OAmHL,CAnHa,eAmHb,GAAA,IAAA,CAAA;EACA,eAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAnHyB,OAmHzB,CAnHiC,eAmHjC,GAAA,IAAA,CAAA;EAAR,MAAA,CAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAhHO,OAgHP,CAhHe,IAgHf,CAhHoB,eAgHpB,EAAA,IAAA,GAAA,WAAA,CAAA,CAAA,CAAA,EA/GD,OA+GC,CAAA,IAAA,CAAA;EAuBQ,IAAA,CAAA,OAkCgD,CAlChD,EAAA;IAOD,MAAA,CAAA,EA3IA,cA2IA;IAAR,OAAA,CAAA,EAAA,MAAA;IAe0D,QAAA,CAAA,EAAA,MAAA;EAYD,CAAA,CAAA,EAnKxD,OAmKwD,CAnKhD,eAmKgD,EAAA,CAAA;;;;;AA+BxD,cA5LO,qBAAA,YAAiC,aA4LxC,CAAA;EAO2B,iBAAA,KAAA;EAAR,MAAA,CAAA,OAAA,EAhMD,eAgMC,CAAA,EAhMiB,OAgMjB,CAAA,IAAA,CAAA;EAAO,GAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EA5LP,OA4LO,CA5LC,eA4LD,GAAA,IAAA,CAAA;EAQhB,eAAA,CAAA,UAAsB,EAAA,MAAA,CAAA,EAhMO,OAiMnC,CAjM2C,eAkMlD,GAAA,IAAA,CAAA;8BAvLU,QAAQ,KAAK,wCACrB;;aAQQ;;;MAGP,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiDD,gBAAA;;sBAEe;;;;;;;;;;;;cAcd;MACR,QAAQ;;;;wCAuBA;;;;;MAOT,QAAQ;;;;yDAekD;;;;wDAYD;;;;iCAYvB,QAAQ;;;;kCAQP;;;;;;;MAWlC,QAAQ;;;;mBAOW,QAAQ;;;;;iBAQjB,sBAAA,SACN,gBACP"}
@@ -156,4 +156,5 @@ function createApprovalWorkflow(store) {
156
156
  }
157
157
 
158
158
  //#endregion
159
- export { ApprovalWorkflow, InMemoryApprovalStore, createApprovalWorkflow };
159
+ export { ApprovalWorkflow, InMemoryApprovalStore, createApprovalWorkflow };
160
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","names":["store: ApprovalStore","request: ApprovalRequest"],"sources":["../../src/approval/workflow.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { ToolCallInfo } from '../types';\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected';\n\n/**\n * Approval request for a tool execution.\n *\n * When a tool has `needsApproval: true` in AI SDK v6, the agent\n * will pause and wait for approval before executing the tool.\n */\nexport interface ApprovalRequest {\n /** Unique request ID */\n id: string;\n /** Agent session ID */\n sessionId: string;\n /** Agent ID */\n agentId: string;\n /** Tenant ID for scoping */\n tenantId?: string;\n /** Tool name requiring approval */\n toolName: string;\n /** Tool call ID from AI SDK */\n toolCallId: string;\n /** Tool arguments */\n toolArgs: unknown;\n /** Human-readable reason for approval */\n reason: string;\n /** When the approval was requested */\n requestedAt: Date;\n /** Current status */\n status: ApprovalStatus;\n /** Additional context payload */\n payload?: Record<string, unknown>;\n /** Who resolved the approval */\n reviewer?: string;\n /** When the approval was resolved */\n resolvedAt?: Date;\n /** Reviewer notes */\n notes?: string;\n}\n\n/**\n * Storage interface for approval requests.\n */\nexport interface ApprovalStore {\n create(request: ApprovalRequest): Promise<void>;\n get(id: string): Promise<ApprovalRequest | null>;\n getByToolCallId(toolCallId: string): Promise<ApprovalRequest | null>;\n update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void>;\n list(options?: {\n status?: ApprovalStatus;\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]>;\n}\n\n/**\n * In-memory approval store for development and testing.\n */\nexport class InMemoryApprovalStore implements ApprovalStore {\n private readonly items = new Map<string, ApprovalRequest>();\n\n async create(request: ApprovalRequest): Promise<void> {\n this.items.set(request.id, request);\n }\n\n async get(id: string): Promise<ApprovalRequest | null> {\n return this.items.get(id) ?? null;\n }\n\n async getByToolCallId(toolCallId: string): Promise<ApprovalRequest | null> {\n for (const request of this.items.values()) {\n if (request.toolCallId === toolCallId) {\n return request;\n }\n }\n return null;\n }\n\n async update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void> {\n const existing = this.items.get(id);\n if (existing) {\n this.items.set(id, { ...existing, ...updates });\n }\n }\n\n async list(options?: {\n status?: ApprovalStatus;\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]> {\n let results = [...this.items.values()];\n\n if (options?.status) {\n results = results.filter((r) => r.status === options.status);\n }\n if (options?.agentId) {\n results = results.filter((r) => r.agentId === options.agentId);\n }\n if (options?.tenantId) {\n results = results.filter((r) => r.tenantId === options.tenantId);\n }\n\n return results.sort(\n (a, b) => b.requestedAt.getTime() - a.requestedAt.getTime()\n );\n }\n\n clear(): void {\n this.items.clear();\n }\n}\n\n/**\n * Approval workflow for managing tool execution approvals.\n *\n * Integrates with AI SDK v6's `needsApproval` feature on tools.\n *\n * @example\n * ```typescript\n * const workflow = new ApprovalWorkflow();\n *\n * // When a tool needs approval\n * const request = await workflow.requestApproval({\n * sessionId: 'sess_123',\n * agentId: 'support.bot.v1',\n * toolName: 'delete_account',\n * toolCallId: 'call_abc',\n * toolArgs: { userId: 'user_123' },\n * reason: 'Account deletion requires human approval',\n * });\n *\n * // When approval is granted\n * await workflow.approve(request.id, 'admin@example.com', 'Verified identity');\n *\n * // Or rejected\n * await workflow.reject(request.id, 'admin@example.com', 'Suspicious activity');\n * ```\n */\nexport class ApprovalWorkflow {\n constructor(\n private readonly store: ApprovalStore = new InMemoryApprovalStore()\n ) {}\n\n /**\n * Request approval for a tool execution.\n */\n async requestApproval(params: {\n sessionId: string;\n agentId: string;\n tenantId?: string;\n toolName: string;\n toolCallId: string;\n toolArgs: unknown;\n reason: string;\n payload?: Record<string, unknown>;\n }): Promise<ApprovalRequest> {\n const request: ApprovalRequest = {\n id: randomUUID(),\n sessionId: params.sessionId,\n agentId: params.agentId,\n tenantId: params.tenantId,\n toolName: params.toolName,\n toolCallId: params.toolCallId,\n toolArgs: params.toolArgs,\n reason: params.reason,\n requestedAt: new Date(),\n status: 'pending',\n payload: params.payload,\n };\n\n await this.store.create(request);\n return request;\n }\n\n /**\n * Request approval from an AI SDK tool call.\n */\n async requestApprovalFromToolCall(\n toolCall: ToolCallInfo,\n context: {\n sessionId: string;\n agentId: string;\n tenantId?: string;\n reason?: string;\n }\n ): Promise<ApprovalRequest> {\n return this.requestApproval({\n sessionId: context.sessionId,\n agentId: context.agentId,\n tenantId: context.tenantId,\n toolName: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n toolArgs: toolCall.args,\n reason: context.reason ?? `Tool \"${toolCall.toolName}\" requires approval`,\n });\n }\n\n /**\n * Approve a pending request.\n */\n async approve(id: string, reviewer: string, notes?: string): Promise<void> {\n await this.store.update(id, {\n status: 'approved',\n reviewer,\n resolvedAt: new Date(),\n notes,\n });\n }\n\n /**\n * Reject a pending request.\n */\n async reject(id: string, reviewer: string, notes?: string): Promise<void> {\n await this.store.update(id, {\n status: 'rejected',\n reviewer,\n resolvedAt: new Date(),\n notes,\n });\n }\n\n /**\n * Get approval status for a tool call.\n */\n async getStatus(toolCallId: string): Promise<ApprovalStatus | null> {\n const request = await this.store.getByToolCallId(toolCallId);\n return request?.status ?? null;\n }\n\n /**\n * Check if a tool call is approved.\n */\n async isApproved(toolCallId: string): Promise<boolean> {\n const status = await this.getStatus(toolCallId);\n return status === 'approved';\n }\n\n /**\n * List pending approvals.\n */\n async listPending(options?: {\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]> {\n return this.store.list({ ...options, status: 'pending' });\n }\n\n /**\n * Get approval request by ID.\n */\n async get(id: string): Promise<ApprovalRequest | null> {\n return this.store.get(id);\n }\n}\n\n/**\n * Create an approval workflow instance.\n */\nexport function createApprovalWorkflow(\n store?: ApprovalStore\n): ApprovalWorkflow {\n return new ApprovalWorkflow(store);\n}\n"],"mappings":";;;;;;AA+DA,IAAa,wBAAb,MAA4D;CAC1D,AAAiB,wBAAQ,IAAI,KAA8B;CAE3D,MAAM,OAAO,SAAyC;AACpD,OAAK,MAAM,IAAI,QAAQ,IAAI,QAAQ;;CAGrC,MAAM,IAAI,IAA6C;AACrD,SAAO,KAAK,MAAM,IAAI,GAAG,IAAI;;CAG/B,MAAM,gBAAgB,YAAqD;AACzE,OAAK,MAAM,WAAW,KAAK,MAAM,QAAQ,CACvC,KAAI,QAAQ,eAAe,WACzB,QAAO;AAGX,SAAO;;CAGT,MAAM,OACJ,IACA,SACe;EACf,MAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,MAAI,SACF,MAAK,MAAM,IAAI,IAAI;GAAE,GAAG;GAAU,GAAG;GAAS,CAAC;;CAInD,MAAM,KAAK,SAIoB;EAC7B,IAAI,UAAU,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC;AAEtC,MAAI,SAAS,OACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,QAAQ,OAAO;AAE9D,MAAI,SAAS,QACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,YAAY,QAAQ,QAAQ;AAEhE,MAAI,SAAS,SACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,aAAa,QAAQ,SAAS;AAGlE,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,YAAY,SAAS,GAAG,EAAE,YAAY,SAAS,CAC5D;;CAGH,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BtB,IAAa,mBAAb,MAA8B;CAC5B,YACE,AAAiBA,QAAuB,IAAI,uBAAuB,EACnE;EADiB;;;;;CAMnB,MAAM,gBAAgB,QASO;EAC3B,MAAMC,UAA2B;GAC/B,IAAI,YAAY;GAChB,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB,UAAU,OAAO;GACjB,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB,QAAQ,OAAO;GACf,6BAAa,IAAI,MAAM;GACvB,QAAQ;GACR,SAAS,OAAO;GACjB;AAED,QAAM,KAAK,MAAM,OAAO,QAAQ;AAChC,SAAO;;;;;CAMT,MAAM,4BACJ,UACA,SAM0B;AAC1B,SAAO,KAAK,gBAAgB;GAC1B,WAAW,QAAQ;GACnB,SAAS,QAAQ;GACjB,UAAU,QAAQ;GAClB,UAAU,SAAS;GACnB,YAAY,SAAS;GACrB,UAAU,SAAS;GACnB,QAAQ,QAAQ,UAAU,SAAS,SAAS,SAAS;GACtD,CAAC;;;;;CAMJ,MAAM,QAAQ,IAAY,UAAkB,OAA+B;AACzE,QAAM,KAAK,MAAM,OAAO,IAAI;GAC1B,QAAQ;GACR;GACA,4BAAY,IAAI,MAAM;GACtB;GACD,CAAC;;;;;CAMJ,MAAM,OAAO,IAAY,UAAkB,OAA+B;AACxE,QAAM,KAAK,MAAM,OAAO,IAAI;GAC1B,QAAQ;GACR;GACA,4BAAY,IAAI,MAAM;GACtB;GACD,CAAC;;;;;CAMJ,MAAM,UAAU,YAAoD;AAElE,UADgB,MAAM,KAAK,MAAM,gBAAgB,WAAW,GAC5C,UAAU;;;;;CAM5B,MAAM,WAAW,YAAsC;AAErD,SADe,MAAM,KAAK,UAAU,WAAW,KAC7B;;;;;CAMpB,MAAM,YAAY,SAGa;AAC7B,SAAO,KAAK,MAAM,KAAK;GAAE,GAAG;GAAS,QAAQ;GAAW,CAAC;;;;;CAM3D,MAAM,IAAI,IAA6C;AACrD,SAAO,KAAK,MAAM,IAAI,GAAG;;;;;;AAO7B,SAAgB,uBACd,OACkB;AAClB,QAAO,IAAI,iBAAiB,MAAM"}
@@ -34,4 +34,5 @@ declare function createKnowledgeInjector(retriever?: KnowledgeRetriever): {
34
34
  listSpaces: () => string[];
35
35
  };
36
36
  //#endregion
37
- export { createKnowledgeInjector, injectStaticKnowledge };
37
+ export { createKnowledgeInjector, injectStaticKnowledge };
38
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","names":[],"sources":["../../src/knowledge/injector.ts"],"sourcesContent":[],"mappings":";;;;;;;AAeA;;;;;AA+CA;;;;;iBA/CsB,qBAAA,sCAEL,iCACH,qBACX;;;;iBA2Ca,uBAAA,aAAoC;;;;gDAKF,wBAAmB"}
@@ -54,4 +54,5 @@ function createKnowledgeInjector(retriever) {
54
54
  }
55
55
 
56
56
  //#endregion
57
- export { createKnowledgeInjector, injectStaticKnowledge };
57
+ export { createKnowledgeInjector, injectStaticKnowledge };
58
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","names":["blocks: string[]"],"sources":["../../src/knowledge/injector.ts"],"sourcesContent":["import type { KnowledgeRetriever } from '@lssm/lib.knowledge/retriever';\nimport type { AgentKnowledgeRef } from '../spec/spec';\n\n/**\n * Inject static knowledge into agent instructions.\n *\n * This function handles the \"required\" knowledge that should be\n * injected into the system prompt at agent initialization time.\n * Optional knowledge is handled by the knowledge query tool.\n *\n * @param instructions - Base agent instructions\n * @param knowledgeRefs - Knowledge references from the agent spec\n * @param retriever - Optional knowledge retriever\n * @returns Instructions with injected knowledge\n */\nexport async function injectStaticKnowledge(\n instructions: string,\n knowledgeRefs: AgentKnowledgeRef[],\n retriever?: KnowledgeRetriever\n): Promise<string> {\n if (!retriever) return instructions;\n\n const requiredRefs = knowledgeRefs.filter((ref) => ref.required);\n if (requiredRefs.length === 0) return instructions;\n\n const blocks: string[] = [];\n\n for (const ref of requiredRefs) {\n if (!retriever.supportsSpace(ref.key)) {\n console.warn(`Required knowledge space \"${ref.key}\" is not available`);\n continue;\n }\n\n try {\n const content = await retriever.getStatic(ref.key);\n if (content) {\n const header = ref.instructions\n ? `## ${ref.key}\\n${ref.instructions}`\n : `## ${ref.key}`;\n blocks.push(`${header}\\n\\n${content}`);\n }\n } catch (error) {\n console.warn(`Failed to load required knowledge \"${ref.key}\":`, error);\n }\n }\n\n if (blocks.length === 0) return instructions;\n\n return `${instructions}\n\n---\n\n# Reference Knowledge\n\nThe following information is provided for your reference. Use it to inform your responses.\n\n${blocks.join('\\n\\n---\\n\\n')}`;\n}\n\n/**\n * Create a knowledge injector instance for reuse.\n */\nexport function createKnowledgeInjector(retriever?: KnowledgeRetriever) {\n return {\n /**\n * Inject static knowledge into instructions.\n */\n inject: (instructions: string, knowledgeRefs: AgentKnowledgeRef[]) =>\n injectStaticKnowledge(instructions, knowledgeRefs, retriever),\n\n /**\n * Check if a knowledge space is available.\n */\n hasSpace: (spaceKey: string) => retriever?.supportsSpace(spaceKey) ?? false,\n\n /**\n * List available knowledge spaces.\n */\n listSpaces: () => retriever?.listSpaces() ?? [],\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,eAAsB,sBACpB,cACA,eACA,WACiB;AACjB,KAAI,CAAC,UAAW,QAAO;CAEvB,MAAM,eAAe,cAAc,QAAQ,QAAQ,IAAI,SAAS;AAChE,KAAI,aAAa,WAAW,EAAG,QAAO;CAEtC,MAAMA,SAAmB,EAAE;AAE3B,MAAK,MAAM,OAAO,cAAc;AAC9B,MAAI,CAAC,UAAU,cAAc,IAAI,IAAI,EAAE;AACrC,WAAQ,KAAK,6BAA6B,IAAI,IAAI,oBAAoB;AACtE;;AAGF,MAAI;GACF,MAAM,UAAU,MAAM,UAAU,UAAU,IAAI,IAAI;AAClD,OAAI,SAAS;IACX,MAAM,SAAS,IAAI,eACf,MAAM,IAAI,IAAI,IAAI,IAAI,iBACtB,MAAM,IAAI;AACd,WAAO,KAAK,GAAG,OAAO,MAAM,UAAU;;WAEjC,OAAO;AACd,WAAQ,KAAK,sCAAsC,IAAI,IAAI,KAAK,MAAM;;;AAI1E,KAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAO,GAAG,aAAa;;;;;;;;EAQvB,OAAO,KAAK,cAAc;;;;;AAM5B,SAAgB,wBAAwB,WAAgC;AACtE,QAAO;EAIL,SAAS,cAAsB,kBAC7B,sBAAsB,cAAc,eAAe,UAAU;EAK/D,WAAW,aAAqB,WAAW,cAAc,SAAS,IAAI;EAKtE,kBAAkB,WAAW,YAAY,IAAI,EAAE;EAChD"}
@@ -18,4 +18,5 @@ declare class InMemoryAgentMemory extends BaseAgentMemoryManager {
18
18
  private evictExpired;
19
19
  }
20
20
  //#endregion
21
- export { InMemoryAgentMemory, InMemoryAgentMemoryOptions };
21
+ export { InMemoryAgentMemory, InMemoryAgentMemoryOptions };
22
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.ts","names":[],"sources":["../../src/memory/in-memory.ts"],"sourcesContent":[],"mappings":";;;;UAaiB,0BAAA;;EAAA,UAAA,CAAA,EAAA,MAAA;AAKjB;AAKwB,cALX,mBAAA,SAA4B,sBAAA,CAKjB;EAMiB,iBAAA,KAAA;EAAR,iBAAA,UAAA;EASV,iBAAA,KAAA;EAAqB,WAAA,CAAA,OAAA,CAAA,EAfpB,0BAeoB;EAQjB,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAjBM,OAiBN,CAjBc,kBAiBd,GAAA,IAAA,CAAA;EAA4B,IAAA,CAAA,QAAA,EARhC,kBAQgC,CAAA,EARX,OAQW,CAAA,IAAA,CAAA;EAAR,SAAA,CAAA,OAAA,EAApB,iBAAoB,CAAA,EAAA,OAAA,CAAQ,mBAAR,CAAA;EA5BN,QAAA,IAAA;EAAsB,QAAA,YAAA"}
@@ -44,4 +44,5 @@ var InMemoryAgentMemory = class extends BaseAgentMemoryManager {
44
44
  };
45
45
 
46
46
  //#endregion
47
- export { InMemoryAgentMemory };
47
+ export { InMemoryAgentMemory };
48
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","names":[],"sources":["../../src/memory/in-memory.ts"],"sourcesContent":["import type { AgentSessionState } from '../types';\nimport {\n BaseAgentMemoryManager,\n type AgentMemoryEntry,\n type AgentMemorySnapshot,\n type AgentSessionMemory,\n} from './manager';\n\ninterface StoredSession {\n data: AgentSessionMemory;\n expiresAt: number;\n}\n\nexport interface InMemoryAgentMemoryOptions {\n ttlMinutes?: number;\n maxEntries?: number;\n}\n\nexport class InMemoryAgentMemory extends BaseAgentMemoryManager {\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n private readonly store = new Map<string, StoredSession>();\n\n constructor(options?: InMemoryAgentMemoryOptions) {\n super();\n this.ttlMs = (options?.ttlMinutes ?? 60) * 60 * 1000;\n this.maxEntries = options?.maxEntries ?? 250;\n }\n\n async load(sessionId: string): Promise<AgentSessionMemory | null> {\n this.evictExpired();\n const stored = this.store.get(sessionId);\n if (!stored) return null;\n stored.data.session.updatedAt = new Date();\n stored.expiresAt = Date.now() + this.ttlMs;\n return stored.data;\n }\n\n async save(snapshot: AgentSessionMemory): Promise<void> {\n this.trim(snapshot.memory.entries);\n this.store.set(snapshot.session.sessionId, {\n data: snapshot,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n async summarize(session: AgentSessionState): Promise<AgentMemorySnapshot> {\n const current =\n (await this.load(session.sessionId)) ?? this.bootstrapMemory(session);\n const content = current.memory.entries\n .slice(-10)\n .map((entry) => `- ${entry.type}: ${entry.content}`)\n .join('\\n');\n current.memory.summary = content;\n current.memory.lastSummarizedAt = new Date();\n await this.save(current);\n return current.memory;\n }\n\n private trim(entries: AgentMemoryEntry[]) {\n if (entries.length <= this.maxEntries) return;\n entries.splice(0, entries.length - this.maxEntries);\n }\n\n private evictExpired() {\n const now = Date.now();\n for (const [sessionId, stored] of this.store.entries()) {\n if (stored.expiresAt <= now) {\n this.store.delete(sessionId);\n }\n }\n }\n}\n"],"mappings":";;;AAkBA,IAAa,sBAAb,cAAyC,uBAAuB;CAC9D,AAAiB;CACjB,AAAiB;CACjB,AAAiB,wBAAQ,IAAI,KAA4B;CAEzD,YAAY,SAAsC;AAChD,SAAO;AACP,OAAK,SAAS,SAAS,cAAc,MAAM,KAAK;AAChD,OAAK,aAAa,SAAS,cAAc;;CAG3C,MAAM,KAAK,WAAuD;AAChE,OAAK,cAAc;EACnB,MAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,KAAK,QAAQ,4BAAY,IAAI,MAAM;AAC1C,SAAO,YAAY,KAAK,KAAK,GAAG,KAAK;AACrC,SAAO,OAAO;;CAGhB,MAAM,KAAK,UAA6C;AACtD,OAAK,KAAK,SAAS,OAAO,QAAQ;AAClC,OAAK,MAAM,IAAI,SAAS,QAAQ,WAAW;GACzC,MAAM;GACN,WAAW,KAAK,KAAK,GAAG,KAAK;GAC9B,CAAC;;CAGJ,MAAM,UAAU,SAA0D;EACxE,MAAM,UACH,MAAM,KAAK,KAAK,QAAQ,UAAU,IAAK,KAAK,gBAAgB,QAAQ;EACvE,MAAM,UAAU,QAAQ,OAAO,QAC5B,MAAM,IAAI,CACV,KAAK,UAAU,KAAK,MAAM,KAAK,IAAI,MAAM,UAAU,CACnD,KAAK,KAAK;AACb,UAAQ,OAAO,UAAU;AACzB,UAAQ,OAAO,mCAAmB,IAAI,MAAM;AAC5C,QAAM,KAAK,KAAK,QAAQ;AACxB,SAAO,QAAQ;;CAGjB,AAAQ,KAAK,SAA6B;AACxC,MAAI,QAAQ,UAAU,KAAK,WAAY;AACvC,UAAQ,OAAO,GAAG,QAAQ,SAAS,KAAK,WAAW;;CAGrD,AAAQ,eAAe;EACrB,MAAM,MAAM,KAAK,KAAK;AACtB,OAAK,MAAM,CAAC,WAAW,WAAW,KAAK,MAAM,SAAS,CACpD,KAAI,OAAO,aAAa,IACtB,MAAK,MAAM,OAAO,UAAU"}
@@ -38,4 +38,5 @@ declare abstract class BaseAgentMemoryManager implements AgentMemoryManager {
38
38
  }
39
39
  declare function trackMessageInMemory(manager: AgentMemoryManager | undefined, session: AgentSessionState, message: AgentMessage): void;
40
40
  //#endregion
41
- export { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, trackMessageInMemory };
41
+ export { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, trackMessageInMemory };
42
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","names":[],"sources":["../../src/memory/manager.ts"],"sourcesContent":[],"mappings":";;;UAIiB,gBAAA;;EAAA,IAAA,EAAA,MAAA,GAAA,WAAgB,GAAA,MAIpB,GACA,QAAM;EAGF,OAAA,EAAA,MAAA;EAMA,SAAA,EAVJ,IAUI;EAKA,QAAA,CAAA,EAdJ,MAcI,CAAA,MAAkB,EAAA,MAAA,CAAA;;AACR,UAZV,mBAAA,CAYU;EACV,OAAA,EAZN,gBAYM,EAAA;EAAqB,OAAA,CAAA,EAAA,MAAA;EAEzB,gBAAA,CAAA,EAZQ,IAYR;;AACF,UAVM,kBAAA,CAUN;EAA2D,OAAA,EAT3D,iBAS2D;EACzD,MAAA,EATH,mBASG;;AAEA,UARI,kBAAA,CAQJ;EACA,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EARc,OAQd,CARsB,kBAQtB,GAAA,IAAA,CAAA;EAAR,IAAA,CAAA,QAAA,EAPY,kBAOZ,CAAA,EAPiC,OAOjC,CAAA,IAAA,CAAA;EACY,MAAA,CAAA,OAAA,EANJ,iBAMI,EAAA,KAAA,EALN,IAKM,CALD,gBAKC,EAAA,IAAA,GAAA,WAAA,CAAA,GAAA;IAAoB,SAAA,CAAA,EALiC,IAKjC;EAAO,CAAA,CAAA,EAJvC,OAIuC,CAJ/B,kBAI+B,CAAA;EAyEtB,SAAA,CAAA,OAAA,EA3ET,iBA2EgC,CAAA,EA1ExC,OA0EwC,CA1EhC,mBA0EgC,GAAA,SAAA,CAAA;EACD,KAAA,CAAA,OAAA,EA1E3B,iBA0E2B,CAAA,EA1EP,OA0EO,CAAA,IAAA,CAAA;;AAClB,uBAFJ,sBAAA,YAAkC,kBAE9B,CAAA;EAAqB,SAAA,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EADX,OACW,CADH,kBACG,GAAA,IAAA,CAAA;EAGlC,SAAA,IAAA,CAAA,QAAA,EAHa,kBAGb,CAAA,EAHkC,OAGlC,CAAA,IAAA,CAAA;EACG,MAAA,CAAA,OAAA,EADH,iBACG,EAAA,KAAA,EAAL,IAAK,CAAA,gBAAA,EAAA,IAAA,GAAA,WAAA,CAAA,GAAA;IAAL,SAAA,CAAA,EAA2D,IAA3D;EAA2D,CAAA,CAAA,EACjE,OADiE,CACzD,kBADyD,CAAA;EACzD,SAAA,CAAA,QAAA,EAcC,iBAdD,CAAA,EAeR,OAfQ,CAeA,mBAfA,GAAA,SAAA,CAAA;EAAR,KAAA,CAAA,QAAA,EAmBmB,iBAnBnB,CAAA,EAmBuC,OAnBvC,CAAA,IAAA,CAAA;EAcS,UAAA,eAAA,CAAA,OAAA,EASuB,iBATvB,CAAA,EAS2C,kBAT3C;;AACT,iBAuBW,oBAAA,CAvBX,OAAA,EAwBM,kBAxBN,GAAA,SAAA,EAAA,OAAA,EAyBM,iBAzBN,EAAA,OAAA,EA0BM,YA1BN,CAAA,EAAA,IAAA"}
@@ -76,4 +76,5 @@ function trackMessageInMemory(manager, session, message) {
76
76
  }
77
77
 
78
78
  //#endregion
79
- export { BaseAgentMemoryManager, trackMessageInMemory };
79
+ export { BaseAgentMemoryManager, trackMessageInMemory };
80
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","names":["finalEntry: AgentMemoryEntry"],"sources":["../../src/memory/manager.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { ModelMessage } from 'ai';\nimport type { AgentMessage, AgentSessionState } from '../types';\n\nexport interface AgentMemoryEntry {\n id: string;\n type: 'user' | 'assistant' | 'tool' | 'system';\n content: string;\n createdAt: Date;\n metadata?: Record<string, string>;\n}\n\nexport interface AgentMemorySnapshot {\n entries: AgentMemoryEntry[];\n summary?: string;\n lastSummarizedAt?: Date;\n}\n\nexport interface AgentSessionMemory {\n session: AgentSessionState;\n memory: AgentMemorySnapshot;\n}\n\nexport interface AgentMemoryManager {\n load(sessionId: string): Promise<AgentSessionMemory | null>;\n save(snapshot: AgentSessionMemory): Promise<void>;\n append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory>;\n summarize(\n session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined>;\n prune(session: AgentSessionState): Promise<void>;\n}\n\n/**\n * Extract text content from a ModelMessage.\n * Handles both string content and array content parts.\n */\nfunction extractMessageContent(message: ModelMessage): string {\n const content = message.content;\n\n // Handle string content directly\n if (typeof content === 'string') {\n return content;\n }\n\n // Handle array content (parts)\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if ('text' in part && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n\n return '';\n}\n\n/**\n * Extract text content from an AgentMessage.\n */\nfunction extractAgentMessageContent(message: AgentMessage): string {\n const content = message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if ('text' in part && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n\n return '';\n}\n\n/**\n * Map ModelMessage role to memory entry type.\n */\nfunction roleToEntryType(\n role: ModelMessage['role']\n): 'user' | 'assistant' | 'tool' | 'system' {\n switch (role) {\n case 'assistant':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'tool';\n case 'user':\n default:\n return 'user';\n }\n}\n\nexport abstract class BaseAgentMemoryManager implements AgentMemoryManager {\n abstract load(sessionId: string): Promise<AgentSessionMemory | null>;\n abstract save(snapshot: AgentSessionMemory): Promise<void>;\n\n async append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory> {\n const current =\n (await this.load(session.sessionId)) ?? this.bootstrapMemory(session);\n const finalEntry: AgentMemoryEntry = {\n id: randomUUID(),\n createdAt: entry.createdAt ?? new Date(),\n ...entry,\n };\n current.memory.entries.push(finalEntry);\n await this.save(current);\n return current;\n }\n\n async summarize(\n _session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined> {\n return undefined;\n }\n\n async prune(_session: AgentSessionState): Promise<void> {\n // noop by default\n }\n\n protected bootstrapMemory(session: AgentSessionState): AgentSessionMemory {\n return {\n session,\n memory: {\n entries: session.messages.map<AgentMemoryEntry>((message) => ({\n id: randomUUID(),\n createdAt: new Date(),\n type: roleToEntryType(message.role),\n content: extractMessageContent(message),\n })),\n },\n };\n }\n}\n\nexport function trackMessageInMemory(\n manager: AgentMemoryManager | undefined,\n session: AgentSessionState,\n message: AgentMessage\n) {\n if (!manager) return;\n void manager.append(session, {\n type: message.role,\n content: extractAgentMessageContent(message),\n metadata: message.metadata,\n });\n}\n"],"mappings":";;;;;;;AAwCA,SAAS,sBAAsB,SAA+B;CAC5D,MAAM,UAAU,QAAQ;AAGxB,KAAI,OAAO,YAAY,SACrB,QAAO;AAIT,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QACJ,KAAK,SAAS;AACb,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AACjE,SAAO;GACP,CACD,OAAO,QAAQ,CACf,KAAK,GAAG;AAGb,QAAO;;;;;AAMT,SAAS,2BAA2B,SAA+B;CACjE,MAAM,UAAU,QAAQ;AAExB,KAAI,OAAO,YAAY,SACrB,QAAO;AAGT,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QACJ,KAAK,SAAS;AACb,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AACjE,SAAO;GACP,CACD,OAAO,QAAQ,CACf,KAAK,GAAG;AAGb,QAAO;;;;;AAMT,SAAS,gBACP,MAC0C;AAC1C,SAAQ,MAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;;;AAIb,IAAsB,yBAAtB,MAA2E;CAIzE,MAAM,OACJ,SACA,OAC6B;EAC7B,MAAM,UACH,MAAM,KAAK,KAAK,QAAQ,UAAU,IAAK,KAAK,gBAAgB,QAAQ;EACvE,MAAMA,aAA+B;GACnC,IAAI,YAAY;GAChB,WAAW,MAAM,6BAAa,IAAI,MAAM;GACxC,GAAG;GACJ;AACD,UAAQ,OAAO,QAAQ,KAAK,WAAW;AACvC,QAAM,KAAK,KAAK,QAAQ;AACxB,SAAO;;CAGT,MAAM,UACJ,UAC0C;CAI5C,MAAM,MAAM,UAA4C;CAIxD,AAAU,gBAAgB,SAAgD;AACxE,SAAO;GACL;GACA,QAAQ,EACN,SAAS,QAAQ,SAAS,KAAuB,aAAa;IAC5D,IAAI,YAAY;IAChB,2BAAW,IAAI,MAAM;IACrB,MAAM,gBAAgB,QAAQ,KAAK;IACnC,SAAS,sBAAsB,QAAQ;IACxC,EAAE,EACJ;GACF;;;AAIL,SAAgB,qBACd,SACA,SACA,SACA;AACA,KAAI,CAAC,QAAS;AACd,CAAK,QAAQ,OAAO,SAAS;EAC3B,MAAM,QAAQ;EACd,SAAS,2BAA2B,QAAQ;EAC5C,UAAU,QAAQ;EACnB,CAAC"}
@@ -51,4 +51,5 @@ declare function jsonSchemaToZod(schema: JsonSchema | Record<string, unknown>):
51
51
  */
52
52
  declare function jsonSchemaToZodSafe(schema?: Record<string, unknown>): ZodType;
53
53
  //#endregion
54
- export { jsonSchemaToZod, jsonSchemaToZodSafe };
54
+ export { jsonSchemaToZod, jsonSchemaToZodSafe };
55
+ //# sourceMappingURL=json-schema-to-zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-to-zod.d.ts","names":[],"sources":["../../src/schema/json-schema-to-zod.ts"],"sourcesContent":[],"mappings":";;;;;;AAAsC;UAK5B,UAAA,CAEoB;EAAf,IAAA,CAAA,EAAA,MAAA;EAEL,UAAA,CAAA,EAFK,MAEL,CAAA,MAAA,EAFoB,UAEpB,CAAA;EAGA,QAAA,CAAA,EAAA,MAAA,EAAA;EACA,KAAA,CAAA,EAJA,UAIA;EACA,IAAA,CAAA,EAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EAAA;EAAU,KAAA,CAAA,EAAA,OAAA;EA6BJ,KAAA,CAAA,EA/BN,UA+BqB,EAAA;EACrB,KAAA,CAAA,EA/BA,UA+BA,EAAA;EAAa,KAAA,CAAA,EA9Bb,UA8Ba,EAAA;EACpB,WAAA,CAAA,EAAA,MAAA;EAAO,OAAA,CAAA,EAAA,OAAA;EAiKM,OAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBAnKA,eAAA,SACN,aAAa,0BACpB;;;;;;;iBAiKa,mBAAA,UAA6B,0BAA0B"}
@@ -120,4 +120,5 @@ function jsonSchemaToZodSafe(schema) {
120
120
  }
121
121
 
122
122
  //#endregion
123
- export { jsonSchemaToZod, jsonSchemaToZodSafe };
123
+ export { jsonSchemaToZod, jsonSchemaToZodSafe };
124
+ //# sourceMappingURL=json-schema-to-zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-to-zod.js","names":["shape: Record<string, ZodType>"],"sources":["../../src/schema/json-schema-to-zod.ts"],"sourcesContent":["import { z, type ZodType } from 'zod';\n\n/**\n * JSON Schema type definitions for conversion.\n */\ninterface JsonSchema {\n type?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n enum?: (string | number | boolean)[];\n const?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n description?: string;\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n nullable?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Convert a JSON Schema to a Zod schema.\n *\n * Supports common JSON Schema types and constraints:\n * - string, number, integer, boolean, null\n * - object with properties and required\n * - array with items\n * - enum and const\n * - anyOf, oneOf, allOf\n * - format constraints (email, uri, uuid, date-time)\n * - numeric constraints (minimum, maximum)\n * - string constraints (minLength, maxLength, pattern)\n *\n * @param schema - JSON Schema object\n * @returns Zod schema\n */\nexport function jsonSchemaToZod(\n schema: JsonSchema | Record<string, unknown>\n): ZodType {\n const s = schema as JsonSchema;\n\n // Handle nullable\n const makeNullable = (zodSchema: ZodType): ZodType => {\n return s.nullable ? z.union([zodSchema, z.null()]) : zodSchema;\n };\n\n // Handle const\n if (s.const !== undefined) {\n return z.literal(s.const as string | number | boolean);\n }\n\n // Handle enum\n if (s.enum) {\n const values = s.enum as [\n string | number | boolean,\n ...(string | number | boolean)[],\n ];\n return makeNullable(z.enum(values.map(String) as [string, ...string[]]));\n }\n\n // Handle anyOf\n if (s.anyOf && s.anyOf.length > 0) {\n const schemas = s.anyOf.map((sub) => jsonSchemaToZod(sub));\n if (schemas.length === 1) return schemas[0]!;\n return z.union([schemas[0]!, schemas[1]!, ...schemas.slice(2)]);\n }\n\n // Handle oneOf (same as anyOf for Zod purposes)\n if (s.oneOf && s.oneOf.length > 0) {\n const schemas = s.oneOf.map((sub) => jsonSchemaToZod(sub));\n if (schemas.length === 1) return schemas[0]!;\n return z.union([schemas[0]!, schemas[1]!, ...schemas.slice(2)]);\n }\n\n // Handle allOf (intersection)\n if (s.allOf && s.allOf.length > 0) {\n const schemas = s.allOf.map((sub) => jsonSchemaToZod(sub));\n return schemas.reduce((acc, curr) => z.intersection(acc, curr));\n }\n\n // Handle type\n switch (s.type) {\n case 'string':\n return makeNullable(buildStringSchema(s));\n case 'number':\n case 'integer':\n return makeNullable(buildNumberSchema(s));\n case 'boolean':\n return makeNullable(z.boolean());\n case 'null':\n return z.null();\n case 'array':\n return makeNullable(buildArraySchema(s));\n case 'object':\n return makeNullable(buildObjectSchema(s));\n default:\n // Unknown type, accept anything\n return z.unknown();\n }\n}\n\nfunction buildStringSchema(schema: JsonSchema): ZodType {\n let zodSchema = z.string();\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n // Format constraints\n switch (schema.format) {\n case 'email':\n zodSchema = zodSchema.email();\n break;\n case 'uri':\n case 'url':\n zodSchema = zodSchema.url();\n break;\n case 'uuid':\n zodSchema = zodSchema.uuid();\n break;\n case 'date-time':\n zodSchema = zodSchema.datetime();\n break;\n case 'date':\n zodSchema = zodSchema.date();\n break;\n }\n\n // Length constraints\n if (schema.minLength !== undefined) {\n zodSchema = zodSchema.min(schema.minLength);\n }\n if (schema.maxLength !== undefined) {\n zodSchema = zodSchema.max(schema.maxLength);\n }\n\n // Pattern constraint\n if (schema.pattern) {\n zodSchema = zodSchema.regex(new RegExp(schema.pattern));\n }\n\n return zodSchema;\n}\n\nfunction buildNumberSchema(schema: JsonSchema): ZodType {\n let zodSchema = schema.type === 'integer' ? z.number().int() : z.number();\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n if (schema.minimum !== undefined) {\n zodSchema = zodSchema.min(schema.minimum);\n }\n if (schema.maximum !== undefined) {\n zodSchema = zodSchema.max(schema.maximum);\n }\n\n return zodSchema;\n}\n\nfunction buildArraySchema(schema: JsonSchema): ZodType {\n const itemsSchema = schema.items\n ? jsonSchemaToZod(schema.items)\n : z.unknown();\n let zodSchema = z.array(itemsSchema);\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n return zodSchema;\n}\n\nfunction buildObjectSchema(schema: JsonSchema): ZodType {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n\n const shape: Record<string, ZodType> = {};\n for (const [key, propSchema] of Object.entries(properties)) {\n const zodProp = jsonSchemaToZod(propSchema);\n shape[key] = required.has(key) ? zodProp : zodProp.optional();\n }\n\n let zodSchema = z.object(shape);\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n return zodSchema;\n}\n\n/**\n * Convert a JSON Schema to a Zod schema with a default empty object fallback.\n *\n * @param schema - Optional JSON Schema object\n * @returns Zod schema (defaults to empty object schema)\n */\nexport function jsonSchemaToZodSafe(schema?: Record<string, unknown>): ZodType {\n if (!schema || Object.keys(schema).length === 0) {\n return z.object({});\n }\n return jsonSchemaToZod(schema);\n}\n"],"mappings":"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"}
@@ -73,4 +73,5 @@ declare const SchemaOutput: {
73
73
  readonly text: typeof textOutput;
74
74
  };
75
75
  //#endregion
76
- export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
76
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
77
+ //# sourceMappingURL=schema-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-output.d.ts","names":[],"sources":["../../src/schema/schema-output.ts"],"sourcesContent":[],"mappings":";;;;;;;AACsC;AAWF;AACD;AACC;AASpC,KAXK,kBAAA,GAAqB,UAWQ,CACxB,OAZkC,MAAA,CAAO,MAahD,CAAA;AAaH,KAzBK,iBAAA,GAAoB,UAyBc,CAAA,OAzBI,MAAA,CAAO,KA2B/C,CAAA;AAaH,KAvCK,kBAAA,GAAqB,UAuCQ,CAAqB,OAvCX,MAAA,CAAO,MAuCsB,CAAA;AAYzE,KAlDK,gBAAA,GAAmB,UAkDG,CAAA,OAlDe,MAAA,CAAO,IAkDtB,CAAA;;;;;AAW3B;AAOA;iBA5DgB,kBAAA,SACN,0BACP;;;;;;;iBAaa,uBAAA,aACF,0BACX;;;;;;;iBAaa,kBAAA,qBAAuC;;;;;;;iBAYvC,sBAAsB,iBAAiB,IAAI;;;;;;iBAW3C,UAAA,CAAA,GAAc;;;;cAOjB"}
@@ -61,4 +61,5 @@ const SchemaOutput = {
61
61
  };
62
62
 
63
63
  //#endregion
64
- export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
64
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
65
+ //# sourceMappingURL=schema-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-output.js","names":[],"sources":["../../src/schema/schema-output.ts"],"sourcesContent":["import { Output } from 'ai';\nimport { z, type ZodType } from 'zod';\nimport { jsonSchemaToZod } from './json-schema-to-zod';\n\n/**\n * Bridge between ContractSpec SchemaModel and AI SDK Output.\n *\n * This module provides utilities to convert ContractSpec schema definitions\n * to AI SDK v6 Output.* structured output configurations.\n */\n\n// Extract return types from Output functions for explicit type annotations\ntype ObjectOutputReturn = ReturnType<typeof Output.object>;\ntype ArrayOutputReturn = ReturnType<typeof Output.array>;\ntype ChoiceOutputReturn = ReturnType<typeof Output.choice>;\ntype TextOutputReturn = ReturnType<typeof Output.text>;\n\n/**\n * Create an AI SDK Output.object from a JSON Schema.\n *\n * @param schema - JSON Schema object\n * @returns AI SDK Output configuration\n */\nexport function jsonSchemaToOutput(\n schema: Record<string, unknown>\n): ObjectOutputReturn {\n const zodSchema = jsonSchemaToZod(schema);\n return Output.object({\n schema: zodSchema,\n });\n}\n\n/**\n * Create an AI SDK Output.array from a JSON Schema items definition.\n *\n * @param itemSchema - JSON Schema for array items\n * @returns AI SDK Output configuration\n */\nexport function jsonSchemaToArrayOutput(\n itemSchema: Record<string, unknown>\n): ArrayOutputReturn {\n const zodSchema = jsonSchemaToZod(itemSchema);\n return Output.array({\n element: zodSchema,\n });\n}\n\n/**\n * Create an AI SDK Output.choice from enum values.\n *\n * @param choices - Array of choice values\n * @returns AI SDK Output configuration\n */\nexport function enumToChoiceOutput(choices: string[]): ChoiceOutputReturn {\n return Output.choice({\n options: choices as [string, ...string[]],\n });\n}\n\n/**\n * Create an AI SDK Output from a Zod schema directly.\n *\n * @param schema - Zod schema\n * @returns AI SDK Output configuration\n */\nexport function zodToOutput<T extends ZodType>(schema: T): ObjectOutputReturn {\n return Output.object({\n schema,\n });\n}\n\n/**\n * Create a simple text output configuration.\n *\n * @returns AI SDK Output configuration for text\n */\nexport function textOutput(): TextOutputReturn {\n return Output.text();\n}\n\n/**\n * Output builder that can be used fluently.\n */\nexport const SchemaOutput = {\n /**\n * Create an object output from JSON Schema.\n */\n fromJsonSchema: jsonSchemaToOutput,\n\n /**\n * Create an array output from JSON Schema.\n */\n arrayFromJsonSchema: jsonSchemaToArrayOutput,\n\n /**\n * Create a choice output from enum.\n */\n fromEnum: enumToChoiceOutput,\n\n /**\n * Create an output from Zod schema.\n */\n fromZod: zodToOutput,\n\n /**\n * Create a text output.\n */\n text: textOutput,\n} as const;\n"],"mappings":";;;;;;;;;;;AAuBA,SAAgB,mBACd,QACoB;CACpB,MAAM,YAAY,gBAAgB,OAAO;AACzC,QAAO,OAAO,OAAO,EACnB,QAAQ,WACT,CAAC;;;;;;;;AASJ,SAAgB,wBACd,YACmB;CACnB,MAAM,YAAY,gBAAgB,WAAW;AAC7C,QAAO,OAAO,MAAM,EAClB,SAAS,WACV,CAAC;;;;;;;;AASJ,SAAgB,mBAAmB,SAAuC;AACxE,QAAO,OAAO,OAAO,EACnB,SAAS,SACV,CAAC;;;;;;;;AASJ,SAAgB,YAA+B,QAA+B;AAC5E,QAAO,OAAO,OAAO,EACnB,QACD,CAAC;;;;;;;AAQJ,SAAgB,aAA+B;AAC7C,QAAO,OAAO,MAAM;;;;;AAMtB,MAAa,eAAe;CAI1B,gBAAgB;CAKhB,qBAAqB;CAKrB,UAAU;CAKV,SAAS;CAKT,MAAM;CACP"}
@@ -70,4 +70,5 @@ declare function createInMemorySessionStore(): AgentSessionStore;
70
70
  */
71
71
  declare function generateSessionId(): string;
72
72
  //#endregion
73
- export { AgentSessionStore, InMemorySessionStore, createInMemorySessionStore, generateSessionId };
73
+ export { AgentSessionStore, InMemorySessionStore, createInMemorySessionStore, generateSessionId };
74
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","names":[],"sources":["../../src/session/store.ts"],"sourcesContent":[],"mappings":";;;;;;;AASA;;;;AAUa,UAVI,iBAAA,CAUJ;EACA;;;EAKyB,GAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAZZ,OAYY,CAZJ,iBAYI,GAAA,IAAA,CAAA;EAAsB;;;EAYlC,MAAA,CAAA,OAAA,EAlBb,IAkBa,CAlBR,iBAkBQ,EAAA,WAAA,GAAA,WAAA,CAAA,CAAA,EAjBrB,OAiBqB,CAjBb,iBAiBa,CAAA;EAAL;;;EAMQ,UAAA,CAAA,SAAA,EAAA,MAAA,EAAA,IAAA,EAlBS,UAkBT,CAlBoB,OAkBpB,CAAA,CAAA,EAlB+B,OAkB/B,CAAA,IAAA,CAAA;EAK2B;;;EAKN,aAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAvBN,YAuBM,CAAA,EAvBS,OAuBT,CAAA,IAAA,CAAA;EAAO;AAMzD;;EAGgC,MAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAzBnB,OAyBmB,CAzBX,IAyBW,CAzBN,iBAyBM,EAAA,QAAA,GAAA,UAAA,CAAA,CAAA,CAAA,EAxB3B,OAwB2B,CAAA,IAAA,CAAA;EAKd;;;EACb,MAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAzBwB,OAyBxB,CAAA,OAAA,CAAA;EAagB;;;EAS6B,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EA1CF,OA0CE,CA1CM,iBA0CN,EAAA,CAAA;EAAe;;;EAUpD,YAAA,CAAA,QAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EA/CqC,OA+CrC,CA/C6C,iBA+C7C,EAAA,CAAA;;;;;AA+BA,cAxEA,oBAAA,YAAgC,iBAwEhC,CAAA;EAAR,iBAAA,QAAA;EAxEwC,GAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAGb,OAHa,CAGL,iBAHK,GAAA,IAAA,CAAA;EAAiB,MAAA,CAAA,OAAA,EAQjD,IARiD,CAQ5C,iBAR4C,EAAA,WAAA,GAAA,WAAA,CAAA,CAAA,EASzD,OATyD,CASjD,iBATiD,CAAA;EAgG9C,UAAA,CAAA,SAAA,EAAA,MAAA,EAA0B,IAAA,EA1EhC,UA0EoC,CA1EzB,OA0EyB,CAAA,CAAA,EAzEzC,OAyE0D,CAAA,IAAA,CAAA;EAO/C,aAAA,CAAA,SAAiB,EAAA,MAAA,EAAA,OAAA,EAxEiB,YAwEjB,CAAA,EAxEgC,OAwEhC,CAAA,IAAA,CAAA;qCA9DpB,QAAQ,KAAK,6CACrB;6BAO8B;gDAO9B,QAAQ;kDAgBR,QAAQ;;;;;;;;;iBAwBG,0BAAA,CAAA,GAA8B;;;;iBAO9B,iBAAA,CAAA"}
@@ -75,4 +75,5 @@ function generateSessionId() {
75
75
  }
76
76
 
77
77
  //#endregion
78
- export { InMemorySessionStore, createInMemorySessionStore, generateSessionId };
78
+ export { InMemorySessionStore, createInMemorySessionStore, generateSessionId };
79
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","names":["fullSession: AgentSessionState","results: AgentSessionState[]"],"sources":["../../src/session/store.ts"],"sourcesContent":["import type { ModelMessage, StepResult, ToolSet } from 'ai';\nimport type { AgentSessionState } from '../types';\n\n/**\n * Interface for persisting agent session state.\n *\n * Implementations can use in-memory storage, databases,\n * or external services like Redis.\n */\nexport interface AgentSessionStore {\n /**\n * Get a session by ID.\n */\n get(sessionId: string): Promise<AgentSessionState | null>;\n\n /**\n * Create a new session.\n */\n create(\n session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>\n ): Promise<AgentSessionState>;\n\n /**\n * Append a step to a session.\n */\n appendStep(sessionId: string, step: StepResult<ToolSet>): Promise<void>;\n\n /**\n * Append a message to a session.\n */\n appendMessage(sessionId: string, message: ModelMessage): Promise<void>;\n\n /**\n * Update session properties.\n */\n update(\n sessionId: string,\n updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>\n ): Promise<void>;\n\n /**\n * Delete a session.\n */\n delete(sessionId: string): Promise<boolean>;\n\n /**\n * List sessions by agent ID.\n */\n listByAgent(agentId: string, limit?: number): Promise<AgentSessionState[]>;\n\n /**\n * List sessions by tenant ID.\n */\n listByTenant(tenantId: string, limit?: number): Promise<AgentSessionState[]>;\n}\n\n/**\n * In-memory session store for development and testing.\n */\nexport class InMemorySessionStore implements AgentSessionStore {\n private readonly sessions = new Map<string, AgentSessionState>();\n\n async get(sessionId: string): Promise<AgentSessionState | null> {\n return this.sessions.get(sessionId) ?? null;\n }\n\n async create(\n session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>\n ): Promise<AgentSessionState> {\n const now = new Date();\n const fullSession: AgentSessionState = {\n ...session,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(session.sessionId, fullSession);\n return fullSession;\n }\n\n async appendStep(\n sessionId: string,\n step: StepResult<ToolSet>\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.steps.push(step);\n session.updatedAt = new Date();\n }\n }\n\n async appendMessage(sessionId: string, message: ModelMessage): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.messages.push(message);\n session.updatedAt = new Date();\n }\n }\n\n async update(\n sessionId: string,\n updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n Object.assign(session, updates, { updatedAt: new Date() });\n }\n }\n\n async delete(sessionId: string): Promise<boolean> {\n return this.sessions.delete(sessionId);\n }\n\n async listByAgent(\n agentId: string,\n limit = 100\n ): Promise<AgentSessionState[]> {\n const results: AgentSessionState[] = [];\n for (const session of this.sessions.values()) {\n if (session.agentId === agentId) {\n results.push(session);\n if (results.length >= limit) break;\n }\n }\n return results.sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()\n );\n }\n\n async listByTenant(\n tenantId: string,\n limit = 100\n ): Promise<AgentSessionState[]> {\n const results: AgentSessionState[] = [];\n for (const session of this.sessions.values()) {\n if (session.tenantId === tenantId) {\n results.push(session);\n if (results.length >= limit) break;\n }\n }\n return results.sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()\n );\n }\n\n /**\n * Clear all sessions (for testing).\n */\n clear(): void {\n this.sessions.clear();\n }\n}\n\n/**\n * Create an in-memory session store.\n */\nexport function createInMemorySessionStore(): AgentSessionStore {\n return new InMemorySessionStore();\n}\n\n/**\n * Generate a unique session ID.\n */\nexport function generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n}\n"],"mappings":";;;;AA2DA,IAAa,uBAAb,MAA+D;CAC7D,AAAiB,2BAAW,IAAI,KAAgC;CAEhE,MAAM,IAAI,WAAsD;AAC9D,SAAO,KAAK,SAAS,IAAI,UAAU,IAAI;;CAGzC,MAAM,OACJ,SAC4B;EAC5B,MAAM,sBAAM,IAAI,MAAM;EACtB,MAAMA,cAAiC;GACrC,GAAG;GACH,WAAW;GACX,WAAW;GACZ;AACD,OAAK,SAAS,IAAI,QAAQ,WAAW,YAAY;AACjD,SAAO;;CAGT,MAAM,WACJ,WACA,MACe;EACf,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,SAAS;AACX,WAAQ,MAAM,KAAK,KAAK;AACxB,WAAQ,4BAAY,IAAI,MAAM;;;CAIlC,MAAM,cAAc,WAAmB,SAAsC;EAC3E,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,SAAS;AACX,WAAQ,SAAS,KAAK,QAAQ;AAC9B,WAAQ,4BAAY,IAAI,MAAM;;;CAIlC,MAAM,OACJ,WACA,SACe;EACf,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,QACF,QAAO,OAAO,SAAS,SAAS,EAAE,2BAAW,IAAI,MAAM,EAAE,CAAC;;CAI9D,MAAM,OAAO,WAAqC;AAChD,SAAO,KAAK,SAAS,OAAO,UAAU;;CAGxC,MAAM,YACJ,SACA,QAAQ,KACsB;EAC9B,MAAMC,UAA+B,EAAE;AACvC,OAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,CAC1C,KAAI,QAAQ,YAAY,SAAS;AAC/B,WAAQ,KAAK,QAAQ;AACrB,OAAI,QAAQ,UAAU,MAAO;;AAGjC,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CACxD;;CAGH,MAAM,aACJ,UACA,QAAQ,KACsB;EAC9B,MAAMA,UAA+B,EAAE;AACvC,OAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,CAC1C,KAAI,QAAQ,aAAa,UAAU;AACjC,WAAQ,KAAK,QAAQ;AACrB,OAAI,QAAQ,UAAU,MAAO;;AAGjC,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CACxD;;;;;CAMH,QAAc;AACZ,OAAK,SAAS,OAAO;;;;;;AAOzB,SAAgB,6BAAgD;AAC9D,QAAO,IAAI,sBAAsB;;;;;AAMnC,SAAgB,oBAA4B;AAC1C,QAAO,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG"}
@@ -74,4 +74,5 @@ declare class AgentRegistry {
74
74
  */
75
75
  declare function createAgentRegistry(): AgentRegistry;
76
76
  //#endregion
77
- export { AgentRegistry, createAgentRegistry };
77
+ export { AgentRegistry, createAgentRegistry };
78
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/spec/registry.ts"],"sourcesContent":[],"mappings":";;;;;;AAQA;;;AAuDuC,cAvD1B,aAAA,CAuD0B;EA0BI,iBAAA,KAAA;EA0Bd;;AAqB7B;;;;;iBAtHiB;;;;;;;;;;;;UAuBP;;;;;;;;;;;;uCAsB6B;;;;;;;;;2CA0BI;;;;;;;;;;;;;;6BA0Bd;;;;;;;;;iBAqBb,mBAAA,CAAA,GAAuB"}
@@ -113,4 +113,5 @@ function createAgentRegistry() {
113
113
  }
114
114
 
115
115
  //#endregion
116
- export { AgentRegistry, createAgentRegistry };
116
+ export { AgentRegistry, createAgentRegistry };
117
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","names":["latest: AgentSpec | undefined","versions: AgentSpec[]"],"sources":["../../src/spec/registry.ts"],"sourcesContent":["import type { AgentSpec } from './spec';\nimport { agentKey } from './spec';\n\n/**\n * Registry for managing agent specifications.\n *\n * Provides registration, lookup, and version management for agent specs.\n */\nexport class AgentRegistry {\n private readonly specs = new Map<string, AgentSpec>();\n\n /**\n * Register an agent specification.\n *\n * @param spec - The agent specification to register\n * @returns This registry for chaining\n * @throws Error if the spec is already registered\n */\n register(spec: AgentSpec): this {\n const key = agentKey(spec.meta);\n if (this.specs.has(key)) {\n throw new Error(`Duplicate agent spec registered for ${key}`);\n }\n this.specs.set(key, spec);\n return this;\n }\n\n /**\n * Unregister an agent specification.\n *\n * @param name - Agent name\n * @param version - Agent version\n * @returns True if the spec was removed\n */\n unregister(name: string, version: number): boolean {\n return this.specs.delete(`${name}.v${version}`);\n }\n\n /**\n * List all registered agent specifications.\n */\n list(): AgentSpec[] {\n return [...this.specs.values()];\n }\n\n /**\n * List all unique agent names (without versions).\n */\n listNames(): string[] {\n const names = new Set<string>();\n for (const spec of this.specs.values()) {\n names.add(spec.meta.name);\n }\n return [...names];\n }\n\n /**\n * Get an agent specification by name and optional version.\n *\n * @param name - Agent name\n * @param version - Optional version. If omitted, returns the latest version.\n * @returns The agent spec or undefined if not found\n */\n get(name: string, version?: number): AgentSpec | undefined {\n if (version != null) {\n return this.specs.get(`${name}.v${version}`);\n }\n\n // Find latest version\n let latest: AgentSpec | undefined;\n let maxVersion = -Infinity;\n for (const spec of this.specs.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > maxVersion) {\n latest = spec;\n maxVersion = spec.meta.version;\n }\n }\n return latest;\n }\n\n /**\n * Get an agent specification or throw if not found.\n *\n * @param name - Agent name\n * @param version - Optional version\n * @returns The agent spec\n * @throws Error if the spec is not found\n */\n require(name: string, version?: number): AgentSpec {\n const spec = this.get(name, version);\n if (!spec) {\n throw new Error(\n `Agent spec not found for ${name}${version != null ? `.v${version}` : ''}`\n );\n }\n return spec;\n }\n\n /**\n * Check if an agent is registered.\n *\n * @param name - Agent name\n * @param version - Optional version\n */\n has(name: string, version?: number): boolean {\n return this.get(name, version) !== undefined;\n }\n\n /**\n * Get all versions of an agent.\n *\n * @param name - Agent name\n * @returns Array of specs sorted by version (ascending)\n */\n getVersions(name: string): AgentSpec[] {\n const versions: AgentSpec[] = [];\n for (const spec of this.specs.values()) {\n if (spec.meta.name === name) {\n versions.push(spec);\n }\n }\n return versions.sort((a, b) => a.meta.version - b.meta.version);\n }\n\n /**\n * Clear all registered specs.\n */\n clear(): void {\n this.specs.clear();\n }\n}\n\n/**\n * Create a new agent registry.\n */\nexport function createAgentRegistry(): AgentRegistry {\n return new AgentRegistry();\n}\n"],"mappings":";;;;;;;;AAQA,IAAa,gBAAb,MAA2B;CACzB,AAAiB,wBAAQ,IAAI,KAAwB;;;;;;;;CASrD,SAAS,MAAuB;EAC9B,MAAM,MAAM,SAAS,KAAK,KAAK;AAC/B,MAAI,KAAK,MAAM,IAAI,IAAI,CACrB,OAAM,IAAI,MAAM,uCAAuC,MAAM;AAE/D,OAAK,MAAM,IAAI,KAAK,KAAK;AACzB,SAAO;;;;;;;;;CAUT,WAAW,MAAc,SAA0B;AACjD,SAAO,KAAK,MAAM,OAAO,GAAG,KAAK,IAAI,UAAU;;;;;CAMjD,OAAoB;AAClB,SAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC;;;;;CAMjC,YAAsB;EACpB,MAAM,wBAAQ,IAAI,KAAa;AAC/B,OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,CACpC,OAAM,IAAI,KAAK,KAAK,KAAK;AAE3B,SAAO,CAAC,GAAG,MAAM;;;;;;;;;CAUnB,IAAI,MAAc,SAAyC;AACzD,MAAI,WAAW,KACb,QAAO,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,UAAU;EAI9C,IAAIA;EACJ,IAAI,aAAa;AACjB,OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE;AACtC,OAAI,KAAK,KAAK,SAAS,KAAM;AAC7B,OAAI,KAAK,KAAK,UAAU,YAAY;AAClC,aAAS;AACT,iBAAa,KAAK,KAAK;;;AAG3B,SAAO;;;;;;;;;;CAWT,QAAQ,MAAc,SAA6B;EACjD,MAAM,OAAO,KAAK,IAAI,MAAM,QAAQ;AACpC,MAAI,CAAC,KACH,OAAM,IAAI,MACR,4BAA4B,OAAO,WAAW,OAAO,KAAK,YAAY,KACvE;AAEH,SAAO;;;;;;;;CAST,IAAI,MAAc,SAA2B;AAC3C,SAAO,KAAK,IAAI,MAAM,QAAQ,KAAK;;;;;;;;CASrC,YAAY,MAA2B;EACrC,MAAMC,WAAwB,EAAE;AAChC,OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,CACpC,KAAI,KAAK,KAAK,SAAS,KACrB,UAAS,KAAK,KAAK;AAGvB,SAAO,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ;;;;;CAMjE,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;;AAOtB,SAAgB,sBAAqC;AACnD,QAAO,IAAI,eAAe"}
@@ -126,4 +126,5 @@ declare function defineAgent(spec: AgentSpec): AgentSpec;
126
126
  */
127
127
  declare function agentKey(meta: AgentMeta): string;
128
128
  //#endregion
129
- export { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentSpec, AgentToolConfig, agentKey, defineAgent };
129
+ export { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentSpec, AgentToolConfig, agentKey, defineAgent };
130
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/spec/spec.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAOA;AAQiB,UARA,SAAA,SAAkB,aAwBxB,CAAA;EAMM,IAAA,EAAA,MAAA;EAgBA,OAAA,EAAA,MAAA;AAcjB;AAUA;AAcA;AAUA;AACQ,UAvFS,eAAA,CAuFT;EAQC;EAEE,IAAA,EAAA,MAAA;EAEG;EAEH,WAAA,CAAA,EAAA,MAAA;EAAW;EAYN,MAAA,CAAA,EA3GL,MA2GgB,CAAA,MAAA,EAAA,OAAO,CAAA;EA+BlB;;;;;;;;;WAhIL;;;;;UAMM,iBAAA;;;;;;aAMJ;;;;;;;;;UAUI,iBAAA;;;;;;;;;;;;;UAcA,qBAAA;;;;;;;;;UAUA,qBAAA;;;;;;;;;;;;;UAcA,WAAA;eACF;eACA;;;;;;;UAQE,SAAA;QACT;;;;;;;;SAQC;;WAEE;;cAEG;;WAEH;;;;;;;;;;;iBAYK,WAAA,OAAkB,YAAY;;;;iBA+B9B,QAAA,OAAe"}
package/dist/spec/spec.js CHANGED
@@ -26,4 +26,5 @@ function agentKey(meta) {
26
26
  }
27
27
 
28
28
  //#endregion
29
- export { agentKey, defineAgent };
29
+ export { agentKey, defineAgent };
30
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","names":[],"sources":["../../src/spec/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '@lssm/lib.contracts/ownership';\nimport type { KnowledgeCategory } from '@lssm/lib.contracts/knowledge/spec';\nimport type { PolicyRef } from '@lssm/lib.contracts/policy/spec';\n\n/**\n * Metadata for an agent specification.\n */\nexport interface AgentMeta extends OwnerShipMeta {\n name: string;\n version: number;\n}\n\n/**\n * Configuration for a tool that an agent can use.\n */\nexport interface AgentToolConfig {\n /** Tool name (unique within the agent) */\n name: string;\n /** Human-readable description for the LLM */\n description?: string;\n /** JSON Schema fragment for tool parameters */\n schema?: Record<string, unknown>;\n /** Optional cooldown in milliseconds between invocations */\n cooldownMs?: number;\n /** Maximum execution time before timeout */\n timeoutMs?: number;\n /** Whether the tool can be executed without human approval (AI SDK needsApproval = !automationSafe) */\n automationSafe?: boolean;\n /** Explicit approval requirement (overrides automationSafe) */\n requiresApproval?: boolean;\n /** Optional policy guard that must evaluate to allow the tool call */\n policy?: PolicyRef;\n}\n\n/**\n * Reference to a knowledge space that the agent can access.\n */\nexport interface AgentKnowledgeRef {\n /** Knowledge space key */\n key: string;\n /** Optional specific version */\n version?: number;\n /** Filter by knowledge category */\n category?: KnowledgeCategory;\n /** Whether the knowledge is required (static injection) or optional (dynamic RAG) */\n required?: boolean;\n /** Additional instructions appended when the space is available */\n instructions?: string;\n}\n\n/**\n * Memory configuration for agent session persistence.\n */\nexport interface AgentMemoryConfig {\n /** Maximum entries to keep in memory */\n maxEntries?: number;\n /** Time-to-live in minutes */\n ttlMinutes?: number;\n /** Number of messages before triggering summarization */\n summaryTrigger?: number;\n /** Whether to persist to long-term storage */\n persistLongTerm?: boolean;\n}\n\n/**\n * Confidence policy for agent responses.\n */\nexport interface AgentConfidencePolicy {\n /** Minimum acceptable confidence before escalation. Defaults to 0.7 */\n min?: number;\n /** Default value used when provider does not report confidence */\n default?: number;\n}\n\n/**\n * Escalation policy for handling uncertain or failed agent responses.\n */\nexport interface AgentEscalationPolicy {\n /** Auto escalate when confidence < threshold */\n confidenceThreshold?: number;\n /** Escalate when a tool throws irrecoverable errors */\n onToolFailure?: boolean;\n /** Escalate when iteration budget exceeded */\n onTimeout?: boolean;\n /** Optional human approval workflow ID */\n approvalWorkflow?: string;\n}\n\n/**\n * Combined policy configuration for an agent.\n */\nexport interface AgentPolicy {\n confidence?: AgentConfidencePolicy;\n escalation?: AgentEscalationPolicy;\n /** Feature flags to apply to this agent */\n flags?: string[];\n}\n\n/**\n * Complete specification for a ContractSpec agent.\n */\nexport interface AgentSpec {\n meta: AgentMeta;\n /** System instructions for the agent */\n instructions: string;\n /** Human-readable description */\n description?: string;\n /** Tags for categorization */\n tags?: string[];\n /** Tools the agent can use */\n tools: AgentToolConfig[];\n /** Memory/session configuration */\n memory?: AgentMemoryConfig;\n /** Knowledge spaces the agent can access */\n knowledge?: AgentKnowledgeRef[];\n /** Policy configuration */\n policy?: AgentPolicy;\n /** Maximum steps per generation (defaults to 10) */\n maxSteps?: number;\n}\n\n/**\n * Define and validate an agent specification.\n *\n * @param spec - The agent specification\n * @returns The frozen, validated specification\n * @throws Error if the specification is invalid\n */\nexport function defineAgent(spec: AgentSpec): AgentSpec {\n if (!spec.meta?.name) {\n throw new Error('Agent name is required');\n }\n if (!Number.isFinite(spec.meta.version)) {\n throw new Error(`Agent ${spec.meta.name} is missing a numeric version`);\n }\n if (!spec.instructions?.trim()) {\n throw new Error(`Agent ${spec.meta.name} requires instructions`);\n }\n if (!spec.tools?.length) {\n throw new Error(`Agent ${spec.meta.name} must expose at least one tool`);\n }\n\n // Validate tool names are unique\n const toolNames = new Set<string>();\n for (const tool of spec.tools) {\n if (toolNames.has(tool.name)) {\n throw new Error(\n `Agent ${spec.meta.name} has duplicate tool name: ${tool.name}`\n );\n }\n toolNames.add(tool.name);\n }\n\n return Object.freeze(spec);\n}\n\n/**\n * Generate a unique key for an agent spec.\n */\nexport function agentKey(meta: AgentMeta): string {\n return `${meta.name}.v${meta.version}`;\n}\n"],"mappings":";;;;;;;;AAgIA,SAAgB,YAAY,MAA4B;AACtD,KAAI,CAAC,KAAK,MAAM,KACd,OAAM,IAAI,MAAM,yBAAyB;AAE3C,KAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,CACrC,OAAM,IAAI,MAAM,SAAS,KAAK,KAAK,KAAK,+BAA+B;AAEzE,KAAI,CAAC,KAAK,cAAc,MAAM,CAC5B,OAAM,IAAI,MAAM,SAAS,KAAK,KAAK,KAAK,wBAAwB;AAElE,KAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MAAM,SAAS,KAAK,KAAK,KAAK,gCAAgC;CAI1E,MAAM,4BAAY,IAAI,KAAa;AACnC,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,MAAI,UAAU,IAAI,KAAK,KAAK,CAC1B,OAAM,IAAI,MACR,SAAS,KAAK,KAAK,KAAK,4BAA4B,KAAK,OAC1D;AAEH,YAAU,IAAI,KAAK,KAAK;;AAG1B,QAAO,OAAO,OAAO,KAAK;;;;;AAM5B,SAAgB,SAAS,MAAyB;AAChD,QAAO,GAAG,KAAK,KAAK,IAAI,KAAK"}
@@ -69,4 +69,5 @@ declare function createInMemoryTelemetryCollector(): InMemoryTelemetryCollector;
69
69
  */
70
70
  declare const noopTelemetryCollector: TelemetryCollector;
71
71
  //#endregion
72
- export { InMemoryTelemetryCollector, OperationMetricSample, TelemetryCollector, createInMemoryTelemetryCollector, noopTelemetryCollector, trackAgentStep };
72
+ export { InMemoryTelemetryCollector, OperationMetricSample, TelemetryCollector, createInMemoryTelemetryCollector, noopTelemetryCollector, trackAgentStep };
73
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../src/telemetry/adapter.ts"],"sourcesContent":[],"mappings":";;;;;;AAKA;AAgBiB,UAhBA,qBAAA,CAoBC;EAyBI,SAAA,EAAA;IACT,IAAA,EAAA,MAAA;IAEM,OAAA,EAAA,MAAA;EAAX,CAAA;EAEL,UAAA,EAAA,MAAA;EAAO,OAAA,EAAA,OAAA;EAyCG,SAAA,EAvFA,IAuFA;EAGW,QAAA,CAAA,EAzFX,MAyFW,CAAA,MAAA,EAAA,OAAA,CAAA;;;;;;AA6BxB;AAOA;;;UAlHiB,kBAAA;;;;kBAIC,wBAAwB;;;;;;;;;;;;;iBAyBpB,cAAA,YACT,2CAEL,WAAW,gCAEhB;;;;cAyCU,0BAAA,YAAsC;;kBAG3B,wBAAwB;;;;gBAOhC;;;;iDAOiC;;;;;;;;;iBAejC,gCAAA,CAAA,GAAoC;;;;cAOvC,wBAAwB"}
@@ -99,4 +99,5 @@ function createInMemoryTelemetryCollector() {
99
99
  const noopTelemetryCollector = { collect: async () => {} };
100
100
 
101
101
  //#endregion
102
- export { InMemoryTelemetryCollector, createInMemoryTelemetryCollector, noopTelemetryCollector, trackAgentStep };
102
+ export { InMemoryTelemetryCollector, createInMemoryTelemetryCollector, noopTelemetryCollector, trackAgentStep };
103
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":["toolSample: OperationMetricSample","stepSample: OperationMetricSample","noopTelemetryCollector: TelemetryCollector"],"sources":["../../src/telemetry/adapter.ts"],"sourcesContent":["import type { StepResult, LanguageModelUsage, ToolSet } from 'ai';\n\n/**\n * Metric sample compatible with @lssm/lib.evolution OperationMetricSample.\n */\nexport interface OperationMetricSample {\n operation: { name: string; version: number };\n durationMs: number;\n success: boolean;\n timestamp: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Interface for collecting telemetry metrics.\n *\n * Implementations can send metrics to:\n * - @lssm/lib.evolution for self-improvement\n * - PostHog for analytics\n * - Custom monitoring systems\n */\nexport interface TelemetryCollector {\n /**\n * Collect a metric sample.\n */\n collect(sample: OperationMetricSample): Promise<void>;\n}\n\n/**\n * Parse agent ID into name and version.\n */\nfunction parseAgentId(agentId: string): { name: string; version: number } {\n const match = agentId.match(/^(.+)\\.v(\\d+)$/);\n if (match) {\n return { name: match[1]!, version: parseInt(match[2]!, 10) };\n }\n return { name: agentId, version: 1 };\n}\n\n/**\n * Track an agent step for telemetry.\n *\n * Called from ContractSpecAgent.onStepFinish to feed metrics\n * to the evolution engine.\n *\n * @param collector - Telemetry collector\n * @param agentId - Agent identifier (e.g., \"support.bot.v1\")\n * @param step - AI SDK step result\n * @param durationMs - Optional step duration in milliseconds\n */\nexport async function trackAgentStep(\n collector: TelemetryCollector,\n agentId: string,\n step: StepResult<ToolSet>,\n durationMs?: number\n): Promise<void> {\n const { name, version } = parseAgentId(agentId);\n\n // Track tool invocations\n for (const toolCall of step.toolCalls ?? []) {\n const toolSample: OperationMetricSample = {\n operation: { name: `${name}.${toolCall.toolName}`, version },\n durationMs: durationMs ?? 0,\n success:\n step.toolResults?.some(\n (r) => r.toolCallId === toolCall.toolCallId && r.output !== undefined\n ) ?? false,\n timestamp: new Date(),\n metadata: {\n agentId,\n toolName: toolCall.toolName,\n finishReason: step.finishReason,\n },\n };\n await collector.collect(toolSample);\n }\n\n // Track overall step\n const stepSample: OperationMetricSample = {\n operation: { name, version },\n durationMs: durationMs ?? 0,\n success: step.finishReason !== 'error',\n timestamp: new Date(),\n metadata: {\n agentId,\n finishReason: step.finishReason,\n tokenUsage: step.usage,\n toolCallCount: step.toolCalls?.length ?? 0,\n },\n };\n await collector.collect(stepSample);\n}\n\n/**\n * In-memory telemetry collector for testing.\n */\nexport class InMemoryTelemetryCollector implements TelemetryCollector {\n private readonly samples: OperationMetricSample[] = [];\n\n async collect(sample: OperationMetricSample): Promise<void> {\n this.samples.push(sample);\n }\n\n /**\n * Get all collected samples.\n */\n getSamples(): OperationMetricSample[] {\n return [...this.samples];\n }\n\n /**\n * Get samples for a specific operation.\n */\n getSamplesForOperation(operationName: string): OperationMetricSample[] {\n return this.samples.filter((s) => s.operation.name === operationName);\n }\n\n /**\n * Clear all samples.\n */\n clear(): void {\n this.samples.length = 0;\n }\n}\n\n/**\n * Create an in-memory telemetry collector.\n */\nexport function createInMemoryTelemetryCollector(): InMemoryTelemetryCollector {\n return new InMemoryTelemetryCollector();\n}\n\n/**\n * No-op telemetry collector that discards all metrics.\n */\nexport const noopTelemetryCollector: TelemetryCollector = {\n collect: async () => {},\n};\n"],"mappings":";;;;AA+BA,SAAS,aAAa,SAAoD;CACxE,MAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAC7C,KAAI,MACF,QAAO;EAAE,MAAM,MAAM;EAAK,SAAS,SAAS,MAAM,IAAK,GAAG;EAAE;AAE9D,QAAO;EAAE,MAAM;EAAS,SAAS;EAAG;;;;;;;;;;;;;AActC,eAAsB,eACpB,WACA,SACA,MACA,YACe;CACf,MAAM,EAAE,MAAM,YAAY,aAAa,QAAQ;AAG/C,MAAK,MAAM,YAAY,KAAK,aAAa,EAAE,EAAE;EAC3C,MAAMA,aAAoC;GACxC,WAAW;IAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAAY;IAAS;GAC5D,YAAY,cAAc;GAC1B,SACE,KAAK,aAAa,MACf,MAAM,EAAE,eAAe,SAAS,cAAc,EAAE,WAAW,OAC7D,IAAI;GACP,2BAAW,IAAI,MAAM;GACrB,UAAU;IACR;IACA,UAAU,SAAS;IACnB,cAAc,KAAK;IACpB;GACF;AACD,QAAM,UAAU,QAAQ,WAAW;;CAIrC,MAAMC,aAAoC;EACxC,WAAW;GAAE;GAAM;GAAS;EAC5B,YAAY,cAAc;EAC1B,SAAS,KAAK,iBAAiB;EAC/B,2BAAW,IAAI,MAAM;EACrB,UAAU;GACR;GACA,cAAc,KAAK;GACnB,YAAY,KAAK;GACjB,eAAe,KAAK,WAAW,UAAU;GAC1C;EACF;AACD,OAAM,UAAU,QAAQ,WAAW;;;;;AAMrC,IAAa,6BAAb,MAAsE;CACpE,AAAiB,UAAmC,EAAE;CAEtD,MAAM,QAAQ,QAA8C;AAC1D,OAAK,QAAQ,KAAK,OAAO;;;;;CAM3B,aAAsC;AACpC,SAAO,CAAC,GAAG,KAAK,QAAQ;;;;;CAM1B,uBAAuB,eAAgD;AACrE,SAAO,KAAK,QAAQ,QAAQ,MAAM,EAAE,UAAU,SAAS,cAAc;;;;;CAMvE,QAAc;AACZ,OAAK,QAAQ,SAAS;;;;;;AAO1B,SAAgB,mCAA+D;AAC7E,QAAO,IAAI,4BAA4B;;;;;AAMzC,MAAaC,yBAA6C,EACxD,SAAS,YAAY,IACtB"}
@@ -17,4 +17,5 @@ import { KnowledgeRetriever } from "@lssm/lib.knowledge/retriever";
17
17
  */
18
18
  declare function createKnowledgeQueryTool(retriever: KnowledgeRetriever, knowledgeRefs: AgentKnowledgeRef[]): Tool<any, any> | null;
19
19
  //#endregion
20
- export { createKnowledgeQueryTool };
20
+ export { createKnowledgeQueryTool };
21
+ //# sourceMappingURL=knowledge-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-tool.d.ts","names":[],"sources":["../../src/tools/knowledge-tool.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAgBA;;;;;;;;;iBAAgB,wBAAA,YACH,mCACI,sBACd"}
@@ -50,4 +50,5 @@ ${knowledgeRefs.filter((k) => !k.required && retriever.supportsSpace(k.key)).map
50
50
  }
51
51
 
52
52
  //#endregion
53
- export { createKnowledgeQueryTool };
53
+ export { createKnowledgeQueryTool };
54
+ //# sourceMappingURL=knowledge-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-tool.js","names":["z","allResults: { space: string; content: string; score: number }[]"],"sources":["../../src/tools/knowledge-tool.ts"],"sourcesContent":["import { tool, type Tool } from 'ai';\nimport * as z from 'zod';\nimport type { KnowledgeRetriever } from '@lssm/lib.knowledge/retriever';\nimport type { AgentKnowledgeRef } from '../spec/spec';\n\n/**\n * Create a knowledge query tool for dynamic RAG.\n *\n * This tool allows the agent to query optional knowledge spaces\n * at runtime. Required knowledge is injected statically via\n * the knowledge injector.\n *\n * @param retriever - The knowledge retriever to use\n * @param knowledgeRefs - Knowledge references from the agent spec\n * @returns AI SDK CoreTool for knowledge queries\n */\nexport function createKnowledgeQueryTool(\n retriever: KnowledgeRetriever,\n knowledgeRefs: AgentKnowledgeRef[]\n): Tool<any, any> | null {\n // Only include optional (non-required) knowledge spaces\n const optionalSpaces = knowledgeRefs\n .filter((k) => !k.required)\n .map((k) => k.key)\n .filter((key) => retriever.supportsSpace(key));\n\n if (optionalSpaces.length === 0) {\n return null;\n }\n\n // Build space descriptions for the tool\n const spaceDescriptions = knowledgeRefs\n .filter((k) => !k.required && retriever.supportsSpace(k.key))\n .map((k) => `- ${k.key}: ${k.instructions ?? 'Knowledge space'}`)\n .join('\\n');\n\n return tool({\n description: `Query knowledge bases for relevant information. Use this tool when you need to look up specific information that may not be in your context.\n\nAvailable knowledge spaces:\n${spaceDescriptions}`,\n // AI SDK v6 uses inputSchema instead of parameters\n inputSchema: z.object({\n query: z\n .string()\n .describe('The question or search query to find relevant information'),\n spaceKey: z\n .enum(optionalSpaces as [string, ...string[]])\n .optional()\n .describe(\n 'Specific knowledge space to query. If omitted, searches all available spaces.'\n ),\n topK: z\n .number()\n .optional()\n .default(5)\n .describe('Maximum number of results to return'),\n }),\n execute: async ({ query, spaceKey, topK }) => {\n const spacesToSearch = spaceKey ? [spaceKey] : optionalSpaces;\n const allResults: { space: string; content: string; score: number }[] =\n [];\n\n for (const space of spacesToSearch) {\n try {\n const results = await retriever.retrieve(query, {\n spaceKey: space,\n topK: topK ?? 5,\n });\n\n for (const result of results) {\n allResults.push({\n space,\n content: result.content,\n score: result.score,\n });\n }\n } catch (error) {\n // Log but don't fail on individual space errors\n console.warn(`Failed to query knowledge space ${space}:`, error);\n }\n }\n\n if (allResults.length === 0) {\n return 'No relevant information found in the knowledge bases.';\n }\n\n // Sort by score and format results\n allResults.sort((a, b) => b.score - a.score);\n const topResults = allResults.slice(0, topK ?? 5);\n\n return topResults\n .map(\n (r, i) =>\n `[Source ${i + 1} - ${r.space}] (relevance: ${(r.score * 100).toFixed(0)}%)\\n${r.content}`\n )\n .join('\\n\\n---\\n\\n');\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,yBACd,WACA,eACuB;CAEvB,MAAM,iBAAiB,cACpB,QAAQ,MAAM,CAAC,EAAE,SAAS,CAC1B,KAAK,MAAM,EAAE,IAAI,CACjB,QAAQ,QAAQ,UAAU,cAAc,IAAI,CAAC;AAEhD,KAAI,eAAe,WAAW,EAC5B,QAAO;AAST,QAAO,KAAK;EACV,aAAa;;;EANW,cACvB,QAAQ,MAAM,CAAC,EAAE,YAAY,UAAU,cAAc,EAAE,IAAI,CAAC,CAC5D,KAAK,MAAM,KAAK,EAAE,IAAI,IAAI,EAAE,gBAAgB,oBAAoB,CAChE,KAAK,KAAK;EAQX,aAAaA,IAAE,OAAO;GACpB,OAAOA,IACJ,QAAQ,CACR,SAAS,4DAA4D;GACxE,UAAUA,IACP,KAAK,eAAwC,CAC7C,UAAU,CACV,SACC,gFACD;GACH,MAAMA,IACH,QAAQ,CACR,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,sCAAsC;GACnD,CAAC;EACF,SAAS,OAAO,EAAE,OAAO,UAAU,WAAW;GAC5C,MAAM,iBAAiB,WAAW,CAAC,SAAS,GAAG;GAC/C,MAAMC,aACJ,EAAE;AAEJ,QAAK,MAAM,SAAS,eAClB,KAAI;IACF,MAAM,UAAU,MAAM,UAAU,SAAS,OAAO;KAC9C,UAAU;KACV,MAAM,QAAQ;KACf,CAAC;AAEF,SAAK,MAAM,UAAU,QACnB,YAAW,KAAK;KACd;KACA,SAAS,OAAO;KAChB,OAAO,OAAO;KACf,CAAC;YAEG,OAAO;AAEd,YAAQ,KAAK,mCAAmC,MAAM,IAAI,MAAM;;AAIpE,OAAI,WAAW,WAAW,EACxB,QAAO;AAIT,cAAW,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;AAG5C,UAFmB,WAAW,MAAM,GAAG,QAAQ,EAAE,CAG9C,KACE,GAAG,MACF,WAAW,IAAI,EAAE,KAAK,EAAE,MAAM,iBAAiB,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC,MAAM,EAAE,UACpF,CACA,KAAK,cAAc;;EAEzB,CAAC"}
@@ -55,4 +55,5 @@ declare function mcpServerToTools(config: McpClientConfig): Promise<McpClientRes
55
55
  */
56
56
  declare function createMcpToolsets(configs: McpClientConfig[]): Promise<McpClientResult>;
57
57
  //#endregion
58
- export { McpClientConfig, McpClientResult, createMcpToolsets, mcpServerToTools };
58
+ export { McpClientConfig, McpClientResult, createMcpToolsets, mcpServerToTools };
59
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","names":[],"sources":["../../src/tools/mcp-client.ts"],"sourcesContent":[],"mappings":";;;;;;AAOA;AAciB,UAdA,eAAA,CAce;EAER;EAAf,IAAA,EAAA,MAAA;EAEQ;EAAO,OAAA,EAAA,MAAA;EAyBF;EACZ,IAAA,CAAA,EAAA,MAAA,EAAA;EACC;EAAR,GAAA,CAAA,EArCK,MAqCL,CAAA,MAAA,EAAA,MAAA,CAAA;;AAsBH;;;AAEG,UAvDc,eAAA,CAuDd;EAAO;SArDD,eAAe;;iBAEP;;;;;;;;;;;;;;;;;;;;;;;;iBAyBK,gBAAA,SACZ,kBACP,QAAQ;;;;;;;iBAsBW,iBAAA,UACX,oBACR,QAAQ"}
@@ -54,4 +54,5 @@ async function createMcpToolsets(configs) {
54
54
  }
55
55
 
56
56
  //#endregion
57
- export { createMcpToolsets, mcpServerToTools };
57
+ export { createMcpToolsets, mcpServerToTools };
58
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","names":["StdioClientTransport","combinedTools: Record<string, Tool<unknown, unknown>>"],"sources":["../../src/tools/mcp-client.ts"],"sourcesContent":["import { experimental_createMCPClient } from '@ai-sdk/mcp';\nimport { Experimental_StdioMCPTransport as StdioClientTransport } from '@ai-sdk/mcp/mcp-stdio';\nimport type { Tool } from 'ai';\n\n/**\n * Configuration for connecting to an MCP server.\n */\nexport interface McpClientConfig {\n /** Display name for the MCP server */\n name: string;\n /** Command to spawn the MCP server process */\n command: string;\n /** Arguments to pass to the command */\n args?: string[];\n /** Environment variables for the process */\n env?: Record<string, string>;\n}\n\n/**\n * Result of creating an MCP client with tools.\n */\nexport interface McpClientResult {\n /** AI SDK tools from the MCP server */\n tools: Record<string, Tool<unknown, unknown>>;\n /** Cleanup function to close the connection */\n cleanup: () => Promise<void>;\n}\n\n/**\n * Create AI SDK tools from an MCP server.\n *\n * This adapter allows ContractSpec agents to consume tools\n * from external MCP servers (e.g., filesystem, database, etc.).\n *\n * @param config - MCP server configuration\n * @returns Tools and cleanup function\n *\n * @example\n * ```typescript\n * const { tools, cleanup } = await mcpServerToTools({\n * name: 'filesystem',\n * command: 'npx',\n * args: ['-y', '@modelcontextprotocol/server-filesystem', '/path'],\n * });\n *\n * // Use tools in agent...\n *\n * await cleanup();\n * ```\n */\nexport async function mcpServerToTools(\n config: McpClientConfig\n): Promise<McpClientResult> {\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: config.env,\n });\n\n const client = await experimental_createMCPClient({ transport });\n const tools = await client.tools();\n\n return {\n tools: tools as Record<string, Tool<unknown, unknown>>,\n cleanup: () => client.close(),\n };\n}\n\n/**\n * Create multiple MCP tool sets from configurations.\n *\n * @param configs - Array of MCP server configurations\n * @returns Combined tools and cleanup function\n */\nexport async function createMcpToolsets(\n configs: McpClientConfig[]\n): Promise<McpClientResult> {\n const results = await Promise.all(configs.map(mcpServerToTools));\n\n const combinedTools: Record<string, Tool<unknown, unknown>> = {};\n for (const result of results) {\n Object.assign(combinedTools, result.tools);\n }\n\n return {\n tools: combinedTools,\n cleanup: async () => {\n await Promise.all(results.map((r) => r.cleanup()));\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,eAAsB,iBACpB,QAC0B;CAO1B,MAAM,SAAS,MAAM,6BAA6B,EAAE,WANlC,IAAIA,+BAAqB;EACzC,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,KAAK,OAAO;EACb,CAAC,EAE6D,CAAC;AAGhE,QAAO;EACL,OAHY,MAAM,OAAO,OAAO;EAIhC,eAAe,OAAO,OAAO;EAC9B;;;;;;;;AASH,eAAsB,kBACpB,SAC0B;CAC1B,MAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ,IAAI,iBAAiB,CAAC;CAEhE,MAAMC,gBAAwD,EAAE;AAChE,MAAK,MAAM,UAAU,QACnB,QAAO,OAAO,eAAe,OAAO,MAAM;AAG5C,QAAO;EACL,OAAO;EACP,SAAS,YAAY;AACnB,SAAM,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC;;EAErD"}
@@ -42,4 +42,5 @@ interface AgentMcpServerConfig {
42
42
  */
43
43
  declare function createAgentMcpServer(config: AgentMcpServerConfig): McpServer;
44
44
  //#endregion
45
- export { AgentMcpServerConfig, agentToMcpServer, createAgentMcpServer };
45
+ export { AgentMcpServerConfig, agentToMcpServer, createAgentMcpServer };
46
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","names":[],"sources":["../../src/tools/mcp-server.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAyBA;;;;;AA+EA;AAcA;;;;;;;;;;;iBA7FgB,gBAAA,QACP,yBACD,YACL;;;;UA4Ec,oBAAA;;SAER;;QAED;;;;;;;;;iBAUQ,oBAAA,SAA6B,uBAAuB"}
@@ -65,4 +65,5 @@ function createAgentMcpServer(config) {
65
65
  }
66
66
 
67
67
  //#endregion
68
- export { agentToMcpServer, createAgentMcpServer };
68
+ export { agentToMcpServer, createAgentMcpServer };
69
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","names":["z"],"sources":["../../src/tools/mcp-server.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport * as z from 'zod';\nimport type { AgentSpec } from '../spec/spec';\nimport type { ContractSpecAgent } from '../agent/contract-spec-agent';\nimport { jsonSchemaToZodSafe } from '../schema/json-schema-to-zod';\n\n/**\n * Generate an MCP server that exposes a ContractSpec agent as a tool.\n *\n * This allows other AI agents (e.g., Claude Desktop, Cursor) to use\n * your ContractSpec agents as tools, enabling agent-to-agent composition.\n *\n * @param agent - The ContractSpec agent to expose\n * @param spec - The agent specification\n * @returns MCP Server instance\n *\n * @example\n * ```typescript\n * const server = agentToMcpServer(myAgent, myAgentSpec);\n *\n * // Run via stdio transport\n * const transport = new StdioServerTransport();\n * await server.connect(transport);\n * ```\n */\nexport function agentToMcpServer(\n agent: ContractSpecAgent,\n spec: AgentSpec\n): McpServer {\n const server = new McpServer({\n name: spec.meta.name,\n version: `${spec.meta.version}`,\n });\n\n // Expose agent as a conversational tool using registerTool\n server.registerTool(\n spec.meta.name,\n {\n description: spec.description ?? `Interact with ${spec.meta.name} agent`,\n inputSchema: z.object({\n message: z\n .string()\n .describe('The message or query to send to the agent'),\n sessionId: z\n .string()\n .optional()\n .describe('Optional session ID to continue a conversation'),\n }),\n },\n async (args) => {\n const { message, sessionId } = args;\n\n const result = await agent.generate({\n prompt: message,\n options: { sessionId },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: result.text,\n },\n ],\n };\n }\n );\n\n // Expose individual tools from the agent spec\n for (const toolConfig of spec.tools) {\n const inputSchema = toolConfig.schema\n ? jsonSchemaToZodSafe(toolConfig.schema)\n : z.object({});\n\n server.registerTool(\n `${spec.meta.name}.${toolConfig.name}`,\n {\n description:\n toolConfig.description ?? `Execute ${toolConfig.name} tool`,\n inputSchema,\n },\n async (args) => {\n const result = await agent.generate({\n prompt: `Execute the ${toolConfig.name} tool with the following arguments: ${JSON.stringify(args)}`,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: result.text,\n },\n ],\n };\n }\n );\n }\n\n return server;\n}\n\n/**\n * Configuration for running an agent as an MCP server.\n */\nexport interface AgentMcpServerConfig {\n /** The agent to expose */\n agent: ContractSpecAgent;\n /** The agent specification */\n spec: AgentSpec;\n /** Optional server name override */\n name?: string;\n /** Optional version override */\n version?: string;\n}\n\n/**\n * Create an MCP server from configuration.\n */\nexport function createAgentMcpServer(config: AgentMcpServerConfig): McpServer {\n return agentToMcpServer(config.agent, config.spec);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,iBACd,OACA,MACW;CACX,MAAM,SAAS,IAAI,UAAU;EAC3B,MAAM,KAAK,KAAK;EAChB,SAAS,GAAG,KAAK,KAAK;EACvB,CAAC;AAGF,QAAO,aACL,KAAK,KAAK,MACV;EACE,aAAa,KAAK,eAAe,iBAAiB,KAAK,KAAK,KAAK;EACjE,aAAaA,IAAE,OAAO;GACpB,SAASA,IACN,QAAQ,CACR,SAAS,4CAA4C;GACxD,WAAWA,IACR,QAAQ,CACR,UAAU,CACV,SAAS,iDAAiD;GAC9D,CAAC;EACH,EACD,OAAO,SAAS;EACd,MAAM,EAAE,SAAS,cAAc;AAO/B,SAAO,EACL,SAAS,CACP;GACE,MAAM;GACN,OATS,MAAM,MAAM,SAAS;IAClC,QAAQ;IACR,SAAS,EAAE,WAAW;IACvB,CAAC,EAMiB;GACd,CACF,EACF;GAEJ;AAGD,MAAK,MAAM,cAAc,KAAK,OAAO;EACnC,MAAM,cAAc,WAAW,SAC3B,oBAAoB,WAAW,OAAO,GACtCA,IAAE,OAAO,EAAE,CAAC;AAEhB,SAAO,aACL,GAAG,KAAK,KAAK,KAAK,GAAG,WAAW,QAChC;GACE,aACE,WAAW,eAAe,WAAW,WAAW,KAAK;GACvD;GACD,EACD,OAAO,SAAS;AAKd,UAAO,EACL,SAAS,CACP;IACE,MAAM;IACN,OARS,MAAM,MAAM,SAAS,EAClC,QAAQ,eAAe,WAAW,KAAK,sCAAsC,KAAK,UAAU,KAAK,IAClG,CAAC,EAMiB;IACd,CACF,EACF;IAEJ;;AAGH,QAAO;;;;;AAoBT,SAAgB,qBAAqB,QAAyC;AAC5E,QAAO,iBAAiB,OAAO,OAAO,OAAO,KAAK"}
@@ -46,4 +46,5 @@ declare function createToolHandler<TInput = unknown, TOutput = string>(handler:
46
46
  */
47
47
  declare function buildToolHandlers(handlersObj: Record<string, ToolHandler>): Map<string, ToolHandler>;
48
48
  //#endregion
49
- export { buildToolHandlers, createToolHandler, specToolToAISDKTool, specToolsToAISDKTools };
49
+ export { buildToolHandlers, createToolHandler, specToolToAISDKTool, specToolsToAISDKTools };
50
+ //# sourceMappingURL=tool-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.d.ts","names":[],"sources":["../../src/tools/tool-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAaA;;;;;;AAIO,iBAJS,mBAAA,CAIT,QAAA,EAHK,eAGL,EAAA,OAAA,EAFI,WAEJ,EAAA,OAAA,CAAA,EADI,OACJ,CADY,oBACZ,CAAA,CAAA,EAAJ,IAAI,CAAA,GAAA,EAAA,GAAA,CAAA;AA6BP;;;;;;;;AAIS,iBAJO,qBAAA,CAIP,SAAA,EAHI,eAGJ,EAAA,EAAA,QAAA,EAFG,GAEH,CAAA,MAAA,EAFe,WAEf,CAAA,EAAA,OAAA,CAAA,EADE,OACF,CADU,oBACV,CAAA,CAAA,EAAN,MAAM,CAAA,MAAA,EAAS,IAAT,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA;AAyBT;;;;;;;;;;AAsBgB,iBAtBA,iBAsBiB,CAAA,SAAA,OAAA,EAAA,UAAA,MAAA,CAAA,CAAA,OAAA,EAAA,CAAA,KAAA,EApBtB,MAoBsB,EAAA,OAAA,EAnBpB,oBAmBoB,EAAA,GAlB1B,OAkB0B,CAlBlB,OAkBkB,CAAA,GAlBP,OAkBO,CAAA,EAjB9B,WAiB8B,CAjBlB,MAiBkB,EAjBV,OAiBU,CAAA;;;;;;;;;;;;iBAAjB,iBAAA,cACD,eAAe,eAC3B,YAAY"}
@@ -76,4 +76,5 @@ function buildToolHandlers(handlersObj) {
76
76
  }
77
77
 
78
78
  //#endregion
79
- export { buildToolHandlers, createToolHandler, specToolToAISDKTool, specToolsToAISDKTools };
79
+ export { buildToolHandlers, createToolHandler, specToolToAISDKTool, specToolsToAISDKTools };
80
+ //# sourceMappingURL=tool-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.js","names":["tools: Record<string, Tool<any, any>>"],"sources":["../../src/tools/tool-adapter.ts"],"sourcesContent":["import { tool, type Tool } from 'ai';\nimport type { AgentToolConfig } from '../spec/spec';\nimport type { ToolExecutionContext, ToolHandler } from '../types';\nimport { jsonSchemaToZodSafe } from '../schema/json-schema-to-zod';\n\n/**\n * Convert ContractSpec AgentToolConfig to AI SDK CoreTool.\n *\n * @param specTool - The tool configuration from AgentSpec\n * @param handler - The handler function for the tool\n * @param context - Partial context to inject into handler calls\n * @returns AI SDK CoreTool\n */\nexport function specToolToAISDKTool(\n specTool: AgentToolConfig,\n handler: ToolHandler,\n context: Partial<ToolExecutionContext> = {}\n): Tool<any, any> {\n return tool({\n description: specTool.description ?? specTool.name,\n // AI SDK v6 uses inputSchema instead of parameters\n inputSchema: jsonSchemaToZodSafe(specTool.schema),\n // AI SDK v6 native approval support\n needsApproval: specTool.requiresApproval ?? !specTool.automationSafe,\n execute: async (input) => {\n const result = await handler(input, {\n agentId: context.agentId ?? 'unknown',\n sessionId: context.sessionId ?? 'unknown',\n tenantId: context.tenantId,\n actorId: context.actorId,\n metadata: context.metadata,\n signal: context.signal,\n });\n return typeof result === 'string' ? result : JSON.stringify(result);\n },\n });\n}\n\n/**\n * Convert multiple ContractSpec tool configs to AI SDK tools.\n *\n * @param specTools - Array of tool configurations\n * @param handlers - Map of tool name to handler function\n * @param context - Partial context to inject into handler calls\n * @returns Record of AI SDK tools keyed by name\n */\nexport function specToolsToAISDKTools(\n specTools: AgentToolConfig[],\n handlers: Map<string, ToolHandler>,\n context: Partial<ToolExecutionContext> = {}\n): Record<string, Tool<any, any>> {\n const tools: Record<string, Tool<any, any>> = {};\n\n for (const specTool of specTools) {\n const handler = handlers.get(specTool.name);\n if (!handler) {\n throw new Error(`Missing handler for tool: ${specTool.name}`);\n }\n\n tools[specTool.name] = specToolToAISDKTool(specTool, handler, context);\n }\n\n return tools;\n}\n\n/**\n * Type-safe tool handler builder.\n *\n * @example\n * ```typescript\n * const handler = createToolHandler<{ query: string }>((input, ctx) => {\n * return `Searched for: ${input.query}`;\n * });\n * ```\n */\nexport function createToolHandler<TInput = unknown, TOutput = string>(\n handler: (\n input: TInput,\n context: ToolExecutionContext\n ) => Promise<TOutput> | TOutput\n): ToolHandler<TInput, TOutput> {\n return async (input, context) => {\n return handler(input as TInput, context);\n };\n}\n\n/**\n * Build a tool handlers map from an object.\n *\n * @example\n * ```typescript\n * const handlers = buildToolHandlers({\n * search: async (input: { query: string }) => `Found: ${input.query}`,\n * calculate: async (input: { a: number, b: number }) => `${input.a + input.b}`,\n * });\n * ```\n */\nexport function buildToolHandlers(\n handlersObj: Record<string, ToolHandler>\n): Map<string, ToolHandler> {\n return new Map(Object.entries(handlersObj));\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,oBACd,UACA,SACA,UAAyC,EAAE,EAC3B;AAChB,QAAO,KAAK;EACV,aAAa,SAAS,eAAe,SAAS;EAE9C,aAAa,oBAAoB,SAAS,OAAO;EAEjD,eAAe,SAAS,oBAAoB,CAAC,SAAS;EACtD,SAAS,OAAO,UAAU;GACxB,MAAM,SAAS,MAAM,QAAQ,OAAO;IAClC,SAAS,QAAQ,WAAW;IAC5B,WAAW,QAAQ,aAAa;IAChC,UAAU,QAAQ;IAClB,SAAS,QAAQ;IACjB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IACjB,CAAC;AACF,UAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,OAAO;;EAEtE,CAAC;;;;;;;;;;AAWJ,SAAgB,sBACd,WACA,UACA,UAAyC,EAAE,EACX;CAChC,MAAMA,QAAwC,EAAE;AAEhD,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,UAAU,SAAS,IAAI,SAAS,KAAK;AAC3C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,6BAA6B,SAAS,OAAO;AAG/D,QAAM,SAAS,QAAQ,oBAAoB,UAAU,SAAS,QAAQ;;AAGxE,QAAO;;;;;;;;;;;;AAaT,SAAgB,kBACd,SAI8B;AAC9B,QAAO,OAAO,OAAO,YAAY;AAC/B,SAAO,QAAQ,OAAiB,QAAQ;;;;;;;;;;;;;;AAe5C,SAAgB,kBACd,aAC0B;AAC1B,QAAO,IAAI,IAAI,OAAO,QAAQ,YAAY,CAAC"}
package/dist/types.d.ts CHANGED
@@ -191,4 +191,5 @@ interface AgentToolResult {
191
191
  metadata?: Record<string, string>;
192
192
  }
193
193
  //#endregion
194
- export { AgentCallOptions, AgentEventEmitter, AgentEventName, AgentEventPayload, AgentGenerateParams, AgentGenerateResult, AgentMessage, AgentRunRequestInput, AgentRunResult, AgentSessionState, AgentStatus, AgentStepMetrics, AgentStreamParams, AgentToolContext, AgentToolInvocation, AgentToolResult, ToolCallInfo, ToolExecutionContext, ToolHandler, ToolResultInfo };
194
+ export { AgentCallOptions, AgentEventEmitter, AgentEventName, AgentEventPayload, AgentGenerateParams, AgentGenerateResult, AgentMessage, AgentRunRequestInput, AgentRunResult, AgentSessionState, AgentStatus, AgentStepMetrics, AgentStreamParams, AgentToolContext, AgentToolInvocation, AgentToolResult, ToolCallInfo, ToolExecutionContext, ToolHandler, ToolResultInfo };
195
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;AAUA;AAWA;AAeiB,UA1BA,YAAA,CA6BJ;EAOD,IAAA,EAAA,WAAW;EAQX,UAAA,EAAA,MAAc;EAaT,QAAA,EAAA,MAAA;EAiBA,IAAA,EAAA,OAAA;AAejB;;;;;AAQa,UAtFI,cAAA,CAsFJ;EACA,IAAA,EAAA,aAAA;EACA,UAAA,EAAA,MAAA;EAAM,QAAA,EAAA,MAAA;EAOF,MAAA,EAAA,OAAA;AAajB;;;;;AAA8D,UA7F7C,YAAA,CA6F6C;EAS7C,IAAA,EAAA,MAAA,GAAA,WAAmB,GAAA,QAAA,GAAA,MAAA;EAIzB,OAAA,EAAA,MAAA,GAAA;IAES,IAAA,EAAA,MAAA;IAAX,IAAA,CAAA,EAAA,MAAA;IAEI,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAEE,CAAA,EAAA;EAWL,QAAA,CAAA,EAxHG,MAwHH,CAAA,MAAA,EAAA,MAAA,CAAA;;AAEmB,KAnHjB,WAAA,GAmHiB,MAAA,GAAA,SAAA,GAAA,SAAA,GAAA,WAAA,GAAA,QAAA,GAAA,WAAA;AAgBZ,KA3HL,cAAA,GA2HyB,uBAM1B,GAAA,uBAAW,GAAA,oBAAA,GAAA,sBAAA,GAAA,mBAAA,GAAA,sBAAA,GAAA,mBAAA,GAAA,+BAAA,GAAA,iBAAA,GAAA,iBAAA,GAAA,cAAA;AAMV,UA1HK,iBAAA,CA0HM;EACd,SAAA,EAAA,MAAA;EACE,OAAA,EAAA,MAAA;EACE,QAAA,CAAA,EAAA,MAAA;EAAR,SAAA,CAAA,EAAA,MAAA;EAAO,QAAA,CAAA,EAAA,MAAA;EAMK,QAAA,CAAA,EA7HJ,MA6HI,CAAA,MAAgB,EAAA,OAUvB,CAAA;AAQV;;;;;AAUiB,UA9IA,gBAAA,CA8IoB;EAYpB;EAYA,QAAA,CAAA,EAAA,MAAA;EAWA;EACN,OAAA,CAAA,EAAA,MAAA;EAGE;EACG,SAAA,CAAA,EAAA,MAAA;EAAyB;EAAiB,QAAA,CAAA,EA9K7C,MA8K6C,CAAA,MAAA,EAAA,MAAA,CAAA;AAI1D;UA3KiB,iBAAA;;;;;UAKP;YACE;SACH,WAAW;aACP;aACA;aACA;;UAOI,mBAAA;;;;;;YAML;;;;WAID;;UAGM,iBAAA,SAA0B;;wBAEnB,WAAW,oBAAoB;;UAOtC;;;;WAIN;;SAEF,WAAW;;aAEP;;eAEE;;;;UAWL;;YAEE;;;;;;;;;;;UAgBK,oBAAA;;;;;aAKJ;WACF;;;;;KAMC,0DACH,iBACE,yBACN,QAAQ;UAMI,gBAAA;;;;;;;;;;UAUP;aACG;;KAOD,iBAAA,WACH,yBACE,6BACC;;UAOK,oBAAA;;;;;;;aAOJ;;;;UAKI,cAAA;WACN;;;;;;;mBAOQ;;;UAIF,mBAAA;;;aAGJ;gBACG;;;;;;UAOC,gBAAA;WACN;;;aAGE;gBACG,yBAAyB;;;UAIxB,eAAA;;;;;;;aAGJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.ai-agent",
3
- "version": "0.0.0-canary-20251217083314",
3
+ "version": "0.0.0-canary-20251219202229",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -30,14 +30,14 @@
30
30
  "@ai-sdk/mistral": "beta",
31
31
  "@ai-sdk/openai": "beta",
32
32
  "@modelcontextprotocol/sdk": "^1.24.3",
33
- "@lssm/lib.contracts": "0.0.0-canary-20251217083314",
34
- "@lssm/lib.knowledge": "0.0.0-canary-20251217083314",
33
+ "@lssm/lib.contracts": "0.0.0-canary-20251219202229",
34
+ "@lssm/lib.knowledge": "0.0.0-canary-20251219202229",
35
35
  "zod": "^4.1.13"
36
36
  },
37
37
  "devDependencies": {
38
- "@lssm/tool.tsdown": "0.0.0-canary-20251217083314",
39
- "@lssm/tool.typescript": "0.0.0-canary-20251217083314",
40
- "tsdown": "^0.17.4",
38
+ "@lssm/tool.tsdown": "0.0.0-canary-20251219202229",
39
+ "@lssm/tool.typescript": "0.0.0-canary-20251219202229",
40
+ "tsdown": "^0.18.1",
41
41
  "typescript": "^5.9.3"
42
42
  },
43
43
  "exports": {
@@ -102,5 +102,6 @@
102
102
  "./types": "./dist/types.js",
103
103
  "./*": "./*"
104
104
  }
105
- }
105
+ },
106
+ "license": "MIT"
106
107
  }