hippo-memory 1.70.0 → 1.72.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 (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -5,18 +5,12 @@ import { spawn } from 'child_process';
5
5
  import { resolveCodexSessionTranscript } from '../hooks/codex-session.js';
6
6
  import { resolveCodexWrapperPaths } from '../hooks/codex-wrapper.js';
7
7
  import { resolveJsonHookPaths } from '../hooks/json-hooks.js';
8
- import { isInitialized } from '../store/open.js';
9
- import { loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, closeTaskSnapshotsForSession, listSessionEvents, } from '../store/sessions.js';
10
- import { writeSessionEndHandoff } from '../store/handoffs.js';
11
8
  import { readSessionScan, recordSessionDigest } from '../capture/session-digest.js';
12
- import { openHippoDb, closeHippoDb } from '../db/index.js';
13
9
  import { captureToolFailure } from '../capture/capture-error.js';
14
- import { readApiCalls, recordRereads, } from '../store/token-ledger.js';
15
10
  import { estimateTokens } from '../util/token-text.js';
16
11
  import { currentMachine, importSessionFolder } from '../agent-memories/sync.js';
17
12
  import { summaryLine } from '../agent-memories/report.js';
18
- import { resolveProjectIdentity } from '../core/project-identity.js';
19
- import { getGlobalRoot } from '../sharing/shared.js';
13
+ import { resolveProjectIdentity, isInitialized } from '../core/project-identity.js';
20
14
  import { cmdCapture } from '../capture/command.js';
21
15
  import { cmdPreCompact, cmdPostCompact } from '../capture/compact.js';
22
16
  import { transcriptWorkingState } from '../capture/working-state.js';
@@ -26,88 +20,63 @@ import { loadTurnPosition, runSessionWorker, saveTurnPosition, turnsAfter } from
26
20
  import { isStringValue, readSessionEnd, readVscodeStop } from '../core/capture-contract.js';
27
21
  import { loadConfig } from '../core/config.js';
28
22
  import { autoSleepDue } from '../api/auto-sleep.js';
29
- import { truncateCodePointSafe } from '../util/transcript-tail.js';
30
- import { COMPACTION_DB_WAIT_MS } from '../capture/compaction-record.js';
31
- import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from '../api/context-render.js';
23
+ import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
24
+ import { bookSessionRereads, closeEndedSession, compactResumeBlock } from '../api/session-end.js';
32
25
  import { normaliseHookPayload, readHookStdin, readStdinBounded } from './stdin.js';
33
- import { resolveTenantId } from '../store/tenant.js';
34
26
  import { errorMessage, log } from '../util/log.js';
35
27
  import { bookLedgerTurn } from '../api/ledger-db.js';
36
- import { flushDeliveryRecorder } from '../api/prompt-hook.js';
28
+ import { flushDeliveryRecorder, startDeliveryRecorder, startToolFailureRecorder } from '../api/prompt-hook.js';
37
29
  import { printError } from './output.js';
38
30
  import { cmdLastSleep } from './last-sleep.js';
39
31
  import { readCompactResumePayload } from './compact-resume-payload.js';
32
+ import { cliApiContext } from './api-context.js';
40
33
  import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
41
- import { logSessionEndImport, appendSessionEndCloseLog, resetHookInjection, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, startDeliveryRecorder } from './hook-runtime.js';
42
- /**
43
- * SessionStart(compact) injector. Prints the active task snapshot + recent
44
- * session trail so working state that would otherwise be lost to
45
- * compaction summarisation survives into the new context window. No pinned
46
- * memories here — the UserPromptSubmit hook already re-injects those every
47
- * turn, so duplicating them here would double token cost for nothing.
48
- *
49
- * Same exit-0/crash-safety contract as `hippo pre-compact`: every path
50
- * exits 0. A malformed payload or a store read failure
51
- * degrades to empty stdout, never a thrown error — a failing SessionStart
52
- * hook must not pollute session startup.
53
- */
54
- function cmdCompactResume(hippoRoot, stdinText, stdinTimedOut) {
34
+ import { logSessionEndImport, appendSessionEndCloseLog, reportSessionEndFailure, resetHookInjection, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, hostSessionId, } from './hook-runtime.js';
35
+ import { CliExit } from './exit.js';
36
+ /** SessionStart(compact) injector: prints the task snapshot and session trail lost to compaction; no pinned memories (UserPromptSubmit re-injects them).
37
+ * Every path exits 0: a malformed payload or store read failure degrades to empty stdout, never a throw. */
38
+ function cmdCompactResume(hippoRoot, tenantId, stdinText, stdinTimedOut) {
55
39
  let rec = null;
56
40
  try {
57
41
  // Gate on the non-exiting isInitialized check first: the store reads below call initStore, which would
58
42
  // silently create a store in a project that never ran `hippo init`, and this hook fires globally.
59
43
  if (!isInitialized(hippoRoot)) {
60
- process.exit(0);
44
+ throw new CliExit(0);
61
45
  }
62
46
  const payloadState = readCompactResumePayload(stdinText, stdinTimedOut);
63
47
  let suppressOutput = payloadState.suppressOutput;
64
48
  const payloadSessionId = payloadState.payloadSessionId;
65
- if (payloadState.boundary)
66
- rec = startDeliveryRecorder(hippoRoot, stdinText, 'claude-code', 'compact-resume');
49
+ if (payloadState.boundary) {
50
+ rec = startDeliveryRecorder(cliApiContext(hippoRoot, tenantId), {
51
+ stdinText, runtime: 'claude-code', eventType: 'compact-resume', envSessionId: hostSessionId(),
52
+ });
53
+ }
67
54
  // A compaction follows a prompt or SessionStart that booked the arm, so this only reads it.
68
- if (!suppressOutput && payloadSessionId !== null && inPilotHoldout(hippoRoot, resolveTenantId({}), payloadSessionId, false)) {
55
+ if (!suppressOutput && payloadSessionId !== null && inPilotHoldout(hippoRoot, tenantId, payloadSessionId, false)) {
69
56
  suppressOutput = true;
70
57
  rec?.disabled();
71
58
  }
72
59
  if (!suppressOutput)
73
- restoreCompactSnapshot(hippoRoot, payloadSessionId, rec);
60
+ restoreCompactSnapshot(hippoRoot, tenantId, payloadSessionId, rec);
74
61
  }
75
62
  catch (err) {
63
+ if (err instanceof CliExit)
64
+ throw err;
76
65
  // Empty stdout on any store error, never a crashed SessionStart; the reason goes to stderr, which the model never sees.
77
66
  log.warn(`hippo compact-resume: skipped: ${errorMessage(err)}`);
78
67
  }
79
68
  // A no-op when the token ledger's handle already wrote the row; exit would drop it otherwise.
80
69
  flushDeliveryRecorder(rec);
81
- process.exit(0);
70
+ throw new CliExit(0);
82
71
  }
83
- function restoreCompactSnapshot(hippoRoot, payloadSessionId, rec) {
84
- const tenantId = resolveTenantId({});
85
- const snapshot = loadFreshActiveTaskSnapshot(hippoRoot, tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS });
86
- // Concurrent sessions must not cross-restore. Only suppress when BOTH ids are present and differ;
87
- // either side missing, or a manual invocation with no payload session_id, still prints.
88
- const sessionMismatch = !!snapshot &&
89
- payloadSessionId !== null &&
90
- snapshot.session_id !== null &&
91
- payloadSessionId !== snapshot.session_id;
92
- if (!snapshot || sessionMismatch)
72
+ function restoreCompactSnapshot(hippoRoot, tenantId, payloadSessionId, rec) {
73
+ const text = compactResumeBlock(cliApiContext(hippoRoot, tenantId), payloadSessionId);
74
+ if (text === null)
93
75
  return;
94
- // Loaded before the print so a bad trail row costs the trail, not the snapshot; stderr stays out of the model's context.
95
- let events = [];
96
- try {
97
- if (snapshot.session_id) {
98
- events = listSessionEvents(hippoRoot, tenantId, { session_id: snapshot.session_id }).map((e) => ({
99
- ...e,
100
- content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP),
101
- }));
102
- }
103
- }
104
- catch (err) {
105
- log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
106
- }
107
76
  // Printed in one write so the ledger books exactly the text the model is handed.
108
- const text = compactResumeText(snapshot, events);
109
77
  console.log(text);
110
- rec?.delivered({ state: 'sent', emittedText: `${text}\n` });
78
+ rec?.delivered({ state: 'sent', emittedText: `${text}
79
+ ` });
111
80
  bookLedgerTurn(hippoRoot, {
112
81
  uses: [{
113
82
  tenantId, sessionId: payloadSessionId, surface: 'compact_resume', event: 'inject', items: 1, tokens: estimateTokens(text),
@@ -115,18 +84,9 @@ function restoreCompactSnapshot(hippoRoot, payloadSessionId, rec) {
115
84
  delivery: (write) => flushDeliveryRecorder(rec, write),
116
85
  });
117
86
  }
118
- /**
119
- * SessionEnd entry point. Claude Code / OpenCode fire this on /exit while
120
- * tearing down the TUI, which kills any child that is still running when
121
- * the parent returns. Running sleep + capture synchronously here means both
122
- * get SIGTERM'd mid-consolidation.
123
- *
124
- * So we do the minimum inline (read stdin for transcript_path), then spawn
125
- * a fully detached Node child that runs sleep → capture and exit the parent
126
- * immediately. The child writes to the log file and survives TUI teardown;
127
- * the next SessionStart reads the log via `hippo last-sleep`.
128
- */
129
- export async function cmdSessionEnd(hippoRoot, flags) {
87
+ /** SessionEnd entry: TUI teardown kills children still running, so read stdin inline, spawn a detached child that runs sleep then capture, and exit.
88
+ * The child logs to a file that the next SessionStart reads via `hippo last-sleep`. */
89
+ export async function handleSessionEnd({ hippoRoot, tenantId, flags }) {
130
90
  const runtime = hookRuntime(flags);
131
91
  const turn = flagIsTrue(flags, 'turn');
132
92
  // Copilot's hook command carries no path, since one quoted into it would need escaping for each shell; the log goes where the hook table used to point.
@@ -141,6 +101,10 @@ export async function cmdSessionEnd(hippoRoot, flags) {
141
101
  // Before the spawn, since the worker finds its store from the folder it inherits.
142
102
  const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
143
103
  const input = stop ?? sessionEndInput(stdinText, raw.timedOut, runtime);
104
+ // Only a host payload ends a session: a manual run and a reply's end (turn mode) are not boundaries.
105
+ const rec = !turn && input !== null && !input.manual
106
+ ? startDeliveryRecorder(cliApiContext(hookStoreRoot(root), tenantId), { stdinText, runtime, eventType: 'session-end', envSessionId: hostSessionId() })
107
+ : null;
144
108
  const sessionId = input?.sessionId ?? null;
145
109
  // Resolved here because only this process saw the payload; the worker captures just the path it is handed.
146
110
  // Always a hook, so never scan: an empty stdin here is not a manual run. The Copilot CLI's sessionEnd names no transcript, so its log is found by id.
@@ -159,9 +123,16 @@ export async function cmdSessionEnd(hippoRoot, flags) {
159
123
  flags['transcript'] = transcriptPath;
160
124
  if (sessionId)
161
125
  flags['session-id'] = sessionId;
162
- await cmdSessionEndWorker(root, flags);
126
+ try {
127
+ await cmdSessionEndWorker(root, tenantId, flags);
128
+ }
129
+ finally {
130
+ await runHookWithStores(() => flushDeliveryRecorder(rec));
131
+ }
163
132
  return;
164
133
  }
134
+ // After the spawn, so a locked store delays only the row; the hook's short lock wait bounds it.
135
+ await runHookWithStores(() => flushDeliveryRecorder(rec));
165
136
  }
166
137
  /** What the session-end payload named; null for one hippo refuses or one that never arrived, and the worker then runs with neither value. */
167
138
  function sessionEndInput(stdinText, timedOut, runtime) {
@@ -198,15 +169,18 @@ function vscodeStopInput(raw) {
198
169
  const receipt = readVscodeStop(raw.text, raw.timedOut);
199
170
  return receipt.status === 'received' && receipt.input.sessionId !== null && SESSION_ID_RE.test(receipt.input.sessionId) ? receipt.input : null;
200
171
  }
201
- export async function cmdSessionEndWorker(hippoRoot, flags) {
172
+ async function cmdSessionEndWorker(hippoRoot, tenantId, flags) {
202
173
  const sessionId = flags['session-id'];
203
- await runSessionWorker(isStringValue(sessionId) ? sessionId : null, flagIsTrue(flags, 'turn') ? 'turn' : 'full', (mode) => sessionEndWork(hippoRoot, flags, mode));
174
+ await runSessionWorker(isStringValue(sessionId) ? sessionId : null, flagIsTrue(flags, 'turn') ? 'turn' : 'full', (mode) => sessionEndWork(hippoRoot, tenantId, flags, mode));
204
175
  }
205
- async function sessionEndWork(hippoRoot, flags, mode) {
176
+ export function handleSessionEndWorker({ hippoRoot, tenantId, flags }) {
177
+ return cmdSessionEndWorker(hippoRoot, tenantId, flags);
178
+ }
179
+ async function sessionEndWork(hippoRoot, tenantId, flags, mode) {
206
180
  const transcriptPath = stringFlag(flags, 'transcript');
207
181
  const closeLogFile = stringFlag(flags, 'log-file') ?? null;
208
182
  const closeSessionId = stringFlag(flags, 'session-id') ?? null;
209
- const rereadLog = await bookSessionRereads(hippoRoot, transcriptPath, closeSessionId)
183
+ const rereadLog = await bookSessionRereads(cliApiContext(hippoRoot, tenantId), transcriptPath, closeSessionId)
210
184
  .catch((err) => [`re-read count failed: ${errorMessage(err)}`]);
211
185
  // Sleep starts the log file afresh, so the lines go in after it; on exit too, in case sleep exits the process.
212
186
  const flushRereadLog = () => { for (const line of rereadLog.splice(0))
@@ -220,57 +194,41 @@ async function sessionEndWork(hippoRoot, flags, mode) {
220
194
  return;
221
195
  }
222
196
  if (mode === 'turn' && closeSessionId)
223
- await sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, closeSessionId);
197
+ await sleepIfDue(hippoRoot, tenantId, flags, closeLogFile, transcriptPath, closeSessionId);
224
198
  else
225
- await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
199
+ await sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
226
200
  flushRereadLog();
227
201
  const digestLog = (message) => appendSessionEndCloseLog(closeLogFile, message);
228
202
  const scan = transcriptPath ? readSessionScan(transcriptPath, digestLog) : null;
229
- const capture = (turns) => captureEndedSession(hippoRoot, store, flags, transcriptPath, turns);
203
+ const capture = (turns) => captureEndedSession(hippoRoot, tenantId, store, flags, transcriptPath, turns);
230
204
  if (mode === 'turn')
231
205
  captureNewTurns(transcriptPath, closeSessionId, scan, capture, digestLog);
232
206
  else
233
207
  capture(scan?.turns);
234
208
  recordSessionDigest(hippoRoot, scan, {
235
209
  key: closeSessionId || path.basename(transcriptPath ?? '', '.jsonl'),
236
- tenantId: resolveTenantId({}),
210
+ tenantId,
237
211
  log: digestLog,
238
212
  });
239
- // Close only this session's snapshot, after sleep+capture: no snapshot producer runs in session-end, and since
240
- // session-end may never fire (crash, kill -9) the freshness bound in loadFreshActiveTaskSnapshot is the backstop.
241
- // The handoff is written first, while the snapshot writeSessionEndHandoff reads is still active.
242
- if (closeSessionId)
243
- writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile, mode === 'turn');
244
- if (mode === 'turn') {
245
- // The chat goes on after a reply, so its snapshot stays for the next compaction to restore.
246
- appendSessionEndCloseLog(closeLogFile, 'skip snapshot close: turn mode');
247
- return;
248
- }
249
- closeEndedSessionSnapshot(store, closeSessionId, closeLogFile);
250
- }
251
- function closeEndedSessionSnapshot(store, closeSessionId, closeLogFile) {
252
- try {
253
- if (closeSessionId) {
254
- const closed = closeTaskSnapshotsForSession(store, resolveTenantId({}), closeSessionId);
255
- appendSessionEndCloseLog(closeLogFile, `closed ${closed} active snapshot(s) for session ${closeSessionId}`);
256
- }
257
- else {
258
- appendSessionEndCloseLog(closeLogFile, 'skip: no session_id in SessionEnd payload, active snapshot left untouched');
259
- }
260
- }
261
- catch (err) {
262
- appendSessionEndCloseLog(closeLogFile, `snapshot close failed: ${errorMessage(err)}`);
263
- }
213
+ // Only this session's snapshot, and only after sleep and capture.
214
+ const closeLog = (line) => appendSessionEndCloseLog(closeLogFile, line);
215
+ closeEndedSession(cliApiContext(store, tenantId), {
216
+ sessionId: closeSessionId,
217
+ turn: mode === 'turn',
218
+ workingState: () => (transcriptPath ? transcriptWorkingState(transcriptPath, closeLog) : null),
219
+ evidence: () => collectHandoffEvidence(process.cwd(), 'unknown'),
220
+ log: closeLog,
221
+ });
264
222
  }
265
- async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath) {
223
+ async function sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath) {
266
224
  // Sleeping the global store from here would learn this folder's git commits into it; it has its own daily sleep.
267
225
  if (isInitialized(hippoRoot)) {
268
226
  try {
269
- await (await import('./sleep.js')).cmdSleep(hippoRoot, flags);
227
+ await (await import('./sleep.js')).cmdSleep(hippoRoot, tenantId, flags);
270
228
  }
271
229
  catch (err) {
272
- // cmdSleep writes its failure line only when it has a log file, and capture runs regardless.
273
- log.debug(`session-end: sleep failed: ${errorMessage(err)}`);
230
+ // cmdSleep writes its own failure line only once its log tee is open, and capture runs regardless.
231
+ reportSessionEndFailure(closeLogFile, 'session-end: sleep', err);
274
232
  }
275
233
  }
276
234
  else {
@@ -279,18 +237,18 @@ async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath)
279
237
  }
280
238
  }
281
239
  /** A close after every reply sleeps only at the MCP server's auto-sleep threshold; each line starts the log afresh, as a sleep does. */
282
- async function sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, sessionId) {
240
+ async function sleepIfDue(hippoRoot, tenantId, flags, closeLogFile, transcriptPath, sessionId) {
283
241
  if (!isInitialized(hippoRoot))
284
- return sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
242
+ return sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
285
243
  const prefix = `turn close, session ${sessionId}`;
286
244
  try {
287
- const { enabled, count, threshold, due } = autoSleepDue(hippoRoot, resolveTenantId({}), loadConfig(hippoRoot).autoSleep);
245
+ const { enabled, count, threshold, due } = autoSleepDue(hippoRoot, tenantId, loadConfig(hippoRoot).autoSleep);
288
246
  if (!due) {
289
247
  const why = enabled ? `${count} new memories, threshold ${threshold}` : 'auto-sleep is off';
290
248
  appendSessionEndCloseLog(closeLogFile, `${prefix}: skip sleep, ${why}`, { startFresh: true });
291
249
  return;
292
250
  }
293
- await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
251
+ await sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
294
252
  appendSessionEndCloseLog(closeLogFile, `${prefix}: ran sleep at ${count} new memories (threshold ${threshold})`);
295
253
  }
296
254
  catch (err) {
@@ -312,7 +270,7 @@ function captureNewTurns(transcriptPath, sessionId, scan, capture, log) {
312
270
  saveTurnPosition(sessionId, transcriptPath, scan.turns, log);
313
271
  }
314
272
  /** True when capture ran to the end, so a turn close may move its cursor past these turns. */
315
- function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
273
+ function captureEndedSession(hippoRoot, tenantId, store, flags, transcriptPath, turns) {
316
274
  try {
317
275
  const logFile = stringFlag(flags, 'log-file');
318
276
  // With no stdin of its own, capture would read this as a manual run and scan every project.
@@ -326,7 +284,7 @@ function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
326
284
  logFile,
327
285
  dryRun: false,
328
286
  global: false,
329
- tenantId: resolveTenantId({}),
287
+ tenantId,
330
288
  // In the global store, rows would otherwise read as user-global and show up in every project.
331
289
  originProject: store === hippoRoot ? undefined : resolveProjectIdentity(process.cwd()),
332
290
  sessionTurns: turns,
@@ -334,69 +292,16 @@ function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
334
292
  return true;
335
293
  }
336
294
  catch (err) {
337
- log.debug(`session-end: capture failed: ${errorMessage(err)}`);
295
+ reportSessionEndFailure(stringFlag(flags, 'log-file') ?? null, 'session-end: capture', err);
338
296
  return false;
339
297
  }
340
298
  }
341
- function writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile, inPlace = false) {
342
- try {
343
- const tenantId = resolveTenantId({});
344
- const ownSnapshot = loadActiveTaskSnapshot(store, tenantId)?.session_id === closeSessionId;
345
- // A never-compacted session has no snapshot; read even when it has one, as another session's PreCompact can take the slot before the write.
346
- const derived = transcriptPath
347
- ? transcriptWorkingState(transcriptPath, (message) => appendSessionEndCloseLog(closeLogFile, message))
348
- : null;
349
- if (!ownSnapshot && !derived) {
350
- appendSessionEndCloseLog(closeLogFile, 'skip: no snapshot or transcript for session');
351
- }
352
- else {
353
- const evidence = collectHandoffEvidence(process.cwd(), 'unknown');
354
- const handoff = writeSessionEndHandoff(store, tenantId, closeSessionId, evidence, derived, undefined, { inPlace });
355
- appendSessionEndCloseLog(closeLogFile, handoff ? `wrote handoff for session ${closeSessionId}` : `skip: kept the existing handoff for session ${closeSessionId}`);
356
- }
357
- }
358
- catch (err) {
359
- // SAFETY: catch clauses bind unknown, but Node/V8 always throws an Error here.
360
- appendSessionEndCloseLog(closeLogFile, `handoff write failed: ${errorMessage(err)}`);
361
- }
362
- }
363
- /** Books the ending session's re-reads in each store its ledger rows can land in (project and global); returns the log lines. */
364
- async function bookSessionRereads(hippoRoot, transcriptPath, sessionId) {
365
- if (!transcriptPath || !sessionId)
366
- return [];
367
- let read;
368
- try {
369
- read = await readApiCalls(transcriptPath);
370
- }
371
- catch (err) {
372
- return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
373
- }
374
- const roots = new Set([hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
375
- const lines = [];
376
- let tokens = 0;
377
- for (const root of roots) {
378
- try {
379
- const db = openHippoDb(root);
380
- try {
381
- tokens += recordRereads(db, resolveTenantId({}), sessionId, read.calls);
382
- }
383
- finally {
384
- closeHippoDb(db);
385
- }
386
- }
387
- catch (err) {
388
- lines.push(`re-read count failed: ${errorMessage(err)}`);
389
- }
390
- }
391
- const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
392
- lines.push(`re-read ${tokens} tokens over ${read.calls.length} model calls for session ${sessionId}${skipped}`);
393
- return lines;
394
- }
395
299
  function loadCodexWrapperMetadata() {
396
300
  const { metadataPath } = resolveCodexWrapperPaths();
397
301
  if (!fs.existsSync(metadataPath)) {
398
302
  throw new Error('Codex wrapper is not installed. Run `hippo hook install codex` first.');
399
303
  }
304
+ // SAFETY: the file is the one installCodexWrapper wrote; handleCodexRun reads only logFile and realCodexPath from it.
400
305
  return JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
401
306
  }
402
307
  /** Quotes one cmd.exe argument; each `%` leaves the quotes as `^%`, so no %NAME% pair can expand. */
@@ -423,7 +328,7 @@ function spawnRealCodex(realCodexPath, forwardArgs, cwd) {
423
328
  }
424
329
  return spawn(realCodexPath, forwardArgs, { cwd, stdio: 'inherit', windowsHide: false });
425
330
  }
426
- export function cmdCodexRun(hippoRoot, args) {
331
+ export function handleCodexRun({ hippoRoot, tenantId, args }) {
427
332
  const metadata = loadCodexWrapperMetadata();
428
333
  const startedAtMs = Date.now();
429
334
  // Codex reads CODEX_HOME at each launch, so resolve it now, not from the install-time metadata.
@@ -441,11 +346,11 @@ export function cmdCodexRun(hippoRoot, args) {
441
346
  process.exit(1);
442
347
  });
443
348
  child.on('exit', async (code, signal) => {
444
- await launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, metadata.logFile);
349
+ await launchCodexSessionEndWorker(hippoRoot, tenantId, historyPath, startOffsetBytes, startedAtMs, metadata.logFile);
445
350
  exitLikeChild(code, signal);
446
351
  });
447
352
  }
448
- async function launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, logFile) {
353
+ async function launchCodexSessionEndWorker(hippoRoot, tenantId, historyPath, startOffsetBytes, startedAtMs, logFile) {
449
354
  const workerArgs = [
450
355
  process.argv[1],
451
356
  '__codex-session-end-worker',
@@ -460,30 +365,40 @@ async function launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBy
460
365
  '--log-file',
461
366
  logFile,
462
367
  ];
368
+ if (await detachedWorkerStarted(workerArgs))
369
+ return;
370
+ // Awaited so the sleep write can't be killed by the exit calls below.
463
371
  try {
464
- const worker = spawn(process.execPath, workerArgs, {
465
- detached: true,
466
- stdio: 'ignore',
467
- windowsHide: true,
372
+ await cmdCodexSessionEndWorker(hippoRoot, tenantId, {
373
+ 'codex-home': path.dirname(historyPath),
374
+ 'history-path': historyPath,
375
+ 'start-offset': String(startOffsetBytes),
376
+ 'started-at': String(startedAtMs),
377
+ 'log-file': logFile,
468
378
  });
469
- worker.unref();
470
379
  }
471
- catch (err) {
472
- log.debug(`codex run: the session-end worker did not spawn, running inline: ${errorMessage(err)}`);
473
- // Awaited so the sleep write can't be killed by the exit calls below.
380
+ catch (inlineErr) {
381
+ log.debug(`codex run: the inline session-end failed: ${errorMessage(inlineErr)}`);
382
+ }
383
+ }
384
+ /** Resolves true once the detached worker is running, false when the spawn fails, whether it throws or reports later. */
385
+ function detachedWorkerStarted(workerArgs) {
386
+ return new Promise((resolve) => {
387
+ const failed = (reason) => {
388
+ log.debug(`codex run: the session-end worker did not spawn, running inline: ${reason}`);
389
+ resolve(false);
390
+ };
474
391
  try {
475
- await cmdCodexSessionEndWorker(hippoRoot, {
476
- 'codex-home': path.dirname(historyPath),
477
- 'history-path': historyPath,
478
- 'start-offset': String(startOffsetBytes),
479
- 'started-at': String(startedAtMs),
480
- 'log-file': logFile,
481
- });
392
+ const worker = spawn(process.execPath, workerArgs, { detached: true, stdio: 'ignore', windowsHide: true });
393
+ // An async spawn failure (ENOENT, EAGAIN) arrives as an 'error' event, which a try cannot catch.
394
+ worker.on('error', (err) => failed(err.message));
395
+ worker.once('spawn', () => resolve(true));
396
+ worker.unref();
482
397
  }
483
- catch (inlineErr) {
484
- log.debug(`codex run: the inline session-end failed: ${errorMessage(inlineErr)}`);
398
+ catch (err) {
399
+ failed(errorMessage(err));
485
400
  }
486
- }
401
+ });
487
402
  }
488
403
  function exitLikeChild(code, signal) {
489
404
  if (signal) {
@@ -498,7 +413,7 @@ function exitLikeChild(code, signal) {
498
413
  }
499
414
  process.exit(code ?? 0);
500
415
  }
501
- export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
416
+ export async function cmdCodexSessionEndWorker(hippoRoot, tenantId, flags) {
502
417
  const logFile = stringFlag(flags, 'log-file');
503
418
  // Like the other hooks: project store, else global; a folder with neither must not get one made.
504
419
  const store = hookStoreRoot(hippoRoot);
@@ -506,17 +421,20 @@ export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
506
421
  appendSessionEndCloseLog(logFile ?? null, 'skip: no hippo store for this folder or globally', { startFresh: true });
507
422
  return;
508
423
  }
509
- await sleepCodexProjectStore(hippoRoot, logFile);
510
- captureCodexTranscript(hippoRoot, store, flags, logFile);
424
+ await sleepCodexProjectStore(hippoRoot, tenantId, logFile);
425
+ captureCodexTranscript(hippoRoot, tenantId, store, flags, logFile);
426
+ }
427
+ export function handleCodexSessionEndWorker({ hippoRoot, tenantId, flags }) {
428
+ return cmdCodexSessionEndWorker(hippoRoot, tenantId, flags);
511
429
  }
512
- async function sleepCodexProjectStore(hippoRoot, logFile) {
430
+ async function sleepCodexProjectStore(hippoRoot, tenantId, logFile) {
513
431
  // Sleeping the global store from here would learn this folder's git commits into it; it has its own daily sleep.
514
432
  if (isInitialized(hippoRoot)) {
515
433
  try {
516
- await (await import('./sleep.js')).cmdSleep(hippoRoot, logFile ? { 'log-file': logFile } : {});
434
+ await (await import('./sleep.js')).cmdSleep(hippoRoot, tenantId, logFile ? { 'log-file': logFile } : {});
517
435
  }
518
436
  catch (err) {
519
- log.debug(`codex session-end: sleep failed: ${errorMessage(err)}`);
437
+ reportSessionEndFailure(logFile ?? null, 'codex session-end: sleep', err);
520
438
  }
521
439
  }
522
440
  else {
@@ -524,7 +442,7 @@ async function sleepCodexProjectStore(hippoRoot, logFile) {
524
442
  logSessionEndImport(logFile ?? null, undefined);
525
443
  }
526
444
  }
527
- function captureCodexTranscript(hippoRoot, store, flags, logFile) {
445
+ function captureCodexTranscript(hippoRoot, tenantId, store, flags, logFile) {
528
446
  try {
529
447
  const codexHome = stringFlag(flags, 'codex-home') ?? resolveCodexWrapperPaths().codexHome;
530
448
  const historyPath = stringFlag(flags, 'history-path') ?? path.join(codexHome, 'history.jsonl');
@@ -549,7 +467,7 @@ function captureCodexTranscript(hippoRoot, store, flags, logFile) {
549
467
  logFile,
550
468
  dryRun: false,
551
469
  global: false,
552
- tenantId: resolveTenantId({}),
470
+ tenantId,
553
471
  originProject: store === hippoRoot ? undefined : resolveProjectIdentity(process.cwd()),
554
472
  sessionTurns: scan?.turns,
555
473
  };
@@ -557,24 +475,26 @@ function captureCodexTranscript(hippoRoot, store, flags, logFile) {
557
475
  cmdCapture(store, captureOpts);
558
476
  }
559
477
  catch (err) {
560
- log.debug(`codex session-end: capture failed: ${errorMessage(err)}`);
478
+ reportSessionEndFailure(logFile ?? null, 'codex session-end: capture', err);
561
479
  }
562
480
  // The Codex wrapper passes no session id, so the rollout file names the session.
563
- recordSessionDigest(hippoRoot, scan, { key: path.basename(transcriptPath, '.jsonl'), tenantId: resolveTenantId({}), log: digestLog });
481
+ recordSessionDigest(hippoRoot, scan, { key: path.basename(transcriptPath, '.jsonl'), tenantId, log: digestLog });
564
482
  }
565
483
  catch (err) {
566
- log.debug(`codex session-end: transcript scan or digest failed: ${errorMessage(err)}`);
484
+ reportSessionEndFailure(logFile ?? null, 'codex session-end: transcript scan or digest', err);
567
485
  }
568
486
  }
569
- export async function handlePreCompact({ hippoRoot, flags }) {
487
+ export async function handlePreCompact({ hippoRoot, tenantId, flags }) {
570
488
  // Bounded wait, not a TTY guard: an idle non-TTY pipe must not hang.
571
489
  const { text: stdinText, timedOut: stdinTimedOut } = await readHookStdin();
572
490
  const runtime = hookRuntime(flags);
573
491
  const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
574
492
  await runHookWithStores(async () => {
575
493
  // Started before any store wait, so two fires of one hook carry timestamps close enough to match as duplicates.
576
- const rec = startDeliveryRecorder(hookStoreRoot(root), stdinText, runtime, 'pre-compact');
577
- resetHookInjection(root, stdinText, null);
494
+ const rec = startDeliveryRecorder(cliApiContext(hookStoreRoot(root), tenantId), {
495
+ stdinText, runtime, eventType: 'pre-compact', envSessionId: hostSessionId(),
496
+ });
497
+ resetHookInjection(root, tenantId, stdinText, null);
578
498
  await cmdPreCompact(hookStoreRoot(root), {
579
499
  stdinText,
580
500
  stdinTimedOut,
@@ -588,7 +508,8 @@ export async function handlePreCompact({ hippoRoot, flags }) {
588
508
  });
589
509
  }
590
510
  export async function handlePostCompact({ hippoRoot, flags }) {
591
- // PostCompact hook: saves the compaction summary and its memories, then prints one plain line, because Claude Code shows this hook's stdout as-is. Always exits 0.
511
+ // PostCompact hook: saves the compaction summary and its memories, then prints one plain line, because Claude Code shows this hook's
512
+ // stdout as-is. Always exits 0.
592
513
  const { text, timedOut } = await readHookStdin();
593
514
  const logFlag = flags['log-file'];
594
515
  const store = hookStoreRoot(hippoRoot);
@@ -596,7 +517,7 @@ export async function handlePostCompact({ hippoRoot, flags }) {
596
517
  stdinText: text,
597
518
  stdinTimedOut: timedOut,
598
519
  logFile: logFlag === true || logFlag === false || Array.isArray(logFlag) ? undefined : logFlag,
599
- // Passed in, since capture.ts importing the sync would close an import cycle.
520
+ // Passed in, since src/capture/ importing the sync would close an import cycle.
600
521
  afterSave: (transcriptPath, cwd, log) => {
601
522
  const report = importSessionFolder(store, transcriptPath, cwd, { machine: currentMachine(), busyWaitMs: COMPACTION_DB_WAIT_MS });
602
523
  const summary = summaryLine(report);
@@ -609,7 +530,7 @@ export async function handlePostCompact({ hippoRoot, flags }) {
609
530
  if (line !== null && line !== undefined)
610
531
  console.log(line);
611
532
  }
612
- export async function handleCaptureError({ hippoRoot, flags }) {
533
+ export async function handleCaptureError({ hippoRoot, tenantId, flags }) {
613
534
  // PostToolUseFailure hook: every path exits 0, and nothing is created
614
535
  // when no store exists (the hook fires in every directory).
615
536
  const { text } = await readHookStdin();
@@ -619,7 +540,15 @@ export async function handleCaptureError({ hippoRoot, flags }) {
619
540
  if (isInitialized(root) && payload) {
620
541
  // SAFETY: JSON.parse returns a JSON value by definition.
621
542
  const failure = JSON.parse(payload);
622
- await runHookWithStores(() => captureToolFailure(root, resolveTenantId({}), failure));
543
+ const rec = startToolFailureRecorder(cliApiContext(root, tenantId), { stdinText: text, runtime: hookRuntime(flags), envSessionId: hostSessionId() });
544
+ await runHookWithStores(() => {
545
+ try {
546
+ return captureToolFailure(root, tenantId, failure, (id) => rec?.logged(id));
547
+ }
548
+ finally {
549
+ flushDeliveryRecorder(rec);
550
+ }
551
+ });
623
552
  }
624
553
  }
625
554
  catch (err) {
@@ -627,14 +556,14 @@ export async function handleCaptureError({ hippoRoot, flags }) {
627
556
  log.warn(`failure capture skipped: ${errorMessage(err)}`);
628
557
  }
629
558
  }
630
- export async function handleCompactResume({ hippoRoot }) {
559
+ export async function handleCompactResume({ hippoRoot, tenantId }) {
631
560
  const { text: stdinText, timedOut: stdinTimedOut } = await readHookStdin();
632
561
  await runHookWithStores(() => {
633
- resetHookInjection(hippoRoot, stdinText, 'compact');
634
- cmdCompactResume(hookStoreRoot(hippoRoot), stdinText, stdinTimedOut);
562
+ resetHookInjection(hippoRoot, tenantId, stdinText, 'compact');
563
+ cmdCompactResume(hookStoreRoot(hippoRoot), tenantId, stdinText, stdinTimedOut);
635
564
  });
636
565
  }
637
- export async function handleCapture({ hippoRoot, flags }) {
566
+ export async function handleCapture({ hippoRoot, tenantId, flags }) {
638
567
  let captureSource = null;
639
568
  let captureFile;
640
569
  let transcriptPath;
@@ -655,10 +584,10 @@ export async function handleCapture({ hippoRoot, flags }) {
655
584
  }
656
585
  if (!captureSource) {
657
586
  printError('Usage: hippo capture --stdin|--file <path>|--last-session [--transcript <path>] [--log-file <path>] [--dry-run] [--global]');
658
- process.exit(1);
587
+ throw new CliExit(1);
659
588
  }
660
589
  // Bounded, and only when last-session has no explicit path: the
661
- // --stdin source keeps its own blocking read in capture.ts by design.
590
+ // --stdin source keeps its own blocking read in src/capture/ by design.
662
591
  const bounded = captureSource === 'last-session' && !transcriptPath
663
592
  ? await readHookStdin()
664
593
  : { text: undefined, timedOut: false };
@@ -671,7 +600,7 @@ export async function handleCapture({ hippoRoot, flags }) {
671
600
  logFile: stringFlag(flags, 'log-file'),
672
601
  dryRun: boolFlag(flags, 'dry-run'),
673
602
  global: boolFlag(flags, 'global'),
674
- tenantId: resolveTenantId({}),
603
+ tenantId,
675
604
  });
676
605
  }
677
606
  //# sourceMappingURL=session-hooks.js.map