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
@@ -1,7 +1,8 @@
1
1
  // Sleep's tombstone checks run on one handle for the whole pass, owned here so no stage holds a raw one.
2
2
  import { closeHippoDb, openHippoDb } from '../db/index.js';
3
- import { appendAuditEvent } from './audit.js';
3
+ import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
4
4
  import { findRejectedValue } from './rejection.js';
5
+ import { errorMessage } from '../util/log.js';
5
6
  // Lazy so a sleep that checks nothing never opens the store; make it IMMEDIATELY before the try whose
6
7
  // finally closes it, so a throw in any phase cannot leak the handle.
7
8
  export function lazyTombstoneChecks(hippoRoot, dryRun) {
@@ -22,6 +23,14 @@ export function lazyTombstoneChecks(hippoRoot, dryRun) {
22
23
  if (db)
23
24
  appendAuditEvent(db, event);
24
25
  },
26
+ auditOrCount(event) {
27
+ try {
28
+ this.audit(event);
29
+ }
30
+ catch (error) {
31
+ reportAuditWriteFailure(event.op, errorMessage(error), event.targetId);
32
+ }
33
+ },
25
34
  close() {
26
35
  if (handle)
27
36
  closeHippoDb(handle);
@@ -1,5 +1,6 @@
1
1
  // The token-use and failure reports, each read on one handle of its own.
2
- // A file apart from token-ledger-rows.ts: src/store/token-ledger.ts imports that one, so a summary there would be an import cycle.
2
+ // A file apart from token-ledger-rows.ts: src/store/token-ledger.ts imports that one, so a summary there would be an
3
+ // import cycle.
3
4
  import { onHandle } from './open.js';
4
5
  import { summarizeTokenUse } from './token-ledger.js';
5
6
  import { summarizeFailures } from './failure-log.js';
@@ -15,7 +15,8 @@ export declare function replacesIndex(state: EmbeddingIndexState, model: string)
15
15
  export declare function storedIndexState(hippoRoot: string): EmbeddingIndexState;
16
16
  /** Records `identity` as what built the index under `hippoRoot`. */
17
17
  export declare function saveIndexIdentity(hippoRoot: string, identity: string): void;
18
- /** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via `loadStoredVectors`. */
18
+ /** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
19
+ * `loadStoredVectors`. */
19
20
  export declare function loadEmbeddingIndex(hippoRoot: string): Record<string, number[]>;
20
21
  export interface StoredVectorSummary {
21
22
  readonly ids: Set<string>;
@@ -29,17 +30,19 @@ export declare function loadStoredVectors(hippoRoot: string, ids: readonly strin
29
30
  export declare function loadStoredVectorViews(hippoRoot: string, ids: readonly string[]): Map<string, Float32Array>;
30
31
  /** Replace every stored vector with `index`; `model` defaults to the stored index identity. */
31
32
  export declare function saveEmbeddingIndex(hippoRoot: string, index: Record<string, number[]>, model?: string): void;
32
- /** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how many it wrote. */
33
+ /** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
34
+ * many it wrote. */
33
35
  export declare function saveStoredVectors(hippoRoot: string, rows: Iterable<readonly [string, readonly number[]]>, model: string): number;
34
- /** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids that still have one. */
35
- export declare function pruneStoredVectors(hippoRoot: string): Set<string>;
36
+ /** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids with no vector, oldest first. */
37
+ export declare function pruneStoredVectorsListPending(hippoRoot: string): string[];
36
38
  export declare function entriesWithoutVectorAt(db: DatabaseSyncLike, query: VectorBackfillQuery): MemoryEntry[];
37
39
  export declare function writeVectorsAt(db: DatabaseSyncLike, write: VectorWrite): VectorWriteResult;
38
40
  /** Every particle stored under `hippoRoot`. */
39
41
  export declare function loadStoredParticles(hippoRoot: string): PhysicsParticle[];
40
42
  /** Writes `particles` over their stored state under `hippoRoot`, as one batch. */
41
43
  export declare function saveStoredParticles(hippoRoot: string, particles: PhysicsParticle[]): void;
42
- /** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how many. Rows are read a page at a time. */
44
+ /** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
45
+ * many. Rows are read a page at a time. */
43
46
  export declare function resetStoredParticles(hippoRoot: string, ids: readonly string[], embeddingIndex: Record<string, number[]>): number;
44
47
  /** Stores a first particle for `entry`, placed at `vector`; a memory that has one keeps it. */
45
48
  export declare function seedStoredParticle(hippoRoot: string, entry: MemoryEntry, vector: number[]): void;
@@ -1,12 +1,16 @@
1
- // Owns hippo.db's stored vectors, the identity of the model that built them, and the particle rows: every read and write of the three.
1
+ // Owns hippo.db's stored vectors, the identity of the model that built them, and the particle rows: every read and
2
+ // write of the three.
2
3
  import { getMeta, setMeta, withWriteScope } from '../db/index.js';
3
4
  import { onHandle } from './open.js';
4
5
  import { DEFAULT_EMBEDDING_MODEL } from '../embeddings/local.js';
5
- import { float32ToBuffer, initializeParticle, loadPhysicsState, resetAllPhysicsState, savePhysicsState } from '../db/physics-state.js';
6
+ import { loadPhysicsState, resetAllPhysicsState, savePhysicsState } from '../db/physics-state.js';
7
+ import { initializeParticle } from '../core/physics.js';
8
+ import { float32ToBuffer } from '../util/vector-codec.js';
6
9
  import { EMBEDDING_MODEL_META_KEY, deleteOrphanVectors, hasStoredVectors, loadVectors, loadVectorViews, replaceAllVectors, storedVectorDims, storedVectorIds, upsertVectors, } from '../db/vector-store.js';
7
10
  import { selectEntriesByIds } from './entry-reads.js';
8
11
  import { chunked } from '../util/chunked.js';
9
12
  import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
13
+ import { placeholders } from '../util/sql.js';
10
14
  const MAX_BACKFILL_PAGE = 500;
11
15
  /** The model the index was built by: the stored identity, else the default model when vectors exist. */
12
16
  export function indexedModel(state) {
@@ -35,7 +39,8 @@ export function saveIndexIdentity(hippoRoot, identity) {
35
39
  setMeta(db, EMBEDDING_MODEL_META_KEY, identity);
36
40
  });
37
41
  }
38
- /** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via `loadStoredVectors`. */
42
+ /** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via
43
+ * `loadStoredVectors`. */
39
44
  export function loadEmbeddingIndex(hippoRoot) {
40
45
  return onHandle(hippoRoot, (db) => {
41
46
  return Object.fromEntries(loadVectors(db));
@@ -69,17 +74,24 @@ export function saveEmbeddingIndex(hippoRoot, index, model) {
69
74
  replaceAllVectors(db, index, model ?? getMeta(db, EMBEDDING_MODEL_META_KEY, ''));
70
75
  });
71
76
  }
72
- /** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how many it wrote. */
77
+ /** Inserts or replaces `rows` under `model`, each row its own commit so a failure keeps the rows before it; returns how
78
+ * many it wrote. */
73
79
  export function saveStoredVectors(hippoRoot, rows, model) {
74
80
  return onHandle(hippoRoot, (db) => {
75
81
  return upsertVectors(db, rows, model);
76
82
  });
77
83
  }
78
- /** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids that still have one. */
79
- export function pruneStoredVectors(hippoRoot) {
84
+ /** Drops the vectors of deleted memories under `hippoRoot`, then returns the ids with no vector, oldest first. */
85
+ export function pruneStoredVectorsListPending(hippoRoot) {
80
86
  return onHandle(hippoRoot, (db) => {
81
87
  deleteOrphanVectors(db);
82
- return storedVectorIds(db);
88
+ // SAFETY: the SELECT names exactly the one column read.
89
+ const rows = db
90
+ .prepare(`SELECT id FROM memories
91
+ WHERE NOT EXISTS (SELECT 1 FROM memory_vectors v WHERE v.memory_id = memories.id)
92
+ ORDER BY created ASC, id ASC`)
93
+ .all();
94
+ return rows.map((r) => r.id);
83
95
  });
84
96
  }
85
97
  export function entriesWithoutVectorAt(db, query) {
@@ -98,21 +110,25 @@ function ownedIds(db, ids, tenantId) {
98
110
  const owned = new Set();
99
111
  for (const chunk of chunked([...new Set(ids)])) {
100
112
  // SAFETY: the SELECT names one column, id.
101
- const rows = db.prepare(`SELECT id FROM memories WHERE +tenant_id = ? AND id IN (${chunk.map(() => '?').join(', ')})`).all(tenantId, ...chunk);
113
+ const rows = db
114
+ .prepare(`SELECT id FROM memories WHERE +tenant_id = ? AND id IN (${placeholders(chunk.length)})`)
115
+ .all(tenantId, ...chunk);
102
116
  for (const row of rows)
103
117
  owned.add(row.id);
104
118
  }
105
119
  return owned;
106
120
  }
107
- // savePhysicsState opens its own transaction and overwrites, so the first particle for a memory is inserted here instead.
121
+ // savePhysicsState opens its own transaction and overwrites, so the first particle for a memory is inserted here
122
+ // instead.
108
123
  function insertNewParticles(db, rows) {
109
124
  const stmt = db.prepare(`
110
125
  INSERT INTO memory_physics (memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation)
111
126
  VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(memory_id) DO NOTHING
112
127
  `);
113
128
  for (const { memoryId, particle: p } of rows) {
114
- if (p)
129
+ if (p) {
115
130
  stmt.run(memoryId, float32ToBuffer(p.position), float32ToBuffer(p.velocity), p.mass, p.charge, p.temperature, p.lastSimulation);
131
+ }
116
132
  }
117
133
  }
118
134
  export function writeVectorsAt(db, write) {
@@ -155,7 +171,8 @@ function* entriesInPages(db, ids) {
155
171
  }
156
172
  }
157
173
  }
158
- /** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how many. Rows are read a page at a time. */
174
+ /** Replaces every particle under `hippoRoot` with a fresh one per memory in `ids` that has an embedding; returns how
175
+ * many. Rows are read a page at a time. */
159
176
  export function resetStoredParticles(hippoRoot, ids, embeddingIndex) {
160
177
  return onHandle(hippoRoot, (db) => {
161
178
  return resetAllPhysicsState(db, entriesInPages(db, ids), embeddingIndex);
@@ -1,4 +1,5 @@
1
- /** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked, evicted past WM_MAX_ENTRIES per scope. */
1
+ /** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
2
+ * evicted past WM_MAX_ENTRIES per scope. */
2
3
  import type { JsonValue } from '../util/json.js';
3
4
  export declare const WM_MAX_ENTRIES = 20;
4
5
  export type JsonObject = {
@@ -15,8 +16,8 @@ export interface WorkingMemoryItem {
15
16
  createdAt: string;
16
17
  updatedAt: string;
17
18
  }
18
- /** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties: oldest created_at). Returns the new
19
- * row ID. */
19
+ /** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
20
+ * oldest created_at). Returns the new row ID. */
20
21
  export declare function wmPush(hippoRoot: string, opts: {
21
22
  scope: string;
22
23
  content: string;
@@ -39,7 +40,8 @@ export declare function wmClear(hippoRoot: string, opts?: {
39
40
  sessionId?: string;
40
41
  tenantId?: string;
41
42
  }): number;
42
- /** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state. Returns the count flushed. */
43
+ /** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
44
+ * Returns the count flushed. */
43
45
  export declare function wmFlush(hippoRoot: string, opts?: {
44
46
  scope?: string;
45
47
  sessionId?: string;
@@ -1,4 +1,5 @@
1
- /** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked, evicted past WM_MAX_ENTRIES per scope. */
1
+ /** Working Memory: bounded buffer for current-state notes, separate from long-term memory; scoped, importance-ranked,
2
+ * evicted past WM_MAX_ENTRIES per scope. */
2
3
  import { withWriteScope } from '../db/index.js';
3
4
  import { onHandle, openStore } from './open.js';
4
5
  import { warnDamagedColumn } from '../util/stored-json.js';
@@ -7,8 +8,8 @@ export const WM_MAX_ENTRIES = 20;
7
8
  function rowToItem(row) {
8
9
  let metadata = {};
9
10
  try {
10
- // SAFETY: metadata_json is always written by wmPush via JSON.stringify(opts.metadata ?? {}), so a successful parse yields a plain JSON object;
11
- // malformed content falls through to the catch below.
11
+ // SAFETY: metadata_json is always written by wmPush via JSON.stringify(opts.metadata ?? {}), so a successful parse
12
+ // yields a plain JSON object; malformed content falls through to the catch below.
12
13
  metadata = JSON.parse(row.metadata_json);
13
14
  }
14
15
  catch {
@@ -27,18 +28,21 @@ function rowToItem(row) {
27
28
  updatedAt: row.updated_at,
28
29
  };
29
30
  }
30
- /** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties: oldest created_at). Returns the new
31
- * row ID. */
31
+ /** Push a new entry into working memory; past WM_MAX_ENTRIES the scope's lowest-importance entry is evicted (ties:
32
+ * oldest created_at). Returns the new row ID. */
32
33
  export function wmPush(hippoRoot, opts) {
33
34
  return onHandle(hippoRoot, (db) => {
34
35
  const now = new Date().toISOString();
35
36
  const importance = opts.importance ?? 0;
36
37
  const tenantId = opts.tenantId ?? resolveTenantId({});
37
38
  return withWriteScope(db, 'wm_push', () => {
38
- const result = db.prepare(`
39
- INSERT INTO working_memory(scope, session_id, task_id, importance, content, metadata_json, created_at, updated_at, tenant_id)
39
+ const result = db
40
+ .prepare(`
41
+ INSERT INTO working_memory(scope, session_id, task_id, importance, content, metadata_json, created_at,
42
+ updated_at, tenant_id)
40
43
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
41
- `).run(opts.scope, opts.sessionId ?? null, opts.taskId ?? null, importance, opts.content, JSON.stringify(opts.metadata ?? {}), now, now, tenantId);
44
+ `)
45
+ .run(opts.scope, opts.sessionId ?? null, opts.taskId ?? null, importance, opts.content, JSON.stringify(opts.metadata ?? {}), now, now, tenantId);
42
46
  const id = Number(result.lastInsertRowid ?? 0);
43
47
  evictOverCapacity(db, opts.scope, tenantId);
44
48
  return id;
@@ -111,7 +115,8 @@ export function wmClear(hippoRoot, opts) {
111
115
  return Number(result.changes ?? 0);
112
116
  }, openStore);
113
117
  }
114
- /** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state. Returns the count flushed. */
118
+ /** Flush working memory after session end: same as wmClear, but marks the session-boundary discard of ephemeral state.
119
+ * Returns the count flushed. */
115
120
  export function wmFlush(hippoRoot, opts) {
116
121
  return wmClear(hippoRoot, opts);
117
122
  }
@@ -18,7 +18,8 @@ import { errorMessage } from './util/log.js';
18
18
  const TAIL_MAX_BYTES = 256 * 1024;
19
19
  export const TAIL_MAX_LINES = 200;
20
20
  const TAIL_MAX_LINE_CHARS = 2000;
21
- // Greedy on purpose: complete key blocks are redacted first, so any END left is an orphan and what precedes it may be key body.
21
+ // Greedy on purpose: complete key blocks are redacted first, so any END left is an orphan and what precedes it may be
22
+ // key body.
22
23
  const ORPHAN_KEY_END_RE = /^[\s\S]*-----END [A-Z ]*PRIVATE KEY-----/;
23
24
  // The other env vars hippo reads outside the HIPPO_ prefix (src/embeddings/provider.ts, connectors/*).
24
25
  const OTHER_ENV_NAMES = [
@@ -202,7 +203,8 @@ const HOME_SPELLINGS = [
202
203
  fileUrlPath,
203
204
  (p) => p.replace(/[^A-Za-z0-9]/g, '-'),
204
205
  ];
205
- // Git Bash, Cygwin and WSL mount a drive at /c, /cygdrive/c and /mnt/c; a Claude Code folder name writes each / and : as -.
206
+ // Git Bash, Cygwin and WSL mount a drive at /c, /cygdrive/c and /mnt/c; a Claude Code folder name writes each / and :
207
+ // as -.
206
208
  function mountedDrive(letter) {
207
209
  return `(?:${letter}[:-]|(?:[-/](?:cygdrive|mnt))?[-/]${letter})`;
208
210
  }
@@ -211,7 +213,8 @@ function spellingPattern(spelling, deep) {
211
213
  if (process.platform !== 'win32')
212
214
  return spelling.length >= 3 ? escapeRegex(spelling) : null;
213
215
  // Each tool that mounts a drive writes it its own way, so a home two or more folders below its drive (\Users\<name>)
214
- // matches after any prefix, with \, / or JSON's \\ between folders. A drive written a known way goes into the swap with it.
216
+ // matches after any prefix, with \, / or JSON's \\ between folders. A drive written a known way goes into the swap
217
+ // with it.
215
218
  const drive = /^([A-Za-z])[:-]/.exec(spelling);
216
219
  const below = drive === null ? spelling : spelling.slice(2);
217
220
  const body = below.split(/[\\/]+/).map(escapeRegex).join('[\\\\/]+');
@@ -222,7 +225,8 @@ function spellingPattern(spelling, deep) {
222
225
  }
223
226
  if (deep)
224
227
  return `${mountedDrive(drive[1])}?${body}`;
225
- // One folder (C:\x, D:\home) is a name any path may hold, so it swaps only after its drive and as a whole name; a drive
228
+ // One folder (C:\x, D:\home) is a name any path may hold, so it swaps only after its drive and as a whole name; a
229
+ // drive
226
230
  // root swaps nothing.
227
231
  return /[^\\/-]/.test(below) ? `(?<![\\p{L}\\p{N}_])${mountedDrive(drive[1])}${body}` : null;
228
232
  }
@@ -301,7 +305,8 @@ export function buildSupportBundle(opts) {
301
305
  env: listSetEnvNames(),
302
306
  logs: buildLogsSection(opts),
303
307
  };
304
- // Store paths found from the working folder arrive resolved; the global root arrives as HIPPO_HOME was typed, and log lines
308
+ // Store paths found from the working folder arrive resolved; the global root arrives as HIPPO_HOME was typed, and log
309
+ // lines
305
310
  // often quote the temp folder, which usually sits under the home.
306
311
  const redacted = redactStrings(bundle, buildHomePattern(opts.home, [getGlobalRoot(), os.tmpdir()]));
307
312
  // SAFETY: the value built above is always a JsonObject; redactStrings preserves object shape.
@@ -1,4 +1,3 @@
1
1
  /** Quarantine tier (CD5, AT3): pending/approved/rejected record for a memory `remember` flagged as untrusted. */
2
- export { quarantineScopeFor } from '../store/quarantine.js';
3
- export declare function isQuarantineScope(scope: string | null | undefined): boolean;
2
+ export { isQuarantineScope, quarantineScopeFor } from '../store/quarantine.js';
4
3
  //# sourceMappingURL=quarantine.d.ts.map
@@ -1,8 +1,4 @@
1
1
  /** Quarantine tier (CD5, AT3): pending/approved/rejected record for a memory `remember` flagged as untrusted. */
2
- import { QUARANTINE_SCOPE_PREFIX } from '../store/quarantine.js';
3
2
  // The scope a held memory is stored under is the table's own rule, so the store module owns it.
4
- export { quarantineScopeFor } from '../store/quarantine.js';
5
- export function isQuarantineScope(scope) {
6
- return scope != null && scope.startsWith(QUARANTINE_SCOPE_PREFIX);
7
- }
3
+ export { isQuarantineScope, quarantineScopeFor } from '../store/quarantine.js';
8
4
  //# sourceMappingURL=quarantine.js.map
@@ -9,14 +9,23 @@ export interface RejectFlowOpts {
9
9
  memoryId?: string;
10
10
  /** Pre-emptive form: reject a value not currently stored (or already gone). */
11
11
  value?: string;
12
- /** The caller's own personal scope: the only personal rows the sweep may remove. Unset (the CLI) skips every personal row. */
12
+ /**
13
+ * The caller's own personal scope: the only personal rows the sweep may remove. Unset (the CLI) skips every personal
14
+ * row.
15
+ */
13
16
  ownScope?: string;
14
17
  }
15
18
  export type RejectFlowResult = AppliedRejection;
16
- /** `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that holds it. */
19
+ /**
20
+ * `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that
21
+ * holds it.
22
+ */
17
23
  export declare function rejectValue(opts: RejectFlowOpts): RejectFlowResult;
18
24
  export type UnrejectOutcome = LiftedRejection;
19
- /** `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a rejected value again. */
25
+ /**
26
+ * `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a
27
+ * rejected value again.
28
+ */
20
29
  export declare function unrejectValue(hippoRoot: string, tenantId: string, digestOrPrefix: string, actor: string): UnrejectOutcome;
21
30
  /** `hippo rejections` / `api.listRejections` — list tombstones for a tenant. */
22
31
  export declare function listRejectionsForTenant(hippoRoot: string, tenantId: string): RejectedValueRow[];
@@ -18,7 +18,8 @@ function assertRejectOpts(opts) {
18
18
  throw new Error('reject accepts either a memory id or --value, not both.');
19
19
  }
20
20
  if (opts.value !== undefined && normalizeValueForRejection(opts.value).length === 0) {
21
- // Direct api callers can pass strings the CLI flag parser would refuse; an empty-normalized tombstone would refuse nothing and pollute the listing.
21
+ // Direct api callers can pass strings the CLI flag parser would refuse; an empty-normalized tombstone would refuse
22
+ // nothing and pollute the listing.
22
23
  throw new Error('reject --value requires non-empty content.');
23
24
  }
24
25
  }
@@ -29,15 +30,19 @@ function contentToReject(opts, row) {
29
30
  throw new Error(`memory not found: ${opts.memoryId}`);
30
31
  }
31
32
  // A tombstone is tenant-wide, so one made from personal text would show its reason to everyone.
32
- if (isPersonalScope(row.scope))
33
+ if (isPersonalScope(row.scope)) {
33
34
  throw new BadRequestError("Personal memories can't be rejected. Use forget to remove it.");
35
+ }
34
36
  return row.content;
35
37
  }
36
38
  /** Every row but another person's personal one, which is outside the caller's recall and so outside its reject. */
37
39
  function inReach(opts, scope) {
38
40
  return !isPersonalScope(scope) || scope === opts.ownScope;
39
41
  }
40
- /** `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that holds it. */
42
+ /**
43
+ * `hippo reject` and `api.reject`: refuses a bad request, then tombstones the value and removes every row in reach that
44
+ * holds it.
45
+ */
41
46
  export function rejectValue(opts) {
42
47
  assertRejectOpts(opts);
43
48
  return applyRejection(opts.hippoRoot, {
@@ -50,7 +55,10 @@ export function rejectValue(opts) {
50
55
  successorOf: mergedSuccessor,
51
56
  });
52
57
  }
53
- /** `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a rejected value again. */
58
+ /**
59
+ * `hippo unreject` and `api.unreject`: lifts the one tombstone a digest or prefix names. The only way to allow a
60
+ * rejected value again.
61
+ */
54
62
  export function unrejectValue(hippoRoot, tenantId, digestOrPrefix, actor) {
55
63
  // A blank prefix would match every digest and list the whole tombstone set as ambiguous.
56
64
  if (digestOrPrefix.trim().length === 0) {
@@ -1,4 +1,7 @@
1
- /** The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller reacts to. */
1
+ /**
2
+ * The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller
3
+ * reacts to.
4
+ */
2
5
  export interface AnthropicMessageRequest {
3
6
  apiKey: string;
4
7
  model?: string;
@@ -17,6 +20,8 @@ export type AnthropicMessageFailure = {
17
20
  } | {
18
21
  kind: 'unreadable';
19
22
  message: string;
23
+ } | {
24
+ kind: 'empty';
20
25
  };
21
26
  export type AnthropicMessageResult = {
22
27
  ok: true;
@@ -27,7 +32,7 @@ export type AnthropicMessageResult = {
27
32
  };
28
33
  /** True for a failure the next call would repeat, so a caller looping over items should stop rather than retry. */
29
34
  export declare function isPermanentFailure(failure: AnthropicMessageFailure): boolean;
30
- /** The reply's first text block, trimmed (empty when the reply has none); never throws. */
35
+ /** The reply's first text block, trimmed; a reply with no text is a failure of kind 'empty'. Never throws. */
31
36
  export declare function sendAnthropicMessage(req: AnthropicMessageRequest): Promise<AnthropicMessageResult>;
32
37
  /** The text extraction and DAG summaries hand to their `onError` callback. */
33
38
  export declare function describeMessageFailure(failure: AnthropicMessageFailure): string;
@@ -1,6 +1,9 @@
1
- /** The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller reacts to. */
1
+ /**
2
+ * The one Anthropic Messages client: sends one user prompt and returns the reply text or a typed failure the caller
3
+ * reacts to.
4
+ */
2
5
  import { fetchWithRetry, llmTimeoutMs, llmTotalMs } from './http-retry.js';
3
- import { errorMessage } from './log.js';
6
+ import { errorFields, errorMessage, log } from './log.js';
4
7
  import { readCappedJson, readCappedText } from './capped-json.js';
5
8
  import { isJsonObject, isJsonString } from './json.js';
6
9
  import { redactSecretsStrict } from './secret-detect.js';
@@ -24,14 +27,19 @@ function firstText(reply) {
24
27
  export function isPermanentFailure(failure) {
25
28
  return failure.kind === 'http' && PERMANENT_STATUSES.has(failure.status);
26
29
  }
27
- /** The start of a failed reply's body, on one line with any key-shaped text masked; empty when the body cannot be read. */
30
+ /**
31
+ * The start of a failed reply's body, on one line with any key-shaped text masked; empty when the body cannot be read.
32
+ */
28
33
  async function errorSnippet(res) {
29
34
  // The status is the failure reported; a body that cannot be read only costs its snippet.
30
- const body = await readCappedText(res, ERROR_SNIPPET_CHARS * UTF8_MAX_BYTES_PER_CHAR).catch(() => '');
35
+ const body = await readCappedText(res, ERROR_SNIPPET_CHARS * UTF8_MAX_BYTES_PER_CHAR).catch((err) => {
36
+ log.warn(`anthropic: could not read the error body of a ${res.status} reply`, errorFields(err));
37
+ return '';
38
+ });
31
39
  // Masked before the cut, so a key that straddles the cut is never left half shown.
32
40
  return redactSecretsStrict(body.replace(/\s+/g, ' ').trim()).slice(0, ERROR_SNIPPET_CHARS);
33
41
  }
34
- /** The reply's first text block, trimmed (empty when the reply has none); never throws. */
42
+ /** The reply's first text block, trimmed; a reply with no text is a failure of kind 'empty'. Never throws. */
35
43
  export async function sendAnthropicMessage(req) {
36
44
  let res;
37
45
  try {
@@ -56,9 +64,11 @@ export async function sendAnthropicMessage(req) {
56
64
  return { ok: false, failure: { kind: 'http', status: res.status, detail: await errorSnippet(res) } };
57
65
  try {
58
66
  const data = await readCappedJson(res, MAX_REPLY_BYTES);
59
- if (!isJsonObject(data))
67
+ if (!isJsonObject(data)) {
60
68
  return { ok: false, failure: { kind: 'unreadable', message: 'the reply is not a JSON object' } };
61
- return { ok: true, text: firstText(data) };
69
+ }
70
+ const text = firstText(data);
71
+ return text === '' ? { ok: false, failure: { kind: 'empty' } } : { ok: true, text };
62
72
  }
63
73
  catch (err) {
64
74
  return { ok: false, failure: { kind: 'unreadable', message: errorMessage(err) } };
@@ -70,6 +80,7 @@ export function describeMessageFailure(failure) {
70
80
  case 'request': return `request failed: ${failure.message}`;
71
81
  case 'http': return failure.detail ? `HTTP ${failure.status}: ${failure.detail}` : `HTTP ${failure.status}`;
72
82
  case 'unreadable': return `unparseable response: ${failure.message}`;
83
+ case 'empty': return 'the reply held no text';
73
84
  }
74
85
  }
75
86
  //# sourceMappingURL=anthropic-messages.js.map
@@ -1,4 +1,9 @@
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. */
3
- export declare function writeFileAtomic(file: string, text: string): void;
1
+ /** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
2
+ * content or the new, whole.
3
+ * A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can
4
+ * leave it truncated.
5
+ * `durable: false` skips the fsyncs for derived files that can be rebuilt; a reader still never sees a torn file. */
6
+ export declare function writeFileAtomic(file: string, text: string, opts?: {
7
+ readonly durable?: boolean;
8
+ }): void;
4
9
  //# sourceMappingURL=atomic-write.d.ts.map
@@ -1,17 +1,19 @@
1
1
  // One way to replace a file a user or another program depends on: write a temp file beside it, then rename over it.
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
- import { errorMessage, log } from './log.js';
4
+ import { errorMessage, log, errorFields } from './log.js';
5
5
  const RENAME_RETRY_MS = 1000;
6
6
  const WINDOWS_RENAME_REFUSALS = ['EPERM', 'EACCES', 'EBUSY'];
7
- // A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall back to one.
7
+ // A rename can be refused where an in-place write still works (a bind-mounted file, a read-only folder), so these fall
8
+ // back to one.
8
9
  const REPLACE_REFUSALS = ['EBUSY', 'EXDEV', 'EACCES', 'EPERM'];
9
10
  // Matches the usual SYMLOOP_MAX, so a link cycle ends in an error instead of a hang.
10
11
  const MAX_LINK_HOPS = 40;
11
12
  function errnoCode(err) {
12
13
  return 'code' in err ? String(err.code) : '';
13
14
  }
14
- /** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried before it is reported. */
15
+ /** Windows refuses a rename onto a file another program has open, usually for a moment, so a refusal is retried
16
+ * before it is reported. */
15
17
  function renameOnto(tmp, target) {
16
18
  const deadline = Date.now() + RENAME_RETRY_MS;
17
19
  const idle = new Int32Array(new SharedArrayBuffer(4));
@@ -29,7 +31,8 @@ function renameOnto(tmp, target) {
29
31
  }
30
32
  }
31
33
  }
32
- /** Where a write to `file` lands: through any symlink, a dangling one included, so a dotfile manager's link survives. */
34
+ /** Where a write to `file` lands: through any symlink, a
35
+ * dangling one included, so a dotfile manager's link survives. */
33
36
  function writeTarget(file) {
34
37
  let target = file;
35
38
  for (let hop = 0; hop < MAX_LINK_HOPS && fs.lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink(); hop++) {
@@ -43,29 +46,33 @@ function keepAccess(tmp, old) {
43
46
  if (process.getuid?.() === 0)
44
47
  fs.chownSync(tmp, old.uid, old.gid);
45
48
  }
46
- /** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays the one thrown. */
49
+ /** Cleanup must not hide the failure that made it necessary, so a cleanup error is logged and the first error stays
50
+ * the one thrown. */
47
51
  function removeTemp(tmp) {
48
52
  try {
49
53
  fs.rmSync(tmp, { force: true });
50
54
  }
51
55
  catch (err) {
52
- log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`);
56
+ log.warn(`could not remove the temporary file ${tmp}: ${errorMessage(err)}`, errorFields(err));
53
57
  }
54
58
  }
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) {
59
+ /** Flushed before the rename, or a crash soon after could
60
+ * leave the file's name on bytes that never reached the disk. */
61
+ function writeFlushed(tmp, text, old, durable) {
57
62
  const fd = fs.openSync(tmp, 'w', (old?.mode ?? 0o666) & 0o777);
58
63
  try {
59
64
  fs.writeFileSync(fd, text, 'utf8');
60
65
  if (old)
61
66
  keepAccess(tmp, old);
62
- fs.fsyncSync(fd);
67
+ if (durable)
68
+ fs.fsyncSync(fd);
63
69
  }
64
70
  finally {
65
71
  fs.closeSync(fd);
66
72
  }
67
73
  }
68
- /** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content, so it only warns. */
74
+ /** Stores the rename itself. Windows cannot flush a folder handle, and a failure here costs durability, not content,
75
+ * so it only warns. */
69
76
  function flushFolder(dir) {
70
77
  if (process.platform === 'win32')
71
78
  return;
@@ -79,22 +86,24 @@ function flushFolder(dir) {
79
86
  }
80
87
  }
81
88
  catch (err) {
82
- log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}`);
89
+ log.warn(`could not flush the folder ${dir} to disk after replacing a file in it: ${errorMessage(err)}`, errorFields(err));
83
90
  }
84
91
  }
85
- function replaceViaTemp(target, text, old) {
92
+ function replaceViaTemp(target, text, old, durable) {
86
93
  const tmp = `${target}.${process.pid}.tmp`;
87
94
  try {
88
- writeFlushed(tmp, text, old);
95
+ writeFlushed(tmp, text, old, durable);
89
96
  renameOnto(tmp, target);
90
97
  }
91
98
  catch (err) {
92
99
  removeTemp(tmp);
93
100
  throw err;
94
101
  }
95
- flushFolder(path.dirname(target));
102
+ if (durable)
103
+ flushFolder(path.dirname(target));
96
104
  }
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. */
105
+ /** The pre-rename write: it truncates first, so it is only the fallback, but it needs just a writable file and keeps
106
+ * hard links together. */
98
107
  function writeInPlace(target, text) {
99
108
  try {
100
109
  fs.writeFileSync(target, text, 'utf8');
@@ -108,16 +117,21 @@ function writeInPlace(target, text) {
108
117
  throw new Error(`${target} ${reason}`, { cause: err });
109
118
  }
110
119
  }
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. */
113
- export function writeFileAtomic(file, text) {
120
+ /** Replaces `file` through a flushed temp file and a rename, so a reader, or a crash at any point, finds the old
121
+ * content or the new, whole.
122
+ * A file with other hard links, or a rename the platform refuses (logged), is written in place: a crash mid-write can
123
+ * leave it truncated.
124
+ * `durable: false` skips the fsyncs for derived files that can be rebuilt; a reader still never sees a torn file. */
125
+ export function writeFileAtomic(file, text, opts = {}) {
126
+ const durable = opts.durable !== false;
114
127
  const target = writeTarget(file);
115
128
  const old = fs.statSync(target, { throwIfNoEntry: false });
116
129
  if (old === undefined) {
117
130
  fs.mkdirSync(path.dirname(target), { recursive: true });
118
131
  }
119
132
  else {
120
- // A rename replaces a read-only file that the in-place write refused, and Windows would retry that refusal for a second.
133
+ // A rename replaces a read-only file that the in-place write
134
+ // refused, and Windows would retry that refusal for a second.
121
135
  fs.accessSync(target, fs.constants.W_OK);
122
136
  }
123
137
  if (old !== undefined && old.nlink > 1) {
@@ -126,12 +140,13 @@ export function writeFileAtomic(file, text) {
126
140
  return;
127
141
  }
128
142
  try {
129
- replaceViaTemp(target, text, old);
143
+ replaceViaTemp(target, text, old, durable);
130
144
  }
131
145
  catch (err) {
132
146
  if (!(err instanceof Error) || !REPLACE_REFUSALS.includes(errnoCode(err)))
133
147
  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`);
148
+ log.warn(`${target} could not be replaced by a rename (${errnoCode(err)}), so it is ` +
149
+ `written in place: not atomic, a crash mid-write can leave it truncated`, errorFields(err));
135
150
  writeInPlace(target, text);
136
151
  }
137
152
  }