hippo-memory 2.0.0 → 2.1.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 (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -1,13 +1,12 @@
1
1
  // Token-use and failure reports.
2
2
  import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
3
- import { storeFor } from '../store/sqlite/store.js';
4
- import { failureLogSummary, tokenUseSummary } from '../store/usage-reports.js';
5
- import { errorMessage, log } from '../util/log.js';
3
+ import { errorMessage, log, errorFields } from '../util/log.js';
6
4
  import { DAY_MS } from '../util/time.js';
7
- /** Records memory text handed to an agent in the token ledger. Best-effort: never throws, since a ledger failure must not fail the recall or context call. */
5
+ /** Records memory text handed to an agent in the token ledger. Best-effort: never throws, since a ledger failure must
6
+ * not fail the recall or context call. */
8
7
  export async function recordTokens(ctx, surface, use) {
9
8
  try {
10
- await storeFor(ctx).recordTokens({
9
+ await ctx.store.recordTokens({
11
10
  tenantId: ctx.tenantId,
12
11
  sessionId: use.sessionId ?? null,
13
12
  surface,
@@ -18,17 +17,17 @@ export async function recordTokens(ctx, surface, use) {
18
17
  }
19
18
  catch (err) {
20
19
  rethrowIfSqliteBlocked(err);
21
- log.warnThenDebug('api-token-ledger', `token ledger write failed; the reply is unaffected: ${errorMessage(err)}`);
20
+ log.warnThenDebug('api-token-ledger', `token ledger write failed; the reply is unaffected: ${errorMessage(err)}`, errorFields(err));
22
21
  }
23
22
  }
24
- /** Token ledger totals for the tenant over the last `days` days (default 30): tokens sent, skipped as unchanged and re-read,
25
- * per surface, with session counts and mean tokens per session. */
23
+ /** Token ledger totals for the tenant over the last `days` days (default 30): tokens sent, skipped as unchanged and
24
+ * re-read, per surface, with session counts and mean tokens per session. */
26
25
  export function tokenSummary(ctx, opts = {}) {
27
- return tokenUseSummary(ctx.hippoRoot, ctx.tenantId, reportWindowStart(opts.days));
26
+ return ctx.store.reports.tokenUse(ctx.tenantId, reportWindowStart(opts.days));
28
27
  }
29
28
  /** Failed tool calls by outcome, and repeats across sessions, over the last `days` days (default 30). */
30
29
  export function failureSummary(ctx, opts = {}) {
31
- return failureLogSummary(ctx.hippoRoot, ctx.tenantId, reportWindowStart(opts.days));
30
+ return ctx.store.reports.failures(ctx.tenantId, reportWindowStart(opts.days));
32
31
  }
33
32
  function reportWindowStart(days) {
34
33
  const span = days !== undefined && Number.isFinite(days) && days > 0 ? days : 30;
@@ -1,6 +1,9 @@
1
1
  import { BadRequestError } from '../core/api-errors.js';
2
- import type { HippoStore } from '../store/index.js';
3
- /** Actor identity + role for a Context: the audit-log subject (pass `ctx.actor.subject` to audit helpers) and the role for admin gating.
2
+ import { type HippoStore, type StoreGroup, type StoreWith } from '../store/index.js';
3
+ import type { HippoConfig } from '../core/config.js';
4
+ import type { StoreReach } from '../store/port.js';
5
+ /** Actor identity + role for a Context: the audit-log subject (pass `ctx.actor.subject` to audit helpers) and the role
6
+ * for admin gating.
4
7
  * Role checks happen at the request boundary (e.g. /v1/sleep), except in authCreate and authRevoke (ForbiddenError). */
5
8
  export interface Actor {
6
9
  /** 'cli' | 'localhost:cli' | 'api_key:<key_id>' | 'mcp' | 'connector:slack' | 'connector:github' */
@@ -10,7 +13,8 @@ export interface Actor {
10
13
  scopes?: readonly string[];
11
14
  /** An auth resolver vouched for this caller, so its admin role stops at its own tenant. */
12
15
  viaAuthResolver?: true;
13
- /** The host's operator (CLI, stdio MCP, keyless loopback set to admin, host-tenant admin key): may act beyond its tenant. */
16
+ /** The host's operator (CLI, stdio MCP, keyless loopback set to
17
+ * admin, host-tenant admin key): may act beyond its tenant. */
14
18
  hostAdmin?: true;
15
19
  owner?: string;
16
20
  }
@@ -19,19 +23,36 @@ export interface Context {
19
23
  tenantId: string;
20
24
  actor: Actor;
21
25
  store?: HippoStore;
26
+ /** Set by a composition root. Absent, the api reads one project and no global store, as for an integrator's store. */
27
+ reach?: StoreReach;
28
+ /** Set by a composition root per command or request; absent, the api reads the store's config.json. */
29
+ config?: HippoConfig;
22
30
  }
23
31
  export type HippoDbContext = Context & {
24
32
  store?: undefined;
25
33
  };
26
- /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
27
- * instead. */
34
+ /** A Context whose store a composition root already built; every
35
+ * api function that reads or writes the store takes this. */
36
+ export type StoreContext = Context & {
37
+ readonly store: HippoStore;
38
+ };
39
+ /** A Context whose store a gate proved holds `G`; the api function reads `ctx.store.<group>` directly. */
40
+ export type ContextWith<G extends StoreGroup> = Context & {
41
+ readonly store: StoreWith<G>;
42
+ };
43
+ /** `ctx` itself once its store proves every group, so a gate hands a handler the type with no copy; throws
44
+ * StoreNotPortedError for the first missing one. */
45
+ export declare function narrowContext<G extends StoreGroup>(ctx: StoreContext, ...groups: readonly [G, ...G[]]): ContextWith<G>;
46
+ /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed
47
+ * callers build Actor from the api_keys row instead. */
28
48
  export declare function adminActor(subject: string): Actor;
29
49
  /** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
30
50
  export declare function requireHostAdmin(ctx: Context, action: string): void;
31
51
  /** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
32
52
  export declare function ownerOrSubject(actor: Actor): string;
33
- /** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the message.
34
- * 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or 'invalid_scorer_window' (0 would hit an uncapped fallback). */
53
+ /** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
54
+ * message. 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
55
+ * 'invalid_scorer_window' (0 would hit an uncapped fallback). */
35
56
  export declare class RecallContractError extends BadRequestError {
36
57
  readonly code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window';
37
58
  constructor(code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window', message: string);
package/dist/api/types.js CHANGED
@@ -1,7 +1,15 @@
1
1
  // Request context (caller identity and tenant) shared by every API module, plus the recall contract error.
2
2
  import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
3
- /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
4
- * instead. */
3
+ import { narrowStore } from '../store/index.js';
4
+ /** `ctx` itself once its store proves every group, so a gate hands a handler the type with no copy; throws
5
+ * StoreNotPortedError for the first missing one. */
6
+ export function narrowContext(ctx, ...groups) {
7
+ narrowStore(ctx.store, ...groups);
8
+ // SAFETY: narrowStore above proved every group on ctx.store.
9
+ return ctx;
10
+ }
11
+ /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed
12
+ * callers build Actor from the api_keys row instead. */
5
13
  export function adminActor(subject) {
6
14
  return { subject, role: 'admin', hostAdmin: true };
7
15
  }
@@ -14,8 +22,9 @@ export function requireHostAdmin(ctx, action) {
14
22
  export function ownerOrSubject(actor) {
15
23
  return actor.owner ?? actor.subject;
16
24
  }
17
- /** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the message.
18
- * 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or 'invalid_scorer_window' (0 would hit an uncapped fallback). */
25
+ /** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
26
+ * message. 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
27
+ * 'invalid_scorer_window' (0 would hit an uncapped fallback). */
19
28
  export class RecallContractError extends BadRequestError {
20
29
  code;
21
30
  constructor(code, message) {
@@ -2,11 +2,17 @@ import { type Context } from '../api/types.js';
2
2
  import { type CallerProject } from '../api/prompt-hook.js';
3
3
  import type { ContinuityKey } from '../store/sessions.js';
4
4
  import { type WorkingState } from './working-state.js';
5
- /** Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns the key the call's rows go under. */
5
+ /**
6
+ * Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns
7
+ * the key the call's rows go under.
8
+ */
6
9
  export declare function bindCaller(ctx: Context, sessionId: string, project: CallerProject): ContinuityKey;
7
10
  /** Read only: the session's first prompt booked its arm, and a holdout session gets nothing from hippo. */
8
11
  export declare function callerInHoldout(ctx: Context, sessionId: string): boolean;
9
- /** Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not trusted, then cut back to the cap. */
12
+ /**
13
+ * Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not
14
+ * trusted, then cut back to the cap.
15
+ */
10
16
  export declare function checkedWorkingState(state: WorkingState | null): WorkingState | null;
11
17
  export declare function assertTrigger(trigger: string | null): void;
12
18
  export declare function assertRequestId(requestId: string): void;
@@ -1,14 +1,19 @@
1
- // The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never the server's env or folder.
1
+ // The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never
2
+ // the server's env or folder.
2
3
  import { BadRequestError } from '../core/api-errors.js';
3
4
  import { ownerOrSubject } from '../api/types.js';
4
5
  import { MAX_ID_LEN } from '../util/limits.js';
5
6
  import { sessionPilotArm } from '../api/pilot-arm.js';
7
+ import { ledgerReachOf } from '../api/ledger-db.js';
6
8
  import { assertCallerIds } from '../api/prompt-hook.js';
7
9
  import { assertCallerProject, projectNames } from '../core/project-identity.js';
8
10
  import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
9
- import { bindSessionOwner } from '../api/session-owners.js';
11
+ import { bindSessionOwner } from '../api/auth/session-owners.js';
10
12
  import { fitWorkingState, WORKING_STATE_CAPS } from './working-state.js';
11
- /** Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns the key the call's rows go under. */
13
+ /**
14
+ * Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns
15
+ * the key the call's rows go under.
16
+ */
12
17
  export function bindCaller(ctx, sessionId, project) {
13
18
  assertCallerIds(sessionId, project);
14
19
  if (sessionId.trim() === '')
@@ -20,9 +25,13 @@ export function bindCaller(ctx, sessionId, project) {
20
25
  }
21
26
  /** Read only: the session's first prompt booked its arm, and a holdout session gets nothing from hippo. */
22
27
  export function callerInHoldout(ctx, sessionId) {
23
- return sessionPilotArm(ctx.hippoRoot, ctx.tenantId, sessionId, false, { sharedStore: true, ownTenantOnly: true }) === 'holdout';
28
+ const reach = ledgerReachOf(ctx, true);
29
+ return sessionPilotArm(ctx.hippoRoot, ctx.tenantId, sessionId, false, { reach, ownTenantOnly: true }) === 'holdout';
24
30
  }
25
- /** Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not trusted, then cut back to the cap. */
31
+ /**
32
+ * Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not
33
+ * trusted, then cut back to the cap.
34
+ */
26
35
  export function checkedWorkingState(state) {
27
36
  if (state === null)
28
37
  return null;
@@ -35,8 +44,9 @@ export function checkedWorkingState(state) {
35
44
  return fitWorkingState({ task: scrub(state.task), summary: scrub(state.summary), next_step: scrub(state.next_step) });
36
45
  }
37
46
  export function assertTrigger(trigger) {
38
- if (trigger !== null && trigger.length > MAX_ID_LEN)
47
+ if (trigger !== null && trigger.length > MAX_ID_LEN) {
39
48
  throw new BadRequestError(`trigger: at most ${MAX_ID_LEN} characters`);
49
+ }
40
50
  }
41
51
  export function assertRequestId(requestId) {
42
52
  if (requestId.trim() === '')
@@ -1,6 +1,8 @@
1
1
  import type { CaptureErrorOutcome } from '../store/failure-log.js';
2
2
  import type { JsonValue } from '../util/json.js';
3
- /** Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws. */
3
+ /**
4
+ * Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws.
5
+ */
4
6
  export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue, onLogged?: (failureId: number | null) => void): CaptureErrorOutcome;
5
7
  /** Who sent a failure from another machine: the audit actor and the project its lesson and repeat check belong to. */
6
8
  export interface LessonCaller {
@@ -7,7 +7,9 @@ import { loadContentsWithTag } from '../store/entry-reads.js';
7
7
  import { loadConfig } from '../core/config.js';
8
8
  import { recordFailureAt } from '../store/failure-log-at.js';
9
9
  import { failureHash, failureSignature, lessonFromFailure, payloadString, } from './failure-reading.js';
10
- /** Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws. */
10
+ /**
11
+ * Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws.
12
+ */
11
13
  export function captureToolFailure(hippoRoot, tenantId, payload, onLogged) {
12
14
  const lesson = lessonFromFailure(payload);
13
15
  let outcome = 'store-failed';
@@ -40,9 +40,14 @@ const HEREDOC = new RegExp(String.raw `^\s*(?:cd\s+(?<cd>'[^']*'|"[^"]*"|[^\s'"&
40
40
  String.raw `(?<body>[\s\S]*?)\r?\n\s*\k<tag>\s*$`);
41
41
  /** The script a shell argv runs, for the shells Codex checks for an apply_patch heredoc. */
42
42
  function shellScript(argv) {
43
- const exe = path.basename(argv[0] ?? '').toLowerCase().replace(/\.exe$/, '');
44
- if ((exe === 'bash' || exe === 'zsh' || exe === 'sh') && argv.length === 3 && (argv[1] === '-lc' || argv[1] === '-c'))
43
+ const exe = path
44
+ .basename(argv[0] ?? '')
45
+ .toLowerCase()
46
+ .replace(/\.exe$/, '');
47
+ const isPosixShell = exe === 'bash' || exe === 'zsh' || exe === 'sh';
48
+ if (isPosixShell && argv.length === 3 && (argv[1] === '-lc' || argv[1] === '-c')) {
45
49
  return argv[2];
50
+ }
46
51
  if (exe === 'pwsh' || exe === 'powershell') {
47
52
  const rest = argv.slice(1).filter((a) => a.toLowerCase() !== '-noprofile');
48
53
  if (rest.length === 2 && rest[0].toLowerCase() === '-command')
@@ -12,12 +12,14 @@ export interface CaptureOptions {
12
12
  stdinText?: string;
13
13
  stdinTimedOut?: boolean;
14
14
  sessionTurns?: readonly SessionTurn[];
15
- /** Tee stdout/stderr to this log file while capture runs, so SessionEnd output (lost in TUI teardown) shows via `hippo last-sleep`.
15
+ /** Tee stdout/stderr to this log file while capture runs, so SessionEnd output (lost in TUI teardown) shows via
16
+ * `hippo last-sleep`.
16
17
  * Appends, because `hippo sleep` writes the same file first. */
17
18
  logFile?: string;
18
19
  dryRun: boolean;
19
20
  global: boolean;
20
- /** Tenant scope for the dedup read in `cmdCaptureCore`: when set and `global` is false, only this tenant's memories count.
21
+ /** Tenant scope for the dedup read in `cmdCaptureCore`: when set and `global` is false, only this tenant's
22
+ * memories count.
21
23
  * Undefined means host-wide dedup; ignored when `global: true`. */
22
24
  tenantId?: string;
23
25
  /** The session's project: rows are stamped with its id, and dedup reads its rows under either name. */
@@ -10,12 +10,13 @@ import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
10
10
  import { withRejectionProbe } from '../store/rejection-probe.js';
11
11
  import { loadConfig } from '../core/config.js';
12
12
  import { classifyOriginProject, projectId, isInitialized } from '../core/project-identity.js';
13
- import { errorMessage, log } from '../util/log.js';
13
+ import { errorMessage, log, errorFields } from '../util/log.js';
14
14
  import { teeStdStreams } from '../util/stream-tee.js';
15
15
  import { extractFromTexts } from './extract.js';
16
16
  import { collectSessionTurns, sessionTail, resolveLastSessionTranscript } from './transcript.js';
17
17
  export function cmdCapture(hippoRoot, options) {
18
- // Tee to a log file for the SessionEnd hook; APPEND, because `hippo sleep` runs first in that sequence and already wrote its header and body.
18
+ // Tee to a log file for the SessionEnd hook; APPEND, because `hippo sleep` runs first in that sequence and already
19
+ // wrote its header and body.
19
20
  const restoreStdio = options.logFile ? beginLogTee(options.logFile) : null;
20
21
  try {
21
22
  cmdCaptureCore(hippoRoot, options);
@@ -45,7 +46,7 @@ function writeLogBanner(logFile) {
45
46
  fs.appendFileSync(logFile, `[hippo] ${new Date().toISOString()} capturing session...\n`, 'utf8');
46
47
  }
47
48
  catch (err) {
48
- log.warn(`could not open log file ${logFile}: ${errorMessage(err)}`);
49
+ log.warn(`could not open log file ${logFile}: ${errorMessage(err)}`, errorFields(err));
49
50
  return false;
50
51
  }
51
52
  return true;
@@ -59,8 +60,11 @@ function cmdCaptureCore(hippoRoot, options) {
59
60
  }
60
61
  else {
61
62
  if (!isInitialized(hippoRoot)) {
62
- console.error(`No hippo store at ${hippoRoot} (searched ${process.cwd()} and its parents up to your home directory). Run \`hippo init\` first.`);
63
- process.exit(1);
63
+ console.error(`No hippo store at ${hippoRoot} (searched ${process.cwd()} and its parents up to your home directory). ` +
64
+ `Run \`hippo init\` first.`);
65
+ // Set, not exit, so cmdCapture's finally restores the tee'd stdio.
66
+ process.exitCode = 1;
67
+ return;
64
68
  }
65
69
  }
66
70
  const read = readCaptureTexts(options);
@@ -71,7 +75,8 @@ function cmdCaptureCore(hippoRoot, options) {
71
75
  console.log('No text to capture from.');
72
76
  return;
73
77
  }
74
- // Scrub once here, as the snapshot fields are: every source can carry a pasted token (AGENTS.md: no secrets in memories).
78
+ // Scrub once here, as the snapshot fields are: every source can
79
+ // carry a pasted token (AGENTS.md: no secrets in memories).
75
80
  const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))), userTexts);
76
81
  if (extracted.length === 0) {
77
82
  console.log('No actionable items found in the input.');
@@ -86,7 +91,8 @@ function cmdCaptureCore(hippoRoot, options) {
86
91
  };
87
92
  printCaptureTally(options, captureExtractedItems(targetRoot, writeOpts, extracted, keys));
88
93
  }
89
- // Dedup only against rows this capture's reader sees: another tenant's or project's rows are hidden, so they must not stop its own copy.
94
+ // Dedup only against rows this capture's reader sees: another tenant's or project's rows are hidden, so they must not
95
+ // stop its own copy.
90
96
  // Only a row holding an item's longest word can hold that item, so the store returns those rows and no others.
91
97
  function storedKeysInView(targetRoot, options, extracted) {
92
98
  const stored = loadTextsHoldingWords(targetRoot, options.global ? undefined : options.tenantId, extracted.map((item) => longestWord(item.content)), undefined, EVERY_SCOPE);
@@ -102,7 +108,8 @@ function printCaptureTally(options, { captured, skipped, rejected }) {
102
108
  (rejected > 0 ? `, ${rejected} rejected` : '') +
103
109
  ')');
104
110
  }
105
- /** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a last-session capture has nothing.
111
+ /** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a
112
+ * last-session capture has nothing.
106
113
  * Only a session says who spoke, so a piped or file capture counts no user texts. */
107
114
  function readCaptureTexts(options) {
108
115
  switch (options.source) {
@@ -112,17 +119,20 @@ function readCaptureTexts(options) {
112
119
  }
113
120
  catch {
114
121
  console.error('No input on stdin. Pipe text in or use --file <path>.');
115
- process.exit(1);
122
+ process.exitCode = 1;
123
+ return null;
116
124
  }
117
125
  }
118
126
  case 'file': {
119
127
  if (!options.filePath) {
120
128
  console.error('Missing file path. Usage: hippo capture --file <path>');
121
- process.exit(1);
129
+ process.exitCode = 1;
130
+ return null;
122
131
  }
123
132
  if (!fs.existsSync(options.filePath)) {
124
133
  console.error(`File not found: ${options.filePath}`);
125
- process.exit(1);
134
+ process.exitCode = 1;
135
+ return null;
126
136
  }
127
137
  return { texts: [fs.readFileSync(options.filePath, 'utf8')], userTexts: 0 };
128
138
  }
@@ -149,7 +159,14 @@ export function captureExtractedItems(targetRoot, options, extracted, keys) {
149
159
  const tally = { captured: 0, skipped: 0, rejected: 0 };
150
160
  const baseHalfLifeDays = loadConfig(targetRoot).defaultHalfLifeDays;
151
161
  if (!options.dryRun) {
152
- const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({ content: item.content, makeEntry: () => captureEntry(item, options, baseHalfLifeDays) })), keys, { actor: options.actor, lean: options.lean, onCaptured: options.lean ? undefined : (entry) => void embedMemory(targetRoot, entry) });
162
+ const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({
163
+ content: item.content,
164
+ makeEntry: () => captureEntry(item, options, baseHalfLifeDays),
165
+ })), keys, {
166
+ actor: options.actor,
167
+ lean: options.lean,
168
+ onCaptured: options.lean ? undefined : (entry) => void embedMemory(targetRoot, entry),
169
+ });
153
170
  for (const outcome of outcomes)
154
171
  tally[outcome]++;
155
172
  return tally;
@@ -187,9 +204,11 @@ function captureEntry(item, options, baseHalfLifeDays) {
187
204
  confidence: 'observed',
188
205
  pinned: item.fromUser === true && item.category === 'rule',
189
206
  tenantId: options.tenantId,
190
- source_session_id: options.sessionId,
207
+ sourceSessionId: options.sessionId,
191
208
  baseHalfLifeDays,
192
209
  });
193
- return options.originProject === undefined ? created : { ...created, origin_project: projectId(options.originProject) };
210
+ if (options.originProject === undefined)
211
+ return created;
212
+ return { ...created, origin_project: projectId(options.originProject) };
194
213
  }
195
214
  //# sourceMappingURL=command.js.map
@@ -1,6 +1,6 @@
1
- import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from '../api/context-render.js';
2
- import { bookTokenUse } from '../api/ledger-db.js';
3
- import { errorMessage, log } from '../util/log.js';
1
+ import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText, } from '../api/context-render.js';
2
+ import { bookTokenUse, ledgerReachOf } from '../api/ledger-db.js';
3
+ import { errorMessage, log, errorFields } from '../util/log.js';
4
4
  import { listSessionEvents, loadFreshActiveTaskSnapshot } from '../store/sessions.js';
5
5
  import { estimateTokens } from '../util/token-text.js';
6
6
  import { truncateCodePointSafe } from '../util/transcript-tail.js';
@@ -10,13 +10,20 @@ export function compactResumeForCaller(ctx, req) {
10
10
  if (req.source !== 'compact' || callerInHoldout(ctx, req.sessionId))
11
11
  return { stdout: '' };
12
12
  const snapshot = loadFreshActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS }, key);
13
- // One owner's concurrent sessions must not cross-restore; a snapshot with no session still restores, as on the local path.
14
- if (snapshot === null || (snapshot.session_id !== null && snapshot.session_id !== req.sessionId))
13
+ // One owner's concurrent sessions must not cross-restore; a
14
+ // snapshot with no session still restores, as on the local path.
15
+ if (snapshot === null || (snapshot.session_id !== null && snapshot.session_id !== req.sessionId)) {
15
16
  return { stdout: '' };
17
+ }
16
18
  const text = compactResumeText(snapshot, sessionTrail(ctx, snapshot.session_id));
17
19
  bookTokenUse(ctx.hippoRoot, {
18
- tenantId: ctx.tenantId, sessionId: req.sessionId, surface: 'compact_resume', event: 'inject', items: 1, tokens: estimateTokens(text),
19
- }, { sharedStore: true });
20
+ tenantId: ctx.tenantId,
21
+ sessionId: req.sessionId,
22
+ surface: 'compact_resume',
23
+ event: 'inject',
24
+ items: 1,
25
+ tokens: estimateTokens(text),
26
+ }, ledgerReachOf(ctx, true));
20
27
  return { stdout: text };
21
28
  }
22
29
  /** A bad trail row costs the trail, not the snapshot. */
@@ -28,7 +35,7 @@ function sessionTrail(ctx, sessionId) {
28
35
  .map((e) => ({ ...e, content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP) }));
29
36
  }
30
37
  catch (err) {
31
- log.warn(`compact-resume: trail skipped: ${errorMessage(err)}`);
38
+ log.warn(`compact-resume: trail skipped: ${errorMessage(err)}`, errorFields(err));
32
39
  return [];
33
40
  }
34
41
  }
@@ -1,6 +1,7 @@
1
1
  import { type HookRuntime } from '../core/capture-contract.js';
2
- /** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value cannot inject fake `[hippo]` log lines.
3
- * Exported as the one shared guard for every `[hippo]`-prefixed log writer that interpolates payload values. */
2
+ /** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
3
+ * cannot inject fake `[hippo]` log lines. Exported as the one shared guard for every `[hippo]`-prefixed log writer that
4
+ * interpolates payload values. */
4
5
  export declare function sanitizeLogMessage(message: string): string;
5
6
  export interface PreCompactOptions {
6
7
  stdinText?: string;
@@ -10,8 +11,9 @@ export interface PreCompactOptions {
10
11
  /** Called once when the hook accepts a compaction, with the text it printed or null when it printed none. */
11
12
  onBoundary?: (printed: string | null) => void;
12
13
  }
13
- /** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store error) must exit 0 as a logged no-op.
14
- * Callers must not wrap this in anything that turns a caught-and-logged failure into a non-zero exit. */
14
+ /** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
15
+ * error) must exit 0 as a logged no-op. Callers must not wrap this in anything that turns a caught-and-logged failure
16
+ * into a non-zero exit. */
15
17
  export declare function cmdPreCompact(hippoRoot: string, options: PreCompactOptions): Promise<void>;
16
18
  export interface PostCompactOptions {
17
19
  stdinText?: string;
@@ -19,6 +21,7 @@ export interface PostCompactOptions {
19
21
  logFile?: string;
20
22
  afterSave?: (transcriptPath: string, cwd: string | null, log: (message: string) => void) => void;
21
23
  }
22
- /** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show. Never throws, so the hook exits 0. */
24
+ /** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
25
+ * Never throws, so the hook exits 0. */
23
26
  export declare function cmdPostCompact(hippoRoot: string, options: PostCompactOptions): string | null;
24
27
  //# sourceMappingURL=compact.d.ts.map
@@ -7,15 +7,16 @@ import { recordCompactionStart, recordSnapshotSaved } from '../store/compactions
7
7
  import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
8
8
  import { resolveTenantId } from '../store/tenant.js';
9
9
  import { defaultPreCompactLogPath, vscodeUserHooksFile } from '../hooks/shared.js';
10
- import { readClaudeCodePostCompact, readClaudeCodePreCompact } from '../core/capture-contract.js';
11
- import { errorMessage, log as logger } from '../util/log.js';
10
+ import { readClaudeCodePostCompact, readClaudeCodePreCompact, } from '../core/capture-contract.js';
11
+ import { errorMessage, log as logger, errorFields } from '../util/log.js';
12
12
  import { resolveLastSessionTranscript } from './transcript.js';
13
13
  import { isVscodeTranscript } from './copilot-transcript.js';
14
14
  import { mergeWorkingState, transcriptWorkingState } from './working-state.js';
15
15
  // Diagnostic-only log; a long-lived install must not grow it unbounded.
16
16
  const PRE_COMPACT_LOG_MAX_BYTES = 256 * 1024;
17
- /** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value cannot inject fake `[hippo]` log lines.
18
- * Exported as the one shared guard for every `[hippo]`-prefixed log writer that interpolates payload values. */
17
+ /** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
18
+ * cannot inject fake `[hippo]` log lines. Exported as the one shared guard for every `[hippo]`-prefixed log writer that
19
+ * interpolates payload values. */
19
20
  export function sanitizeLogMessage(message) {
20
21
  // eslint-disable-next-line no-control-regex
21
22
  return message.replace(/[\x00-\x1f]/g, '');
@@ -23,14 +24,16 @@ export function sanitizeLogMessage(message) {
23
24
  function appendPreCompactLog(logFile, message) {
24
25
  try {
25
26
  fs.mkdirSync(path.dirname(logFile), { recursive: true });
26
- // One handle, so the cap acts on the file it measured; two hooks writing in the same instant can overwrite one diagnostic line, which this log accepts.
27
+ // One handle, so the cap acts on the file it measured; two hooks writing in the same instant can overwrite one
28
+ // diagnostic line, which this log accepts.
27
29
  const fd = fs.openSync(logFile, fs.constants.O_RDWR | fs.constants.O_CREAT);
28
30
  try {
29
31
  const size = fs.fstatSync(fd).size;
30
32
  const startFresh = size > PRE_COMPACT_LOG_MAX_BYTES; // a dumb cap, no rotation
31
33
  if (startFresh)
32
34
  fs.ftruncateSync(fd, 0);
33
- fs.writeSync(fd, `[hippo] ${new Date().toISOString()} ${sanitizeLogMessage(message)}\n`, startFresh ? 0 : size, 'utf8');
35
+ const line = `[hippo] ${new Date().toISOString()} ${sanitizeLogMessage(message)}\n`;
36
+ fs.writeSync(fd, line, startFresh ? 0 : size, 'utf8');
34
37
  }
35
38
  finally {
36
39
  fs.closeSync(fd);
@@ -38,7 +41,7 @@ function appendPreCompactLog(logFile, message) {
38
41
  }
39
42
  catch (err) {
40
43
  // Diagnostic-only; a log write failure must never affect the exit-0 contract.
41
- logger.debug(`pre-compact log not written: ${errorMessage(err)}`);
44
+ logger.debug(`pre-compact log not written: ${errorMessage(err)}`, errorFields(err));
42
45
  }
43
46
  }
44
47
  /** True iff `filePath` exists and is readable — checks both in one call. */
@@ -51,8 +54,8 @@ function isReadableFile(filePath) {
51
54
  return false; // missing and unreadable both mean "no file" to the caller
52
55
  }
53
56
  }
54
- /** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the hook past its 30
55
- * s limit, and via writeSync because process.exit drops buffered pipe output. */
57
+ /** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the
58
+ * hook past its 30 s limit, and via writeSync because process.exit drops buffered pipe output. */
56
59
  function printPreCompactInstruction(logFile) {
57
60
  const text = `${PRE_COMPACT_INSTRUCTION}\n`;
58
61
  try {
@@ -70,13 +73,15 @@ function snapshotJustSaved(hippoRoot, sessionId) {
70
73
  if (sessionId === null || sessionId === '')
71
74
  return false;
72
75
  const active = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
73
- return active?.session_id === sessionId && active.source === 'pre-compact' && Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
76
+ return active?.session_id === sessionId && active.source === 'pre-compact' &&
77
+ Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
74
78
  }
75
- /** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state snapshot. Never extracts
76
- * memories itself; SessionEnd capture owns that. */
79
+ /** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state
80
+ * snapshot. Never extracts memories itself; SessionEnd capture owns that. */
77
81
  function runPreCompact(hippoRoot, options, logFile) {
78
82
  const { stdinText, stdinTimedOut = false, runtime = 'claude-code' } = options;
79
- // PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call that would create a store.
83
+ // PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call
84
+ // that would create a store.
80
85
  if (!isInitialized(hippoRoot)) {
81
86
  appendPreCompactLog(logFile, 'skip: store not initialized');
82
87
  return;
@@ -87,7 +92,8 @@ function runPreCompact(hippoRoot, options, logFile) {
87
92
  return;
88
93
  }
89
94
  const { sessionId, transcriptPath: payloadTranscriptPath } = receipt.input;
90
- // With chat.useClaudeHooks on, VS Code runs Claude Code's hooks too; it never sends PostCompact to close a record, nor reads the summariser text.
95
+ // With chat.useClaudeHooks on, VS Code runs Claude Code's hooks too; it never sends PostCompact to close a record,
96
+ // nor reads the summariser text.
91
97
  const vscode = runtime === 'claude-code' && isVscodeTranscript(payloadTranscriptPath);
92
98
  if (vscode && fs.existsSync(vscodeUserHooksFile())) {
93
99
  appendPreCompactLog(logFile, 'skip: VS Code payload, hippo.json runs pre-compact for this chat');
@@ -97,7 +103,8 @@ function runPreCompact(hippoRoot, options, logFile) {
97
103
  appendPreCompactLog(logFile, `skip: snapshot for session ${sessionId} saved under ${TWIN_FIRE_MS / 1000} s ago, by the other preCompact entry`);
98
104
  return;
99
105
  }
100
- const recordId = markCompactionBoundary(hippoRoot, options, logFile, receipt.input, runtime === 'claude-code' && !vscode);
106
+ const closable = runtime === 'claude-code' && !vscode;
107
+ const recordId = markCompactionBoundary(hippoRoot, options, logFile, receipt.input, closable);
101
108
  const transcriptPath = resolvePreCompactTranscript(payloadTranscriptPath, stdinText, logFile, runtime);
102
109
  if (!transcriptPath)
103
110
  return;
@@ -107,8 +114,8 @@ function runPreCompact(hippoRoot, options, logFile) {
107
114
  return;
108
115
  saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived);
109
116
  }
110
- /** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed; the record id, or
111
- * null without a record. */
117
+ /** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed;
118
+ * the record id, or null without a record. */
112
119
  function markCompactionBoundary(hippoRoot, options, logFile, input, closable) {
113
120
  const { sessionId } = input;
114
121
  // The record is the "something saved before every compaction", so it lands even when no snapshot is derivable later.
@@ -162,9 +169,10 @@ function saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived) {
162
169
  existing = loadActiveTaskSnapshot(hippoRoot, tenantId);
163
170
  }
164
171
  catch (err) {
165
- logger.debug(`pre-compact: stored snapshot unreadable, saving the derived one alone: ${errorMessage(err)}`);
172
+ logger.warn(`pre-compact: stored snapshot unreadable, saving the derived one alone: ${errorMessage(err)}`, errorFields(err));
166
173
  }
167
- // Carried-over fields are not re-capped, as `hippo snapshot save` stays uncapped; saveActiveTaskSnapshot scrubs every field.
174
+ // Carried-over fields are not re-capped, as `hippo snapshot save` stays uncapped; saveActiveTaskSnapshot scrubs every
175
+ // field.
168
176
  const merged = mergeWorkingState(derived, existing, sessionId);
169
177
  if (merged === null) {
170
178
  appendPreCompactLog(logFile, 'skip: no snapshot content for this session (nothing derivable; fallback blocked or empty)');
@@ -173,16 +181,18 @@ function saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived) {
173
181
  try {
174
182
  saveActiveTaskSnapshot(hippoRoot, tenantId, { ...merged, source: 'pre-compact', session_id: sessionId });
175
183
  appendPreCompactLog(logFile, 'snapshot saved');
176
- if (recordId !== null)
184
+ if (recordId !== null) {
177
185
  recordSnapshotSaved(hippoRoot, tenantId, recordId, (message) => appendPreCompactLog(logFile, message));
186
+ }
178
187
  }
179
188
  catch (err) {
180
189
  appendPreCompactLog(logFile, `snapshot save failed: ${errorMessage(err)}`);
181
190
  }
182
191
  }
183
192
  }
184
- /** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store error) must exit 0 as a logged no-op.
185
- * Callers must not wrap this in anything that turns a caught-and-logged failure into a non-zero exit. */
193
+ /** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
194
+ * error) must exit 0 as a logged no-op. Callers must not wrap this in anything that turns a caught-and-logged failure
195
+ * into a non-zero exit. */
186
196
  export async function cmdPreCompact(hippoRoot, options) {
187
197
  const logFile = options.logFile ?? defaultPreCompactLogPath();
188
198
  try {
@@ -195,7 +205,8 @@ export async function cmdPreCompact(hippoRoot, options) {
195
205
  }
196
206
  /** A PostCompact hook has 10 s in all; replay stops starting new records after this. */
197
207
  const POST_COMPACT_REPLAY_BUDGET_MS = 6000;
198
- /** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show. Never throws, so the hook exits 0. */
208
+ /** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
209
+ * Never throws, so the hook exits 0. */
199
210
  export function cmdPostCompact(hippoRoot, options) {
200
211
  const logFile = options.logFile ?? defaultPreCompactLogPath();
201
212
  const log = (message) => appendPreCompactLog(logFile, `post-compact: ${message}`);