okengine 0.2.6 → 0.3.2
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 +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -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 +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -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/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- 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 +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- 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 +15 -30
- 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 +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- 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 +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- 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 +16 -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 +44 -66
- 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 +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -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/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- 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 +15 -18
- 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-driver-removal.test.ts +55 -0
- 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.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- 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 +11 -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/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- 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.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -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 +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- 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 +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- 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/edge.test.ts +68 -0
- 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 +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- 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 +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- 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 +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- 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 +5 -15
- 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/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- 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 +16 -45
- 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 +27 -33
- 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/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# OKE — Agent Contract
|
|
2
2
|
|
|
3
|
-
This file is loaded by every later session. It prevents drift.
|
|
3
|
+
This file is loaded by every later session. It prevents drift. Product documentation lives in `site/content/docs/`. **If the documentation is silent, stop and ask.**
|
|
4
4
|
|
|
5
5
|
## The one law
|
|
6
6
|
|
|
@@ -14,16 +14,16 @@ There are no separate species called endpoints, handlers, consumers, jobs, subsc
|
|
|
14
14
|
|
|
15
15
|
## The eight elements
|
|
16
16
|
|
|
17
|
-
| Element
|
|
18
|
-
|
|
19
|
-
| **Flow**
|
|
20
|
-
| **Signal**
|
|
21
|
-
| **Store**
|
|
22
|
-
| **Clock**
|
|
23
|
-
| **Gate**
|
|
24
|
-
| **Vault**
|
|
25
|
-
| **Channel** | reaching humans
|
|
26
|
-
| **AI**
|
|
17
|
+
| Element | Essence |
|
|
18
|
+
| ----------- | ----------------------------------------------- |
|
|
19
|
+
| **Flow** | behavior |
|
|
20
|
+
| **Signal** | data in motion |
|
|
21
|
+
| **Store** | data at rest (`sql` · `kv` · `files` · `index`) |
|
|
22
|
+
| **Clock** | time |
|
|
23
|
+
| **Gate** | permission to act |
|
|
24
|
+
| **Vault** | protected knowledge |
|
|
25
|
+
| **Channel** | reaching humans |
|
|
26
|
+
| **AI** | reaching machine intelligence |
|
|
27
27
|
|
|
28
28
|
An element earns its place only if it has irreducible physics. New infrastructure becomes a new **driver** for an existing element — never a ninth element.
|
|
29
29
|
|
|
@@ -53,39 +53,42 @@ A direct `node:` import (or any other side-channel I/O) in element or flow code
|
|
|
53
53
|
|
|
54
54
|
## Ports
|
|
55
55
|
|
|
56
|
-
| Port
|
|
57
|
-
|
|
58
|
-
| **6530** | App
|
|
59
|
-
| **6533** | Console
|
|
60
|
-
| **6535** | MCP
|
|
56
|
+
| Port | Surface |
|
|
57
|
+
| -------- | -------------------- |
|
|
58
|
+
| **6530** | App |
|
|
59
|
+
| **6533** | Console |
|
|
60
|
+
| **6535** | MCP |
|
|
61
|
+
| **6536** | Docs MCP (read-only) |
|
|
61
62
|
|
|
62
63
|
Mnemonic: O·K·E = 6·5·3.
|
|
63
64
|
|
|
64
65
|
## Budgets
|
|
65
66
|
|
|
66
|
-
| Budget
|
|
67
|
-
|
|
67
|
+
| Budget | Limit |
|
|
68
|
+
| --------------------- | ------- |
|
|
68
69
|
| Kernel (edge profile) | < 15 kB |
|
|
69
|
-
| Client runtime
|
|
70
|
-
| Cold start on Bun
|
|
71
|
-
| p99 routing overhead
|
|
70
|
+
| Client runtime | < 3 kB |
|
|
71
|
+
| Cold start on Bun | < 75 ms |
|
|
72
|
+
| p99 routing overhead | < 1 ms |
|
|
72
73
|
|
|
73
74
|
A regression fails the build. Claims we cannot measure, we do not make.
|
|
74
75
|
|
|
75
76
|
## Package shape
|
|
76
77
|
|
|
77
78
|
Published packages:
|
|
78
|
-
|
|
79
|
-
- `
|
|
79
|
+
|
|
80
|
+
- `okengine` — framework. Subpath exports: `.`, `./client`, `./test`, `./config`, `./auth`, `./plugins`, `./drivers/*`. `"sideEffects": false`. CLI binary: `oke`.
|
|
81
|
+
- `create-oke` — scaffold CLI (`bunx create-oke@latest <name>`). Lives in `packages/create-oke` and ships one standard starter from `packages/create-oke/template`.
|
|
80
82
|
|
|
81
83
|
Engine: Bun `>=1.3`.
|
|
82
84
|
|
|
83
|
-
##
|
|
85
|
+
## Documentation authority
|
|
84
86
|
|
|
85
|
-
|
|
|
86
|
-
|
|
87
|
-
|
|
|
88
|
-
|
|
|
89
|
-
|
|
|
87
|
+
| Surface | Path |
|
|
88
|
+
| -------- | ------------------------------------ |
|
|
89
|
+
| Theory | `site/content/docs/elements/` |
|
|
90
|
+
| Console | `site/content/docs/console/` |
|
|
91
|
+
| CLI | `site/content/docs/reference/cli.md` |
|
|
92
|
+
| Manifest | `manifest.v1.schema.json` |
|
|
90
93
|
|
|
91
|
-
**If the
|
|
94
|
+
**If the documentation is silent, stop and ask.**
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
# okengine
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
_"Stop gluing APIs, jobs, and queues into one backend. One law collapses them — client, Console, and infra come free. Yours to host."_
|
|
11
11
|
|
|
12
12
|
[](https://www.npmjs.com/package/okengine)
|
|
13
13
|
[](https://jsr.io/@omqkhafi/okengine)
|
|
@@ -15,372 +15,106 @@
|
|
|
15
15
|
[](https://opensource.org/licenses/MIT)
|
|
16
16
|
[](https://bun.sh)
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**Docs:** [oke.omqkhafi.dev](https://oke.omqkhafi.dev) · **Handbook:** [/docs](https://oke.omqkhafi.dev/docs) · **CLI:** `oke` · **Scaffold:** [`create-oke`](https://www.npmjs.com/package/create-oke)
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
> [!WARNING]
|
|
21
|
+
> **Early development (`v0.x`) — not production-ready.**
|
|
22
|
+
>
|
|
23
|
+
> APIs, drivers, and tooling can change quickly, including **breaking changes**, until an initial stable release. Use for exploration and feedback — **not** production workloads yet.
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
bun add okengine # npm (recommended — ships the `oke` CLI)
|
|
24
|
-
bunx jsr add @omqkhafi/okengine # JSR — library API only
|
|
25
|
-
bunx create-oke@latest my-app --template hello # scaffold from npm
|
|
26
|
-
```
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Start here
|
|
30
|
-
|
|
31
|
-
Most backends are a pile of separate tools under one logo: a router, a queue library, a cron library, websockets, tracing. The pieces ship together; they do not follow from one idea. That is why docs sprawl and concepts never get removed.
|
|
32
|
-
|
|
33
|
-
OKE starts from one sentence instead:
|
|
34
|
-
|
|
35
|
-
> **Every backend behavior is a Flow:** `on(Trigger) → Effects`
|
|
36
|
-
|
|
37
|
-
An HTTP route, a cron job, a queue consumer, a CDC hook — same shape. Triggers are typed values. Side effects go through `fx` (the only door to the outside world), so the compiler can see them.
|
|
25
|
+
## Install
|
|
38
26
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
```bash
|
|
28
|
+
bun add okengine # framework + `oke` CLI
|
|
29
|
+
bunx jsr add @omqkhafi/okengine # JSR — library API only
|
|
30
|
+
bunx create-oke@latest my-app --template hello # scaffold
|
|
43
31
|
```
|
|
44
32
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## Run something in two minutes
|
|
33
|
+
## Quick start
|
|
50
34
|
|
|
51
35
|
```bash
|
|
52
36
|
bunx create-oke@latest my-app --template hello
|
|
53
37
|
cd my-app
|
|
54
38
|
oke dev
|
|
39
|
+
# or: oke mode docker && oke dev # compose infra · app on host Bun
|
|
55
40
|
```
|
|
56
41
|
|
|
57
|
-
| Port
|
|
58
|
-
|
|
59
|
-
| `:6530` |
|
|
60
|
-
| `:6533` | Console
|
|
61
|
-
| `:6535` | MCP (
|
|
62
|
-
|
|
63
|
-
Mnemonic: **O·K·E = 6·5·3**. Docs MCP for the handbook is a separate surface on `:6536` (search/fetch only — see [Documentation](#documentation)).
|
|
64
|
-
|
|
65
|
-
That scaffolds the **hello** starter — one flow, no Store, the fastest true "it works" moment. Default without `--template` is **standard** (full recommended file layout, empty scaffolding). Open the Console — flows, contracts, effects, and an architecture diagram are already there. Derived, not configured.
|
|
42
|
+
| Port | Surface |
|
|
43
|
+
| ------- | ------------------------------------------- |
|
|
44
|
+
| `:6530` | App |
|
|
45
|
+
| `:6533` | Console |
|
|
46
|
+
| `:6535` | MCP (live Manifest) |
|
|
47
|
+
| `:6536` | Docs MCP (handbook search/fetch, read-only) |
|
|
66
48
|
|
|
67
|
-
|
|
49
|
+
Mnemonic: **O·K·E = 6·5·3**.
|
|
68
50
|
|
|
69
|
-
|
|
51
|
+
Every backend behavior is a Flow: `on(Trigger) → Effects`. World access goes through `fx`.
|
|
70
52
|
|
|
71
|
-
|
|
53
|
+
Store apps sync schema with `oke db push|generate|migrate` (local `oke dev`
|
|
54
|
+
auto-pushes). Prefer `store.schema.table` + `field.*` or keep a
|
|
55
|
+
hand-written Drizzle `schema.ts`.
|
|
72
56
|
|
|
73
|
-
###
|
|
57
|
+
### Resource Flow
|
|
74
58
|
|
|
75
59
|
```typescript
|
|
76
|
-
import { on,
|
|
60
|
+
import { on, http, store } from "okengine";
|
|
77
61
|
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
|
|
78
|
-
import { z } from "zod";
|
|
79
62
|
import { db } from "../../core";
|
|
80
|
-
import { notes } from "../../schema";
|
|
81
|
-
|
|
82
|
-
// Contracts derived from the schema — one source of truth
|
|
83
|
-
const NewNote
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
63
|
+
import { notes as notesTable } from "../../schema";
|
|
64
|
+
|
|
65
|
+
// Contracts derived from the schema — one source of truth.
|
|
66
|
+
const NewNote = createInsertSchema(notesTable, { title: (s) => s.min(1).max(120) }).omit({
|
|
67
|
+
id: true,
|
|
68
|
+
createdAt: true,
|
|
69
|
+
});
|
|
70
|
+
const Note = createSelectSchema(notesTable);
|
|
71
|
+
|
|
72
|
+
// One declarative resource: list (cursor + search + filters + order +
|
|
73
|
+
// select), create (201), get / update / remove with typed NotFound.
|
|
74
|
+
const notesR = store.resource(db, notesTable, {
|
|
90
75
|
in: NewNote,
|
|
91
|
-
out: NoteId,
|
|
92
|
-
do: async (input, fx) => {
|
|
93
|
-
const [note] = await fx.store(db).insert(notes).values(input).returning();
|
|
94
|
-
return { id: note.id };
|
|
95
|
-
},
|
|
96
|
-
}));
|
|
97
|
-
// effects → writes[sql:notes]
|
|
98
|
-
|
|
99
|
-
export const list = on(http.get("/notes"), flow({
|
|
100
|
-
out: Note.array(),
|
|
101
|
-
do: (_, fx) => fx.store(db).select().from(notes),
|
|
102
|
-
}));
|
|
103
|
-
// effects → reads[sql:notes]
|
|
104
|
-
|
|
105
|
-
export const get = on(http.get("/notes/:id"), flow({
|
|
106
|
-
in: NoteId,
|
|
107
76
|
out: Note,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (!deleted) return fx.fail("NotFound", {});
|
|
77
|
+
update: NewNote.partial(),
|
|
78
|
+
list: {
|
|
79
|
+
cursor: [notesTable.createdAt, notesTable.id],
|
|
80
|
+
direction: "desc",
|
|
81
|
+
limit: 20,
|
|
82
|
+
maxLimit: 100,
|
|
83
|
+
search: [notesTable.title],
|
|
84
|
+
filter: "all",
|
|
85
|
+
order: "all",
|
|
118
86
|
},
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
export const
|
|
131
|
-
|
|
132
|
-
export
|
|
87
|
+
unit: "notes",
|
|
88
|
+
breaking: true,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Mount all five verbs: list/create on /notes, get/update/remove on /notes/:id.
|
|
92
|
+
// `on(http.resource(...))` returns the ops bag; spread it into named exports
|
|
93
|
+
// so `adopt({ notes })` registers each flow under the unit.
|
|
94
|
+
const mounted = on(http.resource("/notes", notesR.all()));
|
|
95
|
+
|
|
96
|
+
export const list = mounted.list;
|
|
97
|
+
export const create = mounted.create;
|
|
98
|
+
export const get = mounted.get;
|
|
99
|
+
export const update = mounted.update;
|
|
100
|
+
export const remove = mounted.remove;
|
|
133
101
|
```
|
|
134
102
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## How to learn (read in order)
|
|
140
|
-
|
|
141
|
-
Start on the site if you want the handbook path: [Introduction](https://okengine.vercel.app/docs/get-started/introduction) → [Installation](https://okengine.vercel.app/docs/get-started/installation) → [Basic usage](https://okengine.vercel.app/docs/get-started/basic-usage).
|
|
142
|
-
|
|
143
|
-
Each teaching app adds the smallest next set of ideas. Do not skip ahead.
|
|
144
|
-
|
|
145
|
-
1. **Notes** — `oke`, `on`, `flow`, `http`, `store.sql`, `fx`, typed errors, typed client
|
|
146
|
-
→ [`examples/notes`](examples/notes)
|
|
147
|
-
|
|
148
|
-
2. **Linkly** — `signal` (three delivery physics), `clock`, `gate`, triggers beyond HTTP, transactional emit
|
|
149
|
-
→ [`examples/linkly`](examples/linkly)
|
|
150
|
-
|
|
151
|
-
3. **Provisions** — durable flows, `vault`, `channel`, live queries, plugins, CDC, cache tiers
|
|
152
|
-
→ [`examples/provisions`](examples/provisions)
|
|
153
|
-
|
|
154
|
-
4. **Skyport** — `ai`, multi-tenancy, SLOs, distributed topology, scaling axes
|
|
155
|
-
→ [`examples/skyport`](examples/skyport)
|
|
156
|
-
|
|
157
|
-
Same path in the spec: [`docs/spec/four-applications.md`](docs/spec/four-applications.md).
|
|
158
|
-
|
|
159
|
-
---
|
|
103
|
+
Full walkthrough: [Basic usage](https://oke.omqkhafi.dev/docs/get-started/basic-usage).
|
|
160
104
|
|
|
161
105
|
## Documentation
|
|
162
106
|
|
|
163
|
-
|
|
164
|
-
- **Agents on the site** — [`/llms.txt`](https://okengine.vercel.app/llms.txt) index · [`/llms-full.txt`](https://okengine.vercel.app/llms-full.txt) full text · `/llms.mdx/docs/...` per-page markdown
|
|
165
|
-
- **Docs MCP** — `:6536` · tools `oke.docs.search` / `oke.docs.get` (read-only; Host/Origin validated like the other surfaces)
|
|
166
|
-
- **App MCP** — `:6535` · live Manifest, schemas, effects, traces, Console-safe actions (Bearer + confirmation for writes)
|
|
167
|
-
- **Canonical specs in-repo** — [`docs/spec/`](docs/spec) (unified theory, four applications, Console)
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## The eight elements
|
|
172
|
-
|
|
173
|
-
An element earns its place only if it has irreducible physics. New tech becomes a **driver**, never a ninth element.
|
|
174
|
-
|
|
175
|
-
| Element | Essence | Replaces |
|
|
176
|
-
|---|---|---|
|
|
177
|
-
| **Flow** | behavior | endpoint, handler, consumer, job, workflow |
|
|
178
|
-
| **Signal** | data in motion | queue, pub/sub, stream, websocket, SSE |
|
|
179
|
-
| **Store** | data at rest | DB, cache, KV, files, search (`sql` · `kv` · `files` · `index`) |
|
|
180
|
-
| **Clock** | time | cron, delay, timeout, durable sleep, TTL |
|
|
181
|
-
| **Gate** | permission to act | auth, session, ABAC, rate limit, quota, flags |
|
|
182
|
-
| **Vault** | protected knowledge | secrets, config, env |
|
|
183
|
-
| **Channel** | reaching humans | email, SMS, WhatsApp, push |
|
|
184
|
-
| **AI** | reaching machine intelligence | models, prompts, embeddings, agents, RAG |
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## What the Manifest is for
|
|
189
|
-
|
|
190
|
-
Your TypeScript compiles to `manifest.oke.json`. From that one artifact the rest is derived — client, docs, Console, security matrix, Docker, bundle, tests ([unified theory §8](docs/spec/unified-theory.md#8-the-manifest--the-100-year-artifact)):
|
|
191
|
-
|
|
192
|
-
```mermaid
|
|
193
|
-
flowchart TD
|
|
194
|
-
code["your code"] -->|compile| manifest["manifest.oke.json"]
|
|
195
|
-
manifest --> client["typed client (+ live queries)"]
|
|
196
|
-
manifest --> docs["OpenAPI + AsyncAPI + documentation"]
|
|
197
|
-
manifest --> arch["architecture diagram (provably accurate — it IS the system)"]
|
|
198
|
-
manifest --> console["Console panels, traces, explorers"]
|
|
199
|
-
manifest --> mcp["MCP surface for AI agents"]
|
|
200
|
-
manifest --> caps["least-privilege capability matrix"]
|
|
201
|
-
manifest --> cache["cache invalidation keys"]
|
|
202
|
-
manifest --> replica["replica read-routing plan"]
|
|
203
|
-
manifest --> docker["Dockerfile + per-role compose files"]
|
|
204
|
-
manifest --> bundle["tree-shaken bundle contents"]
|
|
205
|
-
manifest --> harness["test harness wiring"]
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
## Console
|
|
211
|
-
|
|
212
|
-
Seventeen panels on `:6533` (app `:6530`, MCP `:6535`): Overview, Flows, Signals, Store, Clock, Gates, Vault, Channels, AI, Architecture, Traces, Runs, Manifest Diff, Access, Plugins — plus Privacy and Tenancy when those plugins are plugged.
|
|
213
|
-
|
|
214
|
-
Operator and user planes stay separate. Every Console action is a real flow through `fx`, so the audit log is the trace. Spec: [`docs/spec/console.md`](docs/spec/console.md) · handbook: [console handbook](https://okengine.vercel.app/docs/console/overview).
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## How to deploy
|
|
219
|
-
|
|
220
|
-
OKE is self-host first — no cloud lock-in. Production artefacts are **derived from the Manifest**, not hand-written: Dockerfile, per-role compose files, and the same entry production actually runs ([unified theory §8](docs/spec/unified-theory.md#8-the-manifest--the-100-year-artifact), [§18](docs/spec/unified-theory.md#18-three-scaling-axes-never-conflated)).
|
|
221
|
-
|
|
222
|
-
1. **Configure drivers and images** in `oke.config.ts` — drivers named after protocols; vendor images keyed by role (e.g. `store.sql`, `store.kv`).
|
|
223
|
-
2. **Check the machine** before you ship:
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
oke doctor # secrets, ports, drivers, tenancy, schema drift
|
|
227
|
-
oke doctor --json # -j agents / CI: JSON on stdout, hints on stderr
|
|
228
|
-
oke stack # preview resolved images/tags/ports — writes nothing
|
|
229
|
-
oke images list # recipe · image · tag · digest · size (writes nothing)
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
3. **Derive Docker / compose**, then pin digests so tags cannot drift:
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
oke docker # writes under docker/ (Dockerfile + compose.<role>.yml · …)
|
|
236
|
-
oke docker --prod # -p healthchecks, volumes, limits, secret refs, deploy.replicas
|
|
237
|
-
oke images pin # tags → digests in oke.images.lock
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
4. **Run what production runs.** `oke start` is the Docker `CMD` — the same process locally and in the container:
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
oke start # app on :6530 (Console :6533 stays on in prod, behind auth)
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Horizontal scale is the **Clone** axis: run N instances; `oke docker --prod` emits `deploy.replicas`. Split into one container per unit is the **topology** axis — code unchanged (`monolith` vs `services`). For a tiny edge bundle: `oke build --target edge` (`-t`; < 15 kB kernel profile).
|
|
247
|
-
|
|
248
|
-
There is no separate “deploy to our cloud” product. You take the derived Dockerfile/compose and run them on whatever host you choose.
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## CLI
|
|
253
|
-
|
|
254
|
-
Everyday:
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
bun add okengine # ONE package
|
|
258
|
-
|
|
259
|
-
oke dev # watch · hot reload · Console :6533 · app :6530 · MCP :6535
|
|
260
|
-
# → also auto-syncs client types on every save
|
|
261
|
-
oke dev --stack # -s infra only under docker/ (Postgres/Redis/…); app stays on host Bun
|
|
262
|
-
oke dev -s store.sql,store.kv # partial: only these roles get real backends
|
|
263
|
-
|
|
264
|
-
oke start # runs exactly what production runs (this is the Docker CMD)
|
|
265
|
-
oke doctor # verify secrets, ports, drivers, tenancy, schema drift
|
|
266
|
-
oke doctor --diff # -d CI gate: undeclared Manifest contract breaks
|
|
267
|
-
oke doctor --json # -j JSON on stdout; hints on stderr (agents / MCP)
|
|
268
|
-
oke stack # preview resolved images/tags/ports — writes nothing
|
|
269
|
-
oke stack --json # -j
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
Schema, vault, client, Docker, build, eval, branch, privacy, upgrade:
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
oke schema generate # core + plugin tables → schema/oke.ts (--check|-c in CI)
|
|
276
|
-
oke vault set STRIPE_KEY # also: list · import .env · key rotate
|
|
277
|
-
oke client add <url> # types for a separate frontend repo
|
|
278
|
-
|
|
279
|
-
oke docker # artefacts under docker/ (Dockerfile + compose.<role>.yml · …)
|
|
280
|
-
oke docker --prod # -p healthchecks, volumes, limits, secret refs, deploy.replicas
|
|
281
|
-
oke images list # recipe · image · tag · digest · size (--json|-j)
|
|
282
|
-
oke images pin # tags → digests in oke.images.lock
|
|
283
|
-
|
|
284
|
-
oke build --target edge # -t < 15 kB kernel profile
|
|
285
|
-
oke eval # run prompt eval sets; fails CI on regression
|
|
286
|
-
oke branch prod --at "yesterday" # -a fork journaled state into a sandbox
|
|
287
|
-
oke privacy erase --subject <id> # -s crypto-shredding: deletes the key, not the terabytes
|
|
288
|
-
oke upgrade # dry-run codemods + diff; --apply|-a to write
|
|
289
|
-
oke gates list # Module:Action catalogue (--json|-j)
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
Shell completion (generated from the command registry — not a hand-maintained script):
|
|
293
|
-
|
|
294
|
-
```bash
|
|
295
|
-
eval "$(oke completion bash)"
|
|
296
|
-
eval "$(oke completion zsh)"
|
|
297
|
-
oke completion fish | source
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
Long form is canonical in docs; short form is convenience only. Shared letters follow git’s pattern (different meanings on different subcommands — e.g. `-c` is `--check` on `schema generate`, `--config` on `stack` / `docker` / `images`).
|
|
301
|
-
|
|
302
|
-
| Long | Short | Where |
|
|
303
|
-
|------|-------|--------|
|
|
304
|
-
| `--stack` | `-s` | `dev` |
|
|
305
|
-
| `--prod` | `-p` | `docker` |
|
|
306
|
-
| `--port` | `-p` | `start` |
|
|
307
|
-
| `--check` | `-c` | `schema generate` |
|
|
308
|
-
| `--config` | `-c` | `stack`, `docker`, `images` |
|
|
309
|
-
| `--apply` | `-a` | `upgrade` |
|
|
310
|
-
| `--at` | `-a` | `branch` |
|
|
311
|
-
| `--after` | `-a` | `doctor --diff` |
|
|
312
|
-
| `--target` | `-t` | `build` |
|
|
313
|
-
| `--diff` | `-d` | `doctor` |
|
|
314
|
-
| `--json` | `-j` | `doctor`, `stack`, `images list`, `gates list` |
|
|
315
|
-
| `--manifest` | `-m` | most Manifest readers |
|
|
316
|
-
| `--entry` | `-e` | `dev`, `start`, `build` |
|
|
317
|
-
| `--out` / `--outdir` | `-o` | writers |
|
|
318
|
-
| `--subject` | `-s` | `privacy erase` |
|
|
319
|
-
| `--before` | `-b` | `doctor --diff` |
|
|
320
|
-
| `--base` | `-B` | `doctor --diff` |
|
|
321
|
-
|
|
322
|
-
| Exit | Meaning |
|
|
323
|
-
|------|---------|
|
|
324
|
-
| **0** | success |
|
|
325
|
-
| **1** | usage / validation |
|
|
326
|
-
| **2** | runtime / environment / check failure |
|
|
327
|
-
|
|
328
|
-
`oke help` prints the same flag and exit-code tables.
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Plugins and security
|
|
333
|
-
|
|
334
|
-
`.plug()` attaches a plugin. Scope is the attachment point: `app.plug()` app-wide, `unit.plug()` one unit, `flow.plug()` one flow. No `global: true`, no inheritance rule — [unified theory §14](docs/spec/unified-theory.md#14-plugins--the-extensibility-law).
|
|
335
|
-
|
|
336
|
-
The Console is treated as internet-facing even on localhost. Host header validation, Origin validation, and authentication are mandatory on `:6530`, `:6533`, and `:6535` ([console.md §10](docs/spec/console.md#10-security-posture)): two-plane auth (operator vs user), capability-scoped tokens. Docs MCP `:6536` uses the same Host/Origin checks and stays read-only (no Bearer writes).
|
|
337
|
-
|
|
338
|
-
---
|
|
339
|
-
|
|
340
|
-
## Why Bun, one package, MIT
|
|
341
|
-
|
|
342
|
-
**Bun-first** — toolchain stays on latest (TypeScript 7, Bun, oxc): greenfield, speed is part of the promise. User floor stays conservative; adopted infra pins stable digests ([§11](docs/spec/unified-theory.md#11-always-latest--in-three-tiers)).
|
|
343
|
-
|
|
344
|
-
**One package** — `okengine` with subpath exports, not a monorepo of many packages to assemble. Small enough to be *finished* ([§27](docs/spec/unified-theory.md#27-package-structure-one-published-package), [§29](docs/spec/unified-theory.md#29-why-this-survives-a-hundred-years)).
|
|
345
|
-
|
|
346
|
-
**MIT** — no BSL/SSPL; self-host first; drivers as the community surface. Adopt what exists; bind through Bun’s native clients ([§9](docs/spec/unified-theory.md#9-adopt-dont-reinvent--but-bind-natively), [§16](docs/spec/unified-theory.md#16-the-default-table), [§29](docs/spec/unified-theory.md#29-why-this-survives-a-hundred-years)).
|
|
347
|
-
|
|
348
|
-
---
|
|
349
|
-
|
|
350
|
-
## Budgets
|
|
351
|
-
|
|
352
|
-
Measured size and latency caps — see [`BUDGETS.md`](BUDGETS.md). Refresh with `bun run budgets`.
|
|
353
|
-
|
|
354
|
-
---
|
|
355
|
-
|
|
356
|
-
## Local framework link (try changes without publishing)
|
|
357
|
-
|
|
358
|
-
To exercise a local `okengine` checkout inside an app (e.g. `oke-1`) without npm publish:
|
|
359
|
-
|
|
360
|
-
```bash
|
|
361
|
-
# in the okengine repo
|
|
362
|
-
bun link
|
|
363
|
-
# if you changed the Console SPA:
|
|
364
|
-
bun run build
|
|
365
|
-
|
|
366
|
-
# in the app repo
|
|
367
|
-
bun link okengine
|
|
368
|
-
# edit okengine → restart `bun dev` in the app
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
Alternatively set `"okengine": "file:../okengine"` in the app `package.json` and run `bun install`.
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
## Status
|
|
107
|
+
Everything beyond this page lives in the site handbook:
|
|
376
108
|
|
|
377
|
-
|
|
109
|
+
| Resource | Link |
|
|
110
|
+
| ------------- | ------------------------------------------------------------------ |
|
|
111
|
+
| Docs site | [oke.omqkhafi.dev](https://oke.omqkhafi.dev) |
|
|
112
|
+
| Handbook | [/docs](https://oke.omqkhafi.dev/docs) |
|
|
113
|
+
| Changelog | [/changelog](https://oke.omqkhafi.dev/changelog) |
|
|
114
|
+
| Agents index | [/llms.txt](https://oke.omqkhafi.dev/llms.txt) |
|
|
115
|
+
| CLI reference | [/docs/reference/cli](https://oke.omqkhafi.dev/docs/reference/cli) |
|
|
116
|
+
| Manifest | [`manifest.v1.schema.json`](manifest.v1.schema.json) |
|
|
117
|
+
| Budgets | [`BUDGETS.md`](BUDGETS.md) |
|
|
118
|
+
| Contributing | [`CONTRIBUTING.md`](CONTRIBUTING.md) |
|
|
378
119
|
|
|
379
|
-
|
|
380
|
-
|---|---|
|
|
381
|
-
| Docs site | [okengine.vercel.app](https://okengine.vercel.app) · [handbook](https://okengine.vercel.app/docs) · [changelog](https://okengine.vercel.app/changelog) |
|
|
382
|
-
| Unified theory | [`docs/spec/unified-theory.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/unified-theory.md) |
|
|
383
|
-
| Four applications | [`docs/spec/four-applications.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/four-applications.md) |
|
|
384
|
-
| Console | [`docs/spec/console.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/console.md) |
|
|
385
|
-
| Scaffold | [`packages/create-oke`](https://github.com/omqkhafi/okengine/tree/main/packages/create-oke) |
|
|
386
|
-
| Changelog source | [`docs/changelog.md`](docs/changelog.md) |
|
|
120
|
+
Pre-1.0. Published on [npm](https://www.npmjs.com/package/okengine) and [JSR](https://jsr.io/@omqkhafi/okengine). MIT.
|
|
@@ -104,10 +104,7 @@
|
|
|
104
104
|
"$defs": {
|
|
105
105
|
"JsonSchema": {
|
|
106
106
|
"description": "A JSON Schema document, or an opaque string ref produced by extraction.",
|
|
107
|
-
"oneOf": [
|
|
108
|
-
{ "type": "string", "minLength": 1 },
|
|
109
|
-
{ "type": "object" }
|
|
110
|
-
]
|
|
107
|
+
"oneOf": [{ "type": "string", "minLength": 1 }, { "type": "object" }]
|
|
111
108
|
},
|
|
112
109
|
"ResourceRef": {
|
|
113
110
|
"description": "Store resource: facet:name (sql:table, kv:namespace, files:bucket, index:name).",
|
|
@@ -289,10 +286,7 @@
|
|
|
289
286
|
"durable": { "type": "boolean" },
|
|
290
287
|
"live": { "type": "boolean" },
|
|
291
288
|
"cache": {
|
|
292
|
-
"oneOf": [
|
|
293
|
-
{ "type": "boolean" },
|
|
294
|
-
{ "type": "string", "minLength": 1 }
|
|
295
|
-
]
|
|
289
|
+
"oneOf": [{ "type": "boolean" }, { "type": "string", "minLength": 1 }]
|
|
296
290
|
},
|
|
297
291
|
"cacheKeys": {
|
|
298
292
|
"description": "Computed invalidation key expression (derived or declared).",
|
|
@@ -342,6 +336,38 @@
|
|
|
342
336
|
"retain": { "type": "string", "minLength": 1 }
|
|
343
337
|
}
|
|
344
338
|
},
|
|
339
|
+
"DeclaredColumn": {
|
|
340
|
+
"description": "Abstract schema column (DDL shape + optional classification). Bare ColumnClassification remains valid.",
|
|
341
|
+
"type": "object",
|
|
342
|
+
"additionalProperties": false,
|
|
343
|
+
"properties": {
|
|
344
|
+
"type": { "type": "string", "enum": ["text", "integer"] },
|
|
345
|
+
"nullable": { "type": "boolean" },
|
|
346
|
+
"primaryKey": { "type": "boolean" },
|
|
347
|
+
"unique": { "type": "boolean" },
|
|
348
|
+
"default": {
|
|
349
|
+
"anyOf": [
|
|
350
|
+
{ "type": "string" },
|
|
351
|
+
{ "type": "number" },
|
|
352
|
+
{ "type": "boolean" },
|
|
353
|
+
{ "type": "null" }
|
|
354
|
+
]
|
|
355
|
+
},
|
|
356
|
+
"sqlName": { "type": "string", "minLength": 1 },
|
|
357
|
+
"pii": { "type": "boolean" },
|
|
358
|
+
"sensitive": { "type": "boolean" },
|
|
359
|
+
"retain": { "type": "string", "minLength": 1 },
|
|
360
|
+
"references": {
|
|
361
|
+
"description": "Foreign key target from field.*.references().",
|
|
362
|
+
"type": "object",
|
|
363
|
+
"additionalProperties": false,
|
|
364
|
+
"properties": {
|
|
365
|
+
"table": { "type": "string", "minLength": 1 },
|
|
366
|
+
"column": { "type": "string", "minLength": 1 }
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
},
|
|
345
371
|
"Table": {
|
|
346
372
|
"type": "object",
|
|
347
373
|
"additionalProperties": false,
|
|
@@ -349,7 +375,12 @@
|
|
|
349
375
|
"columns": {
|
|
350
376
|
"type": "object",
|
|
351
377
|
"propertyNames": { "type": "string", "minLength": 1 },
|
|
352
|
-
"additionalProperties": {
|
|
378
|
+
"additionalProperties": {
|
|
379
|
+
"oneOf": [
|
|
380
|
+
{ "$ref": "#/$defs/DeclaredColumn" },
|
|
381
|
+
{ "$ref": "#/$defs/ColumnClassification" }
|
|
382
|
+
]
|
|
383
|
+
}
|
|
353
384
|
},
|
|
354
385
|
"classifications": {
|
|
355
386
|
"description": "Field → classification tags (pii, sensitive, retain duration).",
|