hippo-memory 2.0.0 → 2.1.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 (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -1,4 +1,5 @@
1
- // `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible pass.
1
+ // `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible
2
+ // pass.
2
3
  import * as fs from 'node:fs';
3
4
  import * as path from 'node:path';
4
5
  import { transcriptNotesProject } from '../agent-memories/claude-code.js';
@@ -41,13 +42,17 @@ export function listProjects(store) {
41
42
  }
42
43
  /** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
43
44
  export function validateMergeNames(from, into) {
44
- if (from.trim() === '' || into.trim() === '')
45
+ if (from.trim() === '' || into.trim() === '') {
45
46
  return 'both project names are required; user-global and unknown rows cannot be merged';
47
+ }
46
48
  if (from === into)
47
49
  return `${from} is already ${into}`;
48
50
  return null;
49
51
  }
50
- /** Folds project `from` into `into` for one tenant in one transaction; a dry run rolls back and writes nothing, mirrors included. */
52
+ /**
53
+ * Folds project `from` into `into` for one tenant in one transaction; a dry run rolls back and writes nothing, mirrors
54
+ * included.
55
+ */
51
56
  export function mergeProjects(store, opts) {
52
57
  const refusal = validateMergeNames(opts.from, opts.into);
53
58
  if (refusal)
@@ -62,7 +67,8 @@ export function mergeProjects(store, opts) {
62
67
  function foldInTx(tx, from, into) {
63
68
  const all = tx.entries();
64
69
  const rows = all.filter((e) => e.origin_project === from);
65
- // The sync renames the rest to `into`'s prefix and keeps their ids; only a note `into` already holds would show twice.
70
+ // The sync renames the rest to `into`'s prefix and keeps their ids; only a note `into` already holds would show
71
+ // twice.
66
72
  const held = new Set(all.filter((e) => e.origin_project === into && !e.superseded_by && isImport(e)).map(noteKey));
67
73
  const setAside = [];
68
74
  for (const row of rows) {
@@ -90,11 +96,18 @@ function noteKey(entry) {
90
96
  const rest = entry.source.slice(AGENT_MEMORY_SOURCE_PREFIX.length);
91
97
  return `${rest.split(':')[0]}:${rest.slice(rest.indexOf('/') + 1)}`;
92
98
  }
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. */
99
+ /**
100
+ * Live imports under a project name whose exact text a user-global import holds: a session folder's notes stamped with
101
+ * the folder it ended in.
102
+ */
94
103
  function importCopies(store) {
95
104
  const live = store.entries().filter((e) => !e.superseded_by && isImport(e));
96
105
  const userGlobal = new Set(live.filter((e) => e.origin_project === '').map((e) => duplicateKey(e.content)));
97
- return live.filter((e) => e.origin_project && e.kind !== 'raw' && !e.pinned && toolTag(e.source) !== null && userGlobal.has(duplicateKey(e.content)));
106
+ return live.filter((e) => e.origin_project &&
107
+ e.kind !== 'raw' &&
108
+ !e.pinned &&
109
+ toolTag(e.source) !== null &&
110
+ userGlobal.has(duplicateKey(e.content)));
98
111
  }
99
112
  /** Imports to set aside. The global store also checks each Claude session folder a compaction recorded: its
100
113
  * notes under any other project are misfiled, edited or not, and a text copy in the right folder is kept. */
@@ -123,28 +136,35 @@ function strayImports(store, hippoRoot) {
123
136
  for (const [dir, ids] of owners) {
124
137
  if (ids.size !== 1)
125
138
  continue;
126
- // Its names before the id, and names folded into it, are the owner's too: the next sync moves those prefixes under the id.
139
+ // Its names before the id, and names folded into it, are the owner's too: the next sync moves those prefixes under
140
+ // the id.
127
141
  const [names] = ids.values();
128
142
  const own = new Set([...names, ...foldedInto(edges, names)]);
129
- for (const origin of new Set([...origins, ...own]))
143
+ for (const origin of new Set([...origins, ...own])) {
130
144
  (own.has(origin) ? right : wrong).add(containerPrefix('claude-code', containerId(dir, 'project', platform, origin)));
145
+ }
131
146
  }
132
147
  const prefix = (e) => e.source.slice(0, e.source.indexOf('/', tool.length) + 1);
133
148
  const misfiled = live.filter((e) => wrong.has(prefix(e)));
134
149
  const seen = new Set(misfiled.map((e) => e.id));
135
150
  return [...misfiled, ...copies.filter((e) => !seen.has(e.id) && !right.has(prefix(e)))];
136
151
  }
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. */
152
+ /**
153
+ * The global store reads each name's recorded session folders, where a compaction's name came from its cwd; a project
154
+ * store folds only its own folder name.
155
+ */
138
156
  function planFolds(store, hippoRoot, globalFolds) {
139
157
  // A name someone merged into by hand stays: undoing their choice would rest on the resolver alone.
140
158
  const chosen = new Set(store.auditEvents('project_merge').map((e) => e.metadata.into));
141
- if (!isGlobalStoreRoot(hippoRoot))
159
+ if (!isGlobalStoreRoot(hippoRoot)) {
142
160
  return { folds: ownLegacyFold(store, hippoRoot).filter((f) => !chosen.has(f.from)), collisions: [] };
161
+ }
143
162
  const rows = store.compactionOriginsWithCwd();
144
163
  const today = new Map();
145
164
  for (const { origin, cwd } of rows) {
146
- if (fs.existsSync(cwd))
165
+ if (fs.existsSync(cwd)) {
147
166
  today.set(origin, (today.get(origin) ?? new Set()).add(resolveProjectIdentity(cwd).name));
167
+ }
148
168
  }
149
169
  const folds = [];
150
170
  const collisions = [];
@@ -161,9 +181,12 @@ function planFolds(store, hippoRoot, globalFolds) {
161
181
  const sources = new Set(folds.map((f) => f.from));
162
182
  return { folds: globalFolds ? folds.filter((f) => !sources.has(f.into)) : [], collisions };
163
183
  }
164
- /** A project store's rows, dormant snapshots and compaction records written before its id existed carry its folder name. */
184
+ /**
185
+ * A project store's rows, dormant snapshots and compaction records written before its id existed carry its folder name.
186
+ */
165
187
  function ownLegacyFold(store, hippoRoot) {
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.
188
+ // A shared store's rows carry their callers' names, so one matching its folder's is a member's project, not a legacy
189
+ // tag.
167
190
  if (isSharedStore(hippoRoot))
168
191
  return [];
169
192
  const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
@@ -174,16 +197,24 @@ function ownLegacyFold(store, hippoRoot) {
174
197
  || store.dormant().some((s) => s.entry.origin_project === legacyName);
175
198
  return held ? [{ from: legacyName, into: name }] : [];
176
199
  }
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. */
200
+ /**
201
+ * 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
202
+ * differently once folds apply.
203
+ */
178
204
  export function planProjectRepair(store, hippoRoot, globalFolds = true) {
179
205
  const { folds, collisions } = planFolds(store, hippoRoot, globalFolds);
180
- return { copies: strayImports(store, hippoRoot).map((e) => e.id), folds, collisions, ...planUserGlobalRepair(store, folds) };
206
+ return {
207
+ copies: strayImports(store, hippoRoot).map((e) => e.id),
208
+ folds,
209
+ collisions,
210
+ ...planUserGlobalRepair(store, folds),
211
+ };
181
212
  }
182
213
  /** Parents read with `folds` already applied, so a plan matches what apply does after folding. */
183
214
  function planUserGlobalRepair(store, folds) {
184
215
  const all = store.entries();
185
216
  const renamed = new Map(folds.map((f) => [f.from, f.into]));
186
- const after = (origin) => (origin ? renamed.get(origin) ?? origin : origin ?? null);
217
+ const after = (origin) => (origin ? (renamed.get(origin) ?? origin) : (origin ?? null));
187
218
  const origins = new Map(store.dormant().map((s) => [s.entry.id, after(s.entry.origin_project)]));
188
219
  for (const e of all)
189
220
  origins.set(e.id, after(e.origin_project));
@@ -240,7 +271,8 @@ function repairIsEmpty(r) {
240
271
  return r.copies.length + r.folds.length + r.toProject.length + r.setAside.length === 0;
241
272
  }
242
273
  /** 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. */
274
+ * with `hippo projects repair`: their evidence is compaction folders, blind to a same-named repo that never compacted.
275
+ */
244
276
  export function repairOnceOnSleep(store) {
245
277
  if (store.repairedOnce())
246
278
  return null;
@@ -33,11 +33,15 @@ export interface HybridSearchOptions extends SearchOptions {
33
33
  summaryDeboost?: number;
34
34
  /** Propagated. Default true (1.05 boost if rebuilt within 7d). */
35
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. */
36
+ /** Optional admission predicate applied to the loaded candidates of BOTH stores before ranking, cross-store dedupe
37
+ * and budgeting,
38
+ * so an excluded row cannot shadow its admitted duplicate or saturate the budget. Undefined (recall paths never
39
+ * set it) means no filter. */
38
40
  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
+ /** Recall scope filter for `searchBothHybrid`: absent is the only unfiltered mode; present uses
42
+ * `loadRecallSearchEntries` plus a JS post-filter.
43
+ * `{}` = default-deny (legacy and `<source>:private:*` excluded); `{ requested: 'X' }` = exact; `{ requested: 'X',
44
+ * additive: true }` = default plus X.
41
45
  * An object, not `string | null`, because the sibling `scope` option already gives null a different meaning.
42
46
  * Do not pass `{}` casually from non-recall paths. */
43
47
  recallScope?: {
@@ -10,10 +10,10 @@ import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from '../core/search-types.
10
10
  import { startQueryEmbedDeadline } from '../search/vector.js';
11
11
  import { evalNow } from '../core/ablation.js';
12
12
  import { duplicateKey } from '../util/same-text.js';
13
- import { errorMessage, log } from '../util/log.js';
13
+ import { errorFields, errorMessage, log } from '../util/log.js';
14
14
  // The rows are already copied; a failed background embed only delays vectors, so it warns instead of throwing.
15
15
  export function logEmbedAllFailure(caller, err) {
16
- log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`);
16
+ log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`, errorFields(err));
17
17
  }
18
18
  /** Search both local and global stores and merge: local results are boosted 1.2x to prefer project context.
19
19
  * Returns results sorted by adjusted score within the combined token budget. */
@@ -71,9 +71,11 @@ function dedupeByContent(tagged) {
71
71
  * Async version of searchBoth that calls hybridSearch instead of search. */
72
72
  export async function searchBothHybrid(query, localRoot, globalRoot, options = {}) {
73
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.
74
+ // With an admission filter, lift the per-store candidate cap (default 200) to a bounded 5000: excluded rows could
75
+ // otherwise fill the window first.
75
76
  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
+ // Recall mode: push the scope predicate into SQL like api.recall, so quarantine/private rows never enter the
78
+ // candidates, shadow duplicates or use budget.
77
79
  // The JS post-filter below is the regex-only `<source>:private:*` half plus defense in depth on exact match.
78
80
  const loadEntries = (root) => {
79
81
  if (!fs.existsSync(root))
@@ -89,30 +91,35 @@ export async function searchBothHybrid(query, localRoot, globalRoot, options = {
89
91
  })
90
92
  : loadSearchEntries(root, query, searchWindow, tenantId);
91
93
  };
92
- const passesScope = (e) => !recallScope || (recallScope.additive
93
- ? passesCliRecallScopeFilter(e.scope ?? null, recallScope.requested) || passesScopeFilterForRecall(e.scope ?? null, undefined, recallScope.ownScope)
94
- : passesScopeFilterForRecall(e.scope ?? null, recallScope.requested, recallScope.ownScope));
94
+ const passesScope = (e) => !recallScope ||
95
+ (recallScope.additive
96
+ ? passesCliRecallScopeFilter(e.scope ?? null, recallScope.requested) ||
97
+ passesScopeFilterForRecall(e.scope ?? null, undefined, recallScope.ownScope)
98
+ : passesScopeFilterForRecall(e.scope ?? null, recallScope.requested, recallScope.ownScope));
95
99
  const admit = (e) => passesScope(e) && (!entryFilter || entryFilter(e));
96
100
  const localEntries = loadEntries(localRoot).filter(admit);
97
101
  const globalEntries = loadEntries(globalRoot).filter(admit);
98
102
  // The vector arm loads under the same SQL rules as loadEntries, then the same JS admission.
99
103
  const vectorCandidates = {
100
104
  tenantId,
101
- scope: recallScope ? recallScopeFilter(recallScope.requested, recallScope.additive ? 'additive' : 'exact', recallScope.ownScope) : undefined,
105
+ scope: recallScope
106
+ ? recallScopeFilter(recallScope.requested, recallScope.additive ? 'additive' : 'exact', recallScope.ownScope)
107
+ : undefined,
102
108
  includeSuperseded: !recallScope || Boolean(includeSuperseded) || Boolean(asOf),
103
109
  admit,
104
110
  };
105
- return rankBothStores(query, { local: localRoot, global: globalRoot }, { local: localEntries, global: globalEntries }, vectorCandidates, options);
111
+ const roots = { local: localRoot, global: globalRoot };
112
+ return rankBothStores(query, roots, { local: localEntries, global: globalEntries }, vectorCandidates, options);
106
113
  }
107
114
  /** Hybrid ranking of rows already loaded from each store: the local bump, one copy per text, then the shared budget. */
108
115
  export async function rankBothStores(query, roots, entries, vectorCandidates, options = {}) {
109
- const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness } = options;
116
+ const { budget = DEFAULT_RECALL_BUDGET, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = DEFAULT_LOCAL_BUMP, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness, } = options;
110
117
  if (entries.local.length === 0 && entries.global.length === 0)
111
118
  return [];
112
119
  // One deadline for both stores, so a provider that stalls on the first is not waited on again for the second.
113
120
  const shared = {
114
- budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf, summaryDeboost, summaryFreshness,
115
- vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
121
+ budget, now, embeddingWeight, explain, mmr, mmrLambda, minResults, cost, scope, includeSuperseded, asOf,
122
+ summaryDeboost, summaryFreshness, vectorCandidates, queryEmbedDeadline: startQueryEmbedDeadline(),
116
123
  };
117
124
  const localResults = await hybridSearch(query, entries.local, { ...shared, hippoRoot: roots.local });
118
125
  const globalResults = await hybridSearch(query, entries.global, { ...shared, hippoRoot: roots.global });
@@ -2,7 +2,8 @@ import { MemoryEntry } from '../core/memory.js';
2
2
  /** Tags whose rows only a hand-run share or promote may copy to the global store; derived rows inherit them. */
3
3
  export declare const NEVER_AUTO_SHARE_TAGS: ReadonlySet<string>;
4
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. */
5
+ /** Tags whose rows sleep keeps as written: never merged, never
6
+ * sent to LLM extraction. Conflict detection keeps its own list. */
6
7
  export declare const NO_MERGE_TAGS: ReadonlySet<string>;
7
8
  /** The transfer score a memory needs before sleep or `hippo share --auto` copies it to the global store. */
8
9
  export declare const AUTO_SHARE_MIN_SCORE = 0.6;
@@ -16,7 +17,8 @@ export declare function shareMemory(localRoot: string, id: string, options?: {
16
17
  tenantId?: string;
17
18
  skipEmbed?: boolean;
18
19
  }): MemoryEntry | null;
19
- /** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or 'promoted:<path>' sources.
20
+ /** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
21
+ * 'promoted:<path>' sources.
20
22
  * `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
21
23
  export declare function listPeers(globalRoot?: string, tenantId?: string): Array<{
22
24
  project: string;
@@ -28,8 +30,10 @@ type AutoShareStats = {
28
30
  rejectedSkipped?: number;
29
31
  neverAutoShareSkipped?: number;
30
32
  };
31
- /** 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.
32
- * `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped` rejection refusals (0 under `dryRun`). */
33
+ /** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
34
+ * `options.tenantId` scopes the LOCAL read.
35
+ * `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped`
36
+ * rejection refusals (0 under `dryRun`). */
33
37
  export declare function autoShare(localRoot: string, options?: {
34
38
  minScore?: number;
35
39
  dryRun?: boolean;
@@ -5,7 +5,7 @@ import * as path from 'path';
5
5
  import { generateId, COMPACTION_MEMORY_TAG } from '../core/memory.js';
6
6
  import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TAGS } from '../core/agent-memory-tools.js';
7
7
  import { writeEntriesSkippingRejected, writeEntry } from '../store/entry-writes.js';
8
- import { loadAllEntries, loadEntryTextKeys, readEntry } from '../store/entry-reads.js';
8
+ import { loadAllEntries, loadEntriesWithSignals, loadEntryTextKeys, readEntry, } from '../store/entry-reads.js';
9
9
  import { tallySources } from '../store/candidates.js';
10
10
  import { isPersonalScope } from '../core/recall-scope.js';
11
11
  import { fallbackOrigin } from '../core/project-identity.js';
@@ -37,7 +37,8 @@ export const NEVER_AUTO_SHARE_TAGS = new Set([
37
37
  export function neverAutoShareTags(sources) {
38
38
  return [...NEVER_AUTO_SHARE_TAGS].filter((tag) => sources.some((s) => s.tags.includes(tag)));
39
39
  }
40
- /** Tags whose rows sleep keeps as written: never merged, never sent to LLM extraction. Conflict detection keeps its own list. */
40
+ /** Tags whose rows sleep keeps as written: never merged, never
41
+ * sent to LLM extraction. Conflict detection keeps its own list. */
41
42
  export const NO_MERGE_TAGS = new Set([
42
43
  'extracted',
43
44
  'session-digest',
@@ -46,6 +47,13 @@ export const NO_MERGE_TAGS = new Set([
46
47
  ]);
47
48
  /** The transfer score a memory needs before sleep or `hippo share --auto` copies it to the global store. */
48
49
  export const AUTO_SHARE_MIN_SCORE = 0.6;
50
+ /** Every trait that lifts transferScore above 0.5 or makes autoShare skip a row before scoring it. */
51
+ const AUTO_SHARE_SIGNALS = {
52
+ tags: [...TRANSFERABLE_TAGS, ...NEVER_AUTO_SHARE_TAGS],
53
+ sourcePrefix: AGENT_MEMORY_SOURCE_PREFIX,
54
+ minRetrievals: 3,
55
+ valences: ['negative', 'critical'],
56
+ };
49
57
  /** Estimate how well a memory would transfer to other projects.
50
58
  * Returns 0..1 where >0.5 = good candidate for sharing. */
51
59
  export function transferScore(entry) {
@@ -70,7 +78,8 @@ export function transferScore(entry) {
70
78
  /** Share a memory to the global store with attribution (source enriched with project path and timestamp).
71
79
  * Returns the new entry, or null if the transfer score is too low. */
72
80
  export function shareMemory(localRoot, id, options = {}) {
73
- // tenantId is optional for single-tenant callers (autoShare passes only `{ force: true }`); MCP/REST hosts MUST pass it so tenant A cannot share
81
+ // tenantId is optional for single-tenant callers (autoShare passes only `{ force: true }`); MCP/REST hosts MUST pass
82
+ // it so tenant A cannot share
74
83
  // tenant B's memory to global (readEntry returns null on a cross-tenant lookup).
75
84
  const entry = readEntry(localRoot, id, options.tenantId);
76
85
  if (!entry)
@@ -81,19 +90,22 @@ export function shareMemory(localRoot, id, options = {}) {
81
90
  initGlobal();
82
91
  const globalRoot = getGlobalRoot();
83
92
  writeEntry(globalRoot, globalEntry);
84
- // Embed here unless the caller opts out: autoShare sets skipEmbed to batch one embedAll(), since embedMemory rewrites the whole index per call.
93
+ // Embed here unless the caller opts out: autoShare sets skipEmbed to batch one embedAll(), since embedMemory rewrites
94
+ // the whole index per call.
85
95
  if (!options.skipEmbed) {
86
96
  void embedMemory(globalRoot, globalEntry);
87
97
  }
88
98
  return globalEntry;
89
99
  }
90
- /** The global copy of a local row, or null when its transfer score is too low and `force` is off; throws when the row may not be shared. */
100
+ /** The global copy of a local row, or null when its transfer score is too low and `force` is off; throws when the
101
+ * row may not be shared. */
91
102
  function toGlobalEntry(localRoot, entry, force) {
92
103
  assertShareable(entry, entry.id);
93
104
  const score = transferScore(entry);
94
105
  if (score < 0.3 && !force)
95
106
  return null;
96
- // The label keeps the folder name for a user-global row; a NULL row gets `shared::`, which originFromSource reads as no project.
107
+ // The label keeps the folder name for a user-global row; a NULL
108
+ // row gets `shared::`, which originFromSource reads as no project.
97
109
  const fallbackName = path.basename(path.resolve(localRoot, '..'));
98
110
  const originName = entry.origin_project ?? fallbackOrigin(localRoot);
99
111
  const label = originName === '' ? fallbackName : (originName ?? '');
@@ -105,7 +117,8 @@ function toGlobalEntry(localRoot, entry, force) {
105
117
  };
106
118
  }
107
119
  function assertShareable(entry, id) {
108
- // Secret veto: secrets never reach the global store, even with --force; throw loudly, since a silent null reads as "low transfer score" and invites retries.
120
+ // Secret veto: secrets never reach the global store, even with --force; throw loudly, since a silent null reads as
121
+ // "low transfer score" and invites retries.
109
122
  const secret = detectSecret(entry);
110
123
  if (secret.flagged) {
111
124
  throw new BadRequestError(`Refusing to share ${id} to the global store: content matches secret material (${secret.reason}). ` +
@@ -113,13 +126,15 @@ function assertShareable(entry, id) {
113
126
  }
114
127
  // A quarantined row is unreviewed input, not a lesson; sharing it would spread poison globally.
115
128
  if (isQuarantineScope(entry.scope)) {
116
- throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ${id}'.`);
129
+ throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review. ` +
130
+ `Approve it first via 'hippo quarantine approve ${id}'.`);
117
131
  }
118
132
  if (isPersonalScope(entry.scope ?? null)) {
119
133
  throw new BadRequestError(`Refusing to share ${id}: it is a personal memory and stays with its owner on this server.`);
120
134
  }
121
135
  }
122
- /** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or 'promoted:<path>' sources.
136
+ /** List all projects that contributed memories to the global store, parsed from 'shared:<project>:' or
137
+ * 'promoted:<path>' sources.
123
138
  * `tenantId` filters to one tenant; undefined is host-wide (legacy callers: CLI standalone, dashboard). */
124
139
  export function listPeers(globalRoot, tenantId) {
125
140
  const root = globalRoot ?? getGlobalRoot();
@@ -158,8 +173,9 @@ export function listPeers(globalRoot, tenantId) {
158
173
  }
159
174
  function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
160
175
  // shareMemory refuses quarantined and personal rows; filtering here keeps sleep from aborting on one.
161
- if (isQuarantineScope(entry.scope ?? null) || isPersonalScope(entry.scope ?? null) || !isReusable(entry))
176
+ if (isQuarantineScope(entry.scope ?? null) || isPersonalScope(entry.scope ?? null) || !isReusable(entry)) {
162
177
  return false;
178
+ }
163
179
  // Before the score: these rows describe one project only, and a git seed's 'error' tag clears the bar.
164
180
  if (entry.tags.some((t) => NEVER_AUTO_SHARE_TAGS.has(t)) || entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX)) {
165
181
  if (stats)
@@ -172,7 +188,8 @@ function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
172
188
  // Skip if already shared (same text apart from spacing)
173
189
  if (globalContentSet.has(duplicateKey(entry.content)))
174
190
  return false;
175
- // Secret veto, checked LAST so the stats counter only counts rows it withheld (a row failing the score or dedupe gate was never going to share).
191
+ // Secret veto, checked LAST so the stats counter only counts rows it withheld (a row failing the score or dedupe gate
192
+ // was never going to share).
176
193
  // shareMemory would throw here; filtering keeps the sleep pipeline fail-safe.
177
194
  if (detectSecret(entry).flagged) {
178
195
  if (stats)
@@ -181,7 +198,8 @@ function isAutoShareCandidate(entry, globalContentSet, minScore, stats) {
181
198
  }
182
199
  return true;
183
200
  }
184
- // A row the GLOBAL store's rejection tombstones refuse is audited and skipped, so it cannot abort the autoShare sleep phase.
201
+ // A row the GLOBAL store's rejection tombstones refuse is audited and skipped, so it cannot abort the autoShare sleep
202
+ // phase.
185
203
  // The candidates are rows already held, written in one transaction; the caller embeds once via embedAll() afterwards.
186
204
  function shareCandidates(localRoot, globalRoot, candidates, stats) {
187
205
  const shared = [];
@@ -205,11 +223,17 @@ function shareCandidates(localRoot, globalRoot, candidates, stats) {
205
223
  }
206
224
  return shared;
207
225
  }
208
- /** 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.
209
- * `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped` rejection refusals (0 under `dryRun`). */
226
+ /** Auto-share local memories with high transfer scores, not already global and without a NEVER_AUTO_SHARE_TAGS tag;
227
+ * `options.tenantId` scopes the LOCAL read.
228
+ * `options.stats` is an opt-in out-param: `secretSkipped` counts shares the secret veto prevented, `rejectedSkipped`
229
+ * rejection refusals (0 under `dryRun`). */
210
230
  export function autoShare(localRoot, options = {}) {
211
231
  const { minScore = AUTO_SHARE_MIN_SCORE, dryRun = false } = options;
212
- const localEntries = loadAllEntries(localRoot, options.tenantId);
232
+ // A row with none of these signals scores at most 0.5, so above that
233
+ // bar only signal rows can share or count as never-auto-share skips.
234
+ const localEntries = minScore > 0.5
235
+ ? loadEntriesWithSignals(localRoot, AUTO_SHARE_SIGNALS, options.tenantId)
236
+ : loadAllEntries(localRoot, options.tenantId);
213
237
  initGlobal();
214
238
  const globalRoot = getGlobalRoot();
215
239
  // Host-wide read. The global store IS the union across all tenants;
@@ -4,9 +4,11 @@ import { SECRET_TAGS } from '../util/secret-detect.js';
4
4
  import { onHandle, openStore } from './open.js';
5
5
  import { jsonList } from './candidates.js';
6
6
  import { originInSql } from '../core/project-identity.js';
7
- import { AMBIENT_FRESH_WINDOW_MS, HIGH_SCHEMA_FIT_ABOVE, isErrorTagged } from '../core/ambient.js';
7
+ import { AMBIENT_FRESH_WINDOW_MS, isErrorTagged } from '../core/ambient.js';
8
+ import { HIGH_SCHEMA_FIT } from '../core/memory.js';
8
9
  import { placeholders } from '../util/sql.js';
9
- // SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is split.
10
+ // SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is
11
+ // split.
10
12
  function contextRowsWhere(tenantId, filter) {
11
13
  const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
12
14
  const params = [tenantId];
@@ -25,12 +27,14 @@ function contextRowsWhere(tenantId, filter) {
25
27
  }
26
28
  return { where, params };
27
29
  }
28
- /** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot match. */
30
+ /** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot
31
+ * match. */
29
32
  function secretTaggedSql() {
30
33
  const tags = [...SECRET_TAGS];
31
34
  return {
32
35
  sql: `((${tags.map(() => 'tags_json LIKE ?').join(' OR ')})
33
- AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN (${placeholders(tags.length)})))`,
36
+ AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN
37
+ (${placeholders(tags.length)})))`,
34
38
  params: [...tags.map((t) => `%"${t}"%`), ...tags],
35
39
  };
36
40
  }
@@ -57,7 +61,7 @@ export function loadAmbientTallies(hippoRoot, tenantId, filter) {
57
61
  '[' || COALESCE(group_concat(${jsonList('tags_json')}, ','), '') || ']' AS tagLists
58
62
  FROM memories
59
63
  WHERE ${where.join(' AND ')}
60
- AND ((${originInSql(filter.currentProject)} AND origin_project != '') OR NOT ${secret.sql})`).get(freshAfter, HIGH_SCHEMA_FIT_ABOVE, ...params, ...filter.currentProject, ...secret.params);
64
+ AND ((${originInSql(filter.currentProject)} AND origin_project != '') OR NOT ${secret.sql})`).get(freshAfter, HIGH_SCHEMA_FIT, ...params, ...filter.currentProject, ...secret.params);
61
65
  const tagCounts = new Map();
62
66
  let errors = 0;
63
67
  const lists = /* SAFETY: jsonList yields an array per row, joined into one array */ JSON.parse(row.tagLists);
@@ -11,7 +11,7 @@ export interface AuditOptions {
11
11
  /** Emit an audit event for a mutation. Never throws: the SQLite store stays the source of truth,
12
12
  * and a failed audit write shows up as missing rows. */
13
13
  export declare function audit(db: ReturnType<typeof openHippoDb>, op: AuditOp, options?: AuditOptions): void;
14
- /** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own rollback cannot claw it back.
15
- * Best-effort like `audit()`: never throws. */
14
+ /** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
15
+ * rollback cannot claw it back. Best-effort like `audit()`: never throws. */
16
16
  export declare function auditRejectionRefusal(db: ReturnType<typeof openHippoDb>, err: RejectedValueError, actor: string): void;
17
17
  //# sourceMappingURL=audit-event.d.ts.map
@@ -18,9 +18,14 @@ export function audit(db, op, options = {}) {
18
18
  reportAuditWriteFailure(op, String(error), targetId);
19
19
  }
20
20
  }
21
- /** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own rollback cannot claw it back.
22
- * Best-effort like `audit()`: never throws. */
21
+ /** Refusal audit for the rejected-value guard, written by the transaction owner after rollback so the caller's own
22
+ * rollback cannot claw it back. Best-effort like `audit()`: never throws. */
23
23
  export function auditRejectionRefusal(db, err, actor) {
24
- audit(db, 'reject_refusal', { targetId: err.entryId, metadata: { digest: err.digest, reason: err.reason }, actor, tenantId: err.tenantId });
24
+ audit(db, 'reject_refusal', {
25
+ targetId: err.entryId,
26
+ metadata: { digest: err.digest, reason: err.reason },
27
+ actor,
28
+ tenantId: err.tenantId,
29
+ });
25
30
  }
26
31
  //# sourceMappingURL=audit-event.js.map
@@ -53,14 +53,16 @@ export interface ListAuditAfterOpts {
53
53
  /** Cursor read: events with id > afterId, ascending. Retention prune leaves gaps in the ids,
54
54
  * so resume from the last id returned, never from a count. */
55
55
  export declare function listAuditEventsAfter(db: DatabaseSyncLike, opts: ListAuditAfterOpts): AuditEvent[];
56
- /** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike queryAuditEvents it has no row cap. */
56
+ /** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
57
+ * queryAuditEvents it has no row cap. */
57
58
  export declare function confirmedOutcomeTimes(hippoRoot: string, tenantId: string): Map<string, string>;
58
59
  /** An audit row that did not land, with what its write threw. */
59
60
  export interface FailedAuditEvent {
60
61
  event: AppendAuditOpts;
61
62
  error: unknown;
62
63
  }
63
- /** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that failed, for the caller to report. */
64
+ /** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
65
+ * failed, for the caller to report. */
64
66
  export declare function recordAuditEventsRowByRow(hippoRoot: string, events: readonly AppendAuditOpts[]): FailedAuditEvent[];
65
67
  export interface AuditPrune {
66
68
  tenantId: string;
@@ -71,6 +73,7 @@ export interface AuditPrune {
71
73
  /** Count the rows and delete nothing. */
72
74
  dryRun: boolean;
73
75
  }
74
- /** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands alone; returns the row count. */
76
+ /** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
77
+ * alone; returns the row count. */
75
78
  export declare function pruneAuditRows(hippoRoot: string, prune: AuditPrune): number;
76
79
  //# sourceMappingURL=audit.d.ts.map
@@ -27,7 +27,8 @@ export const AUDIT_OPS = [
27
27
  'recall_autodebias_hint_no_class_match', // telemetry: forward-claim detected, no class scored
28
28
  'recall_autodebias_hint_tiebreak', // telemetry: forward-claim detected, two or more classes tied
29
29
  'recall_anchor_detected_query_repeat', // emitted by the anchoring detector when the same query returns the same top-1
30
- 'recall_anchor_detected_memory_dominance', // emitted by the anchoring detector when one memory wins top-1 across distinct queries
30
+ // emitted by the anchoring detector when one memory wins top-1 across distinct queries
31
+ 'recall_anchor_detected_memory_dominance',
31
32
  'recall_anchor_skipped_no_session', // telemetry: no sessionId, so ring tracking was skipped
32
33
  'recall_availability_detected', // emitted when the availability/recency-bias hint fires
33
34
  'decision_create', // emitted by saveDecision
@@ -124,7 +125,8 @@ export function queryAuditEvents(db, opts) {
124
125
  const limit = Math.max(1, Math.min(opts.limit ?? DEFAULT_LIST_LIMIT, 10001));
125
126
  // SAFETY: AUDIT_COLUMNS names exactly the AuditRow columns, in this order.
126
127
  const rows = db
127
- .prepare(`SELECT ${AUDIT_COLUMNS} FROM audit_log WHERE ${where.join(' AND ')}${after.sql} ORDER BY ts DESC, id DESC LIMIT ?`)
128
+ .prepare(`SELECT ${AUDIT_COLUMNS} FROM audit_log WHERE ${where.join(' AND ')}${after.sql} ORDER BY ts DESC, id DESC ` +
129
+ `LIMIT ?`)
128
130
  .all(...params, ...after.params, limit);
129
131
  return rows.map(rowToAuditEvent);
130
132
  }
@@ -166,7 +168,8 @@ function deleteAuditBefore(db, tenantId, cutoff) {
166
168
  .run(tenantId, cutoff);
167
169
  return Number(result.changes ?? 0);
168
170
  }
169
- /** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike queryAuditEvents it has no row cap. */
171
+ /** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike
172
+ * queryAuditEvents it has no row cap. */
170
173
  export function confirmedOutcomeTimes(hippoRoot, tenantId) {
171
174
  const db = openHippoDb(hippoRoot);
172
175
  try {
@@ -208,7 +211,8 @@ function safeJsonParse(raw, id) {
208
211
  return {};
209
212
  }
210
213
  }
211
- /** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that failed, for the caller to report. */
214
+ /** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that
215
+ * failed, for the caller to report. */
212
216
  export function recordAuditEventsRowByRow(hippoRoot, events) {
213
217
  const db = openHippoDb(hippoRoot);
214
218
  try {
@@ -227,7 +231,8 @@ export function recordAuditEventsRowByRow(hippoRoot, events) {
227
231
  closeHippoDb(db);
228
232
  }
229
233
  }
230
- /** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands alone; returns the row count. */
234
+ /** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands
235
+ * alone; returns the row count. */
231
236
  export function pruneAuditRows(hippoRoot, prune) {
232
237
  const { tenantId, cutoff, actor, olderThanDays } = prune;
233
238
  const db = openHippoDb(hippoRoot);
@@ -237,7 +242,12 @@ export function pruneAuditRows(hippoRoot, prune) {
237
242
  return withWriteScope(db, 'audit_prune', () => {
238
243
  const count = deleteAuditBefore(db, tenantId, cutoff);
239
244
  // Written after the delete with ts = now, so the cutoff just applied cannot take it.
240
- appendAuditEvent(db, { tenantId, actor, op: 'audit_prune', metadata: { cutoff, count, dryRun: false, olderThanDays } });
245
+ appendAuditEvent(db, {
246
+ tenantId,
247
+ actor,
248
+ op: 'audit_prune',
249
+ metadata: { cutoff, count, dryRun: false, olderThanDays },
250
+ });
241
251
  return count;
242
252
  });
243
253
  }
@@ -62,7 +62,8 @@ export interface VerifiedApiKey {
62
62
  scopes: string[];
63
63
  ownerSubject?: string | null;
64
64
  }
65
- /** One api_keys row and its scope grants as a store returns it, revoked or not; the core checks the secret, the role and the expiry. */
65
+ /** One api_keys row and its scope grants as a store returns it, revoked or not; the core checks the secret, the role
66
+ * and the expiry. */
66
67
  export interface ApiKeyRecord {
67
68
  keyHash: string;
68
69
  tenantId: string;
@@ -87,7 +88,8 @@ export declare class VerifiedKeyCache {
87
88
  has(keyHash: string, plaintext: string): boolean;
88
89
  add(keyHash: string, plaintext: string): void;
89
90
  }
90
- /** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a queue. */
91
+ /** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a
92
+ * queue. */
91
93
  type DerivationBound = (keyId: string, derive: () => Promise<Buffer>) => Promise<Buffer>;
92
94
  /** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
93
95
  * call, so a revoke, expiry, role or scope change by any process applies on the next one. */