@chances-ai/engine 24.0.0
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/dist/agents/discover.d.ts +30 -0
- package/dist/agents/discover.d.ts.map +1 -0
- package/dist/agents/discover.js +183 -0
- package/dist/agents/discover.js.map +1 -0
- package/dist/agents/index.d.ts +20 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +52 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/parse.d.ts +61 -0
- package/dist/agents/parse.d.ts.map +1 -0
- package/dist/agents/parse.js +527 -0
- package/dist/agents/parse.js.map +1 -0
- package/dist/agents/types.d.ts +52 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.js +125 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
- package/dist/ai/adapters/ai-sdk.d.ts +56 -0
- package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk.js +112 -0
- package/dist/ai/adapters/ai-sdk.js.map +1 -0
- package/dist/ai/adapters/mock.d.ts +13 -0
- package/dist/ai/adapters/mock.d.ts.map +1 -0
- package/dist/ai/adapters/mock.js +54 -0
- package/dist/ai/adapters/mock.js.map +1 -0
- package/dist/ai/adapters/openai-compatible.d.ts +23 -0
- package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/ai/adapters/openai-compatible.js +45 -0
- package/dist/ai/adapters/openai-compatible.js.map +1 -0
- package/dist/ai/cost.d.ts +3 -0
- package/dist/ai/cost.d.ts.map +1 -0
- package/dist/ai/cost.js +5 -0
- package/dist/ai/cost.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/known-models.d.ts +20 -0
- package/dist/ai/known-models.d.ts.map +1 -0
- package/dist/ai/known-models.js +129 -0
- package/dist/ai/known-models.js.map +1 -0
- package/dist/ai/registry.d.ts +12 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/registry.js +24 -0
- package/dist/ai/registry.js.map +1 -0
- package/dist/ai/retry.d.ts +11 -0
- package/dist/ai/retry.d.ts.map +1 -0
- package/dist/ai/retry.js +14 -0
- package/dist/ai/retry.js.map +1 -0
- package/dist/ai/router.d.ts +25 -0
- package/dist/ai/router.d.ts.map +1 -0
- package/dist/ai/router.js +36 -0
- package/dist/ai/router.js.map +1 -0
- package/dist/ai/setup.d.ts +23 -0
- package/dist/ai/setup.d.ts.map +1 -0
- package/dist/ai/setup.js +47 -0
- package/dist/ai/setup.js.map +1 -0
- package/dist/ai/summarizer.d.ts +24 -0
- package/dist/ai/summarizer.d.ts.map +1 -0
- package/dist/ai/summarizer.js +56 -0
- package/dist/ai/summarizer.js.map +1 -0
- package/dist/ai/types.d.ts +83 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/core/compaction/circuit-breaker.d.ts +32 -0
- package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
- package/dist/core/compaction/circuit-breaker.js +42 -0
- package/dist/core/compaction/circuit-breaker.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +75 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +261 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/estimate.d.ts +39 -0
- package/dist/core/compaction/estimate.d.ts.map +1 -0
- package/dist/core/compaction/estimate.js +74 -0
- package/dist/core/compaction/estimate.js.map +1 -0
- package/dist/core/compaction/index.d.ts +5 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +5 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/prune.d.ts +43 -0
- package/dist/core/compaction/prune.d.ts.map +1 -0
- package/dist/core/compaction/prune.js +51 -0
- package/dist/core/compaction/prune.js.map +1 -0
- package/dist/core/engine.d.ts +268 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +767 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/task-tool.d.ts +175 -0
- package/dist/core/task-tool.d.ts.map +1 -0
- package/dist/core/task-tool.js +901 -0
- package/dist/core/task-tool.js.map +1 -0
- package/dist/core/workspace-query.d.ts +83 -0
- package/dist/core/workspace-query.d.ts.map +1 -0
- package/dist/core/workspace-query.js +217 -0
- package/dist/core/workspace-query.js.map +1 -0
- package/dist/core/worktree/active-marker.d.ts +31 -0
- package/dist/core/worktree/active-marker.d.ts.map +1 -0
- package/dist/core/worktree/active-marker.js +109 -0
- package/dist/core/worktree/active-marker.js.map +1 -0
- package/dist/core/worktree/create.d.ts +40 -0
- package/dist/core/worktree/create.d.ts.map +1 -0
- package/dist/core/worktree/create.js +121 -0
- package/dist/core/worktree/create.js.map +1 -0
- package/dist/core/worktree/errors.d.ts +7 -0
- package/dist/core/worktree/errors.d.ts.map +1 -0
- package/dist/core/worktree/errors.js +11 -0
- package/dist/core/worktree/errors.js.map +1 -0
- package/dist/core/worktree/gc.d.ts +39 -0
- package/dist/core/worktree/gc.d.ts.map +1 -0
- package/dist/core/worktree/gc.js +146 -0
- package/dist/core/worktree/gc.js.map +1 -0
- package/dist/core/worktree/git.d.ts +53 -0
- package/dist/core/worktree/git.d.ts.map +1 -0
- package/dist/core/worktree/git.js +166 -0
- package/dist/core/worktree/git.js.map +1 -0
- package/dist/core/worktree/index.d.ts +8 -0
- package/dist/core/worktree/index.d.ts.map +1 -0
- package/dist/core/worktree/index.js +8 -0
- package/dist/core/worktree/index.js.map +1 -0
- package/dist/core/worktree/paths.d.ts +26 -0
- package/dist/core/worktree/paths.d.ts.map +1 -0
- package/dist/core/worktree/paths.js +57 -0
- package/dist/core/worktree/paths.js.map +1 -0
- package/dist/core/worktree/slug.d.ts +6 -0
- package/dist/core/worktree/slug.d.ts.map +1 -0
- package/dist/core/worktree/slug.js +21 -0
- package/dist/core/worktree/slug.js.map +1 -0
- package/dist/local-vault/file-store.d.ts +64 -0
- package/dist/local-vault/file-store.d.ts.map +1 -0
- package/dist/local-vault/file-store.js +225 -0
- package/dist/local-vault/file-store.js.map +1 -0
- package/dist/local-vault/index.d.ts +57 -0
- package/dist/local-vault/index.d.ts.map +1 -0
- package/dist/local-vault/index.js +68 -0
- package/dist/local-vault/index.js.map +1 -0
- package/dist/local-vault/keychain.d.ts +58 -0
- package/dist/local-vault/keychain.d.ts.map +1 -0
- package/dist/local-vault/keychain.js +200 -0
- package/dist/local-vault/keychain.js.map +1 -0
- package/dist/local-vault/mutex.d.ts +20 -0
- package/dist/local-vault/mutex.d.ts.map +1 -0
- package/dist/local-vault/mutex.js +44 -0
- package/dist/local-vault/mutex.js.map +1 -0
- package/dist/local-vault/passphrase.d.ts +30 -0
- package/dist/local-vault/passphrase.d.ts.map +1 -0
- package/dist/local-vault/passphrase.js +72 -0
- package/dist/local-vault/passphrase.js.map +1 -0
- package/dist/lsp/config.d.ts +34 -0
- package/dist/lsp/config.d.ts.map +1 -0
- package/dist/lsp/config.js +68 -0
- package/dist/lsp/config.js.map +1 -0
- package/dist/lsp/detect.d.ts +7 -0
- package/dist/lsp/detect.d.ts.map +1 -0
- package/dist/lsp/detect.js +78 -0
- package/dist/lsp/detect.js.map +1 -0
- package/dist/lsp/errors.d.ts +11 -0
- package/dist/lsp/errors.d.ts.map +1 -0
- package/dist/lsp/errors.js +11 -0
- package/dist/lsp/errors.js.map +1 -0
- package/dist/lsp/formatters.d.ts +147 -0
- package/dist/lsp/formatters.d.ts.map +1 -0
- package/dist/lsp/formatters.js +259 -0
- package/dist/lsp/formatters.js.map +1 -0
- package/dist/lsp/index.d.ts +31 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +31 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/instance.d.ts +72 -0
- package/dist/lsp/instance.d.ts.map +1 -0
- package/dist/lsp/instance.js +489 -0
- package/dist/lsp/instance.js.map +1 -0
- package/dist/lsp/lazy-load.d.ts +27 -0
- package/dist/lsp/lazy-load.d.ts.map +1 -0
- package/dist/lsp/lazy-load.js +57 -0
- package/dist/lsp/lazy-load.js.map +1 -0
- package/dist/lsp/manager.d.ts +59 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +242 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/ops.d.ts +13 -0
- package/dist/lsp/ops.d.ts.map +1 -0
- package/dist/lsp/ops.js +225 -0
- package/dist/lsp/ops.js.map +1 -0
- package/dist/lsp/rpc.d.ts +47 -0
- package/dist/lsp/rpc.d.ts.map +1 -0
- package/dist/lsp/rpc.js +134 -0
- package/dist/lsp/rpc.js.map +1 -0
- package/dist/lsp/safe-uri.d.ts +18 -0
- package/dist/lsp/safe-uri.d.ts.map +1 -0
- package/dist/lsp/safe-uri.js +96 -0
- package/dist/lsp/safe-uri.js.map +1 -0
- package/dist/lsp/types.d.ts +70 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +57 -0
- package/dist/mcp/bridge.d.ts.map +1 -0
- package/dist/mcp/bridge.js +98 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/category.d.ts +22 -0
- package/dist/mcp/category.d.ts.map +1 -0
- package/dist/mcp/category.js +11 -0
- package/dist/mcp/category.js.map +1 -0
- package/dist/mcp/client.d.ts +228 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +352 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/content.d.ts +86 -0
- package/dist/mcp/content.d.ts.map +1 -0
- package/dist/mcp/content.js +147 -0
- package/dist/mcp/content.js.map +1 -0
- package/dist/mcp/env.d.ts +19 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +50 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/host.d.ts +199 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +530 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/index.d.ts +18 -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/load-mcp-host.d.ts +32 -0
- package/dist/mcp/load-mcp-host.d.ts.map +1 -0
- package/dist/mcp/load-mcp-host.js +49 -0
- package/dist/mcp/load-mcp-host.js.map +1 -0
- package/dist/mcp/oauth/callback-server.d.ts +73 -0
- package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
- package/dist/mcp/oauth/callback-server.js +280 -0
- package/dist/mcp/oauth/callback-server.js.map +1 -0
- package/dist/mcp/oauth/config-hash.d.ts +24 -0
- package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
- package/dist/mcp/oauth/config-hash.js +55 -0
- package/dist/mcp/oauth/config-hash.js.map +1 -0
- package/dist/mcp/oauth/error-normalize.d.ts +39 -0
- package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
- package/dist/mcp/oauth/error-normalize.js +91 -0
- package/dist/mcp/oauth/error-normalize.js.map +1 -0
- package/dist/mcp/oauth/provider.d.ts +190 -0
- package/dist/mcp/oauth/provider.d.ts.map +1 -0
- package/dist/mcp/oauth/provider.js +305 -0
- package/dist/mcp/oauth/provider.js.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.js +77 -0
- package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.js +21 -0
- package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
- package/dist/mcp/parse.d.ts +28 -0
- package/dist/mcp/parse.d.ts.map +1 -0
- package/dist/mcp/parse.js +209 -0
- package/dist/mcp/parse.js.map +1 -0
- package/dist/mcp/prompts.d.ts +31 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +71 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/redact.d.ts +62 -0
- package/dist/mcp/redact.d.ts.map +1 -0
- package/dist/mcp/redact.js +87 -0
- package/dist/mcp/redact.js.map +1 -0
- package/dist/mcp/resources.d.ts +70 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +170 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/types.d.ts +123 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/frontmatter.d.ts +18 -0
- package/dist/memory/frontmatter.d.ts.map +1 -0
- package/dist/memory/frontmatter.js +81 -0
- package/dist/memory/frontmatter.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +44 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +237 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/tools.d.ts +11 -0
- package/dist/memory/tools.d.ts.map +1 -0
- package/dist/memory/tools.js +159 -0
- package/dist/memory/tools.js.map +1 -0
- package/dist/memory/types.d.ts +32 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugin-api/index.d.ts +167 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +151 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-logger/index.d.ts +21 -0
- package/dist/plugin-logger/index.d.ts.map +1 -0
- package/dist/plugin-logger/index.js +59 -0
- package/dist/plugin-logger/index.js.map +1 -0
- package/dist/session/index.d.ts +125 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +202 -0
- package/dist/session/index.js.map +1 -0
- package/dist/tools/approval.d.ts +33 -0
- package/dist/tools/approval.d.ts.map +1 -0
- package/dist/tools/approval.js +53 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +94 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -0
- package/dist/tools/builtins/_shared.js +246 -0
- package/dist/tools/builtins/_shared.js.map +1 -0
- package/dist/tools/builtins/ask-user-question.d.ts +27 -0
- package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
- package/dist/tools/builtins/ask-user-question.js +191 -0
- package/dist/tools/builtins/ask-user-question.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +3 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -0
- package/dist/tools/builtins/bash.js +158 -0
- package/dist/tools/builtins/bash.js.map +1 -0
- package/dist/tools/builtins/diff.d.ts +3 -0
- package/dist/tools/builtins/diff.d.ts.map +1 -0
- package/dist/tools/builtins/diff.js +83 -0
- package/dist/tools/builtins/diff.js.map +1 -0
- package/dist/tools/builtins/edit.d.ts +3 -0
- package/dist/tools/builtins/edit.d.ts.map +1 -0
- package/dist/tools/builtins/edit.js +40 -0
- package/dist/tools/builtins/edit.js.map +1 -0
- package/dist/tools/builtins/glob.d.ts +3 -0
- package/dist/tools/builtins/glob.d.ts.map +1 -0
- package/dist/tools/builtins/glob.js +37 -0
- package/dist/tools/builtins/glob.js.map +1 -0
- package/dist/tools/builtins/grep.d.ts +3 -0
- package/dist/tools/builtins/grep.d.ts.map +1 -0
- package/dist/tools/builtins/grep.js +81 -0
- package/dist/tools/builtins/grep.js.map +1 -0
- package/dist/tools/builtins/lsp.d.ts +3 -0
- package/dist/tools/builtins/lsp.d.ts.map +1 -0
- package/dist/tools/builtins/lsp.js +102 -0
- package/dist/tools/builtins/lsp.js.map +1 -0
- package/dist/tools/builtins/pty.d.ts +64 -0
- package/dist/tools/builtins/pty.d.ts.map +1 -0
- package/dist/tools/builtins/pty.js +536 -0
- package/dist/tools/builtins/pty.js.map +1 -0
- package/dist/tools/builtins/read.d.ts +3 -0
- package/dist/tools/builtins/read.d.ts.map +1 -0
- package/dist/tools/builtins/read.js +18 -0
- package/dist/tools/builtins/read.js.map +1 -0
- package/dist/tools/builtins/web-fetch.d.ts +4 -0
- package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtins/web-fetch.js +353 -0
- package/dist/tools/builtins/web-fetch.js.map +1 -0
- package/dist/tools/builtins/write.d.ts +3 -0
- package/dist/tools/builtins/write.d.ts.map +1 -0
- package/dist/tools/builtins/write.js +48 -0
- package/dist/tools/builtins/write.js.map +1 -0
- package/dist/tools/builtins.d.ts +9 -0
- package/dist/tools/builtins.d.ts.map +1 -0
- package/dist/tools/builtins.js +29 -0
- package/dist/tools/builtins.js.map +1 -0
- package/dist/tools/diff.d.ts +18 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +57 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +120 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +208 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +19 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +244 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +15 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { formatMemoryFile, parseMemoryFile } from "./frontmatter.js";
|
|
4
|
+
import { MEMORY_SCOPES, MEMORY_TYPES, } from "./types.js";
|
|
5
|
+
const MEMORY_DIR = "memory";
|
|
6
|
+
const INDEX_FILE = "MEMORY.md";
|
|
7
|
+
/** Per-scope cap on the system-prompt injection. Keeps a runaway memory dir
|
|
8
|
+
* from blowing the context window; truncation is announced in the output. */
|
|
9
|
+
const SCOPE_BUDGET_BYTES = 25_000;
|
|
10
|
+
const SLUG_MAX_LENGTH = 64;
|
|
11
|
+
/**
|
|
12
|
+
* Concurrency note (v1): mutations are sync-per-process but not locked across
|
|
13
|
+
* parallel CLI processes. Two simultaneous saves can interleave such that the
|
|
14
|
+
* last MEMORY.md index rewrite reflects a stale `list()`. At v1 scale (single
|
|
15
|
+
* interactive CLI, occasional `-p` invocation) the worst case is a stale
|
|
16
|
+
* index until the next mutation — not data loss, since each entry file write
|
|
17
|
+
* is atomic and slugs collision-suffix. A per-scope lock file is queued for
|
|
18
|
+
* v2 alongside the relevance ranker (when memory becomes hot-path enough to
|
|
19
|
+
* race on).
|
|
20
|
+
*/
|
|
21
|
+
export class MemoryStore {
|
|
22
|
+
dirs;
|
|
23
|
+
constructor(opts) {
|
|
24
|
+
this.dirs = {
|
|
25
|
+
global: join(opts.homeDir, ".chances", MEMORY_DIR),
|
|
26
|
+
project: join(opts.workspaceRoot, ".chances", MEMORY_DIR),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Resolved on-disk directory for the given scope. Public so tools can show paths. */
|
|
30
|
+
dirFor(scope) {
|
|
31
|
+
return this.dirs[scope];
|
|
32
|
+
}
|
|
33
|
+
list(scope) {
|
|
34
|
+
const scopes = scope ? [scope] : [...MEMORY_SCOPES];
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const s of scopes) {
|
|
37
|
+
const dir = this.dirs[s];
|
|
38
|
+
if (!existsSync(dir))
|
|
39
|
+
continue;
|
|
40
|
+
for (const file of readdirSync(dir)) {
|
|
41
|
+
if (!file.endsWith(".md") || file === INDEX_FILE)
|
|
42
|
+
continue;
|
|
43
|
+
const path = join(dir, file);
|
|
44
|
+
const raw = safeRead(path);
|
|
45
|
+
if (raw === null)
|
|
46
|
+
continue;
|
|
47
|
+
const parsed = parseMemoryFile(raw);
|
|
48
|
+
if (!parsed)
|
|
49
|
+
continue;
|
|
50
|
+
out.push({
|
|
51
|
+
slug: file.replace(/\.md$/, ""),
|
|
52
|
+
type: parsed.frontmatter.type,
|
|
53
|
+
name: parsed.frontmatter.name,
|
|
54
|
+
description: parsed.frontmatter.description,
|
|
55
|
+
body: parsed.body,
|
|
56
|
+
scope: s,
|
|
57
|
+
path,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out.sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope) || a.slug.localeCompare(b.slug));
|
|
62
|
+
}
|
|
63
|
+
save(input, scope) {
|
|
64
|
+
if (!input.name.trim())
|
|
65
|
+
throw new Error("memory name is required");
|
|
66
|
+
if (!input.body.trim())
|
|
67
|
+
throw new Error("memory body is required");
|
|
68
|
+
const dir = this.dirs[scope];
|
|
69
|
+
mkdirSync(dir, { recursive: true });
|
|
70
|
+
const base = slugify(`${input.type}_${input.name}`);
|
|
71
|
+
const slug = this.uniqueSlugFor(base, input, scope, dir);
|
|
72
|
+
const path = pathFor(dir, slug);
|
|
73
|
+
const fm = { name: input.name.trim(), description: (input.description ?? "").trim(), type: input.type };
|
|
74
|
+
writeFileSync(path, formatMemoryFile(fm, input.body));
|
|
75
|
+
this.rewriteIndex(scope);
|
|
76
|
+
return { slug, type: input.type, name: fm.name, description: fm.description, body: input.body, scope, path };
|
|
77
|
+
}
|
|
78
|
+
/** Returns true if the slug existed and was removed. */
|
|
79
|
+
delete(slug, scope) {
|
|
80
|
+
if (!isValidSlug(slug))
|
|
81
|
+
return false;
|
|
82
|
+
const dir = this.dirs[scope];
|
|
83
|
+
const path = pathFor(dir, slug);
|
|
84
|
+
if (!existsSync(path))
|
|
85
|
+
return false;
|
|
86
|
+
rmSync(path);
|
|
87
|
+
this.rewriteIndex(scope);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolves a slug collision by walking `base`, `base-2`, `base-3`, ... until
|
|
92
|
+
* we find a slot that's either (a) empty or (b) holds an entry with the same
|
|
93
|
+
* name+type (in which case overwrite is the intended behavior — same memory
|
|
94
|
+
* being updated). This prevents two distinct memories whose names normalize
|
|
95
|
+
* to the same slug from silently clobbering each other.
|
|
96
|
+
*/
|
|
97
|
+
uniqueSlugFor(base, input, scope, dir) {
|
|
98
|
+
for (let i = 0; i < 100; i++) {
|
|
99
|
+
const candidate = i === 0 ? base : `${base}-${i + 1}`;
|
|
100
|
+
const path = join(dir, `${candidate}.md`);
|
|
101
|
+
if (!existsSync(path))
|
|
102
|
+
return candidate;
|
|
103
|
+
const raw = safeRead(path);
|
|
104
|
+
const parsed = raw ? parseMemoryFile(raw) : null;
|
|
105
|
+
if (parsed &&
|
|
106
|
+
parsed.frontmatter.type === input.type &&
|
|
107
|
+
parsed.frontmatter.name.trim() === input.name.trim()) {
|
|
108
|
+
// Same logical memory — caller is updating an existing entry.
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`memory: too many collisions on slug "${base}" in ${scope}`);
|
|
113
|
+
}
|
|
114
|
+
/** System-prompt injection block. Empty string when nothing is saved. */
|
|
115
|
+
asSystemContext() {
|
|
116
|
+
const sections = [];
|
|
117
|
+
for (const scope of MEMORY_SCOPES) {
|
|
118
|
+
const entries = this.list(scope);
|
|
119
|
+
if (entries.length === 0)
|
|
120
|
+
continue;
|
|
121
|
+
sections.push(renderScope(scope, entries));
|
|
122
|
+
}
|
|
123
|
+
return sections.join("\n\n");
|
|
124
|
+
}
|
|
125
|
+
rewriteIndex(scope) {
|
|
126
|
+
const dir = this.dirs[scope];
|
|
127
|
+
const entries = this.list(scope);
|
|
128
|
+
const path = join(dir, INDEX_FILE);
|
|
129
|
+
if (entries.length === 0) {
|
|
130
|
+
if (existsSync(path))
|
|
131
|
+
rmSync(path);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const grouped = groupByType(entries);
|
|
135
|
+
// MEMORY.md is generated, not authored — every save/delete rewrites it from
|
|
136
|
+
// the parsed entry files. Hand-edits here are discarded on the next tool
|
|
137
|
+
// call. We make that explicit so users don't lose work editing this file.
|
|
138
|
+
const lines = [
|
|
139
|
+
"<!-- This file is generated by chances. Hand-edit individual entry files;",
|
|
140
|
+
" edits to MEMORY.md itself are overwritten on the next save/delete. -->",
|
|
141
|
+
"",
|
|
142
|
+
`# ${capitalize(scope)} memory index`,
|
|
143
|
+
"",
|
|
144
|
+
];
|
|
145
|
+
for (const type of MEMORY_TYPES) {
|
|
146
|
+
const ofType = grouped[type];
|
|
147
|
+
if (!ofType || ofType.length === 0)
|
|
148
|
+
continue;
|
|
149
|
+
lines.push(`## ${type}`);
|
|
150
|
+
for (const e of ofType) {
|
|
151
|
+
const desc = e.description ? ` — ${oneLine(e.description)}` : "";
|
|
152
|
+
lines.push(`- [${e.name}](${e.slug}.md)${desc}`);
|
|
153
|
+
}
|
|
154
|
+
lines.push("");
|
|
155
|
+
}
|
|
156
|
+
writeFileSync(path, lines.join("\n").replace(/\n+$/g, "") + "\n");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Allowlist: `slugify` only produces `[a-z0-9_]` plus an optional `-N`
|
|
160
|
+
// collision suffix from `uniqueSlugFor`. Any input from a tool call gets
|
|
161
|
+
// matched against this — anything else is rejected before path construction so
|
|
162
|
+
// `../etc/passwd` style traversal cannot escape the memory dir.
|
|
163
|
+
const SLUG_PATTERN = /^[a-z0-9_]{1,64}(?:-\d+)?$/;
|
|
164
|
+
function isValidSlug(s) {
|
|
165
|
+
return typeof s === "string" && SLUG_PATTERN.test(s);
|
|
166
|
+
}
|
|
167
|
+
function pathFor(dir, slug) {
|
|
168
|
+
if (!isValidSlug(slug)) {
|
|
169
|
+
throw new Error(`memory: invalid slug "${slug}"`);
|
|
170
|
+
}
|
|
171
|
+
return join(dir, `${slug}.md`);
|
|
172
|
+
}
|
|
173
|
+
function renderScope(scope, entries) {
|
|
174
|
+
const grouped = groupByType(entries);
|
|
175
|
+
const header = `### ${capitalize(scope)} memory`;
|
|
176
|
+
const indexLines = [];
|
|
177
|
+
for (const type of MEMORY_TYPES) {
|
|
178
|
+
const ofType = grouped[type];
|
|
179
|
+
if (!ofType || ofType.length === 0)
|
|
180
|
+
continue;
|
|
181
|
+
indexLines.push(`- **${type}**:`);
|
|
182
|
+
for (const e of ofType) {
|
|
183
|
+
const desc = e.description ? ` — ${oneLine(e.description)}` : "";
|
|
184
|
+
indexLines.push(` - ${e.name} (\`${e.slug}\`)${desc}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const bodies = [];
|
|
188
|
+
let bytes = 0;
|
|
189
|
+
let truncated = 0;
|
|
190
|
+
for (const e of entries) {
|
|
191
|
+
const block = `#### ${e.name} (${e.scope}/${e.slug})\n${e.body.trim()}\n`;
|
|
192
|
+
if (bytes + block.length > SCOPE_BUDGET_BYTES) {
|
|
193
|
+
truncated++;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
bodies.push(block);
|
|
197
|
+
bytes += block.length;
|
|
198
|
+
}
|
|
199
|
+
const trailer = truncated > 0
|
|
200
|
+
? `\n_(${truncated} entr${truncated === 1 ? "y" : "ies"} omitted — exceeded ${SCOPE_BUDGET_BYTES} byte budget. Use memory_list / read tools to inspect.)_`
|
|
201
|
+
: "";
|
|
202
|
+
return [header, "", indexLines.join("\n"), "", bodies.join("\n"), trailer].join("\n").trimEnd();
|
|
203
|
+
}
|
|
204
|
+
function groupByType(entries) {
|
|
205
|
+
const g = {};
|
|
206
|
+
for (const e of entries) {
|
|
207
|
+
(g[e.type] ??= []).push(e);
|
|
208
|
+
}
|
|
209
|
+
return g;
|
|
210
|
+
}
|
|
211
|
+
function scopeRank(scope) {
|
|
212
|
+
return scope === "global" ? 0 : 1;
|
|
213
|
+
}
|
|
214
|
+
export function slugify(s) {
|
|
215
|
+
const slug = s
|
|
216
|
+
.toLowerCase()
|
|
217
|
+
.normalize("NFKD")
|
|
218
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
219
|
+
.replace(/^_+|_+$/g, "")
|
|
220
|
+
.slice(0, SLUG_MAX_LENGTH);
|
|
221
|
+
return slug || "memory";
|
|
222
|
+
}
|
|
223
|
+
function oneLine(s) {
|
|
224
|
+
return s.replace(/\s+/g, " ").trim();
|
|
225
|
+
}
|
|
226
|
+
function capitalize(s) {
|
|
227
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
228
|
+
}
|
|
229
|
+
function safeRead(path) {
|
|
230
|
+
try {
|
|
231
|
+
return readFileSync(path, "utf8");
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,aAAa,EACb,YAAY,GAIb,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,UAAU,GAAG,WAAW,CAAC;AAC/B;8EAC8E;AAC9E,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,eAAe,GAAG,EAAE,CAAC;AAc3B;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACL,IAAI,CAA8B;IAEnD,YAAY,IAAwB;QAClC,IAAI,CAAC,IAAI,GAAG;YACV,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;YAClD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;SAC1D,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,MAAM,CAAC,KAAkB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,KAAmB;QACtB,MAAM,MAAM,GAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QACnE,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC/B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,UAAU;oBAAE,SAAS;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,GAAG,KAAK,IAAI;oBAAE,SAAS;gBAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC/B,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;oBAC7B,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;oBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW;oBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,CAAC;oBACR,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,IAAI,CAAC,KAAgB,EAAE,KAAkB;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACxG,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/G,CAAC;IAED,wDAAwD;IACxD,MAAM,CAAC,IAAY,EAAE,KAAkB;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,IAAY,EAAE,KAAgB,EAAE,KAAkB,EAAE,GAAW;QACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjD,IACE,MAAM;gBACN,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBACtC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EACpD,CAAC;gBACD,8DAA8D;gBAC9D,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,yEAAyE;IACzE,eAAe;QACb,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAEO,YAAY,CAAC,KAAkB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,4EAA4E;QAC5E,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,KAAK,GAAa;YACtB,2EAA2E;YAC3E,6EAA6E;YAC7E,EAAE;YACF,KAAK,UAAU,CAAC,KAAK,CAAC,eAAe;YACrC,EAAE;SACH,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;CACF;AAED,uEAAuE;AACvE,yEAAyE;AACzE,+EAA+E;AAC/E,gEAAgE;AAChE,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB,EAAE,OAAsB;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;IACjD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC7C,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAC1E,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YAC9C,SAAS,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC;QAC3B,CAAC,CAAC,OAAO,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,uBAAuB,kBAAkB,0DAA0D;QAC1J,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,MAAM,CAAC,GAA+C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB;IACnC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,MAAM,IAAI,GAAG,CAAC;SACX,WAAW,EAAE;SACb,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC7B,OAAO,IAAI,IAAI,QAAQ,CAAC;AAC1B,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Tool } from "../tools/index.js";
|
|
2
|
+
import type { MemoryStore } from "./store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builtin tools the model uses to persist memory. The three-tool surface
|
|
5
|
+
* (save / delete / list) intentionally matches the smallest set claude-code
|
|
6
|
+
* exposes for memory: just the read/write/index basics, with the model
|
|
7
|
+
* responsible for *what* to save. v2 will layer auto-extraction on top, but
|
|
8
|
+
* v1 keeps the contract simple — every write is an explicit, auditable call.
|
|
9
|
+
*/
|
|
10
|
+
export declare function memoryTools(store: MemoryStore): Tool[];
|
|
11
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/memory/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAAE,CAEtD"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { AppError, ErrorCode } from "@chances-ai/runtime";
|
|
2
|
+
import { MEMORY_SCOPES, MEMORY_TYPES, isMemoryScope, isMemoryType } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builtin tools the model uses to persist memory. The three-tool surface
|
|
5
|
+
* (save / delete / list) intentionally matches the smallest set claude-code
|
|
6
|
+
* exposes for memory: just the read/write/index basics, with the model
|
|
7
|
+
* responsible for *what* to save. v2 will layer auto-extraction on top, but
|
|
8
|
+
* v1 keeps the contract simple — every write is an explicit, auditable call.
|
|
9
|
+
*/
|
|
10
|
+
export function memoryTools(store) {
|
|
11
|
+
return [saveTool(store), deleteTool(store), listTool(store)];
|
|
12
|
+
}
|
|
13
|
+
function obj(args) {
|
|
14
|
+
if (!args || typeof args !== "object" || Array.isArray(args)) {
|
|
15
|
+
throw new AppError(ErrorCode.Tool, "memory tool args must be an object");
|
|
16
|
+
}
|
|
17
|
+
return args;
|
|
18
|
+
}
|
|
19
|
+
function reqStr(args, key) {
|
|
20
|
+
const v = obj(args)[key];
|
|
21
|
+
if (typeof v !== "string" || !v.trim()) {
|
|
22
|
+
throw new AppError(ErrorCode.Tool, `memory tool: required string arg "${key}"`);
|
|
23
|
+
}
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
function optStr(args, key) {
|
|
27
|
+
const v = obj(args)[key];
|
|
28
|
+
if (v === undefined || v === null)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (typeof v !== "string") {
|
|
31
|
+
throw new AppError(ErrorCode.Tool, `memory tool: expected string arg "${key}"`);
|
|
32
|
+
}
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
function requireScope(args) {
|
|
36
|
+
const raw = reqStr(args, "scope");
|
|
37
|
+
if (!isMemoryScope(raw)) {
|
|
38
|
+
throw new AppError(ErrorCode.Tool, `memory tool: scope must be one of ${MEMORY_SCOPES.join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
return raw;
|
|
41
|
+
}
|
|
42
|
+
function requireType(args) {
|
|
43
|
+
const raw = reqStr(args, "type");
|
|
44
|
+
if (!isMemoryType(raw)) {
|
|
45
|
+
throw new AppError(ErrorCode.Tool, `memory tool: type must be one of ${MEMORY_TYPES.join(", ")}`);
|
|
46
|
+
}
|
|
47
|
+
return raw;
|
|
48
|
+
}
|
|
49
|
+
function saveTool(store) {
|
|
50
|
+
return {
|
|
51
|
+
name: "memory_save",
|
|
52
|
+
description: "Save (or overwrite) a memory entry. Use sparingly — only for facts that will still be relevant in *future* conversations. Skip task-specific or code-derivable details.",
|
|
53
|
+
category: "memory-write",
|
|
54
|
+
parameters: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
scope: { type: "string", enum: [...MEMORY_SCOPES], description: "'global' = applies across projects; 'project' = scoped to this repo." },
|
|
58
|
+
type: { type: "string", enum: [...MEMORY_TYPES], description: "'user' (who they are), 'feedback' (corrections/preferences), 'project' (work context), 'reference' (pointers to external systems)." },
|
|
59
|
+
name: { type: "string", description: "Short human label, e.g. 'user role' or 'auth deadline'. Used to derive the filename." },
|
|
60
|
+
description: { type: "string", description: "One-line hook describing when this memory is useful — shown in the index, kept under ~150 chars." },
|
|
61
|
+
body: { type: "string", description: "Markdown body. Lead with the fact itself; for feedback/project, include **Why:** and **How to apply:** lines so future-you can judge edge cases." },
|
|
62
|
+
},
|
|
63
|
+
required: ["scope", "type", "name", "body"],
|
|
64
|
+
},
|
|
65
|
+
summarize: (args) => {
|
|
66
|
+
const o = obj(args);
|
|
67
|
+
const name = typeof o["name"] === "string" ? o["name"] : "?";
|
|
68
|
+
const scope = typeof o["scope"] === "string" ? o["scope"] : "?";
|
|
69
|
+
const type = typeof o["type"] === "string" ? o["type"] : "?";
|
|
70
|
+
return `memory_save ${scope}/${type}: ${name}`;
|
|
71
|
+
},
|
|
72
|
+
async execute(args) {
|
|
73
|
+
try {
|
|
74
|
+
const scope = requireScope(args);
|
|
75
|
+
const type = requireType(args);
|
|
76
|
+
const name = reqStr(args, "name");
|
|
77
|
+
const body = reqStr(args, "body");
|
|
78
|
+
const description = optStr(args, "description");
|
|
79
|
+
const entry = store.save({ type, name, body, description }, scope);
|
|
80
|
+
return { ok: true, output: `Saved ${scope}/${entry.slug}.md (${entry.type})` };
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return { ok: false, output: e.message };
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function deleteTool(store) {
|
|
89
|
+
return {
|
|
90
|
+
name: "memory_delete",
|
|
91
|
+
description: "Delete a memory entry by slug. Use when a saved memory turns out to be wrong or outdated.",
|
|
92
|
+
category: "memory-write",
|
|
93
|
+
parameters: {
|
|
94
|
+
type: "object",
|
|
95
|
+
properties: {
|
|
96
|
+
scope: { type: "string", enum: [...MEMORY_SCOPES] },
|
|
97
|
+
slug: { type: "string", description: "Filename stem (without .md), e.g. 'user_role'. Get it from memory_list." },
|
|
98
|
+
},
|
|
99
|
+
required: ["scope", "slug"],
|
|
100
|
+
},
|
|
101
|
+
summarize: (args) => {
|
|
102
|
+
const o = obj(args);
|
|
103
|
+
const slug = typeof o["slug"] === "string" ? o["slug"] : "?";
|
|
104
|
+
const scope = typeof o["scope"] === "string" ? o["scope"] : "?";
|
|
105
|
+
return `memory_delete ${scope}/${slug}`;
|
|
106
|
+
},
|
|
107
|
+
async execute(args) {
|
|
108
|
+
try {
|
|
109
|
+
const scope = requireScope(args);
|
|
110
|
+
const slug = reqStr(args, "slug");
|
|
111
|
+
const removed = store.delete(slug, scope);
|
|
112
|
+
return removed
|
|
113
|
+
? { ok: true, output: `Deleted ${scope}/${slug}.md` }
|
|
114
|
+
: { ok: false, output: `No such memory: ${scope}/${slug}` };
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
return { ok: false, output: e.message };
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function listTool(store) {
|
|
123
|
+
return {
|
|
124
|
+
name: "memory_list",
|
|
125
|
+
description: "List saved memory entries. Pass scope to filter to one of 'global' or 'project'.",
|
|
126
|
+
category: "memory-read",
|
|
127
|
+
parameters: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
scope: { type: "string", enum: [...MEMORY_SCOPES], description: "Optional. Omit to list both scopes." },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
summarize: (args) => {
|
|
134
|
+
const o = obj(args);
|
|
135
|
+
const scope = typeof o["scope"] === "string" ? o["scope"] : "all";
|
|
136
|
+
return `memory_list ${scope}`;
|
|
137
|
+
},
|
|
138
|
+
async execute(args) {
|
|
139
|
+
try {
|
|
140
|
+
const scopeArg = optStr(args, "scope");
|
|
141
|
+
if (scopeArg !== undefined && !isMemoryScope(scopeArg)) {
|
|
142
|
+
throw new AppError(ErrorCode.Tool, `memory tool: scope must be one of ${MEMORY_SCOPES.join(", ")}`);
|
|
143
|
+
}
|
|
144
|
+
const entries = store.list(scopeArg);
|
|
145
|
+
if (entries.length === 0)
|
|
146
|
+
return { ok: true, output: "(no memory entries)" };
|
|
147
|
+
const lines = entries.map((e) => {
|
|
148
|
+
const desc = e.description ? ` — ${e.description}` : "";
|
|
149
|
+
return `${e.scope}/${e.slug}.md [${e.type}] ${e.name}${desc}`;
|
|
150
|
+
});
|
|
151
|
+
return { ok: true, output: lines.join("\n") };
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
return { ok: false, output: e.message };
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/memory/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory v1 — file-based, frontmatter-typed, hand-curatable by the user *and*
|
|
3
|
+
* tool-writable by the model. Two scopes:
|
|
4
|
+
* - global : ~/.chances/memory/ (cross-project, e.g. "I'm a Go dev")
|
|
5
|
+
* - project: <workspace>/.chances/memory/ (this-repo, e.g. "uses Turbo+Cargo")
|
|
6
|
+
*
|
|
7
|
+
* Schema deliberately mirrors claude-code's `src/memdir/memoryTypes.ts` so that
|
|
8
|
+
* users moving between agents have one mental model. The per-turn LLM relevance
|
|
9
|
+
* ranker and the background extraction agent are NOT in v1 — those are bigger
|
|
10
|
+
* pieces of work and earn their own version.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MEMORY_TYPES: readonly ["user", "feedback", "project", "reference"];
|
|
13
|
+
export type MemoryType = (typeof MEMORY_TYPES)[number];
|
|
14
|
+
export declare const MEMORY_SCOPES: readonly ["global", "project"];
|
|
15
|
+
export type MemoryScope = (typeof MEMORY_SCOPES)[number];
|
|
16
|
+
export interface MemoryEntry {
|
|
17
|
+
/** Filename stem, e.g. `user_role` for `user_role.md`. Derived from name. */
|
|
18
|
+
slug: string;
|
|
19
|
+
type: MemoryType;
|
|
20
|
+
/** Human label shown in the index. */
|
|
21
|
+
name: string;
|
|
22
|
+
/** One-line hook used to decide relevance in future conversations. */
|
|
23
|
+
description: string;
|
|
24
|
+
/** Markdown body. */
|
|
25
|
+
body: string;
|
|
26
|
+
scope: MemoryScope;
|
|
27
|
+
/** Absolute path on disk. */
|
|
28
|
+
path: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function isMemoryType(s: unknown): s is MemoryType;
|
|
31
|
+
export declare function isMemoryScope(s: unknown): s is MemoryScope;
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,YAAY,uDAAwD,CAAC;AAClF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,aAAa,gCAAiC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAExD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory v1 — file-based, frontmatter-typed, hand-curatable by the user *and*
|
|
3
|
+
* tool-writable by the model. Two scopes:
|
|
4
|
+
* - global : ~/.chances/memory/ (cross-project, e.g. "I'm a Go dev")
|
|
5
|
+
* - project: <workspace>/.chances/memory/ (this-repo, e.g. "uses Turbo+Cargo")
|
|
6
|
+
*
|
|
7
|
+
* Schema deliberately mirrors claude-code's `src/memdir/memoryTypes.ts` so that
|
|
8
|
+
* users moving between agents have one mental model. The per-turn LLM relevance
|
|
9
|
+
* ranker and the background extraction agent are NOT in v1 — those are bigger
|
|
10
|
+
* pieces of work and earn their own version.
|
|
11
|
+
*/
|
|
12
|
+
export const MEMORY_TYPES = ["user", "feedback", "project", "reference"];
|
|
13
|
+
export const MEMORY_SCOPES = ["global", "project"];
|
|
14
|
+
export function isMemoryType(s) {
|
|
15
|
+
return typeof s === "string" && MEMORY_TYPES.includes(s);
|
|
16
|
+
}
|
|
17
|
+
export function isMemoryScope(s) {
|
|
18
|
+
return typeof s === "string" && MEMORY_SCOPES.includes(s);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAU,CAAC;AAGlF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;AAkB5D,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,YAAkC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,aAAmC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC"}
|