hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/api/audit.js CHANGED
@@ -1,4 +1,10 @@
1
- // Audit log queries.
1
+ // Audit log queries and retention, and the memory-quality audit with its repair passes.
2
+ import { pruneAuditRows } from '../store/audit.js';
3
+ import { auditMemories } from '../core/memory-audit.js';
4
+ import { deleteEntriesAutomatically, memoriesBackingObjects } from '../store/delete-and-batch.js';
5
+ import { loadAllEntries } from '../store/entry-reads.js';
6
+ import { repairAutomaticMemories, repairQualityOnce } from '../store/quality-repair.js';
7
+ import { DAY_MS } from '../util/time.js';
2
8
  import { requireGroup, storeFor } from '../store/index.js';
3
9
  /** Read audit events scoped to `ctx.tenantId` on the store the request runs on. Read-only, no audit emit. */
4
10
  export async function auditList(ctx, opts) {
@@ -6,4 +12,45 @@ export async function auditList(ctx, opts) {
6
12
  tenantId: ctx.tenantId, op: opts.op, since: opts.since, limit: opts.limit, after: opts.after,
7
13
  });
8
14
  }
15
+ /** Delete the memories an audit marked as errors, each with its own forget row, and answer the ids that went: a pinned or raw row stays. */
16
+ export function removeAuditErrors(ctx, pass, issues) {
17
+ const removals = issues
18
+ .filter((issue) => issue.severity === 'error')
19
+ .map((issue) => ({ id: issue.memoryId, reason: `${pass}: ${issue.reason}` }));
20
+ return deleteEntriesAutomatically(ctx.hippoRoot, removals, ctx.actor.subject);
21
+ }
22
+ // SHORTCUT: hippo.db only, as the port has no whole-tenant read, backing-object read or automatic delete with a reason; another store kind
23
+ // answers 501 at the open. Port groups for them once a served store must audit.
24
+ /** The caller's memories run through the quality audit; a memory that backs an object is never marked for removal. */
25
+ export function auditMemoryQuality(ctx) {
26
+ return auditMemories(loadAllEntries(ctx.hippoRoot, ctx.tenantId), memoriesBackingObjects(ctx.hippoRoot));
27
+ }
28
+ /** Audit repair for the caller's tenant: a preview, or with `apply` the moves of certain defects to dormant storage behind a backup. */
29
+ export function repairMemoryQuality(ctx, apply) {
30
+ return repairAutomaticMemories(ctx.hippoRoot, { tenantId: ctx.tenantId, apply });
31
+ }
32
+ /** The repair sleep and the daily runner apply once per store after an upgrade; null when it already ran there. */
33
+ export function repairMemoryQualityOnce(ctx) {
34
+ return repairQualityOnce(ctx.hippoRoot, ctx.tenantId);
35
+ }
36
+ /** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
37
+ export function computeCutoff(days, now = new Date()) {
38
+ const cutoff = new Date(now.getTime() - days * DAY_MS);
39
+ return cutoff.toISOString();
40
+ }
41
+ /** Delete the caller's tenant's audit_log rows older than `olderThanDays`, then record an `audit_prune` row as `ctx.actor`; opt-in, since
42
+ * retention floors (HIPAA, SOX, GDPR) apply. The row is written after the DELETE, so a call never prunes its own record.
43
+ * Throws on non-positive days or an empty tenant. */
44
+ export function pruneAuditLog(ctx, opts) {
45
+ if (!Number.isFinite(opts.olderThanDays) || opts.olderThanDays <= 0) {
46
+ throw new Error(`pruneAuditLog: olderThanDays must be a positive number, got ${opts.olderThanDays}`);
47
+ }
48
+ if (!ctx.tenantId) {
49
+ throw new Error('pruneAuditLog: tenantId is required');
50
+ }
51
+ const dryRun = opts.dryRun === true;
52
+ const cutoff = computeCutoff(opts.olderThanDays);
53
+ const count = pruneAuditRows(ctx.hippoRoot, { tenantId: ctx.tenantId, cutoff, actor: ctx.actor.subject, olderThanDays: opts.olderThanDays, dryRun });
54
+ return { cutoff, count, dryRun };
55
+ }
9
56
  //# sourceMappingURL=audit.js.map
@@ -1,15 +1,14 @@
1
- import { type ApiKeyListRow } from '../store/auth.js';
1
+ import { DEFAULT_KEY_TTL_DAYS, type ApiKeyListItem, type ApiKeyListRow } from '../store/auth.js';
2
2
  import type { KeysetPosition } from '../util/keyset.js';
3
- import type { Context, StoreReply } from './types.js';
3
+ import { type Context, type StoreReply } from './types.js';
4
4
  export interface AuthCreateOpts {
5
5
  label?: string;
6
- /**
7
- * Authorization role for the new key. Defaults to `'admin'` for
8
- * back-compat with keys minted before roles existed (the api_keys.role column DEFAULT also
9
- * resolves to 'admin' if omitted from the INSERT). Member keys are
10
- * 403-blocked from admin-gated routes (e.g. `POST /v1/sleep`).
11
- */
6
+ /** Defaults to `'member'`, which admin-gated routes such as `POST /v1/sleep` refuse; an admin key has to be asked for by name. */
12
7
  role?: 'admin' | 'member';
8
+ /** Days until the key expires: above 0 and at most 3650. Defaults to 90. */
9
+ ttlDays?: number;
10
+ /** True mints a key that never expires, which has to be asked for by name; refused together with `ttlDays`. */
11
+ noExpiry?: boolean;
13
12
  }
14
13
  export interface AuthCreateResult {
15
14
  keyId: string;
@@ -17,19 +16,14 @@ export interface AuthCreateResult {
17
16
  tenantId: string;
18
17
  /** The role bound to the new key (admin | member). */
19
18
  role: 'admin' | 'member';
19
+ /** ISO time the key stops working; null for a key that never expires. */
20
+ expiresAt: string | null;
20
21
  }
21
- /**
22
- * Mint a new API key. The new key is ALWAYS bound to `ctx.tenantId`. Callers
23
- * cannot override the tenant via the opts bag — a previous `tenantId` field
24
- * was removed because the HTTP layer would happily forward `body.tenantId`,
25
- * letting tenant A mint a key for tenant B. The HTTP route handler at
26
- * `src/server.ts` POST /v1/auth/keys mirrors this: it ignores any body
27
- * `tenantId` and uses the resolved Bearer's tenant exclusively.
28
- *
29
- * Only an admin actor can mint (ForbiddenError otherwise), and a key never
30
- * outranks its minter: a resolver admin is tenant-only, so it mints members.
31
- */
22
+ /** Mints a key always bound to `ctx.tenantId`; opts cannot override the tenant, or tenant A could mint a key for tenant B.
23
+ * Admin only (ForbiddenError otherwise), and a key never outranks its minter: a resolver admin is tenant-only, so it mints members. */
32
24
  export declare function authCreate<C extends Context>(ctx: C, opts: AuthCreateOpts): StoreReply<C, AuthCreateResult>;
25
+ export { DEFAULT_KEY_TTL_DAYS };
26
+ export declare const MAX_TTL_DAYS = 3650;
33
27
  export interface AuthCreateSelfOpts {
34
28
  label?: string;
35
29
  /** Days until the new key expires. */
@@ -41,7 +35,8 @@ export interface AuthCreateSelfResult extends AuthCreateResult {
41
35
  /** ISO time the key stops working. */
42
36
  expiresAt: string;
43
37
  }
44
- /** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
38
+ /** Mint a member key for the caller an auth resolver vouched for, whatever its role; the
39
+ * binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
45
40
  export declare function authCreateSelf<C extends Context>(ctx: C, opts: AuthCreateSelfOpts): StoreReply<C, AuthCreateSelfResult>;
46
41
  type KeyListOpts = {
47
42
  active: boolean;
@@ -50,6 +45,8 @@ type KeyListOpts = {
50
45
  };
51
46
  /** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from. */
52
47
  export declare function authListRows<C extends Context>(ctx: C, opts: KeyListOpts): StoreReply<C, ApiKeyListRow[]>;
48
+ /** Every tenant's keys in the store, live ones only unless `active` is false; the host's own view, so the host admin only. */
49
+ export declare function authListAllTenants(ctx: Context, active: boolean): ApiKeyListItem[];
53
50
  export interface AuthRevokeResult {
54
51
  ok: true;
55
52
  revokedAt: string;
@@ -58,11 +55,9 @@ export type AuthRevokeReply<C extends Context> = StoreReply<C, AuthRevokeResult>
58
55
  /** Revoke a key in the caller's tenant: a member API key may revoke only itself, a resolver member only the keys it minted.
59
56
  * The revoke and its auth_revoke row commit together on either store, so a failed audit write leaves the key live. */
60
57
  export declare function authRevoke<C extends Context>(ctx: C, keyId: string): AuthRevokeReply<C>;
61
- /**
62
- * The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
63
- * so the local CLI can run revoke and grant in the key's own tenant.
64
- */
65
- export declare function authKeyTenant(ctx: Context, keyId: string): string | undefined;
58
+ /** The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
59
+ * so the local CLI can run revoke and grant in the key's own tenant. */
60
+ export declare function authKeyTenant(ctx: Context, keyId: string): Promise<string | undefined>;
66
61
  /** Shared result shape for authGrant/authUngrant, named per the file's oxlint anti-slop rule. */
67
62
  export interface AuthGrantResult {
68
63
  ok: true;
@@ -71,5 +66,4 @@ export interface AuthGrantResult {
71
66
  export declare function authGrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
72
67
  /** Revoke `keyId`'s grant on `scope`. Same authorization and lookup rules as authGrant. */
73
68
  export declare function authUngrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
74
- export {};
75
69
  //# sourceMappingURL=auth.d.ts.map
package/dist/api/auth.js CHANGED
@@ -1,26 +1,18 @@
1
1
  // API key management: create, list, revoke, and grant or ungrant restricted scopes.
2
- import { ForbiddenError, NotFoundError } from '../core/api-errors.js';
3
- import { mintApiKey, } from '../store/auth.js';
2
+ import { BadRequestError, ForbiddenError, NotFoundError } from '../core/api-errors.js';
3
+ import { DEFAULT_KEY_TTL_DAYS, listApiKeys, mintApiKey, } from '../store/auth.js';
4
+ import { storeFor } from '../store/index.js';
4
5
  import { changeScopeGrant } from '../store/sqlite/local.js';
5
- import { sqliteSyncStore } from '../store/sqlite/store.js';
6
6
  import { DAY_MS } from '../util/time.js';
7
7
  import { andThen, notPorted, onStore } from './on-store.js';
8
+ import { requireHostAdmin } from './types.js';
8
9
  const API_KEY_SUBJECT = 'api_key:';
9
10
  /** The key id an API-key actor's subject names, or null for any other actor. */
10
11
  function keyIdOfSubject(subject) {
11
12
  return subject.startsWith(API_KEY_SUBJECT) ? subject.slice(API_KEY_SUBJECT.length) : null;
12
13
  }
13
- /**
14
- * Mint a new API key. The new key is ALWAYS bound to `ctx.tenantId`. Callers
15
- * cannot override the tenant via the opts bag — a previous `tenantId` field
16
- * was removed because the HTTP layer would happily forward `body.tenantId`,
17
- * letting tenant A mint a key for tenant B. The HTTP route handler at
18
- * `src/server.ts` POST /v1/auth/keys mirrors this: it ignores any body
19
- * `tenantId` and uses the resolved Bearer's tenant exclusively.
20
- *
21
- * Only an admin actor can mint (ForbiddenError otherwise), and a key never
22
- * outranks its minter: a resolver admin is tenant-only, so it mints members.
23
- */
14
+ /** Mints a key always bound to `ctx.tenantId`; opts cannot override the tenant, or tenant A could mint a key for tenant B.
15
+ * Admin only (ForbiddenError otherwise), and a key never outranks its minter: a resolver admin is tenant-only, so it mints members. */
24
16
  export function authCreate(ctx, opts) {
25
17
  // The key and its auth_create row commit together on either store, so a failed audit write leaves no key.
26
18
  return onStore(ctx, (port) => {
@@ -34,6 +26,22 @@ function newKey(ctx, fields) {
34
26
  const { keyId, plaintext, keyHash } = mintApiKey();
35
27
  return { plaintext, key: { ...fields, keyId, keyHash, tenantId: ctx.tenantId, createdAt: new Date().toISOString() } };
36
28
  }
29
+ export { DEFAULT_KEY_TTL_DAYS };
30
+ // The ceiling keeps toISOString in range.
31
+ export const MAX_TTL_DAYS = 3650;
32
+ /** A 400, not a RangeError, since the caller of the mint chose these. */
33
+ function mintExpiry({ ttlDays, noExpiry }) {
34
+ if (noExpiry && ttlDays !== undefined) {
35
+ throw new BadRequestError('send ttlDays or noExpiry, not both');
36
+ }
37
+ if (noExpiry)
38
+ return null;
39
+ const days = ttlDays ?? DEFAULT_KEY_TTL_DAYS;
40
+ if (!Number.isFinite(days) || days <= 0 || days > MAX_TTL_DAYS) {
41
+ throw new BadRequestError(`ttlDays must be above 0 and at most ${MAX_TTL_DAYS}`);
42
+ }
43
+ return new Date(Date.now() + days * DAY_MS).toISOString();
44
+ }
37
45
  function adminKeyMint(ctx, opts) {
38
46
  if (ctx.actor.role !== 'admin') {
39
47
  throw new ForbiddenError('Only an admin key can create API keys');
@@ -41,16 +49,16 @@ function adminKeyMint(ctx, opts) {
41
49
  if (ctx.actor.viaAuthResolver && opts.role === 'admin') {
42
50
  throw new ForbiddenError('A key minted through the auth resolver can only be a member key');
43
51
  }
44
- const role = opts.role ?? (ctx.actor.viaAuthResolver ? 'member' : 'admin');
52
+ const role = opts.role ?? 'member';
45
53
  const label = opts.label ?? null;
46
- const { plaintext, key } = newKey(ctx, { label, role, ownerSubject: null, expiresAt: null });
47
- // The plaintext is NEVER logged; metadata carries label + role, keyId is non-secret.
48
- return { plaintext, mint: { key, actor: ctx.actor.subject, metadata: { label, role } } };
54
+ const expiresAt = mintExpiry(opts);
55
+ const { plaintext, key } = newKey(ctx, { label, role, ownerSubject: null, expiresAt });
56
+ // The plaintext is NEVER logged; the audit row carries what the key can do and for how long, keyId is non-secret.
57
+ return { plaintext, mint: { key, actor: ctx.actor.subject, metadata: { label, role, expiresAt } } };
49
58
  }
50
59
  function createResult({ key }, plaintext) {
51
- return { keyId: key.keyId, plaintext, tenantId: key.tenantId, role: key.role };
60
+ return { keyId: key.keyId, plaintext, tenantId: key.tenantId, role: key.role, expiresAt: key.expiresAt };
52
61
  }
53
- const MAX_TTL_DAYS = 3650;
54
62
  /** A RangeError, not a 4xx, since the operator's config sets these; the ttl ceiling keeps toISOString in range and a departed user's key short-lived. */
55
63
  function assertSelfMintOpts({ ttlDays, perSubject }) {
56
64
  if (!Number.isFinite(ttlDays) || ttlDays <= 0 || ttlDays > MAX_TTL_DAYS) {
@@ -60,7 +68,8 @@ function assertSelfMintOpts({ ttlDays, perSubject }) {
60
68
  throw new RangeError(`authCreateSelf: perSubject must be a whole number of at least 1, got ${String(perSubject)}`);
61
69
  }
62
70
  }
63
- /** Mint a member key for the caller an auth resolver vouched for, whatever its role; the binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
71
+ /** Mint a member key for the caller an auth resolver vouched for, whatever its role; the
72
+ * binary floor, the cap's revokes, the mint and its audit rows commit or fail together. */
64
73
  export function authCreateSelf(ctx, opts) {
65
74
  return onStore(ctx, (port) => {
66
75
  const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
@@ -79,7 +88,10 @@ function selfKeyMint(ctx, opts) {
79
88
  // Not destructured: a binding pattern makes TypeScript infer F as KeyFields and lose ownerSubject's string type.
80
89
  const made = newKey(ctx, { label, role: 'member', ownerSubject: subject, expiresAt });
81
90
  // Same op and actor as an admin mint, so a lookup by audit row finds this key too.
82
- return { plaintext: made.plaintext, mint: { key: made.key, actor: subject, metadata: { label, role: 'member', self: true, expiresAt }, perSubject: opts.perSubject } };
91
+ return {
92
+ plaintext: made.plaintext,
93
+ mint: { key: made.key, actor: subject, metadata: { label, role: 'member', self: true, expiresAt }, perSubject: opts.perSubject }
94
+ };
83
95
  }
84
96
  function selfResult({ key }, plaintext) {
85
97
  return { keyId: key.keyId, plaintext, tenantId: key.tenantId, role: 'member', expiresAt: key.expiresAt };
@@ -88,6 +100,11 @@ function selfResult({ key }, plaintext) {
88
100
  export function authListRows(ctx, opts) {
89
101
  return onStore(ctx, (port) => listRows(ctx, port, opts));
90
102
  }
103
+ /** Every tenant's keys in the store, live ones only unless `active` is false; the host's own view, so the host admin only. */
104
+ export function authListAllTenants(ctx, active) {
105
+ requireHostAdmin(ctx, "Listing every tenant's keys");
106
+ return listApiKeys(ctx.hippoRoot, { active });
107
+ }
91
108
  function listRows(ctx, port, opts) {
92
109
  const keyWrites = port.keyWrites ?? notPorted(port, 'keyWrites');
93
110
  const keyId = memberKeyIdOf(ctx.actor);
@@ -146,16 +163,13 @@ function assertMemberKeyRevokesSelf(ctx, keyId) {
146
163
  function keyOwnerOf(record) {
147
164
  return record ? { tenantId: record.tenantId, revokedAt: record.revokedAt, role: record.role, ownerSubject: record.ownerSubject ?? null } : undefined;
148
165
  }
149
- /**
150
- * The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
151
- * so the local CLI can run revoke and grant in the key's own tenant.
152
- */
153
- export function authKeyTenant(ctx, keyId) {
166
+ /** The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
167
+ * so the local CLI can run revoke and grant in the key's own tenant. */
168
+ export async function authKeyTenant(ctx, keyId) {
154
169
  if (!ctx.actor.hostAdmin) {
155
170
  throw new ForbiddenError('Only the host admin can look up a key across tenants');
156
171
  }
157
- // Synchronous for the CLI, so it reads hippo.db whatever store ctx names.
158
- return sqliteSyncStore(ctx.hippoRoot).findApiKey(keyId)?.tenantId;
172
+ return (await storeFor(ctx).findApiKey(keyId))?.tenantId;
159
173
  }
160
174
  /** Grant `keyId` read access to one restricted `scope`. Admin only. */
161
175
  export function authGrant(ctx, keyId, scope) {
@@ -1,5 +1,7 @@
1
1
  import type { HippoConfig } from '../core/config.js';
2
2
  export declare const autoSleepInFlight: Set<string>;
3
+ /** Runs one auto-sleep consolidation of `hippoRoot`: the HTTP server passes one that runs it off its event loop, in a child process. */
4
+ export type AutoSleepRunner = (hippoRoot: string) => Promise<void>;
3
5
  export interface AutoSleepDue {
4
6
  enabled: boolean;
5
7
  count: number;
@@ -8,6 +10,7 @@ export interface AutoSleepDue {
8
10
  }
9
11
  /** Counts only when enabled: the count opens the store. */
10
12
  export declare function autoSleepDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep']): AutoSleepDue;
11
- /** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it. */
12
- export declare function startAutoSleepIfDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep'], allowed: boolean): void;
13
+ /** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
14
+ * Without `run`, it runs in process. */
15
+ export declare function startAutoSleepIfDue(hippoRoot: string, tenantId: string, config: HippoConfig['autoSleep'], allowed: boolean, run?: AutoSleepRunner): void;
13
16
  //# sourceMappingURL=auto-sleep.d.ts.map
@@ -1,5 +1,5 @@
1
1
  // When a write starts a background sleep; the MCP remember tool and the session-close hook share it.
2
- import { errorMessage, log } from '../util/log.js';
2
+ import { errorFields, errorMessage, log } from '../util/log.js';
3
3
  import { countCreatedSinceLastSleep } from '../store/index-and-stats.js';
4
4
  import { consolidate } from '../consolidate/sleep.js';
5
5
  import { outsideRequestStores, runWithRequestStores, scopedBusyWait } from '../db/index.js';
@@ -11,8 +11,9 @@ export function autoSleepDue(hippoRoot, tenantId, config) {
11
11
  const count = enabled ? countCreatedSinceLastSleep(hippoRoot, tenantId) : 0;
12
12
  return { enabled, count, threshold, due: enabled && count >= threshold };
13
13
  }
14
- /** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it. */
15
- export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed) {
14
+ /** One run per store at a time; `allowed` is the caller's own gate. Consolidation is host-wide, so only the host tenant may start it.
15
+ * Without `run`, it runs in process. */
16
+ export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed, run) {
16
17
  if (!allowed ||
17
18
  !config.enabled ||
18
19
  tenantId !== resolveTenantId({}) ||
@@ -23,9 +24,12 @@ export function startAutoSleepIfDue(hippoRoot, tenantId, config, allowed) {
23
24
  // Fire-and-forget (never block the response); an unhandled rejection would kill the server, so log it.
24
25
  // Its own scope: the call's closes a handle the sleep still holds across its pauses, but the caller's lock wait carries over.
25
26
  const busyWaitMs = scopedBusyWait();
26
- outsideRequestStores(() => runWithRequestStores(() => consolidate(hippoRoot), { busyWaitMs }))
27
+ const started = run
28
+ ? run(hippoRoot)
29
+ : outsideRequestStores(() => runWithRequestStores(() => consolidate(hippoRoot), { busyWaitMs }));
30
+ started
27
31
  .catch((err) => {
28
- log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${errorMessage(err)}`);
32
+ log.error(`auto-sleep consolidate failed (tenant ${tenantId}): ${errorMessage(err)}`, errorFields(err));
29
33
  })
30
34
  .finally(() => autoSleepInFlight.delete(hippoRoot));
31
35
  }
@@ -46,20 +46,7 @@ export declare const DEFAULT_RECENT_FRACTION_THRESHOLD = 0.7;
46
46
  export declare const DEFAULT_MIN_RETURNED = 3;
47
47
  export declare const DEFAULT_MIN_POOL = 10;
48
48
  export declare const DEFAULT_MIN_OLDER_PASSED_OVER = 3;
49
- /**
50
- * Detect availability/recency bias in a recall result.
51
- *
52
- * Returns an AvailabilityHint when ALL of the following hold:
53
- * 1. topK.length >= minReturned AND pool.length >= minPool (enough signal);
54
- * 2. recentFraction > recentFractionThreshold (returned slice is recency-dominated);
55
- * 3. poolMedianAgeDays > topKMedianAgeDays (the pool genuinely skews older,
56
- * so recency is not just the corpus being young);
57
- * 4. olderCandidatesPassedOver >= minOlderPassedOver (older matched memories
58
- * actually existed and were not returned).
59
- * Otherwise returns null.
60
- *
61
- * Entries with an unparseable `created` are dropped defensively so a malformed
62
- * row cannot poison the medians with NaN.
63
- */
49
+ /** Returns an AvailabilityHint when the returned slice is recency-dominated, the pool skews older and older matches were passed over; else null.
50
+ * Entries with an unparseable `created` are dropped so a malformed row cannot poison the medians with NaN. */
64
51
  export declare function detectAvailabilityBias(opts: DetectAvailabilityBiasOpts): AvailabilityHint | null;
65
52
  //# sourceMappingURL=availability.d.ts.map
@@ -1,10 +1,9 @@
1
- import { DAY_MS } from '../util/time.js';
1
+ import { DAY_MS, HOUR_MS } from '../util/time.js';
2
2
  export const DEFAULT_RECENCY_WINDOW_MS = DAY_MS;
3
3
  export const DEFAULT_RECENT_FRACTION_THRESHOLD = 0.7;
4
4
  export const DEFAULT_MIN_RETURNED = 3;
5
5
  export const DEFAULT_MIN_POOL = 10;
6
6
  export const DEFAULT_MIN_OLDER_PASSED_OVER = 3;
7
- const MS_PER_HOUR = 60 * 60 * 1000;
8
7
  function median(nums) {
9
8
  if (nums.length === 0)
10
9
  return 0;
@@ -17,21 +16,8 @@ function parseTimestamps(refs) {
17
16
  .map((e) => ({ id: e.id, ts: Date.parse(e.created) }))
18
17
  .filter((e) => Number.isFinite(e.ts));
19
18
  }
20
- /**
21
- * Detect availability/recency bias in a recall result.
22
- *
23
- * Returns an AvailabilityHint when ALL of the following hold:
24
- * 1. topK.length >= minReturned AND pool.length >= minPool (enough signal);
25
- * 2. recentFraction > recentFractionThreshold (returned slice is recency-dominated);
26
- * 3. poolMedianAgeDays > topKMedianAgeDays (the pool genuinely skews older,
27
- * so recency is not just the corpus being young);
28
- * 4. olderCandidatesPassedOver >= minOlderPassedOver (older matched memories
29
- * actually existed and were not returned).
30
- * Otherwise returns null.
31
- *
32
- * Entries with an unparseable `created` are dropped defensively so a malformed
33
- * row cannot poison the medians with NaN.
34
- */
19
+ /** Returns an AvailabilityHint when the returned slice is recency-dominated, the pool skews older and older matches were passed over; else null.
20
+ * Entries with an unparseable `created` are dropped so a malformed row cannot poison the medians with NaN. */
35
21
  export function detectAvailabilityBias(opts) {
36
22
  const now = opts.now ?? Date.now();
37
23
  const recencyWindowMs = opts.recencyWindowMs ?? DEFAULT_RECENCY_WINDOW_MS;
@@ -56,7 +42,7 @@ export function detectAvailabilityBias(opts) {
56
42
  if (olderCandidatesPassedOver < minOlderPassedOver)
57
43
  return null;
58
44
  const pct = Math.round(recentFraction * 100);
59
- const windowHours = Math.round(recencyWindowMs / MS_PER_HOUR);
45
+ const windowHours = Math.round(recencyWindowMs / HOUR_MS);
60
46
  const summary = `Availability bias risk: ${recentCount} of ${topK.length} returned results are from the ` +
61
47
  `last ${windowHours}h (${pct}%), but ${olderCandidatesPassedOver} older matched memories ` +
62
48
  `were passed over. Returned median age ${topKMedianAgeDays.toFixed(1)}d vs pool median ` +
@@ -0,0 +1,42 @@
1
+ import type { Card, CardComment, CardRun, CardStatus } from '../core/card.js';
2
+ import type { HandoffOutcome } from '../core/handoff.js';
3
+ import { type CardDetail } from '../store/card-detail.js';
4
+ import type { Context } from './types.js';
5
+ /** Create a card in the caller's tenant. Throws on an empty title or an unknown dependency. */
6
+ export declare function cardCreate(ctx: Context, input: {
7
+ title: string;
8
+ repo?: string;
9
+ contract?: string;
10
+ budget?: number;
11
+ dependsOn?: string[];
12
+ }): Card;
13
+ /** One card by id, or null when the caller's tenant has none. */
14
+ export declare function cardLoad(ctx: Context, id: string): Card | null;
15
+ /** The card with its dependencies, runs, comments and latest handoff, or null when unknown. */
16
+ export declare function cardDetail(ctx: Context, id: string): CardDetail | null;
17
+ /** The caller's cards, newest-updated first, optionally filtered to one status. */
18
+ export declare function cardList(ctx: Context, opts?: {
19
+ status?: CardStatus;
20
+ }): Card[];
21
+ /** Every run of a card, newest first. */
22
+ export declare function cardRuns(ctx: Context, id: string): CardRun[];
23
+ /** Claim a ready or blocked card for a runtime; null when it cannot be claimed. */
24
+ export declare function cardClaim(ctx: Context, id: string, runtime: string, sessionId?: string): (Card & {
25
+ runId: number;
26
+ }) | null;
27
+ /** Extend a live run's lease; null when the run is not live. */
28
+ export declare function cardHeartbeat(ctx: Context, id: string, runId: number): Card | null;
29
+ /** Block a running card with a reason; null when it is not running. */
30
+ export declare function cardBlock(ctx: Context, id: string, reason: string, runId?: number): Card | null;
31
+ /** Move a running card to review; null when it is not running. */
32
+ export declare function cardReview(ctx: Context, id: string, runId?: number): Card | null;
33
+ /** Complete a card in review and promote the children it unblocks; null when not in review. */
34
+ export declare function cardComplete(ctx: Context, id: string, outcome: HandoffOutcome, runId?: number): {
35
+ card: Card;
36
+ promotedChildren: string[];
37
+ } | null;
38
+ /** Return every card with an expired lease to ready; yields the reclaimed ids. */
39
+ export declare function cardReclaimExpired(ctx: Context): string[];
40
+ /** Add a comment to a card. Throws on an empty body. */
41
+ export declare function cardComment(ctx: Context, cardId: string, author: string, body: string): CardComment;
42
+ //# sourceMappingURL=cards.d.ts.map
@@ -0,0 +1,52 @@
1
+ // The agent work board: create, claim, review and complete cards, scoped to the caller's tenant.
2
+ import { addCardComment, blockCard, claimCard, completeCard, createCard, heartbeatCard, listCards, loadCard, loadCardRuns, reclaimExpiredCards, reviewCard, } from '../store/cards.js';
3
+ import { loadCardDetail } from '../store/card-detail.js';
4
+ /** Create a card in the caller's tenant. Throws on an empty title or an unknown dependency. */
5
+ export function cardCreate(ctx, input) {
6
+ return createCard(ctx.hippoRoot, ctx.tenantId, input);
7
+ }
8
+ /** One card by id, or null when the caller's tenant has none. */
9
+ export function cardLoad(ctx, id) {
10
+ return loadCard(ctx.hippoRoot, ctx.tenantId, id);
11
+ }
12
+ /** The card with its dependencies, runs, comments and latest handoff, or null when unknown. */
13
+ export function cardDetail(ctx, id) {
14
+ return loadCardDetail(ctx.hippoRoot, ctx.tenantId, id);
15
+ }
16
+ /** The caller's cards, newest-updated first, optionally filtered to one status. */
17
+ export function cardList(ctx, opts = {}) {
18
+ return listCards(ctx.hippoRoot, ctx.tenantId, opts);
19
+ }
20
+ /** Every run of a card, newest first. */
21
+ export function cardRuns(ctx, id) {
22
+ return loadCardRuns(ctx.hippoRoot, ctx.tenantId, id);
23
+ }
24
+ /** Claim a ready or blocked card for a runtime; null when it cannot be claimed. */
25
+ export function cardClaim(ctx, id, runtime, sessionId) {
26
+ return claimCard(ctx.hippoRoot, ctx.tenantId, id, runtime, sessionId);
27
+ }
28
+ /** Extend a live run's lease; null when the run is not live. */
29
+ export function cardHeartbeat(ctx, id, runId) {
30
+ return heartbeatCard(ctx.hippoRoot, ctx.tenantId, id, runId);
31
+ }
32
+ /** Block a running card with a reason; null when it is not running. */
33
+ export function cardBlock(ctx, id, reason, runId) {
34
+ return blockCard(ctx.hippoRoot, ctx.tenantId, id, reason, runId);
35
+ }
36
+ /** Move a running card to review; null when it is not running. */
37
+ export function cardReview(ctx, id, runId) {
38
+ return reviewCard(ctx.hippoRoot, ctx.tenantId, id, runId);
39
+ }
40
+ /** Complete a card in review and promote the children it unblocks; null when not in review. */
41
+ export function cardComplete(ctx, id, outcome, runId) {
42
+ return completeCard(ctx.hippoRoot, ctx.tenantId, id, outcome, runId);
43
+ }
44
+ /** Return every card with an expired lease to ready; yields the reclaimed ids. */
45
+ export function cardReclaimExpired(ctx) {
46
+ return reclaimExpiredCards(ctx.hippoRoot, ctx.tenantId);
47
+ }
48
+ /** Add a comment to a card. Throws on an empty body. */
49
+ export function cardComment(ctx, cardId, author, body) {
50
+ return addCardComment(ctx.hippoRoot, ctx.tenantId, cardId, author, body);
51
+ }
52
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1,28 @@
1
+ import type { MemoryConflict } from '../store/rows.js';
2
+ import type { CallerProject } from './prompt-hook.js';
3
+ import { type Context } from './types.js';
4
+ import type { TenantReach } from './memories.js';
5
+ export interface ResolveMemoryConflictOpts {
6
+ /** One of the conflict's two memories; the other is the loser. */
7
+ keepId: string;
8
+ /** Delete the loser instead of halving its half-life. */
9
+ forget?: boolean;
10
+ /** Tombstone the loser's value as well, which removes it whatever `forget` says. */
11
+ rejectLoser?: boolean;
12
+ /** Kept on the tombstone; a conflict-context reason when unset. */
13
+ reason?: string;
14
+ }
15
+ export interface ResolveMemoryConflictResult {
16
+ conflictId: number;
17
+ keptId: string;
18
+ loserId: string;
19
+ }
20
+ /** Keeps `keepId` and weakens, deletes or rejects the other side of an open conflict in the caller's tenant, auditing as `ctx.actor`.
21
+ * NotFound: missing, untouchable or no longer live. Conflict: already resolved. BadRequest: `keepId` outside the pair. */
22
+ export declare function resolveMemoryConflict(ctx: Context, conflictId: number, opts: ResolveMemoryConflictOpts): ResolveMemoryConflictResult;
23
+ /** Open conflicts whose two rows the caller may touch; with `project`, only pairs it could also recall:
24
+ * its repo or user-global, and no scope it was not asked for. */
25
+ export declare function listOpenConflicts(ctx: Context, project?: CallerProject): MemoryConflict[];
26
+ /** Conflicts with `status` ('*' for any) in reach, with no scope filter: the host's own view, so the host admin only. */
27
+ export declare function listConflicts(ctx: Context, status: string, reach?: TenantReach): MemoryConflict[];
28
+ //# sourceMappingURL=conflicts.d.ts.map
@@ -0,0 +1,61 @@
1
+ // Conflict resolution for every front end, so the reach, status, pair and liveness checks live in one place.
2
+ // SHORTCUT: hippo.db only, since the store port has no conflict calls; a conflicts group when a served store needs them.
3
+ import { BadRequestError, ConflictError, NotFoundError } from '../core/api-errors.js';
4
+ import { listMemoryConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
+ import { loadEntriesByIds } from '../store/entry-reads.js';
6
+ import { chunked } from '../util/chunked.js';
7
+ import { passesScopeFilterForRecall, personalScopeOf } from '../core/recall-scope.js';
8
+ import { classifyOriginProject } from '../core/project-identity.js';
9
+ import { isQuarantineScope } from '../trust/quarantine.js';
10
+ import { requireHostAdmin } from './types.js';
11
+ function isLive(entry) {
12
+ return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
13
+ }
14
+ /** Keeps `keepId` and weakens, deletes or rejects the other side of an open conflict in the caller's tenant, auditing as `ctx.actor`.
15
+ * NotFound: missing, untouchable or no longer live. Conflict: already resolved. BadRequest: `keepId` outside the pair. */
16
+ export function resolveMemoryConflict(ctx, conflictId, opts) {
17
+ // Read with every status, so a resolved conflict answers 409 while one holding another person's personal row stays a 404.
18
+ const conflict = listTouchableConflicts(ctx.hippoRoot, '*', ctx.tenantId, ctx.actor).find((c) => c.id === conflictId);
19
+ if (!conflict)
20
+ throw new NotFoundError(`conflict not found: ${conflictId}`);
21
+ if (conflict.status !== 'open')
22
+ throw new ConflictError(`conflict ${conflictId} is already resolved`);
23
+ const pair = [conflict.memory_a_id, conflict.memory_b_id];
24
+ if (!pair.includes(opts.keepId))
25
+ throw new BadRequestError(`keep must be one of the two memories in conflict ${conflictId}: ${pair.join(', ')}`);
26
+ if (loadEntriesByIds(ctx.hippoRoot, pair, ctx.tenantId).filter(isLive).length < pair.length) {
27
+ throw new NotFoundError(`conflict ${conflictId} names a memory that is superseded, archived or quarantined`);
28
+ }
29
+ const resolved = resolveConflict(ctx.hippoRoot, conflictId, opts.keepId, opts.forget === true, ctx.tenantId, {
30
+ rejectLoserValue: opts.rejectLoser === true,
31
+ reason: opts.reason,
32
+ rejectedBy: ctx.actor.subject,
33
+ });
34
+ // Every check passed above, so null here is another resolver getting there first.
35
+ if (resolved === null)
36
+ throw new ConflictError(`conflict ${conflictId} is already resolved`);
37
+ return { conflictId, keptId: opts.keepId, loserId: resolved.loserId };
38
+ }
39
+ /** Open conflicts whose two rows the caller may touch; with `project`, only pairs it could also recall:
40
+ * its repo or user-global, and no scope it was not asked for. */
41
+ export function listOpenConflicts(ctx, project) {
42
+ const touchable = listTouchableConflicts(ctx.hippoRoot, 'open', ctx.tenantId, ctx.actor);
43
+ if (!project)
44
+ return touchable;
45
+ const own = personalScopeOf(ctx.actor);
46
+ const ids = [...new Set(touchable.flatMap((c) => [c.memory_a_id, c.memory_b_id]))];
47
+ // loadEntriesByIds reads at most one chunk of ids per call.
48
+ const rows = new Map(chunked(ids).flatMap((chunk) => loadEntriesByIds(ctx.hippoRoot, chunk, ctx.tenantId)).map((row) => [row.id, row]));
49
+ const shown = (id) => {
50
+ const row = rows.get(id);
51
+ return row !== undefined && classifyOriginProject(row.origin_project, project) !== 'cross-project'
52
+ && passesScopeFilterForRecall(row.scope ?? null, undefined, own);
53
+ };
54
+ return touchable.filter((c) => shown(c.memory_a_id) && shown(c.memory_b_id));
55
+ }
56
+ /** Conflicts with `status` ('*' for any) in reach, with no scope filter: the host's own view, so the host admin only. */
57
+ export function listConflicts(ctx, status, reach = {}) {
58
+ requireHostAdmin(ctx, 'Listing conflicts past the scope check');
59
+ return listMemoryConflicts(ctx.hippoRoot, status, reach.everyTenant ? undefined : ctx.tenantId);
60
+ }
61
+ //# sourceMappingURL=conflicts.js.map
@@ -1,6 +1,7 @@
1
1
  // The strings a context block prints. The budget prices these same strings, so selection and print cannot drift.
2
+ import { MINUTE_MS } from '../util/time.js';
2
3
  import { calculateStrength, confidenceFacets, confidenceLabel } from '../core/memory.js';
3
- import { evalNow } from '../core/ablation.js';
4
+ import { evalNow, strengthAblation } from '../core/ablation.js';
4
5
  import { estimateTokens } from '../util/token-text.js';
5
6
  import { renderAmbientSummary } from '../core/ambient.js';
6
7
  import { formatHandoffEvidenceLine } from '../core/handoff.js';
@@ -56,7 +57,7 @@ export function sessionTrailText(events) {
56
57
  // Each trail event is capped only in the compact-resume block, so other trail prints keep full content.
57
58
  export const COMPACT_RESUME_EVENT_CONTENT_CAP = 400;
58
59
  // A snapshot older than this was not written for this compaction (pre-compact skipped), so restoring it is stale, not a resume.
59
- export const COMPACT_RESUME_MAX_AGE_MS = 15 * 60_000;
60
+ export const COMPACT_RESUME_MAX_AGE_MS = 15 * MINUTE_MS;
60
61
  /** The block compact-resume hands the model; events arrive already capped. */
61
62
  export function compactResumeText(snapshot, events) {
62
63
  return [
@@ -71,7 +72,7 @@ export function compactResumeText(snapshot, events) {
71
72
  export function contextHeading(heading, entries, tokens) {
72
73
  return `## ${heading} (${entries} entries, ${tokens} tokens)\n`;
73
74
  }
74
- export function contextLine(item, framing, showStrength, now, strengthPct = Math.round(calculateStrength(item.entry) * 100)) {
75
+ export function contextLine(item, framing, showStrength, now, strengthPct = Math.round(calculateStrength(item.entry, undefined, { ablation: strengthAblation() }) * 100)) {
75
76
  const e = item.entry;
76
77
  const tagStr = e.tags.length > 0 ? ` [${e.tags.join(', ')}]` : '';
77
78
  const strengthStr = showStrength ? ` (${strengthPct}%)` : '';