hippo-memory 1.70.0 → 1.71.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,3 +1,4 @@
1
- /** Writes `text` to `file` so a reader sees the old content or the new, never a truncated file: a crash mid-write leaves the old one. */
1
+ /** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old content or the new, whole.
2
+ * A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can leave it truncated. */
2
3
  export declare function writeFileAtomic(file: string, text: string): void;
3
4
  //# sourceMappingURL=atomic-write.d.ts.map
@@ -52,18 +52,47 @@ function removeTemp(tmp) {
52
52
  log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
53
53
  }
54
54
  }
55
- function replaceViaTemp(target, text, old) {
56
- const tmp = `${target}.${process.pid}.tmp`;
55
+ /** Flushed before the rename, or a crash soon after could leave the file's name on bytes that never reached the disk. */
56
+ function writeFlushed(tmp, text, old) {
57
+ const fd = fs.openSync(tmp, 'w', (old?.mode ?? 0o666) & 0o777);
57
58
  try {
58
- fs.writeFileSync(tmp, text, { encoding: 'utf8', mode: (old?.mode ?? 0o666) & 0o777 });
59
+ fs.writeFileSync(fd, text, 'utf8');
59
60
  if (old)
60
61
  keepAccess(tmp, old);
62
+ fs.fsyncSync(fd);
63
+ }
64
+ finally {
65
+ fs.closeSync(fd);
66
+ }
67
+ }
68
+ /** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content, so it only warns. */
69
+ function flushFolder(dir) {
70
+ if (process.platform === 'win32')
71
+ return;
72
+ try {
73
+ const fd = fs.openSync(dir, 'r');
74
+ try {
75
+ fs.fsyncSync(fd);
76
+ }
77
+ finally {
78
+ fs.closeSync(fd);
79
+ }
80
+ }
81
+ catch (err) {
82
+ log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}`);
83
+ }
84
+ }
85
+ function replaceViaTemp(target, text, old) {
86
+ const tmp = `${target}.${process.pid}.tmp`;
87
+ try {
88
+ writeFlushed(tmp, text, old);
61
89
  renameOnto(tmp, target);
62
90
  }
63
91
  catch (err) {
64
92
  removeTemp(tmp);
65
93
  throw err;
66
94
  }
95
+ flushFolder(path.dirname(target));
67
96
  }
68
97
  /** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps hard links together. */
69
98
  function writeInPlace(target, text) {
@@ -79,7 +108,8 @@ function writeInPlace(target, text) {
79
108
  throw new Error(`${target} ${reason}`, { cause: err });
80
109
  }
81
110
  }
82
- /** Writes `text` to `file` so a reader sees the old content or the new, never a truncated file: a crash mid-write leaves the old one. */
111
+ /** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old content or the new, whole.
112
+ * A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can leave it truncated. */
83
113
  export function writeFileAtomic(file, text) {
84
114
  const target = writeTarget(file);
85
115
  const old = fs.statSync(target, { throwIfNoEntry: false });
@@ -101,6 +131,7 @@ export function writeFileAtomic(file, text) {
101
131
  catch (err) {
102
132
  if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
103
133
  throw err;
134
+ log.warn(`${target} could not be replaced by a rename (${errnoCode(err)}), so it is written in place: not atomic, a crash mid-write can leave it truncated`);
104
135
  writeInPlace(target, text);
105
136
  }
106
137
  }
@@ -0,0 +1,6 @@
1
+ import type { JsonValue } from './json.js';
2
+ /** Reads a reply body as JSON and stops with an error as soon as it passes `maxBytes`. */
3
+ export declare function readCappedJson(resp: Response, maxBytes: number): Promise<JsonValue>;
4
+ /** Reads at most `maxBytes` of a body as text, then cancels the rest; never throws on size. */
5
+ export declare function readCappedText(resp: Response, maxBytes: number): Promise<string>;
6
+ //# sourceMappingURL=capped-json.d.ts.map
@@ -0,0 +1,46 @@
1
+ // The timeout bounds time, not bytes: a hostile endpoint could stream a huge 2xx body into memory.
2
+ /** Reads a reply body as JSON and stops with an error as soon as it passes `maxBytes`. */
3
+ export async function readCappedJson(resp, maxBytes) {
4
+ if (!resp.body)
5
+ throw new Error('reply has no body');
6
+ const reader = resp.body.getReader();
7
+ const decoder = new TextDecoder();
8
+ let raw = '';
9
+ let received = 0;
10
+ for (;;) {
11
+ const { done, value } = await reader.read();
12
+ if (done)
13
+ break;
14
+ received += value.byteLength;
15
+ if (received > maxBytes) {
16
+ await reader.cancel();
17
+ throw new Error(`reply over ${maxBytes} bytes`);
18
+ }
19
+ raw += decoder.decode(value, { stream: true });
20
+ }
21
+ raw += decoder.decode();
22
+ try {
23
+ return JSON.parse(raw);
24
+ }
25
+ catch (err) {
26
+ throw new Error('reply is not JSON', { cause: err });
27
+ }
28
+ }
29
+ /** Reads at most `maxBytes` of a body as text, then cancels the rest; never throws on size. */
30
+ export async function readCappedText(resp, maxBytes) {
31
+ if (!resp.body)
32
+ return '';
33
+ const reader = resp.body.getReader();
34
+ const chunks = [];
35
+ let received = 0;
36
+ while (received < maxBytes) {
37
+ const { done, value } = await reader.read();
38
+ if (done)
39
+ break;
40
+ chunks.push(value.subarray(0, maxBytes - received));
41
+ received += chunks[chunks.length - 1].byteLength;
42
+ }
43
+ await reader.cancel();
44
+ return new TextDecoder().decode(Buffer.concat(chunks));
45
+ }
46
+ //# sourceMappingURL=capped-json.js.map
@@ -1,5 +1,12 @@
1
+ /** What an entry point runs before it exits, and how long that may take before the process is ended without it. */
2
+ export interface Shutdown {
3
+ readonly run: () => void | Promise<void>;
4
+ readonly boundMs: number;
5
+ }
1
6
  /** Exit once stdout and stderr have drained, so the last reply and the last log line reach their reader; capped at 1 s. */
2
7
  export declare function exitAfterFlush(code: number): void;
8
+ /** On SIGTERM or SIGINT: runs `shutdown` once, then exits 0. */
9
+ export declare function installSignalHandlers(name: string, shutdown: Shutdown): void;
3
10
  /** After an uncaught throw the process state is unknown: log the cause, run `shutdown` once, then exit 1 for the supervisor or client to restart it. */
4
- export declare function installCrashHandlers(name: string, shutdown?: () => void | Promise<void>): void;
11
+ export declare function installCrashHandlers(name: string, shutdown?: Shutdown): void;
5
12
  //# sourceMappingURL=crash-handlers.d.ts.map
@@ -1,17 +1,59 @@
1
1
  // Last-resort process handlers shared by the long-running entry points (`hippo mcp`, `hippo serve`).
2
2
  import { errorFields, errorMessage, log } from './log.js';
3
- /** Exit once stdout and stderr have drained, so the last reply and the last log line reach their reader; capped at 1 s. */
4
- export function exitAfterFlush(code) {
5
- process.exitCode = code;
3
+ function afterFlush(leave) {
6
4
  let pending = 2;
7
5
  const done = () => { if (--pending === 0)
8
- process.exit(code); };
6
+ leave(); };
9
7
  process.stdout.write('', done);
10
8
  process.stderr.write('', done);
11
- setTimeout(() => process.exit(code), 1000).unref();
9
+ setTimeout(leave, 1000).unref();
10
+ }
11
+ /** Exit once stdout and stderr have drained, so the last reply and the last log line reach their reader; capped at 1 s. */
12
+ export function exitAfterFlush(code) {
13
+ process.exitCode = code;
14
+ afterFlush(() => process.exit(code));
15
+ }
16
+ // process.exit joins every worker thread, so one stuck in a synchronous statement would hold the exit open; a kill cannot be held.
17
+ function killSelf() {
18
+ process.kill(process.pid, 'SIGKILL');
19
+ }
20
+ /** Runs `shutdown` for `cause`, then exits with `code`, or 1 when it threw. One still running after its bound is logged and the process ended without it. */
21
+ function exitAfterShutdown(name, cause, shutdown, code) {
22
+ let ended = false;
23
+ // Referenced on purpose: a shutdown that never settles must end at the bound, not when the loop happens to empty.
24
+ const bound = setTimeout(() => {
25
+ ended = true;
26
+ log.error(`${name} shutdown after ${cause} did not finish within ${shutdown.boundMs} ms; ending the process without it`);
27
+ process.exitCode = 1;
28
+ afterFlush(killSelf);
29
+ }, shutdown.boundMs);
30
+ void Promise.resolve()
31
+ .then(shutdown.run)
32
+ .then(() => code, (err) => {
33
+ log.error(`${name} shutdown after ${cause} failed: ${errorMessage(err)}`, errorFields(err));
34
+ return 1;
35
+ })
36
+ .then((exitCode) => {
37
+ clearTimeout(bound);
38
+ if (!ended)
39
+ exitAfterFlush(exitCode);
40
+ });
41
+ }
42
+ /** On SIGTERM or SIGINT: runs `shutdown` once, then exits 0. */
43
+ export function installSignalHandlers(name, shutdown) {
44
+ let shuttingDown = false;
45
+ const stopFor = (signal) => {
46
+ if (shuttingDown)
47
+ return;
48
+ shuttingDown = true;
49
+ log.warn(`received ${signal}, shutting down`);
50
+ exitAfterShutdown(name, signal, shutdown, 0);
51
+ };
52
+ process.once('SIGTERM', () => stopFor('SIGTERM'));
53
+ process.once('SIGINT', () => stopFor('SIGINT'));
12
54
  }
13
55
  /** After an uncaught throw the process state is unknown: log the cause, run `shutdown` once, then exit 1 for the supervisor or client to restart it. */
14
- export function installCrashHandlers(name, shutdown = () => { }) {
56
+ export function installCrashHandlers(name, shutdown) {
15
57
  let crashing = false;
16
58
  const crash = (kind, err) => {
17
59
  log.error(`${name} ${kind}: ${errorMessage(err)}`, errorFields(err));
@@ -19,10 +61,10 @@ export function installCrashHandlers(name, shutdown = () => { }) {
19
61
  if (crashing)
20
62
  return;
21
63
  crashing = true;
22
- Promise.resolve()
23
- .then(shutdown)
24
- .catch((shutdownErr) => log.error(`${name} shutdown after ${kind} failed: ${errorMessage(shutdownErr)}`, errorFields(shutdownErr)))
25
- .finally(() => exitAfterFlush(1));
64
+ if (shutdown)
65
+ exitAfterShutdown(name, kind, shutdown, 1);
66
+ else
67
+ exitAfterFlush(1);
26
68
  };
27
69
  process.on('uncaughtException', (err) => crash('uncaught exception', err));
28
70
  process.on('unhandledRejection', (err) => crash('unhandled rejection', err));
@@ -28,7 +28,9 @@ export declare function envClaudeCodeSessionId(): string | undefined;
28
28
  export declare function envScope(): string | undefined;
29
29
  export declare function envGstackSkill(): string | undefined;
30
30
  export declare function envOpenclawSkill(): string | undefined;
31
- /** HIPPO_TENANT trimmed; empty or whitespace-only falls through to 'default'. */
31
+ /** The tenant of a store that names none. */
32
+ export declare const DEFAULT_TENANT_ID = "default";
33
+ /** HIPPO_TENANT trimmed; empty or whitespace-only falls through to the default tenant. */
32
34
  export declare function envTenant(): string;
33
35
  export declare function envSkipAutoIntegrations(): boolean;
34
36
  export declare function envSkipPostinstall(): boolean;
@@ -44,12 +46,15 @@ export declare function envPort(): string | undefined;
44
46
  /** How long a client waits for a running server's /health before writing to the store directly; server-detect.ts holds the default. */
45
47
  export declare function envHealthProbeMs(): number | undefined;
46
48
  export declare function envRequireAuth(): boolean;
49
+ /** `1` lets a request made on this machine in with no key, as host admin; HIPPO_REQUIRE_AUTH=1 wins over it. */
50
+ export declare function envAllowKeylessLocal(): boolean;
47
51
  export declare function envV1Rps(): string | undefined;
48
52
  /** How long a request body may take to arrive; http-util.ts holds the default. */
49
53
  export declare function envBodyTimeoutMs(): number | undefined;
50
54
  /** How long POST /v1/sleep lets its consolidation run; server/sleep-offload.ts holds the default. */
51
55
  export declare function envSleepTimeoutMs(): number | undefined;
52
- /** How long a /v1 or /mcp request may run before the server answers 504, 0 for no deadline; server/deadline.ts holds the default. */
56
+ /** How long a /v1 or /mcp request may run before the server answers 504, and a stdio MCP
57
+ * request before its timeout error; 0 for no deadline; server/deadline.ts holds the default. */
53
58
  export declare function envRequestDeadlineMs(): number | undefined;
54
59
  /** How many store calls may wait for one worker thread before the next is refused; store/sqlite/executor.ts holds the default. */
55
60
  export declare function envStoreQueueMax(): number | undefined;
@@ -69,6 +74,8 @@ export declare function envLlmTimeoutMs(): number | undefined;
69
74
  export declare function envTypesafeApiKey(): string | undefined;
70
75
  export declare function envJevTimeoutMs(): number | undefined;
71
76
  export declare function envJevModel(): string | undefined;
77
+ /** How long a recall waits for an API provider to embed its query before ranking on BM25 alone; search/vector.ts holds the default. */
78
+ export declare function envQueryEmbedTimeoutMs(): number | undefined;
72
79
  export declare function envLlmRerankerUrl(): string | undefined;
73
80
  export declare function envLlmRerankerKey(): string | undefined;
74
81
  export declare function envLlmRerankerModel(): string | undefined;
@@ -83,8 +90,8 @@ export declare function envSlackTeamId(): string | undefined;
83
90
  export declare function envSlackSigningSecret(): string | undefined;
84
91
  export declare function envSlackSigningSecretPrevious(): string | undefined;
85
92
  export declare function envSlackAllowUnknownTeamFallback(): boolean;
86
- export declare function envGithubToken(): string | undefined;
87
- export declare function envGithubWebhookSecret(): string | undefined;
88
- export declare function envGithubWebhookSecretPrevious(): string | undefined;
89
- export declare function envGithubAllowUnknownInstallationFallback(): boolean;
93
+ export declare function envGitHubToken(): string | undefined;
94
+ export declare function envGitHubWebhookSecret(): string | undefined;
95
+ export declare function envGitHubWebhookSecretPrevious(): string | undefined;
96
+ export declare function envGitHubAllowUnknownInstallationFallback(): boolean;
90
97
  //# sourceMappingURL=env.d.ts.map
package/dist/util/env.js CHANGED
@@ -71,9 +71,11 @@ export function envClaudeCodeSessionId() { return trimmed('CLAUDE_CODE_SESSION_I
71
71
  export function envScope() { return raw('HIPPO_SCOPE'); }
72
72
  export function envGstackSkill() { return raw('GSTACK_SKILL'); }
73
73
  export function envOpenclawSkill() { return raw('OPENCLAW_SKILL'); }
74
- /** HIPPO_TENANT trimmed; empty or whitespace-only falls through to 'default'. */
74
+ /** The tenant of a store that names none. */
75
+ export const DEFAULT_TENANT_ID = 'default';
76
+ /** HIPPO_TENANT trimmed; empty or whitespace-only falls through to the default tenant. */
75
77
  export function envTenant() {
76
- return raw('HIPPO_TENANT')?.trim() || 'default';
78
+ return raw('HIPPO_TENANT')?.trim() || DEFAULT_TENANT_ID;
77
79
  }
78
80
  // Install and CLI switches.
79
81
  export function envSkipAutoIntegrations() { return isOne('HIPPO_SKIP_AUTO_INTEGRATIONS'); }
@@ -91,12 +93,15 @@ export function envPort() { return raw('HIPPO_PORT'); }
91
93
  /** How long a client waits for a running server's /health before writing to the store directly; server-detect.ts holds the default. */
92
94
  export function envHealthProbeMs() { return positiveInt('HIPPO_HEALTH_PROBE_MS'); }
93
95
  export function envRequireAuth() { return isOne('HIPPO_REQUIRE_AUTH'); }
96
+ /** `1` lets a request made on this machine in with no key, as host admin; HIPPO_REQUIRE_AUTH=1 wins over it. */
97
+ export function envAllowKeylessLocal() { return isOne('HIPPO_ALLOW_KEYLESS_LOCAL'); }
94
98
  export function envV1Rps() { return raw('HIPPO_V1_RPS'); }
95
99
  /** How long a request body may take to arrive; http-util.ts holds the default. */
96
100
  export function envBodyTimeoutMs() { return positiveInt('HIPPO_BODY_TIMEOUT_MS'); }
97
101
  /** How long POST /v1/sleep lets its consolidation run; server/sleep-offload.ts holds the default. */
98
102
  export function envSleepTimeoutMs() { return positiveInt('HIPPO_SLEEP_TIMEOUT_MS'); }
99
- /** How long a /v1 or /mcp request may run before the server answers 504, 0 for no deadline; server/deadline.ts holds the default. */
103
+ /** How long a /v1 or /mcp request may run before the server answers 504, and a stdio MCP
104
+ * request before its timeout error; 0 for no deadline; server/deadline.ts holds the default. */
100
105
  export function envRequestDeadlineMs() { return nonNegativeInt('HIPPO_REQUEST_DEADLINE_MS'); }
101
106
  /** How many store calls may wait for one worker thread before the next is refused; store/sqlite/executor.ts holds the default. */
102
107
  export function envStoreQueueMax() { return positiveInt('HIPPO_STORE_QUEUE_MAX'); }
@@ -117,6 +122,8 @@ export function envLlmTimeoutMs() { return positiveInt('HIPPO_LLM_TIMEOUT_MS');
117
122
  export function envTypesafeApiKey() { return trimmed('TYPESAFE_API_KEY'); }
118
123
  export function envJevTimeoutMs() { return positiveInt('HIPPO_JEV_TIMEOUT_MS'); }
119
124
  export function envJevModel() { return raw('HIPPO_JEV_MODEL'); }
125
+ /** How long a recall waits for an API provider to embed its query before ranking on BM25 alone; search/vector.ts holds the default. */
126
+ export function envQueryEmbedTimeoutMs() { return positiveInt('HIPPO_QUERY_EMBED_TIMEOUT_MS'); }
120
127
  export function envLlmRerankerUrl() { return raw('HIPPO_LLM_RERANKER_URL'); }
121
128
  export function envLlmRerankerKey() { return raw('HIPPO_LLM_RERANKER_KEY'); }
122
129
  export function envLlmRerankerModel() { return raw('HIPPO_LLM_RERANKER_MODEL'); }
@@ -132,8 +139,8 @@ export function envSlackTeamId() { return raw('SLACK_TEAM_ID'); }
132
139
  export function envSlackSigningSecret() { return raw('SLACK_SIGNING_SECRET'); }
133
140
  export function envSlackSigningSecretPrevious() { return raw('SLACK_SIGNING_SECRET_PREVIOUS'); }
134
141
  export function envSlackAllowUnknownTeamFallback() { return isOne('SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK'); }
135
- export function envGithubToken() { return raw('GITHUB_TOKEN'); }
136
- export function envGithubWebhookSecret() { return raw('GITHUB_WEBHOOK_SECRET'); }
137
- export function envGithubWebhookSecretPrevious() { return raw('GITHUB_WEBHOOK_SECRET_PREVIOUS'); }
138
- export function envGithubAllowUnknownInstallationFallback() { return isOne('GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK'); }
142
+ export function envGitHubToken() { return raw('GITHUB_TOKEN'); }
143
+ export function envGitHubWebhookSecret() { return raw('GITHUB_WEBHOOK_SECRET'); }
144
+ export function envGitHubWebhookSecretPrevious() { return raw('GITHUB_WEBHOOK_SECRET_PREVIOUS'); }
145
+ export function envGitHubAllowUnknownInstallationFallback() { return isOne('GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK'); }
139
146
  //# sourceMappingURL=env.js.map
@@ -1,4 +1,5 @@
1
- /** One pattern per path shape that carries a user name: Windows, Git Bash and WSL mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
1
+ /** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
2
+ * mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
2
3
  export declare const USER_SEGMENT: readonly RegExp[];
3
4
  /** `text` with each home-directory segment replaced by `[home]`. */
4
5
  export declare function maskHomePaths(text: string): string;
@@ -2,7 +2,8 @@
2
2
  // VS Code writes file links URL-encoded, so a separator may be %5C or %2F.
3
3
  const WIN_SEP = String.raw `(?:[\\/]|%5[Cc]|%2[Ff])`;
4
4
  const WIN_CHAR = String.raw `(?:(?!%5[Cc]|%2[Ff])[^\\/:*?"<>|\s])`;
5
- // A Windows name never holds a quote, so JSON stops it; one with spaces runs to a separator, quote, closing mark or line end, leaving the mark, as stopping at its first word leaks the surname.
5
+ // A Windows name never holds a quote, so JSON stops it; one with spaces runs to a separator, quote,
6
+ // closing mark or line end, leaving the mark, as stopping at its first word leaks the surname.
6
7
  const WIN_USER = String.raw `(?:${WIN_CHAR}+(?: ${WIN_CHAR}+){0,3}(?=${WIN_SEP}|["'\`)\]>,;]|\.(?=\s|$)|(?<!\.)(?:[^\S ]|$))(?<![\`)\],;'])|${WIN_CHAR}+)`;
7
8
  // Slash-led homes with their case spelled out and no flag, so one pattern can hold all four: Git Bash and WSL mounts, Linux, root and macOS.
8
9
  const MOUNT_HOME = String.raw `(?:\/[Mm][Nn][Tt])?\/[A-Za-z]\/[Uu][Ss][Ee][Rr][Ss]\/${WIN_USER}`;
@@ -18,7 +19,8 @@ const MOUNT_START = String.raw `(?<![\w.])${MOUNT_HOME}`;
18
19
  const LINUX_START = String.raw `(?<![\w.~-])${LINUX_HOME}`;
19
20
  const ROOT_START = String.raw `(?<![\w.~-])${ROOT_HOME}`;
20
21
  const MAC_START = String.raw `(?<![\w.~-])${MAC_HOME}`;
21
- /** One pattern per path shape that carries a user name: Windows, Git Bash and WSL mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
22
+ /** One pattern per path shape that carries a user name: Windows, Git Bash and WSL
23
+ * mounts, extended-length, UNC home shares, Linux, macOS and 8.3 short names. */
22
24
  export const USER_SEGMENT = [
23
25
  DRIVE_HOME,
24
26
  new RegExp(MOUNT_START),
@@ -12,6 +12,7 @@ export interface RetryPolicy {
12
12
  /** Also retry a dropped connection or a timed-out attempt. On for GET and HEAD; any other method turns it on only when a replay cannot commit twice. */
13
13
  retryTransport?: boolean;
14
14
  fetchFn?: typeof fetch;
15
+ /** Replaces the timer between attempts. A caller `signal` that aborts still ends the wait at once. */
15
16
  sleep?: (ms: number) => Promise<void>;
16
17
  random?: () => number;
17
18
  }
@@ -22,6 +23,7 @@ export declare function isRetryableStatus(status: number): boolean;
22
23
  export declare function parseRetryAfterMs(header: string | null, now?: number): number | null;
23
24
  /** A dropped connection, a DNS hiccup or a timed-out attempt: faults a second try can clear. A refused connection is not one. */
24
25
  export declare function isTransientTransportError<E>(err: E): boolean;
25
- /** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see `retryTransport`) transport faults; the last response or error comes back as is. */
26
+ /** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
27
+ * `retryTransport`) transport faults; the last response or error comes back as is. */
26
28
  export declare function fetchWithRetry(url: string | URL, init: RequestInit, policy: RetryPolicy): Promise<Response>;
27
29
  //# sourceMappingURL=http-retry.d.ts.map
@@ -39,14 +39,35 @@ function isIdempotent(method) {
39
39
  const verb = (method ?? 'GET').toUpperCase();
40
40
  return verb === 'GET' || verb === 'HEAD';
41
41
  }
42
- const realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
43
- /** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see `retryTransport`) transport faults; the last response or error comes back as is. */
42
+ // `cancel` clears the timer, so a wait the caller left does not keep the process alive.
43
+ const timerSleep = (ms, cancel) => new Promise((resolve) => {
44
+ const timer = setTimeout(resolve, ms);
45
+ cancel?.addEventListener('abort', () => clearTimeout(timer), { once: true });
46
+ });
47
+ /** The wait between attempts. With a caller signal it ends the moment that signal aborts and rejects with its reason, so no further attempt starts. */
48
+ async function backoffWait(ms, sleep, signal) {
49
+ if (!signal)
50
+ return (sleep ?? timerSleep)(ms);
51
+ signal.throwIfAborted();
52
+ const left = new AbortController();
53
+ const aborted = new Promise((_resolve, reject) => {
54
+ signal.addEventListener('abort', () => reject(signal.reason), { once: true, signal: left.signal });
55
+ });
56
+ try {
57
+ // An injected sleep cannot be cancelled, so it is raced and left to run out.
58
+ await Promise.race([sleep ? sleep(ms) : timerSleep(ms, left.signal), aborted]);
59
+ }
60
+ finally {
61
+ left.abort();
62
+ }
63
+ }
64
+ /** `fetch` with a per-attempt timeout and up to `attempts` tries on 429, 5xx and (see
65
+ * `retryTransport`) transport faults; the last response or error comes back as is. */
44
66
  export async function fetchWithRetry(url, init, policy) {
45
67
  const fetchFn = policy.fetchFn ?? fetch;
46
68
  const attempts = Math.max(1, policy.attempts ?? DEFAULT_ATTEMPTS);
47
69
  const baseDelayMs = policy.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
48
70
  const maxDelayMs = policy.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
49
- const sleep = policy.sleep ?? realSleep;
50
71
  const random = policy.random ?? Math.random;
51
72
  const retryOn = policy.retryOn ?? ((res) => isRetryableStatus(res.status));
52
73
  const retryTransport = policy.retryTransport ?? isIdempotent(init.method);
@@ -66,7 +87,7 @@ export async function fetchWithRetry(url, init, policy) {
66
87
  // The caller's own abort is a decision, not a fault, so it ends the call.
67
88
  if (!retryTransport || attempt >= attempts || init.signal?.aborted || !isTransientTransportError(err))
68
89
  throw err;
69
- await sleep(backoffMs(attempt));
90
+ await backoffWait(backoffMs(attempt), policy.sleep, init.signal);
70
91
  continue;
71
92
  }
72
93
  if (!retryOn(res) || attempt >= attempts)
@@ -76,7 +97,7 @@ export async function fetchWithRetry(url, init, policy) {
76
97
  return res;
77
98
  // Frees the pooled socket before the next attempt.
78
99
  await res.body?.cancel();
79
- await sleep(retryAfter ?? backoffMs(attempt));
100
+ await backoffWait(retryAfter ?? backoffMs(attempt), policy.sleep, init.signal);
80
101
  }
81
102
  }
82
103
  //# sourceMappingURL=http-retry.js.map
@@ -1,4 +1,5 @@
1
- /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info, debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
1
+ /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
2
+ * debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
2
3
  export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
3
4
  /** Extra key=value pairs appended to the line. `ts` and, inside a request, `requestId` are added to every line written. */
4
5
  export interface LogFields {
@@ -13,7 +14,7 @@ export declare function isLevelEnabled(level: LogLevel): boolean;
13
14
  export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
14
15
  /** One JSON object per line for a log collector; JSON escaping keeps a multi-line value on the one line. */
15
16
  export declare function formatLogJson(level: LogLevel, message: string, fields?: LogFields): string;
16
- /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. */
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. */
17
18
  declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
18
19
  /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
19
20
  declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
package/dist/util/log.js CHANGED
@@ -1,4 +1,5 @@
1
- /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info, debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
1
+ /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info,
2
+ * debug); unset or unknown means warn. `HIPPO_LOG_FORMAT=json` writes JSON lines. */
2
3
  import { envLogJson, envLogLevel } from './env.js';
3
4
  import { currentRequestId } from './request-scope.js';
4
5
  const RANK = { error: 0, warn: 1, info: 2, debug: 3 };
@@ -36,19 +37,33 @@ function write(level, message, fields) {
36
37
  const format = envLogJson() ? formatLogJson : formatLogLine;
37
38
  process.stderr.write(`${format(level, message, stamped)}\n`);
38
39
  }
40
+ // Some keys follow the data (one per damaged row and column), so the set of them stops growing here.
41
+ const ONCE_KEY_CAP = 1_000;
39
42
  const onceKeys = new Set();
40
- /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. */
41
- function once(key, level, message, fields) {
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. */
45
+ function sightOnceKey(key) {
42
46
  if (onceKeys.has(key))
43
- return;
44
- onceKeys.add(key);
45
- write(level, message, fields);
47
+ return 'seen';
48
+ if (onceKeys.size < ONCE_KEY_CAP) {
49
+ onceKeys.add(key);
50
+ return 'new';
51
+ }
52
+ if (!onceCapReported) {
53
+ onceCapReported = true;
54
+ write('warn', `log: ${ONCE_KEY_CAP} once-only warnings were written; further new ones in this process log at debug`);
55
+ }
56
+ return 'uncounted';
57
+ }
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
+ function once(key, level, message, fields) {
60
+ const sighting = sightOnceKey(key);
61
+ if (sighting !== 'seen')
62
+ write(sighting === 'new' ? level : 'debug', message, fields);
46
63
  }
47
64
  /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
48
65
  function warnThenDebug(key, message, fields) {
49
- const level = onceKeys.has(key) ? 'debug' : 'warn';
50
- onceKeys.add(key);
51
- write(level, message, fields);
66
+ write(sightOnceKey(key) === 'new' ? 'warn' : 'debug', message, fields);
52
67
  }
53
68
  /** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
54
69
  export function errorFields(err) {
@@ -71,5 +86,6 @@ export function errorMessage(cause) {
71
86
  /** Test hook: forget which once-keys have fired. */
72
87
  export function resetLogOnce() {
73
88
  onceKeys.clear();
89
+ onceCapReported = false;
74
90
  }
75
91
  //# sourceMappingURL=log.js.map
@@ -22,6 +22,7 @@ export declare const requestScopes: AsyncLocalStorage<RequestScope>;
22
22
  export declare function currentRequestId(): string | undefined;
23
23
  /** The deadline of the request this code runs for, if it has one. */
24
24
  export declare function currentDeadline(): RequestDeadline | undefined;
25
- /** Runs `fn` with `requestId` on every log line it writes, including the ones from timers and promises it starts. `deadline` reaches every store call made inside. */
25
+ /** Runs `fn` with `requestId` on every log line it writes, including the ones from
26
+ * timers and promises it starts. `deadline` reaches every store call made inside. */
26
27
  export declare function runWithRequestId<T>(requestId: string, fn: () => T, deadline?: RequestDeadline): T;
27
28
  //# sourceMappingURL=request-scope.d.ts.map
@@ -40,7 +40,8 @@ export function currentRequestId() {
40
40
  export function currentDeadline() {
41
41
  return requestScopes.getStore()?.deadline;
42
42
  }
43
- /** Runs `fn` with `requestId` on every log line it writes, including the ones from timers and promises it starts. `deadline` reaches every store call made inside. */
43
+ /** Runs `fn` with `requestId` on every log line it writes, including the ones from
44
+ * timers and promises it starts. `deadline` reaches every store call made inside. */
44
45
  export function runWithRequestId(requestId, fn, deadline) {
45
46
  return requestScopes.run({ requestId, deadline }, fn);
46
47
  }
@@ -1,22 +1,5 @@
1
- /**
2
- * Secret detection for memory content (memory scope isolation).
3
- *
4
- * Conservative, provider-bounded patterns only - a bare `sk-` in prose must
5
- * NOT flag. Detection gates two surfaces:
6
- * - producer: shareMemory/autoShare never promote flagged rows to the
7
- * global store;
8
- * - consumer: ambient context (getContext) never injects a flagged row
9
- * outside its owning project, and never anywhere when the row has no
10
- * project origin. Explicit recall is unaffected - recalling a secret is
11
- * a deliberate act.
12
- *
13
- * This is deliberately a thin slice of lifecycle compliance
14
- * (no PII detection). Write-time scrubbing covers only text no person
15
- * typed into hippo; see `vetSecrets`.
16
- *
17
- * Leaf module: keep free of imports from store/api/shared so all of them
18
- * can import it without cycles.
19
- */
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. */
20
3
  /** Result of scanning one memory. `reason` names the tag or pattern that fired. */
21
4
  export interface SecretDetection {
22
5
  flagged: boolean;
@@ -24,21 +7,13 @@ export interface SecretDetection {
24
7
  }
25
8
  /** Tags that flag a memory as secret, lower case; detectSecret folds a tag's case before the lookup. */
26
9
  export declare const SECRET_TAGS: ReadonlySet<string>;
27
- /**
28
- * Scan a memory's tags + content for secret material.
29
- * Pure and deterministic; no filesystem or store access.
30
- */
10
+ /** Scan a memory's tags + content for secret material; pure and deterministic, no filesystem or store access. */
31
11
  export declare function detectSecret(entry: {
32
12
  content: string;
33
13
  tags: string[];
34
14
  }): SecretDetection;
35
- /**
36
- * Replace secret-shaped substrings in free text with a redaction marker.
37
- * Reuses the same `SECRET_PATTERNS` / co-occurrence guard as `detectSecret`
38
- * (which only flags whole-entry content) so callers that must persist raw
39
- * text that never passes through the normal capture content gate (e.g. the
40
- * pre-compact snapshot fields) can scrub it in place instead.
41
- */
15
+ /** Replace secret-shaped substrings in free text with a redaction marker, using the same `SECRET_PATTERNS` and co-occurrence guard as `detectSecret`;
16
+ * for callers persisting text that skips the capture content gate (e.g. pre-compact snapshot fields). */
42
17
  export declare function redactSecrets(text: string): string;
43
18
  /** Memories never hold a raw email address (AGENTS.md); phone numbers are left alone, as their patterns misfire on ids. */
44
19
  export declare function maskEmails(text: string): string;