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,28 +1,25 @@
1
1
  // First-class object verbs for predictions: record a claim, close it against the actual, and read the class base rate.
2
- import * as predictionsApi from '../api/predictions.js';
2
+ import * as predictionsApi from '../api/objects/predictions.js';
3
3
  import { VALID_CLOSURE_STATES } from '../core/prediction.js';
4
4
  import { cliApiContext } from './api-context.js';
5
5
  import { printError } from './output.js';
6
6
  import { parseListLimit, stringFlag } from './flag-values.js';
7
7
  import { requireInit } from './shared.js';
8
8
  import { foundOrExit, idArgOrExit, requireStatus } from './object-verbs.js';
9
- import { parseObjectId } from './lenient-id.js';
10
- import { CliExit } from './exit.js';
9
+ import { fail } from './exit.js';
11
10
  const BASERATE_DECIMALS = 3;
12
11
  const PREDICTION_NOUN = 'Prediction';
13
12
  async function predictClose(ctx, args, flags) {
14
- const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
13
+ const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction');
15
14
  const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
16
15
  // SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
17
16
  if (!VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
18
- printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
19
- throw new CliExit(1);
17
+ fail(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
20
18
  }
21
19
  const actualRaw = flags['actual'];
22
20
  const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
23
21
  if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
24
- printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
25
- throw new CliExit(1);
22
+ fail(`Invalid --actual: "${actualRaw}". Must be a number.`);
26
23
  }
27
24
  const closureNote = stringFlag(flags, 'note');
28
25
  const closed = await predictionsApi.closePrediction(ctx, id, {
@@ -47,8 +44,7 @@ async function loadPredictionList(ctx, status, classTag, limit) {
47
44
  const closureState = requireStatus(status, VALID_CLOSURE_STATES);
48
45
  if (!classTag) {
49
46
  // status filter without class: scan all classes is more complex; v1 requires --class for non-default status
50
- printError('--status filter (non-open) requires --class to be set.');
51
- throw new CliExit(1);
47
+ fail('--status filter (non-open) requires --class to be set.');
52
48
  }
53
49
  return predictionsApi.listPredictions(ctx, {
54
50
  classTag,
@@ -77,14 +73,15 @@ async function predictList(ctx, flags) {
77
73
  }
78
74
  }
79
75
  async function predictShow(ctx, args) {
80
- const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction', parseObjectId);
76
+ const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction');
81
77
  const pred = foundOrExit(await predictionsApi.predictionById(ctx, id), PREDICTION_NOUN, id);
82
78
  console.log(`Prediction #${pred.id}`);
83
79
  console.log(` class: ${pred.classTag}`);
84
80
  console.log(` claim: ${pred.claimText}`);
85
81
  console.log(` state: ${pred.closureState}`);
86
- if (pred.estimateValue !== null)
82
+ if (pred.estimateValue !== null) {
87
83
  console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
84
+ }
88
85
  if (pred.targetDate)
89
86
  console.log(` target: ${pred.targetDate}`);
90
87
  if (pred.actualValue !== null)
@@ -101,8 +98,7 @@ async function predictBaserate(ctx, flags) {
101
98
  // Reference-class / planning-fallacy detector
102
99
  const classTag = stringFlag(flags, 'class')?.trim();
103
100
  if (!classTag) {
104
- printError('Usage: hippo predict baserate --class <c>');
105
- throw new CliExit(1);
101
+ fail('Usage: hippo predict baserate --class <c>');
106
102
  }
107
103
  const baserate = await predictionsApi.predictionBaserate(ctx, classTag);
108
104
  if (baserate.nClosed === 0) {
@@ -114,10 +110,12 @@ async function predictBaserate(ctx, flags) {
114
110
  console.log(baserate.summary);
115
111
  console.log(` n_closed: ${baserate.nClosed}`);
116
112
  console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
117
- if (baserate.meanEstimate !== null)
113
+ if (baserate.meanEstimate !== null) {
118
114
  console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
119
- if (baserate.meanActual !== null)
115
+ }
116
+ if (baserate.meanActual !== null) {
120
117
  console.log(` mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
118
+ }
121
119
  if (baserate.meanRatio !== null)
122
120
  console.log(` mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
123
121
  if (baserate.p50Ratio !== null)
@@ -145,19 +143,16 @@ async function predictCreate(ctx, claimText, flags) {
145
143
  printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
146
144
  printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
147
145
  printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
148
- printError(' hippo predict show <id>');
149
- throw new CliExit(1);
146
+ fail(' hippo predict show <id>');
150
147
  }
151
148
  const classTag = stringFlag(flags, 'class')?.trim();
152
149
  if (!classTag) {
153
- printError('--class is required for prediction creation.');
154
- throw new CliExit(1);
150
+ fail('--class is required for prediction creation.');
155
151
  }
156
152
  const estimateRaw = flags['estimate'];
157
153
  const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
158
154
  if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
159
- printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
160
- throw new CliExit(1);
155
+ fail(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
161
156
  }
162
157
  const estimateUnit = stringFlag(flags, 'unit');
163
158
  const targetDate = stringFlag(flags, 'target');
package/dist/cli/print.js CHANGED
@@ -15,9 +15,11 @@ export function recallEntryText(r, query, showWhy, isGlobal) {
15
15
  const bars = Math.round(e.strength * 10);
16
16
  const graphMark = r.graphVia ? ` [graph: ${r.graphVia.hops}hop ${r.graphVia.relType}]` : '';
17
17
  const lines = [
18
- `--- ${e.id} [${e.layer}] ${confLabel}${isGlobal ? ' [global]' : ''}${e.superseded_by ? ' [superseded]' : ''}${graphMark} ` +
18
+ `--- ${e.id} [${e.layer}] ` +
19
+ `${confLabel}${isGlobal ? ' [global]' : ''}${e.superseded_by ? ' [superseded]' : ''}${graphMark} ` +
19
20
  `score=${fmt(r.score, 3)} strength=${fmt(e.strength)}`,
20
- ` [${'█'.repeat(bars)}${'░'.repeat(10 - bars)}] tags: ${e.tags.join(', ') || 'none'} | retrieved: ${e.retrieval_count}x`,
21
+ ` [${'█'.repeat(bars)}${'░'.repeat(10 - bars)}] tags: ${e.tags.join(', ') || 'none'} | retrieved: ` +
22
+ `${e.retrieval_count}x`,
21
23
  ];
22
24
  if (showWhy) {
23
25
  const explanation = explainMatch(query, r);
@@ -1,4 +1,5 @@
1
- // The `hippo projects` verb: list a store's project names, fold an old worktree name into its repo, repair old tags in one pass.
1
+ // The `hippo projects` verb: list a store's project names, fold an old worktree name into its repo, repair old tags in
2
+ // one pass.
2
3
  import * as path from 'path';
3
4
  import { execFileSync } from 'child_process';
4
5
  import * as api from '../api/index.js';
@@ -17,7 +18,10 @@ function worktreeNames() {
17
18
  stdio: ['ignore', 'pipe', 'ignore'],
18
19
  windowsHide: true,
19
20
  });
20
- const paths = out.split(/\r?\n/).filter((l) => l.startsWith('worktree ')).map((l) => path.basename(l.slice('worktree '.length)));
21
+ const paths = out
22
+ .split(/\r?\n/)
23
+ .filter((l) => l.startsWith('worktree '))
24
+ .map((l) => path.basename(l.slice('worktree '.length)));
21
25
  return new Map(paths.slice(1).map((name) => [name, paths[0]]));
22
26
  }
23
27
  catch {
@@ -32,7 +36,9 @@ function hint(p, worktrees) {
32
36
  const main = p.origin ? worktrees.get(p.origin) : undefined;
33
37
  if (main)
34
38
  return `\n a worktree of ${main}: hippo projects merge ${p.origin} ${main}`;
35
- return p.copiesElsewhere > 0 ? `\n ${p.copiesElsewhere} of its imported notes are copies also held under another name` : '';
39
+ return p.copiesElsewhere > 0
40
+ ? `\n ${p.copiesElsewhere} of its imported notes are copies also held under another name`
41
+ : '';
36
42
  }
37
43
  function count(n, one, many = `${one}s`) {
38
44
  return `${n} ${n === 1 ? one : many}`;
@@ -60,11 +66,12 @@ function projectsMerge(ctx, args, flags) {
60
66
  return;
61
67
  }
62
68
  console.log(`${apply ? 'Merged' : 'Dry run: would merge'} ${from} into ${into}:`);
63
- console.log(` ${count(r.setAside.length, 'imported note ' +
64
- 'copy', 'imported note copies')} set aside (${into} already holds the same note; the rest move under ${into} on the next sync)`);
69
+ console.log(` ${count(r.setAside.length, 'imported note ' + 'copy', 'imported note copies')} set aside (${into} already holds the same note; the rest move under ${into} on the next sync)`);
65
70
  console.log(` ${count(r.restamped.length, 'memory', 'memories')} re-tagged, plus ${r.dormantRestamped.length} dormant ` +
66
71
  `and ${count(r.compactions, 'compaction record')}`);
67
- console.log(apply ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_merge` : 'Nothing written. Add --apply to run it.');
72
+ console.log(apply
73
+ ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_merge`
74
+ : 'Nothing written. Add --apply to run it.');
68
75
  }
69
76
  function projectsRepair(ctx, flags) {
70
77
  const root = ctx.hippoRoot;
@@ -75,17 +82,20 @@ function projectsRepair(ctx, flags) {
75
82
  return;
76
83
  }
77
84
  console.log(`${apply ? 'Repaired' : 'Dry run: would repair'} ${root}:`);
78
- console.log(` ${count(r.copies.length, 'imported note ' +
79
- 'copy', 'imported note copies')} under the wrong project set aside (the note stays under its own, or user-global)`);
85
+ console.log(` ${count(r.copies.length, 'imported note ' + 'copy', 'imported note copies')} under the wrong project set aside (the note stays under its own, or user-global)`);
80
86
  for (const f of r.folds)
81
87
  console.log(` ${f.from} folded into ${f.into} (its sessions' folders resolve there now)`);
82
88
  for (const c of r.collisions) {
83
- console.log(` ${c.name} left as it is: its folders now resolve to ${c.ids.join(', ')}; fold it by hand with hippo projects merge`);
89
+ console.log(` ${c.name} left as it is: its folders now resolve to ${c.ids.join(', ')}; fold it by hand with hippo ` +
90
+ `projects merge`);
84
91
  }
85
92
  console.log(` sleep's user-global merged rows: ${r.toProject.length} re-tagged to their parents' project`);
86
93
  console.log(` ${r.setAside.length} set aside (parents in two projects; sleep re-merges them per project)`);
87
- console.log(` ${r.untraced.length} left as they are (no parent left to show which project; check them with hippo inspect <id>)`);
88
- console.log(apply ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_repair` : 'Nothing written. Add --apply to run it.');
94
+ console.log(` ${r.untraced.length} left as they are (no parent left to show which project; check them with hippo inspect ` +
95
+ `<id>)`);
96
+ console.log(apply
97
+ ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_repair`
98
+ : 'Nothing written. Add --apply to run it.');
89
99
  }
90
100
  export function handleProjects({ hippoRoot, tenantId, args, flags }) {
91
101
  const ctx = cliApiContext(resolveAuthRoot(hippoRoot, flags), tenantId);
@@ -1,3 +1,3 @@
1
1
  /** Fault-isolated like the project tag repair: a failure warns, leaves the store unmarked and runs again next time. */
2
- export declare function repairQualityOnceAt(root: string, tenantId: string): void;
2
+ export declare function repairQualityOnceAt(root: string, tenantId: string): Promise<void>;
3
3
  //# sourceMappingURL=quality-repair-once.d.ts.map
@@ -1,13 +1,13 @@
1
1
  // Sleep and the daily runner clean a store's old automatic memories once, so an upgrade needs no command.
2
2
  import * as path from 'path';
3
- import { errorMessage, log } from '../util/log.js';
3
+ import { errorMessage, log, errorFields } from '../util/log.js';
4
4
  import { getGlobalRoot } from '../sharing/global-store.js';
5
- import { repairMemoryQualityOnce } from '../api/audit.js';
5
+ import { repairMemoryQualityOnce } from '../api/auth/audit.js';
6
6
  import { cliApiContext } from './api-context.js';
7
7
  /** Fault-isolated like the project tag repair: a failure warns, leaves the store unmarked and runs again next time. */
8
- export function repairQualityOnceAt(root, tenantId) {
8
+ export async function repairQualityOnceAt(root, tenantId) {
9
9
  try {
10
- const result = repairMemoryQualityOnce(cliApiContext(root, tenantId));
10
+ const result = await repairMemoryQualityOnce(cliApiContext(root, tenantId));
11
11
  if (result === null)
12
12
  return;
13
13
  if (!result.supported) {
@@ -25,13 +25,14 @@ export function repairQualityOnceAt(root, tenantId) {
25
25
  const review = result.issues.filter((issue) => issue.disposition === 'review').length;
26
26
  if (review > 0) {
27
27
  const lead = moved > 0 ? ` ${review} more` : `Checked old automatic memories once after the upgrade: ${review}`;
28
- console.log(`${lead} ${review === 1 ? 'looks' : 'look'} doubtful and ${review === 1 ? 'was' : 'were'} kept; hippo audit repair${scope} lists them.`);
28
+ console.log(`${lead} ${review === 1 ? 'looks' : 'look'} doubtful and ${review === 1 ? 'was' : 'were'} kept; hippo audit ` +
29
+ `repair${scope} lists them.`);
29
30
  }
30
31
  for (const warning of result.warnings)
31
32
  log.warn(warning);
32
33
  }
33
34
  catch (err) {
34
- log.warn(`memory quality repair skipped, tried again next time: ${errorMessage(err)}`);
35
+ log.warn(`memory quality repair skipped, tried again next time: ${errorMessage(err)}`, errorFields(err));
35
36
  }
36
37
  }
37
38
  //# sourceMappingURL=quality-repair-once.js.map
@@ -6,22 +6,20 @@ import { loadConfig } from '../core/config.js';
6
6
  import { estimateTokens } from '../util/token-text.js';
7
7
  import { dropHeldCopies } from '../util/same-text.js';
8
8
  import * as api from '../api/index.js';
9
- import { detectAnchoring, hashQueryText, biasHintEnabled, snapshotRing } from '../api/recall-history.js';
10
- import { sessionRing, shownRecallRows } from '../api/recall-record.js';
11
- import { detectAvailabilityBias } from '../api/availability.js';
12
- import { cliRecallOrigin, cliRecallReranker, cliRecallSetting, DEFAULT_MAX_NEIGHBORS, fitRecallRows, loadCliRecallContinuity, MAX_HOPS, recallJsonRow, } from '../api/recall-cli.js';
9
+ import { availabilityPool, cutoffClauses, detectRecallHints, handoffText, hashQueryText, printedTokens, sessionRing, sessionTrailText, settleTokens, shownRecallRows, shrinkToFit, snapshotText, suppressionSummary, tokenPurse, } from '../api/cli-surface.js';
10
+ import { cliRecallOrigin, cliRecallReranker, cliRecallSetting, DEFAULT_MAX_NEIGHBORS, fitRecallRows, loadCliRecallContinuity, MAX_HOPS, recallJsonRow, } from '../api/recall/rows.js';
13
11
  import { cliApiContext } from './api-context.js';
14
- import { handoffText, printedTokens, sessionTrailText, settleTokens, snapshotText } from '../api/context-render.js';
15
12
  import { printError } from './output.js';
16
- import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag, flagIsTrue, isBooleanFlag, numberFlag, } from './flag-values.js';
13
+ import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag, flagIsTrue, isBooleanFlag, isStringFlag, numberFlag, stringFlag, stringFlagOrExit, } from './flag-values.js';
17
14
  import { requireInit } from './shared.js';
18
- import { recallEntryText, recallHeading, printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole } from './print.js';
15
+ import { recallEntryText, recallHeading, printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole, } from './print.js';
19
16
  import { hostSessionId, hookStoreRoot } from './hook-runtime.js';
20
- import { CliExit } from './exit.js';
17
+ import { fail } from './exit.js';
21
18
  // JSON.stringify keeps quotes or parens in the matched phrase from blurring the line.
22
19
  function planningLine(p) {
23
- if (p.hint)
20
+ if (p.hint) {
24
21
  return `Planning fallacy hint (class: ${p.hint.classTag}): ${p.hint.baserateSummary} [detected: ${JSON.stringify(p.hint.detectedPhrase)}]`;
22
+ }
25
23
  if (p.watching) {
26
24
  return `Planning fallacy: watching this query (reason: ${p.watching.reason}). ${p.watching.suggestion} ` +
27
25
  `[detected: ${JSON.stringify(p.watching.detectedPhrase)}]`;
@@ -29,45 +27,38 @@ function planningLine(p) {
29
27
  return null;
30
28
  }
31
29
  function cutoffLine(shown, s) {
32
- const clauses = [];
33
- // The residual covers rank, budget and limit drops alike, and fires with no --limit at all.
34
- if (s.droppedByBudget > 0)
35
- clauses.push(`${s.droppedByBudget} not shown (rank, budget or limit)`);
36
- if (s.droppedPreRank > 0)
37
- clauses.push(`${s.droppedPreRank} filtered pre-rank`);
38
- if (s.summarySubstitutionsAdded > 0)
39
- clauses.push(`${s.summarySubstitutionsAdded} summary substitutions added`);
40
- if (s.freshTailAdded > 0)
41
- clauses.push(`${s.freshTailAdded} fresh-tail added`);
42
- if (s.suppressedByInterference > 0)
43
- clauses.push(`${s.suppressedByInterference} suppressed by interference`);
44
- return clauses.length > 0 ? `Cutoff: showing ${shown} of ${s.totalCandidates} candidates; ${clauses.join('; ')}.` : null;
30
+ const clauses = cutoffClauses(s);
31
+ return clauses.length > 0
32
+ ? `Cutoff: showing ${shown} of ${s.totalCandidates} candidates; ${clauses.join('; ')}.`
33
+ : null;
45
34
  }
46
35
  function failWith(message) {
47
36
  return () => {
48
- printError(message);
49
- throw new CliExit(1);
37
+ fail(message);
50
38
  };
51
39
  }
52
40
  /** `--graph-stream` implies rrf fusion as well as the graph stream; the CLI fuses the local store only. */
53
41
  function parseGraphStreamFlags(flags) {
54
42
  let hops;
55
43
  if (flags['graph-hops'] !== undefined) {
56
- if (isBooleanFlag(flags['graph-hops']))
44
+ if (isBooleanFlag(flags['graph-hops'])) {
57
45
  failWith(`--graph-hops requires an integer value 1..${MAX_HOPS} (e.g. --graph-hops 2).`)();
46
+ }
58
47
  const h = Number(flags['graph-hops']);
59
48
  if (!Number.isInteger(h) || h < 1 || h > MAX_HOPS) {
60
- failWith(`Invalid --graph-hops: "${String(flags['graph-hops'])}". Must be an integer 1..${MAX_HOPS}.`)();
49
+ failWith(`Invalid --graph-hops: "${stringFlag(flags, 'graph-hops')}". Must be an integer 1..${MAX_HOPS}.`)();
61
50
  }
62
51
  hops = h;
63
52
  }
64
53
  let seeds;
65
54
  if (flags['graph-seeds'] !== undefined) {
66
- if (isBooleanFlag(flags['graph-seeds']))
55
+ if (isBooleanFlag(flags['graph-seeds'])) {
67
56
  failWith('--graph-seeds requires a positive integer value (e.g. --graph-seeds 10).')();
57
+ }
68
58
  const s = Number(flags['graph-seeds']);
69
- if (!Number.isInteger(s) || s < 1)
70
- failWith(`Invalid --graph-seeds: "${String(flags['graph-seeds'])}". Must be a positive integer.`)();
59
+ if (!Number.isInteger(s) || s < 1) {
60
+ failWith(`Invalid --graph-seeds: "${stringFlag(flags, 'graph-seeds')}". Must be a positive integer.`)();
61
+ }
71
62
  seeds = s;
72
63
  }
73
64
  return { hops, seeds };
@@ -76,11 +67,12 @@ function parseHopsFlags(flags) {
76
67
  if (flags['hops'] === undefined)
77
68
  return {};
78
69
  // A value-less `--hops` parses as true, and Number(true) === 1 would silently run a 1-hop expansion.
79
- if (isBooleanFlag(flags['hops']))
70
+ if (isBooleanFlag(flags['hops'])) {
80
71
  return { fail: failWith(`--hops requires an integer value 0..${MAX_HOPS} (e.g. --hops 1).`) };
72
+ }
81
73
  const hops = Number(flags['hops']);
82
74
  if (!Number.isInteger(hops) || hops < 0 || hops > MAX_HOPS) {
83
- return { fail: failWith(`Invalid --hops: "${String(flags['hops'])}". Must be an integer 0..${MAX_HOPS}.`) };
75
+ return { fail: failWith(`Invalid --hops: "${stringFlag(flags, 'hops')}". Must be an integer 0..${MAX_HOPS}.`) };
84
76
  }
85
77
  const raw = flags['max-neighbors'];
86
78
  if (raw === undefined)
@@ -94,7 +86,10 @@ function parseHopsFlags(flags) {
94
86
  return { value: { hops, maxNeighbors } };
95
87
  }
96
88
  function parseRerankerFlag(flags) {
97
- const name = flags['reranker'] !== undefined ? String(flags['reranker']).trim() : '';
89
+ const nameRaw = flags['reranker'];
90
+ if (nameRaw !== undefined && !isStringFlag(nameRaw))
91
+ return { fail: failWith('--reranker requires a value.') };
92
+ const name = nameRaw?.trim() ?? '';
98
93
  let picked;
99
94
  try {
100
95
  picked = cliRecallReranker(name);
@@ -125,11 +120,16 @@ function parseSalienceFlag(flags) {
125
120
  return { value: threshold };
126
121
  }
127
122
  function parseChoiceFlag(flags, name, valid) {
128
- const value = flags[name] !== undefined ? String(flags[name]).trim() : '';
123
+ const raw = flags[name];
124
+ if (raw !== undefined && !isStringFlag(raw)) {
125
+ return { fail: failWith(`--${name} requires a value. Must be one of: ${valid.join(', ')}.`) };
126
+ }
127
+ const value = raw?.trim() ?? '';
129
128
  if (!value)
130
129
  return {};
131
- if (!valid.includes(value))
130
+ if (!valid.includes(value)) {
132
131
  return { fail: failWith(`Invalid --${name}: "${value}". Must be one of: ${valid.join(', ')}.`) };
132
+ }
133
133
  return { value };
134
134
  }
135
135
  /** Parses every flag a ranking stage reads; the first invalid one in pipeline order becomes `error`. */
@@ -140,7 +140,11 @@ function parseRecallLateFlags(flags) {
140
140
  const outcome = parseChoiceFlag(flags, 'outcome', ['success', 'failure', 'partial']);
141
141
  const layer = parseChoiceFlag(flags, 'layer', Object.values(Layer));
142
142
  const staged = [
143
- ['expand', graphHops.fail], ['rerank', reranker.fail], ['salience', salience.fail], ['outcome', outcome.fail], ['layer', layer.fail],
143
+ ['expand', graphHops.fail],
144
+ ['rerank', reranker.fail],
145
+ ['salience', salience.fail],
146
+ ['outcome', outcome.fail],
147
+ ['layer', layer.fail],
144
148
  ];
145
149
  let error;
146
150
  for (const [stage, fail] of staged) {
@@ -158,7 +162,8 @@ function parseRecallLateFlags(flags) {
158
162
  error,
159
163
  };
160
164
  }
161
- /** Runs `hippo recall`: the flags name the ranking core and this verb's presenter, `retrieve` ranks and records, then the block prints. */
165
+ /** Runs `hippo recall`: the flags name the ranking core and this verb's presenter, `retrieve` ranks and records,
166
+ * then the block prints. */
162
167
  async function cmdRecall(hippoRoot, tenantId, query, flags) {
163
168
  requireInit(hippoRoot);
164
169
  const ctx = cliApiContext(hippoRoot, tenantId);
@@ -173,11 +178,13 @@ async function cmdRecall(hippoRoot, tenantId, query, flags) {
173
178
  cliCore: {
174
179
  rank: rankOptions(query, flags, o, priced),
175
180
  // The global store is a second source for this surface alone, and never when it is the store being searched.
176
- sources: { globalRoot: globalRoot !== hippoRoot && priced.globalOn ? globalRoot : undefined },
181
+ sources: globalRoot !== hippoRoot && priced.globalOn
182
+ ? { globalRoot, globalStore: cliApiContext(globalRoot, tenantId).store }
183
+ : undefined,
177
184
  note: (line) => printError(line),
178
185
  hostSessionId: hostSessionId(),
179
- show: (rank, planning) => {
180
- slot.presented = presentRecall(ctx, query, o, { rank, ...priced }, planning);
186
+ show: async (rank, planning) => {
187
+ slot.presented = await presentRecall(ctx, query, o, { rank, ...priced }, planning);
181
188
  return slot.presented.shown;
182
189
  },
183
190
  },
@@ -197,16 +204,14 @@ function parseRecallOptions(ctx, flags) {
197
204
  const includeSuperseded = boolFlag(flags, 'include-superseded');
198
205
  const asOf = parseAsOfFlag(flags);
199
206
  // The explicit --scope is the filter input; the detected scope only boosts, so auto-detection never filters.
200
- const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
207
+ const explicitScope = stringFlagOrExit(flags, 'scope') ?? null;
201
208
  const setting = cliRecallSetting(ctx, explicitScope);
202
209
  const config = loadConfig(ctx.hippoRoot);
203
210
  const minResults = numberFlag(flags, 'min-results');
204
211
  const graphStream = flagIsTrue(flags, 'graph-stream') ? parseGraphStreamFlags(flags) : undefined;
205
212
  const late = parseRecallLateFlags(flags);
206
- const goalTag = flags['goal'] !== undefined ? String(flags['goal']).trim() : '';
207
- const sessionId = (flags['session-id'] !== undefined
208
- ? String(flags['session-id'])
209
- : envHippoSessionId() ?? '').trim();
213
+ const goalTag = stringFlagOrExit(flags, 'goal') ?? '';
214
+ const sessionId = (stringFlagOrExit(flags, 'session-id') ?? envHippoSessionId() ?? '').trim();
210
215
  return {
211
216
  budget, limit, asJson, showWhy, includeSuperseded, asOf, setting, tenantId: ctx.tenantId,
212
217
  explicitScope, config, minResults, graphStream, late, goalTag, sessionId,
@@ -226,8 +231,14 @@ function rankOptions(query, flags, o, priced) {
226
231
  // Engines spend the budget on the text each result prints as, less the header, so selection and print agree.
227
232
  const entryBudget = Math.max(0, o.budget - printedTokens(recallHeading(o.budget, o.budget, query)));
228
233
  return {
229
- budget: entryBudget, cost: priced.printCost, limit: o.limit, why: o.showWhy, includeSuperseded: o.includeSuperseded, asOf: o.asOf,
230
- explicitScope: o.explicitScope, activeScope: o.setting.activeScope,
234
+ budget: entryBudget,
235
+ cost: priced.printCost,
236
+ limit: o.limit,
237
+ why: o.showWhy,
238
+ includeSuperseded: o.includeSuperseded,
239
+ asOf: o.asOf,
240
+ explicitScope: o.explicitScope,
241
+ activeScope: o.setting.activeScope,
231
242
  search: {
232
243
  ...engineFlags(flags, o.config),
233
244
  multihop: flagIsTrue(flags, 'multihop') || o.config.multihop.enabled,
@@ -253,23 +264,17 @@ function recallHinter(query, o, rank) {
253
264
  // HIPPO_ANCHORING=off and HIPPO_AVAILABILITY=off skip the work entirely.
254
265
  const anchorRing = sessionRing('cli', tenantId, sessionId);
255
266
  const queryHash = hashQueryText(query);
256
- const availabilityPool = biasHintEnabled('availability')
257
- ? [...rank.localEntries, ...rank.globalEntries].map((e) => ({ id: e.id, created: e.created }))
258
- : null;
267
+ const pool = availabilityPool(() => [...rank.localEntries, ...rank.globalEntries]);
259
268
  const hintsFor = (list, held) => {
260
- const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
261
- const availability = availabilityPool
262
- ? detectAvailabilityBias({ topK: list.map((r) => ({ id: r.entry.id, created: r.entry.created })), pool: availabilityPool })
263
- : null;
264
- const summary = {
265
- // The published total includes graph-surfaced rows, so total == preRank + byBudget + returned holds for callers.
269
+ const { anchoring, availability } = detectRecallHints({ list, pool, anchorRing, queryHash });
270
+ const summary = suppressionSummary({
271
+ // The total includes graph-surfaced rows, so total == preRank + byBudget + returned holds for callers.
266
272
  totalCandidates: rank.totalCandidates + rank.graphAdded,
267
273
  droppedPreRank: rank.droppedPreRank + held,
268
274
  droppedByBudget: Math.max(0, rank.totalCandidates + rank.graphAdded - rank.droppedPreRank - held - list.length),
269
275
  summarySubstitutionsAdded: 0,
270
276
  freshTailAdded: 0,
271
- suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0, // a query_repeat is a re-ask, not competition
272
- };
277
+ }, anchoring);
273
278
  return { anchoring, availability, summary };
274
279
  };
275
280
  return { anchorRing, hintsFor };
@@ -325,59 +330,89 @@ function renderRecallBlock(list, h, v) {
325
330
  console.log(entryText(r));
326
331
  }));
327
332
  }
328
- /** Pays the continuity sections and the plan hint first, then fits the memories into what is left. */
329
- function fitRecallBlock(query, o, ranked, loaded, planning) {
330
- const { budget } = o;
333
+ /** Pays the continuity sections in print order after the header; one that does not fit is dropped. */
334
+ function payContinuity(loaded, sectionBudget) {
331
335
  let { activeSnapshot, sessionHandoff, recentSessionEvents } = loaded;
332
- // Sections print ahead of the memories, so they are paid first, after the header; one that does not fit is dropped.
333
- const sectionBudget = budget - printedTokens(recallHeading(budget, budget, query));
334
- let left = sectionBudget;
335
- const pays = (tokens) => { if (tokens > left)
336
- return false; left -= tokens; return true; };
336
+ const { pays, left } = tokenPurse(sectionBudget);
337
337
  if (activeSnapshot && !pays(printedTokens(snapshotText(activeSnapshot))))
338
338
  activeSnapshot = null;
339
339
  if (sessionHandoff && !pays(printedTokens(handoffText(sessionHandoff))))
340
340
  sessionHandoff = null;
341
- if (recentSessionEvents.length > 0 && !pays(printedTokens(sessionTrailText(recentSessionEvents))))
341
+ if (recentSessionEvents.length > 0 && !pays(printedTokens(sessionTrailText(recentSessionEvents)))) {
342
342
  recentSessionEvents = [];
343
- const continuityTokens = sectionBudget - left;
343
+ }
344
344
  const continuity = { activeSnapshot, sessionHandoff, recentSessionEvents };
345
+ return { continuity, continuityTokens: sectionBudget - left() };
346
+ }
347
+ /** Drops the lowest-ranked entry until the whole block, hints and header included, fits the budget. */
348
+ function renderWithinBudget(fitted, hintsFor, view, floor, budget) {
349
+ // Copies go after every cut, so a merged row the budget drops never hides its sources.
350
+ const render = (kept) => {
351
+ const results = dropHeldCopies(fitted.slice(0, kept), (r) => r.entry);
352
+ const hints = hintsFor(results, kept - results.length);
353
+ return { results, hints, recallText: renderRecallBlock(results, hints, view) };
354
+ };
355
+ return shrinkToFit(fitted.length, floor, budget, render, (r) => r.recallText);
356
+ }
357
+ /** Pays the continuity sections and the plan hint first, then fits the memories into what is left. */
358
+ function fitRecallBlock(query, o, ranked, loaded, planning) {
359
+ const { budget } = o;
360
+ // Sections print ahead of the memories, so they are paid first, after the header; one that does not fit is dropped.
361
+ const sectionBudget = budget - printedTokens(recallHeading(budget, budget, query));
362
+ const { continuity, continuityTokens } = payContinuity(loaded, sectionBudget);
363
+ let left = sectionBudget - continuityTokens;
364
+ const { activeSnapshot, sessionHandoff, recentSessionEvents } = continuity;
345
365
  const hasContinuity = activeSnapshot !== null || sessionHandoff !== null || recentSessionEvents.length > 0;
346
366
  // The baserate hint depends on the query alone, so `retrieve` evaluates it and this only prices the line.
347
367
  const planText = planningLine(planning);
348
- const showPlan = planText !== null && pays(printedTokens(`${planText}\n`));
349
- const cmdPlanningFallacyHint = showPlan ? planning.hint ?? null : null;
350
- const cmdPlanningFallacyWatching = showPlan ? planning.watching ?? null : null;
368
+ const planTokens = planText === null ? 0 : printedTokens(`${planText}\n`);
369
+ const showPlan = planText !== null && planTokens <= left;
370
+ if (showPlan)
371
+ left -= planTokens;
372
+ const cmdPlanningFallacyHint = showPlan ? (planning.hint ?? null) : null;
373
+ const cmdPlanningFallacyWatching = showPlan ? (planning.watching ?? null) : null;
351
374
  // The first --min-results are kept whatever they cost (the documented exception); the rest skip and continue.
352
375
  const floor = o.minResults ?? 1;
353
376
  const fitted = fitRecallRows(ranked.rank.results, left, floor, ranked.printCost);
354
- // Copies go after every cut, so a merged row the budget drops never hides its sources.
355
- const shown = (n) => dropHeldCopies(fitted.slice(0, n), (r) => r.entry);
356
- let kept = fitted.length;
357
- let results = shown(kept);
358
377
  const { anchorRing, hintsFor } = recallHinter(query, o, ranked.rank);
359
- const view = { query, showWhy: o.showWhy, showPlan, planText, hasContinuity, continuity, entryText: ranked.entryText };
360
- let hints = hintsFor(results, kept - results.length);
361
- let recallText = renderRecallBlock(results, hints, view);
362
- // The hints, Cutoff line and header vary with the list, so the lowest-ranked entry goes until the whole block fits.
363
- while (kept > floor && estimateTokens(recallText) > budget) {
364
- kept--;
365
- results = shown(kept);
366
- hints = hintsFor(results, kept - results.length);
367
- recallText = renderRecallBlock(results, hints, view);
368
- }
369
- return { results, hints, recallText, continuity, continuityTokens, cmdPlanningFallacyHint, cmdPlanningFallacyWatching, anchorRing };
378
+ const view = {
379
+ query,
380
+ showWhy: o.showWhy,
381
+ showPlan,
382
+ planText,
383
+ hasContinuity,
384
+ continuity,
385
+ entryText: ranked.entryText,
386
+ };
387
+ const { results, hints, recallText } = renderWithinBudget(fitted, hintsFor, view, floor, budget);
388
+ return {
389
+ results,
390
+ hints,
391
+ recallText,
392
+ continuity,
393
+ continuityTokens,
394
+ cmdPlanningFallacyHint,
395
+ cmdPlanningFallacyWatching,
396
+ anchorRing,
397
+ };
370
398
  }
371
- /** The presenter `retrieve` calls once ranking ends: fits and renders the block, and names the rows and hint rows to record. */
372
- function presentRecall(ctx, query, o, ranked, planning) {
399
+ /** The presenter `retrieve` calls once ranking ends: fits and
400
+ * renders the block, and names the rows and hint rows to record. */
401
+ async function presentRecall(ctx, query, o, ranked, planning) {
373
402
  // Loaded before the zero-result branch, so a no-match query with live continuity still returns a resume packet.
374
- const fit = fitRecallBlock(query, o, ranked, loadCliRecallContinuity(ctx, o.setting, o.includeContinuity), planning);
403
+ const loaded = await loadCliRecallContinuity(ctx, o.setting, o.includeContinuity);
404
+ const fit = fitRecallBlock(query, o, ranked, loaded, planning);
375
405
  const { results, hints } = fit;
376
406
  const text = recallOutput(query, o, fit, ranked.isGlobal);
377
407
  const audit = shownRecallRows({ tenantId: o.tenantId, actor: 'cli' }, {
378
- query, ring: fit.anchorRing, topId: results[0]?.entry.id ?? null, anchoring: hints.anchoring, availability: hints.availability,
408
+ query,
409
+ ring: fit.anchorRing,
410
+ topId: results[0]?.entry.id ?? null,
411
+ anchoring: hints.anchoring,
412
+ availability: hints.availability,
379
413
  });
380
- // The token ledger books the text this recall prints, on whichever exit it takes; the ring keeps the hint the final detect made.
414
+ // The token ledger books the text this recall prints, on whichever
415
+ // exit it takes; the ring keeps the hint the final detect made.
381
416
  return { text, shown: { results, audit, tokens: estimateTokens(text), anchoredOn: hints.anchoring?.memoryId } };
382
417
  }
383
418
  /** What this recall prints: the JSON object, or the fitted block. */
@@ -386,7 +421,9 @@ function recallOutput(query, o, fit, isGlobal) {
386
421
  const { results, recallText } = fit;
387
422
  if (results.length === 0) {
388
423
  // HTTP and MCP surface the hint whatever matched, so the zero-result JSON keeps it for parity.
389
- return asJson ? JSON.stringify({ query, results: [], total: 0, ...recallJsonTail(fit, includeContinuity) }) : recallText;
424
+ return asJson
425
+ ? JSON.stringify({ query, results: [], total: 0, ...recallJsonTail(fit, includeContinuity) })
426
+ : recallText;
390
427
  }
391
428
  if (!asJson)
392
429
  return recallText;
@@ -426,8 +463,7 @@ function recallJsonTail(fit, includeContinuity) {
426
463
  export async function handleRecall({ hippoRoot, tenantId, args, flags }) {
427
464
  const query = args.join(' ').trim();
428
465
  if (!query) {
429
- printError('Please provide a search query.');
430
- throw new CliExit(1);
466
+ fail('Please provide a search query.');
431
467
  }
432
468
  await cmdRecall(hookStoreRoot(hippoRoot), tenantId, query, flags);
433
469
  }