hippo-memory 1.69.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 (860) hide show
  1. package/README.md +5 -2
  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.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,23 +1,23 @@
1
1
  // One record per Claude Code compaction, and what turns its summary into kept memories.
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
- import { ConflictError } from './api-errors.js';
5
- import { isObjectLike, isStringValue } from './capture-contract.js';
4
+ import { ConflictError } from '../core/api-errors.js';
5
+ import { isStringValue } from '../core/capture-contract.js';
6
6
  import { COMPACTION_ITEM_MAX_CHARS, compactSummaryBody, parseCompactionItems, selectItemRows } from './compaction-items.js';
7
7
  import { importSpool, spool } from './compaction-spool.js';
8
- import { isSharedStore, loadConfig } from './config.js';
9
- import { closeHippoDb, isSqliteBusy, openHippoDb } from './db.js';
10
- import { gatedWrite } from './gated-write.js';
11
- import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from './memory.js';
12
- import { fallbackOrigin, isGlobalStoreRoot, originInSql, projectId, projectNames, resolveProjectIdentity } from './project-identity.js';
13
- import { scopeAdmitSql } from './recall-scope.js';
14
- import { maskEmails, redactSecretsStrict } from './secret-detect.js';
15
- import { strengthenRetrievedOn, writeEntryMirrors } from './store/entry-writes.js';
16
- import { isRecallBoostAblated } from './ablation.js';
17
- import { updateStats } from './store/index-and-stats.js';
18
- import { resolveTenantId } from './tenant.js';
19
- import { errorMessage, log as logger } from './log.js';
20
- import { readTranscriptTail, truncateCodePointSafe } from './transcript-tail.js';
8
+ import { isSharedStore, loadConfig } from '../core/config.js';
9
+ import { closeHippoDb, isSqliteBusy, openHippoDb, withWriteScopeOr } from '../db/index.js';
10
+ import { gatedWrite } from '../trust/gated-write.js';
11
+ import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from '../core/memory.js';
12
+ import { fallbackOrigin, isGlobalStoreRoot, projectId, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
13
+ import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
14
+ import { closeStartedWithoutSummary, compactionProgress, compactionRowsByRequest, heldMemoryRows, insertStartedCompaction, insertSummarisedCompaction, latestCompactionRows, latestStartedRows, markCompactionDone, markCompactionSummarised, markSnapshotSavedRow, nextCompactionStart, openTranscriptRows, stalledSummarisedRows, } from '../store/compactions.js';
15
+ import { strengthenRetrievedOn, writeEntryMirrors } from '../store/entry-writes.js';
16
+ import { isRecallBoostAblated } from '../core/ablation.js';
17
+ import { updateStats } from '../store/index-and-stats.js';
18
+ import { resolveTenantId } from '../store/tenant.js';
19
+ import { errorMessage, log as logger } from '../util/log.js';
20
+ import { readTranscriptTail, truncateCodePointSafe } from '../util/transcript-tail.js';
21
21
  /** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
22
22
  export const COMPACTION_DB_WAIT_MS = 2000;
23
23
  /** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
@@ -81,25 +81,18 @@ function toRecord(row) {
81
81
  status: row.status,
82
82
  };
83
83
  }
84
- const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, summarised_at, summary, items_json, items_written, status';
85
- function selectRecords(db, where, ...params) {
86
- // SAFETY: the SELECT names exactly COLUMNS, matching CompactionRow's field set.
87
- const rows = db.prepare(`SELECT ${COLUMNS} FROM compactions WHERE ${where}`).all(...params);
88
- return rows.map(toRecord);
89
- }
90
84
  export function startCompaction(db, tenantId, start, at = new Date()) {
91
85
  const id = generateId('cmp');
92
- db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at)
93
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(tenantId, id, start.sessionId, start.originProject, start.trigger, start.cwd, start.transcriptPath, at.toISOString());
86
+ insertStartedCompaction(db, tenantId, { id, ...start, startedAt: at.toISOString() });
94
87
  return id;
95
88
  }
96
89
  /** A session's newest record, or null. */
97
90
  export function latestCompaction(db, tenantId, sessionId) {
98
- return selectRecords(db, 'tenant_id = ? AND session_id = ? ORDER BY started_at DESC, id DESC LIMIT 1', tenantId, sessionId)[0] ?? null;
91
+ return latestCompactionRows(db, tenantId, sessionId).map(toRecord)[0] ?? null;
99
92
  }
100
93
  /** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record; another session's id is a ConflictError. */
101
94
  export function compactionByRequest(db, tenantId, requestId, sessionId) {
102
- const record = selectRecords(db, 'tenant_id = ? AND request_id = ?', tenantId, requestId)[0] ?? null;
95
+ const record = compactionRowsByRequest(db, tenantId, requestId).map(toRecord)[0] ?? null;
103
96
  // Sessions are owner-bound, so this also keeps one owner from reading or finishing another's record.
104
97
  if (record !== null && record.sessionId !== sessionId)
105
98
  throw new ConflictError('request id belongs to another session');
@@ -107,15 +100,11 @@ export function compactionByRequest(db, tenantId, requestId, sessionId) {
107
100
  }
108
101
  /** Pre-compact's record for the compaction that is ending: the session's newest `started` one within REPLAY_AFTER_MS before `at`, so an older one is left for the transcript fill. */
109
102
  function latestStarted(db, tenantId, sessionId, at) {
110
- return selectRecords(db, `tenant_id = ? AND session_id = ? AND status = 'started' AND started_at <= ? AND started_at >= ? ORDER BY started_at DESC, id DESC LIMIT 1`, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString())[0] ?? null;
103
+ return latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null;
111
104
  }
112
- /** Moves a `started` record to `summarised`; false when another process already moved it. The request id lands in the same statement, so no crash leaves the record unfindable by its retry. */
113
- function markSummarised(db, tenantId, id, text, summarisedAt, requestId) {
114
- // Only a caller names the column, so a store from before it was added still takes local writes.
115
- const stamp = requestId === undefined ? [] : [requestId];
116
- const result = db.prepare(`UPDATE compactions SET summary = ?, items_json = ?, summarised_at = ?, status = 'summarised'${stamp.length === 0 ? '' : ', request_id = ?'}
117
- WHERE tenant_id = ? AND id = ? AND status = 'started'`).run(text.summary, JSON.stringify(text.items), summarisedAt, ...stamp, tenantId, id);
118
- return (result.changes ?? 0) > 0;
105
+ function markSummarised(db, tenantId, id, options) {
106
+ const { text, summarisedAt, requestId } = options;
107
+ return markCompactionSummarised(db, tenantId, id, { summary: text.summary, itemsJson: JSON.stringify(text.items), summarisedAt, requestId });
119
108
  }
120
109
  /** Best effort, never throws: a compaction must not fail because its record could not be written. */
121
110
  export function recordCompactionStart(hippoRoot, start, log) {
@@ -135,7 +124,7 @@ export function recordCompactionStart(hippoRoot, start, log) {
135
124
  }
136
125
  /** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
137
126
  export function markSnapshotSaved(db, tenantId, recordId) {
138
- db.prepare(`UPDATE compactions SET snapshot_saved = 1 WHERE tenant_id = ? AND id = ?`).run(tenantId, recordId);
127
+ markSnapshotSavedRow(db, tenantId, recordId);
139
128
  }
140
129
  export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
141
130
  let db;
@@ -152,21 +141,18 @@ export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
152
141
  }
153
142
  }
154
143
  /** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
155
- export function recordSummary(db, hippoRoot, tenantId, meta, text, at, caller = {}) {
144
+ export function recordSummary(db, hippoRoot, tenantId, options) {
145
+ const { meta, text, at, caller = {} } = options;
156
146
  const now = new Date().toISOString();
157
147
  const itemsJson = JSON.stringify(text.items);
158
148
  const { requestId } = caller;
159
149
  const started = latestStarted(db, tenantId, meta.sessionId, at);
160
- if (started && markSummarised(db, tenantId, started.id, text, now, requestId)) {
150
+ if (started && markSummarised(db, tenantId, started.id, { text, summarisedAt: now, requestId })) {
161
151
  return { ...started, summary: text.summary, items: text.items, summarisedAt: now, status: 'summarised' };
162
152
  }
163
153
  const originProject = caller.originProject ?? compactionOrigin(hippoRoot, meta.cwd);
164
154
  const id = generateId('cmp');
165
- // Only a caller names the column, so a store from before it was added still takes local writes.
166
- const stamp = requestId === undefined ? [] : [requestId];
167
- const [col, mark] = stamp.length === 0 ? ['', ''] : [', request_id', ', ?'];
168
- db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at, summarised_at, summary, items_json, status${col})
169
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'summarised'${mark})`).run(tenantId, id, meta.sessionId, originProject, meta.trigger, meta.cwd, meta.transcriptPath, at.toISOString(), now, text.summary, itemsJson, ...stamp);
155
+ insertSummarisedCompaction(db, tenantId, { ...meta, originProject, startedAt: at.toISOString() }, { id, summary: text.summary, itemsJson, summarisedAt: now, requestId });
170
156
  return {
171
157
  id, tenantId, sessionId: meta.sessionId, originProject, trigger: meta.trigger, cwd: meta.cwd, transcriptPath: meta.transcriptPath,
172
158
  snapshotSaved: false, startedAt: at.toISOString(), summarisedAt: now, summary: text.summary, items: text.items, itemsWritten: 0, status: 'summarised',
@@ -195,11 +181,7 @@ function restates(item, held) {
195
181
  }
196
182
  /** Live rows of one tenant and origin that default recall shows: a compaction often restates what an earlier one, or the user, already saved. */
197
183
  function heldRows(db, tenantId, origins) {
198
- const deny = scopeAdmitSql('');
199
- // SAFETY: the SELECT names the id, source_session_id and content columns.
200
- const rows = db.prepare(`SELECT id, source_session_id, content FROM memories WHERE tenant_id = ? AND ${originInSql(origins)} AND superseded_by IS NULL AND kind != 'raw'
201
- AND ${deny.sql}`).all(tenantId, ...origins, ...deny.params);
202
- return rows.map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
184
+ return heldMemoryRows(db, tenantId, origins).map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
203
185
  }
204
186
  function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
205
187
  return {
@@ -277,56 +259,31 @@ export function saveItems(db, hippoRoot, ctx, log) {
277
259
  if (capped > 0)
278
260
  log(`capped: ${capped} more kept in the record only`);
279
261
  const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
280
- let writes;
281
- db.exec('BEGIN IMMEDIATE');
282
- try {
262
+ let finishedItems = 0;
263
+ const writes = withWriteScopeOr(db, 'save_items', (rollback) => {
283
264
  if (ctx.recordId !== null) {
284
265
  // A replayer that read the record before another finished it must not write its items again.
285
- const current = db.prepare(`SELECT status, items_written FROM compactions WHERE tenant_id = ? AND id = ?`)
286
- .get(ctx.tenantId, ctx.recordId);
266
+ const current = compactionProgress(db, ctx.tenantId, ctx.recordId);
287
267
  if (current?.status !== 'summarised') {
288
- db.exec('ROLLBACK');
289
- log(`${ctx.recordId} was already finished by another process`);
290
- return current?.items_written ?? 0;
268
+ finishedItems = current?.items_written ?? 0;
269
+ return rollback(null);
291
270
  }
292
271
  }
293
- writes = writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays);
272
+ const written = writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays);
294
273
  // Said again by another session is the same signal as being recalled; the same session carrying it forward is not.
295
- strengthenRetrievedOn(db, writes.restated, { tenantId: ctx.tenantId, recallBoostAblated: isRecallBoostAblated() });
274
+ strengthenRetrievedOn(db, written.restated, { tenantId: ctx.tenantId, recallBoostAblated: isRecallBoostAblated() });
296
275
  if (ctx.recordId !== null) {
297
- db.prepare(`UPDATE compactions SET items_written = ?, status = 'done' WHERE tenant_id = ? AND id = ?`).run(writes.written.length, ctx.tenantId, ctx.recordId);
276
+ markCompactionDone(db, ctx.tenantId, ctx.recordId, written.written.length);
298
277
  }
299
- db.exec('COMMIT');
300
- }
301
- catch (err) {
302
- try {
303
- db.exec('ROLLBACK');
304
- }
305
- catch { /* already rolled back; keep the original error */ }
306
- throw err;
278
+ return written;
279
+ });
280
+ if (writes === null) {
281
+ log(`${ctx.recordId} was already finished by another process`);
282
+ return finishedItems;
307
283
  }
308
284
  finishItemWrites(hippoRoot, writes, log);
309
285
  return writes.written.length;
310
286
  }
311
- /** null when the text is not a PostCompact payload naming a session. */
312
- export function parsePostCompactPayload(stdinText) {
313
- let raw;
314
- try {
315
- raw = JSON.parse((stdinText ?? '').trim());
316
- }
317
- catch {
318
- return null; // non-JSON stdin is not a PostCompact payload; the caller skips it
319
- }
320
- if (!isObjectLike(raw) || !('session_id' in raw) || !isStringValue(raw.session_id) || raw.session_id === '')
321
- return null;
322
- return {
323
- sessionId: raw.session_id,
324
- trigger: 'trigger' in raw && isStringValue(raw.trigger) ? raw.trigger : null,
325
- cwd: 'cwd' in raw && isStringValue(raw.cwd) ? raw.cwd : null,
326
- transcriptPath: 'transcript_path' in raw && isStringValue(raw.transcript_path) ? raw.transcript_path : null,
327
- compactSummary: 'compact_summary' in raw && isStringValue(raw.compact_summary) ? raw.compact_summary : null,
328
- };
329
- }
330
287
  /** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or defers. Never throws. */
331
288
  export function saveCompaction(hippoRoot, payload, log) {
332
289
  const result = { written: null, deferred: false, snapshotSaved: false };
@@ -344,7 +301,7 @@ export function saveCompaction(hippoRoot, payload, log) {
344
301
  const tenantId = resolveTenantId({});
345
302
  let record = null;
346
303
  try {
347
- record = recordSummary(db, hippoRoot, tenantId, payload, text, at);
304
+ record = recordSummary(db, hippoRoot, tenantId, { meta: payload, text, at });
348
305
  result.snapshotSaved = record.snapshotSaved;
349
306
  }
350
307
  catch (err) {
@@ -437,19 +394,16 @@ function transcriptSummary(transcriptPath, afterMs, beforeMs) {
437
394
  return null;
438
395
  }
439
396
  function closeWithoutSummary(db, tenantId, id, log) {
440
- const result = db.prepare(`UPDATE compactions SET status = 'no-summary' WHERE tenant_id = ? AND id = ? AND status = 'started'`).run(tenantId, id);
441
- if ((result.changes ?? 0) > 0)
397
+ if (closeStartedWithoutSummary(db, tenantId, id) > 0)
442
398
  log(`${id} closed as no-summary: its transcript holds no summary for it`);
443
399
  }
444
400
  function nextStartedAt(db, record) {
445
- const row = db.prepare(`SELECT MIN(started_at) AS at FROM compactions WHERE tenant_id = ? AND session_id = ? AND started_at > ?`)
446
- .get(record.tenantId, record.sessionId, record.startedAt);
447
- return row?.at ?? null;
401
+ return nextCompactionStart(db, record.tenantId, record.sessionId, record.startedAt);
448
402
  }
449
403
  /** Records a spooled summary, then writes its items. */
450
404
  function spoolImporter(db, hippoRoot, log) {
451
405
  return (spooled, recorded) => {
452
- const record = recordSummary(db, hippoRoot, spooled.tenantId, spooled.payload, spooled.text, spooled.at);
406
+ const record = recordSummary(db, hippoRoot, spooled.tenantId, { meta: spooled.payload, text: spooled.text, at: spooled.at });
453
407
  // The record holds the items now, so the file is done even if the write below fails.
454
408
  recorded();
455
409
  saveItems(db, hippoRoot, { tenantId: spooled.tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items: record.items }, log);
@@ -460,7 +414,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
460
414
  const tenantId = resolveTenantId({});
461
415
  const now = Date.now();
462
416
  let finished = 0;
463
- const stalled = selectRecords(db, `tenant_id = ? AND status = 'summarised' AND summarised_at < ?`, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString());
417
+ const stalled = stalledSummarisedRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString()).map(toRecord);
464
418
  for (const record of stalled) {
465
419
  if (Date.now() > deadline)
466
420
  break;
@@ -478,7 +432,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
478
432
  catch (err) {
479
433
  log(`spool import failed: ${errorMessage(err)}`);
480
434
  }
481
- const open = selectRecords(db, `tenant_id = ? AND status = 'started' AND started_at < ? AND started_at > ? AND transcript_path IS NOT NULL ORDER BY started_at`, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString(), new Date(now - TRANSCRIPT_FILL_WINDOW_MS).toISOString());
435
+ const open = openTranscriptRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString(), new Date(now - TRANSCRIPT_FILL_WINDOW_MS).toISOString()).map(toRecord);
482
436
  for (const record of open) {
483
437
  if (Date.now() > deadline)
484
438
  break;
@@ -495,7 +449,7 @@ export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE
495
449
  const { found: listed, ...text } = readCompactionText(found);
496
450
  if (!listed)
497
451
  log(`no memories section in the transcript summary for ${record.id}`);
498
- if (!markSummarised(db, tenantId, record.id, text, new Date().toISOString())) {
452
+ if (!markSummarised(db, tenantId, record.id, { text, summarisedAt: new Date().toISOString() })) {
499
453
  log(`${record.id} was filled by another process`);
500
454
  continue;
501
455
  }
@@ -2,9 +2,10 @@
2
2
  import { randomBytes } from 'crypto';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
- import { isObjectLike, isStringValue } from './capture-contract.js';
6
- import { isSqliteBusy } from './db/busy.js';
7
- import { errorMessage } from './log.js';
5
+ import { isObjectLike, isStringValue } from '../core/capture-contract.js';
6
+ import { isSqliteBusy } from '../db/busy.js';
7
+ import { errorMessage } from '../util/log.js';
8
+ const STAMP_DIGITS = 13;
8
9
  export const SPOOL_DIR = 'compactions-spool';
9
10
  /** Starts the log line of a step that broke with an unexpected error, so the session-start banner counts it; a set-aside file is counted by its `.bad` name instead. */
10
11
  export const SPOOL_PROBLEM = 'spool problem: ';
@@ -31,7 +32,7 @@ let fsx = fs;
31
32
  export function __setSpoolFs(next) {
32
33
  fsx = next ?? fs;
33
34
  }
34
- const stamp = (ms) => String(Math.trunc(ms)).padStart(13, '0');
35
+ const stamp = (ms) => String(Math.trunc(ms)).padStart(STAMP_DIGITS, '0');
35
36
  const isTime = (value) => typeof value === 'number' && Number.isFinite(value);
36
37
  const idle = new Int32Array(new SharedArrayBuffer(4));
37
38
  function errCode(cause) {
@@ -244,7 +245,7 @@ function recoverStaleClaims(dir, names, log) {
244
245
  putBackOne = true;
245
246
  }
246
247
  }
247
- else if (moveBad(dir, file, claim.stem, claim.attempt, 'interrupted', log)) {
248
+ else if (moveBad(dir, file, { stem: claim.stem, attempt: claim.attempt, cause: 'interrupted', log })) {
248
249
  log(`spool file ${claim.name} was claimed by a replayer that never finished ${MAX_ATTEMPTS} times, set aside as .bad`);
249
250
  }
250
251
  }
@@ -258,7 +259,8 @@ function putBack(dir, claim, stem, attempt, log) {
258
259
  }
259
260
  }
260
261
  /** Writes `<stem>.<cause>.bad` through a random temp file, so the rename replaces any torn `.bad` a crash left. */
261
- function writeBad(dir, stem, cause, text, log, what) {
262
+ function writeBad(dir, options) {
263
+ const { stem, cause, text, log, what } = options;
262
264
  const tmp = path.join(dir, `${stem}.${cause}.bad.${randomBytes(4).toString('hex')}.tmp`);
263
265
  const written = settle(() => fsx.writeFileSync(tmp, text, { encoding: 'utf8', flag: 'wx' }), log, what);
264
266
  const moved = written === 'done' ? settle(() => fsx.renameSync(tmp, path.join(dir, `${stem}.${cause}.bad`)), log, what) : written;
@@ -267,12 +269,13 @@ function writeBad(dir, stem, cause, text, log, what) {
267
269
  return moved === 'done';
268
270
  }
269
271
  /** Sets a claim aside as `.bad` before the claim goes, so a crash between leaves a whole copy; a busy write puts the claim back. */
270
- function moveBad(dir, claim, stem, attempt, cause, log, raw) {
272
+ function moveBad(dir, claim, options) {
273
+ const { stem, attempt, cause, log, raw } = options;
271
274
  const what = `spool file ${path.basename(claim)} not set aside`;
272
275
  let text = raw ?? '';
273
276
  if (raw === undefined && settle(() => { text = fsx.readFileSync(claim, 'utf8'); }, log, what) !== 'done')
274
277
  return false;
275
- if (!writeBad(dir, stem, cause, text, log, what)) {
278
+ if (!writeBad(dir, { stem, cause, text, log, what })) {
276
279
  putBack(dir, claim, stem, attempt, log);
277
280
  return false;
278
281
  }
@@ -306,7 +309,7 @@ function promoteTmp(dir, names, tenantId, log) {
306
309
  promoted = true;
307
310
  }
308
311
  }
309
- else if (writeBad(dir, m[1], 'unreadable', text, log, what)) {
312
+ else if (writeBad(dir, { stem: m[1], cause: 'unreadable', text, log, what })) {
310
313
  settle(() => fsx.unlinkSync(file), log, what);
311
314
  log(`spool file ${name} was never finished, set aside as .bad`);
312
315
  }
@@ -320,7 +323,8 @@ function removeClaim(claim, name, log) {
320
323
  log(`spool file ${name} saved; its claim could not be removed (${removed.code}); it will be imported again`);
321
324
  }
322
325
  /** After an importer throw: a busy store stops the run with the count unchanged, any other error counts one try toward .bad. */
323
- function importFailed(dir, claim, entry, text, recorded, cause, log) {
326
+ function importFailed(dir, claim, entry, options) {
327
+ const { text, recorded, cause, log } = options;
324
328
  const { name } = entry;
325
329
  const busy = isSqliteBusy(cause);
326
330
  if (recorded) {
@@ -338,7 +342,7 @@ function importFailed(dir, claim, entry, text, recorded, cause, log) {
338
342
  putBack(dir, claim, entry.stem, next, log);
339
343
  log(`spool file ${name} failed to import (try ${next} of ${MAX_ATTEMPTS}): ${errorMessage(cause)}`);
340
344
  }
341
- else if (moveBad(dir, claim, entry.stem, entry.attempt, 'failed', log, text)) {
345
+ else if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'failed', log, raw: text })) {
342
346
  log(`spool file ${name} set aside as .bad after ${MAX_ATTEMPTS} tries: ${errorMessage(cause)}`);
343
347
  }
344
348
  return 'skipped';
@@ -362,7 +366,7 @@ function importFile(dir, entry, tenantId, log, importOne) {
362
366
  return 'skipped';
363
367
  const spooled = parseSpooled(text, tenantId);
364
368
  if (spooled === null) {
365
- if (moveBad(dir, claim, entry.stem, entry.attempt, 'unreadable', log, text))
369
+ if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text }))
366
370
  log(`spool file ${name} is not readable, set aside as .bad`);
367
371
  return 'skipped';
368
372
  }
@@ -379,7 +383,7 @@ function importFile(dir, entry, tenantId, log, importOne) {
379
383
  return 'imported';
380
384
  }
381
385
  catch (err) {
382
- return importFailed(dir, claim, entry, text, recorded, err, log);
386
+ return importFailed(dir, claim, entry, { text, recorded, cause: err, log });
383
387
  }
384
388
  }
385
389
  function mtimeOf(file) {
@@ -3,7 +3,7 @@
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import { copilotHomeDir } from '../hooks/shared.js';
6
- import { isObjectLike, isStringValue } from '../capture-contract.js';
6
+ import { isObjectLike, isStringValue } from '../core/capture-contract.js';
7
7
  // A session id becomes a folder name, so anything beyond word characters and hyphens could climb out of session-state.
8
8
  export const SESSION_ID_RE = /^[\w-]+$/;
9
9
  // user.message sources that mark text hippo did not get from the human: a hidden skill injection or another agent's prompt.
@@ -1,5 +1,5 @@
1
- import { duplicateKey } from '../same-text.js';
2
- import { assessAutomaticMemory } from '../memory-quality.js';
1
+ import { duplicateKey } from '../util/same-text.js';
2
+ import { assessAutomaticMemory } from '../core/memory-quality.js';
3
3
  const DECISION_PATTERNS = [
4
4
  /\b(?:we(?:'ve| have)?|i(?:'ve| have)?|let's)\s+decid(?:ed|e)\b/i,
5
5
  /\b(?:let's|we(?:'ll| will| should)?)\s+(?:go with|do|use|try|build|implement|switch to)\b/i,
@@ -1,6 +1,6 @@
1
1
  import type { Context } from '../api/types.js';
2
- import type { CallerProject } from '../prompt-hook.js';
3
- import { type CaptureErrorOutcome, type RoutineRule } from './failure-reading.js';
2
+ import { type CaptureErrorOutcome, type RoutineRule } from '../store/failure-log.js';
3
+ import type { CallerProject } from '../api/prompt-hook.js';
4
4
  type FailureSkip = Exclude<CaptureErrorOutcome, 'stored' | 'duplicate'>;
5
5
  /** failureReport's reading of the payload, read on the caller's machine, plus the id its retries carry. */
6
6
  export interface CallerFailureRequest {
@@ -1,10 +1,10 @@
1
1
  // PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried request id gets the first answer.
2
- import { BadRequestError } from '../api-errors.js';
3
- import { storeLesson } from '../capture-error.js';
4
- import { recordFailure, requestOutcome, settleFailureOutcome } from '../failure-log.js';
5
- import { errorMessage, log } from '../log.js';
6
- import { scrubForSharing } from '../share-scrub.js';
7
- import { truncateCodePointSafe } from '../transcript-tail.js';
2
+ import { BadRequestError } from '../core/api-errors.js';
3
+ import { storeLesson } from './capture-error.js';
4
+ import { recordFailure, requestOutcome, settleFailureOutcome } from '../store/failure-log.js';
5
+ import { errorMessage, log } from '../util/log.js';
6
+ import { scrubForSharing } from './share-scrub.js';
7
+ import { truncateCodePointSafe } from '../util/transcript-tail.js';
8
8
  import { assertRequestId, bindCaller, withCallerDb } from './caller-session.js';
9
9
  import { FAILURE_TEXT_MAX_CHARS, failureHash } from './failure-reading.js';
10
10
  const SKIPS = { 'skipped-interrupt': true, 'skipped-routine': true, 'skipped-invalid': true };
@@ -1,8 +1,5 @@
1
- import type { JsonValue } from '../json.js';
2
- /** Why a failure was not stored, or `stored`. */
3
- export type CaptureErrorOutcome = 'stored' | 'duplicate' | 'skipped-interrupt' | 'skipped-routine' | 'skipped-invalid';
4
- /** Which routine check skipped a failure; the log keeps it so declines can be told apart from empty searches. */
5
- export type RoutineRule = 'declined' | 'os-permission' | 'no-match' | 'search-tool' | 'quiet-exit';
1
+ import { type JsonValue } from '../util/json.js';
2
+ import type { CaptureErrorOutcome, RoutineRule } from '../store/failure-log.js';
6
3
  /** What {@link lessonFromFailure} read from a payload; `detail` is the finer failure-log key (untruncated, command head). */
7
4
  export type FailureReading = {
8
5
  text: string;
@@ -1,8 +1,10 @@
1
1
  // What a PostToolUseFailure payload says, read with no store, so a hook with no store sends the same reading the local log keeps.
2
- import { redactSecretsStrict } from '../secret-detect.js';
3
- import { scrubForSharing } from '../share-scrub.js';
4
- import { blockHash } from '../token-ledger.js';
5
- import { truncateCodePointSafe } from '../transcript-tail.js';
2
+ import { redactSecretsStrict } from '../util/secret-detect.js';
3
+ import { scrubForSharing } from './share-scrub.js';
4
+ import { blockHash } from '../util/token-text.js';
5
+ import { truncateCodePointSafe } from '../util/transcript-tail.js';
6
+ import { isJsonObjectLiteral } from '../util/json.js';
7
+ const COMMAND_HEAD_WORDS = 2;
6
8
  /** The longest lesson text a reading gives, so a check of a sent one imports it instead of copying it. */
7
9
  export const FAILURE_TEXT_MAX_CHARS = 200;
8
10
  /** The user, a permission prompt or a hook said no: routine, not a lesson. */
@@ -20,12 +22,9 @@ const SHELL_TOOLS = new Set(['Bash', 'bash', 'powershell', 'run_in_terminal']);
20
22
  function isString(v) {
21
23
  return v !== undefined && v !== null && v.constructor === String;
22
24
  }
23
- function isObject(v) {
24
- return v !== undefined && v !== null && !Array.isArray(v) && v.constructor === Object;
25
- }
26
25
  /** A non-blank string field of the payload, or null. */
27
26
  export function payloadString(payload, key) {
28
- if (!isObject(payload))
27
+ if (!isJsonObjectLiteral(payload))
29
28
  return null;
30
29
  const value = payload[key];
31
30
  return isString(value) && value.trim() !== '' ? value : null;
@@ -40,9 +39,9 @@ export function failureHash(text) {
40
39
  }
41
40
  /** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the cap, as a mask can be longer than what it hides. Pure. */
42
41
  export function lessonFromFailure(payload, scrub = (text) => text) {
43
- if (!isObject(payload))
42
+ if (!isJsonObjectLiteral(payload))
44
43
  return { skip: 'skipped-invalid', text: null, detail: null };
45
- // SAFETY: isObject narrowed payload to a plain JSON object; the fields read are all optional.
44
+ // SAFETY: isJsonObjectLiteral narrowed payload to a plain JSON object; the fields read are all optional.
46
45
  const p = payload;
47
46
  if (p.is_interrupt === true)
48
47
  return { skip: 'skipped-interrupt', text: null, detail: null };
@@ -51,8 +50,8 @@ export function lessonFromFailure(payload, scrub = (text) => text) {
51
50
  const tool = isString(p.tool_name) ? p.tool_name : 'tool';
52
51
  const error = redactSecretsStrict(p.error.replace(/\s+/g, ' ').trim());
53
52
  const text = truncateCodePointSafe(scrub(`${tool}: ${error}`), FAILURE_TEXT_MAX_CHARS);
54
- const command = isObject(p.tool_input) && isString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
55
- const head = command.trim().split(/\s+/).slice(0, 2).join(' ');
53
+ const command = isJsonObjectLiteral(p.tool_input) && isString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
54
+ const head = command.trim().split(/\s+/).slice(0, COMMAND_HEAD_WORDS).join(' ');
56
55
  const detail = `${tool}${head ? ` ${head}` : ''}: ${error}`;
57
56
  const routine = (rule) => ({ skip: 'skipped-routine', rule, text, detail });
58
57
  if (DECLINED.test(error))
@@ -1,4 +1,4 @@
1
- import type { HandoffEvidence } from './handoff.js';
1
+ import type { HandoffEvidence } from '../core/handoff.js';
2
2
  export declare function collectHandoffEvidence(cwd: string, testStatus: HandoffEvidence['testStatus'], options?: {
3
3
  timeoutMs?: number;
4
4
  }): HandoffEvidence;
@@ -1,9 +1,10 @@
1
1
  // A handoff's git evidence, read with no store, so a hook with no store can send it with the session's end.
2
2
  import { execFileSync } from 'child_process';
3
+ const DEFAULT_TIMEOUT_MS = 2000;
3
4
  // Best-effort git state; a missing git, non-repo cwd, or a call past timeoutMs (each call, default 2 s)
4
5
  // yields null fields rather than throw, so a hook with a hard deadline can cap a slow repo.
5
6
  export function collectHandoffEvidence(cwd, testStatus, options = {}) {
6
- const timeoutMs = options.timeoutMs ?? 2000;
7
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
7
8
  let gitRef = null;
8
9
  try {
9
10
  gitRef = execFileSync('git', ['rev-parse', 'HEAD'], {
@@ -1,5 +1,5 @@
1
1
  import type { Context } from '../api/types.js';
2
- import type { CallerProject } from '../prompt-hook.js';
2
+ import type { CallerProject } from '../api/prompt-hook.js';
3
3
  import { type WorkingState } from './working-state.js';
4
4
  export interface CallerPreCompactRequest {
5
5
  readonly sessionId: string;
@@ -1,5 +1,5 @@
1
- import { markSnapshotSaved, PRE_COMPACT_INSTRUCTION, startCompaction } from '../compaction-record.js';
2
- import { errorMessage, log } from '../log.js';
1
+ import { markSnapshotSaved, PRE_COMPACT_INSTRUCTION, startCompaction } from './compaction-record.js';
2
+ import { errorMessage, log } from '../util/log.js';
3
3
  import { loadActiveTaskSnapshot, saveActiveTaskSnapshot } from '../store/sessions.js';
4
4
  import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState, withCallerDb } from './caller-session.js';
5
5
  import { mergeWorkingState } from './working-state.js';
@@ -1,6 +1,4 @@
1
- import { type SessionTurn } from './capture/transcript.js';
2
- import { type MemoryEntry } from './memory.js';
3
- export declare const SESSION_DIGEST_TAG = "session-digest";
1
+ import { type SessionTurn } from './transcript.js';
4
2
  /** Five-word runs are stock phrases; six in a row is a copied clause. */
5
3
  export declare const ECHO_WINDOW = 6;
6
4
  /** Five sentences of about 150 chars leave room for the Changed line inside the total cap. */
@@ -54,8 +52,6 @@ export interface DigestDraft {
54
52
  }
55
53
  /** The digest text, or null when nothing survives the filters. Sentences print in reply order. */
56
54
  export declare function buildSessionDigest(sources: DigestSources): DigestDraft | null;
57
- /** Facts extracted from a digest and DAG summaries over one inherit its tag, but they are not the digest itself. */
58
- export declare function isSessionDigestRow(entry: Pick<MemoryEntry, 'source' | 'tags' | 'extracted_from'>): boolean;
59
55
  /** Same session, same row: a second worker for one session updates the digest instead of adding one. */
60
56
  export declare function sessionDigestId(tenantId: string, key: string): string;
61
57
  export interface SessionDigestOptions {
@@ -2,23 +2,23 @@
2
2
  import { createHash } from 'crypto';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
- import { collectSessionTurns } from './capture/transcript.js';
6
- import { isObjectLike, isStringValue } from './capture-contract.js';
5
+ import { collectSessionTurns } from './transcript.js';
6
+ import { isObjectLike, isStringValue } from '../core/capture-contract.js';
7
7
  import { PATCH_SUCCESS_LINE, patchPaths, shellPatch } from './codex-patch.js';
8
- import { loadConfig } from './config.js';
9
- import { USER_SEGMENT } from './home-path.js';
10
- import { errorMessage } from './log.js';
11
- import { createMemory, Layer } from './memory.js';
12
- import { RejectedValueError } from './rejection.js';
13
- import { maskEmails, redactSecretsStrict } from './secret-detect.js';
14
- import { isInitialized } from './store/open.js';
15
- import { writeEntry } from './store/entry-writes.js';
16
- import { loadAllEntries } from './store/entry-reads.js';
17
- import { SNAPSHOT_AMBIENT_MAX_AGE_MS } from './store/sessions.js';
18
- import { loadLatestHandoff } from './store/handoffs.js';
19
- import { isSyntheticMessage } from './token-ledger.js';
20
- import { readTranscriptTail } from './transcript-tail.js';
21
- export const SESSION_DIGEST_TAG = 'session-digest';
8
+ import { loadConfig } from '../core/config.js';
9
+ import { USER_SEGMENT } from '../util/home-path.js';
10
+ import { errorMessage } from '../util/log.js';
11
+ import { SESSION_DIGEST_TAG } from '../core/session-digest-row.js';
12
+ import { createMemory, Layer } from '../core/memory.js';
13
+ import { RejectedValueError } from '../store/rejection.js';
14
+ import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
15
+ import { isInitialized } from '../store/open.js';
16
+ import { writeEntry } from '../store/entry-writes.js';
17
+ import { loadLiveContentsBySourceAndTag } from '../store/entry-reads.js';
18
+ import { SNAPSHOT_AMBIENT_MAX_AGE_MS } from '../store/sessions.js';
19
+ import { loadLatestHandoff } from '../store/handoffs.js';
20
+ import { isSyntheticMessage } from '../store/token-ledger.js';
21
+ import { readTranscriptTail } from '../util/transcript-tail.js';
22
22
  /** Five-word runs are stock phrases; six in a row is a copied clause. */
23
23
  export const ECHO_WINDOW = 6;
24
24
  /** Five sentences of about 150 chars leave room for the Changed line inside the total cap. */
@@ -430,19 +430,13 @@ export function buildSessionDigest(sources) {
430
430
  return content ? { content, sentences: kept.length, files: files.length } : null;
431
431
  }
432
432
  }
433
- /** Facts extracted from a digest and DAG summaries over one inherit its tag, but they are not the digest itself. */
434
- export function isSessionDigestRow(entry) {
435
- return entry.source === SESSION_DIGEST_TAG && entry.tags.includes(SESSION_DIGEST_TAG) && !entry.extracted_from;
436
- }
437
433
  /** Same session, same row: a second worker for one session updates the digest instead of adding one. */
438
434
  export function sessionDigestId(tenantId, key) {
439
435
  return `mem_${createHash('sha256').update(`${SESSION_DIGEST_TAG}\n${tenantId}\n${key}`).digest('hex').slice(0, 12)}`;
440
436
  }
441
437
  /** What hippo could have injected into the session: any live digest (prompt recall reaches old ones) and the ambient handoff, never this session's own. */
442
438
  function injectedTexts(hippoRoot, opts) {
443
- const digests = loadAllEntries(hippoRoot, opts.tenantId)
444
- .filter((e) => isSessionDigestRow(e) && !e.superseded_by && e.source_session_id !== opts.key)
445
- .map((e) => e.content);
439
+ const digests = loadLiveContentsBySourceAndTag(hippoRoot, opts.tenantId, SESSION_DIGEST_TAG, SESSION_DIGEST_TAG, opts.key);
446
440
  const handoff = loadLatestHandoff(hippoRoot, opts.tenantId, undefined, {
447
441
  unfinishedOnly: true,
448
442
  maxAgeMs: SNAPSHOT_AMBIENT_MAX_AGE_MS,
@@ -1,6 +1,6 @@
1
1
  import type { Context } from '../api/types.js';
2
- import type { HandoffEvidence } from '../handoff.js';
3
- import type { CallerProject } from '../prompt-hook.js';
2
+ import type { HandoffEvidence } from '../core/handoff.js';
3
+ import type { CallerProject } from '../api/prompt-hook.js';
4
4
  import type { WorkingState } from './working-state.js';
5
5
  export type CallerEvidence = Pick<HandoffEvidence, 'gitRef' | 'dirtyTree' | 'testStatus'>;
6
6
  export interface CallerSessionEndRequest {
@@ -1,5 +1,5 @@
1
1
  // SessionEnd for a caller on another machine: the owner's handoff, then the owner's snapshot for the session closed, both under its tenant and project.
2
- import { BadRequestError } from '../api-errors.js';
2
+ import { BadRequestError } from '../core/api-errors.js';
3
3
  import { writeSessionEndHandoff } from '../store/handoffs.js';
4
4
  import { closeTaskSnapshotsForSession } from '../store/sessions.js';
5
5
  import { bindCaller, checkedWorkingState } from './caller-session.js';