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,556 @@
1
+ // First-class object verbs for processes, policies and skills.
2
+ import { extractPathTags } from '../path-context.js';
3
+ import * as processesModule from '../processes.js';
4
+ import * as policiesModule from '../policies.js';
5
+ import * as skillsModule from '../skills.js';
6
+ import { resolveTenantId } from '../tenant.js';
7
+ import { printError } from './output.js';
8
+ import { requireInit } from './shared.js';
9
+ // Strict positive-integer id parse for the mutating process subcommands.
10
+ // parseInt alone accepts trailing junk ('1abc' -> 1), which would let
11
+ // `process close 1abc` / `supersede 1abc` silently hit the wrong row; require
12
+ // the whole arg to be digits. (Mirrors parsePositiveIncidentId; codex P2,
13
+ // 2026-05-29.)
14
+ function parsePositiveProcessId(idRaw) {
15
+ const s = String(idRaw ?? '').trim();
16
+ const id = parseInt(s, 10);
17
+ if (!/^\d+$/.test(s) || id <= 0) {
18
+ printError(`Invalid process id: "${idRaw}" (expected a positive integer).`);
19
+ process.exit(1);
20
+ }
21
+ return id;
22
+ }
23
+ // --step is a repeatable flag (collected into an array by parseArgs). A single
24
+ // --step yields a string; normalize both to string[]. A value-less --step errors.
25
+ function collectProcessSteps(stepRaw) {
26
+ if (Array.isArray(stepRaw))
27
+ return stepRaw;
28
+ if (typeof stepRaw === 'string')
29
+ return [stepRaw];
30
+ if (stepRaw === true) {
31
+ printError('--step requires a value, e.g. hippo process new "<name>" --step "do X".');
32
+ process.exit(1);
33
+ }
34
+ return [];
35
+ }
36
+ export function cmdProcess(hippoRoot, args, flags) {
37
+ requireInit(hippoRoot);
38
+ const tenantId = resolveTenantId({});
39
+ const subcommand = args[0] ?? '';
40
+ if (subcommand === 'list') {
41
+ const statusRaw = flags['status'];
42
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
43
+ const limitRaw = flags['limit'];
44
+ const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
45
+ if (!Number.isFinite(limit) || limit <= 0) {
46
+ printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
47
+ process.exit(1);
48
+ }
49
+ let results;
50
+ if (status === 'all') {
51
+ results = processesModule.loadProcesses(hippoRoot, tenantId, { limit });
52
+ }
53
+ else {
54
+ if (!processesModule.VALID_PROCESS_STATES.has(status)) {
55
+ printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
56
+ process.exit(1);
57
+ }
58
+ results = processesModule.loadProcesses(hippoRoot, tenantId, {
59
+ status: status,
60
+ limit,
61
+ });
62
+ }
63
+ if (results.length === 0) {
64
+ console.log('No processes.');
65
+ return;
66
+ }
67
+ console.log(`Found ${results.length} processes:\n`);
68
+ for (const proc of results) {
69
+ console.log(`#${proc.id} [${proc.status}] v${proc.version} steps=${proc.steps.length} memory=${proc.memoryId ?? '-'}`);
70
+ console.log(` ${proc.processName}`);
71
+ if (proc.changeSummary)
72
+ console.log(` change: ${proc.changeSummary}`);
73
+ }
74
+ return;
75
+ }
76
+ if (subcommand === 'get') {
77
+ const idRaw = args[1];
78
+ if (!idRaw) {
79
+ printError('Usage: hippo process get <id>');
80
+ process.exit(1);
81
+ }
82
+ const id = parsePositiveProcessId(idRaw);
83
+ const proc = processesModule.loadProcessById(hippoRoot, tenantId, id);
84
+ if (!proc) {
85
+ printError(`Process ${id} not found.`);
86
+ process.exit(1);
87
+ }
88
+ console.log(`Process #${proc.id}`);
89
+ console.log(` name: ${proc.processName}`);
90
+ console.log(` status: ${proc.status}`);
91
+ console.log(` version: ${proc.version}`);
92
+ if (proc.description)
93
+ console.log(` description: ${proc.description}`);
94
+ if (proc.steps.length > 0) {
95
+ console.log(` steps:`);
96
+ proc.steps.forEach((s, i) => console.log(` ${i + 1}. ${s}`));
97
+ }
98
+ if (proc.changeSummary)
99
+ console.log(` change_summary: ${proc.changeSummary}`);
100
+ if (proc.supersededBy !== null)
101
+ console.log(` superseded_by: #${proc.supersededBy}`);
102
+ if (proc.supersededAt)
103
+ console.log(` superseded_at: ${proc.supersededAt}`);
104
+ if (proc.closedAt)
105
+ console.log(` closed_at: ${proc.closedAt}`);
106
+ if (proc.memoryId)
107
+ console.log(` memory: ${proc.memoryId}`);
108
+ console.log(` created: ${proc.createdAt}`);
109
+ return;
110
+ }
111
+ if (subcommand === 'supersede') {
112
+ const idRaw = args[1];
113
+ if (!idRaw) {
114
+ printError('Usage: hippo process supersede <id> --step "<text>" [--step ...] [--change "<summary>"] [--description "<text>"]');
115
+ process.exit(1);
116
+ }
117
+ const id = parsePositiveProcessId(idRaw);
118
+ const steps = collectProcessSteps(flags['step']);
119
+ if (steps.length === 0) {
120
+ printError('hippo process supersede requires at least one --step "<text>" for the new version.');
121
+ process.exit(1);
122
+ }
123
+ // A supersession is a new version of the SAME process, so the new row reuses
124
+ // the predecessor's name (stable identity across versions). loadProcessById
125
+ // gives an early not-found before the write; saveProcess's in-SAVEPOINT
126
+ // preflight is the authoritative active-state check.
127
+ const existing = processesModule.loadProcessById(hippoRoot, tenantId, id);
128
+ if (!existing) {
129
+ printError(`Process ${id} not found.`);
130
+ process.exit(1);
131
+ }
132
+ const changeRaw = flags['change'];
133
+ const changeSummary = typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined;
134
+ const descRaw = flags['description'];
135
+ const description = typeof descRaw === 'string' && descRaw ? descRaw : undefined;
136
+ const procPathTags = extractPathTags(process.cwd());
137
+ const created = processesModule.saveProcess(hippoRoot, tenantId, {
138
+ processName: existing.processName,
139
+ steps,
140
+ description,
141
+ changeSummary,
142
+ supersedesProcessId: id,
143
+ extraTags: procPathTags,
144
+ });
145
+ console.log(`Process #${created.id} recorded (v${created.version}), superseding #${id}.`);
146
+ if (created.memoryId)
147
+ console.log(` memory: ${created.memoryId}`);
148
+ return;
149
+ }
150
+ if (subcommand === 'close') {
151
+ const idRaw = args[1];
152
+ if (!idRaw) {
153
+ printError('Usage: hippo process close <id>');
154
+ process.exit(1);
155
+ }
156
+ const id = parsePositiveProcessId(idRaw);
157
+ const closed = processesModule.closeProcess(hippoRoot, tenantId, id);
158
+ console.log(`Process #${closed.id} closed.`);
159
+ return;
160
+ }
161
+ // Default subcommand: new (create). Accept both the documented
162
+ // `process new "<name>"` form and the bare `process "<name>"` form: for the
163
+ // `new` keyword the name is args[1], otherwise args[0] IS the name.
164
+ const processName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
165
+ if (!processName) {
166
+ printError('Usage: hippo process new "<name>" --step "<text>" [--step ...] [--description "<text>"]');
167
+ printError(' hippo process list [--status active|superseded|closed|all] [--limit N]');
168
+ printError(' hippo process get <id>');
169
+ printError(' hippo process supersede <id> --step "<text>" [--change "<summary>"]');
170
+ printError(' hippo process close <id>');
171
+ process.exit(1);
172
+ }
173
+ const steps = collectProcessSteps(flags['step']);
174
+ const descRaw = flags['description'];
175
+ const description = typeof descRaw === 'string' && descRaw ? descRaw : undefined;
176
+ const procPathTags = extractPathTags(process.cwd());
177
+ const created = processesModule.saveProcess(hippoRoot, tenantId, {
178
+ processName,
179
+ steps,
180
+ description,
181
+ extraTags: procPathTags,
182
+ });
183
+ console.log(`Process recorded: #${created.id} (v${created.version}, ${created.steps.length} steps)`);
184
+ if (created.memoryId)
185
+ console.log(` memory: ${created.memoryId}`);
186
+ }
187
+ // Strict positive-integer id parse for the mutating policy subcommands (mirrors
188
+ // parsePositiveProcessId; codex P2 class - parseInt alone accepts '1abc' -> 1).
189
+ function parsePositivePolicyId(idRaw) {
190
+ const s = String(idRaw ?? '').trim();
191
+ const id = parseInt(s, 10);
192
+ if (!/^\d+$/.test(s) || id <= 0) {
193
+ printError(`Invalid policy id: "${idRaw}" (expected a positive integer).`);
194
+ process.exit(1);
195
+ }
196
+ return id;
197
+ }
198
+ function printPolicyRow(p) {
199
+ const range = p.validTo ? `${p.validFrom}..${p.validTo}` : `${p.validFrom}..(open)`;
200
+ console.log(`#${p.id} [${p.status}] v${p.version} ${range} memory=${p.memoryId ?? '-'}`);
201
+ console.log(` ${p.policyName}: ${p.policyText}`);
202
+ if (p.changeSummary)
203
+ console.log(` change: ${p.changeSummary}`);
204
+ }
205
+ export function cmdPolicy(hippoRoot, args, flags) {
206
+ requireInit(hippoRoot);
207
+ const tenantId = resolveTenantId({});
208
+ const subcommand = args[0] ?? '';
209
+ if (subcommand === 'list') {
210
+ const statusRaw = flags['status'];
211
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
212
+ const limitRaw = flags['limit'];
213
+ const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
214
+ if (!Number.isFinite(limit) || limit <= 0) {
215
+ printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
216
+ process.exit(1);
217
+ }
218
+ let results;
219
+ if (status === 'all') {
220
+ results = policiesModule.loadPolicies(hippoRoot, tenantId, { limit });
221
+ }
222
+ else {
223
+ if (!policiesModule.VALID_POLICY_STATES.has(status)) {
224
+ printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
225
+ process.exit(1);
226
+ }
227
+ results = policiesModule.loadPolicies(hippoRoot, tenantId, {
228
+ status: status,
229
+ limit,
230
+ });
231
+ }
232
+ if (results.length === 0) {
233
+ console.log('No policies.');
234
+ return;
235
+ }
236
+ console.log(`Found ${results.length} policies:\n`);
237
+ for (const p of results)
238
+ printPolicyRow(p);
239
+ return;
240
+ }
241
+ if (subcommand === 'asof') {
242
+ const dateRaw = args[1];
243
+ if (!dateRaw) {
244
+ printError('Usage: hippo policy asof <iso-date> [--name "<policy>"]');
245
+ process.exit(1);
246
+ }
247
+ const nameRaw = flags['name'];
248
+ const name = typeof nameRaw === 'string' && nameRaw ? nameRaw : undefined;
249
+ let results;
250
+ try {
251
+ results = policiesModule.loadPoliciesAsOf(hippoRoot, tenantId, dateRaw, { name });
252
+ }
253
+ catch (e) {
254
+ printError(e.message);
255
+ process.exit(1);
256
+ }
257
+ if (results.length === 0) {
258
+ console.log(`No active policies in force at ${dateRaw}${name ? ` for "${name}"` : ''}.`);
259
+ return;
260
+ }
261
+ console.log(`Policies in force at ${dateRaw}:\n`);
262
+ for (const p of results)
263
+ printPolicyRow(p);
264
+ return;
265
+ }
266
+ if (subcommand === 'get') {
267
+ const idRaw = args[1];
268
+ if (!idRaw) {
269
+ printError('Usage: hippo policy get <id>');
270
+ process.exit(1);
271
+ }
272
+ const id = parsePositivePolicyId(idRaw);
273
+ const p = policiesModule.loadPolicyById(hippoRoot, tenantId, id);
274
+ if (!p) {
275
+ printError(`Policy ${id} not found.`);
276
+ process.exit(1);
277
+ }
278
+ console.log(`Policy #${p.id}`);
279
+ console.log(` name: ${p.policyName}`);
280
+ console.log(` text: ${p.policyText}`);
281
+ console.log(` status: ${p.status}`);
282
+ console.log(` version: ${p.version}`);
283
+ console.log(` valid_from: ${p.validFrom}`);
284
+ console.log(` valid_to: ${p.validTo ?? '(open-ended)'}`);
285
+ if (p.changeSummary)
286
+ console.log(` change_summary: ${p.changeSummary}`);
287
+ if (p.supersededBy !== null)
288
+ console.log(` superseded_by: #${p.supersededBy}`);
289
+ if (p.supersededAt)
290
+ console.log(` superseded_at: ${p.supersededAt}`);
291
+ if (p.closedAt)
292
+ console.log(` closed_at: ${p.closedAt}`);
293
+ if (p.memoryId)
294
+ console.log(` memory: ${p.memoryId}`);
295
+ console.log(` created: ${p.createdAt}`);
296
+ return;
297
+ }
298
+ if (subcommand === 'supersede') {
299
+ const idRaw = args[1];
300
+ if (!idRaw) {
301
+ printError('Usage: hippo policy supersede <id> --text "<rule>" [--from <iso>] [--to <iso>] [--change "<summary>"]');
302
+ process.exit(1);
303
+ }
304
+ const id = parsePositivePolicyId(idRaw);
305
+ const textRaw = flags['text'];
306
+ if (typeof textRaw !== 'string' || !textRaw.trim()) {
307
+ printError('hippo policy supersede requires --text "<rule>" for the new version.');
308
+ process.exit(1);
309
+ }
310
+ const existing = policiesModule.loadPolicyById(hippoRoot, tenantId, id);
311
+ if (!existing) {
312
+ printError(`Policy ${id} not found.`);
313
+ process.exit(1);
314
+ }
315
+ const fromRaw = flags['from'];
316
+ const toRaw = flags['to'];
317
+ const changeRaw = flags['change'];
318
+ try {
319
+ const created = policiesModule.savePolicy(hippoRoot, tenantId, {
320
+ policyName: existing.policyName,
321
+ policyText: textRaw,
322
+ validFrom: typeof fromRaw === 'string' && fromRaw ? fromRaw : undefined,
323
+ validTo: typeof toRaw === 'string' && toRaw ? toRaw : undefined,
324
+ changeSummary: typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined,
325
+ supersedesPolicyId: id,
326
+ extraTags: extractPathTags(process.cwd()),
327
+ });
328
+ console.log(`Policy #${created.id} recorded (v${created.version}), superseding #${id}.`);
329
+ if (created.memoryId)
330
+ console.log(` memory: ${created.memoryId}`);
331
+ }
332
+ catch (e) {
333
+ printError(e.message);
334
+ process.exit(1);
335
+ }
336
+ return;
337
+ }
338
+ if (subcommand === 'close') {
339
+ const idRaw = args[1];
340
+ if (!idRaw) {
341
+ printError('Usage: hippo policy close <id>');
342
+ process.exit(1);
343
+ }
344
+ const id = parsePositivePolicyId(idRaw);
345
+ const closed = policiesModule.closePolicy(hippoRoot, tenantId, id);
346
+ console.log(`Policy #${closed.id} closed.`);
347
+ return;
348
+ }
349
+ // Default subcommand: new (create). Accept both `policy new "<name>"` and the
350
+ // bare `policy "<name>"` form: for the `new` keyword the name is args[1].
351
+ const policyName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
352
+ const textRaw = flags['text'];
353
+ if (!policyName || typeof textRaw !== 'string' || !textRaw.trim()) {
354
+ printError('Usage: hippo policy new "<name>" --text "<rule>" [--from <iso>] [--to <iso>]');
355
+ printError(' hippo policy list [--status active|superseded|closed|all] [--limit N]');
356
+ printError(' hippo policy get <id>');
357
+ printError(' hippo policy asof <iso-date> [--name "<policy>"]');
358
+ printError(' hippo policy supersede <id> --text "<rule>" [--from] [--to] [--change "<summary>"]');
359
+ printError(' hippo policy close <id>');
360
+ process.exit(1);
361
+ }
362
+ const fromRaw = flags['from'];
363
+ const toRaw = flags['to'];
364
+ try {
365
+ const created = policiesModule.savePolicy(hippoRoot, tenantId, {
366
+ policyName,
367
+ policyText: textRaw,
368
+ validFrom: typeof fromRaw === 'string' && fromRaw ? fromRaw : undefined,
369
+ validTo: typeof toRaw === 'string' && toRaw ? toRaw : undefined,
370
+ extraTags: extractPathTags(process.cwd()),
371
+ });
372
+ const range = created.validTo ? `${created.validFrom}..${created.validTo}` : `${created.validFrom}..(open)`;
373
+ console.log(`Policy recorded: #${created.id} (v${created.version}, effective ${range})`);
374
+ if (created.memoryId)
375
+ console.log(` memory: ${created.memoryId}`);
376
+ }
377
+ catch (e) {
378
+ printError(e.message);
379
+ process.exit(1);
380
+ }
381
+ }
382
+ // Strict positive-integer id parse for the mutating skill subcommands (mirrors
383
+ // parsePositivePolicyId; codex P2 class - parseInt accepts '1abc' -> 1).
384
+ function parsePositiveSkillId(idRaw) {
385
+ const s = String(idRaw ?? '').trim();
386
+ const id = parseInt(s, 10);
387
+ if (!/^\d+$/.test(s) || id <= 0) {
388
+ printError(`Invalid skill id: "${idRaw}" (expected a positive integer).`);
389
+ process.exit(1);
390
+ }
391
+ return id;
392
+ }
393
+ function printSkillRow(s) {
394
+ const trig = s.trigger ? ` when="${s.trigger}"` : '';
395
+ console.log(`#${s.id} [${s.status}] v${s.version}${trig} memory=${s.memoryId ?? '-'}`);
396
+ console.log(` ${s.skillName}`);
397
+ if (s.changeSummary)
398
+ console.log(` change: ${s.changeSummary}`);
399
+ }
400
+ export function cmdSkill(hippoRoot, args, flags) {
401
+ requireInit(hippoRoot);
402
+ const tenantId = resolveTenantId({});
403
+ const subcommand = args[0] ?? '';
404
+ if (subcommand === 'list') {
405
+ const statusRaw = flags['status'];
406
+ const status = typeof statusRaw === 'string' ? statusRaw.trim() : 'all';
407
+ const limitRaw = flags['limit'];
408
+ const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
409
+ if (!Number.isFinite(limit) || limit <= 0) {
410
+ printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
411
+ process.exit(1);
412
+ }
413
+ let results;
414
+ if (status === 'all') {
415
+ results = skillsModule.loadSkills(hippoRoot, tenantId, { limit });
416
+ }
417
+ else {
418
+ if (!skillsModule.VALID_SKILL_STATES.has(status)) {
419
+ printError(`Invalid --status: "${status}". Must be one of: active | superseded | closed | all.`);
420
+ process.exit(1);
421
+ }
422
+ results = skillsModule.loadSkills(hippoRoot, tenantId, {
423
+ status: status,
424
+ limit,
425
+ });
426
+ }
427
+ if (results.length === 0) {
428
+ console.log('No skills.');
429
+ return;
430
+ }
431
+ console.log(`Found ${results.length} skills:\n`);
432
+ for (const s of results)
433
+ printSkillRow(s);
434
+ return;
435
+ }
436
+ if (subcommand === 'export') {
437
+ const md = skillsModule.exportSkills(hippoRoot, tenantId);
438
+ if (!md) {
439
+ console.log('No active skills.');
440
+ return;
441
+ }
442
+ console.log(md);
443
+ return;
444
+ }
445
+ if (subcommand === 'get') {
446
+ const idRaw = args[1];
447
+ if (!idRaw) {
448
+ printError('Usage: hippo skill get <id>');
449
+ process.exit(1);
450
+ }
451
+ const id = parsePositiveSkillId(idRaw);
452
+ const s = skillsModule.loadSkillById(hippoRoot, tenantId, id);
453
+ if (!s) {
454
+ printError(`Skill ${id} not found.`);
455
+ process.exit(1);
456
+ }
457
+ console.log(`Skill #${s.id}`);
458
+ console.log(` name: ${s.skillName}`);
459
+ console.log(` status: ${s.status}`);
460
+ console.log(` version: ${s.version}`);
461
+ if (s.trigger)
462
+ console.log(` when: ${s.trigger}`);
463
+ console.log(` instructions: ${s.instructions}`);
464
+ if (s.changeSummary)
465
+ console.log(` change_summary: ${s.changeSummary}`);
466
+ if (s.supersededBy !== null)
467
+ console.log(` superseded_by: #${s.supersededBy}`);
468
+ if (s.supersededAt)
469
+ console.log(` superseded_at: ${s.supersededAt}`);
470
+ if (s.closedAt)
471
+ console.log(` closed_at: ${s.closedAt}`);
472
+ if (s.memoryId)
473
+ console.log(` memory: ${s.memoryId}`);
474
+ console.log(` created: ${s.createdAt}`);
475
+ return;
476
+ }
477
+ if (subcommand === 'supersede') {
478
+ const idRaw = args[1];
479
+ if (!idRaw) {
480
+ printError('Usage: hippo skill supersede <id> --instructions "<text>" [--trigger "<when>"] [--change "<summary>"]');
481
+ process.exit(1);
482
+ }
483
+ const id = parsePositiveSkillId(idRaw);
484
+ const instrRaw = flags['instructions'];
485
+ if (typeof instrRaw !== 'string' || !instrRaw.trim()) {
486
+ printError('hippo skill supersede requires --instructions "<text>" for the new version.');
487
+ process.exit(1);
488
+ }
489
+ const existing = skillsModule.loadSkillById(hippoRoot, tenantId, id);
490
+ if (!existing) {
491
+ printError(`Skill ${id} not found.`);
492
+ process.exit(1);
493
+ }
494
+ const trigRaw = flags['trigger'];
495
+ const changeRaw = flags['change'];
496
+ try {
497
+ const created = skillsModule.saveSkill(hippoRoot, tenantId, {
498
+ skillName: existing.skillName,
499
+ instructions: instrRaw,
500
+ trigger: typeof trigRaw === 'string' && trigRaw ? trigRaw : undefined,
501
+ changeSummary: typeof changeRaw === 'string' && changeRaw ? changeRaw : undefined,
502
+ supersedesSkillId: id,
503
+ extraTags: extractPathTags(process.cwd()),
504
+ });
505
+ console.log(`Skill #${created.id} recorded (v${created.version}), superseding #${id}.`);
506
+ if (created.memoryId)
507
+ console.log(` memory: ${created.memoryId}`);
508
+ }
509
+ catch (e) {
510
+ printError(e.message);
511
+ process.exit(1);
512
+ }
513
+ return;
514
+ }
515
+ if (subcommand === 'close') {
516
+ const idRaw = args[1];
517
+ if (!idRaw) {
518
+ printError('Usage: hippo skill close <id>');
519
+ process.exit(1);
520
+ }
521
+ const id = parsePositiveSkillId(idRaw);
522
+ const closed = skillsModule.closeSkill(hippoRoot, tenantId, id);
523
+ console.log(`Skill #${closed.id} closed.`);
524
+ return;
525
+ }
526
+ // Default subcommand: new (create). Accept both `skill new "<name>"` and the
527
+ // bare `skill "<name>"` form: for the `new` keyword the name is args[1].
528
+ const skillName = subcommand === 'new' ? (args[1] ?? '') : subcommand;
529
+ const instrRaw = flags['instructions'];
530
+ if (!skillName || typeof instrRaw !== 'string' || !instrRaw.trim()) {
531
+ printError('Usage: hippo skill new "<name>" --instructions "<text>" [--trigger "<when>"]');
532
+ printError(' hippo skill list [--status active|superseded|closed|all] [--limit N]');
533
+ printError(' hippo skill get <id>');
534
+ printError(' hippo skill export (render active skills as an AGENTS.md/CLAUDE.md block)');
535
+ printError(' hippo skill supersede <id> --instructions "<text>" [--trigger] [--change "<summary>"]');
536
+ printError(' hippo skill close <id>');
537
+ process.exit(1);
538
+ }
539
+ const trigRaw = flags['trigger'];
540
+ try {
541
+ const created = skillsModule.saveSkill(hippoRoot, tenantId, {
542
+ skillName,
543
+ instructions: instrRaw,
544
+ trigger: typeof trigRaw === 'string' && trigRaw ? trigRaw : undefined,
545
+ extraTags: extractPathTags(process.cwd()),
546
+ });
547
+ console.log(`Skill recorded: #${created.id} (v${created.version})`);
548
+ if (created.memoryId)
549
+ console.log(` memory: ${created.memoryId}`);
550
+ }
551
+ catch (e) {
552
+ printError(e.message);
553
+ process.exit(1);
554
+ }
555
+ }
556
+ //# sourceMappingURL=playbooks.js.map
@@ -9,7 +9,7 @@ import { printError } from './output.js';
9
9
  /** Old per-worktree project names of the repo at cwd, mapped to the repo's main checkout name; empty outside git. */
10
10
  function worktreeNames() {
11
11
  try {
12
- const out = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true });
12
+ const out = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf8', timeout: 10_000, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true });
13
13
  const paths = out.split(/\r?\n/).filter((l) => l.startsWith('worktree ')).map((l) => path.basename(l.slice('worktree '.length)));
14
14
  return new Map(paths.slice(1).map((name) => [name, paths[0]]));
15
15
  }
@@ -0,0 +1,7 @@
1
+ import { type CliFlags, type CommandContext } from './shared.js';
2
+ /** Test-only: reset the module-level recall-history Map. Call from beforeEach. */
3
+ export declare function __resetSessionRecallHistoryCli(): void;
4
+ /** Runs `hippo recall`: parse, rank, load continuity, fit the printed block to the budget, audit, then write and print. */
5
+ export declare function cmdRecall(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
6
+ export declare function handleRecall({ hippoRoot, args, flags }: CommandContext): Promise<void>;
7
+ //# sourceMappingURL=recall.d.ts.map