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