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,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attachment-point scoping — proven by test, not by convention.
|
|
3
|
+
*
|
|
4
|
+
* Gate: bun test src/kernel/plugin
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { beforeEach, describe, expect, test } from "bun:test";
|
|
8
|
+
import { oke } from "../app.ts";
|
|
9
|
+
import { flow, resetFlowSeq } from "../flow.ts";
|
|
10
|
+
import { on, resetBindings } from "../on.ts";
|
|
11
|
+
import { plugin } from "../plugin.ts";
|
|
12
|
+
import { http } from "../triggers.ts";
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
resetBindings();
|
|
16
|
+
resetFlowSeq();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe("plugin scoping — attachment point is the scope", () => {
|
|
20
|
+
test("unit-scoped plugin hook does not fire for another unit's flows", async () => {
|
|
21
|
+
const fired: string[] = [];
|
|
22
|
+
|
|
23
|
+
const ordersFlow = flow({
|
|
24
|
+
name: "orders.create",
|
|
25
|
+
unit: "orders",
|
|
26
|
+
do: () => {
|
|
27
|
+
fired.push("orders:handler");
|
|
28
|
+
return { ok: true };
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const paymentsFlow = flow({
|
|
33
|
+
name: "payments.charge",
|
|
34
|
+
unit: "payments",
|
|
35
|
+
do: () => {
|
|
36
|
+
fired.push("payments:handler");
|
|
37
|
+
return { ok: true };
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
on(http.get("/orders"), ordersFlow);
|
|
42
|
+
on(http.get("/payments"), paymentsFlow);
|
|
43
|
+
|
|
44
|
+
const rateLimit = plugin("rate-limit", {
|
|
45
|
+
version: "1.0.0",
|
|
46
|
+
config: { max: 30 },
|
|
47
|
+
}).hook("beforeHandle", () => {
|
|
48
|
+
fired.push("rate-limit");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const app = oke({ name: "scoping" });
|
|
52
|
+
app.unit("orders").plug(rateLimit);
|
|
53
|
+
|
|
54
|
+
await app.fetch(new Request("http://localhost/orders"));
|
|
55
|
+
await app.fetch(new Request("http://localhost/payments"));
|
|
56
|
+
|
|
57
|
+
expect(fired).toEqual([
|
|
58
|
+
"rate-limit",
|
|
59
|
+
"orders:handler",
|
|
60
|
+
"payments:handler",
|
|
61
|
+
]);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("app-scoped plugin hook fires for every unit", async () => {
|
|
65
|
+
const fired: string[] = [];
|
|
66
|
+
|
|
67
|
+
on(
|
|
68
|
+
http.get("/a"),
|
|
69
|
+
flow({
|
|
70
|
+
name: "a",
|
|
71
|
+
unit: "alpha",
|
|
72
|
+
do: () => {
|
|
73
|
+
fired.push("a");
|
|
74
|
+
return {};
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
on(
|
|
79
|
+
http.get("/b"),
|
|
80
|
+
flow({
|
|
81
|
+
name: "b",
|
|
82
|
+
unit: "beta",
|
|
83
|
+
do: () => {
|
|
84
|
+
fired.push("b");
|
|
85
|
+
return {};
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const audit = plugin("audit", { version: "1.0.0" }).hook(
|
|
91
|
+
"afterHandle",
|
|
92
|
+
() => {
|
|
93
|
+
fired.push("audit");
|
|
94
|
+
},
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const app = oke({ name: "app-scope" }).plug(audit);
|
|
98
|
+
|
|
99
|
+
await app.fetch(new Request("http://localhost/a"));
|
|
100
|
+
await app.fetch(new Request("http://localhost/b"));
|
|
101
|
+
|
|
102
|
+
expect(fired).toEqual(["a", "audit", "b", "audit"]);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("flow-scoped plugin hook fires only for that flow", async () => {
|
|
106
|
+
const fired: string[] = [];
|
|
107
|
+
|
|
108
|
+
const marked = flow({
|
|
109
|
+
name: "marked",
|
|
110
|
+
do: () => {
|
|
111
|
+
fired.push("marked");
|
|
112
|
+
return {};
|
|
113
|
+
},
|
|
114
|
+
}).plug(
|
|
115
|
+
plugin("mark", { version: "1.0.0" }).hook("beforeHandle", () => {
|
|
116
|
+
fired.push("mark-hook");
|
|
117
|
+
}),
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const plain = flow({
|
|
121
|
+
name: "plain",
|
|
122
|
+
do: () => {
|
|
123
|
+
fired.push("plain");
|
|
124
|
+
return {};
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
on(http.get("/marked"), marked);
|
|
129
|
+
on(http.get("/plain"), plain);
|
|
130
|
+
|
|
131
|
+
const app = oke({ name: "flow-scope" });
|
|
132
|
+
|
|
133
|
+
await app.fetch(new Request("http://localhost/marked"));
|
|
134
|
+
await app.fetch(new Request("http://localhost/plain"));
|
|
135
|
+
|
|
136
|
+
expect(fired).toEqual(["mark-hook", "marked", "plain"]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `plugin(name, { version })` — the extensibility builder.
|
|
3
|
+
*
|
|
4
|
+
* A plugin is a registration plan. Fluent methods queue contributions; at
|
|
5
|
+
* `.plug()` time the registry runs that plan against a builder it supplies
|
|
6
|
+
* and records exactly what was requested (capability capture). We never
|
|
7
|
+
* statically analyse plugin source to guess intent.
|
|
8
|
+
*
|
|
9
|
+
* Contributions: flows · hooks · context decorations · elements · drivers ·
|
|
10
|
+
* image recipes · DB schema · typed errors · client extensions · CLI
|
|
11
|
+
* commands · Console panels.
|
|
12
|
+
*
|
|
13
|
+
* @see docs/spec/unified-theory.md §14
|
|
14
|
+
* @see docs/spec/console.md §9.15
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { SchemaInput } from "../validation/standard-schema.ts";
|
|
18
|
+
import type { AnyFlowDef, FlowErrorMap } from "./flow.ts";
|
|
19
|
+
import type { HookFn, HookStage } from "./hooks.ts";
|
|
20
|
+
|
|
21
|
+
/** Brand carrying accumulated decoration types through the builder. */
|
|
22
|
+
declare const pluginDecorations: unique symbol;
|
|
23
|
+
|
|
24
|
+
/** Identity + version for a plugin definition. */
|
|
25
|
+
export interface PluginIdentity {
|
|
26
|
+
/** Stable plugin id (Manifest key). */
|
|
27
|
+
readonly name: string;
|
|
28
|
+
/** Semver string recorded in the Manifest. */
|
|
29
|
+
readonly version: string;
|
|
30
|
+
/**
|
|
31
|
+
* Optional config snapshot used for identity dedup.
|
|
32
|
+
* Same name + same config → no-op; same name + different config → boot error.
|
|
33
|
+
*/
|
|
34
|
+
readonly config?: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Options for {@link plugin}. */
|
|
38
|
+
export interface PluginOptions {
|
|
39
|
+
/** Semver string recorded in the Manifest. */
|
|
40
|
+
readonly version: string;
|
|
41
|
+
/**
|
|
42
|
+
* Optional config snapshot for identity dedup when the same plugin is
|
|
43
|
+
* plugged more than once (e.g. `rateLimit({ max: 30 })`).
|
|
44
|
+
*/
|
|
45
|
+
readonly config?: unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Element contribution (store, signal, …) — opaque until elements ship. */
|
|
49
|
+
export interface PluginElement {
|
|
50
|
+
/** Protocol / facet kind (e.g. `"store.sql"`). */
|
|
51
|
+
readonly kind: string;
|
|
52
|
+
/** Element name within that kind (e.g. `"audit"`). */
|
|
53
|
+
readonly name: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Console panel contribution. */
|
|
57
|
+
export interface ConsolePanelContribution {
|
|
58
|
+
/** Panel id — conflict namespace shared across plugins. */
|
|
59
|
+
readonly id: string;
|
|
60
|
+
/** Display title. */
|
|
61
|
+
readonly title: string;
|
|
62
|
+
/** ESM entry path loaded at runtime by the Console. */
|
|
63
|
+
readonly entry: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** CLI command contribution. */
|
|
67
|
+
export interface CliContribution {
|
|
68
|
+
/** Command name (e.g. `"audit:export"`). */
|
|
69
|
+
readonly name: string;
|
|
70
|
+
/** Handler invoked by the CLI. */
|
|
71
|
+
readonly handler: (args: { readonly fx: unknown }) => unknown;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Client extension contribution. */
|
|
75
|
+
export interface ClientExtensionContribution {
|
|
76
|
+
/** Extension id. */
|
|
77
|
+
readonly name: string;
|
|
78
|
+
/** Opaque extension payload. */
|
|
79
|
+
readonly extension: unknown;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Image recipe contribution (role → recipe id). */
|
|
83
|
+
export interface ImageRecipeContribution {
|
|
84
|
+
/** Image role (e.g. `"store.sql"`). */
|
|
85
|
+
readonly role: string;
|
|
86
|
+
/** Recipe identifier or descriptor. */
|
|
87
|
+
readonly recipe: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Table / DB schema contribution. */
|
|
91
|
+
export interface TableContribution {
|
|
92
|
+
/** Table name — conflict namespace shared across plugins. */
|
|
93
|
+
readonly name: string;
|
|
94
|
+
/** Opaque schema descriptor. */
|
|
95
|
+
readonly schema?: unknown;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Driver contribution. */
|
|
99
|
+
export interface DriverContribution {
|
|
100
|
+
/** Driver id (protocol-named) — conflict namespace shared across plugins. */
|
|
101
|
+
readonly id: string;
|
|
102
|
+
/** Opaque driver implementation / factory. */
|
|
103
|
+
readonly implementation?: unknown;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Builder surface supplied at boot for capability capture.
|
|
108
|
+
* Method calls are the source of truth for Manifest capabilities.
|
|
109
|
+
*/
|
|
110
|
+
export interface PluginApi {
|
|
111
|
+
/**
|
|
112
|
+
* Register a hook (intercept — per request).
|
|
113
|
+
*
|
|
114
|
+
* @param stage - Pipeline stage
|
|
115
|
+
* @param fn - Hook function
|
|
116
|
+
*/
|
|
117
|
+
hook(stage: HookStage, fn: HookFn): PluginApi;
|
|
118
|
+
/**
|
|
119
|
+
* Decorate the invocation context (declare — once at boot).
|
|
120
|
+
*
|
|
121
|
+
* @param key - Decoration key
|
|
122
|
+
* @param value - Value visible to handlers in scope
|
|
123
|
+
*/
|
|
124
|
+
decorate(key: string, value: unknown): PluginApi;
|
|
125
|
+
/**
|
|
126
|
+
* Contribute an element.
|
|
127
|
+
*
|
|
128
|
+
* @param element - Kind + name
|
|
129
|
+
*/
|
|
130
|
+
element(element: PluginElement): PluginApi;
|
|
131
|
+
/**
|
|
132
|
+
* Declare a runtime dependency on another capability.
|
|
133
|
+
*
|
|
134
|
+
* @param dep - Dependency id (e.g. `"store.kv"`)
|
|
135
|
+
*/
|
|
136
|
+
needs(dep: string): PluginApi;
|
|
137
|
+
/**
|
|
138
|
+
* Contribute typed errors.
|
|
139
|
+
*
|
|
140
|
+
* @param errors - Error name → schema
|
|
141
|
+
*/
|
|
142
|
+
errors(errors: FlowErrorMap): PluginApi;
|
|
143
|
+
/**
|
|
144
|
+
* Contribute a Console panel.
|
|
145
|
+
*
|
|
146
|
+
* @param panel - Panel descriptor
|
|
147
|
+
*/
|
|
148
|
+
consolePanel(panel: ConsolePanelContribution): PluginApi;
|
|
149
|
+
/**
|
|
150
|
+
* Contribute a CLI command.
|
|
151
|
+
*
|
|
152
|
+
* @param name - Command name
|
|
153
|
+
* @param handler - Command handler
|
|
154
|
+
*/
|
|
155
|
+
cli(
|
|
156
|
+
name: string,
|
|
157
|
+
handler: CliContribution["handler"],
|
|
158
|
+
): PluginApi;
|
|
159
|
+
/**
|
|
160
|
+
* Contribute a driver.
|
|
161
|
+
*
|
|
162
|
+
* @param id - Protocol-named driver id
|
|
163
|
+
* @param implementation - Driver impl
|
|
164
|
+
*/
|
|
165
|
+
driver(id: string, implementation?: unknown): PluginApi;
|
|
166
|
+
/**
|
|
167
|
+
* Contribute an image recipe for a role.
|
|
168
|
+
*
|
|
169
|
+
* @param role - Image role
|
|
170
|
+
* @param recipe - Recipe id
|
|
171
|
+
*/
|
|
172
|
+
image(role: string, recipe: string): PluginApi;
|
|
173
|
+
/**
|
|
174
|
+
* Contribute a DB table / schema fragment.
|
|
175
|
+
*
|
|
176
|
+
* @param name - Table name
|
|
177
|
+
* @param schema - Opaque schema
|
|
178
|
+
*/
|
|
179
|
+
table(name: string, schema?: unknown): PluginApi;
|
|
180
|
+
/**
|
|
181
|
+
* Contribute a flow.
|
|
182
|
+
*
|
|
183
|
+
* @param flowDef - Flow definition
|
|
184
|
+
*/
|
|
185
|
+
flow(flowDef: AnyFlowDef): PluginApi;
|
|
186
|
+
/**
|
|
187
|
+
* Contribute a typed client extension.
|
|
188
|
+
*
|
|
189
|
+
* @param name - Extension id
|
|
190
|
+
* @param extension - Opaque extension
|
|
191
|
+
*/
|
|
192
|
+
client(name: string, extension: unknown): PluginApi;
|
|
193
|
+
/**
|
|
194
|
+
* Attach a config schema (declare shape; values live on identity.config).
|
|
195
|
+
*
|
|
196
|
+
* @param schema - Standard Schema
|
|
197
|
+
*/
|
|
198
|
+
config(schema: SchemaInput): PluginApi;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Captured capability lists for the Manifest. */
|
|
202
|
+
export interface PluginCapabilities {
|
|
203
|
+
/** Plugin id. */
|
|
204
|
+
readonly name: string;
|
|
205
|
+
/** Plugin version. */
|
|
206
|
+
readonly version: string;
|
|
207
|
+
/** Boot-time declarations (schema, elements, drivers, panels, CLI, …). */
|
|
208
|
+
readonly declares: readonly string[];
|
|
209
|
+
/** Per-request intercepts (hook stages). */
|
|
210
|
+
readonly intercepts: readonly string[];
|
|
211
|
+
/** Declared dependencies from `.needs()`. */
|
|
212
|
+
readonly needs: readonly string[];
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Snapshot of everything a registration requested. */
|
|
216
|
+
export interface PluginRegistration {
|
|
217
|
+
readonly capabilities: PluginCapabilities;
|
|
218
|
+
readonly hooks: Partial<Record<HookStage, HookFn[]>>;
|
|
219
|
+
readonly decorations: Readonly<Record<string, unknown>>;
|
|
220
|
+
readonly elements: readonly PluginElement[];
|
|
221
|
+
readonly tables: readonly TableContribution[];
|
|
222
|
+
readonly drivers: readonly DriverContribution[];
|
|
223
|
+
readonly panels: readonly ConsolePanelContribution[];
|
|
224
|
+
readonly cli: readonly CliContribution[];
|
|
225
|
+
readonly images: readonly ImageRecipeContribution[];
|
|
226
|
+
readonly flows: readonly AnyFlowDef[];
|
|
227
|
+
readonly errors: FlowErrorMap;
|
|
228
|
+
readonly client: readonly ClientExtensionContribution[];
|
|
229
|
+
readonly configSchema: SchemaInput | undefined;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* A plugin definition — identity plus a registration function.
|
|
234
|
+
*
|
|
235
|
+
* @typeParam D - Accumulated decoration types from `.decorate()`
|
|
236
|
+
*/
|
|
237
|
+
export interface PluginDef<D extends Record<string, unknown> = {}> {
|
|
238
|
+
readonly [pluginDecorations]?: D;
|
|
239
|
+
/** Plugin name. */
|
|
240
|
+
readonly name: string;
|
|
241
|
+
/** Plugin version. */
|
|
242
|
+
readonly version: string;
|
|
243
|
+
/**
|
|
244
|
+
* Config snapshot for identity dedup (from {@link PluginOptions.config}).
|
|
245
|
+
* Distinct from the fluent `.config(schema)` method.
|
|
246
|
+
*/
|
|
247
|
+
readonly configSnapshot: unknown;
|
|
248
|
+
/**
|
|
249
|
+
* Registration function. The registry calls this with a builder and
|
|
250
|
+
* records every method invoked — that recording is the capability list.
|
|
251
|
+
*
|
|
252
|
+
* @param api - Builder supplied by the registry
|
|
253
|
+
*/
|
|
254
|
+
register(api: PluginApi): void;
|
|
255
|
+
/**
|
|
256
|
+
* Queue a hook contribution.
|
|
257
|
+
*
|
|
258
|
+
* @param stage - Pipeline stage
|
|
259
|
+
* @param fn - Hook function
|
|
260
|
+
*/
|
|
261
|
+
hook(stage: HookStage, fn: HookFn): PluginDef<D>;
|
|
262
|
+
/**
|
|
263
|
+
* Queue a context decoration. Accumulates types for `.plug()`.
|
|
264
|
+
*
|
|
265
|
+
* @param key - Decoration key
|
|
266
|
+
* @param value - Value
|
|
267
|
+
*/
|
|
268
|
+
decorate<K extends string, V>(
|
|
269
|
+
key: K,
|
|
270
|
+
value: V,
|
|
271
|
+
): PluginDef<D & { [P in K]: V }>;
|
|
272
|
+
/**
|
|
273
|
+
* Queue an element contribution.
|
|
274
|
+
*
|
|
275
|
+
* @param element - Element descriptor
|
|
276
|
+
*/
|
|
277
|
+
element(element: PluginElement): PluginDef<D>;
|
|
278
|
+
/**
|
|
279
|
+
* Queue a dependency declaration.
|
|
280
|
+
*
|
|
281
|
+
* @param dep - Dependency id
|
|
282
|
+
*/
|
|
283
|
+
needs(dep: string): PluginDef<D>;
|
|
284
|
+
/**
|
|
285
|
+
* Queue typed errors.
|
|
286
|
+
*
|
|
287
|
+
* @param errors - Error map
|
|
288
|
+
*/
|
|
289
|
+
errors(errors: FlowErrorMap): PluginDef<D>;
|
|
290
|
+
/**
|
|
291
|
+
* Queue a Console panel.
|
|
292
|
+
*
|
|
293
|
+
* @param panel - Panel descriptor
|
|
294
|
+
*/
|
|
295
|
+
consolePanel(panel: ConsolePanelContribution): PluginDef<D>;
|
|
296
|
+
/**
|
|
297
|
+
* Queue a CLI command.
|
|
298
|
+
*
|
|
299
|
+
* @param name - Command name
|
|
300
|
+
* @param handler - Handler
|
|
301
|
+
*/
|
|
302
|
+
cli(name: string, handler: CliContribution["handler"]): PluginDef<D>;
|
|
303
|
+
/**
|
|
304
|
+
* Queue a driver.
|
|
305
|
+
*
|
|
306
|
+
* @param id - Driver id
|
|
307
|
+
* @param implementation - Impl
|
|
308
|
+
*/
|
|
309
|
+
driver(id: string, implementation?: unknown): PluginDef<D>;
|
|
310
|
+
/**
|
|
311
|
+
* Queue an image recipe.
|
|
312
|
+
*
|
|
313
|
+
* @param role - Role
|
|
314
|
+
* @param recipe - Recipe id
|
|
315
|
+
*/
|
|
316
|
+
image(role: string, recipe: string): PluginDef<D>;
|
|
317
|
+
/**
|
|
318
|
+
* Queue a table / schema contribution.
|
|
319
|
+
*
|
|
320
|
+
* @param name - Table name
|
|
321
|
+
* @param schema - Schema
|
|
322
|
+
*/
|
|
323
|
+
table(name: string, schema?: unknown): PluginDef<D>;
|
|
324
|
+
/**
|
|
325
|
+
* Queue a flow contribution.
|
|
326
|
+
*
|
|
327
|
+
* @param flowDef - Flow
|
|
328
|
+
*/
|
|
329
|
+
flow(flowDef: AnyFlowDef): PluginDef<D>;
|
|
330
|
+
/**
|
|
331
|
+
* Queue a client extension.
|
|
332
|
+
*
|
|
333
|
+
* @param name - Extension id
|
|
334
|
+
* @param extension - Payload
|
|
335
|
+
*/
|
|
336
|
+
client(name: string, extension: unknown): PluginDef<D>;
|
|
337
|
+
/**
|
|
338
|
+
* Queue a config schema.
|
|
339
|
+
*
|
|
340
|
+
* @param schema - Standard Schema
|
|
341
|
+
*/
|
|
342
|
+
config(schema: SchemaInput): PluginDef<D>;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/** Extract accumulated decoration types from a {@link PluginDef}. */
|
|
346
|
+
export type DecorationsOf<P> =
|
|
347
|
+
P extends PluginDef<infer D> ? D : Record<string, never>;
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Define a plugin. Fluent methods queue a registration plan; the registry
|
|
351
|
+
* executes that plan at `.plug()` time for capability capture.
|
|
352
|
+
*
|
|
353
|
+
* @param name - Stable plugin id
|
|
354
|
+
* @param options - Version and optional config snapshot
|
|
355
|
+
*/
|
|
356
|
+
export function plugin(
|
|
357
|
+
name: string,
|
|
358
|
+
options: PluginOptions,
|
|
359
|
+
): PluginDef {
|
|
360
|
+
const steps: Array<(api: PluginApi) => void> = [];
|
|
361
|
+
|
|
362
|
+
const def: PluginDef = {
|
|
363
|
+
name,
|
|
364
|
+
version: options.version,
|
|
365
|
+
configSnapshot: options.config,
|
|
366
|
+
register(api) {
|
|
367
|
+
for (const step of steps) step(api);
|
|
368
|
+
},
|
|
369
|
+
hook(stage, fn) {
|
|
370
|
+
steps.push((api) => {
|
|
371
|
+
api.hook(stage, fn);
|
|
372
|
+
});
|
|
373
|
+
return def;
|
|
374
|
+
},
|
|
375
|
+
decorate(key, value) {
|
|
376
|
+
steps.push((api) => {
|
|
377
|
+
api.decorate(key, value);
|
|
378
|
+
});
|
|
379
|
+
// Decoration accumulate on the interface; runtime object is unchanged.
|
|
380
|
+
return def as never;
|
|
381
|
+
},
|
|
382
|
+
element(element) {
|
|
383
|
+
steps.push((api) => {
|
|
384
|
+
// Accept StoreDecl-like `{ facet, name }` from `store.sql(...)`.
|
|
385
|
+
const el = element as PluginElement & {
|
|
386
|
+
readonly facet?: string;
|
|
387
|
+
readonly name?: string;
|
|
388
|
+
};
|
|
389
|
+
if (el.kind && el.name) {
|
|
390
|
+
api.element(el);
|
|
391
|
+
} else if (typeof el.facet === "string" && typeof el.name === "string") {
|
|
392
|
+
api.element({
|
|
393
|
+
kind: el.facet.startsWith("store.")
|
|
394
|
+
? el.facet
|
|
395
|
+
: `store.${el.facet}`,
|
|
396
|
+
name: el.name,
|
|
397
|
+
});
|
|
398
|
+
} else {
|
|
399
|
+
api.element(el as PluginElement);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
return def;
|
|
403
|
+
},
|
|
404
|
+
needs(dep) {
|
|
405
|
+
steps.push((api) => {
|
|
406
|
+
api.needs(dep);
|
|
407
|
+
});
|
|
408
|
+
return def;
|
|
409
|
+
},
|
|
410
|
+
errors(errors) {
|
|
411
|
+
steps.push((api) => {
|
|
412
|
+
api.errors(errors);
|
|
413
|
+
});
|
|
414
|
+
return def;
|
|
415
|
+
},
|
|
416
|
+
consolePanel(panel) {
|
|
417
|
+
steps.push((api) => {
|
|
418
|
+
api.consolePanel(panel);
|
|
419
|
+
});
|
|
420
|
+
return def;
|
|
421
|
+
},
|
|
422
|
+
cli(cliName, handler) {
|
|
423
|
+
steps.push((api) => {
|
|
424
|
+
api.cli(cliName, handler);
|
|
425
|
+
});
|
|
426
|
+
return def;
|
|
427
|
+
},
|
|
428
|
+
driver(id, implementation) {
|
|
429
|
+
steps.push((api) => {
|
|
430
|
+
api.driver(id, implementation);
|
|
431
|
+
});
|
|
432
|
+
return def;
|
|
433
|
+
},
|
|
434
|
+
image(role, recipe) {
|
|
435
|
+
steps.push((api) => {
|
|
436
|
+
api.image(role, recipe);
|
|
437
|
+
});
|
|
438
|
+
return def;
|
|
439
|
+
},
|
|
440
|
+
table(tableName, schema) {
|
|
441
|
+
steps.push((api) => {
|
|
442
|
+
api.table(tableName, schema);
|
|
443
|
+
});
|
|
444
|
+
return def;
|
|
445
|
+
},
|
|
446
|
+
flow(flowDef) {
|
|
447
|
+
steps.push((api) => {
|
|
448
|
+
api.flow(flowDef);
|
|
449
|
+
});
|
|
450
|
+
return def;
|
|
451
|
+
},
|
|
452
|
+
client(clientName, extension) {
|
|
453
|
+
steps.push((api) => {
|
|
454
|
+
api.client(clientName, extension);
|
|
455
|
+
});
|
|
456
|
+
return def;
|
|
457
|
+
},
|
|
458
|
+
config(schema) {
|
|
459
|
+
steps.push((api) => {
|
|
460
|
+
api.config(schema);
|
|
461
|
+
});
|
|
462
|
+
return def;
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
return def;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Type guard for {@link PluginDef}.
|
|
471
|
+
*
|
|
472
|
+
* @param value - Unknown
|
|
473
|
+
*/
|
|
474
|
+
export function isPlugin(value: unknown): value is PluginDef {
|
|
475
|
+
return (
|
|
476
|
+
typeof value === "object" &&
|
|
477
|
+
value !== null &&
|
|
478
|
+
"name" in value &&
|
|
479
|
+
"version" in value &&
|
|
480
|
+
"register" in value &&
|
|
481
|
+
typeof (value as PluginDef).register === "function" &&
|
|
482
|
+
typeof (value as PluginDef).name === "string" &&
|
|
483
|
+
typeof (value as PluginDef).version === "string"
|
|
484
|
+
);
|
|
485
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rateLimit({ max, per })` — convenience unit/app plugin for Provisions.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { plugin, type PluginDef } from "./plugin.ts";
|
|
6
|
+
|
|
7
|
+
/** Options for {@link rateLimit}. */
|
|
8
|
+
export interface RateLimitPluginOptions {
|
|
9
|
+
/** Max requests in the window. */
|
|
10
|
+
readonly max: number;
|
|
11
|
+
/** Window duration (default `"1m"`). */
|
|
12
|
+
readonly per?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create a rate-limit plugin scoped by attachment point.
|
|
17
|
+
*
|
|
18
|
+
* @param options - Max / window
|
|
19
|
+
*/
|
|
20
|
+
export function rateLimit(options: RateLimitPluginOptions): PluginDef {
|
|
21
|
+
return plugin("rate-limit", {
|
|
22
|
+
version: "1.0.0",
|
|
23
|
+
config: { max: options.max, per: options.per ?? "1m" },
|
|
24
|
+
});
|
|
25
|
+
}
|