hippo-memory 1.69.0 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -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 '../store/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 '../store/embeddings/index.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,80 @@
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 { writeEntry } from '../store/entry-writes.js';
7
+ import { loadAllEntries } from '../store/entry-reads.js';
8
+ import { classifyOriginProject, resolveProjectIdentity } from '../core/project-identity.js';
9
+ import { isSharedStore } from '../core/config.js';
10
+ import { detectSecret } from '../util/secret-detect.js';
11
+ import { RejectedValueError } from '../store/rejection.js';
12
+ import { embedAll } from '../store/embeddings/index.js';
13
+ import { log } from '../util/log.js';
14
+ import { logEmbedAllFailure } from './search-both.js';
15
+ /** 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).
16
+ * Returns the count of newly copied entries. */
17
+ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
18
+ if (isSharedStore(localRoot)) {
19
+ throw new BadRequestError(`Refusing to sync into ${localRoot}: a shared store takes no copies of a personal global store, whose rows would reach every member.`);
20
+ }
21
+ if (!fs.existsSync(globalRoot))
22
+ return 0;
23
+ // Host-wide read: the global union is copied into a tenant-scoped local store, and writeEntry carries the tenant if the local-root context has one.
24
+ const globalEntries = loadAllEntries(globalRoot);
25
+ const textKey = (e) => `${e.tenantId}\n${e.content}`;
26
+ const localEntries = loadAllEntries(localRoot);
27
+ const localIds = new Set(localEntries.map((e) => e.id));
28
+ const localText = new Set(localEntries.map(textKey));
29
+ // Syncing down must not re-import what ambient context excludes: other-project rows are skipped by default and secret rows never copied.
30
+ // origin_project is preserved on the copy (writeEntry stamps it only when missing).
31
+ const currentProject = resolveProjectIdentity(path.dirname(path.resolve(localRoot)));
32
+ let count = 0;
33
+ // A locally rejected value must not come back through sync down: caught per item, printed as one line.
34
+ let rejected = 0;
35
+ for (const entry of globalEntries) {
36
+ // Skip if already present by ID
37
+ if (localIds.has(entry.id))
38
+ continue;
39
+ // Only the global store's user pass sets an imported note's row aside, so a copy would outlive the note.
40
+ if (entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX))
41
+ continue;
42
+ if (localText.has(textKey(entry)))
43
+ continue;
44
+ if (detectSecret(entry).flagged)
45
+ continue;
46
+ if (!opts.includeCrossProject && classifyOriginProject(entry.origin_project, currentProject) === 'cross-project')
47
+ continue;
48
+ if (!writeUnlessRejected(localRoot, entry)) {
49
+ rejected++;
50
+ continue;
51
+ }
52
+ localText.add(textKey(entry));
53
+ count++;
54
+ }
55
+ finishSyncDown(localRoot, count, rejected);
56
+ return count;
57
+ }
58
+ /** False when the local store rejects the value; any other failure still throws. */
59
+ function writeUnlessRejected(localRoot, entry) {
60
+ try {
61
+ writeEntry(localRoot, entry);
62
+ return true;
63
+ }
64
+ catch (err) {
65
+ if (err instanceof RejectedValueError)
66
+ return false;
67
+ throw err;
68
+ }
69
+ }
70
+ function finishSyncDown(localRoot, count, rejected) {
71
+ if (rejected > 0) {
72
+ log.warn(`syncGlobalToLocal: skipped ${rejected} rejected value(s) (run \`hippo unreject\` on the local store to allow).`);
73
+ }
74
+ // Batch producer: one embedAll() on the destination rather than an
75
+ // embedMemory() per copied row (same batching invariant as autoShare).
76
+ if (count > 0) {
77
+ void embedAll(localRoot).catch((err) => logEmbedAllFailure('syncGlobalToLocal', err));
78
+ }
79
+ }
80
+ //# sourceMappingURL=global-sync.js.map
@@ -1,4 +1,4 @@
1
- import type { DatabaseSyncLike } from './db.js';
1
+ import { type DatabaseSyncLike } from '../db/index.js';
2
2
  export interface ProjectSummary {
3
3
  /** '' is user-global, null is unknown; neither can be merged. */
4
4
  readonly origin: string | null;
@@ -59,15 +59,14 @@ export declare function mergeProjects(db: DatabaseSyncLike, hippoRoot: string, o
59
59
  export declare function namesFoldedInto(db: DatabaseSyncLike, tenantId: string, names: readonly string[]): string[];
60
60
  /** 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
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. */
62
+ /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
63
+ * re-tags sleep's user-global merges by their parents; a dry run only plans. */
63
64
  export declare function repairProjects(db: DatabaseSyncLike, hippoRoot: string, opts: {
64
65
  tenantId: string;
65
66
  dryRun: boolean;
66
67
  globalFolds?: boolean;
67
68
  }): 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
- */
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. */
72
71
  export declare function repairOnceOnSleep(db: DatabaseSyncLike, hippoRoot: string, tenantId: string): RepairResult | null;
73
72
  //# sourceMappingURL=project-merge.d.ts.map
@@ -1,23 +1,25 @@
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
- import { transcriptNotesProject } from './agent-memories/claude-code.js';
6
- import { containerId, containerPrefix } from './agent-memories/source.js';
7
- import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memories/tools.js';
8
- import { appendAuditEvent, queryAuditEvents } from './audit.js';
9
- import { isSharedStore } from './config.js';
10
- import { withBackup } from './db/backup.js';
11
- import { getMeta, setMeta } from './db/meta.js';
12
- import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from './dormant.js';
13
- import { processEnv } from './env.js';
14
- import { calculateStrength } from './memory.js';
15
- import { isObjectLike, isStringValue } from './capture-contract.js';
16
- import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from './project-identity.js';
17
- import { duplicateKey } from './same-text.js';
18
- import { removeEntryMirrors } from './store/mirrors.js';
19
- import { deleteEntryRowInTx, writeEntryMirrors } from './store/entry-writes.js';
20
- import { selectAllEntries, selectLiveEntriesBySourcePrefix } from './store/entry-reads.js';
4
+ import { setAsideRow } from '../agent-memories/apply.js';
5
+ import { transcriptNotesProject } from '../agent-memories/claude-code.js';
6
+ import { containerId, containerPrefix } from '../agent-memories/source.js';
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
+ 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
+ import { processEnv } from '../util/env.js';
15
+ import { calculateStrength } from '../core/memory.js';
16
+ import { isObjectLike, isStringValue } from '../core/capture-contract.js';
17
+ import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
18
+ 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';
21
23
  const ACTOR = 'cli';
22
24
  function isImport(entry) {
23
25
  return entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX);
@@ -50,19 +52,7 @@ export function listProjects(db, tenantId) {
50
52
  }).sort((a, b) => b.newest.localeCompare(a.newest));
51
53
  }
52
54
  function inTransaction(db, dryRun, body) {
53
- db.exec(dryRun ? 'BEGIN' : 'BEGIN IMMEDIATE');
54
- try {
55
- const out = body();
56
- db.exec(dryRun ? 'ROLLBACK' : 'COMMIT');
57
- return out;
58
- }
59
- catch (err) {
60
- try {
61
- db.exec('ROLLBACK');
62
- }
63
- catch { /* already rolled back; keep the original error */ }
64
- throw err;
65
- }
55
+ return dryRun ? withTrialScope(db, 'merge_projects', body) : withWriteScope(db, 'merge_projects', body);
66
56
  }
67
57
  /** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
68
58
  export function validateMergeNames(from, into) {
@@ -103,8 +93,7 @@ function foldInTx(db, tenantId, from, into) {
103
93
  }
104
94
  const gone = new Set(setAside);
105
95
  const restamped = rows.filter((e) => !gone.has(e.id)).map((e) => e.id);
106
- db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
107
- .run(into, tenantId, from);
96
+ restampOriginProjectAt(db, tenantId, from, into);
108
97
  const dormantRestamped = [];
109
98
  for (const snap of listDormantSnapshots(db, tenantId)) {
110
99
  if (snap.entry.origin_project !== from || gone.has(snap.entry.id))
@@ -112,8 +101,7 @@ function foldInTx(db, tenantId, from, into) {
112
101
  replaceDormantEntry(db, tenantId, snap.entry.id, { ...snap.entry, origin_project: into });
113
102
  dormantRestamped.push(snap.entry.id);
114
103
  }
115
- const compactions = Number(db.prepare(`UPDATE compactions SET origin_project = ? WHERE tenant_id = ? AND origin_project = ?`)
116
- .run(into, tenantId, from).changes ?? 0);
104
+ const compactions = restampCompactionOrigin(db, tenantId, from, into);
117
105
  return { setAside, restamped, dormantRestamped, compactions };
118
106
  }
119
107
  /** Tool, note key and hash of an import, without the container, whose id hashes the project name. */
@@ -127,16 +115,15 @@ function importCopies(db, tenantId) {
127
115
  const userGlobal = new Set(live.filter((e) => e.origin_project === '').map((e) => duplicateKey(e.content)));
128
116
  return live.filter((e) => e.origin_project && e.kind !== 'raw' && !e.pinned && toolTag(e.source) !== null && userGlobal.has(duplicateKey(e.content)));
129
117
  }
130
- /** 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. */
118
+ /** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
119
+ * notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
131
120
  function strayImports(db, hippoRoot, tenantId) {
132
121
  const copies = importCopies(db, tenantId);
133
122
  if (!isGlobalStoreRoot(hippoRoot))
134
123
  return copies;
135
124
  const machine = { platform: process.platform, env: processEnv() };
136
125
  const { platform } = machine;
137
- // SAFETY: the SELECT names the two columns of the row type.
138
- const sessions = db.prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path IS NOT NULL`)
139
- .all(tenantId);
126
+ const sessions = compactionTranscripts(db, tenantId);
140
127
  const owners = new Map();
141
128
  for (const { transcript, cwd } of sessions) {
142
129
  const project = transcriptNotesProject(transcript, cwd, machine);
@@ -172,9 +159,7 @@ function planFolds(db, hippoRoot, tenantId, globalFolds) {
172
159
  const chosen = new Set(queryAuditEvents(db, { tenantId, op: 'project_merge', limit: 10000 }).map((e) => e.metadata.into));
173
160
  if (!isGlobalStoreRoot(hippoRoot))
174
161
  return { folds: ownLegacyFold(db, hippoRoot, tenantId).filter((f) => !chosen.has(f.from)), collisions: [] };
175
- // SAFETY: the SELECT names the two columns of the row type.
176
- const rows = db.prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' AND cwd IS NOT NULL`)
177
- .all(tenantId);
162
+ const rows = compactionOriginsWithCwd(db, tenantId);
178
163
  const today = new Map();
179
164
  for (const { origin, cwd } of rows) {
180
165
  if (fs.existsSync(cwd))
@@ -203,8 +188,9 @@ function ownLegacyFold(db, hippoRoot, tenantId) {
203
188
  const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
204
189
  if (legacyName === '' || legacyName === name)
205
190
  return [];
206
- const heldIn = (table) => db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, legacyName) !== undefined;
207
- const held = heldIn('memories') || heldIn('compactions') || listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
191
+ const held = holdsOrigin(db, 'memories', tenantId, legacyName)
192
+ || holdsOrigin(db, 'compactions', tenantId, legacyName)
193
+ || listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
208
194
  return held ? [{ from: legacyName, into: name }] : [];
209
195
  }
210
196
  function foldOf(value) {
@@ -270,7 +256,8 @@ function planUserGlobalRepair(db, tenantId, folds) {
270
256
  }
271
257
  return { toProject, setAside, untraced };
272
258
  }
273
- /** 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. */
259
+ /** Sets aside stray imports, folds the names the resolver now maps elsewhere, then
260
+ * re-tags sleep's user-global merges by their parents; a dry run only plans. */
274
261
  export function repairProjects(db, hippoRoot, opts) {
275
262
  const { tenantId, dryRun, globalFolds = true } = opts;
276
263
  if (dryRun)
@@ -285,9 +272,7 @@ export function repairProjects(db, hippoRoot, opts) {
285
272
  const { folds, collisions } = planFolds(db, hippoRoot, tenantId, globalFolds);
286
273
  const folded = folds.map((f) => foldInTx(db, tenantId, f.from, f.into));
287
274
  const plan = planUserGlobalRepair(db, tenantId, []);
288
- const stamp = db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND id = ?`);
289
- for (const { id, origin } of plan.toProject)
290
- stamp.run(origin, tenantId, id);
275
+ stampOriginProjectsAt(db, tenantId, plan.toProject);
291
276
  const aside = new Set(plan.setAside);
292
277
  const now = new Date();
293
278
  for (const row of selectAllEntries(db, tenantId).filter((e) => aside.has(e.id))) {
@@ -309,10 +294,8 @@ const AUTO_REPAIR_META_KEY = 'project_repair_auto';
309
294
  function repairIsEmpty(r) {
310
295
  return r.copies.length + r.folds.length + r.toProject.length + r.setAside.length === 0;
311
296
  }
312
- /**
313
- * Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
314
- * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
315
- */
297
+ /** Sleep runs repair once per store, so an upgrade needs no command. Global-store folds stay
298
+ * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted. */
316
299
  export function repairOnceOnSleep(db, hippoRoot, tenantId) {
317
300
  if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
318
301
  return null;
@@ -0,0 +1,7 @@
1
+ /** Detect the current operational scope from env (HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL); returns the name without prefix, or null.
2
+ * Pure env reads, no I/O, so it is safe on hot paths such as the UserPromptSubmit hook. */
3
+ export declare function detectScope(): string | null;
4
+ /** Compute scope match between a memory's scope tags and the active scope.
5
+ * Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side). */
6
+ export declare function scopeMatch(memoryTags: string[], activeScope: string | null): -1 | 0 | 1;
7
+ //# sourceMappingURL=scope.d.ts.map
@@ -1,11 +1,6 @@
1
- import { envGstackSkill, envOpenclawSkill, envScope } from './env.js';
2
- /**
3
- * Detect the current operational scope from environment signals.
4
- * Returns a scope name string (no prefix), or null if no scope detected.
5
- * Priority: HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL.
6
- *
7
- * Pure env var reads: no I/O, safe to call from hot paths (e.g. UserPromptSubmit hook).
8
- */
1
+ import { envGstackSkill, envOpenclawSkill, envScope } from '../util/env.js';
2
+ /** Detect the current operational scope from env (HIPPO_SCOPE > GSTACK_SKILL > OPENCLAW_SKILL); returns the name without prefix, or null.
3
+ * Pure env reads, no I/O, so it is safe on hot paths such as the UserPromptSubmit hook. */
9
4
  export function detectScope() {
10
5
  const explicit = envScope();
11
6
  if (explicit && explicit.trim())
@@ -18,10 +13,8 @@ export function detectScope() {
18
13
  return openclawSkill.trim();
19
14
  return null;
20
15
  }
21
- /**
22
- * Compute scope match between a memory's scope tags and the active scope.
23
- * Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side).
24
- */
16
+ /** Compute scope match between a memory's scope tags and the active scope.
17
+ * Returns: 1 if matching scope, -1 if mismatching scope, 0 if neutral (no scope on either side). */
25
18
  export function scopeMatch(memoryTags, activeScope) {
26
19
  const scopeTags = memoryTags.filter(t => t.startsWith('scope:'));
27
20
  if (scopeTags.length === 0)
@@ -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
@@ -0,0 +1,138 @@
1
+ // Search across the local and global stores, merged into one ranked, budgeted list.
2
+ import { compareScoresDesc } from '../core/compare.js';
3
+ import * as fs from 'fs';
4
+ import { loadSearchEntries, loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
5
+ import { passesScopeFilterForRecall, passesCliRecallScopeFilter } from '../store/recall-scope.js';
6
+ import { search } from '../search/bm25-search.js';
7
+ import { hybridSearch } from '../search/hybrid.js';
8
+ import { fitBudget } from '../search/finalize.js';
9
+ import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
10
+ import { startQueryEmbedDeadline } from '../search/vector.js';
11
+ import { evalNow } from '../core/ablation.js';
12
+ import { duplicateKey } from '../util/same-text.js';
13
+ import { errorMessage, log } from '../util/log.js';
14
+ // The rows are already copied; a failed background embed only delays vectors, so it warns instead of throwing.
15
+ export function logEmbedAllFailure(caller, err) {
16
+ log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`);
17
+ }
18
+ /** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
19
+ * Returns results sorted by adjusted score within the combined token budget. */
20
+ export function searchBoth(query, localRoot, globalRoot, options = {}) {
21
+ const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), minResults, tenantId } = options;
22
+ const effectiveMin = minResults ?? 1;
23
+ const localEntries = fs.existsSync(localRoot) ? loadSearchEntries(localRoot, query, undefined, tenantId) : [];
24
+ const globalEntries = fs.existsSync(globalRoot) ? loadSearchEntries(globalRoot, query, undefined, tenantId) : [];
25
+ if (localEntries.length === 0 && globalEntries.length === 0)
26
+ return [];
27
+ // Search each store with full budget, then blend
28
+ const localResults = search(query, localEntries, { budget, now, minResults });
29
+ const globalResults = search(query, globalEntries, { budget, now, minResults });
30
+ const deduped = dedupeByContent(tagLocalAndGlobal(localResults, globalResults));
31
+ // PLAIN stable score sort on purpose: both inputs are deterministically ordered,
32
+ // and an exact tie keeps the LOCAL result ahead of the global one (concat order).
33
+ deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
34
+ // Apply combined token budget (guarantee at least minResults items)
35
+ const results = [];
36
+ let usedTokens = 0;
37
+ for (let i = 0; i < deduped.length; i++) {
38
+ if (results.length >= effectiveMin && usedTokens + deduped[i].tokens > budget)
39
+ continue;
40
+ usedTokens += deduped[i].tokens;
41
+ results.push(deduped[i]);
42
+ }
43
+ return results;
44
+ }
45
+ function tagLocalAndGlobal(localResults, globalResults) {
46
+ // Tag global results. Local memories get a configurable priority bump.
47
+ return [
48
+ ...localResults.map((r) => ({
49
+ ...r,
50
+ isGlobal: false,
51
+ score: r.score * DEFAULT_LOCAL_BUMP,
52
+ breakdown: r.breakdown
53
+ ? { ...r.breakdown, sourceBump: DEFAULT_LOCAL_BUMP, final: r.breakdown.final * DEFAULT_LOCAL_BUMP }
54
+ : undefined,
55
+ })),
56
+ ...globalResults.map((r) => ({ ...r, isGlobal: true })),
57
+ ];
58
+ }
59
+ function dedupeByContent(tagged) {
60
+ // Remove duplicates by content (local/global IDs differ after promote/share)
61
+ const seen = new Set();
62
+ return tagged.filter((r) => {
63
+ const key = duplicateKey(r.entry.content);
64
+ if (seen.has(key))
65
+ return false;
66
+ seen.add(key);
67
+ return true;
68
+ });
69
+ }
70
+ /** Hybrid search across both local and global stores, using embeddings when available.
71
+ * Async version of searchBoth that calls hybridSearch instead of search. */
72
+ export async function searchBothHybrid(query, localRoot, globalRoot, options = {}) {
73
+ const { includeSuperseded, asOf, tenantId, entryFilter, recallScope } = options;
74
+ // With an admission filter, lift the per-store candidate cap (default 200) to a bounded 5000: excluded rows could otherwise fill the window first.
75
+ const searchWindow = entryFilter ? 5000 : undefined;
76
+ // Recall mode: push the scope predicate into SQL like api.recall, so quarantine/private rows never enter the candidates, shadow duplicates or use budget.
77
+ // The JS post-filter below is the regex-only `<source>:private:*` half plus defense in depth on exact match.
78
+ const loadEntries = (root) => {
79
+ if (!fs.existsSync(root))
80
+ return [];
81
+ return recallScope
82
+ ? loadRecallSearchEntries(root, query, searchWindow, tenantId, recallScope.requested, recallScope.additive ? 'additive' : 'exact', Boolean(includeSuperseded) || Boolean(asOf), undefined, recallScope.ownScope)
83
+ : loadSearchEntries(root, query, searchWindow, tenantId);
84
+ };
85
+ const passesScope = (e) => !recallScope || (recallScope.additive
86
+ ? passesCliRecallScopeFilter(e.scope ?? null, recallScope.requested) || passesScopeFilterForRecall(e.scope ?? null, undefined, recallScope.ownScope)
87
+ : passesScopeFilterForRecall(e.scope ?? null, recallScope.requested, recallScope.ownScope));
88
+ const admit = (e) => passesScope(e) && (!entryFilter || entryFilter(e));
89
+ const localEntries = loadEntries(localRoot).filter(admit);
90
+ const globalEntries = loadEntries(globalRoot).filter(admit);
91
+ // The vector arm loads under the same SQL rules as loadEntries, then the same JS admission.
92
+ const vectorCandidates = {
93
+ tenantId,
94
+ scope: recallScope ? recallScopeFilter(recallScope.requested, recallScope.additive ? 'additive' : 'exact', recallScope.ownScope) : undefined,
95
+ includeSuperseded: !recallScope || Boolean(includeSuperseded) || Boolean(asOf),
96
+ admit,
97
+ };
98
+ return rankBothStores(query, { local: localRoot, global: globalRoot }, { local: localEntries, global: globalEntries }, vectorCandidates, options);
99
+ }
100
+ /** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
101
+ export async function rankBothStores(query, roots, entries, vectorCandidates, options = {}) {
102
+ const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness } = options;
103
+ if (entries.local.length === 0 && entries.global.length === 0)
104
+ return [];
105
+ // One deadline for both stores, so a provider that stalls on the first is not waited on again for the second.
106
+ const shared = {
107
+ budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness,
108
+ vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
109
+ };
110
+ const localResults = await hybridSearch(query, entries.local, { ...shared, hippoRoot: roots.local });
111
+ const globalResults = await hybridSearch(query, entries.global, { ...shared, hippoRoot: roots.global });
112
+ // Tag global results. Local memories get a configurable priority bump.
113
+ const tagged = [
114
+ ...localResults.map((r) => ({
115
+ ...r,
116
+ isGlobal: false,
117
+ score: r.score * localBump,
118
+ breakdown: r.breakdown
119
+ ? { ...r.breakdown, sourceBump: localBump, final: r.breakdown.final * localBump }
120
+ : undefined,
121
+ })),
122
+ ...globalResults.map((r) => ({ ...r, isGlobal: true })),
123
+ ];
124
+ // Remove duplicates by content (local/global IDs differ after promote/share)
125
+ const seen = new Set();
126
+ const deduped = tagged.filter((r) => {
127
+ const key = duplicateKey(r.entry.content);
128
+ if (seen.has(key))
129
+ return false;
130
+ seen.add(key);
131
+ return true;
132
+ });
133
+ // PLAIN stable score sort on purpose -- see searchBoth above;
134
+ // same rationale (deterministic inputs + stability; local-first on ties).
135
+ deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
136
+ return fitBudget(deduped, budget, minResults ?? 1, cost);
137
+ }
138
+ //# sourceMappingURL=search-both.js.map
@@ -0,0 +1,38 @@
1
+ import { MemoryEntry } from '../core/memory.js';
2
+ /** Tags whose rows only a hand-run share or promote may copy to the global store; derived rows inherit them. */
3
+ export declare const NEVER_AUTO_SHARE_TAGS: ReadonlySet<string>;
4
+ export declare function neverAutoShareTags(sources: readonly MemoryEntry[]): string[];
5
+ /** Tags whose rows sleep keeps as written: never merged, never sent to LLM extraction. Conflict detection keeps its own list. */
6
+ export declare const NO_MERGE_TAGS: ReadonlySet<string>;
7
+ /** Estimate how well a memory would transfer to other projects.
8
+ * Returns 0..1 where >0.5 = good candidate for sharing. */
9
+ export declare function transferScore(entry: MemoryEntry): number;
10
+ /** Share a memory to the global store with attribution (source enriched with project path and timestamp).
11
+ * Returns the new entry, or null if the transfer score is too low. */
12
+ export declare function shareMemory(localRoot: string, id: string, options?: {
13
+ force?: boolean;
14
+ tenantId?: string;
15
+ skipEmbed?: boolean;
16
+ }): MemoryEntry | null;
17
+ /** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or 'promoted:<path>' sources.
18
+ * `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
19
+ export declare function listPeers(globalRoot?: string, tenantId?: string): Array<{
20
+ project: string;
21
+ count: number;
22
+ latest: string;
23
+ }>;
24
+ type AutoShareStats = {
25
+ secretSkipped: number;
26
+ rejectedSkipped?: number;
27
+ neverAutoShareSkipped?: number;
28
+ };
29
+ /** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag; `options.tenantId` scopes the LOCAL read.
30
+ * `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped` rejection refusals (0 under `dryRun`). */
31
+ export declare function autoShare(localRoot: string, options?: {
32
+ minScore?: number;
33
+ dryRun?: boolean;
34
+ tenantId?: string;
35
+ stats?: AutoShareStats;
36
+ }): MemoryEntry[];
37
+ export {};
38
+ //# sourceMappingURL=share.d.ts.map