okengine 0.2.5 → 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 +46 -38
  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
package/src/cli/eval.ts CHANGED
@@ -3,11 +3,7 @@
3
3
  */
4
4
 
5
5
  import { resolve } from "node:path";
6
- import {
7
- parseEvalJsonl,
8
- runPromptEvals,
9
- type EvalCase,
10
- } from "../elements/ai/eval.ts";
6
+ import { parseEvalJsonl, runPromptEvals, type EvalCase } from "../elements/ai/eval.ts";
11
7
  import type { Manifest } from "../manifest/types.ts";
12
8
 
13
9
  /** Options for {@link runOkeEval}. */
@@ -35,9 +31,7 @@ export interface OkeEvalOptions {
35
31
  * @param options - Manifest + ask wiring
36
32
  * @returns Exit code (1 on any failure)
37
33
  */
38
- export async function runOkeEval(
39
- options: OkeEvalOptions = {},
40
- ): Promise<number> {
34
+ export async function runOkeEval(options: OkeEvalOptions = {}): Promise<number> {
41
35
  const write = options.write ?? ((t) => process.stdout.write(t));
42
36
  let manifest = options.manifest;
43
37
  if (!manifest) {
@@ -57,9 +51,7 @@ export async function runOkeEval(
57
51
  return 0;
58
52
  }
59
53
 
60
- const load =
61
- options.loadEvals ??
62
- (async (p: string) => Bun.file(resolve(p)).text());
54
+ const load = options.loadEvals ?? (async (p: string) => Bun.file(resolve(p)).text());
63
55
 
64
56
  let failed = 0;
65
57
  for (const name of names) {
@@ -69,9 +61,7 @@ export async function runOkeEval(
69
61
  continue;
70
62
  }
71
63
  if (!options.ask) {
72
- console.error(
73
- `oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`,
74
- );
64
+ console.error(`oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`);
75
65
  return 1;
76
66
  }
77
67
  let cases: EvalCase[];
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { resolve } from "node:path";
6
- import {
7
- deriveModuleActions,
8
- formatGatesList,
9
- } from "../elements/gate/permissions.ts";
6
+ import { deriveModuleActions, formatGatesList } from "../elements/gate/permissions.ts";
10
7
  import type { Manifest } from "../manifest/types.ts";
11
8
  import { wantsJson } from "./args.ts";
12
9
  import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
@@ -15,31 +15,29 @@ import {
15
15
  const SAMPLE: OkeConfig = {
16
16
  drivers: {
17
17
  store: {
18
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
19
- kv: { dev: "memory", stack: "redis", prod: "redis" },
18
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
19
+ kv: { local: "memory", docker: "redis", prod: "redis" },
20
20
  },
21
- signal: { dev: "memory", stack: "postgres", prod: "postgres" },
22
- clock: { dev: "memory", stack: "postgres", prod: "postgres" },
23
- vault: { dev: "dotenv", stack: "dotenv", prod: "sops" },
21
+ signal: { local: "memory", docker: "postgres", prod: "postgres" },
22
+ clock: { local: "memory", docker: "postgres", prod: "postgres" },
23
+ vault: { local: "dotenv", docker: "dotenv", prod: "sops" },
24
24
  channel: {
25
- email: { dev: "console", stack: "smtp", prod: "smtp" },
25
+ email: { local: "console", docker: "smtp", prod: "smtp" },
26
26
  },
27
- ai: { dev: "mock", stack: "mock" },
27
+ ai: { local: "mock", docker: "mock" },
28
28
  },
29
29
  };
30
30
 
31
31
  describe("hero-meta", () => {
32
- test("resolveDevProfile maps stack and NODE_ENV", () => {
33
- expect(resolveDevProfile({ stack: false })).toBe("local");
34
- expect(resolveDevProfile({ stack: true })).toBe("local-server");
35
- expect(resolveDevProfile({ stack: false, nodeEnv: "test" })).toBe("test");
36
- expect(resolveDevProfile({ stack: false, nodeEnv: "production" })).toBe(
37
- "production",
38
- );
32
+ test("resolveDevProfile maps docker and NODE_ENV", () => {
33
+ expect(resolveDevProfile({ docker: false })).toBe("local");
34
+ expect(resolveDevProfile({ docker: true })).toBe("docker");
35
+ expect(resolveDevProfile({ docker: false, nodeEnv: "test" })).toBe("test");
36
+ expect(resolveDevProfile({ docker: false, nodeEnv: "production" })).toBe("production");
39
37
  });
40
38
 
41
39
  test("resolveHeroElements lists eight elements with drivers", () => {
42
- const rows = resolveHeroElements(SAMPLE, { stack: false });
40
+ const rows = resolveHeroElements(SAMPLE, { docker: false });
43
41
  expect(rows.map((r) => r.element)).toEqual([
44
42
  "flow",
45
43
  "signal",
@@ -54,9 +52,9 @@ describe("hero-meta", () => {
54
52
  expect(rows.find((r) => r.element === "flow")?.detail).toBe("●");
55
53
  });
56
54
 
57
- test("stack profile applies to every element", () => {
55
+ test("docker profile applies to every element", () => {
58
56
  const rows = resolveHeroElements(SAMPLE, {
59
- stack: true,
57
+ docker: true,
60
58
  sqlDriver: "postgres",
61
59
  kvDriver: "redis",
62
60
  });
@@ -72,13 +70,13 @@ describe("hero-meta", () => {
72
70
  test("encode/decode round-trips", () => {
73
71
  const snap = buildDevHeroSnapshot({
74
72
  config: SAMPLE,
75
- stack: true,
73
+ docker: true,
76
74
  sqlDriver: "postgres",
77
75
  kvDriver: "redis",
78
76
  version: "0.2.4",
79
77
  nodeEnv: "development",
80
78
  });
81
- expect(snap.profile).toBe("local-server");
79
+ expect(snap.profile).toBe("docker");
82
80
  expect(snap.runtimeEnv).toBe("local");
83
81
  expect(decodeHeroSnapshot(encodeHeroSnapshot(snap))).toEqual(snap);
84
82
  });
@@ -11,11 +11,7 @@ import {
11
11
  } from "../config/index.ts";
12
12
 
13
13
  /** How the process is running (local laptop → production). */
14
- export type DevRuntimeProfile =
15
- | "local"
16
- | "local-server"
17
- | "test"
18
- | "production";
14
+ export type DevRuntimeProfile = "local" | "docker" | "test" | "production";
19
15
 
20
16
  /** Data plane: still on a laptop vs real production. */
21
17
  export type DevRuntimeEnv = "local" | "production";
@@ -61,16 +57,16 @@ export function formatHeroSystemLine(
61
57
  /**
62
58
  * Profile for an `oke dev` session.
63
59
  *
64
- * @param options - Stack / NODE_ENV hints
60
+ * @param options - Docker / NODE_ENV hints
65
61
  */
66
62
  export function resolveDevProfile(options: {
67
- readonly stack: boolean;
63
+ readonly docker: boolean;
68
64
  /** Explicit role — do not infer from ambient `NODE_ENV` (tests set `test`). */
69
65
  readonly nodeEnv?: string;
70
66
  }): DevRuntimeProfile {
71
67
  if (options.nodeEnv === "test") return "test";
72
68
  if (options.nodeEnv === "production") return "production";
73
- return options.stack ? "local-server" : "local";
69
+ return options.docker ? "docker" : "local";
74
70
  }
75
71
 
76
72
  /**
@@ -78,9 +74,7 @@ export function resolveDevProfile(options: {
78
74
  *
79
75
  * @param profile - Runtime profile
80
76
  */
81
- export function resolveDevRuntimeEnv(
82
- profile: DevRuntimeProfile,
83
- ): DevRuntimeEnv {
77
+ export function resolveDevRuntimeEnv(profile: DevRuntimeProfile): DevRuntimeEnv {
84
78
  return profile === "production" ? "production" : "local";
85
79
  }
86
80
 
@@ -89,7 +83,7 @@ export function resolveDevRuntimeEnv(
89
83
  *
90
84
  * @param map - Env driver map
91
85
  * @param env - Config env key
92
- * @param prefer - Override (stack sql/kv)
86
+ * @param prefer - Override (docker sql/kv)
93
87
  */
94
88
  function driverOr(
95
89
  map: Parameters<typeof resolveDriverId>[0],
@@ -106,10 +100,7 @@ function driverOr(
106
100
  * @param channel - Channel driver maps
107
101
  * @param env - Config env
108
102
  */
109
- function channelDetail(
110
- channel: DriversConfig["channel"],
111
- env: ConfigEnv,
112
- ): string {
103
+ function channelDetail(channel: DriversConfig["channel"], env: ConfigEnv): string {
113
104
  if (!channel) return "—";
114
105
  const parts: string[] = [];
115
106
  for (const medium of ["email", "sms", "whatsapp", "push"] as const) {
@@ -120,11 +111,11 @@ function channelDetail(
120
111
  }
121
112
 
122
113
  /**
123
- * Summarize store facets for the active (or stack-overridden) drivers.
114
+ * Summarize store facets for the active (or docker-overridden) drivers.
124
115
  *
125
116
  * @param store - Store driver maps
126
117
  * @param env - Config env for non-overridden facets
127
- * @param overrides - Stack sql/kv ids
118
+ * @param overrides - Docker sql/kv ids
128
119
  */
129
120
  function storeDetail(
130
121
  store: DriversConfig["store"],
@@ -145,26 +136,25 @@ function storeDetail(
145
136
  }
146
137
 
147
138
  /**
148
- * Resolve eight-element rows from `oke.config` + stack overrides.
139
+ * Resolve eight-element rows from `oke.config` + docker overrides.
149
140
  *
150
141
  * @param config - Loaded config (or null)
151
- * @param options - Stack driver overrides; config env for maps
142
+ * @param options - Docker driver overrides; config env for maps
152
143
  */
153
144
  export function resolveHeroElements(
154
145
  config: OkeConfig | null | undefined,
155
146
  options: {
156
- /** Use prod store ids from stack (`oke dev -s`). */
157
- readonly stack: boolean;
147
+ /** Use docker store ids from stack (`oke dev -d`). */
148
+ readonly docker: boolean;
158
149
  readonly sqlDriver?: string;
159
150
  readonly kvDriver?: string;
160
- /** Which driver map column to read (default `dev`). */
151
+ /** Which driver map column to read (default `local`). */
161
152
  readonly configEnv?: ConfigEnv;
162
153
  },
163
154
  ): readonly HeroElementRow[] {
164
155
  const drivers = config?.drivers;
165
- // `-s` reads the `stack` profile for every element (not a store-only override).
166
- const configEnv: ConfigEnv =
167
- options.configEnv ?? (options.stack ? "stack" : "dev");
156
+ // `-d` reads the `docker` profile for every element (not a store-only override).
157
+ const configEnv: ConfigEnv = options.configEnv ?? (options.docker ? "docker" : "local");
168
158
 
169
159
  const byName: Record<string, string> = {
170
160
  flow: "●",
@@ -189,18 +179,18 @@ export function resolveHeroElements(
189
179
  /**
190
180
  * Build the full hero snapshot for banner / soft reload.
191
181
  *
192
- * @param options - Config, stack, versions
182
+ * @param options - Config, docker, versions
193
183
  */
194
184
  export function buildDevHeroSnapshot(options: {
195
185
  readonly config?: OkeConfig | null;
196
- readonly stack: boolean;
186
+ readonly docker: boolean;
197
187
  readonly sqlDriver?: string;
198
188
  readonly kvDriver?: string;
199
189
  readonly version?: string;
200
190
  readonly nodeEnv?: string;
201
191
  }): DevHeroSnapshot {
202
192
  const profile = resolveDevProfile({
203
- stack: options.stack,
193
+ docker: options.docker,
204
194
  nodeEnv: options.nodeEnv,
205
195
  });
206
196
  return {
@@ -208,7 +198,7 @@ export function buildDevHeroSnapshot(options: {
208
198
  runtimeEnv: resolveDevRuntimeEnv(profile),
209
199
  system: formatHeroSystemLine(),
210
200
  elements: resolveHeroElements(options.config, {
211
- stack: options.stack,
201
+ docker: options.docker,
212
202
  sqlDriver: options.sqlDriver,
213
203
  kvDriver: options.kvDriver,
214
204
  }),
package/src/cli/images.ts CHANGED
@@ -54,9 +54,7 @@ export interface ImagesPinOptions {
54
54
  *
55
55
  * @param options - Config / images
56
56
  */
57
- export async function runImagesList(
58
- options: ImagesListOptions = {},
59
- ): Promise<number> {
57
+ export async function runImagesList(options: ImagesListOptions = {}): Promise<number> {
60
58
  const write = options.write ?? ((t) => process.stdout.write(t));
61
59
  const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
62
60
  const json = options.json ?? false;
@@ -113,8 +111,7 @@ export function buildImagesListRows(
113
111
  } catch {
114
112
  // Unknown image — still list the row; recipe stays "-".
115
113
  }
116
- const digest =
117
- lock?.images[role]?.digest ?? digestFromRef ?? "-";
114
+ const digest = lock?.images[role]?.digest ?? digestFromRef ?? "-";
118
115
  return {
119
116
  role,
120
117
  recipe,
@@ -150,9 +147,7 @@ export function formatImagesList(rows: readonly ImagesListRow[]): string {
150
147
  *
151
148
  * @param options - Config / resolver
152
149
  */
153
- export async function runImagesPin(
154
- options: ImagesPinOptions = {},
155
- ): Promise<number> {
150
+ export async function runImagesPin(options: ImagesPinOptions = {}): Promise<number> {
156
151
  const write = options.write ?? ((t) => process.stdout.write(t));
157
152
  const cwd = options.cwd ?? process.cwd();
158
153
  let images = options.images;
package/src/cli/index.ts CHANGED
@@ -7,6 +7,7 @@ import { branchCli } from "./branch.ts";
7
7
  import { buildCli } from "./build.ts";
8
8
  import { clientAddCli } from "./client-add.ts";
9
9
  import { completionCli } from "./completion.ts";
10
+ import { dbCli } from "./db.ts";
10
11
  import { devCli } from "./dev.ts";
11
12
  import { doctorCli } from "./doctor.ts";
12
13
  import { dockerCli } from "./docker.ts";
@@ -14,6 +15,7 @@ import { evalCli } from "./eval.ts";
14
15
  import { EXIT_CODE_HELP, EXIT_OK, EXIT_USAGE } from "./exit.ts";
15
16
  import { gatesListCli } from "./gates-list.ts";
16
17
  import { imagesCli } from "./images.ts";
18
+ import { modeCli } from "./mode.ts";
17
19
  import { privacyEraseCli } from "./privacy-erase.ts";
18
20
  import { formatOkeHelp } from "./registry.ts";
19
21
  import { schemaCli } from "./schema.ts";
@@ -29,6 +31,10 @@ if (cmd === "dev") {
29
31
  process.exit(await devCli(sub ? [sub, ...rest] : rest));
30
32
  }
31
33
 
34
+ if (cmd === "mode") {
35
+ process.exit(await modeCli(sub ? [sub, ...rest] : rest));
36
+ }
37
+
32
38
  if (cmd === "start") {
33
39
  process.exit(await startCli(sub ? [sub, ...rest] : rest));
34
40
  }
@@ -45,6 +51,10 @@ if (cmd === "schema") {
45
51
  process.exit(await schemaCli(sub ? [sub, ...rest] : rest));
46
52
  }
47
53
 
54
+ if (cmd === "db") {
55
+ process.exit(await dbCli(sub ? [sub, ...rest] : rest));
56
+ }
57
+
48
58
  if (cmd === "client" && sub === "add") {
49
59
  process.exit(await clientAddCli(rest));
50
60
  }
@@ -91,8 +101,7 @@ if (cmd === "completion") {
91
101
 
92
102
  if (cmd === undefined || cmd === "--help" || cmd === "-h" || cmd === "help") {
93
103
  // Bare `oke` — commands only. Exit-code table only on explicit --help.
94
- const help =
95
- cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
104
+ const help = cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
96
105
  console.log(help);
97
106
  process.exit(cmd ? EXIT_OK : EXIT_USAGE);
98
107
  }
@@ -6,7 +6,7 @@ import { describe, expect, test } from "bun:test";
6
6
  import {
7
7
  defaultImagesFromConfig,
8
8
  resolveImages,
9
- stackDevDriverMismatches,
9
+ dockerDevDriverMismatches,
10
10
  } from "./load-config.ts";
11
11
 
12
12
  describe("defaultImagesFromConfig", () => {
@@ -75,14 +75,14 @@ describe("resolveImages", () => {
75
75
  });
76
76
  });
77
77
 
78
- describe("stackDevDriverMismatches", () => {
79
- test("flags stack/prod sqlite/memory when containers are up", () => {
80
- const mismatches = stackDevDriverMismatches(
78
+ describe("dockerDevDriverMismatches", () => {
79
+ test("flags docker/prod sqlite/memory when containers are up", () => {
80
+ const mismatches = dockerDevDriverMismatches(
81
81
  {
82
82
  drivers: {
83
83
  store: {
84
- sql: { dev: "sqlite", stack: "sqlite", prod: "sqlite" },
85
- kv: { dev: "memory", stack: "memory", prod: "memory" },
84
+ sql: { local: "sqlite", docker: "sqlite", prod: "sqlite" },
85
+ kv: { local: "memory", docker: "memory", prod: "memory" },
86
86
  },
87
87
  },
88
88
  },
@@ -94,13 +94,13 @@ describe("stackDevDriverMismatches", () => {
94
94
  ]);
95
95
  });
96
96
 
97
- test("silent when stack profile matches containers", () => {
98
- const mismatches = stackDevDriverMismatches(
97
+ test("silent when docker profile matches containers", () => {
98
+ const mismatches = dockerDevDriverMismatches(
99
99
  {
100
100
  drivers: {
101
101
  store: {
102
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
103
- kv: { dev: "memory", stack: "redis", prod: "redis" },
102
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
103
+ kv: { local: "memory", docker: "redis", prod: "redis" },
104
104
  },
105
105
  },
106
106
  },
@@ -109,13 +109,13 @@ describe("stackDevDriverMismatches", () => {
109
109
  expect(mismatches).toEqual([]);
110
110
  });
111
111
 
112
- test("silent when only prod is set (stack falls back to prod)", () => {
113
- const mismatches = stackDevDriverMismatches(
112
+ test("silent when only prod is set (docker falls back to prod)", () => {
113
+ const mismatches = dockerDevDriverMismatches(
114
114
  {
115
115
  drivers: {
116
116
  store: {
117
- sql: { dev: "sqlite", prod: "postgres" },
118
- kv: { dev: "memory", prod: "redis" },
117
+ sql: { local: "sqlite", prod: "postgres" },
118
+ kv: { local: "memory", prod: "redis" },
119
119
  },
120
120
  },
121
121
  },
@@ -22,33 +22,31 @@ function driverId(ref: DriverRef | undefined): string | undefined {
22
22
  }
23
23
 
24
24
  /**
25
- * Prefer `stack` then `prod` for a driver map (local server ≈ production).
25
+ * Prefer `docker` then `prod` for a driver map (compose infra ≈ production).
26
26
  *
27
27
  * @param map - Env driver map
28
28
  */
29
- function stackOrProdId(
30
- map: { readonly stack?: DriverRef; readonly prod?: DriverRef } | undefined,
29
+ function dockerOrProdId(
30
+ map: { readonly docker?: DriverRef; readonly prod?: DriverRef } | undefined,
31
31
  ): string | undefined {
32
- return driverId(map?.stack) ?? driverId(map?.prod);
32
+ return driverId(map?.docker) ?? driverId(map?.prod);
33
33
  }
34
34
 
35
35
  /**
36
- * Derive default image pins from stack/prod driver protocols.
36
+ * Derive default image pins from docker/prod driver protocols.
37
37
  *
38
38
  * Used when `oke.config.ts` omits `images` but declares postgres/redis (etc.)
39
- * so `oke dev -s` / `oke stack` / `oke docker` have something to run.
39
+ * so `oke dev -d` / `oke stack` / `oke docker` have something to run.
40
40
  *
41
41
  * @param config - Loaded config
42
42
  */
43
- export function defaultImagesFromConfig(
44
- config: OkeConfig,
45
- ): Readonly<Record<string, string>> {
43
+ export function defaultImagesFromConfig(config: OkeConfig): Readonly<Record<string, string>> {
46
44
  const out: Record<string, string> = {};
47
- const sql = stackOrProdId(config.drivers?.store?.sql);
48
- const index = stackOrProdId(config.drivers?.store?.index);
49
- const kv = stackOrProdId(config.drivers?.store?.kv);
50
- const signal = stackOrProdId(config.drivers?.signal);
51
- const clock = stackOrProdId(config.drivers?.clock);
45
+ const sql = dockerOrProdId(config.drivers?.store?.sql);
46
+ const index = dockerOrProdId(config.drivers?.store?.index);
47
+ const kv = dockerOrProdId(config.drivers?.store?.kv);
48
+ const signal = dockerOrProdId(config.drivers?.signal);
49
+ const clock = dockerOrProdId(config.drivers?.clock);
52
50
 
53
51
  const needsSql =
54
52
  sql === "postgres" ||
@@ -56,19 +54,14 @@ export function defaultImagesFromConfig(
56
54
  index === "pgvector" ||
57
55
  signal === "postgres" ||
58
56
  clock === "postgres" ||
59
- (config.drivers?.prod ?? []).some(
60
- (p) => p === "postgres" || p === "pgvector",
61
- );
57
+ (config.drivers?.prod ?? []).some((p) => p === "postgres" || p === "pgvector");
62
58
 
63
59
  if (needsSql) {
64
60
  out["store.sql"] =
65
- sql === "pgvector" || index === "pgvector"
66
- ? DEFAULT_PGVECTOR_IMAGE
67
- : DEFAULT_SQL_IMAGE;
61
+ sql === "pgvector" || index === "pgvector" ? DEFAULT_PGVECTOR_IMAGE : DEFAULT_SQL_IMAGE;
68
62
  }
69
63
 
70
- const needsKv =
71
- kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
64
+ const needsKv = kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
72
65
  if (needsKv) {
73
66
  out["store.kv"] = DEFAULT_KV_IMAGE;
74
67
  }
@@ -109,9 +102,7 @@ export async function loadOkeConfig(
109
102
  }
110
103
  return { config: mod.default, path };
111
104
  }
112
- throw new Error(
113
- `oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`,
114
- );
105
+ throw new Error(`oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`);
115
106
  }
116
107
 
117
108
  /**
@@ -131,7 +122,7 @@ export async function loadManifest(path: string): Promise<Manifest> {
131
122
  * Resolve images map from config or Manifest.
132
123
  *
133
124
  * When neither declares `images`, derive defaults from prod driver protocols
134
- * so `oke dev -s` works on scaffolded templates without an explicit pin map.
125
+ * so `oke dev -d` works on scaffolded templates without an explicit pin map.
135
126
  *
136
127
  * @param config - Optional config
137
128
  * @param manifest - Optional manifest
@@ -150,49 +141,44 @@ export function resolveImages(
150
141
  export type StackDriverMismatch = {
151
142
  /** Short label (`sql`, `kv`). */
152
143
  readonly label: string;
153
- /** Active `drivers.*.stack` (→ prod) id. */
144
+ /** Active `drivers.*.docker` (→ prod) id. */
154
145
  readonly using: string;
155
146
  /** Driver that would use the container. */
156
147
  readonly container: string;
157
148
  };
158
149
 
159
150
  /**
160
- * Detect when `oke dev -s` containers will not back the app because the
161
- * `stack` driver profile still points at local/memory backends.
151
+ * Detect when `oke dev -d` containers will not back the app because the
152
+ * `docker` driver profile still points at local/memory backends.
162
153
  *
163
154
  * @param config - Loaded config
164
155
  * @param stackRoles - Roles being composed
165
156
  */
166
- export function stackDevDriverMismatches(
157
+ export function dockerDevDriverMismatches(
167
158
  config: OkeConfig,
168
159
  stackRoles: readonly string[],
169
160
  ): readonly StackDriverMismatch[] {
170
161
  const roles = new Set(stackRoles);
171
162
  const out: StackDriverMismatch[] = [];
172
- const sqlStack =
173
- driverId(config.drivers?.store?.sql?.stack) ??
174
- driverId(config.drivers?.store?.sql?.prod);
175
- const kvStack =
176
- driverId(config.drivers?.store?.kv?.stack) ??
177
- driverId(config.drivers?.store?.kv?.prod);
163
+ const sqlDocker =
164
+ driverId(config.drivers?.store?.sql?.docker) ?? driverId(config.drivers?.store?.sql?.prod);
165
+ const kvDocker =
166
+ driverId(config.drivers?.store?.kv?.docker) ?? driverId(config.drivers?.store?.kv?.prod);
178
167
 
179
168
  if (
180
169
  roles.has("store.sql") &&
181
- (sqlStack === "sqlite" || sqlStack === "memory" || sqlStack === undefined)
170
+ (sqlDocker === "sqlite" || sqlDocker === "memory" || sqlDocker === undefined)
182
171
  ) {
183
172
  out.push({
184
173
  label: "sql",
185
- using: sqlStack ?? "unset",
174
+ using: sqlDocker ?? "unset",
186
175
  container: "postgres",
187
176
  });
188
177
  }
189
- if (
190
- roles.has("store.kv") &&
191
- (kvStack === "memory" || kvStack === undefined)
192
- ) {
178
+ if (roles.has("store.kv") && (kvDocker === "memory" || kvDocker === undefined)) {
193
179
  out.push({
194
180
  label: "kv",
195
- using: kvStack ?? "memory",
181
+ using: kvDocker ?? "memory",
196
182
  container: "redis",
197
183
  });
198
184
  }
@@ -200,7 +186,17 @@ export function stackDevDriverMismatches(
200
186
  }
201
187
 
202
188
  /**
203
- * @deprecated Use {@link stackDevDriverMismatches} — kept for older call sites.
189
+ * @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
190
+ */
191
+ export function stackDevDriverMismatches(
192
+ config: OkeConfig,
193
+ stackRoles: readonly string[],
194
+ ): readonly StackDriverMismatch[] {
195
+ return dockerDevDriverMismatches(config, stackRoles);
196
+ }
197
+
198
+ /**
199
+ * @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
204
200
  * @param config - Loaded config
205
201
  * @param stackRoles - Roles being composed
206
202
  */
@@ -208,7 +204,5 @@ export function stackDevDriverWarnings(
208
204
  config: OkeConfig,
209
205
  stackRoles: readonly string[],
210
206
  ): readonly string[] {
211
- return stackDevDriverMismatches(config, stackRoles).map(
212
- (m) => `${m.label}: ${m.using}`,
213
- );
207
+ return dockerDevDriverMismatches(config, stackRoles).map((m) => `${m.label}: ${m.using}`);
214
208
  }
@@ -4,10 +4,7 @@
4
4
  * Used by `oke dev` so port 6535 is not a separate mock context.
5
5
  */
6
6
 
7
- import {
8
- createFileDiff,
9
- emitStructuralDiff,
10
- } from "../console/server/structural.ts";
7
+ import { createFileDiff, emitStructuralDiff } from "../console/server/structural.ts";
11
8
  import type { Manifest } from "../manifest/types.ts";
12
9
  import type { WideEvent } from "../runs/types.ts";
13
10
  import type { McpContext } from "../mcp/tools.ts";
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `oke mode [local|docker]` — read or set the saved `oke dev` preference.
3
+ */
4
+
5
+ import { parseDevMode, readDevMode, writeDevMode, type DevMode } from "./dev-mode.ts";
6
+
7
+ /**
8
+ * CLI entry for `oke mode`.
9
+ *
10
+ * @param args - Args after `mode`
11
+ */
12
+ export async function modeCli(args: readonly string[]): Promise<number> {
13
+ const cwd = process.cwd();
14
+ for (const a of args) {
15
+ if (a === "--help" || a === "-h") {
16
+ console.log(`oke mode [local|docker]
17
+
18
+ Get or set the default infrastructure mode for \`oke dev\`
19
+ (saved in .oke/mode). Session flags \`oke dev --local\` /
20
+ \`oke dev --docker\` never change this preference.
21
+ `);
22
+ return 0;
23
+ }
24
+ }
25
+
26
+ const positional = args.filter((a) => !a.startsWith("-"));
27
+ if (positional.length === 0) {
28
+ const saved = await readDevMode(cwd);
29
+ if (saved === null) {
30
+ console.log("oke mode: unset (default local until chosen)");
31
+ return 0;
32
+ }
33
+ console.log(saved);
34
+ return 0;
35
+ }
36
+
37
+ const next = parseDevMode(positional[0]);
38
+ if (next === null) {
39
+ console.error(`oke mode: expected local|docker, got ${JSON.stringify(positional[0])}`);
40
+ return 1;
41
+ }
42
+ await writeDevMode(cwd, next satisfies DevMode);
43
+ console.log(`oke mode: saved ${next}`);
44
+ return 0;
45
+ }