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
package/dist/mcp/stdio.js CHANGED
@@ -1,9 +1,12 @@
1
1
  // Stdio transport: newline-delimited JSON-RPC frames in on stdin, replies out on stdout.
2
- import { errorFields, log } from '../log.js';
2
+ import { exitAfterFlush, installCrashHandlers } from '../util/crash-handlers.js';
3
+ import { errorMessage, log } from '../util/log.js';
3
4
  import { parseFrame } from './framing.js';
4
- import { mcpErrorResponse, isJsonObjectRecord } from './protocol.js';
5
+ import { mcpErrorResponse } from './protocol.js';
5
6
  import { handleMcpRequest } from './request.js';
6
- import { isJsonString } from '../json.js';
7
+ import { isJsonNumber, isJsonString, isJsonObject } from '../util/json.js';
8
+ import { randomUUID } from 'node:crypto';
9
+ import { runWithRequestId } from '../util/request-scope.js';
7
10
  // MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
8
11
  // https://modelcontextprotocol.io/specification/.../basic/transports#stdio
9
12
  function send(msg) {
@@ -11,9 +14,52 @@ function send(msg) {
11
14
  }
12
15
  // ── Stdio transport ──
13
16
  let buffer = Buffer.alloc(0);
17
+ // The part of a refused frame still on its way, dropped as it arrives so it is never buffered or read as a new frame.
18
+ let refused = 0;
19
+ function withoutRefused(chunk) {
20
+ if (refused === 'line') {
21
+ const newline = chunk.indexOf(0x0a);
22
+ if (newline === -1)
23
+ return chunk.subarray(chunk.length);
24
+ refused = 0;
25
+ return chunk.subarray(newline + 1);
26
+ }
27
+ const dropped = Math.min(refused, chunk.length);
28
+ refused -= dropped;
29
+ return chunk.subarray(dropped);
30
+ }
14
31
  // Only method is checked: handleMcpRequest narrows params where it reads them, as the HTTP transport does.
15
32
  function isRoutableRequest(v) {
16
- return isJsonObjectRecord(v) && isJsonString(v.method);
33
+ return isJsonObject(v) && isJsonString(v.method);
34
+ }
35
+ /** A frame that parsed but names no method: with an id it is a request owed an answer; without one it is a notification, which JSON-RPC forbids answering. */
36
+ function answerUnroutable(frame) {
37
+ const id = isJsonObject(frame) ? frame.id : undefined;
38
+ if (isJsonString(id) || isJsonNumber(id)) {
39
+ send({ jsonrpc: '2.0', id, error: { code: -32600, message: 'Invalid Request: method must be a string' } });
40
+ return;
41
+ }
42
+ log.warn('mcp: dropped a frame with no method and no id; it cannot be routed or answered');
43
+ }
44
+ /** How long stdin's end waits for calls still running, so a client that closes right after its last request still gets the reply. */
45
+ const STDIN_END_DRAIN_MS = 5000;
46
+ // Calls dispatched and not yet answered, each with the method the drain names if it is still running at the bound.
47
+ const inFlight = new Map();
48
+ function track(method, call) {
49
+ inFlight.set(call, method);
50
+ void call.finally(() => inFlight.delete(call));
51
+ }
52
+ async function exitWhenDrained() {
53
+ if (inFlight.size > 0) {
54
+ let bound;
55
+ const timedOut = new Promise((resolve) => { bound = setTimeout(resolve, STDIN_END_DRAIN_MS); });
56
+ await Promise.race([Promise.allSettled(inFlight.keys()), timedOut]);
57
+ clearTimeout(bound);
58
+ }
59
+ for (const method of inFlight.values()) {
60
+ log.warn(`mcp: ${method} was still running ${STDIN_END_DRAIN_MS} ms after stdin closed; exiting without its reply`, { method });
61
+ }
62
+ exitAfterFlush(0);
17
63
  }
18
64
  function dispatch(body) {
19
65
  let parsed;
@@ -25,20 +71,21 @@ function dispatch(body) {
25
71
  send({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } });
26
72
  return;
27
73
  }
28
- // A frame without a string method cannot be routed; dropping it keeps a stray value from crashing the process.
29
- if (!isRoutableRequest(parsed))
74
+ if (!isRoutableRequest(parsed)) {
75
+ answerUnroutable(parsed);
30
76
  return;
77
+ }
31
78
  const req = parsed;
32
79
  if (req.method.startsWith('notifications/')) {
33
- handleMcpRequest(req).catch((err) => {
34
- log.error(`mcp notification ${req.method} failed: ${err instanceof Error ? err.message : String(err)}`);
35
- });
80
+ track(req.method, handleMcpRequest(req).then(() => { }).catch((err) => {
81
+ log.error(`mcp notification ${req.method} failed: ${errorMessage(err)}`);
82
+ }));
36
83
  return;
37
84
  }
38
- handleMcpRequest(req).then((resp) => { if (resp)
85
+ track(req.method, handleMcpRequest(req).then((resp) => { if (resp)
39
86
  send(resp); }).catch((err) => {
40
87
  send(mcpErrorResponse(req.id, err));
41
- });
88
+ }));
42
89
  }
43
90
  /**
44
91
  * Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
@@ -48,33 +95,24 @@ function dispatch(body) {
48
95
  */
49
96
  export function startStdioLoop() {
50
97
  process.stdin.on('data', (chunk) => {
51
- buffer = Buffer.concat([buffer, chunk]);
98
+ buffer = Buffer.concat([buffer, withoutRefused(chunk)]);
52
99
  while (true) {
53
100
  const result = parseFrame(buffer);
54
101
  if (result.kind === 'incomplete')
55
102
  break;
56
103
  buffer = result.rest;
104
+ if (result.kind === 'oversize') {
105
+ refused = result.remainder;
106
+ log.warn('mcp: refused a frame over the size cap with a parse error');
107
+ send({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error: frame exceeds 1MB' } });
108
+ continue;
109
+ }
110
+ // One id per frame, so the error reply and every line logged for the call name the same request.
57
111
  if (result.kind === 'message')
58
- dispatch(result.body);
112
+ runWithRequestId(randomUUID(), () => dispatch(result.body));
59
113
  }
60
114
  });
61
- process.stdin.on('end', () => process.exit(0));
62
- // After an uncaught throw the process state is unknown, so log the cause and exit for the client to restart the server.
63
- const crash = (kind, err) => {
64
- log.error(`mcp ${kind}: ${err instanceof Error ? err.message : String(err)}`, errorFields(err));
65
- exitAfterFlush(1);
66
- };
67
- process.on('uncaughtException', (err) => crash('uncaught exception', err));
68
- process.on('unhandledRejection', (err) => crash('unhandled rejection', err));
69
- }
70
- /** Exit once stdout and stderr have drained, so the last reply and the crash log reach the client; capped at 1 s. */
71
- function exitAfterFlush(code) {
72
- process.exitCode = code;
73
- let pending = 2;
74
- const done = () => { if (--pending === 0)
75
- process.exit(code); };
76
- process.stdout.write('', done);
77
- process.stderr.write('', done);
78
- setTimeout(() => process.exit(code), 1000).unref();
115
+ process.stdin.on('end', () => { void exitWhenDrained(); });
116
+ installCrashHandlers('mcp');
79
117
  }
80
118
  //# sourceMappingURL=stdio.js.map
@@ -1,4 +1,5 @@
1
1
  // Hand-written for the JSON Schema subset the hippo tool definitions use, so the MCP server needs no validator dependency.
2
+ const ARG_PREVIEW_CHARS = 40;
2
3
  function isArgString(v) {
3
4
  return typeof v === 'string';
4
5
  }
@@ -23,7 +24,7 @@ function describeValue(v) {
23
24
  if (Array.isArray(v))
24
25
  return 'array';
25
26
  if (isArgString(v))
26
- return JSON.stringify(v.length > 40 ? `${v.slice(0, 40)}...` : v);
27
+ return JSON.stringify(v.length > ARG_PREVIEW_CHARS ? `${v.slice(0, ARG_PREVIEW_CHARS)}...` : v);
27
28
  if (isArgNumber(v) || isArgBoolean(v))
28
29
  return String(v);
29
30
  return 'object';
package/dist/mcp/tools.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Tool definitions and input schemas served by tools/list.
2
- import { DEFAULT_RECALL_BUDGET } from '../search/types.js';
2
+ import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
3
3
  import { DEFAULT_ASSEMBLE_BUDGET } from '../api/assemble.js';
4
- import { MAX_ID_LEN } from '../http-util.js';
4
+ import { MAX_ID_LEN } from '../util/http-util.js';
5
5
  // ── Tool definitions ──
6
6
  // HTTP sets no budget cap; 25x the recall default leaves room for large-context clients while bounding one call's work.
7
7
  const MAX_BUDGET_TOKENS = 25 * DEFAULT_RECALL_BUDGET;
@@ -18,34 +18,16 @@
18
18
  *
19
19
  * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
20
20
  */
21
- import { type KeysetPosition } from './keyset.js';
22
- export type NoteStatus = 'active' | 'superseded' | 'closed';
21
+ import type { KeysetPosition } from '../util/keyset.js';
22
+ import type { SavableDescriptor } from './descriptor.js';
23
+ import type { CustomerNote, NoteStatus } from '../store/object-types.js';
24
+ export type { CustomerNote, NoteStatus } from '../store/object-types.js';
23
25
  export declare const VALID_NOTE_STATES: ReadonlySet<NoteStatus>;
24
26
  /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
25
27
  * than the 4096 short-field convention. */
26
28
  export declare const MAX_CUSTOMER_LEN = 256;
27
29
  export declare const MAX_NOTE_LEN = 8192;
28
30
  export declare const MAX_CHANGE_SUMMARY_LEN = 4096;
29
- export interface CustomerNote {
30
- id: number;
31
- /** Nullable: ON DELETE SET NULL lets memory deletion proceed without breaking
32
- * the note row. */
33
- memoryId: string | null;
34
- tenantId: string;
35
- /** The account/customer entity this note is scoped to (free-form identifier). */
36
- customer: string;
37
- /** The note body. */
38
- note: string;
39
- /** Server-derived: 1 on a fresh create, predecessor.version + 1 on supersede. */
40
- version: number;
41
- status: NoteStatus;
42
- supersededBy: number | null;
43
- supersededAt: string | null;
44
- /** The per-version delta note; set on a successor row only (NULL on a v1). */
45
- changeSummary: string | null;
46
- closedAt: string | null;
47
- createdAt: string;
48
- }
49
31
  export interface SaveCustomerNoteOpts {
50
32
  customer: string;
51
33
  note: string;
@@ -64,11 +46,12 @@ export interface ListCustomerNotesOpts {
64
46
  /** Resume after this row: the position the previous page ended on. */
65
47
  after?: KeysetPosition;
66
48
  }
49
+ export declare const CUSTOMER_NOTE: SavableDescriptor<'customer_note', SaveCustomerNoteOpts>;
67
50
  /**
68
51
  * Create a customer_note (or a new version that supersedes an existing one). Writes
69
- * the memory mirror + the customer_notes row atomically inside writeEntry's SAVEPOINT.
52
+ * the memory mirror + the customer_notes row in the `objects` store group's one transaction.
70
53
  * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
71
- * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same SAVEPOINT;
54
+ * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
72
55
  * the new version = predecessor.version + 1 (server-derived).
73
56
  *
74
57
  * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
@@ -0,0 +1,112 @@
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 { checkText, requireLine } from './fields.js';
22
+ import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
23
+ // ---------------------------------------------------------------------------
24
+ // Domain types
25
+ // ---------------------------------------------------------------------------
26
+ export const VALID_NOTE_STATES = new Set([
27
+ 'active',
28
+ 'superseded',
29
+ 'closed',
30
+ ]);
31
+ /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
32
+ * than the 4096 short-field convention. */
33
+ export const MAX_CUSTOMER_LEN = 256;
34
+ export const MAX_NOTE_LEN = 8192;
35
+ export const MAX_CHANGE_SUMMARY_LEN = 4096;
36
+ /** Recall-surface content for the memory mirror: customer + note. Named (mirrors
37
+ * buildBriefContent) so the recall surface is deterministic + unit-testable. */
38
+ function buildNoteContent(customer, note) {
39
+ return `${customer}\n\n${note}`;
40
+ }
41
+ export const CUSTOMER_NOTE = {
42
+ kind: 'customer_note',
43
+ label: 'note',
44
+ plural: 'notes',
45
+ fn: { get: 'loadCustomerNoteById', close: 'closeCustomerNote', list: 'loadCustomerNotes', save: 'saveCustomerNote' },
46
+ states: VALID_NOTE_STATES,
47
+ closableFrom: ['active'],
48
+ draft(opts) {
49
+ // The customer becomes a `customer:<lc>` recall tag and an identifier, so it must be one line.
50
+ const customer = requireLine(opts.customer, MAX_CUSTOMER_LEN, {
51
+ required: 'saveCustomerNote: customer is required',
52
+ singleLine: 'saveCustomerNote: customer must be a single line (no newlines)',
53
+ tooLong: `saveCustomerNote: customer exceeds the ${MAX_CUSTOMER_LEN}-char cap`,
54
+ });
55
+ checkText(opts.note, MAX_NOTE_LEN, {
56
+ required: 'saveCustomerNote: note is required',
57
+ tooLong: `saveCustomerNote: note exceeds the ${MAX_NOTE_LEN}-char cap`,
58
+ });
59
+ checkText(opts.changeSummary, MAX_CHANGE_SUMMARY_LEN, {
60
+ tooLong: `saveCustomerNote: changeSummary exceeds the ${MAX_CHANGE_SUMMARY_LEN}-char cap`,
61
+ });
62
+ return {
63
+ fields: { customer, note: opts.note },
64
+ content: buildNoteContent(customer, opts.note),
65
+ tags: [`customer:${customer.toLowerCase()}`, ...(opts.extraTags ?? [])],
66
+ supersedesId: opts.supersedesNoteId,
67
+ changeSummary: opts.changeSummary,
68
+ at: new Date().toISOString(),
69
+ };
70
+ },
71
+ };
72
+ // ---------------------------------------------------------------------------
73
+ // Public API
74
+ // ---------------------------------------------------------------------------
75
+ /**
76
+ * Create a customer_note (or a new version that supersedes an existing one). Writes
77
+ * the memory mirror + the customer_notes row in the `objects` store group's one transaction.
78
+ * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
79
+ * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same transaction;
80
+ * the new version = predecessor.version + 1 (server-derived).
81
+ *
82
+ * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
83
+ * + caller extraTags) so scope-aware recall treats the note as entity-local. There is
84
+ * no self-recursion path (customer_note has no receipt-query/refresh).
85
+ */
86
+ export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
87
+ return saveObjectAt(CUSTOMER_NOTE, { hippoRoot, tenantId, actor }, opts);
88
+ }
89
+ /**
90
+ * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
91
+ * distinguishes not-found from not-active. A superseded row is terminal.
92
+ */
93
+ export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
94
+ return closeObjectAt(hippoRoot, CUSTOMER_NOTE, tenantId, id, actor);
95
+ }
96
+ export function loadCustomerNoteById(hippoRoot, tenantId, id) {
97
+ return objectByIdAt(hippoRoot, CUSTOMER_NOTE, tenantId, id);
98
+ }
99
+ export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
100
+ return listObjectsAt(hippoRoot, CUSTOMER_NOTE, tenantId, { status: opts.status, filter: opts.customer, limit: opts.limit, after: opts.after });
101
+ }
102
+ /**
103
+ * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
104
+ * MANY notes) - this deliberately DIVERGES from project_brief's
105
+ * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
106
+ * evolving summary. A future caller cloning the project_brief shape by analogy must
107
+ * not assume a single-return here; the plural name signals the list contract.
108
+ */
109
+ export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
110
+ return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
111
+ }
112
+ //# sourceMappingURL=customer-notes.js.map
@@ -18,29 +18,15 @@
18
18
  * superseded_by same-tenant trigger makes cross-tenant supersession
19
19
  * unrepresentable. Mirrors the predictions pattern (src/predictions.ts).
20
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).
21
+ * Dual-write atomicity: `saveDecision` hands the memory and the decision to the
22
+ * `objects` store group, which commits them (and, when superseding, the old
23
+ * row's UPDATE) together, so a failure in any step rolls all of them back.
25
24
  */
26
- import { type KeysetPosition } from './keyset.js';
27
- export type DecisionStatus = 'active' | 'superseded' | 'closed';
25
+ import type { KeysetPosition } from '../util/keyset.js';
26
+ import type { SavableDescriptor } from './descriptor.js';
27
+ import type { Decision, DecisionStatus } from '../store/object-types.js';
28
+ export type { Decision, DecisionStatus } from '../store/object-types.js';
28
29
  export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
29
- export interface Decision {
30
- id: number;
31
- /** Nullable: ON DELETE SET NULL lets memory deletion (forget / consolidate /
32
- * archive) proceed without breaking the decision row. */
33
- memoryId: string | null;
34
- tenantId: string;
35
- decisionText: string;
36
- context: string | null;
37
- status: DecisionStatus;
38
- /** Successor decision id; set only when status === 'superseded'. */
39
- supersededBy: number | null;
40
- supersededAt: string | null;
41
- closedAt: string | null;
42
- createdAt: string;
43
- }
44
30
  export interface SaveDecisionOpts {
45
31
  decisionText: string;
46
32
  context?: string;
@@ -58,24 +44,23 @@ export interface ListDecisionsOpts {
58
44
  /** Resume after this row: the position the previous page ended on. */
59
45
  after?: KeysetPosition;
60
46
  }
47
+ export declare const DECISION: SavableDescriptor<'decision', SaveDecisionOpts>;
61
48
  /**
62
- * Create a decision. Writes the memory mirror + the decisions row atomically
63
- * inside writeEntry's SAVEPOINT 'write_entry'. When supersedesDecisionId is
49
+ * Create a decision. The memory mirror and the decisions row are written in
50
+ * one transaction by the `objects` store group. When supersedesDecisionId is
64
51
  * given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
65
- * SAVEPOINT (CAS: WHERE status='active'; throws on changes===0 so a duplicate
52
+ * transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
66
53
  * supersede aborts the whole write rather than orphaning a successor).
67
54
  *
68
55
  * The memory mirror preserves the legacy `hippo decide` shape: tags
69
56
  * ['decision', ...extraTags], source 'decision', confidence 'verified',
70
- * the half-life objectHalfLifeDays picks, content = "<text>\n\nContext: <context>"
57
+ * the configured default half-life, content = "<text>\n\nContext: <context>"
71
58
  * when context is given (so existing recall output is unchanged).
72
59
  */
73
60
  export declare function saveDecision(hippoRoot: string, tenantId: string, opts: SaveDecisionOpts, actor?: string): Decision;
74
61
  /**
75
62
  * Close (retire) an active decision with no successor. Updates the decisions
76
- * row only; the memory mirror is not mutated. CAS guard mirrors closePrediction
77
- * (predictions.ts): WHERE status='active'; 0 changes distinguishes not-found
78
- * from not-active so callers surface the right error.
63
+ * row only; the memory mirror is not mutated.
79
64
  */
80
65
  export declare function closeDecision(hippoRoot: string, tenantId: string, id: number, actor?: string): Decision;
81
66
  export declare function loadDecisionById(hippoRoot: string, tenantId: string, id: number): Decision | null;
@@ -0,0 +1,101 @@
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` hands the memory and the decision to the
22
+ * `objects` store group, which commits them (and, when superseding, the old
23
+ * row's UPDATE) together, so a failure in any step rolls all of them back.
24
+ */
25
+ import { BadRequestError } from '../core/api-errors.js';
26
+ import { assertTenantId } from '../store/tenant.js';
27
+ import { closeObjectAt, listObjectsAt, objectByIdAt, saveObjectAt } from './lifecycle.js';
28
+ import { objectIdByMemory } from '../store/sqlite/objects-group.js';
29
+ // ---------------------------------------------------------------------------
30
+ // Domain types
31
+ // ---------------------------------------------------------------------------
32
+ export const VALID_DECISION_STATES = new Set([
33
+ 'active',
34
+ 'superseded',
35
+ 'closed',
36
+ ]);
37
+ export const DECISION = {
38
+ kind: 'decision',
39
+ label: 'decision',
40
+ plural: 'decisions',
41
+ fn: { get: 'loadDecisionById', close: 'closeDecision', list: 'loadDecisions', save: 'saveDecision' },
42
+ states: VALID_DECISION_STATES,
43
+ closableFrom: ['active'],
44
+ draft(opts) {
45
+ if (!opts.decisionText)
46
+ throw new BadRequestError('saveDecision: decisionText is required');
47
+ return {
48
+ fields: { decisionText: opts.decisionText, context: opts.context },
49
+ content: opts.context ? `${opts.decisionText}\n\nContext: ${opts.context}` : opts.decisionText,
50
+ tags: opts.extraTags ?? [],
51
+ supersedesId: opts.supersedesDecisionId,
52
+ at: new Date().toISOString(),
53
+ };
54
+ },
55
+ };
56
+ // ---------------------------------------------------------------------------
57
+ // Public API
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Create a decision. The memory mirror and the decisions row are written in
61
+ * one transaction by the `objects` store group. When supersedesDecisionId is
62
+ * given, the referenced ACTIVE row is UPDATEd -> superseded in the SAME
63
+ * transaction (CAS: WHERE status='active'; zero rows changed means a duplicate
64
+ * supersede aborts the whole write rather than orphaning a successor).
65
+ *
66
+ * The memory mirror preserves the legacy `hippo decide` shape: tags
67
+ * ['decision', ...extraTags], source 'decision', confidence 'verified',
68
+ * the configured default half-life, content = "<text>\n\nContext: <context>"
69
+ * when context is given (so existing recall output is unchanged).
70
+ */
71
+ export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
72
+ return saveObjectAt(DECISION, { hippoRoot, tenantId, actor }, opts);
73
+ }
74
+ /**
75
+ * Close (retire) an active decision with no successor. Updates the decisions
76
+ * row only; the memory mirror is not mutated.
77
+ */
78
+ export function closeDecision(hippoRoot, tenantId, id, actor = 'cli') {
79
+ return closeObjectAt(hippoRoot, DECISION, tenantId, id, actor);
80
+ }
81
+ export function loadDecisionById(hippoRoot, tenantId, id) {
82
+ return objectByIdAt(hippoRoot, DECISION, tenantId, id);
83
+ }
84
+ export function loadDecisions(hippoRoot, tenantId, opts = {}) {
85
+ return listObjectsAt(hippoRoot, DECISION, tenantId, opts);
86
+ }
87
+ export function loadActiveDecisions(hippoRoot, tenantId, opts = {}) {
88
+ return loadDecisions(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
89
+ }
90
+ /**
91
+ * Resolve a `--supersedes <memory-id>` (the legacy CLI contract) to the table id
92
+ * of the ACTIVE decision backed by that memory, or null when the memory has no
93
+ * active decision row (a legacy pre-episode decision-tagged memory). Extracted
94
+ * so the CLI's backward-compat path is unit-testable at the store layer without
95
+ * exporting cmdDecide.
96
+ */
97
+ export function resolveActiveDecisionIdByMemory(hippoRoot, tenantId, memoryId) {
98
+ assertTenantId('resolveActiveDecisionIdByMemory', tenantId);
99
+ return objectIdByMemory(hippoRoot, tenantId, 'decision', 'active', memoryId);
100
+ }
101
+ //# sourceMappingURL=decisions.js.map
@@ -0,0 +1,52 @@
1
+ import type { KeysetPosition } from '../util/keyset.js';
2
+ import type { ObjectByKind, ObjectFields, ObjectKind, SavableKind } from '../store/object-types.js';
3
+ export interface ObjectDescriptor<K extends ObjectKind> {
4
+ readonly kind: K;
5
+ /** The nouns error text uses: "brief 3 not found", "only active briefs". */
6
+ readonly label: string;
7
+ readonly plural: string;
8
+ /** The exported function names; each one prefixes the errors of its own call. */
9
+ readonly fn: {
10
+ readonly get: string;
11
+ readonly close: string;
12
+ readonly list: string;
13
+ };
14
+ readonly states: ReadonlySet<ObjectByKind[K]['status']>;
15
+ /** The statuses a close may start from. */
16
+ readonly closableFrom: readonly ObjectByKind[K]['status'][];
17
+ /** Said in place of "not <closable statuses>" when a close is refused; incidents say "already closed". */
18
+ readonly closeRefusal?: string;
19
+ }
20
+ /** One save, checked and resolved before a store is asked. */
21
+ export interface ObjectDraft<K extends SavableKind> {
22
+ readonly fields: ObjectFields[K];
23
+ /** The mirror memory's text, and its tags after the kind's own. */
24
+ readonly content: string;
25
+ readonly tags: readonly string[];
26
+ /** The active object this one replaces. */
27
+ readonly supersedesId: number | undefined;
28
+ /** What changed; stored only on a versioned successor. */
29
+ readonly changeSummary?: string;
30
+ /** Read once the checks pass, so one instant stamps everything the save writes. */
31
+ readonly at: string;
32
+ }
33
+ /** A kind the shared save writes: active rows, replaced by supersede. `W` is the options its module's save takes. */
34
+ export interface SavableDescriptor<K extends SavableKind, W> extends ObjectDescriptor<K> {
35
+ readonly fn: {
36
+ readonly get: string;
37
+ readonly close: string;
38
+ readonly list: string;
39
+ readonly save: string;
40
+ };
41
+ /** Throws BadRequestError for options the kind refuses. */
42
+ readonly draft: (opts: W) => ObjectDraft<K>;
43
+ }
44
+ export interface ObjectListOpts<K extends ObjectKind> {
45
+ status?: ObjectByKind[K]['status'];
46
+ /** The value the kind's one filter column must equal: a customer note's customer, a project brief's repo. */
47
+ filter?: string;
48
+ limit?: number;
49
+ /** Resume after this row: the position the previous page ended on. */
50
+ after?: KeysetPosition;
51
+ }
52
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1,4 @@
1
+ // The words and rules that differ between the typed objects (decision, project brief and the rest), held as data so one lifecycle serves every kind.
2
+ // A kind's table, columns and audit keys sit behind the `objects` store group.
3
+ export {};
4
+ //# sourceMappingURL=descriptor.js.map
@@ -0,0 +1,15 @@
1
+ export interface LineMessages {
2
+ readonly required: string;
3
+ readonly singleLine: string;
4
+ readonly tooLong: string;
5
+ }
6
+ /** A one-line name such as a repo or a customer: trimmed first, because the trimmed value is what gets stored and matched. */
7
+ export declare function requireLine(value: string, max: number, m: LineMessages): string;
8
+ export interface TextMessages {
9
+ /** Leave out for an optional field. */
10
+ readonly required?: string;
11
+ readonly tooLong: string;
12
+ }
13
+ /** A body stored as written: blank fails a required one, and the cap counts the untrimmed length. */
14
+ export declare function checkText(value: string | undefined, max: number, m: TextMessages): void;
15
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1,21 @@
1
+ // Field checks the typed objects share. The module passes each error text in full, because the wording differs per type.
2
+ import { BadRequestError } from '../core/api-errors.js';
3
+ /** A one-line name such as a repo or a customer: trimmed first, because the trimmed value is what gets stored and matched. */
4
+ export function requireLine(value, max, m) {
5
+ const line = (value ?? '').trim();
6
+ if (line.length === 0)
7
+ throw new BadRequestError(m.required);
8
+ if (/[\r\n]/.test(line))
9
+ throw new BadRequestError(m.singleLine);
10
+ if (line.length > max)
11
+ throw new BadRequestError(m.tooLong);
12
+ return line;
13
+ }
14
+ /** A body stored as written: blank fails a required one, and the cap counts the untrimmed length. */
15
+ export function checkText(value, max, m) {
16
+ if (m.required !== undefined && (!value || value.trim().length === 0))
17
+ throw new BadRequestError(m.required);
18
+ if (value !== undefined && value.length > max)
19
+ throw new BadRequestError(m.tooLong);
20
+ }
21
+ //# sourceMappingURL=fields.js.map