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
@@ -0,0 +1,19 @@
1
+ import { MemoryEntry } from '../core/memory.js';
2
+ import type { DatabaseSyncLike } from '../db/index.js';
3
+ /** Returns the path to the global Hippo store.
4
+ * Resolution order: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/ */
5
+ export declare function getGlobalRoot(): string;
6
+ /** Ensure the global store exists. */
7
+ export declare function initGlobal(): void;
8
+ /** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
9
+ export declare function promoteToGlobal(localRoot: string, id: string, opts?: {
10
+ actor?: string;
11
+ tenantId?: string;
12
+ afterWrite?: (db: DatabaseSyncLike, globalId: string) => void;
13
+ /** Also writes one `promote` audit row for the copy ({sourceId}), in the copy's own transaction. */
14
+ auditAs?: {
15
+ tenantId: string;
16
+ actor: string;
17
+ };
18
+ }): MemoryEntry;
19
+ //# sourceMappingURL=global-store.d.ts.map
@@ -0,0 +1,75 @@
1
+ // The global store: where it lives, creating it, and copying a local memory into it.
2
+ import { BadRequestError, NotFoundError } from '../core/api-errors.js';
3
+ import * as fs from 'fs';
4
+ import { generateId } from '../core/memory.js';
5
+ import { initStore } from '../store/open.js';
6
+ import { writeEntry } from '../store/entry-writes.js';
7
+ import { readEntry } from '../store/entry-reads.js';
8
+ import { isPersonalScope } from '../core/recall-scope.js';
9
+ import { fallbackOrigin, resolveGlobalRootDir } from '../core/project-identity.js';
10
+ import { isSharedStore } from '../core/config.js';
11
+ import { detectSecret } from '../util/secret-detect.js';
12
+ import { isQuarantineScope } from '../trust/quarantine.js';
13
+ import { embedMemory } from '../search/embed-memories.js';
14
+ import { appendAuditEvent } from '../store/audit.js';
15
+ /** Returns the path to the global Hippo store.
16
+ * Resolution order: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/ */
17
+ export function getGlobalRoot() {
18
+ // Single source of truth lives in project-identity.ts (leaf) so db migrations
19
+ // can resolve the same path without a shared.ts import cycle.
20
+ return resolveGlobalRootDir();
21
+ }
22
+ /** Ensure the global store exists. */
23
+ export function initGlobal() {
24
+ const globalRoot = getGlobalRoot();
25
+ if (!fs.existsSync(globalRoot)) {
26
+ initStore(globalRoot);
27
+ }
28
+ else {
29
+ // Ensure subdirectories exist in case partially initialized
30
+ initStore(globalRoot);
31
+ }
32
+ }
33
+ /** The copy's write hook: the `promote` row when asked for, then the caller's own hook, both in the copy's transaction. */
34
+ function promoteHook(sourceId, auditAs, afterWrite) {
35
+ if (!auditAs)
36
+ return afterWrite;
37
+ return (db, globalId) => {
38
+ appendAuditEvent(db, { tenantId: auditAs.tenantId, actor: auditAs.actor, op: 'promote', targetId: globalId, metadata: { sourceId } });
39
+ afterWrite?.(db, globalId);
40
+ };
41
+ }
42
+ /** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
43
+ export function promoteToGlobal(localRoot, id, opts) {
44
+ const entry = readEntry(localRoot, id, opts?.tenantId);
45
+ if (!entry)
46
+ throw new NotFoundError(`Memory not found: ${id}`);
47
+ // Same quarantine veto as shareMemory; a promoted copy would have no quarantine record to review.
48
+ if (isQuarantineScope(entry.scope)) {
49
+ throw new BadRequestError(`Refusing to promote ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ${id}'.`);
50
+ }
51
+ if (isPersonalScope(entry.scope ?? null)) {
52
+ throw new BadRequestError(`Refusing to promote ${id}: it is a personal memory and stays with its owner on this server.`);
53
+ }
54
+ // Secret producer veto: promote is a producer path to the global store
55
+ // exactly like shareMemory - same hard rule.
56
+ const promoteSecret = detectSecret(entry);
57
+ if (promoteSecret.flagged) {
58
+ throw new BadRequestError(`Refusing to promote ${id} to the global store: content matches secret material (${promoteSecret.reason}). ` +
59
+ `Secrets stay in their owning project's store.`);
60
+ }
61
+ initGlobal();
62
+ const globalRoot = getGlobalRoot();
63
+ // A project store's NULL row gets its folder back; a shared store's folder is no caller's project, so NULL stays and the label names no path.
64
+ const globalEntry = {
65
+ ...entry,
66
+ id: generateId('g'),
67
+ source: isSharedStore(localRoot) ? `shared::${new Date().toISOString()}` : `promoted:${localRoot}`,
68
+ origin_project: entry.origin_project ?? fallbackOrigin(localRoot),
69
+ };
70
+ writeEntry(globalRoot, globalEntry, { actor: opts?.actor, afterWrite: promoteHook(id, opts?.auditAs, opts?.afterWrite) });
71
+ // Fire-and-forget: embedMemory gates on availability and never rejects.
72
+ void embedMemory(globalRoot, globalEntry);
73
+ return globalEntry;
74
+ }
75
+ //# sourceMappingURL=global-store.js.map
@@ -0,0 +1,6 @@
1
+ /** Copy all global memories into the local store, skipping entries that already exist locally by ID or text (promote and share copy under a new ID).
2
+ * Returns the count of newly copied entries. */
3
+ export declare function syncGlobalToLocal(localRoot: string, globalRoot: string, opts?: {
4
+ includeCrossProject?: boolean;
5
+ }): number;
6
+ //# sourceMappingURL=global-sync.d.ts.map
@@ -0,0 +1,73 @@
1
+ // Copying the global store's memories down into a local store.
2
+ import { BadRequestError } from '../core/api-errors.js';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { AGENT_MEMORY_SOURCE_PREFIX } from '../core/agent-memory-tools.js';
6
+ import { writeEntriesSkippingRejected } from '../store/entry-writes.js';
7
+ import { loadEntriesByIds, loadEntryTextKeys } from '../store/entry-reads.js';
8
+ import { chunked } from '../util/chunked.js';
9
+ import { withRequestStoresSync } from '../db/request-stores.js';
10
+ import { classifyOriginProject, resolveProjectIdentity } from '../core/project-identity.js';
11
+ import { isSharedStore } from '../core/config.js';
12
+ import { detectSecret } from '../util/secret-detect.js';
13
+ import { embedAll } from '../search/embed-memories.js';
14
+ import { log } from '../util/log.js';
15
+ import { logEmbedAllFailure } from './search-both.js';
16
+ /** Copy all global memories into the local store, skipping entries that already exist locally by ID or text (promote and share copy under a new ID).
17
+ * Returns the count of newly copied entries. */
18
+ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
19
+ if (isSharedStore(localRoot)) {
20
+ throw new BadRequestError(`Refusing to sync into ${localRoot}: a shared store takes no copies of a personal global store, ` +
21
+ `whose rows would reach every member.`);
22
+ }
23
+ if (!fs.existsSync(globalRoot))
24
+ return 0;
25
+ return withRequestStoresSync(() => copyMissingRows(localRoot, globalRoot, opts.includeCrossProject === true));
26
+ }
27
+ const textKey = (e) => `${e.tenantId}\n${e.content}`;
28
+ /** One open per store and one transaction: id, tenant and text decide which rows to read whole, and the copies commit together. */
29
+ function copyMissingRows(localRoot, globalRoot, includeCrossProject) {
30
+ // Host-wide read: the global union is copied into a tenant-scoped local store, and each copy keeps its own tenant.
31
+ const localKeys = loadEntryTextKeys(localRoot);
32
+ const localIds = new Set(localKeys.map((k) => k.id));
33
+ const localText = new Set(localKeys.map(textKey));
34
+ // Only the global store's user pass sets an imported note's row aside, so a copy would outlive the note.
35
+ const candidates = loadEntryTextKeys(globalRoot).filter((k) => !localIds.has(k.id) && !k.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX) && !localText.has(textKey(k)));
36
+ if (candidates.length === 0)
37
+ return 0;
38
+ const byId = new Map(chunked(candidates.map((k) => k.id)).flatMap((ids) => loadEntriesByIds(globalRoot, ids)).map((e) => [e.id, e]));
39
+ // Syncing down must not re-import what ambient context excludes: other-project rows are skipped by default and secret rows never copied.
40
+ // origin_project is preserved on the copy (the write stamps it only when missing).
41
+ const currentProject = resolveProjectIdentity(path.dirname(path.resolve(localRoot)));
42
+ // A locally rejected value must not come back through sync down: skipped per item, printed as one line.
43
+ let rejected = 0;
44
+ const count = writeEntriesSkippingRejected(localRoot, (put) => {
45
+ for (const { id } of candidates) {
46
+ const entry = byId.get(id);
47
+ // A row the global store dropped between the two reads, or a text an earlier copy in this batch already brought down.
48
+ if (!entry || localText.has(textKey(entry)))
49
+ continue;
50
+ if (detectSecret(entry).flagged)
51
+ continue;
52
+ if (!includeCrossProject && classifyOriginProject(entry.origin_project, currentProject) === 'cross-project')
53
+ continue;
54
+ if (put(entry))
55
+ localText.add(textKey(entry));
56
+ else
57
+ rejected++;
58
+ }
59
+ });
60
+ finishSyncDown(localRoot, count, rejected);
61
+ return count;
62
+ }
63
+ function finishSyncDown(localRoot, count, rejected) {
64
+ if (rejected > 0) {
65
+ log.warn(`syncGlobalToLocal: skipped ${rejected} rejected value(s) (run \`hippo unreject\` on the local store to allow).`);
66
+ }
67
+ // Batch producer: one embedAll() on the destination rather than an
68
+ // embedMemory() per copied row (same batching invariant as autoShare).
69
+ if (count > 0) {
70
+ void embedAll(localRoot).catch((err) => logEmbedAllFailure('syncGlobalToLocal', err));
71
+ }
72
+ }
73
+ //# sourceMappingURL=global-sync.js.map
@@ -1,4 +1,5 @@
1
- import { type DatabaseSyncLike } from '../db/index.js';
1
+ import { type ProjectFold } from '../agent-memories/project-folds.js';
2
+ import type { ProjectTagReads, ProjectTagStore } from '../store/project-tags.js';
2
3
  export interface ProjectSummary {
3
4
  /** '' is user-global, null is unknown; neither can be merged. */
4
5
  readonly origin: string | null;
@@ -18,10 +19,6 @@ export interface MergeResult {
18
19
  readonly compactions: number;
19
20
  readonly backup: string | null;
20
21
  }
21
- export interface ProjectFold {
22
- readonly from: string;
23
- readonly into: string;
24
- }
25
22
  /** An old name whose session folders now resolve to several projects: no fold can say whose rows are whose. */
26
23
  export interface ProjectCollision {
27
24
  readonly name: string;
@@ -45,29 +42,24 @@ export interface RepairResult {
45
42
  readonly backup: string | null;
46
43
  }
47
44
  /** Live rows per project name, newest write first, with how many of its imported notes are copies held elsewhere. */
48
- export declare function listProjects(db: DatabaseSyncLike, tenantId: string): ProjectSummary[];
45
+ export declare function listProjects(store: ProjectTagReads): ProjectSummary[];
49
46
  /** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
50
47
  export declare function validateMergeNames(from: string, into: string): string | null;
51
48
  /** Folds project `from` into `into` for one tenant in one transaction; a dry run rolls back and writes nothing, mirrors included. */
52
- export declare function mergeProjects(db: DatabaseSyncLike, hippoRoot: string, opts: {
53
- tenantId: string;
49
+ export declare function mergeProjects(store: ProjectTagStore, opts: {
54
50
  from: string;
55
51
  into: string;
56
52
  dryRun: boolean;
57
53
  }): MergeResult;
58
- /** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
59
- export declare function namesFoldedInto(db: DatabaseSyncLike, tenantId: string, names: readonly string[]): string[];
60
54
  /** Reads only, so doctor and a dry run take no write lock; merged rows are planned before any fold, so a few may re-tag differently once folds apply. */
61
- export declare function planProjectRepair(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, globalFolds?: boolean): Omit<RepairResult, 'backup'>;
62
- /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then re-tags sleep's user-global merges by their parents; a dry run only plans. */
63
- export declare function repairProjects(db: DatabaseSyncLike, hippoRoot: string, opts: {
64
- tenantId: string;
55
+ export declare function planProjectRepair(store: ProjectTagReads, hippoRoot: string, globalFolds?: boolean): Omit<RepairResult, 'backup'>;
56
+ /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
57
+ * re-tags sleep's user-global merges by their parents; a dry run only plans. */
58
+ export declare function repairProjects(store: ProjectTagStore, opts: {
65
59
  dryRun: boolean;
66
60
  globalFolds?: boolean;
67
61
  }): RepairResult;
68
- /**
69
- * Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
70
- * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
71
- */
72
- export declare function repairOnceOnSleep(db: DatabaseSyncLike, hippoRoot: string, tenantId: string): RepairResult | null;
62
+ /** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
63
+ * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted. */
64
+ export declare function repairOnceOnSleep(store: ProjectTagStore): RepairResult | null;
73
65
  //# sourceMappingURL=project-merge.d.ts.map
@@ -1,26 +1,14 @@
1
1
  // `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible pass.
2
2
  import * as fs from 'node:fs';
3
3
  import * as path from 'node:path';
4
- import { setAsideRow } from '../agent-memories/apply.js';
5
4
  import { transcriptNotesProject } from '../agent-memories/claude-code.js';
6
5
  import { containerId, containerPrefix } from '../agent-memories/source.js';
6
+ import { foldEdges, foldedInto } from '../agent-memories/project-folds.js';
7
7
  import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from '../core/agent-memory-tools.js';
8
- import { appendAuditEvent, queryAuditEvents } from '../store/audit.js';
9
8
  import { isSharedStore } from '../core/config.js';
10
- import { withTrialScope, withWriteScope } from '../db/index.js';
11
- import { withBackup } from '../db/backup.js';
12
- import { getMeta, setMeta } from '../db/meta.js';
13
- import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from '../store/dormant.js';
14
9
  import { processEnv } from '../util/env.js';
15
- import { calculateStrength } from '../core/memory.js';
16
- import { isObjectLike, isStringValue } from '../core/capture-contract.js';
17
10
  import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
18
11
  import { duplicateKey } from '../util/same-text.js';
19
- import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from '../store/compactions.js';
20
- import { removeEntryMirrors } from '../store/mirrors.js';
21
- import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from '../store/entry-writes.js';
22
- import { selectAllEntries, selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
23
- const ACTOR = 'cli';
24
12
  function isImport(entry) {
25
13
  return entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX);
26
14
  }
@@ -29,8 +17,8 @@ function toolTag(source) {
29
17
  return AGENT_MEMORY_TOOLS.find((t) => t.id === id)?.tag ?? null;
30
18
  }
31
19
  /** Live rows per project name, newest write first, with how many of its imported notes are copies held elsewhere. */
32
- export function listProjects(db, tenantId) {
33
- const live = selectAllEntries(db, tenantId).filter((e) => !e.superseded_by);
20
+ export function listProjects(store) {
21
+ const live = store.entries().filter((e) => !e.superseded_by);
34
22
  const byOrigin = new Map();
35
23
  const holders = new Map();
36
24
  for (const e of live) {
@@ -51,9 +39,6 @@ export function listProjects(db, tenantId) {
51
39
  };
52
40
  }).sort((a, b) => b.newest.localeCompare(a.newest));
53
41
  }
54
- function inTransaction(db, dryRun, body) {
55
- return dryRun ? withTrialScope(db, 'merge_projects', body) : withWriteScope(db, 'merge_projects', body);
56
- }
57
42
  /** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
58
43
  export function validateMergeNames(from, into) {
59
44
  if (from.trim() === '' || into.trim() === '')
@@ -63,23 +48,19 @@ export function validateMergeNames(from, into) {
63
48
  return null;
64
49
  }
65
50
  /** Folds project `from` into `into` for one tenant in one transaction; a dry run rolls back and writes nothing, mirrors included. */
66
- export function mergeProjects(db, hippoRoot, opts) {
51
+ export function mergeProjects(store, opts) {
67
52
  const refusal = validateMergeNames(opts.from, opts.into);
68
53
  if (refusal)
69
54
  throw new Error(refusal);
70
- const { tenantId, from, into, dryRun } = opts;
71
- const fold = (backup) => inTransaction(db, dryRun, () => {
72
- const folded = foldInTx(db, tenantId, from, into);
73
- appendAuditEvent(db, { tenantId, actor: ACTOR, op: 'project_merge', metadata: { from, into, backup, ...folded } });
74
- return { from, into, ...folded, backup };
55
+ const { from, into, dryRun } = opts;
56
+ return store.rewrite({ dryRun, backupLabel: 'before-merge' }, (tx, backup) => {
57
+ const folded = foldInTx(tx, from, into);
58
+ tx.audit('project_merge', { from, into, backup, ...folded });
59
+ return { result: { from, into, ...folded, backup }, rewrite: folded.restamped, purge: folded.setAside };
75
60
  });
76
- const result = dryRun ? fold(null) : withBackup(db, hippoRoot, 'before-merge', fold);
77
- if (!dryRun)
78
- refreshMirrors(db, hippoRoot, tenantId, result.restamped, result.setAside);
79
- return result;
80
61
  }
81
- function foldInTx(db, tenantId, from, into) {
82
- const all = selectAllEntries(db, tenantId);
62
+ function foldInTx(tx, from, into) {
63
+ const all = tx.entries();
83
64
  const rows = all.filter((e) => e.origin_project === from);
84
65
  // The sync renames the rest to `into`'s prefix and keeps their ids; only a note `into` already holds would show twice.
85
66
  const held = new Set(all.filter((e) => e.origin_project === into && !e.superseded_by && isImport(e)).map(noteKey));
@@ -88,20 +69,20 @@ function foldInTx(db, tenantId, from, into) {
88
69
  const tag = toolTag(row.source);
89
70
  if (!isImport(row) || row.superseded_by || row.kind === 'raw' || tag === null || !held.has(noteKey(row)))
90
71
  continue;
91
- if (setAsideRow(db, tag, { ...row, origin_project: into }, 'project-merge').kind === 'dormant')
72
+ if (tx.setAside(tag, { ...row, origin_project: into }, 'project-merge').kind === 'dormant')
92
73
  setAside.push(row.id);
93
74
  }
94
75
  const gone = new Set(setAside);
95
76
  const restamped = rows.filter((e) => !gone.has(e.id)).map((e) => e.id);
96
- restampOriginProjectAt(db, tenantId, from, into);
77
+ tx.restampOrigin(from, into);
97
78
  const dormantRestamped = [];
98
- for (const snap of listDormantSnapshots(db, tenantId)) {
79
+ for (const snap of tx.dormant()) {
99
80
  if (snap.entry.origin_project !== from || gone.has(snap.entry.id))
100
81
  continue;
101
- replaceDormantEntry(db, tenantId, snap.entry.id, { ...snap.entry, origin_project: into });
82
+ tx.replaceDormant(snap.entry.id, { ...snap.entry, origin_project: into });
102
83
  dormantRestamped.push(snap.entry.id);
103
84
  }
104
- const compactions = restampCompactionOrigin(db, tenantId, from, into);
85
+ const compactions = tx.restampCompactions(from, into);
105
86
  return { setAside, restamped, dormantRestamped, compactions };
106
87
  }
107
88
  /** Tool, note key and hash of an import, without the container, whose id hashes the project name. */
@@ -110,19 +91,20 @@ function noteKey(entry) {
110
91
  return `${rest.split(':')[0]}:${rest.slice(rest.indexOf('/') + 1)}`;
111
92
  }
112
93
  /** Live imports under a project name whose exact text a user-global import holds: a session folder's notes stamped with the folder it ended in. */
113
- function importCopies(db, tenantId) {
114
- const live = selectAllEntries(db, tenantId).filter((e) => !e.superseded_by && isImport(e));
94
+ function importCopies(store) {
95
+ const live = store.entries().filter((e) => !e.superseded_by && isImport(e));
115
96
  const userGlobal = new Set(live.filter((e) => e.origin_project === '').map((e) => duplicateKey(e.content)));
116
97
  return live.filter((e) => e.origin_project && e.kind !== 'raw' && !e.pinned && toolTag(e.source) !== null && userGlobal.has(duplicateKey(e.content)));
117
98
  }
118
- /** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
119
- function strayImports(db, hippoRoot, tenantId) {
120
- const copies = importCopies(db, tenantId);
99
+ /** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
100
+ * notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
101
+ function strayImports(store, hippoRoot) {
102
+ const copies = importCopies(store);
121
103
  if (!isGlobalStoreRoot(hippoRoot))
122
104
  return copies;
123
105
  const machine = { platform: process.platform, env: processEnv() };
124
106
  const { platform } = machine;
125
- const sessions = compactionTranscripts(db, tenantId);
107
+ const sessions = store.compactionTranscripts();
126
108
  const owners = new Map();
127
109
  for (const { transcript, cwd } of sessions) {
128
110
  const project = transcriptNotesProject(transcript, cwd, machine);
@@ -133,9 +115,9 @@ function strayImports(db, hippoRoot, tenantId) {
133
115
  owners.set(dir, ids.set(project.name, [...new Set([...(ids.get(project.name) ?? []), ...projectNames(project)])]));
134
116
  }
135
117
  const tool = toolSourcePrefix('claude-code');
136
- const live = selectLiveEntriesBySourcePrefix(db, tenantId, tool).filter((e) => e.kind !== 'raw' && !e.pinned);
118
+ const live = store.liveEntriesBySourcePrefix(tool).filter((e) => e.kind !== 'raw' && !e.pinned);
137
119
  const origins = new Set(live.map((e) => e.origin_project ?? ''));
138
- const edges = foldEdges(db, tenantId);
120
+ const edges = foldEdges(store);
139
121
  const right = new Set();
140
122
  const wrong = new Set();
141
123
  for (const [dir, ids] of owners) {
@@ -153,12 +135,12 @@ function strayImports(db, hippoRoot, tenantId) {
153
135
  return [...misfiled, ...copies.filter((e) => !seen.has(e.id) && !right.has(prefix(e)))];
154
136
  }
155
137
  /** The global store reads each name's recorded session folders, where a compaction's name came from its cwd; a project store folds only its own folder name. */
156
- function planFolds(db, hippoRoot, tenantId, globalFolds) {
138
+ function planFolds(store, hippoRoot, globalFolds) {
157
139
  // A name someone merged into by hand stays: undoing their choice would rest on the resolver alone.
158
- const chosen = new Set(queryAuditEvents(db, { tenantId, op: 'project_merge', limit: 10000 }).map((e) => e.metadata.into));
140
+ const chosen = new Set(store.auditEvents('project_merge').map((e) => e.metadata.into));
159
141
  if (!isGlobalStoreRoot(hippoRoot))
160
- return { folds: ownLegacyFold(db, hippoRoot, tenantId).filter((f) => !chosen.has(f.from)), collisions: [] };
161
- const rows = compactionOriginsWithCwd(db, tenantId);
142
+ return { folds: ownLegacyFold(store, hippoRoot).filter((f) => !chosen.has(f.from)), collisions: [] };
143
+ const rows = store.compactionOriginsWithCwd();
162
144
  const today = new Map();
163
145
  for (const { origin, cwd } of rows) {
164
146
  if (fs.existsSync(cwd))
@@ -180,58 +162,29 @@ function planFolds(db, hippoRoot, tenantId, globalFolds) {
180
162
  return { folds: globalFolds ? folds.filter((f) => !sources.has(f.into)) : [], collisions };
181
163
  }
182
164
  /** A project store's rows, dormant snapshots and compaction records written before its id existed carry its folder name. */
183
- function ownLegacyFold(db, hippoRoot, tenantId) {
165
+ function ownLegacyFold(store, hippoRoot) {
184
166
  // A shared store's rows carry their callers' names, so one matching its folder's is a member's project, not a legacy tag.
185
167
  if (isSharedStore(hippoRoot))
186
168
  return [];
187
169
  const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
188
170
  if (legacyName === '' || legacyName === name)
189
171
  return [];
190
- const held = holdsOrigin(db, 'memories', tenantId, legacyName) || holdsOrigin(db, 'compactions', tenantId, legacyName) || listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
172
+ const held = store.holdsOrigin('memories', legacyName)
173
+ || store.holdsOrigin('compactions', legacyName)
174
+ || store.dormant().some((s) => s.entry.origin_project === legacyName);
191
175
  return held ? [{ from: legacyName, into: name }] : [];
192
176
  }
193
- function foldOf(value) {
194
- if (!isObjectLike(value) || Array.isArray(value))
195
- return [];
196
- const { from, into } = value;
197
- return isStringValue(from) && isStringValue(into) ? [{ from, into }] : [];
198
- }
199
- function foldEdges(db, tenantId) {
200
- return [
201
- ...queryAuditEvents(db, { tenantId, op: 'project_merge', limit: 10000 }).flatMap((e) => foldOf(e.metadata)),
202
- ...queryAuditEvents(db, { tenantId, op: 'project_repair', limit: 10000 })
203
- .flatMap((e) => (Array.isArray(e.metadata.folds) ? e.metadata.folds.flatMap(foldOf) : [])),
204
- ];
205
- }
206
- function foldedInto(edges, names) {
207
- const seen = new Set(names);
208
- let grew = true;
209
- while (grew) {
210
- grew = false;
211
- for (const { from, into } of edges) {
212
- if (!seen.has(into) || seen.has(from))
213
- continue;
214
- seen.add(from);
215
- grew = true;
216
- }
217
- }
218
- return [...seen].filter((n) => !names.includes(n));
219
- }
220
- /** Names folded, directly or through others, into one of `names`; the sync moves imports still filed under them. */
221
- export function namesFoldedInto(db, tenantId, names) {
222
- return foldedInto(foldEdges(db, tenantId), names);
223
- }
224
177
  /** Reads only, so doctor and a dry run take no write lock; merged rows are planned before any fold, so a few may re-tag differently once folds apply. */
225
- export function planProjectRepair(db, hippoRoot, tenantId, globalFolds = true) {
226
- const { folds, collisions } = planFolds(db, hippoRoot, tenantId, globalFolds);
227
- return { copies: strayImports(db, hippoRoot, tenantId).map((e) => e.id), folds, collisions, ...planUserGlobalRepair(db, tenantId, folds) };
178
+ export function planProjectRepair(store, hippoRoot, globalFolds = true) {
179
+ const { folds, collisions } = planFolds(store, hippoRoot, globalFolds);
180
+ return { copies: strayImports(store, hippoRoot).map((e) => e.id), folds, collisions, ...planUserGlobalRepair(store, folds) };
228
181
  }
229
182
  /** Parents read with `folds` already applied, so a plan matches what apply does after folding. */
230
- function planUserGlobalRepair(db, tenantId, folds) {
231
- const all = selectAllEntries(db, tenantId);
183
+ function planUserGlobalRepair(store, folds) {
184
+ const all = store.entries();
232
185
  const renamed = new Map(folds.map((f) => [f.from, f.into]));
233
186
  const after = (origin) => (origin ? renamed.get(origin) ?? origin : origin ?? null);
234
- const origins = new Map(listDormantSnapshots(db, tenantId).map((s) => [s.entry.id, after(s.entry.origin_project)]));
187
+ const origins = new Map(store.dormant().map((s) => [s.entry.id, after(s.entry.origin_project)]));
235
188
  for (const e of all)
236
189
  origins.set(e.id, after(e.origin_project));
237
190
  const toProject = [];
@@ -253,62 +206,47 @@ function planUserGlobalRepair(db, tenantId, folds) {
253
206
  }
254
207
  return { toProject, setAside, untraced };
255
208
  }
256
- /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then re-tags sleep's user-global merges by their parents; a dry run only plans. */
257
- export function repairProjects(db, hippoRoot, opts) {
258
- const { tenantId, dryRun, globalFolds = true } = opts;
209
+ /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
210
+ * re-tags sleep's user-global merges by their parents; a dry run only plans. */
211
+ export function repairProjects(store, opts) {
212
+ const { dryRun, globalFolds = true } = opts;
213
+ const { hippoRoot } = store;
259
214
  if (dryRun)
260
- return { ...planProjectRepair(db, hippoRoot, tenantId, globalFolds), backup: null };
261
- const { result, rewrite, purge } = withBackup(db, hippoRoot, 'before-repair', (backup) => inTransaction(db, false, () => {
215
+ return { ...planProjectRepair(store, hippoRoot, globalFolds), backup: null };
216
+ return store.rewrite({ dryRun: false, backupLabel: 'before-repair' }, (tx, backup) => {
262
217
  const copies = [];
263
- for (const row of strayImports(db, hippoRoot, tenantId)) {
218
+ for (const row of strayImports(tx, hippoRoot)) {
264
219
  const tag = toolTag(row.source);
265
- if (tag !== null && setAsideRow(db, tag, row, 'project-repair').kind === 'dormant')
220
+ if (tag !== null && tx.setAside(tag, row, 'project-repair').kind === 'dormant')
266
221
  copies.push(row.id);
267
222
  }
268
- const { folds, collisions } = planFolds(db, hippoRoot, tenantId, globalFolds);
269
- const folded = folds.map((f) => foldInTx(db, tenantId, f.from, f.into));
270
- const plan = planUserGlobalRepair(db, tenantId, []);
271
- stampOriginProjectsAt(db, tenantId, plan.toProject);
272
- const aside = new Set(plan.setAside);
223
+ const { folds, collisions } = planFolds(tx, hippoRoot, globalFolds);
224
+ const folded = folds.map((f) => foldInTx(tx, f.from, f.into));
225
+ const plan = planUserGlobalRepair(tx, []);
226
+ tx.stampOrigins(plan.toProject);
273
227
  const now = new Date();
274
- for (const row of selectAllEntries(db, tenantId).filter((e) => aside.has(e.id))) {
275
- insertDormantRow(db, { entry: row, strength: calculateStrength(row, now), reason: 'project-repair', dormantAt: now.toISOString() });
276
- deleteEntryRowInTx(db, row, ACTOR);
277
- }
278
- appendAuditEvent(db, { tenantId, actor: ACTOR, op: 'project_repair', metadata: { backup, copies, folds, folded, ...plan } });
228
+ for (const row of tx.entriesByIds(plan.setAside).values())
229
+ tx.retire(row, 'project-repair', now);
230
+ tx.audit('project_repair', { backup, copies, folds, folded, ...plan });
279
231
  return {
280
232
  result: { copies, folds, collisions, ...plan, backup },
281
233
  rewrite: [...plan.toProject.map((r) => r.id), ...folded.flatMap((f) => f.restamped)],
282
234
  purge: [...copies, ...plan.setAside, ...folded.flatMap((f) => f.setAside)],
283
235
  };
284
- }));
285
- refreshMirrors(db, hippoRoot, tenantId, rewrite, purge);
286
- return result;
236
+ });
287
237
  }
288
- const AUTO_REPAIR_META_KEY = 'project_repair_auto';
289
238
  /** True when a repair would change nothing. */
290
239
  function repairIsEmpty(r) {
291
240
  return r.copies.length + r.folds.length + r.toProject.length + r.setAside.length === 0;
292
241
  }
293
- /**
294
- * Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
295
- * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
296
- */
297
- export function repairOnceOnSleep(db, hippoRoot, tenantId) {
298
- if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
242
+ /** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
243
+ * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted. */
244
+ export function repairOnceOnSleep(store) {
245
+ if (store.repairedOnce())
299
246
  return null;
300
- const plan = planProjectRepair(db, hippoRoot, tenantId, false);
301
- const result = repairIsEmpty(plan) ? null : repairProjects(db, hippoRoot, { tenantId, dryRun: false, globalFolds: false });
302
- setMeta(db, AUTO_REPAIR_META_KEY, '1');
247
+ const plan = planProjectRepair(store, store.hippoRoot, false);
248
+ const result = repairIsEmpty(plan) ? null : repairProjects(store, { dryRun: false, globalFolds: false });
249
+ store.markRepairedOnce();
303
250
  return result;
304
251
  }
305
- /** After commit, as the agent memory sync does: a stale mirror would bring the old tag back on the next rebuild. */
306
- function refreshMirrors(db, hippoRoot, tenantId, rewrite, purge) {
307
- const ids = new Set(rewrite);
308
- for (const entry of selectAllEntries(db, tenantId))
309
- if (ids.has(entry.id))
310
- writeEntryMirrors(hippoRoot, entry);
311
- for (const id of purge)
312
- removeEntryMirrors(hippoRoot, id);
313
- }
314
252
  //# sourceMappingURL=project-merge.js.map
@@ -0,0 +1,60 @@
1
+ import { MemoryEntry } from '../core/memory.js';
2
+ import { type SearchResult, type ResultCost } from '../core/search-types.js';
3
+ import { type HybridVectorCandidates } from '../search/vector.js';
4
+ export declare function logEmbedAllFailure<E>(caller: string, err: E): void;
5
+ export interface SearchOptions {
6
+ budget?: number;
7
+ now?: Date;
8
+ minResults?: number;
9
+ /** Tenant scope for both stores. Undefined = no filter (legacy single-tenant). */
10
+ tenantId?: string;
11
+ }
12
+ /** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
13
+ * Returns results sorted by adjusted score within the combined token budget. */
14
+ export declare function searchBoth(query: string, localRoot: string, globalRoot: string, options?: SearchOptions): SearchResult[];
15
+ export interface HybridSearchOptions extends SearchOptions {
16
+ embeddingWeight?: number;
17
+ explain?: boolean;
18
+ mmr?: boolean;
19
+ mmrLambda?: number;
20
+ /** Multiplier applied to local-store scores when merging with global.
21
+ * Defaults to 1.2. Use 1.0 to remove the local bias for eval comparisons. */
22
+ localBump?: number;
23
+ /** Active scope for scope-boost scoring. Auto-detected if not provided. */
24
+ scope?: string | null;
25
+ /** Include superseded memories in results. Default false. */
26
+ includeSuperseded?: boolean;
27
+ /** Filter to memories current at this ISO date string. */
28
+ asOf?: string;
29
+ /** Budget cost per result, spent the same way in each store and in the merged list. */
30
+ cost?: ResultCost;
31
+ /** Propagated to underlying hybridSearch calls.
32
+ * Per-call > env HIPPO_SUMMARY_DEBOOST > 0.85 default. */
33
+ summaryDeboost?: number;
34
+ /** Propagated. Default true (1.05 boost if rebuilt within 7d). */
35
+ summaryFreshness?: boolean;
36
+ /** Optional admission predicate applied to the loaded candidates of BOTH stores before ranking, cross-store dedupe and budgeting,
37
+ * so an excluded row cannot shadow its admitted duplicate or saturate the budget. Undefined (recall paths never set it) means no filter. */
38
+ entryFilter?: (entry: MemoryEntry) => boolean;
39
+ /** Recall scope filter for `searchBothHybrid`: absent is the only unfiltered mode; present uses `loadRecallSearchEntries` plus a JS post-filter.
40
+ * `{}` = default-deny (legacy and `<source>:private:*` excluded); `{ requested: 'X' }` = exact; `{ requested: 'X', additive: true }` = default plus X.
41
+ * An object, not `string | null`, because the sibling `scope` option already gives null a different meaning.
42
+ * Do not pass `{}` casually from non-recall paths. */
43
+ recallScope?: {
44
+ requested?: string;
45
+ additive?: boolean;
46
+ ownScope?: string;
47
+ };
48
+ }
49
+ /** Hybrid search across both local and global stores, using embeddings when available.
50
+ * Async version of searchBoth that calls hybridSearch instead of search. */
51
+ export declare function searchBothHybrid(query: string, localRoot: string, globalRoot: string, options?: HybridSearchOptions): Promise<SearchResult[]>;
52
+ /** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
53
+ export declare function rankBothStores(query: string, roots: {
54
+ local: string;
55
+ global: string;
56
+ }, entries: {
57
+ local: MemoryEntry[];
58
+ global: MemoryEntry[];
59
+ }, vectorCandidates: HybridVectorCandidates, options?: HybridSearchOptions): Promise<SearchResult[]>;
60
+ //# sourceMappingURL=search-both.d.ts.map