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,336 +0,0 @@
1
- /**
2
- * customer_note first-class object.
3
- *
4
- * A `customer_note` is a discrete note recorded against an account/customer entity:
5
- * a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
6
- * Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt,
7
- * so an FK is deferred). Unlike project_brief's one-summary-per-repo,
8
- * a customer accrues MANY discrete notes over time, each with its own supersede chain
9
- * (correct a note -> a new version preserving history; close retires it).
10
- *
11
- * Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
12
- * + CAS + INSERT-preflight + server-derived version + change_summary + supersede
13
- * tenant-match trigger). It has NO assembler/renderer (the simplest first-class object): the
14
- * contribution is purely the entity-scoping dimension.
15
- *
16
- * The `customer_notes` table is the source of truth (survives memory decay); the
17
- * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
18
- *
19
- * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
20
- */
21
- import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
22
- import { openHippoDb, closeHippoDb } from './db.js';
23
- import { writeEntry } from './store/entry-writes.js';
24
- import { assertTenantId } from './tenant.js';
25
- import { markGraphDirty, removeGraphEntitiesForObject } from './graph/write.js';
26
- import { createMemory, Layer } from './memory.js';
27
- import { appendAuditEvent } from './audit.js';
28
- import { objectHalfLifeDays } from './half-life-migration.js';
29
- import { keysetAfter } from './keyset.js';
30
- export const VALID_NOTE_STATES = new Set([
31
- 'active',
32
- 'superseded',
33
- 'closed',
34
- ]);
35
- /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
36
- * than the 4096 short-field convention. */
37
- export const MAX_CUSTOMER_LEN = 256;
38
- export const MAX_NOTE_LEN = 8192;
39
- export const MAX_CHANGE_SUMMARY_LEN = 4096;
40
- // ---------------------------------------------------------------------------
41
- // Validation
42
- // ---------------------------------------------------------------------------
43
- /**
44
- * Validate + normalise note fields. `customer` is trimmed and MUST be a single line
45
- * (no newlines): it becomes a `customer:<lc>` recall tag AND an identifier. `note` is
46
- * kept verbatim (operator content) but capped. Returns the normalised customer.
47
- */
48
- function validateNoteFields(customer, note, changeSummary) {
49
- const normalizedCustomer = (customer ?? '').trim();
50
- if (normalizedCustomer.length === 0)
51
- throw new BadRequestError('saveCustomerNote: customer is required');
52
- if (/[\r\n]/.test(normalizedCustomer)) {
53
- throw new BadRequestError('saveCustomerNote: customer must be a single line (no newlines)');
54
- }
55
- if (normalizedCustomer.length > MAX_CUSTOMER_LEN) {
56
- throw new BadRequestError(`saveCustomerNote: customer exceeds the ${MAX_CUSTOMER_LEN}-char cap`);
57
- }
58
- if (!note || note.trim().length === 0) {
59
- throw new BadRequestError('saveCustomerNote: note is required');
60
- }
61
- if (note.length > MAX_NOTE_LEN) {
62
- throw new BadRequestError(`saveCustomerNote: note exceeds the ${MAX_NOTE_LEN}-char cap`);
63
- }
64
- if (changeSummary !== undefined && changeSummary.length > MAX_CHANGE_SUMMARY_LEN) {
65
- throw new BadRequestError(`saveCustomerNote: changeSummary exceeds the ${MAX_CHANGE_SUMMARY_LEN}-char cap`);
66
- }
67
- return { customer: normalizedCustomer };
68
- }
69
- function rowToCustomerNote(row) {
70
- return {
71
- id: row.id,
72
- memoryId: row.memory_id,
73
- tenantId: row.tenant_id,
74
- customer: row.customer,
75
- note: row.note,
76
- version: row.version,
77
- // SAFETY: row.status is DB-constrained to NoteStatus values; every INSERT/
78
- // UPDATE in this file writes only the literal 'active' | 'superseded' | 'closed'.
79
- status: row.status,
80
- supersededBy: row.superseded_by,
81
- supersededAt: row.superseded_at,
82
- changeSummary: row.change_summary,
83
- closedAt: row.closed_at,
84
- createdAt: row.created_at,
85
- };
86
- }
87
- const NOTE_COLS = `
88
- id, memory_id, tenant_id, customer, note, version, status,
89
- superseded_by, superseded_at, change_summary, closed_at, created_at
90
- `;
91
- /** Recall-surface content for the memory mirror: customer + note. Named (mirrors
92
- * buildBriefContent) so the recall surface is deterministic + unit-testable. */
93
- function buildNoteContent(customer, note) {
94
- return `${customer}\n\n${note}`;
95
- }
96
- // Preflight the supersede target BEFORE inserting the new row (so the new
97
- // autoincrement id can never be its own supersede target); read the
98
- // predecessor version in the same SELECT for server-derived versioning.
99
- function preflightNoteSupersede(db, tenantId, supersedesId) {
100
- // SAFETY: SELECT projects exactly status, version; .get() returns that
101
- // shape for the matching row, or undefined when no note/tenant pair matches.
102
- const pred = db.prepare(`SELECT status, version FROM customer_notes WHERE id = ? AND tenant_id = ?`).get(supersedesId, tenantId);
103
- if (!pred) {
104
- throw new NotFoundError(`saveCustomerNote: note ${supersedesId} to supersede not found for tenant ${tenantId}`);
105
- }
106
- if (pred.status !== 'active') {
107
- throw new ConflictError(`saveCustomerNote: note ${supersedesId} is not active (status='${pred.status}'); only active notes can be superseded.`);
108
- }
109
- return pred.version + 1;
110
- }
111
- function insertNoteRow(db, memoryId, w, version) {
112
- const result = db.prepare(`
113
- INSERT INTO customer_notes(
114
- memory_id, tenant_id, customer, note, version,
115
- status, superseded_by, superseded_at, change_summary, closed_at, created_at
116
- ) VALUES (?, ?, ?, ?, ?, 'active', NULL, NULL, ?, NULL, ?)
117
- `).run(memoryId, w.tenantId, w.customer, w.note, version, w.changeSummary, w.now);
118
- return Number(result.lastInsertRowid ?? 0);
119
- }
120
- function supersedeNoteRow(db, w, supersedesId, noteId, version) {
121
- const sup = db.prepare(`
122
- UPDATE customer_notes
123
- SET status = 'superseded', superseded_by = ?, superseded_at = ?
124
- WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
125
- `).run(noteId, w.now, supersedesId, w.tenantId, noteId);
126
- if (sup.changes === 0) {
127
- throw new ConflictError(`saveCustomerNote: note ${supersedesId} could not be superseded (no longer active or self-reference).`);
128
- }
129
- appendAuditEvent(db, {
130
- tenantId: w.tenantId,
131
- actor: w.actor,
132
- op: 'customer_note_supersede',
133
- targetId: String(supersedesId),
134
- metadata: {
135
- note_id: supersedesId,
136
- superseded_by: noteId,
137
- new_version: version,
138
- },
139
- });
140
- }
141
- /** The afterWrite body: preflight, INSERT, supersede, reload, create audit, all in one SAVEPOINT. */
142
- function writeNoteRow(db, memoryId, w) {
143
- const version = w.supersedesId !== undefined ? preflightNoteSupersede(db, w.tenantId, w.supersedesId) : 1;
144
- const noteId = insertNoteRow(db, memoryId, w, version);
145
- if (w.supersedesId !== undefined)
146
- supersedeNoteRow(db, w, w.supersedesId, noteId, version);
147
- // SAFETY: SELECT ${NOTE_COLS} projects exactly the CustomerNoteRow columns;
148
- // .get() returns that row, or undefined only if the just-inserted id can't
149
- // be found.
150
- const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ?`)
151
- .get(noteId);
152
- if (!row)
153
- throw new Error('saveCustomerNote: failed to reload saved note row');
154
- // GDPR-light metadata: ids + flags only, no note text.
155
- appendAuditEvent(db, {
156
- tenantId: w.tenantId,
157
- actor: w.actor,
158
- op: 'customer_note_create',
159
- targetId: String(noteId),
160
- metadata: {
161
- note_id: noteId,
162
- customer: w.customer,
163
- version,
164
- },
165
- });
166
- return row;
167
- }
168
- /**
169
- * Create a customer_note (or a new version that supersedes an existing one). Writes
170
- * the memory mirror + the customer_notes row atomically inside writeEntry's SAVEPOINT.
171
- * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
172
- * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same SAVEPOINT;
173
- * the new version = predecessor.version + 1 (server-derived).
174
- *
175
- * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
176
- * + caller extraTags) so scope-aware recall treats the note as entity-local. There is
177
- * no self-recursion path (customer_note has no receipt-query/refresh).
178
- */
179
- export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
180
- assertTenantId('saveCustomerNote', tenantId);
181
- const { customer } = validateNoteFields(opts.customer, opts.note, opts.changeSummary);
182
- const isSupersede = opts.supersedesNoteId !== undefined;
183
- const changeSummary = isSupersede ? (opts.changeSummary ?? null) : null;
184
- const now = new Date().toISOString();
185
- const content = buildNoteContent(customer, opts.note);
186
- const tags = ['customer_note', `customer:${customer.toLowerCase()}`, ...(opts.extraTags ?? [])];
187
- const mem = createMemory(content, {
188
- tags,
189
- layer: Layer.Semantic,
190
- confidence: 'verified',
191
- source: 'customer_note',
192
- baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
193
- tenantId,
194
- });
195
- const w = {
196
- tenantId, actor, customer, note: opts.note, changeSummary, supersedesId: opts.supersedesNoteId, now,
197
- };
198
- let savedRow;
199
- writeEntry(hippoRoot, mem, {
200
- actor,
201
- afterWrite: (db, memoryId) => {
202
- savedRow = writeNoteRow(db, memoryId, w);
203
- },
204
- afterCommit: () => markGraphDirty(hippoRoot, tenantId, mem.id),
205
- });
206
- if (!savedRow) {
207
- throw new Error('saveCustomerNote: afterWrite did not populate the row');
208
- }
209
- return rowToCustomerNote(savedRow);
210
- }
211
- /**
212
- * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
213
- * distinguishes not-found from not-active. A superseded row is terminal.
214
- */
215
- export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
216
- assertTenantId('closeCustomerNote', tenantId);
217
- const now = new Date().toISOString();
218
- const db = openHippoDb(hippoRoot);
219
- try {
220
- db.exec('BEGIN IMMEDIATE');
221
- try {
222
- const updateResult = db.prepare(`
223
- UPDATE customer_notes
224
- SET status = 'closed', closed_at = ?
225
- WHERE id = ? AND tenant_id = ? AND status = 'active'
226
- `).run(now, id, tenantId);
227
- if (updateResult.changes === 0) {
228
- // SAFETY: SELECT projects exactly the status column; .get() returns that
229
- // shape, or undefined when the id/tenant pair doesn't exist.
230
- const existing = db.prepare(`SELECT status FROM customer_notes WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
231
- if (!existing) {
232
- throw new NotFoundError(`closeCustomerNote: note ${id} not found for tenant ${tenantId}`);
233
- }
234
- throw new ConflictError(`closeCustomerNote: note ${id} is not active (status='${existing.status}'); only active notes can be closed.`);
235
- }
236
- // SAFETY: SELECT ${NOTE_COLS} projects exactly the CustomerNoteRow columns;
237
- // .get() returns that row for the just-updated id, or undefined only in an
238
- // impossible race since the UPDATE above already matched it.
239
- const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ? AND tenant_id = ?`)
240
- .get(id, tenantId);
241
- if (!row)
242
- throw new NotFoundError(`closeCustomerNote: note ${id} not found after UPDATE`);
243
- appendAuditEvent(db, {
244
- tenantId,
245
- actor,
246
- op: 'customer_note_close',
247
- targetId: String(id),
248
- metadata: { note_id: id },
249
- });
250
- db.exec('COMMIT');
251
- const closed = rowToCustomerNote(row);
252
- // Closing removes the object from the graph. Remove its rows DIRECTLY (deterministic),
253
- // not only via an enqueued rebuild whose queue item is lost if the mirror is later
254
- // forgotten (the queue row cascade-deletes with the memory), which would leave the closed
255
- // object stale and could block that forget. Still enqueue when a mirror exists
256
- // so a concurrent rebuild re-derives consistently (harmless if it also runs).
257
- removeGraphEntitiesForObject(hippoRoot, tenantId, 'customer', closed.id);
258
- if (closed.memoryId) {
259
- markGraphDirty(hippoRoot, tenantId, closed.memoryId);
260
- }
261
- return closed;
262
- }
263
- catch (e) {
264
- try {
265
- db.exec('ROLLBACK');
266
- }
267
- catch {
268
- // Ignore rollback failures — the throw below is what matters.
269
- }
270
- throw e;
271
- }
272
- }
273
- finally {
274
- closeHippoDb(db);
275
- }
276
- }
277
- export function loadCustomerNoteById(hippoRoot, tenantId, id) {
278
- assertTenantId('loadCustomerNoteById', tenantId);
279
- const db = openHippoDb(hippoRoot);
280
- try {
281
- // SAFETY: SELECT ${NOTE_COLS} projects exactly the CustomerNoteRow columns;
282
- // .get() returns that row, or undefined when the id/tenant pair doesn't exist.
283
- const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ? AND tenant_id = ?`)
284
- .get(id, tenantId);
285
- return row ? rowToCustomerNote(row) : null;
286
- }
287
- finally {
288
- closeHippoDb(db);
289
- }
290
- }
291
- export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
292
- assertTenantId('loadCustomerNotes', tenantId);
293
- const limit = opts.limit ?? 100;
294
- const after = keysetAfter('created_at', 'id', opts.after);
295
- if (opts.status && !VALID_NOTE_STATES.has(opts.status)) {
296
- throw new BadRequestError(`loadCustomerNotes: status must be one of ${Array.from(VALID_NOTE_STATES).join('|')}; got ${opts.status}`);
297
- }
298
- const db = openHippoDb(hippoRoot);
299
- try {
300
- const clauses = ['tenant_id = ?'];
301
- const params = [tenantId];
302
- if (opts.status) {
303
- clauses.push('status = ?');
304
- params.push(opts.status);
305
- }
306
- if (opts.customer) {
307
- clauses.push('customer = ?');
308
- params.push(opts.customer);
309
- }
310
- params.push(...after.params, limit);
311
- // SAFETY: SELECT ${NOTE_COLS} projects exactly the CustomerNoteRow columns
312
- // regardless of the dynamic WHERE clause built above; .all() returns rows
313
- // in that shape.
314
- const rows = db.prepare(`
315
- SELECT ${NOTE_COLS} FROM customer_notes
316
- WHERE ${clauses.join(' AND ')}${after.sql}
317
- ORDER BY created_at DESC, id DESC
318
- LIMIT ?
319
- `).all(...params);
320
- return rows.map(rowToCustomerNote);
321
- }
322
- finally {
323
- closeHippoDb(db);
324
- }
325
- }
326
- /**
327
- * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
328
- * MANY notes) - this deliberately DIVERGES from project_brief's
329
- * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
330
- * evolving summary. A future caller cloning the project_brief shape by analogy must
331
- * not assume a single-return here; the plural name signals the list contract.
332
- */
333
- export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
334
- return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
335
- }
336
- //# sourceMappingURL=customer-notes.js.map
package/dist/db.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export type { DatabaseSyncLike } from './db/sqlite.js';
2
- export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withWriteScope } from './db/busy.js';
3
- export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './db/meta.js';
4
- export { countTableRows, pruneConsolidationRuns } from './db/tables.js';
5
- export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './db/migrate.js';
6
- export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './db/open.js';
7
- export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './db/request-stores.js';
8
- export { OtherStoreFolderError, SqliteBlockedError } from './db/sqlite-blocked.js';
9
- //# sourceMappingURL=db.d.ts.map
package/dist/db.js DELETED
@@ -1,8 +0,0 @@
1
- export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withWriteScope } from './db/busy.js';
2
- export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './db/meta.js';
3
- export { countTableRows, pruneConsolidationRuns } from './db/tables.js';
4
- export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './db/migrate.js';
5
- export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './db/open.js';
6
- export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './db/request-stores.js';
7
- export { OtherStoreFolderError, SqliteBlockedError } from './db/sqlite-blocked.js';
8
- //# sourceMappingURL=db.js.map
package/dist/decisions.js DELETED
@@ -1,326 +0,0 @@
1
- /**
2
- * Decision first-class object.
3
- *
4
- * `hippo decide` used to write only a tagged memory (tags ['decision'], source
5
- * 'decision') with a 90-day half-life, so an in-force decision decayed out of
6
- * recall even though it was never reversed. The `decisions` table is now the
7
- * source of truth: a decision stays `active` regardless of memory decay, and
8
- * `hippo decide list --status active` is authoritative. A memory row still
9
- * mirrors the decision for recall surfaces but is NOT canonical — memory_id is
10
- * NULLABLE with ON DELETE SET NULL so forget/consolidate/archive gracefully
11
- * orphans the decision row.
12
- *
13
- * Lifecycle: active -> superseded (a newer decision replaces it; superseded_by
14
- * points to the successor) or active -> closed (retired with no successor).
15
- *
16
- * Tenant scoping: every helper requires tenantId. BEFORE INSERT/UPDATE triggers
17
- * enforce decisions.tenant_id == the referenced memory's tenant_id, and a
18
- * superseded_by same-tenant trigger makes cross-tenant supersession
19
- * unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
20
- *
21
- * Dual-write atomicity: `saveDecision` writes the memory + decisions row (and,
22
- * when superseding, the old row's UPDATE) inside writeEntry's SAVEPOINT
23
- * 'write_entry' (store/entry-writes.ts) via the afterWrite hook, so a failure in any
24
- * step rolls all of them back. Pattern matches savePrediction (predictions.ts).
25
- */
26
- import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
27
- import { openHippoDb, closeHippoDb } from './db.js';
28
- import { writeEntry } from './store/entry-writes.js';
29
- import { assertTenantId } from './tenant.js';
30
- import { markGraphDirty, removeGraphEntitiesForObject } from './graph/write.js';
31
- import { createMemory, Layer } from './memory.js';
32
- import { appendAuditEvent } from './audit.js';
33
- import { objectHalfLifeDays } from './half-life-migration.js';
34
- import { keysetAfter } from './keyset.js';
35
- export const VALID_DECISION_STATES = new Set([
36
- 'active',
37
- 'superseded',
38
- 'closed',
39
- ]);
40
- function rowToDecision(row) {
41
- return {
42
- id: row.id,
43
- memoryId: row.memory_id,
44
- tenantId: row.tenant_id,
45
- decisionText: row.decision_text,
46
- context: row.context,
47
- // SAFETY: status is DB-constrained to VALID_DECISION_STATES; this module
48
- // is the only writer and always inserts one of those literal strings.
49
- status: row.status,
50
- supersededBy: row.superseded_by,
51
- supersededAt: row.superseded_at,
52
- closedAt: row.closed_at,
53
- createdAt: row.created_at,
54
- };
55
- }
56
- const DECISION_COLS = `
57
- id, memory_id, tenant_id, decision_text, context, status,
58
- superseded_by, superseded_at, closed_at, created_at
59
- `;
60
- // ---------------------------------------------------------------------------
61
- // Public API
62
- // ---------------------------------------------------------------------------
63
- /** The legacy `hippo decide` memory mirror for a decision. */
64
- function buildDecisionMemory(hippoRoot, tenantId, opts) {
65
- const content = opts.context
66
- ? `${opts.decisionText}\n\nContext: ${opts.context}`
67
- : opts.decisionText;
68
- const tags = ['decision', ...(opts.extraTags ?? [])];
69
- return createMemory(content, {
70
- tags,
71
- layer: Layer.Semantic,
72
- confidence: 'verified',
73
- source: 'decision',
74
- baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
75
- tenantId,
76
- });
77
- }
78
- // Preflight the supersede target BEFORE inserting the new row. The new
79
- // row's autoincrement id could otherwise collide with a non-existent
80
- // supersedesDecisionId (e.g. superseding id 1 on an empty store, where the
81
- // INSERT below would itself become id 1), making the row supersede itself.
82
- // Validating first means the new row is never a candidate for its own
83
- // supersede UPDATE.
84
- function preflightDecisionSupersede(db, tenantId, supersedesId) {
85
- // SAFETY: row shape matches the single `status` column named in the SELECT below.
86
- const pred = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(supersedesId, tenantId);
87
- if (!pred) {
88
- throw new NotFoundError(`saveDecision: decision ${supersedesId} to supersede not found for tenant ${tenantId}`);
89
- }
90
- if (pred.status !== 'active') {
91
- throw new ConflictError(`saveDecision: decision ${supersedesId} is not active (status='${pred.status}'); only active decisions can be superseded.`);
92
- }
93
- }
94
- function insertDecisionRow(db, memoryId, tenantId, opts, now) {
95
- const result = db.prepare(`
96
- INSERT INTO decisions(
97
- memory_id, tenant_id, decision_text, context,
98
- status, superseded_by, superseded_at, closed_at, created_at
99
- ) VALUES (?, ?, ?, ?, 'active', NULL, NULL, NULL, ?)
100
- `).run(memoryId, tenantId, opts.decisionText, opts.context ?? null, now);
101
- return Number(result.lastInsertRowid ?? 0);
102
- }
103
- // Supersede the (preflight-validated) prior active decision in the SAME
104
- // SAVEPOINT, atomic with the new row. The `id != decisionId` exclusion is
105
- // defense-in-depth against the self-match described above; combined with
106
- // the preflight, a 0-change here is unreachable in the single-writer txn.
107
- function supersedeDecisionRow(db, tenantId, actor, supersedesId, decisionId, now) {
108
- const sup = db.prepare(`
109
- UPDATE decisions
110
- SET status = 'superseded', superseded_by = ?, superseded_at = ?
111
- WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
112
- `).run(decisionId, now, supersedesId, tenantId, decisionId);
113
- if (sup.changes === 0) {
114
- throw new ConflictError(`saveDecision: decision ${supersedesId} could not be superseded (no longer active or self-reference).`);
115
- }
116
- appendAuditEvent(db, {
117
- tenantId,
118
- actor,
119
- op: 'decision_supersede',
120
- targetId: String(supersedesId),
121
- metadata: {
122
- decision_id: supersedesId,
123
- superseded_by: decisionId,
124
- },
125
- });
126
- }
127
- /** The afterWrite body: preflight, INSERT, supersede, reload, create audit, all in one SAVEPOINT. */
128
- function writeDecisionRow(db, memoryId, tenantId, opts, actor, now) {
129
- if (opts.supersedesDecisionId !== undefined) {
130
- preflightDecisionSupersede(db, tenantId, opts.supersedesDecisionId);
131
- }
132
- const decisionId = insertDecisionRow(db, memoryId, tenantId, opts, now);
133
- if (opts.supersedesDecisionId !== undefined) {
134
- supersedeDecisionRow(db, tenantId, actor, opts.supersedesDecisionId, decisionId, now);
135
- }
136
- // SAFETY: row's shape matches the columns named in DECISION_COLS above.
137
- const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ?`)
138
- .get(decisionId);
139
- if (!row)
140
- throw new Error('saveDecision: failed to reload saved decision row');
141
- // GDPR-light metadata: id + flag only, no decision_text.
142
- appendAuditEvent(db, {
143
- tenantId,
144
- actor,
145
- op: 'decision_create',
146
- targetId: String(decisionId),
147
- metadata: {
148
- decision_id: decisionId,
149
- has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
150
- },
151
- });
152
- return row;
153
- }
154
- /**
155
- * Create a decision. Writes the memory mirror + the decisions row atomically
156
- * inside writeEntry's SAVEPOINT 'write_entry'. When supersedesDecisionId is
157
- * given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
158
- * SAVEPOINT (CAS: WHERE status='active'; throws on changes===0 so a duplicate
159
- * supersede aborts the whole write rather than orphaning a successor).
160
- *
161
- * The memory mirror preserves the legacy `hippo decide` shape: tags
162
- * ['decision', ...extraTags], source 'decision', confidence 'verified',
163
- * the half-life objectHalfLifeDays picks, content = "<text>\n\nContext: <context>"
164
- * when context is given (so existing recall output is unchanged).
165
- */
166
- export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
167
- assertTenantId('saveDecision', tenantId);
168
- if (!opts.decisionText)
169
- throw new BadRequestError('saveDecision: decisionText is required');
170
- const now = new Date().toISOString();
171
- const mem = buildDecisionMemory(hippoRoot, tenantId, opts);
172
- // Populated inside afterWrite so the INSERT, the supersede UPDATE, and the
173
- // memory write all share one SAVEPOINT.
174
- let savedRow;
175
- writeEntry(hippoRoot, mem, {
176
- actor,
177
- afterWrite: (db, memoryId) => {
178
- savedRow = writeDecisionRow(db, memoryId, tenantId, opts, actor, now);
179
- },
180
- // Post-commit hook: mark the tenant's graph dirty AFTER the DB row commits
181
- // but BEFORE the markdown mirrors are written, so a mirror-write failure can
182
- // never leave a committed save unflagged. markGraphDirty is fail-soft.
183
- afterCommit: () => markGraphDirty(hippoRoot, tenantId, mem.id),
184
- });
185
- if (!savedRow) {
186
- // Unreachable unless afterWrite threw first; defensive.
187
- throw new Error('saveDecision: afterWrite did not populate the row');
188
- }
189
- return rowToDecision(savedRow);
190
- }
191
- /**
192
- * Close (retire) an active decision with no successor. Updates the decisions
193
- * row only; the memory mirror is not mutated. CAS guard mirrors closePrediction
194
- * (predictions.ts): WHERE status='active'; 0 changes distinguishes not-found
195
- * from not-active so callers surface the right error.
196
- */
197
- export function closeDecision(hippoRoot, tenantId, id, actor = 'cli') {
198
- assertTenantId('closeDecision', tenantId);
199
- const now = new Date().toISOString();
200
- const db = openHippoDb(hippoRoot);
201
- try {
202
- db.exec('BEGIN IMMEDIATE');
203
- try {
204
- const updateResult = db.prepare(`
205
- UPDATE decisions
206
- SET status = 'closed', closed_at = ?
207
- WHERE id = ? AND tenant_id = ? AND status = 'active'
208
- `).run(now, id, tenantId);
209
- if (updateResult.changes === 0) {
210
- // SAFETY: row shape matches the single `status` column named in the SELECT above.
211
- const existing = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
212
- if (!existing) {
213
- throw new NotFoundError(`closeDecision: decision ${id} not found for tenant ${tenantId}`);
214
- }
215
- throw new ConflictError(`closeDecision: decision ${id} is not active (status='${existing.status}'); only active decisions can be closed.`);
216
- }
217
- // SAFETY: row's shape matches the columns named in DECISION_COLS above.
218
- const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ? AND tenant_id = ?`)
219
- .get(id, tenantId);
220
- if (!row)
221
- throw new NotFoundError(`closeDecision: decision ${id} not found after UPDATE`);
222
- appendAuditEvent(db, {
223
- tenantId,
224
- actor,
225
- op: 'decision_close',
226
- targetId: String(id),
227
- metadata: { decision_id: id },
228
- });
229
- db.exec('COMMIT');
230
- const closed = rowToDecision(row);
231
- // After COMMIT (write lock released), before the finally closes `db`.
232
- // Closing removes the object from the graph. Remove its rows DIRECTLY (deterministic),
233
- // not only via an enqueued rebuild whose queue item is lost if the mirror is later
234
- // forgotten (the queue row cascade-deletes with the memory), which would leave the closed
235
- // object stale and could block that forget. Still enqueue when a mirror exists
236
- // so a concurrent rebuild re-derives consistently (harmless if it also runs).
237
- removeGraphEntitiesForObject(hippoRoot, tenantId, 'decision', closed.id);
238
- if (closed.memoryId) {
239
- markGraphDirty(hippoRoot, tenantId, closed.memoryId);
240
- }
241
- return closed;
242
- }
243
- catch (e) {
244
- try {
245
- db.exec('ROLLBACK');
246
- }
247
- catch {
248
- // Ignore rollback failures — the throw below is what matters.
249
- }
250
- throw e;
251
- }
252
- }
253
- finally {
254
- closeHippoDb(db);
255
- }
256
- }
257
- export function loadDecisionById(hippoRoot, tenantId, id) {
258
- assertTenantId('loadDecisionById', tenantId);
259
- const db = openHippoDb(hippoRoot);
260
- try {
261
- // SAFETY: row's shape matches the columns named in DECISION_COLS above.
262
- const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ? AND tenant_id = ?`)
263
- .get(id, tenantId);
264
- return row ? rowToDecision(row) : null;
265
- }
266
- finally {
267
- closeHippoDb(db);
268
- }
269
- }
270
- export function loadDecisions(hippoRoot, tenantId, opts = {}) {
271
- assertTenantId('loadDecisions', tenantId);
272
- const limit = opts.limit ?? 100;
273
- const after = keysetAfter('created_at', 'id', opts.after);
274
- const db = openHippoDb(hippoRoot);
275
- try {
276
- let rows;
277
- if (opts.status) {
278
- if (!VALID_DECISION_STATES.has(opts.status)) {
279
- throw new BadRequestError(`loadDecisions: status must be one of ${Array.from(VALID_DECISION_STATES).join('|')}; got ${opts.status}`);
280
- }
281
- // SAFETY: rows' shape matches the columns named in DECISION_COLS above.
282
- rows = db.prepare(`
283
- SELECT ${DECISION_COLS} FROM decisions
284
- WHERE tenant_id = ? AND status = ?${after.sql}
285
- ORDER BY created_at DESC, id DESC
286
- LIMIT ?
287
- `).all(tenantId, opts.status, ...after.params, limit);
288
- }
289
- else {
290
- // SAFETY: rows' shape matches the columns named in DECISION_COLS above.
291
- rows = db.prepare(`
292
- SELECT ${DECISION_COLS} FROM decisions
293
- WHERE tenant_id = ?${after.sql}
294
- ORDER BY created_at DESC, id DESC
295
- LIMIT ?
296
- `).all(tenantId, ...after.params, limit);
297
- }
298
- return rows.map(rowToDecision);
299
- }
300
- finally {
301
- closeHippoDb(db);
302
- }
303
- }
304
- export function loadActiveDecisions(hippoRoot, tenantId, opts = {}) {
305
- return loadDecisions(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
306
- }
307
- /**
308
- * Resolve a `--supersedes <memory-id>` (the legacy CLI contract) to the table id
309
- * of the ACTIVE decision backed by that memory, or null when the memory has no
310
- * active decision row (a legacy pre-episode decision-tagged memory). Extracted
311
- * so the CLI's backward-compat path is unit-testable at the store layer without
312
- * exporting cmdDecide.
313
- */
314
- export function resolveActiveDecisionIdByMemory(hippoRoot, tenantId, memoryId) {
315
- assertTenantId('resolveActiveDecisionIdByMemory', tenantId);
316
- const db = openHippoDb(hippoRoot);
317
- try {
318
- // SAFETY: row shape matches the single `id` column named in the SELECT above.
319
- const row = db.prepare(`SELECT id FROM decisions WHERE memory_id = ? AND tenant_id = ? AND status = 'active' ORDER BY id DESC LIMIT 1`).get(memoryId, tenantId);
320
- return row ? row.id : null;
321
- }
322
- finally {
323
- closeHippoDb(db);
324
- }
325
- }
326
- //# sourceMappingURL=decisions.js.map