okengine 0.2.6 → 0.2.8

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 (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +45 -37
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -41,15 +41,7 @@ const CATEGORY_RANK: Record<DiffCategory, number> = {
41
41
  "no-impact": 0,
42
42
  };
43
43
 
44
- const EFFECT_KEYS = [
45
- "reads",
46
- "writes",
47
- "emits",
48
- "sends",
49
- "asks",
50
- "secrets",
51
- "calls",
52
- ] as const;
44
+ const EFFECT_KEYS = ["reads", "writes", "emits", "sends", "asks", "secrets", "calls"] as const;
53
45
 
54
46
  /** Isolation strength: higher = stronger tenant separation. */
55
47
  const ISOLATION_RANK: Record<string, number> = {
@@ -61,10 +53,7 @@ const ISOLATION_RANK: Record<string, number> = {
61
53
  /**
62
54
  * Diff two manifests and classify every behavioural change.
63
55
  */
64
- export function diffManifest(
65
- before: Manifest,
66
- after: Manifest,
67
- ): ManifestDiffResult {
56
+ export function diffManifest(before: Manifest, after: Manifest): ManifestDiffResult {
68
57
  const changes: ManifestChange[] = [];
69
58
 
70
59
  if (before.app !== after.app) {
@@ -123,9 +112,7 @@ export function diffManifest(
123
112
  /**
124
113
  * Highest blast-radius category among changes, or `null` if none.
125
114
  */
126
- export function highestSeverity(
127
- changes: readonly ManifestChange[],
128
- ): DiffCategory | null {
115
+ export function highestSeverity(changes: readonly ManifestChange[]): DiffCategory | null {
129
116
  let best: DiffCategory | null = null;
130
117
  for (const c of changes) {
131
118
  if (best === null || CATEGORY_RANK[c.category] > CATEGORY_RANK[best]) {
@@ -165,14 +152,7 @@ function diffRecord<T>(
165
152
  const path = `${base}/${escape(key)}`;
166
153
  if (!aKeys.has(key)) {
167
154
  out.push(
168
- change(
169
- path,
170
- removedCategory,
171
- "removed",
172
- before![key],
173
- undefined,
174
- `removed ${path}`,
175
- ),
155
+ change(path, removedCategory, "removed", before![key], undefined, `removed ${path}`),
176
156
  );
177
157
  continue;
178
158
  }
@@ -182,25 +162,11 @@ function diffRecord<T>(
182
162
  for (const key of sorted(aKeys)) {
183
163
  if (bKeys.has(key)) continue;
184
164
  const path = `${base}/${escape(key)}`;
185
- out.push(
186
- change(
187
- path,
188
- addedCategory,
189
- "added",
190
- undefined,
191
- after![key],
192
- `added ${path}`,
193
- ),
194
- );
165
+ out.push(change(path, addedCategory, "added", undefined, after![key], `added ${path}`));
195
166
  }
196
167
  }
197
168
 
198
- function diffFlow(
199
- before: Flow,
200
- after: Flow,
201
- path: string,
202
- out: ManifestChange[],
203
- ): void {
169
+ function diffFlow(before: Flow, after: Flow, path: string, out: ManifestChange[]): void {
204
170
  diffTrigger(before.trigger, after.trigger, `${path}/trigger`, out);
205
171
  diffGatesList(before.gates, after.gates, `${path}/gates`, out);
206
172
  diffContractSchema(before.in, after.in, `${path}/in`, "in", out);
@@ -228,11 +194,18 @@ function diffFlow(
228
194
  );
229
195
  }
230
196
 
231
- if (before.durable !== after.durable && (before.durable !== undefined || after.durable !== undefined)) {
197
+ if (
198
+ before.durable !== after.durable &&
199
+ (before.durable !== undefined || after.durable !== undefined)
200
+ ) {
232
201
  out.push(
233
202
  change(
234
203
  `${path}/durable`,
235
- after.durable === true ? "effect-widening" : before.durable === true ? "contract-breaking" : "no-impact",
204
+ after.durable === true
205
+ ? "effect-widening"
206
+ : before.durable === true
207
+ ? "contract-breaking"
208
+ : "no-impact",
236
209
  kindOf(before.durable, after.durable),
237
210
  before.durable,
238
211
  after.durable,
@@ -267,7 +240,10 @@ function diffFlow(
267
240
  );
268
241
  }
269
242
 
270
- if (before.cacheKeys !== after.cacheKeys && (before.cacheKeys !== undefined || after.cacheKeys !== undefined)) {
243
+ if (
244
+ before.cacheKeys !== after.cacheKeys &&
245
+ (before.cacheKeys !== undefined || after.cacheKeys !== undefined)
246
+ ) {
271
247
  out.push(
272
248
  change(
273
249
  `${path}/cacheKeys`,
@@ -280,7 +256,10 @@ function diffFlow(
280
256
  );
281
257
  }
282
258
 
283
- if (before.source !== after.source && (before.source !== undefined || after.source !== undefined)) {
259
+ if (
260
+ before.source !== after.source &&
261
+ (before.source !== undefined || after.source !== undefined)
262
+ ) {
284
263
  out.push(
285
264
  change(
286
265
  `${path}/source`,
@@ -421,9 +400,7 @@ function diffTrigger(
421
400
  out.push(change(path, "contract-breaking", "removed", before, after, "trigger removed"));
422
401
  return;
423
402
  }
424
- out.push(
425
- change(path, "contract-breaking", "changed", before, after, "trigger changed"),
426
- );
403
+ out.push(change(path, "contract-breaking", "changed", before, after, "trigger changed"));
427
404
  }
428
405
 
429
406
  function diffGatesList(
@@ -436,9 +413,7 @@ function diffGatesList(
436
413
  const a = after ?? [];
437
414
  if (setEqual(b, a) && listEqual(b, a)) return;
438
415
  if (setEqual(b, a)) {
439
- out.push(
440
- change(path, "no-impact", "changed", b, a, "gates reordered"),
441
- );
416
+ out.push(change(path, "no-impact", "changed", b, a, "gates reordered"));
442
417
  return;
443
418
  }
444
419
 
@@ -552,14 +527,23 @@ function diffContractSchema(
552
527
  );
553
528
  return;
554
529
  }
555
- if (schemaBreaksClients(before as Record<string, unknown>, after as Record<string, unknown>, role)) {
530
+ if (
531
+ schemaBreaksClients(before as Record<string, unknown>, after as Record<string, unknown>, role)
532
+ ) {
556
533
  out.push(
557
534
  change(path, "contract-breaking", "changed", before, after, `${role} schema contract broke`),
558
535
  );
559
536
  return;
560
537
  }
561
538
  out.push(
562
- change(path, "no-impact", "changed", before, after, `${role} schema changed without client break`),
539
+ change(
540
+ path,
541
+ "no-impact",
542
+ "changed",
543
+ before,
544
+ after,
545
+ `${role} schema changed without client break`,
546
+ ),
563
547
  );
564
548
  }
565
549
 
@@ -598,12 +582,7 @@ function diffErrors(
598
582
  );
599
583
  }
600
584
 
601
- if (
602
- before &&
603
- after &&
604
- !Array.isArray(before) &&
605
- !Array.isArray(after)
606
- ) {
585
+ if (before && after && !Array.isArray(before) && !Array.isArray(after)) {
607
586
  for (const name of intersection(bNames, aNames)) {
608
587
  if (!deepEqual(before[name], after[name])) {
609
588
  out.push(
@@ -619,9 +598,7 @@ function diffErrors(
619
598
  }
620
599
  }
621
600
  } else if (setEqual(bNames, aNames) && !deepEqual(before, after)) {
622
- out.push(
623
- change(path, "no-impact", "changed", before, after, "errors reordered"),
624
- );
601
+ out.push(change(path, "no-impact", "changed", before, after, "errors reordered"));
625
602
  }
626
603
  }
627
604
 
@@ -636,16 +613,7 @@ function diffEffects(
636
613
  const a = after?.[key] ?? [];
637
614
  if (setEqual(b, a)) {
638
615
  if (!listEqual(b, a) && b.length > 0) {
639
- out.push(
640
- change(
641
- `${path}/${key}`,
642
- "no-impact",
643
- "changed",
644
- b,
645
- a,
646
- `${key} reordered`,
647
- ),
648
- );
616
+ out.push(change(`${path}/${key}`, "no-impact", "changed", b, a, `${key} reordered`));
649
617
  }
650
618
  continue;
651
619
  }
@@ -732,12 +700,7 @@ function diffSlo(
732
700
  }
733
701
  }
734
702
 
735
- function diffSignal(
736
- before: Signal,
737
- after: Signal,
738
- path: string,
739
- out: ManifestChange[],
740
- ): void {
703
+ function diffSignal(before: Signal, after: Signal, path: string, out: ManifestChange[]): void {
741
704
  if (before.delivery !== after.delivery) {
742
705
  out.push(
743
706
  change(
@@ -799,12 +762,7 @@ function diffSignal(
799
762
  }
800
763
  }
801
764
 
802
- function diffStore(
803
- before: Store,
804
- after: Store,
805
- path: string,
806
- out: ManifestChange[],
807
- ): void {
765
+ function diffStore(before: Store, after: Store, path: string, out: ManifestChange[]): void {
808
766
  if (before.facet !== after.facet) {
809
767
  out.push(
810
768
  change(
@@ -837,19 +795,12 @@ function diffStore(
837
795
  }
838
796
  }
839
797
 
840
- function diffTable(
841
- before: Table,
842
- after: Table,
843
- path: string,
844
- out: ManifestChange[],
845
- ): void {
798
+ function diffTable(before: Table, after: Table, path: string, out: ManifestChange[]): void {
846
799
  if (!deepEqual(before.columns, after.columns)) {
847
800
  out.push(
848
801
  change(
849
802
  `${path}/columns`,
850
- classificationWeakened(before.columns, after.columns)
851
- ? "permission-widening"
852
- : "no-impact",
803
+ classificationWeakened(before.columns, after.columns) ? "permission-widening" : "no-impact",
853
804
  "changed",
854
805
  before.columns,
855
806
  after.columns,
@@ -873,15 +824,9 @@ function diffTable(
873
824
  }
874
825
  }
875
826
 
876
- function diffClock(
877
- before: Clock,
878
- after: Clock,
879
- path: string,
880
- out: ManifestChange[],
881
- ): void {
827
+ function diffClock(before: Clock, after: Clock, path: string, out: ManifestChange[]): void {
882
828
  if (deepEqual(before, after)) return;
883
- const scheduleChanged =
884
- before.cron !== after.cron || before.every !== after.every;
829
+ const scheduleChanged = before.cron !== after.cron || before.every !== after.every;
885
830
  out.push(
886
831
  change(
887
832
  path,
@@ -894,20 +839,12 @@ function diffClock(
894
839
  );
895
840
  }
896
841
 
897
- function diffGateDef(
898
- before: Gate,
899
- after: Gate,
900
- path: string,
901
- out: ManifestChange[],
902
- ): void {
842
+ function diffGateDef(before: Gate, after: Gate, path: string, out: ManifestChange[]): void {
903
843
  if (deepEqual(before, after)) return;
904
844
 
905
845
  const rolesRemoved = setDiff(before.roles, after.roles);
906
846
  const scopesRemoved = setDiff(before.scopes, after.scopes);
907
- const maxWidened =
908
- before.max !== undefined &&
909
- after.max !== undefined &&
910
- after.max > before.max;
847
+ const maxWidened = before.max !== undefined && after.max !== undefined && after.max > before.max;
911
848
 
912
849
  // Widened membership (e.g. roles: [staff] → [staff, member] or roles replaced by broader set)
913
850
  const rolesAdded = setDiff(after.roles, before.roles);
@@ -930,16 +867,7 @@ function diffGateDef(
930
867
  }
931
868
 
932
869
  if (rolesRemoved.length > 0 || scopesRemoved.length > 0) {
933
- out.push(
934
- change(
935
- path,
936
- "no-impact",
937
- "changed",
938
- before,
939
- after,
940
- "gate narrowed",
941
- ),
942
- );
870
+ out.push(change(path, "no-impact", "changed", before, after, "gate narrowed"));
943
871
  return;
944
872
  }
945
873
 
@@ -957,9 +885,7 @@ function diffGateDef(
957
885
  return;
958
886
  }
959
887
 
960
- out.push(
961
- change(path, "no-impact", "changed", before, after, "gate definition changed"),
962
- );
888
+ out.push(change(path, "no-impact", "changed", before, after, "gate definition changed"));
963
889
  }
964
890
 
965
891
  function diffSecret(
@@ -982,17 +908,10 @@ function diffSecret(
982
908
  );
983
909
  return;
984
910
  }
985
- out.push(
986
- change(path, "no-impact", "changed", before, after, "secret contract metadata changed"),
987
- );
911
+ out.push(change(path, "no-impact", "changed", before, after, "secret contract metadata changed"));
988
912
  }
989
913
 
990
- function diffChannel(
991
- before: Channel,
992
- after: Channel,
993
- path: string,
994
- out: ManifestChange[],
995
- ): void {
914
+ function diffChannel(before: Channel, after: Channel, path: string, out: ManifestChange[]): void {
996
915
  if (deepEqual(before, after)) return;
997
916
  if (before.medium !== after.medium && before.medium && after.medium) {
998
917
  out.push(
@@ -1038,18 +957,11 @@ function diffChannel(
1038
957
  before.medium === after.medium &&
1039
958
  !deepEqual(before, after)
1040
959
  ) {
1041
- out.push(
1042
- change(path, "no-impact", "changed", before, after, "channel metadata changed"),
1043
- );
960
+ out.push(change(path, "no-impact", "changed", before, after, "channel metadata changed"));
1044
961
  }
1045
962
  }
1046
963
 
1047
- function diffPlugin(
1048
- before: Plugin,
1049
- after: Plugin,
1050
- path: string,
1051
- out: ManifestChange[],
1052
- ): void {
964
+ function diffPlugin(before: Plugin, after: Plugin, path: string, out: ManifestChange[]): void {
1053
965
  if (deepEqual(before, after)) return;
1054
966
  const interceptsAdded = setDiff(after.intercepts, before.intercepts);
1055
967
  const declaresAdded = setDiff(after.declares, before.declares);
@@ -1066,17 +978,10 @@ function diffPlugin(
1066
978
  );
1067
979
  return;
1068
980
  }
1069
- out.push(
1070
- change(path, "no-impact", "changed", before, after, "plugin metadata changed"),
1071
- );
981
+ out.push(change(path, "no-impact", "changed", before, after, "plugin metadata changed"));
1072
982
  }
1073
983
 
1074
- function diffJourney(
1075
- before: Journey,
1076
- after: Journey,
1077
- path: string,
1078
- out: ManifestChange[],
1079
- ): void {
984
+ function diffJourney(before: Journey, after: Journey, path: string, out: ManifestChange[]): void {
1080
985
  if (deepEqual(before, after)) return;
1081
986
  diffSlo(before.slo, after.slo, `${path}/slo`, out);
1082
987
  if (before.composes !== after.composes) {
@@ -1085,9 +990,7 @@ function diffJourney(
1085
990
  out.push(
1086
991
  change(
1087
992
  `${path}/composes`,
1088
- b !== undefined && a !== undefined && a < b
1089
- ? "contract-breaking"
1090
- : "no-impact",
993
+ b !== undefined && a !== undefined && a < b ? "contract-breaking" : "no-impact",
1091
994
  kindOf(before.composes, after.composes),
1092
995
  before.composes,
1093
996
  after.composes,
@@ -1099,9 +1002,7 @@ function diffJourney(
1099
1002
  out.push(
1100
1003
  change(
1101
1004
  `${path}/flows`,
1102
- setDiff(before.flows, after.flows).length > 0
1103
- ? "contract-breaking"
1104
- : "no-impact",
1005
+ setDiff(before.flows, after.flows).length > 0 ? "contract-breaking" : "no-impact",
1105
1006
  "changed",
1106
1007
  before.flows,
1107
1008
  after.flows,
@@ -1111,26 +1012,23 @@ function diffJourney(
1111
1012
  }
1112
1013
  }
1113
1014
 
1114
- function diffAi(
1115
- before: Ai | undefined,
1116
- after: Ai | undefined,
1117
- out: ManifestChange[],
1118
- ): void {
1119
- diffRecord(before?.models, after?.models, "/ai/models", (b, a, path, o) => {
1120
- if (!deepEqual(b, a)) {
1121
- o.push(change(path, "contract-breaking", "changed", b, a, "ai model changed"));
1122
- }
1123
- }, out);
1015
+ function diffAi(before: Ai | undefined, after: Ai | undefined, out: ManifestChange[]): void {
1016
+ diffRecord(
1017
+ before?.models,
1018
+ after?.models,
1019
+ "/ai/models",
1020
+ (b, a, path, o) => {
1021
+ if (!deepEqual(b, a)) {
1022
+ o.push(change(path, "contract-breaking", "changed", b, a, "ai model changed"));
1023
+ }
1024
+ },
1025
+ out,
1026
+ );
1124
1027
  diffRecord(before?.prompts, after?.prompts, "/ai/prompts", diffPrompt, out);
1125
1028
  diffRecord(before?.agents, after?.agents, "/ai/agents", diffAgent, out);
1126
1029
  }
1127
1030
 
1128
- function diffPrompt(
1129
- before: AiPrompt,
1130
- after: AiPrompt,
1131
- path: string,
1132
- out: ManifestChange[],
1133
- ): void {
1031
+ function diffPrompt(before: AiPrompt, after: AiPrompt, path: string, out: ManifestChange[]): void {
1134
1032
  if (deepEqual(before, after)) return;
1135
1033
  if (before.version !== after.version) {
1136
1034
  out.push(
@@ -1191,12 +1089,7 @@ function diffPrompt(
1191
1089
  }
1192
1090
  }
1193
1091
 
1194
- function diffAgent(
1195
- before: AiAgent,
1196
- after: AiAgent,
1197
- path: string,
1198
- out: ManifestChange[],
1199
- ): void {
1092
+ function diffAgent(before: AiAgent, after: AiAgent, path: string, out: ManifestChange[]): void {
1200
1093
  if (deepEqual(before, after)) return;
1201
1094
  const toolsAdded = setDiff(after.tools, before.tools);
1202
1095
  const toolsRemoved = setDiff(before.tools, after.tools);
@@ -1238,7 +1131,11 @@ function diffAgent(
1238
1131
  ),
1239
1132
  );
1240
1133
  }
1241
- if (!deepEqual(before.budget, after.budget) && toolsAdded.length === 0 && toolsRemoved.length === 0) {
1134
+ if (
1135
+ !deepEqual(before.budget, after.budget) &&
1136
+ toolsAdded.length === 0 &&
1137
+ toolsRemoved.length === 0
1138
+ ) {
1242
1139
  const bCost = before.budget?.maxCostPerRun ?? before.budget?.maxCostPerCall ?? 0;
1243
1140
  const aCost = after.budget?.maxCostPerRun ?? after.budget?.maxCostPerCall ?? 0;
1244
1141
  out.push(
@@ -1326,9 +1223,7 @@ function diffTenancy(
1326
1223
  out.push(
1327
1224
  change(
1328
1225
  "/tenancy/isolation",
1329
- b !== undefined && a !== undefined && a < b
1330
- ? "permission-widening"
1331
- : "no-impact",
1226
+ b !== undefined && a !== undefined && a < b ? "permission-widening" : "no-impact",
1332
1227
  "changed",
1333
1228
  before?.isolation,
1334
1229
  after?.isolation,
@@ -1337,11 +1232,7 @@ function diffTenancy(
1337
1232
  );
1338
1233
  }
1339
1234
 
1340
- function diffI18n(
1341
- before: I18n | undefined,
1342
- after: I18n | undefined,
1343
- out: ManifestChange[],
1344
- ): void {
1235
+ function diffI18n(before: I18n | undefined, after: I18n | undefined, out: ManifestChange[]): void {
1345
1236
  if (deepEqual(before, after)) return;
1346
1237
  if (before === undefined && after !== undefined) {
1347
1238
  out.push(change("/i18n", "no-impact", "added", before, after, "i18n added"));
@@ -1389,7 +1280,14 @@ function diffI18n(
1389
1280
  }
1390
1281
  if (!deepEqual(before?.dir, after?.dir) && setEqual(before?.locales, after?.locales)) {
1391
1282
  out.push(
1392
- change("/i18n/dir", "no-impact", "changed", before?.dir, after?.dir, "locale dir map changed"),
1283
+ change(
1284
+ "/i18n/dir",
1285
+ "no-impact",
1286
+ "changed",
1287
+ before?.dir,
1288
+ after?.dir,
1289
+ "locale dir map changed",
1290
+ ),
1393
1291
  );
1394
1292
  }
1395
1293
  }
@@ -1401,9 +1299,7 @@ function diffTopology(
1401
1299
  ): void {
1402
1300
  if (before === after) return;
1403
1301
  const category: DiffCategory =
1404
- before !== undefined && after !== undefined
1405
- ? "contract-breaking"
1406
- : "no-impact";
1302
+ before !== undefined && after !== undefined ? "contract-breaking" : "no-impact";
1407
1303
  out.push(
1408
1304
  change(
1409
1305
  "/topology",
@@ -1422,9 +1318,7 @@ function diffImages(
1422
1318
  out: ManifestChange[],
1423
1319
  ): void {
1424
1320
  if (deepEqual(before, after)) return;
1425
- out.push(
1426
- change("/images", "no-impact", "changed", before, after, "images changed"),
1427
- );
1321
+ out.push(change("/images", "no-impact", "changed", before, after, "images changed"));
1428
1322
  }
1429
1323
 
1430
1324
  function diffStringSet(
@@ -1453,14 +1347,7 @@ function diffStringSet(
1453
1347
  }
1454
1348
  for (const item of setDiff(after, before)) {
1455
1349
  out.push(
1456
- change(
1457
- `${path}/${escape(item)}`,
1458
- "no-impact",
1459
- "added",
1460
- undefined,
1461
- item,
1462
- `added ${item}`,
1463
- ),
1350
+ change(`${path}/${escape(item)}`, "no-impact", "added", undefined, item, `added ${item}`),
1464
1351
  );
1465
1352
  }
1466
1353
  }
@@ -1523,10 +1410,7 @@ function schemaBreaksClients(
1523
1410
  return false;
1524
1411
  }
1525
1412
 
1526
- function classificationWeakened(
1527
- before: unknown,
1528
- after: unknown,
1529
- ): boolean {
1413
+ function classificationWeakened(before: unknown, after: unknown): boolean {
1530
1414
  if (!before || typeof before !== "object") return false;
1531
1415
  if (!after || typeof after !== "object") return true;
1532
1416
  const b = before as Record<string, unknown>;
@@ -1559,9 +1443,7 @@ function isSensitive(value: unknown): boolean {
1559
1443
  return false;
1560
1444
  }
1561
1445
 
1562
- function parseRateGate(
1563
- gate: string,
1564
- ): { strategy: string; max: number; per: string } | undefined {
1446
+ function parseRateGate(gate: string): { strategy: string; max: number; per: string } | undefined {
1565
1447
  // rate:sliding-window-counter:300/1m
1566
1448
  const m = /^rate:([^:]+):(\d+)\/(.+)$/.exec(gate);
1567
1449
  if (!m) return undefined;
@@ -1609,10 +1491,7 @@ function asUnknownArray(value: unknown): unknown[] | undefined {
1609
1491
  return Array.isArray(value) ? value : undefined;
1610
1492
  }
1611
1493
 
1612
- function setEqual(
1613
- a: readonly string[] | undefined,
1614
- b: readonly string[] | undefined,
1615
- ): boolean {
1494
+ function setEqual(a: readonly string[] | undefined, b: readonly string[] | undefined): boolean {
1616
1495
  const as = new Set(a ?? []);
1617
1496
  const bs = new Set(b ?? []);
1618
1497
  if (as.size !== bs.size) return false;
@@ -1620,27 +1499,18 @@ function setEqual(
1620
1499
  return true;
1621
1500
  }
1622
1501
 
1623
- function listEqual(
1624
- a: readonly string[],
1625
- b: readonly string[],
1626
- ): boolean {
1502
+ function listEqual(a: readonly string[], b: readonly string[]): boolean {
1627
1503
  if (a.length !== b.length) return false;
1628
1504
  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
1629
1505
  return true;
1630
1506
  }
1631
1507
 
1632
- function setDiff(
1633
- a: readonly string[] | undefined,
1634
- b: readonly string[] | undefined,
1635
- ): string[] {
1508
+ function setDiff(a: readonly string[] | undefined, b: readonly string[] | undefined): string[] {
1636
1509
  const bs = new Set(b ?? []);
1637
1510
  return [...new Set(a ?? [])].filter((x) => !bs.has(x)).sort();
1638
1511
  }
1639
1512
 
1640
- function intersection(
1641
- a: readonly string[],
1642
- b: readonly string[],
1643
- ): string[] {
1513
+ function intersection(a: readonly string[], b: readonly string[]): string[] {
1644
1514
  const bs = new Set(b);
1645
1515
  return a.filter((x) => bs.has(x));
1646
1516
  }
@@ -5,15 +5,8 @@
5
5
  */
6
6
 
7
7
  export type * from "./types.ts";
8
- export {
9
- diffManifest,
10
- highestSeverity,
11
- } from "./diff.ts";
12
- export {
13
- flowNameFromPath,
14
- isDeclaredBreak,
15
- undeclaredContractBreaks,
16
- } from "./undeclared.ts";
8
+ export { diffManifest, highestSeverity } from "./diff.ts";
9
+ export { flowNameFromPath, isDeclaredBreak, undeclaredContractBreaks } from "./undeclared.ts";
17
10
  export {
18
11
  assertLosslessRoundTrip,
19
12
  loadManifestSchema,
@@ -178,15 +178,39 @@ export interface ColumnClassification {
178
178
  retain?: string;
179
179
  }
180
180
 
181
+ /**
182
+ * Declared SQL column (abstract schema) — additive over {@link ColumnClassification}.
183
+ * Manifest `tables.*.columns` may be a bare classification or a full declaration.
184
+ */
185
+ /** Foreign-key target recorded on a {@link DeclaredColumn}. */
186
+ export interface DeclaredColumnReference {
187
+ /** Referenced table export / SQL name when known. */
188
+ table?: string;
189
+ /** Referenced column key when known. */
190
+ column?: string;
191
+ }
192
+
193
+ export interface DeclaredColumn extends ColumnClassification {
194
+ /** SQL type primitive (`text` · `integer` in v1). */
195
+ type?: "text" | "integer";
196
+ /** When false, column is NOT NULL. */
197
+ nullable?: boolean;
198
+ primaryKey?: boolean;
199
+ unique?: boolean;
200
+ /** Literal default when present. */
201
+ default?: string | number | boolean | null;
202
+ /** Database column name (snake_case by default). */
203
+ sqlName?: string;
204
+ /** Foreign key when `.references()` was declared. */
205
+ references?: DeclaredColumnReference;
206
+ }
207
+
181
208
  /** Field classification value forms. */
182
- export type ClassificationValue =
183
- | string
184
- | string[]
185
- | ColumnClassification;
209
+ export type ClassificationValue = string | string[] | ColumnClassification;
186
210
 
187
211
  /** SQL table metadata. */
188
212
  export interface Table {
189
- columns?: Record<string, ColumnClassification>;
213
+ columns?: Record<string, DeclaredColumn | ColumnClassification>;
190
214
  classifications?: Record<string, ClassificationValue>;
191
215
  }
192
216