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,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crypto-shredding for right-to-erasure on immutable Parquet partitions.
|
|
3
|
+
*
|
|
4
|
+
* Personal fields are encrypted with a per-subject key held in the Vault.
|
|
5
|
+
* `oke privacy erase --subject <id>` deletes the key — archived bytes become
|
|
6
|
+
* permanently unreadable without rewriting partitions (console §9.11).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { VaultRuntime } from "../elements/vault.ts";
|
|
10
|
+
|
|
11
|
+
/** Prefix for per-subject shred keys in the Vault. */
|
|
12
|
+
export const SUBJECT_KEY_PREFIX = "oke.subject.";
|
|
13
|
+
|
|
14
|
+
/** Marker returned when a field cannot be decrypted (key shredded). */
|
|
15
|
+
export const SHREDDED = "[shredded]";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Vault key name for a subject.
|
|
19
|
+
*
|
|
20
|
+
* @param subjectId - Subject identifier
|
|
21
|
+
*/
|
|
22
|
+
export function subjectKeyName(subjectId: string): string {
|
|
23
|
+
return `${SUBJECT_KEY_PREFIX}${subjectId}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Minimal vault surface needed for subject keys. */
|
|
27
|
+
export interface SubjectKeyVault {
|
|
28
|
+
/**
|
|
29
|
+
* Read a secret by name.
|
|
30
|
+
*
|
|
31
|
+
* @param name - Secret name
|
|
32
|
+
*/
|
|
33
|
+
read(name: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Write / overwrite a secret (mutable vault bags only).
|
|
36
|
+
*
|
|
37
|
+
* @param name - Secret name
|
|
38
|
+
* @param value - Cleartext
|
|
39
|
+
*/
|
|
40
|
+
put(name: string, value: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Delete a secret.
|
|
43
|
+
*
|
|
44
|
+
* @param name - Secret name
|
|
45
|
+
*/
|
|
46
|
+
delete(name: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Whether a secret is present.
|
|
49
|
+
*
|
|
50
|
+
* @param name - Secret name
|
|
51
|
+
*/
|
|
52
|
+
has(name: string): boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Adapt a {@link VaultRuntime} that supports put/delete into {@link SubjectKeyVault}.
|
|
57
|
+
*
|
|
58
|
+
* @param vault - Booted vault runtime with mutation support
|
|
59
|
+
*/
|
|
60
|
+
export function subjectKeysFromVault(vault: VaultRuntime): SubjectKeyVault {
|
|
61
|
+
return {
|
|
62
|
+
read(name) {
|
|
63
|
+
return vault.read(name);
|
|
64
|
+
},
|
|
65
|
+
put(name, value) {
|
|
66
|
+
if (typeof vault.put !== "function") {
|
|
67
|
+
throw new Error("vault: put() required for subject keys");
|
|
68
|
+
}
|
|
69
|
+
vault.put(name, value);
|
|
70
|
+
},
|
|
71
|
+
delete(name) {
|
|
72
|
+
if (typeof vault.delete !== "function") {
|
|
73
|
+
throw new Error("vault: delete() required for subject-key erasure");
|
|
74
|
+
}
|
|
75
|
+
return vault.delete(name);
|
|
76
|
+
},
|
|
77
|
+
has(name) {
|
|
78
|
+
return vault.names().includes(name);
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* In-memory subject-key vault (tests / when no Vault element is wired).
|
|
85
|
+
*/
|
|
86
|
+
export function createMemorySubjectKeys(
|
|
87
|
+
seed?: Readonly<Record<string, string>>,
|
|
88
|
+
): SubjectKeyVault {
|
|
89
|
+
const map = new Map<string, string>(Object.entries(seed ?? {}));
|
|
90
|
+
return {
|
|
91
|
+
read(name) {
|
|
92
|
+
const v = map.get(name);
|
|
93
|
+
if (v === undefined) throw new Error(`subject key missing: ${name}`);
|
|
94
|
+
return v;
|
|
95
|
+
},
|
|
96
|
+
put(name, value) {
|
|
97
|
+
map.set(name, value);
|
|
98
|
+
},
|
|
99
|
+
delete(name) {
|
|
100
|
+
return map.delete(name);
|
|
101
|
+
},
|
|
102
|
+
has(name) {
|
|
103
|
+
return map.has(name);
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Ensure a per-subject AES-256 key exists; return raw key bytes.
|
|
110
|
+
*
|
|
111
|
+
* @param keys - Subject key vault
|
|
112
|
+
* @param subjectId - Subject id
|
|
113
|
+
*/
|
|
114
|
+
export async function ensureSubjectKey(
|
|
115
|
+
keys: SubjectKeyVault,
|
|
116
|
+
subjectId: string,
|
|
117
|
+
): Promise<Uint8Array> {
|
|
118
|
+
const name = subjectKeyName(subjectId);
|
|
119
|
+
if (!keys.has(name)) {
|
|
120
|
+
const raw = crypto.getRandomValues(new Uint8Array(32));
|
|
121
|
+
keys.put(name, Buffer.from(raw).toString("base64"));
|
|
122
|
+
return raw;
|
|
123
|
+
}
|
|
124
|
+
return Buffer.from(keys.read(name), "base64");
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Encrypt cleartext fields under the subject's key.
|
|
129
|
+
*
|
|
130
|
+
* @param keys - Subject key vault
|
|
131
|
+
* @param subjectId - Subject id
|
|
132
|
+
* @param fields - Cleartext field map
|
|
133
|
+
*/
|
|
134
|
+
export async function archiveFields(
|
|
135
|
+
keys: SubjectKeyVault,
|
|
136
|
+
subjectId: string,
|
|
137
|
+
fields: Readonly<Record<string, string>>,
|
|
138
|
+
): Promise<Record<string, string>> {
|
|
139
|
+
const key = await ensureSubjectKey(keys, subjectId);
|
|
140
|
+
const out: Record<string, string> = {};
|
|
141
|
+
for (const [name, value] of Object.entries(fields)) {
|
|
142
|
+
out[name] = await encryptAesGcm(value, key);
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Decrypt archived fields. Missing / shredded keys yield {@link SHREDDED}.
|
|
149
|
+
*
|
|
150
|
+
* @param keys - Subject key vault
|
|
151
|
+
* @param subjectId - Subject id
|
|
152
|
+
* @param archived - Ciphertext field map
|
|
153
|
+
*/
|
|
154
|
+
export async function revealArchived(
|
|
155
|
+
keys: SubjectKeyVault,
|
|
156
|
+
subjectId: string,
|
|
157
|
+
archived: Readonly<Record<string, string>>,
|
|
158
|
+
): Promise<Record<string, string>> {
|
|
159
|
+
const name = subjectKeyName(subjectId);
|
|
160
|
+
if (!keys.has(name)) {
|
|
161
|
+
const shredded: Record<string, string> = {};
|
|
162
|
+
for (const k of Object.keys(archived)) shredded[k] = SHREDDED;
|
|
163
|
+
return shredded;
|
|
164
|
+
}
|
|
165
|
+
const key = Buffer.from(keys.read(name), "base64");
|
|
166
|
+
const out: Record<string, string> = {};
|
|
167
|
+
for (const [field, blob] of Object.entries(archived)) {
|
|
168
|
+
try {
|
|
169
|
+
out[field] = await decryptAesGcm(blob, key);
|
|
170
|
+
} catch {
|
|
171
|
+
out[field] = SHREDDED;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Erase a subject by deleting their Vault key (crypto-shred).
|
|
179
|
+
*
|
|
180
|
+
* @param keys - Subject key vault
|
|
181
|
+
* @param subjectId - Subject id
|
|
182
|
+
* @returns Whether a key was deleted
|
|
183
|
+
*/
|
|
184
|
+
export function eraseSubject(
|
|
185
|
+
keys: SubjectKeyVault,
|
|
186
|
+
subjectId: string,
|
|
187
|
+
): boolean {
|
|
188
|
+
return keys.delete(subjectKeyName(subjectId));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async function encryptAesGcm(
|
|
192
|
+
plaintext: string,
|
|
193
|
+
keyBytes: Uint8Array,
|
|
194
|
+
): Promise<string> {
|
|
195
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
196
|
+
const keyBuf = toArrayBuffer(keyBytes);
|
|
197
|
+
const cryptoKey = await crypto.subtle.importKey(
|
|
198
|
+
"raw",
|
|
199
|
+
keyBuf,
|
|
200
|
+
{ name: "AES-GCM" },
|
|
201
|
+
false,
|
|
202
|
+
["encrypt"],
|
|
203
|
+
);
|
|
204
|
+
const cipher = await crypto.subtle.encrypt(
|
|
205
|
+
{ name: "AES-GCM", iv },
|
|
206
|
+
cryptoKey,
|
|
207
|
+
new TextEncoder().encode(plaintext),
|
|
208
|
+
);
|
|
209
|
+
const packed = new Uint8Array(iv.length + cipher.byteLength);
|
|
210
|
+
packed.set(iv, 0);
|
|
211
|
+
packed.set(new Uint8Array(cipher), iv.length);
|
|
212
|
+
return Buffer.from(packed).toString("base64");
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async function decryptAesGcm(
|
|
216
|
+
blob: string,
|
|
217
|
+
keyBytes: Uint8Array,
|
|
218
|
+
): Promise<string> {
|
|
219
|
+
const packed = Buffer.from(blob, "base64");
|
|
220
|
+
const iv = toArrayBuffer(packed.subarray(0, 12));
|
|
221
|
+
const data = toArrayBuffer(packed.subarray(12));
|
|
222
|
+
const keyBuf = toArrayBuffer(keyBytes);
|
|
223
|
+
const cryptoKey = await crypto.subtle.importKey(
|
|
224
|
+
"raw",
|
|
225
|
+
keyBuf,
|
|
226
|
+
{ name: "AES-GCM" },
|
|
227
|
+
false,
|
|
228
|
+
["decrypt"],
|
|
229
|
+
);
|
|
230
|
+
const plain = await crypto.subtle.decrypt(
|
|
231
|
+
{ name: "AES-GCM", iv: new Uint8Array(iv) },
|
|
232
|
+
cryptoKey,
|
|
233
|
+
data,
|
|
234
|
+
);
|
|
235
|
+
return new TextDecoder().decode(plain);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** Copy into a real ArrayBuffer for Web Crypto BufferSource typing. */
|
|
239
|
+
function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {
|
|
240
|
+
const copy = new Uint8Array(bytes.byteLength);
|
|
241
|
+
copy.set(bytes);
|
|
242
|
+
return copy.buffer;
|
|
243
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wide-event types for the runs store.
|
|
3
|
+
*
|
|
4
|
+
* One flow execution = one wide event = one span. Traces, Overview and Runs
|
|
5
|
+
* are three views of this single store (console §9.11).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { EffectEntry } from "../kernel/effects.ts";
|
|
9
|
+
import type { RunLogLine } from "../kernel/run-telemetry.ts";
|
|
10
|
+
import type { FlowPlane } from "../manifest/types.ts";
|
|
11
|
+
|
|
12
|
+
export type { RunLogLine };
|
|
13
|
+
|
|
14
|
+
/** Protocol ids for runs store drivers. */
|
|
15
|
+
export type RunsDriverId = "files" | "memory" | "postgres" | "clickhouse";
|
|
16
|
+
|
|
17
|
+
/** Typed error carried on a failed run. */
|
|
18
|
+
export interface RunError {
|
|
19
|
+
/** Declared or framework error code. */
|
|
20
|
+
readonly code: string;
|
|
21
|
+
/** Human-readable message when present. */
|
|
22
|
+
readonly message?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Declared / observed dimensions available without manual instrumentation.
|
|
27
|
+
* Extra keys are allowed for outlier analysis.
|
|
28
|
+
*/
|
|
29
|
+
export type RunDimensions = Record<
|
|
30
|
+
string,
|
|
31
|
+
string | number | boolean | null | undefined
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* One wide event — the atomic observability record.
|
|
36
|
+
*
|
|
37
|
+
* Personal fields that must survive erasure go in {@link archived}
|
|
38
|
+
* (ciphertext under a per-subject Vault key).
|
|
39
|
+
*/
|
|
40
|
+
export interface WideEvent {
|
|
41
|
+
/** Run id (= span id). */
|
|
42
|
+
readonly id: string;
|
|
43
|
+
/** Parent run id when this execution was caused by another (trace chain). */
|
|
44
|
+
readonly parentId?: string;
|
|
45
|
+
/** Flow name. */
|
|
46
|
+
readonly flow: string;
|
|
47
|
+
/** Optional unit scope. */
|
|
48
|
+
readonly unit?: string;
|
|
49
|
+
/** Trigger kind (`http` · `every` · `signal` · `cdc` · `internal`). */
|
|
50
|
+
readonly trigger: string;
|
|
51
|
+
/** Auth plane. */
|
|
52
|
+
readonly plane: FlowPlane;
|
|
53
|
+
/** Tenant id when multi-tenancy is active. */
|
|
54
|
+
readonly tenant?: string | null;
|
|
55
|
+
/** Principal — user id or operator id. */
|
|
56
|
+
readonly principal?: string | null;
|
|
57
|
+
/** Subject id for crypto-shredding (defaults to principal / tenant). */
|
|
58
|
+
readonly subjectId?: string | null;
|
|
59
|
+
/** Gate names evaluated for this invocation. */
|
|
60
|
+
readonly gates: readonly string[];
|
|
61
|
+
/** Cache outcome observed through `fx.cache`. */
|
|
62
|
+
readonly cache: "hit" | "miss" | "none";
|
|
63
|
+
/** SQL role when a store runtime routed the flow. */
|
|
64
|
+
readonly replica?: "primary" | "replica";
|
|
65
|
+
/** Replica lag in milliseconds when observed. */
|
|
66
|
+
readonly replicaLagMs?: number;
|
|
67
|
+
/** AI cost accrued during the run. */
|
|
68
|
+
readonly cost?: number;
|
|
69
|
+
/** Prompt version when `fx.ask` was used. */
|
|
70
|
+
readonly promptVersion?: number;
|
|
71
|
+
/** Build / release version when known. */
|
|
72
|
+
readonly buildVersion?: string;
|
|
73
|
+
/** Typed error when the flow failed. */
|
|
74
|
+
readonly error?: RunError | null;
|
|
75
|
+
/** Effect ledger snapshot. */
|
|
76
|
+
readonly effects: readonly EffectEntry[];
|
|
77
|
+
/**
|
|
78
|
+
* `fx.log` lines — a field on the run, not a parallel stream.
|
|
79
|
+
*/
|
|
80
|
+
readonly logs: readonly RunLogLine[];
|
|
81
|
+
/** Wall duration in milliseconds. */
|
|
82
|
+
readonly durationMs: number;
|
|
83
|
+
/** Epoch-ms start. */
|
|
84
|
+
readonly startedAt: number;
|
|
85
|
+
/** Epoch-ms end. */
|
|
86
|
+
readonly endedAt: number;
|
|
87
|
+
/**
|
|
88
|
+
* Crypto-shredded personal fields: field name → ciphertext.
|
|
89
|
+
* Readable only while the per-subject Vault key exists.
|
|
90
|
+
*/
|
|
91
|
+
readonly archived?: Readonly<Record<string, string>>;
|
|
92
|
+
/**
|
|
93
|
+
* All queryable dimensions (declared + observed).
|
|
94
|
+
* Outlier explanation compares these across populations.
|
|
95
|
+
*/
|
|
96
|
+
readonly dimensions: RunDimensions;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Retention / redaction policy (lifecycle — not locality). */
|
|
100
|
+
export interface RunsRetention {
|
|
101
|
+
/**
|
|
102
|
+
* Keep operational runs for this duration, or `"forever"` (default).
|
|
103
|
+
* Deletion is a compliance action, not a cleanup job.
|
|
104
|
+
*/
|
|
105
|
+
readonly keep?: string | "forever";
|
|
106
|
+
/** Redact personal fields older than these durations. */
|
|
107
|
+
readonly redact?: Readonly<Record<string, string>>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** One SQL result row. */
|
|
111
|
+
export type RunsRow = Record<string, unknown>;
|
|
112
|
+
|
|
113
|
+
/** Runs store handle — append wide events and query them. */
|
|
114
|
+
export interface RunsStore {
|
|
115
|
+
/** Protocol driver id. */
|
|
116
|
+
readonly driverId: RunsDriverId;
|
|
117
|
+
/**
|
|
118
|
+
* Append one wide event (buffered; may flush to a partition).
|
|
119
|
+
*
|
|
120
|
+
* @param event - Wide event to store
|
|
121
|
+
*/
|
|
122
|
+
append(event: WideEvent): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Flush buffered events to durable partitions.
|
|
125
|
+
*/
|
|
126
|
+
flush(): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Run SQL against all visible partitions (local + object storage).
|
|
129
|
+
*
|
|
130
|
+
* @param sql - DuckDB / driver SQL
|
|
131
|
+
*/
|
|
132
|
+
query(sql: string): Promise<RunsRow[]>;
|
|
133
|
+
/**
|
|
134
|
+
* Materialise all events (test helper / small stores).
|
|
135
|
+
*/
|
|
136
|
+
all(): Promise<WideEvent[]>;
|
|
137
|
+
/** Close underlying resources. */
|
|
138
|
+
close(): Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Driver factory for the runs store. */
|
|
142
|
+
export interface RunsDriver {
|
|
143
|
+
/** Protocol id. */
|
|
144
|
+
readonly id: RunsDriverId;
|
|
145
|
+
/**
|
|
146
|
+
* Open a store.
|
|
147
|
+
*
|
|
148
|
+
* @param options - Driver-specific options
|
|
149
|
+
*/
|
|
150
|
+
open(options?: RunsOpenOptions): Promise<RunsStore>;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Options when opening a runs store. */
|
|
154
|
+
export interface RunsOpenOptions {
|
|
155
|
+
/** Local root for recent Parquet partitions (`files`). */
|
|
156
|
+
readonly localRoot?: string;
|
|
157
|
+
/** Optional object-storage bucket for older partitions (`files`). */
|
|
158
|
+
readonly remote?: {
|
|
159
|
+
readonly bucket: import("../drivers/types.ts").FilesBucket;
|
|
160
|
+
readonly prefix?: string;
|
|
161
|
+
};
|
|
162
|
+
/** Injected local files bucket (tests). */
|
|
163
|
+
readonly localBucket?: import("../drivers/types.ts").FilesBucket;
|
|
164
|
+
/**
|
|
165
|
+
* Age after which new writes go to object storage (engine locality detail).
|
|
166
|
+
* Default: 7 days. User never declares archive tiers.
|
|
167
|
+
*/
|
|
168
|
+
readonly hotWindowMs?: number;
|
|
169
|
+
/** Retention policy (compliance). */
|
|
170
|
+
readonly retention?: RunsRetention;
|
|
171
|
+
/** Postgres connection URL or injected client. */
|
|
172
|
+
readonly url?: string;
|
|
173
|
+
/** Injected client for postgres / clickhouse fakes. */
|
|
174
|
+
readonly client?: unknown;
|
|
175
|
+
/** Table / dataset name. */
|
|
176
|
+
readonly name?: string;
|
|
177
|
+
/** Build version stamped on every event when not set on the event. */
|
|
178
|
+
readonly buildVersion?: string;
|
|
179
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun runtime adapter — `Bun.serve`, `bun:sqlite`, `Bun.password`.
|
|
3
|
+
*
|
|
4
|
+
* Uses Bun native `routes` for HTTP paths the engine can express, with
|
|
5
|
+
* `fetch` as the fallback. Every request passes Host / Origin validation
|
|
6
|
+
* before the app pipeline (console §10.1).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { Database } from "bun:sqlite";
|
|
10
|
+
import { createBunCrypto, createEnv, createFiles, createTimers } from "./primitives.ts";
|
|
11
|
+
import { secureFetch } from "./security.ts";
|
|
12
|
+
import {
|
|
13
|
+
APP_PORT,
|
|
14
|
+
type FetchApp,
|
|
15
|
+
type Runtime,
|
|
16
|
+
type ServeOptions,
|
|
17
|
+
type ServerHandle,
|
|
18
|
+
} from "./types.ts";
|
|
19
|
+
|
|
20
|
+
/** Bun adapter — extends {@link Runtime} with native sqlite. */
|
|
21
|
+
export interface BunRuntime extends Runtime {
|
|
22
|
+
readonly name: "bun";
|
|
23
|
+
/**
|
|
24
|
+
* Open a `bun:sqlite` database (native binding).
|
|
25
|
+
*
|
|
26
|
+
* @param filename - Path, `":memory:"`, or omit for memory
|
|
27
|
+
* @param options - `bun:sqlite` open options
|
|
28
|
+
*/
|
|
29
|
+
sqlite(
|
|
30
|
+
filename?: string,
|
|
31
|
+
options?: ConstructorParameters<typeof Database>[1],
|
|
32
|
+
): Database;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Create the Bun runtime adapter.
|
|
37
|
+
*/
|
|
38
|
+
export function createBunRuntime(): BunRuntime {
|
|
39
|
+
return {
|
|
40
|
+
name: "bun",
|
|
41
|
+
timers: createTimers(),
|
|
42
|
+
crypto: createBunCrypto(),
|
|
43
|
+
env: createEnv(),
|
|
44
|
+
files: createFiles(),
|
|
45
|
+
sqlite(filename = ":memory:", options) {
|
|
46
|
+
return options === undefined
|
|
47
|
+
? new Database(filename)
|
|
48
|
+
: new Database(filename, options);
|
|
49
|
+
},
|
|
50
|
+
serve(app, options) {
|
|
51
|
+
return listenBun(app, options);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* True when a path can be registered on Bun.serve `routes`
|
|
58
|
+
* (static segments and `:param` only).
|
|
59
|
+
*
|
|
60
|
+
* @param path - Route path pattern
|
|
61
|
+
*/
|
|
62
|
+
export function isBunNativePath(path: string): boolean {
|
|
63
|
+
if (!path.startsWith("/")) return false;
|
|
64
|
+
// Reject optional params, regex, wildcards Bun's object routes may not mirror 1:1
|
|
65
|
+
if (/[*?{}()]/.test(path)) return false;
|
|
66
|
+
if (/\/:[^/]+\?/.test(path)) return false;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
type MethodHandlers = Partial<
|
|
71
|
+
Record<string, (req: Request) => Response | Promise<Response>>
|
|
72
|
+
>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Build Bun.serve `routes` from app HTTP bindings.
|
|
76
|
+
* Each handler runs the secured fetch pipeline (identical behaviour).
|
|
77
|
+
*
|
|
78
|
+
* @param app - Application
|
|
79
|
+
* @param fetchHandler - Secured fetch
|
|
80
|
+
*/
|
|
81
|
+
export function buildBunRoutes(
|
|
82
|
+
app: FetchApp,
|
|
83
|
+
fetchHandler: (request: Request) => Promise<Response>,
|
|
84
|
+
): Record<string, MethodHandlers> {
|
|
85
|
+
const routes: Record<string, MethodHandlers> = {};
|
|
86
|
+
const bindings = app.bindings ?? [];
|
|
87
|
+
for (const b of bindings) {
|
|
88
|
+
if (b.trigger.kind !== "http") continue;
|
|
89
|
+
const path = b.trigger.path;
|
|
90
|
+
const method = b.trigger.method;
|
|
91
|
+
if (typeof path !== "string" || typeof method !== "string") continue;
|
|
92
|
+
if (!isBunNativePath(path)) continue;
|
|
93
|
+
const methods = routes[path] ?? (routes[path] = {});
|
|
94
|
+
methods[method] = (req) => fetchHandler(req);
|
|
95
|
+
}
|
|
96
|
+
return routes;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function listenBun(app: FetchApp, options?: ServeOptions): ServerHandle {
|
|
100
|
+
const port = options?.port ?? APP_PORT;
|
|
101
|
+
const hostname = options?.hostname ?? "127.0.0.1";
|
|
102
|
+
const fetchHandler = secureFetch(
|
|
103
|
+
(req) => app.fetch(req),
|
|
104
|
+
options,
|
|
105
|
+
hostname,
|
|
106
|
+
);
|
|
107
|
+
const routes = buildBunRoutes(app, fetchHandler);
|
|
108
|
+
|
|
109
|
+
const server = Bun.serve({
|
|
110
|
+
port,
|
|
111
|
+
hostname,
|
|
112
|
+
...(options?.id !== undefined ? { id: options.id } : {}),
|
|
113
|
+
routes: Object.keys(routes).length > 0 ? routes : undefined,
|
|
114
|
+
fetch: fetchHandler,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const boundPort = server.port ?? port;
|
|
118
|
+
const boundHost = server.hostname ?? hostname;
|
|
119
|
+
const url = new URL(`http://${formatHostForUrl(boundHost)}:${boundPort}/`);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
url,
|
|
123
|
+
port: boundPort,
|
|
124
|
+
hostname: boundHost,
|
|
125
|
+
fetch: fetchHandler,
|
|
126
|
+
stop(closeActiveConnections = false) {
|
|
127
|
+
server.stop(closeActiveConnections);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Format a hostname for use in a URL (bracket IPv6).
|
|
134
|
+
*
|
|
135
|
+
* @param host - Hostname
|
|
136
|
+
*/
|
|
137
|
+
function formatHostForUrl(host: string): string {
|
|
138
|
+
if (host.includes(":") && !host.startsWith("[")) return `[${host}]`;
|
|
139
|
+
return host;
|
|
140
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cold-start budget gate — unified-theory §24 / AGENTS.md.
|
|
3
|
+
* Measured in a fresh Bun subprocess so import cost is real.
|
|
4
|
+
*
|
|
5
|
+
* Limit: < 75 ms from process start to server ready.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, expect, test } from "bun:test";
|
|
9
|
+
import { COLD_START_BUDGET_MS } from "../release/limits.ts";
|
|
10
|
+
import { measureColdStartMedianMs } from "../release/measure.ts";
|
|
11
|
+
|
|
12
|
+
describe("cold start budget", () => {
|
|
13
|
+
test(`Bun adapter ready in < ${COLD_START_BUDGET_MS} ms`, async () => {
|
|
14
|
+
const median = await measureColdStartMedianMs();
|
|
15
|
+
console.log(
|
|
16
|
+
`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`,
|
|
17
|
+
);
|
|
18
|
+
expect(median).toBeLessThan(COLD_START_BUDGET_MS);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime adapters: Bun (primary) · Web Standards (Node / Deno / edge).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
createBunRuntime,
|
|
7
|
+
buildBunRoutes,
|
|
8
|
+
isBunNativePath,
|
|
9
|
+
type BunRuntime,
|
|
10
|
+
} from "./bun.ts";
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
createEnv,
|
|
14
|
+
createFiles,
|
|
15
|
+
createTimers,
|
|
16
|
+
createWebCrypto,
|
|
17
|
+
createBunCrypto,
|
|
18
|
+
} from "./primitives.ts";
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
checkRequestSecurity,
|
|
22
|
+
forbiddenResponse,
|
|
23
|
+
isHostAllowed,
|
|
24
|
+
normalizeHost,
|
|
25
|
+
resolveAllowedHosts,
|
|
26
|
+
secureFetch,
|
|
27
|
+
type SecurityCheck,
|
|
28
|
+
} from "./security.ts";
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
APP_PORT,
|
|
32
|
+
CONSOLE_PORT,
|
|
33
|
+
MCP_PORT,
|
|
34
|
+
type FetchApp,
|
|
35
|
+
type PasswordAlgorithm,
|
|
36
|
+
type Runtime,
|
|
37
|
+
type RuntimeCrypto,
|
|
38
|
+
type RuntimeEnv,
|
|
39
|
+
type RuntimeFiles,
|
|
40
|
+
type RuntimeName,
|
|
41
|
+
type RuntimeTimers,
|
|
42
|
+
type ServeOptions,
|
|
43
|
+
type ServerHandle,
|
|
44
|
+
} from "./types.ts";
|
|
45
|
+
|
|
46
|
+
export { createWebStandardRuntime } from "./web-standard.ts";
|