@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,519 @@
1
+ /**
2
+ * Persistent backend using a pluggable key-value store.
3
+ *
4
+ * PersistentBackend provides cross-conversation persistence by storing files
5
+ * in a key-value store. This enables long-term memory and state preservation
6
+ * across agent sessions.
7
+ *
8
+ * The backend supports any storage system that implements the KeyValueStore
9
+ * interface, including Redis, SQLite, DynamoDB, or cloud storage.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Using the built-in in-memory store (for development)
14
+ * const store = new InMemoryStore();
15
+ * const backend = new PersistentBackend({ store });
16
+ *
17
+ * // With namespace isolation
18
+ * const backend = new PersistentBackend({
19
+ * store,
20
+ * namespace: "user-123",
21
+ * });
22
+ *
23
+ * // Files are persisted across sessions
24
+ * await backend.write("/notes.md", "# My Notes\n");
25
+ * // Later, in a new session:
26
+ * const content = await backend.read("/notes.md");
27
+ * ```
28
+ *
29
+ * @packageDocumentation
30
+ */
31
+ // =============================================================================
32
+ // In-Memory Store Implementation
33
+ // =============================================================================
34
+ /**
35
+ * In-memory implementation of KeyValueStore for development and testing.
36
+ *
37
+ * Data is stored in a Map and lost when the process ends.
38
+ * Use this for development or as a reference implementation.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const store = new InMemoryStore();
43
+ *
44
+ * // Store data
45
+ * await store.put(["app", "users"], "user-1", { name: "Alice" });
46
+ *
47
+ * // Retrieve data
48
+ * const user = await store.get(["app", "users"], "user-1");
49
+ *
50
+ * // List all users
51
+ * const users = await store.list(["app", "users"]);
52
+ * ```
53
+ *
54
+ * @category Backend
55
+ */
56
+ export class InMemoryStore {
57
+ data = new Map();
58
+ /**
59
+ * Create a composite key from namespace and key.
60
+ * @internal
61
+ */
62
+ makeKey(namespace, key) {
63
+ return [...namespace, key].join("\0");
64
+ }
65
+ /**
66
+ * Parse a composite key to extract namespace and key.
67
+ * @internal
68
+ */
69
+ parseKey(compositeKey) {
70
+ const parts = compositeKey.split("\0");
71
+ return {
72
+ namespace: parts.slice(0, -1),
73
+ key: parts[parts.length - 1],
74
+ };
75
+ }
76
+ /**
77
+ * Check if a composite key starts with the given namespace.
78
+ * @internal
79
+ */
80
+ startsWithNamespace(compositeKey, namespace) {
81
+ const prefix = `${namespace.join("\0")}\0`;
82
+ return compositeKey.startsWith(prefix);
83
+ }
84
+ async get(namespace, key) {
85
+ const compositeKey = this.makeKey(namespace, key);
86
+ const value = this.data.get(compositeKey);
87
+ // Return a deep copy to prevent mutation
88
+ return value ? JSON.parse(JSON.stringify(value)) : undefined;
89
+ }
90
+ async put(namespace, key, value) {
91
+ const compositeKey = this.makeKey(namespace, key);
92
+ // Store a deep copy to prevent mutation
93
+ this.data.set(compositeKey, JSON.parse(JSON.stringify(value)));
94
+ }
95
+ async delete(namespace, key) {
96
+ const compositeKey = this.makeKey(namespace, key);
97
+ this.data.delete(compositeKey);
98
+ }
99
+ async list(namespace) {
100
+ const results = [];
101
+ for (const [compositeKey, value] of this.data.entries()) {
102
+ if (this.startsWithNamespace(compositeKey, namespace)) {
103
+ const { key } = this.parseKey(compositeKey);
104
+ // Return deep copies to prevent mutation
105
+ results.push({
106
+ key,
107
+ value: JSON.parse(JSON.stringify(value)),
108
+ });
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * Clear all data from the store.
115
+ *
116
+ * Useful for testing cleanup.
117
+ */
118
+ clear() {
119
+ this.data.clear();
120
+ }
121
+ /**
122
+ * Get the number of entries in the store.
123
+ *
124
+ * Useful for testing.
125
+ */
126
+ get size() {
127
+ return this.data.size;
128
+ }
129
+ }
130
+ // =============================================================================
131
+ // Persistent Backend Implementation
132
+ // =============================================================================
133
+ /**
134
+ * Backend implementation using a pluggable key-value store.
135
+ *
136
+ * All file operations are persisted to the underlying store, allowing
137
+ * data to survive across process restarts and agent sessions.
138
+ *
139
+ * Files are stored at: [namespace?, "filesystem", encodedPath]
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * import { PersistentBackend, InMemoryStore } from "@lleverage-ai/agent-sdk";
144
+ *
145
+ * // Create with in-memory store
146
+ * const store = new InMemoryStore();
147
+ * const backend = new PersistentBackend({ store });
148
+ *
149
+ * // Write persists to store
150
+ * await backend.write("/notes.md", "# Notes");
151
+ *
152
+ * // Read retrieves from store
153
+ * const content = await backend.read("/notes.md");
154
+ *
155
+ * // With namespace for multi-tenant isolation
156
+ * const userBackend = new PersistentBackend({
157
+ * store,
158
+ * namespace: "user-456",
159
+ * });
160
+ * ```
161
+ *
162
+ * @category Backend
163
+ */
164
+ export class PersistentBackend {
165
+ store;
166
+ namespacePrefix;
167
+ /**
168
+ * Create a new PersistentBackend.
169
+ *
170
+ * @param options - Configuration options
171
+ */
172
+ constructor(options) {
173
+ this.store = options.store;
174
+ this.namespacePrefix = options.namespace ? [options.namespace, "filesystem"] : ["filesystem"];
175
+ }
176
+ /**
177
+ * Encode a file path as a safe key.
178
+ *
179
+ * File paths may contain characters that are problematic for some
180
+ * key-value stores. We use base64url encoding for safety.
181
+ *
182
+ * @internal
183
+ */
184
+ encodePathAsKey(path) {
185
+ // Use base64url encoding for safe keys
186
+ const encoder = new TextEncoder();
187
+ const bytes = encoder.encode(path);
188
+ // Convert to base64url (no padding, URL-safe chars)
189
+ let base64 = btoa(String.fromCharCode(...bytes));
190
+ base64 = base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
191
+ return base64;
192
+ }
193
+ /**
194
+ * Decode a key back to a file path.
195
+ * @internal
196
+ */
197
+ decodeKeyToPath(key) {
198
+ // Add padding back
199
+ let base64 = key.replace(/-/g, "+").replace(/_/g, "/");
200
+ while (base64.length % 4) {
201
+ base64 += "=";
202
+ }
203
+ // Decode
204
+ const binary = atob(base64);
205
+ const bytes = new Uint8Array(binary.length);
206
+ for (let i = 0; i < binary.length; i++) {
207
+ bytes[i] = binary.charCodeAt(i);
208
+ }
209
+ const decoder = new TextDecoder();
210
+ return decoder.decode(bytes);
211
+ }
212
+ /**
213
+ * Normalize a path to ensure consistent format.
214
+ * @internal
215
+ */
216
+ normalizePath(path) {
217
+ // Ensure path starts with /
218
+ let normalized = path.startsWith("/") ? path : `/${path}`;
219
+ // Remove trailing slash for files
220
+ if (normalized.length > 1 && normalized.endsWith("/")) {
221
+ normalized = normalized.slice(0, -1);
222
+ }
223
+ // Collapse multiple slashes
224
+ normalized = normalized.replace(/\/+/g, "/");
225
+ return normalized;
226
+ }
227
+ /**
228
+ * Get the namespace for a file path.
229
+ * @internal
230
+ */
231
+ getNamespace() {
232
+ return this.namespacePrefix;
233
+ }
234
+ /**
235
+ * List files and directories at the given path.
236
+ */
237
+ async lsInfo(path) {
238
+ // Normalize and ensure trailing slash for directory matching
239
+ let normalizedPath = this.normalizePath(path);
240
+ if (!normalizedPath.endsWith("/")) {
241
+ normalizedPath += "/";
242
+ }
243
+ if (normalizedPath === "//") {
244
+ normalizedPath = "/";
245
+ }
246
+ const results = [];
247
+ const seen = new Set();
248
+ // Get all files from the store
249
+ const entries = await this.store.list(this.getNamespace());
250
+ for (const { key, value } of entries) {
251
+ const filePath = this.decodeKeyToPath(key);
252
+ const fileData = value;
253
+ // Check if file is under the path
254
+ if (!filePath.startsWith(normalizedPath)) {
255
+ continue;
256
+ }
257
+ const relativePath = filePath.slice(normalizedPath.length);
258
+ const segments = relativePath.split("/").filter(Boolean);
259
+ if (segments.length === 0) {
260
+ continue;
261
+ }
262
+ if (segments.length === 1) {
263
+ // Direct child file
264
+ results.push({
265
+ path: filePath,
266
+ is_dir: false,
267
+ size: fileData.content.join("\n").length,
268
+ modified_at: fileData.modified_at,
269
+ });
270
+ }
271
+ else {
272
+ // Subdirectory
273
+ const dirName = segments[0];
274
+ const dirPath = normalizedPath + dirName;
275
+ if (!seen.has(dirPath)) {
276
+ seen.add(dirPath);
277
+ results.push({
278
+ path: dirPath,
279
+ is_dir: true,
280
+ });
281
+ }
282
+ }
283
+ }
284
+ return results;
285
+ }
286
+ /**
287
+ * Read file content with line numbers.
288
+ */
289
+ async read(filePath, offset, limit) {
290
+ const normalizedPath = this.normalizePath(filePath);
291
+ const key = this.encodePathAsKey(normalizedPath);
292
+ const value = await this.store.get(this.getNamespace(), key);
293
+ if (!value) {
294
+ throw new Error(`File not found: ${filePath}`);
295
+ }
296
+ const fileData = value;
297
+ const startLine = offset ?? 0;
298
+ const maxLines = limit ?? 2000;
299
+ const lines = fileData.content.slice(startLine, startLine + maxLines);
300
+ // Format with line numbers (matching the Read tool format)
301
+ return lines
302
+ .map((line, i) => {
303
+ const lineNum = startLine + i + 1;
304
+ const padding = " ".repeat(Math.max(0, 6 - String(lineNum).length));
305
+ return `${padding}${lineNum}→${line}`;
306
+ })
307
+ .join("\n");
308
+ }
309
+ /**
310
+ * Read raw file content as FileData.
311
+ */
312
+ async readRaw(filePath) {
313
+ const normalizedPath = this.normalizePath(filePath);
314
+ const key = this.encodePathAsKey(normalizedPath);
315
+ const value = await this.store.get(this.getNamespace(), key);
316
+ if (!value) {
317
+ throw new Error(`File not found: ${filePath}`);
318
+ }
319
+ const fileData = value;
320
+ // Return a deep copy to prevent mutation
321
+ return {
322
+ content: [...fileData.content],
323
+ created_at: fileData.created_at,
324
+ modified_at: fileData.modified_at,
325
+ };
326
+ }
327
+ /**
328
+ * Search for pattern matches using regex.
329
+ */
330
+ async grepRaw(pattern, path, glob) {
331
+ const regex = new RegExp(pattern);
332
+ const searchPath = path ? this.normalizePath(path) : "/";
333
+ const matches = [];
334
+ // Get all files from the store
335
+ const entries = await this.store.list(this.getNamespace());
336
+ for (const { key, value } of entries) {
337
+ const filePath = this.decodeKeyToPath(key);
338
+ const fileData = value;
339
+ // Check if file is under the search path
340
+ if (!filePath.startsWith(searchPath)) {
341
+ continue;
342
+ }
343
+ // Check glob pattern if provided
344
+ if (glob && !this.matchesGlob(filePath, glob)) {
345
+ continue;
346
+ }
347
+ // Search each line
348
+ for (let i = 0; i < fileData.content.length; i++) {
349
+ const line = fileData.content[i];
350
+ if (regex.test(line)) {
351
+ matches.push({
352
+ path: filePath,
353
+ line: i + 1, // 1-indexed
354
+ text: line,
355
+ });
356
+ }
357
+ }
358
+ }
359
+ return matches;
360
+ }
361
+ /**
362
+ * Find files matching a glob pattern.
363
+ */
364
+ async globInfo(pattern, path) {
365
+ // Normalize search path and ensure trailing slash for directory matching
366
+ let searchPath = path ? this.normalizePath(path) : "/";
367
+ if (!searchPath.endsWith("/")) {
368
+ searchPath += "/";
369
+ }
370
+ if (searchPath === "//") {
371
+ searchPath = "/";
372
+ }
373
+ const results = [];
374
+ // Get all files from the store
375
+ const entries = await this.store.list(this.getNamespace());
376
+ for (const { key, value } of entries) {
377
+ const filePath = this.decodeKeyToPath(key);
378
+ const fileData = value;
379
+ // Check if file is under the search path
380
+ if (!filePath.startsWith(searchPath)) {
381
+ continue;
382
+ }
383
+ // Get the relative path for matching (without leading slash)
384
+ let relativePath = filePath.slice(searchPath.length);
385
+ if (relativePath.startsWith("/")) {
386
+ relativePath = relativePath.slice(1);
387
+ }
388
+ if (this.matchesGlob(relativePath, pattern)) {
389
+ results.push({
390
+ path: filePath,
391
+ is_dir: false,
392
+ size: fileData.content.join("\n").length,
393
+ modified_at: fileData.modified_at,
394
+ });
395
+ }
396
+ }
397
+ return results;
398
+ }
399
+ /**
400
+ * Create or overwrite a file.
401
+ */
402
+ async write(filePath, content) {
403
+ const normalizedPath = this.normalizePath(filePath);
404
+ const key = this.encodePathAsKey(normalizedPath);
405
+ const now = new Date().toISOString();
406
+ // Check for existing file to preserve created_at
407
+ const existingValue = await this.store.get(this.getNamespace(), key);
408
+ const existingData = existingValue;
409
+ const fileData = {
410
+ content: content.split("\n"),
411
+ created_at: existingData?.created_at ?? now,
412
+ modified_at: now,
413
+ };
414
+ await this.store.put(this.getNamespace(), key, fileData);
415
+ return {
416
+ success: true,
417
+ path: normalizedPath,
418
+ };
419
+ }
420
+ /**
421
+ * Edit a file by replacing text.
422
+ */
423
+ async edit(filePath, oldString, newString, replaceAll) {
424
+ const normalizedPath = this.normalizePath(filePath);
425
+ const key = this.encodePathAsKey(normalizedPath);
426
+ const value = await this.store.get(this.getNamespace(), key);
427
+ if (!value) {
428
+ return {
429
+ success: false,
430
+ error: `File not found: ${filePath}`,
431
+ path: normalizedPath,
432
+ };
433
+ }
434
+ const fileData = value;
435
+ const fullContent = fileData.content.join("\n");
436
+ const occurrences = fullContent.split(oldString).length - 1;
437
+ if (occurrences === 0) {
438
+ return {
439
+ success: false,
440
+ error: `String not found in file: "${oldString.slice(0, 50)}${oldString.length > 50 ? "..." : ""}"`,
441
+ path: normalizedPath,
442
+ };
443
+ }
444
+ if (occurrences > 1 && !replaceAll) {
445
+ return {
446
+ success: false,
447
+ error: `Multiple occurrences (${occurrences}) found. Use replace_all=true to replace all.`,
448
+ path: normalizedPath,
449
+ occurrences,
450
+ };
451
+ }
452
+ const newContent = replaceAll
453
+ ? fullContent.replaceAll(oldString, newString)
454
+ : fullContent.replace(oldString, newString);
455
+ const updatedFileData = {
456
+ content: newContent.split("\n"),
457
+ created_at: fileData.created_at,
458
+ modified_at: new Date().toISOString(),
459
+ };
460
+ await this.store.put(this.getNamespace(), key, updatedFileData);
461
+ return {
462
+ success: true,
463
+ path: normalizedPath,
464
+ occurrences: replaceAll ? occurrences : 1,
465
+ };
466
+ }
467
+ // ===========================================================================
468
+ // Private Helpers
469
+ // ===========================================================================
470
+ /**
471
+ * Check if a path matches a glob pattern.
472
+ * Supports basic glob patterns: *, **, ?
473
+ * @internal
474
+ */
475
+ matchesGlob(path, pattern) {
476
+ // Convert glob to regex using placeholder approach to avoid
477
+ // replacement conflicts with regex special chars
478
+ let regexPattern = pattern
479
+ // Escape special regex chars except * and ?
480
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
481
+ // ** followed by / matches any path segments including empty
482
+ .replace(/\*\*\//g, "<<<GLOBSTAR_SLASH>>>")
483
+ // ** at end matches any remaining path
484
+ .replace(/\*\*/g, "<<<GLOBSTAR>>>")
485
+ // * matches anything except /
486
+ .replace(/\*/g, "[^/]*")
487
+ // ? matches single char except /
488
+ .replace(/\?/g, "[^/]")
489
+ // Now restore globstars with actual regex
490
+ .replace(/<<<GLOBSTAR_SLASH>>>/g, "(?:.*/)?")
491
+ .replace(/<<<GLOBSTAR>>>/g, ".*");
492
+ // Anchor the pattern
493
+ regexPattern = `^${regexPattern}$`;
494
+ return new RegExp(regexPattern).test(path);
495
+ }
496
+ }
497
+ // =============================================================================
498
+ // Factory Function
499
+ // =============================================================================
500
+ /**
501
+ * Create a new PersistentBackend.
502
+ *
503
+ * Convenience function that wraps the PersistentBackend constructor.
504
+ *
505
+ * @param options - Configuration options
506
+ * @returns A new PersistentBackend instance
507
+ *
508
+ * @example
509
+ * ```typescript
510
+ * const store = new InMemoryStore();
511
+ * const backend = createPersistentBackend({ store });
512
+ * ```
513
+ *
514
+ * @category Backend
515
+ */
516
+ export function createPersistentBackend(options) {
517
+ return new PersistentBackend(options);
518
+ }
519
+ //# sourceMappingURL=persistent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent.js","sourceRoot":"","sources":["../../src/backends/persistent.ts"],"names":[],"mappings":"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"}