hippo-memory 1.72.0 → 2.1.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 (995) hide show
  1. package/README.md +6 -4
  2. package/dist/agent-memories/apply.d.ts +7 -5
  3. package/dist/agent-memories/apply.js +66 -39
  4. package/dist/agent-memories/claude-code.d.ts +8 -2
  5. package/dist/agent-memories/claude-code.js +26 -7
  6. package/dist/agent-memories/copilot.js +2 -1
  7. package/dist/agent-memories/files.js +2 -1
  8. package/dist/agent-memories/legacy.d.ts +6 -3
  9. package/dist/agent-memories/legacy.js +35 -14
  10. package/dist/agent-memories/markdown.d.ts +3 -1
  11. package/dist/agent-memories/markdown.js +3 -1
  12. package/dist/agent-memories/openclaw.js +5 -2
  13. package/dist/agent-memories/plan.js +11 -1
  14. package/dist/agent-memories/project-folds.js +2 -1
  15. package/dist/agent-memories/report.d.ts +4 -1
  16. package/dist/agent-memories/report.js +43 -9
  17. package/dist/agent-memories/source.d.ts +8 -2
  18. package/dist/agent-memories/source.js +11 -3
  19. package/dist/agent-memories/sync.d.ts +7 -2
  20. package/dist/agent-memories/sync.js +141 -101
  21. package/dist/api/assemble.d.ts +6 -4
  22. package/dist/api/assemble.js +11 -5
  23. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  24. package/dist/api/auth/audit.js +58 -0
  25. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
  26. package/dist/api/{auth.js → auth/auth.js} +66 -54
  27. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  28. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
  29. package/dist/api/auth/session-owners.d.ts +10 -0
  30. package/dist/api/auth/session-owners.js +35 -0
  31. package/dist/api/availability.d.ts +3 -1
  32. package/dist/api/availability.js +3 -1
  33. package/dist/api/busy.d.ts +2 -0
  34. package/dist/api/busy.js +2 -0
  35. package/dist/api/cli-surface.d.ts +6 -0
  36. package/dist/api/cli-surface.js +6 -0
  37. package/dist/api/config-of.d.ts +5 -0
  38. package/dist/api/config-of.js +6 -0
  39. package/dist/api/context-auto.d.ts +4 -1
  40. package/dist/api/context-auto.js +14 -4
  41. package/dist/api/context-render.js +14 -7
  42. package/dist/api/context-select.d.ts +4 -1
  43. package/dist/api/context-select.js +31 -34
  44. package/dist/api/context-types.d.ts +38 -12
  45. package/dist/api/context.d.ts +8 -5
  46. package/dist/api/context.js +120 -63
  47. package/dist/api/continuity.d.ts +24 -21
  48. package/dist/api/continuity.js +18 -20
  49. package/dist/api/correction-latency.d.ts +3 -1
  50. package/dist/api/correction-latency.js +3 -1
  51. package/dist/api/error-reply.d.ts +4 -1
  52. package/dist/api/error-reply.js +12 -3
  53. package/dist/api/index.d.ts +39 -23
  54. package/dist/api/index.js +21 -23
  55. package/dist/api/instruction-detect.d.ts +4 -1
  56. package/dist/api/instruction-detect.js +75 -20
  57. package/dist/api/ledger-db.d.ts +15 -11
  58. package/dist/api/ledger-db.js +21 -23
  59. package/dist/api/memories/conflicts.d.ts +33 -0
  60. package/dist/api/memories/conflicts.js +67 -0
  61. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  62. package/dist/api/{forget.js → memories/forget.js} +23 -17
  63. package/dist/api/memories/memories.d.ts +27 -0
  64. package/dist/api/memories/memories.js +52 -0
  65. package/dist/api/memories/outcome.d.ts +22 -0
  66. package/dist/api/memories/outcome.js +28 -0
  67. package/dist/api/memories/promote.d.ts +40 -0
  68. package/dist/api/memories/promote.js +76 -0
  69. package/dist/api/memories/refine.d.ts +10 -0
  70. package/dist/api/memories/refine.js +12 -0
  71. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
  72. package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
  73. package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
  74. package/dist/api/{remember.js → memories/remember.js} +50 -32
  75. package/dist/api/objects/cards.d.ts +39 -0
  76. package/dist/api/{cards.js → objects/cards.js} +12 -14
  77. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  78. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
  79. package/dist/api/objects/goals.d.ts +18 -0
  80. package/dist/api/{goals.js → objects/goals.js} +12 -12
  81. package/dist/api/objects/graph.d.ts +11 -0
  82. package/dist/api/objects/graph.js +16 -0
  83. package/dist/api/objects/objects.d.ts +9 -0
  84. package/dist/api/{objects.js → objects/objects.js} +2 -3
  85. package/dist/api/objects/predictions.d.ts +11 -0
  86. package/dist/api/{predictions.js → objects/predictions.js} +7 -5
  87. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  88. package/dist/api/{projects.js → objects/projects.js} +8 -4
  89. package/dist/api/pilot-arm.d.ts +8 -4
  90. package/dist/api/pilot-arm.js +5 -4
  91. package/dist/api/prompt-hook.d.ts +35 -20
  92. package/dist/api/prompt-hook.js +66 -44
  93. package/dist/api/provenance-coverage.d.ts +3 -1
  94. package/dist/api/provenance-coverage.js +3 -1
  95. package/dist/api/recall/finish.d.ts +185 -0
  96. package/dist/api/recall/finish.js +301 -0
  97. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  98. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
  99. package/dist/api/recall/recall.d.ts +6 -0
  100. package/dist/api/{recall.js → recall/recall.js} +116 -72
  101. package/dist/api/recall/render.d.ts +39 -0
  102. package/dist/api/recall/render.js +60 -0
  103. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  104. package/dist/api/recall/request.js +261 -0
  105. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  106. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  107. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
  108. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  109. package/dist/api/session-end.d.ts +36 -8
  110. package/dist/api/session-end.js +71 -25
  111. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  112. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  113. package/dist/api/sleep/dormant.d.ts +25 -0
  114. package/dist/api/sleep/dormant.js +64 -0
  115. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  116. package/dist/api/sleep/learn.js +138 -0
  117. package/dist/api/sleep/sleep-run.d.ts +38 -0
  118. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
  119. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  120. package/dist/api/sleep/sleep.js +9 -0
  121. package/dist/api/status.d.ts +3 -1
  122. package/dist/api/status.js +3 -1
  123. package/dist/api/store-init.d.ts +4 -1
  124. package/dist/api/store-init.js +4 -1
  125. package/dist/api/tokens.d.ts +10 -9
  126. package/dist/api/tokens.js +9 -10
  127. package/dist/api/types.d.ts +27 -12
  128. package/dist/api/types.js +13 -4
  129. package/dist/capture/caller-session.d.ts +8 -2
  130. package/dist/capture/caller-session.js +16 -6
  131. package/dist/capture/capture-error.d.ts +3 -1
  132. package/dist/capture/capture-error.js +3 -1
  133. package/dist/capture/codex-patch.js +7 -2
  134. package/dist/capture/command.d.ts +4 -2
  135. package/dist/capture/command.js +34 -15
  136. package/dist/capture/compact-resume-caller.js +15 -8
  137. package/dist/capture/compact.d.ts +8 -5
  138. package/dist/capture/compact.js +34 -23
  139. package/dist/capture/compaction-items-caller.js +9 -3
  140. package/dist/capture/compaction-record.d.ts +4 -3
  141. package/dist/capture/compaction-record.js +20 -12
  142. package/dist/capture/compaction-spool.d.ts +18 -9
  143. package/dist/capture/compaction-spool.js +105 -63
  144. package/dist/capture/copilot-transcript.d.ts +11 -3
  145. package/dist/capture/copilot-transcript.js +16 -6
  146. package/dist/capture/extract.js +20 -8
  147. package/dist/capture/failure-caller.js +23 -12
  148. package/dist/capture/failure-reading.d.ts +10 -3
  149. package/dist/capture/failure-reading.js +24 -7
  150. package/dist/capture/pre-compact-caller.js +11 -4
  151. package/dist/capture/session-digest.d.ts +15 -4
  152. package/dist/capture/session-digest.js +39 -13
  153. package/dist/capture/session-end-caller.d.ts +4 -1
  154. package/dist/capture/session-end-caller.js +20 -8
  155. package/dist/capture/session-texts.d.ts +6 -2
  156. package/dist/capture/session-texts.js +22 -7
  157. package/dist/capture/session-worker.d.ts +4 -2
  158. package/dist/capture/session-worker.js +58 -17
  159. package/dist/capture/transcript.d.ts +13 -4
  160. package/dist/capture/transcript.js +32 -10
  161. package/dist/capture/working-state.d.ts +13 -4
  162. package/dist/capture/working-state.js +50 -56
  163. package/dist/cli/api-context.d.ts +14 -2
  164. package/dist/cli/api-context.js +45 -2
  165. package/dist/cli/audit.js +33 -33
  166. package/dist/cli/auth.js +23 -31
  167. package/dist/cli/briefs.d.ts +1 -1
  168. package/dist/cli/briefs.js +20 -15
  169. package/dist/cli/card.d.ts +1 -1
  170. package/dist/cli/card.js +56 -73
  171. package/dist/cli/client.d.ts +12 -5
  172. package/dist/cli/client.js +53 -23
  173. package/dist/cli/compact-resume-payload.d.ts +4 -1
  174. package/dist/cli/compact-resume-payload.js +12 -5
  175. package/dist/cli/context.js +43 -18
  176. package/dist/cli/continuity.d.ts +5 -5
  177. package/dist/cli/continuity.js +90 -107
  178. package/dist/cli/curate.d.ts +5 -4
  179. package/dist/cli/curate.js +55 -77
  180. package/dist/cli/dag.d.ts +1 -1
  181. package/dist/cli/dag.js +14 -17
  182. package/dist/cli/decisions.js +30 -30
  183. package/dist/cli/eval.js +16 -21
  184. package/dist/cli/exit.d.ts +4 -1
  185. package/dist/cli/exit.js +10 -2
  186. package/dist/cli/explain.js +12 -11
  187. package/dist/cli/flag-values.d.ts +1 -1
  188. package/dist/cli/flag-values.js +9 -18
  189. package/dist/cli/github.d.ts +6 -0
  190. package/dist/cli/github.js +25 -13
  191. package/dist/cli/goals.d.ts +1 -1
  192. package/dist/cli/goals.js +39 -56
  193. package/dist/cli/graph.d.ts +1 -1
  194. package/dist/cli/graph.js +15 -11
  195. package/dist/cli/hook-runtime.d.ts +34 -10
  196. package/dist/cli/hook-runtime.js +41 -16
  197. package/dist/cli/incidents.d.ts +1 -1
  198. package/dist/cli/incidents.js +25 -25
  199. package/dist/cli/init.d.ts +1 -1
  200. package/dist/cli/init.js +35 -20
  201. package/dist/cli/install-steps.d.ts +12 -3
  202. package/dist/cli/install-steps.js +42 -18
  203. package/dist/cli/last-sleep.d.ts +4 -1
  204. package/dist/cli/last-sleep.js +9 -4
  205. package/dist/cli/maintenance.d.ts +1 -1
  206. package/dist/cli/maintenance.js +11 -12
  207. package/dist/cli/notes.d.ts +1 -1
  208. package/dist/cli/notes.js +8 -5
  209. package/dist/cli/object-verbs.d.ts +5 -5
  210. package/dist/cli/object-verbs.js +13 -16
  211. package/dist/cli/open-browser.js +11 -2
  212. package/dist/cli/playbooks.d.ts +3 -3
  213. package/dist/cli/playbooks.js +40 -32
  214. package/dist/cli/predictions.js +17 -22
  215. package/dist/cli/print.js +4 -2
  216. package/dist/cli/projects.js +21 -11
  217. package/dist/cli/quality-repair-once.d.ts +1 -1
  218. package/dist/cli/quality-repair-once.js +7 -6
  219. package/dist/cli/recall.js +129 -93
  220. package/dist/cli/refine-llm.d.ts +15 -4
  221. package/dist/cli/refine-llm.js +17 -7
  222. package/dist/cli/remember.js +51 -55
  223. package/dist/cli/scheduler.d.ts +4 -1
  224. package/dist/cli/scheduler.js +9 -5
  225. package/dist/cli/serve.js +28 -18
  226. package/dist/cli/session-hooks.d.ts +2 -6
  227. package/dist/cli/session-hooks.js +140 -112
  228. package/dist/cli/setup.d.ts +1 -1
  229. package/dist/cli/setup.js +56 -34
  230. package/dist/cli/shared.d.ts +4 -2
  231. package/dist/cli/shared.js +26 -11
  232. package/dist/cli/slack.js +15 -24
  233. package/dist/cli/sleep-render.d.ts +3 -1
  234. package/dist/cli/sleep-render.js +8 -5
  235. package/dist/cli/sleep.js +16 -8
  236. package/dist/cli/status.d.ts +4 -4
  237. package/dist/cli/status.js +32 -27
  238. package/dist/cli/stdin.d.ts +10 -3
  239. package/dist/cli/stdin.js +10 -3
  240. package/dist/cli/transfer.d.ts +4 -4
  241. package/dist/cli/transfer.js +97 -82
  242. package/dist/cli/usage.d.ts +1 -1
  243. package/dist/cli/usage.js +1 -1
  244. package/dist/cli/verb-row.d.ts +2 -0
  245. package/dist/cli/verbs/health.js +2 -0
  246. package/dist/cli/verbs/memory.js +47 -53
  247. package/dist/cli/verbs/objects.js +16 -7
  248. package/dist/cli/verbs/sessions.js +4 -2
  249. package/dist/cli/versioned-verbs.d.ts +8 -7
  250. package/dist/cli/versioned-verbs.js +31 -21
  251. package/dist/cli.js +14 -18
  252. package/dist/connectors/dlq.d.ts +6 -6
  253. package/dist/connectors/dlq.js +12 -7
  254. package/dist/connectors/github/backfill.d.ts +4 -4
  255. package/dist/connectors/github/backfill.js +6 -4
  256. package/dist/connectors/github/deletion.d.ts +6 -4
  257. package/dist/connectors/github/deletion.js +5 -4
  258. package/dist/connectors/github/dlq.d.ts +8 -6
  259. package/dist/connectors/github/dlq.js +11 -5
  260. package/dist/connectors/github/ingest.d.ts +2 -2
  261. package/dist/connectors/github/ingest.js +9 -5
  262. package/dist/connectors/github/octokit-client.d.ts +3 -1
  263. package/dist/connectors/github/octokit-client.js +7 -2
  264. package/dist/connectors/github/ratelimit.d.ts +6 -2
  265. package/dist/connectors/github/ratelimit.js +6 -2
  266. package/dist/connectors/github/signature.d.ts +14 -3
  267. package/dist/connectors/github/signature.js +17 -3
  268. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  269. package/dist/connectors/github/tenant-routing.js +6 -5
  270. package/dist/connectors/github/transform.js +50 -67
  271. package/dist/connectors/github/types.d.ts +10 -3
  272. package/dist/connectors/github/types.js +6 -2
  273. package/dist/connectors/github/webhook.d.ts +5 -5
  274. package/dist/connectors/github/webhook.js +36 -23
  275. package/dist/connectors/ingest.d.ts +5 -3
  276. package/dist/connectors/ingest.js +3 -3
  277. package/dist/connectors/slack/backfill.d.ts +5 -5
  278. package/dist/connectors/slack/backfill.js +3 -3
  279. package/dist/connectors/slack/deletion.d.ts +4 -4
  280. package/dist/connectors/slack/deletion.js +6 -5
  281. package/dist/connectors/slack/dlq.d.ts +4 -4
  282. package/dist/connectors/slack/dlq.js +6 -6
  283. package/dist/connectors/slack/ingest.d.ts +6 -4
  284. package/dist/connectors/slack/ingest.js +5 -4
  285. package/dist/connectors/slack/signature.d.ts +4 -1
  286. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  287. package/dist/connectors/slack/tenant-routing.js +6 -5
  288. package/dist/connectors/slack/transform.d.ts +6 -2
  289. package/dist/connectors/slack/transform.js +6 -2
  290. package/dist/connectors/slack/types.d.ts +3 -1
  291. package/dist/connectors/slack/web-client.js +8 -3
  292. package/dist/connectors/slack/webhook.d.ts +5 -5
  293. package/dist/connectors/slack/webhook.js +19 -11
  294. package/dist/connectors/slack/workspaces.d.ts +7 -3
  295. package/dist/connectors/slack/workspaces.js +7 -3
  296. package/dist/connectors/store.d.ts +8 -0
  297. package/dist/connectors/store.js +2 -0
  298. package/dist/consolidate/conflicts.js +24 -10
  299. package/dist/consolidate/dag-summary.js +2 -1
  300. package/dist/consolidate/dag.d.ts +10 -5
  301. package/dist/consolidate/dag.js +45 -39
  302. package/dist/consolidate/decay.js +19 -6
  303. package/dist/consolidate/dedupe.d.ts +14 -5
  304. package/dist/consolidate/dedupe.js +28 -17
  305. package/dist/consolidate/flush-units.d.ts +4 -1
  306. package/dist/consolidate/flush-units.js +4 -1
  307. package/dist/consolidate/half-life-migration.d.ts +18 -8
  308. package/dist/consolidate/half-life-migration.js +48 -18
  309. package/dist/consolidate/llm-passes.js +27 -11
  310. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  311. package/dist/consolidate/memory-value-weights.js +6 -2
  312. package/dist/consolidate/memory-value.d.ts +30 -10
  313. package/dist/consolidate/memory-value.js +37 -14
  314. package/dist/consolidate/merge.d.ts +4 -1
  315. package/dist/consolidate/merge.js +47 -37
  316. package/dist/consolidate/overlap-index.d.ts +8 -2
  317. package/dist/consolidate/overlap-index.js +11 -4
  318. package/dist/consolidate/physics-pass.d.ts +3 -1
  319. package/dist/consolidate/physics-pass.js +10 -7
  320. package/dist/consolidate/replay.d.ts +11 -4
  321. package/dist/consolidate/replay.js +19 -7
  322. package/dist/consolidate/run.d.ts +13 -5
  323. package/dist/consolidate/run.js +4 -4
  324. package/dist/consolidate/sleep.d.ts +14 -6
  325. package/dist/consolidate/sleep.js +42 -39
  326. package/dist/consolidate/trace.d.ts +7 -2
  327. package/dist/consolidate/trace.js +7 -2
  328. package/dist/consolidate/traces.js +27 -30
  329. package/dist/core/ablation.d.ts +9 -3
  330. package/dist/core/ablation.js +14 -4
  331. package/dist/core/active-scope.d.ts +3 -1
  332. package/dist/core/active-scope.js +3 -1
  333. package/dist/core/agent-memory-tools.d.ts +2 -0
  334. package/dist/core/agent-memory-tools.js +2 -0
  335. package/dist/core/ambient.d.ts +4 -3
  336. package/dist/core/ambient.js +8 -6
  337. package/dist/core/api-errors.d.ts +9 -3
  338. package/dist/core/api-errors.js +9 -3
  339. package/dist/core/capture-contract.d.ts +4 -1
  340. package/dist/core/capture-contract.js +27 -8
  341. package/dist/core/compare.d.ts +24 -8
  342. package/dist/core/compare.js +24 -8
  343. package/dist/core/config.d.ts +18 -9
  344. package/dist/core/config.js +38 -29
  345. package/dist/core/cosine.d.ts +4 -1
  346. package/dist/core/cosine.js +4 -1
  347. package/dist/core/handoff.d.ts +7 -2
  348. package/dist/core/handoff.js +4 -1
  349. package/dist/core/markdown.js +22 -17
  350. package/dist/core/memory-audit.js +14 -3
  351. package/dist/core/memory-quality.d.ts +12 -3
  352. package/dist/core/memory-quality.js +57 -21
  353. package/dist/core/memory.d.ts +87 -30
  354. package/dist/core/memory.js +82 -33
  355. package/dist/core/merged-row.d.ts +8 -2
  356. package/dist/core/merged-row.js +10 -3
  357. package/dist/core/package-root.d.ts +3 -1
  358. package/dist/core/package-root.js +3 -1
  359. package/dist/core/particle-refresh.d.ts +8 -0
  360. package/dist/core/particle-refresh.js +22 -0
  361. package/dist/core/physics-config.d.ts +4 -1
  362. package/dist/core/physics-config.js +6 -2
  363. package/dist/core/physics.d.ts +39 -11
  364. package/dist/core/physics.js +71 -21
  365. package/dist/core/project-identity.d.ts +34 -17
  366. package/dist/core/project-identity.js +35 -18
  367. package/dist/core/project-remote.d.ts +8 -4
  368. package/dist/core/project-remote.js +31 -14
  369. package/dist/core/recall-scope.d.ts +33 -11
  370. package/dist/core/recall-scope.js +42 -15
  371. package/dist/core/rejection-digest.d.ts +7 -0
  372. package/dist/core/rejection-digest.js +13 -0
  373. package/dist/core/salience.d.ts +3 -1
  374. package/dist/core/salience.js +10 -4
  375. package/dist/core/search-types.d.ts +15 -2
  376. package/dist/core/search-types.js +11 -0
  377. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  378. package/dist/dashboard/dashboard-actions.js +18 -7
  379. package/dist/dashboard/dashboard-queries.js +2 -7
  380. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  381. package/dist/dashboard/dashboard-snapshot.js +5 -7
  382. package/dist/dashboard/dashboard.js +22 -8
  383. package/dist/db/backup.js +2 -2
  384. package/dist/db/busy.d.ts +10 -3
  385. package/dist/db/busy.js +27 -5
  386. package/dist/db/connect.d.ts +10 -2
  387. package/dist/db/connect.js +8 -2
  388. package/dist/db/continuity.d.ts +1 -1
  389. package/dist/db/continuity.js +27 -11
  390. package/dist/db/meta.d.ts +4 -1
  391. package/dist/db/meta.js +4 -1
  392. package/dist/db/migrate.d.ts +10 -5
  393. package/dist/db/migrate.js +40 -20
  394. package/dist/db/migrations/index.d.ts +1 -1
  395. package/dist/db/migrations/index.js +3 -1
  396. package/dist/db/migrations/types.d.ts +2 -1
  397. package/dist/db/migrations/v11.js +1 -0
  398. package/dist/db/migrations/v12.js +2 -1
  399. package/dist/db/migrations/v14.js +2 -0
  400. package/dist/db/migrations/v15.js +4 -2
  401. package/dist/db/migrations/v16.js +6 -3
  402. package/dist/db/migrations/v17.js +2 -1
  403. package/dist/db/migrations/v19.js +4 -2
  404. package/dist/db/migrations/v20.js +2 -1
  405. package/dist/db/migrations/v22.js +12 -6
  406. package/dist/db/migrations/v23.js +6 -3
  407. package/dist/db/migrations/v24.js +6 -3
  408. package/dist/db/migrations/v25.js +4 -2
  409. package/dist/db/migrations/v26.js +4 -2
  410. package/dist/db/migrations/v27.js +6 -3
  411. package/dist/db/migrations/v28.js +4 -2
  412. package/dist/db/migrations/v29.js +4 -2
  413. package/dist/db/migrations/v30.js +6 -3
  414. package/dist/db/migrations/v31.js +4 -2
  415. package/dist/db/migrations/v32.js +6 -3
  416. package/dist/db/migrations/v33.js +4 -2
  417. package/dist/db/migrations/v34.js +2 -1
  418. package/dist/db/migrations/v35.js +2 -1
  419. package/dist/db/migrations/v36.js +2 -1
  420. package/dist/db/migrations/v37.js +10 -5
  421. package/dist/db/migrations/v38.js +10 -5
  422. package/dist/db/migrations/v39.js +14 -6
  423. package/dist/db/migrations/v40.js +4 -2
  424. package/dist/db/migrations/v41.js +4 -2
  425. package/dist/db/migrations/v42.js +2 -1
  426. package/dist/db/migrations/v44.js +4 -2
  427. package/dist/db/migrations/v45.js +4 -2
  428. package/dist/db/migrations/v49.js +2 -1
  429. package/dist/db/migrations/v50.js +4 -2
  430. package/dist/db/migrations/v51.js +4 -2
  431. package/dist/db/migrations/v52.js +2 -1
  432. package/dist/db/migrations/v53.js +8 -4
  433. package/dist/db/migrations/v54.js +2 -1
  434. package/dist/db/migrations/v55.js +4 -2
  435. package/dist/db/migrations/v56.d.ts +3 -0
  436. package/dist/db/migrations/v56.js +28 -0
  437. package/dist/db/open.d.ts +24 -12
  438. package/dist/db/open.js +25 -13
  439. package/dist/db/physics-state.d.ts +8 -8
  440. package/dist/db/physics-state.js +17 -50
  441. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  442. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  443. package/dist/db/request-stores.d.ts +20 -5
  444. package/dist/db/request-stores.js +15 -5
  445. package/dist/db/tables.d.ts +2 -1
  446. package/dist/db/tables.js +12 -4
  447. package/dist/db/vector-store.d.ts +13 -4
  448. package/dist/db/vector-store.js +35 -14
  449. package/dist/db/wal-checkpointer.d.ts +2 -1
  450. package/dist/db/wal-checkpointer.js +19 -7
  451. package/dist/doctor.d.ts +7 -1
  452. package/dist/doctor.js +128 -46
  453. package/dist/embeddings/local.d.ts +8 -4
  454. package/dist/embeddings/local.js +11 -7
  455. package/dist/embeddings/provider.d.ts +19 -10
  456. package/dist/embeddings/provider.js +32 -27
  457. package/dist/embeddings/transformers.d.ts +16 -4
  458. package/dist/embeddings/transformers.js +32 -15
  459. package/dist/entry/json-hooks.d.ts +1 -1
  460. package/dist/entry/json-hooks.js +1 -1
  461. package/dist/entry/project-identity.js +2 -1
  462. package/dist/entry/session-text.d.ts +1 -1
  463. package/dist/entry/session-text.js +1 -1
  464. package/dist/entry/sqlite-handles.d.ts +10 -0
  465. package/dist/entry/sqlite-handles.js +9 -0
  466. package/dist/entry/store-kit.d.ts +50 -0
  467. package/dist/entry/store-kit.js +27 -0
  468. package/dist/entry/testing.d.ts +6 -0
  469. package/dist/entry/testing.js +7 -0
  470. package/dist/eval/eval-stats.d.ts +27 -8
  471. package/dist/eval/eval-stats.js +17 -5
  472. package/dist/eval/eval-suite.d.ts +3 -1
  473. package/dist/eval/eval-suite.js +409 -187
  474. package/dist/eval/eval.d.ts +8 -2
  475. package/dist/eval/eval.js +8 -2
  476. package/dist/eval/judgment.js +17 -7
  477. package/dist/graph/delta.d.ts +9 -42
  478. package/dist/graph/delta.js +17 -11
  479. package/dist/graph/extract.d.ts +10 -7
  480. package/dist/graph/extract.js +57 -25
  481. package/dist/graph/recall.d.ts +12 -4
  482. package/dist/graph/recall.js +30 -13
  483. package/dist/graph/stream.d.ts +18 -6
  484. package/dist/graph/stream.js +32 -10
  485. package/dist/graph/view.d.ts +19 -6
  486. package/dist/graph/view.js +42 -17
  487. package/dist/hooks/codex-session.js +2 -2
  488. package/dist/hooks/codex-wrapper.d.ts +3 -1
  489. package/dist/hooks/codex-wrapper.js +9 -4
  490. package/dist/hooks/copilot.d.ts +19 -5
  491. package/dist/hooks/copilot.js +54 -15
  492. package/dist/hooks/hook-blocks.d.ts +4 -1
  493. package/dist/hooks/hook-blocks.js +8 -3
  494. package/dist/hooks/json-hooks.d.ts +9 -5
  495. package/dist/hooks/json-hooks.js +72 -33
  496. package/dist/hooks/opencode.js +15 -5
  497. package/dist/hooks/shared.d.ts +27 -8
  498. package/dist/hooks/shared.js +57 -16
  499. package/dist/importers/core.d.ts +12 -4
  500. package/dist/importers/core.js +11 -10
  501. package/dist/importers/markdown-parse.d.ts +15 -5
  502. package/dist/importers/markdown-parse.js +16 -7
  503. package/dist/importers/markdown.js +6 -9
  504. package/dist/importers/sources.js +10 -23
  505. package/dist/importers/vault.d.ts +3 -3
  506. package/dist/importers/vault.js +61 -45
  507. package/dist/index.d.ts +33 -7
  508. package/dist/index.js +26 -8
  509. package/dist/learn/autolearn.d.ts +21 -6
  510. package/dist/learn/autolearn.js +57 -26
  511. package/dist/learn/churn-git.d.ts +4 -1
  512. package/dist/learn/churn-git.js +29 -5
  513. package/dist/learn/extract.d.ts +4 -1
  514. package/dist/learn/extract.js +17 -10
  515. package/dist/learn/forward-claim-detector.d.ts +17 -5
  516. package/dist/learn/forward-claim-detector.js +34 -15
  517. package/dist/learn/invalidation.d.ts +12 -6
  518. package/dist/learn/invalidation.js +62 -28
  519. package/dist/learn/roots.d.ts +3 -0
  520. package/dist/learn/roots.js +5 -0
  521. package/dist/mcp/admin-tools.d.ts +5 -5
  522. package/dist/mcp/admin-tools.js +28 -23
  523. package/dist/mcp/format.d.ts +1 -1
  524. package/dist/mcp/format.js +4 -2
  525. package/dist/mcp/framing.d.ts +3 -1
  526. package/dist/mcp/framing.js +20 -8
  527. package/dist/mcp/memory-tools.d.ts +3 -3
  528. package/dist/mcp/memory-tools.js +21 -20
  529. package/dist/mcp/protocol.d.ts +32 -16
  530. package/dist/mcp/protocol.js +12 -9
  531. package/dist/mcp/recall-tools.d.ts +3 -3
  532. package/dist/mcp/recall-tools.js +62 -74
  533. package/dist/mcp/request.d.ts +7 -5
  534. package/dist/mcp/request.js +61 -77
  535. package/dist/mcp/server.d.ts +3 -1
  536. package/dist/mcp/server.js +8 -3
  537. package/dist/mcp/session-state.d.ts +1 -1
  538. package/dist/mcp/session-state.js +4 -3
  539. package/dist/mcp/shared-gate.d.ts +3 -2
  540. package/dist/mcp/shared-gate.js +3 -2
  541. package/dist/mcp/stdio.d.ts +6 -3
  542. package/dist/mcp/stdio.js +59 -23
  543. package/dist/mcp/tool-args.d.ts +4 -1
  544. package/dist/mcp/tool-args.js +8 -3
  545. package/dist/mcp/tools.js +76 -32
  546. package/dist/objects/customer-notes.d.ts +12 -10
  547. package/dist/objects/customer-notes.js +21 -15
  548. package/dist/objects/decisions.d.ts +18 -10
  549. package/dist/objects/decisions.js +23 -17
  550. package/dist/objects/descriptor.js +2 -1
  551. package/dist/objects/fields.d.ts +4 -1
  552. package/dist/objects/fields.js +6 -2
  553. package/dist/objects/incidents.d.ts +14 -16
  554. package/dist/objects/incidents.js +29 -30
  555. package/dist/objects/lifecycle.d.ts +0 -4
  556. package/dist/objects/lifecycle.js +21 -24
  557. package/dist/objects/policies.d.ts +12 -16
  558. package/dist/objects/policies.js +17 -21
  559. package/dist/objects/processes.d.ts +16 -10
  560. package/dist/objects/processes.js +20 -15
  561. package/dist/objects/project-briefs.d.ts +13 -14
  562. package/dist/objects/project-briefs.js +33 -39
  563. package/dist/objects/skills.d.ts +10 -12
  564. package/dist/objects/skills.js +17 -22
  565. package/dist/postinstall.js +15 -7
  566. package/dist/predictions/planning-fallacy.d.ts +19 -6
  567. package/dist/predictions/planning-fallacy.js +4 -2
  568. package/dist/rerankers/clef.d.ts +8 -2
  569. package/dist/rerankers/clef.js +14 -9
  570. package/dist/rerankers/cross-encoder.d.ts +2 -1
  571. package/dist/rerankers/cross-encoder.js +19 -9
  572. package/dist/rerankers/index.js +2 -1
  573. package/dist/rerankers/jev.js +2 -1
  574. package/dist/rerankers/llm.d.ts +6 -2
  575. package/dist/rerankers/llm.js +8 -3
  576. package/dist/rerankers/remote.d.ts +3 -1
  577. package/dist/rerankers/remote.js +5 -2
  578. package/dist/rerankers/types.d.ts +6 -2
  579. package/dist/search/bm25-search.d.ts +3 -1
  580. package/dist/search/bm25-search.js +15 -2
  581. package/dist/search/boosts.js +4 -3
  582. package/dist/search/embed-memories.d.ts +12 -4
  583. package/dist/search/embed-memories.js +96 -58
  584. package/dist/search/engine.d.ts +11 -0
  585. package/dist/search/engine.js +14 -0
  586. package/dist/search/goal-boost.d.ts +10 -3
  587. package/dist/search/goal-boost.js +13 -6
  588. package/dist/search/hybrid-score.d.ts +4 -1
  589. package/dist/search/hybrid-score.js +4 -1
  590. package/dist/search/hybrid.d.ts +23 -8
  591. package/dist/search/hybrid.js +12 -7
  592. package/dist/search/multihop.js +14 -13
  593. package/dist/search/path-context.d.ts +10 -3
  594. package/dist/search/path-context.js +10 -3
  595. package/dist/search/physics-search.d.ts +9 -4
  596. package/dist/search/physics-search.js +38 -14
  597. package/dist/search/rerank.d.ts +2 -1
  598. package/dist/search/rerank.js +2 -1
  599. package/dist/search/rrf.d.ts +14 -5
  600. package/dist/search/rrf.js +11 -4
  601. package/dist/search/vector.d.ts +8 -2
  602. package/dist/search/vector.js +14 -8
  603. package/dist/server/auth.d.ts +19 -15
  604. package/dist/server/auth.js +68 -38
  605. package/dist/server/boot.d.ts +4 -1
  606. package/dist/server/boot.js +115 -67
  607. package/dist/server/client-ip.d.ts +17 -5
  608. package/dist/server/client-ip.js +56 -21
  609. package/dist/server/cursor.d.ts +10 -3
  610. package/dist/server/cursor.js +10 -3
  611. package/dist/server/deadline.d.ts +5 -2
  612. package/dist/server/deadline.js +10 -3
  613. package/dist/server/key-check-bounds.js +12 -4
  614. package/dist/server/lifecycle.d.ts +4 -1
  615. package/dist/server/lifecycle.js +10 -4
  616. package/dist/server/mcp-http.d.ts +2 -1
  617. package/dist/server/mcp-http.js +37 -22
  618. package/dist/server/rate-limit.d.ts +17 -5
  619. package/dist/server/rate-limit.js +55 -26
  620. package/dist/server/ready.js +7 -4
  621. package/dist/server/request.d.ts +15 -4
  622. package/dist/server/request.js +42 -15
  623. package/dist/server/route-checks.d.ts +4 -1
  624. package/dist/server/route-checks.js +8 -3
  625. package/dist/server/route-table.d.ts +8 -6
  626. package/dist/server/route-table.js +550 -97
  627. package/dist/server/routes/admin.d.ts +7 -7
  628. package/dist/server/routes/admin.js +36 -15
  629. package/dist/server/routes/customer-notes.d.ts +5 -5
  630. package/dist/server/routes/customer-notes.js +5 -4
  631. package/dist/server/routes/decisions.d.ts +5 -5
  632. package/dist/server/routes/decisions.js +12 -6
  633. package/dist/server/routes/incidents.d.ts +5 -5
  634. package/dist/server/routes/incidents.js +10 -4
  635. package/dist/server/routes/memories.d.ts +8 -8
  636. package/dist/server/routes/memories.js +12 -17
  637. package/dist/server/routes/object-routes.d.ts +8 -5
  638. package/dist/server/routes/object-routes.js +4 -2
  639. package/dist/server/routes/policies.d.ts +6 -6
  640. package/dist/server/routes/policies.js +11 -4
  641. package/dist/server/routes/predictions.d.ts +5 -5
  642. package/dist/server/routes/predictions.js +9 -4
  643. package/dist/server/routes/processes.d.ts +5 -5
  644. package/dist/server/routes/processes.js +15 -6
  645. package/dist/server/routes/project-briefs.d.ts +6 -6
  646. package/dist/server/routes/project-briefs.js +3 -2
  647. package/dist/server/routes/recall.d.ts +3 -3
  648. package/dist/server/routes/recall.js +21 -10
  649. package/dist/server/routes/skills.d.ts +6 -6
  650. package/dist/server/routes/skills.js +12 -4
  651. package/dist/server/server-detect.d.ts +24 -8
  652. package/dist/server/server-detect.js +57 -22
  653. package/dist/server/sleep-child.js +16 -10
  654. package/dist/server/sleep-offload.d.ts +8 -5
  655. package/dist/server/sleep-offload.js +40 -18
  656. package/dist/server/tls.d.ts +10 -2
  657. package/dist/server/tls.js +25 -5
  658. package/dist/server/types.d.ts +41 -24
  659. package/dist/server/validation.d.ts +4 -1
  660. package/dist/server/validation.js +22 -9
  661. package/dist/server.d.ts +17 -49
  662. package/dist/server.js +33 -40
  663. package/dist/sharing/global-store.d.ts +6 -12
  664. package/dist/sharing/global-store.js +8 -48
  665. package/dist/sharing/global-sync.d.ts +3 -1
  666. package/dist/sharing/global-sync.js +17 -7
  667. package/dist/sharing/project-merge.d.ts +25 -7
  668. package/dist/sharing/project-merge.js +49 -17
  669. package/dist/sharing/search-both.d.ts +8 -4
  670. package/dist/sharing/search-both.js +28 -14
  671. package/dist/sharing/share.d.ts +8 -4
  672. package/dist/sharing/share.js +40 -18
  673. package/dist/store/ambient.js +10 -5
  674. package/dist/store/audit-event.d.ts +2 -2
  675. package/dist/store/audit-event.js +8 -3
  676. package/dist/store/audit.d.ts +6 -3
  677. package/dist/store/audit.js +16 -6
  678. package/dist/store/auth.d.ts +4 -2
  679. package/dist/store/auth.js +63 -20
  680. package/dist/store/busy.d.ts +9 -0
  681. package/dist/store/busy.js +16 -0
  682. package/dist/store/candidates.d.ts +12 -5
  683. package/dist/store/candidates.js +90 -41
  684. package/dist/store/capture-write.d.ts +2 -1
  685. package/dist/store/capture-write.js +2 -1
  686. package/dist/store/card-detail.d.ts +4 -4
  687. package/dist/store/card-detail.js +15 -8
  688. package/dist/store/cards.d.ts +24 -10
  689. package/dist/store/cards.js +97 -63
  690. package/dist/store/compaction-caller.d.ts +2 -1
  691. package/dist/store/compaction-caller.js +2 -1
  692. package/dist/store/compactions-record.d.ts +14 -8
  693. package/dist/store/compactions-record.js +101 -37
  694. package/dist/store/compactions.js +35 -15
  695. package/dist/store/conflicts.d.ts +16 -5
  696. package/dist/store/conflicts.js +104 -48
  697. package/dist/store/connectors/dlq.d.ts +17 -5
  698. package/dist/store/connectors/dlq.js +58 -6
  699. package/dist/store/connectors/event-log.d.ts +122 -0
  700. package/dist/store/connectors/event-log.js +25 -0
  701. package/dist/store/connectors/github.d.ts +6 -3
  702. package/dist/store/connectors/github.js +30 -48
  703. package/dist/store/connectors/slack.d.ts +2 -1
  704. package/dist/store/connectors/slack.js +31 -47
  705. package/dist/store/dashboard-reads.d.ts +7 -3
  706. package/dist/store/dashboard-reads.js +32 -10
  707. package/dist/store/delete-and-batch.d.ts +17 -11
  708. package/dist/store/delete-and-batch.js +70 -28
  709. package/dist/store/delivery-recorder.d.ts +10 -7
  710. package/dist/store/delivery-recorder.js +70 -37
  711. package/dist/store/descendant-page.d.ts +2 -1
  712. package/dist/store/descendant-page.js +26 -10
  713. package/dist/store/diagnostics.d.ts +2 -1
  714. package/dist/store/diagnostics.js +2 -1
  715. package/dist/store/doctor-reads.d.ts +2 -1
  716. package/dist/store/doctor-reads.js +13 -5
  717. package/dist/store/dormant.d.ts +19 -11
  718. package/dist/store/dormant.js +45 -19
  719. package/dist/store/embeddings/index.d.ts +13 -9
  720. package/dist/store/embeddings/index.js +19 -12
  721. package/dist/store/entry-reads.d.ts +72 -21
  722. package/dist/store/entry-reads.js +215 -69
  723. package/dist/store/entry-row.d.ts +10 -6
  724. package/dist/store/entry-row.js +26 -14
  725. package/dist/store/entry-writes.d.ts +28 -13
  726. package/dist/store/entry-writes.js +61 -22
  727. package/dist/store/failure-log-at.js +1 -1
  728. package/dist/store/failure-log.d.ts +4 -2
  729. package/dist/store/failure-log.js +13 -6
  730. package/dist/store/gated-write.d.ts +3 -3
  731. package/dist/store/gated-write.js +3 -3
  732. package/dist/store/goals.d.ts +5 -4
  733. package/dist/store/goals.js +11 -12
  734. package/dist/store/graph-apply.d.ts +21 -0
  735. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  736. package/dist/store/graph-queue.d.ts +9 -6
  737. package/dist/store/graph-queue.js +15 -10
  738. package/dist/store/graph-reads.d.ts +16 -11
  739. package/dist/store/graph-reads.js +29 -19
  740. package/dist/store/graph-rows.d.ts +41 -3
  741. package/dist/store/graph-rows.js +10 -7
  742. package/dist/store/graph-view-rows.js +15 -7
  743. package/dist/store/graph-writes.d.ts +16 -10
  744. package/dist/store/graph-writes.js +59 -36
  745. package/dist/store/half-life.js +2 -2
  746. package/dist/store/handoffs.d.ts +13 -7
  747. package/dist/store/handoffs.js +44 -22
  748. package/dist/store/index-and-stats.d.ts +2 -2
  749. package/dist/store/index-and-stats.js +6 -5
  750. package/dist/store/index.d.ts +4 -2
  751. package/dist/store/index.js +2 -1
  752. package/dist/store/key-audit.d.ts +2 -1
  753. package/dist/store/key-audit.js +2 -1
  754. package/dist/store/key-writes.d.ts +2 -1
  755. package/dist/store/key-writes.js +9 -2
  756. package/dist/store/ledger-turn.d.ts +4 -1
  757. package/dist/store/ledger-turn.js +7 -2
  758. package/dist/store/mirrors.d.ts +11 -4
  759. package/dist/store/mirrors.js +96 -19
  760. package/dist/store/narrow.d.ts +6 -0
  761. package/dist/store/narrow.js +11 -0
  762. package/dist/store/open.d.ts +6 -3
  763. package/dist/store/open.js +20 -10
  764. package/dist/store/pilot-arm.d.ts +2 -1
  765. package/dist/store/pilot-arm.js +18 -6
  766. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  767. package/dist/store/planning-fallacy-evidence.js +8 -5
  768. package/dist/store/port/agent-import.d.ts +62 -0
  769. package/dist/store/port/agent-import.js +2 -0
  770. package/dist/store/port/consolidation.d.ts +129 -0
  771. package/dist/store/port/consolidation.js +2 -0
  772. package/dist/store/port/learning.d.ts +19 -0
  773. package/dist/store/port/learning.js +2 -0
  774. package/dist/store/port/local-files.d.ts +18 -0
  775. package/dist/store/port/local-files.js +2 -0
  776. package/dist/store/port/promotion.d.ts +20 -0
  777. package/dist/store/port/promotion.js +3 -0
  778. package/dist/store/port-groups.d.ts +160 -0
  779. package/dist/store/port-groups.js +2 -0
  780. package/dist/store/port.d.ts +261 -219
  781. package/dist/store/port.js +3 -9
  782. package/dist/store/predictions.d.ts +14 -10
  783. package/dist/store/predictions.js +37 -17
  784. package/dist/store/project-tags.d.ts +4 -1
  785. package/dist/store/project-tags.js +16 -5
  786. package/dist/store/quality-repair.d.ts +8 -4
  787. package/dist/store/quality-repair.js +53 -20
  788. package/dist/store/quarantine.d.ts +1 -0
  789. package/dist/store/quarantine.js +23 -9
  790. package/dist/store/raw-archive.d.ts +5 -4
  791. package/dist/store/raw-archive.js +11 -10
  792. package/dist/store/recall-trace.d.ts +22 -17
  793. package/dist/store/recall-trace.js +128 -64
  794. package/dist/store/rejected-values.d.ts +15 -10
  795. package/dist/store/rejected-values.js +46 -20
  796. package/dist/store/rejection.d.ts +12 -11
  797. package/dist/store/rejection.js +18 -19
  798. package/dist/store/report-reads.d.ts +2 -1
  799. package/dist/store/report-reads.js +2 -1
  800. package/dist/store/rows.d.ts +7 -5
  801. package/dist/store/rows.js +20 -13
  802. package/dist/store/rule-sql.d.ts +7 -3
  803. package/dist/store/rule-sql.js +26 -13
  804. package/dist/store/search-rows.d.ts +16 -11
  805. package/dist/store/search-rows.js +54 -32
  806. package/dist/store/sessions.d.ts +12 -10
  807. package/dist/store/sessions.js +40 -21
  808. package/dist/store/set-aside.d.ts +2 -2
  809. package/dist/store/set-aside.js +18 -5
  810. package/dist/store/sqlite/agent-import.d.ts +3 -0
  811. package/dist/store/sqlite/agent-import.js +77 -0
  812. package/dist/store/sqlite/cards-group.d.ts +6 -0
  813. package/dist/store/sqlite/cards-group.js +37 -0
  814. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  815. package/dist/store/sqlite/conflicts-group.js +18 -0
  816. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  817. package/dist/store/sqlite/connector-events-group.js +17 -6
  818. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  819. package/dist/store/sqlite/connector-writes-group.js +12 -5
  820. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  821. package/dist/store/sqlite/consolidation-group.js +64 -0
  822. package/dist/store/sqlite/dag-reads-group.js +1 -1
  823. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  824. package/dist/store/sqlite/dormant-group.js +29 -0
  825. package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
  826. package/dist/store/sqlite/entry-writes-group.js +37 -14
  827. package/dist/store/sqlite/error-codec.d.ts +4 -2
  828. package/dist/store/sqlite/error-codec.js +32 -10
  829. package/dist/store/sqlite/executor-counts.js +2 -1
  830. package/dist/store/sqlite/executor.d.ts +8 -3
  831. package/dist/store/sqlite/executor.js +56 -18
  832. package/dist/store/sqlite/global-promote.d.ts +5 -0
  833. package/dist/store/sqlite/global-promote.js +48 -0
  834. package/dist/store/sqlite/goals-group.d.ts +6 -0
  835. package/dist/store/sqlite/goals-group.js +23 -0
  836. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  837. package/dist/store/sqlite/graph-reads-group.js +2 -1
  838. package/dist/store/sqlite/held-connection.d.ts +8 -0
  839. package/dist/store/sqlite/held-connection.js +34 -7
  840. package/dist/store/sqlite/last-recall-group.d.ts +15 -0
  841. package/dist/store/sqlite/last-recall-group.js +62 -0
  842. package/dist/store/sqlite/learning-group.d.ts +4 -0
  843. package/dist/store/sqlite/learning-group.js +17 -0
  844. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  845. package/dist/store/sqlite/maintenance-groups.js +61 -0
  846. package/dist/store/sqlite/object-rows.d.ts +6 -3
  847. package/dist/store/sqlite/object-rows.js +34 -5
  848. package/dist/store/sqlite/objects-group.d.ts +5 -4
  849. package/dist/store/sqlite/objects-group.js +97 -38
  850. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  851. package/dist/store/sqlite/predictions-group.js +4 -2
  852. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  853. package/dist/store/sqlite/promotion-group.js +10 -0
  854. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  855. package/dist/store/sqlite/quarantine-group.js +4 -2
  856. package/dist/store/sqlite/reports-group.d.ts +6 -0
  857. package/dist/store/sqlite/reports-group.js +33 -0
  858. package/dist/store/sqlite/request-scope.d.ts +6 -0
  859. package/dist/store/sqlite/request-scope.js +18 -0
  860. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  861. package/dist/store/sqlite/sessions-group.js +46 -0
  862. package/dist/store/sqlite/store.d.ts +22 -18
  863. package/dist/store/sqlite/store.js +95 -33
  864. package/dist/store/sqlite/vector-pack.js +2 -1
  865. package/dist/store/sqlite/vector-reads-group.js +2 -1
  866. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  867. package/dist/store/sqlite/worker-jobs.js +19 -7
  868. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  869. package/dist/store/sqlite/worker-ops.js +6 -3
  870. package/dist/store/sqlite/worker-store.d.ts +4 -3
  871. package/dist/store/sqlite/worker-store.js +24 -14
  872. package/dist/store/summaries.d.ts +25 -11
  873. package/dist/store/summaries.js +84 -27
  874. package/dist/store/summary-dirty.d.ts +2 -1
  875. package/dist/store/summary-dirty.js +2 -1
  876. package/dist/store/tenant.d.ts +3 -2
  877. package/dist/store/tenant.js +5 -4
  878. package/dist/store/token-ledger-rows.js +8 -4
  879. package/dist/store/token-ledger.d.ts +19 -13
  880. package/dist/store/token-ledger.js +27 -14
  881. package/dist/store/tombstone-checks.d.ts +4 -1
  882. package/dist/store/tombstone-checks.js +10 -1
  883. package/dist/store/usage-reports.js +2 -1
  884. package/dist/store/vector-index.d.ts +8 -5
  885. package/dist/store/vector-index.js +28 -11
  886. package/dist/store/working-memory.d.ts +6 -4
  887. package/dist/store/working-memory.js +14 -9
  888. package/dist/support-bundle.js +10 -5
  889. package/dist/trust/quarantine.d.ts +1 -2
  890. package/dist/trust/quarantine.js +1 -5
  891. package/dist/trust/reject-flow.d.ts +12 -3
  892. package/dist/trust/reject-flow.js +12 -4
  893. package/dist/util/anthropic-messages.d.ts +7 -2
  894. package/dist/util/anthropic-messages.js +18 -7
  895. package/dist/util/atomic-write.d.ts +8 -3
  896. package/dist/util/atomic-write.js +36 -21
  897. package/dist/util/compaction-items.d.ts +4 -1
  898. package/dist/util/compaction-items.js +8 -2
  899. package/dist/util/crash-handlers.d.ts +7 -2
  900. package/dist/util/crash-handlers.js +13 -4
  901. package/dist/util/env.d.ts +26 -5
  902. package/dist/util/env.js +87 -25
  903. package/dist/util/format.d.ts +2 -0
  904. package/dist/util/format.js +4 -0
  905. package/dist/util/home-path.js +12 -6
  906. package/dist/util/hook-payload.d.ts +3 -1
  907. package/dist/util/hook-payload.js +3 -1
  908. package/dist/util/http-retry.d.ts +12 -6
  909. package/dist/util/http-retry.js +16 -6
  910. package/dist/util/http-util.d.ts +20 -5
  911. package/dist/util/http-util.js +28 -9
  912. package/dist/util/json.d.ts +4 -1
  913. package/dist/util/json.js +4 -1
  914. package/dist/util/keyset.js +2 -1
  915. package/dist/util/limits.js +4 -2
  916. package/dist/util/log.d.ts +13 -5
  917. package/dist/util/log.js +29 -6
  918. package/dist/util/net.d.ts +5 -0
  919. package/dist/util/net.js +19 -0
  920. package/dist/util/real-path.d.ts +2 -1
  921. package/dist/util/real-path.js +4 -3
  922. package/dist/util/request-scope.d.ts +16 -4
  923. package/dist/util/request-scope.js +19 -6
  924. package/dist/util/same-text.d.ts +10 -3
  925. package/dist/util/same-text.js +10 -3
  926. package/dist/util/secret-detect.d.ts +24 -7
  927. package/dist/util/secret-detect.js +49 -14
  928. package/dist/util/spawn-argv.d.ts +11 -0
  929. package/dist/util/spawn-argv.js +66 -0
  930. package/dist/util/sql.d.ts +3 -0
  931. package/dist/util/sql.js +6 -0
  932. package/dist/util/sqlite-blocked.d.ts +15 -4
  933. package/dist/util/sqlite-blocked.js +19 -6
  934. package/dist/util/stored-json.d.ts +4 -1
  935. package/dist/util/stored-json.js +6 -2
  936. package/dist/util/stream-tee.d.ts +2 -1
  937. package/dist/util/stream-tee.js +8 -5
  938. package/dist/util/transcript-tail.d.ts +4 -1
  939. package/dist/util/transcript-tail.js +4 -1
  940. package/dist/util/vector-codec.d.ts +4 -0
  941. package/dist/util/vector-codec.js +15 -0
  942. package/dist/util/version.d.ts +8 -3
  943. package/dist/util/version.js +8 -3
  944. package/dist/util/write-budget.d.ts +7 -2
  945. package/dist/util/write-budget.js +5 -2
  946. package/dist/util/yaml.d.ts +4 -1
  947. package/dist/util/yaml.js +4 -1
  948. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  949. package/extensions/openclaw-plugin/package.json +1 -1
  950. package/openclaw.plugin.json +1 -1
  951. package/package.json +4 -1
  952. package/scripts/postinstall.cjs +3 -1
  953. package/dist/api/audit.js +0 -56
  954. package/dist/api/cards.d.ts +0 -42
  955. package/dist/api/conflicts.d.ts +0 -28
  956. package/dist/api/conflicts.js +0 -61
  957. package/dist/api/dormant.d.ts +0 -14
  958. package/dist/api/dormant.js +0 -58
  959. package/dist/api/goals.d.ts +0 -18
  960. package/dist/api/graph.d.ts +0 -8
  961. package/dist/api/graph.js +0 -7
  962. package/dist/api/learn.js +0 -124
  963. package/dist/api/memories.d.ts +0 -23
  964. package/dist/api/memories.js +0 -46
  965. package/dist/api/objects.d.ts +0 -9
  966. package/dist/api/on-store.d.ts +0 -16
  967. package/dist/api/on-store.js +0 -38
  968. package/dist/api/outcome.d.ts +0 -19
  969. package/dist/api/outcome.js +0 -21
  970. package/dist/api/predictions.d.ts +0 -11
  971. package/dist/api/promote.d.ts +0 -36
  972. package/dist/api/promote.js +0 -65
  973. package/dist/api/recall-core.d.ts +0 -4
  974. package/dist/api/recall-core.js +0 -120
  975. package/dist/api/recall-finish.d.ts +0 -53
  976. package/dist/api/recall-finish.js +0 -30
  977. package/dist/api/recall-history.d.ts +0 -64
  978. package/dist/api/recall-history.js +0 -159
  979. package/dist/api/recall-record.d.ts +0 -43
  980. package/dist/api/recall-record.js +0 -78
  981. package/dist/api/recall-request.js +0 -121
  982. package/dist/api/recall.d.ts +0 -6
  983. package/dist/api/refine.d.ts +0 -7
  984. package/dist/api/refine.js +0 -10
  985. package/dist/api/session-owners.d.ts +0 -4
  986. package/dist/api/session-owners.js +0 -17
  987. package/dist/api/sleep-run.d.ts +0 -26
  988. package/dist/api/sleep.js +0 -10
  989. package/dist/cli/lenient-id.d.ts +0 -2
  990. package/dist/cli/lenient-id.js +0 -13
  991. package/dist/graph/write.d.ts +0 -14
  992. package/dist/store/sqlite/busy.d.ts +0 -3
  993. package/dist/store/sqlite/busy.js +0 -8
  994. package/dist/store/sqlite/local.d.ts +0 -21
  995. package/dist/store/sqlite/local.js +0 -39
@@ -11,7 +11,8 @@ export const MAX_BODY_BYTES = 1024 * 1024;
11
11
  function sizeLabel(bytes) {
12
12
  return bytes % (1024 * 1024) === 0 ? `${bytes / (1024 * 1024)}MB` : `${Math.ceil(bytes / 1024)}KB`;
13
13
  }
14
- // How long a refused upload is still read and discarded after its reply, so a client that never stops cannot hold the socket.
14
+ // How long a refused upload is still read and discarded after its reply, so a client that never stops cannot hold the
15
+ // socket.
15
16
  const REFUSED_UPLOAD_LINGER_MS = 2000;
16
17
  export const JSON_HEADERS = { 'content-type': 'application/json' };
17
18
  export class HttpError extends Error {
@@ -24,7 +25,10 @@ export class HttpError extends Error {
24
25
  this.retryAfterSec = retryAfterSec;
25
26
  }
26
27
  }
27
- /** A request, or a store call it waited on, ran past the request's deadline; the reply carries `code` so a client branches without parsing prose. */
28
+ /**
29
+ * A request, or a store call it waited on, ran past the request's deadline; the reply carries `code` so a client
30
+ * branches without parsing prose.
31
+ */
28
32
  export class DeadlineExceededError extends HttpError {
29
33
  code = 'deadline_exceeded';
30
34
  constructor(message) {
@@ -48,11 +52,17 @@ export function sendJson(res, status, body) {
48
52
  res.end(text);
49
53
  }
50
54
  const DEFAULT_BODY_DEADLINE_MS = 30_000;
51
- /** How long any route waits for a request body, so a client that sends headers and then stalls cannot hold a request open: 30 s, or HIPPO_BODY_TIMEOUT_MS. */
55
+ /**
56
+ * How long any route waits for a request body, so a client that sends headers and then stalls cannot hold a request
57
+ * open: 30 s, or HIPPO_BODY_TIMEOUT_MS.
58
+ */
52
59
  export function bodyDeadlineMs() {
53
60
  return envBodyTimeoutMs() ?? DEFAULT_BODY_DEADLINE_MS;
54
61
  }
55
- /** The body as text, refused mid-stream past maxBytes and past deadlineMs, so an oversized or slow sender cannot tie up the server. */
62
+ /**
63
+ * The body as text, refused mid-stream past maxBytes and past deadlineMs, so an oversized or slow sender cannot tie up
64
+ * the server.
65
+ */
56
66
  export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs = bodyDeadlineMs() } = {}) {
57
67
  return new Promise((resolve, reject) => {
58
68
  const chunks = [];
@@ -63,7 +73,8 @@ export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs = bodyDead
63
73
  chunks.length = 0;
64
74
  reject(err);
65
75
  };
66
- // Not for-await: leaving that loop early destroys the request, so the socket stops reading and the 413 caller cannot close it cleanly.
76
+ // Not for-await: leaving that loop early destroys the request, so the socket stops reading and the 413 caller
77
+ // cannot close it cleanly.
67
78
  const onData = (chunk) => {
68
79
  total += chunk.length;
69
80
  if (total <= maxBytes) {
@@ -84,7 +95,8 @@ export function readBody(req, { maxBytes = MAX_BODY_BYTES, deadlineMs = bodyDead
84
95
  });
85
96
  });
86
97
  }
87
- // A full close with request bytes unread sends a TCP reset, which discards the reply before the client reads it (RFC 9112 9.6).
98
+ // A full close with request bytes unread sends a TCP reset, which discards the reply before the client reads it (RFC
99
+ // 9112 9.6).
88
100
  export function closeAfterReply(req) {
89
101
  const socket = req.socket;
90
102
  req.resume();
@@ -112,16 +124,23 @@ function originHost(origin) {
112
124
  return null;
113
125
  }
114
126
  }
115
- // A webhook route takes no key, so anyone holding a signature header could otherwise keep a socket open with a body that never ends.
127
+ // A webhook route takes no key, so anyone holding a signature header could otherwise keep a socket open with a body
128
+ // that never ends.
116
129
  const WEBHOOK_BODY_DEADLINE_MS = 10_000;
117
- /** Call before refusing a webhook unread: a caller still sending its body loses the socket once the reply is out, as it does after a 413. */
130
+ /**
131
+ * Call before refusing a webhook unread: a caller still sending its body loses the socket once the reply is out, as it
132
+ * does after a 413.
133
+ */
118
134
  export function closeIfBodyUnread({ req, res }) {
119
135
  res.once('finish', () => {
120
136
  if (!req.complete)
121
137
  closeAfterReply(req);
122
138
  });
123
139
  }
124
- /** A webhook's raw body, exactly as sent, for the receiver's HMAC check; call it only once a secret is configured and the signature headers are present. */
140
+ /**
141
+ * A webhook's raw body, exactly as sent, for the receiver's HMAC check; call it only once a secret is configured and
142
+ * the signature headers are present.
143
+ */
125
144
  export function readWebhookBody({ req, opts }) {
126
145
  return readBody(req, { deadlineMs: opts.webhookBodyDeadlineMs ?? WEBHOOK_BODY_DEADLINE_MS });
127
146
  }
@@ -12,6 +12,9 @@ export declare function isJsonObject(value: JsonValue | undefined): value is {
12
12
  export declare function isJsonObjectLiteral(value: JsonValue | undefined): value is {
13
13
  [key: string]: JsonValue;
14
14
  };
15
- /** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
15
+ /**
16
+ * Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is
17
+ * dropped.
18
+ */
16
19
  export declare function readJsonFile(file: string): JsonValue;
17
20
  //# sourceMappingURL=json.d.ts.map
package/dist/util/json.js CHANGED
@@ -17,7 +17,10 @@ export function isJsonObject(value) {
17
17
  export function isJsonObjectLiteral(value) {
18
18
  return value !== undefined && value !== null && !Array.isArray(value) && value.constructor === Object;
19
19
  }
20
- /** Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is dropped. */
20
+ /**
21
+ * Windows PowerShell 5.1 saves JSON with a UTF-8 byte order mark that JSON.parse rejects, so one leading mark is
22
+ * dropped.
23
+ */
21
24
  export function readJsonFile(file) {
22
25
  const text = fs.readFileSync(file, 'utf8');
23
26
  return JSON.parse(text.codePointAt(0) === 0xfeff ? text.slice(1) : text);
@@ -1,4 +1,5 @@
1
- // Keyset paging for list queries ordered by (sort key DESC, id DESC), so a page never skips or repeats a row when rows arrive between requests.
1
+ // Keyset paging for list queries ordered by (sort key DESC, id DESC), so a page never skips or repeats a row when rows
2
+ // arrive between requests.
2
3
  /** An ` AND ...` WHERE fragment and its params selecting rows strictly after `after`; empty when `after` is unset. */
3
4
  export function keysetAfter(sortCol, idCol, after) {
4
5
  if (!after)
@@ -1,8 +1,10 @@
1
- // Cap for id-shaped request fields (ids, tenant, session, scope, class): far above real values, small enough to bound logs and indexes.
1
+ // Cap for id-shaped request fields (ids, tenant, session, scope, class): far above real values, small enough to bound
2
+ // logs and indexes.
2
3
  export const MAX_ID_LEN = 256;
3
4
  // Page size every list surface (CLI, HTTP, store) falls back to when the caller names none.
4
5
  export const DEFAULT_LIST_LIMIT = 100;
5
- // Ceiling for a caller-named list page; SQLite `LIMIT ?` and one response's size bound it, and every list surface shares it.
6
+ // Ceiling for a caller-named list page; SQLite `LIMIT ?` and one response's size bound it, and every list surface
7
+ // shares it.
6
8
  export const MAX_LIST_LIMIT = 1000;
7
9
  /** The one list-limit rule: absent means the default; a positive integer up to the ceiling passes.
8
10
  * Anything else returns undefined, so each surface words its own error. */
@@ -1,7 +1,8 @@
1
1
  /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
2
2
  * debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
3
3
  export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
4
- /** Extra key=value pairs appended to the line. `ts` and, inside a request, `requestId` are added to every line written. */
4
+ /** Extra key=value pairs appended to the line. `ts` and, inside a request, `requestId` are added to every line
5
+ * written. */
5
6
  export interface LogFields {
6
7
  ts?: string;
7
8
  requestId?: string;
@@ -14,10 +15,15 @@ export declare function isLevelEnabled(level: LogLevel): boolean;
14
15
  export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
15
16
  /** One JSON object per line for a log collector; JSON escaping keeps a multi-line value on the one line. */
16
17
  export declare function formatLogJson(level: LogLevel, message: string, fields?: LogFields): string;
17
- /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
18
+ /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key
19
+ * cap an unseen key logs at debug. */
18
20
  declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
19
- /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
21
+ /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable
22
+ * without flooding stderr. */
20
23
  declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
24
+ /** Warn the first time `key` is seen, then count repeats at debug and warn again with the running count on every
25
+ * 100th, so a failure that keeps happening stays visible without flooding stderr. */
26
+ declare function warnThenSample(key: string, message: string, fields?: LogFields): void;
21
27
  /** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
22
28
  export declare function errorFields<E>(err: E): LogFields;
23
29
  export declare const log: {
@@ -27,11 +33,13 @@ export declare const log: {
27
33
  readonly debug: (message: string, fields?: LogFields) => void;
28
34
  readonly once: typeof once;
29
35
  readonly warnThenDebug: typeof warnThenDebug;
36
+ readonly warnThenSample: typeof warnThenSample;
30
37
  };
31
- /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
38
+ /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause
39
+ * enrichment). */
32
40
  export declare function errorMessage(cause: unknown): string;
33
41
  /** One post-compact failure, told once to the hook's output (`say`) and once to the structured log. */
34
- export declare function reportCompactionFailure(say: (message: string) => void, step: string, reason: string): void;
42
+ export declare function reportCompactionFailure(say: (message: string) => void, step: string, reason: string, fields?: LogFields): void;
35
43
  /** The string `code` of a caught value (an errno name such as EACCES), or '' when it has none. */
36
44
  export declare function errorCode(cause: unknown): string;
37
45
  /** Test hook: forget which once-keys have fired. */
package/dist/util/log.js CHANGED
@@ -41,7 +41,8 @@ function write(level, message, fields) {
41
41
  const ONCE_KEY_CAP = 1_000;
42
42
  const onceKeys = new Set();
43
43
  let onceCapReported = false;
44
- /** 'new' records the key and 'seen' is a repeat. 'uncounted' is an unseen key once the set is full: it is not recorded, and the first one says so at warn. */
44
+ /** 'new' records the key and 'seen' is a repeat. 'uncounted' is an unseen key once the set is full: it is not
45
+ * recorded, and the first one says so at warn. */
45
46
  function sightOnceKey(key) {
46
47
  if (onceKeys.has(key))
47
48
  return 'seen';
@@ -55,16 +56,35 @@ function sightOnceKey(key) {
55
56
  }
56
57
  return 'uncounted';
57
58
  }
58
- /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key cap an unseen key logs at debug. */
59
+ /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. Past the key
60
+ * cap an unseen key logs at debug. */
59
61
  function once(key, level, message, fields) {
60
62
  const sighting = sightOnceKey(key);
61
63
  if (sighting !== 'seen')
62
64
  write(sighting === 'new' ? level : 'debug', message, fields);
63
65
  }
64
- /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
66
+ /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable
67
+ * without flooding stderr. */
65
68
  function warnThenDebug(key, message, fields) {
66
69
  write(sightOnceKey(key) === 'new' ? 'warn' : 'debug', message, fields);
67
70
  }
71
+ const SAMPLE_EVERY = 100;
72
+ const repeatCounts = new Map();
73
+ /** Warn the first time `key` is seen, then count repeats at debug and warn again with the running count on every
74
+ * 100th, so a failure that keeps happening stays visible without flooding stderr. */
75
+ function warnThenSample(key, message, fields) {
76
+ if (sightOnceKey(key) === 'new') {
77
+ write('warn', message, fields);
78
+ return;
79
+ }
80
+ // Counts only keys sightOnceKey recorded, so the map is bounded by ONCE_KEY_CAP.
81
+ const seen = (repeatCounts.get(key) ?? 0) + 1;
82
+ repeatCounts.set(key, seen);
83
+ if (seen % SAMPLE_EVERY === 0)
84
+ write('warn', `${message} (${seen} more since the first warning)`, fields);
85
+ else
86
+ write('debug', message, fields);
87
+ }
68
88
  /** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
69
89
  export function errorFields(err) {
70
90
  if (!(err instanceof Error))
@@ -78,15 +98,17 @@ export const log = {
78
98
  debug: (message, fields) => write('debug', message, fields),
79
99
  once,
80
100
  warnThenDebug,
101
+ warnThenSample,
81
102
  };
82
- /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
103
+ /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause
104
+ * enrichment). */
83
105
  export function errorMessage(cause) {
84
106
  return cause instanceof Error ? cause.message : String(cause);
85
107
  }
86
108
  /** One post-compact failure, told once to the hook's output (`say`) and once to the structured log. */
87
- export function reportCompactionFailure(say, step, reason) {
109
+ export function reportCompactionFailure(say, step, reason, fields) {
88
110
  say(`${step} failed: ${reason}`);
89
- log.error(`post-compact: ${step} failed: ${reason}`);
111
+ log.error(`post-compact: ${step} failed: ${reason}`, fields);
90
112
  }
91
113
  /** The string `code` of a caught value (an errno name such as EACCES), or '' when it has none. */
92
114
  export function errorCode(cause) {
@@ -95,6 +117,7 @@ export function errorCode(cause) {
95
117
  /** Test hook: forget which once-keys have fired. */
96
118
  export function resetLogOnce() {
97
119
  onceKeys.clear();
120
+ repeatCounts.clear();
98
121
  onceCapReported = false;
99
122
  }
100
123
  //# sourceMappingURL=log.js.map
@@ -0,0 +1,5 @@
1
+ /** A URL hostname that stays on this machine: localhost, ::1 (bracketed or not) or any 127.0.0.0/8 address. */
2
+ export declare function isLoopbackHost(hostname: string): boolean;
3
+ /** A socket remote address on this machine; Node reports a dual-stack IPv4 peer as '::ffff:127.x.x.x'. */
4
+ export declare function isLoopbackAddress(remoteAddress: string | undefined): boolean;
5
+ //# sourceMappingURL=net.d.ts.map
@@ -0,0 +1,19 @@
1
+ // Two loopback rules for two inputs: a URL hostname and a socket's remote address.
2
+ const IPV4_LOOPBACK = /^127(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}$/;
3
+ const MAPPED_PREFIX = '::ffff:';
4
+ /** A URL hostname that stays on this machine: localhost, ::1 (bracketed or not) or any 127.0.0.0/8 address. */
5
+ export function isLoopbackHost(hostname) {
6
+ return hostname === 'localhost' || hostname === '[::1]' || hostname === '::1' || IPV4_LOOPBACK.test(hostname);
7
+ }
8
+ /** A socket remote address on this machine; Node reports a dual-stack IPv4 peer as '::ffff:127.x.x.x'. */
9
+ export function isLoopbackAddress(remoteAddress) {
10
+ if (!remoteAddress)
11
+ return false;
12
+ if (remoteAddress === '::1')
13
+ return true;
14
+ const plain = remoteAddress.toLowerCase().startsWith(MAPPED_PREFIX)
15
+ ? remoteAddress.slice(MAPPED_PREFIX.length)
16
+ : remoteAddress;
17
+ return IPV4_LOOPBACK.test(plain);
18
+ }
19
+ //# sourceMappingURL=net.js.map
@@ -1,3 +1,4 @@
1
- /** Dereferences symlinks and junctions and normalises case on Windows; falls back to path.resolve when the path does not exist yet. */
1
+ /** Dereferences symlinks and junctions and normalises case on Windows; falls back to path.resolve when the path does
2
+ * not exist yet. */
2
3
  export declare function realpathOrResolve(p: string): string;
3
4
  //# sourceMappingURL=real-path.d.ts.map
@@ -1,14 +1,15 @@
1
1
  // Leaf module: path canonicalisation shared by project identity and the importers.
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
- import { errorMessage, log } from './log.js';
5
- /** Dereferences symlinks and junctions and normalises case on Windows; falls back to path.resolve when the path does not exist yet. */
4
+ import { errorMessage, log, errorFields } from './log.js';
5
+ /** Dereferences symlinks and junctions and normalises case on Windows; falls back to path.resolve when the path does
6
+ * not exist yet. */
6
7
  export function realpathOrResolve(p) {
7
8
  try {
8
9
  return fs.realpathSync.native(p);
9
10
  }
10
11
  catch (err) {
11
- log.debug(`realpath fell back to resolve for ${p}: ${errorMessage(err)}`);
12
+ log.debug(`realpath fell back to resolve for ${p}: ${errorMessage(err)}`, errorFields(err));
12
13
  return path.resolve(p);
13
14
  }
14
15
  }
@@ -5,10 +5,15 @@ export interface RequestScope {
5
5
  readonly requestId: string | undefined;
6
6
  /** Set for a served request that must be answered by a given time. */
7
7
  readonly deadline?: RequestDeadline | undefined;
8
+ /** Aborts when the request passes its deadline, so a handler that checks it stops starting work nobody waits for. */
9
+ readonly signal?: AbortSignal | undefined;
8
10
  }
9
11
  /** How long a request may run: 120 s, or HIPPO_REQUEST_DEADLINE_MS, where 0 turns the deadline off. */
10
12
  export declare function requestDeadlineMs(): number;
11
- /** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
13
+ /**
14
+ * When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`,
15
+ * with the outcome only it knows.
16
+ */
12
17
  export declare class RequestDeadline {
13
18
  #private;
14
19
  /** Epoch milliseconds. */
@@ -16,7 +21,10 @@ export declare class RequestDeadline {
16
21
  constructor(at: number);
17
22
  /** Counts `call` as one the request waits on until it settles. */
18
23
  track<T>(call: Promise<T>): Promise<T>;
19
- /** Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile runs, in order. */
24
+ /**
25
+ * Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile
26
+ * runs, in order.
27
+ */
20
28
  onceIdle(fn: () => void): void;
21
29
  }
22
30
  export declare const requestScopes: AsyncLocalStorage<RequestScope>;
@@ -24,7 +32,11 @@ export declare const requestScopes: AsyncLocalStorage<RequestScope>;
24
32
  export declare function currentRequestId(): string | undefined;
25
33
  /** The deadline of the request this code runs for, if it has one. */
26
34
  export declare function currentDeadline(): RequestDeadline | undefined;
35
+ /** The abort signal of the request this code runs for, if it has one. */
36
+ export declare function currentSignal(): AbortSignal | undefined;
27
37
  /** Runs `fn` with `requestId` on every log line it writes, including the ones from
28
- * timers and promises it starts. `deadline` reaches every store call made inside. */
29
- export declare function runWithRequestId<T>(requestId: string, fn: () => T, deadline?: RequestDeadline): T;
38
+ * timers and promises it starts. `deadline` reaches every store call made inside, and `signal` every check of
39
+ * `currentSignal`.
40
+ */
41
+ export declare function runWithRequestId<T>(requestId: string, fn: () => T, deadline?: RequestDeadline, signal?: AbortSignal): T;
30
42
  //# sourceMappingURL=request-scope.d.ts.map
@@ -1,4 +1,5 @@
1
- // The one ambient scope of a request. A leaf module, so the logger can read the request id without importing the store layer.
1
+ // The one ambient scope of a request. A leaf module, so the logger can read the request id without importing the store
2
+ // layer.
2
3
  import { AsyncLocalStorage } from 'node:async_hooks';
3
4
  import { envRequestDeadlineMs } from './env.js';
4
5
  const DEFAULT_REQUEST_DEADLINE_MS = 120_000;
@@ -6,7 +7,10 @@ const DEFAULT_REQUEST_DEADLINE_MS = 120_000;
6
7
  export function requestDeadlineMs() {
7
8
  return envRequestDeadlineMs() ?? DEFAULT_REQUEST_DEADLINE_MS;
8
9
  }
9
- /** When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`, with the outcome only it knows. */
10
+ /**
11
+ * When a request must be answered, and the store calls it still waits on: the store ends each of those soon after `at`,
12
+ * with the outcome only it knows.
13
+ */
10
14
  export class RequestDeadline {
11
15
  /** Epoch milliseconds. */
12
16
  at;
@@ -28,7 +32,10 @@ export class RequestDeadline {
28
32
  call.then(done, done);
29
33
  return call;
30
34
  }
31
- /** Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile runs, in order. */
35
+ /**
36
+ * Runs `fn` now, or once the last store call the request waits on has settled; every function registered meanwhile
37
+ * runs, in order.
38
+ */
32
39
  onceIdle(fn) {
33
40
  if (this.#storeCalls === 0)
34
41
  fn();
@@ -45,9 +52,15 @@ export function currentRequestId() {
45
52
  export function currentDeadline() {
46
53
  return requestScopes.getStore()?.deadline;
47
54
  }
55
+ /** The abort signal of the request this code runs for, if it has one. */
56
+ export function currentSignal() {
57
+ return requestScopes.getStore()?.signal;
58
+ }
48
59
  /** Runs `fn` with `requestId` on every log line it writes, including the ones from
49
- * timers and promises it starts. `deadline` reaches every store call made inside. */
50
- export function runWithRequestId(requestId, fn, deadline) {
51
- return requestScopes.run({ requestId, deadline }, fn);
60
+ * timers and promises it starts. `deadline` reaches every store call made inside, and `signal` every check of
61
+ * `currentSignal`.
62
+ */
63
+ export function runWithRequestId(requestId, fn, deadline, signal) {
64
+ return requestScopes.run({ requestId, deadline, signal }, fn);
52
65
  }
53
66
  //# sourceMappingURL=request-scope.js.map
@@ -6,14 +6,21 @@ type Text = Pick<MemoryEntry, 'content'> & {
6
6
  export declare function duplicateKey(text: string): string;
7
7
  /** A sleep-merged row's text: a header, a blank line, then each text as a "- " bullet with its later lines indented. */
8
8
  export declare function mergedText(header: string, texts: readonly string[]): string;
9
- /** Each source text a sleep-merged row holds; a two-row merge by an older release kept one text whole after its header. */
9
+ /**
10
+ * Each source text a sleep-merged row holds; a two-row merge by an older release kept one text whole after its header.
11
+ */
10
12
  export declare function heldTexts(entry: Text): string[];
11
13
  /** Keys of every text a row holds word for word: its own, plus each source text inside a sleep-merged row. */
12
14
  export declare function heldTextKeys(entry: Text): string[];
13
- /** The longest word of a text: every row holding the text word for word contains it, so a store lookup can filter on it. */
15
+ /**
16
+ * The longest word of a text: every row holding the text word for word contains it, so a store lookup can filter on it.
17
+ */
14
18
  export declare function longestWord(text: string): string;
15
19
  export declare function storedTextKeys(entries: readonly Text[]): Set<string>;
16
- /** A final result list without copies: drops each unpinned row a sleep-merged row in the list holds word for word, and each later unpinned copy of a text. */
20
+ /**
21
+ * A final result list without copies: drops each unpinned row a sleep-merged row in the list holds word for word, and
22
+ * each later unpinned copy of a text.
23
+ */
17
24
  export declare function dropHeldCopies<T>(rows: readonly T[], textOf: (row: T) => Text): T[];
18
25
  export {};
19
26
  //# sourceMappingURL=same-text.d.ts.map
@@ -5,7 +5,9 @@ export function duplicateKey(text) {
5
5
  export function mergedText(header, texts) {
6
6
  return `${header}\n\n${texts.map((t) => `- ${t.trim().replace(/\n/g, '\n ')}`).join('\n')}`;
7
7
  }
8
- /** Each source text a sleep-merged row holds; a two-row merge by an older release kept one text whole after its header. */
8
+ /**
9
+ * Each source text a sleep-merged row holds; a two-row merge by an older release kept one text whole after its header.
10
+ */
9
11
  export function heldTexts(entry) {
10
12
  const cut = entry.content.indexOf('\n\n');
11
13
  if (entry.source !== 'consolidation' || cut < 0)
@@ -19,14 +21,19 @@ export function heldTexts(entry) {
19
21
  export function heldTextKeys(entry) {
20
22
  return [duplicateKey(entry.content), ...heldTexts(entry).map(duplicateKey)];
21
23
  }
22
- /** The longest word of a text: every row holding the text word for word contains it, so a store lookup can filter on it. */
24
+ /**
25
+ * The longest word of a text: every row holding the text word for word contains it, so a store lookup can filter on it.
26
+ */
23
27
  export function longestWord(text) {
24
28
  return duplicateKey(text).split(' ').reduce((best, w) => (w.length > best.length ? w : best), '');
25
29
  }
26
30
  export function storedTextKeys(entries) {
27
31
  return new Set(entries.flatMap(heldTextKeys));
28
32
  }
29
- /** A final result list without copies: drops each unpinned row a sleep-merged row in the list holds word for word, and each later unpinned copy of a text. */
33
+ /**
34
+ * A final result list without copies: drops each unpinned row a sleep-merged row in the list holds word for word, and
35
+ * each later unpinned copy of a text.
36
+ */
30
37
  export function dropHeldCopies(rows, textOf) {
31
38
  const held = new Set(rows.flatMap((r) => heldTextKeys(textOf(r)).slice(1)));
32
39
  const seen = new Set();
@@ -1,5 +1,9 @@
1
- /** Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag). Flagged rows are never shared to
2
- * the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no imports from store/api/shared. */
1
+ /**
2
+ * Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag).
3
+ * Flagged rows are never shared to
4
+ * the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no
5
+ * imports from store/api/shared.
6
+ */
3
7
  /** Result of scanning one memory. `reason` names the tag or pattern that fired. */
4
8
  export interface SecretDetection {
5
9
  flagged: boolean;
@@ -12,22 +16,35 @@ export declare function detectSecret(entry: {
12
16
  content: string;
13
17
  tags: string[];
14
18
  }): SecretDetection;
15
- /** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
19
+ /**
20
+ * Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and
21
+ * co-occurrence guard as `detectSecret`;
16
22
  * for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
17
23
  export declare function redactSecrets(text: string): string;
18
- /** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
24
+ /**
25
+ * Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids.
26
+ */
19
27
  export declare function maskEmails(text: string): string;
20
- /** Stricter redaction for text that leaves the machine: no co-occurrence guard, plus Bearer and Basic auth headers and JWTs. */
28
+ /**
29
+ * Stricter redaction for text that leaves the machine: no co-occurrence guard, plus Bearer and Basic auth headers and
30
+ * JWTs.
31
+ */
21
32
  export declare function redactSecretsStrict(text: string): string;
22
33
  /** The text a write keeps, plus what to tell its caller about secret material in it. */
23
34
  export interface SecretVet {
24
35
  content: string;
25
36
  warnings: string[];
26
37
  }
27
- /** Write-time veto: `scrub` text no person typed gets capture's strict redaction; typed text is a person's own call, so it is kept and flagged. */
38
+ /**
39
+ * Write-time veto: `scrub` text no person typed gets capture's strict redaction; typed text is a person's own call, so
40
+ * it is kept and flagged.
41
+ */
28
42
  export declare function vetSecrets(content: string, tags: readonly string[], scrub: boolean): SecretVet;
29
43
  /** Appended to a dead-letter row's error when `redactPayload` changed its body. */
30
44
  export declare const DLQ_REDACTED_NOTE = "secret-shaped text redacted, signature dropped; replay needs --force";
31
- /** `vetSecrets` redaction for a raw webhook body: JSON stays valid for replay, and an untouched body stays byte-identical so its signature still verifies. */
45
+ /**
46
+ * `vetSecrets` redaction for a raw webhook body: JSON stays valid for replay, and an untouched body stays
47
+ * byte-identical so its signature still verifies.
48
+ */
32
49
  export declare function redactPayload(raw: string): string;
33
50
  //# sourceMappingURL=secret-detect.d.ts.map
@@ -1,5 +1,9 @@
1
- /** Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag). Flagged rows are never shared to
2
- * the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no imports from store/api/shared. */
1
+ /**
2
+ * Secret detection for memory content: conservative provider-bounded patterns (a bare `sk-` in prose must not flag).
3
+ * Flagged rows are never shared to
4
+ * the global store or injected as ambient context outside their project; explicit recall is unaffected. Leaf module: no
5
+ * imports from store/api/shared.
6
+ */
3
7
  /** Tags that flag a memory as secret, lower case; detectSecret folds a tag's case before the lookup. */
4
8
  export const SECRET_TAGS = new Set([
5
9
  'secret', 'api-key', 'apikey', 'credential', 'credentials',
@@ -14,7 +18,8 @@ const SECRET_PATTERNS = [
14
18
  { name: 'slack-token', re: /\bxox[baprs]-[A-Za-z0-9-]{10,}/ },
15
19
  { name: 'stripe-key', re: /\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b/ },
16
20
  { name: 'google-api-key', re: /\bAIza[0-9A-Za-z_-]{35}(?:\b|(?<=-))/ },
17
- // hk_ is hippo's own API key (src/store/auth.ts); npm, Hugging Face, GitLab and Slack webhook shapes follow gitleaks' rules.
21
+ // hk_ is hippo's own API key (src/store/auth.ts); npm, Hugging Face, GitLab and Slack webhook shapes follow gitleaks'
22
+ // rules.
18
23
  { name: 'hippo-api-key', re: /\bhk_[a-z2-7]{24}\.[a-z2-7]{32}\b/ },
19
24
  { name: 'npm-token', re: /\bnpm_[A-Za-z0-9]{36}\b/ },
20
25
  { name: 'huggingface-token', re: /\bhf_[A-Za-z]{34}\b/ },
@@ -22,12 +27,14 @@ const SECRET_PATTERNS = [
22
27
  { name: 'google-oauth-token', re: /\bya29\.[\w-]{20,}/ },
23
28
  { name: 'slack-webhook', re: /\bhooks\.slack\.com\/(?:services|workflows|triggers)\/[A-Za-z0-9+/]{43,56}/ },
24
29
  { name: 'private-key-block', re: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
25
- // sk-... (OpenAI/Anthropic) and sk_<vendor>_... shapes; both need a key-ish noun in the content (co-occurrence guard), so prose
30
+ // sk-... (OpenAI/Anthropic) and sk_<vendor>_... shapes need a key-ish noun nearby (co-occurrence guard), so prose
26
31
  // like "the sk- prefix identifies API keys" does not flag but "prod API key sk_live_..." does.
27
32
  { name: 'sk-style-key', re: /\bsk-[A-Za-z0-9_-]{20,}/ },
28
33
  { name: 'sk-underscore-key', re: /\bsk_[A-Za-z0-9]+_[A-Za-z0-9_]{6,}\b/ },
29
- // Value needs 12+ token-safe chars and a digit, or `token = estimateTokens(...)` and user:password@ templates would hide code lessons from ambient context.
30
- // Secret names end in the keyword (dbPassword), so the match opens there, no prefix scan; pwd and pass need a _ (OLDPWD, bypass are not secrets).
34
+ // Value needs 12+ token-safe chars and a digit, or `token = estimateTokens(...)` and user:password@ templates would
35
+ // hide code lessons from ambient context.
36
+ // Secret names end in the keyword (dbPassword), so the match opens there, no prefix scan; pwd and pass need a _
37
+ // (OLDPWD, bypass are not secrets).
31
38
  {
32
39
  name: 'secret-assignment',
33
40
  re: new RegExp(String.raw `(?:(?:api[_-]?key|access[_-]?key|private[_-]?key|secret|token|passw(?:or)?d|(?<=_)(?:pwd|pass))` +
@@ -61,7 +68,9 @@ export function detectSecret(entry) {
61
68
  }
62
69
  return { flagged: false, reason: null };
63
70
  }
64
- /** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
71
+ /**
72
+ * Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and
73
+ * co-occurrence guard as `detectSecret`;
65
74
  * for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
66
75
  export function redactSecrets(text) {
67
76
  return redactText(text, false);
@@ -69,15 +78,23 @@ export function redactSecrets(text) {
69
78
  /** Only a run's first character starts a match, so a long run is scanned once; a
70
79
  * domain's first label opens on a letter, so logo@2x.png and react@18.2.0 stay. */
71
80
  const EMAIL = /(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]{1,64}@[A-Za-z][A-Za-z0-9-]*(?:\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}\b/g;
72
- /** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
81
+ /**
82
+ * Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids.
83
+ */
73
84
  export function maskEmails(text) {
74
85
  return text.replace(EMAIL, '[email]');
75
86
  }
76
- /** Stricter redaction for text that leaves the machine: no co-occurrence guard, plus Bearer and Basic auth headers and JWTs. */
87
+ /**
88
+ * Stricter redaction for text that leaves the machine: no co-occurrence guard, plus Bearer and Basic auth headers and
89
+ * JWTs.
90
+ */
77
91
  export function redactSecretsStrict(text) {
78
92
  return redactText(text, true);
79
93
  }
80
- /** Write-time veto: `scrub` text no person typed gets capture's strict redaction; typed text is a person's own call, so it is kept and flagged. */
94
+ /**
95
+ * Write-time veto: `scrub` text no person typed gets capture's strict redaction; typed text is a person's own call, so
96
+ * it is kept and flagged.
97
+ */
81
98
  export function vetSecrets(content, tags, scrub) {
82
99
  const kept = scrub ? redactSecretsStrict(content) : content;
83
100
  const warnings = [];
@@ -94,7 +111,10 @@ export function vetSecrets(content, tags, scrub) {
94
111
  const JSON_STRING = /"(?:[^"\\]|\\.)*"/g;
95
112
  /** Appended to a dead-letter row's error when `redactPayload` changed its body. */
96
113
  export const DLQ_REDACTED_NOTE = 'secret-shaped text redacted, signature dropped; replay needs --force';
97
- /** `vetSecrets` redaction for a raw webhook body: JSON stays valid for replay, and an untouched body stays byte-identical so its signature still verifies. */
114
+ /**
115
+ * `vetSecrets` redaction for a raw webhook body: JSON stays valid for replay, and an untouched body stays
116
+ * byte-identical so its signature still verifies.
117
+ */
98
118
  export function redactPayload(raw) {
99
119
  try {
100
120
  JSON.parse(raw);
@@ -109,12 +129,27 @@ export function redactPayload(raw) {
109
129
  return kept === text ? literal : JSON.stringify(kept);
110
130
  });
111
131
  }
132
+ const PEM_BEGIN = /-----BEGIN [A-Z ]*PRIVATE KEY-----/g;
133
+ const PEM_END = /-----END [A-Z ]*PRIVATE KEY-----/g;
134
+ /** Each PEM/OpenSSH block through its END line, or to the end of a truncated block; one forward scan, so no ReDoS. */
135
+ function redactPemBlocks(text) {
136
+ let out = '';
137
+ let from = 0;
138
+ PEM_BEGIN.lastIndex = 0;
139
+ for (let begin = PEM_BEGIN.exec(text); begin; begin = PEM_BEGIN.exec(text)) {
140
+ PEM_END.lastIndex = PEM_BEGIN.lastIndex;
141
+ const end = PEM_END.exec(text);
142
+ out += `${text.slice(from, begin.index)}[REDACTED]`;
143
+ from = end ? PEM_END.lastIndex : text.length;
144
+ PEM_BEGIN.lastIndex = from;
145
+ }
146
+ return out + text.slice(from);
147
+ }
112
148
  function redactText(text, strict) {
113
149
  if (!text)
114
150
  return text;
115
- let result = text;
116
- // PEM/OpenSSH blocks first: SECRET_PATTERNS only matches BEGIN; consume through END, or to the end of a truncated block.
117
- result = result.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----(?:[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----|[\s\S]*$)/g, '[REDACTED]');
151
+ // PEM blocks first: SECRET_PATTERNS only matches the BEGIN line.
152
+ let result = redactPemBlocks(text);
118
153
  for (const { name, re } of SECRET_PATTERNS) {
119
154
  if (!strict && CO_OCCURRENCE_GUARDED.has(name) && !KEYISH_CONTEXT_RE.test(text))
120
155
  continue;