hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,54 +1,20 @@
1
- // One record per Claude Code compaction, and what turns its summary into kept memories.
1
+ // What turns a compaction's summary into text the store keeps; the SQL is src/store/compactions-record.ts.
2
2
  import * as fs from 'fs';
3
- import * as path from 'path';
4
- import { ConflictError } from '../core/api-errors.js';
5
3
  import { isStringValue } from '../core/capture-contract.js';
6
- import { COMPACTION_ITEM_MAX_CHARS, compactSummaryBody, parseCompactionItems, selectItemRows } from './compaction-items.js';
4
+ import { COMPACTION_ITEM_MAX_CHARS, compactSummaryBody, parseCompactionItems } from '../util/compaction-items.js';
7
5
  import { importSpool, spool } from './compaction-spool.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';
6
+ import { replayStoredCompactions, saveCompactionAt, } from '../store/compactions-record.js';
18
7
  import { resolveTenantId } from '../store/tenant.js';
19
- import { errorMessage, log as logger } from '../util/log.js';
8
+ import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
9
+ import { errorMessage, reportCompactionFailure } from '../util/log.js';
20
10
  import { readTranscriptTail, truncateCodePointSafe } from '../util/transcript-tail.js';
21
- /** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
22
- export const COMPACTION_DB_WAIT_MS = 2000;
23
11
  /** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
24
- export const PRE_COMPACT_INSTRUCTION = "In your summary, add a last section titled 'Memories for hippo'. List, one per line starting with '- ', each lesson learned, decision made (with its reason) and correction the user gave in this session that should outlive it. Write each as a standalone sentence that names its subject. Leave out anything an earlier summary already listed under 'Memories for hippo', and anything this session already saved with `hippo remember`. Write '- none' if nothing new remains.";
12
+ export const PRE_COMPACT_INSTRUCTION = "In your summary, add a last section titled 'Memories for hippo'. List, one per line starting with '- ', each lesson learned, decision made (with its " +
13
+ "reason) and correction the user gave in this session that should outlive it. Write each as a standalone sentence that names its subject. Leave out " +
14
+ "anything an earlier summary already listed under 'Memories for hippo', and anything this session already saved with `hippo remember`. Write '- none' " +
15
+ "if nothing new remains.";
25
16
  const SUMMARY_MAX_CHARS = 256 * 1024;
26
- /** Long enough that a live hook has finished with its own record. */
27
- export const REPLAY_AFTER_MS = 10 * 60_000;
28
- /** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
29
- export const TRANSCRIPT_FILL_WINDOW_MS = 30 * 24 * 60 * 60_000;
30
17
  const TRANSCRIPT_TAIL_CAPS = [1 << 20, 8 << 20, 64 << 20];
31
- /** The marker redactSecretsStrict writes; an item holding it was a secret before it was stored. */
32
- const REDACTED = '[REDACTED]';
33
- /** Where the session ran: rows written through the global store or a shared store keep the project the session was in. */
34
- function compactionProject(hippoRoot, cwd) {
35
- if (!isGlobalStoreRoot(hippoRoot) && !isSharedStore(hippoRoot))
36
- return resolveProjectIdentity(path.dirname(hippoRoot));
37
- // No cwd means user-global, as stampOriginProject gives the global store; undefined would fall back to the hook's own cwd.
38
- return cwd === null ? '' : resolveProjectIdentity(cwd);
39
- }
40
- /** The record column cannot hold NULL, but an item from an unknown folder on a shared store must not read as user-global. */
41
- function itemOrigin(hippoRoot, ctx) {
42
- return ctx.cwd === null && isSharedStore(hippoRoot) ? fallbackOrigin(hippoRoot) : ctx.originProject;
43
- }
44
- function compactionOrigin(hippoRoot, cwd) {
45
- return projectId(compactionProject(hippoRoot, cwd));
46
- }
47
- /** The names a record's held rows may carry: its origin, plus the folder name rows saved before project ids used. */
48
- function heldOrigins(hippoRoot, cwd, originProject) {
49
- const names = projectNames(compactionProject(hippoRoot, cwd));
50
- return names.includes(originProject) ? names : [originProject];
51
- }
52
18
  function scrub(text) {
53
19
  return maskEmails(redactSecretsStrict(text));
54
20
  }
@@ -58,297 +24,34 @@ export function readCompactionText(compactSummary) {
58
24
  const parsed = parseCompactionItems(body);
59
25
  return { summary: truncateCodePointSafe(scrub(body), SUMMARY_MAX_CHARS), items: parsed.items.map(scrub), found: parsed.found };
60
26
  }
61
- /** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a mask can run longer than what it hides. */
27
+ /** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a
28
+ * mask can run longer than what it hides. */
62
29
  export function scrubCompactionItems(items) {
63
30
  return items.map((item) => truncateCodePointSafe(scrub(item), COMPACTION_ITEM_MAX_CHARS));
64
31
  }
65
- function toRecord(row) {
66
- const listed = row.items_json === null ? [] : JSON.parse(row.items_json);
67
- return {
68
- id: row.id,
69
- tenantId: row.tenant_id,
70
- sessionId: row.session_id,
71
- originProject: row.origin_project,
72
- trigger: row.compact_trigger,
73
- cwd: row.cwd,
74
- transcriptPath: row.transcript_path,
75
- snapshotSaved: row.snapshot_saved === 1,
76
- startedAt: row.started_at,
77
- summarisedAt: row.summarised_at,
78
- summary: row.summary,
79
- items: Array.isArray(listed) ? listed.filter(isStringValue) : [],
80
- itemsWritten: row.items_written,
81
- status: row.status,
82
- };
83
- }
84
- export function startCompaction(db, tenantId, start, at = new Date()) {
85
- const id = generateId('cmp');
86
- insertStartedCompaction(db, tenantId, { id, ...start, startedAt: at.toISOString() });
87
- return id;
88
- }
89
- /** A session's newest record, or null. */
90
- export function latestCompaction(db, tenantId, sessionId) {
91
- return latestCompactionRows(db, tenantId, sessionId).map(toRecord)[0] ?? null;
92
- }
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. */
94
- export function compactionByRequest(db, tenantId, requestId, sessionId) {
95
- const record = compactionRowsByRequest(db, tenantId, requestId).map(toRecord)[0] ?? null;
96
- // Sessions are owner-bound, so this also keeps one owner from reading or finishing another's record.
97
- if (record !== null && record.sessionId !== sessionId)
98
- throw new ConflictError('request id belongs to another session');
99
- return record;
100
- }
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. */
102
- function latestStarted(db, tenantId, sessionId, at) {
103
- return latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null;
104
- }
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 });
108
- }
109
- /** Best effort, never throws: a compaction must not fail because its record could not be written. */
110
- export function recordCompactionStart(hippoRoot, start, log) {
111
- let db;
112
- try {
113
- db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
114
- return startCompaction(db, resolveTenantId({}), { ...start, originProject: compactionOrigin(hippoRoot, start.cwd) });
115
- }
116
- catch (err) {
117
- log(`compaction record not started: ${errorMessage(err)}`);
118
- return null;
119
- }
120
- finally {
121
- if (db)
122
- closeHippoDb(db);
123
- }
124
- }
125
- /** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
126
- export function markSnapshotSaved(db, tenantId, recordId) {
127
- markSnapshotSavedRow(db, tenantId, recordId);
128
- }
129
- export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
130
- let db;
32
+ function spoolSummary(hippoRoot, payload, text, at, reason, result, log) {
131
33
  try {
132
- db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
133
- markSnapshotSaved(db, tenantId, recordId);
134
- }
135
- catch (err) {
136
- log(`compaction record not marked with its snapshot: ${errorMessage(err)}`);
137
- }
138
- finally {
139
- if (db)
140
- closeHippoDb(db);
141
- }
142
- }
143
- /** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
144
- export function recordSummary(db, hippoRoot, tenantId, options) {
145
- const { meta, text, at, caller = {} } = options;
146
- const now = new Date().toISOString();
147
- const itemsJson = JSON.stringify(text.items);
148
- const { requestId } = caller;
149
- const started = latestStarted(db, tenantId, meta.sessionId, at);
150
- if (started && markSummarised(db, tenantId, started.id, { text, summarisedAt: now, requestId })) {
151
- return { ...started, summary: text.summary, items: text.items, summarisedAt: now, status: 'summarised' };
152
- }
153
- const originProject = caller.originProject ?? compactionOrigin(hippoRoot, meta.cwd);
154
- const id = generateId('cmp');
155
- insertSummarisedCompaction(db, tenantId, { ...meta, originProject, startedAt: at.toISOString() }, { id, summary: text.summary, itemsJson, summarisedAt: now, requestId });
156
- return {
157
- id, tenantId, sessionId: meta.sessionId, originProject, trigger: meta.trigger, cwd: meta.cwd, transcriptPath: meta.transcriptPath,
158
- snapshotSaved: false, startedAt: at.toISOString(), summarisedAt: now, summary: text.summary, items: text.items, itemsWritten: 0, status: 'summarised',
159
- };
160
- }
161
- /** Words whose loss reverses or narrows a statement: "do not", "can't", "only", "unless". */
162
- const PROTECTED_WORDS = new Set(['not', 'no', 'never', 'none', 'nor', 'without', 'cannot', 't', 'only', 'except', 'unless', 'until']);
163
- /** Below this share of the held text's words, an item is a fragment of something longer, not a restatement. */
164
- const RESTATE_MIN_SHARE = 0.5;
165
- function words(text) {
166
- return text.normalize('NFC').toLowerCase().split(/[^\p{L}\p{M}\p{N}_]+/u).filter(Boolean);
167
- }
168
- /** True when `item` is `held` with words left out, in the same order, keeping every number and protected word. Spacing, case and punctuation may differ. */
169
- function restates(item, held) {
170
- if (item.length === 0 || item.length < RESTATE_MIN_SHARE * held.length)
171
- return false;
172
- const kept = new Set(item);
173
- let next = 0;
174
- for (const w of held) {
175
- if (next < item.length && w === item[next])
176
- next++;
177
- else if (!kept.has(w) && (PROTECTED_WORDS.has(w) || /\p{N}/u.test(w)))
178
- return false;
179
- }
180
- return next === item.length;
181
- }
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. */
183
- function heldRows(db, tenantId, origins) {
184
- return heldMemoryRows(db, tenantId, origins).map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
185
- }
186
- function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
187
- return {
188
- ...createMemory(text, {
189
- layer: Layer.Episodic,
190
- tags: [COMPACTION_MEMORY_TAG],
191
- source: `${COMPACTION_SOURCE_PREFIX}${ctx.sessionId}`,
192
- confidence: 'observed',
193
- kind: 'distilled',
194
- source_session_id: ctx.sessionId,
195
- tenantId: ctx.tenantId,
196
- baseHalfLifeDays,
197
- }),
198
- origin_project: origin,
199
- };
200
- }
201
- /** Runs inside saveItems' transaction: restatements of held rows are counted, the rest go through the write gate. */
202
- function writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays) {
203
- const out = { written: [], repeats: 0, refused: 0, restated: [] };
204
- const held = heldRows(db, ctx.tenantId, ctx.caller?.origins ?? heldOrigins(hippoRoot, ctx.cwd, ctx.originProject));
205
- const origin = ctx.caller === undefined ? itemOrigin(hippoRoot, ctx) : ctx.originProject;
206
- const restated = new Set();
207
- for (const text of rows) {
208
- const itemWords = words(text);
209
- const match = held.find((h) => restates(itemWords, h.words));
210
- if (match) {
211
- out.repeats++;
212
- if (match.id !== null && match.sessionId !== ctx.sessionId)
213
- restated.add(match.id);
214
- continue;
215
- }
216
- // createMemory throws below 3 chars, which would sink the whole transaction.
217
- if (text.trim().length < 3) {
218
- out.refused++;
219
- continue;
220
- }
221
- const entry = compactionEntry(text, ctx, origin, baseHalfLifeDays);
222
- if (gatedWrite(db, hippoRoot, entry, { actor: ctx.caller?.actor ?? 'post-compact' }) === 'written') {
223
- out.written.push(entry);
224
- held.push({ id: null, sessionId: ctx.sessionId, words: itemWords });
225
- }
226
- else {
227
- out.refused++;
228
- }
229
- }
230
- out.restated = [...restated];
231
- return out;
232
- }
233
- /** After commit: report skips, mirror the new rows, bump the counter. */
234
- function finishItemWrites(hippoRoot, writes, log) {
235
- if (writes.repeats > 0)
236
- log(`skipped ${writes.repeats} item(s) the store already holds`);
237
- if (writes.refused > 0)
238
- log(`skipped ${writes.refused} item(s) the write gate refused`);
239
- for (const entry of writes.written)
240
- writeEntryMirrors(hippoRoot, entry);
241
- if (writes.written.length > 0) {
242
- try {
243
- updateStats(hippoRoot, { remembered: writes.written.length });
244
- }
245
- catch (err) {
246
- // The rows are committed; a counter that could not be bumped must not turn that into a failed step.
247
- log(`remembered counter not updated: ${errorMessage(err)}`);
248
- }
34
+ spool(hippoRoot, resolveTenantId({}), payload, text, at);
35
+ result.deferred = true;
36
+ log(`store busy, summary spooled: ${reason}`);
249
37
  }
250
- }
251
- /** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
252
- export function saveItems(db, hippoRoot, ctx, log) {
253
- const usable = ctx.items.filter((item) => !item.includes(REDACTED));
254
- if (usable.length < ctx.items.length)
255
- log(`skipped ${ctx.items.length - usable.length} item(s) as secret`);
256
- const { rows, tooLong, capped } = selectItemRows(usable);
257
- if (tooLong > 0)
258
- log(`item too long: ${tooLong} kept in the record only`);
259
- if (capped > 0)
260
- log(`capped: ${capped} more kept in the record only`);
261
- const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
262
- let finishedItems = 0;
263
- const writes = withWriteScopeOr(db, 'save_items', (rollback) => {
264
- if (ctx.recordId !== null) {
265
- // A replayer that read the record before another finished it must not write its items again.
266
- const current = compactionProgress(db, ctx.tenantId, ctx.recordId);
267
- if (current?.status !== 'summarised') {
268
- finishedItems = current?.items_written ?? 0;
269
- return rollback(null);
270
- }
271
- }
272
- const written = writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays);
273
- // Said again by another session is the same signal as being recalled; the same session carrying it forward is not.
274
- strengthenRetrievedOn(db, written.restated, { tenantId: ctx.tenantId, recallBoostAblated: isRecallBoostAblated() });
275
- if (ctx.recordId !== null) {
276
- markCompactionDone(db, ctx.tenantId, ctx.recordId, written.written.length);
277
- }
278
- return written;
279
- });
280
- if (writes === null) {
281
- log(`${ctx.recordId} was already finished by another process`);
282
- return finishedItems;
38
+ catch (spoolErr) {
39
+ reportCompactionFailure(log, 'spool', errorMessage(spoolErr));
283
40
  }
284
- finishItemWrites(hippoRoot, writes, log);
285
- return writes.written.length;
286
41
  }
287
42
  /** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or defers. Never throws. */
288
43
  export function saveCompaction(hippoRoot, payload, log) {
289
- const result = { written: null, deferred: false, snapshotSaved: false };
290
44
  if (payload.compactSummary === null) {
291
45
  log('skip: payload has no compact_summary');
292
- return result;
46
+ return { written: null, deferred: false, snapshotSaved: false };
293
47
  }
294
48
  const at = new Date();
295
49
  const { found, ...text } = readCompactionText(payload.compactSummary);
296
50
  if (!found)
297
51
  log('no memories section');
298
- let db;
299
- try {
300
- db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
301
- const tenantId = resolveTenantId({});
302
- let record = null;
303
- try {
304
- record = recordSummary(db, hippoRoot, tenantId, { meta: payload, text, at });
305
- result.snapshotSaved = record.snapshotSaved;
306
- }
307
- catch (err) {
308
- if (isSqliteBusy(err))
309
- throw err;
310
- log(`record step failed: ${errorMessage(err)}`);
311
- logger.error(`post-compact: record step failed: ${errorMessage(err)}`);
312
- }
313
- try {
314
- result.written = saveItems(db, hippoRoot, {
315
- tenantId,
316
- recordId: record?.id ?? null,
317
- sessionId: payload.sessionId,
318
- originProject: record?.originProject ?? compactionOrigin(hippoRoot, payload.cwd),
319
- cwd: payload.cwd,
320
- items: text.items,
321
- }, log);
322
- }
323
- catch (err) {
324
- if (!isSqliteBusy(err) || record === null)
325
- throw err;
326
- // The record already holds the items; sleep finishes them.
327
- result.deferred = true;
328
- log(`store busy, items left for the next sleep: ${errorMessage(err)}`);
329
- }
330
- }
331
- catch (err) {
332
- if (isSqliteBusy(err) || db === undefined) {
333
- try {
334
- spool(hippoRoot, resolveTenantId({}), payload, text, at);
335
- result.deferred = true;
336
- log(`store busy, summary spooled: ${errorMessage(err)}`);
337
- }
338
- catch (spoolErr) {
339
- log(`spool failed: ${errorMessage(spoolErr)}`);
340
- logger.error(`post-compact: spool failed: ${errorMessage(spoolErr)}`);
341
- }
342
- }
343
- else {
344
- log(`items step failed: ${errorMessage(err)}`);
345
- logger.error(`post-compact: items step failed: ${errorMessage(err)}`);
346
- }
347
- }
348
- finally {
349
- if (db)
350
- closeHippoDb(db);
351
- }
52
+ const { result, spoolReason } = saveCompactionAt(hippoRoot, payload, text, at, log);
53
+ if (spoolReason !== null)
54
+ spoolSummary(hippoRoot, payload, text, at, spoolReason, result, log);
352
55
  return result;
353
56
  }
354
57
  /** The one line PostCompact prints, or null when nothing was saved. */
@@ -393,89 +96,21 @@ function transcriptSummary(transcriptPath, afterMs, beforeMs) {
393
96
  }
394
97
  return null;
395
98
  }
396
- function closeWithoutSummary(db, tenantId, id, log) {
397
- if (closeStartedWithoutSummary(db, tenantId, id) > 0)
398
- log(`${id} closed as no-summary: its transcript holds no summary for it`);
399
- }
400
- function nextStartedAt(db, record) {
401
- return nextCompactionStart(db, record.tenantId, record.sessionId, record.startedAt);
402
- }
403
- /** Records a spooled summary, then writes its items. */
404
- function spoolImporter(db, hippoRoot, log) {
405
- return (spooled, recorded) => {
406
- const record = recordSummary(db, hippoRoot, spooled.tenantId, { meta: spooled.payload, text: spooled.text, at: spooled.at });
407
- // The record holds the items now, so the file is done even if the write below fails.
408
- recorded();
409
- saveItems(db, hippoRoot, { tenantId: spooled.tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items: record.items }, log);
410
- };
411
- }
412
- /** Finishes what a killed hook or a busy store left: `summarised` records, spool files, and `started` records the transcript can fill. Returns how many compactions it saved. */
413
- export function replayCompactions(db, hippoRoot, log, deadline = Number.POSITIVE_INFINITY) {
414
- const tenantId = resolveTenantId({});
415
- const now = Date.now();
416
- let finished = 0;
417
- const stalled = stalledSummarisedRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString()).map(toRecord);
418
- for (const record of stalled) {
419
- if (Date.now() > deadline)
420
- break;
421
- try {
422
- saveItems(db, hippoRoot, { tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items: record.items }, log);
423
- finished++;
424
- }
425
- catch (err) {
426
- log(`replay of ${record.id} failed: ${errorMessage(err)}`);
427
- }
428
- }
429
- try {
430
- finished += importSpool(hippoRoot, tenantId, log, deadline, spoolImporter(db, hippoRoot, log));
431
- }
432
- catch (err) {
433
- log(`spool import failed: ${errorMessage(err)}`);
434
- }
435
- const open = openTranscriptRows(db, tenantId, new Date(now - REPLAY_AFTER_MS).toISOString(), new Date(now - TRANSCRIPT_FILL_WINDOW_MS).toISOString()).map(toRecord);
436
- for (const record of open) {
437
- if (Date.now() > deadline)
438
- break;
439
- try {
440
- if (record.transcriptPath === null || !fs.existsSync(record.transcriptPath))
441
- continue;
442
- const next = nextStartedAt(db, record);
443
- const found = transcriptSummary(record.transcriptPath, Date.parse(record.startedAt), next === null ? Number.POSITIVE_INFINITY : Date.parse(next));
444
- if (found === null) {
445
- // The record is past REPLAY_AFTER_MS, so a window that is fully scanned or out of reach stays empty.
446
- closeWithoutSummary(db, tenantId, record.id, log);
447
- continue;
448
- }
99
+ function replaySources(hippoRoot, log) {
100
+ return {
101
+ importSpool: (tenantId, deadline, record) => importSpool(hippoRoot, tenantId, log, deadline, record),
102
+ transcriptExists: (transcriptPath) => fs.existsSync(transcriptPath),
103
+ transcriptText: (transcriptPath, afterMs, beforeMs) => {
104
+ const found = transcriptSummary(transcriptPath, afterMs, beforeMs);
105
+ if (found === null)
106
+ return null;
449
107
  const { found: listed, ...text } = readCompactionText(found);
450
- if (!listed)
451
- log(`no memories section in the transcript summary for ${record.id}`);
452
- if (!markSummarised(db, tenantId, record.id, { text, summarisedAt: new Date().toISOString() })) {
453
- log(`${record.id} was filled by another process`);
454
- continue;
455
- }
456
- saveItems(db, hippoRoot, { tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items: text.items }, log);
457
- finished++;
458
- }
459
- catch (err) {
460
- log(`transcript fill of ${record.id} failed: ${errorMessage(err)}`);
461
- }
462
- }
463
- return finished;
108
+ return { text, listed };
109
+ },
110
+ };
464
111
  }
465
- /** For `hippo sleep` and post-compact: opens the store itself and never throws. */
112
+ /** For `hippo sleep` and post-compact: finishes what a killed hook or a busy store left, never throws. */
466
113
  export function replayCompactionsAt(hippoRoot, log, opts = {}) {
467
- let db;
468
- try {
469
- db = openHippoDb(hippoRoot, { busyWaitMs: opts.busyWaitMs });
470
- return replayCompactions(db, hippoRoot, log, opts.deadline);
471
- }
472
- catch (err) {
473
- log(`replay failed: ${errorMessage(err)}`);
474
- return 0;
475
- }
476
- finally {
477
- if (db)
478
- closeHippoDb(db);
479
- }
114
+ return replayStoredCompactions(hippoRoot, replaySources(hippoRoot, log), log, opts);
480
115
  }
481
116
  //# sourceMappingURL=compaction-record.js.map
@@ -1,6 +1,8 @@
1
- import type { CompactionText, Log, PostCompactPayload } from './compaction-record.js';
1
+ import type { CompactionText, Log } from '../store/compactions-record.js';
2
+ import type { PostCompactPayload } from './compaction-record.js';
2
3
  export declare const SPOOL_DIR = "compactions-spool";
3
- /** 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. */
4
+ /** 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
5
+ * by its `.bad` name instead. */
4
6
  export declare const SPOOL_PROBLEM = "spool problem: ";
5
7
  /** Only the fs calls the spool makes, so a test can stand in for one of them. */
6
8
  export interface SpoolFs {
@@ -21,7 +23,7 @@ export interface SpoolFs {
21
23
  }): void;
22
24
  }
23
25
  /** Test-only seam, so a test can make one fs call fail; null restores the real fs. */
24
- export declare function __setSpoolFs(next: SpoolFs | null): void;
26
+ export declare function _setSpoolFsForTests(next: SpoolFs | null): void;
25
27
  export interface SpooledCompaction {
26
28
  tenantId: string;
27
29
  payload: PostCompactPayload;
@@ -1,4 +1,5 @@
1
1
  // Summaries post-compact could not record because the store was busy, waiting on disk for the next replay.
2
+ import { MINUTE_MS } from '../util/time.js';
2
3
  import { randomBytes } from 'crypto';
3
4
  import * as fs from 'fs';
4
5
  import * as path from 'path';
@@ -7,11 +8,12 @@ import { isSqliteBusy } from '../db/busy.js';
7
8
  import { errorMessage } from '../util/log.js';
8
9
  const STAMP_DIGITS = 13;
9
10
  export const SPOOL_DIR = 'compactions-spool';
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. */
11
+ /** 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
12
+ * by its `.bad` name instead. */
11
13
  export const SPOOL_PROBLEM = 'spool problem: ';
12
14
  const LOCK = 'replay.lock';
13
15
  /** Long enough that a live replayer has finished with its claim. */
14
- const STALE_MS = 10 * 60_000;
16
+ const STALE_MS = 10 * MINUTE_MS;
15
17
  const MAX_ATTEMPTS = 3;
16
18
  const BUSY_RETRIES = 3;
17
19
  const BUSY_WAIT_MS = 50;
@@ -29,7 +31,7 @@ const NEW_STEM = /^(\d{13})-[0-9a-f]{8}$/;
29
31
  const LEGACY_STEM_TIME = /-(\d+)$/;
30
32
  let fsx = fs;
31
33
  /** Test-only seam, so a test can make one fs call fail; null restores the real fs. */
32
- export function __setSpoolFs(next) {
34
+ export function _setSpoolFsForTests(next) {
33
35
  fsx = next ?? fs;
34
36
  }
35
37
  const stamp = (ms) => String(Math.trunc(ms)).padStart(STAMP_DIGITS, '0');
@@ -100,7 +102,16 @@ function spoolFile(hippoRoot) {
100
102
  export function spool(hippoRoot, tenantId, payload, text, at) {
101
103
  const file = spoolFile(hippoRoot);
102
104
  fsx.mkdirSync(path.dirname(file), { recursive: true });
103
- const body = { tenantId, sessionId: payload.sessionId, trigger: payload.trigger, cwd: payload.cwd, transcriptPath: payload.transcriptPath, at: at.toISOString(), summary: text.summary, items: text.items };
105
+ const body = {
106
+ tenantId,
107
+ sessionId: payload.sessionId,
108
+ trigger: payload.trigger,
109
+ cwd: payload.cwd,
110
+ transcriptPath: payload.transcriptPath,
111
+ at: at.toISOString(),
112
+ summary: text.summary,
113
+ items: text.items,
114
+ };
104
115
  // Renamed into place so a replayer listing `.json` files never reads half a file.
105
116
  fsx.writeFileSync(`${file}.tmp`, JSON.stringify(body), { encoding: 'utf8', flag: 'wx' });
106
117
  // A rename that stays busy leaves a whole tmp, which a replay promotes once it is STALE_MS old.
@@ -255,7 +266,7 @@ function recoverStaleClaims(dir, names, log) {
255
266
  function putBack(dir, claim, stem, attempt, log) {
256
267
  const name = path.basename(claim);
257
268
  if (settle(() => fsx.renameSync(claim, path.join(dir, `${stem}.a${attempt}.json`)), log, `spool file ${name} not put back`) === 'busy') {
258
- log(`spool file ${name} could not be put back; it returns ${STALE_MS / 60_000} minutes after its claim`);
269
+ log(`spool file ${name} could not be put back; it returns ${STALE_MS / MINUTE_MS} minutes after its claim`);
259
270
  }
260
271
  }
261
272
  /** Writes `<stem>.<cause>.bad` through a random temp file, so the rename replaces any torn `.bad` a crash left. */
@@ -329,7 +340,9 @@ function importFailed(dir, claim, entry, options) {
329
340
  const busy = isSqliteBusy(cause);
330
341
  if (recorded) {
331
342
  // The record stays `summarised`, so the stalled-record step of a later replay writes its items.
332
- log(busy ? `spool file ${name} saved; its memories wait for the next sleep (store busy)` : `spool file ${name} saved; writing its memories failed: ${errorMessage(cause)}`);
343
+ log(busy
344
+ ? `spool file ${name} saved; its memories wait for the next sleep (store busy)`
345
+ : `spool file ${name} saved; writing its memories failed: ${errorMessage(cause)}`);
333
346
  return busy ? 'stop' : 'skipped';
334
347
  }
335
348
  if (busy) {
@@ -366,8 +379,9 @@ function importFile(dir, entry, tenantId, log, importOne) {
366
379
  return 'skipped';
367
380
  const spooled = parseSpooled(text, tenantId);
368
381
  if (spooled === null) {
369
- if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text }))
382
+ if (moveBad(dir, claim, { stem: entry.stem, attempt: entry.attempt, cause: 'unreadable', log, raw: text })) {
370
383
  log(`spool file ${name} is not readable, set aside as .bad`);
384
+ }
371
385
  return 'skipped';
372
386
  }
373
387
  let recorded = false;
@@ -13,6 +13,7 @@ export declare const SESSION_ID_RE: RegExp;
13
13
  export declare function copilotTranscriptFor(sessionId: string): string | null;
14
14
  /** True for VS Code's own chat log, `<workspaceStorage>/<id>/github.copilot-chat/transcripts/<session id>.jsonl`, in either slash and any case. */
15
15
  export declare function isVscodeTranscript(file: string | null): boolean;
16
- /** The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for any other line, a sub-agent's included. */
16
+ /** The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for any other line, a
17
+ * sub-agent's included. */
17
18
  export declare function copilotTurn(line: CopilotEventLine): CopilotTurn | null;
18
19
  //# sourceMappingURL=copilot-transcript.d.ts.map
@@ -33,7 +33,8 @@ function isInjectedUserMessage(data) {
33
33
  const source = data.source;
34
34
  return isStringValue(source) && INJECTED_SOURCE_PREFIXES.some((prefix) => source.startsWith(prefix));
35
35
  }
36
- /** The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for any other line, a sub-agent's included. */
36
+ /** The turn one Copilot event-log line carries: the text of a human user.message or of an assistant.message; null for any other line, a
37
+ * sub-agent's included. */
37
38
  export function copilotTurn(line) {
38
39
  const role = line.type === 'user.message' ? 'user' : line.type === 'assistant.message' ? 'assistant' : null;
39
40
  const data = isObjectLike(line.data) ? line.data : null;
@@ -2,8 +2,11 @@ export interface ExtractedItem {
2
2
  content: string;
3
3
  category: string;
4
4
  tags: string[];
5
+ /** A person said it, not the agent: capture pins a rule that carries this. */
6
+ fromUser?: boolean;
5
7
  }
6
- /** Captures complete supported statements, each text parsed alone so a fence or heading in one never reaches the next. */
7
- export declare function extractFromTexts(texts: readonly string[]): ExtractedItem[];
8
+ /** Captures complete supported statements, each text parsed alone so a fence or heading in one never reaches the next.
9
+ * The first `userTexts` texts are a person's own words; on a repeat their copy wins, so it keeps `fromUser`. */
10
+ export declare function extractFromTexts(texts: readonly string[], userTexts?: number): ExtractedItem[];
8
11
  export declare function extractFromText(text: string): ExtractedItem[];
9
12
  //# sourceMappingURL=extract.d.ts.map
@@ -158,10 +158,11 @@ function extractOne(text) {
158
158
  }
159
159
  return items;
160
160
  }
161
- /** Captures complete supported statements, each text parsed alone so a fence or heading in one never reaches the next. */
162
- export function extractFromTexts(texts) {
161
+ /** Captures complete supported statements, each text parsed alone so a fence or heading in one never reaches the next.
162
+ * The first `userTexts` texts are a person's own words; on a repeat their copy wins, so it keeps `fromUser`. */
163
+ export function extractFromTexts(texts, userTexts = 0) {
163
164
  const seen = new Set();
164
- return texts.flatMap(extractOne).filter((item) => {
165
+ return texts.flatMap((text, i) => extractOne(text).map((item) => (i < userTexts ? { ...item, fromUser: true } : item))).filter((item) => {
165
166
  const key = duplicateKey(item.content);
166
167
  if (seen.has(key) || !assessAutomaticMemory(item.content).accepted)
167
168
  return false;
@@ -1,5 +1,5 @@
1
1
  import type { Context } from '../api/types.js';
2
- import { type CaptureErrorOutcome, type RoutineRule } from '../store/failure-log.js';
2
+ import type { CaptureErrorOutcome, RoutineRule } from '../store/failure-log.js';
3
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. */