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,78 +1,50 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
2
  import { type DatabaseSyncLike } from '../db/index.js';
3
3
  export declare const TENANT_IS = "+tenant_id = ?";
4
- /**
5
- * Read a memory entry by ID.
6
- *
7
- * When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
8
- * lookups return null). When omitted, no tenant filter is applied — preserves
9
- * legacy single-tenant callers and the writeEntry/readEntry round-trip.
10
- */
4
+ /** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
11
5
  export declare function readEntry(hippoRoot: string, id: string, tenantId?: string): MemoryEntry | null;
12
- /** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
13
- export declare const ID_CHUNK = 500;
14
- /** `items` in consecutive slices of at most `size`. */
15
- export declare function chunked<T>(items: readonly T[], size?: number): T[][];
16
6
  /** Answers whether a tenant's rows in this store hold an id: `ids` are looked up now, one query per chunk, and any other id on its first ask. */
17
7
  export declare function heldIdLookup(hippoRoot: string, tenantId: string, ids: readonly string[]): (id: string) => boolean;
18
8
  /** Rows by id on the caller's handle, one query per chunk; an id missing or in another tenant is absent from the map. */
19
9
  export declare function selectEntriesByIds(db: DatabaseSyncLike, ids: readonly string[], tenantId?: string): Map<string, MemoryEntry>;
20
10
  /** Direct children of each parent, one query per chunk; each list is in `created ASC, id ASC` order. */
21
11
  export declare function selectChildrenByParent(db: DatabaseSyncLike, parentIds: readonly string[], tenantId?: string): Map<string, MemoryEntry[]>;
22
- /**
23
- * Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
24
- * within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
25
- * Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
26
- */
12
+ /** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
27
13
  export declare function loadEntriesByIds(hippoRoot: string, ids: readonly string[], tenantId?: string): MemoryEntry[];
28
- /**
29
- * All `kind='raw'` rows for a given session, tenant-scoped, returned
30
- * oldest-first. Used by `api.assemble` to walk a session's chronological
31
- * context. Excludes superseded rows.
32
- *
33
- * Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
34
- * reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
35
- *
36
- * Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
37
- */
14
+ /** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
15
+ * With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and break fresh-tail in assemble. */
38
16
  export declare function loadSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, cap?: number, origins?: readonly string[]): MemoryEntry[];
39
- /**
40
- * Pre-cap, scope-aware row count for a session. Lets `assemble` report
41
- * the full session size even when `rowCap` truncates the loaded window,
42
- * WITHOUT leaking rows the caller wouldn't have been allowed to load.
43
- *
44
- * An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
45
- * against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
46
- * - explicit scope passed: exact-match
47
- * - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
48
- *
49
- * `tenantId` is optional for back-compat. Pass `undefined` only when
50
- * intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
51
- */
17
+ /** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
18
+ * `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
52
19
  export declare function countSessionRawMemories(hippoRoot: string, sessionId: string, tenantId?: string, scope?: string, ownScope?: string, origins?: readonly string[]): number;
53
- /**
54
- * Last N kind='raw' memories by `created` desc. Tenant scoped. When
55
- * `sessionId` is supplied, also constrains to a specific session — that
56
- * is the correct shape for "what did I just see in THIS session."
57
- *
58
- * Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
59
- * pass undefined only for "anything new across the whole tenant".
60
- *
61
- * Bounded count cap at 200 — beyond that the caller should filter via
62
- * tags/scope rather than time-windowed recall.
63
- *
64
- * The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
65
- * `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
66
- */
20
+ /** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
21
+ * The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
67
22
  export declare function loadFreshRawMemories(hippoRoot: string, count: number, tenantId?: string, sessionId?: string, origins?: readonly string[]): MemoryEntry[];
68
- /**
69
- * Load all entries from SQLite.
70
- *
71
- * When `tenantId` is provided, results are scoped to that tenant. Omitting it
72
- * yields all rows (legacy behavior used by consolidate/autolearn etc.). Recall
73
- * paths that surface results to a user MUST pass a resolved tenant.
74
- */
23
+ /** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
75
24
  export declare function loadAllEntries(hippoRoot: string, tenantId?: string): MemoryEntry[];
25
+ /** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
26
+ export declare function loadAllEntryIds(hippoRoot: string): string[];
27
+ /** How many memory rows the store holds across every tenant. */
28
+ export declare function countAllEntries(hippoRoot: string): number;
29
+ /** A superset, in loadAllEntries' order, of the rows whose lowercased content holds any of `tokens` or whose lowercased tags hold `tag`.
30
+ * The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
31
+ export declare function loadEntriesMentioning(hippoRoot: string, tokens: readonly string[], tag: string, tenantId?: string): MemoryEntry[];
32
+ export interface EntryTextKey {
33
+ id: string;
34
+ tenantId: string;
35
+ content: string;
36
+ source: string;
37
+ }
38
+ /** Every tenant's rows in loadAllEntries' order, with only the columns that say whether another store already holds each. */
39
+ export declare function loadEntryTextKeys(hippoRoot: string): EntryTextKey[];
40
+ export interface EntriesWithBase {
41
+ entries: MemoryEntry[];
42
+ base: {
43
+ get(id: string): MemoryEntry | undefined;
44
+ };
45
+ }
46
+ /** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the store is kept. */
47
+ export declare function loadAllEntriesWithBase(hippoRoot: string): EntriesWithBase;
76
48
  /** Every memory row on an open connection, so a caller can read inside its own transaction. */
77
49
  export declare function selectAllEntries(db: DatabaseSyncLike, tenantId?: string): MemoryEntry[];
78
50
  /** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
@@ -115,7 +87,8 @@ export declare function selectRowsOutsideSourcePrefixAt(db: DatabaseSyncLike, te
115
87
  content: string;
116
88
  source: string;
117
89
  }>;
118
- /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced, in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
90
+ /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
91
+ * in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
119
92
  export declare function loadLiveContentsBySourceAndTag(hippoRoot: string, tenantId: string, source: string, tag: string, exceptSessionId: string): string[];
120
93
  /** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
121
94
  export declare function loadCurrentDistilledEntries(hippoRoot: string): MemoryEntry[];
@@ -1,48 +1,30 @@
1
1
  import { closeHippoDb } from '../db/index.js';
2
2
  import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
3
- import { openStore } from './open.js';
3
+ import { onHandle, openStore } from './open.js';
4
4
  import { escapeLike } from '../util/escape.js';
5
5
  import { originInSql } from '../core/project-identity.js';
6
- import { scopeAdmitSql } from './recall-scope.js';
6
+ import { scopeAdmitSql } from './rule-sql.js';
7
+ import { chunked } from '../util/chunked.js';
8
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
7
9
  const MAX_IDS_PER_READ = 500;
8
10
  // The plus keeps SQLite on the primary key for an id list: with a bare tenant_id it walks every row of the tenant instead.
9
11
  export const TENANT_IS = '+tenant_id = ?';
10
- /**
11
- * Read a memory entry by ID.
12
- *
13
- * When `tenantId` is provided, the read is scoped to that tenant (cross-tenant
14
- * lookups return null). When omitted, no tenant filter is applied — preserves
15
- * legacy single-tenant callers and the writeEntry/readEntry round-trip.
16
- */
12
+ /** Read a memory entry by ID. With `tenantId` the read is tenant-scoped (cross-tenant returns null); omitted, no tenant filter is applied. */
17
13
  export function readEntry(hippoRoot, id, tenantId) {
18
- const db = openStore(hippoRoot);
19
- try {
14
+ return onHandle(hippoRoot, (db) => {
20
15
  // SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
21
16
  // MemoryRow's field set.
22
17
  const row = tenantId !== undefined
23
18
  ? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ? AND tenant_id = ?`).get(id, tenantId)
24
19
  : db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ?`).get(id);
25
20
  return row ? rowToEntry(row) : null;
26
- }
27
- finally {
28
- closeHippoDb(db);
29
- }
30
- }
31
- /** Ids per `IN (...)` list: far under SQLite's bound-parameter limit, with room for the tenant filter. */
32
- export const ID_CHUNK = 500;
33
- /** `items` in consecutive slices of at most `size`. */
34
- export function chunked(items, size = ID_CHUNK) {
35
- const out = [];
36
- for (let i = 0; i < items.length; i += size)
37
- out.push(items.slice(i, i + size));
38
- return out;
21
+ }, openStore);
39
22
  }
40
23
  /** Answers whether a tenant's rows in this store hold an id: `ids` are looked up now, one query per chunk, and any other id on its first ask. */
41
24
  export function heldIdLookup(hippoRoot, tenantId, ids) {
42
25
  const held = new Map();
43
26
  const lookUp = (asked) => {
44
- const db = openStore(hippoRoot);
45
- try {
27
+ onHandle(hippoRoot, (db) => {
46
28
  for (const chunk of chunked([...new Set(asked)])) {
47
29
  for (const id of chunk)
48
30
  held.set(id, false);
@@ -51,10 +33,7 @@ export function heldIdLookup(hippoRoot, tenantId, ids) {
51
33
  for (const row of rows)
52
34
  held.set(row.id, true);
53
35
  }
54
- }
55
- finally {
56
- closeHippoDb(db);
57
- }
36
+ }, openStore);
58
37
  };
59
38
  if (ids.length > 0)
60
39
  lookUp(ids);
@@ -99,48 +78,30 @@ export function selectChildrenByParent(db, parentIds, tenantId) {
99
78
  }
100
79
  return byParent;
101
80
  }
102
- /**
103
- * Batched lookup. Caps at 500 ids per call to keep the IN(?,?,...) clause
104
- * within SQLite limits. Tenant filter is enforced when `tenantId` is passed.
105
- * Used by DAG-aware recall to fetch parent summaries for a set of overflowed leaves.
106
- */
81
+ /** Batched lookup, capped at 500 ids per call to keep IN(?,?,...) within SQLite limits; tenant filter enforced when `tenantId` is passed. */
107
82
  export function loadEntriesByIds(hippoRoot, ids, tenantId) {
108
83
  if (ids.length === 0)
109
84
  return [];
110
85
  const capped = ids.slice(0, MAX_IDS_PER_READ);
111
- const db = openStore(hippoRoot);
112
- try {
86
+ return onHandle(hippoRoot, (db) => {
113
87
  const placeholders = capped.map(() => '?').join(',');
114
- // Without ORDER BY, rows follow SQLite's IN(...) scan order, which is undefined w.r.t. `ids`.
115
- // SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
116
- // MemoryRow's field set.
88
+ // Without ORDER BY, rows follow SQLite's IN(...) scan order, undefined w.r.t. `ids`.
89
+ // SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
117
90
  const rows = tenantId !== undefined
118
91
  ? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) AND ${TENANT_IS} ORDER BY created ASC, content ASC, id ASC`).all(...capped, tenantId)
119
92
  : db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders}) ORDER BY created ASC, content ASC, id ASC`).all(...capped);
120
93
  return rows.map(rowToEntry);
121
- }
122
- finally {
123
- closeHippoDb(db);
124
- }
94
+ }, openStore);
125
95
  }
126
96
  function originClause(origins) {
127
97
  return origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
128
98
  }
129
- /**
130
- * All `kind='raw'` rows for a given session, tenant-scoped, returned
131
- * oldest-first. Used by `api.assemble` to walk a session's chronological
132
- * context. Excludes superseded rows.
133
- *
134
- * Cap semantics: when `cap` is provided, the NEWEST `cap` rows are loaded (DESC LIMIT server-side,
135
- * reversed client-side); ASC + LIMIT would drop the newest rows and break fresh-tail in assemble.
136
- *
137
- * Returns `[]` for an empty sessionId. Final order: `created ASC, id ASC`.
138
- */
99
+ /** All `kind='raw'` rows for a session, tenant-scoped, oldest-first, excluding superseded; `[]` for an empty sessionId.
100
+ * With `cap`, the NEWEST rows are loaded (DESC LIMIT, reversed client-side); ASC + LIMIT would drop the newest and break fresh-tail in assemble. */
139
101
  export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins) {
140
102
  if (!sessionId)
141
103
  return [];
142
- const db = openStore(hippoRoot);
143
- try {
104
+ return onHandle(hippoRoot, (db) => {
144
105
  const params = [];
145
106
  let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw' AND source_session_id = ? AND superseded_by IS NULL`;
146
107
  params.push(sessionId);
@@ -161,29 +122,14 @@ export function loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, orig
161
122
  // SAFETY: sql starts from MEMORY_SELECT_COLUMNS, matching MemoryRow.
162
123
  const rows = db.prepare(sql).all(...params);
163
124
  return rows.map(rowToEntry);
164
- }
165
- finally {
166
- closeHippoDb(db);
167
- }
125
+ }, openStore);
168
126
  }
169
- /**
170
- * Pre-cap, scope-aware row count for a session. Lets `assemble` report
171
- * the full session size even when `rowCap` truncates the loaded window,
172
- * WITHOUT leaking rows the caller wouldn't have been allowed to load.
173
- *
174
- * An unscoped COUNT would let a no-scope caller infer private rows by comparing `totalRaw`
175
- * against `items.length`, so this SQL-encodes the default-deny rule `passesScopeFilterForRecall` applies in TS:
176
- * - explicit scope passed: exact-match
177
- * - no scope: `scopeAdmitSql`'s default deny, which admits `ownScope`, the caller's personal scope.
178
- *
179
- * `tenantId` is optional for back-compat. Pass `undefined` only when
180
- * intentionally counting cross-tenant; `assemble()` passes `ctx.tenantId`.
181
- */
127
+ /** Pre-cap, scope-aware row count for a session, so `assemble` reports the full size without leaking rows the caller could not load. Mirrors
128
+ * `passesScopeFilterForRecall`'s default-deny: explicit scope matches exactly, none admits only `ownScope`. `tenantId` undefined counts cross-tenant. */
182
129
  export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins) {
183
130
  if (!sessionId)
184
131
  return 0;
185
- const db = openStore(hippoRoot);
186
- try {
132
+ return onHandle(hippoRoot, (db) => {
187
133
  const params = [];
188
134
  let sql = `SELECT COUNT(*) AS c FROM memories WHERE kind = 'raw' AND source_session_id = ? AND superseded_by IS NULL`;
189
135
  params.push(sessionId);
@@ -205,31 +151,15 @@ export function countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, o
205
151
  // SAFETY: row's shape matches the single `COUNT(*) AS c` column above.
206
152
  const row = db.prepare(sql).get(...params);
207
153
  return Number(row?.c ?? 0);
208
- }
209
- finally {
210
- closeHippoDb(db);
211
- }
154
+ }, openStore);
212
155
  }
213
- /**
214
- * Last N kind='raw' memories by `created` desc. Tenant scoped. When
215
- * `sessionId` is supplied, also constrains to a specific session — that
216
- * is the correct shape for "what did I just see in THIS session."
217
- *
218
- * Without `sessionId`, concurrent sessions in a tenant surface each other's rows as fresh tail;
219
- * pass undefined only for "anything new across the whole tenant".
220
- *
221
- * Bounded count cap at 200 — beyond that the caller should filter via
222
- * tags/scope rather than time-windowed recall.
223
- *
224
- * The tenant-wide shape is the back-compat default but discouraged; `api.recall` throws
225
- * `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1` is set.
226
- */
156
+ /** Last N kind='raw' memories by `created` desc, tenant-scoped, max 200; pass `sessionId` or concurrent sessions show up in each other's fresh tail.
157
+ * The tenant-wide shape is discouraged: `api.recall` throws `RecallContractError` for it when `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`. */
227
158
  export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, origins) {
228
159
  if (count <= 0)
229
160
  return [];
230
161
  const capped = Math.min(count, 200);
231
- const db = openStore(hippoRoot);
232
- try {
162
+ return onHandle(hippoRoot, (db) => {
233
163
  const params = [];
234
164
  let sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE kind = 'raw' AND superseded_by IS NULL`;
235
165
  if (tenantId !== undefined) {
@@ -249,35 +179,94 @@ export function loadFreshRawMemories(hippoRoot, count, tenantId, sessionId, orig
249
179
  // SAFETY: sql starts from MEMORY_SELECT_COLUMNS, matching MemoryRow.
250
180
  const rows = db.prepare(sql).all(...params);
251
181
  return rows.map(rowToEntry);
182
+ }, openStore);
183
+ }
184
+ /** Load all entries from SQLite; omitting `tenantId` yields all rows (legacy). Recall paths that surface results to a user MUST pass a resolved tenant. */
185
+ export function loadAllEntries(hippoRoot, tenantId) {
186
+ return onHandle(hippoRoot, (db) => {
187
+ return selectAllEntries(db, tenantId);
188
+ }, openStore);
189
+ }
190
+ /** Every tenant's memory ids in loadAllEntries' order, for a caller that reads the rows a page at a time instead of holding them all. */
191
+ export function loadAllEntryIds(hippoRoot) {
192
+ return onHandle(hippoRoot, (db) => {
193
+ // SAFETY: the SELECT names exactly the one column read.
194
+ return db.prepare('SELECT id FROM memories ORDER BY created ASC, id ASC').all().map((row) => row.id);
195
+ }, openStore);
196
+ }
197
+ /** How many memory rows the store holds across every tenant. */
198
+ export function countAllEntries(hippoRoot) {
199
+ return onHandle(hippoRoot, (db) => {
200
+ // SAFETY: row's shape matches the single `COUNT(*) AS c` column.
201
+ const row = db.prepare('SELECT COUNT(*) AS c FROM memories').get();
202
+ return Number(row?.c ?? 0);
203
+ }, openStore);
204
+ }
205
+ // The only code points whose JS toLowerCase yields ASCII, which SQLite's ASCII-only LIKE folding cannot see.
206
+ const FOLDS_TO_ASCII = ['\u0130', '\u212A'];
207
+ /** A superset, in loadAllEntries' order, of the rows whose lowercased content holds any of `tokens` or whose lowercased tags hold `tag`.
208
+ * The caller re-checks each row exactly; this only spares decoding rows that cannot match. */
209
+ export function loadEntriesMentioning(hippoRoot, tokens, tag, tenantId) {
210
+ const likes = [...new Set(tokens)].map((t) => `%${escapeLike(t)}%`);
211
+ const clauses = likes.map(() => `content LIKE ? ESCAPE '\\'`);
212
+ const params = [...likes];
213
+ // A tag needing JSON escapes or case folding past ASCII is not found by a substring of tags_json, so every tagged row stays in.
214
+ if (/^[\x20-\x7e]*$/.test(tag) && !/["\\]/.test(tag)) {
215
+ clauses.push(`tags_json LIKE ? ESCAPE '\\'`);
216
+ params.push(`%${escapeLike(tag)}%`);
252
217
  }
253
- finally {
254
- closeHippoDb(db);
218
+ else
219
+ clauses.push(`COALESCE(tags_json, '[]') != '[]'`);
220
+ for (const ch of FOLDS_TO_ASCII) {
221
+ clauses.push('instr(content, ?) > 0', 'instr(tags_json, ?) > 0');
222
+ params.push(ch, ch);
255
223
  }
224
+ const tenantClause = tenantId !== undefined ? 'tenant_id = ? AND ' : '';
225
+ return onHandle(hippoRoot, (db) => {
226
+ // SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
227
+ const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${tenantClause}(${clauses.join(' OR ')}) ORDER BY created ASC, id ASC`).all(...(tenantId !== undefined ? [tenantId] : []), ...params);
228
+ return rows.map(rowToEntry);
229
+ }, openStore);
256
230
  }
257
- /**
258
- * Load all entries from SQLite.
259
- *
260
- * When `tenantId` is provided, results are scoped to that tenant. Omitting it
261
- * yields all rows (legacy behavior used by consolidate/autolearn etc.). Recall
262
- * paths that surface results to a user MUST pass a resolved tenant.
263
- */
264
- export function loadAllEntries(hippoRoot, tenantId) {
231
+ /** Every tenant's rows in loadAllEntries' order, with only the columns that say whether another store already holds each. */
232
+ export function loadEntryTextKeys(hippoRoot) {
233
+ return onHandle(hippoRoot, (db) => {
234
+ // SAFETY: rows' shape matches the four columns named in the SELECT.
235
+ const rows = db.prepare('SELECT id, tenant_id, content, source FROM memories ORDER BY created ASC, id ASC').all();
236
+ return rows.map((row) => ({ id: row.id, tenantId: row.tenant_id ?? DEFAULT_TENANT_ID, content: row.content, source: row.source }));
237
+ }, openStore);
238
+ }
239
+ /** Every entry plus a by-id lookup of each as loaded, rebuilt from its row on first use, so no deep copy of the store is kept. */
240
+ export function loadAllEntriesWithBase(hippoRoot) {
265
241
  const db = openStore(hippoRoot);
242
+ let rows;
266
243
  try {
267
- return selectAllEntries(db, tenantId);
244
+ rows = selectAllRows(db);
268
245
  }
269
246
  finally {
270
247
  closeHippoDb(db);
271
248
  }
249
+ const byId = new Map(rows.map((row) => [row.id, row]));
250
+ const built = new Map();
251
+ const get = (id) => {
252
+ let entry = built.get(id);
253
+ const row = byId.get(id);
254
+ if (!entry && row)
255
+ built.set(id, (entry = rowToEntry(row)));
256
+ return entry;
257
+ };
258
+ return { entries: rows.map(rowToEntry), base: { get } };
272
259
  }
273
- /** Every memory row on an open connection, so a caller can read inside its own transaction. */
274
- export function selectAllEntries(db, tenantId) {
260
+ function selectAllRows(db, tenantId) {
275
261
  // SAFETY: both branches select exactly MEMORY_SELECT_COLUMNS, matching
276
262
  // MemoryRow's field set.
277
- const rows = tenantId !== undefined
263
+ return tenantId !== undefined
278
264
  ? db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created ASC, id ASC`).all(tenantId)
279
265
  : db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ORDER BY created ASC, id ASC`).all();
280
- return rows.map(rowToEntry);
266
+ }
267
+ /** Every memory row on an open connection, so a caller can read inside its own transaction. */
268
+ export function selectAllEntries(db, tenantId) {
269
+ return selectAllRows(db, tenantId).map(rowToEntry);
281
270
  }
282
271
  /** Live rows whose source starts with `prefix`, on the caller's handle; LIKE folds case, so the prefix is checked again exactly. */
283
272
  export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
@@ -288,38 +277,31 @@ export function selectLiveEntriesBySourcePrefix(db, tenantId, prefix) {
288
277
  // Content of every team-visible tenant row tagged `tag`, without reading the rest of the store; `origins` keeps one project's rows and user-global ones.
289
278
  // No owner: a personal or connector-private row must never answer `duplicate` for, or stop, a team copy. `instr` prefilters; `includes` re-checks.
290
279
  export function loadContentsWithTag(hippoRoot, tenantId, tag, origins) {
291
- const db = openStore(hippoRoot);
292
- try {
280
+ return onHandle(hippoRoot, (db) => {
293
281
  const inProject = origins === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(origins)})`;
294
282
  const admit = scopeAdmitSql('');
295
283
  /** SAFETY: rows' shape matches the two columns named in the SELECT below. */
296
284
  const rows = db.prepare(`SELECT content, tags_json FROM memories WHERE tenant_id = ? AND instr(tags_json, ?) > 0${inProject} AND ${admit.sql}`).all(tenantId, JSON.stringify(tag), ...(origins ?? []), ...admit.params);
297
285
  return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
298
- }
299
- finally {
300
- closeHippoDb(db);
301
- }
286
+ }, openStore);
302
287
  }
303
288
  /** Live raw rows whose artifact_ref matches a LIKE pattern, for one tenant; the store is set up first when it is new. */
304
289
  export function loadVaultRawRows(hippoRoot, likeParam, tenantId) {
305
- const db = openStore(hippoRoot);
306
- try {
290
+ return onHandle(hippoRoot, (db) => {
307
291
  // SAFETY: query selects exactly the columns of VaultRawRow, in the same
308
292
  // names, from the memories table this module owns.
309
293
  return db
310
294
  .prepare(`SELECT id, artifact_ref, tags_json, scope FROM memories
311
295
  WHERE artifact_ref LIKE ? ESCAPE '\\' AND tenant_id = ? AND kind = 'raw'`)
312
296
  .all(likeParam, tenantId);
313
- }
314
- finally {
315
- closeHippoDb(db);
316
- }
297
+ }, openStore);
317
298
  }
318
299
  /** Reads memories from a store whose schema may predate some columns; `columns` is the table's real column set. */
319
300
  export function selectPreviewRows(db, columns, tenantId) {
320
301
  const tenant = columns.has('tenant_id') ? ' WHERE tenant_id = ?' : '';
321
302
  const column = (name, fallback) => (columns.has(name) ? name : `${fallback} AS ${name}`);
322
- const statement = db.prepare(`SELECT id, content, ${column('source', "''")}, ${column('confidence', 'NULL')}, ${column('extracted_from', 'NULL')}, ${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
303
+ const statement = db.prepare(`SELECT id, content, ${column('source', "''")}, ${column('confidence', 'NULL')}, ${column('extracted_from', 'NULL')}, ` +
304
+ `${column('dag_level', '0')}, ${column('tags_json', "'[]'")} FROM memories${tenant}`);
323
305
  // SAFETY: the SELECT names every PreviewRow field, each a literal fallback when its column is missing.
324
306
  return (tenant ? statement.all(tenantId) : statement.all());
325
307
  }
@@ -352,10 +334,10 @@ export function selectRowsOutsideSourcePrefixAt(db, tenantId, sourcePrefix, orig
352
334
  return db.prepare(`SELECT id, content, source FROM memories
353
335
  WHERE tenant_id = ? AND superseded_by IS NULL AND substr(source, 1, ${sourcePrefix.length}) != ?${visible}`).all(...params);
354
336
  }
355
- /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced, in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
337
+ /** Content of a tenant's live rows written by `source` and tagged `tag` that no extraction produced,
338
+ * in loadAllEntries' order and in every scope; `exceptSessionId` drops one session's own rows. */
356
339
  export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag, exceptSessionId) {
357
- const db = openStore(hippoRoot);
358
- try {
340
+ return onHandle(hippoRoot, (db) => {
359
341
  /** SAFETY: rows' shape matches the two columns named in the SELECT below. */
360
342
  const rows = db.prepare(`SELECT content, tags_json FROM memories
361
343
  WHERE tenant_id = ? AND source = ? AND instr(tags_json, ?) > 0
@@ -363,23 +345,16 @@ export function loadLiveContentsBySourceAndTag(hippoRoot, tenantId, source, tag,
363
345
  AND (source_session_id IS NULL OR source_session_id != ?)
364
346
  ORDER BY created ASC, id ASC`).all(tenantId, source, JSON.stringify(tag), exceptSessionId);
365
347
  return rows.filter((r) => parseJsonArray(r.tags_json).includes(tag)).map((r) => r.content);
366
- }
367
- finally {
368
- closeHippoDb(db);
369
- }
348
+ }, openStore);
370
349
  }
371
350
  /** Every tenant's distilled rows nothing has superseded, in loadAllEntries' order: the rows that can be each other's duplicate. */
372
351
  export function loadCurrentDistilledEntries(hippoRoot) {
373
- const db = openStore(hippoRoot);
374
- try {
352
+ return onHandle(hippoRoot, (db) => {
375
353
  // SAFETY: selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
376
354
  const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories
377
355
  WHERE COALESCE(kind, 'distilled') = 'distilled' AND COALESCE(superseded_by, '') = ''
378
356
  ORDER BY created ASC, id ASC`).all();
379
357
  return rows.map(rowToEntry);
380
- }
381
- finally {
382
- closeHippoDb(db);
383
- }
358
+ }, openStore);
384
359
  }
385
360
  //# sourceMappingURL=entry-reads.js.map
@@ -1,7 +1,8 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
2
  import { openHippoDb } from '../db/index.js';
3
3
  export declare function upsertEntryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): void;
4
- /** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
4
+ /** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
5
+ * `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
5
6
  export declare function upsertMemoryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry): boolean;
6
7
  export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
7
8
  export declare function ftsRowExists(db: ReturnType<typeof openHippoDb>, id: string): boolean;
@@ -13,40 +14,10 @@ export declare function ftsDrift(hippoRoot: string, repair: boolean): {
13
14
  memories: number;
14
15
  fts: number;
15
16
  } | null;
16
- /**
17
- * Write a memory entry to SQLite and refresh compatibility mirrors.
18
- *
19
- * `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
20
- * get the right audit attribution. The HTTP server and api.* layer pass
21
- * the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
22
- * land with one row per write, no double-emit.
23
- *
24
- * `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
25
- * INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
26
- * throw, the SAVEPOINT rolls back — the memory row never lands, and the
27
- * filesystem mirrors / audit emit never run. Used by connectors to
28
- * stamp idempotency rows atomically with the memory write.
29
- */
30
- /**
31
- * Stamp origin_project from the store's own location when the entry has
32
- * never been stamped (v39 memory scope isolation). The store dir is
33
- * `<project>/.hippo`, so its parent resolves to the owning project; the
34
- * home/global store resolves to '' (user-global). Callers that know a better
35
- * origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
36
- * writing and this is a no-op. Returns a stamped copy; never mutates.
37
- *
38
- * NULL is PRESERVED, not re-stamped: it means no known project (a legacy row with no evidence, or a write to a
39
- * shared store that named none) and ambient context denies it, so a writeback must not launder it.
40
- */
17
+ /** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' = user-global) when never stamped; returns a copy.
18
+ * NULL is PRESERVED: it means no known project and ambient context denies it, so a writeback must not launder it. */
41
19
  export declare function stampOriginProject(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
42
- /**
43
- * Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
44
- * for rows that predate the origin column - the legacy-markdown bootstrap and
45
- * rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
46
- * backfill. Same evidence order as the migration: the provenance source
47
- * (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
48
- * store's location, so a shared row imported into the global store keeps its
49
- * owning project instead of becoming user-global.
50
- */
20
+ /** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin column.
21
+ * Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination store's location. */
51
22
  export declare function stampOriginProjectForImport(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
52
23
  //# sourceMappingURL=entry-row.d.ts.map
@@ -1,12 +1,14 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import { closeHippoDb, ftsRowCounts, openHippoDb, isFtsAvailable, repairFtsDrift } from '../db/index.js';
2
3
  import { fallbackOrigin, originFromSource } from '../core/project-identity.js';
3
4
  import { checkRejectionGuard } from './rejection.js';
4
5
  import { errorMessage, log } from '../util/log.js';
5
6
  export function upsertEntryRow(db, entry) {
6
- checkRejectionGuard(db, entry.tenantId ?? 'default', entry.id, entry.content);
7
+ checkRejectionGuard(db, entry.tenantId ?? DEFAULT_TENANT_ID, entry.id, entry.content);
7
8
  syncFtsRow(db, entry, upsertMemoryRow(db, entry));
8
9
  }
9
- /** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
10
+ /** The row alone, with no rejection guard or full-text row, for `upsertEntryRow` and for
11
+ * `batchWriteAndDelete`, which probes tombstones and indexes per batch. Returns whether the row is new. */
10
12
  export function upsertMemoryRow(db, entry) {
11
13
  const isNewRow = db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(entry.id) === undefined;
12
14
  db.prepare(UPSERT_MEMORY_SQL).run(...memoryRowValues(entry));
@@ -102,7 +104,7 @@ function memoryRowValues(entry) {
102
104
  entry.scope ?? null,
103
105
  entry.owner ?? null,
104
106
  entry.artifact_ref ?? null,
105
- entry.tenantId ?? 'default',
107
+ entry.tenantId ?? DEFAULT_TENANT_ID,
106
108
  entry.origin_project ?? null,
107
109
  entry.descendant_count ?? 0,
108
110
  entry.earliest_at ?? null,
@@ -181,45 +183,15 @@ export function ftsDrift(hippoRoot, repair) {
181
183
  closeHippoDb(db);
182
184
  }
183
185
  }
184
- /**
185
- * Write a memory entry to SQLite and refresh compatibility mirrors.
186
- *
187
- * `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
188
- * get the right audit attribution. The HTTP server and api.* layer pass
189
- * the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
190
- * land with one row per write, no double-emit.
191
- *
192
- * `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
193
- * INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
194
- * throw, the SAVEPOINT rolls back — the memory row never lands, and the
195
- * filesystem mirrors / audit emit never run. Used by connectors to
196
- * stamp idempotency rows atomically with the memory write.
197
- */
198
- /**
199
- * Stamp origin_project from the store's own location when the entry has
200
- * never been stamped (v39 memory scope isolation). The store dir is
201
- * `<project>/.hippo`, so its parent resolves to the owning project; the
202
- * home/global store resolves to '' (user-global). Callers that know a better
203
- * origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
204
- * writing and this is a no-op. Returns a stamped copy; never mutates.
205
- *
206
- * NULL is PRESERVED, not re-stamped: it means no known project (a legacy row with no evidence, or a write to a
207
- * shared store that named none) and ambient context denies it, so a writeback must not launder it.
208
- */
186
+ /** Stamp origin_project from the store's own location (parent of `<project>/.hippo`; the home store is '' = user-global) when never stamped; returns a copy.
187
+ * NULL is PRESERVED: it means no known project and ambient context denies it, so a writeback must not launder it. */
209
188
  export function stampOriginProject(hippoRoot, entry) {
210
189
  if (entry.origin_project !== undefined)
211
190
  return entry;
212
191
  return { ...entry, origin_project: fallbackOrigin(hippoRoot) };
213
192
  }
214
- /**
215
- * Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
216
- * for rows that predate the origin column - the legacy-markdown bootstrap and
217
- * rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
218
- * backfill. Same evidence order as the migration: the provenance source
219
- * (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
220
- * store's location, so a shared row imported into the global store keeps its
221
- * owning project instead of becoming user-global.
222
- */
193
+ /** Import-time variant for a mirror with no origin field (an explicit null stays null), for rows predating the origin column.
194
+ * Like the v39 backfill, the provenance source (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination store's location. */
223
195
  export function stampOriginProjectForImport(hippoRoot, entry) {
224
196
  if (entry.origin_project !== undefined)
225
197
  return entry;