hippo-memory 1.69.0 → 1.71.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 (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
package/dist/db/busy.js CHANGED
@@ -1,5 +1,8 @@
1
- export function isSqliteBusy(error) {
2
- const code = error?.errcode;
1
+ function carriesErrcode(cause) {
2
+ return typeof cause === 'object' && cause !== null && 'errcode' in cause;
3
+ }
4
+ export function isSqliteBusy(cause) {
5
+ const code = carriesErrcode(cause) ? cause.errcode : undefined;
3
6
  return code === 5 || code === 6 || code === 517;
4
7
  }
5
8
  export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
@@ -14,9 +17,8 @@ export class StoreBusyError extends Error {
14
17
  export function isStoreBusy(error) {
15
18
  return error instanceof StoreBusyError || isSqliteBusy(error);
16
19
  }
17
- // busy_timeout covers neither of this file's two contended statements: SQLite
18
- // skips the busy handler for `PRAGMA journal_mode` and for a write that upgrades
19
- // a deferred read snapshot. Both need an explicit wait instead.
20
+ // busy_timeout covers neither contended statement here: SQLite skips the busy handler for `PRAGMA journal_mode` and for a write
21
+ // that upgrades a deferred read snapshot, so both need an explicit wait.
20
22
  export function execWithBusyRetry(db, sql, timeoutMs = 30000) {
21
23
  const deadline = Date.now() + timeoutMs;
22
24
  const idle = new Int32Array(new SharedArrayBuffer(4));
@@ -32,11 +34,23 @@ export function execWithBusyRetry(db, sql, timeoutMs = 30000) {
32
34
  }
33
35
  }
34
36
  }
37
+ function undoScope(db, top, name) {
38
+ if (top) {
39
+ db.exec('ROLLBACK');
40
+ }
41
+ else {
42
+ db.exec(`ROLLBACK TO SAVEPOINT ${name}`);
43
+ db.exec(`RELEASE SAVEPOINT ${name}`);
44
+ }
45
+ }
35
46
  /** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
36
47
  * A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
37
- export function withWriteScope(db, name, fn) {
48
+ export function withWriteScope(db, name, fn, opts) {
38
49
  const top = db.isTransaction === false;
39
- db.exec(top ? 'BEGIN IMMEDIATE' : `SAVEPOINT ${name}`);
50
+ if (top && opts)
51
+ execWithBusyRetry(db, 'BEGIN IMMEDIATE', opts.busyWaitMs);
52
+ else
53
+ db.exec(top ? 'BEGIN IMMEDIATE' : `SAVEPOINT ${name}`);
40
54
  try {
41
55
  const result = fn();
42
56
  db.exec(top ? 'COMMIT' : `RELEASE SAVEPOINT ${name}`);
@@ -44,13 +58,73 @@ export function withWriteScope(db, name, fn) {
44
58
  }
45
59
  catch (error) {
46
60
  try {
47
- if (top) {
48
- db.exec('ROLLBACK');
49
- }
50
- else {
51
- db.exec(`ROLLBACK TO SAVEPOINT ${name}`);
52
- db.exec(`RELEASE SAVEPOINT ${name}`);
53
- }
61
+ undoScope(db, top, name);
62
+ }
63
+ catch { /* already rolled back; keep the original error */ }
64
+ throw error;
65
+ }
66
+ }
67
+ /** Runs the reads in `fn` against one snapshot, so two statements cannot straddle another process's write. */
68
+ export function withReadSnapshot(db, fn) {
69
+ if (db.isTransaction !== false)
70
+ return fn();
71
+ db.exec('BEGIN');
72
+ let result;
73
+ try {
74
+ result = fn();
75
+ }
76
+ catch (error) {
77
+ try {
78
+ db.exec('COMMIT');
79
+ }
80
+ catch { /* snapshot already gone; keep the original error */ }
81
+ throw error;
82
+ }
83
+ db.exec('COMMIT');
84
+ return result;
85
+ }
86
+ /** Runs `fn` and undoes every write it made, throw or not: a dry run that reports what a real run would do. Takes no write lock up front. */
87
+ export function withTrialScope(db, name, fn) {
88
+ const top = db.isTransaction === false;
89
+ db.exec(top ? 'BEGIN' : `SAVEPOINT ${name}`);
90
+ let result;
91
+ try {
92
+ result = fn();
93
+ }
94
+ catch (error) {
95
+ try {
96
+ undoScope(db, top, name);
97
+ }
98
+ catch { /* already rolled back; keep the original error */ }
99
+ throw error;
100
+ }
101
+ undoScope(db, top, name);
102
+ return result;
103
+ }
104
+ /** What `withWriteScopeOr` hands its callback's `rollback(value)`; a class so no stored value can pass for one. */
105
+ class RolledBack {
106
+ value;
107
+ constructor(value) {
108
+ this.value = value;
109
+ }
110
+ }
111
+ /** `withWriteScope` for a write that can refuse: a callback that returns `rollback(value)` gets the scope's writes undone
112
+ * and `value` back, with no throw. Any other return commits. */
113
+ export function withWriteScopeOr(db, name, fn) {
114
+ const top = db.isTransaction === false;
115
+ db.exec(top ? 'BEGIN IMMEDIATE' : `SAVEPOINT ${name}`);
116
+ try {
117
+ const result = fn((value) => new RolledBack(value));
118
+ if (result instanceof RolledBack) {
119
+ undoScope(db, top, name);
120
+ return result.value;
121
+ }
122
+ db.exec(top ? 'COMMIT' : `RELEASE SAVEPOINT ${name}`);
123
+ return result;
124
+ }
125
+ catch (error) {
126
+ try {
127
+ undoScope(db, top, name);
54
128
  }
55
129
  catch { /* already rolled back; keep the original error */ }
56
130
  throw error;
@@ -1,5 +1,14 @@
1
1
  import { type DatabaseSyncLike } from './sqlite.js';
2
+ import { type OpenFacts } from './migrate.js';
3
+ export declare const DEFAULT_BUSY_WAIT_MS = 5000;
2
4
  export declare function getHippoDbPath(hippoRoot: string): string;
3
- /** A new connection with the store's pragmas, migrations and mirror cleanup applied; the caller owns and closes it. */
4
- export declare function connectHippoDb(hippoRoot: string, busyWaitMs?: number): DatabaseSyncLike;
5
+ /** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
6
+ export declare function oncePerStore(hippoRoot: string, name: string, step: () => void): void;
7
+ /** A connection with what its own open's probe read; facts go stale with the next statement, so a handle made by an earlier call carries null. */
8
+ export interface OpenedDb {
9
+ readonly db: DatabaseSyncLike;
10
+ readonly facts: OpenFacts | null;
11
+ }
12
+ /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
13
+ export declare function connectWithFacts(hippoRoot: string, busyWaitMs?: number): OpenedDb;
5
14
  //# sourceMappingURL=connect.d.ts.map
@@ -1,43 +1,76 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { cleanupArchivedMirrors } from '../raw-archive-mirror-cleanup.js';
4
- import { log } from '../log.js';
3
+ import { cleanupArchivedMirrors } from './raw-archive-mirror-cleanup.js';
4
+ import { errorFields, errorMessage, log } from '../util/log.js';
5
5
  import { DatabaseSync } from './sqlite.js';
6
6
  import { execWithBusyRetry } from './busy.js';
7
7
  import { runMigrations } from './migrate.js';
8
+ import { autoCheckpointPages } from './wal-checkpointer.js';
9
+ export const DEFAULT_BUSY_WAIT_MS = 5000;
8
10
  export function getHippoDbPath(hippoRoot) {
9
11
  return path.join(hippoRoot, 'hippo.db');
10
12
  }
13
+ // Per store file, what this process has already done to it; a store file created anew starts over.
14
+ const settledSteps = new Map();
15
+ const sweptThrough = new Map();
16
+ function storeKey(hippoRoot) {
17
+ return path.resolve(getHippoDbPath(hippoRoot));
18
+ }
19
+ /** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
20
+ export function oncePerStore(hippoRoot, name, step) {
21
+ const key = storeKey(hippoRoot);
22
+ const settled = settledSteps.get(key) ?? new Set();
23
+ if (settled.has(name))
24
+ return;
25
+ step();
26
+ settledSteps.set(key, settled.add(name));
27
+ }
11
28
  // Owner-only on create; SQLite gives the WAL and SHM files the db's mode. Existing paths keep theirs.
12
29
  function createStoreFilesOwnerOnly(hippoRoot) {
13
30
  fs.mkdirSync(hippoRoot, { recursive: true, mode: 0o700 });
14
31
  try {
15
32
  fs.closeSync(fs.openSync(getHippoDbPath(hippoRoot), 'wx', 0o600));
33
+ settledSteps.delete(storeKey(hippoRoot));
34
+ sweptThrough.delete(storeKey(hippoRoot));
16
35
  }
17
36
  catch (err) {
18
37
  if (!(err instanceof Error && 'code' in err && err.code === 'EEXIST'))
19
38
  throw err;
20
39
  }
21
40
  }
22
- /** A new connection with the store's pragmas, migrations and mirror cleanup applied; the caller owns and closes it. */
23
- export function connectHippoDb(hippoRoot, busyWaitMs) {
41
+ // The archive only grows and its ids never repeat, so an unchanged top id means no row this process has not swept; a failed sweep stays due.
42
+ function sweepArchivedMirrorsIfDue(hippoRoot, db, probedTop) {
43
+ const top = probedTop ?? archiveTop(db);
44
+ const key = storeKey(hippoRoot);
45
+ if (sweptThrough.get(key) === top)
46
+ return;
47
+ if (cleanupArchivedMirrors(hippoRoot, db))
48
+ sweptThrough.set(key, top);
49
+ }
50
+ function archiveTop(db) {
51
+ // SAFETY: MAX over the integer key returns one row with one column, null for an empty table.
52
+ const row = db.prepare('SELECT MAX(id) AS top FROM raw_archive').get();
53
+ return Number(row?.top ?? 0);
54
+ }
55
+ /** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
56
+ export function connectWithFacts(hippoRoot, busyWaitMs) {
24
57
  createStoreFilesOwnerOnly(hippoRoot);
25
58
  const db = new DatabaseSync(getHippoDbPath(hippoRoot));
26
59
  try {
27
- db.exec(`PRAGMA busy_timeout = ${busyWaitMs ?? 5000}`);
60
+ db.exec(`PRAGMA busy_timeout = ${busyWaitMs ?? DEFAULT_BUSY_WAIT_MS}`);
28
61
  execWithBusyRetry(db, 'PRAGMA journal_mode = WAL', busyWaitMs);
29
62
  db.exec('PRAGMA synchronous = NORMAL');
30
- db.exec('PRAGMA wal_autocheckpoint = 100');
63
+ db.exec(`PRAGMA wal_autocheckpoint = ${autoCheckpointPages(getHippoDbPath(hippoRoot))}`);
31
64
  db.exec('PRAGMA foreign_keys = ON');
32
- runMigrations(db, hippoRoot, busyWaitMs);
65
+ const facts = runMigrations(db, hippoRoot, busyWaitMs);
33
66
  // Orphan mirrors of archived raw rows go here; a filesystem failure must not block the open.
34
67
  try {
35
- cleanupArchivedMirrors(hippoRoot, db);
68
+ sweepArchivedMirrorsIfDue(hippoRoot, db, facts?.archiveTop);
36
69
  }
37
70
  catch (cleanupErr) {
38
- log.error(`openHippoDb: cleanupArchivedMirrors failed (non-fatal): ${cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr)}`);
71
+ log.error(`openHippoDb: cleanupArchivedMirrors failed (non-fatal): ${errorMessage(cleanupErr)}`, errorFields(cleanupErr));
39
72
  }
40
- return db;
73
+ return { db, facts };
41
74
  }
42
75
  catch (error) {
43
76
  try {
@@ -0,0 +1,9 @@
1
+ export type { DatabaseSyncLike } from './sqlite.js';
2
+ export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
3
+ export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
4
+ export { countTableRows, pruneConsolidationRuns } from './tables.js';
5
+ export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
6
+ export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
7
+ export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
8
+ export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
2
+ export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
3
+ export { countTableRows, pruneConsolidationRuns } from './tables.js';
4
+ export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
5
+ export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
6
+ export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
7
+ export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
8
+ //# sourceMappingURL=index.js.map
package/dist/db/meta.d.ts CHANGED
@@ -2,6 +2,10 @@ import type { DatabaseSyncLike } from './sqlite.js';
2
2
  export declare const META_TABLE_DDL = "\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n ";
3
3
  export declare function ensureMetaTable(db: DatabaseSyncLike): void;
4
4
  export declare function getSchemaVersion(db: DatabaseSyncLike): number;
5
+ /** SQLite's own `user_version` stamp, which can differ from the `meta` schema_version row. */
6
+ export declare function pragmaUserVersion(db: DatabaseSyncLike): number;
7
+ /** The connection's commit counter: it moves when another connection commits. */
8
+ export declare function pragmaDataVersion(db: DatabaseSyncLike): number;
5
9
  export declare function setSchemaVersion(db: DatabaseSyncLike, version: number): void;
6
10
  export declare function getMeta(db: DatabaseSyncLike, key: string, fallback?: string): string;
7
11
  export declare function setMeta(db: DatabaseSyncLike, key: string, value: string): void;
package/dist/db/meta.js CHANGED
@@ -1,4 +1,4 @@
1
- import { compareSemver } from '../version.js';
1
+ import { compareSemver } from '../util/version.js';
2
2
  import { tableExists } from './tables.js';
3
3
  export const META_TABLE_DDL = `
4
4
  CREATE TABLE IF NOT EXISTS meta (
@@ -18,6 +18,16 @@ export function getSchemaVersion(db) {
18
18
  const version = Number(row?.value ?? 0);
19
19
  return Number.isFinite(version) ? version : 0;
20
20
  }
21
+ /** SQLite's own `user_version` stamp, which can differ from the `meta` schema_version row. */
22
+ export function pragmaUserVersion(db) {
23
+ // SAFETY: PRAGMA user_version returns one row with one integer column.
24
+ return db.prepare('PRAGMA user_version').get().user_version;
25
+ }
26
+ /** The connection's commit counter: it moves when another connection commits. */
27
+ export function pragmaDataVersion(db) {
28
+ // SAFETY: PRAGMA data_version returns one row with that single integer column.
29
+ return db.prepare('PRAGMA data_version').get().data_version;
30
+ }
21
31
  export function setSchemaVersion(db, version) {
22
32
  db.prepare(`INSERT INTO meta(key, value) VALUES('schema_version', ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value`).run(String(version));
23
33
  db.exec(`PRAGMA user_version = ${Math.max(0, Math.trunc(version))}`);
@@ -7,7 +7,14 @@ export declare class IncompatibleBinaryError extends Error {
7
7
  export declare function assertBinaryCompatible(db: DatabaseSyncLike): void;
8
8
  /** The fast path's single probe: versions, the binary minimum, the FTS flag, and counts of the meta defaults and required objects. */
9
9
  export declare const SCHEMA_PROBE_SQL: string;
10
- export declare function runMigrations(db: DatabaseSyncLike, hippoRoot?: string, busyWaitMs?: number): void;
10
+ /** What the probe of a current store read beyond the schema proof, so the same open need not read them again. */
11
+ export interface OpenFacts {
12
+ /** The largest raw_archive id, 0 for an empty archive. */
13
+ readonly archiveTop: number;
14
+ readonly hasMemories: boolean;
15
+ }
16
+ /** Brings the store to the current schema; returns the probe's facts when it was current already, null after any repair. */
17
+ export declare function runMigrations(db: DatabaseSyncLike, hippoRoot?: string, busyWaitMs?: number): OpenFacts | null;
11
18
  /** Row counts of `memories` and its full-text index, which differ once the index drifts; null when either table is missing. */
12
19
  export declare function ftsRowCounts(db: DatabaseSyncLike): {
13
20
  memories: number;
@@ -1,7 +1,7 @@
1
- import { PACKAGE_VERSION, compareSemver } from '../version.js';
2
- import { log } from '../log.js';
3
- import { importLegacyEmbeddingIndex } from '../vector-store.js';
4
- import { execWithBusyRetry } from './busy.js';
1
+ import { PACKAGE_VERSION, compareSemver } from '../util/version.js';
2
+ import { errorMessage, log } from '../util/log.js';
3
+ import { importLegacyEmbeddingIndex } from './vector-store.js';
4
+ import { execWithBusyRetry, withWriteScope } from './busy.js';
5
5
  import { tableExists } from './tables.js';
6
6
  import { ensureMetaTable, getMeta, getSchemaVersion, setMeta, setSchemaVersion } from './meta.js';
7
7
  import { MEMORIES_FTS_DDL, REQUIRED_SCHEMA_OBJECTS, ensureContinuityIndexes, ensureContinuityTables } from './continuity.js';
@@ -40,34 +40,40 @@ export const SCHEMA_PROBE_SQL = `SELECT
40
40
  (SELECT value FROM meta WHERE key = 'min_compatible_binary') AS min_binary,
41
41
  (SELECT value FROM meta WHERE key = 'fts5_available') AS fts5,
42
42
  (SELECT COUNT(*) FROM meta WHERE key IN (${sqlList(META_DEFAULTS.map(([key]) => key))})) AS meta_keys,
43
- (SELECT COUNT(*) FROM sqlite_master WHERE type IN ('table', 'index') AND name IN (${sqlList(REQUIRED_SCHEMA_OBJECTS)})) AS objects`;
44
- /** True when the store is current and whole, so the open can skip every DDL statement. Runs the binary check either way. */
45
- function schemaIsCurrent(db) {
43
+ (SELECT COUNT(*) FROM sqlite_master WHERE type IN ('table', 'index') AND name IN (${sqlList(REQUIRED_SCHEMA_OBJECTS)})) AS objects,
44
+ (SELECT MAX(id) FROM raw_archive) AS archive_top,
45
+ (SELECT 1 FROM memories LIMIT 1) AS has_memories`;
46
+ /** The probe's facts when the store is current and whole, so the open can skip every DDL statement; else null. Runs the binary check either way. */
47
+ function currentStoreFacts(db) {
46
48
  let probe;
47
49
  try {
48
- // SAFETY: the SELECT names exactly these six columns and always returns one row.
50
+ // SAFETY: the SELECT names exactly these eight columns and always returns one row.
49
51
  probe = db.prepare(SCHEMA_PROBE_SQL).get();
50
52
  }
51
53
  catch (err) {
52
- // A store with no meta table yet is the slow path's job; anything else is a real error.
53
- if (err instanceof Error && /no such table: meta/.test(err.message))
54
- return false;
54
+ // A store missing a table the probe reads is the slow path's job; anything else is a real error.
55
+ if (err instanceof Error && /no such table: (meta|raw_archive|memories)\b/.test(err.message))
56
+ return null;
55
57
  throw err;
56
58
  }
57
59
  if (!probe)
58
- return false;
60
+ return null;
59
61
  assertMinBinary(probe.min_binary);
60
- return Number(probe.user_version) === CURRENT_SCHEMA_VERSION
62
+ const current = Number(probe.user_version) === CURRENT_SCHEMA_VERSION
61
63
  && Number(probe.schema_version) === CURRENT_SCHEMA_VERSION
62
64
  && Number(probe.meta_keys) === META_DEFAULTS.length
63
65
  && Number(probe.objects) === REQUIRED_SCHEMA_OBJECTS.length
64
66
  && probe.fts5 === '1';
67
+ return current ? { archiveTop: Number(probe.archive_top ?? 0), hasMemories: probe.has_memories !== null } : null;
65
68
  }
69
+ /** Brings the store to the current schema; returns the probe's facts when it was current already, null after any repair. */
66
70
  export function runMigrations(db, hippoRoot, busyWaitMs) {
67
- if (!schemaIsCurrent(db))
71
+ const facts = currentStoreFacts(db);
72
+ if (!facts)
68
73
  migrateAndHeal(db, hippoRoot, busyWaitMs);
69
74
  if (hippoRoot)
70
75
  importLegacyVectors(db, hippoRoot);
76
+ return facts;
71
77
  }
72
78
  function migrateAndHeal(db, hippoRoot, busyWaitMs) {
73
79
  ensureMetaTable(db);
@@ -88,29 +94,18 @@ function migrateAndHeal(db, hippoRoot, busyWaitMs) {
88
94
  }
89
95
  /** Applies one migration under the write lock and returns the version the store is now at. */
90
96
  function applyMigration(db, migration, hippoRoot, busyWaitMs) {
91
- execWithBusyRetry(db, 'BEGIN IMMEDIATE', busyWaitMs);
92
- try {
97
+ return withWriteScope(db, 'apply_migration', () => {
93
98
  // A newer binary may have migrated and raised the minimum while we waited for the lock.
94
99
  assertBinaryCompatible(db);
95
100
  // Re-read under the write lock: another process may have applied this
96
101
  // migration while we waited, and re-running one is not idempotent.
97
102
  const applied = getSchemaVersion(db);
98
- if (applied >= migration.version) {
99
- db.exec('COMMIT');
103
+ if (applied >= migration.version)
100
104
  return applied;
101
- }
102
105
  migration.up(db, { hippoRoot });
103
106
  setSchemaVersion(db, migration.version);
104
- db.exec('COMMIT');
105
107
  return migration.version;
106
- }
107
- catch (error) {
108
- try {
109
- db.exec('ROLLBACK');
110
- }
111
- catch { /* already rolled back; keep the original error */ }
112
- throw error;
113
- }
108
+ }, { busyWaitMs });
114
109
  }
115
110
  // The fast path requires user_version as well, and a store stamped only in meta would otherwise never reach it.
116
111
  function healUserVersion(db, version, busyWaitMs) {
@@ -126,14 +121,14 @@ function importLegacyVectors(db, hippoRoot) {
126
121
  importLegacyEmbeddingIndex(db, hippoRoot);
127
122
  }
128
123
  catch (err) {
129
- log.warn(`embeddings.json import failed; the next open retries it (${err instanceof Error ? err.message : String(err)})`, { hippoRoot });
124
+ log.warn(`embeddings.json import failed; the next open retries it (${errorMessage(err)})`, { hippoRoot });
130
125
  }
131
126
  }
132
127
  function ensureMetaDefaults(db) {
133
- // Read-first: an already-current store has all 7 keys, so this is one
134
- // SELECT and zero writes instead of 7 no-op INSERT OR IGNOREs, each of
135
- // which takes a RESERVED lock even when nothing changes.
128
+ // Read-first: an already-current store has all 7 keys, so this is one SELECT and zero writes instead of 7 no-op
129
+ // INSERT OR IGNOREs, each of which takes a RESERVED lock even when nothing changes.
136
130
  const keys = META_DEFAULTS.map(([key]) => key);
131
+ // SAFETY: the statement selects only the `key` column of `meta`, which is TEXT NOT NULL, so each row is { key: string }.
137
132
  const present = new Set(db
138
133
  .prepare(`SELECT key FROM meta WHERE key IN (${keys.map(() => '?').join(',')})`)
139
134
  .all(...keys)
@@ -154,7 +149,7 @@ function ensureOptionalFts(db) {
154
149
  available = true;
155
150
  }
156
151
  catch (err) {
157
- log.warn(`full-text index unavailable (${err instanceof Error ? err.message : String(err)}); search falls back to slower LIKE matching`);
152
+ log.warn(`full-text index unavailable (${errorMessage(err)}); search falls back to slower LIKE matching`);
158
153
  }
159
154
  // Read-first: only write when the flag actually changed, so a healthy
160
155
  // store's open doesn't take a write lock for a same-value upsert.
@@ -1,9 +1,6 @@
1
1
  import type { DatabaseSyncLike } from '../sqlite.js';
2
- /**
3
- * Context passed to migrations that need to know WHERE the store lives.
4
- * hippoRoot is the store directory (e.g. `<project>/.hippo`); undefined only
5
- * for callers that open a DB without a filesystem store notion (none today).
6
- */
2
+ /** Context for migrations that need to know where the store lives. hippoRoot is the store directory (e.g. `<project>/.hippo`);
3
+ * undefined only for callers that open a DB without a filesystem store. */
7
4
  export type MigrationContext = {
8
5
  hippoRoot?: string;
9
6
  };
@@ -1,4 +1,4 @@
1
- import { createPhysicsTable } from '../../physics-state.js';
1
+ import { createPhysicsTable } from '../physics-state.js';
2
2
  export const v08 = {
3
3
  version: 8,
4
4
  up: (db) => {
@@ -1,28 +1,5 @@
1
1
  import { tableHasColumn } from '../tables.js';
2
- export const v14 = {
3
- version: 14,
4
- up: (db) => {
5
- // Provenance envelope: kind, scope, owner, artifact_ref.
6
- // SQLite ALTER TABLE ADD COLUMN cannot add CHECK; CHECK enforcement lives
7
- // in INSERT/UPDATE triggers added later in this migration.
8
- if (!tableHasColumn(db, 'memories', 'kind')) {
9
- db.exec(`ALTER TABLE memories ADD COLUMN kind TEXT DEFAULT 'distilled'`);
10
- }
11
- if (!tableHasColumn(db, 'memories', 'scope')) {
12
- db.exec(`ALTER TABLE memories ADD COLUMN scope TEXT`);
13
- db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope) WHERE scope IS NOT NULL`);
14
- }
15
- if (!tableHasColumn(db, 'memories', 'owner')) {
16
- db.exec(`ALTER TABLE memories ADD COLUMN owner TEXT`);
17
- }
18
- if (!tableHasColumn(db, 'memories', 'artifact_ref')) {
19
- db.exec(`ALTER TABLE memories ADD COLUMN artifact_ref TEXT`);
20
- }
21
- // Backfill kind for any rows where it's NULL (pre-migration data).
22
- db.exec(`UPDATE memories SET kind = 'superseded' WHERE kind IS NULL AND superseded_by IS NOT NULL`);
23
- db.exec(`UPDATE memories SET kind = 'distilled' WHERE kind IS NULL`);
24
- // raw_archive: legitimate path for kind='raw' removal (used by archiveRawMemory).
25
- db.exec(`
2
+ const CREATE_TABLE_RAW_ARCHIVE_SQL = `
26
3
  CREATE TABLE IF NOT EXISTS raw_archive (
27
4
  id INTEGER PRIMARY KEY AUTOINCREMENT,
28
5
  memory_id TEXT NOT NULL,
@@ -31,36 +8,62 @@ export const v14 = {
31
8
  archived_by TEXT,
32
9
  payload_json TEXT NOT NULL
33
10
  )
34
- `);
35
- db.exec(`CREATE INDEX IF NOT EXISTS idx_raw_archive_memory_id ON raw_archive(memory_id)`);
36
- // Append-only invariant: kind='raw' rows cannot be deleted directly.
37
- // Use raw_archive flow: archive-then-update-then-delete (see src/raw-archive.ts).
38
- db.exec(`
11
+ `;
12
+ const CREATE_TRIGGER_TRG_MEMORIES_RAW_APPEND_ONLY_SQL = `
39
13
  CREATE TRIGGER IF NOT EXISTS trg_memories_raw_append_only
40
14
  BEFORE DELETE ON memories
41
15
  WHEN OLD.kind = 'raw'
42
16
  BEGIN
43
17
  SELECT RAISE(ABORT, 'raw is append-only');
44
18
  END
45
- `);
46
- // CHECK substitute: ALTER TABLE cannot add CHECK, so enforce kind allowed-set
47
- // via INSERT/UPDATE triggers.
48
- db.exec(`
19
+ `;
20
+ const CREATE_TRIGGER_TRG_MEMORIES_KIND_CHECK_INSERT_SQL = `
49
21
  CREATE TRIGGER IF NOT EXISTS trg_memories_kind_check_insert
50
22
  BEFORE INSERT ON memories
51
23
  WHEN NEW.kind IS NOT NULL AND NEW.kind NOT IN ('raw','distilled','superseded','archived')
52
24
  BEGIN
53
25
  SELECT RAISE(ABORT, 'invalid kind: must be raw|distilled|superseded|archived');
54
26
  END
55
- `);
56
- db.exec(`
27
+ `;
28
+ const CREATE_TRIGGER_TRG_MEMORIES_KIND_CHECK_UPDATE_SQL = `
57
29
  CREATE TRIGGER IF NOT EXISTS trg_memories_kind_check_update
58
30
  BEFORE UPDATE ON memories
59
31
  WHEN NEW.kind IS NOT NULL AND NEW.kind NOT IN ('raw','distilled','superseded','archived')
60
32
  BEGIN
61
33
  SELECT RAISE(ABORT, 'invalid kind: must be raw|distilled|superseded|archived');
62
34
  END
63
- `);
35
+ `;
36
+ export const v14 = {
37
+ version: 14,
38
+ up: (db) => {
39
+ // Provenance envelope: kind, scope, owner, artifact_ref. ALTER TABLE ADD COLUMN cannot add CHECK,
40
+ // so enforcement lives in the INSERT/UPDATE triggers added later in this migration.
41
+ if (!tableHasColumn(db, 'memories', 'kind')) {
42
+ db.exec(`ALTER TABLE memories ADD COLUMN kind TEXT DEFAULT 'distilled'`);
43
+ }
44
+ if (!tableHasColumn(db, 'memories', 'scope')) {
45
+ db.exec(`ALTER TABLE memories ADD COLUMN scope TEXT`);
46
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope) WHERE scope IS NOT NULL`);
47
+ }
48
+ if (!tableHasColumn(db, 'memories', 'owner')) {
49
+ db.exec(`ALTER TABLE memories ADD COLUMN owner TEXT`);
50
+ }
51
+ if (!tableHasColumn(db, 'memories', 'artifact_ref')) {
52
+ db.exec(`ALTER TABLE memories ADD COLUMN artifact_ref TEXT`);
53
+ }
54
+ // Backfill kind for any rows where it's NULL (pre-migration data).
55
+ db.exec(`UPDATE memories SET kind = 'superseded' WHERE kind IS NULL AND superseded_by IS NOT NULL`);
56
+ db.exec(`UPDATE memories SET kind = 'distilled' WHERE kind IS NULL`);
57
+ // raw_archive: legitimate path for kind='raw' removal (used by archiveRawMemory).
58
+ db.exec(CREATE_TABLE_RAW_ARCHIVE_SQL);
59
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_raw_archive_memory_id ON raw_archive(memory_id)`);
60
+ // Append-only invariant: kind='raw' rows cannot be deleted directly.
61
+ // Use raw_archive flow: archive-then-update-then-delete (see src/store/raw-archive.ts).
62
+ db.exec(CREATE_TRIGGER_TRG_MEMORIES_RAW_APPEND_ONLY_SQL);
63
+ // CHECK substitute: ALTER TABLE cannot add CHECK, so enforce kind allowed-set
64
+ // via INSERT/UPDATE triggers.
65
+ db.exec(CREATE_TRIGGER_TRG_MEMORIES_KIND_CHECK_INSERT_SQL);
66
+ db.exec(CREATE_TRIGGER_TRG_MEMORIES_KIND_CHECK_UPDATE_SQL);
64
67
  },
65
68
  };
66
69
  //# sourceMappingURL=v14.js.map
@@ -1,14 +1,8 @@
1
1
  export const v15 = {
2
2
  version: 15,
3
3
  up: (db) => {
4
- // Close the NULL-kind bypass and add raw_archive dedup safety.
5
- //
6
- // (1) Original v14 triggers used `WHEN NEW.kind IS NOT NULL AND NEW.kind NOT IN (...)`.
7
- // A direct INSERT/UPDATE setting kind=NULL bypassed the CHECK substitute. Replace
8
- // with `WHEN NEW.kind IS NULL OR NEW.kind NOT IN (...)` so NULL is rejected too.
9
- // (2) Add UNIQUE(memory_id, archived_at) to raw_archive so re-archiving the same id
10
- // in the same instant cannot produce ambiguous audit rows. Per-id history is still
11
- // allowed (different timestamps).
4
+ // Close the NULL-kind bypass: v14 triggers used `WHEN NEW.kind IS NOT NULL AND ...`, so kind=NULL slipped past; now `IS NULL OR NOT IN (...)` rejects it.
5
+ // Add UNIQUE(memory_id, archived_at) to raw_archive so re-archiving in the same instant cannot yield ambiguous audit rows (per-id history stays allowed).
12
6
  db.exec(`DROP TRIGGER IF EXISTS trg_memories_kind_check_insert`);
13
7
  db.exec(`DROP TRIGGER IF EXISTS trg_memories_kind_check_update`);
14
8
  db.exec(`
@@ -1,4 +1,30 @@
1
1
  import { tableHasColumn } from '../tables.js';
2
+ const CREATE_TABLE_API_KEYS_SQL = `
3
+ CREATE TABLE IF NOT EXISTS api_keys (
4
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
5
+ key_id TEXT UNIQUE NOT NULL,
6
+ key_hash TEXT NOT NULL,
7
+ tenant_id TEXT NOT NULL DEFAULT 'default',
8
+ label TEXT,
9
+ created_at TEXT NOT NULL,
10
+ revoked_at TEXT
11
+ )
12
+ `;
13
+ const CREATE_INDEX_IDX_API_KEYS_TENANT_ACTIVE_SQL = `
14
+ CREATE INDEX IF NOT EXISTS idx_api_keys_tenant_active
15
+ ON api_keys(tenant_id) WHERE revoked_at IS NULL
16
+ `;
17
+ const CREATE_TABLE_AUDIT_LOG_SQL = `
18
+ CREATE TABLE IF NOT EXISTS audit_log (
19
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
20
+ ts TEXT NOT NULL,
21
+ tenant_id TEXT NOT NULL DEFAULT 'default',
22
+ actor TEXT NOT NULL,
23
+ op TEXT NOT NULL,
24
+ target_id TEXT,
25
+ metadata_json TEXT NOT NULL DEFAULT '{}'
26
+ )
27
+ `;
2
28
  export const v16 = {
3
29
  version: 16,
4
30
  up: (db) => {
@@ -25,35 +51,11 @@ export const v16 = {
25
51
  db.exec(`CREATE INDEX IF NOT EXISTS idx_working_memory_tenant ON working_memory(tenant_id, importance DESC, created_at DESC)`);
26
52
  db.exec(`CREATE INDEX IF NOT EXISTS idx_consolidation_runs_tenant_ts ON consolidation_runs(tenant_id, timestamp DESC)`);
27
53
  db.exec(`CREATE INDEX IF NOT EXISTS idx_task_snapshots_tenant_status ON task_snapshots(tenant_id, status, updated_at DESC)`);
28
- // Stub auth: api_keys (scrypt-hashed; plaintext returned to caller exactly once)
29
- // and audit_log (append-only mutation trail). Both carry tenant_id from day 1 so
30
- // future multi-tenant enforcement is a config flip, not a re-migration.
31
- db.exec(`
32
- CREATE TABLE IF NOT EXISTS api_keys (
33
- id INTEGER PRIMARY KEY AUTOINCREMENT,
34
- key_id TEXT UNIQUE NOT NULL,
35
- key_hash TEXT NOT NULL,
36
- tenant_id TEXT NOT NULL DEFAULT 'default',
37
- label TEXT,
38
- created_at TEXT NOT NULL,
39
- revoked_at TEXT
40
- )
41
- `);
42
- db.exec(`
43
- CREATE INDEX IF NOT EXISTS idx_api_keys_tenant_active
44
- ON api_keys(tenant_id) WHERE revoked_at IS NULL
45
- `);
46
- db.exec(`
47
- CREATE TABLE IF NOT EXISTS audit_log (
48
- id INTEGER PRIMARY KEY AUTOINCREMENT,
49
- ts TEXT NOT NULL,
50
- tenant_id TEXT NOT NULL DEFAULT 'default',
51
- actor TEXT NOT NULL,
52
- op TEXT NOT NULL,
53
- target_id TEXT,
54
- metadata_json TEXT NOT NULL DEFAULT '{}'
55
- )
56
- `);
54
+ // Stub auth: api_keys (scrypt-hashed; plaintext returned once) and audit_log (append-only mutation trail), both with tenant_id from day 1
55
+ // so future multi-tenant enforcement is a config flip, not a re-migration.
56
+ db.exec(CREATE_TABLE_API_KEYS_SQL);
57
+ db.exec(CREATE_INDEX_IDX_API_KEYS_TENANT_ACTIVE_SQL);
58
+ db.exec(CREATE_TABLE_AUDIT_LOG_SQL);
57
59
  db.exec(`CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_ts ON audit_log(tenant_id, ts DESC)`);
58
60
  },
59
61
  };