okengine 0.2.5 → 0.2.8
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 +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +46 -38
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -20,14 +20,8 @@ import type { WideEvent } from "../../runs/types.ts";
|
|
|
20
20
|
import { bindHttp } from "./bind.ts";
|
|
21
21
|
import { touchLoginRateLimit } from "./auth-rate.ts";
|
|
22
22
|
import { verifyClaimCode } from "./claim.ts";
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
piiFieldNamesFromManifest,
|
|
26
|
-
} from "./runs-pii.ts";
|
|
27
|
-
import {
|
|
28
|
-
ClockResourceNotFoundError,
|
|
29
|
-
ScheduleNotOverridableError,
|
|
30
|
-
} from "./clock.ts";
|
|
23
|
+
import { maskWideEventForConsole, piiFieldNamesFromManifest } from "./runs-pii.ts";
|
|
24
|
+
import { ClockResourceNotFoundError, ScheduleNotOverridableError } from "./clock.ts";
|
|
31
25
|
import { createFileDiff, emitStructuralDiff } from "./structural.ts";
|
|
32
26
|
import type { ConsoleState } from "./state.ts";
|
|
33
27
|
import { PUBLIC_CONSOLE_FLOWS } from "./public-flows.ts";
|
|
@@ -73,26 +67,11 @@ const ManifestOut = z.object({
|
|
|
73
67
|
});
|
|
74
68
|
|
|
75
69
|
const EffectEntryOut = z.object({
|
|
76
|
-
kind: z.enum([
|
|
77
|
-
"read",
|
|
78
|
-
"write",
|
|
79
|
-
"emit",
|
|
80
|
-
"send",
|
|
81
|
-
"ask",
|
|
82
|
-
"secret",
|
|
83
|
-
"call",
|
|
84
|
-
]),
|
|
70
|
+
kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
|
|
85
71
|
resource: z.string(),
|
|
86
72
|
timestamp: z.number(),
|
|
87
73
|
duration: z.number(),
|
|
88
|
-
reversibility: z.enum([
|
|
89
|
-
"none",
|
|
90
|
-
"reversible",
|
|
91
|
-
"deferred",
|
|
92
|
-
"irreversible",
|
|
93
|
-
"capability",
|
|
94
|
-
"portal",
|
|
95
|
-
]),
|
|
74
|
+
reversibility: z.enum(["none", "reversible", "deferred", "irreversible", "capability", "portal"]),
|
|
96
75
|
});
|
|
97
76
|
|
|
98
77
|
const LogLineOut = z.object({
|
|
@@ -130,10 +109,7 @@ const RunsListOut = z.object({
|
|
|
130
109
|
/** `fx.log` lines — a field on the run, not a parallel stream. */
|
|
131
110
|
logs: z.array(LogLineOut),
|
|
132
111
|
/** All queryable dimensions for population analysis. */
|
|
133
|
-
dimensions: z.record(
|
|
134
|
-
z.string(),
|
|
135
|
-
z.union([z.string(), z.number(), z.boolean(), z.null()]),
|
|
136
|
-
),
|
|
112
|
+
dimensions: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])),
|
|
137
113
|
}),
|
|
138
114
|
),
|
|
139
115
|
});
|
|
@@ -154,14 +130,7 @@ const SignalEndpointOut = z.object({
|
|
|
154
130
|
flowId: z.string(),
|
|
155
131
|
durable: z.boolean(),
|
|
156
132
|
external: z.boolean(),
|
|
157
|
-
peakTier: z.enum([
|
|
158
|
-
"none",
|
|
159
|
-
"reads",
|
|
160
|
-
"writes",
|
|
161
|
-
"emits",
|
|
162
|
-
"external",
|
|
163
|
-
"capabilities",
|
|
164
|
-
]),
|
|
133
|
+
peakTier: z.enum(["none", "reads", "writes", "emits", "external", "capabilities"]),
|
|
165
134
|
});
|
|
166
135
|
|
|
167
136
|
const DeadLetterOut = z.object({
|
|
@@ -240,9 +209,7 @@ const SignalsReplayOut = z.object({
|
|
|
240
209
|
z.object({
|
|
241
210
|
id: z.string(),
|
|
242
211
|
ok: z.boolean(),
|
|
243
|
-
error: z
|
|
244
|
-
.object({ code: z.string(), message: z.string() })
|
|
245
|
-
.optional(),
|
|
212
|
+
error: z.object({ code: z.string(), message: z.string() }).optional(),
|
|
246
213
|
}),
|
|
247
214
|
),
|
|
248
215
|
wouldHaveFired: z.array(
|
|
@@ -319,14 +286,7 @@ const InvokeOut = z.object({
|
|
|
319
286
|
asUserId: z.string(),
|
|
320
287
|
trigger: z.enum(["http", "signal", "clock", "internal", "durable"]),
|
|
321
288
|
response: z.unknown(),
|
|
322
|
-
peakTier: z.enum([
|
|
323
|
-
"none",
|
|
324
|
-
"reads",
|
|
325
|
-
"writes",
|
|
326
|
-
"emits",
|
|
327
|
-
"external",
|
|
328
|
-
"capabilities",
|
|
329
|
-
]),
|
|
289
|
+
peakTier: z.enum(["none", "reads", "writes", "emits", "external", "capabilities"]),
|
|
330
290
|
auditedAt: z.number(),
|
|
331
291
|
});
|
|
332
292
|
|
|
@@ -540,9 +500,7 @@ const ClockListOut = z.object({
|
|
|
540
500
|
now: z.number(),
|
|
541
501
|
crons: z.array(ClockCronOut),
|
|
542
502
|
waitingOn: z.array(WaitingOnOut),
|
|
543
|
-
waitingOnCounts: z.array(
|
|
544
|
-
z.object({ label: z.string(), count: z.number() }),
|
|
545
|
-
),
|
|
503
|
+
waitingOnCounts: z.array(z.object({ label: z.string(), count: z.number() })),
|
|
546
504
|
timeline: z.array(
|
|
547
505
|
z.object({
|
|
548
506
|
at: z.number(),
|
|
@@ -598,13 +556,7 @@ const ClockWakeEarlyOut = z.object({
|
|
|
598
556
|
});
|
|
599
557
|
|
|
600
558
|
const VaultResolutionStepOut = z.object({
|
|
601
|
-
source: z.enum([
|
|
602
|
-
"process.env",
|
|
603
|
-
".env.local",
|
|
604
|
-
".env.stack",
|
|
605
|
-
"driver",
|
|
606
|
-
"dev-fallback",
|
|
607
|
-
]),
|
|
559
|
+
source: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]),
|
|
608
560
|
present: z.boolean(),
|
|
609
561
|
won: z.boolean(),
|
|
610
562
|
});
|
|
@@ -625,15 +577,7 @@ const VaultRowOut = z.object({
|
|
|
625
577
|
fingerprints: z.record(z.string(), z.string()),
|
|
626
578
|
fingerprint: z.string().nullable(),
|
|
627
579
|
cleartext: z.string().nullable(),
|
|
628
|
-
winner: z
|
|
629
|
-
.enum([
|
|
630
|
-
"process.env",
|
|
631
|
-
".env.local",
|
|
632
|
-
".env.stack",
|
|
633
|
-
"driver",
|
|
634
|
-
"dev-fallback",
|
|
635
|
-
])
|
|
636
|
-
.nullable(),
|
|
580
|
+
winner: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]).nullable(),
|
|
637
581
|
resolution: z.array(VaultResolutionStepOut),
|
|
638
582
|
readers: z.array(z.string()),
|
|
639
583
|
blastRadius: VaultBlastRadiusOut,
|
|
@@ -758,15 +702,7 @@ const AiListOut = z.object({
|
|
|
758
702
|
status: z.enum(["ok", "denied"]),
|
|
759
703
|
effects: z.array(
|
|
760
704
|
z.object({
|
|
761
|
-
kind: z.enum([
|
|
762
|
-
"read",
|
|
763
|
-
"write",
|
|
764
|
-
"emit",
|
|
765
|
-
"send",
|
|
766
|
-
"ask",
|
|
767
|
-
"secret",
|
|
768
|
-
"call",
|
|
769
|
-
]),
|
|
705
|
+
kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
|
|
770
706
|
resource: z.string(),
|
|
771
707
|
}),
|
|
772
708
|
),
|
|
@@ -868,12 +804,7 @@ const GatesListOut = z.object({
|
|
|
868
804
|
|
|
869
805
|
const DiffChangeOut = z.object({
|
|
870
806
|
path: z.string(),
|
|
871
|
-
category: z.enum([
|
|
872
|
-
"contract-breaking",
|
|
873
|
-
"permission-widening",
|
|
874
|
-
"effect-widening",
|
|
875
|
-
"no-impact",
|
|
876
|
-
]),
|
|
807
|
+
category: z.enum(["contract-breaking", "permission-widening", "effect-widening", "no-impact"]),
|
|
877
808
|
kind: z.enum(["added", "removed", "changed"]),
|
|
878
809
|
summary: z.string(),
|
|
879
810
|
before: z.unknown().optional(),
|
|
@@ -889,12 +820,7 @@ const DiffChangeOut = z.object({
|
|
|
889
820
|
const DiffListOut = z.object({
|
|
890
821
|
hasBaseline: z.boolean(),
|
|
891
822
|
severity: z
|
|
892
|
-
.enum([
|
|
893
|
-
"contract-breaking",
|
|
894
|
-
"permission-widening",
|
|
895
|
-
"effect-widening",
|
|
896
|
-
"no-impact",
|
|
897
|
-
])
|
|
823
|
+
.enum(["contract-breaking", "permission-widening", "effect-widening", "no-impact"])
|
|
898
824
|
.nullable(),
|
|
899
825
|
blockedCount: z.number(),
|
|
900
826
|
acknowledgedCount: z.number(),
|
|
@@ -1087,9 +1013,7 @@ const AccessPlaneSection = z.object({
|
|
|
1087
1013
|
lastUsedAt: z.number().nullable(),
|
|
1088
1014
|
expiresAt: z.number().nullable(),
|
|
1089
1015
|
revokedAt: z.number().nullable(),
|
|
1090
|
-
rateLimit: z
|
|
1091
|
-
.object({ max: z.number(), per: z.string() })
|
|
1092
|
-
.nullable(),
|
|
1016
|
+
rateLimit: z.object({ max: z.number(), per: z.string() }).nullable(),
|
|
1093
1017
|
ipAllowlist: z.array(z.string()),
|
|
1094
1018
|
unused90d: z.boolean(),
|
|
1095
1019
|
}),
|
|
@@ -1123,9 +1047,7 @@ const AccessListOut = z.object({
|
|
|
1123
1047
|
lastUsedAt: z.number().nullable(),
|
|
1124
1048
|
expiresAt: z.number().nullable(),
|
|
1125
1049
|
revokedAt: z.number().nullable(),
|
|
1126
|
-
rateLimit: z
|
|
1127
|
-
.object({ max: z.number(), per: z.string() })
|
|
1128
|
-
.nullable(),
|
|
1050
|
+
rateLimit: z.object({ max: z.number(), per: z.string() }).nullable(),
|
|
1129
1051
|
ipAllowlist: z.array(z.string()),
|
|
1130
1052
|
unused90d: z.boolean(),
|
|
1131
1053
|
}),
|
|
@@ -1197,10 +1119,7 @@ const AccessCreateKeyIn = z.object({
|
|
|
1197
1119
|
name: z.string().min(1),
|
|
1198
1120
|
scopes: z.array(z.string()),
|
|
1199
1121
|
expiresAt: z.number().nullable().optional(),
|
|
1200
|
-
rateLimit: z
|
|
1201
|
-
.object({ max: z.number(), per: z.string() })
|
|
1202
|
-
.nullable()
|
|
1203
|
-
.optional(),
|
|
1122
|
+
rateLimit: z.object({ max: z.number(), per: z.string() }).nullable().optional(),
|
|
1204
1123
|
ipAllowlist: z.array(z.string()).optional(),
|
|
1205
1124
|
});
|
|
1206
1125
|
|
|
@@ -1350,9 +1269,7 @@ const StoreQueryOut = z.object({
|
|
|
1350
1269
|
z.object({
|
|
1351
1270
|
key: z.string(),
|
|
1352
1271
|
value: z.unknown().optional(),
|
|
1353
|
-
warnings: z
|
|
1354
|
-
.array(z.object({ code: z.string(), message: z.string() }))
|
|
1355
|
-
.optional(),
|
|
1272
|
+
warnings: z.array(z.object({ code: z.string(), message: z.string() })).optional(),
|
|
1356
1273
|
}),
|
|
1357
1274
|
)
|
|
1358
1275
|
.optional(),
|
|
@@ -1652,10 +1569,7 @@ export function createConsoleBindings(state: ConsoleState): {
|
|
|
1652
1569
|
bindHttp(http.post("/console/access/keys"), accessCreateKeyFlow),
|
|
1653
1570
|
bindHttp(http.post("/console/access/keys/revoke"), accessRevokeKeyFlow),
|
|
1654
1571
|
bindHttp(http.post("/console/access/keys/rotate"), accessRotateKeyFlow),
|
|
1655
|
-
bindHttp(
|
|
1656
|
-
http.post("/console/access/roles/grants"),
|
|
1657
|
-
accessSetRoleGrantsFlow,
|
|
1658
|
-
),
|
|
1572
|
+
bindHttp(http.post("/console/access/roles/grants"), accessSetRoleGrantsFlow),
|
|
1659
1573
|
bindHttp(http.get("/console/diff"), diffList),
|
|
1660
1574
|
bindHttp(http.get("/console/plugins"), pluginsList),
|
|
1661
1575
|
bindHttp(http.get("/console/clock"), clockList),
|
|
@@ -1788,19 +1702,12 @@ function createSessionLogin(state: ConsoleState) {
|
|
|
1788
1702
|
out: SessionOut,
|
|
1789
1703
|
errors: { AuthFailed, AuthRateLimited },
|
|
1790
1704
|
do: async (input: z.infer<typeof LoginIn>, fx) => {
|
|
1791
|
-
if (
|
|
1792
|
-
touchLoginRateLimit(state.loginAttempts, input.email, state.now()) ===
|
|
1793
|
-
"rate_limited"
|
|
1794
|
-
) {
|
|
1705
|
+
if (touchLoginRateLimit(state.loginAttempts, input.email, state.now()) === "rate_limited") {
|
|
1795
1706
|
return fail("AuthRateLimited", {
|
|
1796
1707
|
reason: "too many login attempts; retry after 60s",
|
|
1797
1708
|
});
|
|
1798
1709
|
}
|
|
1799
|
-
const op = await authenticateOperator(
|
|
1800
|
-
state.operators,
|
|
1801
|
-
input.email,
|
|
1802
|
-
input.password,
|
|
1803
|
-
);
|
|
1710
|
+
const op = await authenticateOperator(state.operators, input.email, input.password);
|
|
1804
1711
|
if (!op) return fail("AuthFailed", {});
|
|
1805
1712
|
const issued = await issueOperatorSession(state, op.id);
|
|
1806
1713
|
fx.log.info("console.session.login", { operatorId: op.id });
|
|
@@ -1887,10 +1794,7 @@ function createRunsList(state: ConsoleState) {
|
|
|
1887
1794
|
* @param r - Stored wide event
|
|
1888
1795
|
* @param piiFields - Classified field names from the Manifest
|
|
1889
1796
|
*/
|
|
1890
|
-
export function projectRun(
|
|
1891
|
-
r: WideEvent,
|
|
1892
|
-
piiFields: ReadonlySet<string> = new Set(),
|
|
1893
|
-
) {
|
|
1797
|
+
export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Set()) {
|
|
1894
1798
|
const masked = maskWideEventForConsole(r, piiFields);
|
|
1895
1799
|
const dimensions: Record<string, string | number | boolean | null> = {};
|
|
1896
1800
|
for (const [k, v] of Object.entries(masked.dimensions)) {
|
|
@@ -2002,10 +1906,7 @@ function createSignalsDryRunReplay(state: ConsoleState) {
|
|
|
2002
1906
|
in: SignalsReplayIn.omit({ dryRun: true }),
|
|
2003
1907
|
out: SignalsReplayOut,
|
|
2004
1908
|
errors: { AuthFailed, SignalNotFound, DryRunUnsafe },
|
|
2005
|
-
do: async (
|
|
2006
|
-
input: Omit<z.infer<typeof SignalsReplayIn>, "dryRun">,
|
|
2007
|
-
fx,
|
|
2008
|
-
) => {
|
|
1909
|
+
do: async (input: Omit<z.infer<typeof SignalsReplayIn>, "dryRun">, fx) => {
|
|
2009
1910
|
if (!fx.operator.id) return fail("AuthFailed", {});
|
|
2010
1911
|
return runSignalReplay(state, fx, { ...input, dryRun: true });
|
|
2011
1912
|
},
|
|
@@ -2026,14 +1927,9 @@ function createSignalsDiscard(state: ConsoleState) {
|
|
|
2026
1927
|
const row = rows.find((s) => s.name === input.signal);
|
|
2027
1928
|
if (!row) return fail("SignalNotFound", { signal: input.signal });
|
|
2028
1929
|
|
|
2029
|
-
const irreversible =
|
|
2030
|
-
state.production &&
|
|
2031
|
-
row.consumers.some((c) => c.external || !c.durable);
|
|
1930
|
+
const irreversible = state.production && row.consumers.some((c) => c.external || !c.durable);
|
|
2032
1931
|
if (irreversible) {
|
|
2033
|
-
if (
|
|
2034
|
-
input.confirmation !== "DISCARD" ||
|
|
2035
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
2036
|
-
) {
|
|
1932
|
+
if (input.confirmation !== "DISCARD" || (input.reason?.trim().length ?? 0) < 3) {
|
|
2037
1933
|
return fail("ConfirmRequired", {
|
|
2038
1934
|
phrase: "DISCARD" as const,
|
|
2039
1935
|
reason: "discarding dead letters requires typed confirmation",
|
|
@@ -2084,18 +1980,12 @@ async function runSignalReplay(
|
|
|
2084
1980
|
}
|
|
2085
1981
|
} else {
|
|
2086
1982
|
const retriggersExternal =
|
|
2087
|
-
state.production &&
|
|
2088
|
-
row.consumers.some((c) => c.external) &&
|
|
2089
|
-
row.consumersDurable !== true;
|
|
1983
|
+
state.production && row.consumers.some((c) => c.external) && row.consumersDurable !== true;
|
|
2090
1984
|
if (retriggersExternal) {
|
|
2091
|
-
if (
|
|
2092
|
-
input.confirmation !== "REPLAY" ||
|
|
2093
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
2094
|
-
) {
|
|
1985
|
+
if (input.confirmation !== "REPLAY" || (input.reason?.trim().length ?? 0) < 3) {
|
|
2095
1986
|
return fail("ConfirmRequired", {
|
|
2096
1987
|
phrase: "REPLAY" as const,
|
|
2097
|
-
reason:
|
|
2098
|
-
"replay re-triggers an external effect; typed confirmation required",
|
|
1988
|
+
reason: "replay re-triggers an external effect; typed confirmation required",
|
|
2099
1989
|
});
|
|
2100
1990
|
}
|
|
2101
1991
|
}
|
|
@@ -2115,22 +2005,17 @@ async function runSignalReplay(
|
|
|
2115
2005
|
reason: result.refused.reason,
|
|
2116
2006
|
});
|
|
2117
2007
|
}
|
|
2118
|
-
fx.log.info(
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
ratePerSec: input.ratePerSec,
|
|
2130
|
-
reason: input.reason,
|
|
2131
|
-
wouldHaveFired: result.wouldHaveFired.length,
|
|
2132
|
-
},
|
|
2133
|
-
);
|
|
2008
|
+
fx.log.info(input.dryRun ? "console.signals.dryRunReplay" : "console.signals.replay", {
|
|
2009
|
+
operatorId: fx.operator.id,
|
|
2010
|
+
signal: input.signal,
|
|
2011
|
+
attempted: result.attempted,
|
|
2012
|
+
succeeded: result.succeeded,
|
|
2013
|
+
failed: result.failed,
|
|
2014
|
+
dryRun: result.dryRun,
|
|
2015
|
+
ratePerSec: input.ratePerSec,
|
|
2016
|
+
reason: input.reason,
|
|
2017
|
+
wouldHaveFired: result.wouldHaveFired.length,
|
|
2018
|
+
});
|
|
2134
2019
|
return {
|
|
2135
2020
|
ok: true as const,
|
|
2136
2021
|
attempted: result.attempted,
|
|
@@ -2317,9 +2202,7 @@ function peakTierOf(
|
|
|
2317
2202
|
return "none";
|
|
2318
2203
|
}
|
|
2319
2204
|
|
|
2320
|
-
function triggerKindOf(
|
|
2321
|
-
flow: ManifestFlow,
|
|
2322
|
-
): "http" | "signal" | "clock" | "internal" | "durable" {
|
|
2205
|
+
function triggerKindOf(flow: ManifestFlow): "http" | "signal" | "clock" | "internal" | "durable" {
|
|
2323
2206
|
if (flow.durable) return "durable";
|
|
2324
2207
|
if (flow.trigger?.http) return "http";
|
|
2325
2208
|
if (flow.trigger?.signal) return "signal";
|
|
@@ -2338,9 +2221,7 @@ function stubResponse(flow: ManifestFlow, body: unknown): unknown {
|
|
|
2338
2221
|
const out = flow.out;
|
|
2339
2222
|
if (out && typeof out === "object" && !Array.isArray(out)) {
|
|
2340
2223
|
const props = (out.properties ?? {}) as Record<string, unknown>;
|
|
2341
|
-
const required = Array.isArray(out.required)
|
|
2342
|
-
? (out.required as string[])
|
|
2343
|
-
: Object.keys(props);
|
|
2224
|
+
const required = Array.isArray(out.required) ? (out.required as string[]) : Object.keys(props);
|
|
2344
2225
|
const result: Record<string, unknown> = { echo: body };
|
|
2345
2226
|
for (const key of required) {
|
|
2346
2227
|
if (key === "id") result.id = `inv_${hashShort(body)}`;
|
|
@@ -2383,12 +2264,7 @@ async function issueOperatorSession(
|
|
|
2383
2264
|
return issued;
|
|
2384
2265
|
}
|
|
2385
2266
|
|
|
2386
|
-
function sessionPayload(
|
|
2387
|
-
operatorId: string,
|
|
2388
|
-
email: string,
|
|
2389
|
-
name: string,
|
|
2390
|
-
issued: IssuedSession,
|
|
2391
|
-
) {
|
|
2267
|
+
function sessionPayload(operatorId: string, email: string, name: string, issued: IssuedSession) {
|
|
2392
2268
|
return {
|
|
2393
2269
|
operatorId,
|
|
2394
2270
|
email,
|
|
@@ -2413,8 +2289,7 @@ function requireTenantIfDeclared(
|
|
|
2413
2289
|
if (tenant !== undefined && tenant.length > 0) return null;
|
|
2414
2290
|
if (!state.production) return null;
|
|
2415
2291
|
return fail("TenantRequired", {
|
|
2416
|
-
reason:
|
|
2417
|
-
"tenancy is declared — tenant selector is required (compliance boundary)",
|
|
2292
|
+
reason: "tenancy is declared — tenant selector is required (compliance boundary)",
|
|
2418
2293
|
});
|
|
2419
2294
|
}
|
|
2420
2295
|
|
|
@@ -2476,9 +2351,7 @@ function createStoreReveal(state: ConsoleState) {
|
|
|
2476
2351
|
revealPii: true,
|
|
2477
2352
|
limit: 500,
|
|
2478
2353
|
});
|
|
2479
|
-
const row = (result.rows ?? []).find(
|
|
2480
|
-
(r) => String(r.id ?? r.Id) === input.id,
|
|
2481
|
-
);
|
|
2354
|
+
const row = (result.rows ?? []).find((r) => String(r.id ?? r.Id) === input.id);
|
|
2482
2355
|
if (!row) return fail("StoreNotFound", { ref: input.ref });
|
|
2483
2356
|
fx.log.info("console.store.reveal", {
|
|
2484
2357
|
operatorId: fx.operator.id,
|
|
@@ -2534,14 +2407,10 @@ function createStoreEdit(state: ConsoleState) {
|
|
|
2534
2407
|
}
|
|
2535
2408
|
|
|
2536
2409
|
if (state.production) {
|
|
2537
|
-
if (
|
|
2538
|
-
input.confirmation !== "EDIT" ||
|
|
2539
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
2540
|
-
) {
|
|
2410
|
+
if (input.confirmation !== "EDIT" || (input.reason?.trim().length ?? 0) < 3) {
|
|
2541
2411
|
return fail("ConfirmRequired", {
|
|
2542
2412
|
phrase: "EDIT" as const,
|
|
2543
|
-
reason:
|
|
2544
|
-
"direct edit is not a flow execution — typed confirmation required",
|
|
2413
|
+
reason: "direct edit is not a flow execution — typed confirmation required",
|
|
2545
2414
|
});
|
|
2546
2415
|
}
|
|
2547
2416
|
}
|
|
@@ -2589,10 +2458,7 @@ function createStoreDelete(state: ConsoleState) {
|
|
|
2589
2458
|
const tenantFail = requireTenantIfDeclared(state, input.tenant);
|
|
2590
2459
|
if (tenantFail) return tenantFail;
|
|
2591
2460
|
if (state.production) {
|
|
2592
|
-
if (
|
|
2593
|
-
input.confirmation !== "DELETE" ||
|
|
2594
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
2595
|
-
) {
|
|
2461
|
+
if (input.confirmation !== "DELETE" || (input.reason?.trim().length ?? 0) < 3) {
|
|
2596
2462
|
return fail("ConfirmRequired", {
|
|
2597
2463
|
phrase: "DELETE" as const,
|
|
2598
2464
|
reason: "destructive store delete requires typed confirmation",
|
|
@@ -2632,10 +2498,7 @@ function createStorePurgeCache(state: ConsoleState) {
|
|
|
2632
2498
|
do: async (input: z.infer<typeof StorePurgeIn>, fx) => {
|
|
2633
2499
|
if (!fx.operator.id) return fail("AuthFailed", {});
|
|
2634
2500
|
if (state.production) {
|
|
2635
|
-
if (
|
|
2636
|
-
input.confirmation !== "PURGE" ||
|
|
2637
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
2638
|
-
) {
|
|
2501
|
+
if (input.confirmation !== "PURGE" || (input.reason?.trim().length ?? 0) < 3) {
|
|
2639
2502
|
return fail("ConfirmRequired", {
|
|
2640
2503
|
phrase: "PURGE" as const,
|
|
2641
2504
|
reason: "cache purge requires typed confirmation",
|
|
@@ -2671,14 +2534,10 @@ function createStoreSql(state: ConsoleState) {
|
|
|
2671
2534
|
const tenantFail = requireTenantIfDeclared(state, input.tenant);
|
|
2672
2535
|
if (tenantFail) return tenantFail;
|
|
2673
2536
|
try {
|
|
2674
|
-
const result = await state.runStoreSql(
|
|
2675
|
-
input.
|
|
2676
|
-
input.
|
|
2677
|
-
|
|
2678
|
-
allowWrite: input.allowWrite === true,
|
|
2679
|
-
tenant: input.tenant,
|
|
2680
|
-
},
|
|
2681
|
-
);
|
|
2537
|
+
const result = await state.runStoreSql(input.ref as ResourceRef, input.sql, {
|
|
2538
|
+
allowWrite: input.allowWrite === true,
|
|
2539
|
+
tenant: input.tenant,
|
|
2540
|
+
});
|
|
2682
2541
|
fx.log.info("console.store.sql", {
|
|
2683
2542
|
operatorId: fx.operator.id,
|
|
2684
2543
|
ref: input.ref,
|
|
@@ -2823,11 +2682,7 @@ function createVaultRotate(state: ConsoleState) {
|
|
|
2823
2682
|
return fail("VaultNotFound", { name: input.name });
|
|
2824
2683
|
}
|
|
2825
2684
|
// Rotate always requires typed confirm (console §6 · §9.8).
|
|
2826
|
-
if (
|
|
2827
|
-
input.confirmation !== "ROTATE" ||
|
|
2828
|
-
!input.reason ||
|
|
2829
|
-
input.reason.length < 3
|
|
2830
|
-
) {
|
|
2685
|
+
if (input.confirmation !== "ROTATE" || !input.reason || input.reason.length < 3) {
|
|
2831
2686
|
return fail("ConfirmRequired", {
|
|
2832
2687
|
phrase: "ROTATE" as const,
|
|
2833
2688
|
reason:
|
|
@@ -2866,10 +2721,7 @@ function createVaultRotate(state: ConsoleState) {
|
|
|
2866
2721
|
* @param state - Console state
|
|
2867
2722
|
* @param name - Contract name
|
|
2868
2723
|
*/
|
|
2869
|
-
async function vaultNameKnown(
|
|
2870
|
-
state: ConsoleState,
|
|
2871
|
-
name: string,
|
|
2872
|
-
): Promise<boolean> {
|
|
2724
|
+
async function vaultNameKnown(state: ConsoleState, name: string): Promise<boolean> {
|
|
2873
2725
|
if (state.manifest?.vault?.[name]) return true;
|
|
2874
2726
|
if (state.vaultRuntime?.contracts.has(name)) return true;
|
|
2875
2727
|
if (state.vaultRuntime?.names().includes(name)) return true;
|
|
@@ -2971,9 +2823,7 @@ function createGatesList(state: ConsoleState) {
|
|
|
2971
2823
|
name: p.name,
|
|
2972
2824
|
plane: p.plane,
|
|
2973
2825
|
scopes: [...p.scopes],
|
|
2974
|
-
...(p.memberCount !== undefined
|
|
2975
|
-
? { memberCount: p.memberCount }
|
|
2976
|
-
: {}),
|
|
2826
|
+
...(p.memberCount !== undefined ? { memberCount: p.memberCount } : {}),
|
|
2977
2827
|
...(p.email !== undefined ? { email: p.email } : {}),
|
|
2978
2828
|
})),
|
|
2979
2829
|
violations: projection.violations.map((v) => ({
|
|
@@ -3069,9 +2919,7 @@ function createGatesSimulate(state: ConsoleState) {
|
|
|
3069
2919
|
allowed: e.allowed,
|
|
3070
2920
|
kind: e.kind,
|
|
3071
2921
|
...(e.remaining !== undefined ? { remaining: e.remaining } : {}),
|
|
3072
|
-
...(e.retryAfterMs !== undefined
|
|
3073
|
-
? { retryAfterMs: e.retryAfterMs }
|
|
3074
|
-
: {}),
|
|
2922
|
+
...(e.retryAfterMs !== undefined ? { retryAfterMs: e.retryAfterMs } : {}),
|
|
3075
2923
|
...(e.reason !== undefined ? { reason: e.reason } : {}),
|
|
3076
2924
|
})),
|
|
3077
2925
|
deniedAt: result.deniedAt,
|
|
@@ -3226,14 +3074,10 @@ function createAccessRevokeKey(state: ConsoleState) {
|
|
|
3226
3074
|
errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
|
|
3227
3075
|
do: async (input: z.infer<typeof AccessRevokeKeyIn>, fx) => {
|
|
3228
3076
|
if (!fx.operator.id) return fail("AuthFailed", {});
|
|
3229
|
-
if (
|
|
3230
|
-
input.confirmation !== "REVOKE" ||
|
|
3231
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
3232
|
-
) {
|
|
3077
|
+
if (input.confirmation !== "REVOKE" || (input.reason?.trim().length ?? 0) < 3) {
|
|
3233
3078
|
return fail("ConfirmRequired", {
|
|
3234
3079
|
phrase: "REVOKE" as const,
|
|
3235
|
-
reason:
|
|
3236
|
-
"Type REVOKE and provide a reason — revocation is irreversible",
|
|
3080
|
+
reason: "Type REVOKE and provide a reason — revocation is irreversible",
|
|
3237
3081
|
});
|
|
3238
3082
|
}
|
|
3239
3083
|
const blastRadius = await state.accessKeyBlast(input.keyId);
|
|
@@ -3262,14 +3106,10 @@ function createAccessRotateKey(state: ConsoleState) {
|
|
|
3262
3106
|
errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
|
|
3263
3107
|
do: async (input: z.infer<typeof AccessRotateKeyIn>, fx) => {
|
|
3264
3108
|
if (!fx.operator.id) return fail("AuthFailed", {});
|
|
3265
|
-
if (
|
|
3266
|
-
input.confirmation !== "ROTATE" ||
|
|
3267
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
3268
|
-
) {
|
|
3109
|
+
if (input.confirmation !== "ROTATE" || (input.reason?.trim().length ?? 0) < 3) {
|
|
3269
3110
|
return fail("ConfirmRequired", {
|
|
3270
3111
|
phrase: "ROTATE" as const,
|
|
3271
|
-
reason:
|
|
3272
|
-
"Type ROTATE and provide a reason — the old secret dies immediately",
|
|
3112
|
+
reason: "Type ROTATE and provide a reason — the old secret dies immediately",
|
|
3273
3113
|
});
|
|
3274
3114
|
}
|
|
3275
3115
|
const blastRadius = await state.accessKeyBlast(input.keyId);
|
|
@@ -3352,15 +3192,10 @@ function createClockRunNow(state: ConsoleState) {
|
|
|
3352
3192
|
return fail("ClockNotFound", { kind: "cron" as const, id: input.name });
|
|
3353
3193
|
}
|
|
3354
3194
|
if (state.production && cron.external) {
|
|
3355
|
-
if (
|
|
3356
|
-
input.confirmation !== "RUN" ||
|
|
3357
|
-
!input.reason ||
|
|
3358
|
-
input.reason.length < 3
|
|
3359
|
-
) {
|
|
3195
|
+
if (input.confirmation !== "RUN" || !input.reason || input.reason.length < 3) {
|
|
3360
3196
|
return fail("ConfirmRequired", {
|
|
3361
3197
|
phrase: "RUN" as const,
|
|
3362
|
-
reason:
|
|
3363
|
-
"Type RUN and provide a reason — this cron has an external effect",
|
|
3198
|
+
reason: "Type RUN and provide a reason — this cron has an external effect",
|
|
3364
3199
|
});
|
|
3365
3200
|
}
|
|
3366
3201
|
}
|
|
@@ -3584,14 +3419,10 @@ function createChannelSendTest(state: ConsoleState) {
|
|
|
3584
3419
|
do: async (input: z.infer<typeof ChannelSendTestIn>, fx) => {
|
|
3585
3420
|
if (!fx.operator.id) return fail("AuthFailed", {});
|
|
3586
3421
|
if (state.production) {
|
|
3587
|
-
if (
|
|
3588
|
-
input.confirmation !== "SEND" ||
|
|
3589
|
-
(input.reason?.trim().length ?? 0) < 3
|
|
3590
|
-
) {
|
|
3422
|
+
if (input.confirmation !== "SEND" || (input.reason?.trim().length ?? 0) < 3) {
|
|
3591
3423
|
return fail("ConfirmRequired", {
|
|
3592
3424
|
phrase: "SEND" as const,
|
|
3593
|
-
reason:
|
|
3594
|
-
"send test is a real external send — typed confirmation required",
|
|
3425
|
+
reason: "send test is a real external send — typed confirmation required",
|
|
3595
3426
|
});
|
|
3596
3427
|
}
|
|
3597
3428
|
}
|