hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,528 @@
1
+ // First-class object verbs for predictions, decisions and incidents.
2
+ import { writeEntry } from '../store/entry-writes.js';
3
+ import { readEntry } from '../store/entry-reads.js';
4
+ import { extractPathTags } from '../path-context.js';
5
+ import * as predictionsModule from '../predictions/store.js';
6
+ import * as decisionsModule from '../decisions.js';
7
+ import * as incidentsModule from '../incidents.js';
8
+ import { resolveTenantId } from '../tenant.js';
9
+ import { printError } from './output.js';
10
+ import { requireInit } from './shared.js';
11
+ function parseListLimit(flags) {
12
+ const limitRaw = flags['limit'];
13
+ const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
14
+ if (!Number.isFinite(limit) || limit <= 0) {
15
+ printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
16
+ process.exit(1);
17
+ }
18
+ return limit;
19
+ }
20
+ /** parseInt-based id parse for predictions and decisions; incidents use the strict parse below. */
21
+ function parseObjectId(idRaw, noun) {
22
+ const id = parseInt(String(idRaw), 10);
23
+ if (!Number.isFinite(id) || id <= 0) {
24
+ printError(`Invalid ${noun} id: "${idRaw}"`);
25
+ process.exit(1);
26
+ }
27
+ return id;
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // E2 prediction first-class object (v0.31)
31
+ // docs/plans/2026-05-26-e2-prediction-object.md
32
+ // ---------------------------------------------------------------------------
33
+ function predictClose(hippoRoot, tenantId, args, flags) {
34
+ const idRaw = args[1];
35
+ if (!idRaw) {
36
+ printError('Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
37
+ process.exit(1);
38
+ }
39
+ const id = parseObjectId(idRaw, 'prediction');
40
+ const stateRaw = typeof flags['state'] === 'string' ? flags['state'].trim() : '';
41
+ if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
42
+ printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
43
+ process.exit(1);
44
+ }
45
+ const actualRaw = flags['actual'];
46
+ const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
47
+ if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
48
+ printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
49
+ process.exit(1);
50
+ }
51
+ const noteRaw = flags['note'];
52
+ const closureNote = typeof noteRaw === 'string' ? noteRaw : undefined;
53
+ const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
54
+ closureState: stateRaw,
55
+ actualValue,
56
+ closureNote,
57
+ });
58
+ console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
59
+ }
60
+ function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
61
+ if (status === 'open') {
62
+ return predictionsModule.loadOpenPredictions(hippoRoot, tenantId, {
63
+ classTag: classTag || undefined,
64
+ limit,
65
+ });
66
+ }
67
+ if (status === 'all') {
68
+ // No closure-state filter; pull both via loadPredictionsByClass if class given
69
+ if (classTag) {
70
+ return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, { limit });
71
+ }
72
+ // No class filter + status=all = pull open + closed across all classes
73
+ // (kept simple: report open via loadOpenPredictions; closed via two
74
+ // class scans isn't symmetrical. v1 callers typically pass --class.)
75
+ return predictionsModule.loadOpenPredictions(hippoRoot, tenantId, { limit });
76
+ }
77
+ if (!predictionsModule.VALID_CLOSURE_STATES.has(status)) {
78
+ printError(`Invalid --status: "${status}". Must be one of: open | closed | closed-unknown | all.`);
79
+ process.exit(1);
80
+ }
81
+ if (!classTag) {
82
+ // status filter without class — scan all classes is more complex; v1 requires --class for non-default status
83
+ printError('--status filter (non-open) requires --class to be set.');
84
+ process.exit(1);
85
+ }
86
+ return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
87
+ closureState: status,
88
+ limit,
89
+ });
90
+ }
91
+ function predictList(hippoRoot, tenantId, flags) {
92
+ const classTagRaw = flags['class'];
93
+ const classTag = typeof classTagRaw === 'string' ? classTagRaw.trim() : '';
94
+ const statusRaw = flags['status'];
95
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
96
+ const limit = parseListLimit(flags);
97
+ const results = loadPredictionList(hippoRoot, tenantId, status, classTag, limit);
98
+ if (results.length === 0) {
99
+ console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
100
+ return;
101
+ }
102
+ console.log(`Found ${results.length} predictions:\n`);
103
+ for (const p of results) {
104
+ const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
105
+ const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
106
+ const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
107
+ console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
108
+ console.log(` ${p.claimText}`);
109
+ if (p.closureNote)
110
+ console.log(` note: ${p.closureNote}`);
111
+ }
112
+ }
113
+ function predictShow(hippoRoot, tenantId, args) {
114
+ const idRaw = args[1];
115
+ if (!idRaw) {
116
+ printError('Usage: hippo predict show <id>');
117
+ process.exit(1);
118
+ }
119
+ const id = parseObjectId(idRaw, 'prediction');
120
+ const pred = predictionsModule.loadPredictionById(hippoRoot, tenantId, id);
121
+ if (!pred) {
122
+ printError(`Prediction ${id} not found.`);
123
+ process.exit(1);
124
+ }
125
+ console.log(`Prediction #${pred.id}`);
126
+ console.log(` class: ${pred.classTag}`);
127
+ console.log(` claim: ${pred.claimText}`);
128
+ console.log(` state: ${pred.closureState}`);
129
+ if (pred.estimateValue !== null)
130
+ console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
131
+ if (pred.targetDate)
132
+ console.log(` target: ${pred.targetDate}`);
133
+ if (pred.actualValue !== null)
134
+ console.log(` actual: ${pred.actualValue}`);
135
+ if (pred.closedAt)
136
+ console.log(` closed: ${pred.closedAt}`);
137
+ if (pred.closureNote)
138
+ console.log(` note: ${pred.closureNote}`);
139
+ if (pred.memoryId)
140
+ console.log(` memory: ${pred.memoryId}`);
141
+ console.log(` created: ${pred.createdAt}`);
142
+ }
143
+ function predictBaserate(hippoRoot, tenantId, flags) {
144
+ // J3 reference-class / planning-fallacy detector
145
+ const classTagRaw = flags['class'];
146
+ if (typeof classTagRaw !== 'string' || !classTagRaw.trim()) {
147
+ printError('Usage: hippo predict baserate --class <c>');
148
+ process.exit(1);
149
+ }
150
+ const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTagRaw.trim());
151
+ if (baserate.nClosed === 0) {
152
+ console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
153
+ console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
154
+ console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
155
+ return;
156
+ }
157
+ console.log(baserate.summary);
158
+ console.log(` n_closed: ${baserate.nClosed}`);
159
+ console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
160
+ if (baserate.meanEstimate !== null)
161
+ console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
162
+ if (baserate.meanActual !== null)
163
+ console.log(` mean_actual: ${baserate.meanActual.toFixed(3)}`);
164
+ if (baserate.meanRatio !== null)
165
+ console.log(` mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
166
+ if (baserate.p50Ratio !== null)
167
+ console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
168
+ if (baserate.mae !== null)
169
+ console.log(` mae: ${baserate.mae.toFixed(3)}`);
170
+ }
171
+ export function cmdPredict(hippoRoot, args, flags) {
172
+ requireInit(hippoRoot);
173
+ const tenantId = resolveTenantId({});
174
+ const subcommand = args[0] ?? '';
175
+ if (subcommand === 'close')
176
+ return predictClose(hippoRoot, tenantId, args, flags);
177
+ if (subcommand === 'list')
178
+ return predictList(hippoRoot, tenantId, flags);
179
+ if (subcommand === 'show')
180
+ return predictShow(hippoRoot, tenantId, args);
181
+ if (subcommand === 'baserate')
182
+ return predictBaserate(hippoRoot, tenantId, flags);
183
+ // Default subcommand: create. args[0] is the claim text.
184
+ predictCreate(hippoRoot, tenantId, subcommand, flags);
185
+ }
186
+ function predictCreate(hippoRoot, tenantId, claimText, flags) {
187
+ if (!claimText) {
188
+ printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
189
+ printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
190
+ printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
191
+ printError(' hippo predict show <id>');
192
+ process.exit(1);
193
+ }
194
+ const classTagRaw = flags['class'];
195
+ if (typeof classTagRaw !== 'string' || !classTagRaw.trim()) {
196
+ printError('--class is required for prediction creation.');
197
+ process.exit(1);
198
+ }
199
+ const classTag = classTagRaw.trim();
200
+ const estimateRaw = flags['estimate'];
201
+ const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
202
+ if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
203
+ printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
204
+ process.exit(1);
205
+ }
206
+ const unitRaw = flags['unit'];
207
+ const estimateUnit = typeof unitRaw === 'string' ? unitRaw : undefined;
208
+ const targetRaw = flags['target'];
209
+ const targetDate = typeof targetRaw === 'string' ? targetRaw : undefined;
210
+ const created = predictionsModule.savePrediction(hippoRoot, tenantId, {
211
+ classTag,
212
+ claimText,
213
+ estimateValue,
214
+ estimateUnit,
215
+ targetDate,
216
+ });
217
+ console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
218
+ if (created.memoryId)
219
+ console.log(` memory: ${created.memoryId}`);
220
+ }
221
+ function decideList(hippoRoot, tenantId, flags) {
222
+ const statusRaw = flags['status'];
223
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
224
+ const limit = parseListLimit(flags);
225
+ let results;
226
+ if (status === 'all') {
227
+ results = decisionsModule.loadDecisions(hippoRoot, tenantId, { limit });
228
+ }
229
+ else {
230
+ if (!decisionsModule.VALID_DECISION_STATES.has(status)) {
231
+ printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
232
+ process.exit(1);
233
+ }
234
+ results = decisionsModule.loadDecisions(hippoRoot, tenantId, {
235
+ status: status,
236
+ limit,
237
+ });
238
+ }
239
+ if (results.length === 0) {
240
+ console.log('No decisions.');
241
+ return;
242
+ }
243
+ console.log(`Found ${results.length} decisions:\n`);
244
+ for (const d of results) {
245
+ const supPart = d.supersededBy !== null ? ` superseded_by=#${d.supersededBy}` : '';
246
+ console.log(`#${d.id} [${d.status}]${supPart} memory=${d.memoryId ?? '-'}`);
247
+ console.log(` ${d.decisionText}`);
248
+ if (d.context)
249
+ console.log(` context: ${d.context}`);
250
+ }
251
+ }
252
+ function decideGet(hippoRoot, tenantId, args) {
253
+ const idRaw = args[1];
254
+ if (!idRaw) {
255
+ printError('Usage: hippo decide get <id>');
256
+ process.exit(1);
257
+ }
258
+ const id = parseObjectId(idRaw, 'decision');
259
+ const decision = decisionsModule.loadDecisionById(hippoRoot, tenantId, id);
260
+ if (!decision) {
261
+ printError(`Decision ${id} not found.`);
262
+ process.exit(1);
263
+ }
264
+ console.log(`Decision #${decision.id}`);
265
+ console.log(` status: ${decision.status}`);
266
+ console.log(` text: ${decision.decisionText}`);
267
+ if (decision.context)
268
+ console.log(` context: ${decision.context}`);
269
+ if (decision.supersededBy !== null)
270
+ console.log(` superseded_by: #${decision.supersededBy}`);
271
+ if (decision.supersededAt)
272
+ console.log(` superseded_at: ${decision.supersededAt}`);
273
+ if (decision.closedAt)
274
+ console.log(` closed_at: ${decision.closedAt}`);
275
+ if (decision.memoryId)
276
+ console.log(` memory: ${decision.memoryId}`);
277
+ console.log(` created: ${decision.createdAt}`);
278
+ }
279
+ function decideClose(hippoRoot, tenantId, args) {
280
+ const idRaw = args[1];
281
+ if (!idRaw) {
282
+ printError('Usage: hippo decide close <id>');
283
+ process.exit(1);
284
+ }
285
+ const id = parseObjectId(idRaw, 'decision');
286
+ const closed = decisionsModule.closeDecision(hippoRoot, tenantId, id);
287
+ console.log(`Decision #${closed.id} closed.`);
288
+ }
289
+ export function cmdDecide(hippoRoot, args, flags) {
290
+ requireInit(hippoRoot);
291
+ const tenantId = resolveTenantId({});
292
+ const subcommand = args[0] ?? '';
293
+ if (subcommand === 'list')
294
+ return decideList(hippoRoot, tenantId, flags);
295
+ if (subcommand === 'get')
296
+ return decideGet(hippoRoot, tenantId, args);
297
+ if (subcommand === 'close')
298
+ return decideClose(hippoRoot, tenantId, args);
299
+ // Default subcommand: create. args[0] is the decision text.
300
+ decideCreate(hippoRoot, tenantId, subcommand, flags);
301
+ }
302
+ function decideCreate(hippoRoot, tenantId, decisionText, flags) {
303
+ if (!decisionText) {
304
+ printError('Usage: hippo decide "<decision>" [--context "<why>"] [--supersedes <memory-id>]');
305
+ printError(' hippo decide list [--status active|superseded|closed|all] [--limit N]');
306
+ printError(' hippo decide get <id>');
307
+ printError(' hippo decide close <id>');
308
+ process.exit(1);
309
+ }
310
+ const contextRaw = flags['context'];
311
+ const context = typeof contextRaw === 'string' && contextRaw ? contextRaw : undefined;
312
+ // A value-less `--supersedes` (parseArgs stores boolean true) is a malformed
313
+ // request: the user asked to supersede but gave no memory id. Reject it rather
314
+ // than silently creating a non-superseding decision (codex review 2026-05-28).
315
+ if (flags['supersedes'] === true) {
316
+ printError('--supersedes requires a memory id, e.g. hippo decide "<text>" --supersedes mem_abc123.');
317
+ process.exit(1);
318
+ }
319
+ const supersedesMemId = typeof flags['supersedes'] === 'string' ? flags['supersedes'] : null;
320
+ // Backward-compat: --supersedes takes a MEMORY id. Validate it exists and
321
+ // resolve it to the active decision row (if any). Grill fix: commit the
322
+ // canonical table create+supersede FIRST (inside saveDecision's SAVEPOINT),
323
+ // weaken the old memory LAST (best-effort) so a memory-write failure cannot
324
+ // leave the memory stale without the table reflecting the supersession.
325
+ let supersedesDecisionId;
326
+ let oldEntry = null;
327
+ if (supersedesMemId) {
328
+ oldEntry = readEntry(hippoRoot, supersedesMemId, tenantId) ?? null;
329
+ if (!oldEntry) {
330
+ printError(`Memory ${supersedesMemId} not found.`);
331
+ process.exit(1);
332
+ }
333
+ supersedesDecisionId =
334
+ decisionsModule.resolveActiveDecisionIdByMemory(hippoRoot, tenantId, supersedesMemId) ?? undefined;
335
+ }
336
+ const decisionPathTags = extractPathTags(process.cwd());
337
+ const created = decisionsModule.saveDecision(hippoRoot, tenantId, {
338
+ decisionText,
339
+ context,
340
+ supersedesDecisionId,
341
+ extraTags: decisionPathTags,
342
+ });
343
+ // Legacy memory-weaken (best-effort, LAST): half-life halved, marked stale +
344
+ // 'superseded' tag. Preserves the exact pre-promotion behavior for the memory
345
+ // mirror; the canonical table supersession already committed above.
346
+ if (oldEntry) {
347
+ // Best-effort: saveDecision already committed the canonical mutation (new
348
+ // decision created + old row superseded). If this legacy memory-weaken
349
+ // throws, do NOT fail the command — a retry would find no active decision
350
+ // for the old memory and create a duplicate active successor. Warn instead
351
+ // (codex review 2026-05-28).
352
+ try {
353
+ oldEntry.half_life_days = Math.max(1, Math.floor(oldEntry.half_life_days / 2));
354
+ oldEntry.confidence = 'stale';
355
+ if (!oldEntry.tags.includes('superseded'))
356
+ oldEntry.tags.push('superseded');
357
+ writeEntry(hippoRoot, oldEntry);
358
+ }
359
+ catch (e) {
360
+ printError(` warning: decision recorded and superseded, but failed to weaken the prior memory ${supersedesMemId}: ${e.message}`);
361
+ }
362
+ }
363
+ console.log(`Decision recorded: #${created.id}`);
364
+ if (created.memoryId)
365
+ console.log(` memory: ${created.memoryId}`);
366
+ if (supersedesMemId) {
367
+ const tail = supersedesDecisionId !== undefined
368
+ ? ` (decision #${supersedesDecisionId} superseded)`
369
+ : ' (no active decision row; memory weakened only)';
370
+ console.log(` supersedes memory: ${supersedesMemId}${tail}`);
371
+ }
372
+ }
373
+ // Strict positive-integer parse for incident id args. parseInt() alone accepts
374
+ // trailing junk ("1abc" -> 1), which would let a mutating subcommand (close/
375
+ // resolve) silently hit the wrong row; require the whole arg to be digits.
376
+ // (codex P2, 2026-05-29.)
377
+ function parsePositiveIncidentId(idRaw) {
378
+ const s = String(idRaw ?? '').trim();
379
+ const id = parseInt(s, 10);
380
+ if (!/^\d+$/.test(s) || id <= 0) {
381
+ printError(`Invalid incident id: "${idRaw}" (expected a positive integer).`);
382
+ process.exit(1);
383
+ }
384
+ return id;
385
+ }
386
+ function incidentList(hippoRoot, tenantId, flags) {
387
+ const statusRaw = flags['status'];
388
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
389
+ const limit = parseListLimit(flags);
390
+ let results;
391
+ if (status === 'all') {
392
+ results = incidentsModule.loadIncidents(hippoRoot, tenantId, { limit });
393
+ }
394
+ else {
395
+ if (!incidentsModule.VALID_INCIDENT_STATES.has(status)) {
396
+ printError(`Invalid --status: "${status}". Must be one of: open | resolved | closed | all.`);
397
+ process.exit(1);
398
+ }
399
+ results = incidentsModule.loadIncidents(hippoRoot, tenantId, {
400
+ status: status,
401
+ limit,
402
+ });
403
+ }
404
+ if (results.length === 0) {
405
+ console.log('No incidents.');
406
+ return;
407
+ }
408
+ console.log(`Found ${results.length} incidents:\n`);
409
+ for (const inc of results) {
410
+ const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
411
+ console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
412
+ console.log(` ${inc.incidentText}`);
413
+ if (inc.context)
414
+ console.log(` context: ${inc.context}`);
415
+ }
416
+ }
417
+ function incidentGet(hippoRoot, tenantId, args) {
418
+ const idRaw = args[1];
419
+ if (!idRaw) {
420
+ printError('Usage: hippo incident get <id>');
421
+ process.exit(1);
422
+ }
423
+ const id = parsePositiveIncidentId(idRaw);
424
+ const incident = incidentsModule.loadIncidentById(hippoRoot, tenantId, id);
425
+ if (!incident) {
426
+ printError(`Incident ${id} not found.`);
427
+ process.exit(1);
428
+ }
429
+ console.log(`Incident #${incident.id}`);
430
+ console.log(` status: ${incident.status}`);
431
+ console.log(` text: ${incident.incidentText}`);
432
+ if (incident.context)
433
+ console.log(` context: ${incident.context}`);
434
+ if (incident.resolutionText)
435
+ console.log(` resolution: ${incident.resolutionText}`);
436
+ if (incident.resolvedAt)
437
+ console.log(` resolved_at: ${incident.resolvedAt}`);
438
+ if (incident.closedAt)
439
+ console.log(` closed_at: ${incident.closedAt}`);
440
+ if (incident.linkedMemoryIds.length > 0) {
441
+ console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
442
+ }
443
+ if (incident.memoryId)
444
+ console.log(` memory: ${incident.memoryId}`);
445
+ console.log(` created: ${incident.createdAt}`);
446
+ }
447
+ function incidentResolve(hippoRoot, tenantId, args, flags) {
448
+ const idRaw = args[1];
449
+ if (!idRaw) {
450
+ printError('Usage: hippo incident resolve <id> --resolution "<text>"');
451
+ process.exit(1);
452
+ }
453
+ const id = parsePositiveIncidentId(idRaw);
454
+ const resolutionRaw = flags['resolution'];
455
+ if (typeof resolutionRaw !== 'string' || !resolutionRaw.trim()) {
456
+ printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
457
+ process.exit(1);
458
+ }
459
+ const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
460
+ console.log(`Incident #${resolved.id} resolved.`);
461
+ }
462
+ function incidentClose(hippoRoot, tenantId, args) {
463
+ const idRaw = args[1];
464
+ if (!idRaw) {
465
+ printError('Usage: hippo incident close <id>');
466
+ process.exit(1);
467
+ }
468
+ const id = parsePositiveIncidentId(idRaw);
469
+ const closed = incidentsModule.closeIncident(hippoRoot, tenantId, id);
470
+ console.log(`Incident #${closed.id} closed.`);
471
+ }
472
+ export function cmdIncident(hippoRoot, args, flags) {
473
+ requireInit(hippoRoot);
474
+ const tenantId = resolveTenantId({});
475
+ const subcommand = args[0] ?? '';
476
+ if (subcommand === 'list')
477
+ return incidentList(hippoRoot, tenantId, flags);
478
+ if (subcommand === 'get')
479
+ return incidentGet(hippoRoot, tenantId, args);
480
+ if (subcommand === 'resolve')
481
+ return incidentResolve(hippoRoot, tenantId, args, flags);
482
+ if (subcommand === 'close')
483
+ return incidentClose(hippoRoot, tenantId, args);
484
+ // Default subcommand: open (create). Accept both the documented
485
+ // `incident open "<text>"` form and the bare `incident "<text>"` form: for the
486
+ // `open` keyword the text is args[1], otherwise args[0] IS the text.
487
+ incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
488
+ }
489
+ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
490
+ if (!incidentText) {
491
+ printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
492
+ printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
493
+ printError(' hippo incident get <id>');
494
+ printError(' hippo incident resolve <id> --resolution "<text>"');
495
+ printError(' hippo incident close <id>');
496
+ process.exit(1);
497
+ }
498
+ const contextRaw = flags['context'];
499
+ const context = typeof contextRaw === 'string' && contextRaw ? contextRaw : undefined;
500
+ // --link is a repeatable flag (collected into an array by parseArgs). A
501
+ // single --link <id> yields a string; normalize both to string[].
502
+ const linkRaw = flags['link'];
503
+ let linkedMemoryIds;
504
+ if (Array.isArray(linkRaw)) {
505
+ linkedMemoryIds = linkRaw;
506
+ }
507
+ else if (typeof linkRaw === 'string') {
508
+ linkedMemoryIds = [linkRaw];
509
+ }
510
+ else if (linkRaw === true) {
511
+ printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
512
+ process.exit(1);
513
+ }
514
+ const incidentPathTags = extractPathTags(process.cwd());
515
+ const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
516
+ incidentText,
517
+ context,
518
+ linkedMemoryIds,
519
+ extraTags: incidentPathTags,
520
+ });
521
+ console.log(`Incident recorded: #${created.id}`);
522
+ if (created.memoryId)
523
+ console.log(` memory: ${created.memoryId}`);
524
+ if (created.linkedMemoryIds.length > 0) {
525
+ console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
526
+ }
527
+ }
528
+ //# sourceMappingURL=decisions.js.map
@@ -0,0 +1,5 @@
1
+ import { type CommandContext } from './shared.js';
2
+ /** Runs `hippo eval`: --bootstrap writes a corpus, --suite runs the built-in feature eval, else it scores a corpus file. */
3
+ export declare function cmdEval(hippoRoot: string, corpusPath: string | null, flags: Record<string, string | boolean | string[]>): Promise<void>;
4
+ export declare function handleEval({ hippoRoot, args, flags }: CommandContext): Promise<void>;
5
+ //# sourceMappingURL=eval.d.ts.map