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,12 +1,13 @@
1
1
  import { isFtsAvailable, closeHippoDb } from '../db/index.js';
2
2
  import { tokenize } from '../util/tokenize.js';
3
- import { isPersonalScope, scopeAdmitSql } from './recall-scope.js';
3
+ import { isPersonalScope } from '../core/recall-scope.js';
4
+ import { scopeAdmitSql } from './rule-sql.js';
4
5
  import { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } from '../core/prompt-recall.js';
5
6
  import { errorMessage, log } from '../util/log.js';
6
7
  import { originInSql } from '../core/project-identity.js';
7
8
  import { topVectorMatches } from '../db/vector-store.js';
8
9
  import { MEMORY_SELECT_COLUMNS, MEMORY_SEARCH_COLUMNS, DEFAULT_SEARCH_CANDIDATE_LIMIT, rowToEntry, } from './rows.js';
9
- import { openStore } from './open.js';
10
+ import { onHandle, openStore } from './open.js';
10
11
  import { escapeLike } from '../util/escape.js';
11
12
  /** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is its JS twin. */
12
13
  function recallScopeClause(col, scopeFilter) {
@@ -26,9 +27,13 @@ function withProject(scope, col, origin) {
26
27
  return scope;
27
28
  // A string is the shape published callers passed before a project could carry several names.
28
29
  const originProjects = [origin].flat();
29
- return { sql: `${scope.sql} AND (${col}origin_project = '' OR ${originInSql(originProjects, `${col}origin_project`)})`, params: [...scope.params, ...originProjects] };
30
+ return {
31
+ sql: `${scope.sql} AND (${col}origin_project = '' OR ${originInSql(originProjects, `${col}origin_project`)})`,
32
+ params: [...scope.params, ...originProjects],
33
+ };
30
34
  }
31
- /** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal, which only `ownScope` opens. */
35
+ /** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal,
36
+ * which only `ownScope` opens. */
32
37
  export function recallScopeFilter(requestedScope, mode, ownScope) {
33
38
  if (!requestedScope || (mode === 'additive' && isPersonalScope(requestedScope)))
34
39
  return { mode: 'default-deny', ownScope };
@@ -62,19 +67,14 @@ function loadSearchRows(db, query, limit, tenantId, options = {}) {
62
67
  return selectAllCandidates(db, p, limit);
63
68
  }
64
69
  function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjects) {
65
- // tenantId undefined = no tenant filter (legacy callers / cross-deployment
66
- // helpers). tenantId set = strict tenant isolation, leveraging the composite
67
- // idx_memories_tenant_created (leading column tenant_id, O(log n) lookup).
70
+ // tenantId undefined = no tenant filter (legacy callers / cross-deployment helpers); set = strict isolation via the composite idx_memories_tenant_created.
68
71
  const tenantPredicate = tenantId !== undefined ? ` AND m.tenant_id = ?` : '';
69
72
  const tenantOnlyPredicate = tenantId !== undefined ? ` WHERE tenant_id = ?` : '';
70
73
  const tenantParams = tenantId !== undefined ? [tenantId] : [];
71
74
  // Defensive: kind='archived' is a transient sentinel inside archiveRawMemory's SAVEPOINT, so this only
72
75
  // guards against a dropped SAVEPOINT, a persisted 'archived' state, or direct-SQL writes.
73
76
  const archivedClauseAlias = ` AND m.kind != 'archived'`;
74
- // For the "tenant-only" path: if no tenant set, tenantOnlyPredicate is '',
75
- // so prepend WHERE; if tenant set, append AND. handled in each call site
76
- // by always joining `tenantOnlyPredicate + archivedClauseTenantOnly` where
77
- // the latter switches between " AND" and " WHERE" based on caller context.
77
+ // Tenant-only path: with no tenant `tenantOnlyPredicate` is '', so the archived clause switches between ' AND' and ' WHERE' by caller context.
78
78
  const archivedClauseTenantOnly = tenantId !== undefined ? ` AND kind != 'archived'` : ` WHERE kind != 'archived'`;
79
79
  const aliasScope = withProject(recallScopeClause('m.', scopeFilter), 'm.', originProjects);
80
80
  const plainScope = withProject(recallScopeClause('', scopeFilter), '', originProjects);
@@ -89,7 +89,8 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
89
89
  }
90
90
  /** Every admitted row, oldest first; the no-terms path and the last-resort fallback share it. */
91
91
  function selectAllCandidates(db, p, limit) {
92
- const sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}${p.plainScope.sql}${p.currentNoAlias} ORDER BY created ASC, id ASC LIMIT ?`;
92
+ const sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}` +
93
+ `${p.plainScope.sql}${p.currentNoAlias} ORDER BY created ASC, id ASC LIMIT ?`;
93
94
  // SAFETY: sql selects exactly MEMORY_SELECT_COLUMNS, whose column list
94
95
  // matches MemoryRow's field set.
95
96
  return db.prepare(sql).all(...p.tenantParams, ...p.scopeParams, limit);
@@ -98,11 +99,8 @@ function selectAllCandidates(db, p, limit) {
98
99
  function selectFtsCandidates(db, terms, p, limit) {
99
100
  try {
100
101
  const ftsQuery = terms.map((t) => `"${t.replace(/"/g, '""')}"`).join(' OR ');
101
- // memories_fts virtual table has no tenant_id column; filter via the
102
- // joined memories row (cheap with idx_memories_tenant_created leading
103
- // on tenant_id).
104
- // SAFETY: MEMORY_SEARCH_COLUMNS aliases every column to the same name
105
- // MEMORY_SELECT_COLUMNS uses (plus bm25_score), matching MemoryRow.
102
+ // memories_fts has no tenant_id column; filter via the joined memories row (cheap with idx_memories_tenant_created).
103
+ // SAFETY: MEMORY_SEARCH_COLUMNS aliases every column like MEMORY_SELECT_COLUMNS (plus bm25_score), matching MemoryRow.
106
104
  return db.prepare(`
107
105
  SELECT ${MEMORY_SEARCH_COLUMNS}
108
106
  FROM memories m
@@ -146,52 +144,23 @@ function selectLikeCandidates(db, terms, p, limit) {
146
144
  LIMIT ?
147
145
  `).all(...p.tenantParams, ...p.scopeParams, Math.max(limit, LIKE_WINDOW_ROWS), ...params, limit);
148
146
  }
149
- /**
150
- * Load likely search candidates directly from SQLite.
151
- * Uses FTS5 when available, falls back to LIKE matching, then full-store fallback.
152
- *
153
- * When `tenantId` is provided, every SELECT (FTS join, LIKE, fallback) filters
154
- * by tenant_id. Cross-tenant memories never surface. Omitted = no filter.
155
- */
147
+ /** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every SELECT filters by it; omitted = no filter. */
156
148
  export function loadSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId) {
157
- const db = openStore(hippoRoot);
158
- try {
149
+ return onHandle(hippoRoot, (db) => {
159
150
  return loadSearchRows(db, query, limit, tenantId).map(rowToEntry);
160
- }
161
- finally {
162
- closeHippoDb(db);
163
- }
151
+ }, openStore);
164
152
  }
165
- /**
166
- * Recall-mode loader. Pushes the recall-side scope predicate into SQL so
167
- * `unknown:legacy` cannot leak via any consumer that hasn't remembered to re-filter.
168
- *
169
- * - `requestedScope` undefined / '': default-deny on `unknown:legacy`, admitting `ownScope`, the caller's personal scope.
170
- * - `requestedScope` non-empty string: exact match on `m.scope = requestedScope`.
171
- *
172
- * Private scopes: SQL applies a conservative `NOT LIKE '%:private:%'` before the LIMIT window so private
173
- * rows cannot starve admitted ones; `passesScopeFilterForRecall` stays the exact JS post-filter.
174
- *
175
- * Consumers: `api.recall`, `cmdRecall`/`cmdExplain` direct CLI paths
176
- * and `searchBothHybrid` recall mode. Background pipelines
177
- * (`consolidate`, `embeddings`, `refine-llm`, ...) keep using
178
- * `loadSearchEntries` so they can see quarantined rows when needed.
179
- *
180
- * `tenantId` is optional because searchBothHybrid's is; undefined means no tenant filter.
181
- */
153
+ /** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies (admits `ownScope`); else exact match.
154
+ * SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot starve admitted ones; `passesScopeFilterForRecall` is the exact post-filter. */
182
155
  export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
183
- const db = openStore(hippoRoot);
184
- try {
156
+ return onHandle(hippoRoot, (db) => {
185
157
  return loadRecallSearchEntriesFromDb(db, query, { limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope });
186
- }
187
- finally {
188
- closeHippoDb(db);
189
- }
158
+ }, openStore);
190
159
  }
191
160
  // Split out so callers with an already-open db (the prompt-recall path) skip
192
161
  // the initStore+open/close cycle per store per call.
193
162
  export function loadRecallSearchEntriesFromDb(db, query, options = {}) {
194
- const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope } = options;
163
+ const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope, } = options;
195
164
  const scopeFilter = recallScopeFilter(requestedScope, explicitScopeMode, ownScope);
196
165
  return loadSearchRows(db, query, limit, tenantId, { scopeFilter, includeSuperseded, originProjects }).map(rowToEntry);
197
166
  }
@@ -1,3 +1,4 @@
1
+ import type { JsonObject } from './working-memory.js';
1
2
  import { type TaskSnapshot, type SessionEvent } from './rows.js';
2
3
  /** A shared-store caller's task state bucket: its owner and every name its project's rows carry. */
3
4
  export interface ContinuityKey {
@@ -26,36 +27,11 @@ type SnapshotInput = {
26
27
  };
27
28
  export declare function saveActiveTaskSnapshot(hippoRoot: string, tenantId: string, snapshot: SnapshotInput, key?: ContinuityKey): TaskSnapshot;
28
29
  export declare function loadActiveTaskSnapshot(hippoRoot: string, tenantId: string, key?: ContinuityKey): TaskSnapshot | null;
29
- /**
30
- * Default freshness bound for AMBIENT active-task-snapshot reads: 72h, chosen over 48h so
31
- * a Friday-evening orphan still offers continuity on Monday morning.
32
- * Exported so callers can override via `loadFreshActiveTaskSnapshot`'s
33
- * `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
34
- */
30
+ /** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
31
+ * override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
35
32
  export declare const SNAPSHOT_AMBIENT_MAX_AGE_MS: number;
36
- /**
37
- * Bounded read for AMBIENT active-task-snapshot surfaces (UserPromptSubmit
38
- * hook context, MCP recall block), so snapshots expire. A
39
- * snapshot written by `hippo pre-compact` has no death path tied to the
40
- * session that owns it, so an orphaned row would otherwise inject into
41
- * every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
42
- * (unchanged, still the source of truth for explicit continuity surfaces),
43
- * then applies, in order:
44
- *
45
- * 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
46
- * `session_id` are non-null, non-empty strings and strictly equal
47
- * (`===`). Owner reads are unbounded: the session that owns the snapshot
48
- * can always see its own working state, regardless of age.
49
- * 2. Age check — everything else, including absent-vs-absent ids. A
50
- * null/undefined/empty id on EITHER side never counts as an owner match;
51
- * it falls through here instead. (`runPreCompact` can legitimately save a
52
- * snapshot with `session_id = null`; a null-equals-null "match" would
53
- * reopen indefinite ambient injection for exactly those rows.) Returns
54
- * the snapshot only when `age(updated_at) <= maxAgeMs` (default
55
- * `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
56
- *
57
- * No SQL change — age derives from the existing `updated_at` column.
58
- */
33
+ /** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
34
+ * all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
59
35
  export declare function loadFreshActiveTaskSnapshot(hippoRoot: string, tenantId: string, opts?: {
60
36
  maxAgeMs?: number;
61
37
  sessionId?: string | null;
@@ -66,15 +42,8 @@ export declare function freshActiveSnapshot(snapshot: TaskSnapshot | null, opts?
66
42
  sessionId?: string | null;
67
43
  }): TaskSnapshot | null;
68
44
  export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: string, clearedStatus?: string): boolean;
69
- /**
70
- * Close the `active` task snapshot(s) owned by `sessionId`, for the
71
- * session-end death path.
72
- * Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
73
- * at save), but the WHERE clause scopes on `session_id` too — not just
74
- * `status='active' AND tenant_id=?` — so an ending session can never close a
75
- * different, newer session's active snapshot. Returns the number of rows
76
- * closed (0 when no active row is owned by `sessionId`).
77
- */
45
+ /** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
46
+ * newer session's snapshot. Returns the number of rows closed. */
78
47
  export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
79
48
  interface SessionEventInput {
80
49
  session_id: string;
@@ -83,7 +52,7 @@ interface SessionEventInput {
83
52
  task?: string | null;
84
53
  source?: string;
85
54
  scope?: string | null;
86
- metadata?: Record<string, unknown>;
55
+ metadata?: JsonObject;
87
56
  }
88
57
  export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
89
58
  export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
@@ -91,17 +60,11 @@ export declare function listSessionEvents(hippoRoot: string, tenantId: string, o
91
60
  task?: string;
92
61
  limit?: number;
93
62
  }): SessionEvent[];
94
- /**
95
- * Return session_ids with a `session_complete` event newer than `sinceMs`.
96
- * Used by the sleep auto-promotion pass to bound scanning to a fixed window.
97
- */
63
+ /** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
98
64
  export declare function findPromotableSessions(hippoRoot: string, tenantId: string, sinceMs: number): Array<{
99
65
  session_id: string;
100
66
  }>;
101
- /**
102
- * Idempotency guard — true if a trace-layer memory with this source_session_id
103
- * already exists.
104
- */
67
+ /** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
105
68
  export declare function traceExistsForSession(hippoRoot: string, tenantId: string, session_id: string): boolean;
106
69
  /** One caller's claim on a session id. */
107
70
  export interface SessionOwnerBinding {
@@ -1,3 +1,4 @@
1
+ import { HOUR_MS } from '../util/time.js';
1
2
  import { isSharedStore } from '../core/config.js';
2
3
  import { closeHippoDb, HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
3
4
  import { raiseMinBinary } from '../db/meta.js';
@@ -24,8 +25,9 @@ export function continuityStamp(key) {
24
25
  }
25
26
  // An unkeyed write acts on the tenant's newest or every active row, which on a shared store belong to other owners.
26
27
  function assertKeyedOnSharedStore(fn, hippoRoot, key) {
27
- if (!key && isSharedStore(hippoRoot))
28
+ if (!key && isSharedStore(hippoRoot)) {
28
29
  throw new Error(`${fn}: a shared store keeps one task snapshot per owner and project, so this write needs their continuity key`);
30
+ }
29
31
  }
30
32
  function insertSnapshot(db, tenantId, snapshot, now, stamp) {
31
33
  const result = db.prepare(`
@@ -73,8 +75,7 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
73
75
  export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
74
76
  assertTenantId('loadActiveTaskSnapshot', tenantId);
75
77
  const owned = key ? continuityWhere(key) : null;
76
- const db = openStore(hippoRoot);
77
- try {
78
+ return onHandle(hippoRoot, (db) => {
78
79
  // SAFETY: row's shape matches the ten columns named in the SELECT above.
79
80
  const row = db.prepare(`
80
81
  SELECT id, task, summary, next_step, status, source, session_id, scope, created_at, updated_at
@@ -92,47 +93,17 @@ export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
92
93
  if (!key)
93
94
  writeActiveTaskMirror(hippoRoot, tenantId, loaded);
94
95
  return loaded;
95
- }
96
- finally {
97
- closeHippoDb(db);
98
- }
96
+ }, openStore);
99
97
  }
100
- /**
101
- * Default freshness bound for AMBIENT active-task-snapshot reads: 72h, chosen over 48h so
102
- * a Friday-evening orphan still offers continuity on Monday morning.
103
- * Exported so callers can override via `loadFreshActiveTaskSnapshot`'s
104
- * `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
105
- */
106
- export const SNAPSHOT_AMBIENT_MAX_AGE_MS = 72 * 60 * 60 * 1000;
107
- /** A usable session id: non-null, non-empty string. Named predicate (not an
108
- * inline `typeof` check) so the owner-match rule in
109
- * `loadFreshActiveTaskSnapshot` states its contract once. */
98
+ /** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
99
+ * override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
100
+ export const SNAPSHOT_AMBIENT_MAX_AGE_MS = 72 * HOUR_MS;
101
+ /** A usable session id: non-null, non-empty string; named so the owner-match rule in `loadFreshActiveTaskSnapshot` states its contract once. */
110
102
  function isNonEmptySessionId(value) {
111
103
  return typeof value === 'string' && value.length > 0;
112
104
  }
113
- /**
114
- * Bounded read for AMBIENT active-task-snapshot surfaces (UserPromptSubmit
115
- * hook context, MCP recall block), so snapshots expire. A
116
- * snapshot written by `hippo pre-compact` has no death path tied to the
117
- * session that owns it, so an orphaned row would otherwise inject into
118
- * every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
119
- * (unchanged, still the source of truth for explicit continuity surfaces),
120
- * then applies, in order:
121
- *
122
- * 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
123
- * `session_id` are non-null, non-empty strings and strictly equal
124
- * (`===`). Owner reads are unbounded: the session that owns the snapshot
125
- * can always see its own working state, regardless of age.
126
- * 2. Age check — everything else, including absent-vs-absent ids. A
127
- * null/undefined/empty id on EITHER side never counts as an owner match;
128
- * it falls through here instead. (`runPreCompact` can legitimately save a
129
- * snapshot with `session_id = null`; a null-equals-null "match" would
130
- * reopen indefinite ambient injection for exactly those rows.) Returns
131
- * the snapshot only when `age(updated_at) <= maxAgeMs` (default
132
- * `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
133
- *
134
- * No SQL change — age derives from the existing `updated_at` column.
135
- */
105
+ /** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
106
+ * all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
136
107
  export function loadFreshActiveTaskSnapshot(hippoRoot, tenantId, opts = {}, key) {
137
108
  return freshActiveSnapshot(loadActiveTaskSnapshot(hippoRoot, tenantId, key), opts);
138
109
  }
@@ -170,15 +141,8 @@ export function clearActiveTaskSnapshot(hippoRoot, tenantId, clearedStatus = 'cl
170
141
  closeHippoDb(db);
171
142
  }
172
143
  }
173
- /**
174
- * Close the `active` task snapshot(s) owned by `sessionId`, for the
175
- * session-end death path.
176
- * Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
177
- * at save), but the WHERE clause scopes on `session_id` too — not just
178
- * `status='active' AND tenant_id=?` — so an ending session can never close a
179
- * different, newer session's active snapshot. Returns the number of rows
180
- * closed (0 when no active row is owned by `sessionId`).
181
- */
144
+ /** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
145
+ * newer session's snapshot. Returns the number of rows closed. */
182
146
  export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, status = 'session-ended', key) {
183
147
  assertTenantId('closeTaskSnapshotsForSession', tenantId);
184
148
  if (key)
@@ -242,8 +206,7 @@ export function appendSessionEvent(hippoRoot, tenantId, event) {
242
206
  }
243
207
  export function listSessionEvents(hippoRoot, tenantId, options = {}) {
244
208
  assertTenantId('listSessionEvents', tenantId);
245
- const db = openStore(hippoRoot);
246
- try {
209
+ return onHandle(hippoRoot, (db) => {
247
210
  const clauses = ['tenant_id = ?'];
248
211
  const params = [tenantId];
249
212
  if (options.session_id) {
@@ -267,19 +230,12 @@ export function listSessionEvents(hippoRoot, tenantId, options = {}) {
267
230
  LIMIT ?
268
231
  `).all(...params);
269
232
  return rows.map(rowToSessionEvent).reverse();
270
- }
271
- finally {
272
- closeHippoDb(db);
273
- }
233
+ }, openStore);
274
234
  }
275
- /**
276
- * Return session_ids with a `session_complete` event newer than `sinceMs`.
277
- * Used by the sleep auto-promotion pass to bound scanning to a fixed window.
278
- */
235
+ /** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
279
236
  export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
280
237
  assertTenantId('findPromotableSessions', tenantId);
281
- const db = openStore(hippoRoot);
282
- try {
238
+ return onHandle(hippoRoot, (db) => {
283
239
  // SAFETY: rows' shape matches the single `session_id` column selected
284
240
  // above.
285
241
  const rows = db.prepare(`
@@ -287,29 +243,19 @@ export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
287
243
  WHERE event_type = 'session_complete' AND created_at >= ? AND tenant_id = ?
288
244
  `).all(new Date(sinceMs).toISOString(), tenantId);
289
245
  return rows;
290
- }
291
- finally {
292
- closeHippoDb(db);
293
- }
246
+ }, openStore);
294
247
  }
295
- /**
296
- * Idempotency guard — true if a trace-layer memory with this source_session_id
297
- * already exists.
298
- */
248
+ /** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
299
249
  export function traceExistsForSession(hippoRoot, tenantId, session_id) {
300
250
  assertTenantId('traceExistsForSession', tenantId);
301
- const db = openStore(hippoRoot);
302
- try {
251
+ return onHandle(hippoRoot, (db) => {
303
252
  const row = db.prepare(`
304
253
  SELECT 1 FROM memories
305
254
  WHERE source_session_id = ? AND layer = 'trace' AND tenant_id = ?
306
255
  LIMIT 1
307
256
  `).get(session_id, tenantId);
308
257
  return !!row;
309
- }
310
- finally {
311
- closeHippoDb(db);
312
- }
258
+ }, openStore);
313
259
  }
314
260
  /** The owner a session id is bound to, or null. */
315
261
  function selectSessionOwnerAt(db, tenantId, sessionId) {
@@ -0,0 +1,14 @@
1
+ import type { DatabaseSyncLike } from '../db/index.js';
2
+ import { type MemoryEntry } from '../core/memory.js';
3
+ export declare const SYNC_ACTOR = "agent-memories";
4
+ export type SetAsideWhy = 'note-gone' | 'note-changed' | 'handover' | 'project-merge' | 'project-repair';
5
+ export type SetAsideResult = {
6
+ readonly kind: 'untagged';
7
+ readonly entry: MemoryEntry;
8
+ } | {
9
+ readonly kind: 'dormant';
10
+ readonly id: string;
11
+ };
12
+ /** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
13
+ export declare function setAsideRow(db: DatabaseSyncLike, tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
14
+ //# sourceMappingURL=set-aside.d.ts.map
@@ -0,0 +1,23 @@
1
+ // Takes an imported agent note out of recall on the caller's transaction; the note sync and the project repair both use it.
2
+ import { appendAuditEvent } from './audit.js';
3
+ import { insertDormantRow } from './dormant.js';
4
+ import { calculateStrength } from '../core/memory.js';
5
+ import { deleteEntryRowInTx, setEntryTagsInTx } from './entry-writes.js';
6
+ export const SYNC_ACTOR = 'agent-memories';
7
+ /** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
8
+ export function setAsideRow(db, tag, row, why) {
9
+ const untagged = { ...row, tags: row.tags.filter((t) => t !== tag) };
10
+ const audit = (metadata) => appendAuditEvent(db, { tenantId: row.tenantId, actor: SYNC_ACTOR, op: 'agent_memory_set_aside', targetId: row.id, metadata });
11
+ if (row.pinned) {
12
+ setEntryTagsInTx(db, untagged);
13
+ audit({ why, untagged: true });
14
+ return { kind: 'untagged', entry: untagged };
15
+ }
16
+ const now = new Date();
17
+ // Sleep's dormant move skips kept rows, so the steps are written out here without its filter.
18
+ insertDormantRow(db, { entry: untagged, strength: calculateStrength(row, now), reason: 'source-deleted', dormantAt: now.toISOString() });
19
+ deleteEntryRowInTx(db, row, SYNC_ACTOR);
20
+ audit({ why });
21
+ return { kind: 'dormant', id: row.id };
22
+ }
23
+ //# sourceMappingURL=set-aside.js.map
@@ -0,0 +1,3 @@
1
+ /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
2
+ export declare function isStoreBusy<E>(error: E): boolean;
3
+ //# sourceMappingURL=busy.d.ts.map
@@ -0,0 +1,8 @@
1
+ // Busy detection lives with the adapter, so the port names no SQLite error code.
2
+ import { isSqliteBusy } from '../../db/busy.js';
3
+ import { StoreBusyError } from '../port.js';
4
+ /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
5
+ export function isStoreBusy(error) {
6
+ return error instanceof StoreBusyError || isSqliteBusy(error);
7
+ }
8
+ //# sourceMappingURL=busy.js.map
@@ -1,22 +1,19 @@
1
1
  // hippo.db's half of the ConnectorEvents store group: each call on a handle of its own.
2
- import { archiveDeletedArtifact, eventSeenAt, githubRouting, insertDlq, logEvent, seenEvent } from '../connectors/github.js';
2
+ import { archiveDeletedArtifact, githubEventRecord, githubEventSeenAt, githubRouting, insertGitHubDlq, markGitHubEventSeen } from '../connectors/github.js';
3
3
  import { insertSlackDlq, markSlackEventSeen, rawMemoryIdForArtifactAt, slackEventRecord, slackEventSeenAt, slackTeamRoute } from '../connectors/slack.js';
4
4
  import { onHandle } from '../open.js';
5
5
  function eventRecord(hippoRoot, event) {
6
- if (event.connector === 'slack')
7
- return slackEventRecord(hippoRoot, event.eventId);
8
- const logged = seenEvent(hippoRoot, event.idempotencyKey);
9
- return logged ? { seen: true, memoryId: logged.memoryId } : { seen: false };
6
+ return event.connector === 'slack' ? slackEventRecord(hippoRoot, event.eventId) : githubEventRecord(hippoRoot, event.idempotencyKey);
10
7
  }
11
8
  function markEventSeen(hippoRoot, event) {
12
9
  if (event.connector === 'slack')
13
10
  return markSlackEventSeen(hippoRoot, event.eventId, null);
14
11
  const { idempotencyKey, deliveryId, eventName } = event;
15
- logEvent(hippoRoot, { idempotencyKey, deliveryId, eventName, memoryId: null });
12
+ markGitHubEventSeen(hippoRoot, { idempotencyKey, deliveryId, eventName, memoryId: null });
16
13
  }
17
14
  function deletionTarget(hippoRoot, { event, artifactRef, tenantId }) {
18
15
  return onHandle(hippoRoot, (db) => {
19
- const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) : eventSeenAt(db, event.idempotencyKey);
16
+ const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) : githubEventSeenAt(db, event.idempotencyKey);
20
17
  return seen ? { seen: true } : { seen: false, memoryId: rawMemoryIdForArtifactAt(db, artifactRef, tenantId) };
21
18
  });
22
19
  }
@@ -32,7 +29,7 @@ export function sqliteConnectorEvents(hippoRoot) {
32
29
  archiveDeletedArtifact: (archive) => archiveArtifact(hippoRoot, archive),
33
30
  slackTeamRoute: (teamId) => slackTeamRoute(hippoRoot, teamId),
34
31
  githubRouting: (query) => githubRouting(hippoRoot, query),
35
- parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertDlq(hippoRoot, letter)),
32
+ parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertGitHubDlq(hippoRoot, letter)),
36
33
  };
37
34
  }
38
35
  /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
@@ -1,4 +1,4 @@
1
- import { eventMemoryAt, logEventAt } from '../connectors/github.js';
1
+ import { githubEventMemoryAt, markGitHubEventSeenAt } from '../connectors/github.js';
2
2
  import { markSlackEventSeenAt, slackEventMemoryAt } from '../connectors/slack.js';
3
3
  import { stampOriginProject } from '../entry-row.js';
4
4
  import { writeEntryMirrors } from '../entry-writes.js';
@@ -13,10 +13,10 @@ function logEvent(db, event, memoryId) {
13
13
  if (event.connector === 'slack')
14
14
  return markSlackEventSeenAt(db, event.eventId, memoryId);
15
15
  const { idempotencyKey, deliveryId, eventName } = event;
16
- return logEventAt(db, { idempotencyKey, deliveryId, eventName, memoryId });
16
+ return markGitHubEventSeenAt(db, { idempotencyKey, deliveryId, eventName, memoryId });
17
17
  }
18
18
  function loggedMemory(db, event) {
19
- return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) : eventMemoryAt(db, event.idempotencyKey);
19
+ return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) : githubEventMemoryAt(db, event.idempotencyKey);
20
20
  }
21
21
  /** The record, then the log row, go in after the memory row and ahead of its remember row, as a second store must order them. */
22
22
  function writeWithCompanions(db, { entry, actor, event, quarantine }) {
@@ -2,12 +2,12 @@
2
2
  import { ConflictError, NotFoundError } from '../../core/api-errors.js';
3
3
  import { appendAuditEvent } from '../audit.js';
4
4
  import { isSqliteBusy, withWriteScope } from '../../db/index.js';
5
- import { errorMessage, log } from '../../util/log.js';
5
+ import { errorFields, errorMessage, log } from '../../util/log.js';
6
6
  import { entryAfterOutcome } from '../../core/memory.js';
7
7
  import { archiveRawMemory } from '../raw-archive.js';
8
- import { ownScopeTouches } from '../recall-scope.js';
8
+ import { ownScopeTouches } from '../../core/recall-scope.js';
9
9
  import { recordTraceOutcome } from '../recall-trace.js';
10
- import { RejectedValueError } from '../rejection.js';
10
+ import { RejectedValueError } from '../../core/api-errors.js';
11
11
  import { markSummaryDirtyInTx } from '../summary-dirty.js';
12
12
  import { auditRejectionRefusal } from '../audit-event.js';
13
13
  import { deleteEntryCore } from '../delete-and-batch.js';
@@ -155,7 +155,7 @@ function cleanArchivedMirrors(db, hippoRoot, id) {
155
155
  removeEntryMirrors(hippoRoot, id);
156
156
  }
157
157
  catch (mirrorErr) {
158
- log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`);
158
+ log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`, errorFields(mirrorErr));
159
159
  return;
160
160
  }
161
161
  try {
@@ -1,16 +1,19 @@
1
- // A thrown error crosses the worker boundary as plain data and arrives as an instance of its class: the server's mappers test `instanceof`, `errcode` and fields.
1
+ // A thrown error crosses the worker boundary as plain data and arrives as an instance
2
+ // of its class: the server's mappers test `instanceof`, `errcode` and fields.
2
3
  import { BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../../core/api-errors.js';
3
- import { IncompatibleBinaryError, StoreBusyError } from '../../db/index.js';
4
+ import { RawAppendOnlyError } from '../../core/raw-append-only.js';
5
+ import { IncompatibleBinaryError } from '../../db/index.js';
6
+ import { StoreBusyError } from '../port.js';
4
7
  import { BodyTimeoutError, BodyTooLargeError, HttpError } from '../../util/http-util.js';
5
8
  import { errorMessage, log } from '../../util/log.js';
6
- import { ScopeForbiddenError } from '../recall-scope.js';
7
- import { RejectedValueError } from '../rejection.js';
9
+ import { ScopeForbiddenError } from '../../core/recall-scope.js';
10
+ import { RejectedValueError } from '../../core/api-errors.js';
8
11
  import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '../../util/sqlite-blocked.js';
9
12
  // Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses are thrown.
10
13
  const CLASSES = [
11
14
  Error, TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError,
12
15
  HttpError, BodyTooLargeError, BodyTimeoutError,
13
- BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError,
16
+ BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError, RawAppendOnlyError,
14
17
  SqliteBlockedError, StoreNotPortedError, OtherStoreFolderError,
15
18
  StoreBusyError, IncompatibleBinaryError,
16
19
  ];
@@ -23,6 +23,7 @@ export interface SqliteExecutor {
23
23
  /** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh thread. */
24
24
  terminateWriter(): void;
25
25
  }
26
- /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
26
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
27
+ * call starts the writer for the store's setup; a reader starts at its own first call. */
27
28
  export declare function createSqliteExecutor(hippoRoot: string, opts?: ExecutorOptions): SqliteExecutor;
28
29
  //# sourceMappingURL=executor.d.ts.map
@@ -2,11 +2,12 @@
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { SHARE_ENV, Worker } from 'node:worker_threads';
4
4
  import { addAuditWriteFailures } from '../audit.js';
5
- import { getHippoDbPath, SERVER_DB_WAIT_MS, StoreBusyError } from '../../db/index.js';
5
+ import { getHippoDbPath, SERVER_DB_WAIT_MS } from '../../db/index.js';
6
+ import { StoreBusyError } from '../port.js';
6
7
  import { autoCheckpointPages } from '../../db/wal-checkpointer.js';
7
8
  import { envStoreQueueMax } from '../../util/env.js';
8
9
  import { DeadlineExceededError } from '../../util/http-util.js';
9
- import { errorMessage, log } from '../../util/log.js';
10
+ import { errorFields, errorMessage, log } from '../../util/log.js';
10
11
  import { requestScopes } from '../../util/request-scope.js';
11
12
  import { decodeError } from './error-codec.js';
12
13
  import { workerCounts } from './executor-counts.js';
@@ -27,6 +28,10 @@ const DEFAULT_WRITE_GRACE_MS = 2000;
27
28
  function laneOf(mode) {
28
29
  return { mode, queue: [], running: undefined, worker: undefined, stopping: undefined, commitFlag: undefined };
29
30
  }
31
+ // A thread that will not stop leaves a live worker behind, so the rejection is logged rather than dropped.
32
+ function terminateLogged(worker) {
33
+ worker.terminate().catch((err) => log.warn('the store worker did not terminate cleanly', errorFields(err)));
34
+ }
30
35
  /** Gives `pending`'s caller its one answer; a second call does nothing. */
31
36
  function finish(pending, answer) {
32
37
  if (pending.answered)
@@ -153,7 +158,7 @@ class WorkerPool {
153
158
  #stopReader(lane, worker, pending) {
154
159
  finish(pending, () => pending.fail(new DeadlineExceededError(READ_LATE)));
155
160
  lane.stopping = worker;
156
- void worker.terminate();
161
+ terminateLogged(worker);
157
162
  }
158
163
  // Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping it could not undo the write.
159
164
  #stopWriter(lane, worker, pending) {
@@ -195,7 +200,8 @@ class WorkerPool {
195
200
  return this.#exits.size;
196
201
  }
197
202
  terminateWriter() {
198
- void this.#writer.worker?.terminate();
203
+ if (this.#writer.worker)
204
+ terminateLogged(this.#writer.worker);
199
205
  }
200
206
  #pump(lane) {
201
207
  if (lane.running !== undefined)
@@ -279,7 +285,8 @@ class WorkerPool {
279
285
  finish(pending, () => pending.fail(new StoreBusyError(WORKER_GONE, { cause })));
280
286
  }
281
287
  }
282
- /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
288
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
289
+ * call starts the writer for the store's setup; a reader starts at its own first call. */
283
290
  export function createSqliteExecutor(hippoRoot, opts = {}) {
284
291
  return new WorkerPool(hippoRoot, opts);
285
292
  }
@@ -1,5 +1,5 @@
1
1
  // hippo.db's half of the GraphReads store group: one read snapshot around the walk the CLI graph commands run.
2
- import { canReadScope } from '../recall-scope.js';
2
+ import { canReadScope } from '../../core/recall-scope.js';
3
3
  import { withGraphReadSnapshot } from '../graph-reads.js';
4
4
  import { graphViewRows } from '../graph-view-rows.js';
5
5
  export function sqliteGraphReads(hippoRoot) {