@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.
Files changed (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2321 -0
  3. package/dist/agent.d.ts +52 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +2122 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/backend.d.ts +378 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +71 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/backends/composite.d.ts +258 -0
  12. package/dist/backends/composite.d.ts.map +1 -0
  13. package/dist/backends/composite.js +437 -0
  14. package/dist/backends/composite.js.map +1 -0
  15. package/dist/backends/filesystem.d.ts +268 -0
  16. package/dist/backends/filesystem.d.ts.map +1 -0
  17. package/dist/backends/filesystem.js +623 -0
  18. package/dist/backends/filesystem.js.map +1 -0
  19. package/dist/backends/index.d.ts +14 -0
  20. package/dist/backends/index.d.ts.map +1 -0
  21. package/dist/backends/index.js +14 -0
  22. package/dist/backends/index.js.map +1 -0
  23. package/dist/backends/persistent.d.ts +312 -0
  24. package/dist/backends/persistent.d.ts.map +1 -0
  25. package/dist/backends/persistent.js +519 -0
  26. package/dist/backends/persistent.js.map +1 -0
  27. package/dist/backends/sandbox.d.ts +315 -0
  28. package/dist/backends/sandbox.d.ts.map +1 -0
  29. package/dist/backends/sandbox.js +490 -0
  30. package/dist/backends/sandbox.js.map +1 -0
  31. package/dist/backends/state.d.ts +225 -0
  32. package/dist/backends/state.d.ts.map +1 -0
  33. package/dist/backends/state.js +396 -0
  34. package/dist/backends/state.js.map +1 -0
  35. package/dist/checkpointer/file-saver.d.ts +182 -0
  36. package/dist/checkpointer/file-saver.d.ts.map +1 -0
  37. package/dist/checkpointer/file-saver.js +298 -0
  38. package/dist/checkpointer/file-saver.js.map +1 -0
  39. package/dist/checkpointer/index.d.ts +40 -0
  40. package/dist/checkpointer/index.d.ts.map +1 -0
  41. package/dist/checkpointer/index.js +40 -0
  42. package/dist/checkpointer/index.js.map +1 -0
  43. package/dist/checkpointer/kv-saver.d.ts +142 -0
  44. package/dist/checkpointer/kv-saver.d.ts.map +1 -0
  45. package/dist/checkpointer/kv-saver.js +176 -0
  46. package/dist/checkpointer/kv-saver.js.map +1 -0
  47. package/dist/checkpointer/memory-saver.d.ts +158 -0
  48. package/dist/checkpointer/memory-saver.d.ts.map +1 -0
  49. package/dist/checkpointer/memory-saver.js +222 -0
  50. package/dist/checkpointer/memory-saver.js.map +1 -0
  51. package/dist/checkpointer/types.d.ts +353 -0
  52. package/dist/checkpointer/types.d.ts.map +1 -0
  53. package/dist/checkpointer/types.js +159 -0
  54. package/dist/checkpointer/types.js.map +1 -0
  55. package/dist/context-manager.d.ts +627 -0
  56. package/dist/context-manager.d.ts.map +1 -0
  57. package/dist/context-manager.js +1039 -0
  58. package/dist/context-manager.js.map +1 -0
  59. package/dist/context.d.ts +57 -0
  60. package/dist/context.d.ts.map +1 -0
  61. package/dist/context.js +76 -0
  62. package/dist/context.js.map +1 -0
  63. package/dist/errors/index.d.ts +611 -0
  64. package/dist/errors/index.d.ts.map +1 -0
  65. package/dist/errors/index.js +1023 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/generation-helpers.d.ts +126 -0
  68. package/dist/generation-helpers.d.ts.map +1 -0
  69. package/dist/generation-helpers.js +181 -0
  70. package/dist/generation-helpers.js.map +1 -0
  71. package/dist/hooks/audit.d.ts +210 -0
  72. package/dist/hooks/audit.d.ts.map +1 -0
  73. package/dist/hooks/audit.js +305 -0
  74. package/dist/hooks/audit.js.map +1 -0
  75. package/dist/hooks/cache.d.ts +180 -0
  76. package/dist/hooks/cache.d.ts.map +1 -0
  77. package/dist/hooks/cache.js +273 -0
  78. package/dist/hooks/cache.js.map +1 -0
  79. package/dist/hooks/guardrails.d.ts +145 -0
  80. package/dist/hooks/guardrails.d.ts.map +1 -0
  81. package/dist/hooks/guardrails.js +326 -0
  82. package/dist/hooks/guardrails.js.map +1 -0
  83. package/dist/hooks/index.d.ts +18 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/index.js +32 -0
  86. package/dist/hooks/index.js.map +1 -0
  87. package/dist/hooks/logging.d.ts +193 -0
  88. package/dist/hooks/logging.d.ts.map +1 -0
  89. package/dist/hooks/logging.js +345 -0
  90. package/dist/hooks/logging.js.map +1 -0
  91. package/dist/hooks/parallel-guardrails.d.ts +268 -0
  92. package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
  93. package/dist/hooks/parallel-guardrails.js +416 -0
  94. package/dist/hooks/parallel-guardrails.js.map +1 -0
  95. package/dist/hooks/rate-limit.d.ts +305 -0
  96. package/dist/hooks/rate-limit.d.ts.map +1 -0
  97. package/dist/hooks/rate-limit.js +372 -0
  98. package/dist/hooks/rate-limit.js.map +1 -0
  99. package/dist/hooks/retry.d.ts +144 -0
  100. package/dist/hooks/retry.d.ts.map +1 -0
  101. package/dist/hooks/retry.js +210 -0
  102. package/dist/hooks/retry.js.map +1 -0
  103. package/dist/hooks/secrets.d.ts +174 -0
  104. package/dist/hooks/secrets.d.ts.map +1 -0
  105. package/dist/hooks/secrets.js +306 -0
  106. package/dist/hooks/secrets.js.map +1 -0
  107. package/dist/hooks.d.ts +229 -0
  108. package/dist/hooks.d.ts.map +1 -0
  109. package/dist/hooks.js +352 -0
  110. package/dist/hooks.js.map +1 -0
  111. package/dist/index.d.ts +97 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +182 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/mcp/env.d.ts +25 -0
  116. package/dist/mcp/env.d.ts.map +1 -0
  117. package/dist/mcp/env.js +18 -0
  118. package/dist/mcp/env.js.map +1 -0
  119. package/dist/mcp/index.d.ts +16 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +17 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/manager.d.ts +184 -0
  124. package/dist/mcp/manager.d.ts.map +1 -0
  125. package/dist/mcp/manager.js +446 -0
  126. package/dist/mcp/manager.js.map +1 -0
  127. package/dist/mcp/types.d.ts +58 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +7 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/mcp/validation.d.ts +119 -0
  132. package/dist/mcp/validation.d.ts.map +1 -0
  133. package/dist/mcp/validation.js +407 -0
  134. package/dist/mcp/validation.js.map +1 -0
  135. package/dist/mcp/virtual-server.d.ts +78 -0
  136. package/dist/mcp/virtual-server.d.ts.map +1 -0
  137. package/dist/mcp/virtual-server.js +137 -0
  138. package/dist/mcp/virtual-server.js.map +1 -0
  139. package/dist/memory/filesystem-store.d.ts +217 -0
  140. package/dist/memory/filesystem-store.d.ts.map +1 -0
  141. package/dist/memory/filesystem-store.js +343 -0
  142. package/dist/memory/filesystem-store.js.map +1 -0
  143. package/dist/memory/index.d.ts +46 -0
  144. package/dist/memory/index.d.ts.map +1 -0
  145. package/dist/memory/index.js +46 -0
  146. package/dist/memory/index.js.map +1 -0
  147. package/dist/memory/loader.d.ts +396 -0
  148. package/dist/memory/loader.d.ts.map +1 -0
  149. package/dist/memory/loader.js +419 -0
  150. package/dist/memory/loader.js.map +1 -0
  151. package/dist/memory/permissions.d.ts +282 -0
  152. package/dist/memory/permissions.d.ts.map +1 -0
  153. package/dist/memory/permissions.js +297 -0
  154. package/dist/memory/permissions.js.map +1 -0
  155. package/dist/memory/rules.d.ts +249 -0
  156. package/dist/memory/rules.d.ts.map +1 -0
  157. package/dist/memory/rules.js +362 -0
  158. package/dist/memory/rules.js.map +1 -0
  159. package/dist/memory/store.d.ts +286 -0
  160. package/dist/memory/store.d.ts.map +1 -0
  161. package/dist/memory/store.js +263 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/middleware/apply.d.ts +73 -0
  164. package/dist/middleware/apply.d.ts.map +1 -0
  165. package/dist/middleware/apply.js +219 -0
  166. package/dist/middleware/apply.js.map +1 -0
  167. package/dist/middleware/context.d.ts +33 -0
  168. package/dist/middleware/context.d.ts.map +1 -0
  169. package/dist/middleware/context.js +176 -0
  170. package/dist/middleware/context.js.map +1 -0
  171. package/dist/middleware/index.d.ts +31 -0
  172. package/dist/middleware/index.d.ts.map +1 -0
  173. package/dist/middleware/index.js +32 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/middleware/logging.d.ts +137 -0
  176. package/dist/middleware/logging.d.ts.map +1 -0
  177. package/dist/middleware/logging.js +374 -0
  178. package/dist/middleware/logging.js.map +1 -0
  179. package/dist/middleware/types.d.ts +183 -0
  180. package/dist/middleware/types.d.ts.map +1 -0
  181. package/dist/middleware/types.js +11 -0
  182. package/dist/middleware/types.js.map +1 -0
  183. package/dist/observability/events.d.ts +183 -0
  184. package/dist/observability/events.d.ts.map +1 -0
  185. package/dist/observability/events.js +305 -0
  186. package/dist/observability/events.js.map +1 -0
  187. package/dist/observability/index.d.ts +55 -0
  188. package/dist/observability/index.d.ts.map +1 -0
  189. package/dist/observability/index.js +87 -0
  190. package/dist/observability/index.js.map +1 -0
  191. package/dist/observability/logger.d.ts +318 -0
  192. package/dist/observability/logger.d.ts.map +1 -0
  193. package/dist/observability/logger.js +436 -0
  194. package/dist/observability/logger.js.map +1 -0
  195. package/dist/observability/metrics.d.ts +341 -0
  196. package/dist/observability/metrics.d.ts.map +1 -0
  197. package/dist/observability/metrics.js +490 -0
  198. package/dist/observability/metrics.js.map +1 -0
  199. package/dist/observability/preset.d.ts +161 -0
  200. package/dist/observability/preset.d.ts.map +1 -0
  201. package/dist/observability/preset.js +133 -0
  202. package/dist/observability/preset.js.map +1 -0
  203. package/dist/observability/streaming.d.ts +113 -0
  204. package/dist/observability/streaming.d.ts.map +1 -0
  205. package/dist/observability/streaming.js +114 -0
  206. package/dist/observability/streaming.js.map +1 -0
  207. package/dist/observability/tracing.d.ts +378 -0
  208. package/dist/observability/tracing.d.ts.map +1 -0
  209. package/dist/observability/tracing.js +539 -0
  210. package/dist/observability/tracing.js.map +1 -0
  211. package/dist/plugins.d.ts +55 -0
  212. package/dist/plugins.d.ts.map +1 -0
  213. package/dist/plugins.js +63 -0
  214. package/dist/plugins.js.map +1 -0
  215. package/dist/presets/index.d.ts +7 -0
  216. package/dist/presets/index.d.ts.map +1 -0
  217. package/dist/presets/index.js +7 -0
  218. package/dist/presets/index.js.map +1 -0
  219. package/dist/presets/production.d.ts +262 -0
  220. package/dist/presets/production.d.ts.map +1 -0
  221. package/dist/presets/production.js +295 -0
  222. package/dist/presets/production.js.map +1 -0
  223. package/dist/security/index.d.ts +179 -0
  224. package/dist/security/index.d.ts.map +1 -0
  225. package/dist/security/index.js +323 -0
  226. package/dist/security/index.js.map +1 -0
  227. package/dist/subagents/advanced.d.ts +413 -0
  228. package/dist/subagents/advanced.d.ts.map +1 -0
  229. package/dist/subagents/advanced.js +396 -0
  230. package/dist/subagents/advanced.js.map +1 -0
  231. package/dist/subagents/index.d.ts +14 -0
  232. package/dist/subagents/index.d.ts.map +1 -0
  233. package/dist/subagents/index.js +15 -0
  234. package/dist/subagents/index.js.map +1 -0
  235. package/dist/subagents.d.ts +73 -0
  236. package/dist/subagents.d.ts.map +1 -0
  237. package/dist/subagents.js +213 -0
  238. package/dist/subagents.js.map +1 -0
  239. package/dist/task-store/file-store.d.ts +76 -0
  240. package/dist/task-store/file-store.d.ts.map +1 -0
  241. package/dist/task-store/file-store.js +190 -0
  242. package/dist/task-store/file-store.js.map +1 -0
  243. package/dist/task-store/index.d.ts +11 -0
  244. package/dist/task-store/index.d.ts.map +1 -0
  245. package/dist/task-store/index.js +10 -0
  246. package/dist/task-store/index.js.map +1 -0
  247. package/dist/task-store/kv-store.d.ts +140 -0
  248. package/dist/task-store/kv-store.d.ts.map +1 -0
  249. package/dist/task-store/kv-store.js +169 -0
  250. package/dist/task-store/kv-store.js.map +1 -0
  251. package/dist/task-store/memory-store.d.ts +66 -0
  252. package/dist/task-store/memory-store.d.ts.map +1 -0
  253. package/dist/task-store/memory-store.js +125 -0
  254. package/dist/task-store/memory-store.js.map +1 -0
  255. package/dist/task-store/types.d.ts +235 -0
  256. package/dist/task-store/types.d.ts.map +1 -0
  257. package/dist/task-store/types.js +110 -0
  258. package/dist/task-store/types.js.map +1 -0
  259. package/dist/testing/assertions.d.ts +401 -0
  260. package/dist/testing/assertions.d.ts.map +1 -0
  261. package/dist/testing/assertions.js +630 -0
  262. package/dist/testing/assertions.js.map +1 -0
  263. package/dist/testing/index.d.ts +343 -0
  264. package/dist/testing/index.d.ts.map +1 -0
  265. package/dist/testing/index.js +360 -0
  266. package/dist/testing/index.js.map +1 -0
  267. package/dist/testing/mock-agent.d.ts +214 -0
  268. package/dist/testing/mock-agent.d.ts.map +1 -0
  269. package/dist/testing/mock-agent.js +448 -0
  270. package/dist/testing/mock-agent.js.map +1 -0
  271. package/dist/testing/recorder.d.ts +288 -0
  272. package/dist/testing/recorder.d.ts.map +1 -0
  273. package/dist/testing/recorder.js +499 -0
  274. package/dist/testing/recorder.js.map +1 -0
  275. package/dist/tools/execute.d.ts +104 -0
  276. package/dist/tools/execute.d.ts.map +1 -0
  277. package/dist/tools/execute.js +191 -0
  278. package/dist/tools/execute.js.map +1 -0
  279. package/dist/tools/factory.d.ts +260 -0
  280. package/dist/tools/factory.d.ts.map +1 -0
  281. package/dist/tools/factory.js +241 -0
  282. package/dist/tools/factory.js.map +1 -0
  283. package/dist/tools/filesystem.d.ts +215 -0
  284. package/dist/tools/filesystem.d.ts.map +1 -0
  285. package/dist/tools/filesystem.js +311 -0
  286. package/dist/tools/filesystem.js.map +1 -0
  287. package/dist/tools/index.d.ts +33 -0
  288. package/dist/tools/index.d.ts.map +1 -0
  289. package/dist/tools/index.js +33 -0
  290. package/dist/tools/index.js.map +1 -0
  291. package/dist/tools/search.d.ts +59 -0
  292. package/dist/tools/search.d.ts.map +1 -0
  293. package/dist/tools/search.js +94 -0
  294. package/dist/tools/search.js.map +1 -0
  295. package/dist/tools/skills.d.ts +354 -0
  296. package/dist/tools/skills.d.ts.map +1 -0
  297. package/dist/tools/skills.js +413 -0
  298. package/dist/tools/skills.js.map +1 -0
  299. package/dist/tools/task.d.ts +272 -0
  300. package/dist/tools/task.d.ts.map +1 -0
  301. package/dist/tools/task.js +521 -0
  302. package/dist/tools/task.js.map +1 -0
  303. package/dist/tools/todos.d.ts +131 -0
  304. package/dist/tools/todos.d.ts.map +1 -0
  305. package/dist/tools/todos.js +120 -0
  306. package/dist/tools/todos.js.map +1 -0
  307. package/dist/tools/tool-registry.d.ts +424 -0
  308. package/dist/tools/tool-registry.d.ts.map +1 -0
  309. package/dist/tools/tool-registry.js +607 -0
  310. package/dist/tools/tool-registry.js.map +1 -0
  311. package/dist/tools/user-interaction.d.ts +116 -0
  312. package/dist/tools/user-interaction.d.ts.map +1 -0
  313. package/dist/tools/user-interaction.js +147 -0
  314. package/dist/tools/user-interaction.js.map +1 -0
  315. package/dist/tools/utils.d.ts +124 -0
  316. package/dist/tools/utils.d.ts.map +1 -0
  317. package/dist/tools/utils.js +189 -0
  318. package/dist/tools/utils.js.map +1 -0
  319. package/dist/tools.d.ts +74 -0
  320. package/dist/tools.d.ts.map +1 -0
  321. package/dist/tools.js +73 -0
  322. package/dist/tools.js.map +1 -0
  323. package/dist/types.d.ts +2421 -0
  324. package/dist/types.d.ts.map +1 -0
  325. package/dist/types.js +55 -0
  326. package/dist/types.js.map +1 -0
  327. 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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"}