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,285 +1,13 @@
1
- /**
2
- * Graph layer over consolidated state - the graph-on-consolidated guard.
3
- *
4
- * A graph of canonical `entities` (person/project/customer/system/policy/decision) and
5
- * `relations` (owns/supersedes/depends-on/blocked-by/references) sits ON TOP OF
6
- * consolidated memories. The hard rule: the graph NEVER indexes the raw layer - every
7
- * entity and relation references a memory whose `kind IN ('distilled','superseded')`,
8
- * never `kind='raw'`. Enforced at the DB level (CHECK on source_kind/kind + BEFORE
9
- * INSERT and BEFORE UPDATE triggers that tie source_kind/kind to the FK'd memory's
10
- * actual kind and enforce tenant-match - relations also reject cross-tenant edges), so
11
- * the forbidden state is unrepresentable regardless of code path. These helpers
12
- * surface the same guard as clear throws BEFORE hitting the trigger backstop.
13
- */
14
- import { openHippoDb, closeHippoDb } from '../db.js';
15
- import { assertTenantId } from '../tenant.js';
16
- import { log } from '../log.js';
17
- import { clock } from '../write-budget.js';
18
- import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN } from './types.js';
19
- import { rowToEntity, rowToRelation, rowToQueueItem, ENTITY_COLS, RELATION_COLS, QUEUE_COLS } from './rows.js';
20
- const SOURCE_OBJECT_TABLE = {
21
- decision: 'decisions',
22
- policy: 'policies',
23
- customer: 'customer_notes',
24
- project: 'project_briefs',
25
- };
26
- function resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, label) {
27
- let memKind = null;
28
- let effectiveMemoryId = memoryId;
29
- if (memoryId != null) {
30
- // SAFETY: row's shape matches the two columns (kind, tenant_id) named in
31
- // the SELECT above.
32
- const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
33
- if (!row) {
34
- // Stale / forgotten mirror. Tolerate it IFF a valid source object provides provenance:
35
- // graph-extract reads object rows then inserts, and a mirror forgotten/pruned in that window
36
- // must NOT roll back the whole tenant rebuild - the active object survives mirror loss.
37
- // Anchor to the object; drop the dead memory pointer.
38
- if (sourceObject == null) {
39
- throw new Error(`${label}: source memory ${memoryId} not found`);
40
- }
41
- effectiveMemoryId = null;
42
- }
43
- else if (row.tenant_id !== tenantId) {
44
- throw new Error(`${label}: source memory ${memoryId} belongs to another tenant`);
45
- }
46
- else if (row.kind === 'raw') {
47
- throw new Error(`${label}: source memory ${memoryId} is raw; the graph indexes consolidated state only`);
48
- }
49
- else if (row.kind !== 'distilled' && row.kind !== 'superseded') {
50
- throw new Error(`${label}: source memory ${memoryId} has unsupported kind '${row.kind}'`);
51
- }
52
- else {
53
- memKind = row.kind;
54
- }
55
- }
56
- // Validate the object pointer WHENEVER it is provided, not only when memory is null:
57
- // a dual-set row whose object is wrong/closed/cross-tenant would become
58
- // the active provenance after ON DELETE SET NULL and could then block the memory delete.
59
- if (sourceObject != null) {
60
- const table = SOURCE_OBJECT_TABLE[sourceObject.type];
61
- if (!table) {
62
- throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
63
- }
64
- // `table` is a fixed value from the SOURCE_OBJECT_TABLE map (never user-supplied), so
65
- // this string interpolation is safe; `id`/`tenant_id` stay parametrized.
66
- // SAFETY: row's shape matches the single `status` column named in the
67
- // SELECT above.
68
- const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(sourceObject.id, tenantId);
69
- if (!row) {
70
- throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
71
- }
72
- if (row.status !== 'active' && row.status !== 'superseded') {
73
- throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} has status '${row.status}' (must be active|superseded)`);
74
- }
75
- }
76
- // source_kind is the memory's kind when a memory is present, else 'distilled' for an
77
- // object-only row (objects are consolidated by construction). All-null is rejected.
78
- if (memKind != null)
79
- return { sourceKind: memKind, memoryId: effectiveMemoryId };
80
- if (sourceObject != null)
81
- return { sourceKind: 'distilled', memoryId: null };
82
- throw new Error(`${label}: graph row needs a memory or a source object`);
83
- }
84
- // ---------------------------------------------------------------------------
85
- // Public API
86
- // ---------------------------------------------------------------------------
87
- /**
88
- * Insert a graph entity extracted from a consolidated memory. Throws if the source
89
- * memory is missing / cross-tenant / raw (the DB trigger is the backstop).
90
- */
91
- export function insertEntity(hippoRoot, tenantId, opts, txDb) {
92
- assertTenantId('insertEntity', tenantId);
93
- if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
94
- throw new Error(`insertEntity: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
95
- }
96
- const name = checkedName('insertEntity', opts.name);
97
- const now = new Date().toISOString();
98
- const memoryId = opts.memoryId ?? null;
99
- const sourceObject = opts.sourceObject ?? null;
100
- const ownDb = txDb ? null : openHippoDb(hippoRoot);
101
- const db = txDb ?? ownDb;
102
- try {
103
- const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
104
- const result = db.prepare(`
105
- INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
106
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
107
- `).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
108
- const id = Number(result.lastInsertRowid ?? 0);
109
- // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
110
- const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
111
- if (!row)
112
- throw new Error('insertEntity: failed to reload inserted entity');
113
- return rowToEntity(row);
114
- }
115
- finally {
116
- if (ownDb)
117
- closeHippoDb(ownDb);
118
- }
119
- }
120
- function checkedName(label, raw) {
121
- const name = (raw ?? '').trim();
122
- if (name.length === 0)
123
- throw new Error(`${label}: name is required`);
124
- if (name.length > MAX_ENTITY_NAME_LEN) {
125
- throw new Error(`${label}: name exceeds the ${MAX_ENTITY_NAME_LEN}-char cap`);
126
- }
127
- return name;
128
- }
129
- /** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
130
- * A delete plus an insert would cascade away every relation that points at it. */
131
- export function updateEntity(hippoRoot, tenantId, id, opts, txDb) {
132
- assertTenantId('updateEntity', tenantId);
133
- const name = checkedName('updateEntity', opts.name);
134
- const db = txDb ?? openHippoDb(hippoRoot);
135
- try {
136
- // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
137
- const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
138
- if (!row)
139
- return null;
140
- const entity = rowToEntity(row);
141
- const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
142
- ? null
143
- : { type: entity.sourceObjectType, id: entity.sourceObjectId };
144
- const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
145
- db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
146
- .run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
147
- return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
148
- }
149
- finally {
150
- if (db !== txDb)
151
- closeHippoDb(db);
152
- }
153
- }
154
- /**
155
- * Insert a graph relation between two entities, sourced from a consolidated memory.
156
- * Both entities must exist in the same tenant; the source memory must be consolidated.
157
- */
158
- export function insertRelation(hippoRoot, tenantId, opts, txDb) {
159
- assertTenantId('insertRelation', tenantId);
160
- if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
161
- throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
162
- }
163
- const now = new Date().toISOString();
164
- const memoryId = opts.memoryId ?? null;
165
- const sourceObject = opts.sourceObject ?? null;
166
- const ownDb = txDb ? null : openHippoDb(hippoRoot);
167
- const db = txDb ?? ownDb;
168
- try {
169
- for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
170
- // SAFETY: ent's shape matches the single `tenant_id` column named in
171
- // the SELECT above.
172
- const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
173
- if (!ent)
174
- throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
175
- if (ent.tenant_id !== tenantId) {
176
- throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
177
- }
178
- }
179
- const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
180
- const result = db.prepare(`
181
- INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
182
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
183
- `).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
184
- const id = Number(result.lastInsertRowid ?? 0);
185
- // SAFETY: row's shape matches the columns named in RELATION_COLS above.
186
- const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
187
- if (!row)
188
- throw new Error('insertRelation: failed to reload inserted relation');
189
- return rowToRelation(row);
190
- }
191
- finally {
192
- if (ownDb)
193
- closeHippoDb(ownDb);
194
- }
195
- }
196
- // ---------------------------------------------------------------------------
197
- // Extraction queue
198
- // ---------------------------------------------------------------------------
199
- /**
200
- * Enqueue a consolidated memory for later graph extraction. Rejects a raw / missing /
201
- * cross-tenant memory (the DB trigger is the backstop).
202
- */
203
- export function enqueueExtraction(hippoRoot, tenantId, memoryId) {
204
- assertTenantId('enqueueExtraction', tenantId);
205
- const now = new Date().toISOString();
206
- const db = openHippoDb(hippoRoot);
207
- try {
208
- // enqueue is memory-keyed (no source object), so a missing memory still throws (correct -
209
- // you cannot enqueue a forgotten mirror); memoryId is non-null here by construction.
210
- const { sourceKind } = resolveConsolidatedSource(db, tenantId, memoryId, null, 'enqueueExtraction');
211
- const result = db.prepare(`
212
- INSERT INTO graph_extraction_queue(tenant_id, memory_id, kind, status, enqueued_at, processed_at)
213
- VALUES (?, ?, ?, 'pending', ?, NULL)
214
- `).run(tenantId, memoryId, sourceKind, now);
215
- const id = Number(result.lastInsertRowid ?? 0);
216
- // SAFETY: row's shape matches the columns named in QUEUE_COLS above.
217
- const row = db.prepare(`SELECT ${QUEUE_COLS} FROM graph_extraction_queue WHERE id = ?`).get(id);
218
- if (!row)
219
- throw new Error('enqueueExtraction: failed to reload queue item');
220
- return rowToQueueItem(row);
221
- }
222
- finally {
223
- closeHippoDb(db);
224
- }
225
- }
226
- /**
227
- * Mark a queue item terminal (processed | skipped). Only `status`/`processed_at`
228
- * change, so the consolidated-source guard trigger (which fires on
229
- * memory_id/kind/tenant_id changes) is not involved. CAS on the current status to a
230
- * non-terminal 'pending'.
231
- */
232
- export function markExtractionProcessed(hippoRoot, tenantId, id, status = 'processed') {
233
- assertTenantId('markExtractionProcessed', tenantId);
234
- const now = new Date().toISOString();
235
- const db = openHippoDb(hippoRoot);
236
- try {
237
- const updated = db.prepare(`
238
- UPDATE graph_extraction_queue
239
- SET status = ?, processed_at = ?
240
- WHERE id = ? AND tenant_id = ? AND status = 'pending'
241
- `).run(status, now, id, tenantId);
242
- if (updated.changes === 0) {
243
- // SAFETY: existing's shape matches the single `status` column named in
244
- // the SELECT above.
245
- const existing = db.prepare(`SELECT status FROM graph_extraction_queue WHERE id = ? AND tenant_id = ?`)
246
- .get(id, tenantId);
247
- if (!existing)
248
- throw new Error(`markExtractionProcessed: queue item ${id} not found for tenant ${tenantId}`);
249
- throw new Error(`markExtractionProcessed: queue item ${id} is not pending (status='${existing.status}')`);
250
- }
251
- // SAFETY: row's shape matches the columns named in QUEUE_COLS above.
252
- const row = db.prepare(`SELECT ${QUEUE_COLS} FROM graph_extraction_queue WHERE id = ? AND tenant_id = ?`)
253
- .get(id, tenantId);
254
- if (!row)
255
- throw new Error(`markExtractionProcessed: queue item ${id} not found after UPDATE`);
256
- return rowToQueueItem(row);
257
- }
258
- finally {
259
- closeHippoDb(db);
260
- }
261
- }
262
- /** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
263
- function objectInForce(db, tenantId, ref) {
264
- // `table` comes from the fixed SOURCE_OBJECT_TABLE map, never from input.
265
- const table = SOURCE_OBJECT_TABLE[ref.type];
266
- // SAFETY: row's shape matches the single `status` column named in the SELECT.
267
- const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(ref.id, tenantId);
268
- return row?.status === 'active' || row?.status === 'superseded';
269
- }
270
- function entityIdByKey(db, tenantId, key) {
271
- // SAFETY: row's shape matches the single `id` column named in the SELECT.
272
- const row = db.prepare(`SELECT id FROM entities WHERE tenant_id = ? AND entity_type = ? AND source_object_type = ? AND source_object_id = ? ORDER BY id LIMIT 1`).get(tenantId, key.entityType, key.sourceObject.type, key.sourceObject.id);
273
- return row?.id;
274
- }
1
+ // Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
2
+ import { assertTenantId } from '../store/tenant.js';
3
+ import { clock } from '../util/write-budget.js';
4
+ import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntity, insertRelation, objectInForce, relationPresent, updateEntity } from '../store/graph-writes.js';
275
5
  function insertDesiredRelation(db, hippoRoot, tenantId, rel) {
276
- const fromEntityId = entityIdByKey(db, tenantId, rel.from);
277
- const toEntityId = entityIdByKey(db, tenantId, rel.to);
6
+ const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
7
+ const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
278
8
  if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
279
9
  return false;
280
- // SAFETY: row's shape matches the single aliased column named in the SELECT.
281
- const present = db.prepare(`SELECT 1 AS hit FROM relations WHERE tenant_id = ? AND from_entity_id = ? AND to_entity_id = ? AND rel_type = ? LIMIT 1`).get(tenantId, fromEntityId, toEntityId, rel.relType);
282
- if (present)
10
+ if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
283
11
  return false;
284
12
  insertRelation(hippoRoot, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject }, db);
285
13
  return true;
@@ -288,10 +16,10 @@ function insertDesiredRelation(db, hippoRoot, tenantId, rel) {
288
16
  function applyGraphOp(db, hippoRoot, tenantId, op) {
289
17
  switch (op.op) {
290
18
  case 'deleteEntity':
291
- db.prepare(`DELETE FROM entities WHERE id = ? AND tenant_id = ?`).run(op.id, tenantId);
19
+ deleteEntityRow(db, tenantId, op.id);
292
20
  return true;
293
21
  case 'deleteRelation':
294
- db.prepare(`DELETE FROM relations WHERE id = ? AND tenant_id = ?`).run(op.id, tenantId);
22
+ deleteRelationRow(db, tenantId, op.id);
295
23
  return true;
296
24
  case 'updateEntity':
297
25
  if (!objectInForce(db, tenantId, op.entity.sourceObject))
@@ -299,7 +27,7 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
299
27
  return updateEntity(hippoRoot, tenantId, op.id, op.entity, db) !== null;
300
28
  case 'insertEntity':
301
29
  // A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
302
- if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdByKey(db, tenantId, op.entity) !== undefined)
30
+ if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined)
303
31
  return false;
304
32
  insertEntity(hippoRoot, tenantId, op.entity, db);
305
33
  return true;
@@ -307,13 +35,13 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
307
35
  return insertDesiredRelation(db, hippoRoot, tenantId, op.relation);
308
36
  }
309
37
  }
310
- /** Applies `ops` from index `from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
38
+ /** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
311
39
  * Returns where the next chunk starts and how many ops were skipped as stale. */
312
- export function applyGraphOps(db, hippoRoot, tenantId, ops, from, opts) {
40
+ export function applyGraphOps(db, hippoRoot, tenantId, ops, opts) {
313
41
  assertTenantId('applyGraphOps', tenantId);
314
42
  const now = opts.clock ?? clock;
315
43
  const begunAt = now();
316
- let next = from;
44
+ let next = opts.from;
317
45
  let skipped = 0;
318
46
  while (next < ops.length) {
319
47
  if (!applyGraphOp(db, hippoRoot, tenantId, ops[next]))
@@ -324,116 +52,4 @@ export function applyGraphOps(db, hippoRoot, tenantId, ops, from, opts) {
324
52
  }
325
53
  return { next, skipped };
326
54
  }
327
- /** Runs one tenant's graph writes in `fn` on `txDb` under one BEGIN IMMEDIATE, so two rebuilds serialize instead of
328
- * interleaving and a throw rolls back the whole chunk. The sole sanctioned place to wrap graph writes in a transaction. */
329
- export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
330
- assertTenantId('runGraphRebuildTransaction', tenantId);
331
- const db = openHippoDb(hippoRoot, opts);
332
- try {
333
- db.exec('BEGIN IMMEDIATE');
334
- let committed = false;
335
- try {
336
- const out = fn(db);
337
- db.exec('COMMIT');
338
- committed = true;
339
- return out;
340
- }
341
- finally {
342
- if (!committed) {
343
- try {
344
- db.exec('ROLLBACK');
345
- }
346
- catch { /* preserve the original throw */ }
347
- }
348
- }
349
- }
350
- finally {
351
- closeHippoDb(db);
352
- }
353
- }
354
- // ---------------------------------------------------------------------------
355
- // Sleep enqueue-hook: producer helper + drain support
356
- // ---------------------------------------------------------------------------
357
- /**
358
- * Fail-soft producer hook: mark a tenant dirty for graph re-extraction by
359
- * enqueuing its consolidated mirror memory. NEVER throws into the caller — a
360
- * graph-dirty signal failing must not abort a core object write. Graph staleness is
361
- * recoverable (next sleep / manual `graph extract`); a broken `hippo decide` is
362
- * not. Called POST-COMMIT from the graph-source save/close mutations of
363
- * decision, policy, customer_note and project_brief. A null memoryId (a
364
- * forgotten mirror) is a no-op.
365
- */
366
- export function markGraphDirty(hippoRoot, tenantId, memoryId) {
367
- if (!memoryId)
368
- return;
369
- try {
370
- enqueueExtraction(hippoRoot, tenantId, memoryId);
371
- }
372
- catch (err) {
373
- // Logged (warn) so a SYSTEMATIC enqueue failure surfaces to operators, but
374
- // swallowed so the already-committed object write is never rolled back.
375
- log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${err instanceof Error ? err.message : String(err)}`);
376
- }
377
- }
378
- /**
379
- * Remove the graph rows sourced from one first-class object, by its (type, id). Used when a
380
- * MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
381
- * enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
382
- * now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
383
- * like `markGraphDirty` (never throws into the object close caller; graph staleness is
384
- * recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
385
- * (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
386
- * relation whose OWN provenance is this object (defensive — every such edge has the object
387
- * as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
388
- * INSERT/UPDATE guard trigger.
389
- */
390
- export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
391
- try {
392
- assertTenantId('removeGraphEntitiesForObject', tenantId);
393
- const db = openHippoDb(hippoRoot);
394
- try {
395
- db.exec('BEGIN IMMEDIATE');
396
- db.prepare(`DELETE FROM relations WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
397
- .run(tenantId, sourceObjectType, sourceObjectId);
398
- db.prepare(`DELETE FROM entities WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
399
- .run(tenantId, sourceObjectType, sourceObjectId);
400
- db.exec('COMMIT');
401
- }
402
- catch (e) {
403
- try {
404
- db.exec('ROLLBACK');
405
- }
406
- catch { /* preserve original throw */ }
407
- throw e;
408
- }
409
- finally {
410
- closeHippoDb(db);
411
- }
412
- }
413
- catch (err) {
414
- log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${err instanceof Error ? err.message : String(err)}`);
415
- }
416
- }
417
- /**
418
- * Mark every pending queue item for a tenant with `id <= maxId` processed, in
419
- * one UPDATE. Status/processed_at only, so the consolidated-source guard trigger
420
- * is not involved (same as markExtractionProcessed). Returns the count marked.
421
- * The `<= maxId` watermark excludes items enqueued after the drain snapshot.
422
- */
423
- export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
424
- assertTenantId('markPendingProcessedUpTo', tenantId);
425
- const now = new Date().toISOString();
426
- const db = openHippoDb(hippoRoot);
427
- try {
428
- const res = db.prepare(`
429
- UPDATE graph_extraction_queue
430
- SET status = 'processed', processed_at = ?
431
- WHERE tenant_id = ? AND status = 'pending' AND id <= ?
432
- `).run(now, tenantId, maxId);
433
- return Number(res.changes ?? 0);
434
- }
435
- finally {
436
- closeHippoDb(db);
437
- }
438
- }
439
55
  //# sourceMappingURL=write.js.map
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { isJsonString } from '../json.js';
3
+ import { isJsonString } from '../util/json.js';
4
4
  function collectFiles(dir) {
5
5
  if (!fs.existsSync(dir))
6
6
  return [];
@@ -1,9 +1,11 @@
1
- import { envPath } from '../env.js';
1
+ import { envPath } from '../util/env.js';
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { fileURLToPath } from 'url';
5
+ import { errorMessage, log } from '../util/log.js';
5
6
  import { HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
6
- import { isJsonString } from '../json.js';
7
+ import { isJsonString } from '../util/json.js';
8
+ import { writeFileAtomic } from '../util/atomic-write.js';
7
9
  export function resolveCodexWrapperPaths() {
8
10
  const home = homeDir();
9
11
  const codexHome = codexHomeDir(home);
@@ -152,26 +154,20 @@ export function detectRealCodexPath() {
152
154
  return null;
153
155
  }
154
156
  function writeExecutableFile(filePath, content) {
155
- fs.writeFileSync(filePath, content, 'utf8');
157
+ writeFileAtomic(filePath, content);
156
158
  try {
157
159
  fs.chmodSync(filePath, 0o755);
158
160
  }
159
- catch {
160
- // chmod is best-effort on Windows
161
+ catch (err) {
162
+ // The mode bit means nothing on Windows; elsewhere a wrapper that is not executable breaks `codex`, so say so.
163
+ log.warn(`could not mark ${filePath} executable: ${errorMessage(err)}`);
161
164
  }
162
165
  }
163
166
  export function installCodexWrapper(realCodexPath) {
164
167
  const existingMetadata = readCodexWrapperMetadata();
165
168
  if (isCodexWrapperMetadataValid(existingMetadata) && !realCodexPath) {
166
169
  cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
167
- return {
168
- installed: true,
169
- metadataPath: resolveCodexWrapperPaths().metadataPath,
170
- realCodexPath: existingMetadata.realCodexPath,
171
- commandPath: existingMetadata.commandPath,
172
- backupPath: existingMetadata.backupPath,
173
- installMode: existingMetadata.installMode,
174
- };
170
+ return installResult(resolveCodexWrapperPaths().metadataPath, existingMetadata);
175
171
  }
176
172
  const resolvedRealCodexPath = realCodexPath ?? detectRealCodexPath();
177
173
  if (!resolvedRealCodexPath) {
@@ -200,10 +196,13 @@ export function installCodexWrapper(realCodexPath) {
200
196
  logFile: paths.logFile,
201
197
  installedAt: new Date().toISOString(),
202
198
  };
203
- fs.writeFileSync(paths.metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf8');
199
+ writeFileAtomic(paths.metadataPath, JSON.stringify(metadata, null, 2) + '\n');
200
+ return installResult(paths.metadataPath, metadata);
201
+ }
202
+ function installResult(metadataPath, metadata) {
204
203
  return {
205
204
  installed: true,
206
- metadataPath: paths.metadataPath,
205
+ metadataPath,
207
206
  realCodexPath: metadata.realCodexPath,
208
207
  commandPath: metadata.commandPath,
209
208
  backupPath: metadata.backupPath,
@@ -1,7 +1,4 @@
1
- import type { JsonObject } from '../working-memory.js';
2
- /** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
3
- export declare const COPILOT_INSTRUCTIONS: string;
4
- export declare const VSCODE_INSTRUCTIONS: string;
1
+ import type { JsonObject } from '../store/working-memory.js';
5
2
  /** The files hippo writes in one VS Code User folder. */
6
3
  export interface VscodePaths {
7
4
  readonly userDir: string;
@@ -30,8 +27,6 @@ export declare const VSCODE_MCP: McpHost;
30
27
  /** What to paste under the host's key when hippo cannot edit the file itself. */
31
28
  export declare function copilotMcpSnippet(host?: McpHost): string;
32
29
  export type McpMergeStatus = 'added' | 'present' | 'user-owned' | 'unreadable';
33
- /** Adds hippo's server and keeps every other key; a file hippo cannot parse, or a "hippo" key it did not write, stays as it is. */
34
- export declare function mergeMcpServer(file: string, host?: McpHost): McpMergeStatus;
35
30
  export type McpRemoveStatus = 'removed' | 'absent' | 'user-owned' | 'unreadable';
36
31
  /** Removes the "hippo" key only when hippo wrote it. */
37
32
  export declare function removeMcpServer(file: string, host?: McpHost): McpRemoveStatus;
@@ -42,8 +37,6 @@ export interface McpFailure {
42
37
  export declare function isMcpFailure(status: string | McpFailure): status is McpFailure;
43
38
  /** `kept`: a hippo block that is not the Copilot text (edited, or another agent's in a shared file); `unclosed`: a start marker with no end. */
44
39
  export type InstructionsInstallStatus = 'written' | 'present' | 'kept' | 'unclosed';
45
- /** Creates the file when missing; any block but hippo's own Copilot one, and a start marker with no end, leave the file as it is. */
46
- export declare function ensureInstructionsBlock(file: string): InstructionsInstallStatus;
47
40
  export type InstructionsRemoveStatus = 'removed' | 'absent' | 'kept' | 'unclosed';
48
41
  /** Splices out only hippo's own Copilot block and keeps every other byte; a file left with nothing but whitespace goes. */
49
42
  export declare function removeInstructionsBlock(file: string): InstructionsRemoveStatus;
@@ -3,13 +3,14 @@
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import { isDeepStrictEqual } from 'node:util';
6
- import { readJsonFile } from '../json.js';
7
- import { HOOK_MARKERS, hippoBlock } from '../cli/hook-blocks.js';
8
- import { copilotHomeDir, isJsonObject, vscodeUserDirs } from './shared.js';
6
+ import { readJsonFile, isJsonObjectLiteral } from '../util/json.js';
7
+ import { HOOK_MARKERS, hippoBlock } from './hook-blocks.js';
8
+ import { copilotHomeDir, vscodeUserDirs } from './shared.js';
9
+ import { writeFileAtomic } from '../util/atomic-write.js';
9
10
  import { installJsonHooks, resolveJsonHookPaths, uninstallJsonHooks, writeSettingsFile } from './json-hooks.js';
10
11
  const MCP_KEY = 'hippo';
11
12
  /** Copilot drops what a per-prompt hook prints, so per-task recall goes through the MCP tool the block names. */
12
- export const COPILOT_INSTRUCTIONS = `
13
+ const COPILOT_INSTRUCTIONS = `
13
14
  ## Project Memory (Hippo)
14
15
 
15
16
  At the start of each task, call the \`hippo_recall\` tool with a short query that
@@ -44,7 +45,7 @@ before you finish.
44
45
  ];
45
46
  /** VS Code attaches a User `*.instructions.md` file to every chat request its `applyTo` glob matches. */
46
47
  const withApplyToAll = (text) => `---\napplyTo: "**"\n---\n${text}\n`;
47
- export const VSCODE_INSTRUCTIONS = withApplyToAll(COPILOT_INSTRUCTIONS);
48
+ const VSCODE_INSTRUCTIONS = withApplyToAll(COPILOT_INSTRUCTIONS);
48
49
  function isHipposVscodeInstructions(text) {
49
50
  return SHIPPED_COPILOT_INSTRUCTIONS.some((shipped) => text === withApplyToAll(shipped));
50
51
  }
@@ -78,7 +79,7 @@ export const COPILOT_CLI_MCP = { key: 'mcpServers', server: () => ({ type: 'loca
78
79
  export const VSCODE_MCP = { key: 'servers', server: () => ({ type: 'stdio', command: hippoCommand(), args: ['mcp'] }) };
79
80
  /** Only a server hippo wrote counts as hippo's: another command, other args, or any key or value setup does not write (an env you added) makes it the user's. */
80
81
  function isHipposServer(entry, host) {
81
- if (!isJsonObject(entry) || !('command' in entry) || !('args' in entry))
82
+ if (!isJsonObjectLiteral(entry) || !('command' in entry) || !('args' in entry))
82
83
  return false;
83
84
  const ours = host.server();
84
85
  return Object.entries(entry).every(([key, value]) => (key === 'command' ? value === 'hippo' || value === 'hippo.cmd' : isDeepStrictEqual(value, ours[key])));
@@ -103,15 +104,15 @@ function readMcpConfig(file, host) {
103
104
  return null;
104
105
  }
105
106
  }
106
- if (!isJsonObject(config))
107
+ if (!isJsonObjectLiteral(config))
107
108
  return null;
108
109
  if (config[host.key] === undefined)
109
110
  config[host.key] = {};
110
111
  const servers = config[host.key];
111
- return isJsonObject(servers) ? { config, servers } : null;
112
+ return isJsonObjectLiteral(servers) ? { config, servers } : null;
112
113
  }
113
114
  /** Adds hippo's server and keeps every other key; a file hippo cannot parse, or a "hippo" key it did not write, stays as it is. */
114
- export function mergeMcpServer(file, host = COPILOT_CLI_MCP) {
115
+ function mergeMcpServer(file, host = COPILOT_CLI_MCP) {
115
116
  const read = readMcpConfig(file, host);
116
117
  if (read === null)
117
118
  return 'unreadable';
@@ -172,7 +173,7 @@ function withCopilotBlock(text, found) {
172
173
  return `${text}${text.endsWith('\n') ? '\n' : '\n\n'}${block}`;
173
174
  }
174
175
  /** Creates the file when missing; any block but hippo's own Copilot one, and a start marker with no end, leave the file as it is. */
175
- export function ensureInstructionsBlock(file) {
176
+ function ensureInstructionsBlock(file) {
176
177
  const old = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
177
178
  const found = hippoBlock(old);
178
179
  if (found === null && old.includes(HOOK_MARKERS.start))
@@ -182,8 +183,7 @@ export function ensureInstructionsBlock(file) {
182
183
  const next = withCopilotBlock(old, found);
183
184
  if (next === old)
184
185
  return 'present';
185
- fs.mkdirSync(path.dirname(file), { recursive: true });
186
- fs.writeFileSync(file, next, 'utf8');
186
+ writeFileAtomic(file, next);
187
187
  return 'written';
188
188
  }
189
189
  /** `text` without the block and its markers, plus the line break after the end marker, else the one before the start marker. */
@@ -208,7 +208,7 @@ export function removeInstructionsBlock(file) {
208
208
  if (left.trim() === '')
209
209
  fs.rmSync(file);
210
210
  else
211
- fs.writeFileSync(file, left, 'utf8');
211
+ writeFileAtomic(file, left);
212
212
  return 'removed';
213
213
  }
214
214
  /** The file is hippo's alone, so it is written whole; an earlier hippo text is upgraded, and any other text already there stays. */
@@ -220,8 +220,7 @@ export function ensureVscodeInstructions(file) {
220
220
  if (!isHipposVscodeInstructions(old))
221
221
  return 'kept';
222
222
  }
223
- fs.mkdirSync(path.dirname(file), { recursive: true });
224
- fs.writeFileSync(file, VSCODE_INSTRUCTIONS, 'utf8');
223
+ writeFileAtomic(file, VSCODE_INSTRUCTIONS);
225
224
  return 'written';
226
225
  }
227
226
  /** Deletes the file only when it still holds exactly what a hippo release wrote. */
@@ -1,6 +1,6 @@
1
1
  // The hippo block each agent's instruction file carries, and how init recognises one it wrote earlier.
2
2
  import { createHash } from 'node:crypto';
3
- import { escapeRegex } from '../escape.js';
3
+ import { escapeRegex } from '../util/escape.js';
4
4
  export const HOOK_MARKERS = {
5
5
  start: '<!-- hippo:start -->',
6
6
  end: '<!-- hippo:end -->',
@@ -34,7 +34,7 @@
34
34
  * `hooks` block from opencode.json.
35
35
  */
36
36
  import { type JsonHookTarget } from './shared.js';
37
- import { type JsonValue } from '../json.js';
37
+ import { type JsonValue } from '../util/json.js';
38
38
  /** A target's hook settings file, the log its SessionEnd hook writes, and the tool's display name. */
39
39
  export interface JsonHookPaths {
40
40
  settings: string;