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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke doctor` — verify secrets, ports, drivers, tenancy, schema drift.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createServer } from "node:net";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import type { Manifest } from "../manifest/types.ts";
|
|
8
|
+
import { APP_PORT, CONSOLE_PORT, MCP_PORT } from "../runtime/types.ts";
|
|
9
|
+
import { hasFlag, wantsJson } from "./args.ts";
|
|
10
|
+
import { checkManifestPiiAsks } from "./doctor-pii.ts";
|
|
11
|
+
import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
|
|
12
|
+
import { loadManifest } from "./load-config.ts";
|
|
13
|
+
import { schemaFingerprint, readSchemaFingerprint } from "./schema.ts";
|
|
14
|
+
|
|
15
|
+
/** One doctor finding. */
|
|
16
|
+
export interface DoctorFinding {
|
|
17
|
+
readonly code:
|
|
18
|
+
| "missing_secret"
|
|
19
|
+
| "port_conflict"
|
|
20
|
+
| "schema_drift"
|
|
21
|
+
| "tenancy"
|
|
22
|
+
| "driver"
|
|
23
|
+
| "pii_ask";
|
|
24
|
+
readonly severity: "error" | "warn";
|
|
25
|
+
readonly message: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Options for {@link runDoctor}. */
|
|
29
|
+
export interface DoctorOptions {
|
|
30
|
+
readonly cwd?: string;
|
|
31
|
+
readonly manifestPath?: string;
|
|
32
|
+
readonly manifest?: Manifest;
|
|
33
|
+
/** Secret names expected (from Manifest vault or injection). */
|
|
34
|
+
readonly secrets?: readonly string[];
|
|
35
|
+
/** Env reader (tests). */
|
|
36
|
+
readonly env?: (key: string) => string | undefined;
|
|
37
|
+
/** Ports to probe (defaults O·K·E). */
|
|
38
|
+
readonly ports?: readonly number[];
|
|
39
|
+
/** Inject port-in-use probe (tests). */
|
|
40
|
+
readonly isPortInUse?: (port: number) => Promise<boolean>;
|
|
41
|
+
/** Expected schema fingerprint (tests). */
|
|
42
|
+
readonly expectedSchemaFingerprint?: string;
|
|
43
|
+
/** Current schema fingerprint (tests). */
|
|
44
|
+
readonly currentSchemaFingerprint?: string | null;
|
|
45
|
+
readonly write?: (text: string) => void;
|
|
46
|
+
/** Write hints / progress (defaults to stderr). */
|
|
47
|
+
readonly writeErr?: (text: string) => void;
|
|
48
|
+
/** Emit only JSON on stdout. */
|
|
49
|
+
readonly json?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Run doctor checks.
|
|
54
|
+
*
|
|
55
|
+
* Exit {@link EXIT_RUNTIME} when any error-severity finding exists;
|
|
56
|
+
* {@link EXIT_OK} otherwise (including warn-only).
|
|
57
|
+
*
|
|
58
|
+
* @param options - Manifest / probes
|
|
59
|
+
*/
|
|
60
|
+
export async function runDoctor(options: DoctorOptions = {}): Promise<{
|
|
61
|
+
readonly code: number;
|
|
62
|
+
readonly findings: readonly DoctorFinding[];
|
|
63
|
+
}> {
|
|
64
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
65
|
+
const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
|
|
66
|
+
const json = options.json ?? false;
|
|
67
|
+
const cwd = options.cwd ?? process.cwd();
|
|
68
|
+
const findings: DoctorFinding[] = [];
|
|
69
|
+
|
|
70
|
+
let manifest = options.manifest;
|
|
71
|
+
if (!manifest) {
|
|
72
|
+
const path = resolve(cwd, options.manifestPath ?? "oke.manifest.json");
|
|
73
|
+
const file = Bun.file(path);
|
|
74
|
+
if (await file.exists()) {
|
|
75
|
+
manifest = await loadManifest(path);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const env = options.env ?? ((k) => Bun.env[k] ?? process.env[k]);
|
|
80
|
+
const secretNames =
|
|
81
|
+
options.secrets ??
|
|
82
|
+
(manifest?.vault ? Object.keys(manifest.vault) : []);
|
|
83
|
+
|
|
84
|
+
for (const name of secretNames) {
|
|
85
|
+
const value = env(name);
|
|
86
|
+
if (value === undefined || value.length === 0) {
|
|
87
|
+
const description = manifest?.vault?.[name]?.description;
|
|
88
|
+
findings.push({
|
|
89
|
+
code: "missing_secret",
|
|
90
|
+
severity: "error",
|
|
91
|
+
message: description
|
|
92
|
+
? `missing secret ${name}: ${description}`
|
|
93
|
+
: `missing secret ${name}`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const ports = options.ports ?? [APP_PORT, CONSOLE_PORT, MCP_PORT];
|
|
99
|
+
const probe = options.isPortInUse ?? isPortInUse;
|
|
100
|
+
for (const port of ports) {
|
|
101
|
+
if (await probe(port)) {
|
|
102
|
+
findings.push({
|
|
103
|
+
code: "port_conflict",
|
|
104
|
+
severity: "error",
|
|
105
|
+
message: `port ${port} is already in use`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const current =
|
|
111
|
+
options.currentSchemaFingerprint !== undefined
|
|
112
|
+
? options.currentSchemaFingerprint
|
|
113
|
+
: await readSchemaFingerprint(cwd);
|
|
114
|
+
// Only compare when a schema artefact exists or the caller injects fingerprints.
|
|
115
|
+
if (
|
|
116
|
+
current !== null ||
|
|
117
|
+
options.expectedSchemaFingerprint !== undefined ||
|
|
118
|
+
options.currentSchemaFingerprint !== undefined
|
|
119
|
+
) {
|
|
120
|
+
const expected =
|
|
121
|
+
options.expectedSchemaFingerprint ??
|
|
122
|
+
(await schemaFingerprint(cwd).catch(() => null));
|
|
123
|
+
if (expected !== null && current !== null && expected !== current) {
|
|
124
|
+
findings.push({
|
|
125
|
+
code: "schema_drift",
|
|
126
|
+
severity: "error",
|
|
127
|
+
message:
|
|
128
|
+
"schema drift detected — run `oke schema generate` (or --check in CI)",
|
|
129
|
+
});
|
|
130
|
+
} else if (expected !== null && current === null) {
|
|
131
|
+
findings.push({
|
|
132
|
+
code: "schema_drift",
|
|
133
|
+
severity: "error",
|
|
134
|
+
message: "schema/oke.ts missing — run `oke schema generate`",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (manifest?.tenancy?.isolation) {
|
|
140
|
+
// Structural tenancy check is compile-time; doctor warns when isolation
|
|
141
|
+
// is set but no tenant resolver string is recorded on the Manifest.
|
|
142
|
+
// (Resolver is code — absence of flows is not an error here.)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (manifest) {
|
|
146
|
+
findings.push(...checkManifestPiiAsks(manifest));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const ok = !findings.some((f) => f.severity === "error");
|
|
150
|
+
const code = ok ? EXIT_OK : EXIT_RUNTIME;
|
|
151
|
+
|
|
152
|
+
if (json) {
|
|
153
|
+
write(`${JSON.stringify({ ok, findings }, null, 2)}\n`);
|
|
154
|
+
if (!ok) {
|
|
155
|
+
writeErr("Hint: fix error-severity findings, then re-run oke doctor.\n");
|
|
156
|
+
}
|
|
157
|
+
return { code, findings };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (findings.length === 0) {
|
|
161
|
+
write("oke doctor: ok\n");
|
|
162
|
+
return { code: EXIT_OK, findings };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
write(`oke doctor: ${findings.length} finding(s)\n`);
|
|
166
|
+
for (const f of findings) {
|
|
167
|
+
write(` [${f.severity}] ${f.code}: ${f.message}\n`);
|
|
168
|
+
}
|
|
169
|
+
return { code, findings };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* CLI entry for `oke doctor`.
|
|
174
|
+
*
|
|
175
|
+
* @param args - Args after `doctor`
|
|
176
|
+
*/
|
|
177
|
+
export async function doctorCli(args: readonly string[]): Promise<number> {
|
|
178
|
+
if (hasFlag(args, "--diff", "-d")) {
|
|
179
|
+
const { doctorDiffCli } = await import("./doctor-diff.ts");
|
|
180
|
+
return doctorDiffCli(args);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
let manifestPath: string | undefined;
|
|
184
|
+
const json = wantsJson(args);
|
|
185
|
+
for (let i = 0; i < args.length; i++) {
|
|
186
|
+
const a = args[i]!;
|
|
187
|
+
if (a === "--manifest" || a === "-m") manifestPath = args[++i];
|
|
188
|
+
else if (a === "--help" || a === "-h") {
|
|
189
|
+
console.log(`oke doctor [--manifest|-m path] [--json|-j]
|
|
190
|
+
oke doctor --diff|-d [--before|-b <path> --after|-a <path>] [--base|-B <branch>]
|
|
191
|
+
|
|
192
|
+
Verify secrets, ports, schema drift, and PII→model egress before serving.
|
|
193
|
+
|
|
194
|
+
--diff CI gate: block undeclared contract breaks (Manifest Diff).
|
|
195
|
+
Default baseline is git merge-base (main/master) vs the working
|
|
196
|
+
tree; pass --before/--after for an explicit comparison.
|
|
197
|
+
|
|
198
|
+
--json Machine-parseable JSON on stdout; hints on stderr.
|
|
199
|
+
`);
|
|
200
|
+
return EXIT_OK;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const { code } = await runDoctor({ manifestPath, json });
|
|
204
|
+
return code;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* True when something is already listening on `port`.
|
|
209
|
+
*
|
|
210
|
+
* @param port - TCP port
|
|
211
|
+
*/
|
|
212
|
+
export function isPortInUse(port: number): Promise<boolean> {
|
|
213
|
+
return new Promise((resolvePromise) => {
|
|
214
|
+
const server = createServer();
|
|
215
|
+
server.once("error", (err: NodeJS.ErrnoException) => {
|
|
216
|
+
resolvePromise(err.code === "EADDRINUSE");
|
|
217
|
+
});
|
|
218
|
+
server.once("listening", () => {
|
|
219
|
+
server.close(() => resolvePromise(false));
|
|
220
|
+
});
|
|
221
|
+
server.listen(port, "127.0.0.1");
|
|
222
|
+
});
|
|
223
|
+
}
|
package/src/cli/eval.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke eval` — run prompt eval sets; fails CI on regression.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import {
|
|
7
|
+
parseEvalJsonl,
|
|
8
|
+
runPromptEvals,
|
|
9
|
+
type EvalCase,
|
|
10
|
+
} from "../elements/ai/eval.ts";
|
|
11
|
+
import type { Manifest } from "../manifest/types.ts";
|
|
12
|
+
|
|
13
|
+
/** Options for {@link runOkeEval}. */
|
|
14
|
+
export interface OkeEvalOptions {
|
|
15
|
+
/** Manifest path (defaults to `./oke.manifest.json`). */
|
|
16
|
+
readonly manifestPath?: string;
|
|
17
|
+
/** Injected Manifest (tests). */
|
|
18
|
+
readonly manifest?: Manifest;
|
|
19
|
+
/**
|
|
20
|
+
* Ask implementation for a prompt (tests / wired runtime).
|
|
21
|
+
*
|
|
22
|
+
* @param prompt - Prompt name
|
|
23
|
+
* @param input - Case input
|
|
24
|
+
*/
|
|
25
|
+
readonly ask?: (prompt: string, input: unknown) => Promise<unknown>;
|
|
26
|
+
/** Load eval JSONL by relative path (defaults to Bun.file). */
|
|
27
|
+
readonly loadEvals?: (path: string) => Promise<string>;
|
|
28
|
+
/** Write stdout. */
|
|
29
|
+
readonly write?: (text: string) => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Run every prompt eval set declared in the Manifest.
|
|
34
|
+
*
|
|
35
|
+
* @param options - Manifest + ask wiring
|
|
36
|
+
* @returns Exit code (1 on any failure)
|
|
37
|
+
*/
|
|
38
|
+
export async function runOkeEval(
|
|
39
|
+
options: OkeEvalOptions = {},
|
|
40
|
+
): Promise<number> {
|
|
41
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
42
|
+
let manifest = options.manifest;
|
|
43
|
+
if (!manifest) {
|
|
44
|
+
const path = resolve(options.manifestPath ?? "oke.manifest.json");
|
|
45
|
+
const file = Bun.file(path);
|
|
46
|
+
if (!(await file.exists())) {
|
|
47
|
+
console.error(`oke eval: manifest not found: ${path}`);
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
manifest = (await file.json()) as Manifest;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const prompts = manifest.ai?.prompts ?? {};
|
|
54
|
+
const names = Object.keys(prompts);
|
|
55
|
+
if (names.length === 0) {
|
|
56
|
+
write("oke eval: no prompts declared\n");
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const load =
|
|
61
|
+
options.loadEvals ??
|
|
62
|
+
(async (p: string) => Bun.file(resolve(p)).text());
|
|
63
|
+
|
|
64
|
+
let failed = 0;
|
|
65
|
+
for (const name of names) {
|
|
66
|
+
const prompt = prompts[name]!;
|
|
67
|
+
if (!prompt.evals) {
|
|
68
|
+
write(`oke eval: skip ${name} (no evals)\n`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!options.ask) {
|
|
72
|
+
console.error(
|
|
73
|
+
`oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`,
|
|
74
|
+
);
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
let cases: EvalCase[];
|
|
78
|
+
try {
|
|
79
|
+
cases = parseEvalJsonl(await load(prompt.evals));
|
|
80
|
+
} catch (err) {
|
|
81
|
+
console.error(
|
|
82
|
+
`oke eval: failed to load ${prompt.evals}: ${
|
|
83
|
+
err instanceof Error ? err.message : String(err)
|
|
84
|
+
}`,
|
|
85
|
+
);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
const suite = await runPromptEvals({
|
|
89
|
+
prompt: name,
|
|
90
|
+
version: prompt.version,
|
|
91
|
+
cases,
|
|
92
|
+
ask: (input) => options.ask!(name, input),
|
|
93
|
+
});
|
|
94
|
+
write(
|
|
95
|
+
`oke eval: ${name}@${prompt.version ?? "?"} — ${suite.passed} passed, ${suite.failed} failed\n`,
|
|
96
|
+
);
|
|
97
|
+
if (!suite.ok) failed++;
|
|
98
|
+
}
|
|
99
|
+
return failed > 0 ? 1 : 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* CLI entry for `oke eval`.
|
|
104
|
+
*
|
|
105
|
+
* @param args - Remaining argv after `eval`
|
|
106
|
+
*/
|
|
107
|
+
export async function evalCli(args: string[]): Promise<number> {
|
|
108
|
+
let manifestPath: string | undefined;
|
|
109
|
+
for (let i = 0; i < args.length; i++) {
|
|
110
|
+
const a = args[i]!;
|
|
111
|
+
if (a === "--manifest" || a === "-m") {
|
|
112
|
+
manifestPath = args[++i];
|
|
113
|
+
} else if (a === "--help" || a === "-h") {
|
|
114
|
+
console.log(`oke eval [--manifest oke.manifest.json]
|
|
115
|
+
|
|
116
|
+
Run prompt eval sets declared in the Manifest. Fails CI on regression.
|
|
117
|
+
`);
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return runOkeEval({ manifestPath });
|
|
122
|
+
}
|
package/src/cli/exit.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke` CLI exit codes — gflows-aligned 0/1/2 convention.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Success. */
|
|
6
|
+
export const EXIT_OK = 0;
|
|
7
|
+
|
|
8
|
+
/** Usage / validation error (missing args, unknown command, bad flags). */
|
|
9
|
+
export const EXIT_USAGE = 1;
|
|
10
|
+
|
|
11
|
+
/** Runtime / environment / check failure (doctor findings, missing config, I/O). */
|
|
12
|
+
export const EXIT_RUNTIME = 2;
|
|
13
|
+
|
|
14
|
+
/** Human-readable exit-code table for `oke help` / README. */
|
|
15
|
+
export const EXIT_CODE_HELP = `Exit codes:
|
|
16
|
+
0 success
|
|
17
|
+
1 usage / validation
|
|
18
|
+
2 runtime / environment / check failure
|
|
19
|
+
` as const;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke gates list` prints every Module:Action pair.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import type { Manifest } from "../manifest/types.ts";
|
|
7
|
+
import { gatesList, gatesListCli } from "./gates-list.ts";
|
|
8
|
+
|
|
9
|
+
describe("oke gates list", () => {
|
|
10
|
+
test("prints every pair derived from the Manifest", async () => {
|
|
11
|
+
const manifest: Manifest = {
|
|
12
|
+
oke: "1.0",
|
|
13
|
+
app: "skyport",
|
|
14
|
+
flows: {
|
|
15
|
+
"bookings.create": { plane: "user", gates: ["booking:create"] },
|
|
16
|
+
"flights.search": { plane: "user" },
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
let out = "";
|
|
20
|
+
const code = await gatesList({
|
|
21
|
+
manifest,
|
|
22
|
+
write: (t) => {
|
|
23
|
+
out += t;
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
expect(code).toBe(0);
|
|
27
|
+
expect(out).toContain("bookings:create");
|
|
28
|
+
expect(out).toContain("flights:search");
|
|
29
|
+
expect(out).toContain("booking:create");
|
|
30
|
+
expect(out).toContain("console:flows:invoke-as");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("CLI help documents --json|-j", async () => {
|
|
34
|
+
let out = "";
|
|
35
|
+
const orig = console.log;
|
|
36
|
+
console.log = (...args: unknown[]) => {
|
|
37
|
+
out += args.map(String).join(" ");
|
|
38
|
+
};
|
|
39
|
+
try {
|
|
40
|
+
expect(await gatesListCli(["--help"])).toBe(0);
|
|
41
|
+
} finally {
|
|
42
|
+
console.log = orig;
|
|
43
|
+
}
|
|
44
|
+
expect(out).toContain("--json");
|
|
45
|
+
expect(out).toContain("-j");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke gates list` — print every Module:Action pair derived from the Manifest.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import {
|
|
7
|
+
deriveModuleActions,
|
|
8
|
+
formatGatesList,
|
|
9
|
+
} from "../elements/gate/permissions.ts";
|
|
10
|
+
import type { Manifest } from "../manifest/types.ts";
|
|
11
|
+
import { wantsJson } from "./args.ts";
|
|
12
|
+
import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
|
|
13
|
+
|
|
14
|
+
/** Options for {@link gatesList}. */
|
|
15
|
+
export interface GatesListOptions {
|
|
16
|
+
/** Path to a Manifest JSON file (defaults to `./oke.manifest.json`). */
|
|
17
|
+
readonly manifestPath?: string;
|
|
18
|
+
/** Injected Manifest (tests). */
|
|
19
|
+
readonly manifest?: Manifest;
|
|
20
|
+
/** Write stdout (defaults to console.log). */
|
|
21
|
+
readonly write?: (text: string) => void;
|
|
22
|
+
/** Write hints / errors (defaults to stderr). */
|
|
23
|
+
readonly writeErr?: (text: string) => void;
|
|
24
|
+
/** Emit only JSON on stdout. */
|
|
25
|
+
readonly json?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* List every Module:Action pair.
|
|
30
|
+
*
|
|
31
|
+
* @param options - Manifest source
|
|
32
|
+
* @returns Exit code
|
|
33
|
+
*/
|
|
34
|
+
export async function gatesList(options: GatesListOptions = {}): Promise<number> {
|
|
35
|
+
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
36
|
+
const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
|
|
37
|
+
const json = options.json ?? false;
|
|
38
|
+
let manifest = options.manifest;
|
|
39
|
+
if (!manifest) {
|
|
40
|
+
const path = resolve(options.manifestPath ?? "oke.manifest.json");
|
|
41
|
+
const file = Bun.file(path);
|
|
42
|
+
if (!(await file.exists())) {
|
|
43
|
+
const msg = `oke gates list: manifest not found: ${path}`;
|
|
44
|
+
if (json) {
|
|
45
|
+
write(`${JSON.stringify({ ok: false, error: msg }, null, 2)}\n`);
|
|
46
|
+
} else {
|
|
47
|
+
writeErr(`${msg}\n`);
|
|
48
|
+
}
|
|
49
|
+
return EXIT_RUNTIME;
|
|
50
|
+
}
|
|
51
|
+
manifest = (await file.json()) as Manifest;
|
|
52
|
+
}
|
|
53
|
+
const gates = deriveModuleActions(manifest);
|
|
54
|
+
if (json) {
|
|
55
|
+
write(`${JSON.stringify({ ok: true, gates }, null, 2)}\n`);
|
|
56
|
+
return EXIT_OK;
|
|
57
|
+
}
|
|
58
|
+
write(formatGatesList(gates));
|
|
59
|
+
return EXIT_OK;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* CLI entry for `oke gates list`.
|
|
64
|
+
*
|
|
65
|
+
* @param args - Remaining argv after `gates list`
|
|
66
|
+
*/
|
|
67
|
+
export async function gatesListCli(args: string[]): Promise<number> {
|
|
68
|
+
let manifestPath: string | undefined;
|
|
69
|
+
const json = wantsJson(args);
|
|
70
|
+
for (let i = 0; i < args.length; i++) {
|
|
71
|
+
const a = args[i]!;
|
|
72
|
+
if (a === "--manifest" || a === "-m") {
|
|
73
|
+
manifestPath = args[++i];
|
|
74
|
+
} else if (a === "--help" || a === "-h") {
|
|
75
|
+
console.log(`oke gates list [--manifest|-m oke.manifest.json] [--json|-j]
|
|
76
|
+
|
|
77
|
+
Print every Module:Action pair derived from the Manifest.
|
|
78
|
+
--json Machine-parseable JSON on stdout; hints on stderr.
|
|
79
|
+
`);
|
|
80
|
+
return EXIT_OK;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return gatesList({ manifestPath, json });
|
|
84
|
+
}
|