hippo-memory 1.70.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,39 +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
4
  import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
6
5
  import { RejectedValueError } from '../store/rejection.js';
7
6
  import { loadConfig } from '../core/config.js';
7
+ import { RawAppendOnlyError } from '../core/raw-append-only.js';
8
8
  import { isGitRepo } from '../learn/autolearn.js';
9
9
  import { invalidateMatching } from '../learn/invalidation.js';
10
10
  import * as api from '../api/index.js';
11
+ import { getMemory } from '../api/memories.js';
11
12
  import * as client from './client.js';
12
- import { resolveTenantId } from '../store/tenant.js';
13
+ import { cliApiContext } from './api-context.js';
13
14
  import { printError } from './output.js';
14
- import { parseCountFlag, boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
15
+ import { parseCountFlag, boolFlag, flagIsTrue, nonEmptyStringFlag, stringFlag } from './flag-values.js';
15
16
  import { requireInit, runChurnStaleForRepo, runViaServerIfAvailable, resolveAuthRoot } from './shared.js';
16
17
  import { fmt } from './print.js';
17
18
  import { errorMessage } from '../util/log.js';
18
19
  import { DIGEST_DISPLAY_CHARS, CONTENT_PREVIEW_CHARS, DATE_PREFIX_CHARS } from '../util/token-text.js';
20
+ import { CliExit } from './exit.js';
19
21
  const CONFLICT_PREVIEW_CHARS = 120;
20
22
  const REJECTED_DIGEST_LIST_CHARS = 16;
21
23
  const DORMANT_PREVIEW_CHARS = 100;
22
24
  const STRENGTH_DECIMALS = 3;
23
- export function cmdOutcome(hippoRoot, flags) {
25
+ export function handleOutcome({ hippoRoot, tenantId, flags }) {
24
26
  requireInit(hippoRoot);
25
27
  const good = boolFlag(flags, 'good');
26
28
  const bad = boolFlag(flags, 'bad');
27
29
  if (!good && !bad) {
28
30
  printError('Specify --good or --bad');
29
- process.exit(1);
31
+ throw new CliExit(1);
30
32
  }
31
33
  // Through api.outcome so every CLI outcome writes one audit_log row per id, as the MCP path does.
32
- const ctx = {
33
- hippoRoot,
34
- tenantId: resolveTenantId({}),
35
- actor: api.adminActor('cli'),
36
- };
34
+ const ctx = cliApiContext(hippoRoot, tenantId);
37
35
  const specificId = flags['id'] ? String(flags['id']) : null;
38
36
  let updated;
39
37
  if (specificId) {
@@ -51,16 +49,11 @@ export function cmdOutcome(hippoRoot, flags) {
51
49
  }
52
50
  // Shared between the forget dispatch and cmdForget so the message can't drift.
53
51
  const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
54
- function cmdForget(hippoRoot, id, flags) {
52
+ function cmdForget(hippoRoot, tenantId, id, flags) {
55
53
  requireInit(hippoRoot);
56
- const ctx = {
57
- hippoRoot,
58
- tenantId: resolveTenantId({}),
59
- actor: api.adminActor('cli'),
60
- };
61
- // Raw memories (Slack / GitHub connector ingestion) are append-only: a
62
- // BEFORE-DELETE trigger aborts any delete. archiveRaw is the sanctioned
63
- // removal path; it records ctx.actor as the archiver for provenance.
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.
64
57
  if (flagIsTrue(flags, 'archive')) {
65
58
  archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
66
59
  return;
@@ -70,14 +63,14 @@ function cmdForget(hippoRoot, id, flags) {
70
63
  console.log(`Forgot ${id}`);
71
64
  }
72
65
  catch (err) {
73
- reportForgetFailure(ctx, id, errorMessage(err));
74
- process.exit(1);
66
+ reportForgetFailure(ctx, id, err);
67
+ throw new CliExit(1);
75
68
  }
76
69
  }
77
70
  function archiveForgottenRaw(ctx, id, reason) {
78
71
  if (!reason) {
79
72
  printError(ARCHIVE_REASON_REQUIRED);
80
- process.exit(1);
73
+ throw new CliExit(1);
81
74
  }
82
75
  try {
83
76
  api.archiveRaw(ctx, id, reason);
@@ -85,11 +78,11 @@ function archiveForgottenRaw(ctx, id, reason) {
85
78
  }
86
79
  catch (err) {
87
80
  printError(`Could not archive ${id}: ${errorMessage(err)}`);
88
- process.exit(1);
81
+ throw new CliExit(1);
89
82
  }
90
83
  }
91
- function reportForgetFailure(ctx, id, msg) {
92
- if (/append-only/i.test(msg)) {
84
+ function reportForgetFailure(ctx, id, cause) {
85
+ if (cause instanceof RawAppendOnlyError) {
93
86
  // The delete was refused by the append-only trigger — this is a raw
94
87
  // memory, not a missing one. Point the user at the archive path.
95
88
  printError(rawForgetRefusal(id));
@@ -108,25 +101,25 @@ function rawForgetRefusal(id) {
108
101
  return `Cannot forget ${id}: it is a raw, append-only memory. Archive it instead: hippo forget ${id} --archive --reason "<why>"`;
109
102
  }
110
103
  // Refuses exactly where the real run would, so "Would forget" is a promise, not a guess.
111
- function previewForget(hippoRoot, id, archive) {
104
+ async function previewForget(hippoRoot, tenantId, id, archive) {
112
105
  requireInit(hippoRoot);
113
- const entry = readEntry(hippoRoot, id, resolveTenantId({}));
106
+ const entry = await getMemory(cliApiContext(hippoRoot, tenantId), id);
114
107
  if (!entry) {
115
108
  printError(`Memory not found: ${id}`);
116
- process.exit(1);
109
+ throw new CliExit(1);
117
110
  }
118
111
  if (!archive && entry.kind === 'raw') {
119
112
  printError(rawForgetRefusal(id));
120
- process.exit(1);
113
+ throw new CliExit(1);
121
114
  }
122
115
  if (archive && entry.kind !== 'raw') {
123
116
  printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
124
- process.exit(1);
117
+ throw new CliExit(1);
125
118
  }
126
119
  const snippet = entry.content.length > CONTENT_PREVIEW_CHARS ? `${entry.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : entry.content;
127
120
  console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
128
121
  }
129
- export function cmdConflicts(hippoRoot, flags) {
122
+ export function handleConflicts({ hippoRoot, flags }) {
130
123
  requireInit(hippoRoot);
131
124
  const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
132
125
  if (flags['json']) {
@@ -146,19 +139,20 @@ export function cmdConflicts(hippoRoot, flags) {
146
139
  }
147
140
  }
148
141
  /** Shown when --keep is missing, to help the user decide. */
149
- function showConflictForResolve(hippoRoot, conflictId, tenantId) {
142
+ async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
150
143
  const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
151
144
  const conflict = conflicts.find((c) => c.id === conflictId);
152
145
  if (!conflict) {
153
146
  printError(`Conflict ${conflictId} not found or already resolved.`);
154
- process.exit(1);
147
+ throw new CliExit(1);
155
148
  }
156
149
  console.log(`Conflict ${conflictId}:`);
157
150
  console.log(` ${conflict.memory_a_id} <-> ${conflict.memory_b_id}`);
158
151
  console.log(` Reason: ${conflict.reason}`);
159
152
  console.log('');
160
- const entryA = readEntry(hippoRoot, conflict.memory_a_id, tenantId);
161
- const entryB = readEntry(hippoRoot, conflict.memory_b_id, tenantId);
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);
162
156
  if (entryA) {
163
157
  console.log(` [A] ${conflict.memory_a_id}:`);
164
158
  console.log(` ${entryA.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryA.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
@@ -170,19 +164,18 @@ function showConflictForResolve(hippoRoot, conflictId, tenantId) {
170
164
  console.log('');
171
165
  console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
172
166
  }
173
- export function cmdResolve(hippoRoot, args, flags) {
167
+ export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
174
168
  requireInit(hippoRoot);
175
169
  const rawId = args[0] ?? '';
176
170
  // Accept "42" or "conflict_42"
177
171
  const conflictId = parseInt(rawId.replace(/^conflict_/, ''), 10);
178
172
  if (isNaN(conflictId)) {
179
173
  printError('Usage: hippo resolve <conflict_id> --keep <memory_id> [--forget]');
180
- process.exit(1);
174
+ throw new CliExit(1);
181
175
  }
182
- const tenantId = resolveTenantId({});
183
176
  const keepId = String(flags['keep'] ?? '').trim();
184
177
  if (!keepId) {
185
- showConflictForResolve(hippoRoot, conflictId, tenantId);
178
+ await showConflictForResolve(hippoRoot, conflictId, tenantId);
186
179
  return;
187
180
  }
188
181
  const forgetLoser = boolFlag(flags, 'forget');
@@ -196,7 +189,7 @@ export function cmdResolve(hippoRoot, args, flags) {
196
189
  });
197
190
  if (!result) {
198
191
  printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
199
- process.exit(1);
192
+ throw new CliExit(1);
200
193
  }
201
194
  const action = rejectLoser
202
195
  ? 'rejected (tombstoned) and removed'
@@ -205,31 +198,28 @@ export function cmdResolve(hippoRoot, args, flags) {
205
198
  : 'weakened (half-life halved)';
206
199
  console.log(`Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`);
207
200
  }
208
- // ---------------------------------------------------------------------------
209
201
  // reject / rejections / unreject
210
- // ---------------------------------------------------------------------------
211
- export function cmdReject(hippoRoot, args, flags) {
202
+ export function handleReject({ hippoRoot, tenantId, args, flags }) {
212
203
  // Store resolution mirrors `hippo remember`: --global writes to the
213
204
  // global store, otherwise the local store (requireInit'd via resolveAuthRoot).
214
205
  const root = resolveAuthRoot(hippoRoot, flags);
215
- const tenantId = resolveTenantId({});
216
206
  // --reason is REQUIRED: the tombstone stores no content, so reason is its only human-readable identity.
217
207
  const reason = (stringFlag(flags, 'reason') ?? '').trim();
218
208
  if (!reason) {
219
209
  printError('hippo reject requires --reason "<why>" (the tombstone stores no content; reason is its only identity).');
220
- process.exit(1);
210
+ throw new CliExit(1);
221
211
  }
222
212
  const valueFlag = stringFlag(flags, 'value');
223
213
  const memoryId = args[0];
224
214
  if (!memoryId && valueFlag === undefined) {
225
215
  printError('Usage: hippo reject <memory-id> --reason "<why>"');
226
216
  printError(' or: hippo reject --value "<text>" --reason "<why>"');
227
- process.exit(1);
217
+ throw new CliExit(1);
228
218
  }
229
219
  if (memoryId && valueFlag !== undefined) {
230
220
  // Ambiguous ask: silently preferring one form would ignore the other without feedback.
231
221
  printError('hippo reject takes EITHER a memory id OR --value, not both.');
232
- process.exit(1);
222
+ throw new CliExit(1);
233
223
  }
234
224
  try {
235
225
  const result = rejectValue({
@@ -244,7 +234,7 @@ export function cmdReject(hippoRoot, args, flags) {
244
234
  }
245
235
  catch (err) {
246
236
  printError(`Could not reject: ${errorMessage(err)}`);
247
- process.exit(1);
237
+ throw new CliExit(1);
248
238
  }
249
239
  }
250
240
  function printRejected(result, reason) {
@@ -265,9 +255,8 @@ function printRejected(result, reason) {
265
255
  console.log(' No live rows matched (pre-emptive tombstone).');
266
256
  }
267
257
  }
268
- export function cmdRejections(hippoRoot, flags) {
258
+ export function handleRejections({ hippoRoot, tenantId, flags }) {
269
259
  const root = resolveAuthRoot(hippoRoot, flags);
270
- const tenantId = resolveTenantId({});
271
260
  const rows = listRejectionsForTenant(root, tenantId);
272
261
  if (flags['json']) {
273
262
  console.log(JSON.stringify({ rejections: rows }, null, 2));
@@ -290,41 +279,32 @@ export function cmdRejections(hippoRoot, flags) {
290
279
  console.log('');
291
280
  }
292
281
  }
293
- export function cmdUnreject(hippoRoot, args, flags) {
282
+ export function handleUnreject({ hippoRoot, tenantId, args, flags }) {
294
283
  const root = resolveAuthRoot(hippoRoot, flags);
295
- const tenantId = resolveTenantId({});
296
284
  const digestOrPrefix = (args[0] ?? '').trim();
297
285
  if (!digestOrPrefix) {
298
286
  printError('Usage: hippo unreject <digest-or-prefix>');
299
- process.exit(1);
287
+ throw new CliExit(1);
300
288
  }
301
289
  const outcome = unrejectValue(root, tenantId, digestOrPrefix, 'cli');
302
290
  if (outcome.status === 'not_found') {
303
291
  printError(`No rejected value matches "${digestOrPrefix}". Run \`hippo rejections\` to list tombstones.`);
304
- process.exit(1);
292
+ throw new CliExit(1);
305
293
  }
306
294
  if (outcome.status === 'ambiguous') {
307
295
  printError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones. Use a longer prefix:`);
308
296
  for (const c of outcome.candidates) {
309
297
  printError(` ${c.digest.slice(0, REJECTED_DIGEST_LIST_CHARS)}... ${c.reason ?? 'none given'}`);
310
298
  }
311
- process.exit(1);
299
+ throw new CliExit(1);
312
300
  }
313
301
  console.log(`Unrejected [${outcome.digest.slice(0, DIGEST_DISPLAY_CHARS)}...] (was: ${outcome.reason ?? 'none given'})`);
314
302
  }
315
- /**
316
- * `hippo dormant [list] [<query>...] [--limit <n>] [--json] [--global]`,
317
- * `hippo dormant restore <id>`, `hippo dormant forget <id>`.
318
- * Dormant memories are what sleep keeps instead of deleting (on by default;
319
- * `"dormant": { "enabled": false }` in .hippo/config.json deletes instead).
320
- */
321
- 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 }) {
322
306
  const root = resolveAuthRoot(hippoRoot, flags);
323
- const ctx = {
324
- hippoRoot: root,
325
- tenantId: resolveTenantId({}),
326
- actor: api.adminActor('cli'),
327
- };
307
+ const ctx = cliApiContext(root, tenantId);
328
308
  const sub = args[0];
329
309
  if (sub === 'restore' || sub === 'forget') {
330
310
  changeDormant(ctx, sub, (args[1] ?? '').trim());
@@ -345,7 +325,7 @@ export function cmdDormant(hippoRoot, args, flags) {
345
325
  function changeDormant(ctx, sub, id) {
346
326
  if (!id) {
347
327
  printError(`Usage: hippo dormant ${sub} <id>`);
348
- process.exit(1);
328
+ throw new CliExit(1);
349
329
  }
350
330
  try {
351
331
  if (sub === 'restore') {
@@ -364,7 +344,7 @@ function changeDormant(ctx, sub, id) {
364
344
  else {
365
345
  printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
366
346
  }
367
- process.exit(1);
347
+ throw new CliExit(1);
368
348
  }
369
349
  }
370
350
  function printDormantRows(rows, hasQuery, root) {
@@ -386,13 +366,9 @@ function printDormantRows(rows, hasQuery, root) {
386
366
  console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
387
367
  }
388
368
  /** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (poisoning defence). */
389
- export async function cmdQuarantine(hippoRoot, args, flags) {
369
+ export async function handleQuarantine({ hippoRoot, tenantId, args, flags }) {
390
370
  const root = resolveAuthRoot(hippoRoot, flags);
391
- const ctx = {
392
- hippoRoot: root,
393
- tenantId: resolveTenantId({}),
394
- actor: api.adminActor('cli'),
395
- };
371
+ const ctx = cliApiContext(root, tenantId);
396
372
  const sub = args[0];
397
373
  if (sub === 'approve' || sub === 'reject') {
398
374
  await decideQuarantined(ctx, sub, (args[1] ?? '').trim());
@@ -413,7 +389,7 @@ export async function cmdQuarantine(hippoRoot, args, flags) {
413
389
  async function decideQuarantined(ctx, sub, id) {
414
390
  if (!id) {
415
391
  printError(`Usage: hippo quarantine ${sub} <id>`);
416
- process.exit(1);
392
+ throw new CliExit(1);
417
393
  }
418
394
  try {
419
395
  if (sub === 'approve') {
@@ -427,7 +403,7 @@ async function decideQuarantined(ctx, sub, id) {
427
403
  }
428
404
  catch (err) {
429
405
  printError(`Could not ${sub} ${id}: ${errorMessage(err)}`);
430
- process.exit(1);
406
+ throw new CliExit(1);
431
407
  }
432
408
  }
433
409
  function printQuarantineRows(rows) {
@@ -440,11 +416,11 @@ function printQuarantineRows(rows) {
440
416
  }
441
417
  console.log('Approve: hippo quarantine approve <id> Reject: hippo quarantine reject <id>');
442
418
  }
443
- export async function handleForget({ hippoRoot, args, flags }) {
419
+ export async function handleForget({ hippoRoot, tenantId, args, flags }) {
444
420
  const id = args[0];
445
421
  if (!id) {
446
422
  printError('Please provide a memory ID.');
447
- process.exit(1);
423
+ throw new CliExit(1);
448
424
  }
449
425
  // Archive has its own HTTP route (POST /v1/memories/:id/archive); route
450
426
  // both branches the same way the direct path does.
@@ -452,10 +428,10 @@ export async function handleForget({ hippoRoot, args, flags }) {
452
428
  const reason = stringFlag(flags, 'reason') ?? null;
453
429
  if (archive && !reason) {
454
430
  printError(ARCHIVE_REASON_REQUIRED);
455
- process.exit(1);
431
+ throw new CliExit(1);
456
432
  }
457
433
  if (flagIsTrue(flags, 'dry-run')) {
458
- previewForget(hippoRoot, id, archive);
434
+ await previewForget(hippoRoot, tenantId, id, archive);
459
435
  return;
460
436
  }
461
437
  const routed = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
@@ -472,26 +448,26 @@ export async function handleForget({ hippoRoot, args, flags }) {
472
448
  catch (err) {
473
449
  // A server that died after the health probe is the caller's transport
474
450
  // fallback to handle, not an error to report to the user.
475
- if (client.classifyTransportFailure(err) !== 'none')
451
+ if (err instanceof Error && client.classifyTransportFailure(err) !== 'none')
476
452
  throw err;
477
453
  const msg = errorMessage(err);
478
454
  printError(archive ? `Could not archive ${id}: ${msg}` : msg);
479
- process.exit(1);
455
+ throw new CliExit(1);
480
456
  }
481
457
  });
482
458
  if (routed)
483
459
  return;
484
- cmdForget(hippoRoot, id, flags);
460
+ cmdForget(hippoRoot, tenantId, id, flags);
485
461
  }
486
462
  function invalidateChurn(hippoRoot, args, flags) {
487
463
  if (args[0] || flags['id'] !== undefined) {
488
464
  printError('Usage: hippo invalidate --churn [--dry-run]');
489
465
  printError('--churn takes no pattern or --id.');
490
- process.exit(1);
466
+ throw new CliExit(1);
491
467
  }
492
468
  if (!isGitRepo(process.cwd())) {
493
469
  printError('hippo invalidate --churn must run inside a git repository.');
494
- process.exit(1);
470
+ throw new CliExit(1);
495
471
  }
496
472
  const churnDryRun = flagIsTrue(flags, 'dry-run');
497
473
  let churnFailed = false;
@@ -516,9 +492,9 @@ function invalidateChurn(hippoRoot, args, flags) {
516
492
  }
517
493
  }
518
494
  if (churnFailed)
519
- process.exit(1);
495
+ throw new CliExit(1);
520
496
  }
521
- export function handleInvalidate({ hippoRoot, args, flags }) {
497
+ export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
522
498
  requireInit(hippoRoot);
523
499
  if (flagIsTrue(flags, 'churn'))
524
500
  return invalidateChurn(hippoRoot, args, flags);
@@ -527,7 +503,7 @@ export function handleInvalidate({ hippoRoot, args, flags }) {
527
503
  // Value-less --id must never silently fall through to pattern mode
528
504
  // (pattern mode writes broadly; an ignored --id reverses user intent).
529
505
  printError('--id requires a memory id');
530
- process.exit(1);
506
+ throw new CliExit(1);
531
507
  }
532
508
  const onlyId = stringFlag(flags, 'id');
533
509
  const dryRun = flagIsTrue(flags, 'dry-run');
@@ -535,15 +511,15 @@ export function handleInvalidate({ hippoRoot, args, flags }) {
535
511
  printError('Usage: hippo invalidate "<old pattern>" [--dry-run] [--reason "<why>"]');
536
512
  printError(' hippo invalidate --id <memory-id> [--dry-run] [--reason "<why>"]');
537
513
  printError('Pass a pattern OR --id, not both. Tag matching is EXACT: the full pattern must equal a tag.');
538
- process.exit(1);
514
+ throw new CliExit(1);
539
515
  }
540
- const reason = (flags['reason'] || null);
516
+ const reason = nonEmptyStringFlag(flags, 'reason') ?? null;
541
517
  const invTarget = {
542
518
  from: target ?? `id:${onlyId}`,
543
519
  to: reason,
544
520
  type: 'migration',
545
521
  };
546
- const result = invalidateMatching(hippoRoot, invTarget, resolveTenantId({}), { dryRun, onlyId });
522
+ const result = invalidateMatching(hippoRoot, invTarget, tenantId, { dryRun, onlyId });
547
523
  const label = target ? `"${target}"` : `--id ${onlyId}`;
548
524
  if (result.dryRun) {
549
525
  if (result.invalidated === 0) {
package/dist/cli/dag.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type CliFlags, type CommandContext } from './flag-values.js';
2
- export declare function cmdDag(hippoRoot: string, flags: CliFlags): void;
3
- export declare function handleDrill({ hippoRoot, args, flags }: CommandContext): Promise<void>;
4
- export declare function handleAssemble({ hippoRoot, args, flags }: CommandContext): Promise<void>;
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleDag({ hippoRoot, flags }: CommandContext): void;
3
+ export declare function handleDrill({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
+ export declare function handleAssemble({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
5
5
  //# sourceMappingURL=dag.d.ts.map
package/dist/cli/dag.js CHANGED
@@ -1,19 +1,19 @@
1
1
  // DAG summary verbs: `hippo dag`, `hippo assemble` and `hippo drill`.
2
2
  import { loadAllEntries } from '../store/entry-reads.js';
3
3
  import * as api from '../api/index.js';
4
- import { resolveTenantId } from '../store/tenant.js';
5
4
  import { assembleCost, assembleHeading, drillCost, settleTokens } from '../api/context-render.js';
6
5
  import { printError } from './output.js';
7
6
  import { parseBudgetFlag, flagIsTrue, stringFlag, numberFlag } from './flag-values.js';
8
7
  import { requireInit } from './shared.js';
9
8
  import { captureConsole } from './print.js';
10
9
  import { CONTENT_PREVIEW_CHARS } from '../util/token-text.js';
10
+ import { CliExit } from './exit.js';
11
11
  const TREE_CHILD_PREVIEW_CHARS = 70;
12
12
  const TREE_LEAF_PREVIEW_CHARS = 60;
13
13
  const DAG_HEAD_CHARS = 120;
14
14
  const DAG_SUMMARY_PREVIEW_CHARS = 200;
15
15
  const DAG_CHILD_PREVIEW_CHARS = 100;
16
- export function cmdDag(hippoRoot, flags) {
16
+ export function handleDag({ hippoRoot, flags }) {
17
17
  requireInit(hippoRoot);
18
18
  const entries = loadAllEntries(hippoRoot);
19
19
  const isStats = flagIsTrue(flags, 'stats');
@@ -86,7 +86,7 @@ function printDagTree(entries) {
86
86
  }
87
87
  }
88
88
  }
89
- async function cmdAssemble(hippoRoot, sessionId, flags) {
89
+ async function cmdAssemble(hippoRoot, tenantId, sessionId, flags) {
90
90
  requireInit(hippoRoot);
91
91
  // Absent stays undefined so the api default applies; the 0 fallback is unreachable.
92
92
  const budget = flags['budget'] === undefined ? undefined : parseBudgetFlag(flags['budget'], 0);
@@ -95,16 +95,19 @@ async function cmdAssemble(hippoRoot, sessionId, flags) {
95
95
  const scope = stringFlag(flags, 'scope') || undefined;
96
96
  const ctx = {
97
97
  hippoRoot,
98
- tenantId: resolveTenantId({}),
98
+ tenantId,
99
99
  actor: api.adminActor('cli:assemble'),
100
100
  };
101
- const r = await api.assemble(ctx, sessionId, {
102
- ...(Number.isFinite(budget) && budget > 0 ? { budget } : {}),
103
- ...(Number.isFinite(freshTailCount) && freshTailCount >= 0 ? { freshTailCount } : {}),
104
- summarizeOlder,
105
- ...(scope !== undefined ? { scope } : {}),
106
- cost: assembleCost(sessionId),
107
- });
101
+ const opts = {};
102
+ if (Number.isFinite(budget) && budget > 0)
103
+ opts.budget = budget;
104
+ if (Number.isFinite(freshTailCount) && freshTailCount >= 0)
105
+ opts.freshTailCount = freshTailCount;
106
+ opts.summarizeOlder = summarizeOlder;
107
+ if (scope !== undefined)
108
+ opts.scope = scope;
109
+ opts.cost = assembleCost(sessionId);
110
+ const r = await api.assemble(ctx, sessionId, opts);
108
111
  if (flags['json']) {
109
112
  console.log(JSON.stringify(r, null, 2));
110
113
  return;
@@ -118,7 +121,7 @@ async function cmdAssemble(hippoRoot, sessionId, flags) {
118
121
  }
119
122
  })));
120
123
  }
121
- async function cmdDrillDown(hippoRoot, summaryId, flags) {
124
+ async function cmdDrillDown(hippoRoot, tenantId, summaryId, flags) {
122
125
  requireInit(hippoRoot);
123
126
  const limit = numberFlag(flags, 'limit');
124
127
  // Absent stays undefined so the api default applies; the 0 fallback is unreachable.
@@ -129,21 +132,24 @@ async function cmdDrillDown(hippoRoot, summaryId, flags) {
129
132
  if (rawDepth !== undefined) {
130
133
  if (!Number.isInteger(rawDepth) || rawDepth < 1 || rawDepth > 10) {
131
134
  printError(`--depth must be an integer between 1 and 10 (got ${flags['depth']})`);
132
- process.exit(2);
135
+ throw new CliExit(2);
133
136
  }
134
137
  depth = rawDepth;
135
138
  }
136
139
  const ctx = {
137
140
  hippoRoot,
138
- tenantId: resolveTenantId({}),
141
+ tenantId,
139
142
  actor: api.adminActor('cli:drill'),
140
143
  };
141
- const r = await api.drillDown(ctx, summaryId, {
142
- ...(Number.isFinite(limit) && limit > 0 ? { limit } : {}),
143
- ...(Number.isFinite(budget) && budget > 0 ? { budget } : {}),
144
- ...(depth !== undefined ? { depth } : {}),
145
- cost: drillCost,
146
- });
144
+ const opts = {};
145
+ if (Number.isFinite(limit) && limit > 0)
146
+ opts.limit = limit;
147
+ if (Number.isFinite(budget) && budget > 0)
148
+ opts.budget = budget;
149
+ if (depth !== undefined)
150
+ opts.depth = depth;
151
+ opts.cost = drillCost;
152
+ const r = await api.drillDown(ctx, summaryId, opts);
147
153
  if ('failure' in r) {
148
154
  // Only `not_drillable` is caller-actionable. `not_found` collapses cross-tenant, scope-blocked
149
155
  // and missing on purpose: telling scope_blocked apart would leak that the row exists.
@@ -153,7 +159,7 @@ async function cmdDrillDown(hippoRoot, summaryId, flags) {
153
159
  else {
154
160
  printError(`No drillable summary at id=${summaryId}.`);
155
161
  }
156
- process.exit(1);
162
+ throw new CliExit(1);
157
163
  }
158
164
  if (flags['json']) {
159
165
  console.log(JSON.stringify(r, null, 2));
@@ -166,20 +172,20 @@ async function cmdDrillDown(hippoRoot, summaryId, flags) {
166
172
  console.log(` [L${c.dagLevel}] ${c.id} — ${c.content.slice(0, DAG_CHILD_PREVIEW_CHARS)}${c.content.length > DAG_CHILD_PREVIEW_CHARS ? '…' : ''}`);
167
173
  }
168
174
  }
169
- export async function handleDrill({ hippoRoot, args, flags }) {
175
+ export async function handleDrill({ hippoRoot, tenantId, args, flags }) {
170
176
  const summaryId = args[0];
171
177
  if (!summaryId) {
172
178
  printError('Usage: hippo drill <summary-id> [--limit N] [--budget N]');
173
- process.exit(1);
179
+ throw new CliExit(1);
174
180
  }
175
- await cmdDrillDown(hippoRoot, summaryId, flags);
181
+ await cmdDrillDown(hippoRoot, tenantId, summaryId, flags);
176
182
  }
177
- export async function handleAssemble({ hippoRoot, args, flags }) {
183
+ export async function handleAssemble({ hippoRoot, tenantId, args, flags }) {
178
184
  const sessionId = stringFlag(flags, 'session') ?? args[0];
179
185
  if (!sessionId) {
180
186
  printError('Usage: hippo assemble --session <id> [--budget N] [--fresh-tail N] [--no-summarize-older] [--json]');
181
- process.exit(1);
187
+ throw new CliExit(1);
182
188
  }
183
- await cmdAssemble(hippoRoot, sessionId, flags);
189
+ await cmdAssemble(hippoRoot, tenantId, sessionId, flags);
184
190
  }
185
191
  //# sourceMappingURL=dag.js.map
@@ -1,5 +1,5 @@
1
- import { type CliFlags } from './flag-values.js';
2
- export declare function cmdPredict(hippoRoot: string, args: string[], flags: CliFlags): void;
3
- export declare function cmdDecide(hippoRoot: string, args: string[], flags: CliFlags): void;
4
- export declare function cmdIncident(hippoRoot: string, args: string[], flags: CliFlags): void;
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handlePredict({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
+ export declare function handleDecide({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
+ export declare function handleIncident({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
5
  //# sourceMappingURL=decisions.d.ts.map