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,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed triggers — the left-hand side of `on(Trigger) → Effects`.
|
|
3
|
+
*
|
|
4
|
+
* Five kinds (Linkly + CDC): `http` · `every` · signal-as-trigger ·
|
|
5
|
+
* `table.changed()` · `internal`. All bind the same {@link FlowDef} species.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { NamedRef } from "./fx.ts";
|
|
9
|
+
|
|
10
|
+
/** HTTP methods accepted by {@link http}. */
|
|
11
|
+
export type HttpMethod =
|
|
12
|
+
| "GET"
|
|
13
|
+
| "POST"
|
|
14
|
+
| "PUT"
|
|
15
|
+
| "PATCH"
|
|
16
|
+
| "DELETE"
|
|
17
|
+
| "OPTIONS"
|
|
18
|
+
| "HEAD";
|
|
19
|
+
|
|
20
|
+
/** Gate reference attached via `.gate(...)`. */
|
|
21
|
+
export type GateRef = NamedRef;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* HTTP trigger value. Method and path are literal type parameters so
|
|
25
|
+
* `typeof app` / the client can derive REST wire shape from the declaration.
|
|
26
|
+
*
|
|
27
|
+
* @typeParam M - HTTP method literal
|
|
28
|
+
* @typeParam P - Path template literal (`/notes/:id`)
|
|
29
|
+
*/
|
|
30
|
+
export interface HttpTrigger<
|
|
31
|
+
M extends HttpMethod = HttpMethod,
|
|
32
|
+
P extends string = string,
|
|
33
|
+
> {
|
|
34
|
+
readonly kind: "http";
|
|
35
|
+
readonly method: M;
|
|
36
|
+
readonly path: P;
|
|
37
|
+
readonly gates: readonly GateRef[];
|
|
38
|
+
/** Whether `.live()` was applied. */
|
|
39
|
+
readonly isLive: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Attach gates (registration order).
|
|
42
|
+
*
|
|
43
|
+
* @param gates - Gate refs
|
|
44
|
+
*/
|
|
45
|
+
gate(...gates: GateRef[]): HttpTrigger<M, P>;
|
|
46
|
+
/**
|
|
47
|
+
* Mark the HTTP trigger as live (push result to subscribers).
|
|
48
|
+
*/
|
|
49
|
+
live(): HttpTrigger<M, P>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Clock / interval trigger (`every("1h")`). */
|
|
53
|
+
export interface EveryTrigger {
|
|
54
|
+
readonly kind: "every";
|
|
55
|
+
readonly interval: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Signal used as a trigger — any named signal handle.
|
|
60
|
+
* Delivery physics live on the signal declaration, not here.
|
|
61
|
+
*/
|
|
62
|
+
export interface SignalAsTrigger {
|
|
63
|
+
readonly kind: "signal";
|
|
64
|
+
readonly name: string;
|
|
65
|
+
/** Original handle (optional). */
|
|
66
|
+
readonly signal?: { readonly name: string };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** CDC trigger from {@link table}.changed(). */
|
|
70
|
+
export interface CdcTrigger {
|
|
71
|
+
readonly kind: "cdc";
|
|
72
|
+
readonly table: string;
|
|
73
|
+
readonly column?: string;
|
|
74
|
+
readonly store?: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Explicit internal trigger. A flow with *no* trigger is also call-only —
|
|
79
|
+
* `internal` exists so all five kinds are addressable as values.
|
|
80
|
+
*/
|
|
81
|
+
export interface InternalTrigger {
|
|
82
|
+
readonly kind: "internal";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Discriminated union of all trigger kinds. */
|
|
86
|
+
export type Trigger =
|
|
87
|
+
| HttpTrigger
|
|
88
|
+
| EveryTrigger
|
|
89
|
+
| SignalAsTrigger
|
|
90
|
+
| CdcTrigger
|
|
91
|
+
| InternalTrigger;
|
|
92
|
+
|
|
93
|
+
/** Trigger kind string. */
|
|
94
|
+
export type TriggerKind = Trigger["kind"];
|
|
95
|
+
|
|
96
|
+
function createHttpTrigger<M extends HttpMethod, P extends string>(
|
|
97
|
+
method: M,
|
|
98
|
+
path: P,
|
|
99
|
+
gates: readonly GateRef[] = [],
|
|
100
|
+
isLive = false,
|
|
101
|
+
): HttpTrigger<M, P> {
|
|
102
|
+
const trigger: HttpTrigger<M, P> = {
|
|
103
|
+
kind: "http",
|
|
104
|
+
method,
|
|
105
|
+
path,
|
|
106
|
+
gates,
|
|
107
|
+
isLive,
|
|
108
|
+
gate(...next) {
|
|
109
|
+
return createHttpTrigger(method, path, [...gates, ...next], isLive);
|
|
110
|
+
},
|
|
111
|
+
live() {
|
|
112
|
+
return createHttpTrigger(method, path, gates, true);
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
return trigger;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Shape of the {@link http} trigger namespace. Each method keeps `P` as a
|
|
120
|
+
* generic type parameter so callers (and the client) retain literal path
|
|
121
|
+
* types for param extraction.
|
|
122
|
+
*/
|
|
123
|
+
export interface HttpTriggerNamespace {
|
|
124
|
+
/**
|
|
125
|
+
* @param path - Route path (`/:id` params supported)
|
|
126
|
+
*/
|
|
127
|
+
get<P extends string>(path: P): HttpTrigger<"GET", P>;
|
|
128
|
+
/**
|
|
129
|
+
* @param path - Route path
|
|
130
|
+
*/
|
|
131
|
+
post<P extends string>(path: P): HttpTrigger<"POST", P>;
|
|
132
|
+
/**
|
|
133
|
+
* @param path - Route path
|
|
134
|
+
*/
|
|
135
|
+
put<P extends string>(path: P): HttpTrigger<"PUT", P>;
|
|
136
|
+
/**
|
|
137
|
+
* @param path - Route path
|
|
138
|
+
*/
|
|
139
|
+
patch<P extends string>(path: P): HttpTrigger<"PATCH", P>;
|
|
140
|
+
/**
|
|
141
|
+
* @param path - Route path
|
|
142
|
+
*/
|
|
143
|
+
delete<P extends string>(path: P): HttpTrigger<"DELETE", P>;
|
|
144
|
+
/**
|
|
145
|
+
* @param path - Route path
|
|
146
|
+
*/
|
|
147
|
+
options<P extends string>(path: P): HttpTrigger<"OPTIONS", P>;
|
|
148
|
+
/**
|
|
149
|
+
* @param path - Route path
|
|
150
|
+
*/
|
|
151
|
+
head<P extends string>(path: P): HttpTrigger<"HEAD", P>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* HTTP trigger constructors — `http.get("/notes")`, `http.post("/links")`, …
|
|
156
|
+
*/
|
|
157
|
+
export const http: HttpTriggerNamespace = {
|
|
158
|
+
/**
|
|
159
|
+
* @param path - Route path (`/:id` params supported)
|
|
160
|
+
*/
|
|
161
|
+
get<P extends string>(path: P): HttpTrigger<"GET", P> {
|
|
162
|
+
return createHttpTrigger("GET", path);
|
|
163
|
+
},
|
|
164
|
+
/**
|
|
165
|
+
* @param path - Route path
|
|
166
|
+
*/
|
|
167
|
+
post<P extends string>(path: P): HttpTrigger<"POST", P> {
|
|
168
|
+
return createHttpTrigger("POST", path);
|
|
169
|
+
},
|
|
170
|
+
/**
|
|
171
|
+
* @param path - Route path
|
|
172
|
+
*/
|
|
173
|
+
put<P extends string>(path: P): HttpTrigger<"PUT", P> {
|
|
174
|
+
return createHttpTrigger("PUT", path);
|
|
175
|
+
},
|
|
176
|
+
/**
|
|
177
|
+
* @param path - Route path
|
|
178
|
+
*/
|
|
179
|
+
patch<P extends string>(path: P): HttpTrigger<"PATCH", P> {
|
|
180
|
+
return createHttpTrigger("PATCH", path);
|
|
181
|
+
},
|
|
182
|
+
/**
|
|
183
|
+
* @param path - Route path
|
|
184
|
+
*/
|
|
185
|
+
delete<P extends string>(path: P): HttpTrigger<"DELETE", P> {
|
|
186
|
+
return createHttpTrigger("DELETE", path);
|
|
187
|
+
},
|
|
188
|
+
/**
|
|
189
|
+
* @param path - Route path
|
|
190
|
+
*/
|
|
191
|
+
options<P extends string>(path: P): HttpTrigger<"OPTIONS", P> {
|
|
192
|
+
return createHttpTrigger("OPTIONS", path);
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* @param path - Route path
|
|
196
|
+
*/
|
|
197
|
+
head<P extends string>(path: P): HttpTrigger<"HEAD", P> {
|
|
198
|
+
return createHttpTrigger("HEAD", path);
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Clock trigger — run on an interval (`every("10m")`, `every("1h")`).
|
|
204
|
+
*
|
|
205
|
+
* @param interval - Duration string
|
|
206
|
+
*/
|
|
207
|
+
export function every(interval: string): EveryTrigger {
|
|
208
|
+
return { kind: "every", interval };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Signal declaration handle — enough for `on(linkClicked, …)` before the
|
|
213
|
+
* full `signal()` element (see `src/elements/signal.ts`).
|
|
214
|
+
*/
|
|
215
|
+
export interface SignalSource {
|
|
216
|
+
readonly name: string;
|
|
217
|
+
readonly delivery?: string;
|
|
218
|
+
readonly retries?: number;
|
|
219
|
+
readonly deadLetter?: boolean;
|
|
220
|
+
readonly optional?: boolean;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Coerce a signal handle (or bare name) into a signal trigger.
|
|
225
|
+
*
|
|
226
|
+
* @param signal - Signal name or `{ name }` handle
|
|
227
|
+
*/
|
|
228
|
+
export function asSignalTrigger(
|
|
229
|
+
signal: string | SignalSource,
|
|
230
|
+
): SignalAsTrigger {
|
|
231
|
+
if (typeof signal === "string") {
|
|
232
|
+
return { kind: "signal", name: signal };
|
|
233
|
+
}
|
|
234
|
+
return { kind: "signal", name: signal.name, signal };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* True when `value` can be used as a signal trigger (`on(linkClicked, …)`).
|
|
239
|
+
*
|
|
240
|
+
* @param value - Unknown
|
|
241
|
+
*/
|
|
242
|
+
export function isSignalTriggerSource(value: unknown): value is SignalSource {
|
|
243
|
+
if (typeof value !== "object" || value === null) return false;
|
|
244
|
+
if (!("name" in value) || typeof (value as { name: unknown }).name !== "string") {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
// Already-normalized triggers go through the `kind` path in normalizeTrigger.
|
|
248
|
+
if ("kind" in value) return false;
|
|
249
|
+
// Flows have a `do` handler — never treat them as signals.
|
|
250
|
+
if ("do" in value) return false;
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Table handle returned by {@link table}. */
|
|
255
|
+
export interface TableHandle {
|
|
256
|
+
readonly name: string;
|
|
257
|
+
/**
|
|
258
|
+
* CDC trigger when `column` (or any column) changes.
|
|
259
|
+
*
|
|
260
|
+
* @param column - Optional column name
|
|
261
|
+
*/
|
|
262
|
+
changed(column?: string): CdcTrigger;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* CDC table handle — `table("orders").changed("status")`.
|
|
267
|
+
*
|
|
268
|
+
* @param name - Table name
|
|
269
|
+
* @param store - Optional store name
|
|
270
|
+
*/
|
|
271
|
+
export function table(name: string, store?: string): TableHandle {
|
|
272
|
+
return {
|
|
273
|
+
name,
|
|
274
|
+
changed(column?: string): CdcTrigger {
|
|
275
|
+
return column === undefined
|
|
276
|
+
? { kind: "cdc", table: name, store }
|
|
277
|
+
: { kind: "cdc", table: name, column, store };
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Explicit internal / call-only trigger.
|
|
284
|
+
* Prefer an untriggered `flow({…})` when no trigger value is needed.
|
|
285
|
+
*/
|
|
286
|
+
export const internal: InternalTrigger = { kind: "internal" };
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Normalize anything accepted by {@link on} into a {@link Trigger}.
|
|
290
|
+
*
|
|
291
|
+
* @param value - Trigger or signal handle
|
|
292
|
+
*/
|
|
293
|
+
export function normalizeTrigger(value: Trigger | SignalSource): Trigger {
|
|
294
|
+
if (typeof value !== "object" || value === null) {
|
|
295
|
+
throw new TypeError("on() expected a trigger or signal handle");
|
|
296
|
+
}
|
|
297
|
+
if ("kind" in value) {
|
|
298
|
+
const kind = (value as Trigger).kind;
|
|
299
|
+
if (
|
|
300
|
+
kind === "http" ||
|
|
301
|
+
kind === "every" ||
|
|
302
|
+
kind === "signal" ||
|
|
303
|
+
kind === "cdc" ||
|
|
304
|
+
kind === "internal"
|
|
305
|
+
) {
|
|
306
|
+
return value as Trigger;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (isSignalTriggerSource(value)) {
|
|
310
|
+
return asSignalTrigger(value);
|
|
311
|
+
}
|
|
312
|
+
throw new TypeError("on() expected a trigger or signal handle");
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Bound trigger type after {@link on} / {@link normalizeTrigger}.
|
|
317
|
+
*
|
|
318
|
+
* @typeParam T - Argument accepted by {@link on}
|
|
319
|
+
*/
|
|
320
|
+
export type BoundTriggerOf<T> = T extends Trigger
|
|
321
|
+
? T
|
|
322
|
+
: T extends SignalSource
|
|
323
|
+
? SignalAsTrigger
|
|
324
|
+
: Trigger;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit bags — namespace of flows with a `.plug()` attachment point.
|
|
3
|
+
*
|
|
4
|
+
* Provisions: `orders.plug(rateLimit({ max: 30 }))` scopes a plugin to one
|
|
5
|
+
* unit. Plugins queue until an app flushes them at boot / adopt time.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { AnyFlowDef, FlowDef } from "./flow.ts";
|
|
9
|
+
import type { PluginDef } from "./plugin.ts";
|
|
10
|
+
|
|
11
|
+
/** Unit handle returned by {@link unit}. */
|
|
12
|
+
export interface UnitBag<T extends Record<string, AnyFlowDef> = Record<string, AnyFlowDef>> {
|
|
13
|
+
/** Unit name. */
|
|
14
|
+
readonly name: string;
|
|
15
|
+
/** Flows in this unit. */
|
|
16
|
+
readonly flows: T;
|
|
17
|
+
/**
|
|
18
|
+
* Attach a plugin to every flow in this unit (scope = unit).
|
|
19
|
+
*
|
|
20
|
+
* @param pluginDef - Plugin from {@link plugin}
|
|
21
|
+
*/
|
|
22
|
+
plug(pluginDef: PluginDef): UnitBag<T>;
|
|
23
|
+
/** Plugins queued via {@link UnitBag.plug}. */
|
|
24
|
+
readonly pendingPlugins: readonly PluginDef[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Queued unit → plugins (consumed by {@link oke}). */
|
|
28
|
+
const pendingByUnit = new Map<string, PluginDef[]>();
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Build a unit bag from named flows. Stamps `unit` + `name` on each flow.
|
|
32
|
+
*
|
|
33
|
+
* @param name - Unit name (client namespace)
|
|
34
|
+
* @param flows - Export map (`{ create, list, … }`)
|
|
35
|
+
*/
|
|
36
|
+
export function unit<const T extends Record<string, AnyFlowDef>>(
|
|
37
|
+
name: string,
|
|
38
|
+
flows: T,
|
|
39
|
+
): UnitBag<T> & T {
|
|
40
|
+
const pending: PluginDef[] = [];
|
|
41
|
+
for (const [exportName, flowDef] of Object.entries(flows)) {
|
|
42
|
+
const f = flowDef as FlowDef;
|
|
43
|
+
if (!f.name || f.name.startsWith("flow_")) {
|
|
44
|
+
(f as { name: string }).name = `${name}.${exportName}`;
|
|
45
|
+
}
|
|
46
|
+
if (!f.unit) {
|
|
47
|
+
(f as { unit: string }).unit = name;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const bag: UnitBag<T> = {
|
|
52
|
+
name,
|
|
53
|
+
flows,
|
|
54
|
+
pendingPlugins: pending,
|
|
55
|
+
plug(pluginDef) {
|
|
56
|
+
pending.push(pluginDef);
|
|
57
|
+
const list = pendingByUnit.get(name) ?? [];
|
|
58
|
+
list.push(pluginDef);
|
|
59
|
+
pendingByUnit.set(name, list);
|
|
60
|
+
for (const flowDef of Object.values(flows)) {
|
|
61
|
+
flowDef.plug(pluginDef);
|
|
62
|
+
}
|
|
63
|
+
return bag as UnitBag<T> & T;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return Object.assign(bag, flows) as UnitBag<T> & T;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Drain unit-scoped plugins registered via {@link unit}.plug.
|
|
72
|
+
*
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
export function consumeUnitPlugins(): ReadonlyMap<string, readonly PluginDef[]> {
|
|
76
|
+
const snapshot = new Map(pendingByUnit);
|
|
77
|
+
pendingByUnit.clear();
|
|
78
|
+
return snapshot;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Clear unit plugin queue (tests).
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export function resetUnitPlugins(): void {
|
|
87
|
+
pendingByUnit.clear();
|
|
88
|
+
}
|