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,41 +1,15 @@
1
- // First-class object verbs for project briefs and customer notes, plus the entity graph.
2
- import * as fs from 'fs';
3
- import { spawn } from 'child_process';
4
- import { extractPathTags } from '../search/path-context.js';
1
+ // The project brief verbs: one repo's brief, versioned by supersession and refreshable from the repo's receipts.
5
2
  import * as briefsModule from '../objects/project-briefs.js';
6
- import * as customerNotesModule from '../objects/customer-notes.js';
7
- import { extractGraph } from '../graph/extract.js';
8
- import { buildGraphModel, renderGraphHtml, renderGraphCanvas, DEFAULT_VIEW_LIMIT } from '../graph/view.js';
9
- import { errorMessage, log } from '../util/log.js';
3
+ import { errorMessage } from '../util/log.js';
10
4
  import { printError } from './output.js';
11
- import { nonEmptyStringFlag, boolFlag, stringFlag } from './flag-values.js';
12
- import { requireInit } from './shared.js';
13
- import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
5
+ import { boolFlag, stringFlag } from './flag-values.js';
14
6
  import { CliExit } from './exit.js';
15
- const BRIEF = { cmd: 'brief', noun: 'Project brief', idLabel: 'brief' };
16
- const NOTE = { cmd: 'note', noun: 'Customer note', idLabel: 'note' };
7
+ import { requiredText, versionedVerbs } from './versioned-verbs.js';
17
8
  function printBriefRow(b) {
18
9
  console.log(`#${b.id} [${b.status}] v${b.version} repo="${b.repo}" memory=${b.memoryId ?? '-'}`);
19
10
  if (b.changeSummary)
20
11
  console.log(` change: ${b.changeSummary}`);
21
12
  }
22
- function briefUsage() {
23
- printError('Usage: hippo brief new "<repo>" --summary "<text>"');
24
- printError(' hippo brief list [--status active|superseded|closed|all] [--repo "<repo>"] [--limit N]');
25
- printError(' hippo brief get <id>');
26
- printError(' hippo brief supersede <id> --summary "<text>" [--change "<summary>"]');
27
- printError(' hippo brief close <id>');
28
- printError(' hippo brief refresh "<repo>" [--dry-run] (auto-assemble the brief from the repo\'s receipts)');
29
- }
30
- function briefList(hippoRoot, tenantId, flags) {
31
- const repo = stringFlag(flags, 'repo')?.trim() || undefined;
32
- listObjects(flags, {
33
- plural: 'project briefs',
34
- states: briefsModule.VALID_BRIEF_STATES,
35
- load: (opts) => briefsModule.loadProjectBriefs(hippoRoot, tenantId, { ...opts, repo }),
36
- printRow: printBriefRow,
37
- });
38
- }
39
13
  function briefRefresh(hippoRoot, tenantId, args, flags) {
40
14
  const repoRaw = args[1];
41
15
  if (!repoRaw) {
@@ -62,266 +36,37 @@ function briefRefresh(hippoRoot, tenantId, args, flags) {
62
36
  throw new CliExit(1);
63
37
  }
64
38
  }
65
- function briefGet(hippoRoot, tenantId, args) {
66
- const id = idArgOrExit(args, 'Usage: hippo brief get <id>', BRIEF.idLabel);
67
- const b = foundOrExit(briefsModule.loadProjectBriefById(hippoRoot, tenantId, id), BRIEF.noun, id);
68
- console.log(`Project brief #${b.id}`);
69
- console.log(` repo: ${b.repo}`);
70
- console.log(` status: ${b.status}`);
71
- console.log(` version: ${b.version}`);
72
- console.log(` summary: ${b.summary}`);
73
- printLifecycleTail(b);
74
- }
75
- function briefSupersede(hippoRoot, tenantId, args, flags) {
76
- const id = idArgOrExit(args, 'Usage: hippo brief supersede <id> --summary "<text>" [--change "<summary>"]', BRIEF.idLabel);
77
- const summaryRaw = stringFlag(flags, 'summary');
78
- if (!summaryRaw?.trim()) {
79
- printError('hippo brief supersede requires --summary "<text>" for the new version.');
80
- throw new CliExit(1);
81
- }
82
- const existing = foundOrExit(briefsModule.loadProjectBriefById(hippoRoot, tenantId, id), BRIEF.noun, id);
83
- try {
84
- const created = briefsModule.saveProjectBrief(hippoRoot, tenantId, {
85
- repo: existing.repo,
86
- summary: summaryRaw,
87
- changeSummary: nonEmptyStringFlag(flags, 'change'),
88
- supersedesBriefId: id,
89
- extraTags: extractPathTags(process.cwd()),
90
- });
91
- console.log(`Project brief #${created.id} recorded (v${created.version}), superseding #${id}.`);
92
- if (created.memoryId)
93
- console.log(` memory: ${created.memoryId}`);
94
- }
95
- catch (e) {
96
- printError(errorMessage(e));
97
- throw new CliExit(1);
98
- }
99
- }
100
- function briefClose(hippoRoot, tenantId, args) {
101
- closeObject(args, BRIEF, (id) => briefsModule.closeProjectBrief(hippoRoot, tenantId, id));
102
- }
103
- function briefCreate(hippoRoot, tenantId, args, flags) {
104
- const subcommand = args[0] ?? '';
105
- // Default subcommand: new (create). Accept both `brief new "<repo>"` and the
106
- // bare `brief "<repo>"` form: for the `new` keyword the repo is args[1].
107
- const repo = subcommand === 'new' ? (args[1] ?? '') : subcommand;
108
- const summaryRaw = stringFlag(flags, 'summary');
109
- if (!repo || !summaryRaw?.trim()) {
110
- briefUsage();
111
- throw new CliExit(1);
112
- }
113
- try {
114
- const created = briefsModule.saveProjectBrief(hippoRoot, tenantId, {
115
- repo,
116
- summary: summaryRaw,
117
- extraTags: extractPathTags(process.cwd()),
118
- });
119
- console.log(`Project brief recorded: #${created.id} (v${created.version}) for repo "${created.repo}"`);
120
- if (created.memoryId)
121
- console.log(` memory: ${created.memoryId}`);
122
- }
123
- catch (e) {
124
- printError(errorMessage(e));
125
- throw new CliExit(1);
126
- }
127
- }
128
- export function handleProjectBrief({ hippoRoot, tenantId, args, flags }) {
129
- requireInit(hippoRoot);
130
- const subcommand = args[0] ?? '';
131
- if (subcommand === 'list')
132
- return briefList(hippoRoot, tenantId, flags);
133
- if (subcommand === 'refresh')
134
- return briefRefresh(hippoRoot, tenantId, args, flags);
135
- if (subcommand === 'get')
136
- return briefGet(hippoRoot, tenantId, args);
137
- if (subcommand === 'supersede')
138
- return briefSupersede(hippoRoot, tenantId, args, flags);
139
- if (subcommand === 'close')
140
- return briefClose(hippoRoot, tenantId, args);
141
- briefCreate(hippoRoot, tenantId, args, flags);
142
- }
143
- function printNoteRow(n) {
144
- console.log(`#${n.id} [${n.status}] v${n.version} customer="${n.customer}" memory=${n.memoryId ?? '-'}`);
145
- if (n.changeSummary)
146
- console.log(` change: ${n.changeSummary}`);
147
- }
148
- function noteUsage() {
149
- printError('Usage: hippo note new "<customer>" --text "<note>"');
150
- printError(' hippo note list [--status active|superseded|closed|all] [--customer "<id>"] [--limit N]');
151
- printError(' hippo note get <id>');
152
- printError(' hippo note supersede <id> --text "<note>" [--change "<summary>"]');
153
- printError(' hippo note close <id>');
154
- }
155
- function graphExtract(hippoRoot, tenantId) {
156
- const result = extractGraph(hippoRoot, tenantId);
157
- const byType = Object.entries(result.byType)
158
- .map(([t, n]) => `${t} ${n}`)
159
- .join(', ');
160
- const supersedes = result.relations - result.references;
161
- console.log(`Graph extracted: ${result.entities} entities (${byType}) + ${result.relations} relations (${supersedes} supersedes, ${result.references} references).`);
162
- if (result.truncated.length > 0) {
163
- printError(`WARNING: under-extracted (hit the per-type cap): ${result.truncated.join(', ')}. The graph is incomplete for those types.`);
164
- }
165
- }
166
- function graphShow(hippoRoot, tenantId, entity, flags) {
167
- const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
168
- if (flags['json']) {
169
- console.log(JSON.stringify(model, null, 2));
170
- return;
171
- }
172
- if (model.nodes.length === 0) {
173
- console.log(entity ? `No entity named "${entity}".` : 'Graph is empty. Run `hippo graph extract` first.');
174
- return;
175
- }
176
- console.log(`Graph: ${model.nodes.length} entities, ${model.edges.length} relations${model.truncated ? ' (truncated)' : ''}`);
177
- const byType = new Map();
178
- for (const n of model.nodes) {
179
- const arr = byType.get(n.type) ?? [];
180
- arr.push({ id: n.id, name: n.name });
181
- byType.set(n.type, arr);
182
- }
183
- for (const [type, ns] of byType) {
184
- console.log(`\n${type} (${ns.length}):`);
185
- for (const n of ns)
186
- console.log(` [${n.id}] ${n.name}`);
187
- }
188
- if (model.edges.length > 0) {
189
- const nameById = new Map(model.nodes.map((n) => [n.id, n.name]));
190
- console.log('\nrelations:');
191
- for (const e of model.edges) {
192
- console.log(` ${nameById.get(e.from)} --${e.relType}--> ${nameById.get(e.to)}`);
193
- }
194
- }
195
- }
196
- function openInBrowser(out) {
197
- // Best-effort browser launch; never fail the command if it doesn't work.
198
- try {
199
- const [cmd, cmdArgs] = process.platform === 'win32'
200
- ? ['cmd', ['/c', 'start', '', out]]
201
- : process.platform === 'darwin'
202
- ? ['open', [out]]
203
- : ['xdg-open', [out]];
204
- const child = spawn(cmd, cmdArgs, { detached: true, stdio: 'ignore', windowsHide: true });
205
- // A missing launcher (e.g. xdg-open absent) emits 'error' asynchronously; unhandled, it would throw,
206
- // so swallow it: the file is already written and its path printed above.
207
- child.on('error', () => { });
208
- child.unref();
209
- }
210
- catch (err) {
211
- // The file is written and its path printed above, so a browser that will not start costs nothing.
212
- log.debug(`browser not opened: ${errorMessage(err)}`);
213
- }
214
- }
215
- function graphView(hippoRoot, tenantId, entity, flags) {
216
- const format = stringFlag(flags, 'format') ?? 'html';
217
- if (format !== 'html' && format !== 'canvas') {
218
- printError("graph view: --format must be 'html' or 'canvas'");
219
- throw new CliExit(1);
220
- }
221
- const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
222
- const content = format === 'canvas' ? renderGraphCanvas(model) : renderGraphHtml(model);
223
- const defaultOut = format === 'canvas' ? 'hippo-graph.canvas' : 'hippo-graph.html';
224
- const out = stringFlag(flags, 'out') ?? defaultOut;
225
- fs.writeFileSync(out, content, 'utf8');
226
- console.log(`Wrote ${model.nodes.length} entities + ${model.edges.length} relations to ${out}${model.truncated ? ' (truncated)' : ''}`);
227
- if (flags['open'] && format === 'html')
228
- openInBrowser(out);
229
- }
230
- export function handleGraph({ hippoRoot, tenantId, args, flags }) {
231
- requireInit(hippoRoot);
232
- const subcommand = args[0] ?? '';
233
- if (subcommand === 'extract')
234
- return graphExtract(hippoRoot, tenantId);
235
- const entity = stringFlag(flags, 'entity');
236
- if (subcommand === 'show')
237
- return graphShow(hippoRoot, tenantId, entity, flags);
238
- if (subcommand === 'view')
239
- return graphView(hippoRoot, tenantId, entity, flags);
240
- printError('Usage:\n' +
241
- ' hippo graph extract Rebuild the entity/relation graph from consolidated objects\n' +
242
- ' hippo graph show [--entity NAME] [--json] Inspect entities + their edges (text or JSON)\n' +
243
- ' hippo graph view [--out FILE] [--open] [--format html|canvas] [--entity NAME] Generate an interactive node-link diagram');
244
- throw new CliExit(1);
245
- }
246
- function noteList(hippoRoot, tenantId, flags) {
247
- const customer = stringFlag(flags, 'customer')?.trim() || undefined;
248
- listObjects(flags, {
249
- plural: 'customer notes',
250
- states: customerNotesModule.VALID_NOTE_STATES,
251
- load: (opts) => customerNotesModule.loadCustomerNotes(hippoRoot, tenantId, { ...opts, customer }),
252
- printRow: printNoteRow,
253
- });
254
- }
255
- function noteGet(hippoRoot, tenantId, args) {
256
- const id = idArgOrExit(args, 'Usage: hippo note get <id>', NOTE.idLabel);
257
- const n = foundOrExit(customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id), NOTE.noun, id);
258
- console.log(`Customer note #${n.id}`);
259
- console.log(` customer: ${n.customer}`);
260
- console.log(` status: ${n.status}`);
261
- console.log(` version: ${n.version}`);
262
- console.log(` note: ${n.note}`);
263
- printLifecycleTail(n);
264
- }
265
- function noteSupersede(hippoRoot, tenantId, args, flags) {
266
- const id = idArgOrExit(args, 'Usage: hippo note supersede <id> --text "<note>" [--change "<summary>"]', NOTE.idLabel);
267
- const textRaw = stringFlag(flags, 'text');
268
- if (!textRaw?.trim()) {
269
- printError('hippo note supersede requires --text "<note>" for the new version.');
270
- throw new CliExit(1);
271
- }
272
- const existing = foundOrExit(customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id), NOTE.noun, id);
273
- try {
274
- const created = customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
275
- customer: existing.customer,
276
- note: textRaw,
277
- changeSummary: nonEmptyStringFlag(flags, 'change'),
278
- supersedesNoteId: id,
279
- extraTags: extractPathTags(process.cwd()),
280
- });
281
- console.log(`Customer note #${created.id} recorded (v${created.version}), superseding #${id}.`);
282
- if (created.memoryId)
283
- console.log(` memory: ${created.memoryId}`);
284
- }
285
- catch (e) {
286
- printError(errorMessage(e));
287
- throw new CliExit(1);
288
- }
289
- }
290
- function noteClose(hippoRoot, tenantId, args) {
291
- closeObject(args, NOTE, (id) => customerNotesModule.closeCustomerNote(hippoRoot, tenantId, id));
292
- }
293
- export function handleCustomerNote({ hippoRoot, tenantId, args, flags }) {
294
- requireInit(hippoRoot);
295
- const subcommand = args[0] ?? '';
296
- if (subcommand === 'list')
297
- return noteList(hippoRoot, tenantId, flags);
298
- if (subcommand === 'get')
299
- return noteGet(hippoRoot, tenantId, args);
300
- if (subcommand === 'supersede')
301
- return noteSupersede(hippoRoot, tenantId, args, flags);
302
- if (subcommand === 'close')
303
- return noteClose(hippoRoot, tenantId, args);
304
- // Default subcommand: new (create). Accept both `note new "<customer>"` and the
305
- // bare `note "<customer>"` form: for the `new` keyword the customer is args[1].
306
- const customer = subcommand === 'new' ? (args[1] ?? '') : subcommand;
307
- const textRaw = stringFlag(flags, 'text');
308
- if (!customer || !textRaw?.trim()) {
309
- noteUsage();
310
- throw new CliExit(1);
311
- }
312
- try {
313
- const created = customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
314
- customer,
315
- note: textRaw,
316
- extraTags: extractPathTags(process.cwd()),
317
- });
318
- console.log(`Customer note recorded: #${created.id} (v${created.version}) for customer "${created.customer}"`);
319
- if (created.memoryId)
320
- console.log(` memory: ${created.memoryId}`);
321
- }
322
- catch (e) {
323
- printError(errorMessage(e));
324
- throw new CliExit(1);
325
- }
326
- }
39
+ const briefKind = (hippoRoot, tenantId) => ({
40
+ names: { cmd: 'brief', noun: 'Project brief', idLabel: 'brief' },
41
+ plural: 'project briefs',
42
+ states: briefsModule.VALID_BRIEF_STATES,
43
+ usage: [
44
+ 'Usage: hippo brief new "<repo>" --summary "<text>"',
45
+ ' hippo brief list [--status active|superseded|closed|all] [--repo "<repo>"] [--limit N]',
46
+ ' hippo brief get <id>',
47
+ ' hippo brief supersede <id> --summary "<text>" [--change "<summary>"]',
48
+ ' hippo brief close <id>',
49
+ ' hippo brief refresh "<repo>" [--dry-run] (auto-assemble the brief from the repo\'s receipts)',
50
+ ],
51
+ supersedeUsage: 'Usage: hippo brief supersede <id> --summary "<text>" [--change "<summary>"]',
52
+ bodyRequired: '--summary "<text>"',
53
+ body: (flags) => requiredText(flags, 'summary'),
54
+ keyOf: (b) => b.repo,
55
+ save: (repo, summary, extraTags, from) => briefsModule.saveProjectBrief(hippoRoot, tenantId, {
56
+ repo, summary, extraTags, changeSummary: from?.changeSummary, supersedesBriefId: from?.id,
57
+ }),
58
+ recorded: (b) => `Project brief recorded: #${b.id} (v${b.version}) for repo "${b.repo}"`,
59
+ list: (opts, flags) => briefsModule.loadProjectBriefs(hippoRoot, tenantId, { ...opts, repo: stringFlag(flags, 'repo')?.trim() || undefined }),
60
+ loadById: (id) => briefsModule.loadProjectBriefById(hippoRoot, tenantId, id),
61
+ close: (id) => briefsModule.closeProjectBrief(hippoRoot, tenantId, id),
62
+ printRow: printBriefRow,
63
+ printDetail: (b) => {
64
+ console.log(` repo: ${b.repo}`);
65
+ console.log(` status: ${b.status}`);
66
+ console.log(` version: ${b.version}`);
67
+ console.log(` summary: ${b.summary}`);
68
+ },
69
+ extra: { sub: 'refresh', run: (args, flags) => briefRefresh(hippoRoot, tenantId, args, flags) },
70
+ });
71
+ export const handleProjectBrief = versionedVerbs(briefKind);
327
72
  //# sourceMappingURL=briefs.js.map
package/dist/cli/card.js CHANGED
@@ -1,13 +1,28 @@
1
1
  // The `hippo card` verb (the agent work board); main() loads it lazily from the command table.
2
- import { createCard, loadCard, listCards, loadCardRuns, claimCard, heartbeatCard, blockCard, reviewCard, completeCard, reclaimExpiredCards, addCardComment, } from '../store/cards.js';
2
+ import * as cardsApi from '../api/cards.js';
3
+ import { cliApiContext } from './api-context.js';
3
4
  import { isHandoffOutcome } from '../core/handoff.js';
4
5
  import { isCardStatus } from '../core/card.js';
5
- import { loadCardDetail } from '../store/card-detail.js';
6
6
  import { printError } from './output.js';
7
7
  import { stringFlagOrExit } from './flag-values.js';
8
8
  import { requireInit } from './shared.js';
9
9
  import { errorMessage } from '../util/log.js';
10
10
  import { CliExit } from './exit.js';
11
+ // Each subcommand's usage line, written once so the repeated checks cannot drift.
12
+ const CARD_USAGE = {
13
+ create: 'hippo card create --title "..." [--repo <name>] [--contract <text>] [--budget <n>] [--depends-on <id>...]',
14
+ show: 'hippo card show <id> [--json]',
15
+ claim: 'hippo card claim <id> --runtime <name> [--session <id>]',
16
+ heartbeat: 'hippo card heartbeat <id> --run <n>',
17
+ review: 'hippo card review <id> [--run <n>]',
18
+ complete: 'hippo card complete <id> --outcome <success|failure|partial> [--run <n>]',
19
+ reclaim: 'hippo card reclaim (sweeps every expired lease; use hippo card block <id> for one card)',
20
+ comment: 'hippo card comment <id> --body "..." [--author <name>]',
21
+ };
22
+ function usageError(sub) {
23
+ printError(`Usage: ${CARD_USAGE[sub]}`);
24
+ return new CliExit(1);
25
+ }
11
26
  // Mirrors ARCHIVE_REASON_REQUIRED so the block message can't drift from its usage line.
12
27
  const CARD_BLOCK_REASON_REQUIRED = 'hippo card block <id> requires --reason "<why>" (recorded as a comment).';
13
28
  function printCard(detail) {
@@ -65,8 +80,9 @@ function cardRunFlag(flags) {
65
80
  }
66
81
  // Reads after the store already refused, so this only explains the refusal, never changes it.
67
82
  function cardRefusal(hippoRoot, tenantId, id) {
68
- const card = loadCard(hippoRoot, tenantId, id);
69
- const liveRun = loadCardRuns(hippoRoot, tenantId, id).find((r) => !r.ended);
83
+ const ctx = cliApiContext(hippoRoot, tenantId);
84
+ const card = cardsApi.cardLoad(ctx, id);
85
+ const liveRun = cardsApi.cardRuns(ctx, id).find((r) => !r.ended);
70
86
  return `status ${card?.status ?? 'unknown'}, live run ${liveRun?.id ?? 'none'}`;
71
87
  }
72
88
  const CARD_SUBCOMMAND_FLAGS = {
@@ -104,8 +120,7 @@ export function handleCard({ hippoRoot, tenantId, args, flags }) {
104
120
  function cardCreate(hippoRoot, tenantId, _args, flags) {
105
121
  const title = stringFlagOrExit(flags, 'title') ?? '';
106
122
  if (!title) {
107
- printError('Usage: hippo card create --title "..." [--repo <name>] [--contract <text>] [--budget <n>] [--depends-on <id>...]');
108
- throw new CliExit(1);
123
+ throw usageError('create');
109
124
  }
110
125
  const repo = stringFlagOrExit(flags, 'repo') || undefined;
111
126
  const contract = stringFlagOrExit(flags, 'contract') || undefined;
@@ -126,7 +141,7 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
126
141
  const dependsOn = Array.isArray(dependsOnFlag) ? dependsOnFlag : [];
127
142
  let card;
128
143
  try {
129
- card = createCard(hippoRoot, tenantId, { title, repo, contract, budget, dependsOn });
144
+ card = cardsApi.cardCreate(cliApiContext(hippoRoot, tenantId), { title, repo, contract, budget, dependsOn });
130
145
  }
131
146
  catch (error) {
132
147
  printError(errorMessage(error));
@@ -137,10 +152,9 @@ function cardCreate(hippoRoot, tenantId, _args, flags) {
137
152
  function cardShow(hippoRoot, tenantId, args, flags) {
138
153
  const id = args[1];
139
154
  if (!id) {
140
- printError('Usage: hippo card show <id> [--json]');
141
- throw new CliExit(1);
155
+ throw usageError('show');
142
156
  }
143
- const detail = loadCardDetail(hippoRoot, tenantId, id);
157
+ const detail = cardsApi.cardDetail(cliApiContext(hippoRoot, tenantId), id);
144
158
  if (!detail) {
145
159
  printError(`No card found with id ${id}.`);
146
160
  throw new CliExit(1);
@@ -157,7 +171,7 @@ function cardList(hippoRoot, tenantId, _args, flags) {
157
171
  printError(`Invalid status: "${status}".`);
158
172
  throw new CliExit(1);
159
173
  }
160
- const cards = listCards(hippoRoot, tenantId, { status });
174
+ const cards = cardsApi.cardList(cliApiContext(hippoRoot, tenantId), { status });
161
175
  if (flags['json']) {
162
176
  console.log(JSON.stringify({ cards }, null, 2));
163
177
  return;
@@ -174,13 +188,12 @@ function cardClaim(hippoRoot, tenantId, args, flags) {
174
188
  const id = args[1];
175
189
  const runtime = stringFlagOrExit(flags, 'runtime') ?? '';
176
190
  if (!id || !runtime) {
177
- printError('Usage: hippo card claim <id> --runtime <name> [--session <id>]');
178
- throw new CliExit(1);
191
+ throw usageError('claim');
179
192
  }
180
193
  const sessionId = stringFlagOrExit(flags, 'session') || undefined;
181
194
  let card;
182
195
  try {
183
- card = claimCard(hippoRoot, tenantId, id, runtime, sessionId);
196
+ card = cardsApi.cardClaim(cliApiContext(hippoRoot, tenantId), id, runtime, sessionId);
184
197
  }
185
198
  catch (error) {
186
199
  printError(errorMessage(error));
@@ -196,12 +209,11 @@ function cardHeartbeat(hippoRoot, tenantId, args, flags) {
196
209
  const id = args[1];
197
210
  const runId = cardRunFlag(flags);
198
211
  if (!id || runId === undefined) {
199
- printError('Usage: hippo card heartbeat <id> --run <n>');
200
- throw new CliExit(1);
212
+ throw usageError('heartbeat');
201
213
  }
202
214
  let card;
203
215
  try {
204
- card = heartbeatCard(hippoRoot, tenantId, id, runId);
216
+ card = cardsApi.cardHeartbeat(cliApiContext(hippoRoot, tenantId), id, runId);
205
217
  }
206
218
  catch (error) {
207
219
  printError(errorMessage(error));
@@ -223,7 +235,7 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
223
235
  const runId = cardRunFlag(flags);
224
236
  let card;
225
237
  try {
226
- card = blockCard(hippoRoot, tenantId, id, reason, runId);
238
+ card = cardsApi.cardBlock(cliApiContext(hippoRoot, tenantId), id, reason, runId);
227
239
  }
228
240
  catch (error) {
229
241
  printError(errorMessage(error));
@@ -239,13 +251,12 @@ function cardBlock(hippoRoot, tenantId, args, flags) {
239
251
  function cardReview(hippoRoot, tenantId, args, flags) {
240
252
  const id = args[1];
241
253
  if (!id) {
242
- printError('Usage: hippo card review <id> [--run <n>]');
243
- throw new CliExit(1);
254
+ throw usageError('review');
244
255
  }
245
256
  const runId = cardRunFlag(flags);
246
257
  let card;
247
258
  try {
248
- card = reviewCard(hippoRoot, tenantId, id, runId);
259
+ card = cardsApi.cardReview(cliApiContext(hippoRoot, tenantId), id, runId);
249
260
  }
250
261
  catch (error) {
251
262
  printError(errorMessage(error));
@@ -262,13 +273,12 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
262
273
  const id = args[1];
263
274
  const outcomeRaw = flags['outcome'];
264
275
  if (!id || !isHandoffOutcome(outcomeRaw)) {
265
- printError('Usage: hippo card complete <id> --outcome <success|failure|partial> [--run <n>]');
266
- throw new CliExit(1);
276
+ throw usageError('complete');
267
277
  }
268
278
  const runId = cardRunFlag(flags);
269
279
  let result;
270
280
  try {
271
- result = completeCard(hippoRoot, tenantId, id, outcomeRaw, runId);
281
+ result = cardsApi.cardComplete(cliApiContext(hippoRoot, tenantId), id, outcomeRaw, runId);
272
282
  }
273
283
  catch (error) {
274
284
  printError(errorMessage(error));
@@ -286,10 +296,9 @@ function cardComplete(hippoRoot, tenantId, args, flags) {
286
296
  }
287
297
  function cardReclaim(hippoRoot, tenantId, args) {
288
298
  if (args.length > 1) {
289
- printError('Usage: hippo card reclaim (sweeps every expired lease; use hippo card block <id> for one card)');
290
- throw new CliExit(1);
299
+ throw usageError('reclaim');
291
300
  }
292
- const ids = reclaimExpiredCards(hippoRoot, tenantId);
301
+ const ids = cardsApi.cardReclaimExpired(cliApiContext(hippoRoot, tenantId));
293
302
  if (ids.length === 0) {
294
303
  console.log('No expired leases.');
295
304
  return;
@@ -301,22 +310,21 @@ function cardReclaim(hippoRoot, tenantId, args) {
301
310
  function cardComment(hippoRoot, tenantId, args, flags) {
302
311
  const id = args[1];
303
312
  if (!id) {
304
- printError('Usage: hippo card comment <id> --body "..." [--author <name>]');
305
- throw new CliExit(1);
313
+ throw usageError('comment');
306
314
  }
307
315
  // Only show and comment look the card up directly; claim/heartbeat/block/review/complete throw from the store instead.
308
- const card = loadCard(hippoRoot, tenantId, id);
316
+ const ctx = cliApiContext(hippoRoot, tenantId);
317
+ const card = cardsApi.cardLoad(ctx, id);
309
318
  if (!card) {
310
319
  printError(`No card found with id ${id}.`);
311
320
  throw new CliExit(1);
312
321
  }
313
322
  const body = stringFlagOrExit(flags, 'body') ?? '';
314
323
  if (!body) {
315
- printError('Usage: hippo card comment <id> --body "..." [--author <name>]');
316
- throw new CliExit(1);
324
+ throw usageError('comment');
317
325
  }
318
326
  const author = stringFlagOrExit(flags, 'author') || 'cli';
319
- const comment = addCardComment(hippoRoot, tenantId, id, author, body);
327
+ const comment = cardsApi.cardComment(ctx, id, author, body);
320
328
  console.log(`Added comment ${comment.id} to card ${id}`);
321
329
  }
322
330
  const CARD_HANDLERS = {
@@ -1,12 +1,16 @@
1
1
  /** HTTP client wrapper for `hippo serve`: only the routed writes (remember, forget, archive, promote); every other command opens the store directly.
2
2
  * Server errors rethrow with the message verbatim so CLI substring matches still work; network errors propagate as the native fetch failure. */
3
3
  import type { RememberOpts, RememberResult } from '../api/index.js';
4
- /** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
5
- * and a server message quotes the caller's own id or content back verbatim. */
4
+ /** An error the server answered with, not one the transport raised, so the transport classifier can skip it by class. */
6
5
  export declare class HttpResponseError extends Error {
7
6
  readonly status: number;
8
7
  constructor(message: string, status: number);
9
8
  }
9
+ /** A 2xx reply that is not the JSON object the route promises: another process may now own the pidfile's port. */
10
+ export declare class MalformedReplyError extends Error {
11
+ readonly route: string;
12
+ constructor(route: string, detail: string);
13
+ }
10
14
  export declare function remember(serverUrl: string, apiKey: string | undefined, opts: RememberOpts): Promise<RememberResult>;
11
15
  export declare function forget(serverUrl: string, apiKey: string | undefined, id: string): Promise<{
12
16
  ok: true;