@lleverage-ai/agent-sdk 0.0.1
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/LICENSE +21 -0
- package/README.md +2321 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +2122 -0
- package/dist/agent.js.map +1 -0
- package/dist/backend.d.ts +378 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +71 -0
- package/dist/backend.js.map +1 -0
- package/dist/backends/composite.d.ts +258 -0
- package/dist/backends/composite.d.ts.map +1 -0
- package/dist/backends/composite.js +437 -0
- package/dist/backends/composite.js.map +1 -0
- package/dist/backends/filesystem.d.ts +268 -0
- package/dist/backends/filesystem.d.ts.map +1 -0
- package/dist/backends/filesystem.js +623 -0
- package/dist/backends/filesystem.js.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +14 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/persistent.d.ts +312 -0
- package/dist/backends/persistent.d.ts.map +1 -0
- package/dist/backends/persistent.js +519 -0
- package/dist/backends/persistent.js.map +1 -0
- package/dist/backends/sandbox.d.ts +315 -0
- package/dist/backends/sandbox.d.ts.map +1 -0
- package/dist/backends/sandbox.js +490 -0
- package/dist/backends/sandbox.js.map +1 -0
- package/dist/backends/state.d.ts +225 -0
- package/dist/backends/state.d.ts.map +1 -0
- package/dist/backends/state.js +396 -0
- package/dist/backends/state.js.map +1 -0
- package/dist/checkpointer/file-saver.d.ts +182 -0
- package/dist/checkpointer/file-saver.d.ts.map +1 -0
- package/dist/checkpointer/file-saver.js +298 -0
- package/dist/checkpointer/file-saver.js.map +1 -0
- package/dist/checkpointer/index.d.ts +40 -0
- package/dist/checkpointer/index.d.ts.map +1 -0
- package/dist/checkpointer/index.js +40 -0
- package/dist/checkpointer/index.js.map +1 -0
- package/dist/checkpointer/kv-saver.d.ts +142 -0
- package/dist/checkpointer/kv-saver.d.ts.map +1 -0
- package/dist/checkpointer/kv-saver.js +176 -0
- package/dist/checkpointer/kv-saver.js.map +1 -0
- package/dist/checkpointer/memory-saver.d.ts +158 -0
- package/dist/checkpointer/memory-saver.d.ts.map +1 -0
- package/dist/checkpointer/memory-saver.js +222 -0
- package/dist/checkpointer/memory-saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +353 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/checkpointer/types.js +159 -0
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/context-manager.d.ts +627 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +1039 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context.d.ts +57 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +76 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/index.d.ts +611 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +1023 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation-helpers.d.ts +126 -0
- package/dist/generation-helpers.d.ts.map +1 -0
- package/dist/generation-helpers.js +181 -0
- package/dist/generation-helpers.js.map +1 -0
- package/dist/hooks/audit.d.ts +210 -0
- package/dist/hooks/audit.d.ts.map +1 -0
- package/dist/hooks/audit.js +305 -0
- package/dist/hooks/audit.js.map +1 -0
- package/dist/hooks/cache.d.ts +180 -0
- package/dist/hooks/cache.d.ts.map +1 -0
- package/dist/hooks/cache.js +273 -0
- package/dist/hooks/cache.js.map +1 -0
- package/dist/hooks/guardrails.d.ts +145 -0
- package/dist/hooks/guardrails.d.ts.map +1 -0
- package/dist/hooks/guardrails.js +326 -0
- package/dist/hooks/guardrails.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/logging.d.ts +193 -0
- package/dist/hooks/logging.d.ts.map +1 -0
- package/dist/hooks/logging.js +345 -0
- package/dist/hooks/logging.js.map +1 -0
- package/dist/hooks/parallel-guardrails.d.ts +268 -0
- package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
- package/dist/hooks/parallel-guardrails.js +416 -0
- package/dist/hooks/parallel-guardrails.js.map +1 -0
- package/dist/hooks/rate-limit.d.ts +305 -0
- package/dist/hooks/rate-limit.d.ts.map +1 -0
- package/dist/hooks/rate-limit.js +372 -0
- package/dist/hooks/rate-limit.js.map +1 -0
- package/dist/hooks/retry.d.ts +144 -0
- package/dist/hooks/retry.d.ts.map +1 -0
- package/dist/hooks/retry.js +210 -0
- package/dist/hooks/retry.js.map +1 -0
- package/dist/hooks/secrets.d.ts +174 -0
- package/dist/hooks/secrets.d.ts.map +1 -0
- package/dist/hooks/secrets.js +306 -0
- package/dist/hooks/secrets.js.map +1 -0
- package/dist/hooks.d.ts +229 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +352 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/env.d.ts +25 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +18 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +184 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +446 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +58 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +119 -0
- package/dist/mcp/validation.d.ts.map +1 -0
- package/dist/mcp/validation.js +407 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/mcp/virtual-server.d.ts +78 -0
- package/dist/mcp/virtual-server.d.ts.map +1 -0
- package/dist/mcp/virtual-server.js +137 -0
- package/dist/mcp/virtual-server.js.map +1 -0
- package/dist/memory/filesystem-store.d.ts +217 -0
- package/dist/memory/filesystem-store.d.ts.map +1 -0
- package/dist/memory/filesystem-store.js +343 -0
- package/dist/memory/filesystem-store.js.map +1 -0
- package/dist/memory/index.d.ts +46 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +46 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/loader.d.ts +396 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +419 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/permissions.d.ts +282 -0
- package/dist/memory/permissions.d.ts.map +1 -0
- package/dist/memory/permissions.js +297 -0
- package/dist/memory/permissions.js.map +1 -0
- package/dist/memory/rules.d.ts +249 -0
- package/dist/memory/rules.d.ts.map +1 -0
- package/dist/memory/rules.js +362 -0
- package/dist/memory/rules.js.map +1 -0
- package/dist/memory/store.d.ts +286 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +263 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/middleware/apply.d.ts +73 -0
- package/dist/middleware/apply.d.ts.map +1 -0
- package/dist/middleware/apply.js +219 -0
- package/dist/middleware/apply.js.map +1 -0
- package/dist/middleware/context.d.ts +33 -0
- package/dist/middleware/context.d.ts.map +1 -0
- package/dist/middleware/context.js +176 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/index.d.ts +31 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging.d.ts +137 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +374 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/types.d.ts +183 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +11 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/observability/events.d.ts +183 -0
- package/dist/observability/events.d.ts.map +1 -0
- package/dist/observability/events.js +305 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/index.d.ts +55 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +87 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +318 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +436 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +341 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +490 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/preset.d.ts +161 -0
- package/dist/observability/preset.d.ts.map +1 -0
- package/dist/observability/preset.js +133 -0
- package/dist/observability/preset.js.map +1 -0
- package/dist/observability/streaming.d.ts +113 -0
- package/dist/observability/streaming.d.ts.map +1 -0
- package/dist/observability/streaming.js +114 -0
- package/dist/observability/streaming.js.map +1 -0
- package/dist/observability/tracing.d.ts +378 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +539 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +63 -0
- package/dist/plugins.js.map +1 -0
- package/dist/presets/index.d.ts +7 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +7 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/production.d.ts +262 -0
- package/dist/presets/production.d.ts.map +1 -0
- package/dist/presets/production.js +295 -0
- package/dist/presets/production.js.map +1 -0
- package/dist/security/index.d.ts +179 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +323 -0
- package/dist/security/index.js.map +1 -0
- package/dist/subagents/advanced.d.ts +413 -0
- package/dist/subagents/advanced.d.ts.map +1 -0
- package/dist/subagents/advanced.js +396 -0
- package/dist/subagents/advanced.js.map +1 -0
- package/dist/subagents/index.d.ts +14 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +15 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents.d.ts +73 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +213 -0
- package/dist/subagents.js.map +1 -0
- package/dist/task-store/file-store.d.ts +76 -0
- package/dist/task-store/file-store.d.ts.map +1 -0
- package/dist/task-store/file-store.js +190 -0
- package/dist/task-store/file-store.js.map +1 -0
- package/dist/task-store/index.d.ts +11 -0
- package/dist/task-store/index.d.ts.map +1 -0
- package/dist/task-store/index.js +10 -0
- package/dist/task-store/index.js.map +1 -0
- package/dist/task-store/kv-store.d.ts +140 -0
- package/dist/task-store/kv-store.d.ts.map +1 -0
- package/dist/task-store/kv-store.js +169 -0
- package/dist/task-store/kv-store.js.map +1 -0
- package/dist/task-store/memory-store.d.ts +66 -0
- package/dist/task-store/memory-store.d.ts.map +1 -0
- package/dist/task-store/memory-store.js +125 -0
- package/dist/task-store/memory-store.js.map +1 -0
- package/dist/task-store/types.d.ts +235 -0
- package/dist/task-store/types.d.ts.map +1 -0
- package/dist/task-store/types.js +110 -0
- package/dist/task-store/types.js.map +1 -0
- package/dist/testing/assertions.d.ts +401 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +630 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/index.d.ts +343 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +360 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent.d.ts +214 -0
- package/dist/testing/mock-agent.d.ts.map +1 -0
- package/dist/testing/mock-agent.js +448 -0
- package/dist/testing/mock-agent.js.map +1 -0
- package/dist/testing/recorder.d.ts +288 -0
- package/dist/testing/recorder.d.ts.map +1 -0
- package/dist/testing/recorder.js +499 -0
- package/dist/testing/recorder.js.map +1 -0
- package/dist/tools/execute.d.ts +104 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +191 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/factory.d.ts +260 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +241 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/filesystem.d.ts +215 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +311 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +354 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +413 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/task.d.ts +272 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +521 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todos.d.ts +131 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +120 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +424 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +607 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/user-interaction.d.ts +116 -0
- package/dist/tools/user-interaction.d.ts.map +1 -0
- package/dist/tools/user-interaction.js +147 -0
- package/dist/tools/user-interaction.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +189 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools.d.ts +74 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +73 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +2421 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory loading functions for agent memory system.
|
|
3
|
+
*
|
|
4
|
+
* Implements the two-tier memory architecture:
|
|
5
|
+
* - **User-Level Memory**: `~/.deepagents/{agentId}/agent.md`
|
|
6
|
+
* - **Project-Level Memory**: `[git-root]/.deepagents/agent.md`
|
|
7
|
+
*
|
|
8
|
+
* Also supports loading additional memory files from the user's agent directory.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {
|
|
13
|
+
* loadAgentMemory,
|
|
14
|
+
* loadAdditionalMemoryFiles,
|
|
15
|
+
* buildMemorySection,
|
|
16
|
+
* } from "@lleverage-ai/agent-sdk";
|
|
17
|
+
*
|
|
18
|
+
* // Load user-level memory
|
|
19
|
+
* const userMemory = await loadAgentMemory("~/.deepagents/my-agent/agent.md");
|
|
20
|
+
*
|
|
21
|
+
* // Load all additional files from user directory
|
|
22
|
+
* const additional = await loadAdditionalMemoryFiles("~/.deepagents/my-agent");
|
|
23
|
+
*
|
|
24
|
+
* // Build a formatted memory section for the prompt
|
|
25
|
+
* const section = buildMemorySection(userMemory, projectMemory, additional);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
import { exec } from "node:child_process";
|
|
31
|
+
import * as path from "node:path";
|
|
32
|
+
import { promisify } from "node:util";
|
|
33
|
+
import { FilesystemMemoryStore } from "./filesystem-store.js";
|
|
34
|
+
import { computeContentHash } from "./permissions.js";
|
|
35
|
+
const execAsync = promisify(exec);
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Memory Loading Functions
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Load a single agent memory file.
|
|
41
|
+
*
|
|
42
|
+
* Reads the file, parses YAML frontmatter, and returns the document.
|
|
43
|
+
*
|
|
44
|
+
* @param filePath - Path to the memory file
|
|
45
|
+
* @param options - Loading options
|
|
46
|
+
* @returns The memory content, or undefined if not found
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const memory = await loadAgentMemory("~/.deepagents/my-agent/agent.md");
|
|
51
|
+
* if (memory) {
|
|
52
|
+
* console.log(memory.content);
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @category Memory
|
|
57
|
+
*/
|
|
58
|
+
export async function loadAgentMemory(filePath, options) {
|
|
59
|
+
const store = options?.store ?? new FilesystemMemoryStore({ homeDir: options?.homeDir });
|
|
60
|
+
return store.read(filePath);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Load all additional memory files from a directory.
|
|
64
|
+
*
|
|
65
|
+
* Scans the directory for .md files (excluding agent.md by default)
|
|
66
|
+
* and returns their content.
|
|
67
|
+
*
|
|
68
|
+
* @param dirPath - Path to the agent memory directory
|
|
69
|
+
* @param options - Loading options
|
|
70
|
+
* @returns Array of additional memory file content
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const files = await loadAdditionalMemoryFiles("~/.deepagents/my-agent");
|
|
75
|
+
* for (const file of files) {
|
|
76
|
+
* console.log(`${file.filename}: ${file.content.slice(0, 100)}...`);
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @category Memory
|
|
81
|
+
*/
|
|
82
|
+
export async function loadAdditionalMemoryFiles(dirPath, options) {
|
|
83
|
+
const store = options?.store ?? new FilesystemMemoryStore({ homeDir: options?.homeDir });
|
|
84
|
+
const exclude = options?.exclude ?? ["agent.md"];
|
|
85
|
+
try {
|
|
86
|
+
const files = await store.list(dirPath);
|
|
87
|
+
const results = [];
|
|
88
|
+
for (const filePath of files) {
|
|
89
|
+
const filename = path.basename(filePath);
|
|
90
|
+
// Skip excluded files
|
|
91
|
+
if (exclude.includes(filename)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const doc = await store.read(filePath);
|
|
95
|
+
if (doc) {
|
|
96
|
+
results.push({
|
|
97
|
+
filename,
|
|
98
|
+
content: doc.content,
|
|
99
|
+
metadata: doc.metadata,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Directory doesn't exist or can't be read
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// =============================================================================
|
|
111
|
+
// Git Root Detection
|
|
112
|
+
// =============================================================================
|
|
113
|
+
/**
|
|
114
|
+
* Find the git root directory from a given path.
|
|
115
|
+
*
|
|
116
|
+
* @param fromPath - Starting path to search from
|
|
117
|
+
* @returns The git root path, or undefined if not in a git repo
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const gitRoot = await findGitRoot("/path/to/project/src/file.ts");
|
|
122
|
+
* // Returns "/path/to/project" if that's the git root
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* @category Memory
|
|
126
|
+
*/
|
|
127
|
+
export async function findGitRoot(fromPath) {
|
|
128
|
+
try {
|
|
129
|
+
const { stdout } = await execAsync("git rev-parse --show-toplevel", {
|
|
130
|
+
cwd: fromPath,
|
|
131
|
+
});
|
|
132
|
+
return stdout.trim();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get the project memory path based on git root.
|
|
140
|
+
*
|
|
141
|
+
* @param workingDirectory - Current working directory
|
|
142
|
+
* @returns Path to project memory file, or undefined if not in git repo
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const projectMemoryPath = await getProjectMemoryPath("/path/to/project");
|
|
147
|
+
* // Returns "/path/to/project/.deepagents/agent.md"
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* @category Memory
|
|
151
|
+
*/
|
|
152
|
+
export async function getProjectMemoryPath(workingDirectory) {
|
|
153
|
+
const gitRoot = await findGitRoot(workingDirectory);
|
|
154
|
+
if (!gitRoot) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return path.join(gitRoot, ".deepagents", "agent.md");
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get the user memory path for an agent.
|
|
161
|
+
*
|
|
162
|
+
* @param agentId - The agent identifier
|
|
163
|
+
* @param homeDir - Optional home directory override
|
|
164
|
+
* @returns Path to user memory file
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* const userMemoryPath = getUserMemoryPath("my-agent");
|
|
169
|
+
* // Returns "/home/user/.deepagents/my-agent/agent.md"
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @category Memory
|
|
173
|
+
*/
|
|
174
|
+
export function getUserMemoryPath(agentId, homeDir) {
|
|
175
|
+
const home = homeDir ?? process.env.HOME ?? "~";
|
|
176
|
+
return path.join(home, ".deepagents", agentId, "agent.md");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the user agent directory for an agent.
|
|
180
|
+
*
|
|
181
|
+
* @param agentId - The agent identifier
|
|
182
|
+
* @param homeDir - Optional home directory override
|
|
183
|
+
* @returns Path to user agent directory
|
|
184
|
+
*
|
|
185
|
+
* @category Memory
|
|
186
|
+
*/
|
|
187
|
+
export function getUserAgentDir(agentId, homeDir) {
|
|
188
|
+
const home = homeDir ?? process.env.HOME ?? "~";
|
|
189
|
+
return path.join(home, ".deepagents", agentId);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Build a formatted memory section for injection into prompts.
|
|
193
|
+
*
|
|
194
|
+
* Combines user memory, project memory, and additional files into
|
|
195
|
+
* a single formatted string suitable for system prompt injection.
|
|
196
|
+
*
|
|
197
|
+
* @param userMemory - User-level memory document
|
|
198
|
+
* @param projectMemory - Project-level memory document
|
|
199
|
+
* @param additionalFiles - Additional memory files
|
|
200
|
+
* @param options - Formatting options
|
|
201
|
+
* @returns Formatted memory section string
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const userMemory = await loadAgentMemory("~/.deepagents/agent/agent.md");
|
|
206
|
+
* const projectMemory = await loadAgentMemory("/project/.deepagents/agent.md");
|
|
207
|
+
* const additional = await loadAdditionalMemoryFiles("~/.deepagents/agent");
|
|
208
|
+
*
|
|
209
|
+
* const section = buildMemorySection(userMemory, projectMemory, additional);
|
|
210
|
+
* const systemPrompt = `You are a helpful assistant.\n\n${section}`;
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* @category Memory
|
|
214
|
+
*/
|
|
215
|
+
export function buildMemorySection(userMemory, projectMemory, additionalFiles, options) {
|
|
216
|
+
const userHeader = options?.userHeader ?? "# User Memory";
|
|
217
|
+
const projectHeader = options?.projectHeader ?? "# Project Memory";
|
|
218
|
+
const additionalHeader = options?.additionalHeader ?? "# Additional Context";
|
|
219
|
+
const includeFilenames = options?.includeFilenames ?? true;
|
|
220
|
+
const sections = [];
|
|
221
|
+
// Add user memory
|
|
222
|
+
if (userMemory?.content) {
|
|
223
|
+
sections.push(`${userHeader}\n\n${userMemory.content}`);
|
|
224
|
+
}
|
|
225
|
+
// Add project memory
|
|
226
|
+
if (projectMemory?.content) {
|
|
227
|
+
sections.push(`${projectHeader}\n\n${projectMemory.content}`);
|
|
228
|
+
}
|
|
229
|
+
// Add additional files
|
|
230
|
+
if (additionalFiles.length > 0) {
|
|
231
|
+
const additionalContent = additionalFiles
|
|
232
|
+
.map((file) => {
|
|
233
|
+
if (includeFilenames) {
|
|
234
|
+
return `## ${file.filename}\n\n${file.content}`;
|
|
235
|
+
}
|
|
236
|
+
return file.content;
|
|
237
|
+
})
|
|
238
|
+
.join("\n\n");
|
|
239
|
+
sections.push(`${additionalHeader}\n\n${additionalContent}`);
|
|
240
|
+
}
|
|
241
|
+
return sections.join("\n\n---\n\n");
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Load all agent memory (user, project, and additional files).
|
|
245
|
+
*
|
|
246
|
+
* This is the main entry point for loading agent memory.
|
|
247
|
+
* It handles the two-tier architecture, approval workflow, and change detection.
|
|
248
|
+
*
|
|
249
|
+
* @param options - Loading options
|
|
250
|
+
* @returns Complete memory loading result
|
|
251
|
+
*
|
|
252
|
+
* @example Basic usage
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const memory = await loadAllMemory({
|
|
255
|
+
* agentId: "my-agent",
|
|
256
|
+
* workingDirectory: "/path/to/project",
|
|
257
|
+
* requestProjectApproval: async (path, hash, previousHash) => {
|
|
258
|
+
* if (previousHash) {
|
|
259
|
+
* console.log(`Memory file ${path} has changed!`);
|
|
260
|
+
* }
|
|
261
|
+
* return confirm(`Load project memory from ${path}?`);
|
|
262
|
+
* },
|
|
263
|
+
* });
|
|
264
|
+
*
|
|
265
|
+
* // Use in system prompt
|
|
266
|
+
* const systemPrompt = `You are a helpful assistant.\n\n${memory.memorySection}`;
|
|
267
|
+
* ```
|
|
268
|
+
*
|
|
269
|
+
* @example With permission persistence and audit logging
|
|
270
|
+
* ```typescript
|
|
271
|
+
* import { createMemoryPermissionStore } from "@lleverage-ai/agent-sdk";
|
|
272
|
+
*
|
|
273
|
+
* const permStore = createMemoryPermissionStore();
|
|
274
|
+
*
|
|
275
|
+
* const memory = await loadAllMemory({
|
|
276
|
+
* agentId: "my-agent",
|
|
277
|
+
* permissionStore: permStore,
|
|
278
|
+
* requestProjectApproval: async (path, hash, previousHash) => {
|
|
279
|
+
* // Only called if not approved or content changed
|
|
280
|
+
* return confirm(`Approve ${path}?`);
|
|
281
|
+
* },
|
|
282
|
+
* onAuditEvent: (event) => {
|
|
283
|
+
* console.log("Memory audit:", event);
|
|
284
|
+
* },
|
|
285
|
+
* });
|
|
286
|
+
* ```
|
|
287
|
+
*
|
|
288
|
+
* @category Memory
|
|
289
|
+
*/
|
|
290
|
+
export async function loadAllMemory(options) {
|
|
291
|
+
const workingDirectory = options.workingDirectory ?? process.cwd();
|
|
292
|
+
const store = options.store ?? new FilesystemMemoryStore({ homeDir: options.homeDir });
|
|
293
|
+
// Load user memory
|
|
294
|
+
const userMemoryPath = getUserMemoryPath(options.agentId, options.homeDir);
|
|
295
|
+
const userMemory = await store.read(userMemoryPath);
|
|
296
|
+
// Load additional files from user directory
|
|
297
|
+
const userAgentDir = getUserAgentDir(options.agentId, options.homeDir);
|
|
298
|
+
const additionalFiles = await loadAdditionalMemoryFiles(userAgentDir, {
|
|
299
|
+
store,
|
|
300
|
+
homeDir: options.homeDir,
|
|
301
|
+
});
|
|
302
|
+
// Load project memory (with approval, persistence, and change detection)
|
|
303
|
+
let projectMemory;
|
|
304
|
+
let projectApproved = false;
|
|
305
|
+
const projectMemoryPath = await getProjectMemoryPath(workingDirectory);
|
|
306
|
+
if (projectMemoryPath) {
|
|
307
|
+
const exists = await store.exists(projectMemoryPath);
|
|
308
|
+
if (exists) {
|
|
309
|
+
// Read the content to compute hash
|
|
310
|
+
const tempDoc = await store.read(projectMemoryPath);
|
|
311
|
+
if (tempDoc) {
|
|
312
|
+
const currentHash = computeContentHash(tempDoc.content);
|
|
313
|
+
// Check permission store if provided
|
|
314
|
+
let needsApproval = true;
|
|
315
|
+
let previousHash;
|
|
316
|
+
if (options.permissionStore) {
|
|
317
|
+
const alreadyApproved = await options.permissionStore.isApproved(projectMemoryPath, currentHash);
|
|
318
|
+
if (alreadyApproved) {
|
|
319
|
+
// Already approved with current hash
|
|
320
|
+
needsApproval = false;
|
|
321
|
+
projectApproved = true;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// Check if it was approved with a different hash (content changed)
|
|
325
|
+
const allApprovals = await options.permissionStore.listApprovals();
|
|
326
|
+
const existingApproval = allApprovals.find((a) => a.path === projectMemoryPath);
|
|
327
|
+
if (existingApproval) {
|
|
328
|
+
previousHash = existingApproval.contentHash;
|
|
329
|
+
// Emit audit event for content change
|
|
330
|
+
if (options.onAuditEvent) {
|
|
331
|
+
await options.onAuditEvent({
|
|
332
|
+
type: "memory_content_changed",
|
|
333
|
+
path: projectMemoryPath,
|
|
334
|
+
contentHash: currentHash,
|
|
335
|
+
approved: false,
|
|
336
|
+
timestamp: Date.now(),
|
|
337
|
+
agentId: options.agentId,
|
|
338
|
+
previousHash,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Request approval if needed
|
|
345
|
+
if (needsApproval && options.requestProjectApproval) {
|
|
346
|
+
// Emit audit event for approval request
|
|
347
|
+
if (options.onAuditEvent) {
|
|
348
|
+
await options.onAuditEvent({
|
|
349
|
+
type: "memory_approval_requested",
|
|
350
|
+
path: projectMemoryPath,
|
|
351
|
+
contentHash: currentHash,
|
|
352
|
+
approved: false,
|
|
353
|
+
timestamp: Date.now(),
|
|
354
|
+
agentId: options.agentId,
|
|
355
|
+
previousHash,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
projectApproved = await options.requestProjectApproval(projectMemoryPath, currentHash, previousHash);
|
|
359
|
+
// Persist approval decision if granted
|
|
360
|
+
if (projectApproved && options.permissionStore) {
|
|
361
|
+
await options.permissionStore.grantApproval(projectMemoryPath, currentHash, options.agentId);
|
|
362
|
+
}
|
|
363
|
+
// Emit audit event for approval decision
|
|
364
|
+
if (options.onAuditEvent) {
|
|
365
|
+
await options.onAuditEvent({
|
|
366
|
+
type: projectApproved ? "memory_loaded" : "memory_approval_denied",
|
|
367
|
+
path: projectMemoryPath,
|
|
368
|
+
contentHash: currentHash,
|
|
369
|
+
approved: projectApproved,
|
|
370
|
+
timestamp: Date.now(),
|
|
371
|
+
agentId: options.agentId,
|
|
372
|
+
previousHash,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
else if (!needsApproval) {
|
|
377
|
+
// Already approved via permission store
|
|
378
|
+
if (options.onAuditEvent) {
|
|
379
|
+
await options.onAuditEvent({
|
|
380
|
+
type: "memory_loaded",
|
|
381
|
+
path: projectMemoryPath,
|
|
382
|
+
contentHash: currentHash,
|
|
383
|
+
approved: true,
|
|
384
|
+
timestamp: Date.now(),
|
|
385
|
+
agentId: options.agentId,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
// No approval callback, auto-approve
|
|
391
|
+
projectApproved = true;
|
|
392
|
+
if (options.onAuditEvent) {
|
|
393
|
+
await options.onAuditEvent({
|
|
394
|
+
type: "memory_loaded",
|
|
395
|
+
path: projectMemoryPath,
|
|
396
|
+
contentHash: currentHash,
|
|
397
|
+
approved: true,
|
|
398
|
+
timestamp: Date.now(),
|
|
399
|
+
agentId: options.agentId,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (projectApproved) {
|
|
404
|
+
projectMemory = tempDoc;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// Build memory section
|
|
410
|
+
const memorySection = buildMemorySection(userMemory, projectMemory, additionalFiles);
|
|
411
|
+
return {
|
|
412
|
+
userMemory,
|
|
413
|
+
projectMemory,
|
|
414
|
+
additionalFiles,
|
|
415
|
+
projectApproved,
|
|
416
|
+
memorySection,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/memory/loader.ts"],"names":[],"mappings":"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"}
|