hippo-memory 1.61.0 → 1.63.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 (377) hide show
  1. package/README.md +37 -53
  2. package/dist/agent-memories/apply.d.ts +3 -1
  3. package/dist/agent-memories/apply.js +23 -1
  4. package/dist/agent-memories/claude-code.d.ts +4 -1
  5. package/dist/agent-memories/claude-code.js +53 -9
  6. package/dist/agent-memories/report.d.ts +1 -0
  7. package/dist/agent-memories/report.js +2 -2
  8. package/dist/agent-memories/sync.d.ts +3 -3
  9. package/dist/agent-memories/sync.js +46 -24
  10. package/dist/agent-memories/types.d.ts +0 -2
  11. package/dist/ambient-store.d.ts +4 -4
  12. package/dist/ambient-store.js +4 -3
  13. package/dist/api/assemble.d.ts +7 -10
  14. package/dist/api/assemble.js +62 -66
  15. package/dist/api/audit.d.ts +2 -2
  16. package/dist/api/audit.js +2 -2
  17. package/dist/api/auth.d.ts +6 -6
  18. package/dist/api/auth.js +5 -7
  19. package/dist/api/context-select.d.ts +50 -0
  20. package/dist/api/context-select.js +342 -0
  21. package/dist/api/context-types.d.ts +12 -17
  22. package/dist/api/context.d.ts +5 -4
  23. package/dist/api/context.js +208 -535
  24. package/dist/api/dormant.js +1 -1
  25. package/dist/api/drill-down.d.ts +4 -4
  26. package/dist/api/drill-down.js +56 -41
  27. package/dist/api/outcome.d.ts +8 -13
  28. package/dist/api/outcome.js +13 -17
  29. package/dist/api/promote.d.ts +5 -8
  30. package/dist/api/promote.js +55 -66
  31. package/dist/api/quarantine.js +3 -2
  32. package/dist/api/recall-types.d.ts +43 -55
  33. package/dist/api/recall.d.ts +3 -3
  34. package/dist/api/recall.js +310 -456
  35. package/dist/api/remember.d.ts +2 -2
  36. package/dist/api/sleep.d.ts +7 -35
  37. package/dist/api/sleep.js +206 -220
  38. package/dist/api/tokens.d.ts +2 -2
  39. package/dist/api/tokens.js +2 -2
  40. package/dist/api/types.d.ts +6 -10
  41. package/dist/api/types.js +2 -4
  42. package/dist/audit-prune.d.ts +4 -6
  43. package/dist/audit-prune.js +3 -5
  44. package/dist/audit.js +11 -33
  45. package/dist/auth.d.ts +8 -9
  46. package/dist/auth.js +5 -7
  47. package/dist/autolearn.d.ts +1 -1
  48. package/dist/autolearn.js +1 -1
  49. package/dist/availability.js +3 -5
  50. package/dist/capture/command.d.ts +5 -4
  51. package/dist/capture/command.js +8 -22
  52. package/dist/capture/compact.d.ts +2 -2
  53. package/dist/capture/compact.js +11 -15
  54. package/dist/capture/extract.js +37 -115
  55. package/dist/capture-error.d.ts +1 -1
  56. package/dist/capture-error.js +1 -1
  57. package/dist/churn-git.d.ts +1 -1
  58. package/dist/churn-git.js +1 -1
  59. package/dist/cli/audit.js +3 -4
  60. package/dist/cli/auth.js +3 -6
  61. package/dist/cli/briefs.js +324 -306
  62. package/dist/cli/context.js +44 -34
  63. package/dist/cli/continuity.js +283 -271
  64. package/dist/cli/curate.d.ts +1 -1
  65. package/dist/cli/curate.js +43 -58
  66. package/dist/cli/dag.js +5 -9
  67. package/dist/cli/decisions.js +334 -345
  68. package/dist/cli/explain.js +68 -61
  69. package/dist/cli/goals.js +1 -1
  70. package/dist/cli/init.js +1 -1
  71. package/dist/cli/maintenance.js +62 -51
  72. package/dist/cli/playbooks.js +391 -379
  73. package/dist/cli/projects.js +11 -6
  74. package/dist/cli/recall.js +30 -44
  75. package/dist/cli/remember.js +118 -87
  76. package/dist/cli/session-hooks.js +106 -115
  77. package/dist/cli/setup.d.ts +1 -1
  78. package/dist/cli/setup.js +267 -250
  79. package/dist/cli/shared.js +3 -3
  80. package/dist/cli/slack.js +1 -1
  81. package/dist/cli/sleep.js +27 -1
  82. package/dist/cli/status.d.ts +4 -4
  83. package/dist/cli/status.js +80 -76
  84. package/dist/cli/transfer.js +88 -107
  85. package/dist/cli/usage.js +9 -6
  86. package/dist/cli.d.ts +1 -1
  87. package/dist/cli.js +4 -9
  88. package/dist/compaction-record.d.ts +2 -2
  89. package/dist/compaction-record.js +89 -68
  90. package/dist/compare.d.ts +11 -16
  91. package/dist/compare.js +11 -16
  92. package/dist/config.d.ts +19 -18
  93. package/dist/config.js +90 -67
  94. package/dist/connectors/github/backfill.d.ts +2 -2
  95. package/dist/connectors/github/backfill.js +8 -15
  96. package/dist/connectors/github/cli-impl.js +3 -8
  97. package/dist/connectors/github/deletion.d.ts +5 -12
  98. package/dist/connectors/github/deletion.js +5 -12
  99. package/dist/connectors/github/dlq.d.ts +6 -9
  100. package/dist/connectors/github/dlq.js +2 -3
  101. package/dist/connectors/github/ingest.d.ts +5 -7
  102. package/dist/connectors/github/ingest.js +8 -12
  103. package/dist/connectors/github/octokit-client.d.ts +3 -5
  104. package/dist/connectors/github/octokit-client.js +5 -6
  105. package/dist/connectors/github/signature.d.ts +9 -39
  106. package/dist/connectors/github/signature.js +9 -39
  107. package/dist/connectors/github/tenant-routing.d.ts +1 -1
  108. package/dist/connectors/github/tenant-routing.js +1 -1
  109. package/dist/connectors/github/transform.js +2 -2
  110. package/dist/connectors/github/types.d.ts +2 -10
  111. package/dist/connectors/github/types.js +1 -3
  112. package/dist/connectors/slack/deletion.d.ts +3 -8
  113. package/dist/connectors/slack/deletion.js +3 -8
  114. package/dist/connectors/slack/dlq.d.ts +1 -1
  115. package/dist/connectors/slack/ingest.d.ts +1 -1
  116. package/dist/connectors/slack/ingest.js +7 -16
  117. package/dist/connectors/slack/signature.d.ts +1 -1
  118. package/dist/connectors/slack/tenant-routing.d.ts +3 -5
  119. package/dist/connectors/slack/tenant-routing.js +3 -5
  120. package/dist/connectors/slack/transform.d.ts +5 -6
  121. package/dist/connectors/slack/transform.js +5 -6
  122. package/dist/connectors/slack/types.d.ts +2 -6
  123. package/dist/connectors/slack/types.js +1 -3
  124. package/dist/connectors/slack/web-client.js +10 -3
  125. package/dist/connectors/slack/workspaces.d.ts +3 -5
  126. package/dist/connectors/slack/workspaces.js +3 -5
  127. package/dist/consolidate/conflicts.js +3 -14
  128. package/dist/consolidate/decay.js +9 -29
  129. package/dist/consolidate/llm-passes.js +4 -5
  130. package/dist/consolidate/merge.js +8 -23
  131. package/dist/consolidate/run.d.ts +1 -8
  132. package/dist/consolidate/run.js +3 -25
  133. package/dist/consolidate/sleep.js +5 -17
  134. package/dist/consolidate/traces.js +9 -21
  135. package/dist/customer-notes.d.ts +5 -7
  136. package/dist/customer-notes.js +82 -76
  137. package/dist/dag.d.ts +10 -21
  138. package/dist/dag.js +189 -203
  139. package/dist/db/continuity.js +2 -2
  140. package/dist/db/migrations/v14.js +1 -1
  141. package/dist/db/migrations/v15.js +1 -2
  142. package/dist/db/migrations/v16.js +3 -4
  143. package/dist/db/migrations/v17.js +2 -3
  144. package/dist/db/migrations/v19.js +1 -1
  145. package/dist/db/migrations/v20.js +1 -1
  146. package/dist/db/migrations/v21.js +2 -6
  147. package/dist/db/migrations/v22.js +2 -4
  148. package/dist/db/migrations/v23.js +1 -1
  149. package/dist/db/migrations/v24.js +4 -6
  150. package/dist/db/migrations/v25.js +2 -3
  151. package/dist/db/migrations/v26.js +3 -3
  152. package/dist/db/migrations/v27.js +2 -10
  153. package/dist/db/migrations/v28.js +5 -8
  154. package/dist/db/migrations/v29.js +3 -4
  155. package/dist/db/migrations/v30.js +2 -2
  156. package/dist/db/migrations/v31.js +1 -1
  157. package/dist/db/migrations/v32.js +1 -1
  158. package/dist/db/migrations/v33.js +3 -3
  159. package/dist/db/migrations/v34.js +1 -1
  160. package/dist/db/migrations/v35.js +3 -4
  161. package/dist/db/migrations/v36.js +3 -4
  162. package/dist/db/migrations/v37.js +5 -5
  163. package/dist/db/migrations/v38.js +7 -8
  164. package/dist/db/migrations/v39.js +1 -1
  165. package/dist/db/migrations/v40.js +4 -16
  166. package/dist/db/migrations/v41.js +3 -4
  167. package/dist/db/migrations/v42.js +3 -4
  168. package/dist/db/migrations/v45.js +1 -1
  169. package/dist/db/migrations/v46.js +1 -1
  170. package/dist/db/migrations/v47.js +1 -1
  171. package/dist/db/migrations/v48.js +1 -1
  172. package/dist/decisions.d.ts +2 -2
  173. package/dist/decisions.js +97 -80
  174. package/dist/dedupe.js +86 -61
  175. package/dist/delivery-recorder.js +154 -135
  176. package/dist/doctor.js +129 -110
  177. package/dist/dormant.js +1 -4
  178. package/dist/embedding-provider.d.ts +4 -8
  179. package/dist/embedding-provider.js +4 -8
  180. package/dist/embeddings.js +55 -47
  181. package/dist/env.d.ts +1 -1
  182. package/dist/env.js +12 -12
  183. package/dist/escape.d.ts +5 -0
  184. package/dist/escape.js +10 -0
  185. package/dist/eval-stats.d.ts +1 -2
  186. package/dist/eval-stats.js +1 -2
  187. package/dist/eval-suite.js +27 -21
  188. package/dist/extract.js +4 -9
  189. package/dist/failure-log.d.ts +3 -3
  190. package/dist/failure-log.js +1 -1
  191. package/dist/forward-claim-detector.d.ts +2 -4
  192. package/dist/forward-claim-detector.js +6 -11
  193. package/dist/goals.d.ts +3 -3
  194. package/dist/goals.js +103 -91
  195. package/dist/graph/read.d.ts +2 -2
  196. package/dist/graph/read.js +5 -6
  197. package/dist/graph/types.d.ts +8 -8
  198. package/dist/graph/write.d.ts +7 -14
  199. package/dist/graph/write.js +16 -23
  200. package/dist/graph-extract.d.ts +7 -8
  201. package/dist/graph-extract.js +62 -72
  202. package/dist/graph-recall.d.ts +2 -2
  203. package/dist/graph-recall.js +55 -49
  204. package/dist/graph-stream.d.ts +5 -6
  205. package/dist/graph-stream.js +66 -57
  206. package/dist/graph-view.d.ts +2 -2
  207. package/dist/graph-view.js +7 -7
  208. package/dist/half-life-migration.d.ts +1 -2
  209. package/dist/half-life-migration.js +2 -3
  210. package/dist/hooks/codex-session.js +1 -1
  211. package/dist/hooks/codex-wrapper.d.ts +1 -1
  212. package/dist/hooks/codex-wrapper.js +3 -2
  213. package/dist/hooks/json-hooks.d.ts +2 -2
  214. package/dist/hooks/json-hooks.js +5 -4
  215. package/dist/hooks/opencode.d.ts +1 -1
  216. package/dist/hooks/opencode.js +5 -4
  217. package/dist/hooks/shared.d.ts +3 -7
  218. package/dist/hooks/shared.js +1 -8
  219. package/dist/http-util.d.ts +2 -3
  220. package/dist/http-util.js +3 -0
  221. package/dist/importers/core.d.ts +2 -9
  222. package/dist/importers/core.js +15 -30
  223. package/dist/importers/sources.js +2 -1
  224. package/dist/importers/vault.js +2 -20
  225. package/dist/incidents.d.ts +1 -1
  226. package/dist/incidents.js +46 -39
  227. package/dist/instruction-detect.d.ts +1 -1
  228. package/dist/instruction-detect.js +1 -1
  229. package/dist/invalidation.d.ts +3 -0
  230. package/dist/invalidation.js +160 -114
  231. package/dist/json.d.ts +5 -0
  232. package/dist/json.js +4 -0
  233. package/dist/judgment.js +1 -2
  234. package/dist/local-embedding.js +1 -1
  235. package/dist/mcp/admin-tools.js +7 -17
  236. package/dist/mcp/format.js +1 -1
  237. package/dist/mcp/framing.js +3 -6
  238. package/dist/mcp/protocol.d.ts +2 -5
  239. package/dist/mcp/protocol.js +1 -3
  240. package/dist/mcp/recall-tools.js +12 -15
  241. package/dist/mcp/request.js +4 -3
  242. package/dist/mcp/session-state.js +2 -3
  243. package/dist/mcp/stdio.js +2 -1
  244. package/dist/mcp/tools.js +9 -6
  245. package/dist/memory-value-weights.d.ts +5 -8
  246. package/dist/memory-value-weights.js +5 -8
  247. package/dist/memory-value.d.ts +13 -13
  248. package/dist/memory-value.js +26 -37
  249. package/dist/memory.d.ts +20 -22
  250. package/dist/memory.js +24 -48
  251. package/dist/multihop.d.ts +1 -1
  252. package/dist/multihop.js +3 -2
  253. package/dist/owner-validation.d.ts +4 -5
  254. package/dist/owner-validation.js +4 -5
  255. package/dist/physics.d.ts +4 -4
  256. package/dist/physics.js +7 -9
  257. package/dist/policies.d.ts +9 -10
  258. package/dist/policies.js +96 -81
  259. package/dist/postinstall.js +3 -6
  260. package/dist/predictions/planning-fallacy.d.ts +9 -14
  261. package/dist/predictions/planning-fallacy.js +10 -16
  262. package/dist/predictions/store.d.ts +15 -23
  263. package/dist/predictions/store.js +36 -33
  264. package/dist/processes.d.ts +2 -7
  265. package/dist/processes.js +88 -72
  266. package/dist/project-briefs.d.ts +2 -3
  267. package/dist/project-briefs.js +141 -118
  268. package/dist/project-identity.d.ts +22 -9
  269. package/dist/project-identity.js +47 -12
  270. package/dist/project-merge.d.ts +28 -5
  271. package/dist/project-merge.js +213 -46
  272. package/dist/project-remote.d.ts +12 -0
  273. package/dist/project-remote.js +138 -0
  274. package/dist/prompt-recall.js +1 -2
  275. package/dist/rate-limit.d.ts +1 -1
  276. package/dist/rate-limit.js +1 -1
  277. package/dist/raw-archive.d.ts +9 -0
  278. package/dist/raw-archive.js +70 -53
  279. package/dist/recall-history.d.ts +19 -20
  280. package/dist/recall-history.js +24 -42
  281. package/dist/recall-pipeline.js +4 -28
  282. package/dist/recall-scope.d.ts +7 -8
  283. package/dist/recall-scope.js +7 -8
  284. package/dist/recall-trace.d.ts +5 -9
  285. package/dist/recall-trace.js +6 -10
  286. package/dist/refine-llm.d.ts +1 -1
  287. package/dist/refine-llm.js +2 -2
  288. package/dist/reject-flow.d.ts +3 -4
  289. package/dist/reject-flow.js +122 -117
  290. package/dist/rejection.d.ts +5 -6
  291. package/dist/rejection.js +7 -15
  292. package/dist/rerankers/clef.d.ts +1 -1
  293. package/dist/rerankers/jev.d.ts +1 -2
  294. package/dist/rerankers/jev.js +4 -5
  295. package/dist/rerankers/llm.d.ts +1 -2
  296. package/dist/rerankers/llm.js +1 -2
  297. package/dist/rerankers/types.d.ts +1 -2
  298. package/dist/rrf.d.ts +2 -2
  299. package/dist/rrf.js +2 -2
  300. package/dist/search/bm25-search.d.ts +1 -1
  301. package/dist/search/bm25-search.js +2 -1
  302. package/dist/search/boosts.js +2 -1
  303. package/dist/search/hybrid.d.ts +1 -1
  304. package/dist/search/hybrid.js +2 -1
  305. package/dist/search/physics-search.d.ts +1 -1
  306. package/dist/search/physics-search.js +2 -1
  307. package/dist/search/types.d.ts +2 -0
  308. package/dist/search/types.js +3 -1
  309. package/dist/secret-detect.d.ts +4 -5
  310. package/dist/secret-detect.js +6 -10
  311. package/dist/server/auth.js +5 -5
  312. package/dist/server/client-ip.js +1 -1
  313. package/dist/server/cursor.js +2 -1
  314. package/dist/server/mcp-http.js +4 -4
  315. package/dist/server/request.d.ts +3 -6
  316. package/dist/server/request.js +6 -7
  317. package/dist/server/routes/admin.js +5 -4
  318. package/dist/server/routes/customer-notes.js +6 -5
  319. package/dist/server/routes/decisions.js +4 -3
  320. package/dist/server/routes/incidents.js +7 -5
  321. package/dist/server/routes/memories.js +7 -7
  322. package/dist/server/routes/policies.js +3 -2
  323. package/dist/server/routes/predictions.js +12 -15
  324. package/dist/server/routes/processes.js +3 -2
  325. package/dist/server/routes/project-briefs.js +8 -7
  326. package/dist/server/routes/recall.js +95 -93
  327. package/dist/server/routes/skills.js +6 -5
  328. package/dist/server/types.d.ts +1 -1
  329. package/dist/server/validation.d.ts +1 -2
  330. package/dist/server/validation.js +7 -14
  331. package/dist/server-detect.js +72 -58
  332. package/dist/server.d.ts +2 -2
  333. package/dist/server.js +131 -117
  334. package/dist/shared.d.ts +26 -17
  335. package/dist/shared.js +102 -104
  336. package/dist/skills.d.ts +3 -3
  337. package/dist/skills.js +88 -72
  338. package/dist/store/audit-event.d.ts +2 -2
  339. package/dist/store/audit-event.js +1 -1
  340. package/dist/store/candidates.d.ts +2 -2
  341. package/dist/store/candidates.js +4 -3
  342. package/dist/store/conflicts.js +30 -22
  343. package/dist/store/delete-and-batch.d.ts +11 -14
  344. package/dist/store/delete-and-batch.js +40 -91
  345. package/dist/store/entry-reads.d.ts +17 -25
  346. package/dist/store/entry-reads.js +59 -40
  347. package/dist/store/entry-row.d.ts +6 -24
  348. package/dist/store/entry-row.js +6 -24
  349. package/dist/store/entry-writes.d.ts +6 -7
  350. package/dist/store/entry-writes.js +13 -11
  351. package/dist/store/handoffs.d.ts +1 -1
  352. package/dist/store/handoffs.js +7 -10
  353. package/dist/store/index-and-stats.d.ts +2 -6
  354. package/dist/store/index-and-stats.js +4 -10
  355. package/dist/store/mirrors.d.ts +6 -19
  356. package/dist/store/mirrors.js +14 -39
  357. package/dist/store/open.js +9 -31
  358. package/dist/store/rows.d.ts +5 -11
  359. package/dist/store/rows.js +6 -11
  360. package/dist/store/search-rows.d.ts +17 -34
  361. package/dist/store/search-rows.js +34 -56
  362. package/dist/store/sessions.d.ts +4 -5
  363. package/dist/store/sessions.js +5 -6
  364. package/dist/store/summaries.d.ts +13 -17
  365. package/dist/store/summaries.js +26 -70
  366. package/dist/support-bundle.js +4 -8
  367. package/dist/tenant.d.ts +1 -5
  368. package/dist/token-ledger.d.ts +1 -1
  369. package/dist/token-ledger.js +3 -5
  370. package/dist/trace.js +1 -3
  371. package/dist/version.d.ts +1 -1
  372. package/dist/version.js +1 -1
  373. package/dist/working-memory.d.ts +1 -1
  374. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  375. package/extensions/openclaw-plugin/package.json +1 -1
  376. package/openclaw.plugin.json +1 -1
  377. package/package.json +1 -1
@@ -63,261 +63,271 @@ export function cmdSnapshot(hippoRoot, args, flags) {
63
63
  printError('Usage: hippo snapshot <save|show|clear>');
64
64
  process.exit(1);
65
65
  }
66
+ function sessionLog(hippoRoot, s, flags) {
67
+ const eventType = String(flags['type'] ?? 'note').trim();
68
+ const content = String(flags['content'] ?? '').trim();
69
+ if (!s.sessionId || !content) {
70
+ printError('Usage: hippo session log --id <session-id> --content <text> [--type <type>] [--task <task>] [--source <source>]');
71
+ process.exit(1);
72
+ }
73
+ const event = appendSessionEvent(hippoRoot, resolveTenantId({}), {
74
+ session_id: s.sessionId,
75
+ task: s.task || null,
76
+ event_type: eventType || 'note',
77
+ content,
78
+ source: String(flags['source'] ?? 'cli'),
79
+ });
80
+ console.log(`Logged session event #${event.id}`);
81
+ console.log(` Session: ${event.session_id}`);
82
+ console.log(` Type: ${event.event_type}`);
83
+ }
84
+ function sessionShow(hippoRoot, s, flags) {
85
+ const events = listSessionEvents(hippoRoot, resolveTenantId({}), {
86
+ session_id: s.sessionId || undefined,
87
+ task: s.task || undefined,
88
+ limit: s.limit,
89
+ });
90
+ if (flags['json']) {
91
+ console.log(JSON.stringify({ events }, null, 2));
92
+ return;
93
+ }
94
+ printSessionEvents(events);
95
+ }
96
+ function sessionLatest(hippoRoot, s, flags) {
97
+ const snapshot = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
98
+ const events = listSessionEvents(hippoRoot, resolveTenantId({}), {
99
+ session_id: s.sessionId || snapshot?.session_id || undefined,
100
+ limit: s.limit,
101
+ });
102
+ if (flags['json']) {
103
+ console.log(JSON.stringify({ snapshot: snapshot ?? null, events }, null, 2));
104
+ return;
105
+ }
106
+ if (snapshot) {
107
+ printActiveTaskSnapshot(snapshot);
108
+ }
109
+ else {
110
+ console.log('No active task snapshot.');
111
+ console.log('');
112
+ }
113
+ printSessionEvents(events);
114
+ }
115
+ function sessionComplete(hippoRoot, s, flags) {
116
+ const { sessionId, task } = s;
117
+ const outcomeRaw = String(flags['outcome'] ?? '').trim();
118
+ const summary = String(flags['summary'] ?? '').trim();
119
+ if (!sessionId) {
120
+ printError('Usage: hippo session complete --session <session-id> --outcome <success|failure|partial> [--summary "..."]');
121
+ process.exit(1);
122
+ }
123
+ if (!isHandoffOutcome(outcomeRaw)) {
124
+ printError(`Invalid outcome: "${outcomeRaw}". Must be one of: success, failure, partial.`);
125
+ process.exit(1);
126
+ }
127
+ const outcome = outcomeRaw;
128
+ const metadata = { ended_at: new Date().toISOString() };
129
+ if (summary)
130
+ metadata.summary = summary;
131
+ const event = appendSessionEvent(hippoRoot, resolveTenantId({}), {
132
+ session_id: sessionId,
133
+ task: task || null,
134
+ event_type: 'session_complete',
135
+ content: outcome,
136
+ source: String(flags['source'] ?? 'cli'),
137
+ metadata,
138
+ });
139
+ console.log(`Completed session ${event.session_id} with outcome=${outcome} (event #${event.id})`);
140
+ const stamped = stampHandoffOutcome(hippoRoot, resolveTenantId({}), sessionId, outcome);
141
+ if (stamped > 0) {
142
+ console.log(`Stamped outcome on handoff for session ${sessionId}`);
143
+ }
144
+ }
66
145
  export function cmdSession(hippoRoot, args, flags) {
67
146
  requireInit(hippoRoot);
68
147
  const subcommand = args[0] ?? 'show';
69
148
  const sessionId = String(flags['id'] ?? flags['session'] ?? '').trim();
70
149
  const task = String(flags['task'] ?? '').trim();
71
150
  const limit = Math.max(1, parseInt(String(flags['limit'] ?? '8'), 10) || 8);
72
- if (subcommand === 'log') {
73
- const eventType = String(flags['type'] ?? 'note').trim();
74
- const content = String(flags['content'] ?? '').trim();
75
- if (!sessionId || !content) {
76
- printError('Usage: hippo session log --id <session-id> --content <text> [--type <type>] [--task <task>] [--source <source>]');
77
- process.exit(1);
78
- }
79
- const event = appendSessionEvent(hippoRoot, resolveTenantId({}), {
80
- session_id: sessionId,
81
- task: task || null,
82
- event_type: eventType || 'note',
83
- content,
84
- source: String(flags['source'] ?? 'cli'),
85
- });
86
- console.log(`Logged session event #${event.id}`);
87
- console.log(` Session: ${event.session_id}`);
88
- console.log(` Type: ${event.event_type}`);
151
+ const s = { sessionId, task, limit };
152
+ if (subcommand === 'log')
153
+ return sessionLog(hippoRoot, s, flags);
154
+ if (subcommand === 'show')
155
+ return sessionShow(hippoRoot, s, flags);
156
+ if (subcommand === 'latest')
157
+ return sessionLatest(hippoRoot, s, flags);
158
+ if (subcommand === 'complete')
159
+ return sessionComplete(hippoRoot, s, flags);
160
+ if (subcommand === 'resume')
161
+ return sessionResume(hippoRoot, sessionId);
162
+ printError('Usage: hippo session <log|show|latest|resume|complete>');
163
+ process.exit(1);
164
+ }
165
+ function sessionResume(hippoRoot, sessionId) {
166
+ const handoff = loadLatestHandoff(hippoRoot, resolveTenantId({}), sessionId || undefined);
167
+ if (!handoff) {
168
+ console.log('No handoff to resume from.');
89
169
  return;
90
170
  }
91
- if (subcommand === 'show') {
92
- const events = listSessionEvents(hippoRoot, resolveTenantId({}), {
93
- session_id: sessionId || undefined,
94
- task: task || undefined,
95
- limit,
96
- });
97
- if (flags['json']) {
98
- console.log(JSON.stringify({ events }, null, 2));
99
- return;
100
- }
101
- printSessionEvents(events);
102
- return;
171
+ const lines = [
172
+ '## Session Handoff (resumed)',
173
+ '',
174
+ `- Session: ${handoff.sessionId}`,
175
+ `- Updated: ${handoff.updatedAt}`,
176
+ ];
177
+ if (handoff.taskId)
178
+ lines.push(`- Task: ${handoff.taskId}`);
179
+ if (handoff.repoRoot)
180
+ lines.push(`- Repo: ${handoff.repoRoot}`);
181
+ if (handoff.outcome)
182
+ lines.push(`- Outcome: ${handoff.outcome}`);
183
+ if (handoff.targetRuntime)
184
+ lines.push(`- Target runtime: ${handoff.targetRuntime}`);
185
+ if (handoff.cardId)
186
+ lines.push(`- Card: ${handoff.cardId}`);
187
+ lines.push('', '### Summary', handoff.summary);
188
+ if (handoff.nextAction) {
189
+ lines.push('', '### Next action', handoff.nextAction);
103
190
  }
104
- if (subcommand === 'latest') {
105
- const snapshot = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
106
- const events = listSessionEvents(hippoRoot, resolveTenantId({}), {
107
- session_id: sessionId || snapshot?.session_id || undefined,
108
- limit,
109
- });
110
- if (flags['json']) {
111
- console.log(JSON.stringify({ snapshot: snapshot ?? null, events }, null, 2));
112
- return;
191
+ if (handoff.artifacts && handoff.artifacts.length > 0) {
192
+ lines.push('', '### Artifacts');
193
+ for (const artifact of handoff.artifacts) {
194
+ lines.push(`- ${artifact}`);
113
195
  }
114
- if (snapshot) {
115
- printActiveTaskSnapshot(snapshot);
116
- }
117
- else {
118
- console.log('No active task snapshot.');
119
- console.log('');
196
+ }
197
+ if (handoff.constraints && handoff.constraints.length > 0) {
198
+ lines.push('', '### Constraints');
199
+ for (const constraint of handoff.constraints) {
200
+ lines.push(`- ${constraint}`);
120
201
  }
121
- printSessionEvents(events);
122
- return;
123
202
  }
124
- if (subcommand === 'complete') {
125
- const outcomeRaw = String(flags['outcome'] ?? '').trim();
126
- const summary = String(flags['summary'] ?? '').trim();
127
- if (!sessionId) {
128
- printError('Usage: hippo session complete --session <session-id> --outcome <success|failure|partial> [--summary "..."]');
203
+ if (handoff.evidence) {
204
+ lines.push('', '### Evidence', formatHandoffEvidenceLine(handoff.evidence));
205
+ }
206
+ lines.push('');
207
+ console.log(lines.join('\n'));
208
+ }
209
+ /** A repeatable flag as a list: absent is empty, one value is a singleton. */
210
+ function flagList(value) {
211
+ return Array.isArray(value) ? value : (typeof value === 'string' ? [value] : []);
212
+ }
213
+ function handoffCreate(hippoRoot, flags) {
214
+ const summary = String(flags['summary'] ?? '').trim();
215
+ if (!summary) {
216
+ printError('Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] [--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] [--tests <pass|fail|unknown>]');
217
+ process.exit(1);
218
+ }
219
+ const outcomeRaw = flags['outcome'];
220
+ if (outcomeRaw !== undefined && !isHandoffOutcome(outcomeRaw)) {
221
+ printError(`Invalid outcome: "${String(outcomeRaw)}". Must be one of: success, failure, partial.`);
222
+ process.exit(1);
223
+ }
224
+ const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || `fallback-${Date.now()}-${process.pid}`;
225
+ const nextAction = String(flags['next'] ?? '').trim() || undefined;
226
+ const taskId = String(flags['task'] ?? '').trim() || undefined;
227
+ const artifacts = flagList(flags['artifact']);
228
+ const constraints = flagList(flags['constraint']);
229
+ for (const name of ['target-runtime', 'card-id']) {
230
+ // parseArgs turns a value-less flag into `true`; refuse rather than store "true".
231
+ if (flags[name] === true) {
232
+ printError(`--${name} needs a value`);
129
233
  process.exit(1);
130
234
  }
131
- if (!isHandoffOutcome(outcomeRaw)) {
132
- printError(`Invalid outcome: "${outcomeRaw}". Must be one of: success, failure, partial.`);
133
- process.exit(1);
235
+ }
236
+ const targetRuntime = String(flags['target-runtime'] ?? '').trim() || undefined;
237
+ const cardId = String(flags['card-id'] ?? '').trim() || undefined;
238
+ const testStatus = String(flags['tests'] ?? '').trim();
239
+ const evidence = collectHandoffEvidence(process.cwd(), testStatus === 'pass' || testStatus === 'fail' ? testStatus : 'unknown');
240
+ const handoff = saveSessionHandoff(hippoRoot, resolveTenantId({}), {
241
+ version: 1,
242
+ sessionId,
243
+ repoRoot: process.cwd(),
244
+ taskId,
245
+ summary,
246
+ nextAction,
247
+ artifacts,
248
+ constraints,
249
+ evidence,
250
+ // SAFETY: isHandoffOutcome above already refused any non-matching value.
251
+ outcome: outcomeRaw,
252
+ targetRuntime,
253
+ cardId,
254
+ });
255
+ printCreatedHandoff(handoff);
256
+ }
257
+ function printCreatedHandoff(handoff) {
258
+ console.log(`Created session handoff for session ${handoff.sessionId}`);
259
+ console.log(` Summary: ${handoff.summary}`);
260
+ if (handoff.nextAction)
261
+ console.log(` Next: ${handoff.nextAction}`);
262
+ if (handoff.artifacts && handoff.artifacts.length > 0) {
263
+ console.log(` Artifacts: ${handoff.artifacts.join(', ')}`);
264
+ }
265
+ if (handoff.constraints && handoff.constraints.length > 0) {
266
+ console.log(` Constraints: ${handoff.constraints.join(', ')}`);
267
+ }
268
+ if (handoff.outcome)
269
+ console.log(` Outcome: ${handoff.outcome}`);
270
+ if (handoff.targetRuntime)
271
+ console.log(` Target runtime: ${handoff.targetRuntime}`);
272
+ if (handoff.cardId)
273
+ console.log(` Card: ${handoff.cardId}`);
274
+ if (handoff.evidence)
275
+ console.log(` Evidence: ${formatHandoffEvidenceLine(handoff.evidence)}`);
276
+ }
277
+ function handoffLatest(hippoRoot, flags) {
278
+ const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || undefined;
279
+ const handoff = loadLatestHandoff(hippoRoot, resolveTenantId({}), sessionId);
280
+ if (!handoff) {
281
+ if (flags['json']) {
282
+ console.log(JSON.stringify({ handoff: null }));
134
283
  }
135
- const outcome = outcomeRaw;
136
- const metadata = { ended_at: new Date().toISOString() };
137
- if (summary)
138
- metadata.summary = summary;
139
- const event = appendSessionEvent(hippoRoot, resolveTenantId({}), {
140
- session_id: sessionId,
141
- task: task || null,
142
- event_type: 'session_complete',
143
- content: outcome,
144
- source: String(flags['source'] ?? 'cli'),
145
- metadata,
146
- });
147
- console.log(`Completed session ${event.session_id} with outcome=${outcome} (event #${event.id})`);
148
- const stamped = stampHandoffOutcome(hippoRoot, resolveTenantId({}), sessionId, outcome);
149
- if (stamped > 0) {
150
- console.log(`Stamped outcome on handoff for session ${sessionId}`);
284
+ else {
285
+ console.log('No session handoff found.');
151
286
  }
152
287
  return;
153
288
  }
154
- if (subcommand === 'resume') {
155
- const handoff = loadLatestHandoff(hippoRoot, resolveTenantId({}), sessionId || undefined);
156
- if (!handoff) {
157
- console.log('No handoff to resume from.');
158
- return;
159
- }
160
- const lines = [
161
- '## Session Handoff (resumed)',
162
- '',
163
- `- Session: ${handoff.sessionId}`,
164
- `- Updated: ${handoff.updatedAt}`,
165
- ];
166
- if (handoff.taskId)
167
- lines.push(`- Task: ${handoff.taskId}`);
168
- if (handoff.repoRoot)
169
- lines.push(`- Repo: ${handoff.repoRoot}`);
170
- if (handoff.outcome)
171
- lines.push(`- Outcome: ${handoff.outcome}`);
172
- if (handoff.targetRuntime)
173
- lines.push(`- Target runtime: ${handoff.targetRuntime}`);
174
- if (handoff.cardId)
175
- lines.push(`- Card: ${handoff.cardId}`);
176
- lines.push('', '### Summary', handoff.summary);
177
- if (handoff.nextAction) {
178
- lines.push('', '### Next action', handoff.nextAction);
179
- }
180
- if (handoff.artifacts && handoff.artifacts.length > 0) {
181
- lines.push('', '### Artifacts');
182
- for (const artifact of handoff.artifacts) {
183
- lines.push(`- ${artifact}`);
184
- }
185
- }
186
- if (handoff.constraints && handoff.constraints.length > 0) {
187
- lines.push('', '### Constraints');
188
- for (const constraint of handoff.constraints) {
189
- lines.push(`- ${constraint}`);
190
- }
191
- }
192
- if (handoff.evidence) {
193
- lines.push('', '### Evidence', formatHandoffEvidenceLine(handoff.evidence));
194
- }
195
- lines.push('');
196
- console.log(lines.join('\n'));
289
+ if (flags['json']) {
290
+ console.log(JSON.stringify({ handoff }, null, 2));
197
291
  return;
198
292
  }
199
- printError('Usage: hippo session <log|show|latest|resume|complete>');
200
- process.exit(1);
293
+ printHandoff(handoff);
201
294
  }
202
- export function cmdHandoff(hippoRoot, args, flags) {
203
- requireInit(hippoRoot);
204
- const subcommand = args[0] ?? 'latest';
205
- if (subcommand === 'create') {
206
- const summary = String(flags['summary'] ?? '').trim();
207
- if (!summary) {
208
- printError('Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] [--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] [--tests <pass|fail|unknown>]');
209
- process.exit(1);
210
- }
211
- const outcomeRaw = flags['outcome'];
212
- if (outcomeRaw !== undefined && !isHandoffOutcome(outcomeRaw)) {
213
- printError(`Invalid outcome: "${String(outcomeRaw)}". Must be one of: success, failure, partial.`);
214
- process.exit(1);
215
- }
216
- const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || `fallback-${Date.now()}-${process.pid}`;
217
- const nextAction = String(flags['next'] ?? '').trim() || undefined;
218
- const taskId = String(flags['task'] ?? '').trim() || undefined;
219
- const artifactFlag = flags['artifact'];
220
- const artifacts = Array.isArray(artifactFlag)
221
- ? artifactFlag
222
- : (typeof artifactFlag === 'string' ? [artifactFlag] : []);
223
- const constraintFlag = flags['constraint'];
224
- const isFlagString = (v) => typeof v === 'string';
225
- const constraints = Array.isArray(constraintFlag)
226
- ? constraintFlag
227
- : (isFlagString(constraintFlag) ? [constraintFlag] : []);
228
- for (const name of ['target-runtime', 'card-id']) {
229
- // parseArgs turns a value-less flag into `true`; refuse rather than store "true".
230
- if (flags[name] === true) {
231
- printError(`--${name} needs a value`);
232
- process.exit(1);
233
- }
234
- }
235
- const targetRuntime = String(flags['target-runtime'] ?? '').trim() || undefined;
236
- const cardId = String(flags['card-id'] ?? '').trim() || undefined;
237
- const testStatus = String(flags['tests'] ?? '').trim();
238
- const evidence = collectHandoffEvidence(process.cwd(), testStatus === 'pass' || testStatus === 'fail' ? testStatus : 'unknown');
239
- const handoff = saveSessionHandoff(hippoRoot, resolveTenantId({}), {
240
- version: 1,
241
- sessionId,
242
- repoRoot: process.cwd(),
243
- taskId,
244
- summary,
245
- nextAction,
246
- artifacts,
247
- constraints,
248
- evidence,
249
- // SAFETY: isHandoffOutcome above already refused any non-matching value.
250
- outcome: outcomeRaw,
251
- targetRuntime,
252
- cardId,
253
- });
254
- console.log(`Created session handoff for session ${handoff.sessionId}`);
255
- console.log(` Summary: ${handoff.summary}`);
256
- if (handoff.nextAction)
257
- console.log(` Next: ${handoff.nextAction}`);
258
- if (handoff.artifacts && handoff.artifacts.length > 0) {
259
- console.log(` Artifacts: ${handoff.artifacts.join(', ')}`);
260
- }
261
- if (handoff.constraints && handoff.constraints.length > 0) {
262
- console.log(` Constraints: ${handoff.constraints.join(', ')}`);
263
- }
264
- if (handoff.outcome)
265
- console.log(` Outcome: ${handoff.outcome}`);
266
- if (handoff.targetRuntime)
267
- console.log(` Target runtime: ${handoff.targetRuntime}`);
268
- if (handoff.cardId)
269
- console.log(` Card: ${handoff.cardId}`);
270
- if (handoff.evidence)
271
- console.log(` Evidence: ${formatHandoffEvidenceLine(handoff.evidence)}`);
272
- return;
295
+ function handoffShow(hippoRoot, args, flags) {
296
+ const idArg = args[1];
297
+ if (!idArg) {
298
+ printError('Usage: hippo handoff show <id> [--json]');
299
+ process.exit(1);
273
300
  }
274
- if (subcommand === 'latest') {
275
- const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || undefined;
276
- const handoff = loadLatestHandoff(hippoRoot, resolveTenantId({}), sessionId);
277
- if (!handoff) {
278
- if (flags['json']) {
279
- console.log(JSON.stringify({ handoff: null }));
280
- }
281
- else {
282
- console.log('No session handoff found.');
283
- }
284
- return;
285
- }
301
+ const handoffId = parseInt(idArg, 10);
302
+ if (!Number.isFinite(handoffId) || handoffId <= 0) {
303
+ printError(`Invalid handoff ID: ${idArg}`);
304
+ process.exit(1);
305
+ }
306
+ const handoff = loadHandoffById(hippoRoot, resolveTenantId({}), handoffId);
307
+ if (!handoff) {
286
308
  if (flags['json']) {
287
- console.log(JSON.stringify({ handoff }, null, 2));
288
- return;
309
+ console.log(JSON.stringify({ handoff: null }));
310
+ }
311
+ else {
312
+ console.log(`No handoff found with ID ${handoffId}.`);
289
313
  }
290
- printHandoff(handoff);
291
314
  return;
292
315
  }
293
- if (subcommand === 'show') {
294
- const idArg = args[1];
295
- if (!idArg) {
296
- printError('Usage: hippo handoff show <id> [--json]');
297
- process.exit(1);
298
- }
299
- const handoffId = parseInt(idArg, 10);
300
- if (!Number.isFinite(handoffId) || handoffId <= 0) {
301
- printError(`Invalid handoff ID: ${idArg}`);
302
- process.exit(1);
303
- }
304
- const handoff = loadHandoffById(hippoRoot, resolveTenantId({}), handoffId);
305
- if (!handoff) {
306
- if (flags['json']) {
307
- console.log(JSON.stringify({ handoff: null }));
308
- }
309
- else {
310
- console.log(`No handoff found with ID ${handoffId}.`);
311
- }
312
- return;
313
- }
314
- if (flags['json']) {
315
- console.log(JSON.stringify({ handoff }, null, 2));
316
- return;
317
- }
318
- printHandoff(handoff);
316
+ if (flags['json']) {
317
+ console.log(JSON.stringify({ handoff }, null, 2));
319
318
  return;
320
319
  }
320
+ printHandoff(handoff);
321
+ }
322
+ export function cmdHandoff(hippoRoot, args, flags) {
323
+ requireInit(hippoRoot);
324
+ const subcommand = args[0] ?? 'latest';
325
+ if (subcommand === 'create')
326
+ return handoffCreate(hippoRoot, flags);
327
+ if (subcommand === 'latest')
328
+ return handoffLatest(hippoRoot, flags);
329
+ if (subcommand === 'show')
330
+ return handoffShow(hippoRoot, args, flags);
321
331
  printError('Usage: hippo handoff <create|latest|show>');
322
332
  process.exit(1);
323
333
  }
@@ -381,50 +391,10 @@ export function cmdCurrent(hippoRoot, args, flags) {
381
391
  export function cmdWm(hippoRoot, args, flags) {
382
392
  requireInit(hippoRoot);
383
393
  const subcommand = args[0] ?? '';
384
- if (subcommand === 'push') {
385
- const scope = String(flags['scope'] ?? 'default').trim();
386
- const content = String(flags['content'] ?? '').trim();
387
- const importance = parseFloat(String(flags['importance'] ?? '0.5'));
388
- const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
389
- const taskId = flags['task'] ? String(flags['task']).trim() : undefined;
390
- if (!content) {
391
- printError('Usage: hippo wm push --scope <scope> --content "..." [--importance 0.8] [--session <id>] [--task <id>]');
392
- process.exit(1);
393
- }
394
- const id = wmPush(hippoRoot, {
395
- scope,
396
- content,
397
- importance: Number.isFinite(importance) ? importance : 0.5,
398
- sessionId,
399
- taskId,
400
- });
401
- console.log(`Pushed working memory #${id} (scope=${scope}, importance=${Number.isFinite(importance) ? importance : 0.5})`);
402
- return;
403
- }
404
- if (subcommand === 'read') {
405
- const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
406
- const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
407
- const limit = parseInt(String(flags['limit'] ?? '20'), 10) || 20;
408
- const items = wmRead(hippoRoot, { scope, sessionId, limit });
409
- if (flags['json']) {
410
- console.log(JSON.stringify({ items }, null, 2));
411
- return;
412
- }
413
- if (items.length === 0) {
414
- console.log('No working memory entries.');
415
- return;
416
- }
417
- console.log(`Working memory (${items.length} entries):\n`);
418
- for (const item of items) {
419
- const sessionLabel = item.sessionId ? ` session=${item.sessionId}` : '';
420
- const taskLabel = item.taskId ? ` task=${item.taskId}` : '';
421
- console.log(` #${item.id} [${item.scope}] importance=${item.importance}${sessionLabel}${taskLabel}`);
422
- console.log(` ${item.content}`);
423
- console.log(` created=${item.createdAt}`);
424
- console.log('');
425
- }
426
- return;
427
- }
394
+ if (subcommand === 'push')
395
+ return wmPushCmd(hippoRoot, flags);
396
+ if (subcommand === 'read')
397
+ return wmReadCmd(hippoRoot, flags);
428
398
  if (subcommand === 'clear') {
429
399
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
430
400
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
@@ -442,4 +412,46 @@ export function cmdWm(hippoRoot, args, flags) {
442
412
  printError('Usage: hippo wm <push|read|clear|flush>');
443
413
  process.exit(1);
444
414
  }
415
+ function wmPushCmd(hippoRoot, flags) {
416
+ const scope = String(flags['scope'] ?? 'default').trim();
417
+ const content = String(flags['content'] ?? '').trim();
418
+ const importance = parseFloat(String(flags['importance'] ?? '0.5'));
419
+ const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
420
+ const taskId = flags['task'] ? String(flags['task']).trim() : undefined;
421
+ if (!content) {
422
+ printError('Usage: hippo wm push --scope <scope> --content "..." [--importance 0.8] [--session <id>] [--task <id>]');
423
+ process.exit(1);
424
+ }
425
+ const id = wmPush(hippoRoot, {
426
+ scope,
427
+ content,
428
+ importance: Number.isFinite(importance) ? importance : 0.5,
429
+ sessionId,
430
+ taskId,
431
+ });
432
+ console.log(`Pushed working memory #${id} (scope=${scope}, importance=${Number.isFinite(importance) ? importance : 0.5})`);
433
+ }
434
+ function wmReadCmd(hippoRoot, flags) {
435
+ const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
436
+ const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
437
+ const limit = parseInt(String(flags['limit'] ?? '20'), 10) || 20;
438
+ const items = wmRead(hippoRoot, { scope, sessionId, limit });
439
+ if (flags['json']) {
440
+ console.log(JSON.stringify({ items }, null, 2));
441
+ return;
442
+ }
443
+ if (items.length === 0) {
444
+ console.log('No working memory entries.');
445
+ return;
446
+ }
447
+ console.log(`Working memory (${items.length} entries):\n`);
448
+ for (const item of items) {
449
+ const sessionLabel = item.sessionId ? ` session=${item.sessionId}` : '';
450
+ const taskLabel = item.taskId ? ` task=${item.taskId}` : '';
451
+ console.log(` #${item.id} [${item.scope}] importance=${item.importance}${sessionLabel}${taskLabel}`);
452
+ console.log(` ${item.content}`);
453
+ console.log(` created=${item.createdAt}`);
454
+ console.log('');
455
+ }
456
+ }
445
457
  //# sourceMappingURL=continuity.js.map
@@ -12,7 +12,7 @@ export declare function cmdUnreject(hippoRoot: string, args: string[], flags: Re
12
12
  * `"dormant": { "enabled": false }` in .hippo/config.json deletes instead).
13
13
  */
14
14
  export declare function cmdDormant(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
15
- /** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (CD5 poisoning defence). */
15
+ /** `hippo quarantine [list] [--all] [--json] [--global]`, `quarantine approve <id>`, `quarantine reject <id>` (poisoning defence). */
16
16
  export declare function cmdQuarantine(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
17
17
  export declare function handleForget({ hippoRoot, args, flags }: CommandContext): Promise<void>;
18
18
  export declare function handleInvalidate({ hippoRoot, args, flags }: CommandContext): void;