@agentmemory/agentmemory 0.9.30 → 0.9.31
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/.env.example +39 -33
- package/AGENTS.md +8 -8
- package/README.md +173 -558
- package/dist/.env.example +39 -33
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +1741 -966
- package/dist/cli.mjs.map +1 -1
- package/dist/compression-recovery-CnhLQC6N.mjs +5912 -0
- package/dist/compression-recovery-CnhLQC6N.mjs.map +1 -0
- package/dist/{connect-B4_ca6BD.mjs → connect-BSLIAMpw.mjs} +874 -267
- package/dist/connect-BSLIAMpw.mjs.map +1 -0
- package/dist/hooks/_capture.d.mts +5 -2
- package/dist/hooks/_capture.d.mts.map +1 -1
- package/dist/hooks/_capture.mjs +55 -19
- package/dist/hooks/_capture.mjs.map +1 -1
- package/dist/hooks/notification.mjs +20 -6
- package/dist/hooks/notification.mjs.map +1 -1
- package/dist/hooks/post-commit.mjs +25 -5
- package/dist/hooks/post-commit.mjs.map +1 -1
- package/dist/hooks/post-tool-failure.mjs +12 -4
- package/dist/hooks/post-tool-failure.mjs.map +1 -1
- package/dist/hooks/post-tool-use.mjs +12 -4
- package/dist/hooks/post-tool-use.mjs.map +1 -1
- package/dist/hooks/pre-compact.mjs +37 -10
- package/dist/hooks/pre-compact.mjs.map +1 -1
- package/dist/hooks/pre-tool-use.mjs +25 -5
- package/dist/hooks/pre-tool-use.mjs.map +1 -1
- package/dist/hooks/prompt-submit.mjs +12 -4
- package/dist/hooks/prompt-submit.mjs.map +1 -1
- package/dist/hooks/session-end.mjs +47 -16
- package/dist/hooks/session-end.mjs.map +1 -1
- package/dist/hooks/session-start.mjs +37 -10
- package/dist/hooks/session-start.mjs.map +1 -1
- package/dist/hooks/stop.mjs +74 -72
- package/dist/hooks/stop.mjs.map +1 -1
- package/dist/hooks/subagent-start.mjs +13 -5
- package/dist/hooks/subagent-start.mjs.map +1 -1
- package/dist/hooks/subagent-stop.mjs +18 -6
- package/dist/hooks/subagent-stop.mjs.map +1 -1
- package/dist/hooks/task-completed.mjs +13 -5
- package/dist/hooks/task-completed.mjs.map +1 -1
- package/dist/{image-refs-T_urbwHM.mjs → image-refs-Cyta4Lf9.mjs} +2 -2
- package/dist/{image-refs-T_urbwHM.mjs.map → image-refs-Cyta4Lf9.mjs.map} +1 -1
- package/dist/index.mjs +8539 -4203
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/dsh.d.mts +55 -0
- package/dist/integrations/dsh.d.mts.map +1 -0
- package/dist/integrations/dsh.mjs +1145 -0
- package/dist/integrations/dsh.mjs.map +1 -0
- package/dist/{keyed-mutex-DchXsyfP.mjs → keyed-mutex-DCUh7PG-.mjs} +58 -9
- package/dist/keyed-mutex-DCUh7PG-.mjs.map +1 -0
- package/dist/{secret-store-BnY3A50C.mjs → secret-store-D9GwO0xp.mjs} +535 -434
- package/dist/secret-store-D9GwO0xp.mjs.map +1 -0
- package/dist/session-arguments-zxsbbd8y.mjs +113 -0
- package/dist/session-arguments-zxsbbd8y.mjs.map +1 -0
- package/dist/{src-Jsq9LCeH.mjs → src-DaMtDzt_.mjs} +4087 -3788
- package/dist/src-DaMtDzt_.mjs.map +1 -0
- package/dist/{standalone-DKCdrf1d.mjs → standalone-BlqshyZ5.mjs} +213 -56
- package/dist/standalone-BlqshyZ5.mjs.map +1 -0
- package/dist/standalone.d.mts +1 -1
- package/dist/standalone.d.mts.map +1 -1
- package/dist/standalone.mjs +626 -73
- package/dist/standalone.mjs.map +1 -1
- package/dist/viewer/index.html +288 -140
- package/integrations/hermes/README.md +84 -0
- package/integrations/hermes/__init__.py +669 -0
- package/integrations/hermes/plugin.yaml +27 -0
- package/integrations/omp/LICENSE +190 -0
- package/integrations/omp/README.md +76 -0
- package/integrations/omp/capture.ts +1 -0
- package/integrations/omp/dist/index.mjs +1450 -0
- package/integrations/omp/index.ts +488 -0
- package/integrations/omp/package.json +13 -0
- package/integrations/omp/security.ts +67 -0
- package/integrations/omp/skills/agentmemory-agents/REFERENCE.md +32 -0
- package/integrations/omp/skills/agentmemory-agents/SKILL.md +48 -0
- package/integrations/omp/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/agentmemory-architecture/SKILL.md +33 -0
- package/integrations/omp/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/agentmemory-config/REFERENCE.md +90 -0
- package/integrations/omp/skills/agentmemory-config/SKILL.md +78 -0
- package/integrations/omp/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/agentmemory-hooks/REFERENCE.md +20 -0
- package/integrations/omp/skills/agentmemory-hooks/SKILL.md +49 -0
- package/integrations/omp/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
- package/integrations/omp/skills/agentmemory-mcp-tools/SKILL.md +42 -0
- package/integrations/omp/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/agentmemory-rest-api/REFERENCE.md +158 -0
- package/integrations/omp/skills/agentmemory-rest-api/SKILL.md +49 -0
- package/integrations/omp/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/commit-context/EXAMPLES.md +71 -0
- package/integrations/omp/skills/commit-context/SKILL.md +64 -0
- package/integrations/omp/skills/commit-context/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/commit-history/EXAMPLES.md +71 -0
- package/integrations/omp/skills/commit-history/SKILL.md +62 -0
- package/integrations/omp/skills/commit-history/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/forget/EXAMPLES.md +40 -0
- package/integrations/omp/skills/forget/SKILL.md +73 -0
- package/integrations/omp/skills/forget/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/handoff/EXAMPLES.md +57 -0
- package/integrations/omp/skills/handoff/SKILL.md +75 -0
- package/integrations/omp/skills/handoff/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/lesson/SKILL.md +64 -0
- package/integrations/omp/skills/lesson/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/memory-discipline/SKILL.md +65 -0
- package/integrations/omp/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/recall/EXAMPLES.md +74 -0
- package/integrations/omp/skills/recall/SKILL.md +74 -0
- package/integrations/omp/skills/recall/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/recap/EXAMPLES.md +62 -0
- package/integrations/omp/skills/recap/SKILL.md +68 -0
- package/integrations/omp/skills/recap/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/remember/EXAMPLES.md +67 -0
- package/integrations/omp/skills/remember/SKILL.md +66 -0
- package/integrations/omp/skills/remember/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/session-history/EXAMPLES.md +59 -0
- package/integrations/omp/skills/session-history/SKILL.md +67 -0
- package/integrations/omp/skills/session-history/TROUBLESHOOTING.md +70 -0
- package/integrations/omp/skills/write-agentmemory-skill/SKILL.md +41 -0
- package/integrations/omp/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/LICENSE +190 -0
- package/integrations/openclaw/README.md +88 -0
- package/integrations/openclaw/openclaw.plugin.json +71 -0
- package/integrations/openclaw/package.json +38 -0
- package/integrations/openclaw/plugin.mjs +425 -0
- package/integrations/openclaw/plugin.yaml +26 -0
- package/integrations/openclaw/skills/agentmemory-agents/REFERENCE.md +32 -0
- package/integrations/openclaw/skills/agentmemory-agents/SKILL.md +48 -0
- package/integrations/openclaw/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/agentmemory-architecture/SKILL.md +33 -0
- package/integrations/openclaw/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/agentmemory-config/REFERENCE.md +90 -0
- package/integrations/openclaw/skills/agentmemory-config/SKILL.md +78 -0
- package/integrations/openclaw/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/agentmemory-hooks/REFERENCE.md +20 -0
- package/integrations/openclaw/skills/agentmemory-hooks/SKILL.md +49 -0
- package/integrations/openclaw/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
- package/integrations/openclaw/skills/agentmemory-mcp-tools/SKILL.md +42 -0
- package/integrations/openclaw/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/agentmemory-rest-api/REFERENCE.md +158 -0
- package/integrations/openclaw/skills/agentmemory-rest-api/SKILL.md +49 -0
- package/integrations/openclaw/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/commit-context/EXAMPLES.md +71 -0
- package/integrations/openclaw/skills/commit-context/SKILL.md +64 -0
- package/integrations/openclaw/skills/commit-context/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/commit-history/EXAMPLES.md +71 -0
- package/integrations/openclaw/skills/commit-history/SKILL.md +62 -0
- package/integrations/openclaw/skills/commit-history/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/forget/EXAMPLES.md +40 -0
- package/integrations/openclaw/skills/forget/SKILL.md +73 -0
- package/integrations/openclaw/skills/forget/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/handoff/EXAMPLES.md +57 -0
- package/integrations/openclaw/skills/handoff/SKILL.md +75 -0
- package/integrations/openclaw/skills/handoff/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/lesson/SKILL.md +64 -0
- package/integrations/openclaw/skills/lesson/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/memory-discipline/SKILL.md +65 -0
- package/integrations/openclaw/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/recall/EXAMPLES.md +74 -0
- package/integrations/openclaw/skills/recall/SKILL.md +74 -0
- package/integrations/openclaw/skills/recall/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/recap/EXAMPLES.md +62 -0
- package/integrations/openclaw/skills/recap/SKILL.md +68 -0
- package/integrations/openclaw/skills/recap/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/remember/EXAMPLES.md +67 -0
- package/integrations/openclaw/skills/remember/SKILL.md +66 -0
- package/integrations/openclaw/skills/remember/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/session-history/EXAMPLES.md +59 -0
- package/integrations/openclaw/skills/session-history/SKILL.md +67 -0
- package/integrations/openclaw/skills/session-history/TROUBLESHOOTING.md +70 -0
- package/integrations/openclaw/skills/write-agentmemory-skill/SKILL.md +41 -0
- package/integrations/openclaw/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/LICENSE +190 -0
- package/integrations/pi/README.md +45 -51
- package/integrations/pi/dist/index.mjs +1379 -0
- package/integrations/pi/index.ts +138 -171
- package/integrations/pi/package.json +16 -6
- package/integrations/pi/security.ts +6 -26
- package/integrations/pi/skills/agentmemory-agents/REFERENCE.md +32 -0
- package/integrations/pi/skills/agentmemory-agents/SKILL.md +48 -0
- package/integrations/pi/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/agentmemory-architecture/SKILL.md +33 -0
- package/integrations/pi/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/agentmemory-config/REFERENCE.md +90 -0
- package/integrations/pi/skills/agentmemory-config/SKILL.md +78 -0
- package/integrations/pi/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/agentmemory-hooks/REFERENCE.md +20 -0
- package/integrations/pi/skills/agentmemory-hooks/SKILL.md +49 -0
- package/integrations/pi/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
- package/integrations/pi/skills/agentmemory-mcp-tools/SKILL.md +42 -0
- package/integrations/pi/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/agentmemory-rest-api/REFERENCE.md +158 -0
- package/integrations/pi/skills/agentmemory-rest-api/SKILL.md +49 -0
- package/integrations/pi/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/commit-context/EXAMPLES.md +71 -0
- package/integrations/pi/skills/commit-context/SKILL.md +64 -0
- package/integrations/pi/skills/commit-context/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/commit-history/EXAMPLES.md +71 -0
- package/integrations/pi/skills/commit-history/SKILL.md +62 -0
- package/integrations/pi/skills/commit-history/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/forget/EXAMPLES.md +40 -0
- package/integrations/pi/skills/forget/SKILL.md +73 -0
- package/integrations/pi/skills/forget/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/handoff/EXAMPLES.md +57 -0
- package/integrations/pi/skills/handoff/SKILL.md +75 -0
- package/integrations/pi/skills/handoff/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/lesson/SKILL.md +64 -0
- package/integrations/pi/skills/lesson/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/memory-discipline/SKILL.md +65 -0
- package/integrations/pi/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/recall/EXAMPLES.md +74 -0
- package/integrations/pi/skills/recall/SKILL.md +74 -0
- package/integrations/pi/skills/recall/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/recap/EXAMPLES.md +62 -0
- package/integrations/pi/skills/recap/SKILL.md +68 -0
- package/integrations/pi/skills/recap/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/remember/EXAMPLES.md +67 -0
- package/integrations/pi/skills/remember/SKILL.md +66 -0
- package/integrations/pi/skills/remember/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/session-history/EXAMPLES.md +59 -0
- package/integrations/pi/skills/session-history/SKILL.md +67 -0
- package/integrations/pi/skills/session-history/TROUBLESHOOTING.md +70 -0
- package/integrations/pi/skills/write-agentmemory-skill/SKILL.md +41 -0
- package/integrations/pi/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
- package/package.json +32 -11
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +4 -3
- package/plugin/.devin-plugin/plugin.json +5 -3
- package/plugin/cursor/hooks.json +23 -8
- package/plugin/hooks.json +67 -0
- package/plugin/opencode/README.md +1 -1
- package/plugin/opencode/agentmemory-capture.ts +25 -11
- package/plugin/opencode/plugin.json +1 -1
- package/plugin/plugin.json +1 -1
- package/plugin/scripts/_capture.d.mts +5 -2
- package/plugin/scripts/_capture.d.mts.map +1 -1
- package/plugin/scripts/_capture.mjs +55 -19
- package/plugin/scripts/_capture.mjs.map +1 -1
- package/plugin/scripts/cursor/run-detached.d.mts +1 -0
- package/plugin/scripts/cursor/run-detached.mjs +786 -0
- package/plugin/scripts/cursor/run-detached.mjs.map +1 -0
- package/plugin/scripts/cursor/run-hook.d.mts +1 -0
- package/plugin/scripts/cursor/run-hook.mjs +704 -0
- package/plugin/scripts/cursor/run-hook.mjs.map +1 -0
- package/plugin/scripts/notification.mjs +20 -6
- package/plugin/scripts/notification.mjs.map +1 -1
- package/plugin/scripts/plugin-bridge.mjs +37 -6
- package/plugin/scripts/post-commit.mjs +25 -5
- package/plugin/scripts/post-commit.mjs.map +1 -1
- package/plugin/scripts/post-tool-failure.mjs +12 -4
- package/plugin/scripts/post-tool-failure.mjs.map +1 -1
- package/plugin/scripts/post-tool-use.mjs +12 -4
- package/plugin/scripts/post-tool-use.mjs.map +1 -1
- package/plugin/scripts/pre-compact.mjs +37 -10
- package/plugin/scripts/pre-compact.mjs.map +1 -1
- package/plugin/scripts/pre-tool-use.mjs +25 -5
- package/plugin/scripts/pre-tool-use.mjs.map +1 -1
- package/plugin/scripts/prompt-submit.mjs +12 -4
- package/plugin/scripts/prompt-submit.mjs.map +1 -1
- package/plugin/scripts/session-end.mjs +47 -16
- package/plugin/scripts/session-end.mjs.map +1 -1
- package/plugin/scripts/session-start.mjs +37 -10
- package/plugin/scripts/session-start.mjs.map +1 -1
- package/plugin/scripts/stop.mjs +74 -72
- package/plugin/scripts/stop.mjs.map +1 -1
- package/plugin/scripts/subagent-start.mjs +13 -5
- package/plugin/scripts/subagent-start.mjs.map +1 -1
- package/plugin/scripts/subagent-stop.mjs +18 -6
- package/plugin/scripts/subagent-stop.mjs.map +1 -1
- package/plugin/scripts/task-completed.mjs +13 -5
- package/plugin/scripts/task-completed.mjs.map +1 -1
- package/plugin/skills/_shared/TROUBLESHOOTING.md +21 -7
- package/plugin/skills/agentmemory-agents/REFERENCE.md +7 -6
- package/plugin/skills/agentmemory-agents/SKILL.md +19 -5
- package/plugin/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/agentmemory-architecture/SKILL.md +4 -4
- package/plugin/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/agentmemory-config/REFERENCE.md +12 -15
- package/plugin/skills/agentmemory-config/SKILL.md +7 -3
- package/plugin/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/agentmemory-hooks/SKILL.md +15 -5
- package/plugin/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +4 -4
- package/plugin/skills/agentmemory-mcp-tools/SKILL.md +6 -3
- package/plugin/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/agentmemory-rest-api/REFERENCE.md +9 -1
- package/plugin/skills/agentmemory-rest-api/SKILL.md +12 -6
- package/plugin/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/commit-context/SKILL.md +1 -1
- package/plugin/skills/commit-context/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/commit-history/SKILL.md +1 -1
- package/plugin/skills/commit-history/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/forget/EXAMPLES.md +19 -54
- package/plugin/skills/forget/SKILL.md +16 -12
- package/plugin/skills/forget/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/handoff/EXAMPLES.md +5 -4
- package/plugin/skills/handoff/SKILL.md +10 -5
- package/plugin/skills/handoff/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/lesson/SKILL.md +1 -1
- package/plugin/skills/lesson/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/memory-discipline/SKILL.md +1 -1
- package/plugin/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/recall/SKILL.md +18 -7
- package/plugin/skills/recall/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/recap/EXAMPLES.md +5 -3
- package/plugin/skills/recap/SKILL.md +11 -6
- package/plugin/skills/recap/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/remember/EXAMPLES.md +3 -3
- package/plugin/skills/remember/SKILL.md +1 -1
- package/plugin/skills/remember/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/session-history/EXAMPLES.md +2 -2
- package/plugin/skills/session-history/SKILL.md +10 -4
- package/plugin/skills/session-history/TROUBLESHOOTING.md +70 -0
- package/plugin/skills/write-agentmemory-skill/SKILL.md +2 -1
- package/plugin/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
- package/dist/connect-B4_ca6BD.mjs.map +0 -1
- package/dist/docker-compose.yml +0 -73
- package/dist/iii-config.docker.yaml +0 -53
- package/dist/iii-config.yaml +0 -63
- package/dist/keyed-mutex-DchXsyfP.mjs.map +0 -1
- package/dist/secret-store-BnY3A50C.mjs.map +0 -1
- package/dist/src-Jsq9LCeH.mjs.map +0 -1
- package/dist/standalone-DKCdrf1d.mjs.map +0 -1
- package/dist/status-IRz7ta8-.mjs +0 -2344
- package/dist/status-IRz7ta8-.mjs.map +0 -1
- package/docker-compose.yml +0 -73
- package/iii-config.docker.yaml +0 -53
- package/iii-config.yaml +0 -63
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { s as generateId } from "./keyed-mutex-DCUh7PG-.mjs";
|
|
2
|
+
import { R as getAgentId, Y as getStandalonePersistPath, c as memoryToObservation, i as resolveClientSecret, m as queryAudit, o as buildRecallResponse, tt as isAgentScopeIsolated, u as isSearchLayer, w as VERSION, x as getAllTools } from "./secret-store-D9GwO0xp.mjs";
|
|
3
|
+
import { a as pageAfterCursor, c as sortByKeyDesc, n as parseSearchExpansionIds, t as parseSessionArguments } from "./session-arguments-zxsbbd8y.mjs";
|
|
3
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
5
|
import { dirname } from "node:path";
|
|
5
6
|
//#region src/mcp/in-memory-kv.ts
|
|
@@ -32,20 +33,23 @@ var InMemoryKV = class {
|
|
|
32
33
|
return entries ? Array.from(entries.values()) : [];
|
|
33
34
|
}
|
|
34
35
|
persist() {
|
|
35
|
-
if (!this.persistPath) return;
|
|
36
|
+
if (!this.persistPath) return false;
|
|
36
37
|
try {
|
|
37
38
|
const dir = dirname(this.persistPath);
|
|
38
39
|
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
39
40
|
const data = {};
|
|
40
41
|
for (const [scope, entries] of this.store) data[scope] = Object.fromEntries(entries);
|
|
41
42
|
writeFileSync(this.persistPath, JSON.stringify(data), "utf-8");
|
|
43
|
+
return true;
|
|
42
44
|
} catch (err) {
|
|
43
45
|
process.stderr.write(`[@agentmemory/mcp] Persist failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
46
|
+
return false;
|
|
44
47
|
}
|
|
45
48
|
}
|
|
46
49
|
};
|
|
47
50
|
//#endregion
|
|
48
51
|
//#region src/mcp/transport.ts
|
|
52
|
+
let activeStdioTransports = 0;
|
|
49
53
|
var JsonRpcError = class extends Error {
|
|
50
54
|
constructor(code, message) {
|
|
51
55
|
super(message);
|
|
@@ -198,6 +202,7 @@ function createMessageParser(onMessage, writeErr = (msg) => process.stderr.write
|
|
|
198
202
|
function createStdioTransport(handler) {
|
|
199
203
|
let parser = null;
|
|
200
204
|
let queue = Promise.resolve();
|
|
205
|
+
let active = false;
|
|
201
206
|
const writeResponse = (response) => {
|
|
202
207
|
const formatted = formatResponse(response, parser?.isFramed() ?? false);
|
|
203
208
|
if (typeof formatted === "string") {
|
|
@@ -209,6 +214,10 @@ function createStdioTransport(handler) {
|
|
|
209
214
|
const onData = (chunk) => parser?.push(chunk);
|
|
210
215
|
return {
|
|
211
216
|
start() {
|
|
217
|
+
if (active) return;
|
|
218
|
+
active = true;
|
|
219
|
+
activeStdioTransports += 1;
|
|
220
|
+
process.env["AGENTMEMORY_MCP_STDIO__"] = "1";
|
|
212
221
|
parser = createMessageParser((message) => {
|
|
213
222
|
queue = queue.then(() => processLine(message, handler, writeResponse));
|
|
214
223
|
queue.catch((err) => {
|
|
@@ -219,6 +228,11 @@ function createStdioTransport(handler) {
|
|
|
219
228
|
},
|
|
220
229
|
stop() {
|
|
221
230
|
process.stdin.off("data", onData);
|
|
231
|
+
if (active) {
|
|
232
|
+
active = false;
|
|
233
|
+
activeStdioTransports -= 1;
|
|
234
|
+
if (activeStdioTransports === 0) delete process.env["AGENTMEMORY_MCP_STDIO__"];
|
|
235
|
+
}
|
|
222
236
|
parser = null;
|
|
223
237
|
}
|
|
224
238
|
};
|
|
@@ -235,7 +249,7 @@ function probeTimeoutMs() {
|
|
|
235
249
|
const n = Number(raw);
|
|
236
250
|
return Number.isFinite(n) && n > 0 ? Math.floor(n) : DEFAULT_HEALTH_PROBE_TIMEOUT_MS;
|
|
237
251
|
}
|
|
238
|
-
function
|
|
252
|
+
function isProxyRequired() {
|
|
239
253
|
const raw = process.env["AGENTMEMORY_FORCE_PROXY"];
|
|
240
254
|
return raw === "1" || raw === "true";
|
|
241
255
|
}
|
|
@@ -250,6 +264,7 @@ var ProxyCallError = class extends Error {
|
|
|
250
264
|
}
|
|
251
265
|
};
|
|
252
266
|
let cached = null;
|
|
267
|
+
let cachedUrl = null;
|
|
253
268
|
let cachedAt = 0;
|
|
254
269
|
let probeInFlight = null;
|
|
255
270
|
function resolveEnvOrEmpty(name) {
|
|
@@ -259,17 +274,25 @@ function resolveEnvOrEmpty(name) {
|
|
|
259
274
|
return raw;
|
|
260
275
|
}
|
|
261
276
|
function baseUrl() {
|
|
262
|
-
|
|
277
|
+
const value = resolveEnvOrEmpty("AGENTMEMORY_URL") || DEFAULT_URL;
|
|
278
|
+
try {
|
|
279
|
+
const parsed = new URL(value);
|
|
280
|
+
if (!["http:", "https:"].includes(parsed.protocol) || !parsed.hostname || parsed.username || parsed.password || /[?#\s]/.test(value)) throw new Error();
|
|
281
|
+
return value.replace(/\/+$/, "");
|
|
282
|
+
} catch {
|
|
283
|
+
throw new Error("AGENTMEMORY_URL must be an HTTP(S) URL without credentials, query, or fragment");
|
|
284
|
+
}
|
|
263
285
|
}
|
|
264
|
-
function authHeader() {
|
|
265
|
-
const secret = resolveClientSecret(
|
|
286
|
+
function authHeader(url) {
|
|
287
|
+
const secret = resolveClientSecret(url);
|
|
266
288
|
return secret ? { authorization: `Bearer ${secret}` } : {};
|
|
267
289
|
}
|
|
268
290
|
const defaultLivezProbe = async (url, timeoutMs, headers) => {
|
|
269
291
|
const res = await fetch(`${url}/agentmemory/livez`, {
|
|
270
292
|
method: "GET",
|
|
271
293
|
headers,
|
|
272
|
-
signal: AbortSignal.timeout(timeoutMs)
|
|
294
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
295
|
+
redirect: "error"
|
|
273
296
|
});
|
|
274
297
|
return {
|
|
275
298
|
ok: res.ok,
|
|
@@ -281,7 +304,7 @@ let livezProbe = defaultLivezProbe;
|
|
|
281
304
|
async function probe(url) {
|
|
282
305
|
const timeout = probeTimeoutMs();
|
|
283
306
|
try {
|
|
284
|
-
const res = await livezProbe(url, timeout, authHeader());
|
|
307
|
+
const res = await livezProbe(url, timeout, authHeader(url));
|
|
285
308
|
if (!res.ok) process.stderr.write(`[@agentmemory/mcp] livez probe ${url}/agentmemory/livez -> ${res.status ?? "?"} ${res.statusText ?? ""}; falling back to local InMemoryKV (set AGENTMEMORY_FORCE_PROXY=1 to skip the probe)\n`);
|
|
286
309
|
return res.ok;
|
|
287
310
|
} catch (err) {
|
|
@@ -291,33 +314,38 @@ async function probe(url) {
|
|
|
291
314
|
}
|
|
292
315
|
function invalidateHandle() {
|
|
293
316
|
cached = null;
|
|
317
|
+
cachedUrl = null;
|
|
294
318
|
cachedAt = 0;
|
|
295
319
|
}
|
|
296
320
|
async function resolveHandle() {
|
|
297
321
|
const now = Date.now();
|
|
322
|
+
const url = baseUrl();
|
|
323
|
+
if (cached && (cachedUrl !== url || cached.mode === "local" && isProxyRequired())) invalidateHandle();
|
|
298
324
|
if (cached) if (cached.mode === "local" && now - cachedAt >= LOCAL_MODE_TTL_MS) {
|
|
299
325
|
cached = null;
|
|
300
326
|
cachedAt = 0;
|
|
301
327
|
} else return cached;
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
const
|
|
305
|
-
probeInFlight = (async () => {
|
|
328
|
+
const skipProbe = isProxyRequired();
|
|
329
|
+
if (probeInFlight?.url === url && probeInFlight.forceProxy === skipProbe) return probeInFlight.promise;
|
|
330
|
+
const pending = (async () => {
|
|
306
331
|
const up = skipProbe ? true : await probe(url);
|
|
332
|
+
if (baseUrl() !== url || isProxyRequired() !== skipProbe) return resolveHandle();
|
|
307
333
|
if (skipProbe) process.stderr.write(`[@agentmemory/mcp] AGENTMEMORY_FORCE_PROXY set; skipping livez probe and trusting ${url}\n`);
|
|
308
334
|
if (up) {
|
|
309
335
|
const handle = {
|
|
310
336
|
mode: "proxy",
|
|
311
337
|
baseUrl: url,
|
|
312
338
|
call: async (path, init) => {
|
|
339
|
+
if (baseUrl() !== url) throw new Error("AgentMemory endpoint changed; resolve a new proxy handle before retrying.");
|
|
313
340
|
const res = await fetch(`${url}${path}`, {
|
|
314
341
|
...init,
|
|
315
342
|
headers: {
|
|
316
343
|
"content-type": "application/json",
|
|
317
|
-
...authHeader(),
|
|
344
|
+
...authHeader(url),
|
|
318
345
|
...init?.headers
|
|
319
346
|
},
|
|
320
|
-
signal: AbortSignal.timeout(CALL_TIMEOUT_MS)
|
|
347
|
+
signal: AbortSignal.timeout(CALL_TIMEOUT_MS),
|
|
348
|
+
redirect: "error"
|
|
321
349
|
});
|
|
322
350
|
if (!res.ok) {
|
|
323
351
|
const errText = await res.text().catch(() => "");
|
|
@@ -334,18 +362,25 @@ async function resolveHandle() {
|
|
|
334
362
|
}
|
|
335
363
|
};
|
|
336
364
|
cached = handle;
|
|
365
|
+
cachedUrl = url;
|
|
337
366
|
cachedAt = Date.now();
|
|
338
367
|
return handle;
|
|
339
368
|
}
|
|
340
369
|
const local = { mode: "local" };
|
|
341
370
|
cached = local;
|
|
371
|
+
cachedUrl = url;
|
|
342
372
|
cachedAt = Date.now();
|
|
343
373
|
return local;
|
|
344
374
|
})();
|
|
375
|
+
probeInFlight = {
|
|
376
|
+
url,
|
|
377
|
+
forceProxy: skipProbe,
|
|
378
|
+
promise: pending
|
|
379
|
+
};
|
|
345
380
|
try {
|
|
346
|
-
return await
|
|
381
|
+
return await pending;
|
|
347
382
|
} finally {
|
|
348
|
-
probeInFlight = null;
|
|
383
|
+
if (probeInFlight?.promise === pending) probeInFlight = null;
|
|
349
384
|
}
|
|
350
385
|
}
|
|
351
386
|
//#endregion
|
|
@@ -405,6 +440,9 @@ function textResponse(payload, pretty = false) {
|
|
|
405
440
|
text: JSON.stringify(payload, null, pretty ? 2 : 0)
|
|
406
441
|
}] };
|
|
407
442
|
}
|
|
443
|
+
function isAuthenticationError(error) {
|
|
444
|
+
return error instanceof ProxyCallError && (error.status === 401 || error.status === 403);
|
|
445
|
+
}
|
|
408
446
|
function validate(toolName, args) {
|
|
409
447
|
if (!IMPLEMENTED_TOOLS.has(toolName)) throw new Error(`Unknown tool: ${toolName}`);
|
|
410
448
|
const v = { tool: toolName };
|
|
@@ -422,22 +460,41 @@ function validate(toolName, args) {
|
|
|
422
460
|
}
|
|
423
461
|
case "memory_recall":
|
|
424
462
|
case "memory_smart_search": {
|
|
463
|
+
if (args.targetLayer !== void 0 && !isSearchLayer(args.targetLayer)) throw new Error("targetLayer must be one of: all, memory, observation");
|
|
464
|
+
v.targetLayer = args.targetLayer ?? "all";
|
|
465
|
+
for (const field of [
|
|
466
|
+
"project",
|
|
467
|
+
"cwd",
|
|
468
|
+
"agentId",
|
|
469
|
+
"sessionId",
|
|
470
|
+
"source"
|
|
471
|
+
]) {
|
|
472
|
+
if (args[field] !== void 0 && typeof args[field] !== "string") throw new Error(`${field} must be a string`);
|
|
473
|
+
if (typeof args[field] === "string" && args[field].trim()) v[field] = args[field].trim();
|
|
474
|
+
}
|
|
475
|
+
if (toolName === "memory_smart_search") {
|
|
476
|
+
v.expandIds = parseSearchExpansionIds(args.expandIds);
|
|
477
|
+
if (typeof args.includeLessons === "boolean") v.includeLessons = args.includeLessons;
|
|
478
|
+
}
|
|
425
479
|
const query = args["query"];
|
|
426
|
-
if (typeof query !== "string" || !query.trim())
|
|
427
|
-
|
|
480
|
+
if (typeof query !== "string" || !query.trim()) {
|
|
481
|
+
if (!v.expandIds?.length) throw new Error("query is required unless expandIds is provided");
|
|
482
|
+
} else v.query = query.trim();
|
|
428
483
|
v.limit = parseLimit(args["limit"]);
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
484
|
+
if (toolName === "memory_recall") {
|
|
485
|
+
const format = typeof args.format === "string" ? args.format.trim().toLowerCase() : args.format ?? "full";
|
|
486
|
+
if (format !== "full" && format !== "compact" && format !== "narrative") throw new Error("format must be one of: full, compact, narrative");
|
|
487
|
+
v.format = format;
|
|
488
|
+
if (args.token_budget !== void 0) {
|
|
489
|
+
const budget = typeof args.token_budget === "string" ? Number(args.token_budget) : args.token_budget;
|
|
490
|
+
if (typeof budget !== "number" || !Number.isInteger(budget) || budget < 1) throw new Error("token_budget must be a positive integer");
|
|
491
|
+
v.tokenBudget = budget;
|
|
492
|
+
}
|
|
436
493
|
}
|
|
437
494
|
return v;
|
|
438
495
|
}
|
|
439
496
|
case "memory_sessions":
|
|
440
|
-
v.
|
|
497
|
+
v.sessionQuery = parseSessionArguments(args);
|
|
441
498
|
return v;
|
|
442
499
|
case "memory_governance_delete": {
|
|
443
500
|
const ids = normalizeList(args["memoryIds"]);
|
|
@@ -446,7 +503,22 @@ function validate(toolName, args) {
|
|
|
446
503
|
v.reason = args["reason"] || "plugin skill request";
|
|
447
504
|
return v;
|
|
448
505
|
}
|
|
449
|
-
case "memory_export":
|
|
506
|
+
case "memory_export": {
|
|
507
|
+
const query = new URLSearchParams();
|
|
508
|
+
for (const key of [
|
|
509
|
+
"maxSessions",
|
|
510
|
+
"offset",
|
|
511
|
+
"collectionLimit",
|
|
512
|
+
"collectionOffset"
|
|
513
|
+
]) {
|
|
514
|
+
const n = Number(args[key]);
|
|
515
|
+
const min = key === "maxSessions" || key === "collectionLimit" ? 1 : 0;
|
|
516
|
+
if (args[key] !== void 0 && Number.isInteger(n) && n >= min) query.set(key, String(n));
|
|
517
|
+
}
|
|
518
|
+
if (typeof args["collections"] === "string") query.set("collections", args["collections"]);
|
|
519
|
+
v.exportQuery = query.toString();
|
|
520
|
+
return v;
|
|
521
|
+
}
|
|
450
522
|
case "memory_audit":
|
|
451
523
|
v.limit = parseLimit(args["limit"], 50);
|
|
452
524
|
return v;
|
|
@@ -470,7 +542,11 @@ async function handleProxy(v, handle) {
|
|
|
470
542
|
const body = {
|
|
471
543
|
query: v.query,
|
|
472
544
|
limit: v.limit,
|
|
473
|
-
format: v.format ?? "full"
|
|
545
|
+
format: v.format ?? "full",
|
|
546
|
+
targetLayer: v.targetLayer,
|
|
547
|
+
project: v.project,
|
|
548
|
+
cwd: v.cwd,
|
|
549
|
+
agentId: v.agentId
|
|
474
550
|
};
|
|
475
551
|
if (v.tokenBudget != null) body["token_budget"] = v.tokenBudget;
|
|
476
552
|
return textResponse(await handle.call("/agentmemory/search", {
|
|
@@ -481,16 +557,21 @@ async function handleProxy(v, handle) {
|
|
|
481
557
|
case "memory_smart_search": {
|
|
482
558
|
const body = {
|
|
483
559
|
query: v.query,
|
|
484
|
-
limit: v.limit
|
|
560
|
+
limit: v.limit,
|
|
561
|
+
targetLayer: v.targetLayer,
|
|
562
|
+
project: v.project,
|
|
563
|
+
agentId: v.agentId,
|
|
564
|
+
expandIds: v.expandIds,
|
|
565
|
+
sessionId: v.sessionId,
|
|
566
|
+
source: v.source,
|
|
567
|
+
includeLessons: v.includeLessons
|
|
485
568
|
};
|
|
486
|
-
if (v.format != null) body["format"] = v.format;
|
|
487
|
-
if (v.tokenBudget != null) body["token_budget"] = v.tokenBudget;
|
|
488
569
|
return textResponse(await handle.call("/agentmemory/smart-search", {
|
|
489
570
|
method: "POST",
|
|
490
571
|
body: JSON.stringify(body)
|
|
491
572
|
}), true);
|
|
492
573
|
}
|
|
493
|
-
case "memory_sessions": return textResponse(await handle.call(`/agentmemory/sessions
|
|
574
|
+
case "memory_sessions": return textResponse(await handle.call(`/agentmemory/sessions?${new URLSearchParams(v.sessionQuery)}`, { method: "GET" }), true);
|
|
494
575
|
case "memory_governance_delete": return textResponse(await handle.call("/agentmemory/governance/memories", {
|
|
495
576
|
method: "DELETE",
|
|
496
577
|
body: JSON.stringify({
|
|
@@ -499,15 +580,22 @@ async function handleProxy(v, handle) {
|
|
|
499
580
|
})
|
|
500
581
|
}));
|
|
501
582
|
case "memory_export": try {
|
|
502
|
-
return textResponse(await handle.call(
|
|
583
|
+
return textResponse(await handle.call(`/agentmemory/export${v.exportQuery ? `?${v.exportQuery}` : ""}`, { method: "GET" }), true);
|
|
503
584
|
} catch (err) {
|
|
504
|
-
if (err instanceof ProxyCallError && err.body != null && typeof err.body === "object" && err.body.oversized === true) return textResponse(err.body, true);
|
|
585
|
+
if (err instanceof ProxyCallError && err.status === 413 && err.body != null && typeof err.body === "object" && err.body.oversized === true) return textResponse(err.body, true);
|
|
505
586
|
throw err;
|
|
506
587
|
}
|
|
507
588
|
case "memory_audit": return textResponse(await handle.call(`/agentmemory/audit?limit=${v.limit}`, { method: "GET" }), true);
|
|
508
589
|
default: throw new Error(`Unknown tool: ${v.tool}`);
|
|
509
590
|
}
|
|
510
591
|
}
|
|
592
|
+
function localFallbackNotice(persisted) {
|
|
593
|
+
const store = persisted ? "the local fallback file, which the server does not read" : "this process's in-memory fallback store, which is lost when the process exits";
|
|
594
|
+
return {
|
|
595
|
+
storage: "local",
|
|
596
|
+
warning: `agentmemory server at ${displayAgentmemoryUrl()} did not confirm this call, so it ran against ${store}.`
|
|
597
|
+
};
|
|
598
|
+
}
|
|
511
599
|
async function handleLocal(v, kvInstance) {
|
|
512
600
|
switch (v.tool) {
|
|
513
601
|
case "memory_save": {
|
|
@@ -525,34 +613,96 @@ async function handleLocal(v, kvInstance) {
|
|
|
525
613
|
strength: 7,
|
|
526
614
|
version: 1,
|
|
527
615
|
isLatest: true,
|
|
528
|
-
sessionIds: []
|
|
616
|
+
sessionIds: [],
|
|
617
|
+
...v.project !== void 0 && { project: v.project },
|
|
618
|
+
...(v.agentId ?? getAgentId()) !== void 0 && { agentId: v.agentId ?? getAgentId() }
|
|
619
|
+
});
|
|
620
|
+
return textResponse({
|
|
621
|
+
saved: id,
|
|
622
|
+
...localFallbackNotice(kvInstance.persist())
|
|
529
623
|
});
|
|
530
|
-
kvInstance.persist();
|
|
531
|
-
return textResponse({ saved: id });
|
|
532
624
|
}
|
|
533
625
|
case "memory_recall":
|
|
534
626
|
case "memory_smart_search": {
|
|
627
|
+
const isolated = isAgentScopeIsolated();
|
|
628
|
+
const agentId = v.agentId === "*" ? void 0 : v.agentId ?? (isolated ? getAgentId() : void 0);
|
|
629
|
+
if (isolated && v.agentId !== "*" && !agentId) throw new Error("AGENTMEMORY_AGENT_SCOPE=isolated requires an agentId; pass '*' to read across agents");
|
|
535
630
|
const query = (v.query || "").toLowerCase();
|
|
536
631
|
const limit = v.limit ?? DEFAULT_LIMIT;
|
|
632
|
+
const all = v.targetLayer === "observation" ? [] : await kvInstance.list("mem:memories");
|
|
633
|
+
const sessions = v.project || v.cwd ? await kvInstance.list("mem:sessions") : [];
|
|
634
|
+
const sessionsById = new Map(sessions.map((session) => [session.id, session]));
|
|
635
|
+
const scoped = all.filter((memory) => {
|
|
636
|
+
if (memory.isLatest === false || agentId && memory.agentId !== agentId) return false;
|
|
637
|
+
const linkedSessions = (memory.sessionIds ?? []).map((id) => sessionsById.get(id));
|
|
638
|
+
if (v.project && (memory.project ? memory.project !== v.project : !linkedSessions.some((session) => session?.project === v.project))) return false;
|
|
639
|
+
if (v.cwd && !linkedSessions.some((session) => session?.cwd === v.cwd)) return false;
|
|
640
|
+
return true;
|
|
641
|
+
});
|
|
642
|
+
if (v.tool === "memory_smart_search" && v.expandIds?.length) {
|
|
643
|
+
const ids = v.expandIds.map((entry) => typeof entry === "string" ? entry : entry.obsId);
|
|
644
|
+
const byId = new Map(scoped.map((memory) => [memory.id, memory]));
|
|
645
|
+
const eligible = ids.filter((id) => byId.has(id));
|
|
646
|
+
return textResponse({
|
|
647
|
+
mode: "expanded",
|
|
648
|
+
results: eligible.slice(0, 20).map((id) => {
|
|
649
|
+
const observation = memoryToObservation(byId.get(id));
|
|
650
|
+
return {
|
|
651
|
+
obsId: id,
|
|
652
|
+
sessionId: observation.sessionId,
|
|
653
|
+
observation,
|
|
654
|
+
layer: "memory"
|
|
655
|
+
};
|
|
656
|
+
}),
|
|
657
|
+
truncated: eligible.length > 20
|
|
658
|
+
}, true);
|
|
659
|
+
}
|
|
660
|
+
const results = scoped.filter((memory) => {
|
|
661
|
+
const text = [
|
|
662
|
+
memory.title,
|
|
663
|
+
memory.content,
|
|
664
|
+
...memory.files ?? [],
|
|
665
|
+
...memory.concepts ?? [],
|
|
666
|
+
...memory.sessionIds ?? [],
|
|
667
|
+
memory.id
|
|
668
|
+
].join(" ").toLowerCase();
|
|
669
|
+
return query.split(/\s+/).every((word) => text.includes(word));
|
|
670
|
+
}).slice(0, limit);
|
|
671
|
+
if (v.tool === "memory_recall") return textResponse(buildRecallResponse(results.map((memory) => {
|
|
672
|
+
const observation = memoryToObservation(memory);
|
|
673
|
+
return {
|
|
674
|
+
sessionId: observation.sessionId,
|
|
675
|
+
observation,
|
|
676
|
+
score: 1,
|
|
677
|
+
layer: "memory"
|
|
678
|
+
};
|
|
679
|
+
}), v.format ?? "full", v.tokenBudget), true);
|
|
537
680
|
return textResponse({
|
|
538
681
|
mode: "compact",
|
|
539
|
-
results:
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
Array.isArray(m["sessionIds"]) ? m["sessionIds"].join(" ") : "",
|
|
546
|
-
typeof m["id"] === "string" ? m["id"] : ""
|
|
547
|
-
].join(" ").toLowerCase();
|
|
548
|
-
return query.split(/\s+/).every((word) => text.includes(word));
|
|
549
|
-
}).slice(0, limit)
|
|
682
|
+
results: results.map((memory) => ({
|
|
683
|
+
...memory,
|
|
684
|
+
obsId: memory.id,
|
|
685
|
+
sessionId: memory.sessionIds?.[0] ?? "memory",
|
|
686
|
+
layer: "memory"
|
|
687
|
+
}))
|
|
550
688
|
}, true);
|
|
551
689
|
}
|
|
552
690
|
case "memory_sessions": {
|
|
553
|
-
const
|
|
554
|
-
const
|
|
555
|
-
|
|
691
|
+
const query = v.sessionQuery;
|
|
692
|
+
const agentId = query.agentId === "*" ? void 0 : query.agentId ?? (isAgentScopeIsolated() ? getAgentId() : void 0);
|
|
693
|
+
const sessions = (await kvInstance.list("mem:sessions")).filter((session) => session && typeof session.id === "string" && session.id.length > 0).filter((session) => !query.project || session.project === query.project).filter((session) => !agentId || session.agentId === agentId);
|
|
694
|
+
const key = (session) => session.startedAt || "";
|
|
695
|
+
const { page, nextCursor } = pageAfterCursor(sortByKeyDesc(sessions, key, (session) => session.id), key, (session) => session.id, query.cursor, Number(query.limit));
|
|
696
|
+
return textResponse({
|
|
697
|
+
sessions: await Promise.all(page.map(async (session) => {
|
|
698
|
+
const summary = await kvInstance.get("mem:summaries", session.id);
|
|
699
|
+
return summary ? {
|
|
700
|
+
...session,
|
|
701
|
+
summary
|
|
702
|
+
} : session;
|
|
703
|
+
})),
|
|
704
|
+
nextCursor
|
|
705
|
+
}, true);
|
|
556
706
|
}
|
|
557
707
|
case "memory_governance_delete": {
|
|
558
708
|
let deleted = 0;
|
|
@@ -560,11 +710,12 @@ async function handleLocal(v, kvInstance) {
|
|
|
560
710
|
await kvInstance.delete("mem:memories", id);
|
|
561
711
|
deleted++;
|
|
562
712
|
}
|
|
563
|
-
kvInstance.persist();
|
|
713
|
+
const persisted = kvInstance.persist();
|
|
564
714
|
return textResponse({
|
|
565
715
|
deleted,
|
|
566
716
|
requested: (v.memoryIds || []).length,
|
|
567
|
-
reason: v.reason
|
|
717
|
+
reason: v.reason,
|
|
718
|
+
...localFallbackNotice(persisted)
|
|
568
719
|
});
|
|
569
720
|
}
|
|
570
721
|
case "memory_export": return textResponse({
|
|
@@ -604,6 +755,10 @@ async function handleToolCall(toolName, args, kvInstance = kv) {
|
|
|
604
755
|
if (handle.mode === "proxy") try {
|
|
605
756
|
return await handleProxy(validated, handle);
|
|
606
757
|
} catch (err) {
|
|
758
|
+
if (toolName === "memory_sessions" || isAuthenticationError(err) || isProxyRequired()) {
|
|
759
|
+
invalidateHandle();
|
|
760
|
+
throw err;
|
|
761
|
+
}
|
|
607
762
|
process.stderr.write(`[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}; invalidating handle and falling back to local KV\n`);
|
|
608
763
|
invalidateHandle();
|
|
609
764
|
}
|
|
@@ -624,10 +779,12 @@ async function handleToolsList() {
|
|
|
624
779
|
if (debug) process.stderr.write(`[@agentmemory/mcp] tools/list: returning ${remote.tools.length} tools from server\n`);
|
|
625
780
|
return { tools: remote.tools };
|
|
626
781
|
}
|
|
782
|
+
if (isProxyRequired()) throw new Error("AgentMemory returned an invalid tool inventory");
|
|
627
783
|
process.stderr.write(`[@agentmemory/mcp] tools/list: server returned unexpected shape (no .tools array); falling back to local IMPLEMENTED_TOOLS list. Set AGENTMEMORY_DEBUG=1 to inspect response.\n`);
|
|
628
784
|
} catch (err) {
|
|
629
|
-
process.stderr.write(`[@agentmemory/mcp] tools/list proxy failed: ${err instanceof Error ? err.message : String(err)}; falling back to local list\n`);
|
|
630
785
|
invalidateHandle();
|
|
786
|
+
if (isAuthenticationError(err) || isProxyRequired()) throw err;
|
|
787
|
+
process.stderr.write(`[@agentmemory/mcp] tools/list proxy failed: ${err instanceof Error ? err.message : String(err)}; falling back to local list\n`);
|
|
631
788
|
}
|
|
632
789
|
const fallback = getAllTools().filter((t) => IMPLEMENTED_TOOLS.has(t.name));
|
|
633
790
|
if (debug) process.stderr.write(`[@agentmemory/mcp] tools/list: returning ${fallback.length} local fallback tools (${fallback.map((t) => t.name).join(",")})\n`);
|
|
@@ -679,4 +836,4 @@ process.on("SIGTERM", () => {
|
|
|
679
836
|
//#endregion
|
|
680
837
|
export {};
|
|
681
838
|
|
|
682
|
-
//# sourceMappingURL=standalone-
|
|
839
|
+
//# sourceMappingURL=standalone-BlqshyZ5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-BlqshyZ5.mjs","names":[],"sources":["../src/mcp/in-memory-kv.ts","../src/mcp/transport.ts","../src/mcp/rest-proxy.ts","../src/mcp/standalone.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport class InMemoryKV {\n private store = new Map<string, Map<string, unknown>>();\n\n constructor(private persistPath?: string) {\n if (persistPath && existsSync(persistPath)) {\n try {\n const data = JSON.parse(readFileSync(persistPath, \"utf-8\"));\n for (const [scope, entries] of Object.entries(data)) {\n const map = new Map<string, unknown>();\n for (const [key, value] of Object.entries(\n entries as Record<string, unknown>,\n )) {\n map.set(key, value);\n }\n this.store.set(scope, map);\n }\n } catch {\n // start fresh\n }\n }\n }\n\n async get<T = unknown>(scope: string, key: string): Promise<T | null> {\n return (this.store.get(scope)?.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(scope: string, key: string, data: T): Promise<T> {\n if (!this.store.has(scope)) this.store.set(scope, new Map());\n this.store.get(scope)!.set(key, data);\n return data;\n }\n\n async delete(scope: string, key: string): Promise<void> {\n this.store.get(scope)?.delete(key);\n }\n\n async list<T = unknown>(scope: string): Promise<T[]> {\n const entries = this.store.get(scope);\n return entries ? (Array.from(entries.values()) as T[]) : [];\n }\n\n persist(): boolean {\n if (!this.persistPath) return false;\n try {\n const dir = dirname(this.persistPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const data: Record<string, Record<string, unknown>> = {};\n for (const [scope, entries] of this.store) {\n data[scope] = Object.fromEntries(entries);\n }\n writeFileSync(this.persistPath, JSON.stringify(data), \"utf-8\");\n return true;\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] Persist failed: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return false;\n }\n }\n}\n","export interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id?: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type RequestHandler = (\n method: string,\n params: Record<string, unknown>,\n) => Promise<unknown>;\n\nlet activeStdioTransports = 0;\n\nexport class JsonRpcError extends Error {\n constructor(public readonly code: number, message: string) {\n super(message);\n this.name = \"JsonRpcError\";\n }\n}\n\nexport interface StdioMessageParser {\n push: (chunk: Buffer | string) => void;\n isFramed: () => boolean;\n}\n\n// JSON-RPC 2.0 notifications are messages without an `id` field. The spec\n// (and the MCP transport contract) requires the server to NOT send a\n// response for notifications. Some clients tolerate spurious responses;\n// stricter clients (e.g. Codex CLI) treat them as protocol violations and\n// close the transport. See agentmemory#129.\nfunction isNotification(req: JsonRpcRequest): boolean {\n return req.id === undefined || req.id === null;\n}\n\n// Per JSON-RPC 2.0 §4, a valid request id must be a String, Number, or Null\n// (Null is technically only allowed in responses; in requests, omitting id\n// is the convention for notifications, which we treat the same as null).\n// Any other runtime type (object, array, boolean) is an Invalid Request.\nfunction isValidId(id: unknown): id is string | number | null | undefined {\n return (\n id === undefined ||\n id === null ||\n typeof id === \"string\" ||\n typeof id === \"number\"\n );\n}\n\n// Exported for unit tests so the line-handling logic is exercised\n// independently of process.stdin / process.stdout.\nexport async function processLine(\n line: string,\n handler: RequestHandler,\n writeOut: (response: JsonRpcResponse) => void,\n writeErr: (msg: string) => void = (msg) => process.stderr.write(msg),\n): Promise<void> {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n writeOut({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n });\n return;\n }\n\n const request = parsed as JsonRpcRequest;\n const rawId = (request as { id?: unknown } | null)?.id;\n\n // Invalid request shape (missing/wrong jsonrpc, non-string method).\n if (\n !request ||\n typeof request !== \"object\" ||\n request.jsonrpc !== \"2.0\" ||\n typeof request.method !== \"string\"\n ) {\n // Echo the id back only if it's a valid string/number. Notifications\n // (missing/null id) and malformed ids both drop silently — we don't\n // want to respond to something that could be a notification, and we\n // can't invent an id for a malformed one.\n if (typeof rawId === \"string\" || typeof rawId === \"number\") {\n writeOut({\n jsonrpc: \"2.0\",\n id: rawId,\n error: { code: -32600, message: \"Invalid Request\" },\n });\n }\n return;\n }\n\n // Request shape is valid but id may still be of the wrong type\n // (object, array, boolean). Per the spec, that's an Invalid Request.\n // Respond with id: null because we can't safely echo a non-JSON-RPC id.\n if (!isValidId(rawId)) {\n writeOut({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32600, message: \"Invalid Request: id must be string, number, or null\" },\n });\n return;\n }\n\n const notification = isNotification(request);\n\n try {\n const result = await handler(request.method, request.params || {});\n if (notification) return;\n writeOut({\n jsonrpc: \"2.0\",\n id: request.id as string | number,\n result,\n });\n } catch (err) {\n if (notification) {\n writeErr(\n `[mcp-transport] notification handler error for ${request.method}: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n return;\n }\n writeOut({\n jsonrpc: \"2.0\",\n id: request.id as string | number,\n error: {\n code: err instanceof JsonRpcError ? err.code : -32603,\n message: err instanceof Error ? err.message : String(err),\n },\n });\n }\n}\n\nfunction findHeaderEnd(buffer: Buffer): { headerEnd: number; bodyStart: number } | null {\n const crlf = buffer.indexOf(\"\\r\\n\\r\\n\");\n const lf = buffer.indexOf(\"\\n\\n\");\n if (crlf === -1 && lf === -1) return null;\n if (crlf !== -1 && (lf === -1 || crlf <= lf)) {\n return { headerEnd: crlf, bodyStart: crlf + 4 };\n }\n return { headerEnd: lf, bodyStart: lf + 2 };\n}\n\nfunction parseContentLength(header: string): number | null {\n for (const line of header.split(/\\r?\\n/)) {\n const match = line.match(/^content-length:\\s*(\\d+)\\s*$/i);\n if (match) return Number(match[1]);\n }\n return null;\n}\n\nexport function formatResponse(\n response: JsonRpcResponse,\n framed: boolean,\n): string | Buffer[] {\n const body = JSON.stringify(response);\n if (!framed) return `${body}\\n`;\n const bytes = Buffer.from(body, \"utf8\");\n return [Buffer.from(`Content-Length: ${bytes.length}\\r\\n\\r\\n`, \"ascii\"), bytes];\n}\n\nexport function createMessageParser(\n onMessage: (message: string) => void,\n writeErr: (msg: string) => void = (msg) => process.stderr.write(msg),\n): StdioMessageParser {\n let buffer = Buffer.alloc(0);\n let framed = false;\n\n function processBuffer(): void {\n while (buffer.length > 0) {\n if (buffer[0] === 10 || buffer[0] === 13) {\n buffer = buffer.subarray(1);\n continue;\n }\n\n const preview = buffer.toString(\"ascii\", 0, Math.min(buffer.length, 32));\n if (/^content-length:/i.test(preview)) {\n const header = findHeaderEnd(buffer);\n if (!header) return;\n\n const headerText = buffer.subarray(0, header.headerEnd).toString(\"ascii\");\n const contentLength = parseContentLength(headerText);\n if (contentLength === null) {\n writeErr(\"[mcp-transport] missing Content-Length header\\n\");\n buffer = buffer.subarray(header.bodyStart);\n continue;\n }\n\n const messageEnd = header.bodyStart + contentLength;\n if (buffer.length < messageEnd) return;\n\n framed = true;\n const message = buffer.subarray(header.bodyStart, messageEnd).toString(\"utf8\");\n buffer = buffer.subarray(messageEnd);\n onMessage(message);\n continue;\n }\n\n const newline = buffer.indexOf(10);\n if (newline === -1) return;\n const line = buffer\n .subarray(0, newline)\n .toString(\"utf8\")\n .replace(/\\r$/, \"\");\n buffer = buffer.subarray(newline + 1);\n onMessage(line);\n }\n }\n\n return {\n push(chunk) {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, \"utf8\");\n buffer = Buffer.concat([buffer, bytes]);\n processBuffer();\n },\n isFramed() {\n return framed;\n },\n };\n}\n\nexport function createStdioTransport(handler: RequestHandler): {\n start: () => void;\n stop: () => void;\n} {\n let parser: StdioMessageParser | null = null;\n let queue = Promise.resolve();\n let active = false;\n\n const writeResponse = (response: JsonRpcResponse) => {\n const formatted = formatResponse(response, parser?.isFramed() ?? false);\n if (typeof formatted === \"string\") {\n process.stdout.write(formatted);\n return;\n }\n for (const chunk of formatted) {\n process.stdout.write(chunk);\n }\n };\n\n const onData = (chunk: Buffer) => parser?.push(chunk);\n\n return {\n start() {\n if (active) return;\n active = true;\n activeStdioTransports += 1;\n process.env[\"AGENTMEMORY_MCP_STDIO__\"] = \"1\";\n parser = createMessageParser((message) => {\n queue = queue.then(() => processLine(message, handler, writeResponse));\n void queue.catch((err) => {\n process.stderr.write(\n `[mcp-transport] request processing failed: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n );\n });\n });\n process.stdin.on(\"data\", onData);\n },\n stop() {\n process.stdin.off(\"data\", onData);\n if (active) {\n active = false;\n activeStdioTransports -= 1;\n if (activeStdioTransports === 0) {\n delete process.env[\"AGENTMEMORY_MCP_STDIO__\"];\n }\n }\n parser = null;\n },\n };\n}\n","import { resolveClientSecret } from \"../secret-store.js\";\nconst DEFAULT_URL = \"http://localhost:3111\";\nconst DEFAULT_HEALTH_PROBE_TIMEOUT_MS = 2_000;\nconst CALL_TIMEOUT_MS = 15_000;\nconst LOCAL_MODE_TTL_MS = 30_000;\n\nfunction probeTimeoutMs(): number {\n const raw = process.env[\"AGENTMEMORY_PROBE_TIMEOUT_MS\"];\n if (!raw) return DEFAULT_HEALTH_PROBE_TIMEOUT_MS;\n const n = Number(raw);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : DEFAULT_HEALTH_PROBE_TIMEOUT_MS;\n}\n\nexport function isProxyRequired(): boolean {\n const raw = process.env[\"AGENTMEMORY_FORCE_PROXY\"];\n return raw === \"1\" || raw === \"true\";\n}\n\nexport interface ProxyHandle {\n mode: \"proxy\";\n baseUrl: string;\n call: (path: string, init?: RequestInit) => Promise<unknown>;\n}\n\nexport class ProxyCallError extends Error {\n status: number;\n body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"ProxyCallError\";\n this.status = status;\n this.body = body;\n }\n}\n\nexport interface LocalHandle {\n mode: \"local\";\n}\n\nexport type Handle = ProxyHandle | LocalHandle;\n\nlet cached: Handle | null = null;\nlet cachedUrl: string | null = null;\nlet cachedAt = 0;\nlet probeInFlight: { url: string; forceProxy: boolean; promise: Promise<Handle> } | null = null;\n\n// `${VAR}`-style placeholders ship in plugin/.mcp.json so MCP hosts that\n// expand them (Claude Code, Cursor) substitute the user's shell value.\n// Hosts that DON'T expand pass the literal string `\"${AGENTMEMORY_URL}\"`\n// through to our subprocess — that string is truthy, defeats the `||`\n// fallback, and would have us POST to `${AGENTMEMORY_URL}/agentmemory/...`\n// (DNS failure). Strip any literal placeholder we see so the fallback\n// engages instead.\nexport function resolveEnvOrEmpty(name: string): string {\n const raw = process.env[name];\n if (!raw) return \"\";\n if (raw.startsWith(\"${\") && raw.endsWith(\"}\")) return \"\";\n return raw;\n}\n\nfunction baseUrl(): string {\n const value = resolveEnvOrEmpty(\"AGENTMEMORY_URL\") || DEFAULT_URL;\n try {\n const parsed = new URL(value);\n if (![\"http:\", \"https:\"].includes(parsed.protocol) || !parsed.hostname ||\n parsed.username || parsed.password || /[?#\\s]/.test(value)) {\n throw new Error();\n }\n return value.replace(/\\/+$/, \"\");\n } catch {\n throw new Error(\"AGENTMEMORY_URL must be an HTTP(S) URL without credentials, query, or fragment\");\n }\n}\n\nfunction authHeader(url: string): Record<string, string> {\n const secret = resolveClientSecret(url);\n return secret ? { authorization: `Bearer ${secret}` } : {};\n}\n\nexport type LivezProbe = (\n url: string,\n timeoutMs: number,\n headers: Record<string, string>,\n) => Promise<{ ok: boolean; status?: number; statusText?: string }>;\n\nconst defaultLivezProbe: LivezProbe = async (url, timeoutMs, headers) => {\n const res = await fetch(`${url}/agentmemory/livez`, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n redirect: \"error\",\n });\n return { ok: res.ok, status: res.status, statusText: res.statusText };\n};\n\nlet livezProbe: LivezProbe = defaultLivezProbe;\n\n/**\n * Override the livez probe. Intended for tests — production code should rely\n * on the default fetch-based probe. Calling without an argument restores the\n * default. Pair with {@link resetHandleForTests} so the cached handle is\n * dropped before the next call.\n */\nexport function setLivezProbe(fn?: LivezProbe): void {\n livezProbe = fn ?? defaultLivezProbe;\n}\n\nasync function probe(url: string): Promise<boolean> {\n const timeout = probeTimeoutMs();\n try {\n const res = await livezProbe(url, timeout, authHeader(url));\n if (!res.ok) {\n process.stderr.write(\n `[@agentmemory/mcp] livez probe ${url}/agentmemory/livez -> ${res.status ?? \"?\"} ${res.statusText ?? \"\"}; falling back to local InMemoryKV (set AGENTMEMORY_FORCE_PROXY=1 to skip the probe)\\n`,\n );\n }\n return res.ok;\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] livez probe ${url}/agentmemory/livez failed in ${timeout}ms: ${err instanceof Error ? err.message : String(err)}; falling back to local InMemoryKV (set AGENTMEMORY_FORCE_PROXY=1 to skip the probe, or raise AGENTMEMORY_PROBE_TIMEOUT_MS)\\n`,\n );\n return false;\n }\n}\n\nexport function invalidateHandle(): void {\n cached = null;\n cachedUrl = null;\n cachedAt = 0;\n}\n\nexport async function resolveHandle(): Promise<Handle> {\n const now = Date.now();\n const url = baseUrl();\n if (cached && (cachedUrl !== url || (cached.mode === \"local\" && isProxyRequired()))) invalidateHandle();\n if (cached) {\n if (cached.mode === \"local\" && now - cachedAt >= LOCAL_MODE_TTL_MS) {\n cached = null;\n cachedAt = 0;\n } else {\n return cached;\n }\n }\n const skipProbe = isProxyRequired();\n if (probeInFlight?.url === url && probeInFlight.forceProxy === skipProbe) return probeInFlight.promise;\n const pending = (async () => {\n const up = skipProbe ? true : await probe(url);\n if (baseUrl() !== url || isProxyRequired() !== skipProbe) return resolveHandle();\n if (skipProbe) {\n process.stderr.write(\n `[@agentmemory/mcp] AGENTMEMORY_FORCE_PROXY set; skipping livez probe and trusting ${url}\\n`,\n );\n }\n if (up) {\n const handle: ProxyHandle = {\n mode: \"proxy\",\n baseUrl: url,\n call: async (path, init) => {\n if (baseUrl() !== url) {\n throw new Error(\"AgentMemory endpoint changed; resolve a new proxy handle before retrying.\");\n }\n const res = await fetch(`${url}${path}`, {\n ...init,\n headers: {\n \"content-type\": \"application/json\",\n ...authHeader(url),\n ...(init?.headers as Record<string, string> | undefined),\n },\n signal: AbortSignal.timeout(CALL_TIMEOUT_MS),\n redirect: \"error\",\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\");\n let errBody: unknown = undefined;\n if (errText) {\n try {\n errBody = JSON.parse(errText);\n } catch {\n errBody = undefined;\n }\n }\n throw new ProxyCallError(\n `${init?.method || \"GET\"} ${path} -> ${res.status} ${res.statusText}`,\n res.status,\n errBody,\n );\n }\n const text = await res.text();\n return text ? JSON.parse(text) : null;\n },\n };\n cached = handle;\n cachedUrl = url;\n cachedAt = Date.now();\n return handle;\n }\n const local: LocalHandle = { mode: \"local\" };\n cached = local;\n cachedUrl = url;\n cachedAt = Date.now();\n return local;\n })();\n probeInFlight = { url, forceProxy: skipProbe, promise: pending };\n try {\n return await pending;\n } finally {\n if (probeInFlight?.promise === pending) probeInFlight = null;\n }\n}\n\nexport function resetHandleForTests(): void {\n cached = null;\n cachedUrl = null;\n cachedAt = 0;\n probeInFlight = null;\n livezProbe = defaultLivezProbe;\n}\n","#!/usr/bin/env node\n\nimport { InMemoryKV } from \"./in-memory-kv.js\";\nimport { createStdioTransport } from \"./transport.js\";\nimport { getAllTools } from \"./tools-registry.js\";\nimport { getAgentId, getStandalonePersistPath, isAgentScopeIsolated } from \"../config.js\";\nimport { isSearchLayer, type SearchLayer } from \"../state/search-layer.js\";\nimport { memoryToObservation } from \"../state/memory-utils.js\";\nimport { buildRecallResponse } from \"../functions/recall-response.js\";\nimport { parseSearchExpansionIds, type SearchExpansionId } from \"./search-arguments.js\";\nimport { parseSessionArguments } from \"./session-arguments.js\";\nimport { pageAfterCursor, sortByKeyDesc } from \"../state/list-query.js\";\nimport type { Memory, SearchResult, Session } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\nimport { generateId } from \"../state/schema.js\";\nimport { queryAudit } from \"../functions/audit.js\";\nimport {\n resolveHandle,\n invalidateHandle,\n isProxyRequired,\n ProxyCallError,\n type Handle,\n type ProxyHandle,\n} from \"./rest-proxy.js\";\n\nconst IMPLEMENTED_TOOLS = new Set([\n \"memory_save\",\n \"memory_recall\",\n \"memory_smart_search\",\n \"memory_sessions\",\n \"memory_export\",\n \"memory_audit\",\n \"memory_governance_delete\",\n]);\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [\n \"2025-11-25\",\n \"2025-06-18\",\n \"2025-03-26\",\n \"2024-11-05\",\n];\n\nconst SERVER_INFO = {\n name: \"agentmemory\",\n version: VERSION,\n};\n\nconst kv = new InMemoryKV(getStandalonePersistPath());\nlet modeAnnounced = false;\n\nfunction displayAgentmemoryUrl(): string {\n // Match the literal-placeholder guard in rest-proxy.ts so log lines\n // don't show `${AGENTMEMORY_URL}` when an MCP host passed the\n // placeholder through unexpanded.\n const raw = process.env[\"AGENTMEMORY_URL\"];\n if (!raw || (raw.startsWith(\"${\") && raw.endsWith(\"}\"))) {\n return \"http://localhost:3111\";\n }\n return raw;\n}\n\nfunction announceMode(handle: Handle): void {\n if (modeAnnounced) return;\n modeAnnounced = true;\n if (handle.mode === \"proxy\") {\n process.stderr.write(\n `[@agentmemory/mcp] proxying to agentmemory server at ${handle.baseUrl}\\n`,\n );\n } else {\n const fullToolCount = getAllTools().length;\n process.stderr.write(\n `[@agentmemory/mcp] no server reachable at ${displayAgentmemoryUrl()}; running reduced LOCAL FALLBACK with ${IMPLEMENTED_TOOLS.size} of ${fullToolCount} tools. Start 'npx @agentmemory/agentmemory' (and point AGENTMEMORY_URL at it) to unlock all ${fullToolCount} tools.\\n`,\n );\n }\n}\n\nfunction normalizeList(value: unknown): string[] {\n if (!value) return [];\n if (Array.isArray(value)) {\n return value\n .map((v) => (typeof v === \"string\" ? v.trim() : \"\"))\n .filter((v) => v.length > 0);\n }\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n return [];\n}\n\nconst DEFAULT_LIMIT = 10;\nconst MAX_LIMIT = 100;\nfunction parseLimit(raw: unknown, fallback = DEFAULT_LIMIT): number {\n if (typeof raw !== \"number\" && typeof raw !== \"string\") return fallback;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.min(Math.floor(n), MAX_LIMIT);\n}\n\nfunction textResponse(payload: unknown, pretty = false): {\n content: Array<{ type: string; text: string }>;\n} {\n return {\n content: [\n { type: \"text\", text: JSON.stringify(payload, null, pretty ? 2 : 0) },\n ],\n };\n}\n\nfunction isAuthenticationError(error: unknown): boolean {\n return error instanceof ProxyCallError && (error.status === 401 || error.status === 403);\n}\n\ninterface Validated {\n tool: string;\n content?: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n project?: string;\n agentId?: string;\n query?: string;\n limit?: number;\n format?: \"full\" | \"compact\" | \"narrative\";\n tokenBudget?: number;\n targetLayer?: SearchLayer;\n cwd?: string;\n expandIds?: SearchExpansionId[];\n sessionId?: string;\n source?: string;\n includeLessons?: boolean;\n memoryIds?: string[];\n reason?: string;\n exportQuery?: string;\n sessionQuery?: Record<string, string>;\n}\n\nfunction validate(toolName: string, args: Record<string, unknown>): Validated {\n if (!IMPLEMENTED_TOOLS.has(toolName)) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n const v: Validated = { tool: toolName };\n switch (toolName) {\n case \"memory_save\": {\n const content = args[\"content\"];\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"content is required\");\n }\n v.content = content;\n v.type = (args[\"type\"] as string) || \"fact\";\n v.concepts = normalizeList(args[\"concepts\"]);\n v.files = normalizeList(args[\"files\"]);\n // The tool schema exposes project (and now agentId); dropping them\n // here silently broke project/agent scoping through the stdio\n // package specifically.\n if (typeof args[\"project\"] === \"string\" && args[\"project\"].trim()) {\n v.project = args[\"project\"].trim();\n }\n if (typeof args[\"agentId\"] === \"string\" && args[\"agentId\"].trim()) {\n v.agentId = args[\"agentId\"].trim();\n }\n return v;\n }\n case \"memory_recall\":\n case \"memory_smart_search\": {\n if (args.targetLayer !== undefined && !isSearchLayer(args.targetLayer)) {\n throw new Error(\"targetLayer must be one of: all, memory, observation\");\n }\n v.targetLayer = args.targetLayer ?? \"all\";\n for (const field of [\"project\", \"cwd\", \"agentId\", \"sessionId\", \"source\"] as const) {\n if (args[field] !== undefined && typeof args[field] !== \"string\") {\n throw new Error(`${field} must be a string`);\n }\n if (typeof args[field] === \"string\" && args[field].trim()) v[field] = args[field].trim();\n }\n if (toolName === \"memory_smart_search\") {\n v.expandIds = parseSearchExpansionIds(args.expandIds);\n if (typeof args.includeLessons === \"boolean\") v.includeLessons = args.includeLessons;\n }\n const query = args[\"query\"];\n if (typeof query !== \"string\" || !query.trim()) {\n if (!v.expandIds?.length) throw new Error(\"query is required unless expandIds is provided\");\n } else {\n v.query = query.trim();\n }\n v.limit = parseLimit(args[\"limit\"]);\n if (toolName === \"memory_recall\") {\n const format = typeof args.format === \"string\" ? args.format.trim().toLowerCase() : args.format ?? \"full\";\n if (format !== \"full\" && format !== \"compact\" && format !== \"narrative\") {\n throw new Error(\"format must be one of: full, compact, narrative\");\n }\n v.format = format;\n if (args.token_budget !== undefined) {\n const budget = typeof args.token_budget === \"string\" ? Number(args.token_budget) : args.token_budget;\n if (typeof budget !== \"number\" || !Number.isInteger(budget) || budget < 1) {\n throw new Error(\"token_budget must be a positive integer\");\n }\n v.tokenBudget = budget;\n }\n }\n return v;\n }\n case \"memory_sessions\": {\n v.sessionQuery = parseSessionArguments(args);\n return v;\n }\n case \"memory_governance_delete\": {\n const ids = normalizeList(args[\"memoryIds\"]);\n if (ids.length === 0) throw new Error(\"memoryIds is required\");\n v.memoryIds = ids;\n v.reason = (args[\"reason\"] as string) || \"plugin skill request\";\n return v;\n }\n case \"memory_export\": {\n const query = new URLSearchParams();\n for (const key of [\"maxSessions\", \"offset\", \"collectionLimit\", \"collectionOffset\"]) {\n const n = Number(args[key]);\n const min = key === \"maxSessions\" || key === \"collectionLimit\" ? 1 : 0;\n if (args[key] !== undefined && Number.isInteger(n) && n >= min) query.set(key, String(n));\n }\n if (typeof args[\"collections\"] === \"string\") query.set(\"collections\", args[\"collections\"]);\n v.exportQuery = query.toString();\n return v;\n }\n case \"memory_audit\": {\n v.limit = parseLimit(args[\"limit\"], 50);\n return v;\n }\n default:\n throw new Error(`Unknown tool: ${toolName}`);\n }\n}\n\nasync function handleProxy(\n v: Validated,\n handle: ProxyHandle,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n switch (v.tool) {\n case \"memory_save\": {\n const result = await handle.call(\"/agentmemory/remember\", {\n method: \"POST\",\n body: JSON.stringify({\n content: v.content,\n type: v.type,\n concepts: v.concepts,\n files: v.files,\n ...(v.project !== undefined && { project: v.project }),\n ...(v.agentId !== undefined && { agentId: v.agentId }),\n }),\n });\n return textResponse(result);\n }\n case \"memory_recall\": {\n const body: Record<string, unknown> = {\n query: v.query,\n limit: v.limit,\n format: v.format ?? \"full\",\n targetLayer: v.targetLayer,\n project: v.project,\n cwd: v.cwd,\n agentId: v.agentId,\n };\n if (v.tokenBudget != null) body[\"token_budget\"] = v.tokenBudget;\n const result = await handle.call(\"/agentmemory/search\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return textResponse(result, true);\n }\n case \"memory_smart_search\": {\n const body: Record<string, unknown> = {\n query: v.query,\n limit: v.limit,\n targetLayer: v.targetLayer,\n project: v.project,\n agentId: v.agentId,\n expandIds: v.expandIds,\n sessionId: v.sessionId,\n source: v.source,\n includeLessons: v.includeLessons,\n };\n const result = await handle.call(\"/agentmemory/smart-search\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return textResponse(result, true);\n }\n case \"memory_sessions\": {\n const result = await handle.call(\n `/agentmemory/sessions?${new URLSearchParams(v.sessionQuery)}`,\n { method: \"GET\" },\n );\n return textResponse(result, true);\n }\n case \"memory_governance_delete\": {\n const result = await handle.call(\"/agentmemory/governance/memories\", {\n method: \"DELETE\",\n body: JSON.stringify({ memoryIds: v.memoryIds, reason: v.reason }),\n });\n return textResponse(result);\n }\n case \"memory_export\": {\n try {\n const result = await handle.call(\n `/agentmemory/export${v.exportQuery ? `?${v.exportQuery}` : \"\"}`,\n { method: \"GET\" },\n );\n return textResponse(result, true);\n } catch (err) {\n if (\n err instanceof ProxyCallError &&\n err.status === 413 &&\n err.body != null &&\n typeof err.body === \"object\" &&\n (err.body as { oversized?: boolean }).oversized === true\n ) {\n return textResponse(err.body, true);\n }\n throw err;\n }\n }\n case \"memory_audit\": {\n const result = await handle.call(\n `/agentmemory/audit?limit=${v.limit}`,\n { method: \"GET\" },\n );\n return textResponse(result, true);\n }\n default:\n throw new Error(`Unknown tool: ${v.tool}`);\n }\n}\n\nfunction localFallbackNotice(persisted: boolean) {\n const store = persisted\n ? \"the local fallback file, which the server does not read\"\n : \"this process's in-memory fallback store, which is lost when the process exits\";\n return {\n storage: \"local\",\n warning: `agentmemory server at ${displayAgentmemoryUrl()} did not confirm this call, so it ran against ${store}.`,\n };\n}\n\nasync function handleLocal(\n v: Validated,\n kvInstance: InMemoryKV,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n switch (v.tool) {\n case \"memory_save\": {\n const id = generateId(\"mem\");\n const isoNow = new Date().toISOString();\n await kvInstance.set(\"mem:memories\", id, {\n id,\n type: v.type,\n title: (v.content || \"\").slice(0, 80),\n content: v.content,\n concepts: v.concepts,\n files: v.files,\n createdAt: isoNow,\n updatedAt: isoNow,\n strength: 7,\n version: 1,\n isLatest: true,\n sessionIds: [],\n ...(v.project !== undefined && { project: v.project }),\n ...((v.agentId ?? getAgentId()) !== undefined && { agentId: v.agentId ?? getAgentId() }),\n });\n const persisted = kvInstance.persist();\n return textResponse({ saved: id, ...localFallbackNotice(persisted) });\n }\n\n case \"memory_recall\":\n case \"memory_smart_search\": {\n const isolated = isAgentScopeIsolated();\n const agentId = v.agentId === \"*\" ? undefined : v.agentId ?? (isolated ? getAgentId() : undefined);\n if (isolated && v.agentId !== \"*\" && !agentId) {\n throw new Error(\"AGENTMEMORY_AGENT_SCOPE=isolated requires an agentId; pass '*' to read across agents\");\n }\n const query = (v.query || \"\").toLowerCase();\n const limit = v.limit ?? DEFAULT_LIMIT;\n const all = v.targetLayer === \"observation\" ? [] : await kvInstance.list<Memory>(\"mem:memories\");\n const sessions = v.project || v.cwd ? await kvInstance.list<Session>(\"mem:sessions\") : [];\n const sessionsById = new Map(sessions.map((session) => [session.id, session]));\n const scoped = all.filter((memory) => {\n if (memory.isLatest === false || (agentId && memory.agentId !== agentId)) return false;\n const linkedSessions = (memory.sessionIds ?? []).map((id) => sessionsById.get(id));\n if (v.project && (memory.project ? memory.project !== v.project : !linkedSessions.some((session) => session?.project === v.project))) return false;\n if (v.cwd && !linkedSessions.some((session) => session?.cwd === v.cwd)) return false;\n return true;\n });\n if (v.tool === \"memory_smart_search\" && v.expandIds?.length) {\n const ids = v.expandIds.map((entry) => typeof entry === \"string\" ? entry : entry.obsId);\n const byId = new Map(scoped.map((memory) => [memory.id, memory]));\n const eligible = ids.filter((id) => byId.has(id));\n const results = eligible.slice(0, 20).map((id) => {\n const observation = memoryToObservation(byId.get(id)!);\n return { obsId: id, sessionId: observation.sessionId, observation, layer: \"memory\" };\n });\n return textResponse({ mode: \"expanded\", results, truncated: eligible.length > 20 }, true);\n }\n const results = scoped.filter((memory) => {\n const text = [memory.title, memory.content, ...(memory.files ?? []), ...(memory.concepts ?? []), ...(memory.sessionIds ?? []), memory.id]\n .join(\" \").toLowerCase();\n return query.split(/\\s+/).every((word) => text.includes(word));\n }).slice(0, limit);\n if (v.tool === \"memory_recall\") {\n const matches: SearchResult[] = results.map((memory) => {\n const observation = memoryToObservation(memory);\n return { sessionId: observation.sessionId, observation, score: 1, layer: \"memory\" };\n });\n return textResponse(buildRecallResponse(matches, v.format ?? \"full\", v.tokenBudget), true);\n }\n return textResponse({ mode: \"compact\", results: results.map((memory) => ({\n ...memory, obsId: memory.id, sessionId: memory.sessionIds?.[0] ?? \"memory\", layer: \"memory\",\n })) }, true);\n }\n\n case \"memory_sessions\": {\n const query = v.sessionQuery!;\n const agentId = query.agentId === \"*\" ? undefined : query.agentId ?? (isAgentScopeIsolated() ? getAgentId() : undefined);\n const sessions = (await kvInstance.list<Session>(\"mem:sessions\"))\n .filter((session) => session && typeof session.id === \"string\" && session.id.length > 0)\n .filter((session) => !query.project || session.project === query.project)\n .filter((session) => !agentId || session.agentId === agentId);\n const key = (session: Session) => session.startedAt || \"\";\n const { page, nextCursor } = pageAfterCursor(\n sortByKeyDesc(sessions, key, (session) => session.id), key,\n (session) => session.id, query.cursor, Number(query.limit),\n );\n const withSummary = await Promise.all(page.map(async (session) => {\n const summary = await kvInstance.get(\"mem:summaries\", session.id);\n return summary ? { ...session, summary } : session;\n }));\n return textResponse({ sessions: withSummary, nextCursor }, true);\n }\n\n case \"memory_governance_delete\": {\n let deleted = 0;\n for (const id of v.memoryIds || []) {\n const existing = await kvInstance.get(\"mem:memories\", id);\n if (existing) {\n await kvInstance.delete(\"mem:memories\", id);\n deleted++;\n }\n }\n const persisted = kvInstance.persist();\n return textResponse({\n deleted,\n requested: (v.memoryIds || []).length,\n reason: v.reason,\n ...localFallbackNotice(persisted),\n });\n }\n\n case \"memory_export\": {\n const memories = await kvInstance.list(\"mem:memories\");\n const sessions = await kvInstance.list(\"mem:sessions\");\n return textResponse({ version: VERSION, memories, sessions }, true);\n }\n\n case \"memory_audit\": {\n const result = await queryAudit(kvInstance as never, {\n limit: v.limit ?? 50,\n });\n return textResponse(result, true);\n }\n\n default:\n throw new Error(`Unknown tool: ${v.tool}`);\n }\n}\n\nasync function handleProxyGeneric(\n toolName: string,\n args: Record<string, unknown>,\n handle: ProxyHandle,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n // Forward to the server's full MCP surface so non-Claude clients can\n // reach all 54 tools (lessons, sentinels, slots, signals, graph, …)\n // instead of being capped at the 7 IMPLEMENTED_TOOLS set baked into\n // this shim. The server validates arguments per tool.\n const result = (await handle.call(\"/agentmemory/mcp/call\", {\n method: \"POST\",\n body: JSON.stringify({ name: toolName, arguments: args }),\n })) as { content?: Array<{ type: string; text: string }> } | null;\n if (result && Array.isArray(result.content)) {\n return { content: result.content };\n }\n return textResponse(result, true);\n}\n\nexport async function handleToolCall(\n toolName: string,\n args: Record<string, unknown>,\n kvInstance: InMemoryKV = kv,\n): Promise<{ content: Array<{ type: string; text: string }> }> {\n const handle = await resolveHandle();\n announceMode(handle);\n\n if (!IMPLEMENTED_TOOLS.has(toolName)) {\n if (handle.mode === \"proxy\") {\n try {\n return await handleProxyGeneric(toolName, args, handle);\n } catch (err) {\n process.stderr.write(\n `[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n invalidateHandle();\n throw err;\n }\n }\n throw new Error(\n `Unknown tool: ${toolName} (local fallback supports only ${[...IMPLEMENTED_TOOLS].join(\", \")}; start an agentmemory server and set AGENTMEMORY_URL to use the full tool set)`,\n );\n }\n\n const validated = validate(toolName, args);\n if (handle.mode === \"proxy\") {\n try {\n return await handleProxy(validated, handle);\n } catch (err) {\n if (toolName === \"memory_sessions\" || isAuthenticationError(err) || isProxyRequired()) {\n invalidateHandle();\n throw err;\n }\n process.stderr.write(\n `[@agentmemory/mcp] proxy call failed for ${toolName}: ${err instanceof Error ? err.message : String(err)}; invalidating handle and falling back to local KV\\n`,\n );\n invalidateHandle();\n }\n }\n return handleLocal(validated, kvInstance);\n}\n\nexport async function handleToolsList(): Promise<{ tools: unknown[] }> {\n const debug = process.env[\"AGENTMEMORY_DEBUG\"] === \"1\" || process.env[\"AGENTMEMORY_DEBUG\"] === \"true\";\n const handle = await resolveHandle();\n announceMode(handle);\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: handle.mode=${handle.mode}${handle.mode === \"proxy\" ? ` baseUrl=${handle.baseUrl}` : \"\"}\\n`,\n );\n }\n if (handle.mode === \"proxy\") {\n try {\n const remote = (await handle.call(\"/agentmemory/mcp/tools\", {\n method: \"GET\",\n })) as { tools?: unknown } | null;\n if (debug) {\n const shape = remote === null\n ? \"null\"\n : typeof remote !== \"object\"\n ? typeof remote\n : `keys=${Object.keys(remote as object).join(\",\")} toolsType=${Array.isArray((remote as { tools?: unknown }).tools) ? `array(len=${((remote as { tools: unknown[] }).tools).length})` : typeof (remote as { tools?: unknown }).tools}`;\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: remote response shape: ${shape}\\n`,\n );\n }\n if (remote && Array.isArray(remote.tools)) {\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: returning ${remote.tools.length} tools from server\\n`,\n );\n }\n return { tools: remote.tools };\n }\n if (isProxyRequired()) throw new Error(\"AgentMemory returned an invalid tool inventory\");\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: server returned unexpected shape (no .tools array); falling back to local IMPLEMENTED_TOOLS list. Set AGENTMEMORY_DEBUG=1 to inspect response.\\n`,\n );\n } catch (err) {\n invalidateHandle();\n if (isAuthenticationError(err) || isProxyRequired()) throw err;\n process.stderr.write(\n `[@agentmemory/mcp] tools/list proxy failed: ${err instanceof Error ? err.message : String(err)}; falling back to local list\\n`,\n );\n }\n }\n const fallback = getAllTools().filter((t) => IMPLEMENTED_TOOLS.has(t.name));\n if (debug) {\n process.stderr.write(\n `[@agentmemory/mcp] tools/list: returning ${fallback.length} local fallback tools (${fallback.map((t) => t.name).join(\",\")})\\n`,\n );\n }\n return { tools: fallback };\n}\n\nconst transport = createStdioTransport(async (method, params) => {\n switch (method) {\n case \"initialize\": {\n const requested = (params as { protocolVersion?: unknown } | undefined)\n ?.protocolVersion;\n const protocolVersion =\n typeof requested === \"string\" &&\n SUPPORTED_PROTOCOL_VERSIONS.includes(requested)\n ? requested\n : SUPPORTED_PROTOCOL_VERSIONS[0];\n return {\n protocolVersion,\n capabilities: { tools: { listChanged: false } },\n serverInfo: {\n name: SERVER_INFO.name,\n version: SERVER_INFO.version,\n },\n };\n }\n\n case \"notifications/initialized\":\n return {};\n\n case \"tools/list\":\n return handleToolsList();\n\n case \"tools/call\": {\n const toolName = params.name as string;\n const toolArgs = (params.arguments as Record<string, unknown>) || {};\n try {\n return await handleToolCall(toolName, toolArgs);\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n});\n\nprocess.stderr.write(\n `[@agentmemory/mcp] Standalone MCP server v${SERVER_INFO.version} starting...\\n`,\n);\ntransport.start();\n\nprocess.on(\"SIGINT\", () => {\n kv.persist();\n process.exit(0);\n});\nprocess.on(\"SIGTERM\", () => {\n kv.persist();\n process.exit(0);\n});\n"],"mappings":"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"}
|