@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,225 @@
1
+ /**
2
+ * In-memory state backend for ephemeral storage.
3
+ *
4
+ * StateBackend provides a virtual filesystem backed by in-memory data structures.
5
+ * All operations are synchronous and data is lost when the process ends.
6
+ *
7
+ * This backend is ideal for:
8
+ * - Single-session agents without persistence needs
9
+ * - Testing and development
10
+ * - Sandboxed environments
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const state: AgentState = { todos: [], files: {} };
15
+ * const backend = new StateBackend(state);
16
+ *
17
+ * // Or use the factory pattern
18
+ * const backendFactory = createStateBackend();
19
+ * const backend = backendFactory(state);
20
+ * ```
21
+ *
22
+ * @packageDocumentation
23
+ */
24
+ import type { BackendProtocol, EditResult, FileData, FileInfo, GrepMatch, WriteResult } from "../backend.js";
25
+ /**
26
+ * Status of a todo item.
27
+ *
28
+ * @category Backend
29
+ */
30
+ export type TodoStatus = "pending" | "in_progress" | "completed" | "cancelled";
31
+ /**
32
+ * A single todo item for task tracking.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const todo: TodoItem = {
37
+ * id: "todo-1",
38
+ * content: "Implement feature X",
39
+ * status: "in_progress",
40
+ * createdAt: "2026-01-30T10:00:00Z",
41
+ * };
42
+ * ```
43
+ *
44
+ * @category Backend
45
+ */
46
+ export interface TodoItem {
47
+ /** Unique identifier for this todo */
48
+ id: string;
49
+ /** Description of the task */
50
+ content: string;
51
+ /** Current status of the task */
52
+ status: TodoStatus;
53
+ /** ISO 8601 timestamp when the todo was created */
54
+ createdAt: string;
55
+ /** ISO 8601 timestamp when the todo was completed (if applicable) */
56
+ completedAt?: string;
57
+ }
58
+ /**
59
+ * Complete agent state including todos and virtual filesystem.
60
+ *
61
+ * This interface represents the full state that can be persisted,
62
+ * shared between agents, or used with checkpointing.
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const state: AgentState = {
67
+ * todos: [],
68
+ * files: {
69
+ * "/notes.md": {
70
+ * content: ["# Notes", "", "Initial notes here."],
71
+ * created_at: new Date().toISOString(),
72
+ * modified_at: new Date().toISOString(),
73
+ * },
74
+ * },
75
+ * };
76
+ * ```
77
+ *
78
+ * @category Backend
79
+ */
80
+ export interface AgentState {
81
+ /** Current todo list */
82
+ todos: TodoItem[];
83
+ /** Virtual filesystem (path -> content) */
84
+ files: Record<string, FileData>;
85
+ }
86
+ /**
87
+ * In-memory backend implementation using AgentState.
88
+ *
89
+ * All file operations are performed on the in-memory `state.files` map.
90
+ * Changes are immediately visible but not persisted to disk.
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * // Create with existing state
95
+ * const state: AgentState = { todos: [], files: {} };
96
+ * const backend = new StateBackend(state);
97
+ *
98
+ * // Write a file
99
+ * await backend.write("/hello.txt", "Hello, World!");
100
+ *
101
+ * // Read it back
102
+ * const content = await backend.read("/hello.txt");
103
+ * console.log(content); // " 1→Hello, World!"
104
+ *
105
+ * // State is updated directly
106
+ * console.log(state.files["/hello.txt"].content); // ["Hello, World!"]
107
+ * ```
108
+ *
109
+ * @category Backend
110
+ */
111
+ export declare class StateBackend implements BackendProtocol {
112
+ private readonly state;
113
+ /**
114
+ * Create a new StateBackend.
115
+ *
116
+ * @param state - The AgentState to use for storage
117
+ */
118
+ constructor(state: AgentState);
119
+ /**
120
+ * List files and directories at the given path.
121
+ *
122
+ * @param path - Directory path to list (non-recursive)
123
+ * @returns Array of file/directory info
124
+ */
125
+ lsInfo(path: string): FileInfo[];
126
+ /**
127
+ * Read file content with line numbers.
128
+ *
129
+ * @param filePath - Path to the file to read
130
+ * @param offset - Starting line offset (0-indexed)
131
+ * @param limit - Maximum number of lines to read
132
+ * @returns Formatted content with line numbers
133
+ */
134
+ read(filePath: string, offset?: number, limit?: number): string;
135
+ /**
136
+ * Read raw file content as FileData.
137
+ *
138
+ * @param filePath - Path to the file to read
139
+ * @returns Raw file data with content and timestamps (deep copy)
140
+ */
141
+ readRaw(filePath: string): FileData;
142
+ /**
143
+ * Search for pattern matches using regex.
144
+ *
145
+ * @param pattern - Regular expression pattern to search for
146
+ * @param path - Directory to search in (defaults to root)
147
+ * @param glob - Glob pattern to filter files (e.g., "*.ts")
148
+ * @returns Array of matches
149
+ */
150
+ grepRaw(pattern: string, path?: string | null, glob?: string | null): GrepMatch[];
151
+ /**
152
+ * Find files matching a glob pattern.
153
+ *
154
+ * @param pattern - Glob pattern (e.g., "**\/*.ts")
155
+ * @param path - Base directory for the search
156
+ * @returns Array of matching file info
157
+ */
158
+ globInfo(pattern: string, path?: string): FileInfo[];
159
+ /**
160
+ * Create or overwrite a file.
161
+ *
162
+ * @param filePath - Path for the new file
163
+ * @param content - Content to write
164
+ * @returns Result indicating success or failure
165
+ */
166
+ write(filePath: string, content: string): WriteResult;
167
+ /**
168
+ * Edit a file by replacing text.
169
+ *
170
+ * @param filePath - Path to the file to edit
171
+ * @param oldString - Text to find and replace
172
+ * @param newString - Replacement text
173
+ * @param replaceAll - If true, replace all occurrences
174
+ * @returns Result indicating success or failure
175
+ */
176
+ edit(filePath: string, oldString: string, newString: string, replaceAll?: boolean): EditResult;
177
+ /**
178
+ * Normalize a path to ensure consistent format.
179
+ * @internal
180
+ */
181
+ private normalizePath;
182
+ /**
183
+ * Check if a path matches a glob pattern.
184
+ * Supports basic glob patterns: *, **, ?
185
+ * @internal
186
+ */
187
+ private matchesGlob;
188
+ }
189
+ /**
190
+ * Create a StateBackend factory function.
191
+ *
192
+ * This is useful when you need to defer backend creation until state is available,
193
+ * such as when integrating with the agent system.
194
+ *
195
+ * @returns A factory function that creates a StateBackend from AgentState
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * const backendFactory = createStateBackend();
200
+ *
201
+ * // Later, when state is available:
202
+ * const state: AgentState = { todos: [], files: {} };
203
+ * const backend = backendFactory(state);
204
+ * ```
205
+ *
206
+ * @category Backend
207
+ */
208
+ export declare function createStateBackend(): (state: AgentState) => StateBackend;
209
+ /**
210
+ * Create a new empty AgentState.
211
+ *
212
+ * Convenience function to create a fresh state for testing or initialization.
213
+ *
214
+ * @returns A new AgentState with empty todos and files
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const state = createAgentState();
219
+ * const backend = new StateBackend(state);
220
+ * ```
221
+ *
222
+ * @category Backend
223
+ */
224
+ export declare function createAgentState(): AgentState;
225
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/backends/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACZ,MAAM,eAAe,CAAC;AAMvB;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/E;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IAEX,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,MAAM,EAAE,UAAU,CAAC;IAEnB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAElB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACjC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,YAAa,YAAW,eAAe;IAMtC,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC;;;;OAIG;gBAC0B,KAAK,EAAE,UAAU;IAE9C;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAsDhC;;;;;;;OAOG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB/D;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAgBnC;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE;IAgCjF;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAsCpD;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW;IAkBrD;;;;;;;;OAQG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU;IAqD9F;;;OAGG;IACH,OAAO,CAAC,aAAa;IAerB;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAuBpB;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,YAAY,CAExE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAK7C"}
@@ -0,0 +1,396 @@
1
+ /**
2
+ * In-memory state backend for ephemeral storage.
3
+ *
4
+ * StateBackend provides a virtual filesystem backed by in-memory data structures.
5
+ * All operations are synchronous and data is lost when the process ends.
6
+ *
7
+ * This backend is ideal for:
8
+ * - Single-session agents without persistence needs
9
+ * - Testing and development
10
+ * - Sandboxed environments
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const state: AgentState = { todos: [], files: {} };
15
+ * const backend = new StateBackend(state);
16
+ *
17
+ * // Or use the factory pattern
18
+ * const backendFactory = createStateBackend();
19
+ * const backend = backendFactory(state);
20
+ * ```
21
+ *
22
+ * @packageDocumentation
23
+ */
24
+ // =============================================================================
25
+ // State Backend Implementation
26
+ // =============================================================================
27
+ /**
28
+ * In-memory backend implementation using AgentState.
29
+ *
30
+ * All file operations are performed on the in-memory `state.files` map.
31
+ * Changes are immediately visible but not persisted to disk.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * // Create with existing state
36
+ * const state: AgentState = { todos: [], files: {} };
37
+ * const backend = new StateBackend(state);
38
+ *
39
+ * // Write a file
40
+ * await backend.write("/hello.txt", "Hello, World!");
41
+ *
42
+ * // Read it back
43
+ * const content = await backend.read("/hello.txt");
44
+ * console.log(content); // " 1→Hello, World!"
45
+ *
46
+ * // State is updated directly
47
+ * console.log(state.files["/hello.txt"].content); // ["Hello, World!"]
48
+ * ```
49
+ *
50
+ * @category Backend
51
+ */
52
+ export class StateBackend {
53
+ state;
54
+ /**
55
+ * Create a new StateBackend.
56
+ *
57
+ * @param state - The AgentState to use for storage
58
+ */
59
+ constructor(state) {
60
+ this.state = state;
61
+ }
62
+ /**
63
+ * List files and directories at the given path.
64
+ *
65
+ * @param path - Directory path to list (non-recursive)
66
+ * @returns Array of file/directory info
67
+ */
68
+ lsInfo(path) {
69
+ // Normalize and ensure trailing slash for directory matching
70
+ let normalizedPath = this.normalizePath(path);
71
+ if (!normalizedPath.endsWith("/")) {
72
+ normalizedPath += "/";
73
+ }
74
+ // Handle root case
75
+ if (normalizedPath === "//") {
76
+ normalizedPath = "/";
77
+ }
78
+ const results = [];
79
+ const seen = new Set();
80
+ for (const filePath of Object.keys(this.state.files)) {
81
+ // Check if file is under the path
82
+ if (!filePath.startsWith(normalizedPath)) {
83
+ continue;
84
+ }
85
+ const relativePath = filePath.slice(normalizedPath.length);
86
+ const segments = relativePath.split("/").filter(Boolean);
87
+ if (segments.length === 0) {
88
+ continue;
89
+ }
90
+ if (segments.length === 1) {
91
+ // Direct child file
92
+ const fileData = this.state.files[filePath];
93
+ results.push({
94
+ path: filePath,
95
+ is_dir: false,
96
+ size: fileData.content.join("\n").length,
97
+ modified_at: fileData.modified_at,
98
+ });
99
+ }
100
+ else {
101
+ // Subdirectory - construct the directory path
102
+ const dirName = segments[0];
103
+ const dirPath = normalizedPath + dirName;
104
+ if (!seen.has(dirPath)) {
105
+ seen.add(dirPath);
106
+ results.push({
107
+ path: dirPath,
108
+ is_dir: true,
109
+ });
110
+ }
111
+ }
112
+ }
113
+ return results;
114
+ }
115
+ /**
116
+ * Read file content with line numbers.
117
+ *
118
+ * @param filePath - Path to the file to read
119
+ * @param offset - Starting line offset (0-indexed)
120
+ * @param limit - Maximum number of lines to read
121
+ * @returns Formatted content with line numbers
122
+ */
123
+ read(filePath, offset, limit) {
124
+ const normalizedPath = this.normalizePath(filePath);
125
+ const fileData = this.state.files[normalizedPath];
126
+ if (!fileData) {
127
+ throw new Error(`File not found: ${filePath}`);
128
+ }
129
+ const startLine = offset ?? 0;
130
+ const maxLines = limit ?? 2000;
131
+ const lines = fileData.content.slice(startLine, startLine + maxLines);
132
+ // Format with line numbers (matching the Read tool format)
133
+ return lines
134
+ .map((line, i) => {
135
+ const lineNum = startLine + i + 1;
136
+ const padding = " ".repeat(Math.max(0, 6 - String(lineNum).length));
137
+ return `${padding}${lineNum}→${line}`;
138
+ })
139
+ .join("\n");
140
+ }
141
+ /**
142
+ * Read raw file content as FileData.
143
+ *
144
+ * @param filePath - Path to the file to read
145
+ * @returns Raw file data with content and timestamps (deep copy)
146
+ */
147
+ readRaw(filePath) {
148
+ const normalizedPath = this.normalizePath(filePath);
149
+ const fileData = this.state.files[normalizedPath];
150
+ if (!fileData) {
151
+ throw new Error(`File not found: ${filePath}`);
152
+ }
153
+ // Return a deep copy to prevent mutation
154
+ return {
155
+ content: [...fileData.content],
156
+ created_at: fileData.created_at,
157
+ modified_at: fileData.modified_at,
158
+ };
159
+ }
160
+ /**
161
+ * Search for pattern matches using regex.
162
+ *
163
+ * @param pattern - Regular expression pattern to search for
164
+ * @param path - Directory to search in (defaults to root)
165
+ * @param glob - Glob pattern to filter files (e.g., "*.ts")
166
+ * @returns Array of matches
167
+ */
168
+ grepRaw(pattern, path, glob) {
169
+ const regex = new RegExp(pattern);
170
+ const searchPath = path ? this.normalizePath(path) : "/";
171
+ const matches = [];
172
+ for (const [filePath, fileData] of Object.entries(this.state.files)) {
173
+ // Check if file is under the search path
174
+ if (!filePath.startsWith(searchPath)) {
175
+ continue;
176
+ }
177
+ // Check glob pattern if provided
178
+ if (glob && !this.matchesGlob(filePath, glob)) {
179
+ continue;
180
+ }
181
+ // Search each line
182
+ for (let i = 0; i < fileData.content.length; i++) {
183
+ const line = fileData.content[i];
184
+ if (regex.test(line)) {
185
+ matches.push({
186
+ path: filePath,
187
+ line: i + 1, // 1-indexed
188
+ text: line,
189
+ });
190
+ }
191
+ }
192
+ }
193
+ return matches;
194
+ }
195
+ /**
196
+ * Find files matching a glob pattern.
197
+ *
198
+ * @param pattern - Glob pattern (e.g., "**\/*.ts")
199
+ * @param path - Base directory for the search
200
+ * @returns Array of matching file info
201
+ */
202
+ globInfo(pattern, path) {
203
+ // Normalize search path and ensure trailing slash for directory matching
204
+ let searchPath = path ? this.normalizePath(path) : "/";
205
+ if (!searchPath.endsWith("/")) {
206
+ searchPath += "/";
207
+ }
208
+ if (searchPath === "//") {
209
+ searchPath = "/";
210
+ }
211
+ const results = [];
212
+ for (const [filePath, fileData] of Object.entries(this.state.files)) {
213
+ // Check if file is under the search path
214
+ if (!filePath.startsWith(searchPath)) {
215
+ continue;
216
+ }
217
+ // Get the relative path for matching (without leading slash)
218
+ let relativePath = filePath.slice(searchPath.length);
219
+ // Remove leading slash if present
220
+ if (relativePath.startsWith("/")) {
221
+ relativePath = relativePath.slice(1);
222
+ }
223
+ if (this.matchesGlob(relativePath, pattern)) {
224
+ results.push({
225
+ path: filePath,
226
+ is_dir: false,
227
+ size: fileData.content.join("\n").length,
228
+ modified_at: fileData.modified_at,
229
+ });
230
+ }
231
+ }
232
+ return results;
233
+ }
234
+ /**
235
+ * Create or overwrite a file.
236
+ *
237
+ * @param filePath - Path for the new file
238
+ * @param content - Content to write
239
+ * @returns Result indicating success or failure
240
+ */
241
+ write(filePath, content) {
242
+ const normalizedPath = this.normalizePath(filePath);
243
+ const now = new Date().toISOString();
244
+ const existingFile = this.state.files[normalizedPath];
245
+ this.state.files[normalizedPath] = {
246
+ content: content.split("\n"),
247
+ created_at: existingFile?.created_at ?? now,
248
+ modified_at: now,
249
+ };
250
+ return {
251
+ success: true,
252
+ path: normalizedPath,
253
+ };
254
+ }
255
+ /**
256
+ * Edit a file by replacing text.
257
+ *
258
+ * @param filePath - Path to the file to edit
259
+ * @param oldString - Text to find and replace
260
+ * @param newString - Replacement text
261
+ * @param replaceAll - If true, replace all occurrences
262
+ * @returns Result indicating success or failure
263
+ */
264
+ edit(filePath, oldString, newString, replaceAll) {
265
+ const normalizedPath = this.normalizePath(filePath);
266
+ const fileData = this.state.files[normalizedPath];
267
+ if (!fileData) {
268
+ return {
269
+ success: false,
270
+ error: `File not found: ${filePath}`,
271
+ path: normalizedPath,
272
+ };
273
+ }
274
+ const fullContent = fileData.content.join("\n");
275
+ const occurrences = fullContent.split(oldString).length - 1;
276
+ if (occurrences === 0) {
277
+ return {
278
+ success: false,
279
+ error: `String not found in file: "${oldString.slice(0, 50)}${oldString.length > 50 ? "..." : ""}"`,
280
+ path: normalizedPath,
281
+ };
282
+ }
283
+ if (occurrences > 1 && !replaceAll) {
284
+ return {
285
+ success: false,
286
+ error: `Multiple occurrences (${occurrences}) found. Use replace_all=true to replace all.`,
287
+ path: normalizedPath,
288
+ occurrences,
289
+ };
290
+ }
291
+ const newContent = replaceAll
292
+ ? fullContent.replaceAll(oldString, newString)
293
+ : fullContent.replace(oldString, newString);
294
+ this.state.files[normalizedPath] = {
295
+ ...fileData,
296
+ content: newContent.split("\n"),
297
+ modified_at: new Date().toISOString(),
298
+ };
299
+ return {
300
+ success: true,
301
+ path: normalizedPath,
302
+ occurrences: replaceAll ? occurrences : 1,
303
+ };
304
+ }
305
+ // ===========================================================================
306
+ // Private Helpers
307
+ // ===========================================================================
308
+ /**
309
+ * Normalize a path to ensure consistent format.
310
+ * @internal
311
+ */
312
+ normalizePath(path) {
313
+ // Ensure path starts with /
314
+ let normalized = path.startsWith("/") ? path : `/${path}`;
315
+ // Remove trailing slash for files
316
+ if (normalized.length > 1 && normalized.endsWith("/")) {
317
+ normalized = normalized.slice(0, -1);
318
+ }
319
+ // Collapse multiple slashes
320
+ normalized = normalized.replace(/\/+/g, "/");
321
+ return normalized;
322
+ }
323
+ /**
324
+ * Check if a path matches a glob pattern.
325
+ * Supports basic glob patterns: *, **, ?
326
+ * @internal
327
+ */
328
+ matchesGlob(path, pattern) {
329
+ // Convert glob to regex using placeholder approach to avoid
330
+ // replacement conflicts with regex special chars
331
+ let regexPattern = pattern
332
+ // Escape special regex chars except * and ?
333
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
334
+ // ** followed by / matches any path segments including empty
335
+ .replace(/\*\*\//g, "<<<GLOBSTAR_SLASH>>>")
336
+ // ** at end matches any remaining path
337
+ .replace(/\*\*/g, "<<<GLOBSTAR>>>")
338
+ // * matches anything except /
339
+ .replace(/\*/g, "[^/]*")
340
+ // ? matches single char except /
341
+ .replace(/\?/g, "[^/]")
342
+ // Now restore globstars with actual regex
343
+ .replace(/<<<GLOBSTAR_SLASH>>>/g, "(?:.*/)?")
344
+ .replace(/<<<GLOBSTAR>>>/g, ".*");
345
+ // Anchor the pattern
346
+ regexPattern = `^${regexPattern}$`;
347
+ return new RegExp(regexPattern).test(path);
348
+ }
349
+ }
350
+ // =============================================================================
351
+ // Factory Function
352
+ // =============================================================================
353
+ /**
354
+ * Create a StateBackend factory function.
355
+ *
356
+ * This is useful when you need to defer backend creation until state is available,
357
+ * such as when integrating with the agent system.
358
+ *
359
+ * @returns A factory function that creates a StateBackend from AgentState
360
+ *
361
+ * @example
362
+ * ```typescript
363
+ * const backendFactory = createStateBackend();
364
+ *
365
+ * // Later, when state is available:
366
+ * const state: AgentState = { todos: [], files: {} };
367
+ * const backend = backendFactory(state);
368
+ * ```
369
+ *
370
+ * @category Backend
371
+ */
372
+ export function createStateBackend() {
373
+ return (state) => new StateBackend(state);
374
+ }
375
+ /**
376
+ * Create a new empty AgentState.
377
+ *
378
+ * Convenience function to create a fresh state for testing or initialization.
379
+ *
380
+ * @returns A new AgentState with empty todos and files
381
+ *
382
+ * @example
383
+ * ```typescript
384
+ * const state = createAgentState();
385
+ * const backend = new StateBackend(state);
386
+ * ```
387
+ *
388
+ * @category Backend
389
+ */
390
+ export function createAgentState() {
391
+ return {
392
+ todos: [],
393
+ files: {},
394
+ };
395
+ }
396
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/backends/state.ts"],"names":[],"mappings":"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"}