hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  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 +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  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-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -2,12 +2,11 @@
2
2
  // Two fast replies would otherwise start two workers that both read the dedupe keys before either writes.
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
- import { createHash } from 'node:crypto';
6
- import { homeDir } from '../hooks/shared.js';
7
- import { errorMessage, log as logger } from '../util/log.js';
5
+ import { homeDir } from '../util/agent-homes.js';
6
+ import { errorCode, errorMessage, log as logger } from '../util/log.js';
8
7
  import { isObjectLike, isStringValue } from '../core/capture-contract.js';
9
8
  import { SESSION_ID_RE } from './copilot-transcript.js';
10
- import { FINGERPRINT_HEX_CHARS } from '../util/token-text.js';
9
+ import { blockHash } from '../util/token-text.js';
11
10
  /** Null for a missing id or one that could climb out of the sessions folder. */
12
11
  function sessionStateFiles(sessionId) {
13
12
  if (sessionId === null || !SESSION_ID_RE.test(sessionId))
@@ -79,10 +78,16 @@ function releaseSessionLock(lock) {
79
78
  logger.debug(`session lock not removed: ${errorMessage(err)}`);
80
79
  }
81
80
  }
82
- /** False when the sessions folder cannot be written, so the caller runs unlocked as before. */
81
+ /** False when the request could not be queued; the caller then refuses the run, since an unlocked worker could race a live one. */
83
82
  function queueRun(files, mode) {
84
83
  try {
85
84
  fs.mkdirSync(path.dirname(files.queued), { recursive: true });
85
+ }
86
+ catch (err) {
87
+ logger.warn(`session worker: cannot create ${path.dirname(files.queued)}, so the ${mode} close is not run: ${errorMessage(err)}`);
88
+ return false;
89
+ }
90
+ try {
86
91
  // A full close outranks a turn close: it overwrites a queued turn, and a turn never replaces a queued full close.
87
92
  if (mode === 'full')
88
93
  fs.writeFileSync(files.queued, 'full');
@@ -91,7 +96,10 @@ function queueRun(files, mode) {
91
96
  return true;
92
97
  }
93
98
  catch (err) {
94
- return err instanceof Error && 'code' in err && err.code === 'EEXIST';
99
+ if (errorCode(err) === 'EEXIST')
100
+ return true;
101
+ logger.warn(`session worker: cannot queue the ${mode} close in ${files.queued}, so it is not run: ${errorMessage(err)}`);
102
+ return false;
95
103
  }
96
104
  }
97
105
  /** Takes the queued request by renaming it, so one queued while this reads it lands in a fresh file. */
@@ -100,8 +108,10 @@ function takeQueued(queued) {
100
108
  try {
101
109
  fs.renameSync(queued, taken);
102
110
  }
103
- catch {
104
- // Nothing queued, or a rename refused for a moment; the request stays queued for the next round.
111
+ catch (err) {
112
+ // ENOENT means nothing is queued; any other refusal leaves the request queued for the next round, but is told.
113
+ if (errorCode(err) !== 'ENOENT')
114
+ logger.warn(`session worker: cannot take the queued request ${queued}: ${errorMessage(err)}`);
105
115
  return null;
106
116
  }
107
117
  try {
@@ -114,8 +124,10 @@ function takeQueued(queued) {
114
124
  /** Runs `work` unless a live worker holds this session, which then runs the request after its own so the last reply is never dropped. */
115
125
  export async function runSessionWorker(sessionId, mode, work) {
116
126
  const files = sessionStateFiles(sessionId);
117
- if (files === null || !queueRun(files, mode))
127
+ if (files === null)
118
128
  return work(mode);
129
+ if (!queueRun(files, mode))
130
+ return;
119
131
  for (let take = takeSessionLock(files.lock); take !== 'held'; take = takeSessionLock(files.lock)) {
120
132
  if (take === 'unusable')
121
133
  return work(mode);
@@ -135,7 +147,7 @@ export async function runSessionWorker(sessionId, mode, work) {
135
147
  }
136
148
  }
137
149
  function turnKey(turn) {
138
- return createHash('sha256').update(`${turn.role}\n${turn.text}`).digest('hex').slice(0, FINGERPRINT_HEX_CHARS);
150
+ return blockHash(`${turn.role}\n${turn.text}`);
139
151
  }
140
152
  /** The cursor position after `turns`: how many there were and a hash of the last. */
141
153
  export function turnPosition(turns) {
@@ -9,7 +9,8 @@ interface TranscriptLineFlags {
9
9
  interface TranscriptMessage {
10
10
  content?: unknown;
11
11
  }
12
- /** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection and interrupt blocks. */
12
+ /** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
13
+ * and interrupt blocks. */
13
14
  export declare function humanUserText(entry: TranscriptLineFlags, message: TranscriptMessage): string;
14
15
  export interface SessionTurn {
15
16
  role: 'user' | 'assistant';
@@ -1,5 +1,5 @@
1
1
  import { envHomeDir, processEnv } from '../util/env.js';
2
- import { claudeConfigDir } from '../hooks/shared.js';
2
+ import { claudeConfigDir } from '../util/agent-homes.js';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import { isObjectLike, isStringValue, readSessionEnd } from '../core/capture-contract.js';
@@ -17,7 +17,8 @@ function isNonHumanUserLine(entry, content) {
17
17
  return CLAUDE_CODE_COMMAND_PREFIXES.some((p) => head.startsWith(p));
18
18
  }
19
19
  const NON_HUMAN_BLOCK_PREFIXES = ['<ide_', '[Request interrupted by user'];
20
- /** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection and interrupt blocks. */
20
+ /** The human's words on a Claude Code user line, '' when none; VS Code stores prompts as text blocks, beside its own open-file, selection
21
+ * and interrupt blocks. */
21
22
  export function humanUserText(entry, message) {
22
23
  const content = message.content;
23
24
  let text = '';
@@ -82,6 +83,8 @@ function claudeCodeTurn(entry) {
82
83
  }
83
84
  return chunks.length > 0 ? { role: 'assistant', text: chunks.join('\n') } : null;
84
85
  }
86
+ // Codex stores its own context as user messages: the AGENTS.md text, and one tagged block each for the environment and app state.
87
+ const CODEX_INJECTED_USER_TEXT = /^(?:# AGENTS\.md instructions\b|<([A-Za-z][\w-]*)(?:\s[^>]*)?>[\s\S]*<\/\1>$)/;
85
88
  // Codex rollout transcript shape: response_item -> payload.message
86
89
  function codexTurn(entry) {
87
90
  if (entry.type !== 'response_item')
@@ -99,7 +102,7 @@ function codexTurn(entry) {
99
102
  continue;
100
103
  const blockType = 'type' in block ? block.type : undefined;
101
104
  const blockText = 'text' in block ? block.text : undefined;
102
- if (role === 'user' && blockType === 'input_text' && isStringValue(blockText) && blockText.trim()) {
105
+ if (role === 'user' && blockType === 'input_text' && isStringValue(blockText) && blockText.trim() && !CODEX_INJECTED_USER_TEXT.test(blockText.trim())) {
103
106
  chunks.push(blockText.trim());
104
107
  }
105
108
  if (role === 'assistant' && blockType === 'output_text' && isStringValue(blockText) && blockText.trim()) {
@@ -11,8 +11,10 @@ export declare function fitWorkingState(state: WorkingState): WorkingState;
11
11
  /** Each empty field falls back to `existing`'s, since a tool-heavy tail derives no task; null when all are empty, so blanks never replace a snapshot.
12
12
  * Never across sessions: another session's task saved under this id would pass compact-resume's session check. */
13
13
  export declare function mergeWorkingState(derived: WorkingState, existing: TaskSnapshot | null, sessionId: string | null): WorkingState | null;
14
- /** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop the newest working state. */
14
+ /** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
15
+ * the newest working state. */
15
16
  export declare function truncateKeepNewest(text: string, maxChars: number): string;
16
- /** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged reason when nothing is derivable. */
17
+ /** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
18
+ * reason when nothing is derivable. */
17
19
  export declare function transcriptWorkingState(transcriptPath: string, log: (message: string) => void): Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null;
18
20
  //# sourceMappingURL=working-state.d.ts.map
@@ -36,7 +36,8 @@ export function mergeWorkingState(derived, existing, sessionId) {
36
36
  };
37
37
  return merged.task || merged.summary || merged.next_step ? merged : null;
38
38
  }
39
- /** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop the newest working state. */
39
+ /** Keeps the LAST maxChars behind a trim marker, aligned to a nearby line start: the summary runs oldest first, so a head cap would drop
40
+ * the newest working state. */
40
41
  export function truncateKeepNewest(text, maxChars) {
41
42
  if (text.length <= maxChars)
42
43
  return text;
@@ -123,7 +124,8 @@ function lastAssistantTextBlock(jsonl) {
123
124
  }
124
125
  return '';
125
126
  }
126
- /** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged reason when nothing is derivable. */
127
+ /** A session's task, summary and next step from its transcript tail, secrets scrubbed and capped, '' where none; null with a logged
128
+ * reason when nothing is derivable. */
127
129
  export function transcriptWorkingState(transcriptPath, log) {
128
130
  let tail = '';
129
131
  let rawTask = '';
@@ -1,28 +1,3 @@
1
- /** Audit log retention pruning: opt-in per tenant because retention floors (HIPAA, SOX, GDPR) apply.
2
- * The audit_prune row is written after the DELETE, so a call never prunes its own record. */
3
- export interface PruneAuditOpts {
4
- /** Cutoff in days. Rows with `ts < (now - N days)` are deleted. */
5
- olderThanDays: number;
6
- /** Tenant scope. Required: prune is always tenant-scoped. */
7
- tenantId: string;
8
- /** When true, count matching rows but do NOT delete. Default false. */
9
- dryRun?: boolean;
10
- /** Actor recording the prune in the audit trail. Default 'cli'. */
11
- actor?: string;
12
- }
13
- export interface PruneAuditResult {
14
- /** ISO timestamp of the cutoff. Rows with ts strictly less than this were deleted. */
15
- cutoff: string;
16
- /** Number of audit_log rows deleted (or that would be deleted, if dryRun). */
17
- count: number;
18
- /** Echo back whether this was a dry run. */
19
- dryRun: boolean;
20
- }
21
- /** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
22
- export declare function computeCutoff(days: number, now?: Date): string;
23
- /** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
24
- * Throws on non-positive days or a missing tenantId. */
25
- export declare function pruneAuditLog(hippoRoot: string, opts: PruneAuditOpts): PruneAuditResult;
26
1
  /** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
27
2
  export declare function parseOlderThanFlag(raw: string): number;
28
3
  //# sourceMappingURL=audit-prune.d.ts.map
@@ -1,30 +1,4 @@
1
- /** Audit log retention pruning: opt-in per tenant because retention floors (HIPAA, SOX, GDPR) apply.
2
- * The audit_prune row is written after the DELETE, so a call never prunes its own record. */
3
- import { pruneAuditRows } from '../store/audit.js';
4
- import { DAY_MS } from '../util/time.js';
5
- /** Cutoff ISO timestamp for N days ago; exported so tests can pin "now" without mocking Date. */
6
- export function computeCutoff(days, now = new Date()) {
7
- const cutoff = new Date(now.getTime() - days * DAY_MS);
8
- return cutoff.toISOString();
9
- }
10
- function isTenantIdString(value) {
11
- return typeof value === 'string';
12
- }
13
- /** Delete audit_log rows older than `olderThanDays` for `tenantId`, emitting an `audit_prune` event.
14
- * Throws on non-positive days or a missing tenantId. */
15
- export function pruneAuditLog(hippoRoot, opts) {
16
- if (!Number.isFinite(opts.olderThanDays) || opts.olderThanDays <= 0) {
17
- throw new Error(`pruneAuditLog: olderThanDays must be a positive number, got ${opts.olderThanDays}`);
18
- }
19
- if (!opts.tenantId || !isTenantIdString(opts.tenantId)) {
20
- throw new Error('pruneAuditLog: tenantId is required');
21
- }
22
- const dryRun = opts.dryRun === true;
23
- const actor = opts.actor ?? 'cli';
24
- const cutoff = computeCutoff(opts.olderThanDays);
25
- const count = pruneAuditRows(hippoRoot, { tenantId: opts.tenantId, cutoff, actor, olderThanDays: opts.olderThanDays, dryRun });
26
- return { cutoff, count, dryRun };
27
- }
1
+ // The `--older-than` flag of `hippo audit prune`; the prune itself is api.pruneAuditLog.
28
2
  /** Parse `--older-than`: bare integer days (`30`) or with a `d` suffix (`30d`); throws on any other format. */
29
3
  export function parseOlderThanFlag(raw) {
30
4
  const m = raw.match(/^(\d+)(d)?$/i);
package/dist/cli/audit.js CHANGED
@@ -1,14 +1,13 @@
1
1
  // `hippo audit`: list and prune the audit log.
2
- import { loadAllEntries } from '../store/entry-reads.js';
3
- import { memoriesBackingObjects } from '../store/delete-and-batch.js';
4
- import { auditMemories, AUDIT_OPS } from '../store/audit.js';
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
3
+ import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
4
+ import { AUDIT_OPS } from '../store/audit.js';
5
5
  import * as api from '../api/index.js';
6
- import { pruneAuditLog, parseOlderThanFlag } from './audit-prune.js';
6
+ import { parseOlderThanFlag } from './audit-prune.js';
7
7
  import { printError } from './output.js';
8
8
  import { cliApiContext } from './api-context.js';
9
9
  import { boolFlag, flagIsTrue, isBooleanFlag, stringFlag } from './flag-values.js';
10
10
  import { requireInit, resolveAuthRoot } from './shared.js';
11
- import { repairAutomaticMemories } from '../store/quality-repair.js';
12
11
  import { getGlobalRoot } from '../sharing/global-store.js';
13
12
  import { errorMessage } from '../util/log.js';
14
13
  import { CliExit } from './exit.js';
@@ -33,7 +32,7 @@ function readAuditOp(flags) {
33
32
  }
34
33
  function readAuditLimit(flags) {
35
34
  const limitRaw = flags['limit'];
36
- let limit = 100;
35
+ let limit = DEFAULT_LIST_LIMIT;
37
36
  if (limitRaw !== undefined && !isBooleanFlag(limitRaw)) {
38
37
  const parsed = parseInt(String(limitRaw), 10);
39
38
  if (!Number.isFinite(parsed)) {
@@ -73,7 +72,7 @@ async function cmdAuditList(hippoRoot, tenantId, flags) {
73
72
  console.log(formatAuditRow(ev));
74
73
  }
75
74
  }
76
- function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
75
+ async function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
77
76
  const olderThanRaw = stringFlag(flags, 'older-than') ?? '';
78
77
  if (!olderThanRaw) {
79
78
  printError('Usage: hippo audit prune --older-than <Nd> [--dry-run] [--tenant <t>]');
@@ -90,7 +89,7 @@ function cmdAuditPrune(hippoRoot, ctxTenantId, flags) {
90
89
  const tenantId = stringFlag(flags, 'tenant')?.trim() || ctxTenantId;
91
90
  const dryRun = flagIsTrue(flags, 'dry-run');
92
91
  const asJson = boolFlag(flags, 'json');
93
- const result = pruneAuditLog(hippoRoot, { olderThanDays, tenantId, dryRun, actor: 'cli' });
92
+ const result = await api.pruneAuditLog(cliApiContext(hippoRoot, tenantId), { olderThanDays, dryRun });
94
93
  if (asJson) {
95
94
  console.log(JSON.stringify(result));
96
95
  return;
@@ -108,15 +107,15 @@ async function cmdAuditLog(hippoRoot, tenantId, args, flags) {
108
107
  return;
109
108
  }
110
109
  if (sub === 'prune') {
111
- cmdAuditPrune(hippoRoot, tenantId, flags);
110
+ await cmdAuditPrune(hippoRoot, tenantId, flags);
112
111
  return;
113
112
  }
114
113
  printError(`Unknown audit subcommand: ${sub}. Expected: list | prune.`);
115
114
  throw new CliExit(1);
116
115
  }
117
- function auditRepair(hippoRoot, tenantId, flags) {
116
+ async function auditRepair(hippoRoot, tenantId, flags) {
118
117
  const apply = flagIsTrue(flags, 'apply') && flags['dry-run'] !== true;
119
- const result = repairAutomaticMemories(flags['global'] ? getGlobalRoot() : hippoRoot, { tenantId, apply });
118
+ const result = await api.repairMemoryQuality(cliApiContext(flags['global'] ? getGlobalRoot() : hippoRoot, tenantId), apply);
120
119
  if (flags['json']) {
121
120
  console.log(JSON.stringify(result));
122
121
  return;
@@ -124,8 +123,10 @@ function auditRepair(hippoRoot, tenantId, flags) {
124
123
  console.log(`Quality repair ${apply ? 'apply' : 'preview'}: ${result.issues.length} issue(s) across ${result.total} memories.`);
125
124
  for (const issue of result.issues)
126
125
  console.log(` [${issue.disposition}] ${issue.id}: ${issue.reason}${issue.protection ? ` (${issue.protection})` : ''}`);
127
- for (const blocker of result.blockers)
128
- console.log(` Blocked: ${blocker}. Repair never upgrades a store; any other hippo command does, then run repair again.`);
126
+ for (const blocker of result.blockers) {
127
+ console.log(` Blocked: ${blocker}. Repair never upgrades a store; ` +
128
+ 'any other hippo command does, then run repair again.');
129
+ }
129
130
  const restore = `hippo dormant restore <id>${flags['global'] ? ' --global' : ''}`;
130
131
  if (result.backup)
131
132
  console.log(`Backup: ${result.backup}\nMoved ${result.appliedIds.length} memories to dormant storage. Recovery: ${restore}.`);
@@ -136,7 +137,7 @@ function auditRepair(hippoRoot, tenantId, flags) {
136
137
  if (!apply)
137
138
  console.log('Preview only. Add --apply to move set-aside memories to dormant storage. Pin a review memory to keep it.');
138
139
  }
139
- function fixAuditErrors(hippoRoot, tenantId, result, flags) {
140
+ async function fixAuditErrors(hippoRoot, tenantId, result, flags) {
140
141
  const errors = result.issues.filter(i => i.severity === 'error');
141
142
  if (errors.length > 0 && flagIsTrue(flags, 'dry-run')) {
142
143
  console.log(`\nWould remove ${errors.length} error-severity memories (dry run, nothing deleted).`);
@@ -144,7 +145,7 @@ function fixAuditErrors(hippoRoot, tenantId, result, flags) {
144
145
  }
145
146
  else if (errors.length > 0) {
146
147
  const ctx = cliApiContext(hippoRoot, tenantId);
147
- const removedCount = api.removeAuditErrors(ctx, 'audit --fix', errors).length;
148
+ const removedCount = (await api.removeAuditErrors(ctx, 'audit --fix', errors)).length;
148
149
  console.log(`\nRemoved ${removedCount} error-severity memories.`);
149
150
  console.log(`${result.issues.length - errors.length} warnings remain (review manually).`);
150
151
  }
@@ -154,7 +155,7 @@ function fixAuditErrors(hippoRoot, tenantId, result, flags) {
154
155
  }
155
156
  export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
156
157
  if (args[0] === 'repair') {
157
- auditRepair(hippoRoot, tenantId, flags);
158
+ await auditRepair(hippoRoot, tenantId, flags);
158
159
  return;
159
160
  }
160
161
  // `audit list` and `audit prune` are the audit-log subcommands; other forms (no sub, --fix) keep the memory-quality auditor.
@@ -163,8 +164,7 @@ export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
163
164
  return;
164
165
  }
165
166
  requireInit(hippoRoot);
166
- const entries = loadAllEntries(hippoRoot, tenantId);
167
- const result = auditMemories(entries, memoriesBackingObjects(hippoRoot));
167
+ const result = await api.auditMemoryQuality(cliApiContext(hippoRoot, tenantId));
168
168
  const shouldFix = boolFlag(flags, 'fix');
169
169
  if (result.issues.length === 0) {
170
170
  console.log(`All ${result.total} memories passed quality checks.`);
@@ -174,10 +174,10 @@ export async function handleAudit({ hippoRoot, tenantId, args, flags }) {
174
174
  for (const issue of result.issues) {
175
175
  const icon = issue.severity === 'error' ? 'ERR' : 'WARN';
176
176
  console.log(` [${icon}] ${issue.memoryId}: ${issue.reason}`);
177
- console.log(` "${issue.content.slice(0, 80)}${issue.content.length > 80 ? '...' : ''}"`);
177
+ console.log(` "${truncateWithEllipsis(issue.content, 80)}"`);
178
178
  }
179
179
  if (shouldFix) {
180
- fixAuditErrors(hippoRoot, tenantId, result, flags);
180
+ await fixAuditErrors(hippoRoot, tenantId, result, flags);
181
181
  }
182
182
  else {
183
183
  console.log(`\nRun with --fix to auto-remove error-severity issues.`);
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleAuth({ hippoRoot, tenantId, args, flags }: CommandContext): void;
2
+ export declare function handleAuth({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=auth.d.ts.map
package/dist/cli/auth.js CHANGED
@@ -1,5 +1,4 @@
1
1
  // `hippo auth`: create, list, revoke and scope API keys.
2
- import { listApiKeys } from '../store/auth.js';
3
2
  import * as api from '../api/index.js';
4
3
  import { cliApiContext } from './api-context.js';
5
4
  import { printError } from './output.js';
@@ -29,7 +28,7 @@ function noteMintDefaults(roleGiven, expiryGiven) {
29
28
  if (notes.length > 0)
30
29
  printError(`hippo auth create: ${notes.join('; ')}.`);
31
30
  }
32
- function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
31
+ async function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
33
32
  const root = resolveAuthRoot(hippoRoot, flags);
34
33
  const tenantFlag = stringFlag(flags, 'tenant');
35
34
  const labelFlag = stringFlag(flags, 'label');
@@ -46,7 +45,7 @@ function cmdAuthCreate(hippoRoot, defaultTenantId, flags) {
46
45
  const ctx = cliApiContext(root, tenantFlag ?? defaultTenantId);
47
46
  let result;
48
47
  try {
49
- result = api.authCreate(ctx, { label: labelFlag, role, ttlDays, noExpiry: noExpiry || undefined });
48
+ result = await api.authCreate(ctx, { label: labelFlag, role, ttlDays, noExpiry: noExpiry || undefined });
50
49
  }
51
50
  catch (err) {
52
51
  if (!(err instanceof api.BadRequestError))
@@ -81,11 +80,11 @@ function formatKeyRow(item) {
81
80
  const revoked = item.revokedAt ?? '-';
82
81
  return `${item.keyId} ${item.tenantId} ${item.role} ${label} ${created} ${expires} ${revoked}`;
83
82
  }
84
- function cmdAuthList(hippoRoot, flags) {
83
+ function cmdAuthList(hippoRoot, tenantId, flags) {
85
84
  const root = resolveAuthRoot(hippoRoot, flags);
86
85
  const includeRevoked = boolFlag(flags, 'all');
87
86
  const asJson = boolFlag(flags, 'json');
88
- const items = listApiKeys(root, { active: !includeRevoked });
87
+ const items = api.authListAllTenants(cliApiContext(root, tenantId), !includeRevoked);
89
88
  if (asJson) {
90
89
  console.log(JSON.stringify(items));
91
90
  return;
@@ -100,20 +99,20 @@ function cmdAuthList(hippoRoot, flags) {
100
99
  }
101
100
  }
102
101
  // The local CLI owns every tenant, so revoke and grant run in the key's own tenant.
103
- function keyContext(root, tenantId, keyId) {
102
+ async function keyContext(root, tenantId, keyId) {
104
103
  const hostCtx = cliApiContext(root, tenantId);
105
- const keyTenant = api.authKeyTenant(hostCtx, keyId);
104
+ const keyTenant = await api.authKeyTenant(hostCtx, keyId);
106
105
  if (keyTenant === undefined) {
107
106
  printError(`Unknown key_id: ${keyId}`);
108
107
  throw new CliExit(1);
109
108
  }
110
109
  return { ...hostCtx, tenantId: keyTenant };
111
110
  }
112
- function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
113
- const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
111
+ async function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
112
+ const ctx = await keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
114
113
  let revokedAt;
115
114
  try {
116
- revokedAt = api.authRevoke(ctx, keyId).revokedAt;
115
+ revokedAt = (await api.authRevoke(ctx, keyId)).revokedAt;
117
116
  }
118
117
  catch (err) {
119
118
  printError(`Error: ${errorMessage(err)}`);
@@ -126,8 +125,8 @@ function cmdAuthRevoke(hippoRoot, tenantId, keyId, flags) {
126
125
  console.log(`Revoked ${keyId} at ${revokedAt}`);
127
126
  }
128
127
  /** `hippo auth grant|ungrant <key_id> <scope>`, routed through api so the tenant, restricted-scope and audit checks live in one place. */
129
- function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
130
- const ctx = keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
128
+ async function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
129
+ const ctx = await keyContext(resolveAuthRoot(hippoRoot, flags), tenantId, keyId);
131
130
  try {
132
131
  if (grant)
133
132
  api.authGrant(ctx, keyId, scope);
@@ -144,7 +143,7 @@ function cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, grant, flags) {
144
143
  }
145
144
  console.log(grant ? `Granted ${keyId} read access to ${scope}` : `Removed ${keyId}'s grant on ${scope}`);
146
145
  }
147
- export function handleAuth({ hippoRoot, tenantId, args, flags }) {
146
+ export async function handleAuth({ hippoRoot, tenantId, args, flags }) {
148
147
  const sub = args[0];
149
148
  if (!sub) {
150
149
  printError('Usage: hippo auth <create|list|revoke|grant|ungrant> [options]');
@@ -153,10 +152,10 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
153
152
  const subArgs = args.slice(1);
154
153
  switch (sub) {
155
154
  case 'create':
156
- cmdAuthCreate(hippoRoot, tenantId, flags);
155
+ await cmdAuthCreate(hippoRoot, tenantId, flags);
157
156
  return;
158
157
  case 'list':
159
- cmdAuthList(hippoRoot, flags);
158
+ cmdAuthList(hippoRoot, tenantId, flags);
160
159
  return;
161
160
  case 'revoke': {
162
161
  const keyId = subArgs[0];
@@ -164,7 +163,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
164
163
  printError('Usage: hippo auth revoke <key_id>');
165
164
  throw new CliExit(1);
166
165
  }
167
- cmdAuthRevoke(hippoRoot, tenantId, keyId, flags);
166
+ await cmdAuthRevoke(hippoRoot, tenantId, keyId, flags);
168
167
  return;
169
168
  }
170
169
  case 'grant':
@@ -174,7 +173,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
174
173
  printError(`Usage: hippo auth ${sub} <key_id> <scope>`);
175
174
  throw new CliExit(1);
176
175
  }
177
- cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, sub === 'grant', flags);
176
+ await cmdAuthScopeGrant(hippoRoot, tenantId, keyId, scope, sub === 'grant', flags);
178
177
  return;
179
178
  }
180
179
  default:
@@ -1,5 +1,2 @@
1
- import { type CommandContext } from './flag-values.js';
2
- export declare function handleProjectBrief({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
- export declare function handleGraph({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
- export declare function handleCustomerNote({ hippoRoot, tenantId, args, flags }: CommandContext): void;
1
+ export declare const handleProjectBrief: (ctx: import("./flag-values.js").CommandContext) => void;
5
2
  //# sourceMappingURL=briefs.d.ts.map