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.
- package/AGENTS.md +91 -0
- package/README.md +327 -0
- package/docs/spec/complete-example.md +1188 -0
- package/docs/spec/console.md +739 -0
- package/docs/spec/four-applications.md +1188 -0
- package/docs/spec/unified-theory.md +489 -0
- package/package.json +152 -0
- package/spec/manifest.v1.schema.json +624 -0
- package/src/auth/api-keys.ts +168 -0
- package/src/auth/attenuation.ts +116 -0
- package/src/auth/auth.test.ts +273 -0
- package/src/auth/cross-plane.ts +98 -0
- package/src/auth/index.ts +112 -0
- package/src/auth/invites.ts +66 -0
- package/src/auth/invoke-as.ts +49 -0
- package/src/auth/operator.ts +178 -0
- package/src/auth/planes.ts +102 -0
- package/src/auth/plugin.ts +44 -0
- package/src/auth/roles.ts +84 -0
- package/src/auth/sessions.ts +418 -0
- package/src/auth/tables.ts +131 -0
- package/src/cli/args.ts +50 -0
- package/src/cli/branch.ts +75 -0
- package/src/cli/build.ts +86 -0
- package/src/cli/client-add.test.ts +140 -0
- package/src/cli/client-add.ts +164 -0
- package/src/cli/completion.test.ts +58 -0
- package/src/cli/completion.ts +296 -0
- package/src/cli/dev-app-runner.ts +77 -0
- package/src/cli/dev.test.ts +435 -0
- package/src/cli/dev.ts +594 -0
- package/src/cli/doc-drift.test.ts +146 -0
- package/src/cli/doc-drift.ts +397 -0
- package/src/cli/docker-cli.test.ts +221 -0
- package/src/cli/docker.ts +127 -0
- package/src/cli/doctor-diff-examples.ts +92 -0
- package/src/cli/doctor-diff.test.ts +91 -0
- package/src/cli/doctor-diff.ts +274 -0
- package/src/cli/doctor-pii.test.ts +98 -0
- package/src/cli/doctor-pii.ts +151 -0
- package/src/cli/doctor.test.ts +150 -0
- package/src/cli/doctor.ts +223 -0
- package/src/cli/eval.ts +122 -0
- package/src/cli/exit.ts +19 -0
- package/src/cli/gates-list.test.ts +47 -0
- package/src/cli/gates-list.ts +84 -0
- package/src/cli/images.ts +277 -0
- package/src/cli/index.ts +99 -0
- package/src/cli/json-out.test.ts +129 -0
- package/src/cli/load-config.ts +71 -0
- package/src/cli/mcp-from-console.ts +50 -0
- package/src/cli/privacy-erase.ts +73 -0
- package/src/cli/registry.ts +455 -0
- package/src/cli/safe-defaults.test.ts +92 -0
- package/src/cli/schema.ts +196 -0
- package/src/cli/stack.ts +82 -0
- package/src/cli/start.ts +106 -0
- package/src/cli/upgrade.ts +105 -0
- package/src/cli/vault-cmd.ts +140 -0
- package/src/client/budget-entry.ts +34 -0
- package/src/client/budget.test.ts +17 -0
- package/src/client/create.test.ts +159 -0
- package/src/client/create.ts +152 -0
- package/src/client/errors.ts +60 -0
- package/src/client/index.ts +35 -0
- package/src/client/notes-contract.test.ts +289 -0
- package/src/client/transport.test.ts +123 -0
- package/src/client/transport.ts +254 -0
- package/src/client/types.ts +282 -0
- package/src/compiler/aot.test.ts +248 -0
- package/src/compiler/aot.ts +182 -0
- package/src/compiler/differential.test.ts +241 -0
- package/src/compiler/dynamic.ts +54 -0
- package/src/compiler/effects-infer.ts +541 -0
- package/src/compiler/emit.ts +40 -0
- package/src/compiler/extract.test.ts +177 -0
- package/src/compiler/extract.ts +1368 -0
- package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
- package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
- package/src/compiler/fixtures/skyport/src/app.ts +10 -0
- package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
- package/src/compiler/fixtures/skyport/src/core.ts +3 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
- package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
- package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
- package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
- package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
- package/src/compiler/fixtures/skyport.expected.json +241 -0
- package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
- package/src/compiler/http-parse.ts +214 -0
- package/src/compiler/index.ts +67 -0
- package/src/compiler/response.ts +89 -0
- package/src/compiler/sucrose.ts +238 -0
- package/src/config/index.ts +167 -0
- package/src/console/budget.test.ts +73 -0
- package/src/console/index.ts +30 -0
- package/src/console/server/access.test.ts +370 -0
- package/src/console/server/access.ts +777 -0
- package/src/console/server/ai.test.ts +172 -0
- package/src/console/server/ai.ts +632 -0
- package/src/console/server/app.ts +294 -0
- package/src/console/server/auth-rate.test.ts +81 -0
- package/src/console/server/auth-rate.ts +72 -0
- package/src/console/server/bind.ts +25 -0
- package/src/console/server/channels.test.ts +179 -0
- package/src/console/server/channels.ts +469 -0
- package/src/console/server/claim.test.ts +66 -0
- package/src/console/server/claim.ts +134 -0
- package/src/console/server/clock.test.ts +239 -0
- package/src/console/server/clock.ts +390 -0
- package/src/console/server/console.test.ts +338 -0
- package/src/console/server/diff.test.ts +299 -0
- package/src/console/server/diff.ts +352 -0
- package/src/console/server/dry-run.audit.test.ts +118 -0
- package/src/console/server/flows-invoke.test.ts +148 -0
- package/src/console/server/flows.ts +3633 -0
- package/src/console/server/gates.test.ts +360 -0
- package/src/console/server/gates.ts +869 -0
- package/src/console/server/index.ts +141 -0
- package/src/console/server/live.test.ts +30 -0
- package/src/console/server/live.ts +109 -0
- package/src/console/server/plugin.ts +50 -0
- package/src/console/server/plugins.test.ts +131 -0
- package/src/console/server/plugins.ts +429 -0
- package/src/console/server/runs-pii.ts +98 -0
- package/src/console/server/security-headers.ts +97 -0
- package/src/console/server/security.gate.test.ts +286 -0
- package/src/console/server/serve.ts +319 -0
- package/src/console/server/signals.test.ts +88 -0
- package/src/console/server/signals.ts +282 -0
- package/src/console/server/state.ts +982 -0
- package/src/console/server/store.test.ts +233 -0
- package/src/console/server/store.ts +861 -0
- package/src/console/server/structural.ts +95 -0
- package/src/console/server/vault.test.ts +251 -0
- package/src/console/server/vault.ts +430 -0
- package/src/console/ui/access/AccessA11yView.tsx +237 -0
- package/src/console/ui/access/a11y.test.tsx +122 -0
- package/src/console/ui/access/acknowledgement.test.ts +13 -0
- package/src/console/ui/access/acknowledgement.ts +35 -0
- package/src/console/ui/access/blast-radius.test.ts +26 -0
- package/src/console/ui/access/blast-radius.ts +40 -0
- package/src/console/ui/access/confirmation.test.ts +38 -0
- package/src/console/ui/access/confirmation.ts +36 -0
- package/src/console/ui/access/fixture.ts +203 -0
- package/src/console/ui/access/grantable.test.ts +17 -0
- package/src/console/ui/access/grantable.ts +36 -0
- package/src/console/ui/access/hygiene.test.ts +12 -0
- package/src/console/ui/access/hygiene.ts +39 -0
- package/src/console/ui/access/index.ts +54 -0
- package/src/console/ui/access/provenance.test.ts +12 -0
- package/src/console/ui/access/provenance.ts +29 -0
- package/src/console/ui/access/search.test.ts +17 -0
- package/src/console/ui/access/search.ts +72 -0
- package/src/console/ui/access/types.ts +111 -0
- package/src/console/ui/ai/AiA11yView.tsx +265 -0
- package/src/console/ui/ai/a11y.test.tsx +99 -0
- package/src/console/ui/ai/findings.ts +41 -0
- package/src/console/ui/ai/fixture.ts +182 -0
- package/src/console/ui/ai/format.ts +90 -0
- package/src/console/ui/ai/group.test.ts +37 -0
- package/src/console/ui/ai/group.ts +88 -0
- package/src/console/ui/ai/index.ts +66 -0
- package/src/console/ui/ai/promotion.test.ts +77 -0
- package/src/console/ui/ai/promotion.ts +150 -0
- package/src/console/ui/ai/search.test.ts +40 -0
- package/src/console/ui/ai/search.ts +89 -0
- package/src/console/ui/ai/types.ts +139 -0
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
- package/src/console/ui/architecture/a11y.test.tsx +97 -0
- package/src/console/ui/architecture/boundary.ts +42 -0
- package/src/console/ui/architecture/declared.ts +165 -0
- package/src/console/ui/architecture/fixture.ts +74 -0
- package/src/console/ui/architecture/index.ts +84 -0
- package/src/console/ui/architecture/layers.ts +64 -0
- package/src/console/ui/architecture/layout.ts +68 -0
- package/src/console/ui/architecture/pathologies.ts +260 -0
- package/src/console/ui/architecture/search.ts +145 -0
- package/src/console/ui/architecture/traffic.ts +102 -0
- package/src/console/ui/architecture/types.ts +144 -0
- package/src/console/ui/architecture/view.test.ts +165 -0
- package/src/console/ui/architecture/view.ts +516 -0
- package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
- package/src/console/ui/channels/a11y.test.tsx +96 -0
- package/src/console/ui/channels/confirmation.test.ts +37 -0
- package/src/console/ui/channels/confirmation.ts +27 -0
- package/src/console/ui/channels/fallback.test.ts +15 -0
- package/src/console/ui/channels/fallback.ts +20 -0
- package/src/console/ui/channels/findings.ts +38 -0
- package/src/console/ui/channels/fixture.ts +134 -0
- package/src/console/ui/channels/group.ts +25 -0
- package/src/console/ui/channels/index.ts +57 -0
- package/src/console/ui/channels/locale.test.ts +17 -0
- package/src/console/ui/channels/locale.ts +31 -0
- package/src/console/ui/channels/mask.test.ts +14 -0
- package/src/console/ui/channels/mask.ts +12 -0
- package/src/console/ui/channels/search.ts +58 -0
- package/src/console/ui/channels/taxonomy.test.ts +17 -0
- package/src/console/ui/channels/taxonomy.ts +49 -0
- package/src/console/ui/channels/types.ts +117 -0
- package/src/console/ui/clock/ClockA11yView.tsx +182 -0
- package/src/console/ui/clock/a11y.test.tsx +99 -0
- package/src/console/ui/clock/confirmation.test.ts +32 -0
- package/src/console/ui/clock/confirmation.ts +34 -0
- package/src/console/ui/clock/findings.ts +40 -0
- package/src/console/ui/clock/fixture.ts +111 -0
- package/src/console/ui/clock/health.test.ts +25 -0
- package/src/console/ui/clock/health.ts +61 -0
- package/src/console/ui/clock/index.ts +49 -0
- package/src/console/ui/clock/search.test.ts +39 -0
- package/src/console/ui/clock/search.ts +76 -0
- package/src/console/ui/clock/timeline.test.ts +44 -0
- package/src/console/ui/clock/timeline.ts +41 -0
- package/src/console/ui/clock/types.ts +78 -0
- package/src/console/ui/clock/waiting-on.test.ts +34 -0
- package/src/console/ui/clock/waiting-on.ts +83 -0
- package/src/console/ui/confirmation.unify.test.ts +92 -0
- package/src/console/ui/diff/DiffA11yView.tsx +85 -0
- package/src/console/ui/diff/a11y.test.tsx +99 -0
- package/src/console/ui/diff/fixture.ts +85 -0
- package/src/console/ui/diff/group.test.ts +58 -0
- package/src/console/ui/diff/group.ts +97 -0
- package/src/console/ui/diff/index.ts +38 -0
- package/src/console/ui/diff/search.test.ts +32 -0
- package/src/console/ui/diff/search.ts +75 -0
- package/src/console/ui/diff/summary.ts +74 -0
- package/src/console/ui/diff/types.ts +48 -0
- package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
- package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
- package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
- package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
- package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
- package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
- package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
- package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
- package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
- package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
- package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
- package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
- package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
- package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
- package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
- package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
- package/src/console/ui/dist/index.html +14 -0
- package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
- package/src/console/ui/flows/a11y.test.tsx +105 -0
- package/src/console/ui/flows/buffer.test.ts +91 -0
- package/src/console/ui/flows/buffer.ts +118 -0
- package/src/console/ui/flows/confirmation.ts +131 -0
- package/src/console/ui/flows/contract.test.ts +89 -0
- package/src/console/ui/flows/contract.ts +353 -0
- package/src/console/ui/flows/fixture.ts +81 -0
- package/src/console/ui/flows/graph.test.ts +101 -0
- package/src/console/ui/flows/graph.ts +549 -0
- package/src/console/ui/flows/index.ts +87 -0
- package/src/console/ui/flows/save-as-test.test.ts +47 -0
- package/src/console/ui/flows/save-as-test.ts +99 -0
- package/src/console/ui/flows/search.ts +255 -0
- package/src/console/ui/flows/tiers.ts +140 -0
- package/src/console/ui/gates/GatesA11yView.tsx +192 -0
- package/src/console/ui/gates/a11y.test.tsx +116 -0
- package/src/console/ui/gates/audit.test.ts +40 -0
- package/src/console/ui/gates/audit.ts +63 -0
- package/src/console/ui/gates/denial.test.ts +36 -0
- package/src/console/ui/gates/denial.ts +51 -0
- package/src/console/ui/gates/findings.ts +19 -0
- package/src/console/ui/gates/fixture.ts +189 -0
- package/src/console/ui/gates/group.test.ts +30 -0
- package/src/console/ui/gates/group.ts +102 -0
- package/src/console/ui/gates/index.ts +47 -0
- package/src/console/ui/gates/search.test.ts +49 -0
- package/src/console/ui/gates/search.ts +115 -0
- package/src/console/ui/gates/types.ts +121 -0
- package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
- package/src/console/ui/overview/a11y.test.tsx +113 -0
- package/src/console/ui/overview/busiest.ts +26 -0
- package/src/console/ui/overview/compose.ts +133 -0
- package/src/console/ui/overview/cost.test.ts +39 -0
- package/src/console/ui/overview/cost.ts +138 -0
- package/src/console/ui/overview/fixture.ts +161 -0
- package/src/console/ui/overview/golden.ts +57 -0
- package/src/console/ui/overview/index.ts +59 -0
- package/src/console/ui/overview/rank.test.ts +136 -0
- package/src/console/ui/overview/rank.ts +210 -0
- package/src/console/ui/overview/slo.test.ts +73 -0
- package/src/console/ui/overview/slo.ts +229 -0
- package/src/console/ui/overview/types.ts +121 -0
- package/src/console/ui/overview/verdict.ts +131 -0
- package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
- package/src/console/ui/plugins/a11y.test.tsx +97 -0
- package/src/console/ui/plugins/command.test.ts +22 -0
- package/src/console/ui/plugins/command.ts +27 -0
- package/src/console/ui/plugins/findings.ts +39 -0
- package/src/console/ui/plugins/fixture.ts +233 -0
- package/src/console/ui/plugins/group.test.ts +38 -0
- package/src/console/ui/plugins/group.ts +67 -0
- package/src/console/ui/plugins/index.ts +40 -0
- package/src/console/ui/plugins/search.ts +67 -0
- package/src/console/ui/plugins/types.ts +115 -0
- package/src/console/ui/runs/RunsA11yView.tsx +267 -0
- package/src/console/ui/runs/a11y.test.tsx +99 -0
- package/src/console/ui/runs/explain.test.ts +23 -0
- package/src/console/ui/runs/explain.ts +32 -0
- package/src/console/ui/runs/fixture.ts +189 -0
- package/src/console/ui/runs/group.test.ts +24 -0
- package/src/console/ui/runs/group.ts +85 -0
- package/src/console/ui/runs/histogram.test.ts +31 -0
- package/src/console/ui/runs/histogram.ts +85 -0
- package/src/console/ui/runs/index.ts +75 -0
- package/src/console/ui/runs/project.ts +122 -0
- package/src/console/ui/runs/query.test.ts +50 -0
- package/src/console/ui/runs/query.ts +283 -0
- package/src/console/ui/runs/search.test.ts +45 -0
- package/src/console/ui/runs/search.ts +141 -0
- package/src/console/ui/runs/trace-link.test.ts +30 -0
- package/src/console/ui/runs/trace-link.ts +99 -0
- package/src/console/ui/runs/types.ts +137 -0
- package/src/console/ui/shell/App.tsx +56 -0
- package/src/console/ui/shell/client.ts +1715 -0
- package/src/console/ui/shell/components/ui.tsx +110 -0
- package/src/console/ui/shell/index.html +12 -0
- package/src/console/ui/shell/layout/Shell.tsx +95 -0
- package/src/console/ui/shell/main.tsx +281 -0
- package/src/console/ui/shell/panels/Access.tsx +5 -0
- package/src/console/ui/shell/panels/Ai.tsx +5 -0
- package/src/console/ui/shell/panels/Architecture.tsx +5 -0
- package/src/console/ui/shell/panels/Channels.tsx +5 -0
- package/src/console/ui/shell/panels/Clock.tsx +5 -0
- package/src/console/ui/shell/panels/Diff.tsx +5 -0
- package/src/console/ui/shell/panels/Flows.tsx +5 -0
- package/src/console/ui/shell/panels/Gates.tsx +5 -0
- package/src/console/ui/shell/panels/Overview.tsx +6 -0
- package/src/console/ui/shell/panels/Plugins.tsx +5 -0
- package/src/console/ui/shell/panels/Runs.tsx +5 -0
- package/src/console/ui/shell/panels/Signals.tsx +5 -0
- package/src/console/ui/shell/panels/Store.tsx +5 -0
- package/src/console/ui/shell/panels/Traces.tsx +5 -0
- package/src/console/ui/shell/panels/Vault.tsx +5 -0
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
- package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
- package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
- package/src/console/ui/shell/setup/Wizard.tsx +189 -0
- package/src/console/ui/shell/styles.css +75 -0
- package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
- package/src/console/ui/signals/a11y.test.tsx +99 -0
- package/src/console/ui/signals/confirmation.test.ts +39 -0
- package/src/console/ui/signals/confirmation.ts +63 -0
- package/src/console/ui/signals/dry-run.test.ts +18 -0
- package/src/console/ui/signals/dry-run.ts +36 -0
- package/src/console/ui/signals/durable.test.ts +22 -0
- package/src/console/ui/signals/durable.ts +41 -0
- package/src/console/ui/signals/findings.ts +33 -0
- package/src/console/ui/signals/fixture.ts +242 -0
- package/src/console/ui/signals/group.test.ts +32 -0
- package/src/console/ui/signals/group.ts +49 -0
- package/src/console/ui/signals/index.ts +52 -0
- package/src/console/ui/signals/monitor.test.ts +30 -0
- package/src/console/ui/signals/monitor.ts +79 -0
- package/src/console/ui/signals/schema-form.test.ts +34 -0
- package/src/console/ui/signals/schema-form.ts +112 -0
- package/src/console/ui/signals/search.ts +102 -0
- package/src/console/ui/signals/types.ts +71 -0
- package/src/console/ui/store/StoreA11yView.tsx +199 -0
- package/src/console/ui/store/a11y.test.tsx +99 -0
- package/src/console/ui/store/cache-view.test.ts +13 -0
- package/src/console/ui/store/cache-view.ts +36 -0
- package/src/console/ui/store/confirmation.test.ts +38 -0
- package/src/console/ui/store/confirmation.ts +55 -0
- package/src/console/ui/store/dry-run.test.ts +15 -0
- package/src/console/ui/store/dry-run.ts +29 -0
- package/src/console/ui/store/fixture.ts +163 -0
- package/src/console/ui/store/group.test.ts +21 -0
- package/src/console/ui/store/group.ts +41 -0
- package/src/console/ui/store/index.ts +40 -0
- package/src/console/ui/store/search.ts +78 -0
- package/src/console/ui/store/types.ts +65 -0
- package/src/console/ui/store/will-not-fire.test.ts +19 -0
- package/src/console/ui/store/will-not-fire.ts +40 -0
- package/src/console/ui/traces/TracesA11yView.tsx +200 -0
- package/src/console/ui/traces/a11y.test.tsx +97 -0
- package/src/console/ui/traces/chain.test.ts +61 -0
- package/src/console/ui/traces/chain.ts +144 -0
- package/src/console/ui/traces/critical-path.test.ts +24 -0
- package/src/console/ui/traces/critical-path.ts +59 -0
- package/src/console/ui/traces/filter.test.ts +78 -0
- package/src/console/ui/traces/filter.ts +112 -0
- package/src/console/ui/traces/fixture.ts +126 -0
- package/src/console/ui/traces/fold.test.ts +67 -0
- package/src/console/ui/traces/fold.ts +170 -0
- package/src/console/ui/traces/index.ts +64 -0
- package/src/console/ui/traces/mini.ts +65 -0
- package/src/console/ui/traces/replay.test.ts +24 -0
- package/src/console/ui/traces/replay.ts +35 -0
- package/src/console/ui/traces/sampling.test.ts +26 -0
- package/src/console/ui/traces/sampling.ts +66 -0
- package/src/console/ui/traces/search.ts +148 -0
- package/src/console/ui/traces/tier.ts +72 -0
- package/src/console/ui/traces/types.ts +125 -0
- package/src/console/ui/tsconfig.json +20 -0
- package/src/console/ui/vault/VaultA11yView.tsx +177 -0
- package/src/console/ui/vault/a11y.test.tsx +97 -0
- package/src/console/ui/vault/blast-radius.test.ts +35 -0
- package/src/console/ui/vault/blast-radius.ts +55 -0
- package/src/console/ui/vault/confirmation.test.ts +41 -0
- package/src/console/ui/vault/confirmation.ts +39 -0
- package/src/console/ui/vault/dormant.test.ts +37 -0
- package/src/console/ui/vault/dormant.ts +28 -0
- package/src/console/ui/vault/export-safe.test.ts +30 -0
- package/src/console/ui/vault/export-safe.ts +65 -0
- package/src/console/ui/vault/fixture.ts +75 -0
- package/src/console/ui/vault/group.test.ts +25 -0
- package/src/console/ui/vault/group.ts +50 -0
- package/src/console/ui/vault/index.ts +45 -0
- package/src/console/ui/vault/search.ts +62 -0
- package/src/console/ui/vault/types.ts +57 -0
- package/src/console/ui/vite.config.ts +84 -0
- package/src/console/xss.gate.test.ts +118 -0
- package/src/docker/compose.ts +226 -0
- package/src/docker/credentials.ts +25 -0
- package/src/docker/derive.ts +83 -0
- package/src/docker/docker.test.ts +185 -0
- package/src/docker/dockerfile.integration.test.ts +170 -0
- package/src/docker/dockerfile.ts +39 -0
- package/src/docker/helpers.ts +103 -0
- package/src/docker/index.ts +52 -0
- package/src/docker/pin.ts +90 -0
- package/src/docker/recipes/index.ts +33 -0
- package/src/docker/recipes/postgres.ts +18 -0
- package/src/docker/recipes/redis.ts +18 -0
- package/src/docker/stack.integration.test.ts +140 -0
- package/src/docker/stack.ts +62 -0
- package/src/docker/types.ts +134 -0
- package/src/drivers/ai-anthropic.ts +128 -0
- package/src/drivers/ai-mock.ts +82 -0
- package/src/drivers/ai-openai-compatible.ts +139 -0
- package/src/drivers/ai-providers.test.ts +163 -0
- package/src/drivers/ai-types.ts +83 -0
- package/src/drivers/bun-native-completeness.test.ts +155 -0
- package/src/drivers/channel-console.ts +118 -0
- package/src/drivers/channel-fcm.ts +96 -0
- package/src/drivers/channel-resend.ts +27 -0
- package/src/drivers/channel-smtp.ts +33 -0
- package/src/drivers/channel-types.ts +160 -0
- package/src/drivers/channel-unifonic.ts +79 -0
- package/src/drivers/channel-wa-cloud.ts +84 -0
- package/src/drivers/channel-webpush.ts +317 -0
- package/src/drivers/conformance.test.ts +89 -0
- package/src/drivers/conformance.ts +162 -0
- package/src/drivers/fs.ts +73 -0
- package/src/drivers/index.ts +194 -0
- package/src/drivers/kv-lua.ts +222 -0
- package/src/drivers/memory.ts +472 -0
- package/src/drivers/pgvector.ts +130 -0
- package/src/drivers/postgres.ts +221 -0
- package/src/drivers/redis.ts +254 -0
- package/src/drivers/s3.ts +129 -0
- package/src/drivers/signal-engine.ts +690 -0
- package/src/drivers/signal-memory.ts +27 -0
- package/src/drivers/signal-nats.ts +131 -0
- package/src/drivers/signal-postgres.ts +1089 -0
- package/src/drivers/signal-redis.ts +275 -0
- package/src/drivers/signal-types.ts +328 -0
- package/src/drivers/sqlite.ts +53 -0
- package/src/drivers/types.ts +334 -0
- package/src/drivers/vault-dotenv-parse.ts +56 -0
- package/src/drivers/vault-env.ts +101 -0
- package/src/drivers/vault-infisical.ts +61 -0
- package/src/drivers/vault-managed.ts +42 -0
- package/src/drivers/vault-memory.ts +38 -0
- package/src/drivers/vault-openbao.ts +80 -0
- package/src/drivers/vault-sops.ts +252 -0
- package/src/drivers/vault-types.ts +84 -0
- package/src/elements/ai/declare.ts +206 -0
- package/src/elements/ai/eval.ts +113 -0
- package/src/elements/ai/pii.ts +108 -0
- package/src/elements/ai/runtime.ts +540 -0
- package/src/elements/ai/schema.ts +194 -0
- package/src/elements/ai.test.ts +393 -0
- package/src/elements/ai.ts +56 -0
- package/src/elements/channel/consent.ts +81 -0
- package/src/elements/channel/costs.test.ts +62 -0
- package/src/elements/channel/costs.ts +130 -0
- package/src/elements/channel/declare.ts +141 -0
- package/src/elements/channel/email-auth.test.ts +47 -0
- package/src/elements/channel/email-auth.ts +109 -0
- package/src/elements/channel/locale.ts +97 -0
- package/src/elements/channel/mask.test.ts +19 -0
- package/src/elements/channel/mask.ts +60 -0
- package/src/elements/channel/mime.ts +23 -0
- package/src/elements/channel/outcomes.test.ts +40 -0
- package/src/elements/channel/outcomes.ts +126 -0
- package/src/elements/channel/receipts.ts +121 -0
- package/src/elements/channel/runtime.ts +500 -0
- package/src/elements/channel/suppression.ts +136 -0
- package/src/elements/channel.test.ts +232 -0
- package/src/elements/channel.ts +109 -0
- package/src/elements/clock/actions.ts +170 -0
- package/src/elements/clock/declare.ts +58 -0
- package/src/elements/clock/dst.ts +197 -0
- package/src/elements/clock/durable.ts +140 -0
- package/src/elements/clock/duration.ts +29 -0
- package/src/elements/clock/health.test.ts +103 -0
- package/src/elements/clock/health.ts +112 -0
- package/src/elements/clock/leader.ts +127 -0
- package/src/elements/clock/reconcile.ts +241 -0
- package/src/elements/clock/runtime.ts +243 -0
- package/src/elements/clock/schedule.ts +262 -0
- package/src/elements/clock/time-travel.ts +53 -0
- package/src/elements/clock.test.ts +365 -0
- package/src/elements/clock.ts +80 -0
- package/src/elements/gate/declare.ts +134 -0
- package/src/elements/gate/permissions.ts +104 -0
- package/src/elements/gate/runtime.ts +177 -0
- package/src/elements/gate/strategies.ts +388 -0
- package/src/elements/gate.test.ts +145 -0
- package/src/elements/gate.ts +41 -0
- package/src/elements/index.ts +169 -0
- package/src/elements/signal/chaos-child.ts +47 -0
- package/src/elements/signal/declare.ts +77 -0
- package/src/elements/signal/dry-run-replay.test.ts +95 -0
- package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
- package/src/elements/signal/reconcile.test.ts +23 -0
- package/src/elements/signal/reconcile.ts +122 -0
- package/src/elements/signal/runtime.ts +94 -0
- package/src/elements/signal.test.ts +457 -0
- package/src/elements/signal.ts +26 -0
- package/src/elements/store/cache.ts +197 -0
- package/src/elements/store/classify.ts +125 -0
- package/src/elements/store/declare.ts +200 -0
- package/src/elements/store/files-policy.test.ts +31 -0
- package/src/elements/store/files-policy.ts +70 -0
- package/src/elements/store/replica.ts +68 -0
- package/src/elements/store/runtime.ts +393 -0
- package/src/elements/store/sql-condition.ts +205 -0
- package/src/elements/store/sql-session.ts +579 -0
- package/src/elements/store/table.ts +282 -0
- package/src/elements/store.test.ts +370 -0
- package/src/elements/store.ts +99 -0
- package/src/elements/vault/declare.ts +143 -0
- package/src/elements/vault/fingerprint.ts +30 -0
- package/src/elements/vault/redact.ts +52 -0
- package/src/elements/vault/runtime.ts +461 -0
- package/src/elements/vault.test.ts +296 -0
- package/src/elements/vault.ts +44 -0
- package/src/index.ts +183 -0
- package/src/kernel/adopt-routes.ts +194 -0
- package/src/kernel/app.ts +1068 -0
- package/src/kernel/auth-resolve.ts +93 -0
- package/src/kernel/boot.test.ts +173 -0
- package/src/kernel/boot.ts +439 -0
- package/src/kernel/budget-entry.ts +55 -0
- package/src/kernel/budget.test.ts +19 -0
- package/src/kernel/call.test.ts +83 -0
- package/src/kernel/capability.ts +113 -0
- package/src/kernel/dry-run.test.ts +64 -0
- package/src/kernel/dry-run.ts +171 -0
- package/src/kernel/effects.test.ts +89 -0
- package/src/kernel/effects.ts +140 -0
- package/src/kernel/errors.registry.test.ts +39 -0
- package/src/kernel/errors.ts +225 -0
- package/src/kernel/flow.test.ts +154 -0
- package/src/kernel/flow.ts +290 -0
- package/src/kernel/fx.test.ts +245 -0
- package/src/kernel/fx.ts +996 -0
- package/src/kernel/hook-timing.test.ts +72 -0
- package/src/kernel/hook-timing.ts +190 -0
- package/src/kernel/hooks.test.ts +181 -0
- package/src/kernel/hooks.ts +275 -0
- package/src/kernel/index.ts +278 -0
- package/src/kernel/journal.ts +405 -0
- package/src/kernel/journey.ts +75 -0
- package/src/kernel/on.ts +74 -0
- package/src/kernel/pipeline.test.ts +349 -0
- package/src/kernel/pipeline.ts +245 -0
- package/src/kernel/plug.ts +82 -0
- package/src/kernel/plugin/capabilities.test.ts +84 -0
- package/src/kernel/plugin/conflicts.test.ts +106 -0
- package/src/kernel/plugin/decorate.test.ts +111 -0
- package/src/kernel/plugin/scoping.test.ts +138 -0
- package/src/kernel/plugin.ts +485 -0
- package/src/kernel/rate-limit.ts +25 -0
- package/src/kernel/registry.ts +398 -0
- package/src/kernel/router.test.ts +114 -0
- package/src/kernel/router.ts +556 -0
- package/src/kernel/routing-budget.test.ts +19 -0
- package/src/kernel/run-telemetry.ts +70 -0
- package/src/kernel/triggers.ts +324 -0
- package/src/kernel/unit.ts +88 -0
- package/src/manifest/diff.test.ts +866 -0
- package/src/manifest/diff.ts +1670 -0
- package/src/manifest/fixtures/base.manifest.json +112 -0
- package/src/manifest/fixtures/skyport.excerpt.json +51 -0
- package/src/manifest/fixtures/skyport.manifest.json +153 -0
- package/src/manifest/index.ts +27 -0
- package/src/manifest/types.ts +358 -0
- package/src/manifest/undeclared.test.ts +82 -0
- package/src/manifest/undeclared.ts +65 -0
- package/src/manifest/validate.test.ts +105 -0
- package/src/manifest/validate.ts +174 -0
- package/src/mcp/authorization.ts +340 -0
- package/src/mcp/confirmation.ts +174 -0
- package/src/mcp/data.ts +90 -0
- package/src/mcp/index.ts +80 -0
- package/src/mcp/injection.gate.test.ts +176 -0
- package/src/mcp/mcp.test.ts +348 -0
- package/src/mcp/protocol.ts +172 -0
- package/src/mcp/server.ts +283 -0
- package/src/mcp/session.ts +139 -0
- package/src/mcp/tools.ts +391 -0
- package/src/plugins/catalogue.test.ts +48 -0
- package/src/plugins/catalogue.ts +113 -0
- package/src/plugins/node-import-scan.test.ts +28 -0
- package/src/plugins/node-import-scan.ts +98 -0
- package/src/plugins/supply-chain.test.ts +48 -0
- package/src/plugins/supply-chain.ts +460 -0
- package/src/release/index.ts +30 -0
- package/src/release/limits.ts +20 -0
- package/src/release/measure.ts +443 -0
- package/src/release/publish.ts +56 -0
- package/src/runs/bench.test.ts +93 -0
- package/src/runs/collect.ts +144 -0
- package/src/runs/drivers/clickhouse.ts +108 -0
- package/src/runs/drivers/files.ts +201 -0
- package/src/runs/drivers/memory.ts +94 -0
- package/src/runs/drivers/postgres.ts +110 -0
- package/src/runs/duckdb.ts +99 -0
- package/src/runs/index.ts +82 -0
- package/src/runs/outlier.ts +180 -0
- package/src/runs/parquet.ts +210 -0
- package/src/runs/privacy.ts +49 -0
- package/src/runs/runs.test.ts +324 -0
- package/src/runs/runtime.ts +229 -0
- package/src/runs/shred.ts +243 -0
- package/src/runs/telemetry.ts +10 -0
- package/src/runs/types.ts +179 -0
- package/src/runtime/bun.ts +140 -0
- package/src/runtime/cold-start.bench.ts +20 -0
- package/src/runtime/index.ts +46 -0
- package/src/runtime/primitives.ts +242 -0
- package/src/runtime/security.test.ts +170 -0
- package/src/runtime/security.ts +168 -0
- package/src/runtime/serve.test.ts +223 -0
- package/src/runtime/types.ts +217 -0
- package/src/runtime/web-standard.ts +77 -0
- package/src/test/create-test-app.test.ts +161 -0
- package/src/test/create-test-app.ts +533 -0
- package/src/test/index.ts +21 -0
- package/src/test/provisions.integration.test.ts +174 -0
- package/src/upgrade/codemods.test.ts +58 -0
- package/src/upgrade/codemods.ts +83 -0
- package/src/validation/index.ts +23 -0
- package/src/validation/standard-schema.test.ts +96 -0
- package/src/validation/standard-schema.ts +316 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke schema generate` — core + plugin tables → `schema/oke.ts`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { mkdir } from "node:fs/promises";
|
|
7
|
+
import { dirname, resolve } from "node:path";
|
|
8
|
+
import type { Manifest } from "../manifest/types.ts";
|
|
9
|
+
import { loadManifest } from "./load-config.ts";
|
|
10
|
+
|
|
11
|
+
/** Fingerprint file written beside generated schema. */
|
|
12
|
+
export const SCHEMA_FINGERPRINT_FILE = "schema/.oke-schema.sha256";
|
|
13
|
+
|
|
14
|
+
/** Default generated schema path. */
|
|
15
|
+
export const SCHEMA_OUT = "schema/oke.ts";
|
|
16
|
+
|
|
17
|
+
/** Options for {@link runSchemaGenerate}. */
|
|
18
|
+
export interface SchemaGenerateOptions {
|
|
19
|
+
readonly cwd?: string;
|
|
20
|
+
readonly manifestPath?: string;
|
|
21
|
+
readonly manifest?: Manifest;
|
|
22
|
+
readonly out?: string;
|
|
23
|
+
/** When true, fail if output would change (CI). */
|
|
24
|
+
readonly check?: boolean;
|
|
25
|
+
readonly write?: (text: string) => void;
|
|
26
|
+
/** Extra table names (plugins / tests). */
|
|
27
|
+
readonly extraTables?: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generate `schema/oke.ts` from Manifest store tables + core Console tables.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Manifest / check flag
|
|
34
|
+
*/
|
|
35
|
+
export async function runSchemaGenerate(
|
|
36
|
+
options: SchemaGenerateOptions = {},
|
|
37
|
+
): Promise<number> {
|
|
38
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
39
|
+
const cwd = options.cwd ?? process.cwd();
|
|
40
|
+
let manifest = options.manifest;
|
|
41
|
+
if (!manifest) {
|
|
42
|
+
const path = resolve(cwd, options.manifestPath ?? "oke.manifest.json");
|
|
43
|
+
const file = Bun.file(path);
|
|
44
|
+
if (await file.exists()) manifest = await loadManifest(path);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const tables = new Set<string>([
|
|
48
|
+
"oke_roles",
|
|
49
|
+
"oke_role_grants",
|
|
50
|
+
"oke_api_keys",
|
|
51
|
+
"oke_overrides",
|
|
52
|
+
"oke_crons",
|
|
53
|
+
"oke_signal_config",
|
|
54
|
+
"oke_console_prefs",
|
|
55
|
+
...(options.extraTables ?? []),
|
|
56
|
+
]);
|
|
57
|
+
if (manifest?.stores) {
|
|
58
|
+
for (const store of Object.values(manifest.stores)) {
|
|
59
|
+
for (const t of Object.keys(store.tables ?? {})) tables.add(t);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const source = emitSchemaSource([...tables].sort());
|
|
64
|
+
const out = resolve(cwd, options.out ?? SCHEMA_OUT);
|
|
65
|
+
const fp = hashSource(source);
|
|
66
|
+
|
|
67
|
+
if (options.check) {
|
|
68
|
+
const existing = Bun.file(out);
|
|
69
|
+
if (!(await existing.exists())) {
|
|
70
|
+
write("oke schema generate --check: schema/oke.ts missing\n");
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
const current = await existing.text();
|
|
74
|
+
if (hashSource(current) !== fp) {
|
|
75
|
+
write("oke schema generate --check: schema drift\n");
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
write("oke schema generate --check: ok\n");
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
await mkdir(dirname(out), { recursive: true });
|
|
83
|
+
await Bun.write(out, source);
|
|
84
|
+
await Bun.write(resolve(cwd, SCHEMA_FINGERPRINT_FILE), `${fp}\n`);
|
|
85
|
+
write(`oke schema generate: wrote ${out} (${tables.size} table(s))\n`);
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Fingerprint of the would-be generated schema (for doctor drift).
|
|
91
|
+
*
|
|
92
|
+
* @param cwd - Project root
|
|
93
|
+
* @param manifest - Optional manifest
|
|
94
|
+
*/
|
|
95
|
+
export async function schemaFingerprint(
|
|
96
|
+
cwd: string,
|
|
97
|
+
manifest?: Manifest,
|
|
98
|
+
): Promise<string> {
|
|
99
|
+
const tables = new Set<string>([
|
|
100
|
+
"oke_roles",
|
|
101
|
+
"oke_role_grants",
|
|
102
|
+
"oke_api_keys",
|
|
103
|
+
"oke_overrides",
|
|
104
|
+
"oke_crons",
|
|
105
|
+
"oke_signal_config",
|
|
106
|
+
"oke_console_prefs",
|
|
107
|
+
]);
|
|
108
|
+
let m = manifest;
|
|
109
|
+
if (!m) {
|
|
110
|
+
const path = resolve(cwd, "oke.manifest.json");
|
|
111
|
+
if (await Bun.file(path).exists()) m = await loadManifest(path);
|
|
112
|
+
}
|
|
113
|
+
if (m?.stores) {
|
|
114
|
+
for (const store of Object.values(m.stores)) {
|
|
115
|
+
for (const t of Object.keys(store.tables ?? {})) tables.add(t);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return hashSource(emitSchemaSource([...tables].sort()));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Read the on-disk schema fingerprint, if any.
|
|
123
|
+
*
|
|
124
|
+
* @param cwd - Project root
|
|
125
|
+
*/
|
|
126
|
+
export async function readSchemaFingerprint(
|
|
127
|
+
cwd: string,
|
|
128
|
+
): Promise<string | null> {
|
|
129
|
+
const fpFile = Bun.file(resolve(cwd, SCHEMA_FINGERPRINT_FILE));
|
|
130
|
+
if (await fpFile.exists()) {
|
|
131
|
+
return (await fpFile.text()).trim();
|
|
132
|
+
}
|
|
133
|
+
const schema = Bun.file(resolve(cwd, SCHEMA_OUT));
|
|
134
|
+
if (!(await schema.exists())) return null;
|
|
135
|
+
return hashSource(await schema.text());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* CLI entry for `oke schema generate [--check]`.
|
|
140
|
+
*
|
|
141
|
+
* @param args - Args after `schema`
|
|
142
|
+
*/
|
|
143
|
+
export async function schemaCli(args: readonly string[]): Promise<number> {
|
|
144
|
+
const [sub, ...rest] = args;
|
|
145
|
+
if (sub !== "generate") {
|
|
146
|
+
console.error("Usage: oke schema generate [--check|-c]");
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
let check = false;
|
|
150
|
+
let manifestPath: string | undefined;
|
|
151
|
+
let out: string | undefined;
|
|
152
|
+
for (let i = 0; i < rest.length; i++) {
|
|
153
|
+
const a = rest[i]!;
|
|
154
|
+
if (a === "--check" || a === "-c") check = true;
|
|
155
|
+
else if (a === "--manifest" || a === "-m") manifestPath = rest[++i];
|
|
156
|
+
else if (a === "--out" || a === "-o") out = rest[++i];
|
|
157
|
+
else if (a === "--help" || a === "-h") {
|
|
158
|
+
console.log(`oke schema generate [--check|-c] [--out|-o schema/oke.ts]
|
|
159
|
+
|
|
160
|
+
Emit core + plugin tables. Use --check in CI to fail on drift.
|
|
161
|
+
`);
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return runSchemaGenerate({ check, manifestPath, out });
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Emit a Drizzle-compatible stub schema module.
|
|
170
|
+
*
|
|
171
|
+
* @param tables - Table names
|
|
172
|
+
*/
|
|
173
|
+
export function emitSchemaSource(tables: readonly string[]): string {
|
|
174
|
+
const decls = tables
|
|
175
|
+
.map(
|
|
176
|
+
(name) =>
|
|
177
|
+
`/** Generated table handle — wire columns in your app schema. */\nexport const ${camel(name)} = { name: "${name}" } as const;\n`,
|
|
178
|
+
)
|
|
179
|
+
.join("\n");
|
|
180
|
+
return `/**
|
|
181
|
+
* Generated by \`oke schema generate\` — do not edit.
|
|
182
|
+
* Core Console tables + Manifest store tables.
|
|
183
|
+
*/
|
|
184
|
+
|
|
185
|
+
${decls}
|
|
186
|
+
export const okeTables = [${tables.map((t) => `"${t}"`).join(", ")}] as const;
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function hashSource(source: string): string {
|
|
191
|
+
return createHash("sha256").update(source).digest("hex");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function camel(name: string): string {
|
|
195
|
+
return name.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());
|
|
196
|
+
}
|
package/src/cli/stack.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke stack` — preview resolved images/tags/ports (writes nothing).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { formatStackPreview, resolveStack } from "../docker/index.ts";
|
|
6
|
+
import { wantsJson } from "./args.ts";
|
|
7
|
+
import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
|
|
8
|
+
import { loadOkeConfig, resolveImages } from "./load-config.ts";
|
|
9
|
+
|
|
10
|
+
/** Options for {@link runStackPreview}. */
|
|
11
|
+
export interface StackCliOptions {
|
|
12
|
+
readonly cwd?: string;
|
|
13
|
+
readonly configPath?: string;
|
|
14
|
+
readonly images?: Readonly<Record<string, string>>;
|
|
15
|
+
readonly write?: (text: string) => void;
|
|
16
|
+
readonly writeErr?: (text: string) => void;
|
|
17
|
+
readonly json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Print resolved stack preview.
|
|
22
|
+
*
|
|
23
|
+
* @param options - Config / images
|
|
24
|
+
*/
|
|
25
|
+
export async function runStackPreview(
|
|
26
|
+
options: StackCliOptions = {},
|
|
27
|
+
): Promise<number> {
|
|
28
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
29
|
+
const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
|
|
30
|
+
const json = options.json ?? false;
|
|
31
|
+
let images = options.images;
|
|
32
|
+
if (!images) {
|
|
33
|
+
try {
|
|
34
|
+
const loaded = await loadOkeConfig(
|
|
35
|
+
options.cwd ?? process.cwd(),
|
|
36
|
+
options.configPath,
|
|
37
|
+
);
|
|
38
|
+
images = resolveImages(loaded.config);
|
|
39
|
+
} catch (err) {
|
|
40
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
41
|
+
if (json) {
|
|
42
|
+
write(`${JSON.stringify({ ok: false, error: msg }, null, 2)}\n`);
|
|
43
|
+
} else {
|
|
44
|
+
writeErr(`${msg}\n`);
|
|
45
|
+
}
|
|
46
|
+
return EXIT_RUNTIME;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const rows = resolveStack({ images });
|
|
50
|
+
if (json) {
|
|
51
|
+
write(`${JSON.stringify({ ok: true, rows }, null, 2)}\n`);
|
|
52
|
+
if (rows.length === 0) {
|
|
53
|
+
writeErr("Hint: set images in oke.config.ts — oke stack writes nothing.\n");
|
|
54
|
+
}
|
|
55
|
+
return EXIT_OK;
|
|
56
|
+
}
|
|
57
|
+
write(formatStackPreview(rows));
|
|
58
|
+
return EXIT_OK;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* CLI entry for `oke stack`.
|
|
63
|
+
*
|
|
64
|
+
* @param args - Args after `stack`
|
|
65
|
+
*/
|
|
66
|
+
export async function stackCli(args: readonly string[]): Promise<number> {
|
|
67
|
+
let configPath: string | undefined;
|
|
68
|
+
const json = wantsJson(args);
|
|
69
|
+
for (let i = 0; i < args.length; i++) {
|
|
70
|
+
const a = args[i]!;
|
|
71
|
+
if (a === "--config" || a === "-c") configPath = args[++i];
|
|
72
|
+
else if (a === "--help" || a === "-h") {
|
|
73
|
+
console.log(`oke stack [--config|-c oke.config.ts] [--json|-j]
|
|
74
|
+
|
|
75
|
+
Preview resolved images, recipes, and ports. Writes nothing.
|
|
76
|
+
--json Machine-parseable JSON on stdout; hints on stderr.
|
|
77
|
+
`);
|
|
78
|
+
return EXIT_OK;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return runStackPreview({ configPath, json });
|
|
82
|
+
}
|
package/src/cli/start.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke start` — runs exactly what production runs (Docker CMD).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { APP_PORT } from "../runtime/types.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link runStart}. */
|
|
9
|
+
export interface StartOptions {
|
|
10
|
+
readonly cwd?: string;
|
|
11
|
+
readonly entry?: string;
|
|
12
|
+
readonly port?: number;
|
|
13
|
+
readonly write?: (text: string) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Spawn/import hook (tests). Defaults to dynamic-importing the entry.
|
|
16
|
+
*
|
|
17
|
+
* @param entry - Absolute entry path
|
|
18
|
+
* @param env - Process env overlay
|
|
19
|
+
*/
|
|
20
|
+
readonly runEntry?: (
|
|
21
|
+
entry: string,
|
|
22
|
+
env: Record<string, string>,
|
|
23
|
+
) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the production entry module.
|
|
28
|
+
*
|
|
29
|
+
* @param cwd - Project root
|
|
30
|
+
* @param explicit - Optional `--entry`
|
|
31
|
+
*/
|
|
32
|
+
export async function resolveStartEntry(
|
|
33
|
+
cwd: string,
|
|
34
|
+
explicit?: string,
|
|
35
|
+
): Promise<string> {
|
|
36
|
+
if (explicit) return resolve(cwd, explicit);
|
|
37
|
+
const pkgPath = resolve(cwd, "package.json");
|
|
38
|
+
if (await Bun.file(pkgPath).exists()) {
|
|
39
|
+
const pkg = (await Bun.file(pkgPath).json()) as {
|
|
40
|
+
main?: string;
|
|
41
|
+
okengine?: { entry?: string };
|
|
42
|
+
};
|
|
43
|
+
if (pkg.okengine?.entry) return resolve(cwd, pkg.okengine.entry);
|
|
44
|
+
if (pkg.main) return resolve(cwd, pkg.main);
|
|
45
|
+
}
|
|
46
|
+
for (const candidate of ["src/app.ts", "src/index.ts", "index.ts", "app.ts"]) {
|
|
47
|
+
const path = resolve(cwd, candidate);
|
|
48
|
+
if (await Bun.file(path).exists()) return path;
|
|
49
|
+
}
|
|
50
|
+
throw new Error(
|
|
51
|
+
"oke start: no entry found — set package.json okengine.entry or pass --entry",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Run the production entry (Docker CMD).
|
|
57
|
+
*
|
|
58
|
+
* @param options - Entry / port
|
|
59
|
+
*/
|
|
60
|
+
export async function runStart(options: StartOptions = {}): Promise<number> {
|
|
61
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
62
|
+
const cwd = options.cwd ?? process.cwd();
|
|
63
|
+
try {
|
|
64
|
+
const entry = await resolveStartEntry(cwd, options.entry);
|
|
65
|
+
const port = String(options.port ?? Number(Bun.env.PORT ?? APP_PORT));
|
|
66
|
+
const env = { ...process.env, NODE_ENV: "production", PORT: port } as Record<
|
|
67
|
+
string,
|
|
68
|
+
string
|
|
69
|
+
>;
|
|
70
|
+
write(`oke start: ${entry} (port ${port})\n`);
|
|
71
|
+
if (options.runEntry) {
|
|
72
|
+
await options.runEntry(entry, env);
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
// Production: import the entry; apps call createBunRuntime().serve themselves.
|
|
76
|
+
Object.assign(process.env, env);
|
|
77
|
+
await import(entry);
|
|
78
|
+
return 0;
|
|
79
|
+
} catch (err) {
|
|
80
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* CLI entry for `oke start`.
|
|
87
|
+
*
|
|
88
|
+
* @param args - Args after `start`
|
|
89
|
+
*/
|
|
90
|
+
export async function startCli(args: readonly string[]): Promise<number> {
|
|
91
|
+
let entry: string | undefined;
|
|
92
|
+
let port: number | undefined;
|
|
93
|
+
for (let i = 0; i < args.length; i++) {
|
|
94
|
+
const a = args[i]!;
|
|
95
|
+
if (a === "--entry" || a === "-e") entry = args[++i];
|
|
96
|
+
else if (a === "--port" || a === "-p") port = Number(args[++i]);
|
|
97
|
+
else if (a === "--help" || a === "-h") {
|
|
98
|
+
console.log(`oke start [--entry|-e src/app.ts] [--port|-p 6530]
|
|
99
|
+
|
|
100
|
+
Run exactly what production runs. This is the Docker CMD.
|
|
101
|
+
`);
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return runStart({ entry, port });
|
|
106
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke upgrade` — run codemods for a breaking change, print the diff.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
runCodemods,
|
|
7
|
+
type CodemodChange,
|
|
8
|
+
} from "../upgrade/codemods.ts";
|
|
9
|
+
|
|
10
|
+
/** One file rewrite produced by a codemod. */
|
|
11
|
+
export type UpgradeChange = CodemodChange;
|
|
12
|
+
|
|
13
|
+
/** Options for {@link runUpgrade}. */
|
|
14
|
+
export interface UpgradeOptions {
|
|
15
|
+
readonly cwd?: string;
|
|
16
|
+
readonly write?: (text: string) => void;
|
|
17
|
+
/** Apply without writing (print diff only). Default true for safety. */
|
|
18
|
+
readonly dryRun?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Codemod runner (tests / versioned transforms).
|
|
21
|
+
*
|
|
22
|
+
* @param cwd - Project root
|
|
23
|
+
*/
|
|
24
|
+
readonly runCodemods?: (cwd: string) => Promise<readonly UpgradeChange[]>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Run upgrade codemods and print a unified-style diff.
|
|
29
|
+
*
|
|
30
|
+
* @param options - Cwd / dry-run
|
|
31
|
+
*/
|
|
32
|
+
export async function runUpgrade(options: UpgradeOptions = {}): Promise<number> {
|
|
33
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
34
|
+
const cwd = options.cwd ?? process.cwd();
|
|
35
|
+
const dryRun = options.dryRun ?? true;
|
|
36
|
+
const run = options.runCodemods ?? runCodemods;
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const changes = await run(cwd);
|
|
40
|
+
if (changes.length === 0) {
|
|
41
|
+
write("oke upgrade: no codemods to apply\n");
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
for (const c of changes) {
|
|
45
|
+
write(`--- a/${c.path}\n+++ b/${c.path}\n`);
|
|
46
|
+
write(unifiedDiff(c.before, c.after));
|
|
47
|
+
if (!dryRun) await Bun.write(`${cwd}/${c.path}`, c.after);
|
|
48
|
+
}
|
|
49
|
+
write(
|
|
50
|
+
dryRun
|
|
51
|
+
? `oke upgrade: ${changes.length} change(s) (dry-run — pass --apply to write)\n`
|
|
52
|
+
: `oke upgrade: applied ${changes.length} change(s)\n`,
|
|
53
|
+
);
|
|
54
|
+
return 0;
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* CLI entry for `oke upgrade`.
|
|
63
|
+
*
|
|
64
|
+
* @param args - Args after `upgrade`
|
|
65
|
+
*/
|
|
66
|
+
export async function upgradeCli(args: readonly string[]): Promise<number> {
|
|
67
|
+
let dryRun = true;
|
|
68
|
+
for (const a of args) {
|
|
69
|
+
if (a === "--apply" || a === "-a") dryRun = false;
|
|
70
|
+
else if (a === "--help" || a === "-h") {
|
|
71
|
+
console.log(`oke upgrade [--apply|-a]
|
|
72
|
+
|
|
73
|
+
Run codemods for a breaking change and print the diff.
|
|
74
|
+
Pass --apply to write files (default is dry-run — never writes without it).
|
|
75
|
+
Codemods ship with every breaking change (unified-theory §22).
|
|
76
|
+
`);
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return runUpgrade({ dryRun });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Minimal unified diff for short files.
|
|
85
|
+
*
|
|
86
|
+
* @param before - Original
|
|
87
|
+
* @param after - Rewritten
|
|
88
|
+
*/
|
|
89
|
+
export function unifiedDiff(before: string, after: string): string {
|
|
90
|
+
const a = before.split("\n");
|
|
91
|
+
const b = after.split("\n");
|
|
92
|
+
const lines: string[] = [];
|
|
93
|
+
const max = Math.max(a.length, b.length);
|
|
94
|
+
for (let i = 0; i < max; i++) {
|
|
95
|
+
const left = a[i];
|
|
96
|
+
const right = b[i];
|
|
97
|
+
if (left === right) {
|
|
98
|
+
if (left !== undefined) lines.push(` ${left}`);
|
|
99
|
+
} else {
|
|
100
|
+
if (left !== undefined) lines.push(`-${left}`);
|
|
101
|
+
if (right !== undefined) lines.push(`+${right}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return `${lines.join("\n")}\n`;
|
|
105
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke vault` — set · list · import · key rotate.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { parseDotenv, formatDotenv } from "../drivers/vault-dotenv-parse.ts";
|
|
7
|
+
|
|
8
|
+
/** In-memory / file-backed vault bag for CLI (dotenv-shaped). */
|
|
9
|
+
export interface VaultCliStore {
|
|
10
|
+
get(name: string): string | undefined;
|
|
11
|
+
set(name: string, value: string): void;
|
|
12
|
+
names(): readonly string[];
|
|
13
|
+
save?(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Options shared by vault subcommands. */
|
|
17
|
+
export interface VaultCmdOptions {
|
|
18
|
+
readonly cwd?: string;
|
|
19
|
+
readonly envFile?: string;
|
|
20
|
+
readonly store?: VaultCliStore;
|
|
21
|
+
readonly write?: (text: string) => void;
|
|
22
|
+
readonly readLine?: (prompt: string) => Promise<string>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Open a dotenv-backed store (default `.env.local`).
|
|
27
|
+
*
|
|
28
|
+
* @param path - Env file path
|
|
29
|
+
*/
|
|
30
|
+
export async function openEnvStore(path: string): Promise<VaultCliStore> {
|
|
31
|
+
const map = new Map<string, string>();
|
|
32
|
+
const file = Bun.file(path);
|
|
33
|
+
if (await file.exists()) {
|
|
34
|
+
for (const [k, v] of parseDotenv(await file.text())) {
|
|
35
|
+
map.set(k, v);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
get: (n) => map.get(n),
|
|
40
|
+
set: (n, v) => {
|
|
41
|
+
map.set(n, v);
|
|
42
|
+
},
|
|
43
|
+
names: () => [...map.keys()].sort(),
|
|
44
|
+
async save() {
|
|
45
|
+
await Bun.write(path, formatDotenv(map));
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Run a vault subcommand.
|
|
52
|
+
*
|
|
53
|
+
* @param args - Args after `vault`
|
|
54
|
+
* @param options - Store injection
|
|
55
|
+
*/
|
|
56
|
+
export async function vaultCli(
|
|
57
|
+
args: readonly string[],
|
|
58
|
+
options: VaultCmdOptions = {},
|
|
59
|
+
): Promise<number> {
|
|
60
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
61
|
+
const [sub, ...rest] = args;
|
|
62
|
+
if (!sub || sub === "--help" || sub === "-h") {
|
|
63
|
+
write(`oke vault set <NAME> [value]
|
|
64
|
+
oke vault list
|
|
65
|
+
oke vault import <file>
|
|
66
|
+
oke vault key rotate
|
|
67
|
+
`);
|
|
68
|
+
return sub ? 0 : 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const cwd = options.cwd ?? process.cwd();
|
|
72
|
+
const envFile = resolve(cwd, options.envFile ?? ".env.local");
|
|
73
|
+
const store = options.store ?? (await openEnvStore(envFile));
|
|
74
|
+
|
|
75
|
+
if (sub === "set") {
|
|
76
|
+
const name = rest[0];
|
|
77
|
+
if (!name) {
|
|
78
|
+
console.error("Usage: oke vault set <NAME> [value]");
|
|
79
|
+
return 1;
|
|
80
|
+
}
|
|
81
|
+
let value = rest[1];
|
|
82
|
+
if (value === undefined) {
|
|
83
|
+
const read =
|
|
84
|
+
options.readLine ??
|
|
85
|
+
(async () => {
|
|
86
|
+
write(`Enter value for ${name}: `);
|
|
87
|
+
const chunks: Buffer[] = [];
|
|
88
|
+
for await (const chunk of Bun.stdin.stream()) {
|
|
89
|
+
chunks.push(Buffer.from(chunk));
|
|
90
|
+
if (Buffer.concat(chunks).includes(0x0a)) break;
|
|
91
|
+
}
|
|
92
|
+
return Buffer.concat(chunks).toString("utf8").trim();
|
|
93
|
+
});
|
|
94
|
+
value = await read(`Enter value for ${name}: `);
|
|
95
|
+
}
|
|
96
|
+
store.set(name, value);
|
|
97
|
+
await store.save?.();
|
|
98
|
+
write(`oke vault: set ${name}\n`);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (sub === "list") {
|
|
103
|
+
const names = store.names();
|
|
104
|
+
if (names.length === 0) {
|
|
105
|
+
write("oke vault: (empty)\n");
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
for (const n of names) write(`${n}\n`);
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (sub === "import") {
|
|
113
|
+
const file = rest[0];
|
|
114
|
+
if (!file) {
|
|
115
|
+
console.error("Usage: oke vault import <file>");
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
const imported = await openEnvStore(resolve(cwd, file));
|
|
119
|
+
for (const n of imported.names()) {
|
|
120
|
+
const v = imported.get(n);
|
|
121
|
+
if (v !== undefined) store.set(n, v);
|
|
122
|
+
}
|
|
123
|
+
await store.save?.();
|
|
124
|
+
write(`oke vault: imported ${imported.names().length} key(s) from ${file}\n`);
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (sub === "key" && rest[0] === "rotate") {
|
|
129
|
+
const buf = new Uint8Array(32);
|
|
130
|
+
crypto.getRandomValues(buf);
|
|
131
|
+
const key = Array.from(buf, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
132
|
+
store.set("OKE_VAULT_KEY", key);
|
|
133
|
+
await store.save?.();
|
|
134
|
+
write("oke vault: rotated OKE_VAULT_KEY\n");
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
console.error(`Unknown vault command: ${sub}`);
|
|
139
|
+
return 1;
|
|
140
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle entry for the client size budget.
|
|
3
|
+
* Returns live bindings so minify cannot drop the runtime graph.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { createClient } from "./create.ts";
|
|
7
|
+
import {
|
|
8
|
+
isErrorCode,
|
|
9
|
+
isFail,
|
|
10
|
+
isOk,
|
|
11
|
+
isTransportError,
|
|
12
|
+
} from "./errors.ts";
|
|
13
|
+
import { createTransport } from "./transport.ts";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Anchor for the size check — must reference every runtime export.
|
|
17
|
+
*/
|
|
18
|
+
export function __okeClientBudgetAnchor(): {
|
|
19
|
+
createClient: typeof createClient;
|
|
20
|
+
createTransport: typeof createTransport;
|
|
21
|
+
isErrorCode: typeof isErrorCode;
|
|
22
|
+
isFail: typeof isFail;
|
|
23
|
+
isOk: typeof isOk;
|
|
24
|
+
isTransportError: typeof isTransportError;
|
|
25
|
+
} {
|
|
26
|
+
return {
|
|
27
|
+
createClient,
|
|
28
|
+
createTransport,
|
|
29
|
+
isErrorCode,
|
|
30
|
+
isFail,
|
|
31
|
+
isOk,
|
|
32
|
+
isTransportError,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client runtime budget — AGENTS.md / unified-theory §24.
|
|
3
|
+
* Limit: < 3 kB gzipped (minified bundle).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, test } from "bun:test";
|
|
7
|
+
import { CLIENT_BUDGET_BYTES } from "../release/limits.ts";
|
|
8
|
+
import { measureClientGzipBytes } from "../release/measure.ts";
|
|
9
|
+
|
|
10
|
+
describe("client bundle budget", () => {
|
|
11
|
+
test(`okengine/client < ${CLIENT_BUDGET_BYTES} bytes gzipped`, async () => {
|
|
12
|
+
const size = await measureClientGzipBytes();
|
|
13
|
+
console.log(`client bundle gzip=${size} budget=${CLIENT_BUDGET_BYTES}`);
|
|
14
|
+
expect(size).toBeGreaterThan(0);
|
|
15
|
+
expect(size).toBeLessThan(CLIENT_BUDGET_BYTES);
|
|
16
|
+
});
|
|
17
|
+
});
|