okengine 0.2.6 → 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 +45 -37
- 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
|
@@ -61,25 +61,14 @@ export function ClockPanel() {
|
|
|
61
61
|
const data = listQuery.data;
|
|
62
62
|
const now = data?.now ?? Date.now();
|
|
63
63
|
const q = search.q ?? "";
|
|
64
|
-
const crons = useMemo(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
);
|
|
68
|
-
const waitingOn = useMemo(
|
|
69
|
-
() => filterWaitingOn(data?.waitingOn ?? [], q),
|
|
70
|
-
[data?.waitingOn, q],
|
|
71
|
-
);
|
|
72
|
-
const timeline = useMemo(
|
|
73
|
-
() => forwardTimeline(data?.timeline ?? [], now),
|
|
74
|
-
[data?.timeline, now],
|
|
75
|
-
);
|
|
64
|
+
const crons = useMemo(() => filterCrons(data?.crons ?? [], q), [data?.crons, q]);
|
|
65
|
+
const waitingOn = useMemo(() => filterWaitingOn(data?.waitingOn ?? [], q), [data?.waitingOn, q]);
|
|
66
|
+
const timeline = useMemo(() => forwardTimeline(data?.timeline ?? [], now), [data?.timeline, now]);
|
|
76
67
|
const counts = data?.waitingOnCounts ?? [];
|
|
77
68
|
const banner = waitingOnBanner(waitingOn.length, counts);
|
|
78
69
|
const openCronRow = crons.find((c) => c.name === search.cron);
|
|
79
70
|
const openWakeRow = waitingOn.find((w) => w.runId === search.wake);
|
|
80
|
-
const runConfirm = openCronRow
|
|
81
|
-
? runNowConfirmation(openCronRow, { production: true })
|
|
82
|
-
: null;
|
|
71
|
+
const runConfirm = openCronRow ? runNowConfirmation(openCronRow, { production: true }) : null;
|
|
83
72
|
const health = openCronRow ? formatHealth(openCronRow.health) : null;
|
|
84
73
|
|
|
85
74
|
useEffect(() => {
|
|
@@ -92,8 +81,7 @@ export function ClockPanel() {
|
|
|
92
81
|
}
|
|
93
82
|
}, [openCronRow?.name, search.action, openWakeRow?.runId]);
|
|
94
83
|
|
|
95
|
-
const invalidate = () =>
|
|
96
|
-
qc.invalidateQueries({ queryKey: ["console.clock.list"] });
|
|
84
|
+
const invalidate = () => qc.invalidateQueries({ queryKey: ["console.clock.list"] });
|
|
97
85
|
|
|
98
86
|
const runNowMut = useMutation({
|
|
99
87
|
mutationFn: async () => {
|
|
@@ -179,18 +167,14 @@ export function ClockPanel() {
|
|
|
179
167
|
<div className="flex h-full min-h-0 flex-col">
|
|
180
168
|
<header className="shrink-0 border-b border-[var(--oke-line)] px-4 py-3">
|
|
181
169
|
<h1 className="text-lg font-medium">Clock</h1>
|
|
182
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
183
|
-
Forward timeline, waiting-on, cron health
|
|
184
|
-
</p>
|
|
170
|
+
<p className="text-sm text-[var(--oke-muted)]">Forward timeline, waiting-on, cron health</p>
|
|
185
171
|
<label className="mt-2 block max-w-sm text-sm">
|
|
186
172
|
<span className="sr-only">Filter clock</span>
|
|
187
173
|
<Input
|
|
188
174
|
aria-label="Filter clock"
|
|
189
175
|
placeholder="Filter…"
|
|
190
176
|
value={q}
|
|
191
|
-
onChange={(e) =>
|
|
192
|
-
setSearch({ ...search, q: e.currentTarget.value || undefined })
|
|
193
|
-
}
|
|
177
|
+
onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
|
|
194
178
|
/>
|
|
195
179
|
</label>
|
|
196
180
|
</header>
|
|
@@ -234,9 +218,7 @@ export function ClockPanel() {
|
|
|
234
218
|
</p>
|
|
235
219
|
<ul className="space-y-1">
|
|
236
220
|
{waitingOn.map((w) => {
|
|
237
|
-
const count =
|
|
238
|
-
counts.find((c) => c.label === (w.label || "(unlabelled)"))
|
|
239
|
-
?.count ?? 1;
|
|
221
|
+
const count = counts.find((c) => c.label === (w.label || "(unlabelled)"))?.count ?? 1;
|
|
240
222
|
return (
|
|
241
223
|
<li key={w.runId}>
|
|
242
224
|
<button
|
|
@@ -263,10 +245,7 @@ export function ClockPanel() {
|
|
|
263
245
|
</ul>
|
|
264
246
|
</section>
|
|
265
247
|
|
|
266
|
-
<section
|
|
267
|
-
aria-label="Cron schedules"
|
|
268
|
-
className="min-h-0 overflow-y-auto p-4"
|
|
269
|
-
>
|
|
248
|
+
<section aria-label="Cron schedules" className="min-h-0 overflow-y-auto p-4">
|
|
270
249
|
<h2 className="mb-2 text-sm font-medium">Schedules</h2>
|
|
271
250
|
<ul className="mb-4 space-y-1">
|
|
272
251
|
{crons.map((c) => {
|
|
@@ -286,17 +265,13 @@ export function ClockPanel() {
|
|
|
286
265
|
>
|
|
287
266
|
<span className="flex items-center gap-1">
|
|
288
267
|
{c.name}
|
|
289
|
-
{c.external ?
|
|
290
|
-
<span aria-label="external effect">↗</span>
|
|
291
|
-
) : null}
|
|
268
|
+
{c.external ? <span aria-label="external effect">↗</span> : null}
|
|
292
269
|
{c.health.overdue ? (
|
|
293
270
|
<span role="status" className="text-[var(--oke-danger)]">
|
|
294
271
|
overdue
|
|
295
272
|
</span>
|
|
296
273
|
) : null}
|
|
297
|
-
{c.dstAmbiguity ?
|
|
298
|
-
<span role="status">DST {c.dstAmbiguity.kind}</span>
|
|
299
|
-
) : null}
|
|
274
|
+
{c.dstAmbiguity ? <span role="status">DST {c.dstAmbiguity.kind}</span> : null}
|
|
300
275
|
</span>
|
|
301
276
|
<span className="text-[var(--oke-muted)]">
|
|
302
277
|
{h.drift} · {h.missedWithPolicy} · {h.lease}
|
|
@@ -308,14 +283,15 @@ export function ClockPanel() {
|
|
|
308
283
|
</ul>
|
|
309
284
|
|
|
310
285
|
{openCronRow && health ? (
|
|
311
|
-
<section
|
|
286
|
+
<section
|
|
287
|
+
aria-label="Cron detail"
|
|
288
|
+
aria-live="polite"
|
|
289
|
+
className="space-y-3 border-t border-[var(--oke-line)] pt-3"
|
|
290
|
+
>
|
|
312
291
|
<h3 className="text-base font-medium">{openCronRow.name}</h3>
|
|
313
292
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
314
|
-
{openCronRow.effectiveCron ?? openCronRow.effectiveEvery} ·{
|
|
315
|
-
{openCronRow.
|
|
316
|
-
{openCronRow.status !== "active"
|
|
317
|
-
? ` · ${openCronRow.status}`
|
|
318
|
-
: ""}
|
|
293
|
+
{openCronRow.effectiveCron ?? openCronRow.effectiveEvery} · {openCronRow.timezone}
|
|
294
|
+
{openCronRow.status !== "active" ? ` · ${openCronRow.status}` : ""}
|
|
319
295
|
</p>
|
|
320
296
|
<dl className="grid grid-cols-2 gap-2 text-sm">
|
|
321
297
|
<div>
|
|
@@ -383,8 +359,7 @@ export function ClockPanel() {
|
|
|
383
359
|
{search.action === "run" && runConfirm?.kind === "typed" ? (
|
|
384
360
|
<div className="space-y-2">
|
|
385
361
|
<p className="text-sm">
|
|
386
|
-
This cron has an external effect. Type
|
|
387
|
-
<strong>RUN</strong> and a reason.
|
|
362
|
+
This cron has an external effect. Type <strong>RUN</strong> and a reason.
|
|
388
363
|
</p>
|
|
389
364
|
<label className="block text-sm">
|
|
390
365
|
Type RUN to confirm
|
|
@@ -449,19 +424,12 @@ export function ClockPanel() {
|
|
|
449
424
|
aria-live="polite"
|
|
450
425
|
className="mt-4 space-y-2 border-t border-[var(--oke-line)] pt-3"
|
|
451
426
|
>
|
|
452
|
-
<h3 className="text-base font-medium">
|
|
453
|
-
{openWakeRow.label || openWakeRow.flow}
|
|
454
|
-
</h3>
|
|
427
|
+
<h3 className="text-base font-medium">{openWakeRow.label || openWakeRow.flow}</h3>
|
|
455
428
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
456
|
-
{openWakeRow.flow} · wake in{
|
|
457
|
-
{formatWakeIn(openWakeRow.wakeInMs)}
|
|
429
|
+
{openWakeRow.flow} · wake in {formatWakeIn(openWakeRow.wakeInMs)}
|
|
458
430
|
{openWakeRow.step ? ` · step ${openWakeRow.step}` : ""}
|
|
459
431
|
</p>
|
|
460
|
-
<Button
|
|
461
|
-
type="button"
|
|
462
|
-
disabled={wakeMut.isPending}
|
|
463
|
-
onClick={() => wakeMut.mutate()}
|
|
464
|
-
>
|
|
432
|
+
<Button type="button" disabled={wakeMut.isPending} onClick={() => wakeMut.mutate()}>
|
|
465
433
|
Wake early
|
|
466
434
|
</Button>
|
|
467
435
|
</section>
|
|
@@ -30,10 +30,7 @@ import { consoleCalls } from "../../client.ts";
|
|
|
30
30
|
export function DiffPanel() {
|
|
31
31
|
const pathname = useRouterState({ select: (s) => s.location.pathname });
|
|
32
32
|
const rawSearch = useRouterState({ select: (s) => s.location.search });
|
|
33
|
-
const search = useMemo(
|
|
34
|
-
() => parseDiffSearch(rawSearch as Record<string, unknown>),
|
|
35
|
-
[rawSearch],
|
|
36
|
-
);
|
|
33
|
+
const search = useMemo(() => parseDiffSearch(rawSearch as Record<string, unknown>), [rawSearch]);
|
|
37
34
|
const navigate = useNavigate();
|
|
38
35
|
|
|
39
36
|
const setSearch = (next: DiffSearch) => {
|
|
@@ -56,12 +53,7 @@ export function DiffPanel() {
|
|
|
56
53
|
|
|
57
54
|
const data = listQuery.data;
|
|
58
55
|
const filtered = useMemo(
|
|
59
|
-
() =>
|
|
60
|
-
filterChanges(
|
|
61
|
-
data?.changes ?? [],
|
|
62
|
-
search.q ?? "",
|
|
63
|
-
search.category,
|
|
64
|
-
),
|
|
56
|
+
() => filterChanges(data?.changes ?? [], search.q ?? "", search.category),
|
|
65
57
|
[data?.changes, search.q, search.category],
|
|
66
58
|
);
|
|
67
59
|
const groups = useMemo(() => groupByCategory(filtered), [filtered]);
|
|
@@ -70,12 +62,10 @@ export function DiffPanel() {
|
|
|
70
62
|
return (
|
|
71
63
|
<div className="flex h-full min-h-0 flex-col">
|
|
72
64
|
<header className="shrink-0 border-b border-[var(--oke-line)] px-4 py-3">
|
|
73
|
-
<h1 className="text-base font-medium text-[var(--oke-fg)]">
|
|
74
|
-
Manifest Diff
|
|
75
|
-
</h1>
|
|
65
|
+
<h1 className="text-base font-medium text-[var(--oke-fg)]">Manifest Diff</h1>
|
|
76
66
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
77
|
-
Blast radius of a deploy — contract, permission, effect, and no-impact.
|
|
78
|
-
|
|
67
|
+
Blast radius of a deploy — contract, permission, effect, and no-impact. Read-only compare
|
|
68
|
+
of current Manifest vs baseline.
|
|
79
69
|
</p>
|
|
80
70
|
<label className="mt-2 flex max-w-sm flex-col gap-1 text-sm">
|
|
81
71
|
<span className="text-[var(--oke-muted)]">Filter</span>
|
|
@@ -83,16 +73,10 @@ export function DiffPanel() {
|
|
|
83
73
|
aria-label="Filter changes"
|
|
84
74
|
className="min-h-8 border border-[var(--oke-line)] bg-transparent px-2"
|
|
85
75
|
value={search.q ?? ""}
|
|
86
|
-
onChange={(e) =>
|
|
87
|
-
setSearch({ ...search, q: e.target.value || undefined })
|
|
88
|
-
}
|
|
76
|
+
onChange={(e) => setSearch({ ...search, q: e.target.value || undefined })}
|
|
89
77
|
/>
|
|
90
78
|
</label>
|
|
91
|
-
<div
|
|
92
|
-
role="group"
|
|
93
|
-
aria-label="Blast-radius category"
|
|
94
|
-
className="mt-2 flex flex-wrap gap-1"
|
|
95
|
-
>
|
|
79
|
+
<div role="group" aria-label="Blast-radius category" className="mt-2 flex flex-wrap gap-1">
|
|
96
80
|
<CategoryChip
|
|
97
81
|
label="All"
|
|
98
82
|
pressed={search.category === undefined}
|
|
@@ -124,9 +108,7 @@ export function DiffPanel() {
|
|
|
124
108
|
<p className="text-[var(--oke-fg)]">
|
|
125
109
|
<span
|
|
126
110
|
className={
|
|
127
|
-
(data.blockedCount ?? 0) > 0
|
|
128
|
-
? "text-[var(--oke-fg)]"
|
|
129
|
-
: "text-[var(--oke-muted)]"
|
|
111
|
+
(data.blockedCount ?? 0) > 0 ? "text-[var(--oke-fg)]" : "text-[var(--oke-muted)]"
|
|
130
112
|
}
|
|
131
113
|
>
|
|
132
114
|
{data.blockedCount} undeclared break
|
|
@@ -142,17 +124,13 @@ export function DiffPanel() {
|
|
|
142
124
|
) : null}
|
|
143
125
|
|
|
144
126
|
<main id="diff-main" className="min-h-0 flex-1 overflow-y-auto p-4">
|
|
145
|
-
{listQuery.isLoading ? (
|
|
146
|
-
|
|
147
|
-
) : null}
|
|
148
|
-
{listQuery.isError ? (
|
|
149
|
-
<p role="alert">Failed to load Manifest Diff</p>
|
|
150
|
-
) : null}
|
|
127
|
+
{listQuery.isLoading ? <p className="text-[var(--oke-muted)]">Loading…</p> : null}
|
|
128
|
+
{listQuery.isError ? <p role="alert">Failed to load Manifest Diff</p> : null}
|
|
151
129
|
|
|
152
130
|
{data && !data.hasBaseline ? (
|
|
153
131
|
<p className="text-[var(--oke-muted)]" role="status">
|
|
154
|
-
No baseline Manifest to compare. Deploy once, or feed a previous
|
|
155
|
-
|
|
132
|
+
No baseline Manifest to compare. Deploy once, or feed a previous Manifest, to see blast
|
|
133
|
+
radius.
|
|
156
134
|
</p>
|
|
157
135
|
) : null}
|
|
158
136
|
|
|
@@ -163,16 +141,10 @@ export function DiffPanel() {
|
|
|
163
141
|
) : null}
|
|
164
142
|
|
|
165
143
|
{groups.map((group) => (
|
|
166
|
-
<section
|
|
167
|
-
key={group.category}
|
|
168
|
-
aria-label={group.label}
|
|
169
|
-
className="mb-8"
|
|
170
|
-
>
|
|
144
|
+
<section key={group.category} aria-label={group.label} className="mb-8">
|
|
171
145
|
<h2 className="mb-3 text-xs uppercase tracking-wide text-[var(--oke-muted)]">
|
|
172
146
|
{group.label}
|
|
173
|
-
<span className="ml-2 font-mono normal-case">
|
|
174
|
-
({group.items.length})
|
|
175
|
-
</span>
|
|
147
|
+
<span className="ml-2 font-mono normal-case">({group.items.length})</span>
|
|
176
148
|
</h2>
|
|
177
149
|
<ul className="space-y-3">
|
|
178
150
|
{group.items.map((item) => {
|
|
@@ -194,31 +166,20 @@ export function DiffPanel() {
|
|
|
194
166
|
onClick={() =>
|
|
195
167
|
setSearch({
|
|
196
168
|
...search,
|
|
197
|
-
path:
|
|
198
|
-
search.path === item.path
|
|
199
|
-
? undefined
|
|
200
|
-
: item.path,
|
|
169
|
+
path: search.path === item.path ? undefined : item.path,
|
|
201
170
|
})
|
|
202
171
|
}
|
|
203
172
|
>
|
|
204
|
-
<h3 className="font-mono text-sm text-[var(--oke-fg)]">
|
|
205
|
-
|
|
206
|
-
</h3>
|
|
207
|
-
<p className="mt-1 text-sm text-[var(--oke-muted)]">
|
|
208
|
-
{item.summary}
|
|
209
|
-
</p>
|
|
173
|
+
<h3 className="font-mono text-sm text-[var(--oke-fg)]">{item.path}</h3>
|
|
174
|
+
<p className="mt-1 text-sm text-[var(--oke-muted)]">{item.summary}</p>
|
|
210
175
|
</button>
|
|
211
176
|
{item.blastLine ? (
|
|
212
|
-
<p
|
|
213
|
-
role="status"
|
|
214
|
-
className="mt-2 text-sm text-[var(--oke-fg)]"
|
|
215
|
-
>
|
|
177
|
+
<p role="status" className="mt-2 text-sm text-[var(--oke-fg)]">
|
|
216
178
|
{item.blastLine}
|
|
217
179
|
</p>
|
|
218
180
|
) : item.runCountLastWeek > 0 && item.flowName ? (
|
|
219
181
|
<p className="mt-2 text-sm text-[var(--oke-muted)]">
|
|
220
|
-
Ran {item.runCountLastWeek.toLocaleString("en-US")}
|
|
221
|
-
times last week
|
|
182
|
+
Ran {item.runCountLastWeek.toLocaleString("en-US")} times last week
|
|
222
183
|
</p>
|
|
223
184
|
) : null}
|
|
224
185
|
{item.weeklyBillLine ? (
|
|
@@ -263,9 +224,7 @@ function CategoryChip(props: {
|
|
|
263
224
|
aria-pressed={props.pressed}
|
|
264
225
|
className={clsx(
|
|
265
226
|
"min-h-8 px-2 text-xs",
|
|
266
|
-
props.pressed
|
|
267
|
-
? "bg-[var(--oke-line)] text-[var(--oke-fg)]"
|
|
268
|
-
: "text-[var(--oke-muted)]",
|
|
227
|
+
props.pressed ? "bg-[var(--oke-line)] text-[var(--oke-fg)]" : "text-[var(--oke-muted)]",
|
|
269
228
|
)}
|
|
270
229
|
onClick={props.onClick}
|
|
271
230
|
>
|
|
@@ -78,11 +78,7 @@ export function ContractEditor(props: ContractEditorProps) {
|
|
|
78
78
|
)}
|
|
79
79
|
</div>
|
|
80
80
|
) : (
|
|
81
|
-
<JsonPane
|
|
82
|
-
value={props.value}
|
|
83
|
-
onChange={props.onChange}
|
|
84
|
-
schema={props.schema}
|
|
85
|
-
/>
|
|
81
|
+
<JsonPane value={props.value} onChange={props.onChange} schema={props.schema} />
|
|
86
82
|
)}
|
|
87
83
|
</section>
|
|
88
84
|
);
|
|
@@ -94,10 +90,7 @@ export function ContractEditor(props: ContractEditorProps) {
|
|
|
94
90
|
* @param schema - Input schema
|
|
95
91
|
* @param value - Request body
|
|
96
92
|
*/
|
|
97
|
-
export function validateBeforeSend(
|
|
98
|
-
schema: Record<string, unknown> | null,
|
|
99
|
-
value: unknown,
|
|
100
|
-
) {
|
|
93
|
+
export function validateBeforeSend(schema: Record<string, unknown> | null, value: unknown) {
|
|
101
94
|
return validateContract(schema, value);
|
|
102
95
|
}
|
|
103
96
|
|
|
@@ -117,16 +110,9 @@ function FormFieldControl({
|
|
|
117
110
|
if (field.type === "object" && field.children) {
|
|
118
111
|
return (
|
|
119
112
|
<fieldset className="flex flex-col gap-2 border border-[var(--oke-line)] p-3">
|
|
120
|
-
<legend className="px-1 text-xs text-[var(--oke-muted)]">
|
|
121
|
-
{field.name}
|
|
122
|
-
</legend>
|
|
113
|
+
<legend className="px-1 text-xs text-[var(--oke-muted)]">{field.name}</legend>
|
|
123
114
|
{field.children.map((child) => (
|
|
124
|
-
<FormFieldControl
|
|
125
|
-
key={child.path}
|
|
126
|
-
field={child}
|
|
127
|
-
value={value}
|
|
128
|
-
onChange={onChange}
|
|
129
|
-
/>
|
|
115
|
+
<FormFieldControl key={child.path} field={child} value={value} onChange={onChange} />
|
|
130
116
|
))}
|
|
131
117
|
</fieldset>
|
|
132
118
|
);
|
|
@@ -158,16 +144,13 @@ function FormFieldControl({
|
|
|
158
144
|
type="checkbox"
|
|
159
145
|
className="h-6 w-6"
|
|
160
146
|
checked={Boolean(current)}
|
|
161
|
-
onChange={(e) =>
|
|
162
|
-
onChange(setAtPath(value, field.path, e.target.checked))
|
|
163
|
-
}
|
|
147
|
+
onChange={(e) => onChange(setAtPath(value, field.path, e.target.checked))}
|
|
164
148
|
/>
|
|
165
149
|
</Field>
|
|
166
150
|
);
|
|
167
151
|
}
|
|
168
152
|
|
|
169
|
-
const inputType =
|
|
170
|
-
field.type === "integer" || field.type === "number" ? "number" : "text";
|
|
153
|
+
const inputType = field.type === "integer" || field.type === "number" ? "number" : "text";
|
|
171
154
|
|
|
172
155
|
return (
|
|
173
156
|
<Field label={field.name} error={error}>
|
|
@@ -4,20 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
import { useMutation, useQuery } from "@tanstack/react-query";
|
|
6
6
|
import { useEffect, useMemo, useState } from "react";
|
|
7
|
-
import {
|
|
8
|
-
confirmationFor,
|
|
9
|
-
validateTypedConfirm,
|
|
10
|
-
} from "../../../flows/confirmation.ts";
|
|
7
|
+
import { confirmationFor, validateTypedConfirm } from "../../../flows/confirmation.ts";
|
|
11
8
|
import { diffAgainstSchema, seedFromSchema } from "../../../flows/contract.ts";
|
|
12
9
|
import type { FlowNode } from "../../../flows/graph.ts";
|
|
13
10
|
import { emitSaveAsTest, saveAsTestPath } from "../../../flows/save-as-test.ts";
|
|
14
11
|
import { TIER_LABEL } from "../../../flows/tiers.ts";
|
|
15
12
|
import { consoleCalls } from "../../client.ts";
|
|
16
13
|
import { Button, Field, Input } from "../../components/ui.tsx";
|
|
17
|
-
import {
|
|
18
|
-
ContractEditor,
|
|
19
|
-
validateBeforeSend,
|
|
20
|
-
} from "./ContractEditor.tsx";
|
|
14
|
+
import { ContractEditor, validateBeforeSend } from "./ContractEditor.tsx";
|
|
21
15
|
|
|
22
16
|
/** Props for {@link FlowDrawer}. */
|
|
23
17
|
export interface FlowDrawerProps {
|
|
@@ -38,9 +32,9 @@ export interface FlowDrawerProps {
|
|
|
38
32
|
export function FlowDrawer(props: FlowDrawerProps) {
|
|
39
33
|
const { flow, mode } = props;
|
|
40
34
|
const [body, setBody] = useState<unknown>(() => seedFromSchema(flow.inSchema));
|
|
41
|
-
const [fieldErrors, setFieldErrors] = useState<
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
const [fieldErrors, setFieldErrors] = useState<ReturnType<typeof validateBeforeSend>["errors"]>(
|
|
36
|
+
[],
|
|
37
|
+
);
|
|
44
38
|
const [asUserId, setAsUserId] = useState("");
|
|
45
39
|
const [confirmTyped, setConfirmTyped] = useState("");
|
|
46
40
|
const [reason, setReason] = useState("");
|
|
@@ -145,9 +139,7 @@ export function FlowDrawer(props: FlowDrawerProps) {
|
|
|
145
139
|
{flow.action}
|
|
146
140
|
</h2>
|
|
147
141
|
<div className="flex flex-wrap items-center gap-2 text-xs">
|
|
148
|
-
<span className="border border-[var(--oke-line)] px-1.5 py-0.5">
|
|
149
|
-
{flow.plane}
|
|
150
|
-
</span>
|
|
142
|
+
<span className="border border-[var(--oke-line)] px-1.5 py-0.5">{flow.plane}</span>
|
|
151
143
|
{flow.flags.durable ? <Flag>durable</Flag> : null}
|
|
152
144
|
{flow.flags.live ? <Flag>live</Flag> : null}
|
|
153
145
|
{flow.flags.external ? (
|
|
@@ -159,10 +151,7 @@ export function FlowDrawer(props: FlowDrawerProps) {
|
|
|
159
151
|
</div>
|
|
160
152
|
{mode === "workbench" ? (
|
|
161
153
|
<p className="text-xs text-[var(--oke-muted)]">
|
|
162
|
-
Effects:{" "}
|
|
163
|
-
{flow.peakTier === "none"
|
|
164
|
-
? "none"
|
|
165
|
-
: TIER_LABEL[flow.peakTier]}
|
|
154
|
+
Effects: {flow.peakTier === "none" ? "none" : TIER_LABEL[flow.peakTier]}
|
|
166
155
|
{flow.external ? " · irreversible" : ""}
|
|
167
156
|
</p>
|
|
168
157
|
) : null}
|
|
@@ -241,8 +230,8 @@ export function FlowDrawer(props: FlowDrawerProps) {
|
|
|
241
230
|
className="flex flex-col gap-2 border border-[var(--oke-external)] p-3"
|
|
242
231
|
>
|
|
243
232
|
<p className="text-sm text-[var(--oke-external)]">
|
|
244
|
-
This flow has external effects in production. Type{" "}
|
|
245
|
-
|
|
233
|
+
This flow has external effects in production. Type <strong>{pattern.phrase}</strong>{" "}
|
|
234
|
+
and record a reason.
|
|
246
235
|
</p>
|
|
247
236
|
<Field label={`Type ${pattern.phrase}`}>
|
|
248
237
|
<Input
|
|
@@ -252,10 +241,7 @@ export function FlowDrawer(props: FlowDrawerProps) {
|
|
|
252
241
|
/>
|
|
253
242
|
</Field>
|
|
254
243
|
<Field label="Reason">
|
|
255
|
-
<Input
|
|
256
|
-
value={reason}
|
|
257
|
-
onChange={(e) => setReason(e.currentTarget.value)}
|
|
258
|
-
/>
|
|
244
|
+
<Input value={reason} onChange={(e) => setReason(e.currentTarget.value)} />
|
|
259
245
|
</Field>
|
|
260
246
|
</section>
|
|
261
247
|
) : null}
|
|
@@ -278,11 +264,10 @@ export function FlowDrawer(props: FlowDrawerProps) {
|
|
|
278
264
|
<pre className="overflow-auto border border-[var(--oke-line)] p-3 font-mono text-xs">
|
|
279
265
|
{JSON.stringify(response, null, 2)}
|
|
280
266
|
</pre>
|
|
281
|
-
{schemaDiff &&
|
|
282
|
-
(schemaDiff.missing.length > 0 || schemaDiff.extra.length > 0) ? (
|
|
267
|
+
{schemaDiff && (schemaDiff.missing.length > 0 || schemaDiff.extra.length > 0) ? (
|
|
283
268
|
<p role="status" className="text-xs text-[var(--oke-danger)]">
|
|
284
|
-
Schema drift — missing: {schemaDiff.missing.join(", ") || "—"} ·
|
|
285
|
-
|
|
269
|
+
Schema drift — missing: {schemaDiff.missing.join(", ") || "—"} · extra:{" "}
|
|
270
|
+
{schemaDiff.extra.join(", ") || "—"}
|
|
286
271
|
</p>
|
|
287
272
|
) : null}
|
|
288
273
|
<Button
|
|
@@ -24,11 +24,7 @@ import {
|
|
|
24
24
|
serializeFlowsSearch,
|
|
25
25
|
type FlowsSearch,
|
|
26
26
|
} from "../../../flows/search.ts";
|
|
27
|
-
import {
|
|
28
|
-
TIER_LABEL,
|
|
29
|
-
TIER_ORDER,
|
|
30
|
-
type UiEffectTier,
|
|
31
|
-
} from "../../../flows/tiers.ts";
|
|
27
|
+
import { TIER_LABEL, TIER_ORDER, type UiEffectTier } from "../../../flows/tiers.ts";
|
|
32
28
|
import type { Manifest } from "../../../../../manifest/types.ts";
|
|
33
29
|
import { consoleCalls } from "../../client.ts";
|
|
34
30
|
import { Button, Input, NewRowsPill } from "../../components/ui.tsx";
|
|
@@ -58,10 +54,7 @@ export function FlowsPanel() {
|
|
|
58
54
|
},
|
|
59
55
|
});
|
|
60
56
|
|
|
61
|
-
const graph = useMemo(
|
|
62
|
-
() => buildCausalityGraph(manifestQuery.data),
|
|
63
|
-
[manifestQuery.data],
|
|
64
|
-
);
|
|
57
|
+
const graph = useMemo(() => buildCausalityGraph(manifestQuery.data), [manifestQuery.data]);
|
|
65
58
|
|
|
66
59
|
const causes = useMemo(
|
|
67
60
|
() =>
|
|
@@ -102,9 +95,7 @@ export function FlowsPanel() {
|
|
|
102
95
|
[graph, search],
|
|
103
96
|
);
|
|
104
97
|
|
|
105
|
-
const openFlow = search.open
|
|
106
|
-
? graph.flowById.get(search.open)
|
|
107
|
-
: undefined;
|
|
98
|
+
const openFlow = search.open ? graph.flowById.get(search.open) : undefined;
|
|
108
99
|
|
|
109
100
|
const path = parsePath(search.path);
|
|
110
101
|
const [pendingNew] = useState(0);
|
|
@@ -140,18 +131,14 @@ export function FlowsPanel() {
|
|
|
140
131
|
<div className="relative flex h-[calc(100vh-3rem)] flex-col">
|
|
141
132
|
<header className="flex flex-wrap items-center gap-3 border-b border-[var(--oke-line)] px-4 py-2">
|
|
142
133
|
<h1 className="text-sm font-semibold tracking-wide">Flows</h1>
|
|
143
|
-
<p className="text-xs text-[var(--oke-muted)]">
|
|
144
|
-
Causes ← Flows → Effects
|
|
145
|
-
</p>
|
|
134
|
+
<p className="text-xs text-[var(--oke-muted)]">Causes ← Flows → Effects</p>
|
|
146
135
|
<label className="ml-auto flex min-w-[12rem] flex-1 items-center gap-2 text-xs text-[var(--oke-muted)] md:max-w-xs">
|
|
147
136
|
<span className="sr-only">Filter</span>
|
|
148
137
|
<Input
|
|
149
138
|
type="search"
|
|
150
139
|
placeholder="Filter (dims, never hides)"
|
|
151
140
|
value={search.q ?? ""}
|
|
152
|
-
onChange={(e) =>
|
|
153
|
-
setSearch({ ...search, q: e.currentTarget.value || undefined })
|
|
154
|
-
}
|
|
141
|
+
onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
|
|
155
142
|
/>
|
|
156
143
|
</label>
|
|
157
144
|
<Button
|
|
@@ -161,8 +148,7 @@ export function FlowsPanel() {
|
|
|
161
148
|
onClick={() =>
|
|
162
149
|
setSearch({
|
|
163
150
|
...search,
|
|
164
|
-
density:
|
|
165
|
-
search.density === "compact" ? "comfortable" : "compact",
|
|
151
|
+
density: search.density === "compact" ? "comfortable" : "compact",
|
|
166
152
|
})
|
|
167
153
|
}
|
|
168
154
|
>
|
|
@@ -172,9 +158,7 @@ export function FlowsPanel() {
|
|
|
172
158
|
type="button"
|
|
173
159
|
variant="ghost"
|
|
174
160
|
aria-pressed={search.transitive}
|
|
175
|
-
onClick={() =>
|
|
176
|
-
setSearch({ ...search, transitive: !search.transitive })
|
|
177
|
-
}
|
|
161
|
+
onClick={() => setSearch({ ...search, transitive: !search.transitive })}
|
|
178
162
|
>
|
|
179
163
|
{search.transitive ? "Transitive" : "Direct"}
|
|
180
164
|
</Button>
|
|
@@ -469,14 +453,10 @@ function EffectRow({
|
|
|
469
453
|
</span>
|
|
470
454
|
) : null}
|
|
471
455
|
{effect.touchCount > 1 ? (
|
|
472
|
-
<span className="ml-auto text-[11px] text-[var(--oke-muted)]">
|
|
473
|
-
{effect.touchCount}
|
|
474
|
-
</span>
|
|
456
|
+
<span className="ml-auto text-[11px] text-[var(--oke-muted)]">{effect.touchCount}</span>
|
|
475
457
|
) : null}
|
|
476
458
|
{effect.fanOut > 0 ? (
|
|
477
|
-
<span className="text-[11px] text-[var(--oke-muted)]">
|
|
478
|
-
×{effect.fanOut}
|
|
479
|
-
</span>
|
|
459
|
+
<span className="text-[11px] text-[var(--oke-muted)]">×{effect.fanOut}</span>
|
|
480
460
|
) : null}
|
|
481
461
|
</button>
|
|
482
462
|
</Dim>
|