@agentmemory/agentmemory 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/.github/workflows/ci.yml +22 -0
  3. package/.github/workflows/publish.yml +28 -0
  4. package/AGENTS.md +113 -0
  5. package/LICENSE +190 -0
  6. package/README.md +828 -0
  7. package/assets/banner.png +0 -0
  8. package/assets/demo.gif +0 -0
  9. package/assets/demo.mp4 +0 -0
  10. package/benchmark/QUALITY.md +73 -0
  11. package/benchmark/REAL-EMBEDDINGS.md +67 -0
  12. package/benchmark/SCALE.md +110 -0
  13. package/benchmark/dataset.ts +293 -0
  14. package/benchmark/quality-eval.ts +643 -0
  15. package/benchmark/real-embeddings-eval.ts +405 -0
  16. package/benchmark/scale-eval.ts +398 -0
  17. package/dist/cli.d.mts +1 -0
  18. package/dist/cli.mjs +137 -0
  19. package/dist/cli.mjs.map +1 -0
  20. package/dist/docker-compose.yml +14 -0
  21. package/dist/hooks/notification.d.mts +1 -0
  22. package/dist/hooks/notification.mjs +45 -0
  23. package/dist/hooks/notification.mjs.map +1 -0
  24. package/dist/hooks/post-tool-failure.d.mts +1 -0
  25. package/dist/hooks/post-tool-failure.mjs +45 -0
  26. package/dist/hooks/post-tool-failure.mjs.map +1 -0
  27. package/dist/hooks/post-tool-use.d.mts +1 -0
  28. package/dist/hooks/post-tool-use.mjs +53 -0
  29. package/dist/hooks/post-tool-use.mjs.map +1 -0
  30. package/dist/hooks/pre-compact.d.mts +1 -0
  31. package/dist/hooks/pre-compact.mjs +50 -0
  32. package/dist/hooks/pre-compact.mjs.map +1 -0
  33. package/dist/hooks/pre-tool-use.d.mts +1 -0
  34. package/dist/hooks/pre-tool-use.mjs +69 -0
  35. package/dist/hooks/pre-tool-use.mjs.map +1 -0
  36. package/dist/hooks/prompt-submit.d.mts +1 -0
  37. package/dist/hooks/prompt-submit.mjs +40 -0
  38. package/dist/hooks/prompt-submit.mjs.map +1 -0
  39. package/dist/hooks/session-end.d.mts +1 -0
  40. package/dist/hooks/session-end.mjs +61 -0
  41. package/dist/hooks/session-end.mjs.map +1 -0
  42. package/dist/hooks/session-start.d.mts +1 -0
  43. package/dist/hooks/session-start.mjs +42 -0
  44. package/dist/hooks/session-start.mjs.map +1 -0
  45. package/dist/hooks/stop.d.mts +1 -0
  46. package/dist/hooks/stop.mjs +33 -0
  47. package/dist/hooks/stop.mjs.map +1 -0
  48. package/dist/hooks/subagent-start.d.mts +1 -0
  49. package/dist/hooks/subagent-start.mjs +43 -0
  50. package/dist/hooks/subagent-start.mjs.map +1 -0
  51. package/dist/hooks/subagent-stop.d.mts +1 -0
  52. package/dist/hooks/subagent-stop.mjs +45 -0
  53. package/dist/hooks/subagent-stop.mjs.map +1 -0
  54. package/dist/hooks/task-completed.d.mts +1 -0
  55. package/dist/hooks/task-completed.mjs +46 -0
  56. package/dist/hooks/task-completed.mjs.map +1 -0
  57. package/dist/iii-config.yaml +51 -0
  58. package/dist/index.d.mts +2 -0
  59. package/dist/index.mjs +13776 -0
  60. package/dist/index.mjs.map +1 -0
  61. package/dist/src-QxitMPfJ.mjs +13775 -0
  62. package/dist/src-QxitMPfJ.mjs.map +1 -0
  63. package/dist/standalone.d.mts +1 -0
  64. package/dist/standalone.mjs +1155 -0
  65. package/dist/standalone.mjs.map +1 -0
  66. package/dist/transformers-BX_tgxdO.mjs +38684 -0
  67. package/dist/transformers-BX_tgxdO.mjs.map +1 -0
  68. package/dist/transformers-KMm1i9no.mjs +38683 -0
  69. package/dist/transformers-KMm1i9no.mjs.map +1 -0
  70. package/docker-compose.yml +14 -0
  71. package/iii-config.yaml +51 -0
  72. package/package.json +59 -0
  73. package/plugin/.claude-plugin/plugin.json +10 -0
  74. package/plugin/hooks/hooks.json +77 -0
  75. package/plugin/scripts/diagnostics.mjs +551 -0
  76. package/plugin/scripts/notification.mjs +45 -0
  77. package/plugin/scripts/post-tool-failure.mjs +45 -0
  78. package/plugin/scripts/post-tool-use.mjs +53 -0
  79. package/plugin/scripts/pre-compact.mjs +50 -0
  80. package/plugin/scripts/pre-tool-use.mjs +69 -0
  81. package/plugin/scripts/prompt-submit.mjs +40 -0
  82. package/plugin/scripts/session-end.mjs +61 -0
  83. package/plugin/scripts/session-start.mjs +42 -0
  84. package/plugin/scripts/stop.mjs +33 -0
  85. package/plugin/scripts/subagent-start.mjs +43 -0
  86. package/plugin/scripts/subagent-stop.mjs +45 -0
  87. package/plugin/scripts/task-completed.mjs +46 -0
  88. package/plugin/skills/forget/SKILL.md +32 -0
  89. package/plugin/skills/recall/SKILL.md +18 -0
  90. package/plugin/skills/remember/SKILL.md +25 -0
  91. package/plugin/skills/session-history/SKILL.md +17 -0
  92. package/src/auth.ts +12 -0
  93. package/src/cli.ts +159 -0
  94. package/src/config.ts +221 -0
  95. package/src/eval/metrics-store.ts +65 -0
  96. package/src/eval/quality.ts +51 -0
  97. package/src/eval/schemas.ts +124 -0
  98. package/src/eval/self-correct.ts +28 -0
  99. package/src/eval/validator.ts +31 -0
  100. package/src/functions/actions.ts +288 -0
  101. package/src/functions/audit.ts +61 -0
  102. package/src/functions/auto-forget.ts +169 -0
  103. package/src/functions/branch-aware.ts +169 -0
  104. package/src/functions/cascade.ts +80 -0
  105. package/src/functions/checkpoints.ts +209 -0
  106. package/src/functions/claude-bridge.ts +161 -0
  107. package/src/functions/compress.ts +194 -0
  108. package/src/functions/consolidate.ts +212 -0
  109. package/src/functions/consolidation-pipeline.ts +258 -0
  110. package/src/functions/context.ts +169 -0
  111. package/src/functions/crystallize.ts +293 -0
  112. package/src/functions/dedup.ts +57 -0
  113. package/src/functions/diagnostics.ts +785 -0
  114. package/src/functions/enrich.ts +132 -0
  115. package/src/functions/evict.ts +163 -0
  116. package/src/functions/export-import.ts +508 -0
  117. package/src/functions/facets.ts +248 -0
  118. package/src/functions/file-index.ts +106 -0
  119. package/src/functions/flow-compress.ts +214 -0
  120. package/src/functions/frontier.ts +196 -0
  121. package/src/functions/governance.ts +131 -0
  122. package/src/functions/graph-retrieval.ts +277 -0
  123. package/src/functions/graph.ts +275 -0
  124. package/src/functions/leases.ts +216 -0
  125. package/src/functions/lessons.ts +253 -0
  126. package/src/functions/mesh.ts +434 -0
  127. package/src/functions/migrate.ts +165 -0
  128. package/src/functions/observe.ts +144 -0
  129. package/src/functions/obsidian-export.ts +310 -0
  130. package/src/functions/patterns.ts +138 -0
  131. package/src/functions/privacy.ts +39 -0
  132. package/src/functions/profile.ts +155 -0
  133. package/src/functions/query-expansion.ts +186 -0
  134. package/src/functions/relations.ts +237 -0
  135. package/src/functions/remember.ts +162 -0
  136. package/src/functions/retention.ts +235 -0
  137. package/src/functions/routines.ts +289 -0
  138. package/src/functions/search.ts +80 -0
  139. package/src/functions/sentinels.ts +417 -0
  140. package/src/functions/signals.ts +186 -0
  141. package/src/functions/sketches.ts +274 -0
  142. package/src/functions/sliding-window.ts +257 -0
  143. package/src/functions/smart-search.ts +115 -0
  144. package/src/functions/snapshot.ts +219 -0
  145. package/src/functions/summarize.ts +155 -0
  146. package/src/functions/team.ts +147 -0
  147. package/src/functions/temporal-graph.ts +476 -0
  148. package/src/functions/timeline.ts +138 -0
  149. package/src/functions/verify.ts +117 -0
  150. package/src/health/monitor.ts +110 -0
  151. package/src/health/thresholds.ts +73 -0
  152. package/src/hooks/notification.ts +52 -0
  153. package/src/hooks/post-tool-failure.ts +58 -0
  154. package/src/hooks/post-tool-use.ts +62 -0
  155. package/src/hooks/pre-compact.ts +60 -0
  156. package/src/hooks/pre-tool-use.ts +72 -0
  157. package/src/hooks/prompt-submit.ts +46 -0
  158. package/src/hooks/session-end.ts +71 -0
  159. package/src/hooks/session-start.ts +48 -0
  160. package/src/hooks/stop.ts +39 -0
  161. package/src/hooks/subagent-start.ts +49 -0
  162. package/src/hooks/subagent-stop.ts +54 -0
  163. package/src/hooks/task-completed.ts +54 -0
  164. package/src/index.ts +342 -0
  165. package/src/mcp/in-memory-kv.ts +61 -0
  166. package/src/mcp/server.ts +1455 -0
  167. package/src/mcp/standalone.ts +177 -0
  168. package/src/mcp/tools-registry.ts +769 -0
  169. package/src/mcp/transport.ts +91 -0
  170. package/src/prompts/compression.ts +67 -0
  171. package/src/prompts/consolidation.ts +48 -0
  172. package/src/prompts/graph-extraction.ts +35 -0
  173. package/src/prompts/summary.ts +38 -0
  174. package/src/prompts/xml.ts +26 -0
  175. package/src/providers/agent-sdk.ts +34 -0
  176. package/src/providers/anthropic.ts +35 -0
  177. package/src/providers/circuit-breaker.ts +82 -0
  178. package/src/providers/embedding/cohere.ts +46 -0
  179. package/src/providers/embedding/gemini.ts +54 -0
  180. package/src/providers/embedding/index.ts +39 -0
  181. package/src/providers/embedding/local.ts +52 -0
  182. package/src/providers/embedding/openai.ts +45 -0
  183. package/src/providers/embedding/openrouter.ts +51 -0
  184. package/src/providers/embedding/voyage.ts +46 -0
  185. package/src/providers/fallback-chain.ts +31 -0
  186. package/src/providers/index.ts +84 -0
  187. package/src/providers/openrouter.ts +71 -0
  188. package/src/providers/resilient.ts +37 -0
  189. package/src/state/hybrid-search.ts +295 -0
  190. package/src/state/index-persistence.ts +63 -0
  191. package/src/state/keyed-mutex.ts +18 -0
  192. package/src/state/kv.ts +33 -0
  193. package/src/state/schema.ts +71 -0
  194. package/src/state/search-index.ts +245 -0
  195. package/src/state/stemmer.ts +104 -0
  196. package/src/state/synonyms.ts +63 -0
  197. package/src/state/vector-index.ts +130 -0
  198. package/src/telemetry/setup.ts +116 -0
  199. package/src/triggers/api.ts +1904 -0
  200. package/src/triggers/events.ts +71 -0
  201. package/src/types.ts +769 -0
  202. package/src/version.ts +1 -0
  203. package/src/viewer/index.html +2497 -0
  204. package/src/viewer/server.ts +207 -0
  205. package/src/xenova.d.ts +3 -0
  206. package/test/actions.test.ts +490 -0
  207. package/test/audit.test.ts +108 -0
  208. package/test/auto-forget.test.ts +188 -0
  209. package/test/cascade.test.ts +277 -0
  210. package/test/checkpoints.test.ts +493 -0
  211. package/test/circuit-breaker.test.ts +107 -0
  212. package/test/claude-bridge.test.ts +178 -0
  213. package/test/confidence.test.ts +247 -0
  214. package/test/consistency.test.ts +61 -0
  215. package/test/consolidation-pipeline.test.ts +251 -0
  216. package/test/crystallize.test.ts +521 -0
  217. package/test/diagnostics.test.ts +638 -0
  218. package/test/embedding-provider.test.ts +49 -0
  219. package/test/enrich.test.ts +209 -0
  220. package/test/eval.test.ts +300 -0
  221. package/test/export-import.test.ts +251 -0
  222. package/test/facets.test.ts +448 -0
  223. package/test/fallback-chain.test.ts +93 -0
  224. package/test/frontier.test.ts +485 -0
  225. package/test/governance.test.ts +147 -0
  226. package/test/graph-retrieval.test.ts +186 -0
  227. package/test/graph.test.ts +160 -0
  228. package/test/helpers/mocks.ts +40 -0
  229. package/test/hybrid-search.test.ts +145 -0
  230. package/test/index-persistence.test.ts +124 -0
  231. package/test/integration.test.ts +265 -0
  232. package/test/leases.test.ts +399 -0
  233. package/test/mcp-prompts.test.ts +218 -0
  234. package/test/mcp-resources.test.ts +286 -0
  235. package/test/mcp-standalone.test.ts +113 -0
  236. package/test/mesh.test.ts +700 -0
  237. package/test/privacy.test.ts +87 -0
  238. package/test/profile.test.ts +161 -0
  239. package/test/query-expansion.test.ts +154 -0
  240. package/test/relations.test.ts +198 -0
  241. package/test/retention.test.ts +245 -0
  242. package/test/routines.test.ts +497 -0
  243. package/test/schema-fingerprint.test.ts +81 -0
  244. package/test/schema.test.ts +42 -0
  245. package/test/search-index.test.ts +128 -0
  246. package/test/sentinels.test.ts +626 -0
  247. package/test/signals.test.ts +410 -0
  248. package/test/sketches.test.ts +549 -0
  249. package/test/sliding-window.test.ts +199 -0
  250. package/test/smart-search.test.ts +169 -0
  251. package/test/snapshot.test.ts +165 -0
  252. package/test/team.test.ts +156 -0
  253. package/test/temporal-graph.test.ts +378 -0
  254. package/test/timeline.test.ts +148 -0
  255. package/test/vector-index.test.ts +79 -0
  256. package/test/verify.test.ts +209 -0
  257. package/test/xml.test.ts +65 -0
  258. package/tsconfig.json +22 -0
  259. package/tsdown.config.ts +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-tool-failure.mjs","names":[],"sources":["../../src/hooks/post-tool-failure.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n if (data.is_interrupt) return;\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"post_tool_failure\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n tool_name: data.tool_name,\n tool_input:\n typeof data.tool_input === \"string\"\n ? data.tool_input.slice(0, 4000)\n : JSON.stringify(data.tool_input ?? \"\").slice(0, 4000),\n error:\n typeof data.error === \"string\"\n ? data.error.slice(0, 4000)\n : JSON.stringify(data.error ?? \"\").slice(0, 4000),\n },\n }),\n signal: AbortSignal.timeout(3000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,KAAK,aAAc;CAEvB,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,WAAW,KAAK;KAChB,YACE,OAAO,KAAK,eAAe,WACvB,KAAK,WAAW,MAAM,GAAG,IAAK,GAC9B,KAAK,UAAU,KAAK,cAAc,GAAG,CAAC,MAAM,GAAG,IAAK;KAC1D,OACE,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,MAAM,GAAG,IAAK,GACzB,KAAK,UAAU,KAAK,SAAS,GAAG,CAAC,MAAM,GAAG,IAAK;KACtD;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/post-tool-use.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/observe`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({
25
+ hookType: "post_tool_use",
26
+ sessionId,
27
+ project: data.cwd || process.cwd(),
28
+ cwd: data.cwd || process.cwd(),
29
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
30
+ data: {
31
+ tool_name: data.tool_name,
32
+ tool_input: data.tool_input,
33
+ tool_output: truncate(data.tool_output, 8e3)
34
+ }
35
+ }),
36
+ signal: AbortSignal.timeout(3e3)
37
+ });
38
+ } catch {}
39
+ }
40
+ function truncate(value, max) {
41
+ if (typeof value === "string" && value.length > max) return value.slice(0, max) + "\n[...truncated]";
42
+ if (typeof value === "object" && value !== null) {
43
+ const str = JSON.stringify(value);
44
+ if (str.length > max) return str.slice(0, max) + "...[truncated]";
45
+ return value;
46
+ }
47
+ return value;
48
+ }
49
+ main();
50
+
51
+ //#endregion
52
+ export { };
53
+ //# sourceMappingURL=post-tool-use.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-tool-use.mjs","names":[],"sources":["../../src/hooks/post-tool-use.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"post_tool_use\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n tool_name: data.tool_name,\n tool_input: data.tool_input,\n tool_output: truncate(data.tool_output, 8000),\n },\n }),\n signal: AbortSignal.timeout(3000),\n });\n } catch {\n // fire and forget\n }\n}\n\nfunction truncate(value: unknown, max: number): unknown {\n if (typeof value === \"string\" && value.length > max) {\n return value.slice(0, max) + \"\\n[...truncated]\";\n }\n if (typeof value === \"object\" && value !== null) {\n const str = JSON.stringify(value);\n if (str.length > max) return str.slice(0, max) + \"...[truncated]\";\n return value;\n }\n return value;\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,WAAW,KAAK;KAChB,YAAY,KAAK;KACjB,aAAa,SAAS,KAAK,aAAa,IAAK;KAC9C;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,SAAS,SAAS,OAAgB,KAAsB;AACtD,KAAI,OAAO,UAAU,YAAY,MAAM,SAAS,IAC9C,QAAO,MAAM,MAAM,GAAG,IAAI,GAAG;AAE/B,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAC/C,MAAM,MAAM,KAAK,UAAU,MAAM;AACjC,MAAI,IAAI,SAAS,IAAK,QAAO,IAAI,MAAM,GAAG,IAAI,GAAG;AACjD,SAAO;;AAET,QAAO;;AAGT,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/pre-compact.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ const project = data.cwd || process.cwd();
21
+ if (process.env["CLAUDE_MEMORY_BRIDGE"] === "true") try {
22
+ await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {
23
+ method: "POST",
24
+ headers: authHeaders(),
25
+ body: JSON.stringify({}),
26
+ signal: AbortSignal.timeout(5e3)
27
+ });
28
+ } catch {}
29
+ try {
30
+ const res = await fetch(`${REST_URL}/agentmemory/context`, {
31
+ method: "POST",
32
+ headers: authHeaders(),
33
+ body: JSON.stringify({
34
+ sessionId,
35
+ project,
36
+ budget: 1500
37
+ }),
38
+ signal: AbortSignal.timeout(5e3)
39
+ });
40
+ if (res.ok) {
41
+ const result = await res.json();
42
+ if (result.context) process.stdout.write(result.context);
43
+ }
44
+ } catch {}
45
+ }
46
+ main();
47
+
48
+ //#endregion
49
+ export { };
50
+ //# sourceMappingURL=pre-compact.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact.mjs","names":[],"sources":["../../src/hooks/pre-compact.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n const project = (data.cwd as string) || process.cwd();\n\n if (process.env[\"CLAUDE_MEMORY_BRIDGE\"] === \"true\") {\n try {\n await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(5000),\n });\n } catch {\n // best-effort\n }\n }\n\n try {\n const res = await fetch(`${REST_URL}/agentmemory/context`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, project, budget: 1500 }),\n signal: AbortSignal.timeout(5000),\n });\n\n if (res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // best effort -- don't block compaction\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;CACjD,MAAM,UAAW,KAAK,OAAkB,QAAQ,KAAK;AAErD,KAAI,QAAQ,IAAI,4BAA4B,OAC1C,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,kCAAkC;GACxD,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU,EAAE,CAAC;GACxB,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;AAKV,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,uBAAuB;GACzD,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IAAE;IAAW;IAAS,QAAQ;IAAM,CAAC;GAC1D,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;AAEF,MAAI,IAAI,IAAI;GACV,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/pre-tool-use.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const toolName = data.tool_name;
20
+ if (!toolName) return;
21
+ if (![
22
+ "Edit",
23
+ "Write",
24
+ "Read",
25
+ "Glob",
26
+ "Grep"
27
+ ].includes(toolName)) return;
28
+ const toolInput = data.tool_input || {};
29
+ const files = [];
30
+ const fileKeys = toolName === "Grep" ? ["path", "file"] : [
31
+ "file_path",
32
+ "path",
33
+ "file",
34
+ "pattern"
35
+ ];
36
+ for (const key of fileKeys) {
37
+ const val = toolInput[key];
38
+ if (typeof val === "string" && val.length > 0) files.push(val);
39
+ }
40
+ if (files.length === 0) return;
41
+ const terms = [];
42
+ if (toolName === "Grep" || toolName === "Glob") {
43
+ const pattern = toolInput["pattern"];
44
+ if (typeof pattern === "string" && pattern.length > 0) terms.push(pattern);
45
+ }
46
+ const sessionId = data.session_id || "unknown";
47
+ try {
48
+ const res = await fetch(`${REST_URL}/agentmemory/enrich`, {
49
+ method: "POST",
50
+ headers: authHeaders(),
51
+ body: JSON.stringify({
52
+ sessionId,
53
+ files,
54
+ terms,
55
+ toolName
56
+ }),
57
+ signal: AbortSignal.timeout(2e3)
58
+ });
59
+ if (res.ok) {
60
+ const result = await res.json();
61
+ if (result.context) process.stdout.write(result.context);
62
+ }
63
+ } catch {}
64
+ }
65
+ main();
66
+
67
+ //#endregion
68
+ export { };
69
+ //# sourceMappingURL=pre-tool-use.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-tool-use.mjs","names":[],"sources":["../../src/hooks/pre-tool-use.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const toolName = data.tool_name as string;\n if (!toolName) return;\n\n const fileTools = [\"Edit\", \"Write\", \"Read\", \"Glob\", \"Grep\"];\n if (!fileTools.includes(toolName)) return;\n\n const toolInput = (data.tool_input || {}) as Record<string, unknown>;\n const files: string[] = [];\n const fileKeys =\n toolName === \"Grep\"\n ? [\"path\", \"file\"]\n : [\"file_path\", \"path\", \"file\", \"pattern\"];\n for (const key of fileKeys) {\n const val = toolInput[key];\n if (typeof val === \"string\" && val.length > 0) files.push(val);\n }\n if (files.length === 0) return;\n\n const terms: string[] = [];\n if (toolName === \"Grep\" || toolName === \"Glob\") {\n const pattern = toolInput[\"pattern\"];\n if (typeof pattern === \"string\" && pattern.length > 0) {\n terms.push(pattern);\n }\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n const res = await fetch(`${REST_URL}/agentmemory/enrich`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, files, terms, toolName }),\n signal: AbortSignal.timeout(2000),\n });\n\n if (res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // don't block tool execution\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,WAAW,KAAK;AACtB,KAAI,CAAC,SAAU;AAGf,KAAI,CADc;EAAC;EAAQ;EAAS;EAAQ;EAAQ;EAAO,CAC5C,SAAS,SAAS,CAAE;CAEnC,MAAM,YAAa,KAAK,cAAc,EAAE;CACxC,MAAM,QAAkB,EAAE;CAC1B,MAAM,WACJ,aAAa,SACT,CAAC,QAAQ,OAAO,GAChB;EAAC;EAAa;EAAQ;EAAQ;EAAU;AAC9C,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,MAAM,UAAU;AACtB,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,OAAM,KAAK,IAAI;;AAEhE,KAAI,MAAM,WAAW,EAAG;CAExB,MAAM,QAAkB,EAAE;AAC1B,KAAI,aAAa,UAAU,aAAa,QAAQ;EAC9C,MAAM,UAAU,UAAU;AAC1B,MAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,EAClD,OAAM,KAAK,QAAQ;;CAIvB,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,sBAAsB;GACxD,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IAAE;IAAW;IAAO;IAAO;IAAU,CAAC;GAC3D,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;AAEF,MAAI,IAAI,IAAI;GACV,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/prompt-submit.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/observe`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({
25
+ hookType: "prompt_submit",
26
+ sessionId,
27
+ project: data.cwd || process.cwd(),
28
+ cwd: data.cwd || process.cwd(),
29
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
30
+ data: { prompt: data.prompt }
31
+ }),
32
+ signal: AbortSignal.timeout(3e3)
33
+ });
34
+ } catch {}
35
+ }
36
+ main();
37
+
38
+ //#endregion
39
+ export { };
40
+ //# sourceMappingURL=prompt-submit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-submit.mjs","names":[],"sources":["../../src/hooks/prompt-submit.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"prompt_submit\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: { prompt: data.prompt },\n }),\n signal: AbortSignal.timeout(3000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM,EAAE,QAAQ,KAAK,QAAQ;IAC9B,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/session-end.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/session/end`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({ sessionId }),
25
+ signal: AbortSignal.timeout(5e3)
26
+ });
27
+ } catch {}
28
+ if (process.env["CONSOLIDATION_ENABLED"] === "true") {
29
+ try {
30
+ await fetch(`${REST_URL}/agentmemory/crystals/auto`, {
31
+ method: "POST",
32
+ headers: authHeaders(),
33
+ body: JSON.stringify({ olderThanDays: 0 }),
34
+ signal: AbortSignal.timeout(15e3)
35
+ });
36
+ } catch {}
37
+ try {
38
+ await fetch(`${REST_URL}/agentmemory/consolidate-pipeline`, {
39
+ method: "POST",
40
+ headers: authHeaders(),
41
+ body: JSON.stringify({
42
+ tier: "all",
43
+ force: true
44
+ }),
45
+ signal: AbortSignal.timeout(3e4)
46
+ });
47
+ } catch {}
48
+ }
49
+ if (process.env["CLAUDE_MEMORY_BRIDGE"] === "true") try {
50
+ await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {
51
+ method: "POST",
52
+ headers: authHeaders(),
53
+ signal: AbortSignal.timeout(5e3)
54
+ });
55
+ } catch {}
56
+ }
57
+ main();
58
+
59
+ //#endregion
60
+ export { };
61
+ //# sourceMappingURL=session-end.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-end.mjs","names":[],"sources":["../../src/hooks/session-end.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/session/end`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(5000),\n });\n } catch {\n // best-effort\n }\n\n if (process.env[\"CONSOLIDATION_ENABLED\"] === \"true\") {\n try {\n await fetch(`${REST_URL}/agentmemory/crystals/auto`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ olderThanDays: 0 }),\n signal: AbortSignal.timeout(15000),\n });\n } catch {}\n\n try {\n await fetch(`${REST_URL}/agentmemory/consolidate-pipeline`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ tier: \"all\", force: true }),\n signal: AbortSignal.timeout(30000),\n });\n } catch {}\n }\n\n if (process.env[\"CLAUDE_MEMORY_BRIDGE\"] === \"true\") {\n try {\n await fetch(`${REST_URL}/agentmemory/claude-bridge/sync`, {\n method: \"POST\",\n headers: authHeaders(),\n signal: AbortSignal.timeout(5000),\n });\n } catch {\n // best-effort\n }\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,2BAA2B;GACjD,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;GACnC,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;AAIR,KAAI,QAAQ,IAAI,6BAA6B,QAAQ;AACnD,MAAI;AACF,SAAM,MAAM,GAAG,SAAS,6BAA6B;IACnD,QAAQ;IACR,SAAS,aAAa;IACtB,MAAM,KAAK,UAAU,EAAE,eAAe,GAAG,CAAC;IAC1C,QAAQ,YAAY,QAAQ,KAAM;IACnC,CAAC;UACI;AAER,MAAI;AACF,SAAM,MAAM,GAAG,SAAS,oCAAoC;IAC1D,QAAQ;IACR,SAAS,aAAa;IACtB,MAAM,KAAK,UAAU;KAAE,MAAM;KAAO,OAAO;KAAM,CAAC;IAClD,QAAQ,YAAY,QAAQ,IAAM;IACnC,CAAC;UACI;;AAGV,KAAI,QAAQ,IAAI,4BAA4B,OAC1C,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,kCAAkC;GACxD,QAAQ;GACR,SAAS,aAAa;GACtB,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAMZ,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/session-start.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || `ses_${Date.now().toString(36)}`;
20
+ const project = data.cwd || process.cwd();
21
+ try {
22
+ const res = await fetch(`${REST_URL}/agentmemory/session/start`, {
23
+ method: "POST",
24
+ headers: authHeaders(),
25
+ body: JSON.stringify({
26
+ sessionId,
27
+ project,
28
+ cwd: project
29
+ }),
30
+ signal: AbortSignal.timeout(5e3)
31
+ });
32
+ if (res.ok) {
33
+ const result = await res.json();
34
+ if (result.context) process.stdout.write(result.context);
35
+ }
36
+ } catch {}
37
+ }
38
+ main();
39
+
40
+ //#endregion
41
+ export { };
42
+ //# sourceMappingURL=session-start.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.mjs","names":[],"sources":["../../src/hooks/session-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId =\n (data.session_id as string) || `ses_${Date.now().toString(36)}`;\n const project = (data.cwd as string) || process.cwd();\n\n try {\n const res = await fetch(`${REST_URL}/agentmemory/session/start`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId, project, cwd: project }),\n signal: AbortSignal.timeout(5000),\n });\n\n if (res.ok) {\n const result = (await res.json()) as { context?: string };\n if (result.context) {\n process.stdout.write(result.context);\n }\n }\n } catch {\n // silently fail -- don't block Claude Code startup\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YACH,KAAK,cAAyB,OAAO,KAAK,KAAK,CAAC,SAAS,GAAG;CAC/D,MAAM,UAAW,KAAK,OAAkB,QAAQ,KAAK;AAErD,KAAI;EACF,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,6BAA6B;GAC/D,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IAAE;IAAW;IAAS,KAAK;IAAS,CAAC;GAC1D,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;AAEF,MAAI,IAAI,IAAI;GACV,MAAM,SAAU,MAAM,IAAI,MAAM;AAChC,OAAI,OAAO,QACT,SAAQ,OAAO,MAAM,OAAO,QAAQ;;SAGlC;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/stop.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/summarize`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({ sessionId }),
25
+ signal: AbortSignal.timeout(3e4)
26
+ });
27
+ } catch {}
28
+ }
29
+ main();
30
+
31
+ //#endregion
32
+ export { };
33
+ //# sourceMappingURL=stop.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.mjs","names":[],"sources":["../../src/hooks/stop.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/summarize`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: AbortSignal.timeout(30000),\n });\n } catch {\n // summarize is best-effort\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,yBAAyB;GAC/C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;GACnC,QAAQ,YAAY,QAAQ,IAAM;GACnC,CAAC;SACI;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/subagent-start.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/observe`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({
25
+ hookType: "subagent_start",
26
+ sessionId,
27
+ project: data.cwd || process.cwd(),
28
+ cwd: data.cwd || process.cwd(),
29
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
30
+ data: {
31
+ agent_id: data.agent_id,
32
+ agent_type: data.agent_type
33
+ }
34
+ }),
35
+ signal: AbortSignal.timeout(2e3)
36
+ });
37
+ } catch {}
38
+ }
39
+ main();
40
+
41
+ //#endregion
42
+ export { };
43
+ //# sourceMappingURL=subagent-start.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-start.mjs","names":[],"sources":["../../src/hooks/subagent-start.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"subagent_start\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n agent_id: data.agent_id,\n agent_type: data.agent_type,\n },\n }),\n signal: AbortSignal.timeout(2000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,UAAU,KAAK;KACf,YAAY,KAAK;KAClB;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/subagent-stop.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ const lastMsg = typeof data.last_assistant_message === "string" ? data.last_assistant_message.slice(0, 4e3) : "";
21
+ try {
22
+ await fetch(`${REST_URL}/agentmemory/observe`, {
23
+ method: "POST",
24
+ headers: authHeaders(),
25
+ body: JSON.stringify({
26
+ hookType: "subagent_stop",
27
+ sessionId,
28
+ project: data.cwd || process.cwd(),
29
+ cwd: data.cwd || process.cwd(),
30
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
31
+ data: {
32
+ agent_id: data.agent_id,
33
+ agent_type: data.agent_type,
34
+ last_message: lastMsg
35
+ }
36
+ }),
37
+ signal: AbortSignal.timeout(2e3)
38
+ });
39
+ } catch {}
40
+ }
41
+ main();
42
+
43
+ //#endregion
44
+ export { };
45
+ //# sourceMappingURL=subagent-stop.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-stop.mjs","names":[],"sources":["../../src/hooks/subagent-stop.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n const lastMsg =\n typeof data.last_assistant_message === \"string\"\n ? data.last_assistant_message.slice(0, 4000)\n : \"\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"subagent_stop\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n agent_id: data.agent_id,\n agent_type: data.agent_type,\n last_message: lastMsg,\n },\n }),\n signal: AbortSignal.timeout(2000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;CACjD,MAAM,UACJ,OAAO,KAAK,2BAA2B,WACnC,KAAK,uBAAuB,MAAM,GAAG,IAAK,GAC1C;AAEN,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,UAAU,KAAK;KACf,YAAY,KAAK;KACjB,cAAc;KACf;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ //#region src/hooks/task-completed.ts
3
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
4
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
5
+ function authHeaders() {
6
+ const h = { "Content-Type": "application/json" };
7
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
8
+ return h;
9
+ }
10
+ async function main() {
11
+ let input = "";
12
+ for await (const chunk of process.stdin) input += chunk;
13
+ let data;
14
+ try {
15
+ data = JSON.parse(input);
16
+ } catch {
17
+ return;
18
+ }
19
+ const sessionId = data.session_id || "unknown";
20
+ try {
21
+ await fetch(`${REST_URL}/agentmemory/observe`, {
22
+ method: "POST",
23
+ headers: authHeaders(),
24
+ body: JSON.stringify({
25
+ hookType: "task_completed",
26
+ sessionId,
27
+ project: data.cwd || process.cwd(),
28
+ cwd: data.cwd || process.cwd(),
29
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
30
+ data: {
31
+ task_id: data.task_id,
32
+ task_subject: data.task_subject,
33
+ task_description: typeof data.task_description === "string" ? data.task_description.slice(0, 2e3) : "",
34
+ teammate_name: data.teammate_name,
35
+ team_name: data.team_name
36
+ }
37
+ }),
38
+ signal: AbortSignal.timeout(2e3)
39
+ });
40
+ } catch {}
41
+ }
42
+ main();
43
+
44
+ //#endregion
45
+ export { };
46
+ //# sourceMappingURL=task-completed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-completed.mjs","names":[],"sources":["../../src/hooks/task-completed.ts"],"sourcesContent":["#!/usr/bin/env node\n\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\n\nfunction authHeaders(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\n return h;\n}\n\nasync function main() {\n let input = \"\";\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(input);\n } catch {\n return;\n }\n\n const sessionId = (data.session_id as string) || \"unknown\";\n\n try {\n await fetch(`${REST_URL}/agentmemory/observe`, {\n method: \"POST\",\n headers: authHeaders(),\n body: JSON.stringify({\n hookType: \"task_completed\",\n sessionId,\n project: data.cwd || process.cwd(),\n cwd: data.cwd || process.cwd(),\n timestamp: new Date().toISOString(),\n data: {\n task_id: data.task_id,\n task_subject: data.task_subject,\n task_description: typeof data.task_description === \"string\"\n ? data.task_description.slice(0, 2000)\n : \"\",\n teammate_name: data.teammate_name,\n team_name: data.team_name,\n },\n }),\n signal: AbortSignal.timeout(2000),\n });\n } catch {\n // fire and forget\n }\n}\n\nmain();\n"],"mappings":";;AAEA,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;CAGF,MAAM,YAAa,KAAK,cAAyB;AAEjD,KAAI;AACF,QAAM,MAAM,GAAG,SAAS,uBAAuB;GAC7C,QAAQ;GACR,SAAS,aAAa;GACtB,MAAM,KAAK,UAAU;IACnB,UAAU;IACV;IACA,SAAS,KAAK,OAAO,QAAQ,KAAK;IAClC,KAAK,KAAK,OAAO,QAAQ,KAAK;IAC9B,4BAAW,IAAI,MAAM,EAAC,aAAa;IACnC,MAAM;KACJ,SAAS,KAAK;KACd,cAAc,KAAK;KACnB,kBAAkB,OAAO,KAAK,qBAAqB,WAC/C,KAAK,iBAAiB,MAAM,GAAG,IAAK,GACpC;KACJ,eAAe,KAAK;KACpB,WAAW,KAAK;KACjB;IACF,CAAC;GACF,QAAQ,YAAY,QAAQ,IAAK;GAClC,CAAC;SACI;;AAKV,MAAM"}