hippo-memory 1.71.0 → 1.72.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 (555) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +1 -1
  12. package/dist/api/audit.d.ts +29 -1
  13. package/dist/api/audit.js +44 -5
  14. package/dist/api/auth.d.ts +7 -4
  15. package/dist/api/auth.js +12 -8
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-render.js +4 -3
  24. package/dist/api/context-select.js +9 -11
  25. package/dist/api/context.js +17 -8
  26. package/dist/api/continuity.d.ts +47 -0
  27. package/dist/api/continuity.js +66 -0
  28. package/dist/api/dormant.js +4 -2
  29. package/dist/api/drill-down.js +1 -1
  30. package/dist/api/embeddings.d.ts +17 -0
  31. package/dist/api/embeddings.js +28 -0
  32. package/dist/api/error-reply.d.ts +8 -0
  33. package/dist/api/error-reply.js +21 -0
  34. package/dist/api/forget.d.ts +6 -2
  35. package/dist/api/forget.js +18 -7
  36. package/dist/api/goals.d.ts +1 -1
  37. package/dist/api/goals.js +5 -9
  38. package/dist/api/index.d.ts +4 -2
  39. package/dist/api/index.js +4 -2
  40. package/dist/api/instruction-detect.js +5 -1
  41. package/dist/api/learn.d.ts +4 -0
  42. package/dist/api/learn.js +53 -27
  43. package/dist/api/ledger-db.d.ts +2 -6
  44. package/dist/api/ledger-db.js +4 -36
  45. package/dist/api/memories.d.ts +19 -1
  46. package/dist/api/memories.js +39 -0
  47. package/dist/api/objects.d.ts +1 -1
  48. package/dist/api/outcome.js +1 -1
  49. package/dist/api/pilot-arm.d.ts +1 -11
  50. package/dist/api/pilot-arm.js +5 -45
  51. package/dist/api/predictions.d.ts +3 -1
  52. package/dist/api/predictions.js +6 -0
  53. package/dist/api/projects.d.ts +21 -0
  54. package/dist/api/projects.js +24 -0
  55. package/dist/api/promote.js +1 -1
  56. package/dist/api/prompt-hook.d.ts +15 -2
  57. package/dist/api/prompt-hook.js +44 -4
  58. package/dist/api/recall-cli.d.ts +3 -0
  59. package/dist/api/recall-cli.js +13 -4
  60. package/dist/api/recall-core.js +3 -3
  61. package/dist/api/recall-pipeline.js +6 -7
  62. package/dist/api/recall-request.js +1 -1
  63. package/dist/api/recall.d.ts +0 -3
  64. package/dist/api/recall.js +19 -44
  65. package/dist/api/remember-local.js +1 -1
  66. package/dist/api/remember.d.ts +2 -1
  67. package/dist/api/remember.js +3 -2
  68. package/dist/api/session-end.d.ts +22 -0
  69. package/dist/api/session-end.js +101 -0
  70. package/dist/api/sleep-run.d.ts +1 -1
  71. package/dist/api/sleep-run.js +13 -9
  72. package/dist/api/status.d.ts +24 -0
  73. package/dist/api/status.js +40 -0
  74. package/dist/api/store-init.d.ts +4 -0
  75. package/dist/api/store-init.js +9 -0
  76. package/dist/api/tokens.js +1 -1
  77. package/dist/api/types.d.ts +2 -0
  78. package/dist/api/types.js +6 -1
  79. package/dist/capture/caller-session.d.ts +0 -3
  80. package/dist/capture/caller-session.js +1 -12
  81. package/dist/capture/capture-error.d.ts +2 -2
  82. package/dist/capture/capture-error.js +23 -18
  83. package/dist/capture/codex-patch.js +3 -1
  84. package/dist/capture/command.js +36 -95
  85. package/dist/capture/compact.js +10 -5
  86. package/dist/capture/compaction-items-caller.js +11 -20
  87. package/dist/capture/compaction-record.d.ts +7 -93
  88. package/dist/capture/compaction-record.js +29 -426
  89. package/dist/capture/compaction-spool.d.ts +4 -2
  90. package/dist/capture/compaction-spool.js +20 -6
  91. package/dist/capture/copilot-transcript.d.ts +2 -1
  92. package/dist/capture/copilot-transcript.js +2 -1
  93. package/dist/capture/extract.d.ts +5 -2
  94. package/dist/capture/extract.js +4 -3
  95. package/dist/capture/failure-caller.d.ts +1 -1
  96. package/dist/capture/failure-caller.js +21 -16
  97. package/dist/capture/failure-reading.d.ts +2 -1
  98. package/dist/capture/failure-reading.js +7 -9
  99. package/dist/capture/pre-compact-caller.js +5 -4
  100. package/dist/capture/session-digest.js +4 -3
  101. package/dist/capture/session-end-caller.js +2 -1
  102. package/dist/capture/session-worker.js +3 -4
  103. package/dist/capture/transcript.d.ts +2 -1
  104. package/dist/capture/transcript.js +6 -3
  105. package/dist/capture/working-state.d.ts +4 -2
  106. package/dist/capture/working-state.js +4 -2
  107. package/dist/cli/audit-prune.d.ts +0 -25
  108. package/dist/cli/audit-prune.js +1 -27
  109. package/dist/cli/audit.js +13 -13
  110. package/dist/cli/auth.d.ts +1 -1
  111. package/dist/cli/auth.js +12 -13
  112. package/dist/cli/briefs.d.ts +1 -4
  113. package/dist/cli/briefs.js +37 -292
  114. package/dist/cli/card.js +41 -33
  115. package/dist/cli/client.d.ts +5 -0
  116. package/dist/cli/client.js +24 -8
  117. package/dist/cli/compact-resume-payload.js +1 -1
  118. package/dist/cli/context.d.ts +1 -1
  119. package/dist/cli/context.js +12 -12
  120. package/dist/cli/continuity.d.ts +1 -1
  121. package/dist/cli/continuity.js +36 -39
  122. package/dist/cli/curate.d.ts +1 -1
  123. package/dist/cli/curate.js +23 -27
  124. package/dist/cli/dag.d.ts +1 -1
  125. package/dist/cli/dag.js +23 -8
  126. package/dist/cli/decisions.d.ts +0 -2
  127. package/dist/cli/decisions.js +4 -281
  128. package/dist/cli/eval.d.ts +1 -1
  129. package/dist/cli/eval.js +12 -13
  130. package/dist/cli/explain.d.ts +1 -1
  131. package/dist/cli/explain.js +21 -25
  132. package/dist/cli/flag-values.js +16 -6
  133. package/dist/cli/flags.d.ts +0 -289
  134. package/dist/cli/flags.js +3 -138
  135. package/dist/cli/graph.d.ts +3 -0
  136. package/dist/cli/graph.js +83 -0
  137. package/dist/cli/hook-runtime.d.ts +3 -5
  138. package/dist/cli/hook-runtime.js +7 -34
  139. package/dist/cli/incidents.d.ts +3 -0
  140. package/dist/cli/incidents.js +112 -0
  141. package/dist/cli/init.d.ts +1 -1
  142. package/dist/cli/init.js +28 -19
  143. package/dist/cli/install-steps.d.ts +2 -1
  144. package/dist/cli/install-steps.js +11 -3
  145. package/dist/cli/last-sleep.js +1 -1
  146. package/dist/cli/lenient-id.d.ts +2 -0
  147. package/dist/cli/lenient-id.js +13 -0
  148. package/dist/cli/maintenance.d.ts +3 -3
  149. package/dist/cli/maintenance.js +29 -30
  150. package/dist/cli/notes.d.ts +2 -0
  151. package/dist/cli/notes.js +41 -0
  152. package/dist/cli/open-browser.d.ts +14 -0
  153. package/dist/cli/open-browser.js +26 -0
  154. package/dist/cli/playbooks.d.ts +3 -4
  155. package/dist/cli/playbooks.js +126 -290
  156. package/dist/cli/predictions.d.ts +3 -0
  157. package/dist/cli/predictions.js +175 -0
  158. package/dist/cli/print.js +2 -1
  159. package/dist/cli/projects.js +30 -22
  160. package/dist/cli/quality-repair-once.d.ts +1 -1
  161. package/dist/cli/quality-repair-once.js +6 -5
  162. package/dist/cli/recall.js +13 -7
  163. package/dist/cli/refine-llm.js +17 -17
  164. package/dist/cli/remember.js +12 -12
  165. package/dist/cli/scheduler.js +2 -1
  166. package/dist/cli/serve.js +3 -3
  167. package/dist/cli/session-hooks.d.ts +1 -1
  168. package/dist/cli/session-hooks.js +45 -115
  169. package/dist/cli/setup.d.ts +1 -1
  170. package/dist/cli/setup.js +17 -10
  171. package/dist/cli/shared.d.ts +2 -6
  172. package/dist/cli/shared.js +9 -29
  173. package/dist/cli/sleep-render.js +6 -3
  174. package/dist/cli/sleep.js +6 -37
  175. package/dist/cli/status.d.ts +3 -3
  176. package/dist/cli/status.js +32 -35
  177. package/dist/cli/transfer.d.ts +1 -1
  178. package/dist/cli/transfer.js +33 -31
  179. package/dist/cli/usage.d.ts +0 -79
  180. package/dist/cli/usage.js +1 -695
  181. package/dist/cli/verb-row.d.ts +32 -0
  182. package/dist/cli/verb-row.js +6 -0
  183. package/dist/cli/verbs/health.d.ts +27 -0
  184. package/dist/cli/verbs/health.js +232 -0
  185. package/dist/cli/verbs/memory.d.ts +16 -0
  186. package/dist/cli/verbs/memory.js +244 -0
  187. package/dist/cli/verbs/objects.d.ts +20 -0
  188. package/dist/cli/verbs/objects.js +254 -0
  189. package/dist/cli/verbs/sessions.d.ts +31 -0
  190. package/dist/cli/verbs/sessions.js +312 -0
  191. package/dist/cli/verbs.d.ts +81 -0
  192. package/dist/cli/verbs.js +7 -0
  193. package/dist/cli/versioned-verbs.d.ts +51 -0
  194. package/dist/cli/versioned-verbs.js +79 -0
  195. package/dist/cli.d.ts +1 -272
  196. package/dist/cli.js +23 -313
  197. package/dist/connectors/dlq.d.ts +39 -3
  198. package/dist/connectors/dlq.js +37 -3
  199. package/dist/connectors/github/backfill.js +12 -3
  200. package/dist/connectors/github/dlq.js +31 -73
  201. package/dist/connectors/github/ingest.d.ts +2 -6
  202. package/dist/connectors/github/ingest.js +3 -28
  203. package/dist/connectors/github/webhook.d.ts +2 -1
  204. package/dist/connectors/github/webhook.js +33 -2
  205. package/dist/connectors/ingest.d.ts +10 -0
  206. package/dist/connectors/ingest.js +28 -0
  207. package/dist/connectors/slack/dlq.js +49 -71
  208. package/dist/connectors/slack/ingest.d.ts +2 -6
  209. package/dist/connectors/slack/ingest.js +2 -27
  210. package/dist/connectors/slack/webhook.d.ts +2 -1
  211. package/dist/connectors/slack/webhook.js +2 -1
  212. package/dist/consolidate/conflicts.js +1 -1
  213. package/dist/consolidate/dag.js +15 -9
  214. package/dist/consolidate/dedupe.d.ts +7 -0
  215. package/dist/consolidate/dedupe.js +5 -3
  216. package/dist/consolidate/llm-passes.js +45 -19
  217. package/dist/consolidate/memory-value.js +2 -1
  218. package/dist/consolidate/merge.js +2 -2
  219. package/dist/consolidate/physics-pass.d.ts +6 -1
  220. package/dist/consolidate/physics-pass.js +26 -6
  221. package/dist/consolidate/replay.js +11 -4
  222. package/dist/consolidate/sleep.js +8 -5
  223. package/dist/consolidate/traces.js +3 -3
  224. package/dist/core/ablation.d.ts +10 -0
  225. package/dist/core/ablation.js +12 -0
  226. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  227. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  228. package/dist/core/ambient.d.ts +4 -0
  229. package/dist/core/ambient.js +39 -18
  230. package/dist/core/api-errors.d.ts +16 -0
  231. package/dist/core/api-errors.js +20 -0
  232. package/dist/core/card.js +3 -1
  233. package/dist/core/compaction-timing.d.ts +7 -0
  234. package/dist/core/compaction-timing.js +9 -0
  235. package/dist/core/config.d.ts +1 -1
  236. package/dist/core/config.js +7 -2
  237. package/dist/core/cosine.d.ts +3 -0
  238. package/dist/core/cosine.js +19 -0
  239. package/dist/{store → core}/markdown.d.ts +1 -1
  240. package/dist/{store → core}/markdown.js +2 -2
  241. package/dist/core/memory-audit.d.ts +17 -0
  242. package/dist/core/memory-audit.js +54 -0
  243. package/dist/core/memory.d.ts +10 -4
  244. package/dist/core/memory.js +25 -18
  245. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  246. package/dist/{consolidate → core}/merged-row.js +1 -1
  247. package/dist/core/physics.js +6 -16
  248. package/dist/core/prediction.d.ts +3 -0
  249. package/dist/core/prediction.js +6 -0
  250. package/dist/core/project-identity.d.ts +3 -0
  251. package/dist/core/project-identity.js +10 -1
  252. package/dist/{store → core}/recall-scope.d.ts +1 -10
  253. package/dist/{store → core}/recall-scope.js +2 -19
  254. package/dist/db/busy.d.ts +2 -7
  255. package/dist/db/busy.js +21 -26
  256. package/dist/db/connect.d.ts +0 -1
  257. package/dist/db/connect.js +5 -6
  258. package/dist/db/index.d.ts +3 -3
  259. package/dist/db/index.js +3 -3
  260. package/dist/db/migrations/index.d.ts +1 -1
  261. package/dist/db/migrations/index.js +3 -1
  262. package/dist/db/migrations/v55.d.ts +3 -0
  263. package/dist/db/migrations/v55.js +17 -0
  264. package/dist/db/open.d.ts +0 -2
  265. package/dist/db/open.js +6 -10
  266. package/dist/db/physics-state.js +3 -3
  267. package/dist/db/tables.d.ts +2 -0
  268. package/dist/db/tables.js +6 -2
  269. package/dist/db/vector-store.js +17 -4
  270. package/dist/db/wal-checkpointer.js +2 -1
  271. package/dist/doctor.js +11 -8
  272. package/dist/embeddings/local.d.ts +62 -0
  273. package/dist/embeddings/local.js +146 -0
  274. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  275. package/dist/{store/embeddings → embeddings}/provider.js +18 -15
  276. package/dist/embeddings/transformers.d.ts +26 -0
  277. package/dist/embeddings/transformers.js +89 -0
  278. package/dist/entry/session-text.d.ts +1 -1
  279. package/dist/entry/session-text.js +1 -1
  280. package/dist/eval/eval-suite.js +17 -11
  281. package/dist/eval/eval.js +1 -1
  282. package/dist/eval/judgment.js +11 -4
  283. package/dist/graph/extract.js +3 -3
  284. package/dist/graph/recall.js +1 -1
  285. package/dist/graph/view.js +13 -5
  286. package/dist/graph/write.d.ts +1 -1
  287. package/dist/graph/write.js +9 -9
  288. package/dist/hooks/codex-session.js +3 -2
  289. package/dist/hooks/codex-wrapper.js +2 -1
  290. package/dist/hooks/json-hooks.js +4 -2
  291. package/dist/hooks/opencode.js +8 -5
  292. package/dist/hooks/shared.d.ts +0 -6
  293. package/dist/hooks/shared.js +4 -15
  294. package/dist/importers/core.js +1 -1
  295. package/dist/importers/sources.js +5 -4
  296. package/dist/importers/vault.js +7 -5
  297. package/dist/index.d.ts +3 -2
  298. package/dist/index.js +3 -2
  299. package/dist/learn/autolearn.d.ts +10 -2
  300. package/dist/learn/autolearn.js +32 -12
  301. package/dist/learn/churn-git.js +13 -4
  302. package/dist/learn/extract.d.ts +3 -2
  303. package/dist/learn/extract.js +6 -4
  304. package/dist/learn/forward-claim-detector.js +4 -2
  305. package/dist/learn/invalidation.js +10 -6
  306. package/dist/mcp/admin-tools.d.ts +2 -2
  307. package/dist/mcp/admin-tools.js +27 -48
  308. package/dist/mcp/format.js +3 -2
  309. package/dist/mcp/framing.d.ts +1 -0
  310. package/dist/mcp/framing.js +1 -1
  311. package/dist/mcp/memory-tools.js +3 -1
  312. package/dist/mcp/protocol.d.ts +11 -7
  313. package/dist/mcp/protocol.js +25 -12
  314. package/dist/mcp/recall-tools.js +12 -9
  315. package/dist/mcp/request.js +2 -1
  316. package/dist/mcp/stdio.js +24 -8
  317. package/dist/mcp/tool-args.js +2 -1
  318. package/dist/mcp/tools.js +44 -21
  319. package/dist/objects/customer-notes.d.ts +2 -2
  320. package/dist/objects/decisions.d.ts +2 -2
  321. package/dist/objects/descriptor.d.ts +1 -1
  322. package/dist/objects/incidents.d.ts +2 -2
  323. package/dist/objects/lifecycle.d.ts +1 -1
  324. package/dist/objects/lifecycle.js +2 -1
  325. package/dist/objects/policies.d.ts +2 -2
  326. package/dist/objects/policies.js +2 -1
  327. package/dist/objects/processes.d.ts +2 -2
  328. package/dist/objects/project-briefs.d.ts +2 -2
  329. package/dist/objects/project-briefs.js +2 -3
  330. package/dist/objects/skills.d.ts +2 -2
  331. package/dist/postinstall.js +1 -1
  332. package/dist/rerankers/clef.js +3 -6
  333. package/dist/rerankers/cross-encoder.d.ts +31 -2
  334. package/dist/rerankers/cross-encoder.js +63 -97
  335. package/dist/rerankers/index.js +5 -4
  336. package/dist/rerankers/jev.js +2 -4
  337. package/dist/rerankers/outage-warning.d.ts +3 -1
  338. package/dist/rerankers/outage-warning.js +5 -3
  339. package/dist/search/bm25-search.js +1 -1
  340. package/dist/search/boosts.js +1 -1
  341. package/dist/search/embed-memories.d.ts +9 -0
  342. package/dist/search/embed-memories.js +377 -0
  343. package/dist/search/goal-boost.d.ts +1 -1
  344. package/dist/search/goal-boost.js +6 -3
  345. package/dist/search/hybrid.d.ts +9 -2
  346. package/dist/search/hybrid.js +9 -4
  347. package/dist/search/physics-search.d.ts +6 -3
  348. package/dist/search/physics-search.js +22 -15
  349. package/dist/search/rerank.js +1 -1
  350. package/dist/search/vector.d.ts +8 -6
  351. package/dist/search/vector.js +10 -13
  352. package/dist/server/auth.d.ts +2 -0
  353. package/dist/server/auth.js +17 -7
  354. package/dist/server/boot.js +7 -66
  355. package/dist/server/client-ip.d.ts +0 -2
  356. package/dist/server/client-ip.js +3 -2
  357. package/dist/server/deadline.d.ts +0 -2
  358. package/dist/server/deadline.js +1 -7
  359. package/dist/server/defaults.d.ts +1 -0
  360. package/dist/server/defaults.js +1 -0
  361. package/dist/server/mcp-http.js +16 -11
  362. package/dist/server/request.js +7 -2
  363. package/dist/server/route-checks.d.ts +7 -0
  364. package/dist/server/route-checks.js +42 -0
  365. package/dist/server/route-table.d.ts +9 -8
  366. package/dist/server/route-table.js +127 -132
  367. package/dist/server/routes/admin.d.ts +8 -8
  368. package/dist/server/routes/admin.js +13 -21
  369. package/dist/server/routes/customer-notes.d.ts +6 -6
  370. package/dist/server/routes/customer-notes.js +1 -2
  371. package/dist/server/routes/decisions.d.ts +6 -6
  372. package/dist/server/routes/decisions.js +2 -4
  373. package/dist/server/routes/incidents.d.ts +6 -6
  374. package/dist/server/routes/incidents.js +2 -5
  375. package/dist/server/routes/memories.d.ts +9 -9
  376. package/dist/server/routes/memories.js +15 -38
  377. package/dist/server/routes/object-routes.d.ts +6 -6
  378. package/dist/server/routes/object-routes.js +4 -7
  379. package/dist/server/routes/policies.d.ts +7 -7
  380. package/dist/server/routes/policies.js +2 -4
  381. package/dist/server/routes/predictions.d.ts +6 -6
  382. package/dist/server/routes/predictions.js +9 -13
  383. package/dist/server/routes/processes.d.ts +6 -6
  384. package/dist/server/routes/processes.js +1 -2
  385. package/dist/server/routes/project-briefs.d.ts +7 -7
  386. package/dist/server/routes/project-briefs.js +2 -4
  387. package/dist/server/routes/recall.d.ts +5 -5
  388. package/dist/server/routes/recall.js +6 -10
  389. package/dist/server/routes/skills.d.ts +7 -7
  390. package/dist/server/routes/skills.js +2 -4
  391. package/dist/server/server-detect.d.ts +7 -1
  392. package/dist/server/server-detect.js +36 -11
  393. package/dist/server/sleep-child.js +26 -7
  394. package/dist/server/sleep-offload.d.ts +11 -5
  395. package/dist/server/sleep-offload.js +17 -11
  396. package/dist/server/types.d.ts +22 -10
  397. package/dist/server/validation.d.ts +1 -2
  398. package/dist/server/validation.js +6 -11
  399. package/dist/server.d.ts +5 -4
  400. package/dist/server.js +5 -4
  401. package/dist/sharing/global-store.js +2 -2
  402. package/dist/sharing/global-sync.js +38 -45
  403. package/dist/sharing/project-merge.d.ts +7 -14
  404. package/dist/sharing/project-merge.js +57 -121
  405. package/dist/sharing/search-both.js +1 -1
  406. package/dist/sharing/share.d.ts +2 -0
  407. package/dist/sharing/share.js +37 -34
  408. package/dist/store/ambient.js +5 -6
  409. package/dist/store/audit-event.d.ts +1 -1
  410. package/dist/store/audit.d.ts +0 -16
  411. package/dist/store/audit.js +4 -55
  412. package/dist/store/auth.d.ts +4 -2
  413. package/dist/store/auth.js +7 -3
  414. package/dist/store/candidates.d.ts +3 -2
  415. package/dist/store/candidates.js +42 -23
  416. package/dist/store/capture-write.d.ts +17 -0
  417. package/dist/store/capture-write.js +35 -0
  418. package/dist/store/cards.js +1 -1
  419. package/dist/store/compaction-caller.d.ts +18 -0
  420. package/dist/store/compaction-caller.js +29 -0
  421. package/dist/store/compactions-record.d.ts +115 -0
  422. package/dist/store/compactions-record.js +417 -0
  423. package/dist/store/compactions.js +6 -4
  424. package/dist/store/conflicts.js +7 -4
  425. package/dist/store/connectors/dlq.d.ts +10 -0
  426. package/dist/store/connectors/dlq.js +32 -0
  427. package/dist/store/connectors/github.d.ts +7 -9
  428. package/dist/store/connectors/github.js +30 -53
  429. package/dist/store/connectors/slack.d.ts +2 -11
  430. package/dist/store/connectors/slack.js +18 -47
  431. package/dist/store/dashboard-reads.js +7 -6
  432. package/dist/store/delete-and-batch.d.ts +6 -0
  433. package/dist/store/delete-and-batch.js +36 -3
  434. package/dist/store/delivery-recorder.d.ts +10 -3
  435. package/dist/store/delivery-recorder.js +12 -5
  436. package/dist/store/descendant-page.js +6 -3
  437. package/dist/store/dormant.d.ts +1 -1
  438. package/dist/store/dormant.js +3 -1
  439. package/dist/store/embeddings/index.d.ts +2 -12
  440. package/dist/store/embeddings/index.js +5 -374
  441. package/dist/store/entry-reads.d.ts +13 -4
  442. package/dist/store/entry-reads.js +47 -11
  443. package/dist/store/entry-writes.d.ts +5 -5
  444. package/dist/store/entry-writes.js +32 -12
  445. package/dist/store/failure-log-at.d.ts +8 -0
  446. package/dist/store/failure-log-at.js +16 -0
  447. package/dist/store/failure-log.d.ts +2 -2
  448. package/dist/store/failure-log.js +5 -3
  449. package/dist/{trust → store}/gated-write.d.ts +3 -1
  450. package/dist/{trust → store}/gated-write.js +7 -5
  451. package/dist/store/goals.js +20 -18
  452. package/dist/store/graph-reads.js +4 -2
  453. package/dist/store/graph-writes.d.ts +6 -6
  454. package/dist/store/graph-writes.js +48 -71
  455. package/dist/store/handoffs.d.ts +1 -1
  456. package/dist/store/handoffs.js +6 -6
  457. package/dist/store/index-and-stats.js +2 -2
  458. package/dist/store/key-writes.js +1 -1
  459. package/dist/store/ledger-turn.d.ts +9 -0
  460. package/dist/store/ledger-turn.js +38 -0
  461. package/dist/store/mirrors.js +10 -6
  462. package/dist/store/open.d.ts +0 -4
  463. package/dist/store/open.js +40 -53
  464. package/dist/store/pilot-arm.d.ts +12 -0
  465. package/dist/store/pilot-arm.js +42 -0
  466. package/dist/store/port.d.ts +9 -3
  467. package/dist/store/port.js +8 -0
  468. package/dist/store/predictions.d.ts +1 -2
  469. package/dist/store/predictions.js +3 -6
  470. package/dist/store/project-tags.d.ts +62 -0
  471. package/dist/store/project-tags.js +67 -0
  472. package/dist/store/quarantine.js +2 -1
  473. package/dist/store/recall-trace.d.ts +2 -0
  474. package/dist/store/recall-trace.js +18 -2
  475. package/dist/store/rejected-values.js +2 -1
  476. package/dist/store/rejection-probe.d.ts +4 -0
  477. package/dist/store/rejection-probe.js +19 -0
  478. package/dist/store/rejection.d.ts +0 -17
  479. package/dist/store/rejection.js +1 -21
  480. package/dist/store/rule-sql.d.ts +9 -0
  481. package/dist/store/rule-sql.js +21 -2
  482. package/dist/store/search-rows.js +9 -4
  483. package/dist/store/sessions.js +4 -2
  484. package/dist/store/set-aside.d.ts +14 -0
  485. package/dist/store/set-aside.js +23 -0
  486. package/dist/store/sqlite/busy.d.ts +3 -0
  487. package/dist/store/sqlite/busy.js +8 -0
  488. package/dist/store/sqlite/connector-events-group.js +4 -7
  489. package/dist/store/sqlite/connector-writes-group.js +3 -3
  490. package/dist/store/sqlite/entry-writes-group.js +2 -2
  491. package/dist/store/sqlite/error-codec.js +4 -3
  492. package/dist/store/sqlite/executor.js +10 -4
  493. package/dist/store/sqlite/graph-reads-group.js +1 -1
  494. package/dist/store/sqlite/held-connection.d.ts +9 -0
  495. package/dist/store/sqlite/held-connection.js +41 -0
  496. package/dist/store/sqlite/object-rows.d.ts +1 -1
  497. package/dist/store/sqlite/objects-group.d.ts +1 -1
  498. package/dist/store/sqlite/objects-group.js +1 -1
  499. package/dist/store/sqlite/store.js +14 -12
  500. package/dist/store/summaries.d.ts +3 -3
  501. package/dist/store/summaries.js +5 -4
  502. package/dist/store/token-ledger.d.ts +0 -7
  503. package/dist/store/token-ledger.js +0 -35
  504. package/dist/store/vector-index.js +3 -2
  505. package/dist/support-bundle.js +2 -3
  506. package/dist/trust/reject-flow.js +2 -2
  507. package/dist/util/agent-homes.d.ts +15 -0
  508. package/dist/util/agent-homes.js +34 -0
  509. package/dist/util/anthropic-messages.d.ts +3 -0
  510. package/dist/util/anthropic-messages.js +22 -5
  511. package/dist/util/chunked.d.ts +3 -0
  512. package/dist/util/chunked.js +10 -0
  513. package/dist/util/ellipsize.d.ts +3 -0
  514. package/dist/util/ellipsize.js +5 -0
  515. package/dist/util/env.d.ts +2 -1
  516. package/dist/util/env.js +2 -1
  517. package/dist/util/format.d.ts +3 -0
  518. package/dist/util/format.js +6 -0
  519. package/dist/util/hook-payload.d.ts +8 -0
  520. package/dist/util/hook-payload.js +37 -0
  521. package/dist/util/http-retry.d.ts +6 -0
  522. package/dist/util/http-retry.js +43 -5
  523. package/dist/util/http-util.d.ts +0 -8
  524. package/dist/util/http-util.js +10 -21
  525. package/dist/util/limits.d.ts +7 -0
  526. package/dist/util/limits.js +14 -0
  527. package/dist/util/log.d.ts +4 -0
  528. package/dist/util/log.js +9 -0
  529. package/dist/util/request-scope.d.ts +3 -1
  530. package/dist/util/request-scope.js +11 -6
  531. package/dist/util/secret-detect.js +6 -1
  532. package/dist/util/sqlite-blocked.d.ts +2 -0
  533. package/dist/util/sqlite-blocked.js +5 -0
  534. package/dist/util/stream-tee.d.ts +3 -0
  535. package/dist/util/stream-tee.js +35 -0
  536. package/dist/util/time.d.ts +4 -0
  537. package/dist/util/time.js +4 -0
  538. package/dist/util/version.d.ts +1 -1
  539. package/dist/util/version.js +1 -1
  540. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  541. package/extensions/openclaw-plugin/package.json +1 -1
  542. package/openclaw.plugin.json +1 -1
  543. package/package.json +2 -2
  544. package/dist/store/embeddings/local.d.ts +0 -15
  545. package/dist/store/embeddings/local.js +0 -175
  546. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  547. /package/dist/{cli → api}/correction-latency.js +0 -0
  548. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  549. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  550. /package/dist/{store → core}/object-types.d.ts +0 -0
  551. /package/dist/{store → core}/object-types.js +0 -0
  552. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  553. /package/dist/{capture → util}/compaction-items.js +0 -0
  554. /package/dist/{store → util}/yaml.d.ts +0 -0
  555. /package/dist/{store → util}/yaml.js +0 -0
@@ -1,191 +1,16 @@
1
- // First-class object verbs for predictions, decisions and incidents.
1
+ // First-class object verbs for decisions: record one (optionally superseding an older one's memory), list, get, close.
2
2
  import { getMemory } from '../api/memories.js';
3
3
  import { extractPathTags } from '../search/path-context.js';
4
- import * as predictionsModule from '../store/predictions.js';
5
4
  import * as decisionsModule from '../objects/decisions.js';
6
- import * as incidentsModule from '../objects/incidents.js';
7
5
  import { printError } from './output.js';
8
- import { nonEmptyStringFlag, parseListLimit, flagIsTrue, isStringFlag, stringFlag } from './flag-values.js';
6
+ import { nonEmptyStringFlag, flagIsTrue, stringFlag } from './flag-values.js';
9
7
  import { requireInit } from './shared.js';
10
8
  import { cliApiContext } from './api-context.js';
11
- import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail, requireStatus } from './object-verbs.js';
9
+ import { closeObject, foundOrExit, idArgOrExit, listObjects, printLifecycleTail } from './object-verbs.js';
10
+ import { parseObjectId } from './lenient-id.js';
12
11
  import { errorMessage } from '../util/log.js';
13
12
  import { CliExit } from './exit.js';
14
- const BASERATE_DECIMALS = 3;
15
13
  const DECISION = { cmd: 'decide', noun: 'Decision', idLabel: 'decision' };
16
- const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
17
- const PREDICTION_NOUN = 'Prediction';
18
- // Lenient on purpose (parseInt reads "1abc" as 1) until the next major version; incidents use the strict parser.
19
- function parseObjectId(idRaw, noun) {
20
- const id = parseInt(String(idRaw), 10);
21
- if (!Number.isFinite(id) || id <= 0) {
22
- printError(`Invalid ${noun} id: "${idRaw}"`);
23
- throw new CliExit(1);
24
- }
25
- return id;
26
- }
27
- // Prediction first-class object
28
- function predictClose(hippoRoot, tenantId, args, flags) {
29
- const id = idArgOrExit(args, 'Usage: hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]', 'prediction', parseObjectId);
30
- const stateRaw = (stringFlag(flags, 'state') ?? '').trim();
31
- // SAFETY: Set.has only compares by value, so a string outside the closure states is a plain miss.
32
- if (!predictionsModule.VALID_CLOSURE_STATES.has(stateRaw) || stateRaw === 'open') {
33
- printError(`Invalid --state: "${stateRaw}". Must be one of: closed | closed-unknown.`);
34
- throw new CliExit(1);
35
- }
36
- const actualRaw = flags['actual'];
37
- const actualValue = actualRaw !== undefined ? Number(actualRaw) : undefined;
38
- if (actualRaw !== undefined && !Number.isFinite(actualValue)) {
39
- printError(`Invalid --actual: "${actualRaw}". Must be a number.`);
40
- throw new CliExit(1);
41
- }
42
- const closureNote = stringFlag(flags, 'note');
43
- const closed = predictionsModule.closePrediction(hippoRoot, tenantId, id, {
44
- // SAFETY: the check above exits unless stateRaw is in VALID_CLOSURE_STATES.
45
- closureState: stateRaw,
46
- actualValue,
47
- closureNote,
48
- });
49
- console.log(`Prediction ${closed.id} closed: state=${closed.closureState}${closed.actualValue !== null ? ` actual=${closed.actualValue}` : ''}`);
50
- }
51
- function loadPredictionList(hippoRoot, tenantId, status, classTag, limit) {
52
- if (status === 'open') {
53
- return predictionsModule.loadOpenPredictions(hippoRoot, tenantId, {
54
- classTag: classTag || undefined,
55
- limit,
56
- });
57
- }
58
- if (status === 'all') {
59
- return classTag
60
- ? predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, { limit })
61
- : predictionsModule.loadAllPredictions(hippoRoot, tenantId, { limit });
62
- }
63
- const closureState = requireStatus(status, predictionsModule.VALID_CLOSURE_STATES);
64
- if (!classTag) {
65
- // status filter without class — scan all classes is more complex; v1 requires --class for non-default status
66
- printError('--status filter (non-open) requires --class to be set.');
67
- throw new CliExit(1);
68
- }
69
- return predictionsModule.loadPredictionsByClass(hippoRoot, tenantId, classTag, {
70
- closureState,
71
- limit,
72
- });
73
- }
74
- function predictList(hippoRoot, tenantId, flags) {
75
- const classTag = stringFlag(flags, 'class')?.trim() ?? '';
76
- const status = stringFlag(flags, 'status')?.trim() ?? 'all';
77
- const limit = parseListLimit(flags);
78
- const results = loadPredictionList(hippoRoot, tenantId, status, classTag, limit);
79
- if (results.length === 0) {
80
- console.log(classTag ? `No predictions in class "${classTag}".` : 'No predictions.');
81
- return;
82
- }
83
- console.log(`Found ${results.length} predictions:\n`);
84
- for (const p of results) {
85
- const estPart = p.estimateValue !== null ? ` estimate=${p.estimateValue}${p.estimateUnit ? ` ${p.estimateUnit}` : ''}` : '';
86
- const actPart = p.actualValue !== null ? ` actual=${p.actualValue}` : '';
87
- const tgtPart = p.targetDate ? ` target=${p.targetDate}` : '';
88
- console.log(`#${p.id} [${p.closureState}] class=${p.classTag}${estPart}${actPart}${tgtPart}`);
89
- console.log(` ${p.claimText}`);
90
- if (p.closureNote)
91
- console.log(` note: ${p.closureNote}`);
92
- }
93
- }
94
- function predictShow(hippoRoot, tenantId, args) {
95
- const id = idArgOrExit(args, 'Usage: hippo predict show <id>', 'prediction', parseObjectId);
96
- const pred = foundOrExit(predictionsModule.loadPredictionById(hippoRoot, tenantId, id), PREDICTION_NOUN, id);
97
- console.log(`Prediction #${pred.id}`);
98
- console.log(` class: ${pred.classTag}`);
99
- console.log(` claim: ${pred.claimText}`);
100
- console.log(` state: ${pred.closureState}`);
101
- if (pred.estimateValue !== null)
102
- console.log(` estimate: ${pred.estimateValue}${pred.estimateUnit ? ' ' + pred.estimateUnit : ''}`);
103
- if (pred.targetDate)
104
- console.log(` target: ${pred.targetDate}`);
105
- if (pred.actualValue !== null)
106
- console.log(` actual: ${pred.actualValue}`);
107
- if (pred.closedAt)
108
- console.log(` closed: ${pred.closedAt}`);
109
- if (pred.closureNote)
110
- console.log(` note: ${pred.closureNote}`);
111
- if (pred.memoryId)
112
- console.log(` memory: ${pred.memoryId}`);
113
- console.log(` created: ${pred.createdAt}`);
114
- }
115
- function predictBaserate(hippoRoot, tenantId, flags) {
116
- // Reference-class / planning-fallacy detector
117
- const classTag = stringFlag(flags, 'class')?.trim();
118
- if (!classTag) {
119
- printError('Usage: hippo predict baserate --class <c>');
120
- throw new CliExit(1);
121
- }
122
- const baserate = predictionsModule.computePredictionBaserate(hippoRoot, tenantId, classTag);
123
- if (baserate.nClosed === 0) {
124
- console.log(`No closed predictions in class "${baserate.classTag}" yet.`);
125
- console.log(` Create one with: hippo predict "<claim>" --class ${baserate.classTag} --estimate N`);
126
- console.log(` Close it later: hippo predict close <id> --state closed --actual N`);
127
- return;
128
- }
129
- console.log(baserate.summary);
130
- console.log(` n_closed: ${baserate.nClosed}`);
131
- console.log(` n_ratio_eligible: ${baserate.nRatioEligible}`);
132
- if (baserate.meanEstimate !== null)
133
- console.log(` mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
134
- if (baserate.meanActual !== null)
135
- console.log(` mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
136
- if (baserate.meanRatio !== null)
137
- console.log(` mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
138
- if (baserate.p50Ratio !== null)
139
- console.log(` p50_ratio: ${baserate.p50Ratio.toFixed(BASERATE_DECIMALS)}x`);
140
- if (baserate.mae !== null)
141
- console.log(` mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
142
- }
143
- export function handlePredict({ hippoRoot, tenantId, args, flags }) {
144
- requireInit(hippoRoot);
145
- const subcommand = args[0] ?? '';
146
- if (subcommand === 'close')
147
- return predictClose(hippoRoot, tenantId, args, flags);
148
- if (subcommand === 'list')
149
- return predictList(hippoRoot, tenantId, flags);
150
- if (subcommand === 'show')
151
- return predictShow(hippoRoot, tenantId, args);
152
- if (subcommand === 'baserate')
153
- return predictBaserate(hippoRoot, tenantId, flags);
154
- // Default subcommand: create. args[0] is the claim text.
155
- predictCreate(hippoRoot, tenantId, subcommand, flags);
156
- }
157
- function predictCreate(hippoRoot, tenantId, claimText, flags) {
158
- if (!claimText) {
159
- printError('Usage: hippo predict "<claim>" --class <c> [--estimate <v>] [--unit <u>] [--target <YYYY-MM-DD>]');
160
- printError(' hippo predict close <id> --state <closed|closed-unknown> [--actual <v>] [--note "..."]');
161
- printError(' hippo predict list [--class X] [--status open|closed|closed-unknown|all] [--limit N]');
162
- printError(' hippo predict show <id>');
163
- throw new CliExit(1);
164
- }
165
- const classTag = stringFlag(flags, 'class')?.trim();
166
- if (!classTag) {
167
- printError('--class is required for prediction creation.');
168
- throw new CliExit(1);
169
- }
170
- const estimateRaw = flags['estimate'];
171
- const estimateValue = estimateRaw !== undefined ? Number(estimateRaw) : undefined;
172
- if (estimateRaw !== undefined && !Number.isFinite(estimateValue)) {
173
- printError(`Invalid --estimate: "${estimateRaw}". Must be a number.`);
174
- throw new CliExit(1);
175
- }
176
- const estimateUnit = stringFlag(flags, 'unit');
177
- const targetDate = stringFlag(flags, 'target');
178
- const created = predictionsModule.savePrediction(hippoRoot, tenantId, {
179
- classTag,
180
- claimText,
181
- estimateValue,
182
- estimateUnit,
183
- targetDate,
184
- });
185
- console.log(`Prediction recorded: #${created.id} class=${created.classTag}`);
186
- if (created.memoryId)
187
- console.log(` memory: ${created.memoryId}`);
188
- }
189
14
  function printDecisionRow(d) {
190
15
  const supPart = d.supersededBy !== null ? ` superseded_by=#${d.supersededBy}` : '';
191
16
  console.log(`#${d.id} [${d.status}]${supPart} memory=${d.memoryId ?? '-'}`);
@@ -288,106 +113,4 @@ function printSupersedes(supersedesMemId, supersedesDecisionId) {
288
113
  : ' (no active decision row; memory weakened only)';
289
114
  console.log(` supersedes memory: ${supersedesMemId}${tail}`);
290
115
  }
291
- function printIncidentRow(inc) {
292
- const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
293
- console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
294
- console.log(` ${inc.incidentText}`);
295
- if (inc.context)
296
- console.log(` context: ${inc.context}`);
297
- }
298
- function incidentList(hippoRoot, tenantId, flags) {
299
- listObjects(flags, {
300
- plural: 'incidents',
301
- states: incidentsModule.VALID_INCIDENT_STATES,
302
- load: (opts) => incidentsModule.loadIncidents(hippoRoot, tenantId, opts),
303
- printRow: printIncidentRow,
304
- });
305
- }
306
- function incidentGet(hippoRoot, tenantId, args) {
307
- const id = idArgOrExit(args, 'Usage: hippo incident get <id>', INCIDENT.idLabel);
308
- const incident = foundOrExit(incidentsModule.loadIncidentById(hippoRoot, tenantId, id), INCIDENT.noun, id);
309
- console.log(`Incident #${incident.id}`);
310
- console.log(` status: ${incident.status}`);
311
- console.log(` text: ${incident.incidentText}`);
312
- if (incident.context)
313
- console.log(` context: ${incident.context}`);
314
- if (incident.resolutionText)
315
- console.log(` resolution: ${incident.resolutionText}`);
316
- if (incident.resolvedAt)
317
- console.log(` resolved_at: ${incident.resolvedAt}`);
318
- if (incident.closedAt)
319
- console.log(` closed_at: ${incident.closedAt}`);
320
- if (incident.linkedMemoryIds.length > 0) {
321
- console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
322
- }
323
- if (incident.memoryId)
324
- console.log(` memory: ${incident.memoryId}`);
325
- console.log(` created: ${incident.createdAt}`);
326
- }
327
- function incidentResolve(hippoRoot, tenantId, args, flags) {
328
- const id = idArgOrExit(args, 'Usage: hippo incident resolve <id> --resolution "<text>"', INCIDENT.idLabel);
329
- const resolutionRaw = stringFlag(flags, 'resolution');
330
- if (!resolutionRaw?.trim()) {
331
- printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
332
- throw new CliExit(1);
333
- }
334
- const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
335
- console.log(`Incident #${resolved.id} resolved.`);
336
- }
337
- function incidentClose(hippoRoot, tenantId, args) {
338
- closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
339
- }
340
- export function handleIncident({ hippoRoot, tenantId, args, flags }) {
341
- requireInit(hippoRoot);
342
- const subcommand = args[0] ?? '';
343
- if (subcommand === 'list')
344
- return incidentList(hippoRoot, tenantId, flags);
345
- if (subcommand === 'get')
346
- return incidentGet(hippoRoot, tenantId, args);
347
- if (subcommand === 'resolve')
348
- return incidentResolve(hippoRoot, tenantId, args, flags);
349
- if (subcommand === 'close')
350
- return incidentClose(hippoRoot, tenantId, args);
351
- // Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
352
- // for the `open` keyword the text is args[1], otherwise args[0] is the text.
353
- incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
354
- }
355
- function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
356
- if (!incidentText) {
357
- printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
358
- printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
359
- printError(' hippo incident get <id>');
360
- printError(' hippo incident resolve <id> --resolution "<text>"');
361
- printError(' hippo incident close <id>');
362
- throw new CliExit(1);
363
- }
364
- const context = nonEmptyStringFlag(flags, 'context');
365
- // --link is a repeatable flag (collected into an array by parseArgs). A
366
- // single --link <id> yields a string; normalize both to string[].
367
- const linkRaw = flags['link'];
368
- let linkedMemoryIds;
369
- if (Array.isArray(linkRaw)) {
370
- linkedMemoryIds = linkRaw;
371
- }
372
- else if (isStringFlag(linkRaw)) {
373
- linkedMemoryIds = [linkRaw];
374
- }
375
- else if (linkRaw === true) {
376
- printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
377
- throw new CliExit(1);
378
- }
379
- const incidentPathTags = extractPathTags(process.cwd());
380
- const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
381
- incidentText,
382
- context,
383
- linkedMemoryIds,
384
- extraTags: incidentPathTags,
385
- });
386
- console.log(`Incident recorded: #${created.id}`);
387
- if (created.memoryId)
388
- console.log(` memory: ${created.memoryId}`);
389
- if (created.linkedMemoryIds.length > 0) {
390
- console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
391
- }
392
- }
393
116
  //# sourceMappingURL=decisions.js.map
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleEval({ hippoRoot, args, flags }: CommandContext): Promise<void>;
2
+ export declare function handleEval({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=eval.d.ts.map
package/dist/cli/eval.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // The `hippo eval` verb; main() loads it lazily from the command table.
2
2
  import * as path from 'path';
3
3
  import * as fs from 'fs';
4
- import { loadAllEntries } from '../store/entry-reads.js';
4
+ import { listMemories } from '../api/memories.js';
5
+ import { cliApiContext } from './api-context.js';
5
6
  import { loadConfig } from '../core/config.js';
6
7
  import { getGlobalRoot } from '../sharing/global-store.js';
7
8
  import { runEval, bootstrapCorpus, compareSummaries } from '../eval/eval.js';
@@ -10,7 +11,7 @@ import { PACKAGE_VERSION } from '../util/version.js';
10
11
  import { printError } from './output.js';
11
12
  import { requireInit } from './shared.js';
12
13
  import { fmt } from './print.js';
13
- import { boolFlag } from './flag-values.js';
14
+ import { boolFlag, numberFlag } from './flag-values.js';
14
15
  import { errorMessage } from '../util/log.js';
15
16
  import { CliExit } from './exit.js';
16
17
  const HIT_TOP_K = 10;
@@ -20,14 +21,14 @@ const MAX_MISSED_SHOWN = 4;
20
21
  const QUERY_PREVIEW_CHARS = 60;
21
22
  const MAX_DELTAS_SHOWN = 5;
22
23
  /** Runs `hippo eval`: --bootstrap writes a corpus, --suite runs the built-in feature eval, else it scores a corpus file. */
23
- async function cmdEval(hippoRoot, corpusPath, flags) {
24
+ async function cmdEval(hippoRoot, tenantId, corpusPath, flags) {
24
25
  const asJson = boolFlag(flags, 'json');
25
- const minMrr = flags['min-mrr'] !== undefined ? parseFloat(String(flags['min-mrr'])) : null;
26
+ const minMrr = numberFlag(flags, 'min-mrr') ?? null;
26
27
  const comparePath = flags['compare'] ? String(flags['compare']) : null;
27
28
  // Suite mode doesn't need an initialized store
28
29
  if (!flags['suite'])
29
30
  requireInit(hippoRoot);
30
- const entries = flags['suite'] ? [] : loadAllEntries(hippoRoot);
31
+ const entries = flags['suite'] ? [] : listMemories(cliApiContext(hippoRoot, tenantId), { everyTenant: true });
31
32
  if (flags['bootstrap']) {
32
33
  writeBootstrapCorpus(entries, flags);
33
34
  return;
@@ -55,22 +56,20 @@ async function runCorpusEval(hippoRoot, corpusPath, entries, flags) {
55
56
  const globalRoot = getGlobalRoot();
56
57
  const localBump = flags['equal-sources']
57
58
  ? 1.0
58
- : flags['local-bump'] !== undefined
59
- ? parseFloat(String(flags['local-bump']))
60
- : loadConfig(hippoRoot).search.localBump;
59
+ : numberFlag(flags, 'local-bump') ?? loadConfig(hippoRoot).search.localBump;
61
60
  return runEval(cases, entries, {
62
61
  hippoRoot,
63
62
  globalRoot,
64
63
  mmr: !flags['no-mmr'],
65
- mmrLambda: flags['mmr-lambda'] !== undefined ? parseFloat(String(flags['mmr-lambda'])) : undefined,
66
- embeddingWeight: flags['embedding-weight'] !== undefined ? parseFloat(String(flags['embedding-weight'])) : undefined,
64
+ mmrLambda: numberFlag(flags, 'mmr-lambda'),
65
+ embeddingWeight: numberFlag(flags, 'embedding-weight'),
67
66
  localBump,
68
67
  });
69
68
  }
70
69
  /** Bootstrap mode: emit a synthetic corpus built from the store's own memories. */
71
70
  function writeBootstrapCorpus(entries, flags) {
72
71
  const outPath = flags['out'] ? String(flags['out']) : null;
73
- const max = flags['max-cases'] !== undefined ? parseInt(String(flags['max-cases']), 10) : 50;
72
+ const max = numberFlag(flags, 'max-cases') ?? 50;
74
73
  const corpus = bootstrapCorpus(entries, max);
75
74
  const payload = JSON.stringify({ cases: corpus }, null, 2);
76
75
  if (outPath) {
@@ -220,8 +219,8 @@ function printEvalCompare(summary, comparePath, asJson) {
220
219
  }
221
220
  }
222
221
  }
223
- export async function handleEval({ hippoRoot, args, flags }) {
222
+ export async function handleEval({ hippoRoot, tenantId, args, flags }) {
224
223
  const corpusPath = args[0] ? String(args[0]) : null;
225
- await cmdEval(hippoRoot, corpusPath, flags);
224
+ await cmdEval(hippoRoot, tenantId, corpusPath, flags);
226
225
  }
227
226
  //# sourceMappingURL=eval.js.map
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleExplain({ hippoRoot, args, flags }: CommandContext): Promise<void>;
2
+ export declare function handleExplain({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=explain.d.ts.map
@@ -1,15 +1,12 @@
1
1
  // The `hippo explain` verb; main() loads it lazily from the command table.
2
2
  import { confidenceFacets } from '../core/memory.js';
3
- import { isInitialized } from '../store/open.js';
4
- import { loadSearchEntries } from '../store/search-rows.js';
5
- import { loadIndex } from '../store/index-and-stats.js';
6
3
  import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
7
4
  import { loadConfig } from '../core/config.js';
8
5
  import { dropHeldCopies } from '../util/same-text.js';
9
- import { detectScope } from '../sharing/scope.js';
6
+ import { detectScope } from '../core/active-scope.js';
10
7
  import { getGlobalRoot } from '../sharing/global-store.js';
11
8
  import * as api from '../api/index.js';
12
- import { resolveTenantId } from '../store/tenant.js';
9
+ import { cliRecallOrigin, scopeHiddenCount } from '../api/recall-cli.js';
13
10
  import { cliApiContext } from './api-context.js';
14
11
  import { printedTokens } from '../api/context-render.js';
15
12
  import { printError } from './output.js';
@@ -19,18 +16,13 @@ import { fmt, recallEntryText, recallHeading } from './print.js';
19
16
  import { CliExit } from './exit.js';
20
17
  const EXPLAIN_PREVIEW_CHARS = 48;
21
18
  /** The SQL predicate drops denied rows before the window, so an unscoped probe counts what the policy hides. */
22
- function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
23
- const probe = [
24
- ...loadSearchEntries(hippoRoot, query, undefined, tenantId),
25
- ...(globalRoot ? loadSearchEntries(globalRoot, query, undefined, tenantId) : []),
26
- ];
27
- // Window-capped, so the count is a floor on large stores; fine for a "why is my row missing" hint.
28
- const hidden = probe.filter((e) => !api.passesCliRecallScopeFilter(e.scope ?? null, requested)).length;
19
+ function noteScopeHidden(ctx, globalRoot, query, requested) {
20
+ const hidden = scopeHiddenCount(ctx, query, globalRoot, requested);
29
21
  if (hidden > 0) {
30
22
  printError(`[note] ${hidden} candidate${hidden === 1 ? '' : 's'} hidden by recall scope policy (pass an explicit --scope to inspect).`);
31
23
  }
32
24
  }
33
- async function cmdExplain(hippoRoot, query, flags) {
25
+ async function cmdExplain(hippoRoot, tenantId, query, flags) {
34
26
  requireInit(hippoRoot);
35
27
  const budget = parseBudgetFlag(flags['budget'], DEFAULT_RECALL_BUDGET);
36
28
  const limit = parseLimitFlag(flags['limit']);
@@ -38,25 +30,26 @@ async function cmdExplain(hippoRoot, query, flags) {
38
30
  const includeSuperseded = boolFlag(flags, 'include-superseded');
39
31
  const asOf = parseAsOfFlag(flags);
40
32
  const globalRoot = getGlobalRoot();
41
- const tenantId = resolveTenantId({});
33
+ const ctx = cliApiContext(hippoRoot, tenantId);
42
34
  // Explain shows what recall would see, so it applies the same scope rule.
43
35
  const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
36
+ const activeScope = explicitScope || detectScope();
44
37
  // Unlike recall, explain reads the global store whenever it exists, even when it is the local root.
45
- const explainGlobalOn = isInitialized(globalRoot);
46
- noteScopeHidden(hippoRoot, explainGlobalOn ? globalRoot : undefined, query, tenantId, explicitScope || undefined);
38
+ const origin = cliRecallOrigin(ctx, { globalRoot, primaryIsGlobal: false, activeScope });
39
+ const explainGlobalOn = origin.globalOn;
40
+ noteScopeHidden(ctx, explainGlobalOn ? globalRoot : undefined, query, explicitScope || undefined);
47
41
  const config = loadConfig(hippoRoot);
48
42
  const engine = engineFlags(flags, config);
49
43
  // Priced as recall prints each result, so explain returns what recall's engines would.
50
- const explainIndex = loadIndex(hippoRoot);
51
- const cost = (r) => printedTokens(recallEntryText(r, query, false, explainGlobalOn && !explainIndex.entries[r.entry.id]));
44
+ const cost = (r) => printedTokens(recallEntryText(r, query, false, origin.isGlobal(r.entry.id)));
52
45
  const entryBudget = Math.max(0, budget - printedTokens(recallHeading(budget, budget, query)));
53
46
  const slot = {};
54
- await api.retrieve(cliApiContext(hippoRoot, tenantId), {
47
+ await api.retrieve(ctx, {
55
48
  query,
56
49
  cliCore: {
57
50
  rank: {
58
51
  budget: entryBudget, cost, limit, includeSuperseded, asOf,
59
- explicitScope, activeScope: explicitScope || detectScope(),
52
+ explicitScope, activeScope,
60
53
  search: { ...engine, multihop: false, explain: true },
61
54
  },
62
55
  sources: { globalRoot: explainGlobalOn ? globalRoot : undefined },
@@ -119,7 +112,8 @@ function printExplainTable(results, query, modeUsed, candidates) {
119
112
  const b = r.breakdown;
120
113
  const preview = r.entry.content.replace(/\s+/g, ' ').slice(0, EXPLAIN_PREVIEW_CHARS);
121
114
  const ageStr = b ? `${b.ageDays}d` : '?';
122
- console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
115
+ console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ` +
116
+ `${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
123
117
  }
124
118
  console.log();
125
119
  }
@@ -152,8 +146,10 @@ function printExplainBreakdown(r, i) {
152
146
  console.log(` path: x${fmt(b.pathBoost, 3)} (cwd path tag overlap)`);
153
147
  if (b.sourceBump !== 1)
154
148
  console.log(` source: x${fmt(b.sourceBump, 2)} (local priority bump over global)`);
155
- if (b.outcomeBoost !== 1)
156
- console.log(` outcome: x${fmt(b.outcomeBoost, 3)} (user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
149
+ if (b.outcomeBoost !== 1) {
150
+ console.log(` outcome: x${fmt(b.outcomeBoost, 3)} ` +
151
+ `(user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
152
+ }
157
153
  if (b.churnStaleMultiplier !== 1)
158
154
  console.log(` churn: x${fmt(b.churnStaleMultiplier, 2)} (tagged 'churn-stale')`);
159
155
  if (b.preMmrRank !== undefined && b.postMmrRank !== undefined && b.preMmrRank !== b.postMmrRank) {
@@ -164,12 +160,12 @@ function printExplainBreakdown(r, i) {
164
160
  }
165
161
  console.log();
166
162
  }
167
- export async function handleExplain({ hippoRoot, args, flags }) {
163
+ export async function handleExplain({ hippoRoot, tenantId, args, flags }) {
168
164
  const query = args.join(' ').trim();
169
165
  if (!query) {
170
166
  printError('Please provide a search query.');
171
167
  throw new CliExit(1);
172
168
  }
173
- await cmdExplain(hippoRoot, query, flags);
169
+ await cmdExplain(hippoRoot, tenantId, query, flags);
174
170
  }
175
171
  //# sourceMappingURL=explain.js.map
@@ -1,4 +1,5 @@
1
1
  // Readers that turn parsed CLI flags into typed values, and the flag types they share.
2
+ import { resolveListLimit } from '../util/limits.js';
2
3
  import { printError } from './output.js';
3
4
  import { CliExit } from './exit.js';
4
5
  export function isBooleanFlag(value) {
@@ -35,7 +36,8 @@ export function parseBudgetFlag(value, fallback) {
35
36
  }
36
37
  return parsed;
37
38
  }
38
- // Whole-arg digits only: parseInt alone reads "1abc" as 1 and a mutating verb would hit the wrong row. Digits past 2^53 round to a neighbouring id, so they are refused too.
39
+ // Whole-arg digits only: parseInt alone reads "1abc" as 1 and a mutating verb would hit the wrong row.
40
+ // Digits past 2^53 round to a neighbouring id, so they are refused too.
39
41
  export function parsePositiveId(idRaw, label) {
40
42
  const s = String(idRaw ?? '').trim();
41
43
  const id = parseInt(s, 10);
@@ -47,8 +49,8 @@ export function parsePositiveId(idRaw, label) {
47
49
  }
48
50
  export function parseListLimit(flags) {
49
51
  const limitRaw = flags['limit'];
50
- const limit = limitRaw !== undefined ? parseInt(String(limitRaw), 10) : 100;
51
- if (!Number.isFinite(limit) || limit <= 0) {
52
+ const limit = resolveListLimit(limitRaw !== undefined ? parseInt(String(limitRaw), 10) : undefined);
53
+ if (limit === undefined) {
52
54
  printError(`Invalid --limit: "${limitRaw}". Must be a positive integer.`);
53
55
  throw new CliExit(1);
54
56
  }
@@ -73,9 +75,17 @@ export function stringListFlag(flags, name) {
73
75
  export function isOneOf(allowed, value) {
74
76
  return allowed.some((a) => a === value);
75
77
  }
78
+ // A junk value exits instead of becoming NaN, which would pass every `<` gate.
76
79
  export function numberFlag(flags, name) {
77
80
  const v = flags[name];
78
- return isStringFlag(v) ? Number(v) : undefined;
81
+ if (!isStringFlag(v))
82
+ return undefined;
83
+ const parsed = Number(v);
84
+ if (v.trim() === '' || !Number.isFinite(parsed)) {
85
+ printError(`Invalid --${name}: "${v}". Must be a number.`);
86
+ throw new CliExit(1);
87
+ }
88
+ return parsed;
79
89
  }
80
90
  // Any truthy value counts, so a string value is true too.
81
91
  export function boolFlag(flags, name) {
@@ -99,10 +109,10 @@ export function engineFlags(flags, config) {
99
109
  usePhysics: boolFlag(flags, 'physics') || (!flags['classic'] && config.physics.enabled !== false),
100
110
  physicsConfig: config.physics,
101
111
  mmr: !flags['no-mmr'] && config.mmr.enabled,
102
- mmrLambda: flags['mmr-lambda'] !== undefined ? parseFloat(String(flags['mmr-lambda'])) : config.mmr.lambda,
112
+ mmrLambda: numberFlag(flags, 'mmr-lambda') ?? config.mmr.lambda,
103
113
  localBump: flags['equal-sources']
104
114
  ? 1.0
105
- : flags['local-bump'] !== undefined ? parseFloat(String(flags['local-bump'])) : config.search.localBump,
115
+ : numberFlag(flags, 'local-bump') ?? config.search.localBump,
106
116
  };
107
117
  }
108
118
  // parseArgs turns a value-less flag into `true`; refuse rather than silently