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
@@ -6,12 +6,12 @@ import * as briefsModule from '../objects/project-briefs.js';
6
6
  import * as customerNotesModule from '../objects/customer-notes.js';
7
7
  import { extractGraph } from '../graph/extract.js';
8
8
  import { buildGraphModel, renderGraphHtml, renderGraphCanvas, DEFAULT_VIEW_LIMIT } from '../graph/view.js';
9
- import { resolveTenantId } from '../store/tenant.js';
10
9
  import { errorMessage, log } from '../util/log.js';
11
10
  import { printError } from './output.js';
12
11
  import { nonEmptyStringFlag, boolFlag, stringFlag } from './flag-values.js';
13
12
  import { requireInit } from './shared.js';
14
13
  import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
14
+ import { CliExit } from './exit.js';
15
15
  const BRIEF = { cmd: 'brief', noun: 'Project brief', idLabel: 'brief' };
16
16
  const NOTE = { cmd: 'note', noun: 'Customer note', idLabel: 'note' };
17
17
  function printBriefRow(b) {
@@ -40,7 +40,7 @@ function briefRefresh(hippoRoot, tenantId, args, flags) {
40
40
  const repoRaw = args[1];
41
41
  if (!repoRaw) {
42
42
  printError('Usage: hippo brief refresh "<repo>" [--dry-run]');
43
- process.exit(1);
43
+ throw new CliExit(1);
44
44
  }
45
45
  const dryRun = boolFlag(flags, 'dry-run');
46
46
  try {
@@ -59,7 +59,7 @@ function briefRefresh(hippoRoot, tenantId, args, flags) {
59
59
  }
60
60
  catch (e) {
61
61
  printError(errorMessage(e));
62
- process.exit(1);
62
+ throw new CliExit(1);
63
63
  }
64
64
  }
65
65
  function briefGet(hippoRoot, tenantId, args) {
@@ -77,7 +77,7 @@ function briefSupersede(hippoRoot, tenantId, args, flags) {
77
77
  const summaryRaw = stringFlag(flags, 'summary');
78
78
  if (!summaryRaw?.trim()) {
79
79
  printError('hippo brief supersede requires --summary "<text>" for the new version.');
80
- process.exit(1);
80
+ throw new CliExit(1);
81
81
  }
82
82
  const existing = foundOrExit(briefsModule.loadProjectBriefById(hippoRoot, tenantId, id), BRIEF.noun, id);
83
83
  try {
@@ -94,7 +94,7 @@ function briefSupersede(hippoRoot, tenantId, args, flags) {
94
94
  }
95
95
  catch (e) {
96
96
  printError(errorMessage(e));
97
- process.exit(1);
97
+ throw new CliExit(1);
98
98
  }
99
99
  }
100
100
  function briefClose(hippoRoot, tenantId, args) {
@@ -108,7 +108,7 @@ function briefCreate(hippoRoot, tenantId, args, flags) {
108
108
  const summaryRaw = stringFlag(flags, 'summary');
109
109
  if (!repo || !summaryRaw?.trim()) {
110
110
  briefUsage();
111
- process.exit(1);
111
+ throw new CliExit(1);
112
112
  }
113
113
  try {
114
114
  const created = briefsModule.saveProjectBrief(hippoRoot, tenantId, {
@@ -122,12 +122,11 @@ function briefCreate(hippoRoot, tenantId, args, flags) {
122
122
  }
123
123
  catch (e) {
124
124
  printError(errorMessage(e));
125
- process.exit(1);
125
+ throw new CliExit(1);
126
126
  }
127
127
  }
128
- export function cmdProjectBrief(hippoRoot, args, flags) {
128
+ export function handleProjectBrief({ hippoRoot, tenantId, args, flags }) {
129
129
  requireInit(hippoRoot);
130
- const tenantId = resolveTenantId({});
131
130
  const subcommand = args[0] ?? '';
132
131
  if (subcommand === 'list')
133
132
  return briefList(hippoRoot, tenantId, flags);
@@ -203,9 +202,8 @@ function openInBrowser(out) {
203
202
  ? ['open', [out]]
204
203
  : ['xdg-open', [out]];
205
204
  const child = spawn(cmd, cmdArgs, { detached: true, stdio: 'ignore', windowsHide: true });
206
- // A missing launcher (e.g. xdg-open absent) emits 'error' asynchronously;
207
- // an unhandled 'error' event would throw, so swallow it — the file is
208
- // already written and its path printed above.
205
+ // A missing launcher (e.g. xdg-open absent) emits 'error' asynchronously; unhandled, it would throw,
206
+ // so swallow it: the file is already written and its path printed above.
209
207
  child.on('error', () => { });
210
208
  child.unref();
211
209
  }
@@ -218,7 +216,7 @@ function graphView(hippoRoot, tenantId, entity, flags) {
218
216
  const format = stringFlag(flags, 'format') ?? 'html';
219
217
  if (format !== 'html' && format !== 'canvas') {
220
218
  printError("graph view: --format must be 'html' or 'canvas'");
221
- process.exit(1);
219
+ throw new CliExit(1);
222
220
  }
223
221
  const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
224
222
  const content = format === 'canvas' ? renderGraphCanvas(model) : renderGraphHtml(model);
@@ -229,9 +227,8 @@ function graphView(hippoRoot, tenantId, entity, flags) {
229
227
  if (flags['open'] && format === 'html')
230
228
  openInBrowser(out);
231
229
  }
232
- export function cmdGraph(hippoRoot, args, flags) {
230
+ export function handleGraph({ hippoRoot, tenantId, args, flags }) {
233
231
  requireInit(hippoRoot);
234
- const tenantId = resolveTenantId({});
235
232
  const subcommand = args[0] ?? '';
236
233
  if (subcommand === 'extract')
237
234
  return graphExtract(hippoRoot, tenantId);
@@ -244,7 +241,7 @@ export function cmdGraph(hippoRoot, args, flags) {
244
241
  ' hippo graph extract Rebuild the entity/relation graph from consolidated objects\n' +
245
242
  ' hippo graph show [--entity NAME] [--json] Inspect entities + their edges (text or JSON)\n' +
246
243
  ' hippo graph view [--out FILE] [--open] [--format html|canvas] [--entity NAME] Generate an interactive node-link diagram');
247
- process.exit(1);
244
+ throw new CliExit(1);
248
245
  }
249
246
  function noteList(hippoRoot, tenantId, flags) {
250
247
  const customer = stringFlag(flags, 'customer')?.trim() || undefined;
@@ -270,7 +267,7 @@ function noteSupersede(hippoRoot, tenantId, args, flags) {
270
267
  const textRaw = stringFlag(flags, 'text');
271
268
  if (!textRaw?.trim()) {
272
269
  printError('hippo note supersede requires --text "<note>" for the new version.');
273
- process.exit(1);
270
+ throw new CliExit(1);
274
271
  }
275
272
  const existing = foundOrExit(customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id), NOTE.noun, id);
276
273
  try {
@@ -287,15 +284,14 @@ function noteSupersede(hippoRoot, tenantId, args, flags) {
287
284
  }
288
285
  catch (e) {
289
286
  printError(errorMessage(e));
290
- process.exit(1);
287
+ throw new CliExit(1);
291
288
  }
292
289
  }
293
290
  function noteClose(hippoRoot, tenantId, args) {
294
291
  closeObject(args, NOTE, (id) => customerNotesModule.closeCustomerNote(hippoRoot, tenantId, id));
295
292
  }
296
- export function cmdCustomerNote(hippoRoot, args, flags) {
293
+ export function handleCustomerNote({ hippoRoot, tenantId, args, flags }) {
297
294
  requireInit(hippoRoot);
298
- const tenantId = resolveTenantId({});
299
295
  const subcommand = args[0] ?? '';
300
296
  if (subcommand === 'list')
301
297
  return noteList(hippoRoot, tenantId, flags);
@@ -311,7 +307,7 @@ export function cmdCustomerNote(hippoRoot, args, flags) {
311
307
  const textRaw = stringFlag(flags, 'text');
312
308
  if (!customer || !textRaw?.trim()) {
313
309
  noteUsage();
314
- process.exit(1);
310
+ throw new CliExit(1);
315
311
  }
316
312
  try {
317
313
  const created = customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
@@ -325,7 +321,7 @@ export function cmdCustomerNote(hippoRoot, args, flags) {
325
321
  }
326
322
  catch (e) {
327
323
  printError(errorMessage(e));
328
- process.exit(1);
324
+ throw new CliExit(1);
329
325
  }
330
326
  }
331
327
  //# sourceMappingURL=briefs.js.map
@@ -1,4 +1,4 @@
1
- import { type CliFlags } from './flag-values.js';
1
+ import { type CommandContext } from './flag-values.js';
2
2
  /** Runs `hippo card <subcommand>`: rejects flags the subcommand never reads, then hands off to its handler. */
3
- export declare function cmdCard(hippoRoot: string, args: string[], flags: CliFlags): void;
3
+ export declare function handleCard({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
4
  //# sourceMappingURL=card.d.ts.map
package/dist/cli/card.js CHANGED
@@ -3,11 +3,11 @@ import { createCard, loadCard, listCards, loadCardRuns, claimCard, heartbeatCard
3
3
  import { isHandoffOutcome } from '../core/handoff.js';
4
4
  import { isCardStatus } from '../core/card.js';
5
5
  import { loadCardDetail } from '../store/card-detail.js';
6
- import { resolveTenantId } from '../store/tenant.js';
7
6
  import { printError } from './output.js';
8
7
  import { stringFlagOrExit } from './flag-values.js';
9
8
  import { requireInit } from './shared.js';
10
9
  import { errorMessage } from '../util/log.js';
10
+ import { CliExit } from './exit.js';
11
11
  // Mirrors ARCHIVE_REASON_REQUIRED so the block message can't drift from its usage line.
12
12
  const CARD_BLOCK_REASON_REQUIRED = 'hippo card block <id> requires --reason "<why>" (recorded as a comment).';
13
13
  function printCard(detail) {
@@ -59,7 +59,7 @@ function cardRunFlag(flags) {
59
59
  const n = Number(raw);
60
60
  if (!/^\d+$/.test(raw) || !Number.isSafeInteger(n) || n <= 0) {
61
61
  printError(`Invalid --run: "${raw}" (expected a positive integer).`);
62
- process.exit(1);
62
+ throw new CliExit(1);
63
63
  }
64
64
  return n;
65
65
  }
@@ -82,13 +82,12 @@ const CARD_SUBCOMMAND_FLAGS = {
82
82
  comment: ['body', 'author'],
83
83
  };
84
84
  /** Runs `hippo card <subcommand>`: rejects flags the subcommand never reads, then hands off to its handler. */
85
- export function cmdCard(hippoRoot, args, flags) {
85
+ export function handleCard({ hippoRoot, tenantId, args, flags }) {
86
86
  requireInit(hippoRoot);
87
- const tenantId = resolveTenantId({});
88
87
  const subcommand = args[0] ?? '';
89
88
  if (!Object.hasOwn(CARD_SUBCOMMAND_FLAGS, subcommand)) {
90
89
  printError('Usage: hippo card <create|show|list|claim|heartbeat|block|review|complete|reclaim|comment>');
91
- process.exit(1);
90
+ throw new CliExit(1);
92
91
  }
93
92
  // SAFETY: hasOwn, unlike `in`, skips inherited keys such as constructor, so subcommand is a real key.
94
93
  const known = subcommand;
@@ -97,7 +96,7 @@ export function cmdCard(hippoRoot, args, flags) {
97
96
  if (!allowedFlags.includes(key)) {
98
97
  const valid = allowedFlags.length > 0 ? allowedFlags.map((f) => `--${f}`).join(', ') : '(none)';
99
98
  printError(`Unknown flag --${key} for hippo card ${subcommand}. Valid flags: ${valid}`);
100
- process.exit(1);
99
+ throw new CliExit(1);
101
100
  }
102
101
  }
103
102
  CARD_HANDLERS[known](hippoRoot, tenantId, args, flags);
@@ -106,7 +105,7 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
106
105
  const title = stringFlagOrExit(flags, 'title') ?? '';
107
106
  if (!title) {
108
107
  printError('Usage: hippo card create --title "..." [--repo <name>] [--contract <text>] [--budget <n>] [--depends-on <id>...]');
109
- process.exit(1);
108
+ throw new CliExit(1);
110
109
  }
111
110
  const repo = stringFlagOrExit(flags, 'repo') || undefined;
112
111
  const contract = stringFlagOrExit(flags, 'contract') || undefined;
@@ -115,14 +114,14 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
115
114
  if (budgetRaw !== undefined) {
116
115
  if (!/^\d+$/.test(budgetRaw)) {
117
116
  printError(`Invalid budget: "${budgetRaw}" (expected a positive integer)`);
118
- process.exit(1);
117
+ throw new CliExit(1);
119
118
  }
120
119
  budget = Number(budgetRaw);
121
120
  }
122
121
  const dependsOnFlag = flags['depends-on'];
123
122
  if (dependsOnFlag === true) {
124
123
  printError('--depends-on requires a value');
125
- process.exit(1);
124
+ throw new CliExit(1);
126
125
  }
127
126
  const dependsOn = Array.isArray(dependsOnFlag) ? dependsOnFlag : [];
128
127
  let card;
@@ -131,7 +130,7 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
131
130
  }
132
131
  catch (error) {
133
132
  printError(errorMessage(error));
134
- process.exit(1);
133
+ throw new CliExit(1);
135
134
  }
136
135
  console.log(`Created card ${card.id} (status: ${card.status})`);
137
136
  }
@@ -139,12 +138,12 @@ function cardShow(hippoRoot, tenantId, args, flags) {
139
138
  const id = args[1];
140
139
  if (!id) {
141
140
  printError('Usage: hippo card show <id> [--json]');
142
- process.exit(1);
141
+ throw new CliExit(1);
143
142
  }
144
143
  const detail = loadCardDetail(hippoRoot, tenantId, id);
145
144
  if (!detail) {
146
145
  printError(`No card found with id ${id}.`);
147
- process.exit(1);
146
+ throw new CliExit(1);
148
147
  }
149
148
  if (flags['json']) {
150
149
  console.log(JSON.stringify(detail, null, 2));
@@ -156,7 +155,7 @@ function cardList(hippoRoot, tenantId, _args, flags) {
156
155
  const status = stringFlagOrExit(flags, 'status');
157
156
  if (status !== undefined && !isCardStatus(status)) {
158
157
  printError(`Invalid status: "${status}".`);
159
- process.exit(1);
158
+ throw new CliExit(1);
160
159
  }
161
160
  const cards = listCards(hippoRoot, tenantId, { status });
162
161
  if (flags['json']) {
@@ -176,7 +175,7 @@ function cardClaim(hippoRoot, tenantId, args, flags) {
176
175
  const runtime = stringFlagOrExit(flags, 'runtime') ?? '';
177
176
  if (!id || !runtime) {
178
177
  printError('Usage: hippo card claim <id> --runtime <name> [--session <id>]');
179
- process.exit(1);
178
+ throw new CliExit(1);
180
179
  }
181
180
  const sessionId = stringFlagOrExit(flags, 'session') || undefined;
182
181
  let card;
@@ -185,11 +184,11 @@ function cardClaim(hippoRoot, tenantId, args, flags) {
185
184
  }
186
185
  catch (error) {
187
186
  printError(errorMessage(error));
188
- process.exit(1);
187
+ throw new CliExit(1);
189
188
  }
190
189
  if (!card) {
191
190
  printError(`Could not claim card ${id} (not ready/blocked, or already claimed).`);
192
- process.exit(1);
191
+ throw new CliExit(1);
193
192
  }
194
193
  console.log(`Claimed card ${card.id} for ${runtime} (run ${card.runId}, lease until ${card.leaseUntil})`);
195
194
  }
@@ -198,7 +197,7 @@ function cardHeartbeat(hippoRoot, tenantId, args, flags) {
198
197
  const runId = cardRunFlag(flags);
199
198
  if (!id || runId === undefined) {
200
199
  printError('Usage: hippo card heartbeat <id> --run <n>');
201
- process.exit(1);
200
+ throw new CliExit(1);
202
201
  }
203
202
  let card;
204
203
  try {
@@ -206,11 +205,11 @@ function cardHeartbeat(hippoRoot, tenantId, args, flags) {
206
205
  }
207
206
  catch (error) {
208
207
  printError(errorMessage(error));
209
- process.exit(1);
208
+ throw new CliExit(1);
210
209
  }
211
210
  if (!card) {
212
211
  printError(`Could not heartbeat card ${id} (${cardRefusal(hippoRoot, tenantId, id)}).`);
213
- process.exit(1);
212
+ throw new CliExit(1);
214
213
  }
215
214
  console.log(`Heartbeat card ${card.id}: lease until ${card.leaseUntil}`);
216
215
  }
@@ -219,7 +218,7 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
219
218
  const reason = stringFlagOrExit(flags, 'reason') ?? '';
220
219
  if (!id || !reason) {
221
220
  printError(CARD_BLOCK_REASON_REQUIRED);
222
- process.exit(1);
221
+ throw new CliExit(1);
223
222
  }
224
223
  const runId = cardRunFlag(flags);
225
224
  let card;
@@ -228,12 +227,12 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
228
227
  }
229
228
  catch (error) {
230
229
  printError(errorMessage(error));
231
- process.exit(1);
230
+ throw new CliExit(1);
232
231
  }
233
232
  if (!card) {
234
233
  const why = runId === undefined ? 'not running' : cardRefusal(hippoRoot, tenantId, id);
235
234
  printError(`Could not block card ${id} (${why}).`);
236
- process.exit(1);
235
+ throw new CliExit(1);
237
236
  }
238
237
  console.log(`Blocked card ${card.id}`);
239
238
  }
@@ -241,7 +240,7 @@ function cardReview(hippoRoot, tenantId, args, flags) {
241
240
  const id = args[1];
242
241
  if (!id) {
243
242
  printError('Usage: hippo card review <id> [--run <n>]');
244
- process.exit(1);
243
+ throw new CliExit(1);
245
244
  }
246
245
  const runId = cardRunFlag(flags);
247
246
  let card;
@@ -250,12 +249,12 @@ function cardReview(hippoRoot, tenantId, args, flags) {
250
249
  }
251
250
  catch (error) {
252
251
  printError(errorMessage(error));
253
- process.exit(1);
252
+ throw new CliExit(1);
254
253
  }
255
254
  if (!card) {
256
255
  const why = runId === undefined ? 'not running' : cardRefusal(hippoRoot, tenantId, id);
257
256
  printError(`Could not move card ${id} to review (${why}).`);
258
- process.exit(1);
257
+ throw new CliExit(1);
259
258
  }
260
259
  console.log(`Card ${card.id} moved to review`);
261
260
  }
@@ -264,7 +263,7 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
264
263
  const outcomeRaw = flags['outcome'];
265
264
  if (!id || !isHandoffOutcome(outcomeRaw)) {
266
265
  printError('Usage: hippo card complete <id> --outcome <success|failure|partial> [--run <n>]');
267
- process.exit(1);
266
+ throw new CliExit(1);
268
267
  }
269
268
  const runId = cardRunFlag(flags);
270
269
  let result;
@@ -273,12 +272,12 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
273
272
  }
274
273
  catch (error) {
275
274
  printError(errorMessage(error));
276
- process.exit(1);
275
+ throw new CliExit(1);
277
276
  }
278
277
  if (!result) {
279
278
  const why = runId === undefined ? 'not in review' : cardRefusal(hippoRoot, tenantId, id);
280
279
  printError(`Could not complete card ${id} (${why}).`);
281
- process.exit(1);
280
+ throw new CliExit(1);
282
281
  }
283
282
  console.log(`Completed card ${result.card.id} (status: ${result.card.status})`);
284
283
  if (result.promotedChildren.length > 0) {
@@ -288,7 +287,7 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
288
287
  function cardReclaim(hippoRoot, tenantId, args) {
289
288
  if (args.length > 1) {
290
289
  printError('Usage: hippo card reclaim (sweeps every expired lease; use hippo card block <id> for one card)');
291
- process.exit(1);
290
+ throw new CliExit(1);
292
291
  }
293
292
  const ids = reclaimExpiredCards(hippoRoot, tenantId);
294
293
  if (ids.length === 0) {
@@ -303,18 +302,18 @@ function cardComment(hippoRoot, tenantId, args, flags) {
303
302
  const id = args[1];
304
303
  if (!id) {
305
304
  printError('Usage: hippo card comment <id> --body "..." [--author <name>]');
306
- process.exit(1);
305
+ throw new CliExit(1);
307
306
  }
308
307
  // Only show and comment look the card up directly; claim/heartbeat/block/review/complete throw from the store instead.
309
308
  const card = loadCard(hippoRoot, tenantId, id);
310
309
  if (!card) {
311
310
  printError(`No card found with id ${id}.`);
312
- process.exit(1);
311
+ throw new CliExit(1);
313
312
  }
314
313
  const body = stringFlagOrExit(flags, 'body') ?? '';
315
314
  if (!body) {
316
315
  printError('Usage: hippo card comment <id> --body "..." [--author <name>]');
317
- process.exit(1);
316
+ throw new CliExit(1);
318
317
  }
319
318
  const author = stringFlagOrExit(flags, 'author') || 'cli';
320
319
  const comment = addCardComment(hippoRoot, tenantId, id, author, body);
@@ -1,22 +1,8 @@
1
- /**
2
- * HTTP client wrapper for `hippo serve`.
3
- *
4
- * Only the writes the CLI routes (remember, forget, archive, promote), which are
5
- * also all HIPPO_REQUIRE_SERVER covers; every other command opens the store
6
- * directly. Each call returns the same shape that api.ts would.
7
- *
8
- * Errors from the server (4xx/5xx) are mapped back into thrown Errors with
9
- * the server's `error` message preserved verbatim so existing CLI handlers
10
- * that match on substrings (e.g. "not found", "already superseded") still
11
- * work unchanged.
12
- *
13
- * Network errors (ECONNREFUSED on a stale pidfile, etc.) propagate as the
14
- * native fetch failure so the caller can detect them and self-heal.
15
- */
1
+ /** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
2
+ * Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
16
3
  import type { RememberOpts, RememberResult } from '../api/index.js';
17
- /** An error the server answered with, not one the transport raised. The
18
- * refused-connection classifier sniffs message text, and a server message
19
- * quotes the caller's own id or content back verbatim. */
4
+ /** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
5
+ * and a server message quotes the caller's own id or content back verbatim. */
20
6
  export declare class HttpResponseError extends Error {
21
7
  readonly status: number;
22
8
  constructor(message: string, status: number);
@@ -35,14 +21,8 @@ export declare function archiveRaw(serverUrl: string, apiKey: string | undefined
35
21
  ok: true;
36
22
  archivedAt: string;
37
23
  }>;
38
- /**
39
- * How far a request got before the transport failed.
40
- *
41
- * 'never-sent' means the connection never opened, so the caller may safely
42
- * replay the call locally. 'delivery-unknown' means the socket broke with the
43
- * request already on the wire: the server may have committed it, so replaying a
44
- * write would store it twice. 'none' means this was not a transport failure.
45
- */
24
+ /** 'never-sent': connection never opened, safe to replay locally. 'delivery-unknown': the request was on the wire and may have
25
+ * committed, so never replay a write. 'none': not a transport failure. */
46
26
  export type TransportFailure = 'none' | 'never-sent' | 'delivery-unknown';
47
- export declare function classifyTransportFailure(err: unknown): TransportFailure;
27
+ export declare function classifyTransportFailure(err: Error): TransportFailure;
48
28
  //# sourceMappingURL=client.d.ts.map
@@ -1,23 +1,14 @@
1
- /**
2
- * HTTP client wrapper for `hippo serve`.
3
- *
4
- * Only the writes the CLI routes (remember, forget, archive, promote), which are
5
- * also all HIPPO_REQUIRE_SERVER covers; every other command opens the store
6
- * directly. Each call returns the same shape that api.ts would.
7
- *
8
- * Errors from the server (4xx/5xx) are mapped back into thrown Errors with
9
- * the server's `error` message preserved verbatim so existing CLI handlers
10
- * that match on substrings (e.g. "not found", "already superseded") still
11
- * work unchanged.
12
- *
13
- * Network errors (ECONNREFUSED on a stale pidfile, etc.) propagate as the
14
- * native fetch failure so the caller can detect them and self-heal.
15
- */
1
+ /** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
2
+ * Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
16
3
  import { fetchWithRetry } from '../util/http-retry.js';
4
+ import { readCappedJson } from '../util/capped-json.js';
5
+ import { isJsonObject, isJsonString } from '../util/json.js';
17
6
  /** A write the local server has not answered in this long is stuck; the caller treats it as delivery-unknown. */
18
7
  const SERVER_TIMEOUT_MS = 30_000;
19
8
  /** Five tries at the server's 1 s Retry-After keeps the roughly 5 s wait the CLI had before the server answered busy with 503. */
20
9
  const STORE_BUSY_ATTEMPTS = 5;
10
+ /** Every routed write answers with a few short fields; the pidfile's port may now be another process, so cap what it sends. */
11
+ const MAX_REPLY_BYTES = 1024 * 1024;
21
12
  /** The server sets Retry-After on a 503 only for a held write lock (server.ts replyFor); the auth-provider 503 has none. */
22
13
  function isStoreBusy(res) {
23
14
  return res.status === 503 && res.headers.has('retry-after');
@@ -34,12 +25,8 @@ function buildHeaders(apiKey, withBody) {
34
25
  headers['authorization'] = `Bearer ${apiKey}`;
35
26
  return headers;
36
27
  }
37
- function isNonEmptyString(value) {
38
- return typeof value === 'string' && value.length > 0;
39
- }
40
- /** An error the server answered with, not one the transport raised. The
41
- * refused-connection classifier sniffs message text, and a server message
42
- * quotes the caller's own id or content back verbatim. */
28
+ /** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
29
+ * and a server message quotes the caller's own id or content back verbatim. */
43
30
  export class HttpResponseError extends Error {
44
31
  status;
45
32
  constructor(message, status) {
@@ -48,25 +35,26 @@ export class HttpResponseError extends Error {
48
35
  this.name = 'HttpResponseError';
49
36
  }
50
37
  }
51
- /**
52
- * Throw an Error matching the server's error message. Keeps message strings
53
- * intact so cli.ts handlers can match on the same substrings ("not found",
54
- * "already superseded", "Unknown key_id") whether the call went through
55
- * api.ts or client.ts.
56
- */
38
+ /** Throw an Error carrying the server's message verbatim, so cli.ts handlers can match the same substrings
39
+ * ("not found", "already superseded") as on the direct path. */
57
40
  async function throwForStatus(res) {
58
41
  let message = `${res.status} ${res.statusText}`;
59
42
  try {
60
- const body = await res.json();
61
- if (body && isNonEmptyString(body.error)) {
43
+ const body = await readCappedJson(res, MAX_REPLY_BYTES);
44
+ if (isJsonObject(body) && isJsonString(body.error) && body.error.length > 0) {
62
45
  message = body.error;
63
46
  }
64
47
  }
65
48
  catch {
66
- // body wasn't JSON; fall back to status line.
49
+ // body wasn't JSON or ran past the cap; fall back to status line.
67
50
  }
68
51
  throw new HttpResponseError(message, res.status);
69
52
  }
53
+ /** A 2xx reply's body, read under the cap. */
54
+ async function readReply(res) {
55
+ // SAFETY: the reply comes from hippo's own server, whose route returns this api result as JSON.
56
+ return (await readCappedJson(res, MAX_REPLY_BYTES));
57
+ }
70
58
  export async function remember(serverUrl, apiKey, opts) {
71
59
  const res = await sendWrite(`${serverUrl}/v1/memories`, {
72
60
  method: 'POST',
@@ -75,8 +63,7 @@ export async function remember(serverUrl, apiKey, opts) {
75
63
  });
76
64
  if (!res.ok)
77
65
  await throwForStatus(res);
78
- const result = await res.json();
79
- return result;
66
+ return readReply(res);
80
67
  }
81
68
  export async function forget(serverUrl, apiKey, id) {
82
69
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}`, {
@@ -85,8 +72,7 @@ export async function forget(serverUrl, apiKey, id) {
85
72
  });
86
73
  if (!res.ok)
87
74
  await throwForStatus(res);
88
- const result = await res.json();
89
- return result;
75
+ return readReply(res);
90
76
  }
91
77
  export async function promote(serverUrl, apiKey, id) {
92
78
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/promote`, {
@@ -95,8 +81,7 @@ export async function promote(serverUrl, apiKey, id) {
95
81
  });
96
82
  if (!res.ok)
97
83
  await throwForStatus(res);
98
- const result = await res.json();
99
- return result;
84
+ return readReply(res);
100
85
  }
101
86
  export async function archiveRaw(serverUrl, apiKey, id, reason) {
102
87
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/archive`, {
@@ -106,18 +91,14 @@ export async function archiveRaw(serverUrl, apiKey, id, reason) {
106
91
  });
107
92
  if (!res.ok)
108
93
  await throwForStatus(res);
109
- const result = await res.json();
110
- return result;
94
+ return readReply(res);
111
95
  }
112
96
  function hasObjectCause(e) {
113
- // Node's fs/net system errors (ECONNREFUSED, ECONNRESET) attach the syscall
114
- // code on a non-null object `cause`; the strict-equality checks below
115
- // validate the code value before it is used for anything.
97
+ // Node's fs/net system errors (ECONNREFUSED, ECONNRESET) attach the syscall code on a non-null object `cause`;
98
+ // the strict-equality checks below validate it before use.
116
99
  return typeof e.cause === 'object' && e.cause !== null;
117
100
  }
118
101
  export function classifyTransportFailure(err) {
119
- if (!(err instanceof Error))
120
- return 'none';
121
102
  // The server answered, so the transport worked, whatever the message says.
122
103
  if (err instanceof HttpResponseError)
123
104
  return 'none';
@@ -1,5 +1,6 @@
1
1
  // The payload gate for `hippo compact-resume`.
2
2
  import { isSubagentPayload } from '../store/token-ledger.js';
3
+ import { isJsonObject, isJsonString } from '../util/json.js';
3
4
  /** Fail-closed read of the SessionStart payload: only a manual run or a main-session `source: 'compact'` payload may print. */
4
5
  export function readCompactResumePayload(stdinText, stdinTimedOut) {
5
6
  // An older Claude Code that ignores `matcher: 'compact'` runs this on every SessionStart, so a parsed payload with any other source stays silent.
@@ -18,7 +19,7 @@ export function readCompactResumePayload(stdinText, stdinTimedOut) {
18
19
  // Malformed JSON is handled as a null payload by the fail-closed check below.
19
20
  payload = null;
20
21
  }
21
- if (!payload || typeof payload !== 'object') {
22
+ if (!isJsonObject(payload)) {
22
23
  // Fail closed on malformed non-empty stdin; only a TTY/no-stdin manual run, which never reaches here, prints.
23
24
  suppressOutput = true;
24
25
  }
@@ -29,7 +30,7 @@ export function readCompactResumePayload(stdinText, stdinTimedOut) {
29
30
  if (payload.source !== 'compact' || isSubagentPayload(stdinText)) {
30
31
  suppressOutput = true;
31
32
  }
32
- if (typeof payload.session_id === 'string') {
33
+ if (isJsonString(payload.session_id)) {
33
34
  payloadSessionId = payload.session_id;
34
35
  }
35
36
  }
@@ -1,4 +1,3 @@
1
- import { type CliFlags, type CommandContext } from './flag-values.js';
2
- export declare function cmdContext(hippoRoot: string, args: string[], flags: CliFlags, stdinText?: string): Promise<void>;
1
+ import { type CommandContext } from './flag-values.js';
3
2
  export declare function handleContext({ hippoRoot, args, flags }: CommandContext): Promise<void>;
4
3
  //# sourceMappingURL=context.d.ts.map