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,14 +1,21 @@
1
- // PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried request id gets the first answer.
1
+ // PostToolUseFailure for a caller on another machine: the lesson and its log row carry the caller's owner and project, and a retried
2
+ // request id gets the first answer.
2
3
  import { BadRequestError } from '../core/api-errors.js';
3
4
  import { storeLesson } from './capture-error.js';
4
- import { recordFailure, requestOutcome, settleFailureOutcome } from '../store/failure-log.js';
5
+ import { recordFailureAt, requestOutcomeAt, settleFailureOutcomeAt } from '../store/failure-log-at.js';
5
6
  import { errorMessage, log } from '../util/log.js';
6
7
  import { scrubForSharing } from './share-scrub.js';
7
8
  import { truncateCodePointSafe } from '../util/transcript-tail.js';
8
- import { assertRequestId, bindCaller, withCallerDb } from './caller-session.js';
9
+ import { assertRequestId, bindCaller } from './caller-session.js';
9
10
  import { FAILURE_TEXT_MAX_CHARS, failureHash } from './failure-reading.js';
10
11
  const SKIPS = { 'skipped-interrupt': true, 'skipped-routine': true, 'skipped-invalid': true };
11
- const ROUTINE_RULES = { declined: true, 'os-permission': true, 'no-match': true, 'search-tool': true, 'quiet-exit': true };
12
+ const ROUTINE_RULES = {
13
+ declined: true,
14
+ 'os-permission': true,
15
+ 'no-match': true,
16
+ 'search-tool': true,
17
+ 'quiet-exit': true,
18
+ };
12
19
  /** The shapes lessonFromFailure gives: text for a lesson or a routine skip, none for an interrupt or an unreadable payload, a rule only on a routine skip. */
13
20
  function checkedFailure(req) {
14
21
  assertRequestId(req.requestId);
@@ -35,7 +42,7 @@ function checkedFailure(req) {
35
42
  export function captureFailureForCaller(ctx, req) {
36
43
  const failure = checkedFailure(req);
37
44
  const key = bindCaller(ctx, req.sessionId, req.project);
38
- const earlier = withCallerDb(ctx, (db) => requestOutcome(db, ctx.tenantId, req.requestId, req.sessionId));
45
+ const earlier = requestOutcomeAt(ctx.hippoRoot, ctx.tenantId, req.requestId, req.sessionId);
39
46
  // A retry after a lost reply gets the first answer and writes nothing; one whose store failed tries the store again.
40
47
  if (earlier !== null && earlier !== 'store-failed')
41
48
  return { outcome: earlier };
@@ -54,17 +61,15 @@ export function captureFailureForCaller(ctx, req) {
54
61
  /** Runs after the outcome in its own try, so a log error never hides the store's error or its outcome. */
55
62
  function logOutcome(ctx, req, key, outcome, retried) {
56
63
  try {
57
- withCallerDb(ctx, (db) => {
58
- // The request id allows one row, so a retry rewrites the first try's outcome.
59
- if (retried) {
60
- settleFailureOutcome(db, ctx.tenantId, req.requestId, outcome);
61
- return;
62
- }
63
- recordFailure(db, {
64
- tenantId: ctx.tenantId, sessionId: req.sessionId, tool: req.tool, outcome, rule: req.rule,
65
- sigHash: req.text?.trim() ? failureHash(req.text) : null, detailHash: req.detailHash,
66
- ownerSubject: key.owner, originProject: req.project.name, requestId: req.requestId,
67
- });
64
+ // The request id allows one row, so a retry rewrites the first try's outcome.
65
+ if (retried) {
66
+ settleFailureOutcomeAt(ctx.hippoRoot, ctx.tenantId, req.requestId, outcome);
67
+ return;
68
+ }
69
+ recordFailureAt(ctx.hippoRoot, {
70
+ tenantId: ctx.tenantId, sessionId: req.sessionId, tool: req.tool, outcome, rule: req.rule,
71
+ sigHash: req.text?.trim() ? failureHash(req.text) : null, detailHash: req.detailHash,
72
+ ownerSubject: key.owner, originProject: req.project.name, requestId: req.requestId,
68
73
  });
69
74
  }
70
75
  catch (err) {
@@ -22,7 +22,8 @@ export declare function payloadString(payload: JsonValue, key: 'session_id' | 't
22
22
  export declare function failureSignature(text: string): string;
23
23
  /** The hash the failure log stores for a lesson text or a detail; one function so every writer counts repeats alike. */
24
24
  export declare function failureHash(text: string): string;
25
- /** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the cap, as a mask can be longer than what it hides. Pure. */
25
+ /** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
26
+ * cap, as a mask can be longer than what it hides. Pure. */
26
27
  export declare function lessonFromFailure(payload: JsonValue, scrub?: (text: string) => string): FailureReading;
27
28
  /** A failure as it may leave the machine: the capped lesson text and the detail's hash, never the untruncated detail. */
28
29
  export interface FailureReport {
@@ -3,7 +3,7 @@ import { redactSecretsStrict } from '../util/secret-detect.js';
3
3
  import { scrubForSharing } from './share-scrub.js';
4
4
  import { blockHash } from '../util/token-text.js';
5
5
  import { truncateCodePointSafe } from '../util/transcript-tail.js';
6
- import { isJsonObjectLiteral } from '../util/json.js';
6
+ import { isJsonObjectLiteral, isJsonString } from '../util/json.js';
7
7
  const COMMAND_HEAD_WORDS = 2;
8
8
  /** The longest lesson text a reading gives, so a check of a sent one imports it instead of copying it. */
9
9
  export const FAILURE_TEXT_MAX_CHARS = 200;
@@ -19,15 +19,12 @@ const QUIET_EXIT_1 = /^\s*(?:grep|rg|egrep|fgrep|find|test|\[|diff|cmp|git diff|
19
19
  // Claude Code's tool names, then the Copilot CLI's and VS Code's; tests/copilot-failure-reading.test.ts cites where each comes from.
20
20
  const SEARCH_TOOLS = new Set(['Grep', 'Glob', 'grep', 'glob', 'rg', 'grep_search', 'file_search', 'semantic_search']);
21
21
  const SHELL_TOOLS = new Set(['Bash', 'bash', 'powershell', 'run_in_terminal']);
22
- function isString(v) {
23
- return v !== undefined && v !== null && v.constructor === String;
24
- }
25
22
  /** A non-blank string field of the payload, or null. */
26
23
  export function payloadString(payload, key) {
27
24
  if (!isJsonObjectLiteral(payload))
28
25
  return null;
29
26
  const value = payload[key];
30
- return isString(value) && value.trim() !== '' ? value : null;
27
+ return isJsonString(value) && value.trim() !== '' ? value : null;
31
28
  }
32
29
  /** Normalised form used to spot repeats. The failure log keeps only its hash, so changing it breaks repeat counts. */
33
30
  export function failureSignature(text) {
@@ -37,7 +34,8 @@ export function failureSignature(text) {
37
34
  export function failureHash(text) {
38
35
  return blockHash(failureSignature(text));
39
36
  }
40
- /** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the cap, as a mask can be longer than what it hides. Pure. */
37
+ /** The memory text for a failure payload, or why it is not stored; a routine skip keeps its text for the log. `scrub` runs before the
38
+ * cap, as a mask can be longer than what it hides. Pure. */
41
39
  export function lessonFromFailure(payload, scrub = (text) => text) {
42
40
  if (!isJsonObjectLiteral(payload))
43
41
  return { skip: 'skipped-invalid', text: null, detail: null };
@@ -45,12 +43,12 @@ export function lessonFromFailure(payload, scrub = (text) => text) {
45
43
  const p = payload;
46
44
  if (p.is_interrupt === true)
47
45
  return { skip: 'skipped-interrupt', text: null, detail: null };
48
- if (!isString(p.error) || p.error.trim().length < 12)
46
+ if (!isJsonString(p.error) || p.error.trim().length < 12)
49
47
  return { skip: 'skipped-invalid', text: null, detail: null };
50
- const tool = isString(p.tool_name) ? p.tool_name : 'tool';
48
+ const tool = isJsonString(p.tool_name) ? p.tool_name : 'tool';
51
49
  const error = redactSecretsStrict(p.error.replace(/\s+/g, ' ').trim());
52
50
  const text = truncateCodePointSafe(scrub(`${tool}: ${error}`), FAILURE_TEXT_MAX_CHARS);
53
- const command = isJsonObjectLiteral(p.tool_input) && isString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
51
+ const command = isJsonObjectLiteral(p.tool_input) && isJsonString(p.tool_input['command']) ? p.tool_input['command'].replace(LEADING_CD, '') : '';
54
52
  const head = command.trim().split(/\s+/).slice(0, COMMAND_HEAD_WORDS).join(' ');
55
53
  const detail = `${tool}${head ? ` ${head}` : ''}: ${error}`;
56
54
  const routine = (rule) => ({ skip: 'skipped-routine', rule, text, detail });
@@ -1,7 +1,8 @@
1
- import { markSnapshotSaved, PRE_COMPACT_INSTRUCTION, startCompaction } from './compaction-record.js';
1
+ import { PRE_COMPACT_INSTRUCTION } from './compaction-record.js';
2
+ import { markSnapshotSavedAt, startCompactionAt } from '../store/compaction-caller.js';
2
3
  import { errorMessage, log } from '../util/log.js';
3
4
  import { loadActiveTaskSnapshot, saveActiveTaskSnapshot } from '../store/sessions.js';
4
- import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState, withCallerDb } from './caller-session.js';
5
+ import { assertTrigger, bindCaller, callerInHoldout, checkedWorkingState } from './caller-session.js';
5
6
  import { mergeWorkingState } from './working-state.js';
6
7
  /** A failed step is logged and the instruction still goes out, as the local hook prints it before any store work. */
7
8
  function logged(what, fn) {
@@ -20,10 +21,10 @@ export function preCompactForCaller(ctx, req) {
20
21
  if (callerInHoldout(ctx, req.sessionId))
21
22
  return { stdout: '' };
22
23
  const start = { sessionId: req.sessionId, originProject: req.project.name, trigger: req.trigger, cwd: null, transcriptPath: null };
23
- const recordId = logged('compaction record not started', () => withCallerDb(ctx, (db) => startCompaction(db, ctx.tenantId, start)));
24
+ const recordId = logged('compaction record not started', () => startCompactionAt(ctx.hippoRoot, ctx.tenantId, start));
24
25
  if (state !== null && saveOwnerSnapshot(ctx, req.sessionId, key, state) && recordId !== null) {
25
26
  // Marked under ctx.tenantId, which the environment's tenant may not be.
26
- logged('compaction record not marked with its snapshot', () => withCallerDb(ctx, (db) => markSnapshotSaved(db, ctx.tenantId, recordId)));
27
+ logged('compaction record not marked with its snapshot', () => markSnapshotSavedAt(ctx.hippoRoot, ctx.tenantId, recordId));
27
28
  }
28
29
  return { stdout: PRE_COMPACT_INSTRUCTION };
29
30
  }
@@ -10,9 +10,9 @@ import { USER_SEGMENT } from '../util/home-path.js';
10
10
  import { errorMessage } from '../util/log.js';
11
11
  import { SESSION_DIGEST_TAG } from '../core/session-digest-row.js';
12
12
  import { createMemory, Layer } from '../core/memory.js';
13
- import { RejectedValueError } from '../store/rejection.js';
13
+ import { RejectedValueError } from '../core/api-errors.js';
14
14
  import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
15
- import { isInitialized } from '../store/open.js';
15
+ import { isInitialized } from '../core/project-identity.js';
16
16
  import { writeEntry } from '../store/entry-writes.js';
17
17
  import { loadLiveContentsBySourceAndTag } from '../store/entry-reads.js';
18
18
  import { SNAPSHOT_AMBIENT_MAX_AGE_MS } from '../store/sessions.js';
@@ -336,7 +336,8 @@ const ANCHORS = [
336
336
  /(?:^|\s)#\d+\b/,
337
337
  ];
338
338
  /** Each marker states a cause or a choice, the part of a lesson that transfers. */
339
- const MARKERS = /\b(?:because|caused by|due to|root cause|the (?:bug|issue|problem) was|fail(?:s|ed) when|so that|otherwise|instead of|rather than|switched to|decided|chose|must|never|always|do not)\b/i;
339
+ const MARKERS = new RegExp('\\b(?:because|caused by|due to|root cause|the (?:bug|issue|problem) was|fail(?:s|ed) when|so that|otherwise|' +
340
+ 'instead of|rather than|switched to|decided|chose|must|never|always|do not)\\b', 'i');
340
341
  const FENCE = /^\s*(`{3,}|~{3,})/;
341
342
  const STRUCTURE_LINE = /^\s*(?:#{1,6}\s|\||>|([-*_])(?:\s*\1){2,}\s*$)/;
342
343
  const PROTECTED = /`[^`\n]+`|\b(?:e\.g|i\.e)\./gi;
@@ -11,7 +11,8 @@ function checkedEvidence(evidence) {
11
11
  const { gitRef = null, dirtyTree = null, testStatus = null } = evidence;
12
12
  // `git rev-parse HEAD` gives 40 hex, or 64 in a SHA-256 repository.
13
13
  if (gitRef !== null && !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(gitRef))
14
- throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or null');
14
+ throw new BadRequestError('evidence gitRef: 40 or 64 lowercase hex characters or ' +
15
+ 'null');
15
16
  if (dirtyTree !== null && dirtyTree !== true && dirtyTree !== false)
16
17
  throw new BadRequestError('evidence dirtyTree: true, false or null');
17
18
  if (testStatus !== null && !TEST_STATUSES.has(testStatus))
@@ -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';
5
+ import { homeDir } from '../util/agent-homes.js';
7
6
  import { 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))
@@ -135,7 +134,7 @@ export async function runSessionWorker(sessionId, mode, work) {
135
134
  }
136
135
  }
137
136
  function turnKey(turn) {
138
- return createHash('sha256').update(`${turn.role}\n${turn.text}`).digest('hex').slice(0, FINGERPRINT_HEX_CHARS);
137
+ return blockHash(`${turn.role}\n${turn.text}`);
139
138
  }
140
139
  /** The cursor position after `turns`: how many there were and a hash of the last. */
141
140
  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)) {
@@ -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 = api.pruneAuditLog(cliApiContext(hippoRoot, tenantId), { olderThanDays, dryRun });
94
93
  if (asJson) {
95
94
  console.log(JSON.stringify(result));
96
95
  return;
@@ -116,7 +115,7 @@ async function cmdAuditLog(hippoRoot, tenantId, args, flags) {
116
115
  }
117
116
  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 = 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}.`);
@@ -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 = 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,7 +174,7 @@ 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
180
  fixAuditErrors(hippoRoot, tenantId, result, flags);
@@ -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';
@@ -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,17 +99,17 @@ 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
115
  revokedAt = api.authRevoke(ctx, keyId).revokedAt;
@@ -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]');
@@ -156,7 +155,7 @@ export function handleAuth({ hippoRoot, tenantId, args, flags }) {
156
155
  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