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
@@ -20,14 +20,8 @@ import type { WideEvent } from "../../runs/types.ts";
20
20
  import { bindHttp } from "./bind.ts";
21
21
  import { touchLoginRateLimit } from "./auth-rate.ts";
22
22
  import { verifyClaimCode } from "./claim.ts";
23
- import {
24
- maskWideEventForConsole,
25
- piiFieldNamesFromManifest,
26
- } from "./runs-pii.ts";
27
- import {
28
- ClockResourceNotFoundError,
29
- ScheduleNotOverridableError,
30
- } from "./clock.ts";
23
+ import { maskWideEventForConsole, piiFieldNamesFromManifest } from "./runs-pii.ts";
24
+ import { ClockResourceNotFoundError, ScheduleNotOverridableError } from "./clock.ts";
31
25
  import { createFileDiff, emitStructuralDiff } from "./structural.ts";
32
26
  import type { ConsoleState } from "./state.ts";
33
27
  import { PUBLIC_CONSOLE_FLOWS } from "./public-flows.ts";
@@ -73,26 +67,11 @@ const ManifestOut = z.object({
73
67
  });
74
68
 
75
69
  const EffectEntryOut = z.object({
76
- kind: z.enum([
77
- "read",
78
- "write",
79
- "emit",
80
- "send",
81
- "ask",
82
- "secret",
83
- "call",
84
- ]),
70
+ kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
85
71
  resource: z.string(),
86
72
  timestamp: z.number(),
87
73
  duration: z.number(),
88
- reversibility: z.enum([
89
- "none",
90
- "reversible",
91
- "deferred",
92
- "irreversible",
93
- "capability",
94
- "portal",
95
- ]),
74
+ reversibility: z.enum(["none", "reversible", "deferred", "irreversible", "capability", "portal"]),
96
75
  });
97
76
 
98
77
  const LogLineOut = z.object({
@@ -130,10 +109,7 @@ const RunsListOut = z.object({
130
109
  /** `fx.log` lines — a field on the run, not a parallel stream. */
131
110
  logs: z.array(LogLineOut),
132
111
  /** All queryable dimensions for population analysis. */
133
- dimensions: z.record(
134
- z.string(),
135
- z.union([z.string(), z.number(), z.boolean(), z.null()]),
136
- ),
112
+ dimensions: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])),
137
113
  }),
138
114
  ),
139
115
  });
@@ -154,14 +130,7 @@ const SignalEndpointOut = z.object({
154
130
  flowId: z.string(),
155
131
  durable: z.boolean(),
156
132
  external: z.boolean(),
157
- peakTier: z.enum([
158
- "none",
159
- "reads",
160
- "writes",
161
- "emits",
162
- "external",
163
- "capabilities",
164
- ]),
133
+ peakTier: z.enum(["none", "reads", "writes", "emits", "external", "capabilities"]),
165
134
  });
166
135
 
167
136
  const DeadLetterOut = z.object({
@@ -240,9 +209,7 @@ const SignalsReplayOut = z.object({
240
209
  z.object({
241
210
  id: z.string(),
242
211
  ok: z.boolean(),
243
- error: z
244
- .object({ code: z.string(), message: z.string() })
245
- .optional(),
212
+ error: z.object({ code: z.string(), message: z.string() }).optional(),
246
213
  }),
247
214
  ),
248
215
  wouldHaveFired: z.array(
@@ -319,14 +286,7 @@ const InvokeOut = z.object({
319
286
  asUserId: z.string(),
320
287
  trigger: z.enum(["http", "signal", "clock", "internal", "durable"]),
321
288
  response: z.unknown(),
322
- peakTier: z.enum([
323
- "none",
324
- "reads",
325
- "writes",
326
- "emits",
327
- "external",
328
- "capabilities",
329
- ]),
289
+ peakTier: z.enum(["none", "reads", "writes", "emits", "external", "capabilities"]),
330
290
  auditedAt: z.number(),
331
291
  });
332
292
 
@@ -540,9 +500,7 @@ const ClockListOut = z.object({
540
500
  now: z.number(),
541
501
  crons: z.array(ClockCronOut),
542
502
  waitingOn: z.array(WaitingOnOut),
543
- waitingOnCounts: z.array(
544
- z.object({ label: z.string(), count: z.number() }),
545
- ),
503
+ waitingOnCounts: z.array(z.object({ label: z.string(), count: z.number() })),
546
504
  timeline: z.array(
547
505
  z.object({
548
506
  at: z.number(),
@@ -598,13 +556,7 @@ const ClockWakeEarlyOut = z.object({
598
556
  });
599
557
 
600
558
  const VaultResolutionStepOut = z.object({
601
- source: z.enum([
602
- "process.env",
603
- ".env.local",
604
- ".env.stack",
605
- "driver",
606
- "dev-fallback",
607
- ]),
559
+ source: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]),
608
560
  present: z.boolean(),
609
561
  won: z.boolean(),
610
562
  });
@@ -625,15 +577,7 @@ const VaultRowOut = z.object({
625
577
  fingerprints: z.record(z.string(), z.string()),
626
578
  fingerprint: z.string().nullable(),
627
579
  cleartext: z.string().nullable(),
628
- winner: z
629
- .enum([
630
- "process.env",
631
- ".env.local",
632
- ".env.stack",
633
- "driver",
634
- "dev-fallback",
635
- ])
636
- .nullable(),
580
+ winner: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]).nullable(),
637
581
  resolution: z.array(VaultResolutionStepOut),
638
582
  readers: z.array(z.string()),
639
583
  blastRadius: VaultBlastRadiusOut,
@@ -758,15 +702,7 @@ const AiListOut = z.object({
758
702
  status: z.enum(["ok", "denied"]),
759
703
  effects: z.array(
760
704
  z.object({
761
- kind: z.enum([
762
- "read",
763
- "write",
764
- "emit",
765
- "send",
766
- "ask",
767
- "secret",
768
- "call",
769
- ]),
705
+ kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
770
706
  resource: z.string(),
771
707
  }),
772
708
  ),
@@ -868,12 +804,7 @@ const GatesListOut = z.object({
868
804
 
869
805
  const DiffChangeOut = z.object({
870
806
  path: z.string(),
871
- category: z.enum([
872
- "contract-breaking",
873
- "permission-widening",
874
- "effect-widening",
875
- "no-impact",
876
- ]),
807
+ category: z.enum(["contract-breaking", "permission-widening", "effect-widening", "no-impact"]),
877
808
  kind: z.enum(["added", "removed", "changed"]),
878
809
  summary: z.string(),
879
810
  before: z.unknown().optional(),
@@ -889,12 +820,7 @@ const DiffChangeOut = z.object({
889
820
  const DiffListOut = z.object({
890
821
  hasBaseline: z.boolean(),
891
822
  severity: z
892
- .enum([
893
- "contract-breaking",
894
- "permission-widening",
895
- "effect-widening",
896
- "no-impact",
897
- ])
823
+ .enum(["contract-breaking", "permission-widening", "effect-widening", "no-impact"])
898
824
  .nullable(),
899
825
  blockedCount: z.number(),
900
826
  acknowledgedCount: z.number(),
@@ -1087,9 +1013,7 @@ const AccessPlaneSection = z.object({
1087
1013
  lastUsedAt: z.number().nullable(),
1088
1014
  expiresAt: z.number().nullable(),
1089
1015
  revokedAt: z.number().nullable(),
1090
- rateLimit: z
1091
- .object({ max: z.number(), per: z.string() })
1092
- .nullable(),
1016
+ rateLimit: z.object({ max: z.number(), per: z.string() }).nullable(),
1093
1017
  ipAllowlist: z.array(z.string()),
1094
1018
  unused90d: z.boolean(),
1095
1019
  }),
@@ -1123,9 +1047,7 @@ const AccessListOut = z.object({
1123
1047
  lastUsedAt: z.number().nullable(),
1124
1048
  expiresAt: z.number().nullable(),
1125
1049
  revokedAt: z.number().nullable(),
1126
- rateLimit: z
1127
- .object({ max: z.number(), per: z.string() })
1128
- .nullable(),
1050
+ rateLimit: z.object({ max: z.number(), per: z.string() }).nullable(),
1129
1051
  ipAllowlist: z.array(z.string()),
1130
1052
  unused90d: z.boolean(),
1131
1053
  }),
@@ -1197,10 +1119,7 @@ const AccessCreateKeyIn = z.object({
1197
1119
  name: z.string().min(1),
1198
1120
  scopes: z.array(z.string()),
1199
1121
  expiresAt: z.number().nullable().optional(),
1200
- rateLimit: z
1201
- .object({ max: z.number(), per: z.string() })
1202
- .nullable()
1203
- .optional(),
1122
+ rateLimit: z.object({ max: z.number(), per: z.string() }).nullable().optional(),
1204
1123
  ipAllowlist: z.array(z.string()).optional(),
1205
1124
  });
1206
1125
 
@@ -1350,9 +1269,7 @@ const StoreQueryOut = z.object({
1350
1269
  z.object({
1351
1270
  key: z.string(),
1352
1271
  value: z.unknown().optional(),
1353
- warnings: z
1354
- .array(z.object({ code: z.string(), message: z.string() }))
1355
- .optional(),
1272
+ warnings: z.array(z.object({ code: z.string(), message: z.string() })).optional(),
1356
1273
  }),
1357
1274
  )
1358
1275
  .optional(),
@@ -1652,10 +1569,7 @@ export function createConsoleBindings(state: ConsoleState): {
1652
1569
  bindHttp(http.post("/console/access/keys"), accessCreateKeyFlow),
1653
1570
  bindHttp(http.post("/console/access/keys/revoke"), accessRevokeKeyFlow),
1654
1571
  bindHttp(http.post("/console/access/keys/rotate"), accessRotateKeyFlow),
1655
- bindHttp(
1656
- http.post("/console/access/roles/grants"),
1657
- accessSetRoleGrantsFlow,
1658
- ),
1572
+ bindHttp(http.post("/console/access/roles/grants"), accessSetRoleGrantsFlow),
1659
1573
  bindHttp(http.get("/console/diff"), diffList),
1660
1574
  bindHttp(http.get("/console/plugins"), pluginsList),
1661
1575
  bindHttp(http.get("/console/clock"), clockList),
@@ -1788,19 +1702,12 @@ function createSessionLogin(state: ConsoleState) {
1788
1702
  out: SessionOut,
1789
1703
  errors: { AuthFailed, AuthRateLimited },
1790
1704
  do: async (input: z.infer<typeof LoginIn>, fx) => {
1791
- if (
1792
- touchLoginRateLimit(state.loginAttempts, input.email, state.now()) ===
1793
- "rate_limited"
1794
- ) {
1705
+ if (touchLoginRateLimit(state.loginAttempts, input.email, state.now()) === "rate_limited") {
1795
1706
  return fail("AuthRateLimited", {
1796
1707
  reason: "too many login attempts; retry after 60s",
1797
1708
  });
1798
1709
  }
1799
- const op = await authenticateOperator(
1800
- state.operators,
1801
- input.email,
1802
- input.password,
1803
- );
1710
+ const op = await authenticateOperator(state.operators, input.email, input.password);
1804
1711
  if (!op) return fail("AuthFailed", {});
1805
1712
  const issued = await issueOperatorSession(state, op.id);
1806
1713
  fx.log.info("console.session.login", { operatorId: op.id });
@@ -1887,10 +1794,7 @@ function createRunsList(state: ConsoleState) {
1887
1794
  * @param r - Stored wide event
1888
1795
  * @param piiFields - Classified field names from the Manifest
1889
1796
  */
1890
- export function projectRun(
1891
- r: WideEvent,
1892
- piiFields: ReadonlySet<string> = new Set(),
1893
- ) {
1797
+ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Set()) {
1894
1798
  const masked = maskWideEventForConsole(r, piiFields);
1895
1799
  const dimensions: Record<string, string | number | boolean | null> = {};
1896
1800
  for (const [k, v] of Object.entries(masked.dimensions)) {
@@ -2002,10 +1906,7 @@ function createSignalsDryRunReplay(state: ConsoleState) {
2002
1906
  in: SignalsReplayIn.omit({ dryRun: true }),
2003
1907
  out: SignalsReplayOut,
2004
1908
  errors: { AuthFailed, SignalNotFound, DryRunUnsafe },
2005
- do: async (
2006
- input: Omit<z.infer<typeof SignalsReplayIn>, "dryRun">,
2007
- fx,
2008
- ) => {
1909
+ do: async (input: Omit<z.infer<typeof SignalsReplayIn>, "dryRun">, fx) => {
2009
1910
  if (!fx.operator.id) return fail("AuthFailed", {});
2010
1911
  return runSignalReplay(state, fx, { ...input, dryRun: true });
2011
1912
  },
@@ -2026,14 +1927,9 @@ function createSignalsDiscard(state: ConsoleState) {
2026
1927
  const row = rows.find((s) => s.name === input.signal);
2027
1928
  if (!row) return fail("SignalNotFound", { signal: input.signal });
2028
1929
 
2029
- const irreversible =
2030
- state.production &&
2031
- row.consumers.some((c) => c.external || !c.durable);
1930
+ const irreversible = state.production && row.consumers.some((c) => c.external || !c.durable);
2032
1931
  if (irreversible) {
2033
- if (
2034
- input.confirmation !== "DISCARD" ||
2035
- (input.reason?.trim().length ?? 0) < 3
2036
- ) {
1932
+ if (input.confirmation !== "DISCARD" || (input.reason?.trim().length ?? 0) < 3) {
2037
1933
  return fail("ConfirmRequired", {
2038
1934
  phrase: "DISCARD" as const,
2039
1935
  reason: "discarding dead letters requires typed confirmation",
@@ -2084,18 +1980,12 @@ async function runSignalReplay(
2084
1980
  }
2085
1981
  } else {
2086
1982
  const retriggersExternal =
2087
- state.production &&
2088
- row.consumers.some((c) => c.external) &&
2089
- row.consumersDurable !== true;
1983
+ state.production && row.consumers.some((c) => c.external) && row.consumersDurable !== true;
2090
1984
  if (retriggersExternal) {
2091
- if (
2092
- input.confirmation !== "REPLAY" ||
2093
- (input.reason?.trim().length ?? 0) < 3
2094
- ) {
1985
+ if (input.confirmation !== "REPLAY" || (input.reason?.trim().length ?? 0) < 3) {
2095
1986
  return fail("ConfirmRequired", {
2096
1987
  phrase: "REPLAY" as const,
2097
- reason:
2098
- "replay re-triggers an external effect; typed confirmation required",
1988
+ reason: "replay re-triggers an external effect; typed confirmation required",
2099
1989
  });
2100
1990
  }
2101
1991
  }
@@ -2115,22 +2005,17 @@ async function runSignalReplay(
2115
2005
  reason: result.refused.reason,
2116
2006
  });
2117
2007
  }
2118
- fx.log.info(
2119
- input.dryRun
2120
- ? "console.signals.dryRunReplay"
2121
- : "console.signals.replay",
2122
- {
2123
- operatorId: fx.operator.id,
2124
- signal: input.signal,
2125
- attempted: result.attempted,
2126
- succeeded: result.succeeded,
2127
- failed: result.failed,
2128
- dryRun: result.dryRun,
2129
- ratePerSec: input.ratePerSec,
2130
- reason: input.reason,
2131
- wouldHaveFired: result.wouldHaveFired.length,
2132
- },
2133
- );
2008
+ fx.log.info(input.dryRun ? "console.signals.dryRunReplay" : "console.signals.replay", {
2009
+ operatorId: fx.operator.id,
2010
+ signal: input.signal,
2011
+ attempted: result.attempted,
2012
+ succeeded: result.succeeded,
2013
+ failed: result.failed,
2014
+ dryRun: result.dryRun,
2015
+ ratePerSec: input.ratePerSec,
2016
+ reason: input.reason,
2017
+ wouldHaveFired: result.wouldHaveFired.length,
2018
+ });
2134
2019
  return {
2135
2020
  ok: true as const,
2136
2021
  attempted: result.attempted,
@@ -2317,9 +2202,7 @@ function peakTierOf(
2317
2202
  return "none";
2318
2203
  }
2319
2204
 
2320
- function triggerKindOf(
2321
- flow: ManifestFlow,
2322
- ): "http" | "signal" | "clock" | "internal" | "durable" {
2205
+ function triggerKindOf(flow: ManifestFlow): "http" | "signal" | "clock" | "internal" | "durable" {
2323
2206
  if (flow.durable) return "durable";
2324
2207
  if (flow.trigger?.http) return "http";
2325
2208
  if (flow.trigger?.signal) return "signal";
@@ -2338,9 +2221,7 @@ function stubResponse(flow: ManifestFlow, body: unknown): unknown {
2338
2221
  const out = flow.out;
2339
2222
  if (out && typeof out === "object" && !Array.isArray(out)) {
2340
2223
  const props = (out.properties ?? {}) as Record<string, unknown>;
2341
- const required = Array.isArray(out.required)
2342
- ? (out.required as string[])
2343
- : Object.keys(props);
2224
+ const required = Array.isArray(out.required) ? (out.required as string[]) : Object.keys(props);
2344
2225
  const result: Record<string, unknown> = { echo: body };
2345
2226
  for (const key of required) {
2346
2227
  if (key === "id") result.id = `inv_${hashShort(body)}`;
@@ -2383,12 +2264,7 @@ async function issueOperatorSession(
2383
2264
  return issued;
2384
2265
  }
2385
2266
 
2386
- function sessionPayload(
2387
- operatorId: string,
2388
- email: string,
2389
- name: string,
2390
- issued: IssuedSession,
2391
- ) {
2267
+ function sessionPayload(operatorId: string, email: string, name: string, issued: IssuedSession) {
2392
2268
  return {
2393
2269
  operatorId,
2394
2270
  email,
@@ -2413,8 +2289,7 @@ function requireTenantIfDeclared(
2413
2289
  if (tenant !== undefined && tenant.length > 0) return null;
2414
2290
  if (!state.production) return null;
2415
2291
  return fail("TenantRequired", {
2416
- reason:
2417
- "tenancy is declared — tenant selector is required (compliance boundary)",
2292
+ reason: "tenancy is declared — tenant selector is required (compliance boundary)",
2418
2293
  });
2419
2294
  }
2420
2295
 
@@ -2476,9 +2351,7 @@ function createStoreReveal(state: ConsoleState) {
2476
2351
  revealPii: true,
2477
2352
  limit: 500,
2478
2353
  });
2479
- const row = (result.rows ?? []).find(
2480
- (r) => String(r.id ?? r.Id) === input.id,
2481
- );
2354
+ const row = (result.rows ?? []).find((r) => String(r.id ?? r.Id) === input.id);
2482
2355
  if (!row) return fail("StoreNotFound", { ref: input.ref });
2483
2356
  fx.log.info("console.store.reveal", {
2484
2357
  operatorId: fx.operator.id,
@@ -2534,14 +2407,10 @@ function createStoreEdit(state: ConsoleState) {
2534
2407
  }
2535
2408
 
2536
2409
  if (state.production) {
2537
- if (
2538
- input.confirmation !== "EDIT" ||
2539
- (input.reason?.trim().length ?? 0) < 3
2540
- ) {
2410
+ if (input.confirmation !== "EDIT" || (input.reason?.trim().length ?? 0) < 3) {
2541
2411
  return fail("ConfirmRequired", {
2542
2412
  phrase: "EDIT" as const,
2543
- reason:
2544
- "direct edit is not a flow execution — typed confirmation required",
2413
+ reason: "direct edit is not a flow execution — typed confirmation required",
2545
2414
  });
2546
2415
  }
2547
2416
  }
@@ -2589,10 +2458,7 @@ function createStoreDelete(state: ConsoleState) {
2589
2458
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
2590
2459
  if (tenantFail) return tenantFail;
2591
2460
  if (state.production) {
2592
- if (
2593
- input.confirmation !== "DELETE" ||
2594
- (input.reason?.trim().length ?? 0) < 3
2595
- ) {
2461
+ if (input.confirmation !== "DELETE" || (input.reason?.trim().length ?? 0) < 3) {
2596
2462
  return fail("ConfirmRequired", {
2597
2463
  phrase: "DELETE" as const,
2598
2464
  reason: "destructive store delete requires typed confirmation",
@@ -2632,10 +2498,7 @@ function createStorePurgeCache(state: ConsoleState) {
2632
2498
  do: async (input: z.infer<typeof StorePurgeIn>, fx) => {
2633
2499
  if (!fx.operator.id) return fail("AuthFailed", {});
2634
2500
  if (state.production) {
2635
- if (
2636
- input.confirmation !== "PURGE" ||
2637
- (input.reason?.trim().length ?? 0) < 3
2638
- ) {
2501
+ if (input.confirmation !== "PURGE" || (input.reason?.trim().length ?? 0) < 3) {
2639
2502
  return fail("ConfirmRequired", {
2640
2503
  phrase: "PURGE" as const,
2641
2504
  reason: "cache purge requires typed confirmation",
@@ -2671,14 +2534,10 @@ function createStoreSql(state: ConsoleState) {
2671
2534
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
2672
2535
  if (tenantFail) return tenantFail;
2673
2536
  try {
2674
- const result = await state.runStoreSql(
2675
- input.ref as ResourceRef,
2676
- input.sql,
2677
- {
2678
- allowWrite: input.allowWrite === true,
2679
- tenant: input.tenant,
2680
- },
2681
- );
2537
+ const result = await state.runStoreSql(input.ref as ResourceRef, input.sql, {
2538
+ allowWrite: input.allowWrite === true,
2539
+ tenant: input.tenant,
2540
+ });
2682
2541
  fx.log.info("console.store.sql", {
2683
2542
  operatorId: fx.operator.id,
2684
2543
  ref: input.ref,
@@ -2823,11 +2682,7 @@ function createVaultRotate(state: ConsoleState) {
2823
2682
  return fail("VaultNotFound", { name: input.name });
2824
2683
  }
2825
2684
  // Rotate always requires typed confirm (console §6 · §9.8).
2826
- if (
2827
- input.confirmation !== "ROTATE" ||
2828
- !input.reason ||
2829
- input.reason.length < 3
2830
- ) {
2685
+ if (input.confirmation !== "ROTATE" || !input.reason || input.reason.length < 3) {
2831
2686
  return fail("ConfirmRequired", {
2832
2687
  phrase: "ROTATE" as const,
2833
2688
  reason:
@@ -2866,10 +2721,7 @@ function createVaultRotate(state: ConsoleState) {
2866
2721
  * @param state - Console state
2867
2722
  * @param name - Contract name
2868
2723
  */
2869
- async function vaultNameKnown(
2870
- state: ConsoleState,
2871
- name: string,
2872
- ): Promise<boolean> {
2724
+ async function vaultNameKnown(state: ConsoleState, name: string): Promise<boolean> {
2873
2725
  if (state.manifest?.vault?.[name]) return true;
2874
2726
  if (state.vaultRuntime?.contracts.has(name)) return true;
2875
2727
  if (state.vaultRuntime?.names().includes(name)) return true;
@@ -2971,9 +2823,7 @@ function createGatesList(state: ConsoleState) {
2971
2823
  name: p.name,
2972
2824
  plane: p.plane,
2973
2825
  scopes: [...p.scopes],
2974
- ...(p.memberCount !== undefined
2975
- ? { memberCount: p.memberCount }
2976
- : {}),
2826
+ ...(p.memberCount !== undefined ? { memberCount: p.memberCount } : {}),
2977
2827
  ...(p.email !== undefined ? { email: p.email } : {}),
2978
2828
  })),
2979
2829
  violations: projection.violations.map((v) => ({
@@ -3069,9 +2919,7 @@ function createGatesSimulate(state: ConsoleState) {
3069
2919
  allowed: e.allowed,
3070
2920
  kind: e.kind,
3071
2921
  ...(e.remaining !== undefined ? { remaining: e.remaining } : {}),
3072
- ...(e.retryAfterMs !== undefined
3073
- ? { retryAfterMs: e.retryAfterMs }
3074
- : {}),
2922
+ ...(e.retryAfterMs !== undefined ? { retryAfterMs: e.retryAfterMs } : {}),
3075
2923
  ...(e.reason !== undefined ? { reason: e.reason } : {}),
3076
2924
  })),
3077
2925
  deniedAt: result.deniedAt,
@@ -3226,14 +3074,10 @@ function createAccessRevokeKey(state: ConsoleState) {
3226
3074
  errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
3227
3075
  do: async (input: z.infer<typeof AccessRevokeKeyIn>, fx) => {
3228
3076
  if (!fx.operator.id) return fail("AuthFailed", {});
3229
- if (
3230
- input.confirmation !== "REVOKE" ||
3231
- (input.reason?.trim().length ?? 0) < 3
3232
- ) {
3077
+ if (input.confirmation !== "REVOKE" || (input.reason?.trim().length ?? 0) < 3) {
3233
3078
  return fail("ConfirmRequired", {
3234
3079
  phrase: "REVOKE" as const,
3235
- reason:
3236
- "Type REVOKE and provide a reason — revocation is irreversible",
3080
+ reason: "Type REVOKE and provide a reason — revocation is irreversible",
3237
3081
  });
3238
3082
  }
3239
3083
  const blastRadius = await state.accessKeyBlast(input.keyId);
@@ -3262,14 +3106,10 @@ function createAccessRotateKey(state: ConsoleState) {
3262
3106
  errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
3263
3107
  do: async (input: z.infer<typeof AccessRotateKeyIn>, fx) => {
3264
3108
  if (!fx.operator.id) return fail("AuthFailed", {});
3265
- if (
3266
- input.confirmation !== "ROTATE" ||
3267
- (input.reason?.trim().length ?? 0) < 3
3268
- ) {
3109
+ if (input.confirmation !== "ROTATE" || (input.reason?.trim().length ?? 0) < 3) {
3269
3110
  return fail("ConfirmRequired", {
3270
3111
  phrase: "ROTATE" as const,
3271
- reason:
3272
- "Type ROTATE and provide a reason — the old secret dies immediately",
3112
+ reason: "Type ROTATE and provide a reason — the old secret dies immediately",
3273
3113
  });
3274
3114
  }
3275
3115
  const blastRadius = await state.accessKeyBlast(input.keyId);
@@ -3352,15 +3192,10 @@ function createClockRunNow(state: ConsoleState) {
3352
3192
  return fail("ClockNotFound", { kind: "cron" as const, id: input.name });
3353
3193
  }
3354
3194
  if (state.production && cron.external) {
3355
- if (
3356
- input.confirmation !== "RUN" ||
3357
- !input.reason ||
3358
- input.reason.length < 3
3359
- ) {
3195
+ if (input.confirmation !== "RUN" || !input.reason || input.reason.length < 3) {
3360
3196
  return fail("ConfirmRequired", {
3361
3197
  phrase: "RUN" as const,
3362
- reason:
3363
- "Type RUN and provide a reason — this cron has an external effect",
3198
+ reason: "Type RUN and provide a reason — this cron has an external effect",
3364
3199
  });
3365
3200
  }
3366
3201
  }
@@ -3584,14 +3419,10 @@ function createChannelSendTest(state: ConsoleState) {
3584
3419
  do: async (input: z.infer<typeof ChannelSendTestIn>, fx) => {
3585
3420
  if (!fx.operator.id) return fail("AuthFailed", {});
3586
3421
  if (state.production) {
3587
- if (
3588
- input.confirmation !== "SEND" ||
3589
- (input.reason?.trim().length ?? 0) < 3
3590
- ) {
3422
+ if (input.confirmation !== "SEND" || (input.reason?.trim().length ?? 0) < 3) {
3591
3423
  return fail("ConfirmRequired", {
3592
3424
  phrase: "SEND" as const,
3593
- reason:
3594
- "send test is a real external send — typed confirmation required",
3425
+ reason: "send test is a real external send — typed confirmation required",
3595
3426
  });
3596
3427
  }
3597
3428
  }