hippo-memory 1.69.0 → 1.70.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 (860) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,54 +1,41 @@
1
1
  // hippo.db's half of the EntryWrites store group: the queries remember, outcome, supersede, archive and forget run today.
2
- import { ConflictError, NotFoundError } from '../api-errors.js';
2
+ import { ConflictError, NotFoundError } from '../../core/api-errors.js';
3
3
  import { appendAuditEvent } from '../audit.js';
4
- import { isSqliteBusy, withWriteScope } from '../db.js';
5
- import { log } from '../log.js';
6
- import { entryAfterOutcome } from '../memory.js';
4
+ import { isSqliteBusy, withWriteScope } from '../../db/index.js';
5
+ import { errorMessage, log } from '../../util/log.js';
6
+ import { entryAfterOutcome } from '../../core/memory.js';
7
7
  import { archiveRawMemory } from '../raw-archive.js';
8
8
  import { ownScopeTouches } from '../recall-scope.js';
9
+ import { recordTraceOutcome } from '../recall-trace.js';
9
10
  import { RejectedValueError } from '../rejection.js';
10
11
  import { markSummaryDirtyInTx } from '../summary-dirty.js';
11
- import { auditRejectionRefusal } from './audit-event.js';
12
- import { deleteEntryCore } from './delete-and-batch.js';
13
- import { selectEntriesByIds } from './entry-reads.js';
14
- import { stampOriginProject } from './entry-row.js';
15
- import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
16
- import { updateStatsUnlessBusy } from './index-and-stats.js';
17
- import { purgeMirrorBestEffort, removeEntryMirrors } from './mirrors.js';
18
- import { onHandle, openStore } from './open.js';
19
- import { selectMemoryReach } from './tenant-lookup.js';
12
+ import { auditRejectionRefusal } from '../audit-event.js';
13
+ import { deleteEntryCore } from '../delete-and-batch.js';
14
+ import { selectEntriesByIds } from '../entry-reads.js';
15
+ import { stampOriginProject } from '../entry-row.js';
16
+ import { writeEntryDbOnly, writeEntryMirrors } from '../entry-writes.js';
17
+ import { updateStatsUnlessBusy } from '../index-and-stats.js';
18
+ import { purgeMirrorBestEffort, removeEntryMirrors } from '../mirrors.js';
19
+ import { onHandle, openStore } from '../open.js';
20
+ import { selectMemoryReach } from '../tenant-lookup.js';
20
21
  /** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves neither. */
21
22
  export function sqliteEntryWrites(hippoRoot) {
22
23
  return {
23
- async writeEntry({ entry, actor }) {
24
- const stamped = stampOriginProject(hippoRoot, entry);
25
- onHandle(hippoRoot, (db) => writeInOwnTenant(db, stamped, actor), openStore);
26
- writeEntryMirrors(hippoRoot, stamped);
24
+ writeEntry(write) {
25
+ writeEntryAt(hippoRoot, write);
27
26
  },
28
- async applyOutcome(outcome) {
29
- const applied = onHandle(hippoRoot, (db) => applyOutcomeOn(db, outcome), openStore);
30
- for (const entry of applied)
31
- writeEntryMirrors(hippoRoot, entry);
32
- return applied.map((entry) => entry.id);
27
+ applyOutcome(outcome) {
28
+ return applyOutcomeAt(hippoRoot, outcome);
33
29
  },
34
- async supersede(write) {
30
+ supersede(write) {
35
31
  const successor = stampOriginProject(hippoRoot, write.successor);
36
32
  onHandle(hippoRoot, (db) => commitSupersede(db, { ...write, successor }));
37
33
  writeEntryMirrors(hippoRoot, successor);
38
34
  },
39
- async archiveRaw(archive) {
40
- const archivedAt = onHandle(hippoRoot, (db) => {
41
- const at = withWriteScope(db, 'archive_raw_in_reach', () => {
42
- assertInReach(db, archive, archive.id);
43
- return archiveRawMemory(db, archive.id, { reason: archive.reason, who: archive.actor });
44
- });
45
- cleanArchivedMirrors(db, hippoRoot, archive.id);
46
- return at;
47
- });
48
- updateStatsUnlessBusy(hippoRoot, { forgotten: 1 }, `removed ${archive.id}`);
49
- return archivedAt;
35
+ archiveRaw(archive) {
36
+ return archiveRawAt(hippoRoot, archive);
50
37
  },
51
- async forget(removal) {
38
+ forget(removal) {
52
39
  onHandle(hippoRoot, (db) => withWriteScope(db, 'forget_in_reach', () => {
53
40
  assertInReach(db, removal, removal.id);
54
41
  if (!deleteEntryCore(db, removal.id, { actor: removal.actor }))
@@ -59,6 +46,39 @@ export function sqliteEntryWrites(hippoRoot) {
59
46
  },
60
47
  };
61
48
  }
49
+ /** A store-side hook writes on the row's handle inside its write scope, so its throw undoes the row. */
50
+ export function writeEntryAt(hippoRoot, { entry, actor }, afterWrite) {
51
+ const stamped = stampOriginProject(hippoRoot, entry);
52
+ onHandle(hippoRoot, (db) => writeInOwnTenant(db, stamped, actor, afterWrite), openStore);
53
+ writeEntryMirrors(hippoRoot, stamped);
54
+ }
55
+ /** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves none. */
56
+ export function applyOutcomeAt(hippoRoot, outcome, traceId) {
57
+ const applied = onHandle(hippoRoot, (db) => {
58
+ const rows = applyOutcomeOn(db, outcome);
59
+ const memoryIds = rows.map((entry) => entry.id);
60
+ if (traceId !== undefined && rows.length > 0) {
61
+ recordTraceOutcome(db, { traceId, tenantId: outcome.tenantId, outcome: outcome.good ? 'positive' : 'negative', memoryIds });
62
+ }
63
+ return rows;
64
+ }, openStore);
65
+ for (const entry of applied)
66
+ writeEntryMirrors(hippoRoot, entry);
67
+ return applied.map((entry) => entry.id);
68
+ }
69
+ /** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so its throw undoes the archive. */
70
+ export function archiveRawAt(hippoRoot, archive, afterArchive) {
71
+ const archivedAt = onHandle(hippoRoot, (db) => {
72
+ const at = withWriteScope(db, 'archive_raw_in_reach', () => {
73
+ assertInReach(db, archive, archive.id);
74
+ return archiveRawMemory(db, archive.id, { reason: archive.reason, who: archive.actor, afterArchive });
75
+ });
76
+ cleanArchivedMirrors(db, hippoRoot, archive.id);
77
+ return at;
78
+ });
79
+ updateStatsUnlessBusy(hippoRoot, { forgotten: 1 }, `removed ${archive.id}`);
80
+ return archivedAt;
81
+ }
62
82
  function notFound(id) {
63
83
  return new NotFoundError(`memory not found: ${id}`);
64
84
  }
@@ -74,13 +94,10 @@ function assertIdInTenant(db, entry) {
74
94
  if (holder !== undefined && holder !== entry.tenantId)
75
95
  throw new ConflictError(`Memory ${entry.id} belongs to another tenant`);
76
96
  }
77
- /** The refusal row lands after the rollback, in a fresh implicit transaction the aborted one cannot undo. */
78
- function writeInOwnTenant(db, entry, actor) {
97
+ /** The refusal row lands after `write` has rolled back, in a fresh implicit transaction the aborted one cannot undo. */
98
+ export function auditingRefusal(db, actor, write) {
79
99
  try {
80
- withWriteScope(db, 'write_entry_in_tenant', () => {
81
- assertIdInTenant(db, entry);
82
- writeEntryDbOnly(db, entry, { actor });
83
- });
100
+ return write();
84
101
  }
85
102
  catch (err) {
86
103
  if (err instanceof RejectedValueError)
@@ -88,9 +105,16 @@ function writeInOwnTenant(db, entry, actor) {
88
105
  throw err;
89
106
  }
90
107
  }
108
+ /** writeEntryAt on the caller's handle, so a sibling group can read on it after the scope has unwound. */
109
+ export function writeInOwnTenant(db, entry, actor, afterWrite) {
110
+ auditingRefusal(db, actor, () => withWriteScope(db, 'write_entry_in_tenant', () => {
111
+ assertIdInTenant(db, entry);
112
+ writeEntryDbOnly(db, entry, { actor, afterWrite });
113
+ }));
114
+ }
91
115
  /** The reads, rewrites and outcome rows share one BEGIN IMMEDIATE transaction, hippo.db's form of the port's row lock; the caller writes the mirrors after. */
92
116
  function applyOutcomeOn(db, outcome) {
93
- return withWriteScope(db, 'apply_outcome', () => {
117
+ return auditingRefusal(db, outcome.actor, () => withWriteScope(db, 'apply_outcome', () => {
94
118
  const live = selectEntriesByIds(db, outcome.ids, outcome.tenantId);
95
119
  const applied = [];
96
120
  for (const id of outcome.ids) {
@@ -104,13 +128,13 @@ function applyOutcomeOn(db, outcome) {
104
128
  applied.push(updated);
105
129
  }
106
130
  return applied;
107
- });
131
+ }));
108
132
  }
109
133
  /** Reach, the CAS on the old row, the successor's insert and the supersede row in one BEGIN IMMEDIATE transaction. Two racing supersedes: one CAS wins. */
110
- export function commitSupersede(db, write) {
134
+ function commitSupersede(db, write) {
111
135
  const { tenantId, actor, oldId, successor } = write;
112
- db.exec('BEGIN IMMEDIATE');
113
- try {
136
+ // The refusal row lands after the scope has rolled back, in a fresh implicit transaction the aborted one cannot undo.
137
+ auditingRefusal(db, actor, () => withWriteScope(db, 'supersede', () => {
114
138
  assertInReach(db, write, oldId);
115
139
  // SAFETY: RETURNING names one column, dag_parent_id; no row means another writer got there first.
116
140
  const won = db.prepare('UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL RETURNING dag_parent_id')
@@ -123,26 +147,15 @@ export function commitSupersede(db, write) {
123
147
  assertIdInTenant(db, successor);
124
148
  writeEntryDbOnly(db, successor, { actor });
125
149
  appendAuditEvent(db, { tenantId, actor, op: 'supersede', targetId: oldId, metadata: { newId: successor.id } });
126
- db.exec('COMMIT');
127
- }
128
- catch (err) {
129
- try {
130
- db.exec('ROLLBACK');
131
- }
132
- catch { /* already rolled back */ }
133
- // The refusal row lands after ROLLBACK, in a fresh implicit transaction the aborted one cannot undo.
134
- if (err instanceof RejectedValueError)
135
- auditRejectionRefusal(db, err, actor);
136
- throw err;
137
- }
150
+ }));
138
151
  }
139
152
  /** A mirror left on disk would bring the archived row back on the next import; on failure the reaper retries, as mirror_cleaned_at stays NULL. */
140
- export function cleanArchivedMirrors(db, hippoRoot, id) {
153
+ function cleanArchivedMirrors(db, hippoRoot, id) {
141
154
  try {
142
155
  removeEntryMirrors(hippoRoot, id);
143
156
  }
144
157
  catch (mirrorErr) {
145
- log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${mirrorErr instanceof Error ? mirrorErr.message : String(mirrorErr)}`);
158
+ log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`);
146
159
  return;
147
160
  }
148
161
  try {
@@ -0,0 +1,17 @@
1
+ type FieldValue = string | number | boolean | null;
2
+ /** One error as a thread message can carry it. */
3
+ export interface WireError {
4
+ /** Constructor names from the thrown class up to Error: several classes set no `name`, so a name alone cannot pick the class. */
5
+ readonly classes: readonly string[];
6
+ readonly message: string;
7
+ readonly stack: string | undefined;
8
+ /** Own enumerable fields with a primitive value: `status`, `errcode`, `storeKind`, a `name` its constructor set. */
9
+ readonly fields: Readonly<Record<string, FieldValue>>;
10
+ readonly cause: WireError | undefined;
11
+ }
12
+ /** Worker side. A thrown value that is not an Error carries its text and no class. */
13
+ export declare function encodeError<E>(err: E, depth?: number): WireError;
14
+ /** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack, cause and fields. */
15
+ export declare function decodeError(wire: WireError): Error;
16
+ export {};
17
+ //# sourceMappingURL=error-codec.d.ts.map
@@ -0,0 +1,59 @@
1
+ // A thrown error crosses the worker boundary as plain data and arrives as an instance of its class: the server's mappers test `instanceof`, `errcode` and fields.
2
+ import { BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../../core/api-errors.js';
3
+ import { IncompatibleBinaryError, StoreBusyError } from '../../db/index.js';
4
+ import { BodyTimeoutError, BodyTooLargeError, HttpError } from '../../util/http-util.js';
5
+ import { errorMessage, log } from '../../util/log.js';
6
+ import { ScopeForbiddenError } from '../recall-scope.js';
7
+ import { RejectedValueError } from '../rejection.js';
8
+ import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '../../util/sqlite-blocked.js';
9
+ // Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses are thrown.
10
+ const CLASSES = [
11
+ Error, TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError,
12
+ HttpError, BodyTooLargeError, BodyTimeoutError,
13
+ BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError,
14
+ SqliteBlockedError, StoreNotPortedError, OtherStoreFolderError,
15
+ StoreBusyError, IncompatibleBinaryError,
16
+ ];
17
+ const PROTOTYPES = new Map(CLASSES.map((known) => [known.name, known.prototype]));
18
+ // A chain of causes deeper than this is cut, so a cycle cannot recurse for ever.
19
+ const MAX_CAUSES = 4;
20
+ function isFieldValue(value) {
21
+ return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
22
+ }
23
+ function classNames(err) {
24
+ const names = [];
25
+ let proto = Object.getPrototypeOf(err);
26
+ while (proto !== null && proto !== Object.prototype) {
27
+ names.push(proto.constructor.name);
28
+ proto = Object.getPrototypeOf(proto);
29
+ }
30
+ return names;
31
+ }
32
+ function ownFields(err) {
33
+ return Object.fromEntries(Object.entries(err).filter((field) => isFieldValue(field[1])));
34
+ }
35
+ /** Worker side. A thrown value that is not an Error carries its text and no class. */
36
+ export function encodeError(err, depth = 0) {
37
+ if (!(err instanceof Error))
38
+ return { classes: [], message: errorMessage(err), stack: undefined, fields: {}, cause: undefined };
39
+ const cause = err.cause === undefined || depth >= MAX_CAUSES ? undefined : encodeError(err.cause, depth + 1);
40
+ return { classes: classNames(err), message: err.message, stack: err.stack, fields: ownFields(err), cause };
41
+ }
42
+ /** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack, cause and fields. */
43
+ export function decodeError(wire) {
44
+ const thrown = wire.classes[0];
45
+ const known = wire.classes.find((name) => PROTOTYPES.has(name)) ?? 'Error';
46
+ const unlisted = thrown !== undefined && thrown !== known;
47
+ if (unlisted)
48
+ log.once(`store-worker-error:${thrown}`, 'warn', `a store worker threw ${thrown}, which the error codec does not list; it arrives as ${known}`);
49
+ // A listed ancestor still maps to its status, so its text stays as thrown; under plain Error the class survives only in the message.
50
+ const message = unlisted && known === 'Error' ? `${thrown}: ${wire.message}` : wire.message;
51
+ const rebuilt = wire.cause === undefined ? new Error(message) : new Error(message, { cause: decodeError(wire.cause) });
52
+ // The constructor is not run again: its arguments did not cross, and the fields below are what it set.
53
+ Object.setPrototypeOf(rebuilt, PROTOTYPES.get(known) ?? Error.prototype);
54
+ Object.assign(rebuilt, wire.fields);
55
+ if (wire.stack !== undefined)
56
+ rebuilt.stack = wire.stack;
57
+ return rebuilt;
58
+ }
59
+ //# sourceMappingURL=error-codec.js.map
@@ -0,0 +1,10 @@
1
+ /** Counted on the server thread, across every executor of the process. */
2
+ export declare const workerCounts: {
3
+ /** Calls refused because a thread's queue was full. */
4
+ queueRefusals: number;
5
+ /** Calls whose request deadline passed, waiting or running. */
6
+ jobsExpired: number;
7
+ /** Threads stopped at a deadline and replaced. */
8
+ workersReplaced: number;
9
+ };
10
+ //# sourceMappingURL=executor-counts.d.ts.map
@@ -0,0 +1,11 @@
1
+ // What the store workers refused, timed out and replaced since the process started; /health reports them beside the audit failure count.
2
+ /** Counted on the server thread, across every executor of the process. */
3
+ export const workerCounts = {
4
+ /** Calls refused because a thread's queue was full. */
5
+ queueRefusals: 0,
6
+ /** Calls whose request deadline passed, waiting or running. */
7
+ jobsExpired: 0,
8
+ /** Threads stopped at a deadline and replaced. */
9
+ workersReplaced: 0,
10
+ };
11
+ //# sourceMappingURL=executor-counts.js.map
@@ -0,0 +1,28 @@
1
+ import { type OpMode } from './worker-ops.js';
2
+ export interface CallOptions {
3
+ readonly mode: OpMode;
4
+ readonly requestId: string | undefined;
5
+ /** Epoch milliseconds by which the call's request must be answered; absent means the call waits as long as it takes. */
6
+ readonly deadlineAt?: number | undefined;
7
+ }
8
+ export interface ExecutorOptions {
9
+ /** Lock wait of each thread's connection; defaults to the server's. */
10
+ readonly busyWaitMs?: number;
11
+ /** Calls that may wait for one thread; defaults to HIPPO_STORE_QUEUE_MAX, else 256. */
12
+ readonly queueMax?: number;
13
+ /** How long past its deadline a write may still report its own outcome; defaults to 2000 ms. */
14
+ readonly writeGraceMs?: number;
15
+ }
16
+ export interface SqliteExecutor {
17
+ /** Runs `op` of the synchronous store on a worker thread. A throw there rejects here as an instance of its own class. */
18
+ call<T>(op: string, args: readonly unknown[], opts: CallOptions): Promise<T>;
19
+ /** Resolves once every thread has exited: Windows cannot delete a store folder while a thread holds its files. */
20
+ close(): Promise<void>;
21
+ /** Threads started and not yet exited. */
22
+ liveThreads(): number;
23
+ /** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh thread. */
24
+ terminateWriter(): void;
25
+ }
26
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
27
+ export declare function createSqliteExecutor(hippoRoot: string, opts?: ExecutorOptions): SqliteExecutor;
28
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1,286 @@
1
+ // The server thread's side of the store workers: SQLite's synchronous statements and lock waits run on their threads, so the event loop keeps answering.
2
+ import { fileURLToPath } from 'node:url';
3
+ import { SHARE_ENV, Worker } from 'node:worker_threads';
4
+ import { addAuditWriteFailures } from '../audit.js';
5
+ import { getHippoDbPath, SERVER_DB_WAIT_MS, StoreBusyError } from '../../db/index.js';
6
+ import { autoCheckpointPages } from '../../db/wal-checkpointer.js';
7
+ import { envStoreQueueMax } from '../../util/env.js';
8
+ import { DeadlineExceededError } from '../../util/http-util.js';
9
+ import { errorMessage, log } from '../../util/log.js';
10
+ import { requestScopes } from '../../util/request-scope.js';
11
+ import { decodeError } from './error-codec.js';
12
+ import { workerCounts } from './executor-counts.js';
13
+ import { STORE_SETUP_OP } from './worker-ops.js';
14
+ // Resolved from the package root, so a server run from TypeScript source starts the same built file.
15
+ const WORKER_ENTRY = fileURLToPath(new URL('../../../dist/store/sqlite/worker-entry.js', import.meta.url));
16
+ const WORKER_GONE = 'the store worker stopped before it answered; a write it was running may or may not be saved';
17
+ const EXECUTOR_CLOSED = 'the store is closed';
18
+ const QUEUE_FULL = 'the store worker has a full queue, so the call was refused before it ran';
19
+ const EXPIRED_WAITING = "the call was still waiting for a store worker at its request's deadline, so it never ran";
20
+ const READ_LATE = "the store did not answer the read by the request's deadline";
21
+ const WRITE_NOT_SAVED = "the store did not finish the write by the request's deadline; the write was stopped and nothing was saved";
22
+ const WRITE_UNKNOWN = "the store did not confirm the write by the request's deadline; it may or may not be saved";
23
+ // Far above any burst a healthy thread clears, small enough that a stuck thread refuses new work in bounded memory.
24
+ const DEFAULT_QUEUE_MAX = 256;
25
+ // How long past its deadline a write may still report its own outcome before the caller is told it is unknown.
26
+ const DEFAULT_WRITE_GRACE_MS = 2000;
27
+ function laneOf(mode) {
28
+ return { mode, queue: [], running: undefined, worker: undefined, stopping: undefined, commitFlag: undefined };
29
+ }
30
+ /** Gives `pending`'s caller its one answer; a second call does nothing. */
31
+ function finish(pending, answer) {
32
+ if (pending.answered)
33
+ return;
34
+ pending.answered = true;
35
+ clearTimeout(pending.timer);
36
+ answer();
37
+ }
38
+ function mayHaveCommitted(lane, pending) {
39
+ return lane.commitFlag !== undefined && Atomics.load(lane.commitFlag, 0) === pending.job.id;
40
+ }
41
+ function load(lane) {
42
+ return lane.queue.length + (lane.running === undefined ? 0 : 1);
43
+ }
44
+ class WorkerPool {
45
+ #hippoRoot;
46
+ #busyWaitMs;
47
+ // One writer, so writes run in call order and never wait on each other's lock.
48
+ #writer = laneOf('write');
49
+ #readers = [laneOf('read'), laneOf('read')];
50
+ // Keyed by thread and not by lane: close() must also wait for a thread its lane already replaced.
51
+ #exits = new Map();
52
+ #queueMax;
53
+ #writeGraceMs;
54
+ #nextId = 1;
55
+ #closed = false;
56
+ // 'done' once the writer has run the store's open-time setup, which a reader's connection could not write.
57
+ #setup = 'none';
58
+ constructor(hippoRoot, opts) {
59
+ this.#hippoRoot = hippoRoot;
60
+ this.#busyWaitMs = opts.busyWaitMs ?? SERVER_DB_WAIT_MS;
61
+ this.#queueMax = opts.queueMax ?? envStoreQueueMax() ?? DEFAULT_QUEUE_MAX;
62
+ this.#writeGraceMs = opts.writeGraceMs ?? DEFAULT_WRITE_GRACE_MS;
63
+ }
64
+ call(op, args, { mode, requestId, deadlineAt }) {
65
+ return new Promise((resolve, reject) => {
66
+ if (this.#closed) {
67
+ reject(new StoreBusyError(EXECUTOR_CLOSED));
68
+ return;
69
+ }
70
+ const settle = (reply) => {
71
+ if (!reply.ok) {
72
+ reject(decodeError(reply.error));
73
+ return;
74
+ }
75
+ // SAFETY: the worker ran `op` of the synchronous store, whose result is the T the caller's port method declares.
76
+ resolve(reply.value);
77
+ };
78
+ const lane = mode === 'write' ? this.#writer : this.#readers.reduce((least, next) => (load(next) < load(least) ? next : least));
79
+ const refusal = this.#refusal(lane, deadlineAt);
80
+ if (refusal !== undefined) {
81
+ reject(refusal);
82
+ return;
83
+ }
84
+ const pending = { job: { id: this.#nextId++, op, args, requestId }, settle, fail: reject, deadlineAt, timer: undefined, answered: false };
85
+ this.#watchDeadline(lane, pending);
86
+ lane.queue.push(pending);
87
+ this.#ensureSetup();
88
+ this.#pump(lane);
89
+ });
90
+ }
91
+ // Ahead of the call that started it, and with no deadline: the writer's own lock wait bounds it.
92
+ #ensureSetup() {
93
+ if (this.#setup !== 'none')
94
+ return;
95
+ this.#setup = 'running';
96
+ const pending = {
97
+ job: { id: this.#nextId++, op: STORE_SETUP_OP, args: [], requestId: undefined },
98
+ settle: (reply) => this.#setupEnded(reply.ok ? undefined : decodeError(reply.error)),
99
+ fail: (err) => this.#setupEnded(err),
100
+ deadlineAt: undefined,
101
+ timer: undefined,
102
+ answered: false,
103
+ };
104
+ this.#writer.queue.unshift(pending);
105
+ this.#pump(this.#writer);
106
+ }
107
+ // A failed setup fails the reads that waited for it with its own error, as each read's own open would have, and the next call tries it again.
108
+ #setupEnded(failure) {
109
+ this.#setup = failure === undefined ? 'done' : 'none';
110
+ for (const lane of this.#readers) {
111
+ if (failure !== undefined)
112
+ for (const waiting of lane.queue.splice(0))
113
+ finish(waiting, () => waiting.fail(failure));
114
+ this.#pump(lane);
115
+ }
116
+ }
117
+ // Nothing is queued and nothing ran, so both refusals are the retryable 503 of a busy store.
118
+ #refusal(lane, deadlineAt) {
119
+ if (lane.queue.length >= this.#queueMax) {
120
+ workerCounts.queueRefusals += 1;
121
+ return new StoreBusyError(QUEUE_FULL);
122
+ }
123
+ if (deadlineAt !== undefined && deadlineAt <= Date.now()) {
124
+ workerCounts.jobsExpired += 1;
125
+ return new StoreBusyError(EXPIRED_WAITING);
126
+ }
127
+ return undefined;
128
+ }
129
+ #watchDeadline(lane, pending) {
130
+ if (pending.deadlineAt === undefined)
131
+ return;
132
+ pending.timer = setTimeout(() => this.#expire(lane, pending), pending.deadlineAt - Date.now());
133
+ // The request that waits on the call keeps the process alive; this timer alone must not.
134
+ pending.timer.unref();
135
+ }
136
+ #expire(lane, pending) {
137
+ workerCounts.jobsExpired += 1;
138
+ const place = lane.queue.indexOf(pending);
139
+ if (place >= 0) {
140
+ lane.queue.splice(place, 1);
141
+ finish(pending, () => pending.fail(new StoreBusyError(EXPIRED_WAITING)));
142
+ return;
143
+ }
144
+ if (lane.running !== pending || lane.worker === undefined)
145
+ return;
146
+ log.warn(`the store's ${lane.mode} worker ran '${pending.job.op}' past its request's deadline`, { requestId: pending.job.requestId });
147
+ if (lane.mode === 'read')
148
+ this.#stopReader(lane, lane.worker, pending);
149
+ else
150
+ this.#stopWriter(lane, lane.worker, pending);
151
+ }
152
+ // A read changes nothing, so its caller is answered at once; the thread is replaced when it has exited.
153
+ #stopReader(lane, worker, pending) {
154
+ finish(pending, () => pending.fail(new DeadlineExceededError(READ_LATE)));
155
+ lane.stopping = worker;
156
+ void worker.terminate();
157
+ }
158
+ // Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping it could not undo the write.
159
+ #stopWriter(lane, worker, pending) {
160
+ if (!mayHaveCommitted(lane, pending)) {
161
+ lane.stopping = worker;
162
+ this.terminateWriter();
163
+ }
164
+ // A statement in flight runs to its end even after the stop, so the caller waits for the thread's own word only this long.
165
+ pending.timer = setTimeout(() => finish(pending, () => pending.fail(new DeadlineExceededError(WRITE_UNKNOWN))), this.#writeGraceMs);
166
+ pending.timer.unref();
167
+ }
168
+ // The thread has exited, so the write lock is free and what the stopped job did is final.
169
+ #replaceStopped(lane) {
170
+ const stopped = lane.running;
171
+ lane.stopping = undefined;
172
+ lane.running = undefined;
173
+ workerCounts.workersReplaced += 1;
174
+ if (stopped !== undefined) {
175
+ // Read only now: the thread could still set its flag between the deadline and its exit.
176
+ const message = mayHaveCommitted(lane, stopped) ? WRITE_UNKNOWN : WRITE_NOT_SAVED;
177
+ finish(stopped, () => stopped.fail(new DeadlineExceededError(message)));
178
+ }
179
+ if (!this.#closed)
180
+ this.#pump(lane);
181
+ }
182
+ async close() {
183
+ this.#closed = true;
184
+ for (const lane of [this.#writer, ...this.#readers]) {
185
+ for (const pending of lane.queue.splice(0))
186
+ finish(pending, () => pending.fail(new StoreBusyError(EXECUTOR_CLOSED)));
187
+ // An idle thread is unreferenced, and the process must not end before the thread has closed its connection.
188
+ lane.worker?.ref();
189
+ // Read after the reply of a job still running; the thread then closes its connection and ends.
190
+ lane.worker?.postMessage('stop');
191
+ }
192
+ await Promise.all(this.#exits.values());
193
+ }
194
+ liveThreads() {
195
+ return this.#exits.size;
196
+ }
197
+ terminateWriter() {
198
+ void this.#writer.worker?.terminate();
199
+ }
200
+ #pump(lane) {
201
+ if (lane.running !== undefined)
202
+ return;
203
+ // Setup comes first: a reader sent a job before it would open a store whose setup it cannot write.
204
+ if (lane.mode === 'read' && this.#setup !== 'done')
205
+ return;
206
+ const next = lane.queue.shift();
207
+ if (next === undefined)
208
+ return;
209
+ // Started by the first call and never at boot, so a server that only answers /health opens no thread.
210
+ // Outside that call's request scope, or the thread's listeners would log every later event under its request id.
211
+ lane.worker ??= requestScopes.exit(() => this.#start(lane));
212
+ lane.running = next;
213
+ // An idle thread never keeps the process alive; one with a call in flight does.
214
+ lane.worker.ref();
215
+ try {
216
+ lane.worker.postMessage({ ...next.job, walPages: autoCheckpointPages(getHippoDbPath(this.#hippoRoot)) });
217
+ }
218
+ catch (err) {
219
+ // Arguments that cannot be copied to the thread fail this call alone.
220
+ this.#idle(lane, lane.worker);
221
+ finish(next, () => next.fail(err instanceof Error ? err : new Error(errorMessage(err))));
222
+ this.#pump(lane);
223
+ }
224
+ }
225
+ #idle(lane, worker) {
226
+ lane.running = undefined;
227
+ worker.unref();
228
+ }
229
+ #start(lane) {
230
+ // A fresh flag per thread: a job id left by the thread before it could match no later job, but a shared buffer would outlive its writer.
231
+ const shared = lane.mode === 'write' ? new SharedArrayBuffer(4) : undefined;
232
+ lane.commitFlag = shared && new Int32Array(shared);
233
+ const init = { hippoRoot: this.#hippoRoot, mode: lane.mode, busyWaitMs: this.#busyWaitMs, ...(shared && { commitFlag: shared }) };
234
+ // An explicit execArgv keeps the parent's loaders out of the thread and silences its repeat of the node:sqlite warning.
235
+ const worker = new Worker(WORKER_ENTRY, { env: SHARE_ENV, execArgv: ['--no-warnings'], workerData: init });
236
+ worker.unref();
237
+ worker.on('message', (reply) => this.#settle(lane, worker, reply));
238
+ worker.on('error', (err) => this.#retire(lane, worker, err));
239
+ const exited = new Promise((resolve) => {
240
+ worker.once('exit', () => {
241
+ this.#exits.delete(worker);
242
+ this.#retire(lane, worker);
243
+ resolve();
244
+ });
245
+ });
246
+ this.#exits.set(worker, exited);
247
+ return worker;
248
+ }
249
+ #settle(lane, worker, reply) {
250
+ const done = lane.running;
251
+ // A reply for a call that was already rejected with its thread has no caller left.
252
+ if (lane.worker !== worker || done === undefined || done.job.id !== reply.id)
253
+ return;
254
+ addAuditWriteFailures(reply.auditFailures);
255
+ finish(done, () => done.settle(reply));
256
+ // A thread being stopped answered first; its lane stays taken until it has exited.
257
+ if (lane.stopping === worker)
258
+ return;
259
+ this.#idle(lane, worker);
260
+ this.#pump(lane);
261
+ }
262
+ // The lane keeps a stopped thread until it has exited, so a new thread never starts while the old one may still hold the write lock.
263
+ #retire(lane, worker, cause) {
264
+ if (lane.worker !== worker)
265
+ return;
266
+ lane.worker = undefined;
267
+ if (lane.stopping === worker) {
268
+ // Stopped on purpose: the calls still waiting run on the replacement.
269
+ this.#replaceStopped(lane);
270
+ return;
271
+ }
272
+ const lost = lane.running === undefined ? lane.queue.splice(0) : [lane.running, ...lane.queue.splice(0)];
273
+ lane.running = undefined;
274
+ if (lost.length > 0 || cause !== undefined) {
275
+ log.warn(`the store's ${lane.mode} worker stopped with ${lost.length} call(s) unanswered${cause === undefined ? '' : `: ${cause.message}`}`);
276
+ }
277
+ // The server answers this class as its retryable 503.
278
+ for (const pending of lost)
279
+ finish(pending, () => pending.fail(new StoreBusyError(WORKER_GONE, { cause })));
280
+ }
281
+ }
282
+ /** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first call starts the writer for the store's setup; a reader starts at its own first call. */
283
+ export function createSqliteExecutor(hippoRoot, opts = {}) {
284
+ return new WorkerPool(hippoRoot, opts);
285
+ }
286
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1,5 @@
1
+ import type { GraphReads, Sync } from '../port.js';
2
+ export declare function sqliteGraphReads(hippoRoot: string): Sync<GraphReads>;
3
+ /** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
4
+ export declare function servedGraphReads(sync: Sync<GraphReads>): GraphReads;
5
+ //# sourceMappingURL=graph-reads-group.d.ts.map
@@ -0,0 +1,18 @@
1
+ // hippo.db's half of the GraphReads store group: one read snapshot around the walk the CLI graph commands run.
2
+ import { canReadScope } from '../recall-scope.js';
3
+ import { withGraphReadSnapshot } from '../graph-reads.js';
4
+ import { graphViewRows } from '../graph-view-rows.js';
5
+ export function sqliteGraphReads(hippoRoot) {
6
+ return {
7
+ graphRows: (tenantId, { entity, limit, reader }) => withGraphReadSnapshot(hippoRoot, (db) => graphViewRows(hippoRoot, db, tenantId, {
8
+ entity,
9
+ limit,
10
+ canRead: reader && ((scope) => scope === null || canReadScope(reader, scope)),
11
+ })),
12
+ };
13
+ }
14
+ /** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
15
+ export function servedGraphReads(sync) {
16
+ return { graphRows: async (tenantId, query) => sync.graphRows(tenantId, query) };
17
+ }
18
+ //# sourceMappingURL=graph-reads-group.js.map