hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -1,12 +1,11 @@
1
1
  // Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
2
3
  import * as path from 'path';
3
- import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
4
- import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
5
- import { RejectedValueError } from '../store/rejection.js';
4
+ import { unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
5
+ import { RejectedValueError } from '../core/api-errors.js';
6
6
  import { loadConfig } from '../core/config.js';
7
7
  import { RawAppendOnlyError } from '../core/raw-append-only.js';
8
8
  import { isGitRepo } from '../learn/autolearn.js';
9
- import { invalidateMatching } from '../learn/invalidation.js';
10
9
  import * as api from '../api/index.js';
11
10
  import { getMemory } from '../api/memories.js';
12
11
  import * as client from './client.js';
@@ -22,7 +21,7 @@ const CONFLICT_PREVIEW_CHARS = 120;
22
21
  const REJECTED_DIGEST_LIST_CHARS = 16;
23
22
  const DORMANT_PREVIEW_CHARS = 100;
24
23
  const STRENGTH_DECIMALS = 3;
25
- export function handleOutcome({ hippoRoot, tenantId, flags }) {
24
+ export async function handleOutcome({ hippoRoot, tenantId, flags }) {
26
25
  requireInit(hippoRoot);
27
26
  const good = boolFlag(flags, 'good');
28
27
  const bad = boolFlag(flags, 'bad');
@@ -35,10 +34,10 @@ export function handleOutcome({ hippoRoot, tenantId, flags }) {
35
34
  const specificId = flags['id'] ? String(flags['id']) : null;
36
35
  let updated;
37
36
  if (specificId) {
38
- updated = api.outcome(ctx, [specificId], good).applied;
37
+ updated = (await api.outcome(ctx, [specificId], good)).applied;
39
38
  }
40
39
  else {
41
- const r = api.outcomeForLastRecall(ctx, good);
40
+ const r = await api.outcomeForLastRecall(ctx, good);
42
41
  if (r.ids.length === 0) {
43
42
  console.log('No recent recall to apply outcome to. Use --id <id> to target a specific memory.');
44
43
  return;
@@ -49,17 +48,17 @@ export function handleOutcome({ hippoRoot, tenantId, flags }) {
49
48
  }
50
49
  // Shared between the forget dispatch and cmdForget so the message can't drift.
51
50
  const ARCHIVE_REASON_REQUIRED = 'hippo forget --archive requires --reason "<why>" (recorded on the archive).';
52
- function cmdForget(hippoRoot, tenantId, id, flags) {
51
+ async function cmdForget(hippoRoot, tenantId, id, flags) {
53
52
  requireInit(hippoRoot);
54
53
  const ctx = cliApiContext(hippoRoot, tenantId);
55
54
  // Raw memories (connector ingestion) are append-only: a BEFORE-DELETE trigger aborts any delete,
56
55
  // so archiveRaw is the sanctioned removal path and records ctx.actor as the archiver.
57
56
  if (flagIsTrue(flags, 'archive')) {
58
- archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
57
+ await archiveForgottenRaw(ctx, id, stringFlag(flags, 'reason') ?? null);
59
58
  return;
60
59
  }
61
60
  try {
62
- api.forget(ctx, id);
61
+ await api.forget(ctx, id);
63
62
  console.log(`Forgot ${id}`);
64
63
  }
65
64
  catch (err) {
@@ -67,13 +66,13 @@ function cmdForget(hippoRoot, tenantId, id, flags) {
67
66
  throw new CliExit(1);
68
67
  }
69
68
  }
70
- function archiveForgottenRaw(ctx, id, reason) {
69
+ async function archiveForgottenRaw(ctx, id, reason) {
71
70
  if (!reason) {
72
71
  printError(ARCHIVE_REASON_REQUIRED);
73
72
  throw new CliExit(1);
74
73
  }
75
74
  try {
76
- api.archiveRaw(ctx, id, reason);
75
+ await api.archiveRaw(ctx, id, reason);
77
76
  console.log(`Archived ${id}`);
78
77
  }
79
78
  catch (err) {
@@ -116,12 +115,12 @@ async function previewForget(hippoRoot, tenantId, id, archive) {
116
115
  printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
117
116
  throw new CliExit(1);
118
117
  }
119
- const snippet = entry.content.length > CONTENT_PREVIEW_CHARS ? `${entry.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : entry.content;
118
+ const snippet = truncateWithEllipsis(entry.content, CONTENT_PREVIEW_CHARS);
120
119
  console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
121
120
  }
122
- export function handleConflicts({ hippoRoot, flags }) {
121
+ export function handleConflicts({ hippoRoot, tenantId, flags }) {
123
122
  requireInit(hippoRoot);
124
- const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
123
+ const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), String(flags['status'] ?? 'open'), { everyTenant: true });
125
124
  if (flags['json']) {
126
125
  console.log(JSON.stringify({ conflicts }, null, 2));
127
126
  return;
@@ -140,7 +139,7 @@ export function handleConflicts({ hippoRoot, flags }) {
140
139
  }
141
140
  /** Shown when --keep is missing, to help the user decide. */
142
141
  async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
143
- const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
142
+ const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), 'open');
144
143
  const conflict = conflicts.find((c) => c.id === conflictId);
145
144
  if (!conflict) {
146
145
  printError(`Conflict ${conflictId} not found or already resolved.`);
@@ -155,11 +154,11 @@ async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
155
154
  const entryB = await getMemory(ctx, conflict.memory_b_id);
156
155
  if (entryA) {
157
156
  console.log(` [A] ${conflict.memory_a_id}:`);
158
- console.log(` ${entryA.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryA.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
157
+ console.log(` ${truncateWithEllipsis(entryA.content, CONFLICT_PREVIEW_CHARS)}`);
159
158
  }
160
159
  if (entryB) {
161
160
  console.log(` [B] ${conflict.memory_b_id}:`);
162
- console.log(` ${entryB.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryB.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
161
+ console.log(` ${truncateWithEllipsis(entryB.content, CONFLICT_PREVIEW_CHARS)}`);
163
162
  }
164
163
  console.log('');
165
164
  console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
@@ -183,14 +182,12 @@ export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
183
182
  // --reason is optional here, unlike `hippo reject`: resolve already has the conflict id and keepId.
184
183
  const rejectLoser = boolFlag(flags, 'reject-loser');
185
184
  const reasonFlag = stringFlag(flags, 'reason');
186
- const result = resolveConflict(hippoRoot, conflictId, keepId, forgetLoser, tenantId, {
187
- rejectLoserValue: rejectLoser,
185
+ const result = api.resolveMemoryConflict(cliApiContext(hippoRoot, tenantId), conflictId, {
186
+ keepId,
187
+ forget: forgetLoser,
188
+ rejectLoser,
188
189
  reason: reasonFlag,
189
190
  });
190
- if (!result) {
191
- printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
192
- throw new CliExit(1);
193
- }
194
191
  const action = rejectLoser
195
192
  ? 'rejected (tombstoned) and removed'
196
193
  : forgetLoser
@@ -222,10 +219,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
222
219
  throw new CliExit(1);
223
220
  }
224
221
  try {
225
- const result = rejectValue({
226
- hippoRoot: root,
227
- tenantId,
228
- actor: 'cli',
222
+ const result = api.rejectOnHost(cliApiContext(root, tenantId), {
229
223
  reason,
230
224
  memoryId: valueFlag === undefined ? memoryId : undefined,
231
225
  value: valueFlag,
@@ -239,7 +233,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
239
233
  }
240
234
  function printRejected(result, reason) {
241
235
  const digestPrefix = result.digest.slice(0, DIGEST_DISPLAY_CHARS);
242
- const preview = result.content.length > CONTENT_PREVIEW_CHARS ? `${result.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : result.content;
236
+ const preview = truncateWithEllipsis(result.content, CONTENT_PREVIEW_CHARS);
243
237
  console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
244
238
  console.log(` Reason: ${reason}`);
245
239
  if (result.removedIds.length > 0) {
@@ -357,10 +351,12 @@ function printDormantRows(rows, hasQuery, root) {
357
351
  }
358
352
  console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${hasQuery ? ' matching' : ''} (newest first):\n`);
359
353
  for (const row of rows) {
360
- const preview = row.content.length > DORMANT_PREVIEW_CHARS ? `${row.content.slice(0, DORMANT_PREVIEW_CHARS)}...` : row.content;
354
+ const preview = truncateWithEllipsis(row.content, DORMANT_PREVIEW_CHARS);
361
355
  console.log(`--- ${row.id}`);
362
356
  console.log(` ${preview}`);
363
- console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} (${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
357
+ console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} ` +
358
+ `(${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})` +
359
+ `${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
364
360
  console.log('');
365
361
  }
366
362
  console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
@@ -457,9 +453,9 @@ export async function handleForget({ hippoRoot, tenantId, args, flags }) {
457
453
  });
458
454
  if (routed)
459
455
  return;
460
- cmdForget(hippoRoot, tenantId, id, flags);
456
+ await cmdForget(hippoRoot, tenantId, id, flags);
461
457
  }
462
- function invalidateChurn(hippoRoot, args, flags) {
458
+ function invalidateChurn(hippoRoot, tenantId, args, flags) {
463
459
  if (args[0] || flags['id'] !== undefined) {
464
460
  printError('Usage: hippo invalidate --churn [--dry-run]');
465
461
  printError('--churn takes no pattern or --id.');
@@ -471,7 +467,7 @@ function invalidateChurn(hippoRoot, args, flags) {
471
467
  }
472
468
  const churnDryRun = flagIsTrue(flags, 'dry-run');
473
469
  let churnFailed = false;
474
- for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
470
+ for (const { root, result } of runChurnStaleForRepo(hippoRoot, tenantId, churnDryRun)) {
475
471
  if (result.error) {
476
472
  printError(`Churn-staleness check failed for ${root}: ${result.error}`);
477
473
  churnFailed = true;
@@ -497,7 +493,7 @@ function invalidateChurn(hippoRoot, args, flags) {
497
493
  export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
498
494
  requireInit(hippoRoot);
499
495
  if (flagIsTrue(flags, 'churn'))
500
- return invalidateChurn(hippoRoot, args, flags);
496
+ return invalidateChurn(hippoRoot, tenantId, args, flags);
501
497
  const target = args[0];
502
498
  if (flagIsTrue(flags, 'id')) {
503
499
  // Value-less --id must never silently fall through to pattern mode
@@ -519,7 +515,7 @@ export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
519
515
  to: reason,
520
516
  type: 'migration',
521
517
  };
522
- const result = invalidateMatching(hippoRoot, invTarget, tenantId, { dryRun, onlyId });
518
+ const result = api.invalidateMemories(cliApiContext(hippoRoot, tenantId), invTarget, { dryRun, onlyId });
523
519
  const label = target ? `"${target}"` : `--id ${onlyId}`;
524
520
  if (result.dryRun) {
525
521
  if (result.invalidated === 0) {
package/dist/cli/dag.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleDag({ hippoRoot, flags }: CommandContext): void;
2
+ export declare function handleDag({ hippoRoot, tenantId, flags }: CommandContext): void;
3
3
  export declare function handleDrill({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
4
  export declare function handleAssemble({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
5
5
  //# sourceMappingURL=dag.d.ts.map
package/dist/cli/dag.js CHANGED
@@ -1,7 +1,9 @@
1
1
  // DAG summary verbs: `hippo dag`, `hippo assemble` and `hippo drill`.
2
- import { loadAllEntries } from '../store/entry-reads.js';
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
3
3
  import * as api from '../api/index.js';
4
4
  import { assembleCost, assembleHeading, drillCost, settleTokens } from '../api/context-render.js';
5
+ import { listMemories } from '../api/memories.js';
6
+ import { cliApiContext } from './api-context.js';
5
7
  import { printError } from './output.js';
6
8
  import { parseBudgetFlag, flagIsTrue, stringFlag, numberFlag } from './flag-values.js';
7
9
  import { requireInit } from './shared.js';
@@ -13,9 +15,9 @@ const TREE_LEAF_PREVIEW_CHARS = 60;
13
15
  const DAG_HEAD_CHARS = 120;
14
16
  const DAG_SUMMARY_PREVIEW_CHARS = 200;
15
17
  const DAG_CHILD_PREVIEW_CHARS = 100;
16
- export function handleDag({ hippoRoot, flags }) {
18
+ export function handleDag({ hippoRoot, tenantId, flags }) {
17
19
  requireInit(hippoRoot);
18
- const entries = loadAllEntries(hippoRoot);
20
+ const entries = listMemories(cliApiContext(hippoRoot, tenantId), { everyTenant: true });
19
21
  const isStats = flagIsTrue(flags, 'stats');
20
22
  const byLevel = new Map();
21
23
  let unlinked = 0;
@@ -39,6 +41,17 @@ function printDagStats(byLevel, unlinked) {
39
41
  console.log(` Level 0 (raw memories): ${byLevel.get(0) ?? 0}`);
40
42
  console.log(` Unlinked facts: ${unlinked}`);
41
43
  }
44
+ function groupByParent(entries) {
45
+ const byParent = new Map();
46
+ for (const e of entries) {
47
+ if (!e.dag_parent_id)
48
+ continue;
49
+ const list = byParent.get(e.dag_parent_id) ?? [];
50
+ list.push(e);
51
+ byParent.set(e.dag_parent_id, list);
52
+ }
53
+ return byParent;
54
+ }
42
55
  function printDagTree(entries) {
43
56
  // Tree view: L3 entity profiles as roots with L2 children indented, then orphan L2 summaries at top level.
44
57
  const profiles = entries.filter((e) => e.dag_level === 3);
@@ -52,6 +65,7 @@ function printDagTree(entries) {
52
65
  list.push(l2);
53
66
  childL2ByProfile.set(l2.dag_parent_id, list);
54
67
  }
68
+ const childrenByParent = groupByParent(entries);
55
69
  if (profiles.length === 0 && orphanL2.length === 0) {
56
70
  console.log('No DAG summaries yet. Run `hippo sleep` with ANTHROPIC_API_KEY set.');
57
71
  return;
@@ -68,7 +82,7 @@ function printDagTree(entries) {
68
82
  console.log(` └─ 📌 ${l2.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
69
83
  if (l2Tags)
70
84
  console.log(` [${l2Tags}]`);
71
- const facts = entries.filter((e) => e.dag_parent_id === l2.id);
85
+ const facts = childrenByParent.get(l2.id) ?? [];
72
86
  for (const f of facts) {
73
87
  console.log(` └─ ${f.content.slice(0, TREE_LEAF_PREVIEW_CHARS)}`);
74
88
  }
@@ -80,7 +94,7 @@ function printDagTree(entries) {
80
94
  console.log(`\n📌 ${summary.content.slice(0, CONTENT_PREVIEW_CHARS)}`);
81
95
  if (summaryTags)
82
96
  console.log(` [${summaryTags}]`);
83
- const children = entries.filter((e) => e.dag_parent_id === summary.id);
97
+ const children = childrenByParent.get(summary.id) ?? [];
84
98
  for (const child of children) {
85
99
  console.log(` └─ ${child.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
86
100
  }
@@ -165,11 +179,12 @@ async function cmdDrillDown(hippoRoot, tenantId, summaryId, flags) {
165
179
  console.log(JSON.stringify(r, null, 2));
166
180
  return;
167
181
  }
168
- console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants${r.summary.earliestAt ? ` (${r.summary.earliestAt} → ${r.summary.latestAt})` : ''}`);
169
- console.log(` ${r.summary.content.slice(0, DAG_SUMMARY_PREVIEW_CHARS)}${r.summary.content.length > DAG_SUMMARY_PREVIEW_CHARS ? '…' : ''}`);
182
+ console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants` +
183
+ `${r.summary.earliestAt ? ` (${r.summary.earliestAt} → ${r.summary.latestAt})` : ''}`);
184
+ console.log(` ${truncateWithEllipsis(r.summary.content, DAG_SUMMARY_PREVIEW_CHARS, '…')}`);
170
185
  console.log(`\nChildren (${r.children.length}/${r.totalChildren}${r.truncated ? ', truncated' : ''}):`);
171
186
  for (const c of r.children) {
172
- console.log(` [L${c.dagLevel}] ${c.id} — ${c.content.slice(0, DAG_CHILD_PREVIEW_CHARS)}${c.content.length > DAG_CHILD_PREVIEW_CHARS ? '…' : ''}`);
187
+ console.log(` [L${c.dagLevel}] ${c.id} — ${truncateWithEllipsis(c.content, DAG_CHILD_PREVIEW_CHARS, '…')}`);
173
188
  }
174
189
  }
175
190
  export async function handleDrill({ hippoRoot, tenantId, args, flags }) {
@@ -1,5 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handlePredict({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
2
  export declare function handleDecide({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
- export declare function handleIncident({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
3
  //# sourceMappingURL=decisions.d.ts.map
@@ -1,191 +1,15 @@
1
- // First-class object verbs for predictions, decisions and incidents.
1
+ // First-class object verbs for decisions: record one (optionally superseding an older one's memory), list, get, close.
2
2
  import { getMemory } from '../api/memories.js';
3
3
  import { extractPathTags } from '../search/path-context.js';
4
- import * as predictionsModule from '../store/predictions.js';
5
4
  import * as decisionsModule from '../objects/decisions.js';
6
- import * as incidentsModule from '../objects/incidents.js';
7
5
  import { printError } from './output.js';
8
- import { nonEmptyStringFlag, parseListLimit, flagIsTrue, isStringFlag, stringFlag } from './flag-values.js';
6
+ import { nonEmptyStringFlag, flagIsTrue, stringFlag } from './flag-values.js';
9
7
  import { requireInit } from './shared.js';
10
8
  import { cliApiContext } from './api-context.js';
11
- import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail, requireStatus } from './object-verbs.js';
9
+ import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
12
10
  import { errorMessage } from '../util/log.js';
13
11
  import { CliExit } from './exit.js';
14
- const BASERATE_DECIMALS = 3;
15
12
  const DECISION = { cmd: 'decide', noun: 'Decision', idLabel: 'decision' };
16
- const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
17
- const PREDICTION_NOUN = 'Prediction';
18
- // Lenient on purpose (parseInt reads "1abc" as 1) until the next major version; incidents use the strict parser.
19
- function parseObjectId(idRaw, noun) {
20
- const id = parseInt(String(idRaw), 10);
21
- if (!Number.isFinite(id) || id <= 0) {
22
- printError(`Invalid ${noun} id: "${idRaw}"`);
23
- throw new CliExit(1);
24
- }
25
- return id;
26
- }
27
- // Prediction first-class object
28
- function predictClose(hippoRoot, tenantId, args, flags) {
29
- const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
30
- const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
31
- // SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
32
- if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
33
- printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
34
- throw new CliExit(1);
35
- }
36
- const actualRaw = flags['actual'];
37
- const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
38
- if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
39
- printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
40
- throw new CliExit(1);
41
- }
42
- const closureNote = stringFlag(flags, 'note');
43
- const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
44
- // SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES.
45
- closureState: stateRaw,
46
- actualValue,
47
- closureNote,
48
- });
49
- console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
50
- }
51
- function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
52
- if (status === 'open') {
53
- return predictionsModule.loadOpenPredictions(hippoRoot, tenantId, {
54
- classTag: classTag || undefined,
55
- limit,
56
- });
57
- }
58
- if (status === 'all') {
59
- return classTag
60
- ? predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, { limit })
61
- : predictionsModule.loadAllPredictions(hippoRoot, tenantId, { limit });
62
- }
63
- const closureState = requireStatus(status, predictionsModule.VALID_CLOSURE_STATES);
64
- if (!classTag) {
65
- // status filter without class — scan all classes is more complex; v1 requires --class for non-default status
66
- printError('--status filter (non-open) requires --class to be set.');
67
- throw new CliExit(1);
68
- }
69
- return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
70
- closureState,
71
- limit,
72
- });
73
- }
74
- function predictList(hippoRoot, tenantId, flags) {
75
- const classTag = stringFlag(flags, 'class')?.trim() ?? '';
76
- const status = stringFlag(flags, 'status')?.trim() ?? 'all';
77
- const limit = parseListLimit(flags);
78
- const results = loadPredictionList(hippoRoot, tenantId, status, classTag, limit);
79
- if (results.length === 0) {
80
- console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
81
- return;
82
- }
83
- console.log(`Found ${results.length} predictions:\n`);
84
- for (const p of results) {
85
- const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
86
- const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
87
- const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
88
- console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
89
- console.log(` ${p.claimText}`);
90
- if (p.closureNote)
91
- console.log(` note: ${p.closureNote}`);
92
- }
93
- }
94
- function predictShow(hippoRoot, tenantId, args) {
95
- const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction', parseObjectId);
96
- const pred = foundOrExit(predictionsModule.loadPredictionById(hippoRoot, tenantId, id), PREDICTION_NOUN, id);
97
- console.log(`Prediction #${pred.id}`);
98
- console.log(` class: ${pred.classTag}`);
99
- console.log(` claim: ${pred.claimText}`);
100
- console.log(` state: ${pred.closureState}`);
101
- if (pred.estimateValue !== null)
102
- console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
103
- if (pred.targetDate)
104
- console.log(` target: ${pred.targetDate}`);
105
- if (pred.actualValue !== null)
106
- console.log(` actual: ${pred.actualValue}`);
107
- if (pred.closedAt)
108
- console.log(` closed: ${pred.closedAt}`);
109
- if (pred.closureNote)
110
- console.log(` note: ${pred.closureNote}`);
111
- if (pred.memoryId)
112
- console.log(` memory: ${pred.memoryId}`);
113
- console.log(` created: ${pred.createdAt}`);
114
- }
115
- function predictBaserate(hippoRoot, tenantId, flags) {
116
- // Reference-class / planning-fallacy detector
117
- const classTag = stringFlag(flags, 'class')?.trim();
118
- if (!classTag) {
119
- printError('Usage: hippo predict baserate --class <c>');
120
- throw new CliExit(1);
121
- }
122
- const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTag);
123
- if (baserate.nClosed === 0) {
124
- console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
125
- console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
126
- console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
127
- return;
128
- }
129
- console.log(baserate.summary);
130
- console.log(` n_closed: ${baserate.nClosed}`);
131
- console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
132
- if (baserate.meanEstimate !== null)
133
- console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
134
- if (baserate.meanActual !== null)
135
- console.log(` mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
136
- if (baserate.meanRatio !== null)
137
- console.log(` mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
138
- if (baserate.p50Ratio !== null)
139
- console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(BASERATE_DECIMALS)}x`);
140
- if (baserate.mae !== null)
141
- console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
142
- }
143
- export function handlePredict({ hippoRoot, tenantId, args, flags }) {
144
- requireInit(hippoRoot);
145
- const subcommand = args[0] ?? '';
146
- if (subcommand === 'close')
147
- return predictClose(hippoRoot, tenantId, args, flags);
148
- if (subcommand === 'list')
149
- return predictList(hippoRoot, tenantId, flags);
150
- if (subcommand === 'show')
151
- return predictShow(hippoRoot, tenantId, args);
152
- if (subcommand === 'baserate')
153
- return predictBaserate(hippoRoot, tenantId, flags);
154
- // Default subcommand: create. args[0] is the claim text.
155
- predictCreate(hippoRoot, tenantId, subcommand, flags);
156
- }
157
- function predictCreate(hippoRoot, tenantId, claimText, flags) {
158
- if (!claimText) {
159
- printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
160
- printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
161
- printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
162
- printError(' hippo predict show <id>');
163
- throw new CliExit(1);
164
- }
165
- const classTag = stringFlag(flags, 'class')?.trim();
166
- if (!classTag) {
167
- printError('--class is required for prediction creation.');
168
- throw new CliExit(1);
169
- }
170
- const estimateRaw = flags['estimate'];
171
- const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
172
- if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
173
- printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
174
- throw new CliExit(1);
175
- }
176
- const estimateUnit = stringFlag(flags, 'unit');
177
- const targetDate = stringFlag(flags, 'target');
178
- const created = predictionsModule.savePrediction(hippoRoot, tenantId, {
179
- classTag,
180
- claimText,
181
- estimateValue,
182
- estimateUnit,
183
- targetDate,
184
- });
185
- console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
186
- if (created.memoryId)
187
- console.log(` memory: ${created.memoryId}`);
188
- }
189
13
  function printDecisionRow(d) {
190
14
  const supPart = d.supersededBy !== null ? ` superseded_by=#${d.supersededBy}` : '';
191
15
  console.log(`#${d.id} [${d.status}]${supPart} memory=${d.memoryId ?? '-'}`);
@@ -202,7 +26,7 @@ function decideList(hippoRoot, tenantId, flags) {
202
26
  });
203
27
  }
204
28
  function decideGet(hippoRoot, tenantId, args) {
205
- const id = idArgOrExit(args, 'Usage: hippo decide get <id>', DECISION.idLabel, parseObjectId);
29
+ const id = idArgOrExit(args, 'Usage: hippo decide get <id>', DECISION.idLabel);
206
30
  const decision = foundOrExit(decisionsModule.loadDecisionById(hippoRoot, tenantId, id), DECISION.noun, id);
207
31
  console.log(`Decision #${decision.id}`);
208
32
  console.log(` status: ${decision.status}`);
@@ -212,7 +36,7 @@ function decideGet(hippoRoot, tenantId, args) {
212
36
  printLifecycleTail(decision);
213
37
  }
214
38
  function decideClose(hippoRoot, tenantId, args) {
215
- closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id), parseObjectId);
39
+ closeObject(args, DECISION, (id) => decisionsModule.closeDecision(hippoRoot, tenantId, id));
216
40
  }
217
41
  export async function handleDecide({ hippoRoot, tenantId, args, flags }) {
218
42
  requireInit(hippoRoot);
@@ -258,7 +82,7 @@ async function decideCreate(hippoRoot, tenantId, decisionText, flags) {
258
82
  extraTags: decisionPathTags,
259
83
  });
260
84
  if (oldEntry)
261
- weakenSupersededMemory(hippoRoot, oldEntry, supersedesMemId);
85
+ weakenOrWarn(hippoRoot, oldEntry, supersedesMemId);
262
86
  console.log(`Decision recorded: #${created.id}`);
263
87
  if (created.memoryId)
264
88
  console.log(` memory: ${created.memoryId}`);
@@ -272,7 +96,7 @@ function exitWithDecideUsage() {
272
96
  printError(' hippo decide close <id>');
273
97
  throw new CliExit(1);
274
98
  }
275
- function weakenSupersededMemory(hippoRoot, oldEntry, supersedesMemId) {
99
+ function weakenOrWarn(hippoRoot, oldEntry, supersedesMemId) {
276
100
  // Best-effort and last: saveDecision already committed. Failing here would make a retry find no active
277
101
  // decision for the old memory and create a duplicate active successor, so warn instead.
278
102
  try {
@@ -288,106 +112,4 @@ function printSupersedes(supersedesMemId, supersedesDecisionId) {
288
112
  : ' (no active decision row; memory weakened only)';
289
113
  console.log(` supersedes memory: ${supersedesMemId}${tail}`);
290
114
  }
291
- function printIncidentRow(inc) {
292
- const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
293
- console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
294
- console.log(` ${inc.incidentText}`);
295
- if (inc.context)
296
- console.log(` context: ${inc.context}`);
297
- }
298
- function incidentList(hippoRoot, tenantId, flags) {
299
- listObjects(flags, {
300
- plural: 'incidents',
301
- states: incidentsModule.VALID_INCIDENT_STATES,
302
- load: (opts) => incidentsModule.loadIncidents(hippoRoot, tenantId, opts),
303
- printRow: printIncidentRow,
304
- });
305
- }
306
- function incidentGet(hippoRoot, tenantId, args) {
307
- const id = idArgOrExit(args, 'Usage: hippo incident get <id>', INCIDENT.idLabel);
308
- const incident = foundOrExit(incidentsModule.loadIncidentById(hippoRoot, tenantId, id), INCIDENT.noun, id);
309
- console.log(`Incident #${incident.id}`);
310
- console.log(` status: ${incident.status}`);
311
- console.log(` text: ${incident.incidentText}`);
312
- if (incident.context)
313
- console.log(` context: ${incident.context}`);
314
- if (incident.resolutionText)
315
- console.log(` resolution: ${incident.resolutionText}`);
316
- if (incident.resolvedAt)
317
- console.log(` resolved_at: ${incident.resolvedAt}`);
318
- if (incident.closedAt)
319
- console.log(` closed_at: ${incident.closedAt}`);
320
- if (incident.linkedMemoryIds.length > 0) {
321
- console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
322
- }
323
- if (incident.memoryId)
324
- console.log(` memory: ${incident.memoryId}`);
325
- console.log(` created: ${incident.createdAt}`);
326
- }
327
- function incidentResolve(hippoRoot, tenantId, args, flags) {
328
- const id = idArgOrExit(args, 'Usage: hippo incident resolve <id> --resolution "<text>"', INCIDENT.idLabel);
329
- const resolutionRaw = stringFlag(flags, 'resolution');
330
- if (!resolutionRaw?.trim()) {
331
- printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
332
- throw new CliExit(1);
333
- }
334
- const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
335
- console.log(`Incident #${resolved.id} resolved.`);
336
- }
337
- function incidentClose(hippoRoot, tenantId, args) {
338
- closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
339
- }
340
- export function handleIncident({ hippoRoot, tenantId, args, flags }) {
341
- requireInit(hippoRoot);
342
- const subcommand = args[0] ?? '';
343
- if (subcommand === 'list')
344
- return incidentList(hippoRoot, tenantId, flags);
345
- if (subcommand === 'get')
346
- return incidentGet(hippoRoot, tenantId, args);
347
- if (subcommand === 'resolve')
348
- return incidentResolve(hippoRoot, tenantId, args, flags);
349
- if (subcommand === 'close')
350
- return incidentClose(hippoRoot, tenantId, args);
351
- // Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
352
- // for the `open` keyword the text is args[1], otherwise args[0] is the text.
353
- incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
354
- }
355
- function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
356
- if (!incidentText) {
357
- printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
358
- printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
359
- printError(' hippo incident get <id>');
360
- printError(' hippo incident resolve <id> --resolution "<text>"');
361
- printError(' hippo incident close <id>');
362
- throw new CliExit(1);
363
- }
364
- const context = nonEmptyStringFlag(flags, 'context');
365
- // --link is a repeatable flag (collected into an array by parseArgs). A
366
- // single --link <id> yields a string; normalize both to string[].
367
- const linkRaw = flags['link'];
368
- let linkedMemoryIds;
369
- if (Array.isArray(linkRaw)) {
370
- linkedMemoryIds = linkRaw;
371
- }
372
- else if (isStringFlag(linkRaw)) {
373
- linkedMemoryIds = [linkRaw];
374
- }
375
- else if (linkRaw === true) {
376
- printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
377
- throw new CliExit(1);
378
- }
379
- const incidentPathTags = extractPathTags(process.cwd());
380
- const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
381
- incidentText,
382
- context,
383
- linkedMemoryIds,
384
- extraTags: incidentPathTags,
385
- });
386
- console.log(`Incident recorded: #${created.id}`);
387
- if (created.memoryId)
388
- console.log(` memory: ${created.memoryId}`);
389
- if (created.linkedMemoryIds.length > 0) {
390
- console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
391
- }
392
- }
393
115
  //# sourceMappingURL=decisions.js.map
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleEval({ hippoRoot, args, flags }: CommandContext): Promise<void>;
2
+ export declare function handleEval({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=eval.d.ts.map