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
@@ -28,16 +28,8 @@ export declare function sessionTail(turns: readonly SessionTurn[]): {
28
28
  assistants: string[];
29
29
  };
30
30
  export declare function summariseSessionTurns(turns: readonly SessionTurn[]): string;
31
- /**
32
- * Resolve a transcript path for `--last-session`.
33
- *
34
- * Priority, where the first source present is the only one tried:
35
- * 1. Explicit `transcriptPath` option (from `--transcript <path>`)
36
- * 2. Stdin JSON payload (Claude Code / OpenCode SessionEnd hook shape)
37
- * 3. Most recent `.jsonl` under `<claude config dir>/projects/<any>/` (`~/.claude` unless CLAUDE_CONFIG_DIR is set), only when the caller passes `mayScan` (only the caller knows it is not a hook) and there is no path and no stdin text, because this scan spans every project on the box
38
- *
39
- * Returns null when nothing resolves, a named transcript or payload whose file is missing included. Never throws.
40
- */
31
+ /** Resolve a transcript path for `--last-session`: `transcriptPath`, then the stdin JSON payload, then the newest `.jsonl` in the Claude config dir.
32
+ * The scan runs only with `mayScan` (it spans every project on the box); returns null when nothing resolves, never throws. */
41
33
  export declare function resolveLastSessionTranscript(explicit: string | undefined, stdinText: string | undefined, opts: {
42
34
  mayScan: boolean;
43
35
  }): string | null;
@@ -6,14 +6,8 @@ import { isObjectLike, isStringValue, readSessionEnd } from '../core/capture-con
6
6
  import { copilotTurn } from './copilot-transcript.js';
7
7
  const RECENT_USER_TURNS = 20;
8
8
  const RECENT_ASSISTANT_TURNS = 10;
9
- /**
10
- * Build a compact text summary from a Claude Code / OpenCode / Copilot JSONL transcript.
11
- * Keeps plain user messages and the final chunk of assistant text, drops
12
- * thinking blocks, tool_use, and tool_result noise. Capture reads the same
13
- * turns through `sessionTail`, one text per turn.
14
- *
15
- * Exported for tests.
16
- */
9
+ /** Build a compact text summary from a Claude Code / OpenCode / Copilot JSONL transcript: plain user messages and the final assistant text chunk,
10
+ * without thinking, tool_use and tool_result noise. Exported for tests. */
17
11
  /** Leading markers of the command lines Claude Code writes with type 'user'. */
18
12
  const CLAUDE_CODE_COMMAND_PREFIXES = ['<local-command-', '<command-name>', '<command-message>', '<command-args>'];
19
13
  function isNonHumanUserLine(entry, content) {
@@ -145,16 +139,8 @@ export function summariseSessionTurns(turns) {
145
139
  tailAssistants.join('\n\n'),
146
140
  ].join('\n');
147
141
  }
148
- /**
149
- * Resolve a transcript path for `--last-session`.
150
- *
151
- * Priority, where the first source present is the only one tried:
152
- * 1. Explicit `transcriptPath` option (from `--transcript <path>`)
153
- * 2. Stdin JSON payload (Claude Code / OpenCode SessionEnd hook shape)
154
- * 3. Most recent `.jsonl` under `<claude config dir>/projects/<any>/` (`~/.claude` unless CLAUDE_CONFIG_DIR is set), only when the caller passes `mayScan` (only the caller knows it is not a hook) and there is no path and no stdin text, because this scan spans every project on the box
155
- *
156
- * Returns null when nothing resolves, a named transcript or payload whose file is missing included. Never throws.
157
- */
142
+ /** Resolve a transcript path for `--last-session`: `transcriptPath`, then the stdin JSON payload, then the newest `.jsonl` in the Claude config dir.
143
+ * The scan runs only with `mayScan` (it spans every project on the box); returns null when nothing resolves, never throws. */
158
144
  export function resolveLastSessionTranscript(explicit, stdinText, opts) {
159
145
  if (explicit)
160
146
  return fs.existsSync(explicit) ? explicit : null;
@@ -0,0 +1,3 @@
1
+ import { type HippoDbContext } from '../api/index.js';
2
+ export declare function cliApiContext(hippoRoot: string, tenantId: string): HippoDbContext;
3
+ //# sourceMappingURL=api-context.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { adminActor } from '../api/index.js';
2
+ // The one place the CLI names its audit actor; root is a parameter because some verbs target the global store.
3
+ export function cliApiContext(hippoRoot, tenantId) {
4
+ return { hippoRoot, tenantId, actor: adminActor('cli') };
5
+ }
6
+ //# sourceMappingURL=api-context.js.map
@@ -1,28 +1,5 @@
1
- /**
2
- * Audit log retention pruning.
3
- *
4
- * The `audit_log` table grows unbounded by default — every recall, write,
5
- * outcome, sleep, supersede, promote, forget, archive_raw, auth_revoke,
6
- * and auth_create emits a row. On a long-running deployment, this can
7
- * accumulate to millions of rows and slow down both audit queries and
8
- * incremental SQLite VACUUMs.
9
- *
10
- * Regulatory retention floors (HIPAA, SOX, GDPR) are why the prune is opt-in
11
- * per tenant and emits its own audit trail event.
12
- *
13
- * Design notes:
14
- * - Per-tenant by default (matches existing audit CLI conventions).
15
- * - The prune itself emits an `audit_prune` audit row with metadata
16
- * `{cutoff, count, dryRun}`, recursively recording the maintenance op
17
- * in the audit trail. Operators investigating "where did old rows go"
18
- * have one row left to find regardless of retention floor.
19
- * - Dry-run mode returns the count without deleting — first-time
20
- * operator safety.
21
- * - DELETE is wrapped in a transaction so a mid-operation crash leaves
22
- * audit_log in a consistent state.
23
- * - The audit_prune row itself is NEVER pruned by the same call (it's
24
- * written AFTER the DELETE WHERE ts < cutoff, so ts > cutoff).
25
- */
1
+ /** Audit log retention pruning: opt-in per tenant because retention floors (HIPAA, SOX, GDPR) apply.
2
+ * The audit_prune row is written after the DELETE, so a call never prunes its own record. */
26
3
  export interface PruneAuditOpts {
27
4
  /** Cutoff in days. Rows with `ts < (now - N days)` are deleted. */
28
5
  olderThanDays: number;
@@ -41,21 +18,11 @@ export interface PruneAuditResult {
41
18
  /** Echo back whether this was a dry run. */
42
19
  dryRun: boolean;
43
20
  }
44
- /**
45
- * Compute the cutoff ISO timestamp for an N-days-ago cutoff. Exported for
46
- * testability so tests can pin "now" without mocking Date.
47
- */
21
+ /** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
48
22
  export declare function computeCutoff(days: number, now?: Date): string;
49
- /**
50
- * Delete audit_log rows older than `olderThanDays` days for `tenantId`.
51
- * Emits an `audit_prune` event with metadata `{cutoff, count, dryRun}`.
52
- *
53
- * Throws on invalid inputs (non-positive days, missing tenantId).
54
- */
23
+ /** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
24
+ * Throws on non-positive days or a missing tenantId. */
55
25
  export declare function pruneAuditLog(hippoRoot: string, opts: PruneAuditOpts): PruneAuditResult;
56
- /**
57
- * Parse the `--older-than <value>` flag. Accepts either bare integer days
58
- * (`30`) or integer with `d` suffix (`30d`). Throws on invalid format.
59
- */
26
+ /** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
60
27
  export declare function parseOlderThanFlag(raw: string): number;
61
28
  //# sourceMappingURL=audit-prune.d.ts.map
@@ -1,34 +1,8 @@
1
- /**
2
- * Audit log retention pruning.
3
- *
4
- * The `audit_log` table grows unbounded by default — every recall, write,
5
- * outcome, sleep, supersede, promote, forget, archive_raw, auth_revoke,
6
- * and auth_create emits a row. On a long-running deployment, this can
7
- * accumulate to millions of rows and slow down both audit queries and
8
- * incremental SQLite VACUUMs.
9
- *
10
- * Regulatory retention floors (HIPAA, SOX, GDPR) are why the prune is opt-in
11
- * per tenant and emits its own audit trail event.
12
- *
13
- * Design notes:
14
- * - Per-tenant by default (matches existing audit CLI conventions).
15
- * - The prune itself emits an `audit_prune` audit row with metadata
16
- * `{cutoff, count, dryRun}`, recursively recording the maintenance op
17
- * in the audit trail. Operators investigating "where did old rows go"
18
- * have one row left to find regardless of retention floor.
19
- * - Dry-run mode returns the count without deleting — first-time
20
- * operator safety.
21
- * - DELETE is wrapped in a transaction so a mid-operation crash leaves
22
- * audit_log in a consistent state.
23
- * - The audit_prune row itself is NEVER pruned by the same call (it's
24
- * written AFTER the DELETE WHERE ts < cutoff, so ts > cutoff).
25
- */
1
+ /** Audit log retention pruning: opt-in per tenant because retention floors (HIPAA, SOX, GDPR) apply.
2
+ * The audit_prune row is written after the DELETE, so a call never prunes its own record. */
26
3
  import { pruneAuditRows } from '../store/audit.js';
27
4
  import { DAY_MS } from '../util/time.js';
28
- /**
29
- * Compute the cutoff ISO timestamp for an N-days-ago cutoff. Exported for
30
- * testability so tests can pin "now" without mocking Date.
31
- */
5
+ /** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
32
6
  export function computeCutoff(days, now = new Date()) {
33
7
  const cutoff = new Date(now.getTime() - days * DAY_MS);
34
8
  return cutoff.toISOString();
@@ -36,12 +10,8 @@ export function computeCutoff(days, now = new Date()) {
36
10
  function isTenantIdString(value) {
37
11
  return typeof value === 'string';
38
12
  }
39
- /**
40
- * Delete audit_log rows older than `olderThanDays` days for `tenantId`.
41
- * Emits an `audit_prune` event with metadata `{cutoff, count, dryRun}`.
42
- *
43
- * Throws on invalid inputs (non-positive days, missing tenantId).
44
- */
13
+ /** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
14
+ * Throws on non-positive days or a missing tenantId. */
45
15
  export function pruneAuditLog(hippoRoot, opts) {
46
16
  if (!Number.isFinite(opts.olderThanDays) || opts.olderThanDays <= 0) {
47
17
  throw new Error(`pruneAuditLog: olderThanDays must be a positive number, got ${opts.olderThanDays}`);
@@ -55,10 +25,7 @@ export function pruneAuditLog(hippoRoot, opts) {
55
25
  const count = pruneAuditRows(hippoRoot, { tenantId: opts.tenantId, cutoff, actor, olderThanDays: opts.olderThanDays, dryRun });
56
26
  return { cutoff, count, dryRun };
57
27
  }
58
- /**
59
- * Parse the `--older-than <value>` flag. Accepts either bare integer days
60
- * (`30`) or integer with `d` suffix (`30d`). Throws on invalid format.
61
- */
28
+ /** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
62
29
  export function parseOlderThanFlag(raw) {
63
30
  const m = raw.match(/^(\d+)(d)?$/i);
64
31
  if (!m) {
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleAudit({ hippoRoot, args, flags }: CommandContext): Promise<void>;
2
+ export declare function handleAudit({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=audit.d.ts.map
package/dist/cli/audit.js CHANGED
@@ -1,19 +1,18 @@
1
1
  // `hippo audit`: list and prune the audit log.
2
2
  import { loadAllEntries } from '../store/entry-reads.js';
3
- import { deleteEntry, memoriesBackingObjects } from '../store/delete-and-batch.js';
3
+ import { memoriesBackingObjects } from '../store/delete-and-batch.js';
4
4
  import { auditMemories, AUDIT_OPS } from '../store/audit.js';
5
5
  import * as api from '../api/index.js';
6
- import { resolveTenantId } from '../store/tenant.js';
7
6
  import { pruneAuditLog, parseOlderThanFlag } from './audit-prune.js';
8
7
  import { printError } from './output.js';
9
- import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
8
+ import { cliApiContext } from './api-context.js';
9
+ import { boolFlag, flagIsTrue, isBooleanFlag, stringFlag } from './flag-values.js';
10
10
  import { requireInit, resolveAuthRoot } from './shared.js';
11
- import { repairAutomaticMemories } from './quality-repair.js';
12
- import { getGlobalRoot } from '../sharing/shared.js';
11
+ import { repairAutomaticMemories } from '../store/quality-repair.js';
12
+ import { getGlobalRoot } from '../sharing/global-store.js';
13
13
  import { errorMessage } from '../util/log.js';
14
- // ---------------------------------------------------------------------------
14
+ import { CliExit } from './exit.js';
15
15
  // Audit log subcommands (`hippo audit list`)
16
- // ---------------------------------------------------------------------------
17
16
  const VALID_AUDIT_OPS = new Set(AUDIT_OPS);
18
17
  function formatAuditRow(ev) {
19
18
  const target = ev.targetId ?? '-';
@@ -22,40 +21,41 @@ function formatAuditRow(ev) {
22
21
  }
23
22
  function readAuditOp(flags) {
24
23
  const opFlag = stringFlag(flags, 'op');
24
+ // SAFETY: Set.has only compares by value, so a string outside the audit ops is a plain miss.
25
25
  if (opFlag && !VALID_AUDIT_OPS.has(opFlag)) {
26
26
  // Built from the Set so the message cannot drift from the valid ops.
27
27
  const expected = Array.from(VALID_AUDIT_OPS).join(' | ');
28
28
  printError(`Unknown --op value: ${opFlag}. Expected one of: ${expected}.`);
29
- process.exit(1);
29
+ throw new CliExit(1);
30
30
  }
31
+ // SAFETY: the exit above rejects every non-empty opFlag outside VALID_AUDIT_OPS, and an empty one is returned as given.
31
32
  return opFlag;
32
33
  }
33
34
  function readAuditLimit(flags) {
34
35
  const limitRaw = flags['limit'];
35
36
  let limit = 100;
36
- if (limitRaw !== undefined && typeof limitRaw !== 'boolean') {
37
+ if (limitRaw !== undefined && !isBooleanFlag(limitRaw)) {
37
38
  const parsed = parseInt(String(limitRaw), 10);
38
39
  if (!Number.isFinite(parsed)) {
39
40
  printError(`Invalid --limit value: ${String(limitRaw)} (expected a positive integer).`);
40
- process.exit(1);
41
+ throw new CliExit(1);
41
42
  }
42
43
  limit = parsed;
43
44
  }
44
45
  if (limit < 1 || limit > 10000) {
45
46
  printError(`--limit must be between 1 and 10000 (got ${limit}).`);
46
- process.exit(1);
47
+ throw new CliExit(1);
47
48
  }
48
49
  return limit;
49
50
  }
50
- async function cmdAuditList(hippoRoot, flags) {
51
+ async function cmdAuditList(hippoRoot, tenantId, flags) {
51
52
  const root = resolveAuthRoot(hippoRoot, flags);
52
53
  const asJson = boolFlag(flags, 'json');
53
- const tenantId = resolveTenantId({});
54
54
  const op = readAuditOp(flags);
55
55
  const since = stringFlag(flags, 'since');
56
56
  if (since !== undefined && !Number.isFinite(new Date(since).getTime())) {
57
57
  printError(`Invalid --since: ${since} (expected an ISO timestamp like 2026-04-22 or 2026-04-22T12:00:00Z).`);
58
- process.exit(1);
58
+ throw new CliExit(1);
59
59
  }
60
60
  const limit = readAuditLimit(flags);
61
61
  const ctx = { hippoRoot: root, tenantId, actor: { subject: 'cli', role: 'admin' } };
@@ -73,11 +73,11 @@ async function cmdAuditList(hippoRoot, flags) {
73
73
  console.log(formatAuditRow(ev));
74
74
  }
75
75
  }
76
- function cmdAuditPrune(hippoRoot, flags) {
76
+ function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
77
77
  const olderThanRaw = stringFlag(flags, 'older-than') ?? '';
78
78
  if (!olderThanRaw) {
79
79
  printError('Usage: hippo audit prune --older-than <Nd> [--dry-run] [--tenant <t>]');
80
- process.exit(1);
80
+ throw new CliExit(1);
81
81
  }
82
82
  let olderThanDays;
83
83
  try {
@@ -85,9 +85,9 @@ function cmdAuditPrune(hippoRoot, flags) {
85
85
  }
86
86
  catch (e) {
87
87
  printError(errorMessage(e));
88
- process.exit(1);
88
+ throw new CliExit(1);
89
89
  }
90
- const tenantId = stringFlag(flags, 'tenant')?.trim() || resolveTenantId({});
90
+ const tenantId = stringFlag(flags, 'tenant')?.trim() || ctxTenantId;
91
91
  const dryRun = flagIsTrue(flags, 'dry-run');
92
92
  const asJson = boolFlag(flags, 'json');
93
93
  const result = pruneAuditLog(hippoRoot, { olderThanDays, tenantId, dryRun, actor: 'cli' });
@@ -101,22 +101,22 @@ function cmdAuditPrune(hippoRoot, flags) {
101
101
  console.log('(dry-run; re-run without --dry-run to actually delete)');
102
102
  }
103
103
  }
104
- async function cmdAuditLog(hippoRoot, args, flags) {
104
+ async function cmdAuditLog(hippoRoot, tenantId, args, flags) {
105
105
  const sub = args[0];
106
106
  if (sub === 'list') {
107
- await cmdAuditList(hippoRoot, flags);
107
+ await cmdAuditList(hippoRoot, tenantId, flags);
108
108
  return;
109
109
  }
110
110
  if (sub === 'prune') {
111
- cmdAuditPrune(hippoRoot, flags);
111
+ cmdAuditPrune(hippoRoot, tenantId, flags);
112
112
  return;
113
113
  }
114
114
  printError(`Unknown audit subcommand: ${sub}. Expected: list | prune.`);
115
- process.exit(1);
115
+ throw new CliExit(1);
116
116
  }
117
- function auditRepair(hippoRoot, flags) {
117
+ function auditRepair(hippoRoot, tenantId, flags) {
118
118
  const apply = flagIsTrue(flags, 'apply') && flags['dry-run'] !== true;
119
- const result = repairAutomaticMemories(flags['global'] ? getGlobalRoot() : hippoRoot, { tenantId: resolveTenantId({}), apply });
119
+ const result = repairAutomaticMemories(flags['global'] ? getGlobalRoot() : hippoRoot, { tenantId, apply });
120
120
  if (flags['json']) {
121
121
  console.log(JSON.stringify(result));
122
122
  return;
@@ -136,14 +136,15 @@ function auditRepair(hippoRoot, flags) {
136
136
  if (!apply)
137
137
  console.log('Preview only. Add --apply to move set-aside memories to dormant storage. Pin a review memory to keep it.');
138
138
  }
139
- function fixAuditErrors(hippoRoot, result, flags) {
139
+ function fixAuditErrors(hippoRoot, tenantId, result, flags) {
140
140
  const errors = result.issues.filter(i => i.severity === 'error');
141
141
  if (errors.length > 0 && flagIsTrue(flags, 'dry-run')) {
142
142
  console.log(`\nWould remove ${errors.length} error-severity memories (dry run, nothing deleted).`);
143
143
  console.log(`${result.issues.length - errors.length} warnings would remain (review manually).`);
144
144
  }
145
145
  else if (errors.length > 0) {
146
- const removedCount = errors.filter((issue) => deleteEntry(hippoRoot, issue.memoryId, { reason: `audit --fix: ${issue.reason}`, automatic: true })).length;
146
+ const ctx = cliApiContext(hippoRoot, tenantId);
147
+ const removedCount = api.removeAuditErrors(ctx, 'audit --fix', errors).length;
147
148
  console.log(`\nRemoved ${removedCount} error-severity memories.`);
148
149
  console.log(`${result.issues.length - errors.length} warnings remain (review manually).`);
149
150
  }
@@ -151,20 +152,18 @@ function fixAuditErrors(hippoRoot, result, flags) {
151
152
  console.log(`\nNo error-severity issues. Warnings require manual review.`);
152
153
  }
153
154
  }
154
- export async function handleAudit({ hippoRoot, args, flags }) {
155
+ export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
155
156
  if (args[0] === 'repair') {
156
- auditRepair(hippoRoot, flags);
157
+ auditRepair(hippoRoot, tenantId, flags);
157
158
  return;
158
159
  }
159
- // `audit list` and `audit prune` -> audit-log subcommands.
160
- // Other forms (no sub, --fix) keep the existing memory-quality auditor
161
- // for backwards compatibility.
160
+ // `audit list` and `audit prune` are the audit-log subcommands; other forms (no sub, --fix) keep the memory-quality auditor.
162
161
  if (args[0] === 'list' || args[0] === 'prune') {
163
- await cmdAuditLog(hippoRoot, args, flags);
162
+ await cmdAuditLog(hippoRoot, tenantId, args, flags);
164
163
  return;
165
164
  }
166
165
  requireInit(hippoRoot);
167
- const entries = loadAllEntries(hippoRoot, resolveTenantId({}));
166
+ const entries = loadAllEntries(hippoRoot, tenantId);
168
167
  const result = auditMemories(entries, memoriesBackingObjects(hippoRoot));
169
168
  const shouldFix = boolFlag(flags, 'fix');
170
169
  if (result.issues.length === 0) {
@@ -178,7 +177,7 @@ export async function handleAudit({ hippoRoot, args, flags }) {
178
177
  console.log(` "${issue.content.slice(0, 80)}${issue.content.length > 80 ? '...' : ''}"`);
179
178
  }
180
179
  if (shouldFix) {
181
- fixAuditErrors(hippoRoot, result, flags);
180
+ fixAuditErrors(hippoRoot, tenantId, result, flags);
182
181
  }
183
182
  else {
184
183
  console.log(`\nRun with --fix to auto-remove error-severity issues.`);
@@ -1,3 +1,3 @@
1
- import { type CliFlags } from './flag-values.js';
2
- export declare function cmdAuth(hippoRoot: string, args: string[], flags: CliFlags): void;
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleAuth({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
3
  //# sourceMappingURL=auth.d.ts.map
package/dist/cli/auth.js CHANGED
@@ -1,44 +1,60 @@
1
1
  // `hippo auth`: create, list, revoke and scope API keys.
2
2
  import { listApiKeys } from '../store/auth.js';
3
3
  import * as api from '../api/index.js';
4
- import { resolveTenantId } from '../store/tenant.js';
4
+ import { cliApiContext } from './api-context.js';
5
5
  import { printError } from './output.js';
6
6
  import { boolFlag, stringFlag } from './flag-values.js';
7
7
  import { resolveAuthRoot } from './shared.js';
8
8
  import { errorMessage } from '../util/log.js';
9
+ import { CliExit } from './exit.js';
9
10
  // ---------------------------------------------------------------------------
10
11
  // Auth subcommands
11
12
  // ---------------------------------------------------------------------------
12
- function cmdAuthCreate(hippoRoot, flags) {
13
+ /** --role as given, or undefined for the default; anything else exits 1, so a typo never picks a role. */
14
+ function roleFlagOrExit(flags) {
15
+ const roleFlag = stringFlag(flags, 'role');
16
+ if (roleFlag !== undefined && roleFlag !== 'admin' && roleFlag !== 'member') {
17
+ printError(`Invalid --role value: '${roleFlag}'. Use 'admin' or 'member'.`);
18
+ throw new CliExit(1);
19
+ }
20
+ return roleFlag;
21
+ }
22
+ /** Says which defaults a mint took and how to ask for the wider key. Stderr keeps --json output clean. */
23
+ function noteMintDefaults(roleGiven, expiryGiven) {
24
+ const notes = [];
25
+ if (!roleGiven)
26
+ notes.push('no --role given, so this is a member key (pass --role admin for an admin key)');
27
+ if (!expiryGiven)
28
+ notes.push('no --ttl-days or --no-expiry given, so it expires in 90 days');
29
+ if (notes.length > 0)
30
+ printError(`hippo auth create: ${notes.join('; ')}.`);
31
+ }
32
+ function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
13
33
  const root = resolveAuthRoot(hippoRoot, flags);
14
34
  const tenantFlag = stringFlag(flags, 'tenant');
15
35
  const labelFlag = stringFlag(flags, 'label');
16
36
  const asJson = boolFlag(flags, 'json');
17
- // Accepts 'admin' | 'member' only; anything else exits 1 so a typo doesn't silently default to admin.
18
- const roleFlag = stringFlag(flags, 'role');
19
- let role = 'admin';
20
- if (roleFlag !== undefined) {
21
- if (roleFlag !== 'admin' && roleFlag !== 'member') {
22
- printError(`Invalid --role value: '${roleFlag}'. Use 'admin' or 'member'.`);
23
- process.exit(1);
24
- }
25
- role = roleFlag;
26
- }
27
- else {
28
- // The default is the widest key hippo mints, so the operator is told at the moment of choosing. Stderr keeps --json output clean.
29
- printError('hippo auth create: no --role given, so this is an admin key, and it never expires. Pass --role member for a narrower key; revoke either with `hippo auth revoke <key_id>`.');
30
- }
37
+ const role = roleFlagOrExit(flags);
38
+ const ttlFlag = stringFlag(flags, 'ttl-days');
39
+ const ttlDays = ttlFlag === undefined ? undefined : Number(ttlFlag);
40
+ const noExpiry = boolFlag(flags, 'no-expiry');
31
41
  // The CLI's --tenant flag is the only legitimate cross-tenant override
32
42
  // (admin minting a key for another tenant from the local machine). It
33
43
  // flows through ctx.tenantId, NOT through opts — authCreate's opts no
34
44
  // longer accepts a tenantId field, so the HTTP layer cannot smuggle a
35
45
  // body.tenantId across.
36
- const ctx = {
37
- hippoRoot: root,
38
- tenantId: tenantFlag ?? resolveTenantId({}),
39
- actor: api.adminActor('cli'),
40
- };
41
- const result = api.authCreate(ctx, { label: labelFlag, role });
46
+ const ctx = cliApiContext(root, tenantFlag ?? defaultTenantId);
47
+ let result;
48
+ try {
49
+ result = api.authCreate(ctx, { label: labelFlag, role, ttlDays, noExpiry: noExpiry || undefined });
50
+ }
51
+ catch (err) {
52
+ if (!(err instanceof api.BadRequestError))
53
+ throw err;
54
+ printError(`hippo auth create: ${err.message} (--ttl-days, --no-expiry).`);
55
+ throw new CliExit(1);
56
+ }
57
+ noteMintDefaults(role !== undefined, ttlFlag !== undefined || noExpiry);
42
58
  if (asJson) {
43
59
  console.log(JSON.stringify({
44
60
  keyId: result.keyId,
@@ -46,12 +62,14 @@ function cmdAuthCreate(hippoRoot, flags) {
46
62
  tenantId: result.tenantId,
47
63
  label: labelFlag ?? null,
48
64
  role: result.role,
65
+ expiresAt: result.expiresAt,
49
66
  }));
50
67
  return;
51
68
  }
52
69
  console.log(`key_id: ${result.keyId}`);
53
70
  console.log(`plaintext: ${result.plaintext}`);
54
71
  console.log(`role: ${result.role}`);
72
+ console.log(`expires: ${result.expiresAt ?? 'never'}`);
55
73
  console.log('');
56
74
  console.log('!! WARNING: this is the ONLY time the plaintext key will be shown. !!');
57
75
  console.log('!! Copy it now. Hippo stores only a scrypt hash and cannot recover it. !!');
@@ -82,24 +100,24 @@ function cmdAuthList(hippoRoot, flags) {
82
100
  }
83
101
  }
84
102
  // The local CLI owns every tenant, so revoke and grant run in the key's own tenant.
85
- function keyContext(root, keyId) {
86
- const hostCtx = { hippoRoot: root, tenantId: resolveTenantId({}), actor: api.adminActor('cli') };
103
+ function keyContext(root, tenantId, keyId) {
104
+ const hostCtx = cliApiContext(root, tenantId);
87
105
  const keyTenant = api.authKeyTenant(hostCtx, keyId);
88
106
  if (keyTenant === undefined) {
89
107
  printError(`Unknown key_id: ${keyId}`);
90
- process.exit(1);
108
+ throw new CliExit(1);
91
109
  }
92
110
  return { ...hostCtx, tenantId: keyTenant };
93
111
  }
94
- function cmdAuthRevoke(hippoRoot, keyId, flags) {
95
- const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), keyId);
112
+ function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
113
+ const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
96
114
  let revokedAt;
97
115
  try {
98
116
  revokedAt = api.authRevoke(ctx, keyId).revokedAt;
99
117
  }
100
118
  catch (err) {
101
119
  printError(`Error: ${errorMessage(err)}`);
102
- process.exit(1);
120
+ throw new CliExit(1);
103
121
  }
104
122
  if (flags['json']) {
105
123
  console.log(JSON.stringify({ keyId, revokedAt }));
@@ -108,8 +126,8 @@ function cmdAuthRevoke(hippoRoot, keyId, flags) {
108
126
  console.log(`Revoked ${keyId} at ${revokedAt}`);
109
127
  }
110
128
  /** `hippo auth grant|ungrant <key_id> <scope>`, routed through api so the tenant, restricted-scope and audit checks live in one place. */
111
- function cmdAuthScopeGrant(hippoRoot, keyId, scope, grant, flags) {
112
- const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), keyId);
129
+ function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
130
+ const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
113
131
  try {
114
132
  if (grant)
115
133
  api.authGrant(ctx, keyId, scope);
@@ -118,7 +136,7 @@ function cmdAuthScopeGrant(hippoRoot, keyId, scope, grant, flags) {
118
136
  }
119
137
  catch (err) {
120
138
  printError(`Error: ${errorMessage(err)}`);
121
- process.exit(1);
139
+ throw new CliExit(1);
122
140
  }
123
141
  if (flags['json']) {
124
142
  console.log(JSON.stringify({ keyId, scope, granted: grant }));
@@ -126,16 +144,16 @@ function cmdAuthScopeGrant(hippoRoot, keyId, scope, grant, flags) {
126
144
  }
127
145
  console.log(grant ? `Granted ${keyId} read access to ${scope}` : `Removed ${keyId}'s grant on ${scope}`);
128
146
  }
129
- export function cmdAuth(hippoRoot, args, flags) {
147
+ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
130
148
  const sub = args[0];
131
149
  if (!sub) {
132
150
  printError('Usage: hippo auth <create|list|revoke|grant|ungrant> [options]');
133
- process.exit(1);
151
+ throw new CliExit(1);
134
152
  }
135
153
  const subArgs = args.slice(1);
136
154
  switch (sub) {
137
155
  case 'create':
138
- cmdAuthCreate(hippoRoot, flags);
156
+ cmdAuthCreate(hippoRoot, tenantId, flags);
139
157
  return;
140
158
  case 'list':
141
159
  cmdAuthList(hippoRoot, flags);
@@ -144,9 +162,9 @@ export function cmdAuth(hippoRoot, args, flags) {
144
162
  const keyId = subArgs[0];
145
163
  if (!keyId) {
146
164
  printError('Usage: hippo auth revoke <key_id>');
147
- process.exit(1);
165
+ throw new CliExit(1);
148
166
  }
149
- cmdAuthRevoke(hippoRoot, keyId, flags);
167
+ cmdAuthRevoke(hippoRoot, tenantId, keyId, flags);
150
168
  return;
151
169
  }
152
170
  case 'grant':
@@ -154,14 +172,14 @@ export function cmdAuth(hippoRoot, args, flags) {
154
172
  const [keyId, scope] = subArgs;
155
173
  if (!keyId || !scope) {
156
174
  printError(`Usage: hippo auth ${sub} <key_id> <scope>`);
157
- process.exit(1);
175
+ throw new CliExit(1);
158
176
  }
159
- cmdAuthScopeGrant(hippoRoot, keyId, scope, sub === 'grant', flags);
177
+ cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, sub === 'grant', flags);
160
178
  return;
161
179
  }
162
180
  default:
163
181
  printError(`Unknown auth subcommand: ${sub}. Expected: create | list | revoke | grant | ungrant.`);
164
- process.exit(1);
182
+ throw new CliExit(1);
165
183
  }
166
184
  }
167
185
  //# sourceMappingURL=auth.js.map
@@ -1,5 +1,5 @@
1
- import { type CliFlags } from './flag-values.js';
2
- export declare function cmdProjectBrief(hippoRoot: string, args: string[], flags: CliFlags): void;
3
- export declare function cmdGraph(hippoRoot: string, args: string[], flags: CliFlags): void;
4
- export declare function cmdCustomerNote(hippoRoot: string, args: string[], flags: CliFlags): void;
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleProjectBrief({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
+ export declare function handleGraph({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
+ export declare function handleCustomerNote({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
5
  //# sourceMappingURL=briefs.d.ts.map