@contractspec/lib.ai-agent 0.0.0-canary-20260113162409

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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/_virtual/rolldown_runtime.js +8 -0
  4. package/dist/agent/agent-factory.d.ts +104 -0
  5. package/dist/agent/agent-factory.d.ts.map +1 -0
  6. package/dist/agent/agent-factory.js +103 -0
  7. package/dist/agent/agent-factory.js.map +1 -0
  8. package/dist/agent/contract-spec-agent.d.ts +75 -0
  9. package/dist/agent/contract-spec-agent.d.ts.map +1 -0
  10. package/dist/agent/contract-spec-agent.js +148 -0
  11. package/dist/agent/contract-spec-agent.js.map +1 -0
  12. package/dist/agent/index.d.ts +3 -0
  13. package/dist/agent/index.js +4 -0
  14. package/dist/agent/unified-agent.d.ts +131 -0
  15. package/dist/agent/unified-agent.d.ts.map +1 -0
  16. package/dist/agent/unified-agent.js +267 -0
  17. package/dist/agent/unified-agent.js.map +1 -0
  18. package/dist/approval/index.d.ts +2 -0
  19. package/dist/approval/index.js +3 -0
  20. package/dist/approval/workflow.d.ts +156 -0
  21. package/dist/approval/workflow.d.ts.map +1 -0
  22. package/dist/approval/workflow.js +160 -0
  23. package/dist/approval/workflow.js.map +1 -0
  24. package/dist/exporters/claude-agent-exporter.d.ts +64 -0
  25. package/dist/exporters/claude-agent-exporter.d.ts.map +1 -0
  26. package/dist/exporters/claude-agent-exporter.js +210 -0
  27. package/dist/exporters/claude-agent-exporter.js.map +1 -0
  28. package/dist/exporters/index.d.ts +4 -0
  29. package/dist/exporters/index.js +4 -0
  30. package/dist/exporters/opencode-exporter.d.ts +64 -0
  31. package/dist/exporters/opencode-exporter.d.ts.map +1 -0
  32. package/dist/exporters/opencode-exporter.js +200 -0
  33. package/dist/exporters/opencode-exporter.js.map +1 -0
  34. package/dist/exporters/types.d.ts +239 -0
  35. package/dist/exporters/types.d.ts.map +1 -0
  36. package/dist/exporters/types.js +0 -0
  37. package/dist/index.d.ts +37 -0
  38. package/dist/index.js +31 -0
  39. package/dist/interop/index.d.ts +4 -0
  40. package/dist/interop/index.js +4 -0
  41. package/dist/interop/spec-consumer.d.ts +81 -0
  42. package/dist/interop/spec-consumer.d.ts.map +1 -0
  43. package/dist/interop/spec-consumer.js +287 -0
  44. package/dist/interop/spec-consumer.js.map +1 -0
  45. package/dist/interop/tool-consumer.d.ts +68 -0
  46. package/dist/interop/tool-consumer.d.ts.map +1 -0
  47. package/dist/interop/tool-consumer.js +220 -0
  48. package/dist/interop/tool-consumer.js.map +1 -0
  49. package/dist/interop/types.d.ts +262 -0
  50. package/dist/interop/types.d.ts.map +1 -0
  51. package/dist/interop/types.js +0 -0
  52. package/dist/knowledge/index.d.ts +2 -0
  53. package/dist/knowledge/index.js +3 -0
  54. package/dist/knowledge/injector.d.ts +38 -0
  55. package/dist/knowledge/injector.d.ts.map +1 -0
  56. package/dist/knowledge/injector.js +58 -0
  57. package/dist/knowledge/injector.js.map +1 -0
  58. package/dist/memory/in-memory.d.ts +22 -0
  59. package/dist/memory/in-memory.d.ts.map +1 -0
  60. package/dist/memory/in-memory.js +48 -0
  61. package/dist/memory/in-memory.js.map +1 -0
  62. package/dist/memory/index.d.ts +3 -0
  63. package/dist/memory/index.js +4 -0
  64. package/dist/memory/manager.d.ts +42 -0
  65. package/dist/memory/manager.d.ts.map +1 -0
  66. package/dist/memory/manager.js +80 -0
  67. package/dist/memory/manager.js.map +1 -0
  68. package/dist/providers/claude-agent-sdk/adapter.d.ts +58 -0
  69. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -0
  70. package/dist/providers/claude-agent-sdk/adapter.js +306 -0
  71. package/dist/providers/claude-agent-sdk/adapter.js.map +1 -0
  72. package/dist/providers/claude-agent-sdk/index.d.ts +4 -0
  73. package/dist/providers/claude-agent-sdk/index.js +5 -0
  74. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +101 -0
  75. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -0
  76. package/dist/providers/claude-agent-sdk/session-bridge.js +158 -0
  77. package/dist/providers/claude-agent-sdk/session-bridge.js.map +1 -0
  78. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +110 -0
  79. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -0
  80. package/dist/providers/claude-agent-sdk/tool-bridge.js +122 -0
  81. package/dist/providers/claude-agent-sdk/tool-bridge.js.map +1 -0
  82. package/dist/providers/index.d.ts +7 -0
  83. package/dist/providers/index.js +8 -0
  84. package/dist/providers/opencode-sdk/adapter.d.ts +54 -0
  85. package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -0
  86. package/dist/providers/opencode-sdk/adapter.js +276 -0
  87. package/dist/providers/opencode-sdk/adapter.js.map +1 -0
  88. package/dist/providers/opencode-sdk/agent-bridge.d.ts +94 -0
  89. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -0
  90. package/dist/providers/opencode-sdk/agent-bridge.js +165 -0
  91. package/dist/providers/opencode-sdk/agent-bridge.js.map +1 -0
  92. package/dist/providers/opencode-sdk/index.d.ts +4 -0
  93. package/dist/providers/opencode-sdk/index.js +5 -0
  94. package/dist/providers/opencode-sdk/tool-bridge.d.ts +81 -0
  95. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -0
  96. package/dist/providers/opencode-sdk/tool-bridge.js +127 -0
  97. package/dist/providers/opencode-sdk/tool-bridge.js.map +1 -0
  98. package/dist/providers/registry.d.ts +22 -0
  99. package/dist/providers/registry.d.ts.map +1 -0
  100. package/dist/providers/registry.js +52 -0
  101. package/dist/providers/registry.js.map +1 -0
  102. package/dist/providers/types.d.ts +243 -0
  103. package/dist/providers/types.d.ts.map +1 -0
  104. package/dist/providers/types.js +44 -0
  105. package/dist/providers/types.js.map +1 -0
  106. package/dist/schema/index.d.ts +3 -0
  107. package/dist/schema/index.js +4 -0
  108. package/dist/schema/json-schema-to-zod.d.ts +55 -0
  109. package/dist/schema/json-schema-to-zod.d.ts.map +1 -0
  110. package/dist/schema/json-schema-to-zod.js +124 -0
  111. package/dist/schema/json-schema-to-zod.js.map +1 -0
  112. package/dist/schema/schema-output.d.ts +77 -0
  113. package/dist/schema/schema-output.d.ts.map +1 -0
  114. package/dist/schema/schema-output.js +65 -0
  115. package/dist/schema/schema-output.js.map +1 -0
  116. package/dist/session/index.d.ts +2 -0
  117. package/dist/session/index.js +3 -0
  118. package/dist/session/store.d.ts +74 -0
  119. package/dist/session/store.d.ts.map +1 -0
  120. package/dist/session/store.js +79 -0
  121. package/dist/session/store.js.map +1 -0
  122. package/dist/spec/index.d.ts +3 -0
  123. package/dist/spec/index.js +4 -0
  124. package/dist/spec/registry.d.ts +47 -0
  125. package/dist/spec/registry.d.ts.map +1 -0
  126. package/dist/spec/registry.js +65 -0
  127. package/dist/spec/registry.js.map +1 -0
  128. package/dist/spec/spec.d.ts +127 -0
  129. package/dist/spec/spec.d.ts.map +1 -0
  130. package/dist/spec/spec.js +30 -0
  131. package/dist/spec/spec.js.map +1 -0
  132. package/dist/telemetry/adapter.d.ts +73 -0
  133. package/dist/telemetry/adapter.d.ts.map +1 -0
  134. package/dist/telemetry/adapter.js +103 -0
  135. package/dist/telemetry/adapter.js.map +1 -0
  136. package/dist/telemetry/index.d.ts +2 -0
  137. package/dist/telemetry/index.js +3 -0
  138. package/dist/tools/index.d.ts +5 -0
  139. package/dist/tools/index.js +6 -0
  140. package/dist/tools/knowledge-tool.d.ts +21 -0
  141. package/dist/tools/knowledge-tool.d.ts.map +1 -0
  142. package/dist/tools/knowledge-tool.js +54 -0
  143. package/dist/tools/knowledge-tool.js.map +1 -0
  144. package/dist/tools/mcp-client.d.ts +59 -0
  145. package/dist/tools/mcp-client.d.ts.map +1 -0
  146. package/dist/tools/mcp-client.js +58 -0
  147. package/dist/tools/mcp-client.js.map +1 -0
  148. package/dist/tools/mcp-server.d.ts +46 -0
  149. package/dist/tools/mcp-server.d.ts.map +1 -0
  150. package/dist/tools/mcp-server.js +69 -0
  151. package/dist/tools/mcp-server.js.map +1 -0
  152. package/dist/tools/tool-adapter.d.ts +50 -0
  153. package/dist/tools/tool-adapter.d.ts.map +1 -0
  154. package/dist/tools/tool-adapter.js +80 -0
  155. package/dist/tools/tool-adapter.js.map +1 -0
  156. package/dist/types.d.ts +146 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +0 -0
  159. package/package.json +155 -0
@@ -0,0 +1,262 @@
1
+ import { AgentSpec, AgentToolConfig } from "../spec/spec.js";
2
+ import { ToolHandler } from "../types.js";
3
+
4
+ //#region src/interop/types.d.ts
5
+
6
+ /**
7
+ * Configuration for a spec consumer.
8
+ */
9
+ interface SpecConsumerConfig {
10
+ /** Specs to consume */
11
+ specs: AgentSpec[];
12
+ /** Whether to include metadata in outputs */
13
+ includeMetadata?: boolean;
14
+ /** Base URL for linking */
15
+ baseUrl?: string;
16
+ }
17
+ /**
18
+ * Options for markdown generation.
19
+ */
20
+ interface SpecMarkdownOptions {
21
+ /** Include table of contents */
22
+ includeToc?: boolean;
23
+ /** Include examples */
24
+ includeExamples?: boolean;
25
+ /** Include tools section */
26
+ includeTools?: boolean;
27
+ /** Include constraints section */
28
+ includeConstraints?: boolean;
29
+ /** Custom header */
30
+ customHeader?: string;
31
+ }
32
+ /**
33
+ * Options for prompt generation.
34
+ */
35
+ interface SpecPromptOptions {
36
+ /** Include tools in prompt */
37
+ includeTools?: boolean;
38
+ /** Include examples in prompt */
39
+ includeExamples?: boolean;
40
+ /** Include constraints in prompt */
41
+ includeConstraints?: boolean;
42
+ /** Output format */
43
+ format?: 'structured' | 'natural';
44
+ /** Custom context to append */
45
+ customContext?: string;
46
+ }
47
+ /**
48
+ * Result from querying a spec.
49
+ */
50
+ interface SpecQueryResult {
51
+ /** Spec key */
52
+ key: string;
53
+ /** The spec itself */
54
+ spec: AgentSpec;
55
+ /** Markdown representation */
56
+ markdown: string;
57
+ /** Prompt representation */
58
+ prompt: string;
59
+ }
60
+ /**
61
+ * Options for listing specs.
62
+ */
63
+ interface SpecListOptions {
64
+ /** Filter by stability */
65
+ stability?: string;
66
+ /** Filter by tags */
67
+ tags?: string[];
68
+ }
69
+ /**
70
+ * Result from listing specs.
71
+ */
72
+ interface SpecListResult {
73
+ /** Spec key */
74
+ key: string;
75
+ /** Spec name (from meta.name or meta.key) */
76
+ name: string;
77
+ /** Spec version */
78
+ version: string;
79
+ /** Description */
80
+ description?: string;
81
+ /** Stability */
82
+ stability?: string;
83
+ /** Tags */
84
+ tags?: string[];
85
+ /** Number of tools */
86
+ toolCount: number;
87
+ }
88
+ /**
89
+ * Interface for spec consumers.
90
+ */
91
+ interface SpecConsumer {
92
+ getSpecMarkdown(specKey: string, options?: SpecMarkdownOptions): string;
93
+ getSpecPrompt(specKey: string, options?: SpecPromptOptions): string;
94
+ listSpecs(options?: SpecListOptions): SpecListResult[];
95
+ querySpec(specKey: string): SpecQueryResult | undefined;
96
+ hasSpec(specKey: string): boolean;
97
+ getSpec(specKey: string): AgentSpec | undefined;
98
+ getAllSpecs(): AgentSpec[];
99
+ getSpecCount(): number;
100
+ addSpec(spec: AgentSpec): void;
101
+ removeSpec(specKey: string): boolean;
102
+ }
103
+ /**
104
+ * Configuration for a tool consumer.
105
+ */
106
+ interface ToolConsumerConfig {
107
+ /** Tools with optional handlers */
108
+ tools: {
109
+ config: AgentToolConfig;
110
+ handler?: ToolHandler;
111
+ }[];
112
+ }
113
+ /**
114
+ * Configuration for a tool server.
115
+ */
116
+ interface ToolServerConfig {
117
+ /** Tools with optional handlers */
118
+ tools: {
119
+ config: AgentToolConfig;
120
+ handler?: ToolHandler;
121
+ }[];
122
+ /** Server name */
123
+ name?: string;
124
+ /** Server version */
125
+ version?: string;
126
+ /** Port to run on */
127
+ port?: number;
128
+ }
129
+ /**
130
+ * Interface for tool servers.
131
+ */
132
+ interface ToolServer {
133
+ start(): Promise<void>;
134
+ stop(): Promise<void>;
135
+ isRunning(): boolean;
136
+ getTools(): AgentToolConfig[];
137
+ }
138
+ /**
139
+ * Format for tool export.
140
+ */
141
+ type ToolExportFormat = 'claude-agent' | 'opencode' | 'mcp' | 'openai';
142
+ /**
143
+ * Interface for tool consumers.
144
+ */
145
+ interface ToolConsumer {
146
+ createToolServer(config?: Partial<ToolServerConfig>): ToolServer;
147
+ exportToolsForSDK(format: ToolExportFormat): unknown[];
148
+ getTools(): AgentToolConfig[];
149
+ getTool(name: string): AgentToolConfig | undefined;
150
+ hasTool(name: string): boolean;
151
+ addTool(config: AgentToolConfig, handler?: ToolHandler): void;
152
+ removeTool(name: string): boolean;
153
+ getToolCount(): number;
154
+ }
155
+ /**
156
+ * Spec list entry for discovery.
157
+ */
158
+ interface SpecListEntry {
159
+ /** Spec key */
160
+ key: string;
161
+ /** Spec version */
162
+ version: string;
163
+ /** Spec type */
164
+ type: 'agent' | 'operation' | 'event' | 'presentation';
165
+ /** Brief description */
166
+ description?: string;
167
+ /** Tags for categorization */
168
+ tags?: string[];
169
+ }
170
+ /**
171
+ * Task type for implementation prompts.
172
+ */
173
+ type ImplementationTaskType = 'implement' | 'test' | 'review' | 'refactor' | 'document';
174
+ /**
175
+ * Options for generating implementation prompts.
176
+ */
177
+ interface ImplementationPromptOptions {
178
+ /** Task type */
179
+ taskType?: ImplementationTaskType;
180
+ /** Target language/framework */
181
+ targetLanguage?: string;
182
+ /** Include examples in prompt */
183
+ includeExamples?: boolean;
184
+ /** Include test scenarios */
185
+ includeTestScenarios?: boolean;
186
+ /** Custom context to append */
187
+ customContext?: string;
188
+ }
189
+ /**
190
+ * Format options for spec export.
191
+ */
192
+ type SpecExportFormat = 'markdown' | 'json' | 'prompt' | 'context';
193
+ /**
194
+ * Tool configuration for external consumption.
195
+ */
196
+ interface ExternalToolConfig {
197
+ /** Tool name */
198
+ name: string;
199
+ /** Tool description */
200
+ description: string;
201
+ /** Input schema */
202
+ inputSchema: Record<string, unknown>;
203
+ /** Whether approval is required */
204
+ requiresApproval: boolean;
205
+ /** Tool category */
206
+ category?: string;
207
+ }
208
+ /**
209
+ * Tool handler with metadata.
210
+ */
211
+ interface ToolWithHandler {
212
+ /** Tool configuration */
213
+ config: AgentToolConfig;
214
+ /** Tool handler function */
215
+ handler: ToolHandler;
216
+ }
217
+ /**
218
+ * Target SDK for tool export.
219
+ */
220
+ type ToolExportTarget = 'claude-agent' | 'opencode' | 'mcp';
221
+ /**
222
+ * MCP server configuration.
223
+ */
224
+ interface McpServerConfig {
225
+ /** Server name */
226
+ name: string;
227
+ /** Server description */
228
+ description?: string;
229
+ /** Server version */
230
+ version?: string;
231
+ /** Tools to expose */
232
+ tools: AgentToolConfig[];
233
+ /** Tool handlers */
234
+ handlers: Map<string, ToolHandler>;
235
+ }
236
+ /**
237
+ * MCP tool definition for server.
238
+ */
239
+ interface McpToolDefinition {
240
+ name: string;
241
+ description: string;
242
+ inputSchema: {
243
+ type: 'object';
244
+ properties?: Record<string, unknown>;
245
+ required?: string[];
246
+ };
247
+ }
248
+ /**
249
+ * Provider type for UnifiedAgent.
250
+ */
251
+ type UnifiedAgentProvider = 'ai-sdk' | 'claude-agent-sdk' | 'opencode-sdk';
252
+ /**
253
+ * Unified agent status.
254
+ */
255
+ type UnifiedAgentStatus = 'idle' | 'initializing' | 'ready' | 'running' | 'completed' | 'failed';
256
+ /**
257
+ * Unified agent execution mode.
258
+ */
259
+ type ExecutionMode = 'generate' | 'stream';
260
+ //#endregion
261
+ export { ExecutionMode, ExternalToolConfig, ImplementationPromptOptions, ImplementationTaskType, McpServerConfig, McpToolDefinition, SpecConsumer, SpecConsumerConfig, SpecExportFormat, SpecListEntry, SpecListOptions, SpecListResult, SpecMarkdownOptions, SpecPromptOptions, SpecQueryResult, ToolConsumer, ToolConsumerConfig, ToolExportFormat, ToolExportTarget, ToolServer, ToolServerConfig, ToolWithHandler, UnifiedAgentProvider, UnifiedAgentStatus };
262
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/interop/types.ts"],"sourcesContent":[],"mappings":";;;;;AA2EA;AAUA;AAoBA;AAC6C,UAzF5B,kBAAA,CAyF4B;EACF;EACrB,KAAA,EAzFb,SAyFa,EAAA;EAAkB;EACV,eAAA,CAAA,EAAA,OAAA;EAEF;EACX,OAAA,CAAA,EAAA,MAAA;;;AAajB;AAWA;AAiBiB,UA5HA,mBAAA,CA4HU;EAChB;EACD,UAAA,CAAA,EAAA,OAAA;EAEI;EAAe,eAAA,CAAA,EAAA,OAAA;EAMjB;EAKK,YAAA,CAAA,EAAY,OAAA;EACO;EAAR,kBAAA,CAAA,EAAA,OAAA;EAA4B;EAC5B,YAAA,CAAA,EAAA,MAAA;;;;;AAI4B,UAjIvC,iBAAA,CAiIuC;EAYvC;EAgBL,YAAA,CAAA,EAAA,OAAA;EAUK;EAgBL,eAAA,CAAA,EAAA,OAAgB;EAKX;EAgBA,kBAAe,CAAA,EAAA,OAAA;EAUpB;EAKK,MAAA,CAAA,EAAA,YAAe,GAAA,SAAA;EAQvB;EAEe,aAAA,CAAA,EAAA,MAAA;;;AAMxB;AAaA;AAQY,UAhPK,eAAA,CAgPa;EAWlB;;;QAvPJ;;;;;;;;;UAUS,eAAA;;;;;;;;;UAUA,cAAA;;;;;;;;;;;;;;;;;;;UAoBA,YAAA;6CAC4B;2CACF;sBACrB,kBAAkB;8BACV;;4BAEF;iBACX;;gBAED;;;;;;UAWC,kBAAA;;;YAGL;cACE;;;;;;UAOG,gBAAA;;;YAGL;cACE;;;;;;;;;;;;UAaG,UAAA;WACN;UACD;;cAEI;;;;;KAMF,gBAAA;;;;UAKK,YAAA;4BACW,QAAQ,oBAAoB;4BAC5B;cACd;yBACW;;kBAEP,2BAA2B;;;;;;;UAY5B,aAAA;;;;;;;;;;;;;;;KAgBL,sBAAA;;;;UAUK,2BAAA;;aAEJ;;;;;;;;;;;;;KAcD,gBAAA;;;;UAKK,kBAAA;;;;;;eAMF;;;;;;;;;UAUE,eAAA;;UAEP;;WAEC;;;;;KAMC,gBAAA;;;;UAKK,eAAA;;;;;;;;SAQR;;YAEG,YAAY;;;;;UAMP,iBAAA;;;;;iBAKA;;;;;;;KAQL,oBAAA;;;;KAQA,kBAAA;;;;KAWA,aAAA"}
File without changes
@@ -0,0 +1,2 @@
1
+ import { createKnowledgeInjector, injectStaticKnowledge } from "./injector.js";
2
+ export { createKnowledgeInjector, injectStaticKnowledge };
@@ -0,0 +1,3 @@
1
+ import { createKnowledgeInjector, injectStaticKnowledge } from "./injector.js";
2
+
3
+ export { createKnowledgeInjector, injectStaticKnowledge };
@@ -0,0 +1,38 @@
1
+ import { AgentKnowledgeRef } from "../spec/spec.js";
2
+ import { KnowledgeRetriever } from "@contractspec/lib.knowledge/retriever";
3
+
4
+ //#region src/knowledge/injector.d.ts
5
+
6
+ /**
7
+ * Inject static knowledge into agent instructions.
8
+ *
9
+ * This function handles the "required" knowledge that should be
10
+ * injected into the system prompt at agent initialization time.
11
+ * Optional knowledge is handled by the knowledge query tool.
12
+ *
13
+ * @param instructions - Base agent instructions
14
+ * @param knowledgeRefs - Knowledge references from the agent spec
15
+ * @param retriever - Optional knowledge retriever
16
+ * @returns Instructions with injected knowledge
17
+ */
18
+ declare function injectStaticKnowledge(instructions: string, knowledgeRefs: AgentKnowledgeRef[], retriever?: KnowledgeRetriever): Promise<string>;
19
+ /**
20
+ * Create a knowledge injector instance for reuse.
21
+ */
22
+ declare function createKnowledgeInjector(retriever?: KnowledgeRetriever): {
23
+ /**
24
+ * Inject static knowledge into instructions.
25
+ */
26
+ inject: (instructions: string, knowledgeRefs: AgentKnowledgeRef[]) => Promise<string>;
27
+ /**
28
+ * Check if a knowledge space is available.
29
+ */
30
+ hasSpace: (spaceKey: string) => boolean;
31
+ /**
32
+ * List available knowledge spaces.
33
+ */
34
+ listSpaces: () => string[];
35
+ };
36
+ //#endregion
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"}
@@ -0,0 +1,58 @@
1
+ //#region src/knowledge/injector.ts
2
+ /**
3
+ * Inject static knowledge into agent instructions.
4
+ *
5
+ * This function handles the "required" knowledge that should be
6
+ * injected into the system prompt at agent initialization time.
7
+ * Optional knowledge is handled by the knowledge query tool.
8
+ *
9
+ * @param instructions - Base agent instructions
10
+ * @param knowledgeRefs - Knowledge references from the agent spec
11
+ * @param retriever - Optional knowledge retriever
12
+ * @returns Instructions with injected knowledge
13
+ */
14
+ async function injectStaticKnowledge(instructions, knowledgeRefs, retriever) {
15
+ if (!retriever) return instructions;
16
+ const requiredRefs = knowledgeRefs.filter((ref) => ref.required);
17
+ if (requiredRefs.length === 0) return instructions;
18
+ const blocks = [];
19
+ for (const ref of requiredRefs) {
20
+ if (!retriever.supportsSpace(ref.key)) {
21
+ console.warn(`Required knowledge space "${ref.key}" is not available`);
22
+ continue;
23
+ }
24
+ try {
25
+ const content = await retriever.getStatic(ref.key);
26
+ if (content) {
27
+ const header = ref.instructions ? `## ${ref.key}\n${ref.instructions}` : `## ${ref.key}`;
28
+ blocks.push(`${header}\n\n${content}`);
29
+ }
30
+ } catch (error) {
31
+ console.warn(`Failed to load required knowledge "${ref.key}":`, error);
32
+ }
33
+ }
34
+ if (blocks.length === 0) return instructions;
35
+ return `${instructions}
36
+
37
+ ---
38
+
39
+ # Reference Knowledge
40
+
41
+ The following information is provided for your reference. Use it to inform your responses.
42
+
43
+ ${blocks.join("\n\n---\n\n")}`;
44
+ }
45
+ /**
46
+ * Create a knowledge injector instance for reuse.
47
+ */
48
+ function createKnowledgeInjector(retriever) {
49
+ return {
50
+ inject: (instructions, knowledgeRefs) => injectStaticKnowledge(instructions, knowledgeRefs, retriever),
51
+ hasSpace: (spaceKey) => retriever?.supportsSpace(spaceKey) ?? false,
52
+ listSpaces: () => retriever?.listSpaces() ?? []
53
+ };
54
+ }
55
+
56
+ //#endregion
57
+ export { createKnowledgeInjector, injectStaticKnowledge };
58
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","names":[],"sources":["../../src/knowledge/injector.ts"],"sourcesContent":["import type { KnowledgeRetriever } from '@contractspec/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,MAAM,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"}
@@ -0,0 +1,22 @@
1
+ import { AgentSessionState } from "../types.js";
2
+ import { AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager } from "./manager.js";
3
+
4
+ //#region src/memory/in-memory.d.ts
5
+ interface InMemoryAgentMemoryOptions {
6
+ ttlMinutes?: number;
7
+ maxEntries?: number;
8
+ }
9
+ declare class InMemoryAgentMemory extends BaseAgentMemoryManager {
10
+ private readonly ttlMs;
11
+ private readonly maxEntries;
12
+ private readonly store;
13
+ constructor(options?: InMemoryAgentMemoryOptions);
14
+ load(sessionId: string): Promise<AgentSessionMemory | null>;
15
+ save(snapshot: AgentSessionMemory): Promise<void>;
16
+ summarize(session: AgentSessionState): Promise<AgentMemorySnapshot>;
17
+ private trim;
18
+ private evictExpired;
19
+ }
20
+ //#endregion
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"}
@@ -0,0 +1,48 @@
1
+ import { BaseAgentMemoryManager } from "./manager.js";
2
+
3
+ //#region src/memory/in-memory.ts
4
+ var InMemoryAgentMemory = class extends BaseAgentMemoryManager {
5
+ ttlMs;
6
+ maxEntries;
7
+ store = /* @__PURE__ */ new Map();
8
+ constructor(options) {
9
+ super();
10
+ this.ttlMs = (options?.ttlMinutes ?? 60) * 60 * 1e3;
11
+ this.maxEntries = options?.maxEntries ?? 250;
12
+ }
13
+ async load(sessionId) {
14
+ this.evictExpired();
15
+ const stored = this.store.get(sessionId);
16
+ if (!stored) return null;
17
+ stored.data.session.updatedAt = /* @__PURE__ */ new Date();
18
+ stored.expiresAt = Date.now() + this.ttlMs;
19
+ return stored.data;
20
+ }
21
+ async save(snapshot) {
22
+ this.trim(snapshot.memory.entries);
23
+ this.store.set(snapshot.session.sessionId, {
24
+ data: snapshot,
25
+ expiresAt: Date.now() + this.ttlMs
26
+ });
27
+ }
28
+ async summarize(session) {
29
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
30
+ const content = current.memory.entries.slice(-10).map((entry) => `- ${entry.type}: ${entry.content}`).join("\n");
31
+ current.memory.summary = content;
32
+ current.memory.lastSummarizedAt = /* @__PURE__ */ new Date();
33
+ await this.save(current);
34
+ return current.memory;
35
+ }
36
+ trim(entries) {
37
+ if (entries.length <= this.maxEntries) return;
38
+ entries.splice(0, entries.length - this.maxEntries);
39
+ }
40
+ evictExpired() {
41
+ const now = Date.now();
42
+ for (const [sessionId, stored] of this.store.entries()) if (stored.expiresAt <= now) this.store.delete(sessionId);
43
+ }
44
+ };
45
+
46
+ //#endregion
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"}
@@ -0,0 +1,3 @@
1
+ import { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, trackMessageInMemory } from "./manager.js";
2
+ import { InMemoryAgentMemory, InMemoryAgentMemoryOptions } from "./in-memory.js";
3
+ export { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, InMemoryAgentMemory, InMemoryAgentMemoryOptions, trackMessageInMemory };
@@ -0,0 +1,4 @@
1
+ import { BaseAgentMemoryManager, trackMessageInMemory } from "./manager.js";
2
+ import { InMemoryAgentMemory } from "./in-memory.js";
3
+
4
+ export { BaseAgentMemoryManager, InMemoryAgentMemory, trackMessageInMemory };
@@ -0,0 +1,42 @@
1
+ import { AgentMessage, AgentSessionState } from "../types.js";
2
+
3
+ //#region src/memory/manager.d.ts
4
+ interface AgentMemoryEntry {
5
+ id: string;
6
+ type: 'user' | 'assistant' | 'tool' | 'system';
7
+ content: string;
8
+ createdAt: Date;
9
+ metadata?: Record<string, string>;
10
+ }
11
+ interface AgentMemorySnapshot {
12
+ entries: AgentMemoryEntry[];
13
+ summary?: string;
14
+ lastSummarizedAt?: Date;
15
+ }
16
+ interface AgentSessionMemory {
17
+ session: AgentSessionState;
18
+ memory: AgentMemorySnapshot;
19
+ }
20
+ interface AgentMemoryManager {
21
+ load(sessionId: string): Promise<AgentSessionMemory | null>;
22
+ save(snapshot: AgentSessionMemory): Promise<void>;
23
+ append(session: AgentSessionState, entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & {
24
+ createdAt?: Date;
25
+ }): Promise<AgentSessionMemory>;
26
+ summarize(session: AgentSessionState): Promise<AgentMemorySnapshot | undefined>;
27
+ prune(session: AgentSessionState): Promise<void>;
28
+ }
29
+ declare abstract class BaseAgentMemoryManager implements AgentMemoryManager {
30
+ abstract load(sessionId: string): Promise<AgentSessionMemory | null>;
31
+ abstract save(snapshot: AgentSessionMemory): Promise<void>;
32
+ append(session: AgentSessionState, entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & {
33
+ createdAt?: Date;
34
+ }): Promise<AgentSessionMemory>;
35
+ summarize(_session: AgentSessionState): Promise<AgentMemorySnapshot | undefined>;
36
+ prune(_session: AgentSessionState): Promise<void>;
37
+ protected bootstrapMemory(session: AgentSessionState): AgentSessionMemory;
38
+ }
39
+ declare function trackMessageInMemory(manager: AgentMemoryManager | undefined, session: AgentSessionState, message: AgentMessage): void;
40
+ //#endregion
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"}
@@ -0,0 +1,80 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ //#region src/memory/manager.ts
4
+ /**
5
+ * Extract text content from a ModelMessage.
6
+ * Handles both string content and array content parts.
7
+ */
8
+ function extractMessageContent(message) {
9
+ const content = message.content;
10
+ if (typeof content === "string") return content;
11
+ if (Array.isArray(content)) return content.map((part) => {
12
+ if (typeof part === "string") return part;
13
+ if ("text" in part && typeof part.text === "string") return part.text;
14
+ return "";
15
+ }).filter(Boolean).join("");
16
+ return "";
17
+ }
18
+ /**
19
+ * Extract text content from an AgentMessage.
20
+ */
21
+ function extractAgentMessageContent(message) {
22
+ const content = message.content;
23
+ if (typeof content === "string") return content;
24
+ if (Array.isArray(content)) return content.map((part) => {
25
+ if (typeof part === "string") return part;
26
+ if ("text" in part && typeof part.text === "string") return part.text;
27
+ return "";
28
+ }).filter(Boolean).join("");
29
+ return "";
30
+ }
31
+ /**
32
+ * Map ModelMessage role to memory entry type.
33
+ */
34
+ function roleToEntryType(role) {
35
+ switch (role) {
36
+ case "assistant": return "assistant";
37
+ case "system": return "system";
38
+ case "tool": return "tool";
39
+ case "user":
40
+ default: return "user";
41
+ }
42
+ }
43
+ var BaseAgentMemoryManager = class {
44
+ async append(session, entry) {
45
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
46
+ const finalEntry = {
47
+ id: randomUUID(),
48
+ createdAt: entry.createdAt ?? /* @__PURE__ */ new Date(),
49
+ ...entry
50
+ };
51
+ current.memory.entries.push(finalEntry);
52
+ await this.save(current);
53
+ return current;
54
+ }
55
+ async summarize(_session) {}
56
+ async prune(_session) {}
57
+ bootstrapMemory(session) {
58
+ return {
59
+ session,
60
+ memory: { entries: session.messages.map((message) => ({
61
+ id: randomUUID(),
62
+ createdAt: /* @__PURE__ */ new Date(),
63
+ type: roleToEntryType(message.role),
64
+ content: extractMessageContent(message)
65
+ })) }
66
+ };
67
+ }
68
+ };
69
+ function trackMessageInMemory(manager, session, message) {
70
+ if (!manager) return;
71
+ manager.append(session, {
72
+ type: message.role,
73
+ content: extractAgentMessageContent(message),
74
+ metadata: message.metadata
75
+ });
76
+ }
77
+
78
+ //#endregion
79
+ export { BaseAgentMemoryManager, trackMessageInMemory };
80
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","names":[],"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,MAAM,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"}