hippo-memory 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -1,6 +1,5 @@
1
1
  // getContext's selection stages: the pinned-only branch, the strongest-first branch and the search branch.
2
2
  import { recallScopeFilter } from '../store/search-rows.js';
3
- import { heldIdLookup } from '../store/entry-reads.js';
4
3
  import { calculateStrength } from '../core/memory.js';
5
4
  import { auditQueryFields, recordAuditEvent } from '../store/audit.js';
6
5
  import { isWorthSurfacing } from '../core/memory-quality.js';
@@ -12,6 +11,7 @@ import { compareScoredResults } from '../core/compare.js';
12
11
  import { scopeMatch } from '../core/active-scope.js';
13
12
  import { scopeBoostFor } from '../search/boosts.js';
14
13
  import { promptTokens, contentTokens, gatePromptRecall, } from '../core/prompt-recall.js';
14
+ import { heldIds } from './recall/finish.js';
15
15
  const GLOBAL_DISCOUNT = 1 / DEFAULT_LOCAL_BUMP;
16
16
  // Share and promote copy a memory to the global store under a new id, so equal content is the only link.
17
17
  // A pinned copy wins, then the stronger one after the ranking's own global discount; a tie keeps the local copy.
@@ -34,7 +34,10 @@ export function oneCopyPerMemory(local, global, now) {
34
34
  return [local.filter((e) => kept.has(e)), global.filter((e) => kept.has(e))];
35
35
  }
36
36
  export const finiteOr = (v, dflt, min) => Number.isFinite(v) && v >= min ? v : dflt;
37
- /** Pins plus the prompt-recall or recent-N backfill; null means the hook block is turned off, so task state stays out too. */
37
+ /**
38
+ * Pins plus the prompt-recall or recent-N backfill; null means the hook block is turned off, so task state stays out
39
+ * too.
40
+ */
38
41
  export function selectPinned(opts, plan, left, pools, admission) {
39
42
  const { obs, primaryIsGlobal, config: pinnedCfg } = plan;
40
43
  if (!pinnedCfg.pinnedInject.enabled) {
@@ -50,7 +53,8 @@ export function selectPinned(opts, plan, left, pools, admission) {
50
53
  const [localPool, globalPool] = oneCopyPerMemory(localEntries, globalEntries, nowP);
51
54
  obs?.dropMissing([...localEntries, ...globalEntries], [...localPool, ...globalPool], 'load', 'duplicate');
52
55
  const picked = { items: [], ids: new Set(), used: 0 };
53
- // Pinned entries are explicit intent, the recent-N list an automatic backfill; both share ONE budget and the recent loop runs first,
56
+ // Pinned entries are explicit intent, the recent-N list an automatic backfill; both share ONE budget and the recent
57
+ // loop runs first,
54
58
  // so pins are ranked here and reserve their share before it can spend.
55
59
  const pinnedLocal = localPool.filter((e) => e.pinned);
56
60
  const pinnedGlobal = globalPool.filter((e) => e.pinned);
@@ -76,7 +80,9 @@ function rankPinned(plan, pinnedLocal, pinnedGlobal, nowP) {
76
80
  const scopeBoost = scopeBoostFor(scopeMatch(entry.tags, plan.activeScope));
77
81
  return {
78
82
  entry,
79
- score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) * (isGlobal ? GLOBAL_DISCOUNT : 1) * scopeBoost,
83
+ score: calculateStrength(entry, nowP, { ablation: strengthAblation() }) *
84
+ (isGlobal ? GLOBAL_DISCOUNT : 1) *
85
+ scopeBoost,
80
86
  tokens: plan.price(entry, isGlobal),
81
87
  isGlobal,
82
88
  };
@@ -84,7 +90,8 @@ function rankPinned(plan, pinnedLocal, pinnedGlobal, nowP) {
84
90
  .sort(compareScoredResults);
85
91
  }
86
92
  // Mirrors the pin loop's continue-not-break so a big pin cannot block smaller ones from reserving, and dedupes by id
87
- // because a synced pin sits in both stores. A pin also in the recent slice is counted twice: recents under-fill, safely.
93
+ // because a synced pin sits in both stores. A pin also in the recent slice is counted twice: recents under-fill,
94
+ // safely.
88
95
  function reservePinned(rankedPinned, effBudget) {
89
96
  let pinnedReserve = 0;
90
97
  const reservedIds = new Set();
@@ -248,11 +255,12 @@ export async function selectBySearch(ctx, plan, left, pools, admission) {
248
255
  async function searchBothStores(ctx, plan, options) {
249
256
  const { left, minResults, pools, admit } = options;
250
257
  const { cost, price } = plan;
251
- // A local pool row is local by construction; sync keeps a global row's id on its local copy, so the global pool is looked up.
258
+ // A local pool row is local by construction; sync keeps a global row's id on its local copy, so the global pool is
259
+ // looked up.
252
260
  const poolIds = (pool) => [...pool.entries, ...(pool.recall ?? [])].map((e) => e.id);
253
261
  const localIds = new Set(poolIds(pools.local));
254
- const alsoLocal = heldIdLookup(ctx.hippoRoot, ctx.tenantId, poolIds(pools.global).filter((id) => !localIds.has(id)));
255
- const isGlobalHit = (e) => !localIds.has(e.id) && !alsoLocal(e.id);
262
+ const alsoLocal = await heldIds(plan.local.store, poolIds(pools.global).filter((id) => !localIds.has(id)), ctx.tenantId);
263
+ const isGlobalHit = (e) => !localIds.has(e.id) && !alsoLocal.has(e.id);
256
264
  const roots = { local: ctx.hippoRoot, global: plan.globalRoot };
257
265
  const merged = await rankBothStores(plan.query, roots, { local: pools.local.entries, global: pools.global.entries }, contextVectorSpec(ctx, plan, admit), {
258
266
  budget: left,
@@ -269,7 +277,12 @@ async function searchBothStores(ctx, plan, options) {
269
277
  }
270
278
  /** The vector arm under the lexical window's own tenant, scope and current-row rules. */
271
279
  function contextVectorSpec(ctx, plan, admit) {
272
- return { tenantId: ctx.tenantId, scope: recallScopeFilter(plan.exactScope, 'exact', plan.ownScope), includeSuperseded: false, admit };
280
+ return {
281
+ tenantId: ctx.tenantId,
282
+ scope: recallScopeFilter(plan.exactScope, 'exact', plan.ownScope),
283
+ includeSuperseded: false,
284
+ admit,
285
+ };
273
286
  }
274
287
  async function searchLocalRows(ctx, plan, options) {
275
288
  const { left, minResults, localEntries, admit } = options;
@@ -300,12 +313,8 @@ async function auditContextRecall(ctx, plan, resultCount) {
300
313
  op: 'recall',
301
314
  metadata: { ...auditQueryFields(plan.query), results: resultCount, mode: 'context' },
302
315
  };
303
- if (plan.other) {
304
- await plan.other.appendAuditEvents([row]);
305
- return;
306
- }
307
316
  if (plan.hasLocal)
308
- recordAuditEvent(ctx.hippoRoot, row);
317
+ await plan.local.store.appendAuditEvents([row]);
309
318
  if (plan.hasGlobal && !plan.primaryIsGlobal)
310
319
  recordAuditEvent(plan.globalRoot, row);
311
320
  }
@@ -4,8 +4,12 @@ import type { MemoryEntry } from '../core/memory.js';
4
4
  import type { DeliveryObserver } from '../store/delivery-recorder.js';
5
5
  import type { AmbientState } from '../core/ambient.js';
6
6
  import type { ProjectRef } from '../core/project-identity.js';
7
- /** Options for `getContext`: a budget-bounded bundle of recalled memories, active task snapshot, handoff and recent events.
8
- * Rendering opts (`format`, `framing`, `rendered`) and host-side opts (`auto`) stay in the CLI, whose print helpers are shared. */
7
+ /**
8
+ * Options for `getContext`: a budget-bounded bundle of recalled memories, active task snapshot, handoff and recent
9
+ * events.
10
+ * Rendering opts (`format`, `framing`, `rendered`) and host-side opts (`auto`) stay in the CLI, whose print helpers are
11
+ * shared.
12
+ */
9
13
  export interface ContextOpts {
10
14
  q?: string;
11
15
  /** Default 1500 tokens. */
@@ -13,18 +17,35 @@ export interface ContextOpts {
13
17
  limit?: number;
14
18
  pinnedOnly?: boolean;
15
19
  scope?: string;
16
- /** Envelope scope to match exactly, as in `recall`: admits that scope even when private, after the actor's scope check. */
20
+ /**
21
+ * Envelope scope to match exactly, as in `recall`: admits that scope even when private, after the actor's scope
22
+ * check.
23
+ */
17
24
  exactScope?: string;
18
- /** With `pinnedOnly`, also inject the N most recent writes that pass the quality floor (`isWorthSurfacing`); pinned entries bypass it.
19
- * Filtering happens BEFORE the take-N, so asking for 5 gets 5 qualifying entries. Ignored when `pinnedOnly` is false. */
25
+ /**
26
+ * With `pinnedOnly`, also inject the N most recent writes that pass the quality floor (`isWorthSurfacing`); pinned
27
+ * entries bypass it.
28
+ * Filtering happens BEFORE the take-N, so asking for 5 gets 5 qualifying entries. Ignored when `pinnedOnly` is false.
29
+ */
20
30
  includeRecent?: number;
21
- /** Re-include other-project memories the origin partition excludes by default; they come back tagged `category: 'cross-project'`. */
31
+ /**
32
+ * Re-include other-project memories the origin partition excludes by default; they come back tagged `category:
33
+ * 'cross-project'`.
34
+ */
22
35
  crossProject?: boolean;
23
- /** The active project for the origin partition ('' = not in a project): a name, or an identity whose rows may carry its legacy folder name.
24
- * Defaults to `resolveProjectIdentity(process.cwd())`; surfaces whose cwd is not the caller's project (HTTP server) should pass it. */
36
+ /**
37
+ * The active project for the origin partition ('' = not in a project): a name, or an identity whose rows may carry
38
+ * its legacy folder name.
39
+ * Defaults to `resolveProjectIdentity(process.cwd())`; surfaces whose cwd is not the caller's project (HTTP server)
40
+ * should pass it.
41
+ */
25
42
  currentProject?: ProjectRef;
26
- /** The calling session's id, stamped on this call's recall trace. When it strictly equals the active snapshot's `session_id` the read is unbounded;
27
- * otherwise the snapshot must pass the freshness bound. Absent (undefined/null/'') never matches. Host-resolved, so this stays host-agnostic. */
43
+ /**
44
+ * The calling session's id, stamped on this call's recall trace. When it strictly equals the active snapshot's
45
+ * `session_id` the read is unbounded;
46
+ * otherwise the snapshot must pass the freshness bound. Absent (undefined/null/'') never matches. Host-resolved, so
47
+ * this stays host-agnostic.
48
+ */
28
49
  currentSessionId?: string | null;
29
50
  /** Raw hook-payload prompt; only the pinned-only branch reads it, gated on `pinnedInject.promptRecall`. */
30
51
  prompt?: string;
@@ -60,7 +81,10 @@ export interface ContextResultEntry {
60
81
  promptRecall?: boolean;
61
82
  /** v39: the entry's owning project ('' = user-global, null = legacy row). */
62
83
  origin?: string | null;
63
- /** How the origin relates to the active project; 'cross-project' appears only when `crossProject` was set (or isolation is disabled). */
84
+ /**
85
+ * How the origin relates to the active project; 'cross-project' appears only when `crossProject` was set (or
86
+ * isolation is disabled).
87
+ */
64
88
  category?: 'project' | 'user-global' | 'cross-project';
65
89
  }
66
90
  export interface ContextResult {
@@ -70,7 +94,9 @@ export interface ContextResult {
70
94
  sessionHandoff?: SessionHandoff | null;
71
95
  recentEvents?: SessionEvent[];
72
96
  /** The ambient landscape summary over every live row the read may see in the local and global stores,
73
- * not just the rows loaded. Present only when ambient config is on, the caller is not pinned-only, and an entry was returned. */
97
+ * not just the rows loaded. Present only when ambient config is on, the caller is not pinned-only, and an entry was
98
+ * returned.
99
+ */
74
100
  ambientState?: AmbientState;
75
101
  }
76
102
  //# sourceMappingURL=context-types.d.ts.map
@@ -1,13 +1,16 @@
1
1
  import { type MemoryEntry } from '../core/memory.js';
2
2
  import { type ProjectRef } from '../core/project-identity.js';
3
3
  import type { ContextOpts, ContextResult } from './context-types.js';
4
- import { type Context } from './types.js';
4
+ import { type ContextWith } from './types.js';
5
5
  export { oneCopyPerMemory } from './context-select.js';
6
- /** The secret half of the ambient policy alone, for callers with their own scope rule: a flagged row is admitted only inside its owning project. */
6
+ /** The secret half of the ambient policy alone, for callers with their own scope rule: a flagged row is admitted only
7
+ * inside its owning project. */
7
8
  export declare function ambientSecretAdmit(e: MemoryEntry, currentProject: ProjectRef): boolean;
8
9
  /** Tokens a context block may use when the caller sets no budget; the hook command and the CLI default match it. */
9
10
  export declare const DEFAULT_CONTEXT_BUDGET = 1500;
10
- /** Assembles a budget-bounded, tenant-scoped context bundle; mutates `last_retrieval_ids` and emits a 'recall' audit row for non-pinned, non-'*' queries.
11
- * Returns an empty result when there are no memories, snapshot, handoff or recent events. CLI rendering stays in `cli.ts`. */
12
- export declare function getContext(ctx: Context, opts?: ContextOpts): Promise<ContextResult>;
11
+ export declare const NO_QUERY = "*";
12
+ /** Assembles a budget-bounded, tenant-scoped context bundle; mutates `last_retrieval_ids` and emits a 'recall' audit
13
+ * row for non-pinned, non-'*' queries. Returns an empty result when there are no memories, snapshot, handoff or recent
14
+ * events. CLI rendering stays in `cli.ts`. */
15
+ export declare function getContext(ctx: ContextWith<'contextReads'>, opts?: ContextOpts): Promise<ContextResult>;
13
16
  //# sourceMappingURL=context.d.ts.map
@@ -4,27 +4,28 @@ import { freshActiveSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS } from '../store/sessi
4
4
  import { estimateTokens } from '../util/token-text.js';
5
5
  import { markRetrieved, COMPACTION_MEMORY_TAG } from '../core/memory.js';
6
6
  import { isWorthSurfacing } from '../core/memory-quality.js';
7
- import { getGlobalRoot } from '../sharing/global-store.js';
8
7
  import { evalNow, strengthAblation } from '../core/ablation.js';
9
8
  import { dropHeldCopies } from '../util/same-text.js';
10
9
  import { BadRequestError } from '../core/api-errors.js';
11
- import { isSharedStore, loadConfig } from '../core/config.js';
10
+ import { isSharedStore } from '../core/config.js';
11
+ import { configOf } from './config-of.js';
12
12
  import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
13
- import { errorMessage, log } from '../util/log.js';
14
- import { resolveProjectIdentity, classifyOriginProject, isGlobalStoreRoot, isInitialized, projectId, projectNames, } from '../core/project-identity.js';
13
+ import { errorMessage, log, errorFields } from '../util/log.js';
14
+ import { resolveProjectIdentity, classifyOriginProject, projectId, projectNames, } from '../core/project-identity.js';
15
15
  import { promptTokens } from '../core/prompt-recall.js';
16
16
  import { detectSecret } from '../util/secret-detect.js';
17
17
  import { isSessionDigestRow } from '../core/session-digest-row.js';
18
18
  import { addAmbientTallies, ambientStateFromTallies } from '../core/ambient.js';
19
- import { hasGroup, requireGroup, sqliteStore } from '../store/index.js';
20
- import { storeFor } from '../store/sqlite/store.js';
19
+ import { hasGroup } from '../store/index.js';
21
20
  import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
22
21
  import { finiteOr, selectBySearch, selectPinned, selectStrongest, } from './context-select.js';
23
- import { strengthenOf } from './recall-record.js';
22
+ import { strengthenOf } from './recall/finish.js';
23
+ import { tokenPurse } from './recall/render.js';
24
24
  import { ownerOrSubject } from './types.js';
25
25
  export { oneCopyPerMemory } from './context-select.js';
26
- /** The single ambient-injection admission policy, shared by getContext and the CLI ambient-state summary so they cannot drift.
27
- * Secret veto is unconditional (flagged rows inject only in their own project); private scopes need `exactScope`, other projects `includeCrossProject`. */
26
+ /** The single ambient-injection admission policy, shared by getContext and the CLI ambient-state summary so they cannot
27
+ * drift. Secret veto is unconditional (flagged rows inject only in their own project); private scopes need
28
+ * `exactScope`, other projects `includeCrossProject`. */
28
29
  function ambientAdmitEntry(e, currentProject, includeCrossProject, exactScope, own) {
29
30
  if (!ambientSecretAdmit(e, currentProject))
30
31
  return false;
@@ -34,7 +35,8 @@ function ambientAdmitEntry(e, currentProject, includeCrossProject, exactScope, o
34
35
  return true;
35
36
  return classifyOriginProject(e.origin_project, currentProject) !== 'cross-project';
36
37
  }
37
- /** The secret half of the ambient policy alone, for callers with their own scope rule: a flagged row is admitted only inside its owning project. */
38
+ /** The secret half of the ambient policy alone, for callers with their own scope rule: a flagged row is admitted only
39
+ * inside its owning project. */
38
40
  export function ambientSecretAdmit(e, currentProject) {
39
41
  if (!detectSecret(e).flagged)
40
42
  return true;
@@ -45,11 +47,13 @@ export function ambientSecretAdmit(e, currentProject) {
45
47
  }
46
48
  /** Tokens a context block may use when the caller sets no budget; the hook command and the CLI default match it. */
47
49
  export const DEFAULT_CONTEXT_BUDGET = 1500;
50
+ // The plan's query when the caller gave none: context then ranks by strength instead of searching.
51
+ export const NO_QUERY = '*';
48
52
  /** Most rows per store a no-query context reads; past it, ranking and ambientState see the strongest by decay. */
49
53
  const CONTEXT_CANDIDATE_CAP = 2000;
50
54
  /** A store's base search and context reads; a store without the group throws StoreNotPortedError. */
51
55
  function sourceOf(store) {
52
- return { store, reads: requireGroup(store, 'contextReads') };
56
+ return { store, reads: store.contextReads };
53
57
  }
54
58
  // The pinned-only branch needs pins and recent-N candidates, not the corpus.
55
59
  async function loadAmbientEntries(source, tenantId, options) {
@@ -79,30 +83,37 @@ async function loadAmbientEntries(source, tenantId, options) {
79
83
  onQualityDrop?.(e);
80
84
  return false;
81
85
  };
82
- const loaded = await source.reads.ambientCandidates(tenantId, { recentNeeded: recent.needed, admit: admitAmbient, recall, origins: recent.origins });
83
- // Pins and recent rows reach core only through the store's own call to admit, so core applies it again with the tenant.
86
+ const loaded = await source.reads.ambientCandidates(tenantId, {
87
+ recentNeeded: recent.needed,
88
+ admit: admitAmbient,
89
+ recall,
90
+ origins: recent.origins,
91
+ });
92
+ // Pins and recent rows reach core only through the store's own
93
+ // call to admit, so core applies it again with the tenant.
84
94
  const entries = loaded.entries.filter((e) => ownTenant(e) && recheck(e));
85
95
  return loaded.recall ? { entries, recall: loaded.recall.filter(ownTenant) } : { entries };
86
96
  }
87
- /** Assembles a budget-bounded, tenant-scoped context bundle; mutates `last_retrieval_ids` and emits a 'recall' audit row for non-pinned, non-'*' queries.
88
- * Returns an empty result when there are no memories, snapshot, handoff or recent events. CLI rendering stays in `cli.ts`. */
97
+ /** Assembles a budget-bounded, tenant-scoped context bundle; mutates `last_retrieval_ids` and emits a 'recall' audit
98
+ * row for non-pinned, non-'*' queries. Returns an empty result when there are no memories, snapshot, handoff or recent
99
+ * events. CLI rendering stays in `cli.ts`. */
89
100
  export async function getContext(ctx, opts = {}) {
90
101
  const budget = opts.budget ?? DEFAULT_CONTEXT_BUDGET;
91
102
  assertScopeRequestAllowed(ctx.actor, opts.exactScope);
92
103
  if (budget <= 0) {
93
104
  return { entries: [], tokens: 0 };
94
105
  }
95
- const plan = planContext(ctx, opts, sourceOf(storeFor(ctx)));
106
+ const plan = planContext(ctx, opts, sourceOf(ctx.store));
96
107
  const sections = await loadTaskSections(ctx, opts, plan, openBlockBudget(plan, opts, budget));
97
108
  const admission = ambientAdmission(opts, plan, sections.shownHandoff);
98
109
  const pools = await loadPools(ctx, plan, admission, promptRecallRequest(opts, plan));
99
110
  const noSections = !sections.shownSnapshot && !sections.shownHandoff && sections.shownEvents.length === 0;
100
- if (!plan.promptRecallPending && pools.local.entries.length === 0 && pools.global.entries.length === 0 && noSections) {
111
+ if (nothingToInject(plan, pools, noSections)) {
101
112
  return { entries: [], tokens: 0 };
102
113
  }
103
114
  const picked = plan.pinnedOnly
104
115
  ? selectPinned(opts, plan, sections.left, pools, admission)
105
- : plan.query === '*'
116
+ : plan.query === NO_QUERY
106
117
  ? selectStrongest(plan, sections.left, pools)
107
118
  : await selectBySearch(ctx, plan, sections.left, pools, admission);
108
119
  if (picked === null) {
@@ -129,8 +140,12 @@ export async function getContext(ctx, opts = {}) {
129
140
  ambientState: recorded.ambientState,
130
141
  };
131
142
  }
143
+ function nothingToInject(plan, pools, noSections) {
144
+ return (!plan.promptRecallPending && pools.local.entries.length === 0 && pools.global.entries.length === 0 && noSections);
145
+ }
132
146
  const isolationWarned = new Set();
133
- /** A laptop config copied onto a team store must not open every member's rows to every prompt, so the flag loses there. */
147
+ /** A laptop config copied onto a team store must not open every
148
+ * member's rows to every prompt, so the flag loses there. */
134
149
  function warnIsolationIgnored(hippoRoot) {
135
150
  if (isolationWarned.has(hippoRoot))
136
151
  return;
@@ -140,34 +155,54 @@ function warnIsolationIgnored(hippoRoot) {
140
155
  /** Which stores this read can draw on, and what kind the primary one is. */
141
156
  function storesInReach(ctx, opts, local) {
142
157
  const other = hasGroup(local.store, 'localFiles') ? undefined : local.store;
143
- // Global memories do not establish a project boundary for task state.
144
- const hasLocal = other !== undefined || isInitialized(ctx.hippoRoot);
145
- const globalRoot = getGlobalRoot();
158
+ // No reach means an integrator's own store: one project, no global store beside it.
159
+ const reach = ctx.reach ?? { hasLocal: true, isGlobal: false, shared: isSharedStore(ctx.hippoRoot) };
146
160
  // The store's own flag counts too, so no surface can read a shared store as its owner.
147
- const sharedStore = opts.sharedStore === true || isSharedStore(ctx.hippoRoot);
161
+ const sharedStore = opts.sharedStore === true || reach.shared;
148
162
  // A store serving many people is not its operator's, so the operator's own global store stays out.
149
- const hasGlobal = !sharedStore && other === undefined && isInitialized(globalRoot);
150
- const primaryIsGlobal = isGlobalStoreRoot(ctx.hippoRoot);
151
- return { other, hasLocal, globalRoot, sharedStore, hasGlobal, primaryIsGlobal };
163
+ const hasGlobal = !sharedStore && other === undefined && reach.global !== undefined;
164
+ // Global memories do not establish a project boundary for task state.
165
+ return {
166
+ other,
167
+ hasLocal: other !== undefined || reach.hasLocal,
168
+ globalRoot: reach.global?.root ?? '',
169
+ sharedStore,
170
+ hasGlobal,
171
+ primaryIsGlobal: reach.isGlobal,
172
+ };
173
+ }
174
+ /** The operator's global store, which planContext proved present before it set hasGlobal. */
175
+ function globalSource(ctx) {
176
+ const global = ctx.reach?.global;
177
+ if (global === undefined)
178
+ throw new Error('hasGlobal without a global store in reach');
179
+ return sourceOf(global.store);
152
180
  }
153
181
  /** Prices one entry against the budget: the caller's cost model when it gave one, else a token estimate. */
154
182
  function entryPricer(cost, currentProject) {
155
183
  return (entry, isGlobal, promptRecall) => cost
156
- ? cost.entry({ entry, isGlobal, promptRecall, origin: entry.origin_project ?? null, category: classifyOriginProject(entry.origin_project, currentProject) })
184
+ ? cost.entry({
185
+ entry,
186
+ isGlobal,
187
+ promptRecall,
188
+ origin: entry.origin_project ?? null,
189
+ category: classifyOriginProject(entry.origin_project, currentProject),
190
+ })
157
191
  : estimateTokens(entry.content);
158
192
  }
159
193
  function planContext(ctx, opts, local) {
160
194
  const pinnedOnly = opts.pinnedOnly === true;
161
195
  const { other, hasLocal, globalRoot, sharedStore, hasGlobal, primaryIsGlobal } = storesInReach(ctx, opts, local);
162
- const query = (opts.q ?? '').trim() || '*';
196
+ const query = (opts.q ?? '').trim() || NO_QUERY;
163
197
  // opts.scope is only the tag boost, opts.exactScope the envelope request; other-project memories are
164
198
  // excluded unless the caller asks for them (crossProject) or isolation is disabled.
165
- const config = loadConfig(ctx.hippoRoot);
199
+ const config = configOf(ctx);
166
200
  const isolationEnabled = config.contextProjectIsolation !== false;
167
201
  const currentProject = opts.currentProject ?? resolveProjectIdentity(process.cwd());
168
202
  // A caller with no project reads every row as its own; on a shared store those rows are other people's.
169
- if (sharedStore && projectId(currentProject).trim() === '')
170
- throw new BadRequestError('a shared store needs the caller\'s project');
203
+ if (sharedStore && projectId(currentProject).trim() === '') {
204
+ throw new BadRequestError("a shared store needs the caller's project");
205
+ }
171
206
  if (sharedStore && !isolationEnabled)
172
207
  warnIsolationIgnored(ctx.hippoRoot);
173
208
  const includeCrossProject = opts.crossProject === true || (!isolationEnabled && !sharedStore);
@@ -208,14 +243,22 @@ function promptRecallRequest(opts, plan) {
208
243
  ? Array.from(promptTokens(opts.prompt ?? ''))
209
244
  : [];
210
245
  return promptRecallTerms.length > 0
211
- ? { terms: promptRecallTerms, limit: Math.floor(finiteOr(pinnedInject.promptRecallCandidates, 100, 1)), ownScope: plan.ownScope }
246
+ ? {
247
+ terms: promptRecallTerms,
248
+ limit: Math.floor(finiteOr(pinnedInject.promptRecallCandidates, 100, 1)),
249
+ ownScope: plan.ownScope,
250
+ }
212
251
  : undefined;
213
252
  }
214
253
  /** Reports the block's facts to the observer and returns the budget left after the fixed headers. */
215
254
  function openBlockBudget(plan, opts, budget) {
216
255
  const { config, cost, obs, pinnedOnly, promptRecallPending } = plan;
217
256
  const blockBudget = pinnedOnly && opts.budget === undefined ? config.pinnedInject.budget : budget;
218
- obs?.facts({ projectName: projectId(plan.currentProject), budgetTokens: blockBudget, promptRecall: promptRecallPending });
257
+ obs?.facts({
258
+ projectName: projectId(plan.currentProject),
259
+ budgetTokens: blockBudget,
260
+ promptRecall: promptRecallPending,
261
+ });
219
262
  if (pinnedOnly && !config.pinnedInject.enabled)
220
263
  obs?.disabled();
221
264
  if (!pinnedOnly)
@@ -234,7 +277,8 @@ async function loadRawTaskState(ctx, opts, plan) {
234
277
  if (!plan.hasLocalTaskState)
235
278
  return NO_TASK_STATE;
236
279
  const { store, reads } = plan.local;
237
- // On a shared store task state is one person's, keyed by owner and project so it follows them into their next session.
280
+ // On a shared store task state is one person's, keyed by owner
281
+ // and project so it follows them into their next session.
238
282
  const key = plan.sharedStore
239
283
  ? { owner: ownerOrSubject(ctx.actor), project: projectNames(plan.currentProject) }
240
284
  : null;
@@ -245,18 +289,17 @@ async function loadRawTaskState(ctx, opts, plan) {
245
289
  if (snapshot?.session_id)
246
290
  return { snapshot, handoff: block.sessionHandoff, events: block.recentSessionEvents };
247
291
  // An unfinished handoff's scope is admitted in the read, so a newer denied row can't hide an older eligible one.
248
- return { snapshot, handoff: await reads.unfinishedHandoff(ctx.tenantId, SNAPSHOT_AMBIENT_MAX_AGE_MS, key), events: [] };
292
+ return {
293
+ snapshot,
294
+ handoff: await reads.unfinishedHandoff(ctx.tenantId, SNAPSHOT_AMBIENT_MAX_AGE_MS, key),
295
+ events: [],
296
+ };
249
297
  }
250
- // Sections print ahead of the memories, so they are paid first; one that does not fit is dropped, as an oversize entry is.
298
+ // Sections print ahead of the memories, so they are paid first;
299
+ // one that does not fit is dropped, as an oversize entry is.
251
300
  async function loadTaskSections(ctx, opts, plan, startLeft) {
252
301
  const { exactScope, ownScope, cost } = plan;
253
- let left = startLeft;
254
- const pays = (tokens) => {
255
- if (tokens > left)
256
- return false;
257
- left -= tokens;
258
- return true;
259
- };
302
+ const { pays, left } = tokenPurse(startLeft);
260
303
  const rowScope = (r) => r?.scope ?? null;
261
304
  const raw = await loadRawTaskState(ctx, opts, plan);
262
305
  // The same envelope rule ambientAdmitEntry applies to memory rows.
@@ -266,15 +309,20 @@ async function loadTaskSections(ctx, opts, plan, startLeft) {
266
309
  const shownSnapshot = activeSnapshot && (!cost || pays(cost.snapshot(activeSnapshot))) ? activeSnapshot : null;
267
310
  const shownHandoff = sessionHandoff && (!cost || pays(cost.handoff(sessionHandoff))) ? sessionHandoff : null;
268
311
  const shownEvents = recentSessionEvents.length > 0 && (!cost || pays(cost.trail(recentSessionEvents))) ? recentSessionEvents : [];
269
- plan.obs?.sections(Number(shownSnapshot !== null) + Number(shownHandoff !== null) + Number(shownEvents.length > 0), Number(activeSnapshot !== shownSnapshot) + Number(sessionHandoff !== shownHandoff) + Number(recentSessionEvents.length !== shownEvents.length));
270
- return { activeSnapshot, shownSnapshot, shownHandoff, shownEvents, left };
312
+ plan.obs?.sections(Number(shownSnapshot !== null) + Number(shownHandoff !== null) + Number(shownEvents.length > 0), Number(activeSnapshot !== shownSnapshot) +
313
+ Number(sessionHandoff !== shownHandoff) +
314
+ Number(recentSessionEvents.length !== shownEvents.length));
315
+ return { activeSnapshot, shownSnapshot, shownHandoff, shownEvents, left: left() };
271
316
  }
272
317
  function ambientAdmission(opts, plan, shownHandoff) {
273
318
  const transcriptHandoffSession = shownHandoff?.evidence?.derivedFrom === 'transcript' ? shownHandoff.sessionId : null;
274
319
  const ambientAdmit = (e) => {
275
320
  // A printed handoff already carries the session's closing message, which its digest would print a second time.
276
- if (transcriptHandoffSession !== null && e.source_session_id === transcriptHandoffSession && isSessionDigestRow(e))
321
+ if (transcriptHandoffSession !== null &&
322
+ e.source_session_id === transcriptHandoffSession &&
323
+ isSessionDigestRow(e)) {
277
324
  return false;
325
+ }
278
326
  return ambientAdmitEntry(e, plan.currentProject, plan.includeCrossProject, plan.exactScope, plan.ownScope);
279
327
  };
280
328
  const ownSessionId = opts.currentSessionId || '';
@@ -282,13 +330,15 @@ function ambientAdmission(opts, plan, shownHandoff) {
282
330
  const isOwnCompactionItem = (e) => ownSessionId !== '' &&
283
331
  e.source_session_id === ownSessionId &&
284
332
  e.tags.includes(COMPACTION_MEMORY_TAG);
285
- // Superseded rows never inject; which rows reach ambientAdmitEntry matters because it regex-scans content for secrets.
333
+ // Superseded rows never inject; which rows reach ambientAdmitEntry
334
+ // matters because it regex-scans content for secrets.
286
335
  const admit = (e) => !e.superseded_by && !isOwnCompactionItem(e) && ambientAdmit(e);
287
336
  // The two-store search has always ranked a session's own compaction items; only the local search drops them.
288
337
  const bothStoresAdmit = (e) => !e.superseded_by && ambientAdmit(e);
289
338
  return { ambientAdmit, admit, bothStoresAdmit };
290
339
  }
291
- /** Origins the recent backfill may read past its first window; on a shared store, only the caller's own project rows. */
340
+ /** Origins the recent backfill may read past its first window;
341
+ * on a shared store, only the caller's own project rows. */
292
342
  function recentOrigins(plan) {
293
343
  if (plan.sharedStore)
294
344
  return { names: projectNames(plan.currentProject).filter((n) => n !== ''), userGlobal: false };
@@ -297,7 +347,7 @@ function recentOrigins(plan) {
297
347
  async function loadPools(ctx, plan, admission, recallRequest) {
298
348
  const { obs, pinnedOnly, primaryIsGlobal, hasGlobal, exactScope, ownScope } = plan;
299
349
  const recent = { needed: plan.includeRecent, origins: recentOrigins(plan) };
300
- const searches = plan.query !== '*' && !pinnedOnly;
350
+ const searches = plan.query !== NO_QUERY && !pinnedOnly;
301
351
  const searchesBoth = searches && hasGlobal && !primaryIsGlobal;
302
352
  const poolAdmit = searchesBoth ? admission.bothStoresAdmit : admission.admit;
303
353
  const loadAdmit = obs ? obs.watchAdmit(poolAdmit) : poolAdmit;
@@ -318,7 +368,10 @@ async function loadPools(ctx, plan, admission, recallRequest) {
318
368
  ? await loadAmbientEntries(plan.local, ctx.tenantId, { ...read, onQualityDrop: qualityDrop(primaryIsGlobal) })
319
369
  : { entries: [] };
320
370
  const global = hasGlobal && !primaryIsGlobal
321
- ? await loadAmbientEntries(sourceOf(sqliteStore(plan.globalRoot)), ctx.tenantId, { ...read, onQualityDrop: qualityDrop(true) })
371
+ ? await loadAmbientEntries(globalSource(ctx), ctx.tenantId, {
372
+ ...read,
373
+ onQualityDrop: qualityDrop(true),
374
+ })
322
375
  : { entries: [] };
323
376
  return { local, global };
324
377
  }
@@ -327,7 +380,7 @@ function finalizeSelection(picked, plan) {
327
380
  const { obs } = plan;
328
381
  // Ranking reports nothing itself, so its results are offered here and the cuts below can name what they drop.
329
382
  if (!plan.pinnedOnly && obs) {
330
- const pool = plan.query === '*' ? 'strength' : 'search';
383
+ const pool = plan.query === NO_QUERY ? 'strength' : 'search';
331
384
  obs.offer(picked.filter((r) => r.isGlobal !== true).map((r) => r.entry), false, pool);
332
385
  obs.offer(picked.filter((r) => r.isGlobal === true).map((r) => r.entry), true, pool);
333
386
  }
@@ -337,11 +390,13 @@ function finalizeSelection(picked, plan) {
337
390
  obs?.dropMissing(selected.map((r) => r.entry), cut.map((r) => r.entry), 'limit', 'limit');
338
391
  selected = cut;
339
392
  }
340
- const heldDropped = dropHeldCopies(selected, (r) => r.entry); // after the last cut, so a merged row that was cut hides nothing
393
+ // After the last cut, so a merged row that was cut hides nothing.
394
+ const heldDropped = dropHeldCopies(selected, (r) => r.entry);
341
395
  obs?.dropMissing(selected.map((r) => r.entry), heldDropped.map((r) => r.entry), 'limit', 'duplicate');
342
396
  selected = heldDropped;
343
397
  const tokens = selected.reduce((sum, r) => sum + r.tokens, 0);
344
- // Every returned entry carries its origin and how it relates to the active project, so renderers can mark cross-project rows.
398
+ // Every returned entry carries its origin and how it relates to
399
+ // the active project, so renderers can mark cross-project rows.
345
400
  selected = selected.map((r) => ({
346
401
  ...r,
347
402
  origin: r.entry.origin_project ?? null,
@@ -363,11 +418,11 @@ async function traceEmptyContext(ctx, opts, plan) {
363
418
  };
364
419
  // The empty reply is already decided, so a lost trace is logged and the call still answers.
365
420
  try {
366
- await storeFor(ctx).finishRecall({ goalLog: [], audit: [], trace });
421
+ await ctx.store.finishRecall({ goalLog: [], audit: [], trace });
367
422
  }
368
423
  catch (error) {
369
424
  rethrowIfSqliteBlocked(error);
370
- log.error(`recall trace write failed: ${errorMessage(error)}`);
425
+ log.error(`recall trace write failed: ${errorMessage(error)}`, errorFields(error));
371
426
  }
372
427
  }
373
428
  /** Strengthens and marks the returned rows, then writes the trace and index together. */
@@ -388,7 +443,7 @@ async function recordRetrieval(ctx, opts, plan, selected, activeSnapshot) {
388
443
  };
389
444
  const writes = { goalLog: [], audit: [], trace, strengthen: strengthenOf(ctx, retrievedIds) };
390
445
  // The last recall feeds only outcomeForLastRecall, so a store that keeps none still finishes the recall without one.
391
- const store = storeFor(ctx);
446
+ const store = ctx.store;
392
447
  const traceId = store.lastRecall
393
448
  ? await store.lastRecall.finishRecall(writes, plan.hasGlobal ? plan.globalRoot : undefined)
394
449
  : await store.finishRecall(writes).then(() => null);
@@ -413,7 +468,7 @@ async function readAmbientState(ctx, plan) {
413
468
  };
414
469
  const sources = [
415
470
  ...(plan.hasLocal ? [plan.local.reads] : []),
416
- ...(plan.hasGlobal && !plan.primaryIsGlobal ? [sourceOf(sqliteStore(plan.globalRoot)).reads] : []),
471
+ ...(plan.hasGlobal && !plan.primaryIsGlobal ? [globalSource(ctx).reads] : []),
417
472
  ];
418
473
  const tallies = [];
419
474
  for (const reads of sources)