hippo-memory 1.69.0 → 1.71.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 (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,31 +1,37 @@
1
1
  // Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
2
2
  import * as path from 'path';
3
- import { readEntry } from '../store/entry-reads.js';
4
3
  import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
5
- import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
6
- import { RejectedValueError } from '../rejection.js';
7
- import { loadConfig } from '../config.js';
8
- import { isGitRepo } from '../autolearn.js';
9
- import { invalidateMatching } from '../invalidation.js';
10
- import * as api from '../api.js';
11
- import * as client from '../client.js';
12
- import { resolveTenantId } from '../tenant.js';
4
+ import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
5
+ import { RejectedValueError } from '../store/rejection.js';
6
+ import { loadConfig } from '../core/config.js';
7
+ import { RawAppendOnlyError } from '../core/raw-append-only.js';
8
+ import { isGitRepo } from '../learn/autolearn.js';
9
+ import { invalidateMatching } from '../learn/invalidation.js';
10
+ import * as api from '../api/index.js';
11
+ import { getMemory } from '../api/memories.js';
12
+ import * as client from './client.js';
13
+ import { cliApiContext } from './api-context.js';
13
14
  import { printError } from './output.js';
14
- import { parseCountFlag, requireInit, runChurnStaleForRepo, runViaServerIfAvailable, fmt, resolveAuthRoot, } from './shared.js';
15
- export function cmdOutcome(hippoRoot, flags) {
15
+ import { parseCountFlag, boolFlag, flagIsTrue, nonEmptyStringFlag, stringFlag } from './flag-values.js';
16
+ import { requireInit, runChurnStaleForRepo, runViaServerIfAvailable, resolveAuthRoot } from './shared.js';
17
+ import { fmt } from './print.js';
18
+ import { errorMessage } from '../util/log.js';
19
+ import { DIGEST_DISPLAY_CHARS, CONTENT_PREVIEW_CHARS, DATE_PREFIX_CHARS } from '../util/token-text.js';
20
+ import { CliExit } from './exit.js';
21
+ const CONFLICT_PREVIEW_CHARS = 120;
22
+ const REJECTED_DIGEST_LIST_CHARS = 16;
23
+ const DORMANT_PREVIEW_CHARS = 100;
24
+ const STRENGTH_DECIMALS = 3;
25
+ export function handleOutcome({ hippoRoot, tenantId, flags }) {
16
26
  requireInit(hippoRoot);
17
- const good = Boolean(flags['good']);
18
- const bad = Boolean(flags['bad']);
27
+ const good = boolFlag(flags, 'good');
28
+ const bad = boolFlag(flags, 'bad');
19
29
  if (!good && !bad) {
20
30
  printError('Specify --good or --bad');
21
- process.exit(1);
31
+ throw new CliExit(1);
22
32
  }
23
33
  // Through api.outcome so every CLI outcome writes one audit_log row per id, as the MCP path does.
24
- const ctx = {
25
- hippoRoot,
26
- tenantId: resolveTenantId({}),
27
- actor: api.adminActor('cli'),
28
- };
34
+ const ctx = cliApiContext(hippoRoot, tenantId);
29
35
  const specificId = flags['id'] ? String(flags['id']) : null;
30
36
  let updated;
31
37
  if (specificId) {
@@ -43,30 +49,13 @@ export function cmdOutcome(hippoRoot, flags) {
43
49
  }
44
50
  // Shared between the forget dispatch and cmdForget so the message can't drift.
45
51
  const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
46
- function cmdForget(hippoRoot, id, flags) {
52
+ function cmdForget(hippoRoot, tenantId, id, flags) {
47
53
  requireInit(hippoRoot);
48
- const ctx = {
49
- hippoRoot,
50
- tenantId: resolveTenantId({}),
51
- actor: api.adminActor('cli'),
52
- };
53
- // Raw memories (Slack / GitHub connector ingestion) are append-only: a
54
- // BEFORE-DELETE trigger aborts any delete. archiveRaw is the sanctioned
55
- // removal path; it records ctx.actor as the archiver for provenance.
56
- if (flags['archive'] === true) {
57
- const reason = typeof flags['reason'] === 'string' ? flags['reason'] : null;
58
- if (!reason) {
59
- printError(ARCHIVE_REASON_REQUIRED);
60
- process.exit(1);
61
- }
62
- try {
63
- api.archiveRaw(ctx, id, reason);
64
- console.log(`Archived ${id}`);
65
- }
66
- catch (err) {
67
- printError(`Could not archive ${id}: ${err instanceof Error ? err.message : String(err)}`);
68
- process.exit(1);
69
- }
54
+ const ctx = cliApiContext(hippoRoot, tenantId);
55
+ // Raw memories (connector ingestion) are append-only: a BEFORE-DELETE trigger aborts any delete,
56
+ // so archiveRaw is the sanctioned removal path and records ctx.actor as the archiver.
57
+ if (flagIsTrue(flags, 'archive')) {
58
+ archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
70
59
  return;
71
60
  }
72
61
  try {
@@ -74,47 +63,63 @@ function cmdForget(hippoRoot, id, flags) {
74
63
  console.log(`Forgot ${id}`);
75
64
  }
76
65
  catch (err) {
77
- const msg = err instanceof Error ? err.message : String(err);
78
- if (/append-only/i.test(msg)) {
79
- // The delete was refused by the append-only trigger — this is a raw
80
- // memory, not a missing one. Point the user at the archive path.
81
- printError(rawForgetRefusal(id));
82
- }
83
- else if (api.isDormant(ctx, id)) {
84
- // Sleep moved it to the dormant store: it is not in active memory, so
85
- // point at the command that owns it.
86
- printError(`${id} is dormant, not in active memory. Delete it for good: hippo dormant forget ${id} ` +
87
- `(or bring it back: hippo dormant restore ${id})`);
88
- }
89
- else {
90
- printError(`Memory not found: ${id}`);
91
- }
92
- process.exit(1);
66
+ reportForgetFailure(ctx, id, err);
67
+ throw new CliExit(1);
68
+ }
69
+ }
70
+ function archiveForgottenRaw(ctx, id, reason) {
71
+ if (!reason) {
72
+ printError(ARCHIVE_REASON_REQUIRED);
73
+ throw new CliExit(1);
74
+ }
75
+ try {
76
+ api.archiveRaw(ctx, id, reason);
77
+ console.log(`Archived ${id}`);
78
+ }
79
+ catch (err) {
80
+ printError(`Could not archive ${id}: ${errorMessage(err)}`);
81
+ throw new CliExit(1);
82
+ }
83
+ }
84
+ function reportForgetFailure(ctx, id, cause) {
85
+ if (cause instanceof RawAppendOnlyError) {
86
+ // The delete was refused by the append-only trigger — this is a raw
87
+ // memory, not a missing one. Point the user at the archive path.
88
+ printError(rawForgetRefusal(id));
89
+ }
90
+ else if (api.isDormant(ctx, id)) {
91
+ // Sleep moved it to the dormant store: it is not in active memory, so
92
+ // point at the command that owns it.
93
+ printError(`${id} is dormant, not in active memory. Delete it for good: hippo dormant forget ${id} ` +
94
+ `(or bring it back: hippo dormant restore ${id})`);
95
+ }
96
+ else {
97
+ printError(`Memory not found: ${id}`);
93
98
  }
94
99
  }
95
100
  function rawForgetRefusal(id) {
96
101
  return `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
97
102
  }
98
103
  // Refuses exactly where the real run would, so "Would forget" is a promise, not a guess.
99
- function previewForget(hippoRoot, id, archive) {
104
+ async function previewForget(hippoRoot, tenantId, id, archive) {
100
105
  requireInit(hippoRoot);
101
- const entry = readEntry(hippoRoot, id, resolveTenantId({}));
106
+ const entry = await getMemory(cliApiContext(hippoRoot, tenantId), id);
102
107
  if (!entry) {
103
108
  printError(`Memory not found: ${id}`);
104
- process.exit(1);
109
+ throw new CliExit(1);
105
110
  }
106
111
  if (!archive && entry.kind === 'raw') {
107
112
  printError(rawForgetRefusal(id));
108
- process.exit(1);
113
+ throw new CliExit(1);
109
114
  }
110
115
  if (archive && entry.kind !== 'raw') {
111
116
  printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
112
- process.exit(1);
117
+ throw new CliExit(1);
113
118
  }
114
- const snippet = entry.content.length > 80 ? `${entry.content.slice(0, 80)}...` : entry.content;
119
+ const snippet = entry.content.length > CONTENT_PREVIEW_CHARS ? `${entry.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : entry.content;
115
120
  console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
116
121
  }
117
- export function cmdConflicts(hippoRoot, flags) {
122
+ export function handleConflicts({ hippoRoot, flags }) {
118
123
  requireInit(hippoRoot);
119
124
  const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
120
125
  if (flags['json']) {
@@ -133,55 +138,58 @@ export function cmdConflicts(hippoRoot, flags) {
133
138
  console.log('');
134
139
  }
135
140
  }
136
- export function cmdResolve(hippoRoot, args, flags) {
141
+ /** Shown when --keep is missing, to help the user decide. */
142
+ async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
143
+ const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
144
+ const conflict = conflicts.find((c) => c.id === conflictId);
145
+ if (!conflict) {
146
+ printError(`Conflict ${conflictId} not found or already resolved.`);
147
+ throw new CliExit(1);
148
+ }
149
+ console.log(`Conflict ${conflictId}:`);
150
+ console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
151
+ console.log(` Reason: ${conflict.reason}`);
152
+ console.log('');
153
+ const ctx = cliApiContext(hippoRoot, tenantId);
154
+ const entryA = await getMemory(ctx, conflict.memory_a_id);
155
+ const entryB = await getMemory(ctx, conflict.memory_b_id);
156
+ if (entryA) {
157
+ console.log(` [A] ${conflict.memory_a_id}:`);
158
+ console.log(` ${entryA.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryA.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
159
+ }
160
+ if (entryB) {
161
+ console.log(` [B] ${conflict.memory_b_id}:`);
162
+ console.log(` ${entryB.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryB.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
163
+ }
164
+ console.log('');
165
+ console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
166
+ }
167
+ export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
137
168
  requireInit(hippoRoot);
138
169
  const rawId = args[0] ?? '';
139
170
  // Accept "42" or "conflict_42"
140
171
  const conflictId = parseInt(rawId.replace(/^conflict_/, ''), 10);
141
172
  if (isNaN(conflictId)) {
142
173
  printError('Usage: hippo resolve <conflict_id> --keep <memory_id> [--forget]');
143
- process.exit(1);
174
+ throw new CliExit(1);
144
175
  }
145
- const tenantId = resolveTenantId({});
146
176
  const keepId = String(flags['keep'] ?? '').trim();
147
177
  if (!keepId) {
148
- // Show the conflict details to help the user decide
149
- const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
150
- const conflict = conflicts.find((c) => c.id === conflictId);
151
- if (!conflict) {
152
- printError(`Conflict ${conflictId} not found or already resolved.`);
153
- process.exit(1);
154
- }
155
- console.log(`Conflict ${conflictId}:`);
156
- console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
157
- console.log(` Reason: ${conflict.reason}`);
158
- console.log('');
159
- const entryA = readEntry(hippoRoot, conflict.memory_a_id, tenantId);
160
- const entryB = readEntry(hippoRoot, conflict.memory_b_id, tenantId);
161
- if (entryA) {
162
- console.log(` [A] ${conflict.memory_a_id}:`);
163
- console.log(` ${entryA.content.slice(0, 120)}${entryA.content.length > 120 ? '...' : ''}`);
164
- }
165
- if (entryB) {
166
- console.log(` [B] ${conflict.memory_b_id}:`);
167
- console.log(` ${entryB.content.slice(0, 120)}${entryB.content.length > 120 ? '...' : ''}`);
168
- }
169
- console.log('');
170
- console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
178
+ await showConflictForResolve(hippoRoot, conflictId, tenantId);
171
179
  return;
172
180
  }
173
- const forgetLoser = Boolean(flags['forget']);
181
+ const forgetLoser = boolFlag(flags, 'forget');
174
182
  // --reject-loser tombstones the loser's digest so it cannot be re-asserted, as well as removing it.
175
183
  // --reason is optional here, unlike `hippo reject`: resolve already has the conflict id and keepId.
176
- const rejectLoser = Boolean(flags['reject-loser']);
177
- const reasonFlag = typeof flags['reason'] === 'string' ? flags['reason'] : undefined;
184
+ const rejectLoser = boolFlag(flags, 'reject-loser');
185
+ const reasonFlag = stringFlag(flags, 'reason');
178
186
  const result = resolveConflict(hippoRoot, conflictId, keepId, forgetLoser, tenantId, {
179
187
  rejectLoserValue: rejectLoser,
180
188
  reason: reasonFlag,
181
189
  });
182
190
  if (!result) {
183
191
  printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
184
- process.exit(1);
192
+ throw new CliExit(1);
185
193
  }
186
194
  const action = rejectLoser
187
195
  ? 'rejected (tombstoned) and removed'
@@ -190,31 +198,28 @@ export function cmdResolve(hippoRoot, args, flags) {
190
198
  : 'weakened (half-life halved)';
191
199
  console.log(`Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`);
192
200
  }
193
- // ---------------------------------------------------------------------------
194
201
  // reject / rejections / unreject
195
- // ---------------------------------------------------------------------------
196
- export function cmdReject(hippoRoot, args, flags) {
202
+ export function handleReject({ hippoRoot, tenantId, args, flags }) {
197
203
  // Store resolution mirrors `hippo remember`: --global writes to the
198
204
  // global store, otherwise the local store (requireInit'd via resolveAuthRoot).
199
205
  const root = resolveAuthRoot(hippoRoot, flags);
200
- const tenantId = resolveTenantId({});
201
206
  // --reason is REQUIRED: the tombstone stores no content, so reason is its only human-readable identity.
202
- const reason = typeof flags['reason'] === 'string' ? flags['reason'].trim() : '';
207
+ const reason = (stringFlag(flags, 'reason') ?? '').trim();
203
208
  if (!reason) {
204
209
  printError('hippo reject requires --reason "<why>" (the tombstone stores no content; reason is its only identity).');
205
- process.exit(1);
210
+ throw new CliExit(1);
206
211
  }
207
- const valueFlag = typeof flags['value'] === 'string' ? flags['value'] : undefined;
212
+ const valueFlag = stringFlag(flags, 'value');
208
213
  const memoryId = args[0];
209
214
  if (!memoryId && valueFlag === undefined) {
210
215
  printError('Usage: hippo reject <memory-id> --reason "<why>"');
211
216
  printError(' or: hippo reject --value "<text>" --reason "<why>"');
212
- process.exit(1);
217
+ throw new CliExit(1);
213
218
  }
214
219
  if (memoryId && valueFlag !== undefined) {
215
220
  // Ambiguous ask: silently preferring one form would ignore the other without feedback.
216
221
  printError('hippo reject takes EITHER a memory id OR --value, not both.');
217
- process.exit(1);
222
+ throw new CliExit(1);
218
223
  }
219
224
  try {
220
225
  const result = rejectValue({
@@ -225,31 +230,33 @@ export function cmdReject(hippoRoot, args, flags) {
225
230
  memoryId: valueFlag === undefined ? memoryId : undefined,
226
231
  value: valueFlag,
227
232
  });
228
- const digestPrefix = result.digest.slice(0, 12);
229
- const preview = result.content.length > 80 ? `${result.content.slice(0, 80)}...` : result.content;
230
- console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
231
- console.log(` Reason: ${reason}`);
232
- if (result.removedIds.length > 0) {
233
- console.log(` Removed ${result.removedIds.length} matching row(s): ${result.removedIds.join(', ')}`);
234
- if (result.successorIds.length > 0) {
235
- console.log(` Merged rows that held it keep their other texts in: ${result.successorIds.join(', ')}`);
236
- }
237
- if (result.dormantSuccessorIds.length > 0) {
238
- console.log(` Dormant merged rows that held it keep their other texts in: ${result.dormantSuccessorIds.join(', ')}`);
239
- }
233
+ printRejected(result, reason);
234
+ }
235
+ catch (err) {
236
+ printError(`Could not reject: ${errorMessage(err)}`);
237
+ throw new CliExit(1);
238
+ }
239
+ }
240
+ function printRejected(result, reason) {
241
+ const digestPrefix = result.digest.slice(0, DIGEST_DISPLAY_CHARS);
242
+ const preview = result.content.length > CONTENT_PREVIEW_CHARS ? `${result.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : result.content;
243
+ console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
244
+ console.log(` Reason: ${reason}`);
245
+ if (result.removedIds.length > 0) {
246
+ console.log(` Removed ${result.removedIds.length} matching row(s): ${result.removedIds.join(', ')}`);
247
+ if (result.successorIds.length > 0) {
248
+ console.log(` Merged rows that held it keep their other texts in: ${result.successorIds.join(', ')}`);
240
249
  }
241
- else {
242
- console.log(' No live rows matched (pre-emptive tombstone).');
250
+ if (result.dormantSuccessorIds.length > 0) {
251
+ console.log(` Dormant merged rows that held it keep their other texts in: ${result.dormantSuccessorIds.join(', ')}`);
243
252
  }
244
253
  }
245
- catch (err) {
246
- printError(`Could not reject: ${err instanceof Error ? err.message : String(err)}`);
247
- process.exit(1);
254
+ else {
255
+ console.log(' No live rows matched (pre-emptive tombstone).');
248
256
  }
249
257
  }
250
- export function cmdRejections(hippoRoot, flags) {
258
+ export function handleRejections({ hippoRoot, tenantId, flags }) {
251
259
  const root = resolveAuthRoot(hippoRoot, flags);
252
- const tenantId = resolveTenantId({});
253
260
  const rows = listRejectionsForTenant(root, tenantId);
254
261
  if (flags['json']) {
255
262
  console.log(JSON.stringify({ rejections: rows }, null, 2));
@@ -261,7 +268,7 @@ export function cmdRejections(hippoRoot, flags) {
261
268
  }
262
269
  console.log(`${rows.length} rejected value(s):\n`);
263
270
  for (const row of rows) {
264
- console.log(`--- ${row.digest.slice(0, 12)}...`);
271
+ console.log(`--- ${row.digest.slice(0, DIGEST_DISPLAY_CHARS)}...`);
265
272
  console.log(` Reason: ${row.reason ?? 'none given'}`);
266
273
  console.log(` Rejected by: ${row.rejectedBy ?? 'unknown'}`);
267
274
  console.log(` Rejected at: ${row.rejectedAt}`);
@@ -272,67 +279,35 @@ export function cmdRejections(hippoRoot, flags) {
272
279
  console.log('');
273
280
  }
274
281
  }
275
- export function cmdUnreject(hippoRoot, args, flags) {
282
+ export function handleUnreject({ hippoRoot, tenantId, args, flags }) {
276
283
  const root = resolveAuthRoot(hippoRoot, flags);
277
- const tenantId = resolveTenantId({});
278
284
  const digestOrPrefix = (args[0] ?? '').trim();
279
285
  if (!digestOrPrefix) {
280
286
  printError('Usage: hippo unreject <digest-or-prefix>');
281
- process.exit(1);
287
+ throw new CliExit(1);
282
288
  }
283
289
  const outcome = unrejectValue(root, tenantId, digestOrPrefix, 'cli');
284
290
  if (outcome.status === 'not_found') {
285
291
  printError(`No rejected value matches "${digestOrPrefix}". Run \`hippo rejections\` to list tombstones.`);
286
- process.exit(1);
292
+ throw new CliExit(1);
287
293
  }
288
294
  if (outcome.status === 'ambiguous') {
289
295
  printError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones. Use a longer prefix:`);
290
296
  for (const c of outcome.candidates) {
291
- printError(` ${c.digest.slice(0, 16)}... ${c.reason ?? 'none given'}`);
297
+ printError(` ${c.digest.slice(0, REJECTED_DIGEST_LIST_CHARS)}... ${c.reason ?? 'none given'}`);
292
298
  }
293
- process.exit(1);
299
+ throw new CliExit(1);
294
300
  }
295
- console.log(`Unrejected [${outcome.digest.slice(0, 12)}...] (was: ${outcome.reason ?? 'none given'})`);
301
+ console.log(`Unrejected [${outcome.digest.slice(0, DIGEST_DISPLAY_CHARS)}...] (was: ${outcome.reason ?? 'none given'})`);
296
302
  }
297
- /**
298
- * `hippo dormant [list] [<query>...] [--limit <n>] [--json] [--global]`,
299
- * `hippo dormant restore <id>`, `hippo dormant forget <id>`.
300
- * Dormant memories are what sleep keeps instead of deleting (on by default;
301
- * `"dormant": { "enabled": false }` in .hippo/config.json deletes instead).
302
- */
303
- export function cmdDormant(hippoRoot, args, flags) {
303
+ /** `hippo dormant [list|restore <id>|forget <id>]`: dormant memories are what sleep keeps instead of deleting
304
+ * (on by default; `"dormant": { "enabled": false }` in .hippo/config.json deletes instead). */
305
+ export function handleDormant({ hippoRoot, tenantId, args, flags }) {
304
306
  const root = resolveAuthRoot(hippoRoot, flags);
305
- const ctx = {
306
- hippoRoot: root,
307
- tenantId: resolveTenantId({}),
308
- actor: api.adminActor('cli'),
309
- };
307
+ const ctx = cliApiContext(root, tenantId);
310
308
  const sub = args[0];
311
309
  if (sub === 'restore' || sub === 'forget') {
312
- const id = (args[1] ?? '').trim();
313
- if (!id) {
314
- printError(`Usage: hippo dormant ${sub} <id>`);
315
- process.exit(1);
316
- }
317
- try {
318
- if (sub === 'restore') {
319
- api.restoreDormant(ctx, id);
320
- console.log(`Restored ${id} to active memory.`);
321
- }
322
- else {
323
- api.forgetDormant(ctx, id);
324
- console.log(`Forgot dormant memory ${id} permanently.`);
325
- }
326
- }
327
- catch (err) {
328
- if (err instanceof RejectedValueError) {
329
- printError(`Cannot restore ${id}: its value was rejected (${err.reason ?? 'no reason given'}). Run \`hippo unreject\` first to allow it.`);
330
- }
331
- else {
332
- printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
333
- }
334
- process.exit(1);
335
- }
310
+ changeDormant(ctx, sub, (args[1] ?? '').trim());
336
311
  return;
337
312
  }
338
313
  const queryArgs = sub === 'list' ? args.slice(1) : args;
@@ -345,56 +320,62 @@ export function cmdDormant(hippoRoot, args, flags) {
345
320
  console.log(JSON.stringify({ dormant: rows }, null, 2));
346
321
  return;
347
322
  }
323
+ printDormantRows(rows, queryArgs.length > 0, root);
324
+ }
325
+ function changeDormant(ctx, sub, id) {
326
+ if (!id) {
327
+ printError(`Usage: hippo dormant ${sub} <id>`);
328
+ throw new CliExit(1);
329
+ }
330
+ try {
331
+ if (sub === 'restore') {
332
+ api.restoreDormant(ctx, id);
333
+ console.log(`Restored ${id} to active memory.`);
334
+ }
335
+ else {
336
+ api.forgetDormant(ctx, id);
337
+ console.log(`Forgot dormant memory ${id} permanently.`);
338
+ }
339
+ }
340
+ catch (err) {
341
+ if (err instanceof RejectedValueError) {
342
+ printError(`Cannot restore ${id}: its value was rejected (${err.reason ?? 'no reason given'}). Run \`hippo unreject\` first to allow it.`);
343
+ }
344
+ else {
345
+ printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
346
+ }
347
+ throw new CliExit(1);
348
+ }
349
+ }
350
+ function printDormantRows(rows, hasQuery, root) {
348
351
  if (rows.length === 0) {
349
- console.log(queryArgs.length > 0 ? 'No dormant memories match.' : 'No dormant memories.');
352
+ console.log(hasQuery ? 'No dormant memories match.' : 'No dormant memories.');
350
353
  if (!loadConfig(root).dormant.enabled) {
351
354
  console.log(`Sleep deletes faded memories. To keep them dormant instead, set "dormant": { "enabled": true } in ${path.join(root, 'config.json')}.`);
352
355
  }
353
356
  return;
354
357
  }
355
- console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${queryArgs.length > 0 ? ' matching' : ''} (newest first):\n`);
358
+ console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${hasQuery ? ' matching' : ''} (newest first):\n`);
356
359
  for (const row of rows) {
357
- const preview = row.content.length > 100 ? `${row.content.slice(0, 100)}...` : row.content;
360
+ const preview = row.content.length > DORMANT_PREVIEW_CHARS ? `${row.content.slice(0, DORMANT_PREVIEW_CHARS)}...` : row.content;
358
361
  console.log(`--- ${row.id}`);
359
362
  console.log(` ${preview}`);
360
- console.log(` Dormant since ${row.dormantAt.slice(0, 10)} (${row.reason}, strength ${row.strength.toFixed(3)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
363
+ console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} (${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
361
364
  console.log('');
362
365
  }
363
366
  console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
364
367
  }
365
368
  /** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (poisoning defence). */
366
- export function cmdQuarantine(hippoRoot, args, flags) {
369
+ export async function handleQuarantine({ hippoRoot, tenantId, args, flags }) {
367
370
  const root = resolveAuthRoot(hippoRoot, flags);
368
- const ctx = {
369
- hippoRoot: root,
370
- tenantId: resolveTenantId({}),
371
- actor: api.adminActor('cli'),
372
- };
371
+ const ctx = cliApiContext(root, tenantId);
373
372
  const sub = args[0];
374
373
  if (sub === 'approve' || sub === 'reject') {
375
- const id = (args[1] ?? '').trim();
376
- if (!id) {
377
- printError(`Usage: hippo quarantine ${sub} <id>`);
378
- process.exit(1);
379
- }
380
- try {
381
- if (sub === 'approve') {
382
- api.quarantineApprove(ctx, id);
383
- console.log(`Approved ${id}: restored to its original scope.`);
384
- }
385
- else {
386
- api.quarantineReject(ctx, id);
387
- console.log(`Rejected ${id}: stays quarantined.`);
388
- }
389
- }
390
- catch (err) {
391
- printError(`Could not ${sub} ${id}: ${err instanceof Error ? err.message : String(err)}`);
392
- process.exit(1);
393
- }
374
+ await decideQuarantined(ctx, sub, (args[1] ?? '').trim());
394
375
  return;
395
376
  }
396
377
  const status = flags['all'] ? 'all' : 'pending';
397
- const rows = api.quarantineList(ctx, { status });
378
+ const rows = await api.quarantineList(ctx, { status });
398
379
  if (flags['json']) {
399
380
  console.log(JSON.stringify({ quarantine: rows }, null, 2));
400
381
  return;
@@ -403,31 +384,54 @@ export function cmdQuarantine(hippoRoot, args, flags) {
403
384
  console.log(status === 'all' ? 'No quarantined memories.' : 'No pending quarantined memories.');
404
385
  return;
405
386
  }
387
+ printQuarantineRows(rows);
388
+ }
389
+ async function decideQuarantined(ctx, sub, id) {
390
+ if (!id) {
391
+ printError(`Usage: hippo quarantine ${sub} <id>`);
392
+ throw new CliExit(1);
393
+ }
394
+ try {
395
+ if (sub === 'approve') {
396
+ await api.quarantineApprove(ctx, id);
397
+ console.log(`Approved ${id}: restored to its original scope.`);
398
+ }
399
+ else {
400
+ await api.quarantineReject(ctx, id);
401
+ console.log(`Rejected ${id}: stays quarantined.`);
402
+ }
403
+ }
404
+ catch (err) {
405
+ printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
406
+ throw new CliExit(1);
407
+ }
408
+ }
409
+ function printQuarantineRows(rows) {
406
410
  console.log(`${rows.length} quarantined memor${rows.length === 1 ? 'y' : 'ies'} (newest first):\n`);
407
411
  for (const row of rows) {
408
412
  console.log(`--- ${row.id} [${row.status}]`);
409
413
  console.log(` ${row.contentPreview}`);
410
- console.log(` ${row.reason}, original scope ${row.originalScope ?? '(none)'}, quarantined ${row.quarantinedAt.slice(0, 10)}`);
414
+ console.log(` ${row.reason}, original scope ${row.originalScope ?? '(none)'}, quarantined ${row.quarantinedAt.slice(0, DATE_PREFIX_CHARS)}`);
411
415
  console.log('');
412
416
  }
413
417
  console.log('Approve: hippo quarantine approve <id> Reject: hippo quarantine reject <id>');
414
418
  }
415
- export async function handleForget({ hippoRoot, args, flags }) {
419
+ export async function handleForget({ hippoRoot, tenantId, args, flags }) {
416
420
  const id = args[0];
417
421
  if (!id) {
418
422
  printError('Please provide a memory ID.');
419
- process.exit(1);
423
+ throw new CliExit(1);
420
424
  }
421
425
  // Archive has its own HTTP route (POST /v1/memories/:id/archive); route
422
426
  // both branches the same way the direct path does.
423
- const archive = flags['archive'] === true;
424
- const reason = typeof flags['reason'] === 'string' ? flags['reason'] : null;
427
+ const archive = flagIsTrue(flags, 'archive');
428
+ const reason = stringFlag(flags, 'reason') ?? null;
425
429
  if (archive && !reason) {
426
430
  printError(ARCHIVE_REASON_REQUIRED);
427
- process.exit(1);
431
+ throw new CliExit(1);
428
432
  }
429
- if (flags['dry-run'] === true) {
430
- previewForget(hippoRoot, id, archive);
433
+ if (flagIsTrue(flags, 'dry-run')) {
434
+ await previewForget(hippoRoot, tenantId, id, archive);
431
435
  return;
432
436
  }
433
437
  const routed = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
@@ -444,28 +448,28 @@ export async function handleForget({ hippoRoot, args, flags }) {
444
448
  catch (err) {
445
449
  // A server that died after the health probe is the caller's transport
446
450
  // fallback to handle, not an error to report to the user.
447
- if (client.classifyTransportFailure(err) !== 'none')
451
+ if (err instanceof Error && client.classifyTransportFailure(err) !== 'none')
448
452
  throw err;
449
- const msg = err instanceof Error ? err.message : String(err);
453
+ const msg = errorMessage(err);
450
454
  printError(archive ? `Could not archive ${id}: ${msg}` : msg);
451
- process.exit(1);
455
+ throw new CliExit(1);
452
456
  }
453
457
  });
454
458
  if (routed)
455
459
  return;
456
- cmdForget(hippoRoot, id, flags);
460
+ cmdForget(hippoRoot, tenantId, id, flags);
457
461
  }
458
462
  function invalidateChurn(hippoRoot, args, flags) {
459
463
  if (args[0] || flags['id'] !== undefined) {
460
464
  printError('Usage: hippo invalidate --churn [--dry-run]');
461
465
  printError('--churn takes no pattern or --id.');
462
- process.exit(1);
466
+ throw new CliExit(1);
463
467
  }
464
468
  if (!isGitRepo(process.cwd())) {
465
469
  printError('hippo invalidate --churn must run inside a git repository.');
466
- process.exit(1);
470
+ throw new CliExit(1);
467
471
  }
468
- const churnDryRun = flags['dry-run'] === true;
472
+ const churnDryRun = flagIsTrue(flags, 'dry-run');
469
473
  let churnFailed = false;
470
474
  for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
471
475
  if (result.error) {
@@ -488,34 +492,34 @@ function invalidateChurn(hippoRoot, args, flags) {
488
492
  }
489
493
  }
490
494
  if (churnFailed)
491
- process.exit(1);
495
+ throw new CliExit(1);
492
496
  }
493
- export function handleInvalidate({ hippoRoot, args, flags }) {
497
+ export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
494
498
  requireInit(hippoRoot);
495
- if (flags['churn'] === true)
499
+ if (flagIsTrue(flags, 'churn'))
496
500
  return invalidateChurn(hippoRoot, args, flags);
497
501
  const target = args[0];
498
- if (flags['id'] === true) {
502
+ if (flagIsTrue(flags, 'id')) {
499
503
  // Value-less --id must never silently fall through to pattern mode
500
504
  // (pattern mode writes broadly; an ignored --id reverses user intent).
501
505
  printError('--id requires a memory id');
502
- process.exit(1);
506
+ throw new CliExit(1);
503
507
  }
504
- const onlyId = typeof flags['id'] === 'string' ? flags['id'] : undefined;
505
- const dryRun = flags['dry-run'] === true;
508
+ const onlyId = stringFlag(flags, 'id');
509
+ const dryRun = flagIsTrue(flags, 'dry-run');
506
510
  if ((target && onlyId) || (!target && !onlyId)) {
507
511
  printError('Usage: hippo invalidate "<old pattern>" [--dry-run] [--reason "<why>"]');
508
512
  printError(' hippo invalidate --id <memory-id> [--dry-run] [--reason "<why>"]');
509
513
  printError('Pass a pattern OR --id, not both. Tag matching is EXACT: the full pattern must equal a tag.');
510
- process.exit(1);
514
+ throw new CliExit(1);
511
515
  }
512
- const reason = flags['reason'] || null;
516
+ const reason = nonEmptyStringFlag(flags, 'reason') ?? null;
513
517
  const invTarget = {
514
518
  from: target ?? `id:${onlyId}`,
515
519
  to: reason,
516
520
  type: 'migration',
517
521
  };
518
- const result = invalidateMatching(hippoRoot, invTarget, resolveTenantId({}), { dryRun, onlyId });
522
+ const result = invalidateMatching(hippoRoot, invTarget, tenantId, { dryRun, onlyId });
519
523
  const label = target ? `"${target}"` : `--id ${onlyId}`;
520
524
  if (result.dryRun) {
521
525
  if (result.invalidated === 0) {