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,17 +1,12 @@
1
1
  // First-class object verbs for processes, policies and skills.
2
- import { extractPathTags } from '../search/path-context.js';
3
2
  import * as processesModule from '../objects/processes.js';
4
3
  import * as policiesModule from '../objects/policies.js';
5
4
  import * as skillsModule from '../objects/skills.js';
6
5
  import { printError } from './output.js';
7
- import { isStringFlag, nonEmptyStringFlag, stringFlag } from './flag-values.js';
8
- import { requireInit } from './shared.js';
9
- import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
6
+ import { isStringFlag, nonEmptyStringFlag } from './flag-values.js';
10
7
  import { errorMessage } from '../util/log.js';
11
8
  import { CliExit } from './exit.js';
12
- const PROCESS = { cmd: 'process', noun: 'Process', idLabel: 'process' };
13
- const POLICY = { cmd: 'policy', noun: 'Policy', idLabel: 'policy' };
14
- const SKILL = { cmd: 'skill', noun: 'Skill', idLabel: 'skill' };
9
+ import { requiredText, versionedVerbs } from './versioned-verbs.js';
15
10
  // --step is a repeatable flag (collected into an array by parseArgs). A single
16
11
  // --step yields a string; normalize both to string[]. A value-less --step errors.
17
12
  function collectProcessSteps(stepRaw) {
@@ -31,109 +26,55 @@ function printProcessRow(proc) {
31
26
  if (proc.changeSummary)
32
27
  console.log(` change: ${proc.changeSummary}`);
33
28
  }
34
- function processList(hippoRoot, tenantId, flags) {
35
- listObjects(flags, {
36
- plural: 'processes',
37
- states: processesModule.VALID_PROCESS_STATES,
38
- load: (opts) => processesModule.loadProcesses(hippoRoot, tenantId, opts),
39
- printRow: printProcessRow,
40
- });
41
- }
42
- function processGet(hippoRoot, tenantId, args) {
43
- const id = idArgOrExit(args, 'Usage: hippo process get <id>', PROCESS.idLabel);
44
- const proc = foundOrExit(processesModule.loadProcessById(hippoRoot, tenantId, id), PROCESS.noun, id);
45
- console.log(`Process #${proc.id}`);
46
- console.log(` name: ${proc.processName}`);
47
- console.log(` status: ${proc.status}`);
48
- console.log(` version: ${proc.version}`);
49
- if (proc.description)
50
- console.log(` description: ${proc.description}`);
51
- if (proc.steps.length > 0) {
52
- console.log(` steps:`);
53
- proc.steps.forEach((s, i) => console.log(` ${i + 1}. ${s}`));
54
- }
55
- printLifecycleTail(proc);
56
- }
57
- function processSupersede(hippoRoot, tenantId, args, flags) {
58
- const id = idArgOrExit(args, 'Usage: hippo process supersede <id> --step "<text>" [--step ...] [--change "<summary>"] [--description "<text>"]', PROCESS.idLabel);
59
- const steps = collectProcessSteps(flags['step']);
60
- if (steps.length === 0) {
61
- printError('hippo process supersede requires at least one --step "<text>" for the new version.');
62
- throw new CliExit(1);
63
- }
64
- // A supersession is a new version of the SAME process, so the new row reuses the predecessor's name; loadProcessById gives an early not-found,
65
- // and saveProcess's in-SAVEPOINT preflight is the authoritative active-state check.
66
- const existing = foundOrExit(processesModule.loadProcessById(hippoRoot, tenantId, id), PROCESS.noun, id);
67
- const changeSummary = nonEmptyStringFlag(flags, 'change');
68
- const description = nonEmptyStringFlag(flags, 'description');
69
- const procPathTags = extractPathTags(process.cwd());
70
- const created = processesModule.saveProcess(hippoRoot, tenantId, {
71
- processName: existing.processName,
72
- steps,
73
- description,
74
- changeSummary,
75
- supersedesProcessId: id,
76
- extraTags: procPathTags,
77
- });
78
- console.log(`Process #${created.id} recorded (v${created.version}), superseding #${id}.`);
79
- if (created.memoryId)
80
- console.log(` memory: ${created.memoryId}`);
81
- }
82
- function processClose(hippoRoot, tenantId, args) {
83
- closeObject(args, PROCESS, (id) => processesModule.closeProcess(hippoRoot, tenantId, id));
84
- }
85
- export function handleProcess({ hippoRoot, tenantId, args, flags }) {
86
- requireInit(hippoRoot);
87
- const subcommand = args[0] ?? '';
88
- if (subcommand === 'list')
89
- return processList(hippoRoot, tenantId, flags);
90
- if (subcommand === 'get')
91
- return processGet(hippoRoot, tenantId, args);
92
- if (subcommand === 'supersede')
93
- return processSupersede(hippoRoot, tenantId, args, flags);
94
- if (subcommand === 'close')
95
- return processClose(hippoRoot, tenantId, args);
96
- // Default subcommand is new (create): accept both `process new "<name>"` and bare `process "<name>"`;
97
- // for the `new` keyword the name is args[1], otherwise args[0] is the name.
98
- processCreate(hippoRoot, tenantId, subcommand === 'new' ? (args[1] ?? '') : subcommand, flags);
99
- }
100
- function processCreate(hippoRoot, tenantId, processName, flags) {
101
- if (!processName) {
102
- printError('Usage: hippo process new "<name>" --step "<text>" [--step ...] [--description "<text>"]');
103
- printError(' hippo process list [--status active|superseded|closed|all] [--limit N]');
104
- printError(' hippo process get <id>');
105
- printError(' hippo process supersede <id> --step "<text>" [--change "<summary>"]');
106
- printError(' hippo process close <id>');
107
- throw new CliExit(1);
108
- }
109
- const steps = collectProcessSteps(flags['step']);
110
- const description = nonEmptyStringFlag(flags, 'description');
111
- const procPathTags = extractPathTags(process.cwd());
112
- const created = processesModule.saveProcess(hippoRoot, tenantId, {
113
- processName,
114
- steps,
115
- description,
116
- extraTags: procPathTags,
117
- });
118
- console.log(`Process recorded: #${created.id} (v${created.version}, ${created.steps.length} steps)`);
119
- if (created.memoryId)
120
- console.log(` memory: ${created.memoryId}`);
121
- }
29
+ const processKind = (hippoRoot, tenantId) => ({
30
+ names: { cmd: 'process', noun: 'Process', idLabel: 'process' },
31
+ plural: 'processes',
32
+ states: processesModule.VALID_PROCESS_STATES,
33
+ usage: [
34
+ 'Usage: hippo process new "<name>" --step "<text>" [--step ...] [--description "<text>"]',
35
+ ' hippo process list [--status active|superseded|closed|all] [--limit N]',
36
+ ' hippo process get <id>',
37
+ ' hippo process supersede <id> --step "<text>" [--change "<summary>"]',
38
+ ' hippo process close <id>',
39
+ ],
40
+ supersedeUsage: 'Usage: hippo process supersede <id> --step "<text>" [--step ...] [--change "<summary>"] [--description "<text>"]',
41
+ bodyRequired: 'at least one --step "<text>"',
42
+ body: (flags, verb) => {
43
+ const steps = collectProcessSteps(flags['step']);
44
+ // A new process may start with no steps; a new version must say what its steps are.
45
+ if (verb === 'supersede' && steps.length === 0)
46
+ return undefined;
47
+ return { steps, description: nonEmptyStringFlag(flags, 'description') };
48
+ },
49
+ keyOf: (proc) => proc.processName,
50
+ save: (processName, body, extraTags, from) => processesModule.saveProcess(hippoRoot, tenantId, {
51
+ processName, ...body, extraTags, changeSummary: from?.changeSummary, supersedesProcessId: from?.id,
52
+ }),
53
+ recorded: (proc) => `Process recorded: #${proc.id} (v${proc.version}, ${proc.steps.length} steps)`,
54
+ list: (opts) => processesModule.loadProcesses(hippoRoot, tenantId, opts),
55
+ loadById: (id) => processesModule.loadProcessById(hippoRoot, tenantId, id),
56
+ close: (id) => processesModule.closeProcess(hippoRoot, tenantId, id),
57
+ printRow: printProcessRow,
58
+ printDetail: (proc) => {
59
+ console.log(` name: ${proc.processName}`);
60
+ console.log(` status: ${proc.status}`);
61
+ console.log(` version: ${proc.version}`);
62
+ if (proc.description)
63
+ console.log(` description: ${proc.description}`);
64
+ if (proc.steps.length > 0) {
65
+ console.log(` steps:`);
66
+ proc.steps.forEach((s, i) => console.log(` ${i + 1}. ${s}`));
67
+ }
68
+ },
69
+ });
70
+ export const handleProcess = versionedVerbs(processKind);
71
+ const policyRange = (p) => (p.validTo ? `${p.validFrom}..${p.validTo}` : `${p.validFrom}..(open)`);
122
72
  function printPolicyRow(p) {
123
- const range = p.validTo ? `${p.validFrom}..${p.validTo}` : `${p.validFrom}..(open)`;
124
- console.log(`#${p.id} [${p.status}] v${p.version} ${range} memory=${p.memoryId ?? '-'}`);
73
+ console.log(`#${p.id} [${p.status}] v${p.version} ${policyRange(p)} memory=${p.memoryId ?? '-'}`);
125
74
  console.log(` ${p.policyName}: ${p.policyText}`);
126
75
  if (p.changeSummary)
127
76
  console.log(` change: ${p.changeSummary}`);
128
77
  }
129
- function policyList(hippoRoot, tenantId, flags) {
130
- listObjects(flags, {
131
- plural: 'policies',
132
- states: policiesModule.VALID_POLICY_STATES,
133
- load: (opts) => policiesModule.loadPolicies(hippoRoot, tenantId, opts),
134
- printRow: printPolicyRow,
135
- });
136
- }
137
78
  function policyAsOf(hippoRoot, tenantId, args, flags) {
138
79
  const dateRaw = args[1];
139
80
  if (!dateRaw) {
@@ -157,96 +98,46 @@ function policyAsOf(hippoRoot, tenantId, args, flags) {
157
98
  for (const p of results)
158
99
  printPolicyRow(p);
159
100
  }
160
- function policyGet(hippoRoot, tenantId, args) {
161
- const id = idArgOrExit(args, 'Usage: hippo policy get <id>', POLICY.idLabel);
162
- const p = foundOrExit(policiesModule.loadPolicyById(hippoRoot, tenantId, id), POLICY.noun, id);
163
- console.log(`Policy #${p.id}`);
164
- console.log(` name: ${p.policyName}`);
165
- console.log(` text: ${p.policyText}`);
166
- console.log(` status: ${p.status}`);
167
- console.log(` version: ${p.version}`);
168
- console.log(` valid_from: ${p.validFrom}`);
169
- console.log(` valid_to: ${p.validTo ?? '(open-ended)'}`);
170
- printLifecycleTail(p);
171
- }
172
- function policySupersede(hippoRoot, tenantId, args, flags) {
173
- const id = idArgOrExit(args, 'Usage: hippo policy supersede <id> --text "<rule>" [--from <iso>] [--to <iso>] [--change "<summary>"]', POLICY.idLabel);
174
- const textRaw = stringFlag(flags, 'text');
175
- if (!textRaw?.trim()) {
176
- printError('hippo policy supersede requires --text "<rule>" for the new version.');
177
- throw new CliExit(1);
178
- }
179
- const existing = foundOrExit(policiesModule.loadPolicyById(hippoRoot, tenantId, id), POLICY.noun, id);
180
- try {
181
- const created = policiesModule.savePolicy(hippoRoot, tenantId, {
182
- policyName: existing.policyName,
183
- policyText: textRaw,
184
- validFrom: nonEmptyStringFlag(flags, 'from'),
185
- validTo: nonEmptyStringFlag(flags, 'to'),
186
- changeSummary: nonEmptyStringFlag(flags, 'change'),
187
- supersedesPolicyId: id,
188
- extraTags: extractPathTags(process.cwd()),
189
- });
190
- console.log(`Policy #${created.id} recorded (v${created.version}), superseding #${id}.`);
191
- if (created.memoryId)
192
- console.log(` memory: ${created.memoryId}`);
193
- }
194
- catch (e) {
195
- printError(errorMessage(e));
196
- throw new CliExit(1);
197
- }
198
- }
199
- function policyClose(hippoRoot, tenantId, args) {
200
- closeObject(args, POLICY, (id) => policiesModule.closePolicy(hippoRoot, tenantId, id));
201
- }
202
- export function handlePolicy({ hippoRoot, tenantId, args, flags }) {
203
- requireInit(hippoRoot);
204
- const subcommand = args[0] ?? '';
205
- if (subcommand === 'list')
206
- return policyList(hippoRoot, tenantId, flags);
207
- if (subcommand === 'asof')
208
- return policyAsOf(hippoRoot, tenantId, args, flags);
209
- if (subcommand === 'get')
210
- return policyGet(hippoRoot, tenantId, args);
211
- if (subcommand === 'supersede')
212
- return policySupersede(hippoRoot, tenantId, args, flags);
213
- if (subcommand === 'close')
214
- return policyClose(hippoRoot, tenantId, args);
215
- policyCreate(hippoRoot, tenantId, args, flags);
216
- }
217
- function policyCreate(hippoRoot, tenantId, args, flags) {
218
- const subcommand = args[0] ?? '';
219
- // Default subcommand: new (create). Accept both `policy new "<name>"` and the
220
- // bare `policy "<name>"` form: for the `new` keyword the name is args[1].
221
- const policyName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
222
- const textRaw = stringFlag(flags, 'text');
223
- if (!policyName || !textRaw?.trim()) {
224
- printError('Usage: hippo policy new "<name>" --text "<rule>" [--from <iso>] [--to <iso>]');
225
- printError(' hippo policy list [--status active|superseded|closed|all] [--limit N]');
226
- printError(' hippo policy get <id>');
227
- printError(' hippo policy asof <iso-date> [--name "<policy>"]');
228
- printError(' hippo policy supersede <id> --text "<rule>" [--from] [--to] [--change "<summary>"]');
229
- printError(' hippo policy close <id>');
230
- throw new CliExit(1);
231
- }
232
- try {
233
- const created = policiesModule.savePolicy(hippoRoot, tenantId, {
234
- policyName,
235
- policyText: textRaw,
236
- validFrom: nonEmptyStringFlag(flags, 'from'),
237
- validTo: nonEmptyStringFlag(flags, 'to'),
238
- extraTags: extractPathTags(process.cwd()),
239
- });
240
- const range = created.validTo ? `${created.validFrom}..${created.validTo}` : `${created.validFrom}..(open)`;
241
- console.log(`Policy recorded: #${created.id} (v${created.version}, effective ${range})`);
242
- if (created.memoryId)
243
- console.log(` memory: ${created.memoryId}`);
244
- }
245
- catch (e) {
246
- printError(errorMessage(e));
247
- throw new CliExit(1);
248
- }
249
- }
101
+ const policyKind = (hippoRoot, tenantId) => ({
102
+ names: { cmd: 'policy', noun: 'Policy', idLabel: 'policy' },
103
+ plural: 'policies',
104
+ states: policiesModule.VALID_POLICY_STATES,
105
+ usage: [
106
+ 'Usage: hippo policy new "<name>" --text "<rule>" [--from <iso>] [--to <iso>]',
107
+ ' hippo policy list [--status active|superseded|closed|all] [--limit N]',
108
+ ' hippo policy get <id>',
109
+ ' hippo policy asof <iso-date> [--name "<policy>"]',
110
+ ' hippo policy supersede <id> --text "<rule>" [--from] [--to] [--change "<summary>"]',
111
+ ' hippo policy close <id>',
112
+ ],
113
+ supersedeUsage: 'Usage: hippo policy supersede <id> --text "<rule>" [--from <iso>] [--to <iso>] [--change "<summary>"]',
114
+ bodyRequired: '--text "<rule>"',
115
+ body: (flags) => {
116
+ const policyText = requiredText(flags, 'text');
117
+ if (policyText === undefined)
118
+ return undefined;
119
+ return { policyText, validFrom: nonEmptyStringFlag(flags, 'from'), validTo: nonEmptyStringFlag(flags, 'to') };
120
+ },
121
+ keyOf: (p) => p.policyName,
122
+ save: (policyName, body, extraTags, from) => policiesModule.savePolicy(hippoRoot, tenantId, {
123
+ policyName, ...body, extraTags, changeSummary: from?.changeSummary, supersedesPolicyId: from?.id,
124
+ }),
125
+ recorded: (p) => `Policy recorded: #${p.id} (v${p.version}, effective ${policyRange(p)})`,
126
+ list: (opts) => policiesModule.loadPolicies(hippoRoot, tenantId, opts),
127
+ loadById: (id) => policiesModule.loadPolicyById(hippoRoot, tenantId, id),
128
+ close: (id) => policiesModule.closePolicy(hippoRoot, tenantId, id),
129
+ printRow: printPolicyRow,
130
+ printDetail: (p) => {
131
+ console.log(` name: ${p.policyName}`);
132
+ console.log(` text: ${p.policyText}`);
133
+ console.log(` status: ${p.status}`);
134
+ console.log(` version: ${p.version}`);
135
+ console.log(` valid_from: ${p.validFrom}`);
136
+ console.log(` valid_to: ${p.validTo ?? '(open-ended)'}`);
137
+ },
138
+ extra: { sub: 'asof', run: (args, flags) => policyAsOf(hippoRoot, tenantId, args, flags) },
139
+ });
140
+ export const handlePolicy = versionedVerbs(policyKind);
250
141
  function printSkillRow(s) {
251
142
  const trig = s.trigger ? ` when="${s.trigger}"` : '';
252
143
  console.log(`#${s.id} [${s.status}] v${s.version}${trig} memory=${s.memoryId ?? '-'}`);
@@ -254,14 +145,6 @@ function printSkillRow(s) {
254
145
  if (s.changeSummary)
255
146
  console.log(` change: ${s.changeSummary}`);
256
147
  }
257
- function skillList(hippoRoot, tenantId, flags) {
258
- listObjects(flags, {
259
- plural: 'skills',
260
- states: skillsModule.VALID_SKILL_STATES,
261
- load: (opts) => skillsModule.loadSkills(hippoRoot, tenantId, opts),
262
- printRow: printSkillRow,
263
- });
264
- }
265
148
  function skillExport(hippoRoot, tenantId) {
266
149
  const md = skillsModule.exportSkills(hippoRoot, tenantId);
267
150
  if (!md) {
@@ -270,91 +153,44 @@ function skillExport(hippoRoot, tenantId) {
270
153
  }
271
154
  console.log(md);
272
155
  }
273
- function skillGet(hippoRoot, tenantId, args) {
274
- const id = idArgOrExit(args, 'Usage: hippo skill get <id>', SKILL.idLabel);
275
- const s = foundOrExit(skillsModule.loadSkillById(hippoRoot, tenantId, id), SKILL.noun, id);
276
- console.log(`Skill #${s.id}`);
277
- console.log(` name: ${s.skillName}`);
278
- console.log(` status: ${s.status}`);
279
- console.log(` version: ${s.version}`);
280
- if (s.trigger)
281
- console.log(` when: ${s.trigger}`);
282
- console.log(` instructions: ${s.instructions}`);
283
- printLifecycleTail(s);
284
- }
285
- function skillSupersede(hippoRoot, tenantId, args, flags) {
286
- const id = idArgOrExit(args, 'Usage: hippo skill supersede <id> --instructions "<text>" [--trigger "<when>"] [--change "<summary>"]', SKILL.idLabel);
287
- const instrRaw = stringFlag(flags, 'instructions');
288
- if (!instrRaw?.trim()) {
289
- printError('hippo skill supersede requires --instructions "<text>" for the new version.');
290
- throw new CliExit(1);
291
- }
292
- const existing = foundOrExit(skillsModule.loadSkillById(hippoRoot, tenantId, id), SKILL.noun, id);
293
- try {
294
- const created = skillsModule.saveSkill(hippoRoot, tenantId, {
295
- skillName: existing.skillName,
296
- instructions: instrRaw,
297
- trigger: nonEmptyStringFlag(flags, 'trigger'),
298
- changeSummary: nonEmptyStringFlag(flags, 'change'),
299
- supersedesSkillId: id,
300
- extraTags: extractPathTags(process.cwd()),
301
- });
302
- console.log(`Skill #${created.id} recorded (v${created.version}), superseding #${id}.`);
303
- if (created.memoryId)
304
- console.log(` memory: ${created.memoryId}`);
305
- }
306
- catch (e) {
307
- printError(errorMessage(e));
308
- throw new CliExit(1);
309
- }
310
- }
311
- function skillClose(hippoRoot, tenantId, args) {
312
- closeObject(args, SKILL, (id) => skillsModule.closeSkill(hippoRoot, tenantId, id));
313
- }
314
- export function handleSkill({ hippoRoot, tenantId, args, flags }) {
315
- requireInit(hippoRoot);
316
- const subcommand = args[0] ?? '';
317
- if (subcommand === 'list')
318
- return skillList(hippoRoot, tenantId, flags);
319
- if (subcommand === 'export')
320
- return skillExport(hippoRoot, tenantId);
321
- if (subcommand === 'get')
322
- return skillGet(hippoRoot, tenantId, args);
323
- if (subcommand === 'supersede')
324
- return skillSupersede(hippoRoot, tenantId, args, flags);
325
- if (subcommand === 'close')
326
- return skillClose(hippoRoot, tenantId, args);
327
- skillCreate(hippoRoot, tenantId, args, flags);
328
- }
329
- function skillCreate(hippoRoot, tenantId, args, flags) {
330
- const subcommand = args[0] ?? '';
331
- // Default subcommand: new (create). Accept both `skill new "<name>"` and the
332
- // bare `skill "<name>"` form: for the `new` keyword the name is args[1].
333
- const skillName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
334
- const instrRaw = stringFlag(flags, 'instructions');
335
- if (!skillName || !instrRaw?.trim()) {
336
- printError('Usage: hippo skill new "<name>" --instructions "<text>" [--trigger "<when>"]');
337
- printError(' hippo skill list [--status active|superseded|closed|all] [--limit N]');
338
- printError(' hippo skill get <id>');
339
- printError(' hippo skill export (render active skills as an AGENTS.md/CLAUDE.md block)');
340
- printError(' hippo skill supersede <id> --instructions "<text>" [--trigger] [--change "<summary>"]');
341
- printError(' hippo skill close <id>');
342
- throw new CliExit(1);
343
- }
344
- try {
345
- const created = skillsModule.saveSkill(hippoRoot, tenantId, {
346
- skillName,
347
- instructions: instrRaw,
348
- trigger: nonEmptyStringFlag(flags, 'trigger'),
349
- extraTags: extractPathTags(process.cwd()),
350
- });
351
- console.log(`Skill recorded: #${created.id} (v${created.version})`);
352
- if (created.memoryId)
353
- console.log(` memory: ${created.memoryId}`);
354
- }
355
- catch (e) {
356
- printError(errorMessage(e));
357
- throw new CliExit(1);
358
- }
359
- }
156
+ const skillKind = (hippoRoot, tenantId) => ({
157
+ names: { cmd: 'skill', noun: 'Skill', idLabel: 'skill' },
158
+ plural: 'skills',
159
+ states: skillsModule.VALID_SKILL_STATES,
160
+ usage: [
161
+ 'Usage: hippo skill new "<name>" --instructions "<text>" [--trigger "<when>"]',
162
+ ' hippo skill list [--status active|superseded|closed|all] [--limit N]',
163
+ ' hippo skill get <id>',
164
+ ' hippo skill export (render active skills as an AGENTS.md/CLAUDE.md block)',
165
+ ' hippo skill supersede <id> --instructions "<text>" [--trigger] [--change "<summary>"]',
166
+ ' hippo skill close <id>',
167
+ ],
168
+ supersedeUsage: 'Usage: hippo skill supersede <id> --instructions "<text>" [--trigger "<when>"] [--change "<summary>"]',
169
+ bodyRequired: '--instructions "<text>"',
170
+ body: (flags) => {
171
+ const instructions = requiredText(flags, 'instructions');
172
+ if (instructions === undefined)
173
+ return undefined;
174
+ return { instructions, trigger: nonEmptyStringFlag(flags, 'trigger') };
175
+ },
176
+ keyOf: (s) => s.skillName,
177
+ save: (skillName, body, extraTags, from) => skillsModule.saveSkill(hippoRoot, tenantId, {
178
+ skillName, ...body, extraTags, changeSummary: from?.changeSummary, supersedesSkillId: from?.id,
179
+ }),
180
+ recorded: (s) => `Skill recorded: #${s.id} (v${s.version})`,
181
+ list: (opts) => skillsModule.loadSkills(hippoRoot, tenantId, opts),
182
+ loadById: (id) => skillsModule.loadSkillById(hippoRoot, tenantId, id),
183
+ close: (id) => skillsModule.closeSkill(hippoRoot, tenantId, id),
184
+ printRow: printSkillRow,
185
+ printDetail: (s) => {
186
+ console.log(` name: ${s.skillName}`);
187
+ console.log(` status: ${s.status}`);
188
+ console.log(` version: ${s.version}`);
189
+ if (s.trigger)
190
+ console.log(` when: ${s.trigger}`);
191
+ console.log(` instructions: ${s.instructions}`);
192
+ },
193
+ extra: { sub: 'export', run: () => skillExport(hippoRoot, tenantId) },
194
+ });
195
+ export const handleSkill = versionedVerbs(skillKind);
360
196
  //# sourceMappingURL=playbooks.js.map
@@ -0,0 +1,3 @@
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handlePredict({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
+ //# sourceMappingURL=predictions.d.ts.map
@@ -0,0 +1,174 @@
1
+ // First-class object verbs for predictions: record a claim, close it against the actual, and read the class base rate.
2
+ import * as predictionsApi from '../api/predictions.js';
3
+ import { VALID_CLOSURE_STATES } from '../core/prediction.js';
4
+ import { cliApiContext } from './api-context.js';
5
+ import { printError } from './output.js';
6
+ import { parseListLimit, stringFlag } from './flag-values.js';
7
+ import { requireInit } from './shared.js';
8
+ import { foundOrExit, idArgOrExit, requireStatus } from './object-verbs.js';
9
+ import { CliExit } from './exit.js';
10
+ const BASERATE_DECIMALS = 3;
11
+ const PREDICTION_NOUN = 'Prediction';
12
+ async function predictClose(ctx, args, flags) {
13
+ const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction');
14
+ const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
15
+ // SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
16
+ if (!VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
17
+ printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
18
+ throw new CliExit(1);
19
+ }
20
+ const actualRaw = flags['actual'];
21
+ const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
22
+ if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
23
+ printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
24
+ throw new CliExit(1);
25
+ }
26
+ const closureNote = stringFlag(flags, 'note');
27
+ const closed = await predictionsApi.closePrediction(ctx, id, {
28
+ // SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES and not open.
29
+ closureState: stateRaw,
30
+ actualValue,
31
+ closureNote,
32
+ });
33
+ console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
34
+ }
35
+ async function loadPredictionList(ctx, status, classTag, limit) {
36
+ if (status === 'open') {
37
+ return predictionsApi.listPredictions(ctx, {
38
+ classTag: classTag || undefined,
39
+ closureState: 'open',
40
+ limit,
41
+ });
42
+ }
43
+ if (status === 'all') {
44
+ return predictionsApi.listPredictions(ctx, classTag ? { classTag, limit } : { limit });
45
+ }
46
+ const closureState = requireStatus(status, VALID_CLOSURE_STATES);
47
+ if (!classTag) {
48
+ // status filter without class: scan all classes is more complex; v1 requires --class for non-default status
49
+ printError('--status filter (non-open) requires --class to be set.');
50
+ throw new CliExit(1);
51
+ }
52
+ return predictionsApi.listPredictions(ctx, {
53
+ classTag,
54
+ closureState,
55
+ limit,
56
+ });
57
+ }
58
+ async function predictList(ctx, flags) {
59
+ const classTag = stringFlag(flags, 'class')?.trim() ?? '';
60
+ const status = stringFlag(flags, 'status')?.trim() ?? 'all';
61
+ const limit = parseListLimit(flags);
62
+ const results = await loadPredictionList(ctx, status, classTag, limit);
63
+ if (results.length === 0) {
64
+ console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
65
+ return;
66
+ }
67
+ console.log(`Found ${results.length} predictions:\n`);
68
+ for (const p of results) {
69
+ const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
70
+ const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
71
+ const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
72
+ console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
73
+ console.log(` ${p.claimText}`);
74
+ if (p.closureNote)
75
+ console.log(` note: ${p.closureNote}`);
76
+ }
77
+ }
78
+ async function predictShow(ctx, args) {
79
+ const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction');
80
+ const pred = foundOrExit(await predictionsApi.predictionById(ctx, id), PREDICTION_NOUN, id);
81
+ console.log(`Prediction #${pred.id}`);
82
+ console.log(` class: ${pred.classTag}`);
83
+ console.log(` claim: ${pred.claimText}`);
84
+ console.log(` state: ${pred.closureState}`);
85
+ if (pred.estimateValue !== null)
86
+ console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
87
+ if (pred.targetDate)
88
+ console.log(` target: ${pred.targetDate}`);
89
+ if (pred.actualValue !== null)
90
+ console.log(` actual: ${pred.actualValue}`);
91
+ if (pred.closedAt)
92
+ console.log(` closed: ${pred.closedAt}`);
93
+ if (pred.closureNote)
94
+ console.log(` note: ${pred.closureNote}`);
95
+ if (pred.memoryId)
96
+ console.log(` memory: ${pred.memoryId}`);
97
+ console.log(` created: ${pred.createdAt}`);
98
+ }
99
+ async function predictBaserate(ctx, flags) {
100
+ // Reference-class / planning-fallacy detector
101
+ const classTag = stringFlag(flags, 'class')?.trim();
102
+ if (!classTag) {
103
+ printError('Usage: hippo predict baserate --class <c>');
104
+ throw new CliExit(1);
105
+ }
106
+ const baserate = await predictionsApi.predictionBaserate(ctx, classTag);
107
+ if (baserate.nClosed === 0) {
108
+ console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
109
+ console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
110
+ console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
111
+ return;
112
+ }
113
+ console.log(baserate.summary);
114
+ console.log(` n_closed: ${baserate.nClosed}`);
115
+ console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
116
+ if (baserate.meanEstimate !== null)
117
+ console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
118
+ if (baserate.meanActual !== null)
119
+ console.log(` mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
120
+ if (baserate.meanRatio !== null)
121
+ console.log(` mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
122
+ if (baserate.p50Ratio !== null)
123
+ console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(BASERATE_DECIMALS)}x`);
124
+ if (baserate.mae !== null)
125
+ console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
126
+ }
127
+ export async function handlePredict({ hippoRoot, tenantId, args, flags }) {
128
+ requireInit(hippoRoot);
129
+ const ctx = cliApiContext(hippoRoot, tenantId);
130
+ const subcommand = args[0] ?? '';
131
+ if (subcommand === 'close')
132
+ return predictClose(ctx, args, flags);
133
+ if (subcommand === 'list')
134
+ return predictList(ctx, flags);
135
+ if (subcommand === 'show')
136
+ return predictShow(ctx, args);
137
+ if (subcommand === 'baserate')
138
+ return predictBaserate(ctx, flags);
139
+ // Default subcommand: create. args[0] is the claim text.
140
+ return predictCreate(ctx, subcommand, flags);
141
+ }
142
+ async function predictCreate(ctx, claimText, flags) {
143
+ if (!claimText) {
144
+ printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
145
+ printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
146
+ printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
147
+ printError(' hippo predict show <id>');
148
+ throw new CliExit(1);
149
+ }
150
+ const classTag = stringFlag(flags, 'class')?.trim();
151
+ if (!classTag) {
152
+ printError('--class is required for prediction creation.');
153
+ throw new CliExit(1);
154
+ }
155
+ const estimateRaw = flags['estimate'];
156
+ const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
157
+ if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
158
+ printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
159
+ throw new CliExit(1);
160
+ }
161
+ const estimateUnit = stringFlag(flags, 'unit');
162
+ const targetDate = stringFlag(flags, 'target');
163
+ const created = await predictionsApi.recordPrediction(ctx, {
164
+ classTag,
165
+ claimText,
166
+ estimateValue,
167
+ estimateUnit,
168
+ targetDate,
169
+ });
170
+ console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
171
+ if (created.memoryId)
172
+ console.log(` memory: ${created.memoryId}`);
173
+ }
174
+ //# sourceMappingURL=predictions.js.map