@lleverage-ai/agent-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2321 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +2122 -0
- package/dist/agent.js.map +1 -0
- package/dist/backend.d.ts +378 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +71 -0
- package/dist/backend.js.map +1 -0
- package/dist/backends/composite.d.ts +258 -0
- package/dist/backends/composite.d.ts.map +1 -0
- package/dist/backends/composite.js +437 -0
- package/dist/backends/composite.js.map +1 -0
- package/dist/backends/filesystem.d.ts +268 -0
- package/dist/backends/filesystem.d.ts.map +1 -0
- package/dist/backends/filesystem.js +623 -0
- package/dist/backends/filesystem.js.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +14 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/persistent.d.ts +312 -0
- package/dist/backends/persistent.d.ts.map +1 -0
- package/dist/backends/persistent.js +519 -0
- package/dist/backends/persistent.js.map +1 -0
- package/dist/backends/sandbox.d.ts +315 -0
- package/dist/backends/sandbox.d.ts.map +1 -0
- package/dist/backends/sandbox.js +490 -0
- package/dist/backends/sandbox.js.map +1 -0
- package/dist/backends/state.d.ts +225 -0
- package/dist/backends/state.d.ts.map +1 -0
- package/dist/backends/state.js +396 -0
- package/dist/backends/state.js.map +1 -0
- package/dist/checkpointer/file-saver.d.ts +182 -0
- package/dist/checkpointer/file-saver.d.ts.map +1 -0
- package/dist/checkpointer/file-saver.js +298 -0
- package/dist/checkpointer/file-saver.js.map +1 -0
- package/dist/checkpointer/index.d.ts +40 -0
- package/dist/checkpointer/index.d.ts.map +1 -0
- package/dist/checkpointer/index.js +40 -0
- package/dist/checkpointer/index.js.map +1 -0
- package/dist/checkpointer/kv-saver.d.ts +142 -0
- package/dist/checkpointer/kv-saver.d.ts.map +1 -0
- package/dist/checkpointer/kv-saver.js +176 -0
- package/dist/checkpointer/kv-saver.js.map +1 -0
- package/dist/checkpointer/memory-saver.d.ts +158 -0
- package/dist/checkpointer/memory-saver.d.ts.map +1 -0
- package/dist/checkpointer/memory-saver.js +222 -0
- package/dist/checkpointer/memory-saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +353 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/checkpointer/types.js +159 -0
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/context-manager.d.ts +627 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +1039 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context.d.ts +57 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +76 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/index.d.ts +611 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +1023 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation-helpers.d.ts +126 -0
- package/dist/generation-helpers.d.ts.map +1 -0
- package/dist/generation-helpers.js +181 -0
- package/dist/generation-helpers.js.map +1 -0
- package/dist/hooks/audit.d.ts +210 -0
- package/dist/hooks/audit.d.ts.map +1 -0
- package/dist/hooks/audit.js +305 -0
- package/dist/hooks/audit.js.map +1 -0
- package/dist/hooks/cache.d.ts +180 -0
- package/dist/hooks/cache.d.ts.map +1 -0
- package/dist/hooks/cache.js +273 -0
- package/dist/hooks/cache.js.map +1 -0
- package/dist/hooks/guardrails.d.ts +145 -0
- package/dist/hooks/guardrails.d.ts.map +1 -0
- package/dist/hooks/guardrails.js +326 -0
- package/dist/hooks/guardrails.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/logging.d.ts +193 -0
- package/dist/hooks/logging.d.ts.map +1 -0
- package/dist/hooks/logging.js +345 -0
- package/dist/hooks/logging.js.map +1 -0
- package/dist/hooks/parallel-guardrails.d.ts +268 -0
- package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
- package/dist/hooks/parallel-guardrails.js +416 -0
- package/dist/hooks/parallel-guardrails.js.map +1 -0
- package/dist/hooks/rate-limit.d.ts +305 -0
- package/dist/hooks/rate-limit.d.ts.map +1 -0
- package/dist/hooks/rate-limit.js +372 -0
- package/dist/hooks/rate-limit.js.map +1 -0
- package/dist/hooks/retry.d.ts +144 -0
- package/dist/hooks/retry.d.ts.map +1 -0
- package/dist/hooks/retry.js +210 -0
- package/dist/hooks/retry.js.map +1 -0
- package/dist/hooks/secrets.d.ts +174 -0
- package/dist/hooks/secrets.d.ts.map +1 -0
- package/dist/hooks/secrets.js +306 -0
- package/dist/hooks/secrets.js.map +1 -0
- package/dist/hooks.d.ts +229 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +352 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/env.d.ts +25 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +18 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +184 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +446 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +58 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +119 -0
- package/dist/mcp/validation.d.ts.map +1 -0
- package/dist/mcp/validation.js +407 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/mcp/virtual-server.d.ts +78 -0
- package/dist/mcp/virtual-server.d.ts.map +1 -0
- package/dist/mcp/virtual-server.js +137 -0
- package/dist/mcp/virtual-server.js.map +1 -0
- package/dist/memory/filesystem-store.d.ts +217 -0
- package/dist/memory/filesystem-store.d.ts.map +1 -0
- package/dist/memory/filesystem-store.js +343 -0
- package/dist/memory/filesystem-store.js.map +1 -0
- package/dist/memory/index.d.ts +46 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +46 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/loader.d.ts +396 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +419 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/permissions.d.ts +282 -0
- package/dist/memory/permissions.d.ts.map +1 -0
- package/dist/memory/permissions.js +297 -0
- package/dist/memory/permissions.js.map +1 -0
- package/dist/memory/rules.d.ts +249 -0
- package/dist/memory/rules.d.ts.map +1 -0
- package/dist/memory/rules.js +362 -0
- package/dist/memory/rules.js.map +1 -0
- package/dist/memory/store.d.ts +286 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +263 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/middleware/apply.d.ts +73 -0
- package/dist/middleware/apply.d.ts.map +1 -0
- package/dist/middleware/apply.js +219 -0
- package/dist/middleware/apply.js.map +1 -0
- package/dist/middleware/context.d.ts +33 -0
- package/dist/middleware/context.d.ts.map +1 -0
- package/dist/middleware/context.js +176 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/index.d.ts +31 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging.d.ts +137 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +374 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/types.d.ts +183 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +11 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/observability/events.d.ts +183 -0
- package/dist/observability/events.d.ts.map +1 -0
- package/dist/observability/events.js +305 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/index.d.ts +55 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +87 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +318 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +436 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +341 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +490 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/preset.d.ts +161 -0
- package/dist/observability/preset.d.ts.map +1 -0
- package/dist/observability/preset.js +133 -0
- package/dist/observability/preset.js.map +1 -0
- package/dist/observability/streaming.d.ts +113 -0
- package/dist/observability/streaming.d.ts.map +1 -0
- package/dist/observability/streaming.js +114 -0
- package/dist/observability/streaming.js.map +1 -0
- package/dist/observability/tracing.d.ts +378 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +539 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +63 -0
- package/dist/plugins.js.map +1 -0
- package/dist/presets/index.d.ts +7 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +7 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/production.d.ts +262 -0
- package/dist/presets/production.d.ts.map +1 -0
- package/dist/presets/production.js +295 -0
- package/dist/presets/production.js.map +1 -0
- package/dist/security/index.d.ts +179 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +323 -0
- package/dist/security/index.js.map +1 -0
- package/dist/subagents/advanced.d.ts +413 -0
- package/dist/subagents/advanced.d.ts.map +1 -0
- package/dist/subagents/advanced.js +396 -0
- package/dist/subagents/advanced.js.map +1 -0
- package/dist/subagents/index.d.ts +14 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +15 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents.d.ts +73 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +213 -0
- package/dist/subagents.js.map +1 -0
- package/dist/task-store/file-store.d.ts +76 -0
- package/dist/task-store/file-store.d.ts.map +1 -0
- package/dist/task-store/file-store.js +190 -0
- package/dist/task-store/file-store.js.map +1 -0
- package/dist/task-store/index.d.ts +11 -0
- package/dist/task-store/index.d.ts.map +1 -0
- package/dist/task-store/index.js +10 -0
- package/dist/task-store/index.js.map +1 -0
- package/dist/task-store/kv-store.d.ts +140 -0
- package/dist/task-store/kv-store.d.ts.map +1 -0
- package/dist/task-store/kv-store.js +169 -0
- package/dist/task-store/kv-store.js.map +1 -0
- package/dist/task-store/memory-store.d.ts +66 -0
- package/dist/task-store/memory-store.d.ts.map +1 -0
- package/dist/task-store/memory-store.js +125 -0
- package/dist/task-store/memory-store.js.map +1 -0
- package/dist/task-store/types.d.ts +235 -0
- package/dist/task-store/types.d.ts.map +1 -0
- package/dist/task-store/types.js +110 -0
- package/dist/task-store/types.js.map +1 -0
- package/dist/testing/assertions.d.ts +401 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +630 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/index.d.ts +343 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +360 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent.d.ts +214 -0
- package/dist/testing/mock-agent.d.ts.map +1 -0
- package/dist/testing/mock-agent.js +448 -0
- package/dist/testing/mock-agent.js.map +1 -0
- package/dist/testing/recorder.d.ts +288 -0
- package/dist/testing/recorder.d.ts.map +1 -0
- package/dist/testing/recorder.js +499 -0
- package/dist/testing/recorder.js.map +1 -0
- package/dist/tools/execute.d.ts +104 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +191 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/factory.d.ts +260 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +241 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/filesystem.d.ts +215 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +311 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +354 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +413 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/task.d.ts +272 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +521 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todos.d.ts +131 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +120 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +424 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +607 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/user-interaction.d.ts +116 -0
- package/dist/tools/user-interaction.d.ts.map +1 -0
- package/dist/tools/user-interaction.js +147 -0
- package/dist/tools/user-interaction.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +189 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools.d.ts +74 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +73 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +2421 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,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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"}
|