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/learn.js CHANGED
@@ -3,16 +3,16 @@ import { ForbiddenError } from '../core/api-errors.js';
3
3
  import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../learn/autolearn.js';
4
4
  import { loadConfig } from '../core/config.js';
5
5
  import { withRequestStoresSync } from '../db/request-stores.js';
6
- import { embedMemory } from '../store/embeddings/index.js';
7
- import { extractInvalidationTarget, invalidateMatchingAmong } from '../learn/invalidation.js';
8
- import { computeSchemaFit, createMemory, Layer } from '../core/memory.js';
6
+ import { embedMemory } from '../search/embed-memories.js';
7
+ import { extractInvalidationTarget, invalidateMatching, invalidateMatchingAmong, } from '../learn/invalidation.js';
8
+ import { createMemory, Layer, schemaFitFrom, schemaFitSourceOf } from '../core/memory.js';
9
9
  import { extractPathTags } from '../search/path-context.js';
10
- import { canReadScope, personalScopeOf, touchableScopeSql } from '../store/recall-scope.js';
11
- import { RejectedValueError } from '../store/rejection.js';
10
+ import { canReadScope, personalScopeOf } from '../core/recall-scope.js';
11
+ import { touchableScopeSql } from '../store/rule-sql.js';
12
12
  import { duplicateKey, longestWord, storedTextKeys } from '../util/same-text.js';
13
13
  import { loadTextsHoldingWords } from '../store/candidates.js';
14
14
  import { loadAllEntries } from '../store/entry-reads.js';
15
- import { writeEntry } from '../store/entry-writes.js';
15
+ import { writeEntriesSkippingRejected } from '../store/entry-writes.js';
16
16
  import { updateStats } from '../store/index-and-stats.js';
17
17
  // SHORTCUT: two profiles keep each surface's rows as they were; fold MCP onto the CLI profile once it may invalidate.
18
18
  export const CLI_LEARN = Object.freeze({ tags: Object.freeze(['error', 'git-learned']), source: 'git-learn', full: true });
@@ -36,6 +36,34 @@ export function learn(ctx, opts) {
36
36
  const { kept, dropped } = partitionLessons(parsed);
37
37
  return { status: 'scanned', lowInfo: dropped.length, ...writeLessons(ctx, kept, opts, config) };
38
38
  }
39
+ /** Writes `batch` in one transaction; a refused lesson is dropped from `live` and `keys` and must not abort the rest of the git-log scan. */
40
+ function landLessons(ctx, batch, live, keys, counts, full) {
41
+ if (batch.length === 0)
42
+ return;
43
+ // SHORTCUT: hippo.db only, as the port has no batch write, stats bump or whole-tenant read, so another store kind answers 501 at the
44
+ // open; port groups for them once a served store must learn.
45
+ const landed = [];
46
+ writeEntriesSkippingRejected(ctx.hippoRoot, (put) => {
47
+ for (const { entry, key } of batch) {
48
+ if (put(entry)) {
49
+ landed.push(entry);
50
+ continue;
51
+ }
52
+ counts.rejected++;
53
+ keys.delete(key);
54
+ const at = live.indexOf(entry);
55
+ if (at !== -1)
56
+ live.splice(at, 1);
57
+ }
58
+ }, ctx.actor.subject);
59
+ counts.added += landed.length;
60
+ if (!full)
61
+ return;
62
+ if (landed.length > 0)
63
+ updateStats(ctx.hippoRoot, { remembered: landed.length });
64
+ for (const entry of landed)
65
+ void embedMemory(ctx.hippoRoot, entry);
66
+ }
39
67
  function writeLessons(ctx, lessons, opts, config) {
40
68
  const { hippoRoot, tenantId } = ctx;
41
69
  const { profile } = opts;
@@ -43,19 +71,27 @@ function writeLessons(ctx, lessons, opts, config) {
43
71
  return withRequestStoresSync(() => {
44
72
  // One read serves the batch: invalidation matches against `live`, which follows every write below, as a reload per lesson did.
45
73
  const live = profile.full ? loadAllEntries(hippoRoot, tenantId) : [];
46
- // Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy. Learn is host-admin only, so both read what an admin can.
74
+ // Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy. Learn is host-admin only, so
75
+ // both read what an admin can.
47
76
  const existing = profile.full ? live.filter((e) => e.scope == null || canReadScope(ctx.actor, e.scope)) : undefined;
77
+ // Each lesson is scored against `existing` as it was before the batch, so its tag counts and texts are read once.
78
+ const fitSource = existing && schemaFitSourceOf(existing);
48
79
  const readable = touchableScopeSql('', personalScopeOf(ctx.actor));
49
80
  const keys = storedTextKeys(existing ?? loadTextsHoldingWords(hippoRoot, tenantId, lessons.map(longestWord), undefined, readable));
50
81
  const pathTags = profile.full ? extractPathTags(opts.repoPath) : [];
51
82
  const counts = { added: 0, skipped: 0, rejected: 0, invalidations: [] };
83
+ // Lessons queue and land in one transaction; an invalidation reads the store, so it flushes the queue first.
84
+ const queue = [];
85
+ const flush = () => landLessons(ctx, queue.splice(0), live, keys, counts, profile.full);
52
86
  for (const lesson of lessons) {
53
- if (keys.has(duplicateKey(lesson))) {
87
+ const key = duplicateKey(lesson);
88
+ if (keys.has(key)) {
54
89
  counts.skipped++;
55
90
  continue;
56
91
  }
57
92
  const target = profile.full ? extractInvalidationTarget(lesson) : null;
58
93
  if (target) {
94
+ flush();
59
95
  const { invalidated } = invalidateMatchingAmong(hippoRoot, live, target, tenantId);
60
96
  if (invalidated > 0)
61
97
  counts.invalidations.push({ from: target.from, count: invalidated });
@@ -65,34 +101,24 @@ function writeLessons(ctx, lessons, opts, config) {
65
101
  tags: [...profile.tags],
66
102
  source: profile.source,
67
103
  confidence: 'observed',
68
- schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
104
+ schema_fit: fitSource && schemaFitFrom(lesson, [...profile.tags], fitSource),
69
105
  tenantId,
70
106
  baseHalfLifeDays: config.defaultHalfLifeDays,
71
107
  });
72
108
  for (const tag of pathTags)
73
109
  if (!entry.tags.includes(tag))
74
110
  entry.tags.push(tag);
75
- // A refused lesson must not abort the rest of the git-log scan.
76
- try {
77
- writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
78
- }
79
- catch (err) {
80
- if (err instanceof RejectedValueError) {
81
- counts.rejected++;
82
- continue;
83
- }
84
- throw err;
85
- }
86
- if (profile.full) {
87
- updateStats(hippoRoot, { remembered: 1 });
88
- live.push(entry);
89
- }
90
- keys.add(duplicateKey(lesson));
111
+ queue.push({ entry, key });
91
112
  if (profile.full)
92
- void embedMemory(hippoRoot, entry);
93
- counts.added++;
113
+ live.push(entry);
114
+ keys.add(key);
94
115
  }
116
+ flush();
95
117
  return counts;
96
118
  });
97
119
  }
120
+ /** `hippo invalidate`: weakens the caller's tenant's memories that reference `target.from`, or only the one `options.onlyId` names. */
121
+ export function invalidateMemories(ctx, target, options) {
122
+ return invalidateMatching(ctx.hippoRoot, target, ctx.tenantId, options);
123
+ }
98
124
  //# sourceMappingURL=learn.js.map
@@ -1,4 +1,3 @@
1
- import { type openHippoDb } from '../db/index.js';
2
1
  import { type LedgerTurn } from '../store/ledger-turn.js';
3
2
  import type { LastSent, TokenSurface, TokenUse } from '../store/token-ledger.js';
4
3
  export interface LedgerRootOpts {
@@ -7,14 +6,12 @@ export interface LedgerRootOpts {
7
6
  }
8
7
  /** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
9
8
  export declare function ledgerRoot(hippoRoot: string, opts?: LedgerRootOpts): string | null;
10
- /** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
11
- export declare function noteLedgerRowSkipped<E>(error: E): void;
9
+ /** Runs `call` on ledgerRoot's store root. Best-effort: undefined on any failure, because a ledger failure must not break context or recall. */
10
+ export declare function onLedgerRoot<T>(hippoRoot: string, opts: LedgerRootOpts | undefined, call: (root: string) => T): T | undefined;
12
11
  /** Books one row in ledgerRoot's store, best-effort. */
13
12
  export declare function bookTokenUse(hippoRoot: string, use: TokenUse, opts?: LedgerRootOpts): void;
14
13
  /** Books a turn's rows and then its delivery event on one connection of ledgerRoot's store, best-effort. */
15
14
  export declare function bookLedgerTurn(hippoRoot: string, turn: LedgerTurn, opts?: LedgerRootOpts): void;
16
15
  /** What the session last sent on `surface` in ledgerRoot's store; undefined with no ledger or a failed read. */
17
16
  export declare function ledgerLastSent(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface, opts?: LedgerRootOpts): LastSent | null | undefined;
18
- /** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
19
- export declare function withLedgerDb<T>(hippoRoot: string, fn: (db: ReturnType<typeof openHippoDb>) => T, opts?: LedgerRootOpts): T | undefined;
20
17
  //# sourceMappingURL=ledger-db.d.ts.map
@@ -1,9 +1,8 @@
1
1
  // The store the token ledger writes to for a caller's root; context, recall and the session hooks share it.
2
- import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
3
- import { errorFields, errorMessage, log } from '../util/log.js';
4
- import { getGlobalRoot } from '../sharing/shared.js';
5
- import { lastSentOnSurface, recordLedgerTurn } from '../store/ledger-turn.js';
6
- import { isInitialized, onHandle } from '../store/open.js';
2
+ import { errorMessage, log } from '../util/log.js';
3
+ import { getGlobalRoot } from '../sharing/global-store.js';
4
+ import { lastSentOnSurface, noteLedgerRowSkipped, recordLedgerTurn } from '../store/ledger-turn.js';
5
+ import { isInitialized } from '../core/project-identity.js';
7
6
  import { sqliteSyncStore } from '../store/sqlite/store.js';
8
7
  /** `hippoRoot` when it holds a store, else the global store (the prompt hook fires where no local one exists), else null. */
9
8
  export function ledgerRoot(hippoRoot, opts) {
@@ -14,33 +13,8 @@ export function ledgerRoot(hippoRoot, opts) {
14
13
  const globalRoot = getGlobalRoot();
15
14
  return isInitialized(globalRoot) ? globalRoot : null;
16
15
  }
17
- // SQLite's result codes for a hippo.db it cannot read: a corrupt image, and a file that is no database.
18
- const SQLITE_CORRUPT = 11;
19
- const SQLITE_NOTADB = 26;
20
- /** The one rule for a skipped ledger row. `absent` is a store with no token_ledger table or a hippo.db SQLite cannot read; the command that owns the store reports that, and a hook must stay quiet about it. */
21
- function ledgerSkipClass(error) {
22
- if (isSqliteBusy(error))
23
- return 'busy';
24
- const code = error instanceof Error && 'errcode' in error ? error.errcode : undefined;
25
- if (code === SQLITE_CORRUPT || code === SQLITE_NOTADB)
26
- return 'absent';
27
- return errorMessage(error).includes('no such table: token_ledger') ? 'absent' : 'unexpected';
28
- }
29
- /** Says why a ledger row did not land, at the level its class earns: busy warns once through noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
30
- export function noteLedgerRowSkipped(error) {
31
- const skip = ledgerSkipClass(error);
32
- if (skip === 'busy') {
33
- noteStoreBusy('token ledger row skipped');
34
- return;
35
- }
36
- const message = `token ledger row skipped: ${errorMessage(error)}`;
37
- if (skip === 'absent')
38
- log.debug(message);
39
- else
40
- log.warnThenDebug('token-ledger-row', message, errorFields(error));
41
- }
42
16
  /** Runs `call` on ledgerRoot's store root. Best-effort: undefined on any failure, because a ledger failure must not break context or recall. */
43
- function onLedgerRoot(hippoRoot, opts, call) {
17
+ export function onLedgerRoot(hippoRoot, opts, call) {
44
18
  let root = null;
45
19
  try {
46
20
  root = ledgerRoot(hippoRoot, opts);
@@ -72,8 +46,4 @@ export function bookLedgerTurn(hippoRoot, turn, opts) {
72
46
  export function ledgerLastSent(hippoRoot, tenantId, sessionId, surface, opts) {
73
47
  return onLedgerRoot(hippoRoot, opts, (root) => lastSentOnSurface(root, tenantId, sessionId, surface));
74
48
  }
75
- /** Runs `fn` on a handle of ledgerRoot's store, best-effort as the calls above. */
76
- export function withLedgerDb(hippoRoot, fn, opts) {
77
- return onLedgerRoot(hippoRoot, opts, (root) => onHandle(root, fn));
78
- }
79
49
  //# sourceMappingURL=ledger-db.js.map
@@ -0,0 +1,23 @@
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import { type StrengthTallies } from '../store/candidates.js';
3
+ import { type Context } from './types.js';
4
+ /** The row `id` in the caller's tenant, or null when it is missing or another tenant's. */
5
+ export declare function getMemory(ctx: Context, id: string): Promise<MemoryEntry | null>;
6
+ /** getMemory, but NotFound when the row is another person's personal one, so the reply does not reveal that the id exists. */
7
+ export declare function getTouchableMemory(ctx: Context, id: string): Promise<MemoryEntry | null>;
8
+ export interface MemoryStatus extends StrengthTallies {
9
+ openConflicts: number;
10
+ }
11
+ /** Tenant-wide counts behind the status verbs: strength tallies at `now` (at risk is under `atRiskBelow`) and open conflicts. */
12
+ export declare function getMemoryStatus(ctx: Context, now: Date, atRiskBelow: number): MemoryStatus;
13
+ /** Which rows a read covers: the caller's tenant, or with `everyTenant` the whole store. */
14
+ export interface TenantReach {
15
+ everyTenant?: boolean;
16
+ }
17
+ /** Every memory row in reach, oldest first. */
18
+ export declare function listMemories(ctx: Context, reach?: TenantReach): MemoryEntry[];
19
+ /** How many memory rows the whole store holds, counted in SQL. */
20
+ export declare function countAllMemories(ctx: Context): number;
21
+ /** The rows in reach among `ids`; a missing id or one out of reach is absent. */
22
+ export declare function listMemoriesByIds(ctx: Context, ids: readonly string[], reach?: TenantReach): MemoryEntry[];
23
+ //# sourceMappingURL=memories.d.ts.map
@@ -0,0 +1,46 @@
1
+ import { loadStrengthTallies } from '../store/candidates.js';
2
+ import { countOpenConflicts } from '../store/conflicts.js';
3
+ import { NotFoundError } from '../core/api-errors.js';
4
+ import { canTouchScope } from '../core/recall-scope.js';
5
+ import { storeFor } from '../store/index.js';
6
+ import { countAllEntries, loadAllEntries, loadEntriesByIds } from '../store/entry-reads.js';
7
+ import { requireHostAdmin } from './types.js';
8
+ /** The row `id` in the caller's tenant, or null when it is missing or another tenant's. */
9
+ export async function getMemory(ctx, id) {
10
+ const [entry] = await storeFor(ctx).entriesByIds([id], ctx.tenantId);
11
+ return entry ?? null;
12
+ }
13
+ /** getMemory, but NotFound when the row is another person's personal one, so the reply does not reveal that the id exists. */
14
+ export async function getTouchableMemory(ctx, id) {
15
+ const entry = await getMemory(ctx, id);
16
+ if (!canTouchScope(ctx.actor, entry?.scope ?? null))
17
+ throw new NotFoundError(`Memory not found: ${id}`);
18
+ return entry;
19
+ }
20
+ /** Tenant-wide counts behind the status verbs: strength tallies at `now` (at risk is under `atRiskBelow`) and open conflicts. */
21
+ export function getMemoryStatus(ctx, now, atRiskBelow) {
22
+ return {
23
+ ...loadStrengthTallies(ctx.hippoRoot, ctx.tenantId, now, atRiskBelow),
24
+ openConflicts: countOpenConflicts(ctx.hippoRoot, ctx.tenantId),
25
+ };
26
+ }
27
+ function tenantFilter(ctx, reach) {
28
+ if (!reach.everyTenant)
29
+ return ctx.tenantId;
30
+ requireHostAdmin(ctx, 'Reading every tenant');
31
+ return undefined;
32
+ }
33
+ /** Every memory row in reach, oldest first. */
34
+ export function listMemories(ctx, reach = {}) {
35
+ return loadAllEntries(ctx.hippoRoot, tenantFilter(ctx, reach));
36
+ }
37
+ /** How many memory rows the whole store holds, counted in SQL. */
38
+ export function countAllMemories(ctx) {
39
+ requireHostAdmin(ctx, 'Reading every tenant');
40
+ return countAllEntries(ctx.hippoRoot);
41
+ }
42
+ /** The rows in reach among `ids`; a missing id or one out of reach is absent. */
43
+ export function listMemoriesByIds(ctx, ids, reach = {}) {
44
+ return loadEntriesByIds(ctx.hippoRoot, ids, tenantFilter(ctx, reach));
45
+ }
46
+ //# sourceMappingURL=memories.js.map
@@ -0,0 +1,9 @@
1
+ import type { SavableDescriptor } from '../objects/descriptor.js';
2
+ import type { ObjectByKind, SavableKind } from '../core/object-types.js';
3
+ import type { Objects } from '../store/port.js';
4
+ import type { Context } from './types.js';
5
+ /** The request store's object group; the dispatcher has already answered 501 for a store without it. */
6
+ export declare function objectsOf(ctx: Context): Objects;
7
+ /** Saves through the request's store as the authenticated caller. */
8
+ export declare function saveFor<K extends SavableKind, W>(ctx: Context, d: SavableDescriptor<K, W>, write: W): Promise<ObjectByKind[K]>;
9
+ //# sourceMappingURL=objects.d.ts.map
@@ -0,0 +1,11 @@
1
+ import { saveObject } from '../objects/lifecycle.js';
2
+ import { requireGroup, storeFor } from '../store/index.js';
3
+ /** The request store's object group; the dispatcher has already answered 501 for a store without it. */
4
+ export function objectsOf(ctx) {
5
+ return requireGroup(storeFor(ctx), 'objects');
6
+ }
7
+ /** Saves through the request's store as the authenticated caller. */
8
+ export function saveFor(ctx, d, write) {
9
+ return saveObject(objectsOf(ctx), d, { hippoRoot: ctx.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, write);
10
+ }
11
+ //# sourceMappingURL=objects.js.map
@@ -12,7 +12,8 @@ export function andThen(reply, next) {
12
12
  export function notPorted(port, group) {
13
13
  throw new StoreNotPortedError(port.kind, group);
14
14
  }
15
- /** A served store's stand-in for SqliteLocal. The last recall sits in hippo.db's meta table, so only a store that is hippo.db keeps and reads it, on `hippoRoot`. */
15
+ /** A served store's stand-in for SqliteLocal. The last recall sits in hippo.db's
16
+ * meta table, so only a store that is hippo.db keeps and reads it, on `hippoRoot`. */
16
17
  function servedLocal(store, hippoRoot) {
17
18
  if (store.kind === 'sqlite')
18
19
  return { ...sqliteLocal(hippoRoot), ...REFUSED_ON_A_STORE };
@@ -21,7 +22,7 @@ function servedLocal(store, hippoRoot) {
21
22
  applyOutcomeToLastRecall() {
22
23
  throw new SqliteBlockedError(store.kind);
23
24
  },
24
- finishLastRecall: (writes) => store.finishRecall(writes),
25
+ finishLastRecall: (writes) => store.finishRecall(writes).then(() => null),
25
26
  };
26
27
  }
27
28
  /** Runs `run` on `ctx.store`, where a throw rejects, else on hippo.db under `ctx.hippoRoot`, where it throws. The store path never reads `hippoRoot`.
@@ -30,7 +31,8 @@ export function onStore(ctx, run) {
30
31
  const { store } = ctx;
31
32
  // No await before `run`: an add-on relies on the first port call starting inside this call.
32
33
  const reply = store ? (async () => run(store, servedLocal(store, ctx.hippoRoot)))() : run(sqliteSyncStore(ctx.hippoRoot), sqliteLocal(ctx.hippoRoot));
33
- // SAFETY: the store path is an async function's Promise and hippo.db's port calls answer values, so the Promise comes back exactly when ctx has a store, as StoreReply says.
34
+ // SAFETY: the store path is an async function's Promise and hippo.db's port calls answer
35
+ // values, so the Promise comes back exactly when ctx has a store, as StoreReply says.
34
36
  return reply;
35
37
  }
36
38
  //# sourceMappingURL=on-store.js.map
@@ -1,5 +1,5 @@
1
1
  // Outcome feedback on recalled memories.
2
- import { personalScopeOf } from '../store/recall-scope.js';
2
+ import { personalScopeOf } from '../core/recall-scope.js';
3
3
  import { andThen, notPorted, onStore } from './on-store.js';
4
4
  /** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
5
5
  export function outcome(ctx, ids, good, opts) {
@@ -1,19 +1,9 @@
1
- import { type DatabaseSyncLike } from '../db/index.js';
2
1
  import { type LedgerRootOpts } from './ledger-db.js';
3
- export type PilotArm = 'hippo' | 'holdout';
2
+ import { type PilotArm } from '../store/pilot-arm.js';
4
3
  export interface SessionArmOpts extends LedgerRootOpts {
5
4
  /** Only the caller tenant's arm row counts, so a caller holding another tenant's session id cannot claim that session's arm. */
6
5
  readonly ownTenantOnly?: boolean;
7
6
  }
8
- /** Deterministic split: the same session and rate always land in the same arm. */
9
- export declare function hashArm(sessionId: string, rateBp: number): PilotArm;
10
- /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
11
- export declare function readPilotArm(db: DatabaseSyncLike, sessionId: string, tenantId?: string): PilotArm | null;
12
- /** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
13
- export declare function ensurePilotArm(db: DatabaseSyncLike, tenantId: string, sessionId: string, rateBp: number, opts?: {
14
- ownTenantOnly?: boolean;
15
- now?: string;
16
- }): PilotArm;
17
7
  /** The session's arm, or null at rate 0, with no session id, or with no store.
18
8
  * `write` books the arm row; a read-only caller (env-only id, sub-agent) follows the stored arm, else the hash. */
19
9
  export declare function sessionPilotArm(hippoRoot: string, tenantId: string, sessionId: string | undefined, write: boolean, opts?: SessionArmOpts): PilotArm | null;
@@ -1,46 +1,8 @@
1
- // Pilot arm: one token_ledger row per session names its arm, `hippo` or `holdout`, so a pilot can compare them.
2
- // `items` holds the holdout rate in basis points; readers outside this repo depend on these rows, so their shape is fixed.
3
- import { createHash } from 'node:crypto';
1
+ // Which pilot arm a session is in: the rate comes from the ledger store's config, the arm row from src/store/pilot-arm.ts.
4
2
  import { loadConfig } from '../core/config.js';
5
- import { HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
6
- import { ledgerRoot, withLedgerDb } from './ledger-db.js';
7
- import { errorMessage, log } from '../util/log.js';
8
- import { firstPilotArmHash } from '../store/token-ledger-rows.js';
9
- import { recordTokenUse } from '../store/token-ledger.js';
10
- /** Deterministic split: the same session and rate always land in the same arm. */
11
- export function hashArm(sessionId, rateBp) {
12
- const bucket = parseInt(createHash('sha256').update(sessionId).digest('hex').slice(0, 8), 16) % 10000;
13
- return bucket < rateBp ? 'holdout' : 'hippo';
14
- }
15
- /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
16
- export function readPilotArm(db, sessionId, tenantId) {
17
- const row = firstPilotArmHash(db, sessionId, tenantId);
18
- return row?.block_hash === 'holdout' || row?.block_hash === 'hippo' ? row.block_hash : null;
19
- }
20
- /** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
21
- // The wait is the caller's lock-wait scope (a hook's 1 s, a server request's 250 ms); it holds on a handle opened in that scope.
22
- export function ensurePilotArm(db, tenantId, sessionId, rateBp, opts = {}) {
23
- const hashed = hashArm(sessionId, rateBp);
24
- const readTenant = opts.ownTenantOnly ? tenantId : undefined;
25
- try {
26
- // A stored row is the common case after the first prompt, so it must not take the write lock.
27
- const existing = readPilotArm(db, sessionId, readTenant);
28
- if (existing !== null)
29
- return existing;
30
- return withWriteScope(db, 'pilot_arm', () => {
31
- const stored = readPilotArm(db, sessionId, readTenant);
32
- if (stored === null) {
33
- recordTokenUse(db, { tenantId, sessionId, surface: 'pilot', event: 'arm', items: rateBp, tokens: 0, hash: hashed, now: opts.now });
34
- }
35
- return stored ?? hashed;
36
- }, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
37
- }
38
- catch (err) {
39
- // A prompt hook must not fail on pilot bookkeeping; concurrent callers still agree on the hash arm.
40
- log.debug(`pilot arm not stored, using the hash arm: ${errorMessage(err)}`);
41
- return hashed;
42
- }
43
- }
3
+ import { ledgerRoot, onLedgerRoot } from './ledger-db.js';
4
+ import { pilotArmOnRoot } from '../store/ledger-turn.js';
5
+ import { hashArm } from '../store/pilot-arm.js';
44
6
  /** The session's arm, or null at rate 0, with no session id, or with no store.
45
7
  * `write` books the arm row; a read-only caller (env-only id, sub-agent) follows the stored arm, else the hash. */
46
8
  export function sessionPilotArm(hippoRoot, tenantId, sessionId, write, opts = {}) {
@@ -53,9 +15,7 @@ export function sessionPilotArm(hippoRoot, tenantId, sessionId, write, opts = {}
53
15
  if (rate <= 0)
54
16
  return null;
55
17
  const { ownTenantOnly } = opts;
56
- const arm = withLedgerDb(hippoRoot, (db) => write
57
- ? ensurePilotArm(db, tenantId, sessionId, rate, { ownTenantOnly })
58
- : readPilotArm(db, sessionId, ownTenantOnly ? tenantId : undefined) ?? hashArm(sessionId, rate), opts);
18
+ const arm = onLedgerRoot(hippoRoot, opts, (at) => pilotArmOnRoot(at, tenantId, sessionId, rate, { write, ownTenantOnly }));
59
19
  return arm ?? hashArm(sessionId, rate);
60
20
  }
61
21
  //# sourceMappingURL=pilot-arm.js.map
@@ -0,0 +1,11 @@
1
+ import { type Prediction, type PredictionBaserate, type SavePredictionOpts } from '../store/predictions.js';
2
+ import type { PredictionClose, PredictionSave, Predictions } from '../store/port.js';
3
+ import type { Context } from './types.js';
4
+ export declare function savePrediction(ctx: Context, input: PredictionSave): Promise<Prediction>;
5
+ /** A claim saved with its recall mirror, built under the store root's half-life as the HTTP create route builds it. */
6
+ export declare function recordPrediction(ctx: Context, claim: SavePredictionOpts): Promise<Prediction>;
7
+ export declare function listPredictions(ctx: Context, query: Parameters<Predictions['listPredictions']>[1]): Promise<Prediction[]>;
8
+ export declare function predictionBaserate(ctx: Context, classTag: string): Promise<PredictionBaserate>;
9
+ export declare function predictionById(ctx: Context, id: number): Promise<Prediction | null>;
10
+ export declare function closePrediction(ctx: Context, id: number, close: PredictionClose): Promise<Prediction>;
11
+ //# sourceMappingURL=predictions.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { predictionMirror } from '../store/predictions.js';
2
+ import { loadConfig } from '../core/config.js';
3
+ import { requireGroup, storeFor } from '../store/index.js';
4
+ const predictionsOf = (ctx) => requireGroup(storeFor(ctx), 'predictions');
5
+ export async function savePrediction(ctx, input) {
6
+ return predictionsOf(ctx).savePrediction(ctx.tenantId, input, ctx.actor.subject);
7
+ }
8
+ /** A claim saved with its recall mirror, built under the store root's half-life as the HTTP create route builds it. */
9
+ export async function recordPrediction(ctx, claim) {
10
+ return savePrediction(ctx, { ...claim, mirror: predictionMirror(ctx.tenantId, claim, loadConfig(ctx.hippoRoot).defaultHalfLifeDays) });
11
+ }
12
+ export async function listPredictions(ctx, query) {
13
+ return predictionsOf(ctx).listPredictions(ctx.tenantId, query);
14
+ }
15
+ export async function predictionBaserate(ctx, classTag) {
16
+ return predictionsOf(ctx).predictionBaserate(ctx.tenantId, classTag, ctx.actor.subject);
17
+ }
18
+ export async function predictionById(ctx, id) {
19
+ return predictionsOf(ctx).predictionById(ctx.tenantId, id);
20
+ }
21
+ export async function closePrediction(ctx, id, close) {
22
+ return predictionsOf(ctx).closePrediction(ctx.tenantId, id, close, ctx.actor.subject);
23
+ }
24
+ //# sourceMappingURL=predictions.js.map
@@ -0,0 +1,21 @@
1
+ import { type MergeResult, type ProjectSummary, type RepairResult } from '../sharing/project-merge.js';
2
+ import type { Context } from './types.js';
3
+ export type { MergeResult, ProjectCollision, ProjectSummary, RepairResult } from '../sharing/project-merge.js';
4
+ export type { ProjectFold } from '../agent-memories/project-folds.js';
5
+ export interface MergeProjectNamesOpts {
6
+ from: string;
7
+ into: string;
8
+ /** Plans in a transaction that rolls back: nothing is written, mirrors and backup included. */
9
+ dryRun: boolean;
10
+ }
11
+ /** Live rows per project name in the caller's tenant, newest write first. */
12
+ export declare function listProjectNames(ctx: Context): ProjectSummary[];
13
+ /** Folds project `from` into `into`, backed up and audited as `ctx.actor`; throws on user-global, unknown or equal names. */
14
+ export declare function mergeProjectNames(ctx: Context, opts: MergeProjectNamesOpts): MergeResult;
15
+ /** Sets aside stray imports, folds renamed projects and re-tags sleep's user-global merges; a dry run only plans. */
16
+ export declare function repairProjectNames(ctx: Context, opts: {
17
+ dryRun: boolean;
18
+ }): RepairResult;
19
+ /** The repair sleep runs once per store; null when it already ran. */
20
+ export declare function repairProjectNamesOnce(ctx: Context): RepairResult | null;
21
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1,24 @@
1
+ // Project names for every front end: list them, fold one into another, and repair old tags; the store opens hippo.db and owns each transaction.
2
+ // SHORTCUT: hippo.db only, since the store port has no project calls; a projects group when a served store needs them.
3
+ import { listProjects, mergeProjects, repairOnceOnSleep, repairProjects, } from '../sharing/project-merge.js';
4
+ import { onProjectTags } from '../store/project-tags.js';
5
+ function onProjects(ctx, fn) {
6
+ return onProjectTags({ hippoRoot: ctx.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, fn);
7
+ }
8
+ /** Live rows per project name in the caller's tenant, newest write first. */
9
+ export function listProjectNames(ctx) {
10
+ return onProjects(ctx, listProjects);
11
+ }
12
+ /** Folds project `from` into `into`, backed up and audited as `ctx.actor`; throws on user-global, unknown or equal names. */
13
+ export function mergeProjectNames(ctx, opts) {
14
+ return onProjects(ctx, (store) => mergeProjects(store, opts));
15
+ }
16
+ /** Sets aside stray imports, folds renamed projects and re-tags sleep's user-global merges; a dry run only plans. */
17
+ export function repairProjectNames(ctx, opts) {
18
+ return onProjects(ctx, (store) => repairProjects(store, opts));
19
+ }
20
+ /** The repair sleep runs once per store; null when it already ran. */
21
+ export function repairProjectNamesOnce(ctx) {
22
+ return onProjects(ctx, repairOnceOnSleep);
23
+ }
24
+ //# sourceMappingURL=projects.js.map
@@ -1,33 +1,29 @@
1
1
  import type { ConnectorEvent } from '../store/port.js';
2
+ import { type Layer } from '../core/memory.js';
2
3
  import type { Context, StoreReply } from './types.js';
3
- /**
4
- * Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
5
- * the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
6
- * db; we add a 'promote' audit event on the global db so the user-facing
7
- * intent stays distinct from the underlying upsert.
8
- *
9
- * Note: `promoteToGlobal` does not currently take a tenantId override — it
10
- * reads the entry from the local root via `readEntry` (no tenant filter) and
11
- * preserves the entry's existing tenantId on the global side.
12
- */
4
+ /** Copies a local memory into the global store; the inner writeEntry emits 'remember' there, and we add a 'promote' audit event so intent stays distinct.
5
+ * promoteToGlobal reads via `readEntry` with no tenant filter and keeps the entry's existing tenantId on the global side. */
13
6
  export interface PromoteResult {
14
7
  ok: true;
15
8
  sourceId: string;
16
9
  globalId: string;
17
10
  }
18
11
  export declare function promote(ctx: Context, id: string): PromoteResult;
19
- /**
20
- * Replace an old memory with new content, chaining old.superseded_by = new.id.
21
- * Mirrors `cmdSupersede` in cli.ts minus the flag-driven layer/tag/pin
22
- * overrides: the CLI handler resolves those so the API stays minimal.
23
- */
12
+ /** Replace an old memory with new content, chaining old.superseded_by = new.id; the store commits both rows and the audit row together. */
24
13
  export interface SupersedeResult {
25
14
  ok: true;
26
15
  oldId: string;
27
16
  newId: string;
28
17
  }
29
- export declare function supersede<C extends Context>(ctx: C, oldId: string, newContent: string): StoreReply<C, SupersedeResult>;
30
- /** Archive a kind='raw' memory: its metadata moves to raw_archive and the row is deleted. The store writes the one archive_raw audit row, under the caller's subject. */
18
+ /** What the successor takes instead of the old row's value. Never set from a request body: the CLI fills it from its flags. */
19
+ export interface SupersedeOverrides {
20
+ layer?: Layer;
21
+ tags?: string[];
22
+ pinned?: boolean;
23
+ }
24
+ export declare function supersede<C extends Context>(ctx: C, oldId: string, newContent: string, overrides?: SupersedeOverrides): StoreReply<C, SupersedeResult>;
25
+ /** Archive a kind='raw' memory: its metadata moves to raw_archive and the row is
26
+ * deleted. The store writes the one archive_raw audit row, under the caller's subject. */
31
27
  export interface ArchiveRawOpts {
32
28
  /** The connector event this archive answers. The store logs it in the archive's own transaction, so a redelivery finds it logged. */
33
29
  event?: ConnectorEvent;
@@ -1,29 +1,18 @@
1
1
  // Promote to the global store, supersede with a successor, and archive raw memories.
2
- import { openHippoDb, closeHippoDb } from '../db/index.js';
3
2
  import { ConflictError, NotFoundError } from '../core/api-errors.js';
4
3
  import { stampOriginProject } from '../store/entry-row.js';
5
4
  import { createSuccessor } from '../core/memory.js';
6
- import { promoteToGlobal } from '../sharing/shared.js';
5
+ import { promoteToGlobal } from '../sharing/global-store.js';
7
6
  import { loadConfig } from '../core/config.js';
8
7
  import { andThen, notPorted, onStore } from './on-store.js';
9
- import { selectMemoryReach } from '../store/tenant-lookup.js';
10
- import { canTouchScope, personalScopeOf } from '../store/recall-scope.js';
8
+ import { memoryReach } from '../store/tenant-lookup.js';
9
+ import { canTouchScope, personalScopeOf } from '../core/recall-scope.js';
11
10
  export function promote(ctx, id) {
12
- // Tenant scope: promoteToGlobal reads the entry from the local root via
13
- // readEntry without a tenant filter, so a Bearer for tenant A could
14
- // promote tenant B's row by guessing or leaking the id. Pre-check the
15
- // row's tenant_id and deny cross-tenant access with the same not-found
16
- // wording archiveRaw uses (no info leak about whether the id exists in
17
- // another tenant).
18
- const ownerDb = openHippoDb(ctx.hippoRoot);
19
- try {
20
- const reach = selectMemoryReach(ownerDb, id);
21
- if (reach?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, reach.scope)) {
22
- throw new NotFoundError(`memory not found: ${id}`);
23
- }
24
- }
25
- finally {
26
- closeHippoDb(ownerDb);
11
+ // promoteToGlobal reads without a tenant filter, so pre-check the row's tenant_id and deny cross-tenant access with archiveRaw's not-found wording
12
+ // (no leak about whether the id exists in another tenant).
13
+ const reach = memoryReach(ctx.hippoRoot, id);
14
+ if (reach?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, reach.scope)) {
15
+ throw new NotFoundError(`memory not found: ${id}`);
27
16
  }
28
17
  // The 'promote' row commits with the global copy, so no write follows the commit and a busy store fails the whole promote.
29
18
  const globalEntry = promoteToGlobal(ctx.hippoRoot, id, {
@@ -33,13 +22,16 @@ export function promote(ctx, id) {
33
22
  });
34
23
  return { ok: true, sourceId: id, globalId: globalEntry.id };
35
24
  }
36
- export function supersede(ctx, oldId, newContent) {
25
+ export function supersede(ctx, oldId, newContent, overrides = {}) {
37
26
  return onStore(ctx, (port) => {
38
27
  const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
39
28
  return andThen(port.entriesByIds([oldId], ctx.tenantId), ([old]) => {
40
29
  const newEntry = createSuccessor(assertSupersedable(ctx, oldId, old ?? null), newContent, {
41
30
  tenantId: ctx.tenantId,
42
31
  baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
32
+ layer: overrides.layer,
33
+ tags: overrides.tags,
34
+ pinned: overrides.pinned,
43
35
  });
44
36
  // A store writes origin_project as given, so the served folder's fallback is stamped here.
45
37
  const successor = stampOriginProject(ctx.hippoRoot, newEntry);