okengine 0.2.6 → 0.3.2

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 (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
package/src/term.ts CHANGED
@@ -6,9 +6,7 @@
6
6
  */
7
7
 
8
8
  /** Whether ANSI color should be applied. */
9
- export function termColorEnabled(
10
- stream: { readonly isTTY?: boolean } = process.stdout,
11
- ): boolean {
9
+ export function termColorEnabled(stream: { readonly isTTY?: boolean } = process.stdout): boolean {
12
10
  if (process.env["NO_COLOR"] !== undefined) return false;
13
11
  if (process.env["FORCE_COLOR"] === "0") return false;
14
12
  if (process.env["FORCE_COLOR"]) return true;
@@ -70,7 +68,7 @@ export type DevHeroElement = {
70
68
 
71
69
  /** Shared options for the `oke dev` hero / banner. */
72
70
  export type DevHeroMeta = {
73
- /** `local` · `local-server` · `test` · `production` */
71
+ /** `local` · `docker` · `test` · `production` */
74
72
  readonly profile?: string;
75
73
  /** Data plane: `local` · `production` */
76
74
  readonly runtimeEnv?: string;
@@ -88,20 +86,20 @@ export type DevHeroMeta = {
88
86
  *
89
87
  * @param color - Color on/off
90
88
  */
91
- export function formatOkeWordmark(
92
- color: boolean = termColorEnabled(),
93
- ): string {
89
+ export function formatOkeWordmark(color: boolean = termColorEnabled()): string {
94
90
  const s = termStyle(color);
95
91
  const ink = `${s.green}${s.bold}`;
96
92
  const r = s.reset;
97
- return [
98
- `${ink} ██████╗ ██╗ ██╗███████╗${r}`,
99
- `${ink} ██╔═══██╗██║ ██╔╝██╔════╝${r}`,
100
- `${ink} ██║ ██║█████╔╝ █████╗ ${r}`,
101
- `${ink} ██║ ██║██╔═██╗ ██╔══╝ ${r}`,
102
- `${ink} ╚██████╔╝██║ ██╗███████╗${r}`,
103
- `${ink} ╚═════╝ ╚═╝ ╚═╝╚══════╝${r}`,
104
- ].join("\n") + "\n";
93
+ return (
94
+ [
95
+ `${ink} ██████╗ ██╗ ██╗███████╗${r}`,
96
+ `${ink} ██╔═══██╗██║ ██╔╝██╔════╝${r}`,
97
+ `${ink} ██║ ██║█████╔╝ █████╗ ${r}`,
98
+ `${ink} ██║ ██║██╔═██╗ ██╔══╝ ${r}`,
99
+ `${ink} ╚██████╔╝██║ ██╗███████╗${r}`,
100
+ `${ink} ╚═════╝ ╚═╝ ╚═╝╚══════╝${r}`,
101
+ ].join("\n") + "\n"
102
+ );
105
103
  }
106
104
 
107
105
  /**
@@ -109,39 +107,27 @@ export function formatOkeWordmark(
109
107
  *
110
108
  * @param options - Snapshot fields from {@link import("./cli/hero-meta.ts").buildDevHeroSnapshot}
111
109
  */
112
- export function formatDevHeroDetails(
113
- options: DevHeroMeta = {},
114
- ): string {
110
+ export function formatDevHeroDetails(options: DevHeroMeta = {}): string {
115
111
  const s = termStyle(options.color ?? termColorEnabled());
116
112
  const bar = `${s.dim}│${s.reset}`;
117
113
  const label = (name: string) => `${s.dim}${name.padEnd(9)}${s.reset}`;
118
114
  const lines: string[] = [];
119
115
  if (options.profile) {
120
- lines.push(
121
- `${bar} ${label("profile")} ${s.cyan}${options.profile}${s.reset}`,
122
- );
116
+ lines.push(`${bar} ${label("profile")} ${s.cyan}${options.profile}${s.reset}`);
123
117
  }
124
118
  if (options.runtimeEnv) {
125
- lines.push(
126
- `${bar} ${label("env")} ${s.cyan}${options.runtimeEnv}${s.reset}`,
127
- );
119
+ lines.push(`${bar} ${label("env")} ${s.cyan}${options.runtimeEnv}${s.reset}`);
128
120
  }
129
121
  if (options.system) {
130
- lines.push(
131
- `${bar} ${label("system")} ${s.dim}${options.system}${s.reset}`,
132
- );
122
+ lines.push(`${bar} ${label("system")} ${s.dim}${options.system}${s.reset}`);
133
123
  }
134
124
  const elements = options.elements ?? [];
135
125
  if (elements.length > 0) {
136
126
  lines.push(`${bar} ${s.dim}elements${s.reset}`);
137
127
  for (const row of elements) {
138
128
  const idle = row.detail === "—";
139
- const detail = idle
140
- ? `${s.dim}—${s.reset}`
141
- : `${s.cyan}${row.detail}${s.reset}`;
142
- lines.push(
143
- `${bar} ${s.dim}${row.element.padEnd(9)}${s.reset} ${detail}`,
144
- );
129
+ const detail = idle ? `${s.dim}—${s.reset}` : `${s.cyan}${row.detail}${s.reset}`;
130
+ lines.push(`${bar} ${s.dim}${row.element.padEnd(9)}${s.reset} ${detail}`);
145
131
  }
146
132
  }
147
133
  return lines.length > 0 ? `${lines.join("\n")}\n` : "";
@@ -164,9 +150,7 @@ export function formatDevBanner(options: DevHeroMeta = {}): string {
164
150
  `${s.green}◇${s.reset} Starting`,
165
151
  ];
166
152
  if (options.watching !== false) {
167
- lines.push(
168
- `${bar} ${s.dim}watching — client types regenerate on save${s.reset}`,
169
- );
153
+ lines.push(`${bar} ${s.dim}watching — client types regenerate on save${s.reset}`);
170
154
  }
171
155
  lines.push(formatDevHeroDetails(options).trimEnd());
172
156
  lines.push(bar);
@@ -196,10 +180,7 @@ export function formatServiceLine(
196
180
  * @param url - App base URL
197
181
  * @param color - Color on/off
198
182
  */
199
- export function formatAppReadyLine(
200
- url: string,
201
- color: boolean = termColorEnabled(),
202
- ): string {
183
+ export function formatAppReadyLine(url: string, color: boolean = termColorEnabled()): string {
203
184
  const s = termStyle(color);
204
185
  return `${s.green}●${s.reset} ${s.dim}App${s.reset} ${s.cyan}${url}${s.reset}\n`;
205
186
  }
@@ -245,9 +226,7 @@ export function formatDevHero(
245
226
  *
246
227
  * @param color - Color on/off
247
228
  */
248
- export function formatDevLogSeparator(
249
- color: boolean = termColorEnabled(),
250
- ): string {
229
+ export function formatDevLogSeparator(color: boolean = termColorEnabled()): string {
251
230
  const s = termStyle(color);
252
231
  return (
253
232
  `${s.dim}│${s.reset}\n` +
@@ -263,10 +242,7 @@ export function formatDevLogSeparator(
263
242
  * @param message - Status text
264
243
  * @param color - Color on/off
265
244
  */
266
- export function formatStatusLine(
267
- message: string,
268
- color: boolean = termColorEnabled(),
269
- ): string {
245
+ export function formatStatusLine(message: string, color: boolean = termColorEnabled()): string {
270
246
  const s = termStyle(color);
271
247
  return `${s.dim}│${s.reset} ${s.dim}${message}${s.reset}\n`;
272
248
  }
@@ -314,35 +290,24 @@ export function formatDevLogTime(at: Date = new Date()): string {
314
290
  *
315
291
  * @param options - Surface, method, path, flow, timing, status
316
292
  */
317
- export function formatRequestLine(
318
- options: {
319
- readonly surface: DevLogSurface;
320
- readonly method: string;
321
- readonly path: string;
322
- readonly flow?: string;
323
- readonly status: number;
324
- readonly ms: number;
325
- /** Instant for date/time columns (default now). */
326
- readonly at?: Date;
327
- readonly color?: boolean;
328
- },
329
- ): string {
293
+ export function formatRequestLine(options: {
294
+ readonly surface: DevLogSurface;
295
+ readonly method: string;
296
+ readonly path: string;
297
+ readonly flow?: string;
298
+ readonly status: number;
299
+ readonly ms: number;
300
+ /** Instant for date/time columns (default now). */
301
+ readonly at?: Date;
302
+ readonly color?: boolean;
303
+ }): string {
330
304
  const s = termStyle(options.color ?? termColorEnabled());
331
305
  const at = options.at ?? new Date();
332
306
  const date = formatDevLogDate(at);
333
307
  const time = formatDevLogTime(at);
334
308
  const surfaceColor =
335
- options.surface === "App"
336
- ? s.green
337
- : options.surface === "Console"
338
- ? s.magenta
339
- : s.cyan;
340
- const statusColor =
341
- options.status >= 500
342
- ? s.red
343
- : options.status >= 400
344
- ? s.yellow
345
- : s.green;
309
+ options.surface === "App" ? s.green : options.surface === "Console" ? s.magenta : s.cyan;
310
+ const statusColor = options.status >= 500 ? s.red : options.status >= 400 ? s.yellow : s.green;
346
311
  const methodRaw = options.method.toUpperCase();
347
312
  const methodColor =
348
313
  methodRaw === "GET"
@@ -355,9 +320,7 @@ export function formatRequestLine(
355
320
  ? s.red
356
321
  : s.cyan;
357
322
  const method = methodRaw.padEnd(4);
358
- const path = options.path.length > 28
359
- ? `${options.path.slice(0, 27)}…`
360
- : options.path.padEnd(28);
323
+ const path = options.path.length > 28 ? `${options.path.slice(0, 27)}…` : options.path.padEnd(28);
361
324
  const flow = (options.flow ?? "—").padEnd(22);
362
325
  const ms = `${options.ms}ms`.padStart(6);
363
326
  return (
@@ -378,34 +341,25 @@ export function formatRequestLine(
378
341
  *
379
342
  * @param options - Project name, services, driver labels
380
343
  */
381
- export function formatStackSummary(
382
- options: {
383
- readonly project: string;
384
- readonly services: readonly StackSummaryService[];
385
- /** Drivers the host app will use (e.g. `postgres`, `redis`). */
386
- readonly appDrivers?: readonly string[];
387
- readonly color?: boolean;
388
- },
389
- ): string {
344
+ export function formatStackSummary(options: {
345
+ readonly project: string;
346
+ readonly services: readonly StackSummaryService[];
347
+ /** Drivers the host app will use (e.g. `postgres`, `redis`). */
348
+ readonly appDrivers?: readonly string[];
349
+ readonly color?: boolean;
350
+ }): string {
390
351
  const s = termStyle(options.color ?? termColorEnabled());
391
352
  const bar = `${s.dim}│${s.reset}`;
392
353
  const pad = (label: string) => label.padEnd(8);
393
354
  const lines: string[] = [
394
- `${s.green}◇${s.reset} ${s.bold}Stack${s.reset} ${s.cyan}${options.project}${s.reset}`,
355
+ `${s.green}◇${s.reset} ${s.bold}Docker${s.reset} ${s.cyan}${options.project}${s.reset}`,
395
356
  ];
396
357
  for (const svc of options.services) {
397
- lines.push(
398
- `${bar} ${s.dim}${pad(svc.label)}${s.reset} ${s.cyan}:${svc.hostPort}${s.reset}`,
399
- );
358
+ lines.push(`${bar} ${s.dim}${pad(svc.label)}${s.reset} ${s.cyan}:${svc.hostPort}${s.reset}`);
400
359
  }
401
360
  const drivers = options.appDrivers ?? [];
402
- const appDetail =
403
- drivers.length > 0
404
- ? `host Bun · ${drivers.join(" + ")}`
405
- : "host Bun";
406
- lines.push(
407
- `${bar} ${s.dim}${pad("app")}${s.reset} ${s.dim}${appDetail}${s.reset}`,
408
- );
361
+ const appDetail = drivers.length > 0 ? `host Bun · ${drivers.join(" + ")}` : "host Bun";
362
+ lines.push(`${bar} ${s.dim}${pad("app")}${s.reset} ${s.dim}${appDetail}${s.reset}`);
409
363
  lines.push(bar);
410
364
  return `${lines.join("\n")}\n`;
411
365
  }
@@ -416,10 +370,7 @@ export function formatStackSummary(
416
370
  * @param code - Hex claim code
417
371
  * @param color - Color on/off
418
372
  */
419
- export function formatClaimNote(
420
- code: string,
421
- color: boolean = termColorEnabled(),
422
- ): string {
373
+ export function formatClaimNote(code: string, color: boolean = termColorEnabled()): string {
423
374
  const s = termStyle(color);
424
375
  const bar = `${s.dim}│${s.reset}`;
425
376
  const title = "Claim code";
@@ -96,19 +96,14 @@ describe("createTestApp — four-applications surface", () => {
96
96
  const u = await t.auth.loginAs({ scopes: ["order:create"] });
97
97
  expect(u.verified).toBe(true);
98
98
 
99
- const { data, error } = await t.api.orders!.create!(
100
- { sku: "COFFEE", qty: 2 },
101
- { as: u },
102
- );
99
+ const { data, error } = await t.api.orders!.create!({ sku: "COFFEE", qty: 2 }, { as: u });
103
100
  expect(error).toBeNull();
104
101
  expect(data).toMatchObject({ id: expect.any(String) });
105
102
 
106
103
  await t.signals.drain();
107
104
  const sent = t.channels.sent();
108
105
  expect(sent.length).toBeGreaterThanOrEqual(1);
109
- expect(
110
- sent.some((s) => "template" in s && s.template === "order-confirmed"),
111
- ).toBe(true);
106
+ expect(sent.some((s) => "template" in s && s.template === "order-confirmed")).toBe(true);
112
107
 
113
108
  await t.clock.advance("2m");
114
109
  expect(await t.cron.run("expire-stale")).toBe(true);
@@ -116,9 +111,7 @@ describe("createTestApp — four-applications surface", () => {
116
111
  const events = await t.runs();
117
112
  expect(events.some((e) => e.flow === "orders.create")).toBe(true);
118
113
  const createRun = events.find((e) => e.flow === "orders.create")!;
119
- expect(t.effects.of(createRun.id).some((e) => e.kind === "emit")).toBe(
120
- true,
121
- );
114
+ expect(t.effects.of(createRun.id).some((e) => e.kind === "emit")).toBe(true);
122
115
 
123
116
  await t.close();
124
117
  });
@@ -142,10 +135,7 @@ describe("createTestApp — vault gaps still fail boot", () => {
142
135
 
143
136
  try {
144
137
  await createTestApp(app, {
145
- secrets: [
146
- vault("A", { description: "alpha" }),
147
- vault("B", { description: "beta" }),
148
- ],
138
+ secrets: [vault("A", { description: "alpha" }), vault("B", { description: "beta" })],
149
139
  boot: {
150
140
  env: "prod",
151
141
  vault: { allowDevFallbacks: false, chain: [] },
@@ -22,15 +22,8 @@ import {
22
22
  type ChannelInbox,
23
23
  type ChannelInboxEntry,
24
24
  } from "../drivers/index.ts";
25
- import {
26
- createAiRuntime,
27
- type AiPromptDecl,
28
- type AiRuntime,
29
- } from "../elements/ai.ts";
30
- import {
31
- createChannelRuntime,
32
- type DeliveryReceipt,
33
- } from "../elements/channel.ts";
25
+ import { createAiRuntime, type AiPromptDecl, type AiRuntime } from "../elements/ai.ts";
26
+ import { createChannelRuntime, type DeliveryReceipt } from "../elements/channel.ts";
34
27
  import { createTestClockRuntime } from "../elements/clock.ts";
35
28
  import type { GateDecl } from "../elements/gate.ts";
36
29
  import type { SignalDecl } from "../elements/signal.ts";
@@ -39,6 +32,7 @@ import type { OkeApp } from "../kernel/app.ts";
39
32
  import type { BootOptions } from "../kernel/boot.ts";
40
33
  import type { EffectEntry } from "../kernel/effects.ts";
41
34
  import { fail, type FlowFailure } from "../kernel/errors.ts";
35
+ import { isJsonResult } from "../kernel/fx.ts";
42
36
  import { isFlowFailure } from "../kernel/hooks.ts";
43
37
  import type { ResolvedPrincipal } from "../kernel/pipeline.ts";
44
38
  import type { InternalTrigger, Trigger } from "../kernel/triggers.ts";
@@ -158,7 +152,7 @@ export interface TestApp<App extends OkeApp = OkeApp> {
158
152
  export type TestApiCall = (
159
153
  input?: unknown,
160
154
  opts?: TestCallOptions,
161
- ) => Promise<{ data: unknown; error: FlowFailure["error"] | null }>;
155
+ ) => Promise<{ data: unknown; error: FlowFailure["error"] | null; meta?: Record<string, unknown> }>;
162
156
 
163
157
  /** Loose API proxy — units/flows resolve at runtime from the booted app. */
164
158
  export type TestApi = Record<string, Record<string, TestApiCall>>;
@@ -199,16 +193,13 @@ export async function createTestApp<App extends OkeApp>(
199
193
  defaultLocale: "ar",
200
194
  ...(appOpts.channel ?? {}),
201
195
  ...(options.boot?.channel ?? {}),
202
- drivers: options.boot?.channel?.drivers ?? [
203
- openConsoleChannel({ inbox }),
204
- ],
196
+ drivers: options.boot?.channel?.drivers ?? [openConsoleChannel({ inbox })],
205
197
  now: () => clock.now(),
206
198
  });
207
199
  const ai = createAiRuntime({
208
200
  ...(appOpts.ai ?? {}),
209
201
  ...(options.boot?.ai ?? {}),
210
- defaultDriver:
211
- options.boot?.ai?.defaultDriver ?? createMockAiDriver(mockResponses),
202
+ defaultDriver: options.boot?.ai?.defaultDriver ?? createMockAiDriver(mockResponses),
212
203
  now: () => clock.now(),
213
204
  });
214
205
 
@@ -351,11 +342,13 @@ function createTestApi(app: OkeApp, now: () => number): TestApi {
351
342
  flowName: string,
352
343
  input: unknown,
353
344
  opts?: TestCallOptions,
354
- ): Promise<{ data: unknown; error: FlowFailure["error"] | null }> => {
345
+ ): Promise<{
346
+ data: unknown;
347
+ error: FlowFailure["error"] | null;
348
+ meta?: Record<string, unknown>;
349
+ }> => {
355
350
  const flowDef =
356
- app.flow(`${unit}.${flowName}`) ??
357
- app.flow(flowName) ??
358
- findFlowByUnit(app, unit, flowName);
351
+ app.flow(`${unit}.${flowName}`) ?? app.flow(flowName) ?? findFlowByUnit(app, unit, flowName);
359
352
  if (!flowDef) {
360
353
  return {
361
354
  data: null,
@@ -369,9 +362,7 @@ function createTestApi(app: OkeApp, now: () => number): TestApi {
369
362
  const principal = toPrincipal(opts?.as);
370
363
  const httpTrigger = flowDef.triggers.find((t) => t.kind === "http");
371
364
  const trigger: Trigger =
372
- httpTrigger ??
373
- flowDef.triggers[0] ??
374
- ({ kind: "internal" } satisfies InternalTrigger);
365
+ httpTrigger ?? flowDef.triggers[0] ?? ({ kind: "internal" } satisfies InternalTrigger);
375
366
 
376
367
  const result = await app.execute(flowDef, input, trigger, {
377
368
  principal,
@@ -387,6 +378,13 @@ function createTestApi(app: OkeApp, now: () => number): TestApi {
387
378
  if (result.output !== undefined && isFlowFailure(result.output)) {
388
379
  return { data: null, error: result.output.error };
389
380
  }
381
+ if (isJsonResult(result.output)) {
382
+ return {
383
+ data: result.output.value,
384
+ error: null,
385
+ meta: result.output.meta,
386
+ };
387
+ }
390
388
  return { data: result.output ?? null, error: null };
391
389
  };
392
390
 
@@ -400,8 +398,7 @@ function createTestApi(app: OkeApp, now: () => number): TestApi {
400
398
  if (typeof flowName !== "string" || flowName === "then") {
401
399
  return undefined;
402
400
  }
403
- return (input?: unknown, opts?: TestCallOptions) =>
404
- call(unit, flowName, input, opts);
401
+ return (input?: unknown, opts?: TestCallOptions) => call(unit, flowName, input, opts);
405
402
  },
406
403
  },
407
404
  );
@@ -409,11 +406,7 @@ function createTestApi(app: OkeApp, now: () => number): TestApi {
409
406
  });
410
407
  }
411
408
 
412
- function findFlowByUnit(
413
- app: OkeApp,
414
- unit: string,
415
- flowName: string,
416
- ): ReturnType<OkeApp["flow"]> {
409
+ function findFlowByUnit(app: OkeApp, unit: string, flowName: string): ReturnType<OkeApp["flow"]> {
417
410
  // Prefer $routes unit.flow → full flow name from bindings.
418
411
  const routes = app.$routes as Record<
419
412
  string,
@@ -439,7 +432,10 @@ function findFlowByUnit(
439
432
  }
440
433
  }
441
434
  for (const b of app.bindings) {
442
- if (b.flow.unit === unit && (b.flow.name === flowName || b.flow.name.endsWith(`.${flowName}`))) {
435
+ if (
436
+ b.flow.unit === unit &&
437
+ (b.flow.name === flowName || b.flow.name.endsWith(`.${flowName}`))
438
+ ) {
443
439
  return b.flow;
444
440
  }
445
441
  // Auto-named flows: match export-style via name suffix after adopt.
@@ -515,9 +511,7 @@ function matchRestHeuristic(
515
511
  return undefined;
516
512
  }
517
513
 
518
- function toPrincipal(
519
- as: TestUser | ResolvedPrincipal | undefined,
520
- ): ResolvedPrincipal | undefined {
514
+ function toPrincipal(as: TestUser | ResolvedPrincipal | undefined): ResolvedPrincipal | undefined {
521
515
  if (!as) return undefined;
522
516
  if ("scopes" in as && as.scopes instanceof Set && "id" in as) {
523
517
  const u = as as TestUser;
@@ -22,9 +22,7 @@ describe("Provisions integration", () => {
22
22
  resetFlowSeq();
23
23
 
24
24
  const member = gate.policy("member", ({ auth }) => !!auth.verified);
25
- const canOrder = gate.policy("order:create", ({ auth }) =>
26
- auth.scopes.has("order:create"),
27
- );
25
+ const canOrder = gate.policy("order:create", ({ auth }) => auth.scopes.has("order:create"));
28
26
  const stripeKey = vault("STRIPE_KEY", {
29
27
  description: "Payments gateway key",
30
28
  dev: "sk_test_local",
@@ -133,10 +131,7 @@ describe("Provisions integration", () => {
133
131
  expect(denied.error?.code).toBe("Unauthorized");
134
132
 
135
133
  const u = await t.auth.loginAs({ scopes: ["order:create"] });
136
- const { data, error } = await t.api.orders!.create!(
137
- { sku: "COFFEE", qty: 2 },
138
- { as: u },
139
- );
134
+ const { data, error } = await t.api.orders!.create!({ sku: "COFFEE", qty: 2 }, { as: u });
140
135
  expect(error).toBeNull();
141
136
  expect(data).toMatchObject({ id: expect.any(String) });
142
137
 
@@ -159,10 +154,7 @@ describe("Provisions integration", () => {
159
154
  // First orders.create is the anonymous deny (stops at member); the
160
155
  // authenticated success evaluates the full chain.
161
156
  const createRun = events.find(
162
- (e) =>
163
- e.flow === "orders.create" &&
164
- e.gates.includes("order:create") &&
165
- e.error == null,
157
+ (e) => e.flow === "orders.create" && e.gates.includes("order:create") && e.error == null,
166
158
  );
167
159
  expect(createRun).toBeDefined();
168
160
  expect(createRun!.gates).toEqual(["member", "order:create"]);
@@ -5,6 +5,8 @@
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import {
7
7
  CODEMODS,
8
+ rewriteConfigEnvKeys,
9
+ rewriteFromStackMarkers,
8
10
  runCodemods,
9
11
  validateCodemodRegistry,
10
12
  type Codemod,
@@ -45,14 +47,31 @@ describe("codemod registry", () => {
45
47
  from: "0.0.0",
46
48
  to: "0.0.1",
47
49
  description: "rename demo",
48
- apply: async () => [
49
- { path: "src/x.ts", before: "old", after: "new" },
50
- ],
50
+ apply: async () => [{ path: "src/x.ts", before: "old", after: "new" }],
51
51
  },
52
52
  ];
53
53
  const changes = await runCodemods("/tmp", registry);
54
- expect(changes).toEqual([
55
- { path: "src/x.ts", before: "old", after: "new" },
56
- ]);
54
+ expect(changes).toEqual([{ path: "src/x.ts", before: "old", after: "new" }]);
55
+ });
56
+
57
+ test("rewriteConfigEnvKeys renames driver-map keys", () => {
58
+ const after = rewriteConfigEnvKeys(`sql: {
59
+ dev: "sqlite",
60
+ stack: "postgres",
61
+ prod: "postgres",
62
+ }`);
63
+ expect(after).toContain('local: "sqlite"');
64
+ expect(after).toContain('docker: "postgres"');
65
+ expect(after).not.toMatch(/(^|[^\w.])dev\s*:/);
66
+ expect(after).not.toMatch(/(^|[^\w.])stack\s*:/);
67
+ });
68
+
69
+ test("rewriteFromStackMarkers renames vault helpers", () => {
70
+ const after = rewriteFromStackMarkers(
71
+ `dev: vault.fromStack("store.sql") // __oke_from_stack__`,
72
+ );
73
+ expect(after).toContain("fromDocker");
74
+ expect(after).toContain("__oke_from_docker__");
75
+ expect(after).not.toContain("fromStack");
57
76
  });
58
77
  });
@@ -6,6 +6,9 @@
6
6
  * registry is the checklist.
7
7
  */
8
8
 
9
+ import { readdir } from "node:fs/promises";
10
+ import { join, relative, resolve } from "node:path";
11
+
9
12
  /** One file rewrite produced by a codemod. */
10
13
  export interface CodemodChange {
11
14
  /** Path relative to the project root. */
@@ -35,10 +38,120 @@ export interface Codemod {
35
38
  }
36
39
 
37
40
  /**
38
- * Built-in transforms. Empty until the next intentional breaking release —
39
- * the infrastructure is the gate; entries are added with the break.
41
+ * Rewrite driver-map keys `dev:` `local:` and `stack:` `docker:`.
42
+ *
43
+ * Vault `dev:` fallbacks are intentionally excluded — callers pass only
44
+ * `oke.config.*` paths into this rewriter.
45
+ *
46
+ * @param source - File contents
47
+ */
48
+ export function rewriteConfigEnvKeys(source: string): string {
49
+ return source
50
+ .replace(/(^|[^\w.])dev(\s*:)/gm, "$1local$2")
51
+ .replace(/(^|[^\w.])stack(\s*:)/gm, "$1docker$2");
52
+ }
53
+
54
+ /**
55
+ * Rewrite removed vault stack markers to docker equivalents.
56
+ *
57
+ * @param source - File contents
58
+ */
59
+ export function rewriteFromStackMarkers(source: string): string {
60
+ return source
61
+ .replace(/\bfromStack\b/g, "fromDocker")
62
+ .replace(/\bFROM_STACK_PREFIX\b/g, "FROM_DOCKER_PREFIX")
63
+ .replace(/\bisFromStack\b/g, "isFromDocker")
64
+ .replace(/\bfromStackRole\b/g, "fromDockerRole")
65
+ .replace(/__oke_from_stack__/g, "__oke_from_docker__");
66
+ }
67
+
68
+ /**
69
+ * Collect `oke.config.*` files under a project root.
70
+ *
71
+ * @param cwd - Project root
72
+ */
73
+ async function collectConfigCandidates(cwd: string): Promise<string[]> {
74
+ const out: string[] = [];
75
+ for (const name of ["oke.config.ts", "oke.config.mts", "oke.config.js"]) {
76
+ const path = resolve(cwd, name);
77
+ if (await Bun.file(path).exists()) out.push(path);
78
+ }
79
+ return out;
80
+ }
81
+
82
+ /**
83
+ * Collect TypeScript sources that may reference `fromStack`.
84
+ *
85
+ * @param cwd - Project root
86
+ */
87
+ async function collectVaultCandidates(cwd: string): Promise<string[]> {
88
+ const out: string[] = [];
89
+ const roots = ["src", "app"];
90
+ for (const root of roots) {
91
+ const dir = resolve(cwd, root);
92
+ try {
93
+ await walkTs(dir, out);
94
+ } catch {
95
+ // missing dir
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+
101
+ /**
102
+ * @param dir - Directory
103
+ * @param out - Accumulator of absolute paths
104
+ */
105
+ async function walkTs(dir: string, out: string[]): Promise<void> {
106
+ const entries = await readdir(dir, { withFileTypes: true });
107
+ for (const entry of entries) {
108
+ const path = join(dir, entry.name);
109
+ if (entry.isDirectory()) {
110
+ if (entry.name === "node_modules" || entry.name === ".git") continue;
111
+ await walkTs(path, out);
112
+ } else if (entry.isFile() && /\.(ts|mts|tsx)$/.test(entry.name)) {
113
+ out.push(path);
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Built-in transforms.
40
120
  */
41
- export const CODEMODS: readonly Codemod[] = [];
121
+ export const CODEMODS: readonly Codemod[] = [
122
+ {
123
+ id: "0.2.7-config-env-local-docker",
124
+ from: "0.2.6",
125
+ to: "0.2.7",
126
+ description: "Rename driver-map keys dev→local, stack→docker; fromStack→fromDocker",
127
+ async apply(cwd) {
128
+ const changes: CodemodChange[] = [];
129
+ for (const path of await collectConfigCandidates(cwd)) {
130
+ const before = await Bun.file(path).text();
131
+ const after = rewriteConfigEnvKeys(before);
132
+ if (after !== before) {
133
+ changes.push({
134
+ path: relative(cwd, path) || path,
135
+ before,
136
+ after,
137
+ });
138
+ }
139
+ }
140
+ for (const path of await collectVaultCandidates(cwd)) {
141
+ const before = await Bun.file(path).text();
142
+ const after = rewriteFromStackMarkers(before);
143
+ if (after !== before) {
144
+ changes.push({
145
+ path: relative(cwd, path) || path,
146
+ before,
147
+ after,
148
+ });
149
+ }
150
+ }
151
+ return changes;
152
+ },
153
+ },
154
+ ];
42
155
 
43
156
  /**
44
157
  * Validate the registry (unique ids, non-empty metadata, apply present).
@@ -31,9 +31,7 @@ describe("Standard Schema — four libraries", () => {
31
31
  expect(bad.failure.data).toBeNull();
32
32
  expect(bad.failure.error.code).toBe(VALIDATION_ERROR_CODE);
33
33
  expect(bad.failure.error.data.issues.length).toBeGreaterThan(0);
34
- expect(bad.failure.error.data.issues[0]?.message.length).toBeGreaterThan(
35
- 0,
36
- );
34
+ expect(bad.failure.error.data.issues[0]?.message.length).toBeGreaterThan(0);
37
35
  }
38
36
  });
39
37
 
@@ -82,8 +80,7 @@ describe("Standard Schema — four libraries", () => {
82
80
  expect(bad.ok).toBe(false);
83
81
  if (!bad.ok) {
84
82
  expect(bad.failure.error.code).toBe(VALIDATION_ERROR_CODE);
85
- expect(bad.failure.error.data.issues.some((i) => i.path.includes("seats")))
86
- .toBe(true);
83
+ expect(bad.failure.error.data.issues.some((i) => i.path.includes("seats"))).toBe(true);
87
84
  }
88
85
  });
89
86