@contractspec/lib.ai-agent 1.57.0 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/agent/agent-factory.d.ts +67 -71
  2. package/dist/agent/agent-factory.d.ts.map +1 -1
  3. package/dist/agent/agent-factory.js +658 -100
  4. package/dist/agent/agent.test.d.ts +2 -0
  5. package/dist/agent/agent.test.d.ts.map +1 -0
  6. package/dist/agent/contract-spec-agent.d.ts +48 -52
  7. package/dist/agent/contract-spec-agent.d.ts.map +1 -1
  8. package/dist/agent/contract-spec-agent.js +605 -146
  9. package/dist/agent/index.d.ts +4 -4
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +2102 -4
  12. package/dist/agent/json-runner.d.ts +15 -19
  13. package/dist/agent/json-runner.d.ts.map +1 -1
  14. package/dist/agent/json-runner.js +672 -57
  15. package/dist/agent/json-runner.test.d.ts +2 -0
  16. package/dist/agent/json-runner.test.d.ts.map +1 -0
  17. package/dist/agent/unified-agent.d.ts +132 -109
  18. package/dist/agent/unified-agent.d.ts.map +1 -1
  19. package/dist/agent/unified-agent.js +2011 -293
  20. package/dist/approval/index.d.ts +3 -2
  21. package/dist/approval/index.d.ts.map +1 -0
  22. package/dist/approval/index.js +128 -2
  23. package/dist/approval/workflow.d.ts +106 -110
  24. package/dist/approval/workflow.d.ts.map +1 -1
  25. package/dist/approval/workflow.js +126 -157
  26. package/dist/exporters/claude-agent-exporter.d.ts +50 -48
  27. package/dist/exporters/claude-agent-exporter.d.ts.map +1 -1
  28. package/dist/exporters/claude-agent-exporter.js +258 -203
  29. package/dist/exporters/index.d.ts +28 -4
  30. package/dist/exporters/index.d.ts.map +1 -0
  31. package/dist/exporters/index.js +737 -3
  32. package/dist/exporters/opencode-exporter.d.ts +47 -45
  33. package/dist/exporters/opencode-exporter.d.ts.map +1 -1
  34. package/dist/exporters/opencode-exporter.js +507 -191
  35. package/dist/exporters/types.d.ts +171 -169
  36. package/dist/exporters/types.d.ts.map +1 -1
  37. package/dist/exporters/types.js +1 -0
  38. package/dist/index.d.ts +15 -39
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +3337 -32
  41. package/dist/interop/index.d.ts +48 -4
  42. package/dist/interop/index.d.ts.map +1 -0
  43. package/dist/interop/index.js +709 -3
  44. package/dist/interop/spec-consumer.d.ts +57 -53
  45. package/dist/interop/spec-consumer.d.ts.map +1 -1
  46. package/dist/interop/spec-consumer.js +302 -282
  47. package/dist/interop/tool-consumer.d.ts +57 -53
  48. package/dist/interop/tool-consumer.d.ts.map +1 -1
  49. package/dist/interop/tool-consumer.js +412 -213
  50. package/dist/interop/types.d.ts +173 -171
  51. package/dist/interop/types.d.ts.map +1 -1
  52. package/dist/interop/types.js +1 -0
  53. package/dist/knowledge/index.d.ts +2 -2
  54. package/dist/knowledge/index.d.ts.map +1 -0
  55. package/dist/knowledge/index.js +66 -2
  56. package/dist/knowledge/injector.d.ts +16 -20
  57. package/dist/knowledge/injector.d.ts.map +1 -1
  58. package/dist/knowledge/injector.js +56 -47
  59. package/dist/memory/in-memory.d.ts +15 -19
  60. package/dist/memory/in-memory.d.ts.map +1 -1
  61. package/dist/memory/in-memory.js +152 -46
  62. package/dist/memory/index.d.ts +3 -3
  63. package/dist/memory/index.d.ts.map +1 -0
  64. package/dist/memory/index.js +155 -3
  65. package/dist/memory/manager.d.ts +32 -36
  66. package/dist/memory/manager.d.ts.map +1 -1
  67. package/dist/memory/manager.js +96 -70
  68. package/dist/memory/memory.test.d.ts +2 -0
  69. package/dist/memory/memory.test.d.ts.map +1 -0
  70. package/dist/node/agent/agent-factory.js +661 -0
  71. package/dist/node/agent/contract-spec-agent.js +607 -0
  72. package/dist/node/agent/index.js +2103 -0
  73. package/dist/node/agent/json-runner.js +684 -0
  74. package/dist/node/agent/unified-agent.js +2019 -0
  75. package/dist/node/approval/index.js +129 -0
  76. package/dist/node/approval/workflow.js +129 -0
  77. package/dist/node/exporters/claude-agent-exporter.js +265 -0
  78. package/dist/node/exporters/index.js +738 -0
  79. package/dist/node/exporters/opencode-exporter.js +516 -0
  80. package/dist/node/exporters/types.js +0 -0
  81. package/dist/node/index.js +3337 -0
  82. package/dist/node/interop/index.js +710 -0
  83. package/dist/node/interop/spec-consumer.js +307 -0
  84. package/dist/node/interop/tool-consumer.js +419 -0
  85. package/dist/node/interop/types.js +0 -0
  86. package/dist/node/knowledge/index.js +67 -0
  87. package/dist/node/knowledge/injector.js +67 -0
  88. package/dist/node/memory/in-memory.js +154 -0
  89. package/dist/node/memory/index.js +156 -0
  90. package/dist/node/memory/manager.js +105 -0
  91. package/dist/node/providers/claude-agent-sdk/adapter.js +624 -0
  92. package/dist/node/providers/claude-agent-sdk/index.js +673 -0
  93. package/dist/node/providers/claude-agent-sdk/session-bridge.js +149 -0
  94. package/dist/node/providers/claude-agent-sdk/tool-bridge.js +118 -0
  95. package/dist/node/providers/index.js +1261 -0
  96. package/dist/node/providers/opencode-sdk/adapter.js +669 -0
  97. package/dist/node/providers/opencode-sdk/agent-bridge.js +299 -0
  98. package/dist/node/providers/opencode-sdk/index.js +703 -0
  99. package/dist/node/providers/opencode-sdk/tool-bridge.js +141 -0
  100. package/dist/node/providers/registry.js +89 -0
  101. package/dist/node/providers/types.js +56 -0
  102. package/dist/node/schema/index.js +195 -0
  103. package/dist/node/schema/json-schema-to-zod.js +152 -0
  104. package/dist/node/schema/schema-output.js +190 -0
  105. package/dist/node/session/index.js +90 -0
  106. package/dist/node/session/store.js +90 -0
  107. package/dist/node/spec/index.js +85 -0
  108. package/dist/node/spec/registry.js +56 -0
  109. package/dist/node/spec/spec.js +44 -0
  110. package/dist/node/telemetry/adapter.js +85 -0
  111. package/dist/node/telemetry/index.js +86 -0
  112. package/dist/node/tools/index.js +345 -0
  113. package/dist/node/tools/knowledge-tool.js +74 -0
  114. package/dist/node/tools/mcp-client.js +47 -0
  115. package/dist/node/tools/mcp-server.js +205 -0
  116. package/dist/node/tools/tool-adapter.js +197 -0
  117. package/dist/node/types.js +0 -0
  118. package/dist/providers/claude-agent-sdk/adapter.d.ts +60 -52
  119. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -1
  120. package/dist/providers/claude-agent-sdk/adapter.js +622 -304
  121. package/dist/providers/claude-agent-sdk/index.d.ts +22 -4
  122. package/dist/providers/claude-agent-sdk/index.d.ts.map +1 -0
  123. package/dist/providers/claude-agent-sdk/index.js +672 -4
  124. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +43 -40
  125. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -1
  126. package/dist/providers/claude-agent-sdk/session-bridge.js +121 -130
  127. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +63 -60
  128. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -1
  129. package/dist/providers/claude-agent-sdk/tool-bridge.js +104 -108
  130. package/dist/providers/index.d.ts +28 -7
  131. package/dist/providers/index.d.ts.map +1 -0
  132. package/dist/providers/index.js +1261 -8
  133. package/dist/providers/opencode-sdk/adapter.d.ts +56 -48
  134. package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -1
  135. package/dist/providers/opencode-sdk/adapter.js +667 -274
  136. package/dist/providers/opencode-sdk/agent-bridge.d.ts +62 -57
  137. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -1
  138. package/dist/providers/opencode-sdk/agent-bridge.js +289 -155
  139. package/dist/providers/opencode-sdk/index.d.ts +22 -4
  140. package/dist/providers/opencode-sdk/index.d.ts.map +1 -0
  141. package/dist/providers/opencode-sdk/index.js +702 -4
  142. package/dist/providers/opencode-sdk/tool-bridge.d.ts +41 -42
  143. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -1
  144. package/dist/providers/opencode-sdk/tool-bridge.js +121 -107
  145. package/dist/providers/registry.d.ts +10 -11
  146. package/dist/providers/registry.d.ts.map +1 -1
  147. package/dist/providers/registry.js +86 -49
  148. package/dist/providers/types.d.ts +169 -166
  149. package/dist/providers/types.d.ts.map +1 -1
  150. package/dist/providers/types.js +54 -42
  151. package/dist/schema/index.d.ts +3 -3
  152. package/dist/schema/index.d.ts.map +1 -0
  153. package/dist/schema/index.js +194 -3
  154. package/dist/schema/json-schema-to-zod.d.ts +23 -26
  155. package/dist/schema/json-schema-to-zod.d.ts.map +1 -1
  156. package/dist/schema/json-schema-to-zod.js +138 -110
  157. package/dist/schema/schema-output.d.ts +29 -32
  158. package/dist/schema/schema-output.d.ts.map +1 -1
  159. package/dist/schema/schema-output.js +178 -53
  160. package/dist/session/index.d.ts +2 -2
  161. package/dist/session/index.d.ts.map +1 -0
  162. package/dist/session/index.js +89 -2
  163. package/dist/session/store.d.ts +51 -55
  164. package/dist/session/store.d.ts.map +1 -1
  165. package/dist/session/store.js +85 -74
  166. package/dist/spec/index.d.ts +3 -3
  167. package/dist/spec/index.d.ts.map +1 -0
  168. package/dist/spec/index.js +84 -3
  169. package/dist/spec/registry.d.ts +32 -36
  170. package/dist/spec/registry.d.ts.map +1 -1
  171. package/dist/spec/registry.js +51 -60
  172. package/dist/spec/spec.d.ts +80 -84
  173. package/dist/spec/spec.d.ts.map +1 -1
  174. package/dist/spec/spec.js +40 -26
  175. package/dist/telemetry/adapter.d.ts +33 -37
  176. package/dist/telemetry/adapter.d.ts.map +1 -1
  177. package/dist/telemetry/adapter.js +78 -96
  178. package/dist/telemetry/index.d.ts +2 -2
  179. package/dist/telemetry/index.d.ts.map +1 -0
  180. package/dist/telemetry/index.js +85 -2
  181. package/dist/tools/index.d.ts +5 -5
  182. package/dist/tools/index.d.ts.map +1 -0
  183. package/dist/tools/index.js +344 -5
  184. package/dist/tools/knowledge-tool.d.ts +4 -8
  185. package/dist/tools/knowledge-tool.d.ts.map +1 -1
  186. package/dist/tools/knowledge-tool.js +68 -48
  187. package/dist/tools/mcp-client.d.ts +17 -21
  188. package/dist/tools/mcp-client.d.ts.map +1 -1
  189. package/dist/tools/mcp-client.js +42 -53
  190. package/dist/tools/mcp-server.d.ts +14 -18
  191. package/dist/tools/mcp-server.d.ts.map +1 -1
  192. package/dist/tools/mcp-server.js +200 -64
  193. package/dist/tools/tool-adapter.d.ts +7 -11
  194. package/dist/tools/tool-adapter.d.ts.map +1 -1
  195. package/dist/tools/tool-adapter.js +187 -70
  196. package/dist/tools/tools.test.d.ts +2 -0
  197. package/dist/tools/tools.test.d.ts.map +1 -0
  198. package/dist/types.d.ts +108 -111
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/types.js +1 -0
  201. package/package.json +448 -90
  202. package/dist/_virtual/_rolldown/runtime.js +0 -8
  203. package/dist/agent/agent-factory.js.map +0 -1
  204. package/dist/agent/contract-spec-agent.js.map +0 -1
  205. package/dist/agent/json-runner.js.map +0 -1
  206. package/dist/agent/unified-agent.js.map +0 -1
  207. package/dist/approval/workflow.js.map +0 -1
  208. package/dist/exporters/claude-agent-exporter.js.map +0 -1
  209. package/dist/exporters/opencode-exporter.js.map +0 -1
  210. package/dist/interop/spec-consumer.js.map +0 -1
  211. package/dist/interop/tool-consumer.js.map +0 -1
  212. package/dist/knowledge/injector.js.map +0 -1
  213. package/dist/memory/in-memory.js.map +0 -1
  214. package/dist/memory/manager.js.map +0 -1
  215. package/dist/providers/claude-agent-sdk/adapter.js.map +0 -1
  216. package/dist/providers/claude-agent-sdk/session-bridge.js.map +0 -1
  217. package/dist/providers/claude-agent-sdk/tool-bridge.js.map +0 -1
  218. package/dist/providers/opencode-sdk/adapter.js.map +0 -1
  219. package/dist/providers/opencode-sdk/agent-bridge.js.map +0 -1
  220. package/dist/providers/opencode-sdk/tool-bridge.js.map +0 -1
  221. package/dist/providers/registry.js.map +0 -1
  222. package/dist/providers/types.js.map +0 -1
  223. package/dist/schema/json-schema-to-zod.js.map +0 -1
  224. package/dist/schema/schema-output.js.map +0 -1
  225. package/dist/session/store.js.map +0 -1
  226. package/dist/spec/registry.js.map +0 -1
  227. package/dist/spec/spec.js.map +0 -1
  228. package/dist/telemetry/adapter.js.map +0 -1
  229. package/dist/tools/knowledge-tool.js.map +0 -1
  230. package/dist/tools/mcp-client.js.map +0 -1
  231. package/dist/tools/mcp-server.js.map +0 -1
  232. package/dist/tools/tool-adapter.js.map +0 -1
File without changes
@@ -0,0 +1,67 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ // src/knowledge/injector.ts
16
+ async function injectStaticKnowledge(instructions, knowledgeRefs, retriever) {
17
+ if (!retriever)
18
+ return instructions;
19
+ const requiredRefs = knowledgeRefs.filter((ref) => ref.required);
20
+ if (requiredRefs.length === 0)
21
+ return instructions;
22
+ const blocks = [];
23
+ for (const ref of requiredRefs) {
24
+ if (!retriever.supportsSpace(ref.key)) {
25
+ console.warn(`Required knowledge space "${ref.key}" is not available`);
26
+ continue;
27
+ }
28
+ try {
29
+ const content = await retriever.getStatic(ref.key);
30
+ if (content) {
31
+ const header = ref.instructions ? `## ${ref.key}
32
+ ${ref.instructions}` : `## ${ref.key}`;
33
+ blocks.push(`${header}
34
+
35
+ ${content}`);
36
+ }
37
+ } catch (error) {
38
+ console.warn(`Failed to load required knowledge "${ref.key}":`, error);
39
+ }
40
+ }
41
+ if (blocks.length === 0)
42
+ return instructions;
43
+ return `${instructions}
44
+
45
+ ---
46
+
47
+ # Reference Knowledge
48
+
49
+ The following information is provided for your reference. Use it to inform your responses.
50
+
51
+ ${blocks.join(`
52
+
53
+ ---
54
+
55
+ `)}`;
56
+ }
57
+ function createKnowledgeInjector(retriever) {
58
+ return {
59
+ inject: (instructions, knowledgeRefs) => injectStaticKnowledge(instructions, knowledgeRefs, retriever),
60
+ hasSpace: (spaceKey) => retriever?.supportsSpace(spaceKey) ?? false,
61
+ listSpaces: () => retriever?.listSpaces() ?? []
62
+ };
63
+ }
64
+ export {
65
+ injectStaticKnowledge,
66
+ createKnowledgeInjector
67
+ };
@@ -0,0 +1,67 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ // src/knowledge/injector.ts
16
+ async function injectStaticKnowledge(instructions, knowledgeRefs, retriever) {
17
+ if (!retriever)
18
+ return instructions;
19
+ const requiredRefs = knowledgeRefs.filter((ref) => ref.required);
20
+ if (requiredRefs.length === 0)
21
+ return instructions;
22
+ const blocks = [];
23
+ for (const ref of requiredRefs) {
24
+ if (!retriever.supportsSpace(ref.key)) {
25
+ console.warn(`Required knowledge space "${ref.key}" is not available`);
26
+ continue;
27
+ }
28
+ try {
29
+ const content = await retriever.getStatic(ref.key);
30
+ if (content) {
31
+ const header = ref.instructions ? `## ${ref.key}
32
+ ${ref.instructions}` : `## ${ref.key}`;
33
+ blocks.push(`${header}
34
+
35
+ ${content}`);
36
+ }
37
+ } catch (error) {
38
+ console.warn(`Failed to load required knowledge "${ref.key}":`, error);
39
+ }
40
+ }
41
+ if (blocks.length === 0)
42
+ return instructions;
43
+ return `${instructions}
44
+
45
+ ---
46
+
47
+ # Reference Knowledge
48
+
49
+ The following information is provided for your reference. Use it to inform your responses.
50
+
51
+ ${blocks.join(`
52
+
53
+ ---
54
+
55
+ `)}`;
56
+ }
57
+ function createKnowledgeInjector(retriever) {
58
+ return {
59
+ inject: (instructions, knowledgeRefs) => injectStaticKnowledge(instructions, knowledgeRefs, retriever),
60
+ hasSpace: (spaceKey) => retriever?.supportsSpace(spaceKey) ?? false,
61
+ listSpaces: () => retriever?.listSpaces() ?? []
62
+ };
63
+ }
64
+ export {
65
+ injectStaticKnowledge,
66
+ createKnowledgeInjector
67
+ };
@@ -0,0 +1,154 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ // src/memory/manager.ts
16
+ import { randomUUID } from "node:crypto";
17
+ function extractMessageContent(message) {
18
+ const content = message.content;
19
+ if (typeof content === "string") {
20
+ return content;
21
+ }
22
+ if (Array.isArray(content)) {
23
+ return content.map((part) => {
24
+ if (typeof part === "string")
25
+ return part;
26
+ if ("text" in part && typeof part.text === "string")
27
+ return part.text;
28
+ return "";
29
+ }).filter(Boolean).join("");
30
+ }
31
+ return "";
32
+ }
33
+ function extractAgentMessageContent(message) {
34
+ const content = message.content;
35
+ if (typeof content === "string") {
36
+ return content;
37
+ }
38
+ if (Array.isArray(content)) {
39
+ return content.map((part) => {
40
+ if (typeof part === "string")
41
+ return part;
42
+ if ("text" in part && typeof part.text === "string")
43
+ return part.text;
44
+ return "";
45
+ }).filter(Boolean).join("");
46
+ }
47
+ return "";
48
+ }
49
+ function roleToEntryType(role) {
50
+ switch (role) {
51
+ case "assistant":
52
+ return "assistant";
53
+ case "system":
54
+ return "system";
55
+ case "tool":
56
+ return "tool";
57
+ case "user":
58
+ default:
59
+ return "user";
60
+ }
61
+ }
62
+
63
+ class BaseAgentMemoryManager {
64
+ async append(session, entry) {
65
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
66
+ const finalEntry = {
67
+ id: randomUUID(),
68
+ createdAt: entry.createdAt ?? new Date,
69
+ ...entry
70
+ };
71
+ current.memory.entries.push(finalEntry);
72
+ await this.save(current);
73
+ return current;
74
+ }
75
+ async summarize(_session) {
76
+ return;
77
+ }
78
+ async prune(_session) {}
79
+ bootstrapMemory(session) {
80
+ return {
81
+ session,
82
+ memory: {
83
+ entries: session.messages.map((message) => ({
84
+ id: randomUUID(),
85
+ createdAt: new Date,
86
+ type: roleToEntryType(message.role),
87
+ content: extractMessageContent(message)
88
+ }))
89
+ }
90
+ };
91
+ }
92
+ }
93
+ function trackMessageInMemory(manager, session, message) {
94
+ if (!manager)
95
+ return;
96
+ manager.append(session, {
97
+ type: message.role,
98
+ content: extractAgentMessageContent(message),
99
+ metadata: message.metadata
100
+ });
101
+ }
102
+
103
+ // src/memory/in-memory.ts
104
+ class InMemoryAgentMemory extends BaseAgentMemoryManager {
105
+ ttlMs;
106
+ maxEntries;
107
+ store = new Map;
108
+ constructor(options) {
109
+ super();
110
+ this.ttlMs = (options?.ttlMinutes ?? 60) * 60 * 1000;
111
+ this.maxEntries = options?.maxEntries ?? 250;
112
+ }
113
+ async load(sessionId) {
114
+ this.evictExpired();
115
+ const stored = this.store.get(sessionId);
116
+ if (!stored)
117
+ return null;
118
+ stored.data.session.updatedAt = new Date;
119
+ stored.expiresAt = Date.now() + this.ttlMs;
120
+ return stored.data;
121
+ }
122
+ async save(snapshot) {
123
+ this.trim(snapshot.memory.entries);
124
+ this.store.set(snapshot.session.sessionId, {
125
+ data: snapshot,
126
+ expiresAt: Date.now() + this.ttlMs
127
+ });
128
+ }
129
+ async summarize(session) {
130
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
131
+ const content = current.memory.entries.slice(-10).map((entry) => `- ${entry.type}: ${entry.content}`).join(`
132
+ `);
133
+ current.memory.summary = content;
134
+ current.memory.lastSummarizedAt = new Date;
135
+ await this.save(current);
136
+ return current.memory;
137
+ }
138
+ trim(entries) {
139
+ if (entries.length <= this.maxEntries)
140
+ return;
141
+ entries.splice(0, entries.length - this.maxEntries);
142
+ }
143
+ evictExpired() {
144
+ const now = Date.now();
145
+ for (const [sessionId, stored] of this.store.entries()) {
146
+ if (stored.expiresAt <= now) {
147
+ this.store.delete(sessionId);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ export {
153
+ InMemoryAgentMemory
154
+ };
@@ -0,0 +1,156 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ // src/memory/manager.ts
16
+ import { randomUUID } from "node:crypto";
17
+ function extractMessageContent(message) {
18
+ const content = message.content;
19
+ if (typeof content === "string") {
20
+ return content;
21
+ }
22
+ if (Array.isArray(content)) {
23
+ return content.map((part) => {
24
+ if (typeof part === "string")
25
+ return part;
26
+ if ("text" in part && typeof part.text === "string")
27
+ return part.text;
28
+ return "";
29
+ }).filter(Boolean).join("");
30
+ }
31
+ return "";
32
+ }
33
+ function extractAgentMessageContent(message) {
34
+ const content = message.content;
35
+ if (typeof content === "string") {
36
+ return content;
37
+ }
38
+ if (Array.isArray(content)) {
39
+ return content.map((part) => {
40
+ if (typeof part === "string")
41
+ return part;
42
+ if ("text" in part && typeof part.text === "string")
43
+ return part.text;
44
+ return "";
45
+ }).filter(Boolean).join("");
46
+ }
47
+ return "";
48
+ }
49
+ function roleToEntryType(role) {
50
+ switch (role) {
51
+ case "assistant":
52
+ return "assistant";
53
+ case "system":
54
+ return "system";
55
+ case "tool":
56
+ return "tool";
57
+ case "user":
58
+ default:
59
+ return "user";
60
+ }
61
+ }
62
+
63
+ class BaseAgentMemoryManager {
64
+ async append(session, entry) {
65
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
66
+ const finalEntry = {
67
+ id: randomUUID(),
68
+ createdAt: entry.createdAt ?? new Date,
69
+ ...entry
70
+ };
71
+ current.memory.entries.push(finalEntry);
72
+ await this.save(current);
73
+ return current;
74
+ }
75
+ async summarize(_session) {
76
+ return;
77
+ }
78
+ async prune(_session) {}
79
+ bootstrapMemory(session) {
80
+ return {
81
+ session,
82
+ memory: {
83
+ entries: session.messages.map((message) => ({
84
+ id: randomUUID(),
85
+ createdAt: new Date,
86
+ type: roleToEntryType(message.role),
87
+ content: extractMessageContent(message)
88
+ }))
89
+ }
90
+ };
91
+ }
92
+ }
93
+ function trackMessageInMemory(manager, session, message) {
94
+ if (!manager)
95
+ return;
96
+ manager.append(session, {
97
+ type: message.role,
98
+ content: extractAgentMessageContent(message),
99
+ metadata: message.metadata
100
+ });
101
+ }
102
+
103
+ // src/memory/in-memory.ts
104
+ class InMemoryAgentMemory extends BaseAgentMemoryManager {
105
+ ttlMs;
106
+ maxEntries;
107
+ store = new Map;
108
+ constructor(options) {
109
+ super();
110
+ this.ttlMs = (options?.ttlMinutes ?? 60) * 60 * 1000;
111
+ this.maxEntries = options?.maxEntries ?? 250;
112
+ }
113
+ async load(sessionId) {
114
+ this.evictExpired();
115
+ const stored = this.store.get(sessionId);
116
+ if (!stored)
117
+ return null;
118
+ stored.data.session.updatedAt = new Date;
119
+ stored.expiresAt = Date.now() + this.ttlMs;
120
+ return stored.data;
121
+ }
122
+ async save(snapshot) {
123
+ this.trim(snapshot.memory.entries);
124
+ this.store.set(snapshot.session.sessionId, {
125
+ data: snapshot,
126
+ expiresAt: Date.now() + this.ttlMs
127
+ });
128
+ }
129
+ async summarize(session) {
130
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
131
+ const content = current.memory.entries.slice(-10).map((entry) => `- ${entry.type}: ${entry.content}`).join(`
132
+ `);
133
+ current.memory.summary = content;
134
+ current.memory.lastSummarizedAt = new Date;
135
+ await this.save(current);
136
+ return current.memory;
137
+ }
138
+ trim(entries) {
139
+ if (entries.length <= this.maxEntries)
140
+ return;
141
+ entries.splice(0, entries.length - this.maxEntries);
142
+ }
143
+ evictExpired() {
144
+ const now = Date.now();
145
+ for (const [sessionId, stored] of this.store.entries()) {
146
+ if (stored.expiresAt <= now) {
147
+ this.store.delete(sessionId);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ export {
153
+ trackMessageInMemory,
154
+ InMemoryAgentMemory,
155
+ BaseAgentMemoryManager
156
+ };
@@ -0,0 +1,105 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ // src/memory/manager.ts
16
+ import { randomUUID } from "node:crypto";
17
+ function extractMessageContent(message) {
18
+ const content = message.content;
19
+ if (typeof content === "string") {
20
+ return content;
21
+ }
22
+ if (Array.isArray(content)) {
23
+ return content.map((part) => {
24
+ if (typeof part === "string")
25
+ return part;
26
+ if ("text" in part && typeof part.text === "string")
27
+ return part.text;
28
+ return "";
29
+ }).filter(Boolean).join("");
30
+ }
31
+ return "";
32
+ }
33
+ function extractAgentMessageContent(message) {
34
+ const content = message.content;
35
+ if (typeof content === "string") {
36
+ return content;
37
+ }
38
+ if (Array.isArray(content)) {
39
+ return content.map((part) => {
40
+ if (typeof part === "string")
41
+ return part;
42
+ if ("text" in part && typeof part.text === "string")
43
+ return part.text;
44
+ return "";
45
+ }).filter(Boolean).join("");
46
+ }
47
+ return "";
48
+ }
49
+ function roleToEntryType(role) {
50
+ switch (role) {
51
+ case "assistant":
52
+ return "assistant";
53
+ case "system":
54
+ return "system";
55
+ case "tool":
56
+ return "tool";
57
+ case "user":
58
+ default:
59
+ return "user";
60
+ }
61
+ }
62
+
63
+ class BaseAgentMemoryManager {
64
+ async append(session, entry) {
65
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
66
+ const finalEntry = {
67
+ id: randomUUID(),
68
+ createdAt: entry.createdAt ?? new Date,
69
+ ...entry
70
+ };
71
+ current.memory.entries.push(finalEntry);
72
+ await this.save(current);
73
+ return current;
74
+ }
75
+ async summarize(_session) {
76
+ return;
77
+ }
78
+ async prune(_session) {}
79
+ bootstrapMemory(session) {
80
+ return {
81
+ session,
82
+ memory: {
83
+ entries: session.messages.map((message) => ({
84
+ id: randomUUID(),
85
+ createdAt: new Date,
86
+ type: roleToEntryType(message.role),
87
+ content: extractMessageContent(message)
88
+ }))
89
+ }
90
+ };
91
+ }
92
+ }
93
+ function trackMessageInMemory(manager, session, message) {
94
+ if (!manager)
95
+ return;
96
+ manager.append(session, {
97
+ type: message.role,
98
+ content: extractAgentMessageContent(message),
99
+ metadata: message.metadata
100
+ });
101
+ }
102
+ export {
103
+ trackMessageInMemory,
104
+ BaseAgentMemoryManager
105
+ };