hippo-memory 1.72.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (995) hide show
  1. package/README.md +6 -4
  2. package/dist/agent-memories/apply.d.ts +7 -5
  3. package/dist/agent-memories/apply.js +66 -39
  4. package/dist/agent-memories/claude-code.d.ts +8 -2
  5. package/dist/agent-memories/claude-code.js +26 -7
  6. package/dist/agent-memories/copilot.js +2 -1
  7. package/dist/agent-memories/files.js +2 -1
  8. package/dist/agent-memories/legacy.d.ts +6 -3
  9. package/dist/agent-memories/legacy.js +35 -14
  10. package/dist/agent-memories/markdown.d.ts +3 -1
  11. package/dist/agent-memories/markdown.js +3 -1
  12. package/dist/agent-memories/openclaw.js +5 -2
  13. package/dist/agent-memories/plan.js +11 -1
  14. package/dist/agent-memories/project-folds.js +2 -1
  15. package/dist/agent-memories/report.d.ts +4 -1
  16. package/dist/agent-memories/report.js +43 -9
  17. package/dist/agent-memories/source.d.ts +8 -2
  18. package/dist/agent-memories/source.js +11 -3
  19. package/dist/agent-memories/sync.d.ts +7 -2
  20. package/dist/agent-memories/sync.js +141 -101
  21. package/dist/api/assemble.d.ts +6 -4
  22. package/dist/api/assemble.js +11 -5
  23. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  24. package/dist/api/auth/audit.js +58 -0
  25. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
  26. package/dist/api/{auth.js → auth/auth.js} +66 -54
  27. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  28. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
  29. package/dist/api/auth/session-owners.d.ts +10 -0
  30. package/dist/api/auth/session-owners.js +35 -0
  31. package/dist/api/availability.d.ts +3 -1
  32. package/dist/api/availability.js +3 -1
  33. package/dist/api/busy.d.ts +2 -0
  34. package/dist/api/busy.js +2 -0
  35. package/dist/api/cli-surface.d.ts +6 -0
  36. package/dist/api/cli-surface.js +6 -0
  37. package/dist/api/config-of.d.ts +5 -0
  38. package/dist/api/config-of.js +6 -0
  39. package/dist/api/context-auto.d.ts +4 -1
  40. package/dist/api/context-auto.js +14 -4
  41. package/dist/api/context-render.js +14 -7
  42. package/dist/api/context-select.d.ts +4 -1
  43. package/dist/api/context-select.js +31 -34
  44. package/dist/api/context-types.d.ts +38 -12
  45. package/dist/api/context.d.ts +8 -5
  46. package/dist/api/context.js +120 -63
  47. package/dist/api/continuity.d.ts +24 -21
  48. package/dist/api/continuity.js +18 -20
  49. package/dist/api/correction-latency.d.ts +3 -1
  50. package/dist/api/correction-latency.js +3 -1
  51. package/dist/api/error-reply.d.ts +4 -1
  52. package/dist/api/error-reply.js +12 -3
  53. package/dist/api/index.d.ts +39 -23
  54. package/dist/api/index.js +21 -23
  55. package/dist/api/instruction-detect.d.ts +4 -1
  56. package/dist/api/instruction-detect.js +75 -20
  57. package/dist/api/ledger-db.d.ts +15 -11
  58. package/dist/api/ledger-db.js +21 -23
  59. package/dist/api/memories/conflicts.d.ts +33 -0
  60. package/dist/api/memories/conflicts.js +67 -0
  61. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  62. package/dist/api/{forget.js → memories/forget.js} +23 -17
  63. package/dist/api/memories/memories.d.ts +27 -0
  64. package/dist/api/memories/memories.js +52 -0
  65. package/dist/api/memories/outcome.d.ts +22 -0
  66. package/dist/api/memories/outcome.js +28 -0
  67. package/dist/api/memories/promote.d.ts +40 -0
  68. package/dist/api/memories/promote.js +76 -0
  69. package/dist/api/memories/refine.d.ts +10 -0
  70. package/dist/api/memories/refine.js +12 -0
  71. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
  72. package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
  73. package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
  74. package/dist/api/{remember.js → memories/remember.js} +50 -32
  75. package/dist/api/objects/cards.d.ts +39 -0
  76. package/dist/api/{cards.js → objects/cards.js} +12 -14
  77. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  78. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
  79. package/dist/api/objects/goals.d.ts +18 -0
  80. package/dist/api/{goals.js → objects/goals.js} +12 -12
  81. package/dist/api/objects/graph.d.ts +11 -0
  82. package/dist/api/objects/graph.js +16 -0
  83. package/dist/api/objects/objects.d.ts +9 -0
  84. package/dist/api/{objects.js → objects/objects.js} +2 -3
  85. package/dist/api/objects/predictions.d.ts +11 -0
  86. package/dist/api/{predictions.js → objects/predictions.js} +7 -5
  87. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  88. package/dist/api/{projects.js → objects/projects.js} +8 -4
  89. package/dist/api/pilot-arm.d.ts +8 -4
  90. package/dist/api/pilot-arm.js +5 -4
  91. package/dist/api/prompt-hook.d.ts +35 -20
  92. package/dist/api/prompt-hook.js +66 -44
  93. package/dist/api/provenance-coverage.d.ts +3 -1
  94. package/dist/api/provenance-coverage.js +3 -1
  95. package/dist/api/recall/finish.d.ts +185 -0
  96. package/dist/api/recall/finish.js +301 -0
  97. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  98. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
  99. package/dist/api/recall/recall.d.ts +6 -0
  100. package/dist/api/{recall.js → recall/recall.js} +116 -72
  101. package/dist/api/recall/render.d.ts +39 -0
  102. package/dist/api/recall/render.js +60 -0
  103. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  104. package/dist/api/recall/request.js +261 -0
  105. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  106. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  107. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
  108. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  109. package/dist/api/session-end.d.ts +36 -8
  110. package/dist/api/session-end.js +71 -25
  111. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  112. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  113. package/dist/api/sleep/dormant.d.ts +25 -0
  114. package/dist/api/sleep/dormant.js +64 -0
  115. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  116. package/dist/api/sleep/learn.js +138 -0
  117. package/dist/api/sleep/sleep-run.d.ts +38 -0
  118. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
  119. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  120. package/dist/api/sleep/sleep.js +9 -0
  121. package/dist/api/status.d.ts +3 -1
  122. package/dist/api/status.js +3 -1
  123. package/dist/api/store-init.d.ts +4 -1
  124. package/dist/api/store-init.js +4 -1
  125. package/dist/api/tokens.d.ts +10 -9
  126. package/dist/api/tokens.js +9 -10
  127. package/dist/api/types.d.ts +27 -12
  128. package/dist/api/types.js +13 -4
  129. package/dist/capture/caller-session.d.ts +8 -2
  130. package/dist/capture/caller-session.js +16 -6
  131. package/dist/capture/capture-error.d.ts +3 -1
  132. package/dist/capture/capture-error.js +3 -1
  133. package/dist/capture/codex-patch.js +7 -2
  134. package/dist/capture/command.d.ts +4 -2
  135. package/dist/capture/command.js +34 -15
  136. package/dist/capture/compact-resume-caller.js +15 -8
  137. package/dist/capture/compact.d.ts +8 -5
  138. package/dist/capture/compact.js +34 -23
  139. package/dist/capture/compaction-items-caller.js +9 -3
  140. package/dist/capture/compaction-record.d.ts +4 -3
  141. package/dist/capture/compaction-record.js +20 -12
  142. package/dist/capture/compaction-spool.d.ts +18 -9
  143. package/dist/capture/compaction-spool.js +105 -63
  144. package/dist/capture/copilot-transcript.d.ts +11 -3
  145. package/dist/capture/copilot-transcript.js +16 -6
  146. package/dist/capture/extract.js +20 -8
  147. package/dist/capture/failure-caller.js +23 -12
  148. package/dist/capture/failure-reading.d.ts +10 -3
  149. package/dist/capture/failure-reading.js +24 -7
  150. package/dist/capture/pre-compact-caller.js +11 -4
  151. package/dist/capture/session-digest.d.ts +15 -4
  152. package/dist/capture/session-digest.js +39 -13
  153. package/dist/capture/session-end-caller.d.ts +4 -1
  154. package/dist/capture/session-end-caller.js +20 -8
  155. package/dist/capture/session-texts.d.ts +6 -2
  156. package/dist/capture/session-texts.js +22 -7
  157. package/dist/capture/session-worker.d.ts +4 -2
  158. package/dist/capture/session-worker.js +58 -17
  159. package/dist/capture/transcript.d.ts +13 -4
  160. package/dist/capture/transcript.js +32 -10
  161. package/dist/capture/working-state.d.ts +13 -4
  162. package/dist/capture/working-state.js +50 -56
  163. package/dist/cli/api-context.d.ts +14 -2
  164. package/dist/cli/api-context.js +45 -2
  165. package/dist/cli/audit.js +33 -33
  166. package/dist/cli/auth.js +23 -31
  167. package/dist/cli/briefs.d.ts +1 -1
  168. package/dist/cli/briefs.js +20 -15
  169. package/dist/cli/card.d.ts +1 -1
  170. package/dist/cli/card.js +56 -73
  171. package/dist/cli/client.d.ts +12 -5
  172. package/dist/cli/client.js +53 -23
  173. package/dist/cli/compact-resume-payload.d.ts +4 -1
  174. package/dist/cli/compact-resume-payload.js +12 -5
  175. package/dist/cli/context.js +43 -18
  176. package/dist/cli/continuity.d.ts +5 -5
  177. package/dist/cli/continuity.js +90 -107
  178. package/dist/cli/curate.d.ts +5 -4
  179. package/dist/cli/curate.js +55 -77
  180. package/dist/cli/dag.d.ts +1 -1
  181. package/dist/cli/dag.js +14 -17
  182. package/dist/cli/decisions.js +30 -30
  183. package/dist/cli/eval.js +16 -21
  184. package/dist/cli/exit.d.ts +4 -1
  185. package/dist/cli/exit.js +10 -2
  186. package/dist/cli/explain.js +12 -11
  187. package/dist/cli/flag-values.d.ts +1 -1
  188. package/dist/cli/flag-values.js +9 -18
  189. package/dist/cli/github.d.ts +6 -0
  190. package/dist/cli/github.js +25 -13
  191. package/dist/cli/goals.d.ts +1 -1
  192. package/dist/cli/goals.js +39 -56
  193. package/dist/cli/graph.d.ts +1 -1
  194. package/dist/cli/graph.js +15 -11
  195. package/dist/cli/hook-runtime.d.ts +34 -10
  196. package/dist/cli/hook-runtime.js +41 -16
  197. package/dist/cli/incidents.d.ts +1 -1
  198. package/dist/cli/incidents.js +25 -25
  199. package/dist/cli/init.d.ts +1 -1
  200. package/dist/cli/init.js +35 -20
  201. package/dist/cli/install-steps.d.ts +12 -3
  202. package/dist/cli/install-steps.js +42 -18
  203. package/dist/cli/last-sleep.d.ts +4 -1
  204. package/dist/cli/last-sleep.js +9 -4
  205. package/dist/cli/maintenance.d.ts +1 -1
  206. package/dist/cli/maintenance.js +11 -12
  207. package/dist/cli/notes.d.ts +1 -1
  208. package/dist/cli/notes.js +8 -5
  209. package/dist/cli/object-verbs.d.ts +5 -5
  210. package/dist/cli/object-verbs.js +13 -16
  211. package/dist/cli/open-browser.js +11 -2
  212. package/dist/cli/playbooks.d.ts +3 -3
  213. package/dist/cli/playbooks.js +40 -32
  214. package/dist/cli/predictions.js +17 -22
  215. package/dist/cli/print.js +4 -2
  216. package/dist/cli/projects.js +21 -11
  217. package/dist/cli/quality-repair-once.d.ts +1 -1
  218. package/dist/cli/quality-repair-once.js +7 -6
  219. package/dist/cli/recall.js +129 -93
  220. package/dist/cli/refine-llm.d.ts +15 -4
  221. package/dist/cli/refine-llm.js +17 -7
  222. package/dist/cli/remember.js +51 -55
  223. package/dist/cli/scheduler.d.ts +4 -1
  224. package/dist/cli/scheduler.js +9 -5
  225. package/dist/cli/serve.js +28 -18
  226. package/dist/cli/session-hooks.d.ts +2 -6
  227. package/dist/cli/session-hooks.js +140 -112
  228. package/dist/cli/setup.d.ts +1 -1
  229. package/dist/cli/setup.js +56 -34
  230. package/dist/cli/shared.d.ts +4 -2
  231. package/dist/cli/shared.js +26 -11
  232. package/dist/cli/slack.js +15 -24
  233. package/dist/cli/sleep-render.d.ts +3 -1
  234. package/dist/cli/sleep-render.js +8 -5
  235. package/dist/cli/sleep.js +16 -8
  236. package/dist/cli/status.d.ts +4 -4
  237. package/dist/cli/status.js +32 -27
  238. package/dist/cli/stdin.d.ts +10 -3
  239. package/dist/cli/stdin.js +10 -3
  240. package/dist/cli/transfer.d.ts +4 -4
  241. package/dist/cli/transfer.js +97 -82
  242. package/dist/cli/usage.d.ts +1 -1
  243. package/dist/cli/usage.js +1 -1
  244. package/dist/cli/verb-row.d.ts +2 -0
  245. package/dist/cli/verbs/health.js +2 -0
  246. package/dist/cli/verbs/memory.js +47 -53
  247. package/dist/cli/verbs/objects.js +16 -7
  248. package/dist/cli/verbs/sessions.js +4 -2
  249. package/dist/cli/versioned-verbs.d.ts +8 -7
  250. package/dist/cli/versioned-verbs.js +31 -21
  251. package/dist/cli.js +14 -18
  252. package/dist/connectors/dlq.d.ts +6 -6
  253. package/dist/connectors/dlq.js +12 -7
  254. package/dist/connectors/github/backfill.d.ts +4 -4
  255. package/dist/connectors/github/backfill.js +6 -4
  256. package/dist/connectors/github/deletion.d.ts +6 -4
  257. package/dist/connectors/github/deletion.js +5 -4
  258. package/dist/connectors/github/dlq.d.ts +8 -6
  259. package/dist/connectors/github/dlq.js +11 -5
  260. package/dist/connectors/github/ingest.d.ts +2 -2
  261. package/dist/connectors/github/ingest.js +9 -5
  262. package/dist/connectors/github/octokit-client.d.ts +3 -1
  263. package/dist/connectors/github/octokit-client.js +7 -2
  264. package/dist/connectors/github/ratelimit.d.ts +6 -2
  265. package/dist/connectors/github/ratelimit.js +6 -2
  266. package/dist/connectors/github/signature.d.ts +14 -3
  267. package/dist/connectors/github/signature.js +17 -3
  268. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  269. package/dist/connectors/github/tenant-routing.js +6 -5
  270. package/dist/connectors/github/transform.js +50 -67
  271. package/dist/connectors/github/types.d.ts +10 -3
  272. package/dist/connectors/github/types.js +6 -2
  273. package/dist/connectors/github/webhook.d.ts +5 -5
  274. package/dist/connectors/github/webhook.js +36 -23
  275. package/dist/connectors/ingest.d.ts +5 -3
  276. package/dist/connectors/ingest.js +3 -3
  277. package/dist/connectors/slack/backfill.d.ts +5 -5
  278. package/dist/connectors/slack/backfill.js +3 -3
  279. package/dist/connectors/slack/deletion.d.ts +4 -4
  280. package/dist/connectors/slack/deletion.js +6 -5
  281. package/dist/connectors/slack/dlq.d.ts +4 -4
  282. package/dist/connectors/slack/dlq.js +6 -6
  283. package/dist/connectors/slack/ingest.d.ts +6 -4
  284. package/dist/connectors/slack/ingest.js +5 -4
  285. package/dist/connectors/slack/signature.d.ts +4 -1
  286. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  287. package/dist/connectors/slack/tenant-routing.js +6 -5
  288. package/dist/connectors/slack/transform.d.ts +6 -2
  289. package/dist/connectors/slack/transform.js +6 -2
  290. package/dist/connectors/slack/types.d.ts +3 -1
  291. package/dist/connectors/slack/web-client.js +8 -3
  292. package/dist/connectors/slack/webhook.d.ts +5 -5
  293. package/dist/connectors/slack/webhook.js +19 -11
  294. package/dist/connectors/slack/workspaces.d.ts +7 -3
  295. package/dist/connectors/slack/workspaces.js +7 -3
  296. package/dist/connectors/store.d.ts +8 -0
  297. package/dist/connectors/store.js +2 -0
  298. package/dist/consolidate/conflicts.js +24 -10
  299. package/dist/consolidate/dag-summary.js +2 -1
  300. package/dist/consolidate/dag.d.ts +10 -5
  301. package/dist/consolidate/dag.js +45 -39
  302. package/dist/consolidate/decay.js +19 -6
  303. package/dist/consolidate/dedupe.d.ts +14 -5
  304. package/dist/consolidate/dedupe.js +28 -17
  305. package/dist/consolidate/flush-units.d.ts +4 -1
  306. package/dist/consolidate/flush-units.js +4 -1
  307. package/dist/consolidate/half-life-migration.d.ts +18 -8
  308. package/dist/consolidate/half-life-migration.js +48 -18
  309. package/dist/consolidate/llm-passes.js +27 -11
  310. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  311. package/dist/consolidate/memory-value-weights.js +6 -2
  312. package/dist/consolidate/memory-value.d.ts +30 -10
  313. package/dist/consolidate/memory-value.js +37 -14
  314. package/dist/consolidate/merge.d.ts +4 -1
  315. package/dist/consolidate/merge.js +47 -37
  316. package/dist/consolidate/overlap-index.d.ts +8 -2
  317. package/dist/consolidate/overlap-index.js +11 -4
  318. package/dist/consolidate/physics-pass.d.ts +3 -1
  319. package/dist/consolidate/physics-pass.js +10 -7
  320. package/dist/consolidate/replay.d.ts +11 -4
  321. package/dist/consolidate/replay.js +19 -7
  322. package/dist/consolidate/run.d.ts +13 -5
  323. package/dist/consolidate/run.js +4 -4
  324. package/dist/consolidate/sleep.d.ts +14 -6
  325. package/dist/consolidate/sleep.js +42 -39
  326. package/dist/consolidate/trace.d.ts +7 -2
  327. package/dist/consolidate/trace.js +7 -2
  328. package/dist/consolidate/traces.js +27 -30
  329. package/dist/core/ablation.d.ts +9 -3
  330. package/dist/core/ablation.js +14 -4
  331. package/dist/core/active-scope.d.ts +3 -1
  332. package/dist/core/active-scope.js +3 -1
  333. package/dist/core/agent-memory-tools.d.ts +2 -0
  334. package/dist/core/agent-memory-tools.js +2 -0
  335. package/dist/core/ambient.d.ts +4 -3
  336. package/dist/core/ambient.js +8 -6
  337. package/dist/core/api-errors.d.ts +9 -3
  338. package/dist/core/api-errors.js +9 -3
  339. package/dist/core/capture-contract.d.ts +4 -1
  340. package/dist/core/capture-contract.js +27 -8
  341. package/dist/core/compare.d.ts +24 -8
  342. package/dist/core/compare.js +24 -8
  343. package/dist/core/config.d.ts +18 -9
  344. package/dist/core/config.js +38 -29
  345. package/dist/core/cosine.d.ts +4 -1
  346. package/dist/core/cosine.js +4 -1
  347. package/dist/core/handoff.d.ts +7 -2
  348. package/dist/core/handoff.js +4 -1
  349. package/dist/core/markdown.js +22 -17
  350. package/dist/core/memory-audit.js +14 -3
  351. package/dist/core/memory-quality.d.ts +12 -3
  352. package/dist/core/memory-quality.js +57 -21
  353. package/dist/core/memory.d.ts +87 -30
  354. package/dist/core/memory.js +82 -33
  355. package/dist/core/merged-row.d.ts +8 -2
  356. package/dist/core/merged-row.js +10 -3
  357. package/dist/core/package-root.d.ts +3 -1
  358. package/dist/core/package-root.js +3 -1
  359. package/dist/core/particle-refresh.d.ts +8 -0
  360. package/dist/core/particle-refresh.js +22 -0
  361. package/dist/core/physics-config.d.ts +4 -1
  362. package/dist/core/physics-config.js +6 -2
  363. package/dist/core/physics.d.ts +39 -11
  364. package/dist/core/physics.js +71 -21
  365. package/dist/core/project-identity.d.ts +34 -17
  366. package/dist/core/project-identity.js +35 -18
  367. package/dist/core/project-remote.d.ts +8 -4
  368. package/dist/core/project-remote.js +31 -14
  369. package/dist/core/recall-scope.d.ts +33 -11
  370. package/dist/core/recall-scope.js +42 -15
  371. package/dist/core/rejection-digest.d.ts +7 -0
  372. package/dist/core/rejection-digest.js +13 -0
  373. package/dist/core/salience.d.ts +3 -1
  374. package/dist/core/salience.js +10 -4
  375. package/dist/core/search-types.d.ts +15 -2
  376. package/dist/core/search-types.js +11 -0
  377. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  378. package/dist/dashboard/dashboard-actions.js +18 -7
  379. package/dist/dashboard/dashboard-queries.js +2 -7
  380. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  381. package/dist/dashboard/dashboard-snapshot.js +5 -7
  382. package/dist/dashboard/dashboard.js +22 -8
  383. package/dist/db/backup.js +2 -2
  384. package/dist/db/busy.d.ts +10 -3
  385. package/dist/db/busy.js +27 -5
  386. package/dist/db/connect.d.ts +10 -2
  387. package/dist/db/connect.js +8 -2
  388. package/dist/db/continuity.d.ts +1 -1
  389. package/dist/db/continuity.js +27 -11
  390. package/dist/db/meta.d.ts +4 -1
  391. package/dist/db/meta.js +4 -1
  392. package/dist/db/migrate.d.ts +10 -5
  393. package/dist/db/migrate.js +40 -20
  394. package/dist/db/migrations/index.d.ts +1 -1
  395. package/dist/db/migrations/index.js +3 -1
  396. package/dist/db/migrations/types.d.ts +2 -1
  397. package/dist/db/migrations/v11.js +1 -0
  398. package/dist/db/migrations/v12.js +2 -1
  399. package/dist/db/migrations/v14.js +2 -0
  400. package/dist/db/migrations/v15.js +4 -2
  401. package/dist/db/migrations/v16.js +6 -3
  402. package/dist/db/migrations/v17.js +2 -1
  403. package/dist/db/migrations/v19.js +4 -2
  404. package/dist/db/migrations/v20.js +2 -1
  405. package/dist/db/migrations/v22.js +12 -6
  406. package/dist/db/migrations/v23.js +6 -3
  407. package/dist/db/migrations/v24.js +6 -3
  408. package/dist/db/migrations/v25.js +4 -2
  409. package/dist/db/migrations/v26.js +4 -2
  410. package/dist/db/migrations/v27.js +6 -3
  411. package/dist/db/migrations/v28.js +4 -2
  412. package/dist/db/migrations/v29.js +4 -2
  413. package/dist/db/migrations/v30.js +6 -3
  414. package/dist/db/migrations/v31.js +4 -2
  415. package/dist/db/migrations/v32.js +6 -3
  416. package/dist/db/migrations/v33.js +4 -2
  417. package/dist/db/migrations/v34.js +2 -1
  418. package/dist/db/migrations/v35.js +2 -1
  419. package/dist/db/migrations/v36.js +2 -1
  420. package/dist/db/migrations/v37.js +10 -5
  421. package/dist/db/migrations/v38.js +10 -5
  422. package/dist/db/migrations/v39.js +14 -6
  423. package/dist/db/migrations/v40.js +4 -2
  424. package/dist/db/migrations/v41.js +4 -2
  425. package/dist/db/migrations/v42.js +2 -1
  426. package/dist/db/migrations/v44.js +4 -2
  427. package/dist/db/migrations/v45.js +4 -2
  428. package/dist/db/migrations/v49.js +2 -1
  429. package/dist/db/migrations/v50.js +4 -2
  430. package/dist/db/migrations/v51.js +4 -2
  431. package/dist/db/migrations/v52.js +2 -1
  432. package/dist/db/migrations/v53.js +8 -4
  433. package/dist/db/migrations/v54.js +2 -1
  434. package/dist/db/migrations/v55.js +4 -2
  435. package/dist/db/migrations/v56.d.ts +3 -0
  436. package/dist/db/migrations/v56.js +28 -0
  437. package/dist/db/open.d.ts +24 -12
  438. package/dist/db/open.js +25 -13
  439. package/dist/db/physics-state.d.ts +8 -8
  440. package/dist/db/physics-state.js +17 -50
  441. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  442. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  443. package/dist/db/request-stores.d.ts +20 -5
  444. package/dist/db/request-stores.js +15 -5
  445. package/dist/db/tables.d.ts +2 -1
  446. package/dist/db/tables.js +12 -4
  447. package/dist/db/vector-store.d.ts +13 -4
  448. package/dist/db/vector-store.js +35 -14
  449. package/dist/db/wal-checkpointer.d.ts +2 -1
  450. package/dist/db/wal-checkpointer.js +19 -7
  451. package/dist/doctor.d.ts +7 -1
  452. package/dist/doctor.js +128 -46
  453. package/dist/embeddings/local.d.ts +8 -4
  454. package/dist/embeddings/local.js +11 -7
  455. package/dist/embeddings/provider.d.ts +19 -10
  456. package/dist/embeddings/provider.js +32 -27
  457. package/dist/embeddings/transformers.d.ts +16 -4
  458. package/dist/embeddings/transformers.js +32 -15
  459. package/dist/entry/json-hooks.d.ts +1 -1
  460. package/dist/entry/json-hooks.js +1 -1
  461. package/dist/entry/project-identity.js +2 -1
  462. package/dist/entry/session-text.d.ts +1 -1
  463. package/dist/entry/session-text.js +1 -1
  464. package/dist/entry/sqlite-handles.d.ts +10 -0
  465. package/dist/entry/sqlite-handles.js +9 -0
  466. package/dist/entry/store-kit.d.ts +50 -0
  467. package/dist/entry/store-kit.js +27 -0
  468. package/dist/entry/testing.d.ts +6 -0
  469. package/dist/entry/testing.js +7 -0
  470. package/dist/eval/eval-stats.d.ts +27 -8
  471. package/dist/eval/eval-stats.js +17 -5
  472. package/dist/eval/eval-suite.d.ts +3 -1
  473. package/dist/eval/eval-suite.js +409 -187
  474. package/dist/eval/eval.d.ts +8 -2
  475. package/dist/eval/eval.js +8 -2
  476. package/dist/eval/judgment.js +17 -7
  477. package/dist/graph/delta.d.ts +9 -42
  478. package/dist/graph/delta.js +17 -11
  479. package/dist/graph/extract.d.ts +10 -7
  480. package/dist/graph/extract.js +57 -25
  481. package/dist/graph/recall.d.ts +12 -4
  482. package/dist/graph/recall.js +30 -13
  483. package/dist/graph/stream.d.ts +18 -6
  484. package/dist/graph/stream.js +32 -10
  485. package/dist/graph/view.d.ts +19 -6
  486. package/dist/graph/view.js +42 -17
  487. package/dist/hooks/codex-session.js +2 -2
  488. package/dist/hooks/codex-wrapper.d.ts +3 -1
  489. package/dist/hooks/codex-wrapper.js +9 -4
  490. package/dist/hooks/copilot.d.ts +19 -5
  491. package/dist/hooks/copilot.js +54 -15
  492. package/dist/hooks/hook-blocks.d.ts +4 -1
  493. package/dist/hooks/hook-blocks.js +8 -3
  494. package/dist/hooks/json-hooks.d.ts +9 -5
  495. package/dist/hooks/json-hooks.js +72 -33
  496. package/dist/hooks/opencode.js +15 -5
  497. package/dist/hooks/shared.d.ts +27 -8
  498. package/dist/hooks/shared.js +57 -16
  499. package/dist/importers/core.d.ts +12 -4
  500. package/dist/importers/core.js +11 -10
  501. package/dist/importers/markdown-parse.d.ts +15 -5
  502. package/dist/importers/markdown-parse.js +16 -7
  503. package/dist/importers/markdown.js +6 -9
  504. package/dist/importers/sources.js +10 -23
  505. package/dist/importers/vault.d.ts +3 -3
  506. package/dist/importers/vault.js +61 -45
  507. package/dist/index.d.ts +33 -7
  508. package/dist/index.js +26 -8
  509. package/dist/learn/autolearn.d.ts +21 -6
  510. package/dist/learn/autolearn.js +57 -26
  511. package/dist/learn/churn-git.d.ts +4 -1
  512. package/dist/learn/churn-git.js +29 -5
  513. package/dist/learn/extract.d.ts +4 -1
  514. package/dist/learn/extract.js +17 -10
  515. package/dist/learn/forward-claim-detector.d.ts +17 -5
  516. package/dist/learn/forward-claim-detector.js +34 -15
  517. package/dist/learn/invalidation.d.ts +12 -6
  518. package/dist/learn/invalidation.js +62 -28
  519. package/dist/learn/roots.d.ts +3 -0
  520. package/dist/learn/roots.js +5 -0
  521. package/dist/mcp/admin-tools.d.ts +5 -5
  522. package/dist/mcp/admin-tools.js +28 -23
  523. package/dist/mcp/format.d.ts +1 -1
  524. package/dist/mcp/format.js +4 -2
  525. package/dist/mcp/framing.d.ts +3 -1
  526. package/dist/mcp/framing.js +20 -8
  527. package/dist/mcp/memory-tools.d.ts +3 -3
  528. package/dist/mcp/memory-tools.js +21 -20
  529. package/dist/mcp/protocol.d.ts +32 -16
  530. package/dist/mcp/protocol.js +12 -9
  531. package/dist/mcp/recall-tools.d.ts +3 -3
  532. package/dist/mcp/recall-tools.js +62 -74
  533. package/dist/mcp/request.d.ts +7 -5
  534. package/dist/mcp/request.js +61 -77
  535. package/dist/mcp/server.d.ts +3 -1
  536. package/dist/mcp/server.js +8 -3
  537. package/dist/mcp/session-state.d.ts +1 -1
  538. package/dist/mcp/session-state.js +4 -3
  539. package/dist/mcp/shared-gate.d.ts +3 -2
  540. package/dist/mcp/shared-gate.js +3 -2
  541. package/dist/mcp/stdio.d.ts +6 -3
  542. package/dist/mcp/stdio.js +59 -23
  543. package/dist/mcp/tool-args.d.ts +4 -1
  544. package/dist/mcp/tool-args.js +8 -3
  545. package/dist/mcp/tools.js +76 -32
  546. package/dist/objects/customer-notes.d.ts +12 -10
  547. package/dist/objects/customer-notes.js +21 -15
  548. package/dist/objects/decisions.d.ts +18 -10
  549. package/dist/objects/decisions.js +23 -17
  550. package/dist/objects/descriptor.js +2 -1
  551. package/dist/objects/fields.d.ts +4 -1
  552. package/dist/objects/fields.js +6 -2
  553. package/dist/objects/incidents.d.ts +14 -16
  554. package/dist/objects/incidents.js +29 -30
  555. package/dist/objects/lifecycle.d.ts +0 -4
  556. package/dist/objects/lifecycle.js +21 -24
  557. package/dist/objects/policies.d.ts +12 -16
  558. package/dist/objects/policies.js +17 -21
  559. package/dist/objects/processes.d.ts +16 -10
  560. package/dist/objects/processes.js +20 -15
  561. package/dist/objects/project-briefs.d.ts +13 -14
  562. package/dist/objects/project-briefs.js +33 -39
  563. package/dist/objects/skills.d.ts +10 -12
  564. package/dist/objects/skills.js +17 -22
  565. package/dist/postinstall.js +15 -7
  566. package/dist/predictions/planning-fallacy.d.ts +19 -6
  567. package/dist/predictions/planning-fallacy.js +4 -2
  568. package/dist/rerankers/clef.d.ts +8 -2
  569. package/dist/rerankers/clef.js +14 -9
  570. package/dist/rerankers/cross-encoder.d.ts +2 -1
  571. package/dist/rerankers/cross-encoder.js +19 -9
  572. package/dist/rerankers/index.js +2 -1
  573. package/dist/rerankers/jev.js +2 -1
  574. package/dist/rerankers/llm.d.ts +6 -2
  575. package/dist/rerankers/llm.js +8 -3
  576. package/dist/rerankers/remote.d.ts +3 -1
  577. package/dist/rerankers/remote.js +5 -2
  578. package/dist/rerankers/types.d.ts +6 -2
  579. package/dist/search/bm25-search.d.ts +3 -1
  580. package/dist/search/bm25-search.js +15 -2
  581. package/dist/search/boosts.js +4 -3
  582. package/dist/search/embed-memories.d.ts +12 -4
  583. package/dist/search/embed-memories.js +96 -58
  584. package/dist/search/engine.d.ts +11 -0
  585. package/dist/search/engine.js +14 -0
  586. package/dist/search/goal-boost.d.ts +10 -3
  587. package/dist/search/goal-boost.js +13 -6
  588. package/dist/search/hybrid-score.d.ts +4 -1
  589. package/dist/search/hybrid-score.js +4 -1
  590. package/dist/search/hybrid.d.ts +23 -8
  591. package/dist/search/hybrid.js +12 -7
  592. package/dist/search/multihop.js +14 -13
  593. package/dist/search/path-context.d.ts +10 -3
  594. package/dist/search/path-context.js +10 -3
  595. package/dist/search/physics-search.d.ts +9 -4
  596. package/dist/search/physics-search.js +38 -14
  597. package/dist/search/rerank.d.ts +2 -1
  598. package/dist/search/rerank.js +2 -1
  599. package/dist/search/rrf.d.ts +14 -5
  600. package/dist/search/rrf.js +11 -4
  601. package/dist/search/vector.d.ts +8 -2
  602. package/dist/search/vector.js +14 -8
  603. package/dist/server/auth.d.ts +19 -15
  604. package/dist/server/auth.js +68 -38
  605. package/dist/server/boot.d.ts +4 -1
  606. package/dist/server/boot.js +115 -67
  607. package/dist/server/client-ip.d.ts +17 -5
  608. package/dist/server/client-ip.js +56 -21
  609. package/dist/server/cursor.d.ts +10 -3
  610. package/dist/server/cursor.js +10 -3
  611. package/dist/server/deadline.d.ts +5 -2
  612. package/dist/server/deadline.js +10 -3
  613. package/dist/server/key-check-bounds.js +12 -4
  614. package/dist/server/lifecycle.d.ts +4 -1
  615. package/dist/server/lifecycle.js +10 -4
  616. package/dist/server/mcp-http.d.ts +2 -1
  617. package/dist/server/mcp-http.js +37 -22
  618. package/dist/server/rate-limit.d.ts +17 -5
  619. package/dist/server/rate-limit.js +55 -26
  620. package/dist/server/ready.js +7 -4
  621. package/dist/server/request.d.ts +15 -4
  622. package/dist/server/request.js +42 -15
  623. package/dist/server/route-checks.d.ts +4 -1
  624. package/dist/server/route-checks.js +8 -3
  625. package/dist/server/route-table.d.ts +8 -6
  626. package/dist/server/route-table.js +550 -97
  627. package/dist/server/routes/admin.d.ts +7 -7
  628. package/dist/server/routes/admin.js +36 -15
  629. package/dist/server/routes/customer-notes.d.ts +5 -5
  630. package/dist/server/routes/customer-notes.js +5 -4
  631. package/dist/server/routes/decisions.d.ts +5 -5
  632. package/dist/server/routes/decisions.js +12 -6
  633. package/dist/server/routes/incidents.d.ts +5 -5
  634. package/dist/server/routes/incidents.js +10 -4
  635. package/dist/server/routes/memories.d.ts +8 -8
  636. package/dist/server/routes/memories.js +12 -17
  637. package/dist/server/routes/object-routes.d.ts +8 -5
  638. package/dist/server/routes/object-routes.js +4 -2
  639. package/dist/server/routes/policies.d.ts +6 -6
  640. package/dist/server/routes/policies.js +11 -4
  641. package/dist/server/routes/predictions.d.ts +5 -5
  642. package/dist/server/routes/predictions.js +9 -4
  643. package/dist/server/routes/processes.d.ts +5 -5
  644. package/dist/server/routes/processes.js +15 -6
  645. package/dist/server/routes/project-briefs.d.ts +6 -6
  646. package/dist/server/routes/project-briefs.js +3 -2
  647. package/dist/server/routes/recall.d.ts +3 -3
  648. package/dist/server/routes/recall.js +21 -10
  649. package/dist/server/routes/skills.d.ts +6 -6
  650. package/dist/server/routes/skills.js +12 -4
  651. package/dist/server/server-detect.d.ts +24 -8
  652. package/dist/server/server-detect.js +57 -22
  653. package/dist/server/sleep-child.js +16 -10
  654. package/dist/server/sleep-offload.d.ts +8 -5
  655. package/dist/server/sleep-offload.js +40 -18
  656. package/dist/server/tls.d.ts +10 -2
  657. package/dist/server/tls.js +25 -5
  658. package/dist/server/types.d.ts +41 -24
  659. package/dist/server/validation.d.ts +4 -1
  660. package/dist/server/validation.js +22 -9
  661. package/dist/server.d.ts +17 -49
  662. package/dist/server.js +33 -40
  663. package/dist/sharing/global-store.d.ts +6 -12
  664. package/dist/sharing/global-store.js +8 -48
  665. package/dist/sharing/global-sync.d.ts +3 -1
  666. package/dist/sharing/global-sync.js +17 -7
  667. package/dist/sharing/project-merge.d.ts +25 -7
  668. package/dist/sharing/project-merge.js +49 -17
  669. package/dist/sharing/search-both.d.ts +8 -4
  670. package/dist/sharing/search-both.js +28 -14
  671. package/dist/sharing/share.d.ts +8 -4
  672. package/dist/sharing/share.js +40 -18
  673. package/dist/store/ambient.js +10 -5
  674. package/dist/store/audit-event.d.ts +2 -2
  675. package/dist/store/audit-event.js +8 -3
  676. package/dist/store/audit.d.ts +6 -3
  677. package/dist/store/audit.js +16 -6
  678. package/dist/store/auth.d.ts +4 -2
  679. package/dist/store/auth.js +63 -20
  680. package/dist/store/busy.d.ts +9 -0
  681. package/dist/store/busy.js +16 -0
  682. package/dist/store/candidates.d.ts +12 -5
  683. package/dist/store/candidates.js +90 -41
  684. package/dist/store/capture-write.d.ts +2 -1
  685. package/dist/store/capture-write.js +2 -1
  686. package/dist/store/card-detail.d.ts +4 -4
  687. package/dist/store/card-detail.js +15 -8
  688. package/dist/store/cards.d.ts +24 -10
  689. package/dist/store/cards.js +97 -63
  690. package/dist/store/compaction-caller.d.ts +2 -1
  691. package/dist/store/compaction-caller.js +2 -1
  692. package/dist/store/compactions-record.d.ts +14 -8
  693. package/dist/store/compactions-record.js +101 -37
  694. package/dist/store/compactions.js +35 -15
  695. package/dist/store/conflicts.d.ts +16 -5
  696. package/dist/store/conflicts.js +104 -48
  697. package/dist/store/connectors/dlq.d.ts +17 -5
  698. package/dist/store/connectors/dlq.js +58 -6
  699. package/dist/store/connectors/event-log.d.ts +122 -0
  700. package/dist/store/connectors/event-log.js +25 -0
  701. package/dist/store/connectors/github.d.ts +6 -3
  702. package/dist/store/connectors/github.js +30 -48
  703. package/dist/store/connectors/slack.d.ts +2 -1
  704. package/dist/store/connectors/slack.js +31 -47
  705. package/dist/store/dashboard-reads.d.ts +7 -3
  706. package/dist/store/dashboard-reads.js +32 -10
  707. package/dist/store/delete-and-batch.d.ts +17 -11
  708. package/dist/store/delete-and-batch.js +70 -28
  709. package/dist/store/delivery-recorder.d.ts +10 -7
  710. package/dist/store/delivery-recorder.js +70 -37
  711. package/dist/store/descendant-page.d.ts +2 -1
  712. package/dist/store/descendant-page.js +26 -10
  713. package/dist/store/diagnostics.d.ts +2 -1
  714. package/dist/store/diagnostics.js +2 -1
  715. package/dist/store/doctor-reads.d.ts +2 -1
  716. package/dist/store/doctor-reads.js +13 -5
  717. package/dist/store/dormant.d.ts +19 -11
  718. package/dist/store/dormant.js +45 -19
  719. package/dist/store/embeddings/index.d.ts +13 -9
  720. package/dist/store/embeddings/index.js +19 -12
  721. package/dist/store/entry-reads.d.ts +72 -21
  722. package/dist/store/entry-reads.js +215 -69
  723. package/dist/store/entry-row.d.ts +10 -6
  724. package/dist/store/entry-row.js +26 -14
  725. package/dist/store/entry-writes.d.ts +28 -13
  726. package/dist/store/entry-writes.js +61 -22
  727. package/dist/store/failure-log-at.js +1 -1
  728. package/dist/store/failure-log.d.ts +4 -2
  729. package/dist/store/failure-log.js +13 -6
  730. package/dist/store/gated-write.d.ts +3 -3
  731. package/dist/store/gated-write.js +3 -3
  732. package/dist/store/goals.d.ts +5 -4
  733. package/dist/store/goals.js +11 -12
  734. package/dist/store/graph-apply.d.ts +21 -0
  735. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  736. package/dist/store/graph-queue.d.ts +9 -6
  737. package/dist/store/graph-queue.js +15 -10
  738. package/dist/store/graph-reads.d.ts +16 -11
  739. package/dist/store/graph-reads.js +29 -19
  740. package/dist/store/graph-rows.d.ts +41 -3
  741. package/dist/store/graph-rows.js +10 -7
  742. package/dist/store/graph-view-rows.js +15 -7
  743. package/dist/store/graph-writes.d.ts +16 -10
  744. package/dist/store/graph-writes.js +59 -36
  745. package/dist/store/half-life.js +2 -2
  746. package/dist/store/handoffs.d.ts +13 -7
  747. package/dist/store/handoffs.js +44 -22
  748. package/dist/store/index-and-stats.d.ts +2 -2
  749. package/dist/store/index-and-stats.js +6 -5
  750. package/dist/store/index.d.ts +4 -2
  751. package/dist/store/index.js +2 -1
  752. package/dist/store/key-audit.d.ts +2 -1
  753. package/dist/store/key-audit.js +2 -1
  754. package/dist/store/key-writes.d.ts +2 -1
  755. package/dist/store/key-writes.js +9 -2
  756. package/dist/store/ledger-turn.d.ts +4 -1
  757. package/dist/store/ledger-turn.js +7 -2
  758. package/dist/store/mirrors.d.ts +11 -4
  759. package/dist/store/mirrors.js +96 -19
  760. package/dist/store/narrow.d.ts +6 -0
  761. package/dist/store/narrow.js +11 -0
  762. package/dist/store/open.d.ts +6 -3
  763. package/dist/store/open.js +20 -10
  764. package/dist/store/pilot-arm.d.ts +2 -1
  765. package/dist/store/pilot-arm.js +18 -6
  766. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  767. package/dist/store/planning-fallacy-evidence.js +8 -5
  768. package/dist/store/port/agent-import.d.ts +62 -0
  769. package/dist/store/port/agent-import.js +2 -0
  770. package/dist/store/port/consolidation.d.ts +129 -0
  771. package/dist/store/port/consolidation.js +2 -0
  772. package/dist/store/port/learning.d.ts +19 -0
  773. package/dist/store/port/learning.js +2 -0
  774. package/dist/store/port/local-files.d.ts +18 -0
  775. package/dist/store/port/local-files.js +2 -0
  776. package/dist/store/port/promotion.d.ts +20 -0
  777. package/dist/store/port/promotion.js +3 -0
  778. package/dist/store/port-groups.d.ts +160 -0
  779. package/dist/store/port-groups.js +2 -0
  780. package/dist/store/port.d.ts +261 -219
  781. package/dist/store/port.js +3 -9
  782. package/dist/store/predictions.d.ts +14 -10
  783. package/dist/store/predictions.js +37 -17
  784. package/dist/store/project-tags.d.ts +4 -1
  785. package/dist/store/project-tags.js +16 -5
  786. package/dist/store/quality-repair.d.ts +8 -4
  787. package/dist/store/quality-repair.js +53 -20
  788. package/dist/store/quarantine.d.ts +1 -0
  789. package/dist/store/quarantine.js +23 -9
  790. package/dist/store/raw-archive.d.ts +5 -4
  791. package/dist/store/raw-archive.js +11 -10
  792. package/dist/store/recall-trace.d.ts +22 -17
  793. package/dist/store/recall-trace.js +128 -64
  794. package/dist/store/rejected-values.d.ts +15 -10
  795. package/dist/store/rejected-values.js +46 -20
  796. package/dist/store/rejection.d.ts +12 -11
  797. package/dist/store/rejection.js +18 -19
  798. package/dist/store/report-reads.d.ts +2 -1
  799. package/dist/store/report-reads.js +2 -1
  800. package/dist/store/rows.d.ts +7 -5
  801. package/dist/store/rows.js +20 -13
  802. package/dist/store/rule-sql.d.ts +7 -3
  803. package/dist/store/rule-sql.js +26 -13
  804. package/dist/store/search-rows.d.ts +16 -11
  805. package/dist/store/search-rows.js +54 -32
  806. package/dist/store/sessions.d.ts +12 -10
  807. package/dist/store/sessions.js +40 -21
  808. package/dist/store/set-aside.d.ts +2 -2
  809. package/dist/store/set-aside.js +18 -5
  810. package/dist/store/sqlite/agent-import.d.ts +3 -0
  811. package/dist/store/sqlite/agent-import.js +77 -0
  812. package/dist/store/sqlite/cards-group.d.ts +6 -0
  813. package/dist/store/sqlite/cards-group.js +37 -0
  814. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  815. package/dist/store/sqlite/conflicts-group.js +18 -0
  816. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  817. package/dist/store/sqlite/connector-events-group.js +17 -6
  818. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  819. package/dist/store/sqlite/connector-writes-group.js +12 -5
  820. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  821. package/dist/store/sqlite/consolidation-group.js +64 -0
  822. package/dist/store/sqlite/dag-reads-group.js +1 -1
  823. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  824. package/dist/store/sqlite/dormant-group.js +29 -0
  825. package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
  826. package/dist/store/sqlite/entry-writes-group.js +37 -14
  827. package/dist/store/sqlite/error-codec.d.ts +4 -2
  828. package/dist/store/sqlite/error-codec.js +32 -10
  829. package/dist/store/sqlite/executor-counts.js +2 -1
  830. package/dist/store/sqlite/executor.d.ts +8 -3
  831. package/dist/store/sqlite/executor.js +56 -18
  832. package/dist/store/sqlite/global-promote.d.ts +5 -0
  833. package/dist/store/sqlite/global-promote.js +48 -0
  834. package/dist/store/sqlite/goals-group.d.ts +6 -0
  835. package/dist/store/sqlite/goals-group.js +23 -0
  836. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  837. package/dist/store/sqlite/graph-reads-group.js +2 -1
  838. package/dist/store/sqlite/held-connection.d.ts +8 -0
  839. package/dist/store/sqlite/held-connection.js +34 -7
  840. package/dist/store/sqlite/last-recall-group.d.ts +15 -0
  841. package/dist/store/sqlite/last-recall-group.js +62 -0
  842. package/dist/store/sqlite/learning-group.d.ts +4 -0
  843. package/dist/store/sqlite/learning-group.js +17 -0
  844. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  845. package/dist/store/sqlite/maintenance-groups.js +61 -0
  846. package/dist/store/sqlite/object-rows.d.ts +6 -3
  847. package/dist/store/sqlite/object-rows.js +34 -5
  848. package/dist/store/sqlite/objects-group.d.ts +5 -4
  849. package/dist/store/sqlite/objects-group.js +97 -38
  850. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  851. package/dist/store/sqlite/predictions-group.js +4 -2
  852. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  853. package/dist/store/sqlite/promotion-group.js +10 -0
  854. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  855. package/dist/store/sqlite/quarantine-group.js +4 -2
  856. package/dist/store/sqlite/reports-group.d.ts +6 -0
  857. package/dist/store/sqlite/reports-group.js +33 -0
  858. package/dist/store/sqlite/request-scope.d.ts +6 -0
  859. package/dist/store/sqlite/request-scope.js +18 -0
  860. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  861. package/dist/store/sqlite/sessions-group.js +46 -0
  862. package/dist/store/sqlite/store.d.ts +22 -18
  863. package/dist/store/sqlite/store.js +95 -33
  864. package/dist/store/sqlite/vector-pack.js +2 -1
  865. package/dist/store/sqlite/vector-reads-group.js +2 -1
  866. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  867. package/dist/store/sqlite/worker-jobs.js +19 -7
  868. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  869. package/dist/store/sqlite/worker-ops.js +6 -3
  870. package/dist/store/sqlite/worker-store.d.ts +4 -3
  871. package/dist/store/sqlite/worker-store.js +24 -14
  872. package/dist/store/summaries.d.ts +25 -11
  873. package/dist/store/summaries.js +84 -27
  874. package/dist/store/summary-dirty.d.ts +2 -1
  875. package/dist/store/summary-dirty.js +2 -1
  876. package/dist/store/tenant.d.ts +3 -2
  877. package/dist/store/tenant.js +5 -4
  878. package/dist/store/token-ledger-rows.js +8 -4
  879. package/dist/store/token-ledger.d.ts +19 -13
  880. package/dist/store/token-ledger.js +27 -14
  881. package/dist/store/tombstone-checks.d.ts +4 -1
  882. package/dist/store/tombstone-checks.js +10 -1
  883. package/dist/store/usage-reports.js +2 -1
  884. package/dist/store/vector-index.d.ts +8 -5
  885. package/dist/store/vector-index.js +28 -11
  886. package/dist/store/working-memory.d.ts +6 -4
  887. package/dist/store/working-memory.js +14 -9
  888. package/dist/support-bundle.js +10 -5
  889. package/dist/trust/quarantine.d.ts +1 -2
  890. package/dist/trust/quarantine.js +1 -5
  891. package/dist/trust/reject-flow.d.ts +12 -3
  892. package/dist/trust/reject-flow.js +12 -4
  893. package/dist/util/anthropic-messages.d.ts +7 -2
  894. package/dist/util/anthropic-messages.js +18 -7
  895. package/dist/util/atomic-write.d.ts +8 -3
  896. package/dist/util/atomic-write.js +36 -21
  897. package/dist/util/compaction-items.d.ts +4 -1
  898. package/dist/util/compaction-items.js +8 -2
  899. package/dist/util/crash-handlers.d.ts +7 -2
  900. package/dist/util/crash-handlers.js +13 -4
  901. package/dist/util/env.d.ts +26 -5
  902. package/dist/util/env.js +87 -25
  903. package/dist/util/format.d.ts +2 -0
  904. package/dist/util/format.js +4 -0
  905. package/dist/util/home-path.js +12 -6
  906. package/dist/util/hook-payload.d.ts +3 -1
  907. package/dist/util/hook-payload.js +3 -1
  908. package/dist/util/http-retry.d.ts +12 -6
  909. package/dist/util/http-retry.js +16 -6
  910. package/dist/util/http-util.d.ts +20 -5
  911. package/dist/util/http-util.js +28 -9
  912. package/dist/util/json.d.ts +4 -1
  913. package/dist/util/json.js +4 -1
  914. package/dist/util/keyset.js +2 -1
  915. package/dist/util/limits.js +4 -2
  916. package/dist/util/log.d.ts +13 -5
  917. package/dist/util/log.js +29 -6
  918. package/dist/util/net.d.ts +5 -0
  919. package/dist/util/net.js +19 -0
  920. package/dist/util/real-path.d.ts +2 -1
  921. package/dist/util/real-path.js +4 -3
  922. package/dist/util/request-scope.d.ts +16 -4
  923. package/dist/util/request-scope.js +19 -6
  924. package/dist/util/same-text.d.ts +10 -3
  925. package/dist/util/same-text.js +10 -3
  926. package/dist/util/secret-detect.d.ts +24 -7
  927. package/dist/util/secret-detect.js +49 -14
  928. package/dist/util/spawn-argv.d.ts +11 -0
  929. package/dist/util/spawn-argv.js +66 -0
  930. package/dist/util/sql.d.ts +3 -0
  931. package/dist/util/sql.js +6 -0
  932. package/dist/util/sqlite-blocked.d.ts +15 -4
  933. package/dist/util/sqlite-blocked.js +19 -6
  934. package/dist/util/stored-json.d.ts +4 -1
  935. package/dist/util/stored-json.js +6 -2
  936. package/dist/util/stream-tee.d.ts +2 -1
  937. package/dist/util/stream-tee.js +8 -5
  938. package/dist/util/transcript-tail.d.ts +4 -1
  939. package/dist/util/transcript-tail.js +4 -1
  940. package/dist/util/vector-codec.d.ts +4 -0
  941. package/dist/util/vector-codec.js +15 -0
  942. package/dist/util/version.d.ts +8 -3
  943. package/dist/util/version.js +8 -3
  944. package/dist/util/write-budget.d.ts +7 -2
  945. package/dist/util/write-budget.js +5 -2
  946. package/dist/util/yaml.d.ts +4 -1
  947. package/dist/util/yaml.js +4 -1
  948. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  949. package/extensions/openclaw-plugin/package.json +1 -1
  950. package/openclaw.plugin.json +1 -1
  951. package/package.json +4 -1
  952. package/scripts/postinstall.cjs +3 -1
  953. package/dist/api/audit.js +0 -56
  954. package/dist/api/cards.d.ts +0 -42
  955. package/dist/api/conflicts.d.ts +0 -28
  956. package/dist/api/conflicts.js +0 -61
  957. package/dist/api/dormant.d.ts +0 -14
  958. package/dist/api/dormant.js +0 -58
  959. package/dist/api/goals.d.ts +0 -18
  960. package/dist/api/graph.d.ts +0 -8
  961. package/dist/api/graph.js +0 -7
  962. package/dist/api/learn.js +0 -124
  963. package/dist/api/memories.d.ts +0 -23
  964. package/dist/api/memories.js +0 -46
  965. package/dist/api/objects.d.ts +0 -9
  966. package/dist/api/on-store.d.ts +0 -16
  967. package/dist/api/on-store.js +0 -38
  968. package/dist/api/outcome.d.ts +0 -19
  969. package/dist/api/outcome.js +0 -21
  970. package/dist/api/predictions.d.ts +0 -11
  971. package/dist/api/promote.d.ts +0 -36
  972. package/dist/api/promote.js +0 -65
  973. package/dist/api/recall-core.d.ts +0 -4
  974. package/dist/api/recall-core.js +0 -120
  975. package/dist/api/recall-finish.d.ts +0 -53
  976. package/dist/api/recall-finish.js +0 -30
  977. package/dist/api/recall-history.d.ts +0 -64
  978. package/dist/api/recall-history.js +0 -159
  979. package/dist/api/recall-record.d.ts +0 -43
  980. package/dist/api/recall-record.js +0 -78
  981. package/dist/api/recall-request.js +0 -121
  982. package/dist/api/recall.d.ts +0 -6
  983. package/dist/api/refine.d.ts +0 -7
  984. package/dist/api/refine.js +0 -10
  985. package/dist/api/session-owners.d.ts +0 -4
  986. package/dist/api/session-owners.js +0 -17
  987. package/dist/api/sleep-run.d.ts +0 -26
  988. package/dist/api/sleep.js +0 -10
  989. package/dist/cli/lenient-id.d.ts +0 -2
  990. package/dist/cli/lenient-id.js +0 -13
  991. package/dist/graph/write.d.ts +0 -14
  992. package/dist/store/sqlite/busy.d.ts +0 -3
  993. package/dist/store/sqlite/busy.js +0 -8
  994. package/dist/store/sqlite/local.d.ts +0 -21
  995. package/dist/store/sqlite/local.js +0 -39
@@ -1,7 +1,11 @@
1
1
  import type { AmbientTallies } from '../core/ambient.js';
2
2
  import type { AmbientStoreFilter } from './ambient.js';
3
3
  import type { ApiKeyListRow, ApiKeyRecord, ListApiKeysOpts, NewApiKey } from './auth.js';
4
- import type { AppendAuditOpts, AuditEvent, ListAuditAfterOpts, QueryAuditOpts } from './audit.js';
4
+ import type { ScopeGrantChange } from './key-writes.js';
5
+ import type { AppendAuditOpts, AuditEvent, AuditPrune, ListAuditAfterOpts, QueryAuditOpts } from './audit.js';
6
+ import type { QualityRepairResult } from './quality-repair.js';
7
+ import type { StoreWith } from './narrow.js';
8
+ import type { LocalFiles } from './port/local-files.js';
5
9
  import type { EmbeddingIndexState } from './vector-index.js';
6
10
  import type { Entity, Relation } from './graph-rows.js';
7
11
  import type { ActiveGoals, GetActiveGoalsOpts, GoalRecallLogRow } from './goals.js';
@@ -17,14 +21,14 @@ import type { ClosureState } from '../core/prediction.js';
17
21
  import type { QuarantineRow, QuarantineStatus } from './quarantine.js';
18
22
  import type { ScopeActor } from '../core/recall-scope.js';
19
23
  import type { RecallTraceInput } from './recall-trace.js';
20
- import type { AmbientLoadResult, AmbientRecallRequest, ContextCandidateFilter, RecentOrigins } from './candidates.js';
21
- import type { GitHubDlqInsert, GitHubRouting } from './connectors/github.js';
22
- import type { SlackDlqInsert, SlackTeamRoute } from './connectors/slack.js';
24
+ import type { AmbientLoadResult, AmbientRecallRequest, ContextCandidateFilter, HeldText, RecentOrigins } from './candidates.js';
23
25
  import type { StrengthenOptions } from './entry-writes.js';
26
+ import type { ConnectorEvents, ConnectorWrites } from './connectors/event-log.js';
24
27
  import type { SessionEvent, TaskSnapshot } from './rows.js';
25
28
  import type { OriginFilter, VectorCandidateSpec } from './search-rows.js';
26
29
  import type { ContinuityKey } from './sessions.js';
27
30
  import type { TokenUse } from './token-ledger.js';
31
+ import type { SessionAndAdminGroups } from './port-groups.js';
28
32
  /** The arguments of `loadRecallSearchEntries` after the query, by name. */
29
33
  export interface RecallSearchArgs {
30
34
  readonly limit: number;
@@ -38,14 +42,16 @@ export interface RecallSearchArgs {
38
42
  }
39
43
  /** Everything one recall writes once its reply is decided, so a store writes it on one connection. */
40
44
  export interface RecallWrites {
41
- /** Insert or ignore on (memory_id, goal_id), so the first row wins, a duplicate inside this batch included. First drop a row
42
- * whose memory_id is in no memories row of this store, whatever that row's tenant, as `localGoalRecallRows` does. */
45
+ /** Insert or ignore on (memory_id, goal_id), so the first row wins, a duplicate
46
+ * inside this batch included. First drop a row whose memory_id is in no memories
47
+ * row of this store, whatever that row's tenant, as `localGoalRecallRows` does. */
43
48
  readonly goalLog: readonly GoalRecallLogRow[];
44
49
  /** In the order they happened. */
45
50
  readonly audit: readonly AppendAuditOpts[];
46
51
  readonly trace?: RecallTraceInput;
47
- /** Nothing when `recallBoostAblated`. Each id found, in `tenantId` when set, gets the retrieval_count, last_retrieved,
48
- * half_life_days and strength `markRetrieved` computes from the row read before any update, so a repeated id moves once. */
52
+ /** Nothing when `recallBoostAblated`. Each id found, in `tenantId` when set, gets the retrieval_count,
53
+ * last_retrieved, half_life_days and strength `markRetrieved` computes from the row read before any update, so a
54
+ * repeated id moves once. */
49
55
  readonly strengthen?: {
50
56
  readonly ids: readonly string[];
51
57
  readonly opts: StrengthenOptions;
@@ -56,8 +62,9 @@ export interface VectorReads {
56
62
  /** The stored model and whether any vector exists, in one snapshot. */
57
63
  embeddingIndexState(): Promise<EmbeddingIndexState>;
58
64
  storedVectors(ids: readonly string[]): Promise<Map<string, number[]>>;
59
- /** The `spec.limit ?? 50` rows nearest `queryVector` by `rankVectorRows`, filtered by tenant (when set), kind != 'archived', superseded only with
60
- * `includeSuperseded`, scope per `RecallScopeFilter`, and origin '' or listed (when `spec.origin` is set). */
65
+ /** The `spec.limit ?? 50` rows nearest `queryVector` by `rankVectorRows`, filtered by tenant (when set), kind !=
66
+ * 'archived', superseded only with `includeSuperseded`, scope per `RecallScopeFilter`, and origin '' or listed (when
67
+ * `spec.origin` is set). */
61
68
  nearestEntries(queryVector: readonly number[], spec: VectorCandidateSpec): Promise<MemoryEntry[]>;
62
69
  /** The particles of `ids` only; an empty list reads nothing. */
63
70
  physicsParticles(ids: readonly string[]): Promise<Map<string, PhysicsParticle>>;
@@ -73,13 +80,15 @@ export interface VectorWrite {
73
80
  readonly tenantId: string;
74
81
  /** The index identity the vectors were built by, `embeddingIndexIdentity(provider.id)`. */
75
82
  readonly model: string;
76
- /** Set only by embedAll's rebuild, so a write that read the index state before another process rebuilt it cannot drop that rebuild. */
83
+ /** Set only by embedAll's rebuild, so a write that read the index
84
+ * state before another process rebuilt it cannot drop that rebuild. */
77
85
  readonly replaceIndex: boolean;
78
86
  readonly rows: readonly VectorRowWrite[];
79
87
  }
80
88
  export interface VectorWriteResult {
81
89
  readonly written: number;
82
- /** True when another model built the index and `replaceIndex` is false; the store then keeps nothing and `written` is 0. */
90
+ /** True when another model built the index and `replaceIndex` is false; the store then keeps nothing and `written` is
91
+ * 0. */
83
92
  readonly modelMismatch: boolean;
84
93
  }
85
94
  export interface VectorBackfillQuery {
@@ -91,13 +100,15 @@ export interface VectorBackfillQuery {
91
100
  /** Every tenant when unset, since the backfill covers the whole store. */
92
101
  readonly tenantId?: string;
93
102
  }
94
- /** The writes behind embed on write and the backfill: core computes each vector, the store only keeps it.
95
- * A store deletes a memory's vector and particle when the memory is deleted (hippo.db does it by trigger and foreign-key cascade). */
103
+ /** The writes behind embed on write and the backfill: core computes each vector,
104
+ * the store only keeps it. A store deletes a memory's vector and particle when
105
+ * the memory is deleted (hippo.db does it by trigger and foreign-key cascade). */
96
106
  export interface VectorWrites {
97
107
  /** Memories of any kind with no vector stored under `query.model`, by id ascending in byte order. */
98
108
  entriesWithoutVector(query: VectorBackfillQuery): Promise<MemoryEntry[]>;
99
- /** In one transaction: refuses with `modelMismatch` if `replacesIndex` and not `replaceIndex`; else drops every vector and particle if `replacesIndex`,
100
- * keeps each writable row (memory in `tenantId`, finite non-empty vector) under `model` with its particle, sets `model`. No audit row. */
109
+ /** In one transaction: refuses with `modelMismatch` if `replacesIndex` and not `replaceIndex`; else drops every
110
+ * vector and particle if `replacesIndex`, keeps each writable row (memory in `tenantId`, finite non-empty vector)
111
+ * under `model` with its particle, sets `model`. No audit row. */
101
112
  writeVectors(write: VectorWrite): Promise<VectorWriteResult>;
102
113
  }
103
114
  export interface KeyRevoke {
@@ -107,12 +118,15 @@ export interface KeyRevoke {
107
118
  readonly at: string;
108
119
  }
109
120
  export interface KeyAudit {
110
- /** Sets revoked_at to `at` and appends one auth_revoke row (the key's tenant, `actor`, the key id) in one transaction, then resolves to `at`. A revoked
111
- * key resolves to its own revoked_at and writes nothing; a key missing from `tenantId` rejects with NotFoundError `Unknown key_id: <keyId>`. */
121
+ /** Sets revoked_at to `at` and appends one auth_revoke row (the key's tenant, `actor`, the key id) in one
122
+ * transaction, then resolves to `at`. A revoked key resolves to its own revoked_at and writes nothing; a key missing
123
+ * from `tenantId` rejects with NotFoundError `Unknown key_id: <keyId>`. */
112
124
  revokeApiKey(revoke: KeyRevoke): Promise<string>;
113
- /** As `listAuditEventsAfter`: rows above `afterId` in ascending id order, with its RangeErrors, limit clamp and tenant filter. */
125
+ /** As `listAuditEventsAfter`: rows above `afterId` in ascending
126
+ * id order, with its RangeErrors, limit clamp and tenant filter. */
114
127
  auditEventsAfter(opts: ListAuditAfterOpts): Promise<AuditEvent[]>;
115
- /** The highest audit id ever assigned, pruned rows included, 0 before the first; a tail that sees it drop knows the log was restored. */
128
+ /** The highest audit id ever assigned, pruned rows included, 0 before the first; a tail that sees it drop knows the
129
+ * log was restored. */
116
130
  auditHighId(): Promise<number>;
117
131
  }
118
132
  /** One ambient load: the pins, the `recentNeeded` newest rows `admit` keeps, and the prompt-recall candidates. */
@@ -126,22 +140,27 @@ export interface AmbientCandidateRequest {
126
140
  /** The reads behind getContext beyond the base `continuity`: its fallback handoff, candidate rows and ambient tallies.
127
141
  * getContext with a query under an embedding provider needs `vectors` too, and answers 501 without it. */
128
142
  export interface ContextReads {
129
- /** The newest handoff of the last `maxAgeMs` that is its session's highest id, has no outcome or a partial or failed one, and
130
- * passes recall's default scope deny, as `loadLatestHandoff` with `unfinishedOnly` and `scopeFilter: 'default-deny'`. Rejects an empty tenant id. */
143
+ /** The newest handoff of the last `maxAgeMs` that is its session's highest id, has no outcome or a partial or failed
144
+ * one, and passes recall's default scope deny, as `loadLatestHandoff` with `unfinishedOnly` and `scopeFilter:
145
+ * 'default-deny'`. Rejects an empty tenant id. */
131
146
  unfinishedHandoff(tenantId: string, maxAgeMs: number, key: ContinuityKey | null): Promise<SessionHandoff | null>;
132
- /** As `loadAmbientCandidates`; `recall` searches with the query `rarestFtsQuery` builds from FTS document counts over every tenant's rows,
133
- * and finds nothing when no term is indexed. Core keeps only `tenantId`'s rows that its own admit passes, whatever the store returns. */
147
+ /** As `loadAmbientCandidates`; `recall` searches with the query `rarestFtsQuery` builds from FTS document counts over
148
+ * every tenant's rows, and finds nothing when no term is indexed. Core keeps only `tenantId`'s rows that its own
149
+ * admit passes, whatever the store returns. */
134
150
  ambientCandidates(tenantId: string, request: AmbientCandidateRequest): Promise<AmbientLoadResult>;
135
- /** As `loadContextCandidates`: at most `filter.cap` live rows, pins and then the least decayed first, returned by created, then id. */
151
+ /** As `loadContextCandidates`: at most `filter.cap` live rows, pins and then the least decayed first, returned by
152
+ * created, then id. */
136
153
  contextCandidates(tenantId: string, filter: ContextCandidateFilter): Promise<MemoryEntry[]>;
137
- /** As `loadAmbientTallies`: one aggregate over the live, unarchived rows `filter` admits, less other projects' secret-tagged rows. */
154
+ /** As `loadAmbientTallies`: one aggregate over the live, unarchived
155
+ * rows `filter` admits, less other projects' secret-tagged rows. */
138
156
  ambientTallies(tenantId: string, filter: AmbientStoreFilter): Promise<AmbientTallies>;
139
157
  }
140
158
  export interface EntryWrite {
141
159
  readonly entry: MemoryEntry;
142
160
  readonly actor: string;
143
161
  }
144
- /** Who acts on which of a tenant's rows; `ownScope` is the caller's personal scope, so every other personal row is out of reach. */
162
+ /** Who acts on which of a tenant's rows; `ownScope` is the caller's
163
+ * personal scope, so every other personal row is out of reach. */
145
164
  export interface EntryTarget {
146
165
  readonly tenantId: string;
147
166
  readonly actor: string;
@@ -161,26 +180,33 @@ export interface EntryRemoval extends EntryTarget {
161
180
  export interface RawArchive extends EntryRemoval {
162
181
  readonly reason: string;
163
182
  }
164
- /** The memory-row writes behind remember, outcome, supersede, archive and forget. Each writes its audit rows in the write's own transaction,
165
- * a child row's change marks its level 2 or 3 summary parent dirty (one summary_marked_dirty row on the flip), and the schema's rules hold. */
183
+ /** The memory-row writes behind remember, outcome, supersede, archive and forget. Each writes its audit rows in the
184
+ * write's own transaction, a child row's change marks its level 2 or 3 summary parent dirty (one summary_marked_dirty
185
+ * row on the flip), and the schema's rules hold. */
166
186
  export interface EntryWrites {
167
- /** Upserts the row, its full-text row and one remember row ({kind, scope}) in the entry's tenant; an id held by another tenant rejects with ConflictError.
168
- * Content from a tenant that tombstoned it rejects with RejectedValueError and writes one reject_refusal row after the rollback, best effort. */
187
+ /** Upserts the row, its full-text row and one remember row ({kind, scope}) in the entry's tenant; an id held by
188
+ * another tenant rejects with ConflictError. Content from a tenant that tombstoned it rejects with RejectedValueError
189
+ * and writes one reject_refusal row after the rollback, best effort. */
169
190
  writeEntry(write: EntryWrite): Promise<void>;
170
- /** Per id in order, a row of the tenant within reach gets `entryAfterOutcome` (rewrite as writeEntry does) and one outcome row ({good}); other ids skipped.
171
- * Each read holds the row lock to commit (SELECT ... FOR UPDATE), so a concurrent supersede is not undone. Resolves to the ids applied, repeats kept. */
191
+ /** Per id in order, a row of the tenant within reach gets `entryAfterOutcome` (rewrite as writeEntry does) and one
192
+ * outcome row ({good}); other ids skipped. Each read holds the row lock to commit (SELECT ... FOR UPDATE), so a
193
+ * concurrent supersede is not undone. Resolves to the ids applied, repeats kept. */
172
194
  applyOutcome(outcome: OutcomeWrite): Promise<string[]>;
173
- /** Sets the old row's superseded_by if it is within reach and not yet superseded (both checked in the transaction), else rejects NotFoundError or
174
- * ConflictError. Then writes the successor as writeEntry does and one supersede row ({newId}), all or nothing. */
195
+ /** Sets the old row's superseded_by if it is within reach and not yet superseded (both checked in the transaction),
196
+ * else rejects NotFoundError or ConflictError. Then writes the successor as writeEntry does and one supersede row
197
+ * ({newId}), all or nothing. */
175
198
  supersede(write: SupersedeWrite): Promise<void>;
176
- /** Moves a raw row to raw_archive (metadata only, no content), deletes it and its full-text row and writes one archive_raw row ({reason});
177
- * resolves to the archived_at written. A row out of reach rejects with NotFoundError `memory not found: <id>`, any other kind with BadRequestError. */
199
+ /** Moves a raw row to raw_archive (metadata only, no content), deletes it and its full-text row and writes one
200
+ * archive_raw row ({reason}); resolves to the archived_at written. A row out of reach rejects with NotFoundError
201
+ * `memory not found: <id>`, any other kind with BadRequestError. */
178
202
  archiveRaw(archive: RawArchive): Promise<string>;
179
- /** Deletes the row and its full-text row and writes one forget row; a raw row rejects, being append-only. A row out of reach rejects with
180
- * NotFoundError `memory not found: <id>`. Archive and forget then add one to the store-wide forgotten counter, best effort. */
203
+ /** Deletes the row and its full-text row and writes one forget row; a raw row rejects, being append-only. A row out
204
+ * of reach rejects with NotFoundError `memory not found: <id>`. Archive and forget then add one to the store-wide
205
+ * forgotten counter, best effort. */
181
206
  forget(removal: EntryRemoval): Promise<void>;
182
207
  }
183
- /** A key to insert and the actor and metadata of its auth_create row, whose tenant and target are the key's. Neither holds the plaintext. */
208
+ /** A key to insert and the actor and metadata of its auth_create row, whose tenant and target are the key's. Neither
209
+ * holds the plaintext. */
184
210
  export interface KeyMint {
185
211
  readonly key: NewApiKey;
186
212
  readonly actor: string;
@@ -199,15 +225,21 @@ export interface KeyListQuery extends Omit<ListApiKeysOpts, 'tenantId'> {
199
225
  readonly tenantId: string;
200
226
  }
201
227
  export interface KeyWrites {
202
- /** Inserts the key and appends its auth_create row in one transaction; with either one failing, neither is written. A key id taken in any tenant
203
- * rejects, since keys are looked up by id alone. */
228
+ /** Inserts the key and appends its auth_create row in one transaction; with either one failing, neither is written. A
229
+ * key id taken in any tenant rejects, since keys are looked up by id alone. */
204
230
  createApiKey(mint: KeyMint): Promise<void>;
205
- /** Serialized per (tenant, owner) before the count (BEGIN IMMEDIATE / pg_advisory_xact_lock): revoke the owner's oldest live keys to `perSubject - 1`,
206
- * then insert the key; append auth_revoke `{ replacedBy }` per revoked key, then auth_create. Live: unrevoked and not expired (NaN counts as expired). */
231
+ /** Serialized per (tenant, owner) before the count (BEGIN IMMEDIATE / pg_advisory_xact_lock): revoke the owner's
232
+ * oldest live keys to `perSubject - 1`, then insert the key; append auth_revoke `{ replacedBy }` per revoked key,
233
+ * then auth_create. Live: unrevoked and not expired (NaN counts as expired). */
207
234
  createSelfApiKey(mint: SelfKeyMint): Promise<string[]>;
208
- /** As `listApiKeyRows`: newest inserted first, each with its scope grants; `active` drops revoked rows and an expires_at not above now's toISOString. */
235
+ /** As `listApiKeyRows`: newest inserted first, each with its scope grants; `active` drops revoked rows and an
236
+ * expires_at not above now's toISOString. */
209
237
  listApiKeys(query: KeyListQuery): Promise<ApiKeyListRow[]>;
210
238
  }
239
+ export interface KeyGrants {
240
+ /** Checks the key under the write lock; the change and its auth_grant or auth_ungrant row commit together. */
241
+ changeScopeGrant(change: ScopeGrantChange): Promise<void>;
242
+ }
211
243
  /** A claim to save and the memory row that mirrors it into recall: core builds it with
212
244
  * `predictionMirror` in the tenant the save names, so every store keeps the same row. */
213
245
  export interface PredictionSave extends SavePredictionOpts {
@@ -234,23 +266,27 @@ export type PredictionListQuery = PredictionFilter & {
234
266
  /** The reads and writes behind the predictions routes. createdAt and closedAt are the store's
235
267
  * own clock at the write, as `toISOString` gives it, since the list orders createdAt as text. */
236
268
  export interface Predictions {
237
- /** In one transaction: writes `mirror` as `EntryWrites.writeEntry` does, inserts the open row under the next id, and appends one predict_create row
238
- * ({prediction_id, class_tag, has_estimate, target_date}) ahead of the mirror's remember row. Resolves to the row saved. */
269
+ /** In one transaction: writes `mirror` as `EntryWrites.writeEntry` does, inserts the open row under the next id, and
270
+ * appends one predict_create row ({prediction_id, class_tag, has_estimate, target_date}) ahead of the mirror's
271
+ * remember row. Resolves to the row saved. */
239
272
  savePrediction(tenantId: string, input: PredictionSave, actor: string): Promise<Prediction>;
240
- /** Closes the tenant's open row and appends one predict_close row ({prediction_id, closure_state, has_actual}) in one transaction; the mirror stays as saved.
241
- * A missing or other-tenant id rejects with NotFoundError, an already-closed row with BadRequestError; neither writes anything. */
273
+ /** Closes the tenant's open row and appends one predict_close row ({prediction_id, closure_state, has_actual}) in one
274
+ * transaction; the mirror stays as saved. A missing or other-tenant id rejects with NotFoundError, an already-closed
275
+ * row with BadRequestError; neither writes anything. */
242
276
  closePrediction(tenantId: string, id: number, close: PredictionClose, actor: string): Promise<Prediction>;
243
277
  /** The tenant's row; null for a missing id or another tenant's. No audit row. */
244
278
  predictionById(tenantId: string, id: number): Promise<Prediction | null>;
245
- /** At most `limit` rows, newest first: by createdAt compared as text in byte order, then by id, both descending, so the order is total.
246
- * `after` keeps only the rows below its (createdAt, id) pair in that order. No audit row. */
279
+ /** At most `limit` rows, newest first: by createdAt compared as text in byte order, then by id, both descending, so
280
+ * the order is total. `after` keeps only the rows below its (createdAt, id) pair in that order. No audit row. */
247
281
  listPredictions(tenantId: string, query: PredictionListQuery): Promise<Prediction[]>;
248
- /** `predictionBaserateOf` over the tenant's closed (not closed-unknown) rows of the class with an estimate and an actual, in ascending id order (its
249
- * float sums depend on it). Then appends one predict_baserate row ({class_tag, n_closed}), also for a class with no such row. */
282
+ /** `predictionBaserateOf` over the tenant's closed (not closed-unknown) rows of the class with an estimate and an
283
+ * actual, in ascending id order (its float sums depend on it). Then appends one predict_baserate row ({class_tag,
284
+ * n_closed}), also for a class with no such row. */
250
285
  predictionBaserate(tenantId: string, classTag: string, actor: string): Promise<PredictionBaserate>;
251
286
  }
252
- /** Which of a tenant's rows of one kind a list reads: every status when `status` is unset, every value of the kind's one filter column (customer, repo)
253
- * when `filter` is. Neither is ever empty; a kind with no filter column ignores `filter`. */
287
+ /** Which of a tenant's rows of one kind a list reads: every status when `status` is
288
+ * unset, every value of the kind's one filter column (customer, repo) when `filter`
289
+ * is. Neither is ever empty; a kind with no filter column ignores `filter`. */
254
290
  export interface ObjectListQuery<K extends ObjectKind = ObjectKind> {
255
291
  readonly status?: ObjectByKind[K]['status'];
256
292
  readonly filter?: string;
@@ -274,11 +310,13 @@ export interface ObjectSave<K extends SavableKind = SavableKind> {
274
310
  /** Stored on a successor of a versioned kind only; a first version and a decision keep none. */
275
311
  readonly changeSummary?: string;
276
312
  readonly actor: string;
277
- /** The new row's createdAt and the replaced row's supersededAt: core's clock, as `toISOString` gives it, since the list orders createdAt as text. */
313
+ /** The new row's createdAt and the replaced row's supersededAt: core's clock, as `toISOString` gives it, since the
314
+ * list orders createdAt as text. */
278
315
  readonly at: string;
279
316
  }
280
- /** Why a save or close wrote nothing: the tenant holds no such row (`missing`), the row's `status` is not one the write may start from, another writer moved it
281
- * between the check and the write (`raced`), or the written row could not be read back (`vanished`). Core turns each into its own error text. */
317
+ /** Why a save or close wrote nothing: the tenant holds no such row (`missing`), the row's `status` is not one the write
318
+ * may start from, another writer moved it between the check and the write (`raced`), or the written row could not be
319
+ * read back (`vanished`). Core turns each into its own error text. */
282
320
  export type ObjectRefusal = {
283
321
  readonly refused: 'missing';
284
322
  } | {
@@ -314,42 +352,54 @@ export interface IncidentResolve {
314
352
  /** The row's resolvedAt: core's clock, as `toISOString` gives it. */
315
353
  readonly at: string;
316
354
  }
317
- /** `asOf` is an instant as `toISOString` gives it, so it compares as text against validFrom and validTo; `name` keeps one policyName, and may be empty. */
355
+ /** `asOf` is an instant as `toISOString` gives it, so it compares as text against validFrom and validTo; `name` keeps
356
+ * one policyName, and may be empty. */
318
357
  export interface PoliciesInForceQuery {
319
358
  readonly asOf: string;
320
359
  readonly name?: string;
321
360
  readonly limit: number;
322
361
  }
323
- /** The reads and writes behind the typed-object routes. An audit row names the object under the kind's id key (decision_id, incident_id, ...).
324
- * A row belongs to one tenant: another tenant's id reads as missing in every method. */
362
+ /** The reads and writes behind the typed-object routes. An audit row names the
363
+ * object under the kind's id key (decision_id, incident_id, ...). A row
364
+ * belongs to one tenant: another tenant's id reads as missing in every method. */
325
365
  export interface Objects {
326
- /** At most `limit` rows of the kind, newest first: by createdAt compared as text in byte order, then by id, both descending, so the order is total.
327
- * `after` keeps only the rows below its (createdAt, id) pair in that order. No audit row. */
366
+ /** At most `limit` rows of the kind, newest first: by createdAt compared as text
367
+ * in byte order, then by id, both descending, so the order is total. `after`
368
+ * keeps only the rows below its (createdAt, id) pair in that order. No audit row. */
328
369
  listObjects<K extends ObjectKind>(tenantId: string, kind: K, query: ObjectListQuery<K>): Promise<ObjectByKind[K][]>;
329
370
  /** The tenant's row; null for a missing id or another tenant's. No audit row. */
330
371
  objectById<K extends ObjectKind>(tenantId: string, kind: K, id: number): Promise<ObjectByKind[K] | null>;
331
- /** In one transaction: moves the tenant's row from a `close.from` status to closed at `close.at` and appends one <kind>_close row; a refusal writes nothing.
332
- * After the commit a kind the graph reads has its graph rows dropped and its mirror queued for a rebuild; a failure there is logged, never thrown. */
372
+ /** In one transaction: moves the tenant's row from a `close.from` status to closed at `close.at` and appends one
373
+ * <kind>_close row; a refusal writes nothing. After the commit a kind the graph reads has its graph rows dropped and
374
+ * its mirror queued for a rebuild; a failure there is logged, never thrown. */
333
375
  closeObject<K extends ObjectKind>(tenantId: string, kind: K, id: number, close: ObjectClose<K>): Promise<ObjectByKind[K] | ObjectRefusal>;
334
- /** In one transaction, in order: writes `mirror` as `EntryWrites.writeEntry` does; inserts the row active (version 1, or the replaced row's plus one);
335
- * with `supersedesId`, supersedes that row; appends the supersede and create rows. A refusal (`missing`, `status`, `raced`, `vanished`) writes nothing. */
376
+ /** In one transaction, in order: writes `mirror` as `EntryWrites.writeEntry` does; inserts the row active (version 1,
377
+ * or the replaced row's plus one); with `supersedesId`, supersedes that row; appends the supersede and create rows. A
378
+ * refusal (`missing`, `status`, `raced`, `vanished`) writes nothing. */
336
379
  saveObject<K extends SavableKind>(tenantId: string, kind: K, save: ObjectSave<K>): Promise<ObjectByKind[K] | ObjectRefusal>;
337
- /** In one transaction, in order: writes `mirror` as `EntryWrites.writeEntry` does; checks each linked id is a memory of the tenant; inserts the row open
338
- * under the next id; appends the incident_open row, then the mirror's remember row. A refusal leaves no mirror, row or audit row. */
380
+ /** In one transaction, in order: writes `mirror` as `EntryWrites.writeEntry` does; checks each linked id is a memory
381
+ * of the tenant; inserts the row open under the next id; appends the incident_open row, then the mirror's remember
382
+ * row. A refusal leaves no mirror, row or audit row. */
339
383
  openIncident(tenantId: string, open: IncidentOpen): Promise<Incident | IncidentOpenRefusal>;
340
- /** In one transaction: moves the tenant's incident from open to resolved with `resolve.text` and `resolve.at`, then appends one incident_resolve row.
341
- * A refusal (`missing`, `status`, or `vanished`) writes nothing. */
384
+ /** In one transaction: moves the tenant's incident from open to resolved with `resolve.text` and `resolve.at`, then
385
+ * appends one incident_resolve row. A refusal (`missing`, `status`, or `vanished`) writes nothing. */
342
386
  resolveIncident(tenantId: string, id: number, resolve: IncidentResolve): Promise<Incident | ObjectRefusal>;
343
- /** Policies in force at `asOf` (max `limit`): not closed, validFrom <= asOf < validTo (or unset), and active or superseded by a row whose validFrom is
344
- * after asOf. Newest validFrom first, compared as text in byte order, then larger id. No audit row. */
387
+ /** Policies in force at `asOf` (max `limit`): not closed, validFrom <= asOf < validTo (or unset), and active or
388
+ * superseded by a row whose validFrom is after asOf. Newest validFrom first, compared as text in byte order, then
389
+ * larger id. No audit row. */
345
390
  policiesInForce(tenantId: string, query: PoliciesInForceQuery): Promise<Policy[]>;
346
- /** At most `limit` of the tenant's active skills, by skillName ascending compared as text in byte order, then by id ascending. No audit row. */
391
+ /** At most `limit` of the tenant's active skills, by skillName ascending compared as text in byte order, then by id
392
+ * ascending. No audit row. */
347
393
  activeSkillsByName(tenantId: string, limit: number): Promise<Skill[]>;
348
- /** At most `limit` of the tenant's memories carrying `tag` (tag list as JSON, matched between double quotes, unescaped, ASCII case-folded) whose source
349
- * is not project_brief and whose scope recall admits with no scope asked, newest first by created (text, byte order) then id. No audit row. */
394
+ /** At most `limit` of the tenant's memories carrying `tag` (tag list as JSON, matched between double quotes,
395
+ * unescaped, ASCII case-folded) whose source is not project_brief and whose scope recall admits with no scope asked,
396
+ * newest first by created (text, byte order) then id. No audit row. */
350
397
  briefReceipts(tenantId: string, tag: string, limit: number): Promise<BriefReceipt[]>;
398
+ /** The id of the tenant's newest `kind` row in `status` that `memoryId` mirrors, or null. No audit row. */
399
+ objectIdByMemory<K extends ObjectKind>(tenantId: string, kind: K, status: ObjectByKind[K]['status'], memoryId: string): Promise<number | null>;
351
400
  }
352
- /** One session's unsuperseded raw rows inside a tenant; `origins` keeps those projects' rows and rows of no project, unset keeps every origin. */
401
+ /** One session's unsuperseded raw rows inside a tenant; `origins` keeps those projects' rows and rows of no project,
402
+ * unset keeps every origin. */
353
403
  export interface SessionRawQuery {
354
404
  readonly tenantId: string;
355
405
  readonly sessionId: string;
@@ -370,22 +420,26 @@ export type DescendantOrigin = Pick<MemoryEntry, 'scope' | 'origin_project'>;
370
420
  export interface DescendantPage {
371
421
  /** How many rows the caller reads whole, counted from the first row of the first level. */
372
422
  readonly rows: number;
373
- /** `DescendantWalk.admit` for a row under the summary, judged on these two fields alone; the two must agree on every such row. */
423
+ /** `DescendantWalk.admit` for a row under the summary, judged on
424
+ * these two fields alone; the two must agree on every such row. */
374
425
  readonly admit: (row: DescendantOrigin) => boolean;
375
426
  }
376
427
  export interface DescendantWalk {
377
428
  /** Levels to read under the summary. */
378
429
  readonly depth: number;
379
- /** Asked of the summary, then of each child read: a refused row is left out of the answer and nothing under it is read. */
430
+ /** Asked of the summary, then of each child read: a refused
431
+ * row is left out of the answer and nothing under it is read. */
380
432
  readonly admit: (row: MemoryEntry) => boolean;
381
- /** Set by a caller that shows only the first rows. A store may ignore it; one that honours it returns just those rows and counts every level in `sizes`. */
433
+ /** Set by a caller that shows only the first rows. A store may ignore it; one that honours it returns just those rows
434
+ * and counts every level in `sizes`. */
382
435
  readonly page?: DescendantPage;
383
436
  }
384
437
  export interface SummaryDescendants {
385
438
  readonly summary: MemoryEntry;
386
439
  /** The admitted rows of each level, the summary's own children first; a level with none ends the list. */
387
440
  readonly levels: MemoryEntry[][];
388
- /** Set only by a store that honoured `walk.page`: how many rows each level admits, while `levels` holds just the page, in the same order. */
441
+ /** Set only by a store that honoured `walk.page`: how many rows each level admits, while `levels` holds just the
442
+ * page, in the same order. */
389
443
  readonly sizes?: readonly number[];
390
444
  }
391
445
  /** The reads behind session assembly and summary drill-down. None writes an audit row. */
@@ -396,14 +450,16 @@ export interface DagReads {
396
450
  /** How many rows the session holds with no cap, under the scope rule `passesScopeFilterForRecall`
397
451
  * applies, so the count never tells of a row the caller could not read. */
398
452
  sessionRawCount(query: SessionRawCount): Promise<number>;
399
- /** The tenant's row `id` and up to `walk.depth` levels under it, read in one call so no write of this process lands between levels; null if no such row.
400
- * Each level lists the children of the one above, parent by parent, children by created then id ascending; a row is listed once, at its first level. */
453
+ /** The tenant's row `id` and up to `walk.depth` levels under it, read in one call so no write of this process lands
454
+ * between levels; null if no such row. Each level lists the children of the one above, parent by parent, children by
455
+ * created then id ascending; a row is listed once, at its first level. */
401
456
  summaryWithDescendants(tenantId: string, id: string, walk: DescendantWalk): Promise<SummaryDescendants | null>;
402
457
  }
403
458
  /** The read behind the audit list. It writes no audit row. */
404
459
  export interface AuditLog {
405
- /** One tenant's rows newest first, by ts then id descending, narrowed by `op` and by `since` (ts at or after it); `limit` is clamped to 1..10001 and
406
- * defaults to 100, and `after` resumes below the (ts, id) position a page ended on. */
460
+ /** One tenant's rows newest first, by ts then id descending, narrowed by `op` and
461
+ * by `since` (ts at or after it); `limit` is clamped to 1..10001 and defaults to
462
+ * 100, and `after` resumes below the (ts, id) position a page ended on. */
407
463
  listAuditEvents(query: QueryAuditOpts): Promise<AuditEvent[]>;
408
464
  }
409
465
  /** What GET /ready asks of a store. */
@@ -411,6 +467,19 @@ export interface Readiness {
411
467
  /** Resolves once one cheap read has answered; rejects with the store's own error when it cannot. */
412
468
  ping(): Promise<void>;
413
469
  }
470
+ /** A recall's writes when the store keeps it as its last one: `strengthen.ids` are the ids it returned. */
471
+ export type LastRecallWrites = RecallWrites & Required<Pick<RecallWrites, 'strengthen'>>;
472
+ /** The last recall a store keeps, so a later outcome can name it, and the outcome linked to a recall trace. */
473
+ export interface LastRecall {
474
+ /** entryWrites.applyOutcome, then a link from recall trace `traceId` to the ids applied; resolves to those ids. */
475
+ applyTracedOutcome(outcome: OutcomeWrite, traceId: number): Promise<string[]>;
476
+ /** applyTracedOutcome on the ids and trace of the last recall, read
477
+ * together so an outcome never pairs them with an older trace. */
478
+ applyOutcomeToLast(target: EntryTarget, good: boolean): Promise<string[]>;
479
+ /** finishRecall, then the ids this store lacks strengthened under `globalRoot`, then the ids and their trace saved as
480
+ * the last recall in one write; resolves to the trace id, null when none was asked or its write failed. */
481
+ finishRecall(writes: LastRecallWrites, globalRoot: string | undefined): Promise<number | null>;
482
+ }
414
483
  /** Which of a tenant's quarantine records a list reads; `limit` is 100 when unset. */
415
484
  export interface QuarantineListQuery {
416
485
  readonly status: QuarantineStatus | 'all';
@@ -421,7 +490,8 @@ export interface QuarantineListQuery {
421
490
  export interface QuarantinedMemory extends QuarantineRow {
422
491
  readonly content: string | null;
423
492
  }
424
- /** Why a decision wrote nothing: the tenant holds no record for the id (another tenant's id reads the same), or the record was decided before. */
493
+ /** Why a decision wrote nothing: the tenant holds no record for the id (another tenant's id reads the same), or the
494
+ * record was decided before. */
425
495
  export type QuarantineRefusal = {
426
496
  readonly outcome: 'not_quarantined';
427
497
  } | {
@@ -437,23 +507,29 @@ export type QuarantineApproval = {
437
507
  export type QuarantineRejection = {
438
508
  readonly outcome: 'rejected';
439
509
  } | QuarantineRefusal;
440
- /** The review queue behind the quarantine routes. A refusal is a resolved value, never a rejection, and writes nothing. */
510
+ /** The review queue behind the quarantine routes. A refusal is
511
+ * a resolved value, never a rejection, and writes nothing. */
441
512
  export interface Quarantine {
442
- /** At most `limit` of the tenant's records, newest first (quarantinedAt as text in byte order, then memoryId, both descending); `after` keeps only
443
- * records below its pair. 'pending' leaves out a record whose memory row is gone; every other status keeps it, with null content. No audit row. */
513
+ /** At most `limit` of the tenant's records, newest first (quarantinedAt as text in byte order, then memoryId, both
514
+ * descending); `after` keeps only records below its pair. 'pending' leaves out a record whose memory row is gone;
515
+ * every other status keeps it, with null content. No audit row. */
444
516
  listQuarantined(tenantId: string, query: QuarantineListQuery): Promise<QuarantinedMemory[]>;
445
- /** In one transaction, all or none: restores the memory's originalScope if it is in the tenant and still under `quarantine:private:...`;
446
- * marks the record approved (decidedAt from the store's clock, decidedBy `actor`); appends one quarantine_approve row ({originalScope}). */
517
+ /** In one transaction, all or none: restores the memory's originalScope if it is in the tenant and still under
518
+ * `quarantine:private:...`; marks the record approved (decidedAt from the store's clock, decidedBy `actor`); appends
519
+ * one quarantine_approve row ({originalScope}). */
447
520
  approveQuarantined(tenantId: string, id: string, actor: string): Promise<QuarantineApproval>;
448
- /** In one transaction, both or neither: marks the record rejected (decidedAt/decidedBy as approve) and appends one quarantine_reject row.
449
- * The memory row is not touched, so it stays under its quarantine scope and a record with no memory row can still be rejected. */
521
+ /** In one transaction, both or neither: marks the record rejected (decidedAt/decidedBy as approve) and appends one
522
+ * quarantine_reject row. The memory row is not touched, so it stays under its quarantine scope and a record with no
523
+ * memory row can still be rejected. */
450
524
  rejectQuarantined(tenantId: string, id: string, actor: string): Promise<QuarantineRejection>;
451
525
  }
452
- /** What one graph view reads. `limit` is a positive integer capping each read on its own; newest means createdAt, then id, both descending. A row shows
453
- * when it cites no memory, or its memory is in the tenant with a null scope or one `canReadScope(reader, scope)` admits; no `reader` shows every row. */
526
+ /** What one graph view reads. `limit` is a positive integer capping each read on its own; newest means createdAt, then
527
+ * id, both descending. A row shows when it cites no memory, or its memory is in the tenant with a null scope or one
528
+ * `canReadScope(reader, scope)` admits; no `reader` shows every row. */
454
529
  export interface GraphViewQuery {
455
- /** Unset reads the whole graph. Set, the start entities are the first `limit` of exactly this name (lowest id first) that show; none left answers empty.
456
- * Per 400 start ids, the newest `limit` relations with an end among them join in, each adding its other end to the ids held, until `limit` ids are held. */
530
+ /** Unset reads the whole graph. Set, the start entities are the first `limit` of exactly this name (lowest id first)
531
+ * that show; none left answers empty. Per 400 start ids, the newest `limit` relations with an end among them join in,
532
+ * each adding its other end to the ids held, until `limit` ids are held. */
457
533
  readonly entity?: string;
458
534
  readonly limit: number;
459
535
  readonly reader?: ScopeActor;
@@ -462,127 +538,77 @@ export interface GraphRows {
462
538
  readonly entities: Entity[];
463
539
  /** May name an entity `entities` lacks; the caller drops such a relation. */
464
540
  readonly relations: Relation[];
465
- /** Judged before a row is hidden: true when start entities, joined relations, returned relations or (whole graph) returned entities came back `limit` long,
466
- * or the walk held `limit` ids with a relation still to join. */
541
+ /** Judged before a row is hidden: true when start entities, joined relations, returned relations or (whole graph)
542
+ * returned entities came back `limit` long, or the walk held `limit` ids with a relation still to join. */
467
543
  readonly truncated: boolean;
468
544
  }
469
545
  /** The rows behind GET /v1/graph. */
470
546
  export interface GraphReads {
471
- /** Every read from one snapshot, then rows that do not show are dropped. Whole graph: the tenant's newest `limit` entities and relations.
472
- * From a name: the entities of the ids held (id ascending, 400 at a time) and the newest `limit` relations with both ends among those ids. */
547
+ /** Every read from one snapshot, then rows that do not show are dropped. Whole graph: the tenant's newest `limit`
548
+ * entities and relations. From a name: the entities of the ids held (id ascending, 400 at a time) and the newest
549
+ * `limit` relations with both ends among those ids. */
473
550
  graphRows(tenantId: string, query: GraphViewQuery): Promise<GraphRows>;
474
551
  }
475
- /** The source event a connector's write answers, by the source's own key. The store logs each key once per connector, across every tenant. */
476
- export type ConnectorEvent = {
477
- readonly connector: 'slack';
478
- readonly eventId: string;
479
- } | {
480
- readonly connector: 'github';
481
- readonly idempotencyKey: string;
482
- readonly deliveryId: string;
483
- readonly eventName: string;
484
- };
485
- /** An entry a connector brings in. `quarantine` is the review record of flagged content, whose entry already carries its quarantine scope. */
486
- export interface ConnectorWrite extends EntryWrite {
487
- readonly event?: ConnectorEvent;
488
- readonly quarantine?: {
489
- readonly originalScope: string | null;
490
- readonly reason: string;
491
- };
492
- }
493
- /** 'duplicate': the event's key was logged before; `memoryId` is the id its log row holds, null for an event logged with no memory. */
494
- export type ConnectorWriteOutcome = {
495
- readonly outcome: 'written';
496
- } | {
497
- readonly outcome: 'duplicate';
498
- readonly memoryId: string | null;
499
- };
500
- export interface ConnectorArchive extends RawArchive {
501
- readonly event: ConnectorEvent;
502
- }
503
- /** A connector's writes with the rows that must commit with them: the event log row
504
- * that turns a redelivery into a no-op, and the quarantine record of flagged content. */
505
- export interface ConnectorWrites {
506
- /** entryWrites.writeEntry plus, in its transaction: with `quarantine`, one pending record and quarantine row; with `event`, one log row. All commit or none.
507
- * A key logged before resolves 'duplicate' and stores nothing (never a rejection); every other refusal is writeEntry's own, decided first. */
508
- writeConnectorEntry(write: ConnectorWrite): Promise<ConnectorWriteOutcome>;
509
- /** entryWrites.archiveRaw plus, in its transaction, one log row for `event` naming the archived id, so a redelivery finds it logged; a failed log write
510
- * undoes the archive. A key logged before keeps its row and does not stop the archive. Reach and every rejection are archiveRaw's own. */
511
- archiveConnectorEntry(archive: ConnectorArchive): Promise<string>;
512
- }
513
- /** What the event log holds for one event's key; `memoryId` is null for an event logged with no memory. */
514
- export type ConnectorEventRecord = {
515
- readonly seen: false;
516
- } | {
517
- readonly seen: true;
518
- readonly memoryId: string | null;
519
- };
520
- export interface DeletionLookup {
521
- readonly event: ConnectorEvent;
522
- readonly artifactRef: string;
523
- readonly tenantId: string;
524
- }
525
- /** `memoryId` is null when the tenant holds no raw row for the artifact. */
526
- export type DeletionTarget = {
527
- readonly seen: true;
528
- } | {
529
- readonly seen: false;
530
- readonly memoryId: string | null;
531
- };
532
- export interface ArtifactArchive {
533
- readonly tenantId: string;
534
- readonly actor: string;
535
- readonly artifactRef: string;
536
- readonly reason: string;
537
- readonly event: Extract<ConnectorEvent, {
538
- readonly connector: 'github';
539
- }>;
540
- }
541
- /** One payload a webhook could not use, already redacted, for the dead-letter queue of its connector. */
542
- export type ConnectorDeadLetter = ({
543
- readonly connector: 'slack';
544
- } & SlackDlqInsert) | ({
545
- readonly connector: 'github';
546
- } & GitHubDlqInsert);
547
- /** What a connector delivery reads and writes beside connectorWrites: the event log,
548
- * tenant routing, the dead-letter queue and the archive of a deleted artifact. */
549
- export interface ConnectorEvents {
550
- /** The log row of the event's key, in its connector's own key space. */
551
- eventRecord(event: ConnectorEvent): Promise<ConnectorEventRecord>;
552
- /** Logs an event that stored no memory, so its redelivery finds it. A key logged before keeps its row, the memory id it names included. */
553
- markEventSeen(event: ConnectorEvent): Promise<void>;
554
- /** Both reads on one snapshot: an event logged before answers `seen`, else the raw row the
555
- * tenant holds for the artifact. Another tenant's row under the same ref is never returned. */
556
- deletionTarget(lookup: DeletionLookup): Promise<DeletionTarget>;
557
- /** A logged event answers `duplicate` and changes nothing. Else one transaction archives every raw row of the artifact (archive_raw row each, under `actor`)
558
- * and logs the event naming the first, or no memory if none; one failed archive undoes all and the log row. No reach check. */
559
- archiveDeletedArtifact(archive: ArtifactArchive): Promise<{
560
- readonly duplicate: boolean;
561
- readonly archived: number;
562
- }>;
563
- /** The tenant a Slack team is registered to, or how many workspaces are registered when it is not. */
564
- slackTeamRoute(teamId: string): Promise<SlackTeamRoute>;
565
- /** The tenant of the installation, or of the repository when no installation is named, with the size of both routing tables. */
566
- githubRouting(query: {
567
- readonly installationId?: string | null;
568
- readonly repoFullName?: string | null;
569
- }): Promise<GitHubRouting>;
570
- /** Appends the row and answers its id. */
571
- parkDeadLetter(letter: ConnectorDeadLetter): Promise<number>;
572
- }
552
+ export type { ConnectorEvent, ConnectorWrite, ConnectorWriteOutcome, ConnectorArchive, ConnectorWrites, ConnectorEventRecord, DeletionLookup, DeletionTarget, ArtifactArchive, ConnectorDeadLetter, ConnectorEvents, } from './connectors/event-log.js';
573
553
  /** `storedVectors` with no number[] copy, for a store that holds vectors as Float32 bytes. */
574
554
  export interface VectorViews {
575
555
  /** The same ids and values as `VectorReads.storedVectors`, each value a Float32 view. */
576
556
  storedVectorViews(ids: readonly string[]): Promise<Map<string, Float32Array>>;
577
557
  }
578
- /** The optional groups: a store sets each one whole or leaves it unset, and a route or MCP tool names the one it needs. */
579
- export interface StoreGroups {
558
+ export type { AgentImport, Consolidation, ContainerTx, ImportTarget, LocalFiles } from './port/local-files.js';
559
+ /** The reads and writes behind the memory-quality audit, its repair and audit-log retention. */
560
+ export interface AuditMaintenance {
561
+ /** Every memory of the tenant, in `loadAllEntries` order. */
562
+ tenantEntries(tenantId: string): Promise<MemoryEntry[]>;
563
+ /** The ids of every memory a typed object row names, in any tenant; an automatic pass never deletes one. */
564
+ objectBackedIds(): Promise<Set<string>>;
565
+ /** Deletes each removal's row with its own forget row, leaving a pinned, raw, kept or object-backing row; resolves to
566
+ * the ids deleted. */
567
+ deleteAutomatically(removals: readonly {
568
+ readonly id: string;
569
+ readonly reason: string;
570
+ }[], actor: string): Promise<string[]>;
571
+ /** Counts (dryRun) or deletes the tenant's audit rows before
572
+ * `cutoff`, then appends one audit_prune row; resolves to the count. */
573
+ pruneAuditRows(prune: AuditPrune): Promise<number>;
574
+ /** A preview, or with `apply` the moves of certain defects to dormant storage behind a backup. */
575
+ repairQuality(tenantId: string, apply: boolean): Promise<QualityRepairResult>;
576
+ /** repairQuality applied once per store; null once it ran there. */
577
+ repairQualityOnce(tenantId: string): Promise<QualityRepairResult | null>;
578
+ }
579
+ /** The reads and writes behind git auto-learn's batch. */
580
+ export interface LessonWrites {
581
+ /** Every memory of the tenant, in `loadAllEntries` order. */
582
+ tenantEntries(tenantId: string): Promise<MemoryEntry[]>;
583
+ /** Content, source and origin of the tenant's rows holding any of `words`, among the rows a team member or
584
+ * `ownScope`'s owner may touch. */
585
+ textsHoldingWords(tenantId: string, words: readonly string[], ownScope: string | null): Promise<HeldText[]>;
586
+ /** Writes each entry in one transaction; a rejected value writes
587
+ * its refusal row and is skipped. Resolves to the ids written. */
588
+ writeSkippingRejected(entries: readonly MemoryEntry[], actor: string): Promise<string[]>;
589
+ /** Rewrites each entry in one transaction, all or none. */
590
+ writeTogether(entries: readonly MemoryEntry[]): Promise<void>;
591
+ /** Adds `count` to the store-wide remembered counter. */
592
+ bumpRemembered(count: number): Promise<void>;
593
+ }
594
+ /** The optional groups: a store sets each one whole or leaves
595
+ * it unset, and a route or MCP tool names the one it needs. */
596
+ export interface StoreGroups extends SessionAndAdminGroups {
597
+ /** Unset on any store but hippo.db; a request then runs fenced from
598
+ * hippo.db, and a route or tool that names no group answers 501. */
599
+ readonly localFiles: LocalFiles;
600
+ /** Unset on a store without it, where the quality audit, its repair and audit prune answer 501. */
601
+ readonly auditMaintenance: AuditMaintenance;
602
+ /** Unset on a store without it, where git learn answers 501. */
603
+ readonly lessonWrites: LessonWrites;
580
604
  /** Unset on a store built before them, where hybrid and physics recall under an embedding provider answer 501. */
581
605
  readonly vectors: VectorReads;
582
606
  /** Unset on a store without them, where recall scores the number[] copies `vectors` returns, to the same ranking. */
583
607
  readonly vectorViews: VectorViews;
584
608
  readonly keyAudit: KeyAudit;
585
609
  readonly keyWrites: KeyWrites;
610
+ /** Unset on a store without it, where the CLI's auth grant and ungrant answer 501. */
611
+ readonly keyGrants: KeyGrants;
586
612
  /** embedMemory and embedAll with a store need it and `vectors`. */
587
613
  readonly vectorWrites: VectorWrites;
588
614
  readonly entryWrites: EntryWrites;
@@ -592,59 +618,75 @@ export interface StoreGroups {
592
618
  readonly auditLog: AuditLog;
593
619
  readonly quarantine: Quarantine;
594
620
  readonly graphReads: GraphReads;
595
- /** Unset on a store built before it, where a write that carries a connector event or untrusted content answers 501. */
621
+ /** Unset on a store built before it, where a write that carries a connector event or untrusted content answers
622
+ * 501. */
596
623
  readonly connectorWrites: ConnectorWrites;
597
624
  /** Unset on a store built before it, where both connector webhooks answer 501. */
598
625
  readonly connectorEvents: ConnectorEvents;
599
626
  readonly objects: Objects;
600
627
  /** Unset on a store built before it, where GET /ready answers 200 with `store: "unchecked"`. */
601
628
  readonly readiness: Readiness;
629
+ /** Unset on a store that keeps no last recall, where outcomeForLastRecall and a traced outcome answer 501 and context
630
+ * writes no last recall. */
631
+ readonly lastRecall: LastRecall;
602
632
  }
603
633
  export type StoreGroup = 'base' | keyof StoreGroups;
604
634
  export declare function hasGroup(store: HippoStore, group: StoreGroup): boolean;
605
- /** The group's methods; a store without them throws StoreNotPortedError, which answers 501 as any unported path does. */
635
+ /** The group's methods; a store without them throws
636
+ * StoreNotPortedError, which answers 501 as any unported path does. */
606
637
  export declare function requireGroup<G extends keyof StoreGroups>(store: HippoStore, group: G): StoreGroups[G];
607
- export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
608
- /** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
609
- export declare class StoreBusyError extends Error {
610
- constructor(message?: string, options?: ErrorOptions);
638
+ /** Which stores a call reaches, probed once by a composition root so the api reads this instead of the disk. */
639
+ export interface StoreReach {
640
+ readonly hasLocal: boolean;
641
+ readonly isGlobal: boolean;
642
+ readonly shared: boolean;
643
+ readonly global?: {
644
+ readonly root: string;
645
+ readonly store: StoreWith<'contextReads'>;
646
+ };
611
647
  }
648
+ export { isStoreBusy, STORE_BUSY_MESSAGE, StoreBusyError } from './busy.js';
612
649
  /** What `serve()` reads and writes through. Each method is atomic and no transaction spans an
613
650
  * await, since SQLite's lock wait blocks the event loop; a lock timeout throws `StoreBusyError`. */
614
651
  export interface HippoStore extends Partial<StoreGroups> {
615
- /** 'sqlite' is hippo.db under the served root. Under any other kind, an unported route answers 501 and a hippo.db open inside a request throws. */
652
+ /** A name for logs and errors; what a store can do is the groups it sets, `localFiles` above all. */
616
653
  readonly kind: string;
617
654
  /** The api_keys row for `keyId` with its scope grants, revoked or not; null when no row matches. */
618
655
  findApiKey(keyId: string): Promise<ApiKeyRecord | null>;
619
656
  /** Recall candidates in `loadRecallSearchEntries` order: FTS, then LIKE, then every row in scope. */
620
657
  searchRecallEntries(query: string, args: RecallSearchArgs): Promise<MemoryEntry[]>;
621
- /** The rows among the first 500 ids, a tenant narrowing them, ordered by created, then content, then id, all ascending,
622
- * as `loadEntriesByIds` does; the input order is ignored. */
658
+ /** The rows among the first 500 ids, a tenant narrowing them, ordered by created, then content, then id, all
659
+ * ascending, as `loadEntriesByIds` does; the input order is ignored. */
623
660
  entriesByIds(ids: readonly string[], tenantId?: string): Promise<MemoryEntry[]>;
624
661
  /** The session's active goals and their policies, read together so a goal and its policy never disagree. */
625
662
  activeGoals(opts: GetActiveGoalsOpts): Promise<ActiveGoals>;
626
- /** The first `count` (at most 200) unsuperseded raw rows a tenant, a non-empty session id and non-null `origins` (those projects and
627
- * user-global rows) must narrow, by created descending, then content and id ascending, as `loadFreshRawMemories` does. */
663
+ /** The first `count` (at most 200) unsuperseded raw rows a tenant, a non-empty session
664
+ * id and non-null `origins` (those projects and user-global rows) must narrow, by
665
+ * created descending, then content and id ascending, as `loadFreshRawMemories` does. */
628
666
  freshRawEntries(count: number, tenantId: string | undefined, sessionId: string | undefined, origins: readonly string[] | null): Promise<MemoryEntry[]>;
629
- /** The newest active snapshot a non-null `key` must narrow to one owner and project (null only on an unshared hippo.db), then for its session
630
- * the newest handoff (same key) and `eventLimit` newest events returned oldest first, each tie broken by the larger id; the caller applies scope. */
667
+ /** The newest active snapshot a non-null `key` must narrow to one owner and project (null only on an unshared
668
+ * hippo.db), then for its session the newest handoff (same key) and `eventLimit` newest events returned oldest first,
669
+ * each tie broken by the larger id; the caller applies scope. */
631
670
  continuity(tenantId: string, eventLimit: number, key: ContinuityKey | null): Promise<ContinuityBlock>;
632
671
  /** Resolves a forward claim's tokens to one class and reads its baserate, writing no audit row. */
633
672
  planningFallacyEvidence(tenantId: string, classQueryTokens: readonly string[]): Promise<PlanningFallacyEvidence>;
634
673
  /** Appends the rows in order, all or none. */
635
674
  appendAuditEvents(events: readonly AppendAuditOpts[]): Promise<void>;
636
- /** Writes the goal log and audit rows in one transaction and rejects with none written if it fails. Then the trace and
637
- * the strengthen, each on its own: a failure there logs and still resolves, since the reply is already decided. */
675
+ /** Writes the goal log and audit rows in one transaction and rejects with none
676
+ * written if it fails. Then the trace and the strengthen, each on its own: a
677
+ * failure there logs and still resolves, since the reply is already decided. */
638
678
  finishRecall(writes: RecallWrites): Promise<void>;
639
- /** Adds `recalled` to the one store-wide total_recalled counter, no tenant; the SQLite store also rewrites stats.json. */
679
+ /** Adds `recalled` to the one store-wide total_recalled counter,
680
+ * no tenant; the SQLite store also rewrites stats.json. */
640
681
  bumpRecallStats(recalled: number): Promise<void>;
641
682
  /** One token-ledger row. Throws, so the caller decides whether a ledger failure matters. */
642
683
  recordTokens(use: TokenUse): Promise<void>;
643
684
  /** Releases the store's connections; `serve()` closes only a store it made itself. */
644
685
  close(): Promise<void>;
645
686
  }
646
- /** `T` with each method answering its value instead of a Promise of it, groups included: the port as a synchronous store has it. */
647
- export type Sync<T> = T extends (...args: infer A) => Promise<infer R> ? (...args: A) => R : T extends object ? {
687
+ /** `T` with each method answering its value instead of a Promise of it, groups included: the port as a synchronous
688
+ * store has it. */
689
+ export type Sync<T> = T extends (...args: infer A) => Promise<infer R> ? (...args: A) => R : T extends (...args: never) => void ? T : T extends object ? {
648
690
  [K in keyof T]: Sync<T[K]>;
649
691
  } : T;
650
692
  export interface ContinuityBlock {