hippo-memory 1.68.0 → 1.70.0

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