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,16 +1,16 @@
1
1
  // First-class object verbs for predictions, decisions and incidents.
2
- import { writeEntry } from '../store/entry-writes.js';
3
- import { readEntry } from '../store/entry-reads.js';
2
+ import { getMemory } from '../api/memories.js';
4
3
  import { extractPathTags } from '../search/path-context.js';
5
4
  import * as predictionsModule from '../store/predictions.js';
6
5
  import * as decisionsModule from '../objects/decisions.js';
7
6
  import * as incidentsModule from '../objects/incidents.js';
8
- import { resolveTenantId } from '../store/tenant.js';
9
7
  import { printError } from './output.js';
10
- import { nonEmptyStringFlag, parseListLimit, flagIsTrue, stringFlag } from './flag-values.js';
8
+ import { nonEmptyStringFlag, parseListLimit, flagIsTrue, isStringFlag, stringFlag } from './flag-values.js';
11
9
  import { requireInit } from './shared.js';
10
+ import { cliApiContext } from './api-context.js';
12
11
  import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail, requireStatus } from './object-verbs.js';
13
12
  import { errorMessage } from '../util/log.js';
13
+ import { CliExit } from './exit.js';
14
14
  const BASERATE_DECIMALS = 3;
15
15
  const DECISION = { cmd: 'decide', noun: 'Decision', idLabel: 'decision' };
16
16
  const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
@@ -20,28 +20,28 @@ function parseObjectId(idRaw, noun) {
20
20
  const id = parseInt(String(idRaw), 10);
21
21
  if (!Number.isFinite(id) || id <= 0) {
22
22
  printError(`Invalid ${noun} id: "${idRaw}"`);
23
- process.exit(1);
23
+ throw new CliExit(1);
24
24
  }
25
25
  return id;
26
26
  }
27
- // ---------------------------------------------------------------------------
28
27
  // Prediction first-class object
29
- // ---------------------------------------------------------------------------
30
28
  function predictClose(hippoRoot, tenantId, args, flags) {
31
29
  const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
32
30
  const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
31
+ // SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
33
32
  if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
34
33
  printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
35
- process.exit(1);
34
+ throw new CliExit(1);
36
35
  }
37
36
  const actualRaw = flags['actual'];
38
37
  const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
39
38
  if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
40
39
  printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
41
- process.exit(1);
40
+ throw new CliExit(1);
42
41
  }
43
42
  const closureNote = stringFlag(flags, 'note');
44
43
  const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
44
+ // SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES.
45
45
  closureState: stateRaw,
46
46
  actualValue,
47
47
  closureNote,
@@ -64,7 +64,7 @@ function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
64
64
  if (!classTag) {
65
65
  // status filter without class — scan all classes is more complex; v1 requires --class for non-default status
66
66
  printError('--status filter (non-open) requires --class to be set.');
67
- process.exit(1);
67
+ throw new CliExit(1);
68
68
  }
69
69
  return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
70
70
  closureState,
@@ -117,7 +117,7 @@ function predictBaserate(hippoRoot, tenantId, flags) {
117
117
  const classTag = stringFlag(flags, 'class')?.trim();
118
118
  if (!classTag) {
119
119
  printError('Usage: hippo predict baserate --class <c>');
120
- process.exit(1);
120
+ throw new CliExit(1);
121
121
  }
122
122
  const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTag);
123
123
  if (baserate.nClosed === 0) {
@@ -140,9 +140,8 @@ function predictBaserate(hippoRoot, tenantId, flags) {
140
140
  if (baserate.mae !== null)
141
141
  console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
142
142
  }
143
- export function cmdPredict(hippoRoot, args, flags) {
143
+ export function handlePredict({ hippoRoot, tenantId, args, flags }) {
144
144
  requireInit(hippoRoot);
145
- const tenantId = resolveTenantId({});
146
145
  const subcommand = args[0] ?? '';
147
146
  if (subcommand === 'close')
148
147
  return predictClose(hippoRoot, tenantId, args, flags);
@@ -161,18 +160,18 @@ function predictCreate(hippoRoot, tenantId, claimText, flags) {
161
160
  printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
162
161
  printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
163
162
  printError(' hippo predict show <id>');
164
- process.exit(1);
163
+ throw new CliExit(1);
165
164
  }
166
165
  const classTag = stringFlag(flags, 'class')?.trim();
167
166
  if (!classTag) {
168
167
  printError('--class is required for prediction creation.');
169
- process.exit(1);
168
+ throw new CliExit(1);
170
169
  }
171
170
  const estimateRaw = flags['estimate'];
172
171
  const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
173
172
  if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
174
173
  printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
175
- process.exit(1);
174
+ throw new CliExit(1);
176
175
  }
177
176
  const estimateUnit = stringFlag(flags, 'unit');
178
177
  const targetDate = stringFlag(flags, 'target');
@@ -215,9 +214,8 @@ function decideGet(hippoRoot, tenantId, args) {
215
214
  function decideClose(hippoRoot, tenantId, args) {
216
215
  closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id), parseObjectId);
217
216
  }
218
- export function cmdDecide(hippoRoot, args, flags) {
217
+ export async function handleDecide({ hippoRoot, tenantId, args, flags }) {
219
218
  requireInit(hippoRoot);
220
- const tenantId = resolveTenantId({});
221
219
  const subcommand = args[0] ?? '';
222
220
  if (subcommand === 'list')
223
221
  return decideList(hippoRoot, tenantId, flags);
@@ -226,9 +224,9 @@ export function cmdDecide(hippoRoot, args, flags) {
226
224
  if (subcommand === 'close')
227
225
  return decideClose(hippoRoot, tenantId, args);
228
226
  // Default subcommand: create. args[0] is the decision text.
229
- decideCreate(hippoRoot, tenantId, subcommand, flags);
227
+ await decideCreate(hippoRoot, tenantId, subcommand, flags);
230
228
  }
231
- function decideCreate(hippoRoot, tenantId, decisionText, flags) {
229
+ async function decideCreate(hippoRoot, tenantId, decisionText, flags) {
232
230
  if (!decisionText)
233
231
  exitWithDecideUsage();
234
232
  const context = nonEmptyStringFlag(flags, 'context');
@@ -236,21 +234,18 @@ function decideCreate(hippoRoot, tenantId, decisionText, flags) {
236
234
  // than silently creating a non-superseding decision.
237
235
  if (flagIsTrue(flags, 'supersedes')) {
238
236
  printError('--supersedes requires a memory id, e.g. hippo decide "<text>" --supersedes mem_abc123.');
239
- process.exit(1);
237
+ throw new CliExit(1);
240
238
  }
241
239
  const supersedesMemId = stringFlag(flags, 'supersedes') ?? null;
242
- // Backward-compat: --supersedes takes a MEMORY id. Validate it exists and
243
- // resolve it to the active decision row (if any). Commit the
244
- // canonical table create+supersede FIRST (inside saveDecision's SAVEPOINT),
245
- // weaken the old memory LAST (best-effort) so a memory-write failure cannot
246
- // leave the memory stale without the table reflecting the supersession.
240
+ // Commit the table create+supersede first (inside saveDecision's SAVEPOINT) and weaken the old memory last, best-effort,
241
+ // so a memory-write failure cannot leave the memory stale while the table shows the supersession.
247
242
  let supersedesDecisionId;
248
243
  let oldEntry = null;
249
244
  if (supersedesMemId) {
250
- oldEntry = readEntry(hippoRoot, supersedesMemId, tenantId) ?? null;
245
+ oldEntry = await getMemory(cliApiContext(hippoRoot, tenantId), supersedesMemId);
251
246
  if (!oldEntry) {
252
247
  printError(`Memory ${supersedesMemId} not found.`);
253
- process.exit(1);
248
+ throw new CliExit(1);
254
249
  }
255
250
  supersedesDecisionId =
256
251
  decisionsModule.resolveActiveDecisionIdByMemory(hippoRoot, tenantId, supersedesMemId) ?? undefined;
@@ -275,20 +270,13 @@ function exitWithDecideUsage() {
275
270
  printError(' hippo decide list [--status active|superseded|closed|all] [--limit N]');
276
271
  printError(' hippo decide get <id>');
277
272
  printError(' hippo decide close <id>');
278
- process.exit(1);
273
+ throw new CliExit(1);
279
274
  }
280
275
  function weakenSupersededMemory(hippoRoot, oldEntry, supersedesMemId) {
281
- // Legacy memory-weaken (best-effort, LAST): half-life halved, marked stale +
282
- // 'superseded' tag. Preserves the exact pre-promotion behavior for the memory
283
- // mirror; the canonical table supersession already committed above.
284
- // Best-effort: saveDecision already committed. Failing here would make a retry find no active
276
+ // Best-effort and last: saveDecision already committed. Failing here would make a retry find no active
285
277
  // decision for the old memory and create a duplicate active successor, so warn instead.
286
278
  try {
287
- oldEntry.half_life_days = Math.max(1, Math.floor(oldEntry.half_life_days / 2));
288
- oldEntry.confidence = 'stale';
289
- if (!oldEntry.tags.includes('superseded'))
290
- oldEntry.tags.push('superseded');
291
- writeEntry(hippoRoot, oldEntry);
279
+ decisionsModule.weakenSupersededMemory(hippoRoot, oldEntry);
292
280
  }
293
281
  catch (e) {
294
282
  printError(` warning: decision recorded and superseded, but failed to weaken the prior memory ${supersedesMemId}: ${errorMessage(e)}`);
@@ -341,7 +329,7 @@ function incidentResolve(hippoRoot, tenantId, args, flags) {
341
329
  const resolutionRaw = stringFlag(flags, 'resolution');
342
330
  if (!resolutionRaw?.trim()) {
343
331
  printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
344
- process.exit(1);
332
+ throw new CliExit(1);
345
333
  }
346
334
  const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
347
335
  console.log(`Incident #${resolved.id} resolved.`);
@@ -349,9 +337,8 @@ function incidentResolve(hippoRoot, tenantId, args, flags) {
349
337
  function incidentClose(hippoRoot, tenantId, args) {
350
338
  closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
351
339
  }
352
- export function cmdIncident(hippoRoot, args, flags) {
340
+ export function handleIncident({ hippoRoot, tenantId, args, flags }) {
353
341
  requireInit(hippoRoot);
354
- const tenantId = resolveTenantId({});
355
342
  const subcommand = args[0] ?? '';
356
343
  if (subcommand === 'list')
357
344
  return incidentList(hippoRoot, tenantId, flags);
@@ -361,9 +348,8 @@ export function cmdIncident(hippoRoot, args, flags) {
361
348
  return incidentResolve(hippoRoot, tenantId, args, flags);
362
349
  if (subcommand === 'close')
363
350
  return incidentClose(hippoRoot, tenantId, args);
364
- // Default subcommand: open (create). Accept both the documented
365
- // `incident open "<text>"` form and the bare `incident "<text>"` form: for the
366
- // `open` keyword the text is args[1], otherwise args[0] IS the text.
351
+ // Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
352
+ // for the `open` keyword the text is args[1], otherwise args[0] is the text.
367
353
  incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
368
354
  }
369
355
  function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
@@ -373,7 +359,7 @@ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
373
359
  printError(' hippo incident get <id>');
374
360
  printError(' hippo incident resolve <id> --resolution "<text>"');
375
361
  printError(' hippo incident close <id>');
376
- process.exit(1);
362
+ throw new CliExit(1);
377
363
  }
378
364
  const context = nonEmptyStringFlag(flags, 'context');
379
365
  // --link is a repeatable flag (collected into an array by parseArgs). A
@@ -383,12 +369,12 @@ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
383
369
  if (Array.isArray(linkRaw)) {
384
370
  linkedMemoryIds = linkRaw;
385
371
  }
386
- else if (typeof linkRaw === 'string') {
372
+ else if (isStringFlag(linkRaw)) {
387
373
  linkedMemoryIds = [linkRaw];
388
374
  }
389
375
  else if (linkRaw === true) {
390
376
  printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
391
- process.exit(1);
377
+ throw new CliExit(1);
392
378
  }
393
379
  const incidentPathTags = extractPathTags(process.cwd());
394
380
  const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
package/dist/cli/eval.js CHANGED
@@ -3,7 +3,7 @@ import * as path from 'path';
3
3
  import * as fs from 'fs';
4
4
  import { loadAllEntries } from '../store/entry-reads.js';
5
5
  import { loadConfig } from '../core/config.js';
6
- import { getGlobalRoot } from '../sharing/shared.js';
6
+ import { getGlobalRoot } from '../sharing/global-store.js';
7
7
  import { runEval, bootstrapCorpus, compareSummaries } from '../eval/eval.js';
8
8
  import { runFeatureEval, formatResult, resultToBaseline, detectRegressions } from '../eval/eval-suite.js';
9
9
  import { PACKAGE_VERSION } from '../util/version.js';
@@ -12,6 +12,7 @@ import { requireInit } from './shared.js';
12
12
  import { fmt } from './print.js';
13
13
  import { boolFlag } from './flag-values.js';
14
14
  import { errorMessage } from '../util/log.js';
15
+ import { CliExit } from './exit.js';
15
16
  const HIT_TOP_K = 10;
16
17
  const MAX_FAILING_SHOWN = 10;
17
18
  const TOP_IDS_SHOWN = 3;
@@ -44,7 +45,7 @@ async function cmdEval(hippoRoot, corpusPath, flags) {
44
45
  }
45
46
  if (minMrr !== null && summary.meanMrr < minMrr) {
46
47
  printError(`MRR ${fmt(summary.meanMrr, 4)} below threshold ${minMrr}`);
47
- process.exit(1);
48
+ throw new CliExit(1);
48
49
  }
49
50
  if (comparePath)
50
51
  printEvalCompare(summary, comparePath, asJson);
@@ -85,11 +86,12 @@ function writeBootstrapCorpus(entries, flags) {
85
86
  async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
86
87
  const baselinePath = flags['baseline'] ? String(flags['baseline']) : path.join(hippoRoot, 'eval-baseline.json');
87
88
  let baseline;
88
- if (fs.existsSync(baselinePath)) {
89
- try {
90
- baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
91
- }
92
- catch {
89
+ try {
90
+ baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
91
+ }
92
+ catch (err) {
93
+ // No baseline file is a first run and says nothing; a file that is there and cannot be used warns.
94
+ if (!(err instanceof Error && 'code' in err && err.code === 'ENOENT')) {
93
95
  printError(`Warning: eval baseline ${baselinePath} is unreadable; running without it.`);
94
96
  }
95
97
  }
@@ -109,7 +111,7 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
109
111
  if (baseline) {
110
112
  const report = detectRegressions(baseline, result);
111
113
  if (report.verdict === 'REGRESSION' && minMrr === null) {
112
- process.exit(1);
114
+ throw new CliExit(1);
113
115
  }
114
116
  }
115
117
  }
@@ -117,11 +119,11 @@ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
117
119
  function readCorpus(corpusPath) {
118
120
  if (!corpusPath) {
119
121
  printError('Usage: hippo eval <corpus.json> OR hippo eval --suite [--save-baseline] OR hippo eval --bootstrap');
120
- process.exit(1);
122
+ throw new CliExit(1);
121
123
  }
122
124
  if (!fs.existsSync(corpusPath)) {
123
125
  printError(`Corpus file not found: ${corpusPath}`);
124
- process.exit(1);
126
+ throw new CliExit(1);
125
127
  }
126
128
  let cases;
127
129
  try {
@@ -132,7 +134,7 @@ function readCorpus(corpusPath) {
132
134
  }
133
135
  catch (err) {
134
136
  printError(`Failed to read corpus: ${errorMessage(err)}`);
135
- process.exit(1);
137
+ throw new CliExit(1);
136
138
  }
137
139
  return cases;
138
140
  }
@@ -176,7 +178,7 @@ function printEvalSummary(summary, showCases) {
176
178
  function printEvalCompare(summary, comparePath, asJson) {
177
179
  if (!fs.existsSync(comparePath)) {
178
180
  printError(`Baseline file not found: ${comparePath}`);
179
- process.exit(1);
181
+ throw new CliExit(1);
180
182
  }
181
183
  let baseline;
182
184
  try {
@@ -184,7 +186,7 @@ function printEvalCompare(summary, comparePath, asJson) {
184
186
  }
185
187
  catch (err) {
186
188
  printError(`Failed to parse baseline: ${errorMessage(err)}`);
187
- process.exit(1);
189
+ throw new CliExit(1);
188
190
  }
189
191
  const cmp = compareSummaries(baseline, summary);
190
192
  if (asJson) {
@@ -0,0 +1,6 @@
1
+ /** Thrown after the verb has printed its own message, so it carries the exit code and nothing for the entry to print. */
2
+ export declare class CliExit extends Error {
3
+ readonly code: number;
4
+ constructor(code: number);
5
+ }
6
+ //# sourceMappingURL=exit.d.ts.map
@@ -0,0 +1,11 @@
1
+ // The one error a CLI verb throws to stop its command; runCli is the one place that turns it into the process exit code.
2
+ /** Thrown after the verb has printed its own message, so it carries the exit code and nothing for the entry to print. */
3
+ export class CliExit extends Error {
4
+ code;
5
+ constructor(code) {
6
+ super(`hippo exits with code ${code}`);
7
+ this.name = 'CliExit';
8
+ this.code = code;
9
+ }
10
+ }
11
+ //# sourceMappingURL=exit.js.map
@@ -1,4 +1,3 @@
1
- import { type CliFlags, type CommandContext } from './flag-values.js';
2
- export declare function cmdExplain(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
1
+ import { type CommandContext } from './flag-values.js';
3
2
  export declare function handleExplain({ hippoRoot, args, flags }: CommandContext): Promise<void>;
4
3
  //# sourceMappingURL=explain.d.ts.map
@@ -7,14 +7,16 @@ import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
7
7
  import { loadConfig } from '../core/config.js';
8
8
  import { dropHeldCopies } from '../util/same-text.js';
9
9
  import { detectScope } from '../sharing/scope.js';
10
- import { getGlobalRoot } from '../sharing/shared.js';
10
+ import { getGlobalRoot } from '../sharing/global-store.js';
11
11
  import * as api from '../api/index.js';
12
12
  import { resolveTenantId } from '../store/tenant.js';
13
+ import { cliApiContext } from './api-context.js';
13
14
  import { printedTokens } from '../api/context-render.js';
14
15
  import { printError } from './output.js';
15
16
  import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag } from './flag-values.js';
16
17
  import { requireInit } from './shared.js';
17
18
  import { fmt, recallEntryText, recallHeading } from './print.js';
19
+ import { CliExit } from './exit.js';
18
20
  const EXPLAIN_PREVIEW_CHARS = 48;
19
21
  /** The SQL predicate drops denied rows before the window, so an unscoped probe counts what the policy hides. */
20
22
  function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
@@ -28,7 +30,7 @@ function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
28
30
  printError(`[note] ${hidden} candidate${hidden === 1 ? '' : 's'} hidden by recall scope policy (pass an explicit --scope to inspect).`);
29
31
  }
30
32
  }
31
- export async function cmdExplain(hippoRoot, query, flags) {
33
+ async function cmdExplain(hippoRoot, query, flags) {
32
34
  requireInit(hippoRoot);
33
35
  const budget = parseBudgetFlag(flags['budget'], DEFAULT_RECALL_BUDGET);
34
36
  const limit = parseLimitFlag(flags['limit']);
@@ -49,7 +51,7 @@ export async function cmdExplain(hippoRoot, query, flags) {
49
51
  const cost = (r) => printedTokens(recallEntryText(r, query, false, explainGlobalOn && !explainIndex.entries[r.entry.id]));
50
52
  const entryBudget = Math.max(0, budget - printedTokens(recallHeading(budget, budget, query)));
51
53
  const slot = {};
52
- await api.retrieve({ hippoRoot, tenantId, actor: api.adminActor('cli') }, {
54
+ await api.retrieve(cliApiContext(hippoRoot, tenantId), {
53
55
  query,
54
56
  cliCore: {
55
57
  rank: {
@@ -166,7 +168,7 @@ export async function handleExplain({ hippoRoot, args, flags }) {
166
168
  const query = args.join(' ').trim();
167
169
  if (!query) {
168
170
  printError('Please provide a search query.');
169
- process.exit(1);
171
+ throw new CliExit(1);
170
172
  }
171
173
  await cmdExplain(hippoRoot, query, flags);
172
174
  }
@@ -1,19 +1,24 @@
1
1
  import type { RecallSearchOpts } from '../api/recall-pipeline.js';
2
2
  import type { HippoConfig } from '../core/config.js';
3
+ export declare function isBooleanFlag(value: string | boolean | string[] | undefined): value is boolean;
4
+ export declare function isStringFlag(value: string | boolean | string[] | undefined): value is string;
3
5
  export declare function parseLimitFlag(value: string | boolean | string[] | undefined): number;
4
6
  export declare function parseCountFlag(value: string | boolean | string[] | undefined): number;
5
7
  export declare function parseBudgetFlag(value: string | boolean | string[] | undefined, fallback: number): number;
6
8
  export type CliFlags = Record<string, string | boolean | string[]>;
7
- export declare function parsePositiveId(idRaw: unknown, label: string): number;
9
+ export declare function parsePositiveId(idRaw: string | undefined, label: string): number;
8
10
  export declare function parseListLimit(flags: CliFlags): number;
9
11
  export declare function stringFlag(flags: CliFlags, name: string): string | undefined;
10
12
  export declare function nonEmptyStringFlag(flags: CliFlags, name: string): string | undefined;
13
+ export declare function stringListFlag(flags: CliFlags, name: string): string[] | undefined;
14
+ export declare function isOneOf<T extends string>(allowed: readonly T[], value: string): value is T;
11
15
  export declare function numberFlag(flags: CliFlags, name: string): number | undefined;
12
16
  export declare function boolFlag(flags: CliFlags, name: string): boolean;
13
17
  export declare function flagIsTrue(flags: CliFlags, name: string): boolean;
14
18
  /** What the command table hands each verb's run(). */
15
19
  export interface CommandContext {
16
20
  readonly hippoRoot: string;
21
+ readonly tenantId: string;
17
22
  readonly args: string[];
18
23
  readonly flags: CliFlags;
19
24
  }
@@ -1,5 +1,12 @@
1
1
  // Readers that turn parsed CLI flags into typed values, and the flag types they share.
2
2
  import { printError } from './output.js';
3
+ import { CliExit } from './exit.js';
4
+ export function isBooleanFlag(value) {
5
+ return typeof value === 'boolean';
6
+ }
7
+ export function isStringFlag(value) {
8
+ return typeof value === 'string';
9
+ }
3
10
  export function parseLimitFlag(value) {
4
11
  if (!value)
5
12
  return Infinity;
@@ -16,15 +23,15 @@ export function parseBudgetFlag(value, fallback) {
16
23
  if (value === undefined)
17
24
  return fallback;
18
25
  // A value-less flag and a junk value are different typos; the --hops guard already splits them.
19
- if (typeof value !== 'string') {
26
+ if (!isStringFlag(value)) {
20
27
  printError('--budget requires an integer value (e.g. --budget 1500).');
21
- process.exit(1);
28
+ throw new CliExit(1);
22
29
  }
23
30
  // Number(), like the --hops guard: parseInt('12abc') is 12, silently accepting what this message rejects.
24
31
  const parsed = Number(value);
25
32
  if (!Number.isInteger(parsed) || parsed < 0) {
26
33
  printError(`Invalid --budget: "${value}". Must be a non-negative integer.`);
27
- process.exit(1);
34
+ throw new CliExit(1);
28
35
  }
29
36
  return parsed;
30
37
  }
@@ -34,7 +41,7 @@ export function parsePositiveId(idRaw, label) {
34
41
  const id = parseInt(s, 10);
35
42
  if (!/^\d+$/.test(s) || id <= 0 || !Number.isSafeInteger(id)) {
36
43
  printError(`Invalid ${label} id: "${idRaw}" (expected a positive integer).`);
37
- process.exit(1);
44
+ throw new CliExit(1);
38
45
  }
39
46
  return id;
40
47
  }
@@ -43,22 +50,32 @@ export function parseListLimit(flags) {
43
50
  const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
44
51
  if (!Number.isFinite(limit) || limit <= 0) {
45
52
  printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
46
- process.exit(1);
53
+ throw new CliExit(1);
47
54
  }
48
55
  return limit;
49
56
  }
50
57
  // A value-less flag is `true` and a repeated one is a string[]; only a string counts here.
51
58
  export function stringFlag(flags, name) {
52
59
  const v = flags[name];
53
- return typeof v === 'string' ? v : undefined;
60
+ return isStringFlag(v) ? v : undefined;
54
61
  }
55
62
  // An empty value reads as absent, so `--change ""` keeps the default.
56
63
  export function nonEmptyStringFlag(flags, name) {
57
64
  return stringFlag(flags, name) || undefined;
58
65
  }
66
+ // A repeated flag is already a list; a single value is a comma-separated list.
67
+ export function stringListFlag(flags, name) {
68
+ const v = flags[name];
69
+ if (Array.isArray(v))
70
+ return v;
71
+ return isStringFlag(v) ? v.split(',').map((t) => t.trim()).filter(Boolean) : undefined;
72
+ }
73
+ export function isOneOf(allowed, value) {
74
+ return allowed.some((a) => a === value);
75
+ }
59
76
  export function numberFlag(flags, name) {
60
77
  const v = flags[name];
61
- return typeof v === 'string' ? Number(v) : undefined;
78
+ return isStringFlag(v) ? Number(v) : undefined;
62
79
  }
63
80
  // Any truthy value counts, so a string value is true too.
64
81
  export function boolFlag(flags, name) {
@@ -72,7 +89,7 @@ export function parseAsOfFlag(flags) {
72
89
  const asOf = stringFlag(flags, 'as-of');
73
90
  if (asOf !== undefined && Number.isNaN(new Date(asOf).getTime())) {
74
91
  printError(`Error: --as-of value "${asOf}" is not a valid ISO date (e.g. 2026-04-22 or 2026-04-22T12:00:00Z).`);
75
- process.exit(1);
92
+ throw new CliExit(1);
76
93
  }
77
94
  return asOf;
78
95
  }
@@ -89,14 +106,14 @@ export function engineFlags(flags, config) {
89
106
  };
90
107
  }
91
108
  // parseArgs turns a value-less flag into `true`; refuse rather than silently
92
- // stringifying it (String(true) === 'true'), mirroring cmdHandoff's guard.
109
+ // stringifying it (String(true) === 'true'), mirroring handleHandoff's guard.
93
110
  export function stringFlagOrExit(flags, key) {
94
111
  const v = flags[key];
95
112
  if (v === undefined)
96
113
  return undefined;
97
114
  if (v === true || v === false || Array.isArray(v)) {
98
115
  printError(`--${key} requires a value`);
99
- process.exit(1);
116
+ throw new CliExit(1);
100
117
  }
101
118
  return v.trim();
102
119
  }
@@ -96,6 +96,7 @@ export declare const VERB_FLAGS: {
96
96
  auth: {
97
97
  switches: string[];
98
98
  values: string[];
99
+ numbers: string[];
99
100
  };
100
101
  goal: {
101
102
  switches: string[];
package/dist/cli/flags.js CHANGED
@@ -48,7 +48,7 @@ export const VERB_FLAGS = {
48
48
  '__codex-session-end-worker': { values: ['codex-home', 'history-path', 'log-file', 'start-offset', 'started-at'] },
49
49
  dedup: { switches: ['dry-run'], numbers: ['threshold'] },
50
50
  dag: { switches: ['stats'] },
51
- auth: { switches: ['all', 'global', 'json'], values: ['label', 'role', 'tenant'] },
51
+ auth: { switches: ['all', 'global', 'json', 'no-expiry'], values: ['label', 'role', 'tenant'], numbers: ['ttl-days'] },
52
52
  goal: {
53
53
  switches: ['all', 'no-propagate'],
54
54
  values: ['level', 'outcome', 'parent', 'policy', 'session-id', 'success', 'tenant-id'],
@@ -0,0 +1,14 @@
1
+ /** `hippo github` subcommands, split out of cli.ts so tests can import them without triggering main().
2
+ * The dispatcher in cli.ts re-exports handleGitHub. */
3
+ import { type GitHubFetcher } from '../connectors/github/octokit-client.js';
4
+ import type { CommandContext } from './flag-values.js';
5
+ type FlagValue = string | boolean | string[];
6
+ type Flags = Record<string, FlagValue>;
7
+ export declare function printGitHubBackfillUsage(): void;
8
+ /** `hippo github backfill`; the fetcher is injectable so tests avoid the network (default `realGitHubFetcher`). */
9
+ export declare function cmdGitHubBackfill(hippoRoot: string, tenantId: string, flags: Flags, fetcher?: GitHubFetcher): Promise<void>;
10
+ export declare function cmdGitHubDlqList(hippoRoot: string, tenantId: string, _flags: Flags): void;
11
+ export declare function cmdGitHubDlqReplay(hippoRoot: string, tenantId: string, args: string[], flags: Flags): Promise<void>;
12
+ export declare function handleGitHub({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
13
+ export {};
14
+ //# sourceMappingURL=github.d.ts.map