hippo-memory 1.68.0 → 1.70.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 (864) hide show
  1. package/README.md +6 -3
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.d.ts +3 -1
  7. package/dist/agent-memories/copilot.js +5 -4
  8. package/dist/agent-memories/files.js +3 -2
  9. package/dist/agent-memories/gemini.js +6 -5
  10. package/dist/agent-memories/keys.js +3 -2
  11. package/dist/agent-memories/legacy.d.ts +2 -2
  12. package/dist/agent-memories/legacy.js +2 -2
  13. package/dist/agent-memories/report.d.ts +1 -1
  14. package/dist/agent-memories/report.js +1 -1
  15. package/dist/agent-memories/source.d.ts +1 -1
  16. package/dist/agent-memories/source.js +6 -5
  17. package/dist/agent-memories/sync.d.ts +1 -1
  18. package/dist/agent-memories/sync.js +24 -33
  19. package/dist/agent-memories/types.d.ts +1 -1
  20. package/dist/api/assemble.d.ts +2 -2
  21. package/dist/api/assemble.js +42 -32
  22. package/dist/api/audit.d.ts +4 -7
  23. package/dist/api/audit.js +6 -20
  24. package/dist/api/auth.d.ts +5 -18
  25. package/dist/api/auth.js +44 -194
  26. package/dist/api/auto-sleep.d.ts +13 -0
  27. package/dist/api/auto-sleep.js +32 -0
  28. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  29. package/dist/{availability.js → api/availability.js} +12 -29
  30. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  31. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  32. package/dist/{context-render.js → api/context-render.js} +7 -6
  33. package/dist/api/context-select.d.ts +14 -4
  34. package/dist/api/context-select.js +50 -60
  35. package/dist/api/context-types.d.ts +5 -5
  36. package/dist/api/context.d.ts +2 -4
  37. package/dist/api/context.js +113 -85
  38. package/dist/api/dormant.d.ts +3 -3
  39. package/dist/api/dormant.js +38 -107
  40. package/dist/api/drill-down.d.ts +2 -2
  41. package/dist/api/drill-down.js +37 -65
  42. package/dist/api/forget.d.ts +4 -13
  43. package/dist/api/forget.js +13 -35
  44. package/dist/api/goals.d.ts +1 -1
  45. package/dist/api/goals.js +2 -2
  46. package/dist/api/index.d.ts +26 -0
  47. package/dist/api/index.js +29 -0
  48. package/dist/api/instruction-detect.js +74 -0
  49. package/dist/api/learn.js +63 -55
  50. package/dist/api/ledger-db.d.ts +20 -0
  51. package/dist/api/ledger-db.js +79 -0
  52. package/dist/api/on-store.d.ts +16 -0
  53. package/dist/api/on-store.js +36 -0
  54. package/dist/api/outcome.d.ts +9 -46
  55. package/dist/api/outcome.js +15 -57
  56. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  57. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  58. package/dist/api/promote.d.ts +7 -18
  59. package/dist/api/promote.js +30 -152
  60. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  61. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  62. package/dist/api/quarantine.d.ts +5 -5
  63. package/dist/api/quarantine.js +30 -106
  64. package/dist/api/recall-core.d.ts +4 -0
  65. package/dist/api/recall-core.js +112 -0
  66. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  67. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  68. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  69. package/dist/api/recall-record.d.ts +10 -13
  70. package/dist/api/recall-record.js +10 -30
  71. package/dist/api/recall-request.d.ts +2 -2
  72. package/dist/api/recall-request.js +3 -3
  73. package/dist/api/recall-types.d.ts +41 -16
  74. package/dist/api/recall.d.ts +1 -1
  75. package/dist/api/recall.js +39 -37
  76. package/dist/api/remember.d.ts +12 -13
  77. package/dist/api/remember.js +38 -27
  78. package/dist/api/session-owners.d.ts +4 -0
  79. package/dist/api/session-owners.js +17 -0
  80. package/dist/api/sleep-run.d.ts +7 -7
  81. package/dist/api/sleep-run.js +63 -75
  82. package/dist/api/sleep.d.ts +1 -1
  83. package/dist/api/tokens.d.ts +2 -2
  84. package/dist/api/tokens.js +9 -21
  85. package/dist/api/types.d.ts +2 -2
  86. package/dist/api/types.js +1 -1
  87. package/dist/capture/caller-session.d.ts +2 -2
  88. package/dist/capture/caller-session.js +8 -8
  89. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  90. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  91. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  92. package/dist/capture/command.d.ts +1 -1
  93. package/dist/capture/command.js +54 -41
  94. package/dist/capture/compact-resume-caller.d.ts +1 -1
  95. package/dist/capture/compact-resume-caller.js +7 -7
  96. package/dist/capture/compact.d.ts +4 -1
  97. package/dist/capture/compact.js +59 -22
  98. package/dist/capture/compaction-items-caller.d.ts +1 -1
  99. package/dist/capture/compaction-items-caller.js +7 -5
  100. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  101. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  102. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  103. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  104. package/dist/capture/copilot-transcript.d.ts +3 -0
  105. package/dist/capture/copilot-transcript.js +9 -2
  106. package/dist/capture/extract.js +2 -2
  107. package/dist/capture/failure-caller.d.ts +2 -2
  108. package/dist/capture/failure-caller.js +6 -6
  109. package/dist/capture/failure-reading.d.ts +2 -5
  110. package/dist/capture/failure-reading.js +11 -12
  111. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  112. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  113. package/dist/capture/pre-compact-caller.d.ts +1 -1
  114. package/dist/capture/pre-compact-caller.js +2 -2
  115. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  116. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  117. package/dist/capture/session-end-caller.d.ts +2 -2
  118. package/dist/capture/session-end-caller.js +1 -1
  119. package/dist/capture/session-texts.d.ts +1 -1
  120. package/dist/capture/session-texts.js +5 -5
  121. package/dist/capture/session-worker.d.ts +13 -0
  122. package/dist/capture/session-worker.js +196 -0
  123. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  124. package/dist/capture/transcript.js +68 -74
  125. package/dist/capture/working-state.d.ts +0 -3
  126. package/dist/capture/working-state.js +7 -7
  127. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  128. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  129. package/dist/cli/audit.d.ts +2 -2
  130. package/dist/cli/audit.js +77 -72
  131. package/dist/cli/auth.d.ts +2 -1
  132. package/dist/cli/auth.js +18 -20
  133. package/dist/cli/briefs.d.ts +4 -3
  134. package/dist/cli/briefs.js +59 -181
  135. package/dist/cli/card.d.ts +2 -1
  136. package/dist/cli/card.js +25 -23
  137. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  138. package/dist/{client.js → cli/client.js} +1 -1
  139. package/dist/cli/compact-resume-payload.d.ts +8 -0
  140. package/dist/cli/compact-resume-payload.js +39 -0
  141. package/dist/cli/context.d.ts +2 -13
  142. package/dist/cli/context.js +41 -71
  143. package/dist/cli/continuity.d.ts +6 -5
  144. package/dist/cli/continuity.js +109 -99
  145. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  146. package/dist/cli/curate.d.ts +9 -9
  147. package/dist/cli/curate.js +177 -149
  148. package/dist/cli/dag.d.ts +4 -4
  149. package/dist/cli/dag.js +46 -34
  150. package/dist/cli/decisions.d.ts +4 -3
  151. package/dist/cli/decisions.js +108 -218
  152. package/dist/cli/eval.d.ts +1 -3
  153. package/dist/cli/eval.js +43 -31
  154. package/dist/cli/explain.d.ts +1 -1
  155. package/dist/cli/explain.js +35 -19
  156. package/dist/cli/flag-values.d.ts +25 -0
  157. package/dist/cli/flag-values.js +103 -0
  158. package/dist/cli/flags.d.ts +303 -0
  159. package/dist/cli/flags.js +169 -0
  160. package/dist/cli/goals.d.ts +2 -1
  161. package/dist/cli/goals.js +39 -34
  162. package/dist/cli/hook-runtime.d.ts +49 -0
  163. package/dist/cli/hook-runtime.js +155 -0
  164. package/dist/cli/init.d.ts +2 -1
  165. package/dist/cli/init.js +151 -118
  166. package/dist/cli/install-steps.d.ts +7 -0
  167. package/dist/cli/install-steps.js +110 -0
  168. package/dist/cli/last-sleep.d.ts +2 -1
  169. package/dist/cli/last-sleep.js +9 -7
  170. package/dist/cli/maintenance.d.ts +5 -4
  171. package/dist/cli/maintenance.js +31 -27
  172. package/dist/cli/object-verbs.d.ts +40 -0
  173. package/dist/cli/object-verbs.js +65 -0
  174. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  175. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  176. package/dist/cli/playbooks.d.ts +4 -3
  177. package/dist/cli/playbooks.js +77 -280
  178. package/dist/cli/print.d.ts +18 -0
  179. package/dist/cli/print.js +85 -0
  180. package/dist/cli/projects.d.ts +2 -3
  181. package/dist/cli/projects.js +56 -49
  182. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  183. package/dist/cli/quality-repair-once.js +4 -4
  184. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  185. package/dist/cli/recall.d.ts +2 -4
  186. package/dist/cli/recall.js +101 -150
  187. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  188. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  189. package/dist/cli/remember.d.ts +1 -3
  190. package/dist/cli/remember.js +124 -103
  191. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  192. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  193. package/dist/cli/serve.d.ts +1 -1
  194. package/dist/cli/serve.js +34 -4
  195. package/dist/cli/session-hooks.d.ts +4 -4
  196. package/dist/cli/session-hooks.js +265 -191
  197. package/dist/cli/setup.d.ts +2 -1
  198. package/dist/cli/setup.js +111 -45
  199. package/dist/cli/shared.d.ts +5 -95
  200. package/dist/cli/shared.js +18 -369
  201. package/dist/cli/slack.d.ts +2 -1
  202. package/dist/cli/slack.js +31 -55
  203. package/dist/cli/sleep-render.d.ts +4 -0
  204. package/dist/cli/sleep-render.js +61 -0
  205. package/dist/cli/sleep.d.ts +2 -8
  206. package/dist/cli/sleep.js +20 -76
  207. package/dist/cli/status.d.ts +3 -3
  208. package/dist/cli/status.js +39 -41
  209. package/dist/{stdin.js → cli/stdin.js} +6 -6
  210. package/dist/cli/transfer.d.ts +4 -4
  211. package/dist/cli/transfer.js +68 -42
  212. package/dist/cli/usage.js +8 -3
  213. package/dist/cli.d.ts +289 -5
  214. package/dist/cli.js +184 -117
  215. package/dist/connectors/dlq.d.ts +44 -0
  216. package/dist/connectors/dlq.js +30 -0
  217. package/dist/connectors/github/backfill.d.ts +1 -1
  218. package/dist/connectors/github/backfill.js +29 -66
  219. package/dist/connectors/github/cli-impl.js +59 -74
  220. package/dist/connectors/github/deletion.d.ts +5 -6
  221. package/dist/connectors/github/deletion.js +18 -52
  222. package/dist/connectors/github/dlq.d.ts +7 -61
  223. package/dist/connectors/github/dlq.js +19 -119
  224. package/dist/connectors/github/ingest.d.ts +2 -31
  225. package/dist/connectors/github/ingest.js +20 -82
  226. package/dist/connectors/github/octokit-client.d.ts +1 -1
  227. package/dist/connectors/github/octokit-client.js +2 -1
  228. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  229. package/dist/connectors/github/tenant-routing.js +10 -36
  230. package/dist/connectors/github/transform.d.ts +1 -1
  231. package/dist/connectors/github/types.d.ts +1 -1
  232. package/dist/connectors/github/types.js +15 -18
  233. package/dist/connectors/github/webhook.d.ts +3 -2
  234. package/dist/connectors/github/webhook.js +84 -87
  235. package/dist/connectors/slack/backfill.d.ts +1 -1
  236. package/dist/connectors/slack/backfill.js +5 -29
  237. package/dist/connectors/slack/deletion.d.ts +4 -7
  238. package/dist/connectors/slack/deletion.js +20 -48
  239. package/dist/connectors/slack/dlq.d.ts +7 -49
  240. package/dist/connectors/slack/dlq.js +25 -118
  241. package/dist/connectors/slack/ingest.d.ts +5 -18
  242. package/dist/connectors/slack/ingest.js +27 -90
  243. package/dist/connectors/slack/signature.js +2 -1
  244. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  245. package/dist/connectors/slack/tenant-routing.js +13 -14
  246. package/dist/connectors/slack/transform.d.ts +1 -1
  247. package/dist/connectors/slack/types.d.ts +1 -1
  248. package/dist/connectors/slack/types.js +3 -12
  249. package/dist/connectors/slack/web-client.js +2 -2
  250. package/dist/connectors/slack/webhook.d.ts +3 -2
  251. package/dist/connectors/slack/webhook.js +75 -82
  252. package/dist/connectors/slack/workspaces.d.ts +4 -17
  253. package/dist/connectors/slack/workspaces.js +4 -34
  254. package/dist/consolidate/conflicts.d.ts +1 -1
  255. package/dist/consolidate/conflicts.js +4 -4
  256. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  257. package/dist/{dag.js → consolidate/dag.js} +60 -81
  258. package/dist/consolidate/decay.d.ts +2 -2
  259. package/dist/consolidate/decay.js +28 -22
  260. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  261. package/dist/consolidate/flush-units.d.ts +2 -2
  262. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  263. package/dist/consolidate/half-life-migration.js +106 -0
  264. package/dist/consolidate/llm-passes.js +8 -8
  265. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  266. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  267. package/dist/consolidate/merge.js +57 -54
  268. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  269. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  270. package/dist/consolidate/physics-pass.js +46 -46
  271. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  272. package/dist/{replay.js → consolidate/replay.js} +2 -2
  273. package/dist/consolidate/run.d.ts +7 -13
  274. package/dist/consolidate/run.js +6 -37
  275. package/dist/consolidate/sleep.d.ts +1 -1
  276. package/dist/consolidate/sleep.js +64 -134
  277. package/dist/{trace.js → consolidate/trace.js} +4 -6
  278. package/dist/consolidate/traces.js +34 -29
  279. package/dist/{ablation.js → core/ablation.js} +1 -1
  280. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  281. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  282. package/dist/{ambient.js → core/ambient.js} +12 -10
  283. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  284. package/dist/core/capture-contract.js +149 -0
  285. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  286. package/dist/{compare.js → core/compare.js} +10 -3
  287. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  288. package/dist/{config.js → core/config.js} +99 -72
  289. package/dist/core/handoff.js +87 -0
  290. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  291. package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
  292. package/dist/{memory.js → core/memory.js} +117 -82
  293. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  294. package/dist/{physics.js → core/physics.js} +2 -1
  295. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  296. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  297. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  298. package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
  299. package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
  300. package/dist/{salience.js → core/salience.js} +35 -20
  301. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  302. package/dist/{search/types.js → core/search-types.js} +1 -1
  303. package/dist/core/session-digest-row.d.ts +5 -0
  304. package/dist/core/session-digest-row.js +6 -0
  305. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  306. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  307. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  308. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  309. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  310. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  311. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  312. package/dist/db/backup.js +1 -1
  313. package/dist/db/busy.d.ts +18 -1
  314. package/dist/db/busy.js +74 -9
  315. package/dist/db/connect.d.ts +10 -2
  316. package/dist/db/connect.js +43 -10
  317. package/dist/db/index.d.ts +9 -0
  318. package/dist/db/index.js +8 -0
  319. package/dist/db/meta.d.ts +4 -0
  320. package/dist/db/meta.js +11 -1
  321. package/dist/db/migrate.d.ts +8 -1
  322. package/dist/db/migrate.js +25 -30
  323. package/dist/db/migrations/v08.js +1 -1
  324. package/dist/db/migrations/v14.js +39 -35
  325. package/dist/db/migrations/v16.js +29 -26
  326. package/dist/db/migrations/v18.js +6 -5
  327. package/dist/db/migrations/v20.js +4 -2
  328. package/dist/db/migrations/v22.js +39 -36
  329. package/dist/db/migrations/v24.js +27 -22
  330. package/dist/db/migrations/v29.js +37 -32
  331. package/dist/db/migrations/v31.js +36 -31
  332. package/dist/db/migrations/v35.js +1 -1
  333. package/dist/db/migrations/v39.js +1 -1
  334. package/dist/db/migrations/v40.js +15 -14
  335. package/dist/db/migrations/v43.js +7 -6
  336. package/dist/db/migrations/v44.js +1 -1
  337. package/dist/db/migrations/v45.js +1 -1
  338. package/dist/db/migrations/v46.js +1 -1
  339. package/dist/db/migrations/v47.js +1 -1
  340. package/dist/db/migrations/v48.js +1 -1
  341. package/dist/db/migrations/v49.js +1 -1
  342. package/dist/db/migrations/v50.js +8 -7
  343. package/dist/db/migrations/v52.js +1 -1
  344. package/dist/db/open.d.ts +9 -1
  345. package/dist/db/open.js +21 -4
  346. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  347. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  348. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  349. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  350. package/dist/db/request-stores.d.ts +15 -2
  351. package/dist/db/request-stores.js +37 -15
  352. package/dist/db/tables.d.ts +2 -0
  353. package/dist/db/tables.js +6 -0
  354. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  355. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  356. package/dist/db/wal-checkpointer.d.ts +11 -0
  357. package/dist/db/wal-checkpointer.js +92 -0
  358. package/dist/doctor.js +105 -136
  359. package/dist/entry/json-hooks.d.ts +1 -1
  360. package/dist/entry/json-hooks.js +1 -1
  361. package/dist/entry/project-identity.d.ts +1 -1
  362. package/dist/entry/project-identity.js +1 -1
  363. package/dist/entry/session-text.d.ts +3 -3
  364. package/dist/entry/session-text.js +3 -3
  365. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  366. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  367. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  368. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  369. package/dist/{eval.js → eval/eval.js} +29 -22
  370. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  371. package/dist/{judgment.js → eval/judgment.js} +4 -9
  372. package/dist/extensions/openclaw-plugin/index.js +1 -2
  373. package/dist/graph/delta.d.ts +3 -2
  374. package/dist/graph/delta.js +9 -23
  375. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  376. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  377. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  378. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  379. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  380. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  381. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  382. package/dist/{graph-view.js → graph/view.js} +127 -167
  383. package/dist/graph/write.d.ts +4 -76
  384. package/dist/graph/write.js +13 -397
  385. package/dist/hooks/codex-session.js +1 -1
  386. package/dist/hooks/codex-wrapper.js +14 -15
  387. package/dist/hooks/copilot.d.ts +48 -13
  388. package/dist/hooks/copilot.js +124 -39
  389. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  390. package/dist/hooks/json-hooks.d.ts +3 -1
  391. package/dist/hooks/json-hooks.js +40 -122
  392. package/dist/hooks/opencode.js +35 -27
  393. package/dist/hooks/shared.d.ts +7 -5
  394. package/dist/hooks/shared.js +19 -8
  395. package/dist/importers/core.d.ts +2 -6
  396. package/dist/importers/core.js +41 -39
  397. package/dist/importers/markdown-parse.d.ts +1 -10
  398. package/dist/importers/markdown-parse.js +2 -19
  399. package/dist/importers/markdown.js +2 -1
  400. package/dist/importers/sources.js +50 -46
  401. package/dist/importers/vault.js +71 -92
  402. package/dist/index.d.ts +22 -22
  403. package/dist/index.js +21 -21
  404. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  405. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  406. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  407. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  408. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  409. package/dist/learn/extract.js +125 -0
  410. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  411. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  412. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  413. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  414. package/dist/mcp/admin-tools.d.ts +1 -1
  415. package/dist/mcp/admin-tools.js +37 -60
  416. package/dist/mcp/format.d.ts +5 -5
  417. package/dist/mcp/format.js +7 -6
  418. package/dist/mcp/framing.d.ts +6 -0
  419. package/dist/mcp/framing.js +11 -3
  420. package/dist/mcp/memory-tools.d.ts +2 -2
  421. package/dist/mcp/memory-tools.js +12 -31
  422. package/dist/mcp/protocol.d.ts +6 -10
  423. package/dist/mcp/protocol.js +8 -14
  424. package/dist/mcp/recall-tools.d.ts +2 -2
  425. package/dist/mcp/recall-tools.js +68 -50
  426. package/dist/mcp/request.js +65 -63
  427. package/dist/mcp/server.js +1 -1
  428. package/dist/mcp/session-state.d.ts +1 -2
  429. package/dist/mcp/session-state.js +2 -2
  430. package/dist/mcp/shared-gate.js +1 -1
  431. package/dist/mcp/stdio.js +69 -31
  432. package/dist/mcp/tool-args.js +2 -1
  433. package/dist/mcp/tools.js +2 -2
  434. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  435. package/dist/objects/customer-notes.js +112 -0
  436. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  437. package/dist/objects/decisions.js +101 -0
  438. package/dist/objects/descriptor.d.ts +52 -0
  439. package/dist/objects/descriptor.js +4 -0
  440. package/dist/objects/fields.d.ts +15 -0
  441. package/dist/objects/fields.js +21 -0
  442. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  443. package/dist/objects/incidents.js +130 -0
  444. package/dist/objects/lifecycle.d.ts +27 -0
  445. package/dist/objects/lifecycle.js +96 -0
  446. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  447. package/dist/objects/policies.js +189 -0
  448. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  449. package/dist/objects/processes.js +146 -0
  450. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  451. package/dist/objects/project-briefs.js +255 -0
  452. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  453. package/dist/objects/skills.js +156 -0
  454. package/dist/postinstall.js +4 -2
  455. package/dist/predictions/planning-fallacy.d.ts +4 -76
  456. package/dist/predictions/planning-fallacy.js +4 -129
  457. package/dist/rerankers/clef.d.ts +2 -6
  458. package/dist/rerankers/clef.js +27 -47
  459. package/dist/rerankers/cross-encoder.d.ts +0 -7
  460. package/dist/rerankers/cross-encoder.js +15 -23
  461. package/dist/rerankers/index.js +8 -7
  462. package/dist/rerankers/jev.d.ts +1 -4
  463. package/dist/rerankers/jev.js +30 -49
  464. package/dist/rerankers/llm.d.ts +2 -4
  465. package/dist/rerankers/llm.js +33 -50
  466. package/dist/rerankers/outage-warning.d.ts +7 -0
  467. package/dist/rerankers/outage-warning.js +31 -0
  468. package/dist/rerankers/remote.d.ts +3 -0
  469. package/dist/rerankers/remote.js +23 -0
  470. package/dist/rerankers/types.d.ts +1 -1
  471. package/dist/search/as-of.d.ts +1 -1
  472. package/dist/search/bm25-search.d.ts +2 -2
  473. package/dist/search/bm25-search.js +7 -7
  474. package/dist/search/bm25.d.ts +1 -1
  475. package/dist/search/bm25.js +1 -1
  476. package/dist/search/boosts.d.ts +5 -1
  477. package/dist/search/boosts.js +34 -13
  478. package/dist/search/breakdown.d.ts +2 -2
  479. package/dist/search/breakdown.js +2 -1
  480. package/dist/search/explain.d.ts +1 -1
  481. package/dist/search/explain.js +3 -2
  482. package/dist/search/finalize.d.ts +2 -2
  483. package/dist/search/finalize.js +4 -3
  484. package/dist/search/fusion.d.ts +1 -1
  485. package/dist/search/fusion.js +3 -3
  486. package/dist/search/hybrid-score.d.ts +2 -2
  487. package/dist/search/hybrid-score.js +1 -1
  488. package/dist/search/hybrid.d.ts +4 -4
  489. package/dist/search/hybrid.js +11 -8
  490. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  491. package/dist/{multihop.js → search/multihop.js} +7 -5
  492. package/dist/{path-context.js → search/path-context.js} +3 -1
  493. package/dist/search/physics-search.d.ts +4 -4
  494. package/dist/search/physics-search.js +15 -15
  495. package/dist/search/rerank.d.ts +3 -3
  496. package/dist/search/rerank.js +4 -3
  497. package/dist/search/temporal.d.ts +1 -1
  498. package/dist/search/temporal.js +5 -2
  499. package/dist/search/vector.d.ts +3 -3
  500. package/dist/search/vector.js +17 -11
  501. package/dist/server/auth.d.ts +1 -1
  502. package/dist/server/auth.js +26 -18
  503. package/dist/server/boot.d.ts +24 -0
  504. package/dist/server/boot.js +465 -0
  505. package/dist/server/client-ip.d.ts +5 -1
  506. package/dist/server/client-ip.js +18 -6
  507. package/dist/server/cursor.d.ts +1 -1
  508. package/dist/server/cursor.js +2 -3
  509. package/dist/server/deadline.d.ts +13 -0
  510. package/dist/server/deadline.js +45 -0
  511. package/dist/server/key-check-bounds.d.ts +8 -0
  512. package/dist/server/key-check-bounds.js +46 -0
  513. package/dist/server/lifecycle.js +1 -1
  514. package/dist/server/mcp-http.d.ts +1 -4
  515. package/dist/server/mcp-http.js +34 -24
  516. package/dist/server/ready.d.ts +7 -0
  517. package/dist/server/ready.js +38 -0
  518. package/dist/server/request.d.ts +10 -4
  519. package/dist/server/request.js +63 -12
  520. package/dist/server/route-table.d.ts +15 -0
  521. package/dist/server/route-table.js +209 -0
  522. package/dist/server/routes/admin.js +13 -8
  523. package/dist/server/routes/customer-notes.d.ts +5 -5
  524. package/dist/server/routes/customer-notes.js +32 -97
  525. package/dist/server/routes/decisions.d.ts +5 -5
  526. package/dist/server/routes/decisions.js +42 -105
  527. package/dist/server/routes/incidents.d.ts +5 -5
  528. package/dist/server/routes/incidents.js +42 -95
  529. package/dist/server/routes/memories.js +21 -20
  530. package/dist/server/routes/object-routes.d.ts +40 -0
  531. package/dist/server/routes/object-routes.js +80 -0
  532. package/dist/server/routes/policies.d.ts +6 -6
  533. package/dist/server/routes/policies.js +40 -124
  534. package/dist/server/routes/predictions.js +29 -45
  535. package/dist/server/routes/processes.d.ts +5 -5
  536. package/dist/server/routes/processes.js +38 -118
  537. package/dist/server/routes/project-briefs.d.ts +6 -6
  538. package/dist/server/routes/project-briefs.js +38 -110
  539. package/dist/server/routes/recall.js +14 -12
  540. package/dist/server/routes/skills.d.ts +6 -6
  541. package/dist/server/routes/skills.js +37 -125
  542. package/dist/{server-detect.js → server/server-detect.js} +3 -2
  543. package/dist/server/sleep-child.d.ts +2 -0
  544. package/dist/server/sleep-child.js +19 -0
  545. package/dist/server/sleep-offload.d.ts +20 -0
  546. package/dist/server/sleep-offload.js +70 -0
  547. package/dist/server/tls.d.ts +6 -0
  548. package/dist/server/tls.js +24 -0
  549. package/dist/server/types.d.ts +27 -8
  550. package/dist/server/validation.d.ts +3 -4
  551. package/dist/server/validation.js +6 -11
  552. package/dist/server.d.ts +41 -50
  553. package/dist/server.js +26 -560
  554. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  555. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  556. package/dist/{scope.js → sharing/scope.js} +1 -1
  557. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  558. package/dist/{shared.js → sharing/shared.js} +100 -77
  559. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  560. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  561. package/dist/store/audit-event.d.ts +12 -6
  562. package/dist/store/audit-event.js +6 -5
  563. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  564. package/dist/{audit.js → store/audit.js} +91 -6
  565. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  566. package/dist/{auth.js → store/auth.js} +100 -92
  567. package/dist/store/candidates.d.ts +23 -12
  568. package/dist/store/candidates.js +87 -35
  569. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  570. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  571. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  572. package/dist/{store-cards.js → store/cards.js} +85 -146
  573. package/dist/store/compactions.d.ts +78 -0
  574. package/dist/store/compactions.js +93 -0
  575. package/dist/store/conflicts.d.ts +22 -5
  576. package/dist/store/conflicts.js +160 -109
  577. package/dist/store/connectors/github.d.ts +84 -0
  578. package/dist/store/connectors/github.js +180 -0
  579. package/dist/store/connectors/slack.d.ts +69 -0
  580. package/dist/store/connectors/slack.js +177 -0
  581. package/dist/store/dashboard-reads.d.ts +27 -0
  582. package/dist/store/dashboard-reads.js +92 -0
  583. package/dist/store/delete-and-batch.d.ts +20 -24
  584. package/dist/store/delete-and-batch.js +64 -40
  585. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  586. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  587. package/dist/store/descendant-page.d.ts +12 -0
  588. package/dist/store/descendant-page.js +99 -0
  589. package/dist/store/diagnostics.d.ts +47 -0
  590. package/dist/store/diagnostics.js +51 -0
  591. package/dist/store/doctor-reads.d.ts +16 -0
  592. package/dist/store/doctor-reads.js +19 -0
  593. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  594. package/dist/{dormant.js → store/dormant.js} +151 -6
  595. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  596. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  597. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  598. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  599. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  600. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  601. package/dist/store/entry-reads.d.ts +46 -7
  602. package/dist/store/entry-reads.js +120 -21
  603. package/dist/store/entry-row.d.ts +8 -2
  604. package/dist/store/entry-row.js +28 -8
  605. package/dist/store/entry-writes.d.ts +33 -4
  606. package/dist/store/entry-writes.js +108 -26
  607. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  608. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  609. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  610. package/dist/{goals.js → store/goals.js} +45 -94
  611. package/dist/store/graph-queue.d.ts +29 -0
  612. package/dist/store/graph-queue.js +101 -0
  613. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  614. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  615. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  616. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  617. package/dist/store/graph-view-rows.d.ts +12 -0
  618. package/dist/store/graph-view-rows.js +67 -0
  619. package/dist/store/graph-writes.d.ts +58 -0
  620. package/dist/store/graph-writes.js +256 -0
  621. package/dist/store/half-life.d.ts +34 -0
  622. package/dist/store/half-life.js +77 -0
  623. package/dist/store/handoffs.d.ts +6 -3
  624. package/dist/store/handoffs.js +70 -31
  625. package/dist/store/index-and-stats.d.ts +8 -1
  626. package/dist/store/index-and-stats.js +51 -48
  627. package/dist/store/index.d.ts +4 -0
  628. package/dist/store/index.js +3 -0
  629. package/dist/store/key-audit.d.ts +2 -2
  630. package/dist/store/key-audit.js +4 -4
  631. package/dist/store/key-writes.d.ts +12 -5
  632. package/dist/store/key-writes.js +30 -4
  633. package/dist/store/ledger-turn.d.ts +17 -0
  634. package/dist/store/ledger-turn.js +27 -0
  635. package/dist/store/markdown.d.ts +1 -1
  636. package/dist/store/markdown.js +4 -3
  637. package/dist/store/mirrors.d.ts +5 -7
  638. package/dist/store/mirrors.js +39 -25
  639. package/dist/store/object-types.d.ts +189 -0
  640. package/dist/store/object-types.js +4 -0
  641. package/dist/store/open.d.ts +8 -4
  642. package/dist/store/open.js +34 -23
  643. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  644. package/dist/store/planning-fallacy-evidence.js +81 -0
  645. package/dist/store/port.d.ts +646 -0
  646. package/dist/store/port.js +17 -0
  647. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  648. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  649. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  650. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  651. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
  652. package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
  653. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
  654. package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
  655. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  656. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  657. package/dist/store/rejected-values.d.ts +55 -0
  658. package/dist/store/rejected-values.js +162 -0
  659. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  660. package/dist/{rejection.js → store/rejection.js} +3 -2
  661. package/dist/store/rows.d.ts +2 -3
  662. package/dist/store/rows.js +18 -11
  663. package/dist/store/search-rows.d.ts +15 -4
  664. package/dist/store/search-rows.js +43 -36
  665. package/dist/store/sessions.d.ts +18 -2
  666. package/dist/store/sessions.js +83 -46
  667. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  668. package/dist/store/sqlite/commit-watch.js +29 -0
  669. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  670. package/dist/store/sqlite/connector-events-group.js +50 -0
  671. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  672. package/dist/store/sqlite/connector-writes-group.js +65 -0
  673. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  674. package/dist/store/sqlite/dag-reads-group.js +45 -0
  675. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  676. package/dist/store/sqlite/entry-writes-group.js +170 -0
  677. package/dist/store/sqlite/error-codec.d.ts +17 -0
  678. package/dist/store/sqlite/error-codec.js +59 -0
  679. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  680. package/dist/store/sqlite/executor-counts.js +11 -0
  681. package/dist/store/sqlite/executor.d.ts +28 -0
  682. package/dist/store/sqlite/executor.js +286 -0
  683. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  684. package/dist/store/sqlite/graph-reads-group.js +18 -0
  685. package/dist/store/sqlite/local.d.ts +21 -0
  686. package/dist/store/sqlite/local.js +38 -0
  687. package/dist/store/sqlite/object-rows.d.ts +102 -0
  688. package/dist/store/sqlite/object-rows.js +218 -0
  689. package/dist/store/sqlite/objects-group.d.ts +20 -0
  690. package/dist/store/sqlite/objects-group.js +314 -0
  691. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  692. package/dist/store/sqlite/predictions-group.js +28 -0
  693. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  694. package/dist/store/sqlite/quarantine-group.js +38 -0
  695. package/dist/store/sqlite/store.d.ts +26 -0
  696. package/dist/store/sqlite/store.js +295 -0
  697. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  698. package/dist/store/sqlite/vector-pack.js +46 -0
  699. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  700. package/dist/store/sqlite/vector-reads-group.js +23 -0
  701. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  702. package/dist/store/sqlite/worker-entry.js +8 -0
  703. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  704. package/dist/store/sqlite/worker-jobs.js +116 -0
  705. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  706. package/dist/store/sqlite/worker-ops.js +82 -0
  707. package/dist/store/sqlite/worker-store.d.ts +8 -0
  708. package/dist/store/sqlite/worker-store.js +76 -0
  709. package/dist/store/summaries.d.ts +2 -11
  710. package/dist/store/summaries.js +17 -44
  711. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  712. package/dist/store/tenant-lookup.d.ts +1 -1
  713. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  714. package/dist/{tenant.js → store/tenant.js} +1 -1
  715. package/dist/store/token-ledger-rows.d.ts +61 -0
  716. package/dist/store/token-ledger-rows.js +68 -0
  717. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  718. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  719. package/dist/store/tombstone-checks.d.ts +12 -0
  720. package/dist/store/tombstone-checks.js +31 -0
  721. package/dist/store/usage-reports.d.ts +7 -0
  722. package/dist/store/usage-reports.js +26 -0
  723. package/dist/store/vector-writes.d.ts +10 -3
  724. package/dist/store/vector-writes.js +35 -5
  725. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  726. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  727. package/dist/support-bundle.d.ts +1 -1
  728. package/dist/support-bundle.js +13 -33
  729. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  730. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  731. package/dist/trust/quarantine.d.ts +4 -0
  732. package/dist/trust/quarantine.js +8 -0
  733. package/dist/trust/reject-flow.d.ts +23 -0
  734. package/dist/trust/reject-flow.js +67 -0
  735. package/dist/util/anthropic-messages.d.ts +31 -0
  736. package/dist/util/anthropic-messages.js +46 -0
  737. package/dist/util/atomic-write.d.ts +3 -0
  738. package/dist/util/atomic-write.js +107 -0
  739. package/dist/util/crash-handlers.d.ts +5 -0
  740. package/dist/util/crash-handlers.js +30 -0
  741. package/dist/{env.d.ts → util/env.d.ts} +17 -2
  742. package/dist/{env.js → util/env.js} +22 -2
  743. package/dist/util/home-path.js +67 -0
  744. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  745. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  746. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  747. package/dist/{http-util.js → util/http-util.js} +31 -11
  748. package/dist/util/json.d.ts +17 -0
  749. package/dist/util/json.js +25 -0
  750. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  751. package/dist/{log.js → util/log.js} +12 -3
  752. package/dist/util/real-path.d.ts +3 -0
  753. package/dist/util/real-path.js +15 -0
  754. package/dist/util/request-scope.d.ts +27 -0
  755. package/dist/util/request-scope.js +47 -0
  756. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  757. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  758. package/dist/util/stored-json.d.ts +9 -0
  759. package/dist/util/stored-json.js +8 -0
  760. package/dist/util/time.d.ts +2 -0
  761. package/dist/util/time.js +3 -0
  762. package/dist/util/token-text.d.ts +18 -0
  763. package/dist/util/token-text.js +23 -0
  764. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  765. package/dist/{version.js → util/version.js} +1 -1
  766. package/extensions/openclaw-plugin/index.ts +1 -5
  767. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  768. package/extensions/openclaw-plugin/package.json +1 -1
  769. package/openclaw.plugin.json +1 -1
  770. package/package.json +2 -2
  771. package/dist/api.d.ts +0 -26
  772. package/dist/api.js +0 -29
  773. package/dist/capture-contract.js +0 -49
  774. package/dist/connectors/github/idempotency.d.ts +0 -19
  775. package/dist/connectors/github/idempotency.js +0 -27
  776. package/dist/connectors/slack/idempotency.d.ts +0 -17
  777. package/dist/connectors/slack/idempotency.js +0 -31
  778. package/dist/customer-notes.js +0 -336
  779. package/dist/db.d.ts +0 -9
  780. package/dist/db.js +0 -8
  781. package/dist/decisions.js +0 -326
  782. package/dist/extract.js +0 -133
  783. package/dist/graph/rows.d.ts +0 -45
  784. package/dist/graph/types.js +0 -11
  785. package/dist/half-life-migration.js +0 -182
  786. package/dist/handoff.js +0 -68
  787. package/dist/home-path.js +0 -24
  788. package/dist/incidents.js +0 -349
  789. package/dist/instruction-detect.js +0 -27
  790. package/dist/json.d.ts +0 -7
  791. package/dist/json.js +0 -11
  792. package/dist/ledger-db.d.ts +0 -10
  793. package/dist/ledger-db.js +0 -42
  794. package/dist/policies.js +0 -434
  795. package/dist/processes.js +0 -371
  796. package/dist/project-briefs.js +0 -523
  797. package/dist/reject-flow.d.ts +0 -69
  798. package/dist/reject-flow.js +0 -260
  799. package/dist/session-owners.d.ts +0 -7
  800. package/dist/session-owners.js +0 -54
  801. package/dist/skills.js +0 -367
  802. package/dist/store-port.d.ts +0 -191
  803. package/dist/store-port.js +0 -166
  804. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  805. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  806. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  807. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  808. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  809. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  810. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  811. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  812. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  813. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  814. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  815. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  816. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  817. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  818. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  819. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  820. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  821. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  822. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  823. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  824. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  825. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  826. /package/dist/{card.js → core/card.js} +0 -0
  827. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  828. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  829. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  830. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  831. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  832. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  833. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  834. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  835. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  836. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  837. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  838. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  839. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  840. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  841. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  842. /package/dist/{rrf.js → search/rrf.js} +0 -0
  843. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  844. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  845. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  846. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  847. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  848. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  849. /package/dist/{yaml.js → store/yaml.js} +0 -0
  850. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  851. /package/dist/{escape.js → util/escape.js} +0 -0
  852. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  853. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  854. /package/dist/{keyset.js → util/keyset.js} +0 -0
  855. /package/dist/{same-text.js → util/same-text.js} +0 -0
  856. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  857. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  858. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  859. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  860. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  861. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  862. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  863. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  864. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,14 +1,33 @@
1
- // GitHub Copilot: hippo's hooks file, one MCP server key and an instructions block, all under the Copilot home folder.
1
+ // GitHub Copilot: hippo's hooks file, one MCP server key and an instructions block under the Copilot home folder,
2
+ // plus the MCP server and an instructions file in each VS Code User folder.
2
3
  import * as fs from 'fs';
3
4
  import * as path from 'path';
4
5
  import { isDeepStrictEqual } from 'node:util';
5
- import { readJsonFile } from '../json.js';
6
- import { HOOK_MARKERS, hippoBlock } from '../cli/hook-blocks.js';
7
- import { copilotHomeDir, isJsonObject } from './shared.js';
6
+ import { readJsonFile, isJsonObjectLiteral } from '../util/json.js';
7
+ import { HOOK_MARKERS, hippoBlock } from './hook-blocks.js';
8
+ import { copilotHomeDir, vscodeUserDirs } from './shared.js';
9
+ import { writeFileAtomic } from '../util/atomic-write.js';
8
10
  import { installJsonHooks, resolveJsonHookPaths, uninstallJsonHooks, writeSettingsFile } from './json-hooks.js';
9
11
  const MCP_KEY = 'hippo';
10
12
  /** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
11
- export const COPILOT_INSTRUCTIONS = `
13
+ const COPILOT_INSTRUCTIONS = `
14
+ ## Project Memory (Hippo)
15
+
16
+ At the start of each task, call the \`hippo_recall\` tool with a short query that
17
+ names the task. Read the memories it returns before you write any code.
18
+
19
+ When you learn something that should outlive this session (a decision and its
20
+ reason, a user preference, why something failed), call the \`hippo_remember\`
21
+ tool right then, while you work, never as a closing step. Set \`error\` to true
22
+ for a failure. Leave out secrets and personal details.
23
+
24
+ The installed hooks load pinned memories when a session starts and capture
25
+ the session as you work, so there is nothing to run before you finish.
26
+ `.trim();
27
+ /** Every Copilot text a release has written, so install upgrades an old block and uninstall still removes it; add the old text when the text changes. */
28
+ const SHIPPED_COPILOT_INSTRUCTIONS = [
29
+ COPILOT_INSTRUCTIONS,
30
+ `
12
31
  ## Project Memory (Hippo)
13
32
 
14
33
  At the start of each task, call the \`hippo_recall\` tool with a short query that
@@ -22,29 +41,55 @@ for a failure. Leave out secrets and personal details.
22
41
  The installed hooks load pinned memories when a session starts, store failed
23
42
  tool calls and capture the session when it ends, so there is nothing to run
24
43
  before you finish.
25
- `.trim();
44
+ `.trim(),
45
+ ];
46
+ /** VS Code attaches a User `*.instructions.md` file to every chat request its `applyTo` glob matches. */
47
+ const withApplyToAll = (text) => `---\napplyTo: "**"\n---\n${text}\n`;
48
+ const VSCODE_INSTRUCTIONS = withApplyToAll(COPILOT_INSTRUCTIONS);
49
+ function isHipposVscodeInstructions(text) {
50
+ return SHIPPED_COPILOT_INSTRUCTIONS.some((shipped) => text === withApplyToAll(shipped));
51
+ }
52
+ function profileDirs(userDir) {
53
+ const dir = path.join(userDir, 'profiles');
54
+ if (!fs.existsSync(dir))
55
+ return [];
56
+ return fs.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => path.join(dir, e.name)).sort();
57
+ }
26
58
  export function copilotPaths() {
27
59
  const home = copilotHomeDir();
28
60
  return {
29
61
  hooks: resolveJsonHookPaths('copilot').settings,
30
62
  mcpConfig: path.join(home, 'mcp-config.json'),
31
63
  instructions: path.join(home, 'copilot-instructions.md'),
64
+ vscode: vscodeUserDirs().map((userDir) => ({
65
+ userDir,
66
+ mcpConfig: path.join(userDir, 'mcp.json'),
67
+ instructions: path.join(userDir, 'prompts', 'hippo.instructions.md'),
68
+ profiles: profileDirs(userDir),
69
+ })),
32
70
  };
33
71
  }
34
72
  /** Windows gets npm's .cmd shim, as the Codex hooks do, since a PowerShell execution policy can block hippo.ps1. */
35
- function hippoMcpServer() {
36
- return { type: 'local', command: process.platform === 'win32' ? 'hippo.cmd' : 'hippo', args: ['mcp'], env: {}, tools: ['*'] };
73
+ function hippoCommand() {
74
+ return process.platform === 'win32' ? 'hippo.cmd' : 'hippo';
37
75
  }
38
- /** Only a server hippo wrote counts as hippo's: a user's own "hippo" key with another command or args is never touched. */
39
- function isHipposServer(entry) {
40
- return isJsonObject(entry) && (entry.command === 'hippo' || entry.command === 'hippo.cmd') && isDeepStrictEqual(entry.args, ['mcp']);
76
+ /** The Copilot CLI's mcp-config.json keeps servers under "mcpServers", each with an env and a tool list. */
77
+ export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'local', command: hippoCommand(), args: ['mcp'], env: {}, tools: ['*'] }) };
78
+ /** VS Code's mcp.json keeps stdio servers under "servers"; it has no "mcpServers" key. */
79
+ export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
80
+ /** Only a server hippo wrote counts as hippo's: another command, other args, or any key or value setup does not write (an env you added) makes it the user's. */
81
+ function isHipposServer(entry, host) {
82
+ if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
83
+ return false;
84
+ const ours = host.server();
85
+ return Object.entries(entry).every(([key, value]) => (key === 'command' ? value === 'hippo' || value === 'hippo.cmd' : isDeepStrictEqual(value, ours[key])));
41
86
  }
42
- /** What to paste under "mcpServers" when hippo cannot edit the file itself. */
43
- export function copilotMcpSnippet() {
44
- return `"${MCP_KEY}": ${JSON.stringify(hippoMcpServer())}`;
87
+ /** What to paste under the host's key when hippo cannot edit the file itself. */
88
+ export function copilotMcpSnippet(host = COPILOT_CLI_MCP) {
89
+ return `"${MCP_KEY}": ${JSON.stringify(host.server())}`;
45
90
  }
46
91
  /** Null for a file with comments, one that is not JSON, or one whose shape a merge would overwrite; a missing file reads as empty. */
47
- function readMcpConfig(file) {
92
+ function readMcpConfig(file, host) {
48
93
  let config = {};
49
94
  if (fs.existsSync(file)) {
50
95
  try {
@@ -52,45 +97,47 @@ function readMcpConfig(file) {
52
97
  }
53
98
  catch (err) {
54
99
  // Only a parse failure means the text is not JSON hippo can merge; EACCES or EISDIR is thrown with its own message.
55
- if (err instanceof SyntaxError)
100
+ if (!(err instanceof SyntaxError))
101
+ throw err;
102
+ // An empty file is a new one with no servers yet, not one with comments.
103
+ if (fs.readFileSync(file, 'utf8').trim() !== '')
56
104
  return null;
57
- throw err;
58
105
  }
59
106
  }
60
- if (!isJsonObject(config))
107
+ if (!isJsonObjectLiteral(config))
61
108
  return null;
62
- if (config.mcpServers === undefined)
63
- config.mcpServers = {};
64
- const servers = config.mcpServers;
65
- return isJsonObject(servers) ? { config, servers } : null;
109
+ if (config[host.key] === undefined)
110
+ config[host.key] = {};
111
+ const servers = config[host.key];
112
+ return isJsonObjectLiteral(servers) ? { config, servers } : null;
66
113
  }
67
114
  /** Adds hippo's server and keeps every other key; a file hippo cannot parse, or a "hippo" key it did not write, stays as it is. */
68
- export function mergeMcpServer(file) {
69
- const read = readMcpConfig(file);
115
+ function mergeMcpServer(file, host = COPILOT_CLI_MCP) {
116
+ const read = readMcpConfig(file, host);
70
117
  if (read === null)
71
118
  return 'unreadable';
72
119
  const existing = read.servers[MCP_KEY];
73
120
  if (existing !== undefined)
74
- return isHipposServer(existing) ? 'present' : 'user-owned';
75
- read.servers[MCP_KEY] = hippoMcpServer();
121
+ return isHipposServer(existing, host) ? 'present' : 'user-owned';
122
+ read.servers[MCP_KEY] = host.server();
76
123
  writeSettingsFile(file, read.config);
77
124
  return 'added';
78
125
  }
79
126
  /** Removes the "hippo" key only when hippo wrote it. */
80
- export function removeMcpServer(file) {
127
+ export function removeMcpServer(file, host = COPILOT_CLI_MCP) {
81
128
  if (!fs.existsSync(file))
82
129
  return 'absent';
83
- const read = readMcpConfig(file);
130
+ const read = readMcpConfig(file, host);
84
131
  if (read === null)
85
132
  return 'unreadable';
86
133
  const existing = read.servers[MCP_KEY];
87
134
  if (existing === undefined)
88
135
  return 'absent';
89
- if (!isHipposServer(existing))
136
+ if (!isHipposServer(existing, host))
90
137
  return 'user-owned';
91
138
  delete read.servers[MCP_KEY];
92
139
  if (Object.keys(read.servers).length === 0)
93
- delete read.config.mcpServers;
140
+ delete read.config[host.key];
94
141
  writeSettingsFile(file, read.config);
95
142
  return 'removed';
96
143
  }
@@ -100,7 +147,7 @@ export function isMcpFailure(status) {
100
147
  function hasErrnoCode(err) {
101
148
  return 'code' in err && typeof err.code === 'string';
102
149
  }
103
- /** One mcp-config.json step; a filesystem error comes back as a failure, so the hooks file and the block still install. */
150
+ /** One MCP config step; a filesystem error comes back as a failure, so the hooks file and the instructions still install. */
104
151
  function mcpStep(step) {
105
152
  try {
106
153
  return step();
@@ -111,9 +158,8 @@ function mcpStep(step) {
111
158
  throw err;
112
159
  }
113
160
  }
114
- // A later release adds the hash of each earlier Copilot text here, as SHIPPED_HOOK_HASHES does for the other agents.
115
161
  function isCopilotBlock(inner) {
116
- return inner === COPILOT_INSTRUCTIONS;
162
+ return SHIPPED_COPILOT_INSTRUCTIONS.includes(inner);
117
163
  }
118
164
  /** Replaces only the text between the markers, in the file's own line ending, or appends a block after the user's text. */
119
165
  function withCopilotBlock(text, found) {
@@ -127,7 +173,7 @@ function withCopilotBlock(text, found) {
127
173
  return `${text}${text.endsWith('\n') ? '\n' : '\n\n'}${block}`;
128
174
  }
129
175
  /** Creates the file when missing; any block but hippo's own Copilot one, and a start marker with no end, leave the file as it is. */
130
- export function ensureInstructionsBlock(file) {
176
+ function ensureInstructionsBlock(file) {
131
177
  const old = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
132
178
  const found = hippoBlock(old);
133
179
  if (found === null && old.includes(HOOK_MARKERS.start))
@@ -137,8 +183,7 @@ export function ensureInstructionsBlock(file) {
137
183
  const next = withCopilotBlock(old, found);
138
184
  if (next === old)
139
185
  return 'present';
140
- fs.mkdirSync(path.dirname(file), { recursive: true });
141
- fs.writeFileSync(file, next, 'utf8');
186
+ writeFileAtomic(file, next);
142
187
  return 'written';
143
188
  }
144
189
  /** `text` without the block and its markers, plus the line break after the end marker, else the one before the start marker. */
@@ -163,16 +208,51 @@ export function removeInstructionsBlock(file) {
163
208
  if (left.trim() === '')
164
209
  fs.rmSync(file);
165
210
  else
166
- fs.writeFileSync(file, left, 'utf8');
211
+ writeFileAtomic(file, left);
212
+ return 'removed';
213
+ }
214
+ /** The file is hippo's alone, so it is written whole; an earlier hippo text is upgraded, and any other text already there stays. */
215
+ export function ensureVscodeInstructions(file) {
216
+ if (fs.existsSync(file)) {
217
+ const old = fs.readFileSync(file, 'utf8');
218
+ if (old === VSCODE_INSTRUCTIONS)
219
+ return 'present';
220
+ if (!isHipposVscodeInstructions(old))
221
+ return 'kept';
222
+ }
223
+ writeFileAtomic(file, VSCODE_INSTRUCTIONS);
224
+ return 'written';
225
+ }
226
+ /** Deletes the file only when it still holds exactly what a hippo release wrote. */
227
+ export function removeVscodeInstructions(file) {
228
+ if (!fs.existsSync(file))
229
+ return 'absent';
230
+ if (!isHipposVscodeInstructions(fs.readFileSync(file, 'utf8')))
231
+ return 'kept';
232
+ fs.rmSync(file);
167
233
  return 'removed';
168
234
  }
235
+ /** The CLI's folder holds more than the hooks folder setup makes for VS Code, so a rerun on a VS Code-only machine still finds no CLI. */
236
+ export function isCopilotCliPresent(home = copilotHomeDir()) {
237
+ if (fs.statSync(home, { throwIfNoEntry: false })?.isDirectory() !== true)
238
+ return false;
239
+ const entries = fs.readdirSync(home);
240
+ return entries.length !== 1 || entries[0] !== 'hooks';
241
+ }
169
242
  export function installCopilot() {
170
243
  const paths = copilotPaths();
244
+ // Read before the hooks install, which makes the folder on a machine with only VS Code.
245
+ const cli = isCopilotCliPresent();
171
246
  return {
172
247
  paths,
173
248
  hooks: installJsonHooks('copilot').installedSessionStart,
174
- mcp: mcpStep(() => mergeMcpServer(paths.mcpConfig)),
175
- instructions: ensureInstructionsBlock(paths.instructions),
249
+ mcp: cli ? mcpStep(() => mergeMcpServer(paths.mcpConfig)) : null,
250
+ instructions: cli ? ensureInstructionsBlock(paths.instructions) : null,
251
+ vscode: paths.vscode.map((dir) => ({
252
+ paths: dir,
253
+ mcp: mcpStep(() => mergeMcpServer(dir.mcpConfig, VSCODE_MCP)),
254
+ instructions: ensureVscodeInstructions(dir.instructions),
255
+ })),
176
256
  };
177
257
  }
178
258
  export function uninstallCopilot() {
@@ -182,6 +262,11 @@ export function uninstallCopilot() {
182
262
  hooks: uninstallJsonHooks('copilot'),
183
263
  mcp: mcpStep(() => removeMcpServer(paths.mcpConfig)),
184
264
  instructions: removeInstructionsBlock(paths.instructions),
265
+ vscode: paths.vscode.map((dir) => ({
266
+ paths: dir,
267
+ mcp: mcpStep(() => removeMcpServer(dir.mcpConfig, VSCODE_MCP)),
268
+ instructions: removeVscodeInstructions(dir.instructions),
269
+ })),
185
270
  };
186
271
  }
187
272
  //# sourceMappingURL=copilot.js.map
@@ -1,6 +1,6 @@
1
1
  // The hippo block each agent's instruction file carries, and how init recognises one it wrote earlier.
2
2
  import { createHash } from 'node:crypto';
3
- import { escapeRegex } from '../escape.js';
3
+ import { escapeRegex } from '../util/escape.js';
4
4
  export const HOOK_MARKERS = {
5
5
  start: '<!-- hippo:start -->',
6
6
  end: '<!-- hippo:end -->',
@@ -34,7 +34,7 @@
34
34
  * `hooks` block from opencode.json.
35
35
  */
36
36
  import { type JsonHookTarget } from './shared.js';
37
- import { type JsonValue } from '../json.js';
37
+ import { type JsonValue } from '../util/json.js';
38
38
  /** A target's hook settings file, the log its SessionEnd hook writes, and the tool's display name. */
39
39
  export interface JsonHookPaths {
40
40
  settings: string;
@@ -63,6 +63,8 @@ export interface InstallResult {
63
63
  }
64
64
  /** The paths for `target` under the current home directory; reads and writes nothing. */
65
65
  export declare function resolveJsonHookPaths(target: JsonHookTarget): JsonHookPaths;
66
+ /** The events in hippo's Copilot hooks file, in file order, for setup to name. */
67
+ export declare function copilotHookEvents(): string[];
66
68
  /** Adds hippo's hooks to `target`'s settings file and migrates older hippo entries; a file that is not JSON stays untouched. */
67
69
  export declare function installJsonHooks(target: JsonHookTarget): InstallResult;
68
70
  /** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
@@ -35,10 +35,10 @@
35
35
  */
36
36
  import * as fs from 'fs';
37
37
  import * as path from 'path';
38
- import { isJsonObject, HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, homeDir, claudeConfigDir, codexHomeDir, copilotHomeDir, defaultPreCompactLogPath } from './shared.js';
39
- import { isJsonString, readJsonFile } from '../json.js';
40
- import { escapeRegex } from '../escape.js';
41
- import { errorMessage, log } from '../log.js';
38
+ import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, homeDir, claudeConfigDir, codexHomeDir, copilotHooksFile, defaultPreCompactLogPath } from './shared.js';
39
+ import { isJsonString, readJsonFile, isJsonObjectLiteral } from '../util/json.js';
40
+ import { escapeRegex } from '../util/escape.js';
41
+ import { writeFileAtomic } from '../util/atomic-write.js';
42
42
  /** The paths for `target` under the current home directory; reads and writes nothing. */
43
43
  export function resolveJsonHookPaths(target) {
44
44
  const home = homeDir();
@@ -58,7 +58,7 @@ export function resolveJsonHookPaths(target) {
58
58
  };
59
59
  case 'copilot':
60
60
  return {
61
- settings: path.join(copilotHomeDir(), 'hooks', 'hippo.json'),
61
+ settings: copilotHooksFile(),
62
62
  logFile: path.join(logsDir, 'copilot-sleep.log'),
63
63
  display: 'Copilot',
64
64
  };
@@ -73,13 +73,13 @@ function isHippoCommand(command, marker) {
73
73
  }
74
74
  const runsHippo = (...markers) => (command) => markers.some((m) => isHippoCommand(command, m));
75
75
  function handlerCommand(handler) {
76
- return isJsonObject(handler) && isJsonString(handler.command) ? handler.command : null;
76
+ return isJsonObjectLiteral(handler) && isJsonString(handler.command) ? handler.command : null;
77
77
  }
78
78
  /** `groups` minus the handlers `isOurs` picks; a group goes only once it has no handler left. Null when no handler matched. */
79
79
  function withoutHandlers(groups, isOurs) {
80
80
  let removed = false;
81
81
  const kept = groups.flatMap((group) => {
82
- if (!isJsonObject(group) || !Array.isArray(group.hooks))
82
+ if (!isJsonObjectLiteral(group) || !Array.isArray(group.hooks))
83
83
  return [group];
84
84
  const handlers = group.hooks.filter((h) => {
85
85
  const command = handlerCommand(h);
@@ -108,7 +108,7 @@ function stripHandlers(hooks, event, isOurs) {
108
108
  }
109
109
  /** Every command string in `groups`; a group or handler of an unexpected shape adds none. */
110
110
  function handlerCommands(groups) {
111
- return groups.flatMap((group) => (isJsonObject(group) && Array.isArray(group.hooks) ? group.hooks.flatMap((h) => handlerCommand(h) ?? []) : []));
111
+ return groups.flatMap((group) => (isJsonObjectLiteral(group) && Array.isArray(group.hooks) ? group.hooks.flatMap((h) => handlerCommand(h) ?? []) : []));
112
112
  }
113
113
  /** The loose "already installed?" test, on purpose weaker than isHippoCommand: a launcher or env prefix still counts, and a false hit only skips an append. */
114
114
  function hookArrayContains(hookArray, marker) {
@@ -126,13 +126,13 @@ function migratePinnedInjectRecentCommands(hookArray) {
126
126
  return false;
127
127
  let changed = false;
128
128
  for (const entry of hookArray) {
129
- if (!isJsonObject(entry))
129
+ if (!isJsonObjectLiteral(entry))
130
130
  continue;
131
131
  const innerHooks = entry.hooks;
132
132
  if (!Array.isArray(innerHooks))
133
133
  continue;
134
134
  for (const hook of innerHooks) {
135
- if (!isJsonObject(hook))
135
+ if (!isJsonObjectLiteral(hook))
136
136
  continue;
137
137
  if (!isJsonString(hook.command))
138
138
  continue;
@@ -172,14 +172,14 @@ function ensureHooksObject(settings, events) {
172
172
  if (settings.hooks === undefined)
173
173
  settings.hooks = {};
174
174
  const hooks = settings.hooks;
175
- if (!isJsonObject(hooks) || events.some((e) => hooks[e] !== undefined && !Array.isArray(hooks[e])))
175
+ if (!isJsonObjectLiteral(hooks) || events.some((e) => hooks[e] !== undefined && !Array.isArray(hooks[e])))
176
176
  return null;
177
177
  return hooks;
178
178
  }
179
179
  /** Codex keys trust to each hook's position and hash and re-asks for a changed one, so hippo only appends and never edits an entry. */
180
180
  function installCodexHooks(settingsPath, settings) {
181
181
  const result = nothingInstalled('codex', settingsPath);
182
- if (!isJsonObject(settings))
182
+ if (!isJsonObjectLiteral(settings))
183
183
  return { ...result, invalidJson: true };
184
184
  const hooks = ensureHooksObject(settings, ['UserPromptSubmit', 'SessionStart']);
185
185
  if (hooks === null)
@@ -214,10 +214,19 @@ function copilotHooksTable() {
214
214
  sessionStart: copilotCommandHook('context --pinned-only --include-recent 5 --format copilot', 10),
215
215
  postToolUseFailure: copilotCommandHook('capture-error --runtime copilot', 10),
216
216
  preCompact: copilotCommandHook('pre-compact --runtime copilot', 30),
217
+ // VS Code maps no camelCase preCompact. The Copilot CLI may run both names, so pre-compact skips a snapshot saved seconds before.
218
+ PreCompact: copilotCommandHook('pre-compact --runtime copilot', 30),
219
+ // VS Code's per-reply Stop. --turn acts on a VS Code payload only, so the Copilot CLI's agentStop does nothing.
220
+ agentStop: copilotCommandHook('session-end --runtime copilot --turn', 30),
217
221
  sessionEnd: copilotCommandHook('session-end --runtime copilot', 30),
218
222
  },
219
223
  };
220
224
  }
225
+ /** The events in hippo's Copilot hooks file, in file order, for setup to name. */
226
+ export function copilotHookEvents() {
227
+ const hooks = copilotHooksTable().hooks;
228
+ return isJsonObjectLiteral(hooks) ? Object.keys(hooks) : [];
229
+ }
221
230
  /** Hippo owns this whole file, so install writes the full table and a second install changes no byte. */
222
231
  function installCopilotHooks(settingsPath) {
223
232
  const result = nothingInstalled('copilot', settingsPath);
@@ -247,112 +256,13 @@ export function installJsonHooks(target) {
247
256
  }
248
257
  if (target === 'codex')
249
258
  return installCodexHooks(settingsPath, settings);
250
- if (!isJsonObject(settings))
259
+ if (!isJsonObjectLiteral(settings))
251
260
  return { ...nothingInstalled(target, settingsPath), invalidJson: true };
252
261
  return installClaudeCodeHooks(settingsPath, settings, logFile);
253
262
  }
254
- const RENAME_RETRY_MS = 1000;
255
- const WINDOWS_RENAME_REFUSALS = ['EPERM', 'EACCES', 'EBUSY'];
256
- // A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall back to one.
257
- const REPLACE_REFUSALS = ['EBUSY', 'EXDEV', 'EACCES', 'EPERM'];
258
- // Matches the usual SYMLOOP_MAX, so a link cycle ends in an error instead of a hang.
259
- const MAX_LINK_HOPS = 40;
260
- function errnoCode(err) {
261
- return 'code' in err ? String(err.code) : '';
262
- }
263
- /** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried before it is reported. */
264
- function renameOnto(tmp, target) {
265
- const deadline = Date.now() + RENAME_RETRY_MS;
266
- const idle = new Int32Array(new SharedArrayBuffer(4));
267
- for (let pause = 10;; pause = Math.min(pause * 2, 200)) {
268
- try {
269
- fs.renameSync(tmp, target);
270
- return;
271
- }
272
- catch (err) {
273
- const transient = process.platform === 'win32' && err instanceof Error && WINDOWS_RENAME_REFUSALS.includes(errnoCode(err));
274
- const left = deadline - Date.now();
275
- if (!transient || left <= 0)
276
- throw err;
277
- Atomics.wait(idle, 0, 0, Math.min(pause, left));
278
- }
279
- }
280
- }
281
- /** Where a write to `file` lands: through any symlink, a dangling one included, so a dotfile manager's link survives. */
282
- function writeTarget(file) {
283
- let target = file;
284
- for (let hop = 0; hop < MAX_LINK_HOPS && fs.lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink(); hop++) {
285
- target = path.resolve(path.dirname(target), fs.readlinkSync(target));
286
- }
287
- return fs.existsSync(target) ? fs.realpathSync(target) : target;
288
- }
289
- /** Gives the replacement the old file's exact mode (umask trims the create mode) and, for root, its owner. */
290
- function keepAccess(tmp, old) {
291
- fs.chmodSync(tmp, old.mode & 0o777);
292
- if (process.getuid?.() === 0)
293
- fs.chownSync(tmp, old.uid, old.gid);
294
- }
295
- /** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays the one thrown. */
296
- function removeTemp(tmp) {
297
- try {
298
- fs.rmSync(tmp, { force: true });
299
- }
300
- catch (err) {
301
- log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
302
- }
303
- }
304
- function replaceViaTemp(target, text, old) {
305
- const tmp = `${target}.${process.pid}.tmp`;
306
- try {
307
- fs.writeFileSync(tmp, text, { encoding: 'utf8', mode: (old?.mode ?? 0o666) & 0o777 });
308
- if (old)
309
- keepAccess(tmp, old);
310
- renameOnto(tmp, target);
311
- }
312
- catch (err) {
313
- removeTemp(tmp);
314
- throw err;
315
- }
316
- }
317
- /** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps hard links together. */
318
- function writeInPlace(target, text) {
319
- try {
320
- fs.writeFileSync(target, text, 'utf8');
321
- }
322
- catch (err) {
323
- if (!(err instanceof Error))
324
- throw err;
325
- const reason = errnoCode(err) === 'EBUSY'
326
- ? 'is in use by another program, so hippo could not replace it; close that program and run the command again'
327
- : `could not be replaced (${errnoCode(err) || err.message})`;
328
- throw new Error(`${target} ${reason}`, { cause: err });
329
- }
330
- }
331
263
  /** Swaps the file in with one rename, so a crash mid-write cannot leave a truncated settings.json that Claude Code cannot parse. */
332
264
  export function writeSettingsFile(file, settings) {
333
- const target = writeTarget(file);
334
- const text = JSON.stringify(settings, null, 2) + '\n';
335
- const old = fs.statSync(target, { throwIfNoEntry: false });
336
- if (old === undefined) {
337
- fs.mkdirSync(path.dirname(target), { recursive: true });
338
- }
339
- else {
340
- // A rename replaces a read-only file that the in-place write refused, and Windows would retry that refusal for a second.
341
- fs.accessSync(target, fs.constants.W_OK);
342
- }
343
- if (old !== undefined && old.nlink > 1) {
344
- // A rename gives the file a new inode, which would leave the other hard links on the old content.
345
- writeInPlace(target, text);
346
- return;
347
- }
348
- try {
349
- replaceViaTemp(target, text, old);
350
- }
351
- catch (err) {
352
- if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
353
- throw err;
354
- writeInPlace(target, text);
355
- }
265
+ writeFileAtomic(file, JSON.stringify(settings, null, 2) + '\n');
356
266
  }
357
267
  function migrateLegacyClaudeHooks(hooks) {
358
268
  const migratedFromStop = stripHandlers(hooks, 'Stop', runsHippo(HIPPO_SLEEP_MARKER));
@@ -397,13 +307,7 @@ const CLAUDE_HOOK_MARKERS = [
397
307
  ];
398
308
  // Stop is only ever migrated away, so install never appends to it and a Stop that is not a list does not block the install.
399
309
  const CLAUDE_APPENDED_EVENTS = CLAUDE_HOOK_MARKERS.map(([event]) => event).filter((event) => event !== 'Stop');
400
- function installClaudeCodeHooks(settingsPath, settings, logFile) {
401
- const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
402
- if (merge === null)
403
- return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
404
- // SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
405
- const hooks = merge;
406
- const migration = migrateLegacyClaudeHooks(hooks);
310
+ function appendSessionHooks(hooks, logFile) {
407
311
  const installedSessionEnd = appendHookIfMissing(hooks, 'SessionEnd', HIPPO_SESSION_END_MARKER, claudeCommandGroup(`hippo session-end --log-file "${logFile}"`, 5));
408
312
  const installedSessionStart = appendHookIfMissing(hooks, 'SessionStart', HIPPO_LAST_SLEEP_MARKER, claudeCommandGroup(`hippo last-sleep --path "${logFile}"`, 5));
409
313
  // Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
@@ -413,6 +317,9 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
413
317
  // before the user pins them explicitly.
414
318
  const migratedPinnedInjectRecent = migratePinnedInjectRecentCommands(hooks.UserPromptSubmit);
415
319
  const installedUserPromptSubmit = appendHookIfMissing(hooks, 'UserPromptSubmit', HIPPO_PINNED_INJECT_MARKER, claudeCommandGroup(HIPPO_PINNED_INJECT_COMMAND, 5));
320
+ return { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit };
321
+ }
322
+ function appendCompactionHooks(hooks) {
416
323
  // PreCompact: fires on manual AND auto compaction (no matcher). Records the compaction, asks the
417
324
  // summariser for a "Memories for hippo" list and saves a working-state snapshot before the summary drops detail.
418
325
  // Exit-0 contract lives in the verb itself (src/capture.ts cmdPreCompact),
@@ -428,6 +335,17 @@ function installClaudeCodeHooks(settingsPath, settings, logFile) {
428
335
  // PostCompact: saves the memories the summariser listed and prints one line, which Claude Code only shows.
429
336
  // PreCompact stdout, by contrast, is handed to the summariser as instructions, so pre-compact prints just the request.
430
337
  const installedPostCompact = appendHookIfMissing(hooks, 'PostCompact', HIPPO_POST_COMPACT_MARKER, claudeCommandGroup(`hippo post-compact --log-file "${defaultPreCompactLogPath()}"`, 10));
338
+ return { installedPreCompact, installedCompactResume, installedPostCompact };
339
+ }
340
+ function installClaudeCodeHooks(settingsPath, settings, logFile) {
341
+ const merge = ensureHooksObject(settings, CLAUDE_APPENDED_EVENTS);
342
+ if (merge === null)
343
+ return { ...nothingInstalled('claude-code', settingsPath), invalidJson: true };
344
+ // SAFETY: ensureHooksObject left every event hippo appends to absent or an array.
345
+ const hooks = merge;
346
+ const migration = migrateLegacyClaudeHooks(hooks);
347
+ const { installedSessionEnd, installedSessionStart, migratedPinnedInjectRecent, installedUserPromptSubmit } = appendSessionHooks(hooks, logFile);
348
+ const { installedPreCompact, installedCompactResume, installedPostCompact } = appendCompactionHooks(hooks);
431
349
  // PostToolUseFailure: a failed tool call becomes an error memory, after
432
350
  // `hippo capture-error` drops routine failures (interrupts, declined
433
351
  // permissions, empty searches) and repeats. Same hook the plugin ships.
@@ -490,7 +408,7 @@ export function uninstallJsonHooks(target) {
490
408
  // Never rewrite a settings file we cannot parse; report nothing uninstalled.
491
409
  return false;
492
410
  }
493
- if (!isJsonObject(settings) || !isJsonObject(settings.hooks))
411
+ if (!isJsonObjectLiteral(settings) || !isJsonObjectLiteral(settings.hooks))
494
412
  return false;
495
413
  const hooks = settings.hooks;
496
414
  const changed = target === 'codex' ? uninstallCodexHooks(hooks) : uninstallClaudeCodeHooks(hooks);
@@ -510,7 +428,7 @@ export function checkUninstallable(target) {
510
428
  return { settingsPath, invalidJson: false };
511
429
  try {
512
430
  const settings = readJsonFile(settingsPath);
513
- return { settingsPath, invalidJson: !isJsonObject(settings) || (settings.hooks !== undefined && !isJsonObject(settings.hooks)) };
431
+ return { settingsPath, invalidJson: !isJsonObjectLiteral(settings) || (settings.hooks !== undefined && !isJsonObjectLiteral(settings.hooks)) };
514
432
  }
515
433
  catch {
516
434
  return { settingsPath, invalidJson: true };