@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.
Files changed (331) hide show
  1. package/.env.example +39 -33
  2. package/AGENTS.md +8 -8
  3. package/README.md +173 -558
  4. package/dist/.env.example +39 -33
  5. package/dist/cli.d.mts.map +1 -1
  6. package/dist/cli.mjs +1741 -966
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/compression-recovery-CnhLQC6N.mjs +5912 -0
  9. package/dist/compression-recovery-CnhLQC6N.mjs.map +1 -0
  10. package/dist/{connect-B4_ca6BD.mjs → connect-BSLIAMpw.mjs} +874 -267
  11. package/dist/connect-BSLIAMpw.mjs.map +1 -0
  12. package/dist/hooks/_capture.d.mts +5 -2
  13. package/dist/hooks/_capture.d.mts.map +1 -1
  14. package/dist/hooks/_capture.mjs +55 -19
  15. package/dist/hooks/_capture.mjs.map +1 -1
  16. package/dist/hooks/notification.mjs +20 -6
  17. package/dist/hooks/notification.mjs.map +1 -1
  18. package/dist/hooks/post-commit.mjs +25 -5
  19. package/dist/hooks/post-commit.mjs.map +1 -1
  20. package/dist/hooks/post-tool-failure.mjs +12 -4
  21. package/dist/hooks/post-tool-failure.mjs.map +1 -1
  22. package/dist/hooks/post-tool-use.mjs +12 -4
  23. package/dist/hooks/post-tool-use.mjs.map +1 -1
  24. package/dist/hooks/pre-compact.mjs +37 -10
  25. package/dist/hooks/pre-compact.mjs.map +1 -1
  26. package/dist/hooks/pre-tool-use.mjs +25 -5
  27. package/dist/hooks/pre-tool-use.mjs.map +1 -1
  28. package/dist/hooks/prompt-submit.mjs +12 -4
  29. package/dist/hooks/prompt-submit.mjs.map +1 -1
  30. package/dist/hooks/session-end.mjs +47 -16
  31. package/dist/hooks/session-end.mjs.map +1 -1
  32. package/dist/hooks/session-start.mjs +37 -10
  33. package/dist/hooks/session-start.mjs.map +1 -1
  34. package/dist/hooks/stop.mjs +74 -72
  35. package/dist/hooks/stop.mjs.map +1 -1
  36. package/dist/hooks/subagent-start.mjs +13 -5
  37. package/dist/hooks/subagent-start.mjs.map +1 -1
  38. package/dist/hooks/subagent-stop.mjs +18 -6
  39. package/dist/hooks/subagent-stop.mjs.map +1 -1
  40. package/dist/hooks/task-completed.mjs +13 -5
  41. package/dist/hooks/task-completed.mjs.map +1 -1
  42. package/dist/{image-refs-T_urbwHM.mjs → image-refs-Cyta4Lf9.mjs} +2 -2
  43. package/dist/{image-refs-T_urbwHM.mjs.map → image-refs-Cyta4Lf9.mjs.map} +1 -1
  44. package/dist/index.mjs +8539 -4203
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/integrations/dsh.d.mts +55 -0
  47. package/dist/integrations/dsh.d.mts.map +1 -0
  48. package/dist/integrations/dsh.mjs +1145 -0
  49. package/dist/integrations/dsh.mjs.map +1 -0
  50. package/dist/{keyed-mutex-DchXsyfP.mjs → keyed-mutex-DCUh7PG-.mjs} +58 -9
  51. package/dist/keyed-mutex-DCUh7PG-.mjs.map +1 -0
  52. package/dist/{secret-store-BnY3A50C.mjs → secret-store-D9GwO0xp.mjs} +535 -434
  53. package/dist/secret-store-D9GwO0xp.mjs.map +1 -0
  54. package/dist/session-arguments-zxsbbd8y.mjs +113 -0
  55. package/dist/session-arguments-zxsbbd8y.mjs.map +1 -0
  56. package/dist/{src-Jsq9LCeH.mjs → src-DaMtDzt_.mjs} +4087 -3788
  57. package/dist/src-DaMtDzt_.mjs.map +1 -0
  58. package/dist/{standalone-DKCdrf1d.mjs → standalone-BlqshyZ5.mjs} +213 -56
  59. package/dist/standalone-BlqshyZ5.mjs.map +1 -0
  60. package/dist/standalone.d.mts +1 -1
  61. package/dist/standalone.d.mts.map +1 -1
  62. package/dist/standalone.mjs +626 -73
  63. package/dist/standalone.mjs.map +1 -1
  64. package/dist/viewer/index.html +288 -140
  65. package/integrations/hermes/README.md +84 -0
  66. package/integrations/hermes/__init__.py +669 -0
  67. package/integrations/hermes/plugin.yaml +27 -0
  68. package/integrations/omp/LICENSE +190 -0
  69. package/integrations/omp/README.md +76 -0
  70. package/integrations/omp/capture.ts +1 -0
  71. package/integrations/omp/dist/index.mjs +1450 -0
  72. package/integrations/omp/index.ts +488 -0
  73. package/integrations/omp/package.json +13 -0
  74. package/integrations/omp/security.ts +67 -0
  75. package/integrations/omp/skills/agentmemory-agents/REFERENCE.md +32 -0
  76. package/integrations/omp/skills/agentmemory-agents/SKILL.md +48 -0
  77. package/integrations/omp/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
  78. package/integrations/omp/skills/agentmemory-architecture/SKILL.md +33 -0
  79. package/integrations/omp/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  80. package/integrations/omp/skills/agentmemory-config/REFERENCE.md +90 -0
  81. package/integrations/omp/skills/agentmemory-config/SKILL.md +78 -0
  82. package/integrations/omp/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
  83. package/integrations/omp/skills/agentmemory-hooks/REFERENCE.md +20 -0
  84. package/integrations/omp/skills/agentmemory-hooks/SKILL.md +49 -0
  85. package/integrations/omp/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
  86. package/integrations/omp/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
  87. package/integrations/omp/skills/agentmemory-mcp-tools/SKILL.md +42 -0
  88. package/integrations/omp/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  89. package/integrations/omp/skills/agentmemory-rest-api/REFERENCE.md +158 -0
  90. package/integrations/omp/skills/agentmemory-rest-api/SKILL.md +49 -0
  91. package/integrations/omp/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
  92. package/integrations/omp/skills/commit-context/EXAMPLES.md +71 -0
  93. package/integrations/omp/skills/commit-context/SKILL.md +64 -0
  94. package/integrations/omp/skills/commit-context/TROUBLESHOOTING.md +70 -0
  95. package/integrations/omp/skills/commit-history/EXAMPLES.md +71 -0
  96. package/integrations/omp/skills/commit-history/SKILL.md +62 -0
  97. package/integrations/omp/skills/commit-history/TROUBLESHOOTING.md +70 -0
  98. package/integrations/omp/skills/forget/EXAMPLES.md +40 -0
  99. package/integrations/omp/skills/forget/SKILL.md +73 -0
  100. package/integrations/omp/skills/forget/TROUBLESHOOTING.md +70 -0
  101. package/integrations/omp/skills/handoff/EXAMPLES.md +57 -0
  102. package/integrations/omp/skills/handoff/SKILL.md +75 -0
  103. package/integrations/omp/skills/handoff/TROUBLESHOOTING.md +70 -0
  104. package/integrations/omp/skills/lesson/SKILL.md +64 -0
  105. package/integrations/omp/skills/lesson/TROUBLESHOOTING.md +70 -0
  106. package/integrations/omp/skills/memory-discipline/SKILL.md +65 -0
  107. package/integrations/omp/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
  108. package/integrations/omp/skills/recall/EXAMPLES.md +74 -0
  109. package/integrations/omp/skills/recall/SKILL.md +74 -0
  110. package/integrations/omp/skills/recall/TROUBLESHOOTING.md +70 -0
  111. package/integrations/omp/skills/recap/EXAMPLES.md +62 -0
  112. package/integrations/omp/skills/recap/SKILL.md +68 -0
  113. package/integrations/omp/skills/recap/TROUBLESHOOTING.md +70 -0
  114. package/integrations/omp/skills/remember/EXAMPLES.md +67 -0
  115. package/integrations/omp/skills/remember/SKILL.md +66 -0
  116. package/integrations/omp/skills/remember/TROUBLESHOOTING.md +70 -0
  117. package/integrations/omp/skills/session-history/EXAMPLES.md +59 -0
  118. package/integrations/omp/skills/session-history/SKILL.md +67 -0
  119. package/integrations/omp/skills/session-history/TROUBLESHOOTING.md +70 -0
  120. package/integrations/omp/skills/write-agentmemory-skill/SKILL.md +41 -0
  121. package/integrations/omp/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
  122. package/integrations/openclaw/LICENSE +190 -0
  123. package/integrations/openclaw/README.md +88 -0
  124. package/integrations/openclaw/openclaw.plugin.json +71 -0
  125. package/integrations/openclaw/package.json +38 -0
  126. package/integrations/openclaw/plugin.mjs +425 -0
  127. package/integrations/openclaw/plugin.yaml +26 -0
  128. package/integrations/openclaw/skills/agentmemory-agents/REFERENCE.md +32 -0
  129. package/integrations/openclaw/skills/agentmemory-agents/SKILL.md +48 -0
  130. package/integrations/openclaw/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
  131. package/integrations/openclaw/skills/agentmemory-architecture/SKILL.md +33 -0
  132. package/integrations/openclaw/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  133. package/integrations/openclaw/skills/agentmemory-config/REFERENCE.md +90 -0
  134. package/integrations/openclaw/skills/agentmemory-config/SKILL.md +78 -0
  135. package/integrations/openclaw/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
  136. package/integrations/openclaw/skills/agentmemory-hooks/REFERENCE.md +20 -0
  137. package/integrations/openclaw/skills/agentmemory-hooks/SKILL.md +49 -0
  138. package/integrations/openclaw/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
  139. package/integrations/openclaw/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
  140. package/integrations/openclaw/skills/agentmemory-mcp-tools/SKILL.md +42 -0
  141. package/integrations/openclaw/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  142. package/integrations/openclaw/skills/agentmemory-rest-api/REFERENCE.md +158 -0
  143. package/integrations/openclaw/skills/agentmemory-rest-api/SKILL.md +49 -0
  144. package/integrations/openclaw/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
  145. package/integrations/openclaw/skills/commit-context/EXAMPLES.md +71 -0
  146. package/integrations/openclaw/skills/commit-context/SKILL.md +64 -0
  147. package/integrations/openclaw/skills/commit-context/TROUBLESHOOTING.md +70 -0
  148. package/integrations/openclaw/skills/commit-history/EXAMPLES.md +71 -0
  149. package/integrations/openclaw/skills/commit-history/SKILL.md +62 -0
  150. package/integrations/openclaw/skills/commit-history/TROUBLESHOOTING.md +70 -0
  151. package/integrations/openclaw/skills/forget/EXAMPLES.md +40 -0
  152. package/integrations/openclaw/skills/forget/SKILL.md +73 -0
  153. package/integrations/openclaw/skills/forget/TROUBLESHOOTING.md +70 -0
  154. package/integrations/openclaw/skills/handoff/EXAMPLES.md +57 -0
  155. package/integrations/openclaw/skills/handoff/SKILL.md +75 -0
  156. package/integrations/openclaw/skills/handoff/TROUBLESHOOTING.md +70 -0
  157. package/integrations/openclaw/skills/lesson/SKILL.md +64 -0
  158. package/integrations/openclaw/skills/lesson/TROUBLESHOOTING.md +70 -0
  159. package/integrations/openclaw/skills/memory-discipline/SKILL.md +65 -0
  160. package/integrations/openclaw/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
  161. package/integrations/openclaw/skills/recall/EXAMPLES.md +74 -0
  162. package/integrations/openclaw/skills/recall/SKILL.md +74 -0
  163. package/integrations/openclaw/skills/recall/TROUBLESHOOTING.md +70 -0
  164. package/integrations/openclaw/skills/recap/EXAMPLES.md +62 -0
  165. package/integrations/openclaw/skills/recap/SKILL.md +68 -0
  166. package/integrations/openclaw/skills/recap/TROUBLESHOOTING.md +70 -0
  167. package/integrations/openclaw/skills/remember/EXAMPLES.md +67 -0
  168. package/integrations/openclaw/skills/remember/SKILL.md +66 -0
  169. package/integrations/openclaw/skills/remember/TROUBLESHOOTING.md +70 -0
  170. package/integrations/openclaw/skills/session-history/EXAMPLES.md +59 -0
  171. package/integrations/openclaw/skills/session-history/SKILL.md +67 -0
  172. package/integrations/openclaw/skills/session-history/TROUBLESHOOTING.md +70 -0
  173. package/integrations/openclaw/skills/write-agentmemory-skill/SKILL.md +41 -0
  174. package/integrations/openclaw/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
  175. package/integrations/pi/LICENSE +190 -0
  176. package/integrations/pi/README.md +45 -51
  177. package/integrations/pi/dist/index.mjs +1379 -0
  178. package/integrations/pi/index.ts +138 -171
  179. package/integrations/pi/package.json +16 -6
  180. package/integrations/pi/security.ts +6 -26
  181. package/integrations/pi/skills/agentmemory-agents/REFERENCE.md +32 -0
  182. package/integrations/pi/skills/agentmemory-agents/SKILL.md +48 -0
  183. package/integrations/pi/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
  184. package/integrations/pi/skills/agentmemory-architecture/SKILL.md +33 -0
  185. package/integrations/pi/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  186. package/integrations/pi/skills/agentmemory-config/REFERENCE.md +90 -0
  187. package/integrations/pi/skills/agentmemory-config/SKILL.md +78 -0
  188. package/integrations/pi/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
  189. package/integrations/pi/skills/agentmemory-hooks/REFERENCE.md +20 -0
  190. package/integrations/pi/skills/agentmemory-hooks/SKILL.md +49 -0
  191. package/integrations/pi/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
  192. package/integrations/pi/skills/agentmemory-mcp-tools/REFERENCE.md +66 -0
  193. package/integrations/pi/skills/agentmemory-mcp-tools/SKILL.md +42 -0
  194. package/integrations/pi/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  195. package/integrations/pi/skills/agentmemory-rest-api/REFERENCE.md +158 -0
  196. package/integrations/pi/skills/agentmemory-rest-api/SKILL.md +49 -0
  197. package/integrations/pi/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
  198. package/integrations/pi/skills/commit-context/EXAMPLES.md +71 -0
  199. package/integrations/pi/skills/commit-context/SKILL.md +64 -0
  200. package/integrations/pi/skills/commit-context/TROUBLESHOOTING.md +70 -0
  201. package/integrations/pi/skills/commit-history/EXAMPLES.md +71 -0
  202. package/integrations/pi/skills/commit-history/SKILL.md +62 -0
  203. package/integrations/pi/skills/commit-history/TROUBLESHOOTING.md +70 -0
  204. package/integrations/pi/skills/forget/EXAMPLES.md +40 -0
  205. package/integrations/pi/skills/forget/SKILL.md +73 -0
  206. package/integrations/pi/skills/forget/TROUBLESHOOTING.md +70 -0
  207. package/integrations/pi/skills/handoff/EXAMPLES.md +57 -0
  208. package/integrations/pi/skills/handoff/SKILL.md +75 -0
  209. package/integrations/pi/skills/handoff/TROUBLESHOOTING.md +70 -0
  210. package/integrations/pi/skills/lesson/SKILL.md +64 -0
  211. package/integrations/pi/skills/lesson/TROUBLESHOOTING.md +70 -0
  212. package/integrations/pi/skills/memory-discipline/SKILL.md +65 -0
  213. package/integrations/pi/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
  214. package/integrations/pi/skills/recall/EXAMPLES.md +74 -0
  215. package/integrations/pi/skills/recall/SKILL.md +74 -0
  216. package/integrations/pi/skills/recall/TROUBLESHOOTING.md +70 -0
  217. package/integrations/pi/skills/recap/EXAMPLES.md +62 -0
  218. package/integrations/pi/skills/recap/SKILL.md +68 -0
  219. package/integrations/pi/skills/recap/TROUBLESHOOTING.md +70 -0
  220. package/integrations/pi/skills/remember/EXAMPLES.md +67 -0
  221. package/integrations/pi/skills/remember/SKILL.md +66 -0
  222. package/integrations/pi/skills/remember/TROUBLESHOOTING.md +70 -0
  223. package/integrations/pi/skills/session-history/EXAMPLES.md +59 -0
  224. package/integrations/pi/skills/session-history/SKILL.md +67 -0
  225. package/integrations/pi/skills/session-history/TROUBLESHOOTING.md +70 -0
  226. package/integrations/pi/skills/write-agentmemory-skill/SKILL.md +41 -0
  227. package/integrations/pi/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
  228. package/package.json +32 -11
  229. package/plugin/.claude-plugin/plugin.json +1 -1
  230. package/plugin/.codex-plugin/plugin.json +4 -3
  231. package/plugin/.devin-plugin/plugin.json +5 -3
  232. package/plugin/cursor/hooks.json +23 -8
  233. package/plugin/hooks.json +67 -0
  234. package/plugin/opencode/README.md +1 -1
  235. package/plugin/opencode/agentmemory-capture.ts +25 -11
  236. package/plugin/opencode/plugin.json +1 -1
  237. package/plugin/plugin.json +1 -1
  238. package/plugin/scripts/_capture.d.mts +5 -2
  239. package/plugin/scripts/_capture.d.mts.map +1 -1
  240. package/plugin/scripts/_capture.mjs +55 -19
  241. package/plugin/scripts/_capture.mjs.map +1 -1
  242. package/plugin/scripts/cursor/run-detached.d.mts +1 -0
  243. package/plugin/scripts/cursor/run-detached.mjs +786 -0
  244. package/plugin/scripts/cursor/run-detached.mjs.map +1 -0
  245. package/plugin/scripts/cursor/run-hook.d.mts +1 -0
  246. package/plugin/scripts/cursor/run-hook.mjs +704 -0
  247. package/plugin/scripts/cursor/run-hook.mjs.map +1 -0
  248. package/plugin/scripts/notification.mjs +20 -6
  249. package/plugin/scripts/notification.mjs.map +1 -1
  250. package/plugin/scripts/plugin-bridge.mjs +37 -6
  251. package/plugin/scripts/post-commit.mjs +25 -5
  252. package/plugin/scripts/post-commit.mjs.map +1 -1
  253. package/plugin/scripts/post-tool-failure.mjs +12 -4
  254. package/plugin/scripts/post-tool-failure.mjs.map +1 -1
  255. package/plugin/scripts/post-tool-use.mjs +12 -4
  256. package/plugin/scripts/post-tool-use.mjs.map +1 -1
  257. package/plugin/scripts/pre-compact.mjs +37 -10
  258. package/plugin/scripts/pre-compact.mjs.map +1 -1
  259. package/plugin/scripts/pre-tool-use.mjs +25 -5
  260. package/plugin/scripts/pre-tool-use.mjs.map +1 -1
  261. package/plugin/scripts/prompt-submit.mjs +12 -4
  262. package/plugin/scripts/prompt-submit.mjs.map +1 -1
  263. package/plugin/scripts/session-end.mjs +47 -16
  264. package/plugin/scripts/session-end.mjs.map +1 -1
  265. package/plugin/scripts/session-start.mjs +37 -10
  266. package/plugin/scripts/session-start.mjs.map +1 -1
  267. package/plugin/scripts/stop.mjs +74 -72
  268. package/plugin/scripts/stop.mjs.map +1 -1
  269. package/plugin/scripts/subagent-start.mjs +13 -5
  270. package/plugin/scripts/subagent-start.mjs.map +1 -1
  271. package/plugin/scripts/subagent-stop.mjs +18 -6
  272. package/plugin/scripts/subagent-stop.mjs.map +1 -1
  273. package/plugin/scripts/task-completed.mjs +13 -5
  274. package/plugin/scripts/task-completed.mjs.map +1 -1
  275. package/plugin/skills/_shared/TROUBLESHOOTING.md +21 -7
  276. package/plugin/skills/agentmemory-agents/REFERENCE.md +7 -6
  277. package/plugin/skills/agentmemory-agents/SKILL.md +19 -5
  278. package/plugin/skills/agentmemory-agents/TROUBLESHOOTING.md +70 -0
  279. package/plugin/skills/agentmemory-architecture/SKILL.md +4 -4
  280. package/plugin/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  281. package/plugin/skills/agentmemory-config/REFERENCE.md +12 -15
  282. package/plugin/skills/agentmemory-config/SKILL.md +7 -3
  283. package/plugin/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
  284. package/plugin/skills/agentmemory-hooks/SKILL.md +15 -5
  285. package/plugin/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
  286. package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +4 -4
  287. package/plugin/skills/agentmemory-mcp-tools/SKILL.md +6 -3
  288. package/plugin/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  289. package/plugin/skills/agentmemory-rest-api/REFERENCE.md +9 -1
  290. package/plugin/skills/agentmemory-rest-api/SKILL.md +12 -6
  291. package/plugin/skills/agentmemory-rest-api/TROUBLESHOOTING.md +70 -0
  292. package/plugin/skills/commit-context/SKILL.md +1 -1
  293. package/plugin/skills/commit-context/TROUBLESHOOTING.md +70 -0
  294. package/plugin/skills/commit-history/SKILL.md +1 -1
  295. package/plugin/skills/commit-history/TROUBLESHOOTING.md +70 -0
  296. package/plugin/skills/forget/EXAMPLES.md +19 -54
  297. package/plugin/skills/forget/SKILL.md +16 -12
  298. package/plugin/skills/forget/TROUBLESHOOTING.md +70 -0
  299. package/plugin/skills/handoff/EXAMPLES.md +5 -4
  300. package/plugin/skills/handoff/SKILL.md +10 -5
  301. package/plugin/skills/handoff/TROUBLESHOOTING.md +70 -0
  302. package/plugin/skills/lesson/SKILL.md +1 -1
  303. package/plugin/skills/lesson/TROUBLESHOOTING.md +70 -0
  304. package/plugin/skills/memory-discipline/SKILL.md +1 -1
  305. package/plugin/skills/memory-discipline/TROUBLESHOOTING.md +70 -0
  306. package/plugin/skills/recall/SKILL.md +18 -7
  307. package/plugin/skills/recall/TROUBLESHOOTING.md +70 -0
  308. package/plugin/skills/recap/EXAMPLES.md +5 -3
  309. package/plugin/skills/recap/SKILL.md +11 -6
  310. package/plugin/skills/recap/TROUBLESHOOTING.md +70 -0
  311. package/plugin/skills/remember/EXAMPLES.md +3 -3
  312. package/plugin/skills/remember/SKILL.md +1 -1
  313. package/plugin/skills/remember/TROUBLESHOOTING.md +70 -0
  314. package/plugin/skills/session-history/EXAMPLES.md +2 -2
  315. package/plugin/skills/session-history/SKILL.md +10 -4
  316. package/plugin/skills/session-history/TROUBLESHOOTING.md +70 -0
  317. package/plugin/skills/write-agentmemory-skill/SKILL.md +2 -1
  318. package/plugin/skills/write-agentmemory-skill/TROUBLESHOOTING.md +70 -0
  319. package/dist/connect-B4_ca6BD.mjs.map +0 -1
  320. package/dist/docker-compose.yml +0 -73
  321. package/dist/iii-config.docker.yaml +0 -53
  322. package/dist/iii-config.yaml +0 -63
  323. package/dist/keyed-mutex-DchXsyfP.mjs.map +0 -1
  324. package/dist/secret-store-BnY3A50C.mjs.map +0 -1
  325. package/dist/src-Jsq9LCeH.mjs.map +0 -1
  326. package/dist/standalone-DKCdrf1d.mjs.map +0 -1
  327. package/dist/status-IRz7ta8-.mjs +0 -2344
  328. package/dist/status-IRz7ta8-.mjs.map +0 -1
  329. package/docker-compose.yml +0 -73
  330. package/iii-config.docker.yaml +0 -53
  331. package/iii-config.yaml +0 -63
@@ -1,5 +1,6 @@
1
- import { o as generateId } from "./keyed-mutex-DchXsyfP.mjs";
2
- import { A as getStandalonePersistPath, _ as VERSION, i as resolveClientSecret, m as getAllTools, s as queryAudit } from "./secret-store-BnY3A50C.mjs";
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 forceProxy() {
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
- return (resolveEnvOrEmpty("AGENTMEMORY_URL") || DEFAULT_URL).replace(/\/+$/, "");
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(baseUrl());
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
- if (probeInFlight) return probeInFlight;
303
- const url = baseUrl();
304
- const skipProbe = forceProxy();
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 probeInFlight;
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()) throw new Error("query is required");
427
- v.query = query.trim();
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
- const fmt = args["format"];
430
- if (typeof fmt === "string" && fmt.trim()) v.format = fmt.trim().toLowerCase();
431
- const budget = args["token_budget"];
432
- if (typeof budget === "number" && Number.isFinite(budget) && budget > 0) v.tokenBudget = Math.floor(budget);
433
- else if (typeof budget === "string" && budget.trim()) {
434
- const n = Number(budget);
435
- if (Number.isFinite(n) && n > 0) v.tokenBudget = Math.floor(n);
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.limit = parseLimit(args["limit"], 20);
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": return v;
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?limit=${v.limit}`, { method: "GET" }), true);
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("/agentmemory/export", { method: "GET" }), true);
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: (await kvInstance.list("mem:memories")).filter((m) => {
540
- const text = [
541
- typeof m["title"] === "string" ? m["title"] : "",
542
- typeof m["content"] === "string" ? m["content"] : "",
543
- Array.isArray(m["files"]) ? m["files"].join(" ") : "",
544
- Array.isArray(m["concepts"]) ? m["concepts"].join(" ") : "",
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 sessions = await kvInstance.list("mem:sessions");
554
- const limit = v.limit ?? 20;
555
- return textResponse({ sessions: sessions.slice(0, limit) }, true);
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-DKCdrf1d.mjs.map
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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"}