@agentmemory/agentmemory 0.9.30 → 0.9.32

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 (334) hide show
  1. package/.env.example +57 -48
  2. package/AGENTS.md +8 -8
  3. package/README.md +256 -819
  4. package/dist/.env.example +57 -48
  5. package/dist/cli.d.mts.map +1 -1
  6. package/dist/cli.mjs +2257 -1027
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/compression-recovery-CZh63Jmz.mjs +5997 -0
  9. package/dist/compression-recovery-CZh63Jmz.mjs.map +1 -0
  10. package/dist/{connect-B4_ca6BD.mjs → connect-BX3njQ3Y.mjs} +897 -276
  11. package/dist/connect-BX3njQ3Y.mjs.map +1 -0
  12. package/dist/hooks/_capture.d.mts +5 -1
  13. package/dist/hooks/_capture.d.mts.map +1 -1
  14. package/dist/hooks/_capture.mjs +141 -26
  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 +83 -10
  19. package/dist/hooks/post-commit.mjs.map +1 -1
  20. package/dist/hooks/post-tool-failure.mjs +19 -6
  21. package/dist/hooks/post-tool-failure.mjs.map +1 -1
  22. package/dist/hooks/post-tool-use.mjs +19 -6
  23. package/dist/hooks/post-tool-use.mjs.map +1 -1
  24. package/dist/hooks/pre-compact.mjs +104 -22
  25. package/dist/hooks/pre-compact.mjs.map +1 -1
  26. package/dist/hooks/pre-tool-use.mjs +83 -10
  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 +59 -17
  31. package/dist/hooks/session-end.mjs.map +1 -1
  32. package/dist/hooks/session-start.mjs +95 -15
  33. package/dist/hooks/session-start.mjs.map +1 -1
  34. package/dist/hooks/stop.mjs +75 -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 +32 -10
  39. package/dist/hooks/subagent-stop.mjs.map +1 -1
  40. package/dist/hooks/task-completed.mjs +21 -6
  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 +16390 -11530
  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 +1172 -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-iYXRcrO8.mjs} +717 -474
  53. package/dist/secret-store-iYXRcrO8.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-C23nMpda.mjs} +5263 -4667
  57. package/dist/src-C23nMpda.mjs.map +1 -0
  58. package/dist/{standalone-DKCdrf1d.mjs → standalone-BYo5USDb.mjs} +379 -63
  59. package/dist/standalone-BYo5USDb.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 +864 -81
  63. package/dist/standalone.mjs.map +1 -1
  64. package/dist/viewer/index.html +337 -168
  65. package/integrations/hermes/README.md +94 -0
  66. package/integrations/hermes/__init__.py +670 -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 +1477 -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 +37 -0
  79. package/integrations/omp/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  80. package/integrations/omp/skills/agentmemory-config/REFERENCE.md +91 -0
  81. package/integrations/omp/skills/agentmemory-config/SKILL.md +98 -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 +60 -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 +52 -0
  88. package/integrations/omp/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  89. package/integrations/omp/skills/agentmemory-rest-api/REFERENCE.md +159 -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 +98 -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 +37 -0
  132. package/integrations/openclaw/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  133. package/integrations/openclaw/skills/agentmemory-config/REFERENCE.md +91 -0
  134. package/integrations/openclaw/skills/agentmemory-config/SKILL.md +98 -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 +60 -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 +52 -0
  141. package/integrations/openclaw/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  142. package/integrations/openclaw/skills/agentmemory-rest-api/REFERENCE.md +159 -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 +46 -51
  177. package/integrations/pi/dist/index.mjs +1460 -0
  178. package/integrations/pi/index.ts +192 -175
  179. package/integrations/pi/package.json +17 -7
  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 +37 -0
  185. package/integrations/pi/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  186. package/integrations/pi/skills/agentmemory-config/REFERENCE.md +91 -0
  187. package/integrations/pi/skills/agentmemory-config/SKILL.md +98 -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 +60 -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 +52 -0
  194. package/integrations/pi/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  195. package/integrations/pi/skills/agentmemory-rest-api/REFERENCE.md +159 -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 +33 -11
  229. package/plugin/.claude-plugin/plugin.json +16 -3
  230. package/plugin/.codex-plugin/plugin.json +4 -3
  231. package/plugin/.devin-plugin/plugin.json +6 -5
  232. package/plugin/.mcp.json +5 -1
  233. package/plugin/README.md +71 -0
  234. package/plugin/cursor/hooks.json +23 -8
  235. package/plugin/hooks/hooks.json +24 -12
  236. package/plugin/hooks.json +67 -0
  237. package/plugin/opencode/README.md +1 -1
  238. package/plugin/opencode/agentmemory-capture.ts +25 -11
  239. package/plugin/opencode/plugin.json +1 -1
  240. package/plugin/plugin.json +1 -1
  241. package/plugin/scripts/_capture.d.mts +5 -1
  242. package/plugin/scripts/_capture.d.mts.map +1 -1
  243. package/plugin/scripts/_capture.mjs +141 -26
  244. package/plugin/scripts/_capture.mjs.map +1 -1
  245. package/plugin/scripts/cursor/run-detached.mjs +786 -0
  246. package/plugin/scripts/cursor/run-detached.mjs.map +1 -0
  247. package/plugin/scripts/cursor/run-hook.d.mts +1 -0
  248. package/plugin/scripts/cursor/run-hook.mjs +704 -0
  249. package/plugin/scripts/cursor/run-hook.mjs.map +1 -0
  250. package/plugin/scripts/notification.mjs +20 -6
  251. package/plugin/scripts/notification.mjs.map +1 -1
  252. package/plugin/scripts/plugin-bridge.mjs +61 -11
  253. package/plugin/scripts/post-tool-failure.mjs +19 -6
  254. package/plugin/scripts/post-tool-failure.mjs.map +1 -1
  255. package/plugin/scripts/post-tool-use.mjs +19 -6
  256. package/plugin/scripts/post-tool-use.mjs.map +1 -1
  257. package/plugin/scripts/pre-compact.mjs +104 -22
  258. package/plugin/scripts/pre-compact.mjs.map +1 -1
  259. package/plugin/scripts/pre-tool-use.mjs +83 -10
  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 +59 -17
  264. package/plugin/scripts/session-end.mjs.map +1 -1
  265. package/plugin/scripts/session-start.mjs +95 -15
  266. package/plugin/scripts/session-start.mjs.map +1 -1
  267. package/plugin/scripts/stop.mjs +75 -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 +32 -10
  272. package/plugin/scripts/subagent-stop.mjs.map +1 -1
  273. package/plugin/scripts/task-completed.mjs +21 -6
  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 +8 -7
  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 +8 -4
  280. package/plugin/skills/agentmemory-architecture/TROUBLESHOOTING.md +70 -0
  281. package/plugin/skills/agentmemory-config/REFERENCE.md +13 -15
  282. package/plugin/skills/agentmemory-config/SKILL.md +34 -10
  283. package/plugin/skills/agentmemory-config/TROUBLESHOOTING.md +70 -0
  284. package/plugin/skills/agentmemory-hooks/SKILL.md +31 -10
  285. package/plugin/skills/agentmemory-hooks/TROUBLESHOOTING.md +70 -0
  286. package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +5 -5
  287. package/plugin/skills/agentmemory-mcp-tools/SKILL.md +16 -3
  288. package/plugin/skills/agentmemory-mcp-tools/TROUBLESHOOTING.md +70 -0
  289. package/plugin/skills/agentmemory-rest-api/REFERENCE.md +10 -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
  332. package/plugin/scripts/post-commit.mjs +0 -184
  333. package/plugin/scripts/post-commit.mjs.map +0 -1
  334. /package/plugin/scripts/{post-commit.d.mts → cursor/run-detached.d.mts} +0 -0
@@ -0,0 +1,704 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { execSync, spawnSync } from "node:child_process";
4
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync } from "node:fs";
5
+ import { basename, dirname, join, resolve } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { homedir, tmpdir } from "node:os";
8
+ //#region src/hooks/_project.ts
9
+ function resolveProject(cwd) {
10
+ const explicit = process.env["AGENTMEMORY_PROJECT_NAME"];
11
+ if (explicit && explicit.trim()) return explicit.trim();
12
+ const dir = cwd && cwd.trim() ? cwd : process.cwd();
13
+ try {
14
+ const [top, gitDir, commonDir] = execSync("git rev-parse --show-toplevel --git-dir --git-common-dir", {
15
+ cwd: dir,
16
+ stdio: [
17
+ "ignore",
18
+ "pipe",
19
+ "ignore"
20
+ ],
21
+ timeout: 500
22
+ }).toString().trim().split(/\r?\n/);
23
+ if (top) return basename(repositoryRoot(dir, top, gitDir, commonDir));
24
+ } catch {}
25
+ return basename(dir);
26
+ }
27
+ function repositoryRoot(dir, top, gitDir, commonDir) {
28
+ if (!gitDir || !commonDir) return top;
29
+ const physical = realpathSync(dir);
30
+ const common = resolve(physical, commonDir);
31
+ if (resolve(physical, gitDir) === common || basename(common) !== ".git") return top;
32
+ return dirname(common);
33
+ }
34
+ //#endregion
35
+ //#region src/hooks/cursor/cursor-db.ts
36
+ /**
37
+ * Exact session -> workspace lookup from Cursor's own SQLite storage.
38
+ *
39
+ * Everything else in the resolver infers the workspace: from payload fields
40
+ * Cursor may or may not send, from paths that happen to appear in tool
41
+ * arguments, from a transcript directory name whose path separators have been
42
+ * flattened into hyphens. Those work, but they are inference, and inference
43
+ * that lands on the wrong project writes a user's memories into the wrong
44
+ * place without ever reporting an error.
45
+ *
46
+ * Cursor knows the answer exactly, and stores it. The layout (reverse
47
+ * engineered; see integrations/cursor/README.md for the full picture):
48
+ *
49
+ * <userdir>/globalStorage/state.vscdb
50
+ * ItemTable["composer.composerHeaders"]
51
+ * -> { allComposers: [ { composerId, workspaceIdentifier: {
52
+ * id, uri: { fsPath, ... } } } ] }
53
+ *
54
+ * A Cursor hook's `session_id` is the `composerId`, so one indexed lookup
55
+ * gives the workspace path with no guessing.
56
+ *
57
+ * Two things stop this from being the only strategy:
58
+ *
59
+ * - Cursor 3.0 (April 2026) moved this index from per-workspace databases
60
+ * into the global one, and the migration is lazy: a workspace migrates
61
+ * when it is next opened. Machines still on <=2.6, or with workspaces not
62
+ * opened since the upgrade, keep the old per-workspace `allComposers`
63
+ * array instead. Both shapes are handled below.
64
+ * - Reading SQLite needs a driver. `node:sqlite` only exists from Node 22.5,
65
+ * and this package supports Node >=20. better-sqlite3 is an optional
66
+ * dependency of the daemon, not something a hook can count on.
67
+ *
68
+ * So every failure path here returns null and the caller falls back to
69
+ * inference. This module is an accuracy upgrade, never a requirement.
70
+ */
71
+ const require = createRequire(import.meta.url);
72
+ let driverCache;
73
+ let warningFilterInstalled = false;
74
+ function suppressSqliteExperimentalWarning() {
75
+ if (warningFilterInstalled) return;
76
+ warningFilterInstalled = true;
77
+ const previous = process.listeners("warning");
78
+ process.removeAllListeners("warning");
79
+ process.on("warning", (warning) => {
80
+ if (warning.name === "ExperimentalWarning" && /sqlite/i.test(warning.message)) return;
81
+ for (const listener of previous) listener(warning);
82
+ });
83
+ }
84
+ function requireQuietly(id) {
85
+ suppressSqliteExperimentalWarning();
86
+ try {
87
+ return require(id);
88
+ } catch {
89
+ return null;
90
+ }
91
+ }
92
+ function loadDriver() {
93
+ if (driverCache !== void 0) return driverCache;
94
+ const nodeSqlite = requireQuietly("node:sqlite");
95
+ if (nodeSqlite?.DatabaseSync) {
96
+ driverCache = { open: (path) => new nodeSqlite.DatabaseSync(path, { readOnly: true }) };
97
+ return driverCache;
98
+ }
99
+ const better = requireQuietly("better-sqlite3");
100
+ if (better) {
101
+ driverCache = { open: (path) => new better(path, {
102
+ readonly: true,
103
+ fileMustExist: true
104
+ }) };
105
+ return driverCache;
106
+ }
107
+ driverCache = null;
108
+ return driverCache;
109
+ }
110
+ /** Read one ItemTable value. Returns null for any failure, including a locked DB. */
111
+ function readItemTableValue(dbPath, key) {
112
+ if (!existsSync(dbPath)) return null;
113
+ const driver = loadDriver();
114
+ if (!driver) return null;
115
+ let db = null;
116
+ try {
117
+ db = driver.open(dbPath);
118
+ const value = db.prepare("SELECT value FROM ItemTable WHERE key = ?").get(key)?.value;
119
+ if (typeof value === "string") return value;
120
+ if (value instanceof Uint8Array) return Buffer.from(value).toString("utf-8");
121
+ return null;
122
+ } catch {
123
+ return null;
124
+ } finally {
125
+ try {
126
+ db?.close();
127
+ } catch {}
128
+ }
129
+ }
130
+ function cursorStorageRoots() {
131
+ const home = homedir();
132
+ const bases = [];
133
+ if (process.platform === "win32") {
134
+ const appData = process.env["APPDATA"];
135
+ if (appData) bases.push(join(appData, "Cursor", "User"));
136
+ bases.push(join(home, "AppData", "Roaming", "Cursor", "User"));
137
+ } else if (process.platform === "darwin") bases.push(join(home, "Library", "Application Support", "Cursor", "User"));
138
+ else {
139
+ const configHome = process.env["XDG_CONFIG_HOME"];
140
+ if (configHome) bases.push(join(configHome, "Cursor", "User"));
141
+ bases.push(join(home, ".config", "Cursor", "User"));
142
+ }
143
+ for (const base of bases) {
144
+ const globalStorage = join(base, "globalStorage");
145
+ if (existsSync(globalStorage)) return {
146
+ globalStorage,
147
+ workspaceStorage: join(base, "workspaceStorage")
148
+ };
149
+ }
150
+ return null;
151
+ }
152
+ function fsPathFromHeader(header) {
153
+ const uri = header?.workspaceIdentifier?.uri;
154
+ const value = uri?.fsPath ?? uri?.path;
155
+ return typeof value === "string" && value.trim() ? value : null;
156
+ }
157
+ /** Cursor 3.0+: one central index in the global database. */
158
+ function fromGlobalIndex(sessionId, roots) {
159
+ const raw = readItemTableValue(join(roots.globalStorage, "state.vscdb"), "composer.composerHeaders");
160
+ if (!raw) return null;
161
+ try {
162
+ const hit = JSON.parse(raw).allComposers?.find((c) => c?.composerId === sessionId);
163
+ return fsPathFromHeader(hit);
164
+ } catch {
165
+ return null;
166
+ }
167
+ }
168
+ /** `{"folder":"file:///d%3A/repo"}`, or a vscode-remote:// URI we cannot map. */
169
+ function folderFromWorkspaceJson(workspaceDir) {
170
+ const file = join(workspaceDir, "workspace.json");
171
+ if (!existsSync(file)) return null;
172
+ try {
173
+ const folder = JSON.parse(readFileSync(file, "utf-8")).folder;
174
+ if (typeof folder !== "string" || !folder.startsWith("file://")) return null;
175
+ return fileURLToPath(folder);
176
+ } catch {
177
+ return null;
178
+ }
179
+ }
180
+ const LEGACY_SCAN_LIMIT = 40;
181
+ function fromLegacyWorkspaceDbs(sessionId, roots) {
182
+ if (!existsSync(roots.workspaceStorage)) return null;
183
+ let dirs;
184
+ try {
185
+ dirs = readdirSync(roots.workspaceStorage).map((dir) => {
186
+ try {
187
+ return {
188
+ dir,
189
+ mtime: statSync(join(roots.workspaceStorage, dir, "state.vscdb")).mtimeMs
190
+ };
191
+ } catch {
192
+ return null;
193
+ }
194
+ }).filter((x) => x !== null).sort((a, b) => b.mtime - a.mtime).slice(0, LEGACY_SCAN_LIMIT);
195
+ } catch {
196
+ return null;
197
+ }
198
+ for (const { dir } of dirs) {
199
+ const raw = readItemTableValue(join(roots.workspaceStorage, dir, "state.vscdb"), "composer.composerData");
200
+ if (!raw) continue;
201
+ try {
202
+ const parsed = JSON.parse(raw);
203
+ if (!Array.isArray(parsed.allComposers)) continue;
204
+ if (!parsed.allComposers.some((c) => c?.composerId === sessionId)) continue;
205
+ return folderFromWorkspaceJson(join(roots.workspaceStorage, dir));
206
+ } catch {
207
+ continue;
208
+ }
209
+ }
210
+ return null;
211
+ }
212
+ /**
213
+ * The workspace directory Cursor recorded for this session, or null when it
214
+ * cannot be determined (no driver, no storage, workspace-less window, or a
215
+ * remote URI that does not map to a local path).
216
+ */
217
+ function workspaceFromCursorDb(sessionId) {
218
+ if (!sessionId) return null;
219
+ const roots = cursorStorageRoots();
220
+ if (!roots) return null;
221
+ return fromGlobalIndex(sessionId, roots) ?? fromLegacyWorkspaceDbs(sessionId, roots);
222
+ }
223
+ //#endregion
224
+ //#region src/hooks/cursor/workspace.ts
225
+ const HOME = homedir();
226
+ const CURSOR_PROJECTS_DIR = join(HOME, ".cursor", "projects");
227
+ const SESSION_CACHE_PATH = join(HOME, ".cursor", "hooks", ".agentmemory-session-cache.json");
228
+ join(HOME, ".cursor", "hooks", ".am-hook-payloads");
229
+ const SESSION_CACHE_MAX_AGE_MS = 10080 * 60 * 1e3;
230
+ const SESSION_CACHE_MAX_ENTRIES = 200;
231
+ function normalizePathSlashes(value) {
232
+ return String(value).replace(/\\/g, "/");
233
+ }
234
+ function isCursorMetadataPath(value) {
235
+ if (!value || typeof value !== "string") return false;
236
+ const trimmed = normalizePathSlashes(value.trim());
237
+ if (trimmed === ".cursor") return true;
238
+ if (/(^|\/)\.cursor\/worktrees\/[^/]/.test(trimmed)) return false;
239
+ return /(^|\/)\.cursor(\/|$)/.test(trimmed);
240
+ }
241
+ function pathUnderHome(value) {
242
+ if (typeof value !== "string") return false;
243
+ const homeNorm = normalizePathSlashes(HOME);
244
+ const valueNorm = normalizePathSlashes(value);
245
+ return valueNorm === homeNorm || valueNorm.startsWith(`${homeNorm}/`);
246
+ }
247
+ function isIdeInstallPath(value) {
248
+ if (!value || typeof value !== "string") return false;
249
+ const norm = normalizePathSlashes(value).toLowerCase();
250
+ return /(^|[\\/])(programs|program files|program files \(x86\))[\\/]cursor([\\/]|$)/i.test(norm) || /cursor\.app[\\/]contents/i.test(norm) || /(^|[\\/])microsoft vs code[\\/]resources[\\/]app([\\/]|$)/i.test(norm);
251
+ }
252
+ function isBadPath(value) {
253
+ if (!value || typeof value !== "string") return true;
254
+ const trimmed = normalizePathSlashes(value.trim());
255
+ if (!trimmed || trimmed === "/" || trimmed === ".") return true;
256
+ if (/^[a-zA-Z]:\/?$/.test(trimmed)) return true;
257
+ if (isCursorMetadataPath(trimmed)) return true;
258
+ if (isIdeInstallPath(trimmed)) return true;
259
+ return false;
260
+ }
261
+ function sleepMs(ms) {
262
+ const end = Date.now() + ms;
263
+ while (Date.now() < end);
264
+ }
265
+ function withSessionCacheLock(fn) {
266
+ const lockPath = `${SESSION_CACHE_PATH}.lock`;
267
+ mkdirSync(dirname(SESSION_CACHE_PATH), { recursive: true });
268
+ let fd;
269
+ for (let i = 0; i < 50; i++) try {
270
+ fd = openSync(lockPath, "wx");
271
+ break;
272
+ } catch {
273
+ sleepMs(10);
274
+ }
275
+ if (fd === void 0) return void 0;
276
+ try {
277
+ return fn();
278
+ } finally {
279
+ closeSync(fd);
280
+ try {
281
+ unlinkSync(lockPath);
282
+ } catch {}
283
+ }
284
+ }
285
+ function loadSessionCache() {
286
+ try {
287
+ const value = JSON.parse(readFileSync(SESSION_CACHE_PATH, "utf-8"));
288
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
289
+ } catch {
290
+ return {};
291
+ }
292
+ }
293
+ function pruneSessionCache(cache, now) {
294
+ const fresh = Object.entries(cache).filter(([, entry]) => {
295
+ const updated = Date.parse(entry?.updatedAt ?? "");
296
+ return typeof entry?.project === "string" && typeof entry?.cwd === "string" && Number.isFinite(updated) && now - updated < SESSION_CACHE_MAX_AGE_MS;
297
+ });
298
+ fresh.sort((a, b) => Date.parse(b[1].updatedAt) - Date.parse(a[1].updatedAt));
299
+ return Object.fromEntries(fresh.slice(0, SESSION_CACHE_MAX_ENTRIES));
300
+ }
301
+ function rememberSession(sessionId, project, cwd) {
302
+ if (!sessionId || !project || project === ".cursor") return;
303
+ withSessionCacheLock(() => {
304
+ try {
305
+ const now = Date.now();
306
+ const previous = loadSessionCache();
307
+ delete previous[sessionId];
308
+ const cache = pruneSessionCache({
309
+ [sessionId]: {
310
+ project,
311
+ cwd,
312
+ updatedAt: new Date(now).toISOString()
313
+ },
314
+ ...previous
315
+ }, now);
316
+ const tmp = `${SESSION_CACHE_PATH}.${process.pid}.${Date.now()}.tmp`;
317
+ writeFileSync(tmp, JSON.stringify(cache, null, 2));
318
+ renameSync(tmp, SESSION_CACHE_PATH);
319
+ } catch {}
320
+ });
321
+ }
322
+ function recallSession(sessionId) {
323
+ if (!sessionId) return null;
324
+ const cache = pruneSessionCache(loadSessionCache(), Date.now());
325
+ return Object.hasOwn(cache, sessionId) ? cache[sessionId] : null;
326
+ }
327
+ const SYSTEM_PATH_PREFIXES = [
328
+ "/usr/",
329
+ "/etc/",
330
+ "/bin/",
331
+ "/sbin/",
332
+ "/lib/",
333
+ "/lib64/",
334
+ "/opt/",
335
+ "/var/",
336
+ "/proc/",
337
+ "/sys/",
338
+ "/dev/",
339
+ "/run/",
340
+ "/boot/",
341
+ "/snap/",
342
+ "/nix/"
343
+ ];
344
+ function isSystemPath(value) {
345
+ const norm = normalizePathSlashes(value);
346
+ const temp = normalizePathSlashes(tmpdir()).replace(/\/$/, "");
347
+ if (norm.startsWith(`${temp}/`)) return false;
348
+ return SYSTEM_PATH_PREFIXES.some((prefix) => norm.startsWith(prefix));
349
+ }
350
+ function isCollectablePath(value) {
351
+ if (typeof value !== "string" || isCursorMetadataPath(value)) return false;
352
+ if (pathUnderHome(value)) return true;
353
+ if (/^[a-zA-Z]:[\\/]/.test(value)) return true;
354
+ if (value.startsWith("/")) return !isSystemPath(value);
355
+ return false;
356
+ }
357
+ function collectPathStrings(value, out = []) {
358
+ if (typeof value === "string") {
359
+ if (isCollectablePath(value)) out.push(value);
360
+ return out;
361
+ }
362
+ if (Array.isArray(value)) {
363
+ for (const item of value) collectPathStrings(item, out);
364
+ return out;
365
+ }
366
+ if (value && typeof value === "object") for (const v of Object.values(value)) collectPathStrings(v, out);
367
+ return out;
368
+ }
369
+ function pathExists(pathValue) {
370
+ if (existsSync(pathValue)) return true;
371
+ if (process.platform === "win32") {
372
+ const native = pathValue.replace(/\//g, "\\");
373
+ if (native !== pathValue && existsSync(native)) return true;
374
+ }
375
+ return false;
376
+ }
377
+ const MAX_ANCESTOR_STEPS = 64;
378
+ function existingAncestor(pathValue) {
379
+ let current = pathValue;
380
+ for (let step = 0; step < MAX_ANCESTOR_STEPS; step++) {
381
+ if (!current || current === HOME || current === "/") return null;
382
+ if (pathExists(current)) {
383
+ const resolved = process.platform === "win32" ? current.replace(/\//g, "\\") : current;
384
+ try {
385
+ if (statSync(resolved).isFile()) return dirname(resolved);
386
+ } catch {}
387
+ return resolved;
388
+ }
389
+ const parent = dirname(current);
390
+ if (parent === current) return null;
391
+ current = parent;
392
+ }
393
+ return null;
394
+ }
395
+ function gitRootFromPath(targetPath) {
396
+ return execSync("git rev-parse --show-toplevel", {
397
+ cwd: targetPath,
398
+ encoding: "utf-8",
399
+ stdio: [
400
+ "ignore",
401
+ "pipe",
402
+ "ignore"
403
+ ],
404
+ timeout: 500
405
+ }).trim();
406
+ }
407
+ function gitRootNearby(startPath) {
408
+ let current = startPath;
409
+ for (let step = 0; step < MAX_ANCESTOR_STEPS; step++) {
410
+ if (!current || current === "/") return null;
411
+ if (pathExists(join(current, ".git"))) return current;
412
+ const parent = dirname(current);
413
+ if (parent === current) return null;
414
+ current = parent;
415
+ }
416
+ return null;
417
+ }
418
+ function projectFromPath(targetPath) {
419
+ try {
420
+ return {
421
+ name: resolveProject(gitRootFromPath(targetPath)),
422
+ fromGitRoot: true
423
+ };
424
+ } catch {
425
+ return {
426
+ name: resolveProject(targetPath),
427
+ fromGitRoot: false
428
+ };
429
+ }
430
+ }
431
+ function decodeSlugCandidates(slug) {
432
+ if (!slug || slug === "empty-window") return [];
433
+ if (/^\d{10,}$/.test(slug)) return [];
434
+ const parts = slug.split("-");
435
+ if (!parts.length) return [];
436
+ const results = /* @__PURE__ */ new Set();
437
+ function walk(index, currentPath) {
438
+ if (index >= parts.length) {
439
+ results.add(currentPath);
440
+ return;
441
+ }
442
+ for (let take = 1; index + take <= parts.length; take++) {
443
+ const next = `${currentPath}/${parts.slice(index, index + take).join("-")}`;
444
+ if (!pathExists(next)) continue;
445
+ walk(index + take, next);
446
+ }
447
+ }
448
+ const first = parts[0];
449
+ if (first && /^[a-zA-Z]$/.test(first)) walk(1, `${first.toUpperCase()}:`);
450
+ walk(0, "");
451
+ return [...results];
452
+ }
453
+ function pickBestCandidate(candidates, preferredLabel) {
454
+ if (!candidates.length) return null;
455
+ if (preferredLabel) {
456
+ const labelMatch = candidates.find((p) => basename(p) === preferredLabel);
457
+ if (labelMatch) return labelMatch;
458
+ }
459
+ const gitRoots = [];
460
+ for (const candidate of candidates) try {
461
+ gitRoots.push(gitRootFromPath(candidate));
462
+ } catch {}
463
+ const uniqueGitRoots = [...new Set(gitRoots)];
464
+ if (uniqueGitRoots.length === 1) return uniqueGitRoots[0] ?? null;
465
+ return candidates.sort((a, b) => b.length - a.length)[0] ?? null;
466
+ }
467
+ function findSessionTranscript(sessionId) {
468
+ if (!sessionId || !existsSync(CURSOR_PROJECTS_DIR)) return null;
469
+ for (const slug of readdirSync(CURSOR_PROJECTS_DIR)) {
470
+ const transcriptsRoot = join(CURSOR_PROJECTS_DIR, slug, "agent-transcripts");
471
+ if (!existsSync(transcriptsRoot)) continue;
472
+ for (const entry of readdirSync(transcriptsRoot)) if (entry === sessionId || entry.startsWith(`${sessionId}-`)) {
473
+ const transcriptFile = join(transcriptsRoot, entry, `${entry}.jsonl`);
474
+ return {
475
+ slug,
476
+ transcriptFile: existsSync(transcriptFile) ? transcriptFile : null
477
+ };
478
+ }
479
+ }
480
+ return null;
481
+ }
482
+ const TRANSCRIPT_SCAN_BYTES = 25e4;
483
+ const TRANSCRIPT_CANDIDATE_LIMIT = 120;
484
+ const TRANSCRIPT_MATCH_LIMIT = 4e3;
485
+ const TRANSCRIPT_MIN_VOTES = 3;
486
+ const TRANSCRIPT_PATH_PATTERNS = [/[a-zA-Z]:[A-Za-z0-9._@+\-/]{3,240}/g, /\/[A-Za-z0-9._@+\-/]{3,240}/g];
487
+ function workspaceFromTranscriptFile(transcriptFile) {
488
+ if (!transcriptFile || !existsSync(transcriptFile)) return null;
489
+ let chunk;
490
+ const fd = openSync(transcriptFile, "r");
491
+ try {
492
+ const buffer = Buffer.alloc(TRANSCRIPT_SCAN_BYTES);
493
+ const bytes = readSync(fd, buffer, 0, buffer.length, 0);
494
+ chunk = normalizePathSlashes(buffer.subarray(0, bytes).toString("utf8"));
495
+ } finally {
496
+ closeSync(fd);
497
+ }
498
+ const counts = /* @__PURE__ */ new Map();
499
+ const seen = /* @__PURE__ */ new Set();
500
+ for (const pattern of TRANSCRIPT_PATH_PATTERNS) {
501
+ pattern.lastIndex = 0;
502
+ let match;
503
+ let scanned = 0;
504
+ while ((match = pattern.exec(chunk)) !== null) {
505
+ if (++scanned > TRANSCRIPT_MATCH_LIMIT) break;
506
+ if (seen.size >= TRANSCRIPT_CANDIDATE_LIMIT) break;
507
+ const value = match[0];
508
+ if (seen.has(value)) continue;
509
+ seen.add(value);
510
+ if (value.startsWith("//")) continue;
511
+ if (isCursorMetadataPath(value) || isIdeInstallPath(value) || isSystemPath(value)) continue;
512
+ const existing = existingDirectory(value);
513
+ if (!existing || existing === HOME || isBadPath(existing)) continue;
514
+ const root = gitRootNearby(existing);
515
+ if (!root || root === HOME || isBadPath(root)) continue;
516
+ counts.set(root, (counts.get(root) || 0) + 1);
517
+ }
518
+ }
519
+ let best = null;
520
+ let bestCount = 0;
521
+ for (const [pathValue, count] of counts) if (count > bestCount) {
522
+ best = pathValue;
523
+ bestCount = count;
524
+ }
525
+ return bestCount >= TRANSCRIPT_MIN_VOTES ? best : null;
526
+ }
527
+ function workspaceFromSessionId(sessionId) {
528
+ const hit = findSessionTranscript(sessionId);
529
+ if (!hit) return null;
530
+ const preferredLabel = process.env["CURSOR_WORKSPACE_LABEL"] || "";
531
+ const fromSlug = pickBestCandidate(decodeSlugCandidates(hit.slug), preferredLabel);
532
+ if (fromSlug) return fromSlug;
533
+ return workspaceFromTranscriptFile(hit.transcriptFile);
534
+ }
535
+ function isMetadataProject(project) {
536
+ return project.name.startsWith(".") && !project.fromGitRoot;
537
+ }
538
+ function isHomeDirectory(pathValue) {
539
+ return normalizePathSlashes(pathValue) === normalizePathSlashes(HOME);
540
+ }
541
+ function existingDirectory(pathValue) {
542
+ if (!pathExists(pathValue)) return null;
543
+ const resolved = process.platform === "win32" ? pathValue.replace(/\//g, "\\") : pathValue;
544
+ try {
545
+ return statSync(resolved).isFile() ? dirname(resolved) : resolved;
546
+ } catch {
547
+ return null;
548
+ }
549
+ }
550
+ function resolveFromPathCandidates(candidates, sessionId, options = {}) {
551
+ for (const candidate of candidates) {
552
+ if (typeof candidate !== "string" || isBadPath(candidate)) continue;
553
+ const existing = options.exact ? existingDirectory(candidate) : existingAncestor(candidate);
554
+ if (!existing || isBadPath(existing)) continue;
555
+ const project = projectFromPath(existing);
556
+ if (isHomeDirectory(existing) && !project.fromGitRoot) continue;
557
+ if (!isMetadataProject(project)) {
558
+ if (options.remember !== false) rememberSession(sessionId, project.name, existing);
559
+ return {
560
+ project: project.name,
561
+ cwd: existing
562
+ };
563
+ }
564
+ }
565
+ return null;
566
+ }
567
+ function debugLayer(layer, result) {
568
+ if (result && process.env["AM_CURSOR_DEBUG"] === "1") console.error(`[agentmemory] workspace resolved by ${layer}: ${result.project} (${result.cwd})`);
569
+ return result;
570
+ }
571
+ function resolveWorkspace(data) {
572
+ const sessionId = [
573
+ data?.["session_id"],
574
+ data?.["sessionId"],
575
+ data?.["conversation_id"]
576
+ ].find((value) => typeof value === "string" && Boolean(value.trim()));
577
+ const cached = recallSession(sessionId);
578
+ if (cached?.cwd && !isBadPath(cached.cwd) && existingDirectory(cached.cwd)) return {
579
+ project: resolveProject(cached.cwd),
580
+ cwd: cached.cwd
581
+ };
582
+ const fromPayload = debugLayer("payload", resolveFromPathCandidates([
583
+ ...Array.isArray(data?.["workspace_roots"]) ? data["workspace_roots"] : [],
584
+ ...Array.isArray(data?.["workspace_folders"]) ? data["workspace_folders"] : [],
585
+ data?.["workspace_folder"],
586
+ data?.["workspaceFolder"],
587
+ data?.["workspace"],
588
+ data?.["cwd"],
589
+ data?.["root_path"],
590
+ data?.["project_path"]
591
+ ], sessionId));
592
+ if (fromPayload) return fromPayload;
593
+ const fromTools = debugLayer("tool_input", resolveFromPathCandidates(collectPathStrings(data?.["tool_input"] ?? data?.["toolArgs"]).map(existingDirectory).filter((p) => Boolean(p) && !isIdeInstallPath(p)), sessionId));
594
+ if (fromTools) return fromTools;
595
+ if (sessionId) {
596
+ const fromDb = debugLayer("cursor-db", resolveFromPathCandidates([workspaceFromCursorDb(sessionId)], sessionId, { exact: true }));
597
+ if (fromDb) return fromDb;
598
+ const fromSession = debugLayer("transcript-dir", resolveFromPathCandidates([workspaceFromSessionId(sessionId)], sessionId, { exact: true }));
599
+ if (fromSession) return fromSession;
600
+ }
601
+ const fromEnv = debugLayer("env", resolveFromPathCandidates([
602
+ process.env["CURSOR_PROJECT_DIR"],
603
+ process.env["CURSOR_WORKSPACE_ROOT"],
604
+ process.env["CURSOR_WORKSPACE_FOLDER"]
605
+ ], sessionId));
606
+ if (fromEnv) return fromEnv;
607
+ const fromLaunch = debugLayer("launch-env", resolveFromPathCandidates([process.env["PWD"], process.env["VSCODE_CWD"]], sessionId, { remember: false }));
608
+ if (fromLaunch) return fromLaunch;
609
+ const label = process.env["CURSOR_WORKSPACE_LABEL"];
610
+ if (label) return {
611
+ project: label,
612
+ cwd: label
613
+ };
614
+ return {
615
+ project: "unknown-project",
616
+ cwd: "unknown-project"
617
+ };
618
+ }
619
+ //#endregion
620
+ //#region src/hooks/cursor/delegate.ts
621
+ const HOOK_MAP = {
622
+ sessionStart: "session-start.mjs",
623
+ beforeSubmitPrompt: "prompt-submit.mjs",
624
+ preToolUse: "pre-tool-use.mjs",
625
+ postToolUse: "post-tool-use.mjs",
626
+ postToolUseFailure: "post-tool-failure.mjs",
627
+ preCompact: "pre-compact.mjs",
628
+ subagentStart: "subagent-start.mjs",
629
+ subagentStop: "subagent-stop.mjs",
630
+ stop: "stop.mjs",
631
+ sessionEnd: "session-end.mjs"
632
+ };
633
+ function isCursorHookKey(value) {
634
+ return typeof value === "string" && Object.hasOwn(HOOK_MAP, value);
635
+ }
636
+ const SLOW_HOOKS = new Set(["stop", "sessionEnd"]);
637
+ function defaultOfficialDir() {
638
+ return join(dirname(fileURLToPath(import.meta.url)), "..");
639
+ }
640
+ function enrichPayload(data) {
641
+ const { project: resolvedProject, cwd } = resolveWorkspace(data);
642
+ const project = process.env["AGENTMEMORY_PROJECT_NAME"]?.trim() || resolvedProject;
643
+ return {
644
+ project,
645
+ payload: {
646
+ ...data,
647
+ session_id: data["session_id"] ?? data["sessionId"] ?? data["conversation_id"],
648
+ cwd,
649
+ project
650
+ }
651
+ };
652
+ }
653
+ function delegateHook(hookKey, data, options = {}) {
654
+ const script = HOOK_MAP[hookKey];
655
+ const scriptPath = join(options.officialDir ?? defaultOfficialDir(), script);
656
+ if (!existsSync(scriptPath)) {
657
+ console.error(`[agentmemory] cursor hook "${hookKey}": canonical hook not found at ${scriptPath}. Run \`npm run build\` in the agentmemory checkout.`);
658
+ return 0;
659
+ }
660
+ const { project, payload } = enrichPayload(data);
661
+ const child = spawnSync(process.execPath, [scriptPath], {
662
+ input: JSON.stringify(payload),
663
+ env: {
664
+ ...process.env,
665
+ AGENTMEMORY_PROJECT_NAME: project
666
+ },
667
+ encoding: "utf-8",
668
+ maxBuffer: 10 * 1024 * 1024,
669
+ timeout: SLOW_HOOKS.has(hookKey) ? 18e4 : 3e4
670
+ });
671
+ if (child.stdout) process.stdout.write(child.stdout);
672
+ if (child.stderr) process.stderr.write(child.stderr);
673
+ if (child.error) {
674
+ console.error(`[agentmemory] cursor hook "${hookKey}" could not run ${script}: ${child.error.message}`);
675
+ return 0;
676
+ }
677
+ if (child.signal) {
678
+ console.error(`[agentmemory] cursor hook "${hookKey}" (${script}) was killed by ${child.signal} -- treating as no-op`);
679
+ return 0;
680
+ }
681
+ return child.status ?? 0;
682
+ }
683
+ //#endregion
684
+ //#region src/hooks/cursor/run-hook.ts
685
+ async function main() {
686
+ const hookKey = process.argv[2];
687
+ if (!isCursorHookKey(hookKey)) process.exit(0);
688
+ let input = "";
689
+ for await (const chunk of process.stdin) input += chunk;
690
+ if (!input.trim()) process.exit(0);
691
+ let data;
692
+ try {
693
+ data = JSON.parse(input);
694
+ } catch {
695
+ process.exit(0);
696
+ }
697
+ if (!data || typeof data !== "object" || Array.isArray(data)) process.exit(0);
698
+ process.exit(delegateHook(hookKey, data));
699
+ }
700
+ main().catch(() => process.exit(0));
701
+ //#endregion
702
+ export {};
703
+
704
+ //# sourceMappingURL=run-hook.mjs.map