@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.
- package/dist/agent/agent-factory.d.ts +67 -71
- package/dist/agent/agent-factory.d.ts.map +1 -1
- package/dist/agent/agent-factory.js +658 -100
- package/dist/agent/agent.test.d.ts +2 -0
- package/dist/agent/agent.test.d.ts.map +1 -0
- package/dist/agent/contract-spec-agent.d.ts +48 -52
- package/dist/agent/contract-spec-agent.d.ts.map +1 -1
- package/dist/agent/contract-spec-agent.js +605 -146
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2102 -4
- package/dist/agent/json-runner.d.ts +15 -19
- package/dist/agent/json-runner.d.ts.map +1 -1
- package/dist/agent/json-runner.js +672 -57
- package/dist/agent/json-runner.test.d.ts +2 -0
- package/dist/agent/json-runner.test.d.ts.map +1 -0
- package/dist/agent/unified-agent.d.ts +132 -109
- package/dist/agent/unified-agent.d.ts.map +1 -1
- package/dist/agent/unified-agent.js +2011 -293
- package/dist/approval/index.d.ts +3 -2
- package/dist/approval/index.d.ts.map +1 -0
- package/dist/approval/index.js +128 -2
- package/dist/approval/workflow.d.ts +106 -110
- package/dist/approval/workflow.d.ts.map +1 -1
- package/dist/approval/workflow.js +126 -157
- package/dist/exporters/claude-agent-exporter.d.ts +50 -48
- package/dist/exporters/claude-agent-exporter.d.ts.map +1 -1
- package/dist/exporters/claude-agent-exporter.js +258 -203
- package/dist/exporters/index.d.ts +28 -4
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +737 -3
- package/dist/exporters/opencode-exporter.d.ts +47 -45
- package/dist/exporters/opencode-exporter.d.ts.map +1 -1
- package/dist/exporters/opencode-exporter.js +507 -191
- package/dist/exporters/types.d.ts +171 -169
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/types.js +1 -0
- package/dist/index.d.ts +15 -39
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3337 -32
- package/dist/interop/index.d.ts +48 -4
- package/dist/interop/index.d.ts.map +1 -0
- package/dist/interop/index.js +709 -3
- package/dist/interop/spec-consumer.d.ts +57 -53
- package/dist/interop/spec-consumer.d.ts.map +1 -1
- package/dist/interop/spec-consumer.js +302 -282
- package/dist/interop/tool-consumer.d.ts +57 -53
- package/dist/interop/tool-consumer.d.ts.map +1 -1
- package/dist/interop/tool-consumer.js +412 -213
- package/dist/interop/types.d.ts +173 -171
- package/dist/interop/types.d.ts.map +1 -1
- package/dist/interop/types.js +1 -0
- package/dist/knowledge/index.d.ts +2 -2
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +66 -2
- package/dist/knowledge/injector.d.ts +16 -20
- package/dist/knowledge/injector.d.ts.map +1 -1
- package/dist/knowledge/injector.js +56 -47
- package/dist/memory/in-memory.d.ts +15 -19
- package/dist/memory/in-memory.d.ts.map +1 -1
- package/dist/memory/in-memory.js +152 -46
- package/dist/memory/index.d.ts +3 -3
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +155 -3
- package/dist/memory/manager.d.ts +32 -36
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/manager.js +96 -70
- package/dist/memory/memory.test.d.ts +2 -0
- package/dist/memory/memory.test.d.ts.map +1 -0
- package/dist/node/agent/agent-factory.js +661 -0
- package/dist/node/agent/contract-spec-agent.js +607 -0
- package/dist/node/agent/index.js +2103 -0
- package/dist/node/agent/json-runner.js +684 -0
- package/dist/node/agent/unified-agent.js +2019 -0
- package/dist/node/approval/index.js +129 -0
- package/dist/node/approval/workflow.js +129 -0
- package/dist/node/exporters/claude-agent-exporter.js +265 -0
- package/dist/node/exporters/index.js +738 -0
- package/dist/node/exporters/opencode-exporter.js +516 -0
- package/dist/node/exporters/types.js +0 -0
- package/dist/node/index.js +3337 -0
- package/dist/node/interop/index.js +710 -0
- package/dist/node/interop/spec-consumer.js +307 -0
- package/dist/node/interop/tool-consumer.js +419 -0
- package/dist/node/interop/types.js +0 -0
- package/dist/node/knowledge/index.js +67 -0
- package/dist/node/knowledge/injector.js +67 -0
- package/dist/node/memory/in-memory.js +154 -0
- package/dist/node/memory/index.js +156 -0
- package/dist/node/memory/manager.js +105 -0
- package/dist/node/providers/claude-agent-sdk/adapter.js +624 -0
- package/dist/node/providers/claude-agent-sdk/index.js +673 -0
- package/dist/node/providers/claude-agent-sdk/session-bridge.js +149 -0
- package/dist/node/providers/claude-agent-sdk/tool-bridge.js +118 -0
- package/dist/node/providers/index.js +1261 -0
- package/dist/node/providers/opencode-sdk/adapter.js +669 -0
- package/dist/node/providers/opencode-sdk/agent-bridge.js +299 -0
- package/dist/node/providers/opencode-sdk/index.js +703 -0
- package/dist/node/providers/opencode-sdk/tool-bridge.js +141 -0
- package/dist/node/providers/registry.js +89 -0
- package/dist/node/providers/types.js +56 -0
- package/dist/node/schema/index.js +195 -0
- package/dist/node/schema/json-schema-to-zod.js +152 -0
- package/dist/node/schema/schema-output.js +190 -0
- package/dist/node/session/index.js +90 -0
- package/dist/node/session/store.js +90 -0
- package/dist/node/spec/index.js +85 -0
- package/dist/node/spec/registry.js +56 -0
- package/dist/node/spec/spec.js +44 -0
- package/dist/node/telemetry/adapter.js +85 -0
- package/dist/node/telemetry/index.js +86 -0
- package/dist/node/tools/index.js +345 -0
- package/dist/node/tools/knowledge-tool.js +74 -0
- package/dist/node/tools/mcp-client.js +47 -0
- package/dist/node/tools/mcp-server.js +205 -0
- package/dist/node/tools/tool-adapter.js +197 -0
- package/dist/node/types.js +0 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts +60 -52
- package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/adapter.js +622 -304
- package/dist/providers/claude-agent-sdk/index.d.ts +22 -4
- package/dist/providers/claude-agent-sdk/index.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/index.js +672 -4
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts +43 -40
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/session-bridge.js +121 -130
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +63 -60
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.js +104 -108
- package/dist/providers/index.d.ts +28 -7
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +1261 -8
- package/dist/providers/opencode-sdk/adapter.d.ts +56 -48
- package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/adapter.js +667 -274
- package/dist/providers/opencode-sdk/agent-bridge.d.ts +62 -57
- package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/agent-bridge.js +289 -155
- package/dist/providers/opencode-sdk/index.d.ts +22 -4
- package/dist/providers/opencode-sdk/index.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/index.js +702 -4
- package/dist/providers/opencode-sdk/tool-bridge.d.ts +41 -42
- package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/tool-bridge.js +121 -107
- package/dist/providers/registry.d.ts +10 -11
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +86 -49
- package/dist/providers/types.d.ts +169 -166
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +54 -42
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +194 -3
- package/dist/schema/json-schema-to-zod.d.ts +23 -26
- package/dist/schema/json-schema-to-zod.d.ts.map +1 -1
- package/dist/schema/json-schema-to-zod.js +138 -110
- package/dist/schema/schema-output.d.ts +29 -32
- package/dist/schema/schema-output.d.ts.map +1 -1
- package/dist/schema/schema-output.js +178 -53
- package/dist/session/index.d.ts +2 -2
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +89 -2
- package/dist/session/store.d.ts +51 -55
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +85 -74
- package/dist/spec/index.d.ts +3 -3
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +84 -3
- package/dist/spec/registry.d.ts +32 -36
- package/dist/spec/registry.d.ts.map +1 -1
- package/dist/spec/registry.js +51 -60
- package/dist/spec/spec.d.ts +80 -84
- package/dist/spec/spec.d.ts.map +1 -1
- package/dist/spec/spec.js +40 -26
- package/dist/telemetry/adapter.d.ts +33 -37
- package/dist/telemetry/adapter.d.ts.map +1 -1
- package/dist/telemetry/adapter.js +78 -96
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +85 -2
- package/dist/tools/index.d.ts +5 -5
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +344 -5
- package/dist/tools/knowledge-tool.d.ts +4 -8
- package/dist/tools/knowledge-tool.d.ts.map +1 -1
- package/dist/tools/knowledge-tool.js +68 -48
- package/dist/tools/mcp-client.d.ts +17 -21
- package/dist/tools/mcp-client.d.ts.map +1 -1
- package/dist/tools/mcp-client.js +42 -53
- package/dist/tools/mcp-server.d.ts +14 -18
- package/dist/tools/mcp-server.d.ts.map +1 -1
- package/dist/tools/mcp-server.js +200 -64
- package/dist/tools/tool-adapter.d.ts +7 -11
- package/dist/tools/tool-adapter.d.ts.map +1 -1
- package/dist/tools/tool-adapter.js +187 -70
- package/dist/tools/tools.test.d.ts +2 -0
- package/dist/tools/tools.test.d.ts.map +1 -0
- package/dist/types.d.ts +108 -111
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/package.json +448 -90
- package/dist/_virtual/_rolldown/runtime.js +0 -8
- package/dist/agent/agent-factory.js.map +0 -1
- package/dist/agent/contract-spec-agent.js.map +0 -1
- package/dist/agent/json-runner.js.map +0 -1
- package/dist/agent/unified-agent.js.map +0 -1
- package/dist/approval/workflow.js.map +0 -1
- package/dist/exporters/claude-agent-exporter.js.map +0 -1
- package/dist/exporters/opencode-exporter.js.map +0 -1
- package/dist/interop/spec-consumer.js.map +0 -1
- package/dist/interop/tool-consumer.js.map +0 -1
- package/dist/knowledge/injector.js.map +0 -1
- package/dist/memory/in-memory.js.map +0 -1
- package/dist/memory/manager.js.map +0 -1
- package/dist/providers/claude-agent-sdk/adapter.js.map +0 -1
- package/dist/providers/claude-agent-sdk/session-bridge.js.map +0 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.js.map +0 -1
- package/dist/providers/opencode-sdk/adapter.js.map +0 -1
- package/dist/providers/opencode-sdk/agent-bridge.js.map +0 -1
- package/dist/providers/opencode-sdk/tool-bridge.js.map +0 -1
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.js.map +0 -1
- package/dist/schema/json-schema-to-zod.js.map +0 -1
- package/dist/schema/schema-output.js.map +0 -1
- package/dist/session/store.js.map +0 -1
- package/dist/spec/registry.js.map +0 -1
- package/dist/spec/spec.js.map +0 -1
- package/dist/telemetry/adapter.js.map +0 -1
- package/dist/tools/knowledge-tool.js.map +0 -1
- package/dist/tools/mcp-client.js.map +0 -1
- package/dist/tools/mcp-server.js.map +0 -1
- 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
|
+
};
|