okengine 0.1.4

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 (674) hide show
  1. package/AGENTS.md +91 -0
  2. package/README.md +327 -0
  3. package/docs/spec/complete-example.md +1188 -0
  4. package/docs/spec/console.md +739 -0
  5. package/docs/spec/four-applications.md +1188 -0
  6. package/docs/spec/unified-theory.md +489 -0
  7. package/package.json +152 -0
  8. package/spec/manifest.v1.schema.json +624 -0
  9. package/src/auth/api-keys.ts +168 -0
  10. package/src/auth/attenuation.ts +116 -0
  11. package/src/auth/auth.test.ts +273 -0
  12. package/src/auth/cross-plane.ts +98 -0
  13. package/src/auth/index.ts +112 -0
  14. package/src/auth/invites.ts +66 -0
  15. package/src/auth/invoke-as.ts +49 -0
  16. package/src/auth/operator.ts +178 -0
  17. package/src/auth/planes.ts +102 -0
  18. package/src/auth/plugin.ts +44 -0
  19. package/src/auth/roles.ts +84 -0
  20. package/src/auth/sessions.ts +418 -0
  21. package/src/auth/tables.ts +131 -0
  22. package/src/cli/args.ts +50 -0
  23. package/src/cli/branch.ts +75 -0
  24. package/src/cli/build.ts +86 -0
  25. package/src/cli/client-add.test.ts +140 -0
  26. package/src/cli/client-add.ts +164 -0
  27. package/src/cli/completion.test.ts +58 -0
  28. package/src/cli/completion.ts +296 -0
  29. package/src/cli/dev-app-runner.ts +77 -0
  30. package/src/cli/dev.test.ts +435 -0
  31. package/src/cli/dev.ts +594 -0
  32. package/src/cli/doc-drift.test.ts +146 -0
  33. package/src/cli/doc-drift.ts +397 -0
  34. package/src/cli/docker-cli.test.ts +221 -0
  35. package/src/cli/docker.ts +127 -0
  36. package/src/cli/doctor-diff-examples.ts +92 -0
  37. package/src/cli/doctor-diff.test.ts +91 -0
  38. package/src/cli/doctor-diff.ts +274 -0
  39. package/src/cli/doctor-pii.test.ts +98 -0
  40. package/src/cli/doctor-pii.ts +151 -0
  41. package/src/cli/doctor.test.ts +150 -0
  42. package/src/cli/doctor.ts +223 -0
  43. package/src/cli/eval.ts +122 -0
  44. package/src/cli/exit.ts +19 -0
  45. package/src/cli/gates-list.test.ts +47 -0
  46. package/src/cli/gates-list.ts +84 -0
  47. package/src/cli/images.ts +277 -0
  48. package/src/cli/index.ts +99 -0
  49. package/src/cli/json-out.test.ts +129 -0
  50. package/src/cli/load-config.ts +71 -0
  51. package/src/cli/mcp-from-console.ts +50 -0
  52. package/src/cli/privacy-erase.ts +73 -0
  53. package/src/cli/registry.ts +455 -0
  54. package/src/cli/safe-defaults.test.ts +92 -0
  55. package/src/cli/schema.ts +196 -0
  56. package/src/cli/stack.ts +82 -0
  57. package/src/cli/start.ts +106 -0
  58. package/src/cli/upgrade.ts +105 -0
  59. package/src/cli/vault-cmd.ts +140 -0
  60. package/src/client/budget-entry.ts +34 -0
  61. package/src/client/budget.test.ts +17 -0
  62. package/src/client/create.test.ts +159 -0
  63. package/src/client/create.ts +152 -0
  64. package/src/client/errors.ts +60 -0
  65. package/src/client/index.ts +35 -0
  66. package/src/client/notes-contract.test.ts +289 -0
  67. package/src/client/transport.test.ts +123 -0
  68. package/src/client/transport.ts +254 -0
  69. package/src/client/types.ts +282 -0
  70. package/src/compiler/aot.test.ts +248 -0
  71. package/src/compiler/aot.ts +182 -0
  72. package/src/compiler/differential.test.ts +241 -0
  73. package/src/compiler/dynamic.ts +54 -0
  74. package/src/compiler/effects-infer.ts +541 -0
  75. package/src/compiler/emit.ts +40 -0
  76. package/src/compiler/extract.test.ts +177 -0
  77. package/src/compiler/extract.ts +1368 -0
  78. package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
  79. package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
  80. package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
  81. package/src/compiler/fixtures/skyport/src/app.ts +10 -0
  82. package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
  83. package/src/compiler/fixtures/skyport/src/core.ts +3 -0
  84. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
  85. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
  86. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
  87. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
  88. package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
  89. package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
  90. package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
  91. package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
  92. package/src/compiler/fixtures/skyport.expected.json +241 -0
  93. package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
  94. package/src/compiler/http-parse.ts +214 -0
  95. package/src/compiler/index.ts +67 -0
  96. package/src/compiler/response.ts +89 -0
  97. package/src/compiler/sucrose.ts +238 -0
  98. package/src/config/index.ts +167 -0
  99. package/src/console/budget.test.ts +73 -0
  100. package/src/console/index.ts +30 -0
  101. package/src/console/server/access.test.ts +370 -0
  102. package/src/console/server/access.ts +777 -0
  103. package/src/console/server/ai.test.ts +172 -0
  104. package/src/console/server/ai.ts +632 -0
  105. package/src/console/server/app.ts +294 -0
  106. package/src/console/server/auth-rate.test.ts +81 -0
  107. package/src/console/server/auth-rate.ts +72 -0
  108. package/src/console/server/bind.ts +25 -0
  109. package/src/console/server/channels.test.ts +179 -0
  110. package/src/console/server/channels.ts +469 -0
  111. package/src/console/server/claim.test.ts +66 -0
  112. package/src/console/server/claim.ts +134 -0
  113. package/src/console/server/clock.test.ts +239 -0
  114. package/src/console/server/clock.ts +390 -0
  115. package/src/console/server/console.test.ts +338 -0
  116. package/src/console/server/diff.test.ts +299 -0
  117. package/src/console/server/diff.ts +352 -0
  118. package/src/console/server/dry-run.audit.test.ts +118 -0
  119. package/src/console/server/flows-invoke.test.ts +148 -0
  120. package/src/console/server/flows.ts +3633 -0
  121. package/src/console/server/gates.test.ts +360 -0
  122. package/src/console/server/gates.ts +869 -0
  123. package/src/console/server/index.ts +141 -0
  124. package/src/console/server/live.test.ts +30 -0
  125. package/src/console/server/live.ts +109 -0
  126. package/src/console/server/plugin.ts +50 -0
  127. package/src/console/server/plugins.test.ts +131 -0
  128. package/src/console/server/plugins.ts +429 -0
  129. package/src/console/server/runs-pii.ts +98 -0
  130. package/src/console/server/security-headers.ts +97 -0
  131. package/src/console/server/security.gate.test.ts +286 -0
  132. package/src/console/server/serve.ts +319 -0
  133. package/src/console/server/signals.test.ts +88 -0
  134. package/src/console/server/signals.ts +282 -0
  135. package/src/console/server/state.ts +982 -0
  136. package/src/console/server/store.test.ts +233 -0
  137. package/src/console/server/store.ts +861 -0
  138. package/src/console/server/structural.ts +95 -0
  139. package/src/console/server/vault.test.ts +251 -0
  140. package/src/console/server/vault.ts +430 -0
  141. package/src/console/ui/access/AccessA11yView.tsx +237 -0
  142. package/src/console/ui/access/a11y.test.tsx +122 -0
  143. package/src/console/ui/access/acknowledgement.test.ts +13 -0
  144. package/src/console/ui/access/acknowledgement.ts +35 -0
  145. package/src/console/ui/access/blast-radius.test.ts +26 -0
  146. package/src/console/ui/access/blast-radius.ts +40 -0
  147. package/src/console/ui/access/confirmation.test.ts +38 -0
  148. package/src/console/ui/access/confirmation.ts +36 -0
  149. package/src/console/ui/access/fixture.ts +203 -0
  150. package/src/console/ui/access/grantable.test.ts +17 -0
  151. package/src/console/ui/access/grantable.ts +36 -0
  152. package/src/console/ui/access/hygiene.test.ts +12 -0
  153. package/src/console/ui/access/hygiene.ts +39 -0
  154. package/src/console/ui/access/index.ts +54 -0
  155. package/src/console/ui/access/provenance.test.ts +12 -0
  156. package/src/console/ui/access/provenance.ts +29 -0
  157. package/src/console/ui/access/search.test.ts +17 -0
  158. package/src/console/ui/access/search.ts +72 -0
  159. package/src/console/ui/access/types.ts +111 -0
  160. package/src/console/ui/ai/AiA11yView.tsx +265 -0
  161. package/src/console/ui/ai/a11y.test.tsx +99 -0
  162. package/src/console/ui/ai/findings.ts +41 -0
  163. package/src/console/ui/ai/fixture.ts +182 -0
  164. package/src/console/ui/ai/format.ts +90 -0
  165. package/src/console/ui/ai/group.test.ts +37 -0
  166. package/src/console/ui/ai/group.ts +88 -0
  167. package/src/console/ui/ai/index.ts +66 -0
  168. package/src/console/ui/ai/promotion.test.ts +77 -0
  169. package/src/console/ui/ai/promotion.ts +150 -0
  170. package/src/console/ui/ai/search.test.ts +40 -0
  171. package/src/console/ui/ai/search.ts +89 -0
  172. package/src/console/ui/ai/types.ts +139 -0
  173. package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
  174. package/src/console/ui/architecture/a11y.test.tsx +97 -0
  175. package/src/console/ui/architecture/boundary.ts +42 -0
  176. package/src/console/ui/architecture/declared.ts +165 -0
  177. package/src/console/ui/architecture/fixture.ts +74 -0
  178. package/src/console/ui/architecture/index.ts +84 -0
  179. package/src/console/ui/architecture/layers.ts +64 -0
  180. package/src/console/ui/architecture/layout.ts +68 -0
  181. package/src/console/ui/architecture/pathologies.ts +260 -0
  182. package/src/console/ui/architecture/search.ts +145 -0
  183. package/src/console/ui/architecture/traffic.ts +102 -0
  184. package/src/console/ui/architecture/types.ts +144 -0
  185. package/src/console/ui/architecture/view.test.ts +165 -0
  186. package/src/console/ui/architecture/view.ts +516 -0
  187. package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
  188. package/src/console/ui/channels/a11y.test.tsx +96 -0
  189. package/src/console/ui/channels/confirmation.test.ts +37 -0
  190. package/src/console/ui/channels/confirmation.ts +27 -0
  191. package/src/console/ui/channels/fallback.test.ts +15 -0
  192. package/src/console/ui/channels/fallback.ts +20 -0
  193. package/src/console/ui/channels/findings.ts +38 -0
  194. package/src/console/ui/channels/fixture.ts +134 -0
  195. package/src/console/ui/channels/group.ts +25 -0
  196. package/src/console/ui/channels/index.ts +57 -0
  197. package/src/console/ui/channels/locale.test.ts +17 -0
  198. package/src/console/ui/channels/locale.ts +31 -0
  199. package/src/console/ui/channels/mask.test.ts +14 -0
  200. package/src/console/ui/channels/mask.ts +12 -0
  201. package/src/console/ui/channels/search.ts +58 -0
  202. package/src/console/ui/channels/taxonomy.test.ts +17 -0
  203. package/src/console/ui/channels/taxonomy.ts +49 -0
  204. package/src/console/ui/channels/types.ts +117 -0
  205. package/src/console/ui/clock/ClockA11yView.tsx +182 -0
  206. package/src/console/ui/clock/a11y.test.tsx +99 -0
  207. package/src/console/ui/clock/confirmation.test.ts +32 -0
  208. package/src/console/ui/clock/confirmation.ts +34 -0
  209. package/src/console/ui/clock/findings.ts +40 -0
  210. package/src/console/ui/clock/fixture.ts +111 -0
  211. package/src/console/ui/clock/health.test.ts +25 -0
  212. package/src/console/ui/clock/health.ts +61 -0
  213. package/src/console/ui/clock/index.ts +49 -0
  214. package/src/console/ui/clock/search.test.ts +39 -0
  215. package/src/console/ui/clock/search.ts +76 -0
  216. package/src/console/ui/clock/timeline.test.ts +44 -0
  217. package/src/console/ui/clock/timeline.ts +41 -0
  218. package/src/console/ui/clock/types.ts +78 -0
  219. package/src/console/ui/clock/waiting-on.test.ts +34 -0
  220. package/src/console/ui/clock/waiting-on.ts +83 -0
  221. package/src/console/ui/confirmation.unify.test.ts +92 -0
  222. package/src/console/ui/diff/DiffA11yView.tsx +85 -0
  223. package/src/console/ui/diff/a11y.test.tsx +99 -0
  224. package/src/console/ui/diff/fixture.ts +85 -0
  225. package/src/console/ui/diff/group.test.ts +58 -0
  226. package/src/console/ui/diff/group.ts +97 -0
  227. package/src/console/ui/diff/index.ts +38 -0
  228. package/src/console/ui/diff/search.test.ts +32 -0
  229. package/src/console/ui/diff/search.ts +75 -0
  230. package/src/console/ui/diff/summary.ts +74 -0
  231. package/src/console/ui/diff/types.ts +48 -0
  232. package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
  233. package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
  234. package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
  235. package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
  236. package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
  237. package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
  238. package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
  239. package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
  240. package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
  241. package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
  242. package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
  243. package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
  244. package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
  245. package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
  246. package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
  247. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
  248. package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  249. package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
  250. package/src/console/ui/dist/index.html +14 -0
  251. package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
  252. package/src/console/ui/flows/a11y.test.tsx +105 -0
  253. package/src/console/ui/flows/buffer.test.ts +91 -0
  254. package/src/console/ui/flows/buffer.ts +118 -0
  255. package/src/console/ui/flows/confirmation.ts +131 -0
  256. package/src/console/ui/flows/contract.test.ts +89 -0
  257. package/src/console/ui/flows/contract.ts +353 -0
  258. package/src/console/ui/flows/fixture.ts +81 -0
  259. package/src/console/ui/flows/graph.test.ts +101 -0
  260. package/src/console/ui/flows/graph.ts +549 -0
  261. package/src/console/ui/flows/index.ts +87 -0
  262. package/src/console/ui/flows/save-as-test.test.ts +47 -0
  263. package/src/console/ui/flows/save-as-test.ts +99 -0
  264. package/src/console/ui/flows/search.ts +255 -0
  265. package/src/console/ui/flows/tiers.ts +140 -0
  266. package/src/console/ui/gates/GatesA11yView.tsx +192 -0
  267. package/src/console/ui/gates/a11y.test.tsx +116 -0
  268. package/src/console/ui/gates/audit.test.ts +40 -0
  269. package/src/console/ui/gates/audit.ts +63 -0
  270. package/src/console/ui/gates/denial.test.ts +36 -0
  271. package/src/console/ui/gates/denial.ts +51 -0
  272. package/src/console/ui/gates/findings.ts +19 -0
  273. package/src/console/ui/gates/fixture.ts +189 -0
  274. package/src/console/ui/gates/group.test.ts +30 -0
  275. package/src/console/ui/gates/group.ts +102 -0
  276. package/src/console/ui/gates/index.ts +47 -0
  277. package/src/console/ui/gates/search.test.ts +49 -0
  278. package/src/console/ui/gates/search.ts +115 -0
  279. package/src/console/ui/gates/types.ts +121 -0
  280. package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
  281. package/src/console/ui/overview/a11y.test.tsx +113 -0
  282. package/src/console/ui/overview/busiest.ts +26 -0
  283. package/src/console/ui/overview/compose.ts +133 -0
  284. package/src/console/ui/overview/cost.test.ts +39 -0
  285. package/src/console/ui/overview/cost.ts +138 -0
  286. package/src/console/ui/overview/fixture.ts +161 -0
  287. package/src/console/ui/overview/golden.ts +57 -0
  288. package/src/console/ui/overview/index.ts +59 -0
  289. package/src/console/ui/overview/rank.test.ts +136 -0
  290. package/src/console/ui/overview/rank.ts +210 -0
  291. package/src/console/ui/overview/slo.test.ts +73 -0
  292. package/src/console/ui/overview/slo.ts +229 -0
  293. package/src/console/ui/overview/types.ts +121 -0
  294. package/src/console/ui/overview/verdict.ts +131 -0
  295. package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
  296. package/src/console/ui/plugins/a11y.test.tsx +97 -0
  297. package/src/console/ui/plugins/command.test.ts +22 -0
  298. package/src/console/ui/plugins/command.ts +27 -0
  299. package/src/console/ui/plugins/findings.ts +39 -0
  300. package/src/console/ui/plugins/fixture.ts +233 -0
  301. package/src/console/ui/plugins/group.test.ts +38 -0
  302. package/src/console/ui/plugins/group.ts +67 -0
  303. package/src/console/ui/plugins/index.ts +40 -0
  304. package/src/console/ui/plugins/search.ts +67 -0
  305. package/src/console/ui/plugins/types.ts +115 -0
  306. package/src/console/ui/runs/RunsA11yView.tsx +267 -0
  307. package/src/console/ui/runs/a11y.test.tsx +99 -0
  308. package/src/console/ui/runs/explain.test.ts +23 -0
  309. package/src/console/ui/runs/explain.ts +32 -0
  310. package/src/console/ui/runs/fixture.ts +189 -0
  311. package/src/console/ui/runs/group.test.ts +24 -0
  312. package/src/console/ui/runs/group.ts +85 -0
  313. package/src/console/ui/runs/histogram.test.ts +31 -0
  314. package/src/console/ui/runs/histogram.ts +85 -0
  315. package/src/console/ui/runs/index.ts +75 -0
  316. package/src/console/ui/runs/project.ts +122 -0
  317. package/src/console/ui/runs/query.test.ts +50 -0
  318. package/src/console/ui/runs/query.ts +283 -0
  319. package/src/console/ui/runs/search.test.ts +45 -0
  320. package/src/console/ui/runs/search.ts +141 -0
  321. package/src/console/ui/runs/trace-link.test.ts +30 -0
  322. package/src/console/ui/runs/trace-link.ts +99 -0
  323. package/src/console/ui/runs/types.ts +137 -0
  324. package/src/console/ui/shell/App.tsx +56 -0
  325. package/src/console/ui/shell/client.ts +1715 -0
  326. package/src/console/ui/shell/components/ui.tsx +110 -0
  327. package/src/console/ui/shell/index.html +12 -0
  328. package/src/console/ui/shell/layout/Shell.tsx +95 -0
  329. package/src/console/ui/shell/main.tsx +281 -0
  330. package/src/console/ui/shell/panels/Access.tsx +5 -0
  331. package/src/console/ui/shell/panels/Ai.tsx +5 -0
  332. package/src/console/ui/shell/panels/Architecture.tsx +5 -0
  333. package/src/console/ui/shell/panels/Channels.tsx +5 -0
  334. package/src/console/ui/shell/panels/Clock.tsx +5 -0
  335. package/src/console/ui/shell/panels/Diff.tsx +5 -0
  336. package/src/console/ui/shell/panels/Flows.tsx +5 -0
  337. package/src/console/ui/shell/panels/Gates.tsx +5 -0
  338. package/src/console/ui/shell/panels/Overview.tsx +6 -0
  339. package/src/console/ui/shell/panels/Plugins.tsx +5 -0
  340. package/src/console/ui/shell/panels/Runs.tsx +5 -0
  341. package/src/console/ui/shell/panels/Signals.tsx +5 -0
  342. package/src/console/ui/shell/panels/Store.tsx +5 -0
  343. package/src/console/ui/shell/panels/Traces.tsx +5 -0
  344. package/src/console/ui/shell/panels/Vault.tsx +5 -0
  345. package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
  346. package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
  347. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
  348. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
  349. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
  350. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
  351. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
  352. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
  353. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
  354. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
  355. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
  356. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
  357. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
  358. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
  359. package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
  360. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
  361. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
  362. package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
  363. package/src/console/ui/shell/setup/Wizard.tsx +189 -0
  364. package/src/console/ui/shell/styles.css +75 -0
  365. package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
  366. package/src/console/ui/signals/a11y.test.tsx +99 -0
  367. package/src/console/ui/signals/confirmation.test.ts +39 -0
  368. package/src/console/ui/signals/confirmation.ts +63 -0
  369. package/src/console/ui/signals/dry-run.test.ts +18 -0
  370. package/src/console/ui/signals/dry-run.ts +36 -0
  371. package/src/console/ui/signals/durable.test.ts +22 -0
  372. package/src/console/ui/signals/durable.ts +41 -0
  373. package/src/console/ui/signals/findings.ts +33 -0
  374. package/src/console/ui/signals/fixture.ts +242 -0
  375. package/src/console/ui/signals/group.test.ts +32 -0
  376. package/src/console/ui/signals/group.ts +49 -0
  377. package/src/console/ui/signals/index.ts +52 -0
  378. package/src/console/ui/signals/monitor.test.ts +30 -0
  379. package/src/console/ui/signals/monitor.ts +79 -0
  380. package/src/console/ui/signals/schema-form.test.ts +34 -0
  381. package/src/console/ui/signals/schema-form.ts +112 -0
  382. package/src/console/ui/signals/search.ts +102 -0
  383. package/src/console/ui/signals/types.ts +71 -0
  384. package/src/console/ui/store/StoreA11yView.tsx +199 -0
  385. package/src/console/ui/store/a11y.test.tsx +99 -0
  386. package/src/console/ui/store/cache-view.test.ts +13 -0
  387. package/src/console/ui/store/cache-view.ts +36 -0
  388. package/src/console/ui/store/confirmation.test.ts +38 -0
  389. package/src/console/ui/store/confirmation.ts +55 -0
  390. package/src/console/ui/store/dry-run.test.ts +15 -0
  391. package/src/console/ui/store/dry-run.ts +29 -0
  392. package/src/console/ui/store/fixture.ts +163 -0
  393. package/src/console/ui/store/group.test.ts +21 -0
  394. package/src/console/ui/store/group.ts +41 -0
  395. package/src/console/ui/store/index.ts +40 -0
  396. package/src/console/ui/store/search.ts +78 -0
  397. package/src/console/ui/store/types.ts +65 -0
  398. package/src/console/ui/store/will-not-fire.test.ts +19 -0
  399. package/src/console/ui/store/will-not-fire.ts +40 -0
  400. package/src/console/ui/traces/TracesA11yView.tsx +200 -0
  401. package/src/console/ui/traces/a11y.test.tsx +97 -0
  402. package/src/console/ui/traces/chain.test.ts +61 -0
  403. package/src/console/ui/traces/chain.ts +144 -0
  404. package/src/console/ui/traces/critical-path.test.ts +24 -0
  405. package/src/console/ui/traces/critical-path.ts +59 -0
  406. package/src/console/ui/traces/filter.test.ts +78 -0
  407. package/src/console/ui/traces/filter.ts +112 -0
  408. package/src/console/ui/traces/fixture.ts +126 -0
  409. package/src/console/ui/traces/fold.test.ts +67 -0
  410. package/src/console/ui/traces/fold.ts +170 -0
  411. package/src/console/ui/traces/index.ts +64 -0
  412. package/src/console/ui/traces/mini.ts +65 -0
  413. package/src/console/ui/traces/replay.test.ts +24 -0
  414. package/src/console/ui/traces/replay.ts +35 -0
  415. package/src/console/ui/traces/sampling.test.ts +26 -0
  416. package/src/console/ui/traces/sampling.ts +66 -0
  417. package/src/console/ui/traces/search.ts +148 -0
  418. package/src/console/ui/traces/tier.ts +72 -0
  419. package/src/console/ui/traces/types.ts +125 -0
  420. package/src/console/ui/tsconfig.json +20 -0
  421. package/src/console/ui/vault/VaultA11yView.tsx +177 -0
  422. package/src/console/ui/vault/a11y.test.tsx +97 -0
  423. package/src/console/ui/vault/blast-radius.test.ts +35 -0
  424. package/src/console/ui/vault/blast-radius.ts +55 -0
  425. package/src/console/ui/vault/confirmation.test.ts +41 -0
  426. package/src/console/ui/vault/confirmation.ts +39 -0
  427. package/src/console/ui/vault/dormant.test.ts +37 -0
  428. package/src/console/ui/vault/dormant.ts +28 -0
  429. package/src/console/ui/vault/export-safe.test.ts +30 -0
  430. package/src/console/ui/vault/export-safe.ts +65 -0
  431. package/src/console/ui/vault/fixture.ts +75 -0
  432. package/src/console/ui/vault/group.test.ts +25 -0
  433. package/src/console/ui/vault/group.ts +50 -0
  434. package/src/console/ui/vault/index.ts +45 -0
  435. package/src/console/ui/vault/search.ts +62 -0
  436. package/src/console/ui/vault/types.ts +57 -0
  437. package/src/console/ui/vite.config.ts +84 -0
  438. package/src/console/xss.gate.test.ts +118 -0
  439. package/src/docker/compose.ts +226 -0
  440. package/src/docker/credentials.ts +25 -0
  441. package/src/docker/derive.ts +83 -0
  442. package/src/docker/docker.test.ts +185 -0
  443. package/src/docker/dockerfile.integration.test.ts +170 -0
  444. package/src/docker/dockerfile.ts +39 -0
  445. package/src/docker/helpers.ts +103 -0
  446. package/src/docker/index.ts +52 -0
  447. package/src/docker/pin.ts +90 -0
  448. package/src/docker/recipes/index.ts +33 -0
  449. package/src/docker/recipes/postgres.ts +18 -0
  450. package/src/docker/recipes/redis.ts +18 -0
  451. package/src/docker/stack.integration.test.ts +140 -0
  452. package/src/docker/stack.ts +62 -0
  453. package/src/docker/types.ts +134 -0
  454. package/src/drivers/ai-anthropic.ts +128 -0
  455. package/src/drivers/ai-mock.ts +82 -0
  456. package/src/drivers/ai-openai-compatible.ts +139 -0
  457. package/src/drivers/ai-providers.test.ts +163 -0
  458. package/src/drivers/ai-types.ts +83 -0
  459. package/src/drivers/bun-native-completeness.test.ts +155 -0
  460. package/src/drivers/channel-console.ts +118 -0
  461. package/src/drivers/channel-fcm.ts +96 -0
  462. package/src/drivers/channel-resend.ts +27 -0
  463. package/src/drivers/channel-smtp.ts +33 -0
  464. package/src/drivers/channel-types.ts +160 -0
  465. package/src/drivers/channel-unifonic.ts +79 -0
  466. package/src/drivers/channel-wa-cloud.ts +84 -0
  467. package/src/drivers/channel-webpush.ts +317 -0
  468. package/src/drivers/conformance.test.ts +89 -0
  469. package/src/drivers/conformance.ts +162 -0
  470. package/src/drivers/fs.ts +73 -0
  471. package/src/drivers/index.ts +194 -0
  472. package/src/drivers/kv-lua.ts +222 -0
  473. package/src/drivers/memory.ts +472 -0
  474. package/src/drivers/pgvector.ts +130 -0
  475. package/src/drivers/postgres.ts +221 -0
  476. package/src/drivers/redis.ts +254 -0
  477. package/src/drivers/s3.ts +129 -0
  478. package/src/drivers/signal-engine.ts +690 -0
  479. package/src/drivers/signal-memory.ts +27 -0
  480. package/src/drivers/signal-nats.ts +131 -0
  481. package/src/drivers/signal-postgres.ts +1089 -0
  482. package/src/drivers/signal-redis.ts +275 -0
  483. package/src/drivers/signal-types.ts +328 -0
  484. package/src/drivers/sqlite.ts +53 -0
  485. package/src/drivers/types.ts +334 -0
  486. package/src/drivers/vault-dotenv-parse.ts +56 -0
  487. package/src/drivers/vault-env.ts +101 -0
  488. package/src/drivers/vault-infisical.ts +61 -0
  489. package/src/drivers/vault-managed.ts +42 -0
  490. package/src/drivers/vault-memory.ts +38 -0
  491. package/src/drivers/vault-openbao.ts +80 -0
  492. package/src/drivers/vault-sops.ts +252 -0
  493. package/src/drivers/vault-types.ts +84 -0
  494. package/src/elements/ai/declare.ts +206 -0
  495. package/src/elements/ai/eval.ts +113 -0
  496. package/src/elements/ai/pii.ts +108 -0
  497. package/src/elements/ai/runtime.ts +540 -0
  498. package/src/elements/ai/schema.ts +194 -0
  499. package/src/elements/ai.test.ts +393 -0
  500. package/src/elements/ai.ts +56 -0
  501. package/src/elements/channel/consent.ts +81 -0
  502. package/src/elements/channel/costs.test.ts +62 -0
  503. package/src/elements/channel/costs.ts +130 -0
  504. package/src/elements/channel/declare.ts +141 -0
  505. package/src/elements/channel/email-auth.test.ts +47 -0
  506. package/src/elements/channel/email-auth.ts +109 -0
  507. package/src/elements/channel/locale.ts +97 -0
  508. package/src/elements/channel/mask.test.ts +19 -0
  509. package/src/elements/channel/mask.ts +60 -0
  510. package/src/elements/channel/mime.ts +23 -0
  511. package/src/elements/channel/outcomes.test.ts +40 -0
  512. package/src/elements/channel/outcomes.ts +126 -0
  513. package/src/elements/channel/receipts.ts +121 -0
  514. package/src/elements/channel/runtime.ts +500 -0
  515. package/src/elements/channel/suppression.ts +136 -0
  516. package/src/elements/channel.test.ts +232 -0
  517. package/src/elements/channel.ts +109 -0
  518. package/src/elements/clock/actions.ts +170 -0
  519. package/src/elements/clock/declare.ts +58 -0
  520. package/src/elements/clock/dst.ts +197 -0
  521. package/src/elements/clock/durable.ts +140 -0
  522. package/src/elements/clock/duration.ts +29 -0
  523. package/src/elements/clock/health.test.ts +103 -0
  524. package/src/elements/clock/health.ts +112 -0
  525. package/src/elements/clock/leader.ts +127 -0
  526. package/src/elements/clock/reconcile.ts +241 -0
  527. package/src/elements/clock/runtime.ts +243 -0
  528. package/src/elements/clock/schedule.ts +262 -0
  529. package/src/elements/clock/time-travel.ts +53 -0
  530. package/src/elements/clock.test.ts +365 -0
  531. package/src/elements/clock.ts +80 -0
  532. package/src/elements/gate/declare.ts +134 -0
  533. package/src/elements/gate/permissions.ts +104 -0
  534. package/src/elements/gate/runtime.ts +177 -0
  535. package/src/elements/gate/strategies.ts +388 -0
  536. package/src/elements/gate.test.ts +145 -0
  537. package/src/elements/gate.ts +41 -0
  538. package/src/elements/index.ts +169 -0
  539. package/src/elements/signal/chaos-child.ts +47 -0
  540. package/src/elements/signal/declare.ts +77 -0
  541. package/src/elements/signal/dry-run-replay.test.ts +95 -0
  542. package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
  543. package/src/elements/signal/reconcile.test.ts +23 -0
  544. package/src/elements/signal/reconcile.ts +122 -0
  545. package/src/elements/signal/runtime.ts +94 -0
  546. package/src/elements/signal.test.ts +457 -0
  547. package/src/elements/signal.ts +26 -0
  548. package/src/elements/store/cache.ts +197 -0
  549. package/src/elements/store/classify.ts +125 -0
  550. package/src/elements/store/declare.ts +200 -0
  551. package/src/elements/store/files-policy.test.ts +31 -0
  552. package/src/elements/store/files-policy.ts +70 -0
  553. package/src/elements/store/replica.ts +68 -0
  554. package/src/elements/store/runtime.ts +393 -0
  555. package/src/elements/store/sql-condition.ts +205 -0
  556. package/src/elements/store/sql-session.ts +579 -0
  557. package/src/elements/store/table.ts +282 -0
  558. package/src/elements/store.test.ts +370 -0
  559. package/src/elements/store.ts +99 -0
  560. package/src/elements/vault/declare.ts +143 -0
  561. package/src/elements/vault/fingerprint.ts +30 -0
  562. package/src/elements/vault/redact.ts +52 -0
  563. package/src/elements/vault/runtime.ts +461 -0
  564. package/src/elements/vault.test.ts +296 -0
  565. package/src/elements/vault.ts +44 -0
  566. package/src/index.ts +183 -0
  567. package/src/kernel/adopt-routes.ts +194 -0
  568. package/src/kernel/app.ts +1068 -0
  569. package/src/kernel/auth-resolve.ts +93 -0
  570. package/src/kernel/boot.test.ts +173 -0
  571. package/src/kernel/boot.ts +439 -0
  572. package/src/kernel/budget-entry.ts +55 -0
  573. package/src/kernel/budget.test.ts +19 -0
  574. package/src/kernel/call.test.ts +83 -0
  575. package/src/kernel/capability.ts +113 -0
  576. package/src/kernel/dry-run.test.ts +64 -0
  577. package/src/kernel/dry-run.ts +171 -0
  578. package/src/kernel/effects.test.ts +89 -0
  579. package/src/kernel/effects.ts +140 -0
  580. package/src/kernel/errors.registry.test.ts +39 -0
  581. package/src/kernel/errors.ts +225 -0
  582. package/src/kernel/flow.test.ts +154 -0
  583. package/src/kernel/flow.ts +290 -0
  584. package/src/kernel/fx.test.ts +245 -0
  585. package/src/kernel/fx.ts +996 -0
  586. package/src/kernel/hook-timing.test.ts +72 -0
  587. package/src/kernel/hook-timing.ts +190 -0
  588. package/src/kernel/hooks.test.ts +181 -0
  589. package/src/kernel/hooks.ts +275 -0
  590. package/src/kernel/index.ts +278 -0
  591. package/src/kernel/journal.ts +405 -0
  592. package/src/kernel/journey.ts +75 -0
  593. package/src/kernel/on.ts +74 -0
  594. package/src/kernel/pipeline.test.ts +349 -0
  595. package/src/kernel/pipeline.ts +245 -0
  596. package/src/kernel/plug.ts +82 -0
  597. package/src/kernel/plugin/capabilities.test.ts +84 -0
  598. package/src/kernel/plugin/conflicts.test.ts +106 -0
  599. package/src/kernel/plugin/decorate.test.ts +111 -0
  600. package/src/kernel/plugin/scoping.test.ts +138 -0
  601. package/src/kernel/plugin.ts +485 -0
  602. package/src/kernel/rate-limit.ts +25 -0
  603. package/src/kernel/registry.ts +398 -0
  604. package/src/kernel/router.test.ts +114 -0
  605. package/src/kernel/router.ts +556 -0
  606. package/src/kernel/routing-budget.test.ts +19 -0
  607. package/src/kernel/run-telemetry.ts +70 -0
  608. package/src/kernel/triggers.ts +324 -0
  609. package/src/kernel/unit.ts +88 -0
  610. package/src/manifest/diff.test.ts +866 -0
  611. package/src/manifest/diff.ts +1670 -0
  612. package/src/manifest/fixtures/base.manifest.json +112 -0
  613. package/src/manifest/fixtures/skyport.excerpt.json +51 -0
  614. package/src/manifest/fixtures/skyport.manifest.json +153 -0
  615. package/src/manifest/index.ts +27 -0
  616. package/src/manifest/types.ts +358 -0
  617. package/src/manifest/undeclared.test.ts +82 -0
  618. package/src/manifest/undeclared.ts +65 -0
  619. package/src/manifest/validate.test.ts +105 -0
  620. package/src/manifest/validate.ts +174 -0
  621. package/src/mcp/authorization.ts +340 -0
  622. package/src/mcp/confirmation.ts +174 -0
  623. package/src/mcp/data.ts +90 -0
  624. package/src/mcp/index.ts +80 -0
  625. package/src/mcp/injection.gate.test.ts +176 -0
  626. package/src/mcp/mcp.test.ts +348 -0
  627. package/src/mcp/protocol.ts +172 -0
  628. package/src/mcp/server.ts +283 -0
  629. package/src/mcp/session.ts +139 -0
  630. package/src/mcp/tools.ts +391 -0
  631. package/src/plugins/catalogue.test.ts +48 -0
  632. package/src/plugins/catalogue.ts +113 -0
  633. package/src/plugins/node-import-scan.test.ts +28 -0
  634. package/src/plugins/node-import-scan.ts +98 -0
  635. package/src/plugins/supply-chain.test.ts +48 -0
  636. package/src/plugins/supply-chain.ts +460 -0
  637. package/src/release/index.ts +30 -0
  638. package/src/release/limits.ts +20 -0
  639. package/src/release/measure.ts +443 -0
  640. package/src/release/publish.ts +56 -0
  641. package/src/runs/bench.test.ts +93 -0
  642. package/src/runs/collect.ts +144 -0
  643. package/src/runs/drivers/clickhouse.ts +108 -0
  644. package/src/runs/drivers/files.ts +201 -0
  645. package/src/runs/drivers/memory.ts +94 -0
  646. package/src/runs/drivers/postgres.ts +110 -0
  647. package/src/runs/duckdb.ts +99 -0
  648. package/src/runs/index.ts +82 -0
  649. package/src/runs/outlier.ts +180 -0
  650. package/src/runs/parquet.ts +210 -0
  651. package/src/runs/privacy.ts +49 -0
  652. package/src/runs/runs.test.ts +324 -0
  653. package/src/runs/runtime.ts +229 -0
  654. package/src/runs/shred.ts +243 -0
  655. package/src/runs/telemetry.ts +10 -0
  656. package/src/runs/types.ts +179 -0
  657. package/src/runtime/bun.ts +140 -0
  658. package/src/runtime/cold-start.bench.ts +20 -0
  659. package/src/runtime/index.ts +46 -0
  660. package/src/runtime/primitives.ts +242 -0
  661. package/src/runtime/security.test.ts +170 -0
  662. package/src/runtime/security.ts +168 -0
  663. package/src/runtime/serve.test.ts +223 -0
  664. package/src/runtime/types.ts +217 -0
  665. package/src/runtime/web-standard.ts +77 -0
  666. package/src/test/create-test-app.test.ts +161 -0
  667. package/src/test/create-test-app.ts +533 -0
  668. package/src/test/index.ts +21 -0
  669. package/src/test/provisions.integration.test.ts +174 -0
  670. package/src/upgrade/codemods.test.ts +58 -0
  671. package/src/upgrade/codemods.ts +83 -0
  672. package/src/validation/index.ts +23 -0
  673. package/src/validation/standard-schema.test.ts +96 -0
  674. package/src/validation/standard-schema.ts +316 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * `oke images list` — show configured images (writes nothing).
3
+ * `oke images pin` — tags → digests in `oke.images.lock`.
4
+ */
5
+
6
+ import { resolve } from "node:path";
7
+ import {
8
+ formatImagesLock,
9
+ pinImages,
10
+ recipeFor,
11
+ type DigestResolver,
12
+ type ImagesLock,
13
+ } from "../docker/index.ts";
14
+ import { wantsJson } from "./args.ts";
15
+ import { EXIT_OK, EXIT_RUNTIME, EXIT_USAGE } from "./exit.ts";
16
+ import { loadOkeConfig, resolveImages } from "./load-config.ts";
17
+
18
+ /** One row in `oke images list`. */
19
+ export interface ImagesListRow {
20
+ readonly role: string;
21
+ readonly recipe: string;
22
+ readonly image: string;
23
+ readonly tag: string;
24
+ readonly digest: string;
25
+ /** Human size when known; `-` when not inspected. */
26
+ readonly size: string;
27
+ }
28
+
29
+ /** Options for {@link runImagesList}. */
30
+ export interface ImagesListOptions {
31
+ readonly cwd?: string;
32
+ readonly configPath?: string;
33
+ readonly images?: Readonly<Record<string, string>>;
34
+ /** Injected lock (tests); defaults to reading `oke.images.lock`. */
35
+ readonly lock?: ImagesLock | null;
36
+ readonly write?: (text: string) => void;
37
+ readonly writeErr?: (text: string) => void;
38
+ readonly json?: boolean;
39
+ }
40
+
41
+ /** Options for {@link runImagesPin}. */
42
+ export interface ImagesPinOptions {
43
+ readonly cwd?: string;
44
+ readonly configPath?: string;
45
+ readonly out?: string;
46
+ readonly images?: Readonly<Record<string, string>>;
47
+ readonly resolveDigest?: DigestResolver;
48
+ readonly write?: (text: string) => void;
49
+ readonly dryRun?: boolean;
50
+ }
51
+
52
+ /**
53
+ * List configured images as recipe / image / tag / digest / size (writes nothing).
54
+ *
55
+ * @param options - Config / images
56
+ */
57
+ export async function runImagesList(
58
+ options: ImagesListOptions = {},
59
+ ): Promise<number> {
60
+ const write = options.write ?? ((t) => process.stdout.write(t));
61
+ const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
62
+ const json = options.json ?? false;
63
+ const cwd = options.cwd ?? process.cwd();
64
+ let images = options.images;
65
+ if (!images) {
66
+ try {
67
+ const loaded = await loadOkeConfig(cwd, options.configPath);
68
+ images = resolveImages(loaded.config);
69
+ } catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ if (json) {
72
+ write(`${JSON.stringify({ ok: false, error: msg }, null, 2)}\n`);
73
+ } else {
74
+ writeErr(`${msg}\n`);
75
+ }
76
+ return EXIT_RUNTIME;
77
+ }
78
+ }
79
+
80
+ const lock =
81
+ options.lock !== undefined
82
+ ? options.lock
83
+ : await readImagesLock(resolve(cwd, "oke.images.lock"));
84
+ const rows = buildImagesListRows(images, lock);
85
+
86
+ if (json) {
87
+ write(`${JSON.stringify({ ok: true, images: rows }, null, 2)}\n`);
88
+ if (rows.length === 0) {
89
+ writeErr("Hint: set images in oke.config.ts — oke images list writes nothing.\n");
90
+ }
91
+ return EXIT_OK;
92
+ }
93
+
94
+ write(formatImagesList(rows));
95
+ return EXIT_OK;
96
+ }
97
+
98
+ /**
99
+ * Build list rows from role→image map + optional lock digests.
100
+ *
101
+ * @param images - Configured images
102
+ * @param lock - Optional pin lock
103
+ */
104
+ export function buildImagesListRows(
105
+ images: Readonly<Record<string, string>>,
106
+ lock: ImagesLock | null,
107
+ ): readonly ImagesListRow[] {
108
+ return Object.entries(images).map(([role, ref]) => {
109
+ const { image, tag, digestFromRef } = splitImageRef(ref);
110
+ let recipe = "-";
111
+ try {
112
+ recipe = recipeFor(ref).id;
113
+ } catch {
114
+ // Unknown image — still list the row; recipe stays "-".
115
+ }
116
+ const digest =
117
+ lock?.images[role]?.digest ?? digestFromRef ?? "-";
118
+ return {
119
+ role,
120
+ recipe,
121
+ image,
122
+ tag,
123
+ digest,
124
+ size: "-",
125
+ };
126
+ });
127
+ }
128
+
129
+ /**
130
+ * Format the human table for `oke images list`.
131
+ *
132
+ * @param rows - Resolved rows
133
+ */
134
+ export function formatImagesList(rows: readonly ImagesListRow[]): string {
135
+ if (rows.length === 0) return "oke images list: no images configured\n";
136
+ const lines = [
137
+ "ROLE RECIPE IMAGE TAG DIGEST SIZE",
138
+ "-------------- --------- ----------------------- ---------- ------------------------- ----",
139
+ ];
140
+ for (const r of rows) {
141
+ lines.push(
142
+ `${pad(r.role, 14)} ${pad(r.recipe, 9)} ${pad(r.image, 23)} ${pad(r.tag, 10)} ${pad(shortDigest(r.digest), 26)} ${r.size}`,
143
+ );
144
+ }
145
+ return `${lines.join("\n")}\n`;
146
+ }
147
+
148
+ /**
149
+ * Pin image tags to digests and write `oke.images.lock`.
150
+ *
151
+ * @param options - Config / resolver
152
+ */
153
+ export async function runImagesPin(
154
+ options: ImagesPinOptions = {},
155
+ ): Promise<number> {
156
+ const write = options.write ?? ((t) => process.stdout.write(t));
157
+ const cwd = options.cwd ?? process.cwd();
158
+ let images = options.images;
159
+ if (!images) {
160
+ try {
161
+ const loaded = await loadOkeConfig(cwd, options.configPath);
162
+ images = resolveImages(loaded.config);
163
+ } catch (err) {
164
+ console.error(err instanceof Error ? err.message : String(err));
165
+ return EXIT_RUNTIME;
166
+ }
167
+ }
168
+ try {
169
+ const lock = await pinImages(images, options.resolveDigest);
170
+ const out = resolve(cwd, options.out ?? "oke.images.lock");
171
+ const body = formatImagesLock(lock);
172
+ if (!options.dryRun) await Bun.write(out, body);
173
+ write(`oke images pin: wrote ${out} (${Object.keys(lock.images).length} image(s))\n`);
174
+ return EXIT_OK;
175
+ } catch (err) {
176
+ console.error(err instanceof Error ? err.message : String(err));
177
+ return EXIT_RUNTIME;
178
+ }
179
+ }
180
+
181
+ /**
182
+ * CLI entry for `oke images <sub>`.
183
+ *
184
+ * @param args - Args after `images`
185
+ */
186
+ export async function imagesCli(args: readonly string[]): Promise<number> {
187
+ const [sub, ...rest] = args;
188
+ if (sub === "list") {
189
+ let configPath: string | undefined;
190
+ const json = wantsJson(rest);
191
+ for (let i = 0; i < rest.length; i++) {
192
+ const a = rest[i]!;
193
+ if (a === "--config" || a === "-c") configPath = rest[++i];
194
+ else if (a === "--help" || a === "-h") {
195
+ console.log(`oke images list [--config|-c oke.config.ts] [--json|-j]
196
+
197
+ List configured images as recipe / image / tag / digest / size. Writes nothing.
198
+ Digest comes from oke.images.lock when present; size is "-" until inspected.
199
+ --json Machine-parseable JSON on stdout; hints on stderr.
200
+ `);
201
+ return EXIT_OK;
202
+ }
203
+ }
204
+ return runImagesList({ configPath, json });
205
+ }
206
+ if (sub === "pin") {
207
+ let configPath: string | undefined;
208
+ let out: string | undefined;
209
+ for (let i = 0; i < rest.length; i++) {
210
+ const a = rest[i]!;
211
+ if (a === "--config" || a === "-c") configPath = rest[++i];
212
+ else if (a === "--out" || a === "-o") out = rest[++i];
213
+ else if (a === "--help" || a === "-h") {
214
+ console.log(`oke images pin [--out|-o oke.images.lock] [--config|-c path]
215
+
216
+ Resolve image tags to digests and write oke.images.lock.
217
+ `);
218
+ return EXIT_OK;
219
+ }
220
+ }
221
+ return runImagesPin({ configPath, out });
222
+ }
223
+ console.error("Usage: oke images list|pin");
224
+ return EXIT_USAGE;
225
+ }
226
+
227
+ function splitImageRef(ref: string): {
228
+ image: string;
229
+ tag: string;
230
+ digestFromRef: string | null;
231
+ } {
232
+ const at = ref.indexOf("@");
233
+ if (at !== -1) {
234
+ const left = ref.slice(0, at);
235
+ const digest = ref.slice(at + 1);
236
+ const colon = left.lastIndexOf(":");
237
+ if (colon > left.lastIndexOf("/")) {
238
+ return {
239
+ image: left.slice(0, colon),
240
+ tag: left.slice(colon + 1),
241
+ digestFromRef: digest,
242
+ };
243
+ }
244
+ return { image: left, tag: "-", digestFromRef: digest };
245
+ }
246
+ const colon = ref.lastIndexOf(":");
247
+ if (colon > ref.lastIndexOf("/")) {
248
+ return {
249
+ image: ref.slice(0, colon),
250
+ tag: ref.slice(colon + 1),
251
+ digestFromRef: null,
252
+ };
253
+ }
254
+ return { image: ref, tag: "latest", digestFromRef: null };
255
+ }
256
+
257
+ async function readImagesLock(path: string): Promise<ImagesLock | null> {
258
+ const file = Bun.file(path);
259
+ if (!(await file.exists())) return null;
260
+ try {
261
+ return (await file.json()) as ImagesLock;
262
+ } catch {
263
+ return null;
264
+ }
265
+ }
266
+
267
+ function shortDigest(digest: string): string {
268
+ if (digest === "-") return digest;
269
+ if (digest.startsWith("sha256:") && digest.length > 19) {
270
+ return `${digest.slice(0, 19)}…`;
271
+ }
272
+ return digest;
273
+ }
274
+
275
+ function pad(s: string, n: number): string {
276
+ return s.length >= n ? s.slice(0, n) : s + " ".repeat(n - s.length);
277
+ }
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * `oke` CLI entry.
4
+ */
5
+
6
+ import { branchCli } from "./branch.ts";
7
+ import { buildCli } from "./build.ts";
8
+ import { clientAddCli } from "./client-add.ts";
9
+ import { completionCli } from "./completion.ts";
10
+ import { devCli } from "./dev.ts";
11
+ import { doctorCli } from "./doctor.ts";
12
+ import { dockerCli } from "./docker.ts";
13
+ import { evalCli } from "./eval.ts";
14
+ import { EXIT_CODE_HELP, EXIT_OK, EXIT_USAGE } from "./exit.ts";
15
+ import { gatesListCli } from "./gates-list.ts";
16
+ import { imagesCli } from "./images.ts";
17
+ import { privacyEraseCli } from "./privacy-erase.ts";
18
+ import { formatOkeHelp } from "./registry.ts";
19
+ import { schemaCli } from "./schema.ts";
20
+ import { stackCli } from "./stack.ts";
21
+ import { startCli } from "./start.ts";
22
+ import { upgradeCli } from "./upgrade.ts";
23
+ import { vaultCli } from "./vault-cmd.ts";
24
+
25
+ const argv = process.argv.slice(2);
26
+ const [cmd, sub, ...rest] = argv;
27
+
28
+ if (cmd === "dev") {
29
+ process.exit(await devCli(sub ? [sub, ...rest] : rest));
30
+ }
31
+
32
+ if (cmd === "start") {
33
+ process.exit(await startCli(sub ? [sub, ...rest] : rest));
34
+ }
35
+
36
+ if (cmd === "doctor") {
37
+ process.exit(await doctorCli(sub ? [sub, ...rest] : rest));
38
+ }
39
+
40
+ if (cmd === "stack") {
41
+ process.exit(await stackCli(sub ? [sub, ...rest] : rest));
42
+ }
43
+
44
+ if (cmd === "schema") {
45
+ process.exit(await schemaCli(sub ? [sub, ...rest] : rest));
46
+ }
47
+
48
+ if (cmd === "client" && sub === "add") {
49
+ process.exit(await clientAddCli(rest));
50
+ }
51
+
52
+ if (cmd === "vault") {
53
+ process.exit(await vaultCli(sub ? [sub, ...rest] : rest));
54
+ }
55
+
56
+ if (cmd === "docker") {
57
+ process.exit(await dockerCli(sub ? [sub, ...rest] : rest));
58
+ }
59
+
60
+ if (cmd === "images") {
61
+ process.exit(await imagesCli(sub ? [sub, ...rest] : rest));
62
+ }
63
+
64
+ if (cmd === "build") {
65
+ process.exit(await buildCli(sub ? [sub, ...rest] : rest));
66
+ }
67
+
68
+ if (cmd === "eval") {
69
+ process.exit(await evalCli(sub ? [sub, ...rest] : rest));
70
+ }
71
+
72
+ if (cmd === "branch") {
73
+ process.exit(await branchCli(sub ? [sub, ...rest] : rest));
74
+ }
75
+
76
+ if (cmd === "privacy" && sub === "erase") {
77
+ process.exit(await privacyEraseCli(rest));
78
+ }
79
+
80
+ if (cmd === "upgrade") {
81
+ process.exit(await upgradeCli(sub ? [sub, ...rest] : rest));
82
+ }
83
+
84
+ if (cmd === "gates" && sub === "list") {
85
+ process.exit(await gatesListCli(rest));
86
+ }
87
+
88
+ if (cmd === "completion") {
89
+ process.exit(completionCli(sub ? [sub, ...rest] : rest));
90
+ }
91
+
92
+ if (cmd === undefined || cmd === "--help" || cmd === "-h" || cmd === "help") {
93
+ console.log(`${formatOkeHelp()}${EXIT_CODE_HELP}`);
94
+ process.exit(cmd ? EXIT_OK : EXIT_USAGE);
95
+ }
96
+
97
+ console.error(`Unknown command: ${cmd}${sub ? ` ${sub}` : ""}`);
98
+ console.error("Run `oke --help` for usage.");
99
+ process.exit(EXIT_USAGE);
@@ -0,0 +1,129 @@
1
+ /**
2
+ * `--json` emits only machine-parseable JSON on stdout.
3
+ */
4
+
5
+ import { describe, expect, test } from "bun:test";
6
+ import type { Manifest } from "../manifest/types.ts";
7
+ import { runDoctor } from "./doctor.ts";
8
+ import { gatesList } from "./gates-list.ts";
9
+ import { runImagesList } from "./images.ts";
10
+ import { runStackPreview } from "./stack.ts";
11
+
12
+ describe("oke --json stdout discipline", () => {
13
+ test("doctor --json is valid JSON with nothing else on stdout", async () => {
14
+ let out = "";
15
+ let err = "";
16
+ const { code, findings } = await runDoctor({
17
+ secrets: ["MISSING"],
18
+ env: () => undefined,
19
+ ports: [],
20
+ currentSchemaFingerprint: null,
21
+ json: true,
22
+ write: (t) => {
23
+ out += t;
24
+ },
25
+ writeErr: (t) => {
26
+ err += t;
27
+ },
28
+ });
29
+ expect(code).toBe(2);
30
+ const parsed = JSON.parse(out.trim()) as {
31
+ ok: boolean;
32
+ findings: unknown[];
33
+ };
34
+ expect(parsed.ok).toBe(false);
35
+ expect(parsed.findings).toHaveLength(findings.length);
36
+ expect(err).toContain("Hint:");
37
+ // stdout is exactly one JSON document (+ trailing newline)
38
+ expect(out.trim().startsWith("{")).toBe(true);
39
+ expect(() => JSON.parse(out.trim())).not.toThrow();
40
+ });
41
+
42
+ test("stack --json is valid JSON only on stdout", async () => {
43
+ let out = "";
44
+ const code = await runStackPreview({
45
+ images: { "store.sql": "postgres:16-alpine" },
46
+ json: true,
47
+ write: (t) => {
48
+ out += t;
49
+ },
50
+ writeErr: () => {},
51
+ });
52
+ expect(code).toBe(0);
53
+ const parsed = JSON.parse(out.trim()) as {
54
+ ok: boolean;
55
+ rows: { role: string }[];
56
+ };
57
+ expect(parsed.ok).toBe(true);
58
+ expect(parsed.rows[0]?.role).toBe("store.sql");
59
+ expect(out.includes("ROLE")).toBe(false);
60
+ });
61
+
62
+ test("images list --json is valid JSON only on stdout", async () => {
63
+ let out = "";
64
+ let err = "";
65
+ const code = await runImagesList({
66
+ images: { "store.kv": "redis:7" },
67
+ lock: null,
68
+ json: true,
69
+ write: (t) => {
70
+ out += t;
71
+ },
72
+ writeErr: (t) => {
73
+ err += t;
74
+ },
75
+ });
76
+ expect(code).toBe(0);
77
+ const parsed = JSON.parse(out.trim()) as {
78
+ ok: boolean;
79
+ images: {
80
+ role: string;
81
+ recipe: string;
82
+ image: string;
83
+ tag: string;
84
+ digest: string;
85
+ size: string;
86
+ }[];
87
+ };
88
+ expect(parsed.images).toEqual([
89
+ {
90
+ role: "store.kv",
91
+ recipe: "redis",
92
+ image: "redis",
93
+ tag: "7",
94
+ digest: "-",
95
+ size: "-",
96
+ },
97
+ ]);
98
+ expect(err).toBe("");
99
+ });
100
+
101
+ test("gates list --json is valid JSON only on stdout", async () => {
102
+ const manifest: Manifest = {
103
+ oke: "1.0",
104
+ app: "skyport",
105
+ flows: {
106
+ "bookings.create": { plane: "user", gates: ["booking:create"] },
107
+ },
108
+ };
109
+ let out = "";
110
+ const code = await gatesList({
111
+ manifest,
112
+ json: true,
113
+ write: (t) => {
114
+ out += t;
115
+ },
116
+ writeErr: () => {},
117
+ });
118
+ expect(code).toBe(0);
119
+ const parsed = JSON.parse(out.trim()) as {
120
+ ok: boolean;
121
+ gates: string[];
122
+ };
123
+ expect(parsed.ok).toBe(true);
124
+ expect(parsed.gates).toContain("booking:create");
125
+ expect(out.includes("bookings:create\n") || parsed.gates.includes("bookings:create")).toBe(
126
+ true,
127
+ );
128
+ });
129
+ });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Load `oke.config.ts` / Manifest helpers for CLI commands.
3
+ */
4
+
5
+ import { resolve } from "node:path";
6
+ import type { OkeConfig } from "../config/index.ts";
7
+ import type { Manifest } from "../manifest/types.ts";
8
+
9
+ /** Result of loading project config. */
10
+ export interface LoadedConfig {
11
+ readonly config: OkeConfig;
12
+ readonly path: string;
13
+ }
14
+
15
+ /**
16
+ * Load `oke.config.ts` (or `.js` / `.mts`) from a directory.
17
+ *
18
+ * @param cwd - Project root
19
+ * @param configPath - Optional explicit path
20
+ */
21
+ export async function loadOkeConfig(
22
+ cwd = process.cwd(),
23
+ configPath?: string,
24
+ ): Promise<LoadedConfig> {
25
+ const candidates = configPath
26
+ ? [resolve(cwd, configPath)]
27
+ : [
28
+ resolve(cwd, "oke.config.ts"),
29
+ resolve(cwd, "oke.config.mts"),
30
+ resolve(cwd, "oke.config.js"),
31
+ ];
32
+
33
+ for (const path of candidates) {
34
+ const file = Bun.file(path);
35
+ if (!(await file.exists())) continue;
36
+ const mod = (await import(path)) as { default?: OkeConfig };
37
+ if (!mod.default || typeof mod.default !== "object") {
38
+ throw new Error(`oke: ${path} must default-export defineConfig({...})`);
39
+ }
40
+ return { config: mod.default, path };
41
+ }
42
+ throw new Error(
43
+ `oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`,
44
+ );
45
+ }
46
+
47
+ /**
48
+ * Load a Manifest JSON document.
49
+ *
50
+ * @param path - Manifest path
51
+ */
52
+ export async function loadManifest(path: string): Promise<Manifest> {
53
+ const file = Bun.file(resolve(path));
54
+ if (!(await file.exists())) {
55
+ throw new Error(`oke: manifest not found: ${path}`);
56
+ }
57
+ return (await file.json()) as Manifest;
58
+ }
59
+
60
+ /**
61
+ * Resolve images map from config or Manifest.
62
+ *
63
+ * @param config - Optional config
64
+ * @param manifest - Optional manifest
65
+ */
66
+ export function resolveImages(
67
+ config?: OkeConfig,
68
+ manifest?: Manifest,
69
+ ): Readonly<Record<string, string>> {
70
+ return config?.images ?? manifest?.images ?? {};
71
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Bind MCP tool adapters to the live Console state (same Manifest / runs).
3
+ *
4
+ * Used by `oke dev` so port 6535 is not a separate mock context.
5
+ */
6
+
7
+ import {
8
+ createFileDiff,
9
+ emitStructuralDiff,
10
+ } from "../console/server/structural.ts";
11
+ import type { Manifest } from "../manifest/types.ts";
12
+ import type { WideEvent } from "../runs/types.ts";
13
+ import type { McpContext } from "../mcp/tools.ts";
14
+
15
+ /**
16
+ * Minimal Console surface MCP needs — duck-typed so tests can pass a
17
+ * partial stand-in without importing the full {@link ConsoleState}.
18
+ */
19
+ export interface McpConsoleSurface {
20
+ /** Live Manifest snapshot (mutated by Console / host). */
21
+ manifest: Manifest | null;
22
+ /** Same runs provider Console panels use. */
23
+ readonly listRuns: () => Promise<readonly WideEvent[]>;
24
+ /** Working-tree root for structural proposals. */
25
+ readonly cwd: string;
26
+ /** Clock shared with Console. */
27
+ readonly now: () => number;
28
+ }
29
+
30
+ /**
31
+ * Create an {@link McpContext} that reads through a live Console surface.
32
+ *
33
+ * @param state - Console state (or test stand-in)
34
+ */
35
+ export function mcpContextFromConsole(state: McpConsoleSurface): McpContext {
36
+ return {
37
+ getManifest: () => state.manifest,
38
+ listRuns: () => state.listRuns(),
39
+ proposeStructural: async (input) =>
40
+ emitStructuralDiff({
41
+ cwd: state.cwd,
42
+ title: input.title,
43
+ relativePath: input.relativePath,
44
+ diff: createFileDiff(input.relativePath, input.contents),
45
+ actorId: input.operatorId,
46
+ reason: input.reason,
47
+ now: state.now,
48
+ }),
49
+ };
50
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * `oke privacy erase --subject <id>` — crypto-shredding.
3
+ */
4
+
5
+ import {
6
+ createMemorySubjectKeys,
7
+ privacyErase,
8
+ type PrivacyEraseResult,
9
+ type SubjectKeyVault,
10
+ } from "../runs/index.ts";
11
+
12
+ /** Options for {@link runPrivacyErase}. */
13
+ export interface RunPrivacyEraseOptions {
14
+ /** Subject id (required). */
15
+ readonly subjectId: string;
16
+ /** Injected subject-key vault (tests). */
17
+ readonly subjectKeys?: SubjectKeyVault;
18
+ /** Write stdout. */
19
+ readonly write?: (text: string) => void;
20
+ }
21
+
22
+ /**
23
+ * Library entry for privacy erase.
24
+ *
25
+ * @param options - Subject + vault
26
+ */
27
+ export function runPrivacyErase(
28
+ options: RunPrivacyEraseOptions,
29
+ ): PrivacyEraseResult {
30
+ const keys = options.subjectKeys ?? createMemorySubjectKeys();
31
+ return privacyErase({
32
+ subjectId: options.subjectId,
33
+ subjectKeys: keys,
34
+ write: options.write,
35
+ });
36
+ }
37
+
38
+ /**
39
+ * CLI entry — parse `--subject` and erase.
40
+ *
41
+ * @param argv - Args after `privacy erase`
42
+ */
43
+ export async function privacyEraseCli(argv: readonly string[]): Promise<number> {
44
+ if (argv.includes("--help") || argv.includes("-h")) {
45
+ console.log(`oke privacy erase --subject|-s <id>
46
+
47
+ Crypto-shred a subject's archived fields by deleting their per-subject
48
+ Vault key. --subject is required (no default). Parquet partitions are not rewritten.
49
+ `);
50
+ return 0;
51
+ }
52
+
53
+ let subjectId: string | undefined;
54
+ for (let i = 0; i < argv.length; i++) {
55
+ const a = argv[i]!;
56
+ if (a === "--subject" || a === "-s") {
57
+ subjectId = argv[++i];
58
+ continue;
59
+ }
60
+ if (a.startsWith("--subject=")) {
61
+ subjectId = a.slice("--subject=".length);
62
+ }
63
+ }
64
+
65
+ if (!subjectId) {
66
+ console.error("oke privacy erase: --subject|-s <id> is required");
67
+ return 1;
68
+ }
69
+
70
+ // Production wires Vault from config; CLI without a vault reports no-key.
71
+ runPrivacyErase({ subjectId });
72
+ return 0;
73
+ }