forgeos 0.1.0-alpha.3 → 0.1.0-alpha.30
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/.npmignore +10 -0
- package/AGENTS.md +142 -90
- package/CHANGELOG.md +321 -0
- package/LICENSE +21 -0
- package/README.md +86 -13
- package/adapters/go/README.md +23 -0
- package/adapters/go/go.mod +3 -0
- package/adapters/go/http.go +149 -0
- package/adapters/go/registry.go +234 -0
- package/adapters/go/types.go +136 -0
- package/adapters/java/README.md +68 -0
- package/adapters/java/pom.xml +34 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
- package/adapters/java-spring-boot-starter/README.md +32 -0
- package/adapters/java-spring-boot-starter/pom.xml +36 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/bin/forge.mjs +18 -0
- package/docs/cair-protocol.md +103 -0
- package/docs/changelog.md +366 -0
- package/docs/forge-protocol.md +189 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +52 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
- package/package.json +34 -4
- package/schemas/forge-manifest.schema.json +57 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1556 -123
- package/src/forge/agent-adapters/types.ts +224 -1
- package/src/forge/agent-memory/bridge.ts +1333 -0
- package/src/forge/agent-memory/context-pack.ts +277 -0
- package/src/forge/agent-memory/hook-runner.ts +312 -0
- package/src/forge/agent-memory/mcp.ts +224 -0
- package/src/forge/agent-memory/normalize.ts +498 -0
- package/src/forge/agent-memory/redaction.ts +103 -0
- package/src/forge/agent-memory/sources/claude-code.ts +51 -0
- package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
- package/src/forge/agent-memory/sources/codex.ts +119 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +204 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +801 -0
- package/src/forge/brownfield-import/types.ts +127 -0
- package/src/forge/cair/action-journal.ts +61 -0
- package/src/forge/cair/action-parser.ts +314 -0
- package/src/forge/cair/action-validator.ts +40 -0
- package/src/forge/cair/actions.ts +1818 -0
- package/src/forge/cair/format.ts +77 -0
- package/src/forge/cair/index.ts +106 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +248 -0
- package/src/forge/cli/ai.ts +485 -2
- package/src/forge/cli/auth.ts +92 -2
- package/src/forge/cli/authmd.ts +356 -0
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +306 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1357 -9
- package/src/forge/cli/db.ts +121 -2
- package/src/forge/cli/deps.ts +79 -12
- package/src/forge/cli/dev.ts +502 -38
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/handoff.ts +253 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/main.ts +59 -3
- package/src/forge/cli/new.ts +13 -1
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +302 -1
- package/src/forge/cli/parse.ts +862 -34
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/rls.ts +568 -17
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/secrets.ts +46 -1
- package/src/forge/cli/security.ts +381 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2217 -0
- package/src/forge/cli/verify.ts +1424 -32
- package/src/forge/cli/workos.ts +340 -0
- package/src/forge/compiler/agent-contract/build.ts +637 -51
- package/src/forge/compiler/agent-contract/types.ts +47 -2
- package/src/forge/compiler/ai-registry/parse.ts +71 -2
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +68 -8
- package/src/forge/compiler/app-graph/extract.ts +107 -0
- package/src/forge/compiler/app-graph/module-graph.ts +73 -78
- package/src/forge/compiler/app-graph/parser.ts +24 -24
- package/src/forge/compiler/app-graph/profile.ts +26 -0
- package/src/forge/compiler/app-graph/versions.ts +1 -1
- package/src/forge/compiler/classifier/capabilities.ts +3 -2
- package/src/forge/compiler/classifier/classify.ts +32 -8
- package/src/forge/compiler/classifier/secrets.ts +3 -2
- package/src/forge/compiler/classifier/signals.ts +91 -1
- package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
- package/src/forge/compiler/client-sdk/render-client.ts +188 -13
- package/src/forge/compiler/data-graph/parse.ts +3 -3
- package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
- package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
- package/src/forge/compiler/data-graph/sql/types.ts +1 -0
- package/src/forge/compiler/diagnostics/codes.ts +35 -0
- package/src/forge/compiler/diagnostics/create.ts +8 -3
- package/src/forge/compiler/diagnostics/index.ts +2 -0
- package/src/forge/compiler/emitter/barrel.ts +3 -0
- package/src/forge/compiler/emitter/render.ts +9 -0
- package/src/forge/compiler/external-manifest/registry.ts +205 -0
- package/src/forge/compiler/external-manifest/types.ts +91 -0
- package/src/forge/compiler/external-manifest/validate.ts +373 -0
- package/src/forge/compiler/frontend-graph/build.ts +142 -14
- package/src/forge/compiler/integration/add.ts +536 -23
- package/src/forge/compiler/integration/plan.ts +17 -11
- package/src/forge/compiler/integration/render.ts +20 -0
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/integration/templates/convex.ts +70 -0
- package/src/forge/compiler/integration/templates/index.ts +1 -0
- package/src/forge/compiler/integration/templates/render.ts +34 -0
- package/src/forge/compiler/integration/templates/workos.ts +1063 -0
- package/src/forge/compiler/make-registry/build.ts +6 -7
- package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
- package/src/forge/compiler/orchestrator/manifest.ts +1 -1
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +240 -10
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +97 -31
- package/src/forge/compiler/orchestrator/serialize.ts +33 -8
- package/src/forge/compiler/orchestrator/types.ts +1 -1
- package/src/forge/compiler/package-graph/compiler.ts +13 -3
- package/src/forge/compiler/package-manager/adapter.ts +4 -1
- package/src/forge/compiler/package-manager/commands.ts +4 -0
- package/src/forge/compiler/package-manager/executor.ts +30 -1
- package/src/forge/compiler/policy-registry/build.ts +47 -2
- package/src/forge/compiler/policy-registry/parse.ts +32 -2
- package/src/forge/compiler/recipes/definitions.ts +63 -0
- package/src/forge/compiler/recipes/index.ts +2 -0
- package/src/forge/compiler/recipes/registry.ts +6 -0
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/app-graph.ts +8 -2
- package/src/forge/compiler/types/cli.ts +75 -1
- package/src/forge/compiler/types/dev-manifest.ts +4 -0
- package/src/forge/compiler/types/emit.ts +2 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/compiler/types/integration.ts +1 -0
- package/src/forge/compiler/types/policy-registry.ts +3 -1
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +238 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +25 -0
- package/src/forge/delta/recorder.ts +540 -0
- package/src/forge/delta/redaction.ts +50 -0
- package/src/forge/delta/schema.ts +240 -0
- package/src/forge/delta/session.ts +142 -0
- package/src/forge/delta/status.ts +1126 -0
- package/src/forge/delta/store.ts +3284 -0
- package/src/forge/delta/timeline.ts +178 -0
- package/src/forge/dev/server.ts +777 -17
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +233 -21
- package/src/forge/dev-console/types.ts +46 -1
- package/src/forge/impact/index.ts +46 -8
- package/src/forge/impact/types.ts +6 -0
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/index.ts +34 -5
- package/src/forge/make/templates.ts +155 -2
- package/src/forge/make/types.ts +2 -1
- package/src/forge/policy.ts +1 -1
- package/src/forge/refactor/index.ts +1 -0
- package/src/forge/repair/rules/index.ts +2 -2
- package/src/forge/review/index.ts +158 -12
- package/src/forge/review/types.ts +15 -0
- package/src/forge/runtime/auth/claims.ts +32 -0
- package/src/forge/runtime/auth/config.ts +17 -0
- package/src/forge/runtime/auth/errors.ts +2 -0
- package/src/forge/runtime/auth/evaluate.ts +15 -2
- package/src/forge/runtime/auth/resolve.ts +29 -4
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +2 -2
- package/src/forge/runtime/db/pglite-adapter.ts +77 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +129 -16
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/buffer.ts +4 -1
- package/src/forge/runtime/telemetry/scrubber.ts +91 -10
- package/src/forge/runtime/webhooks/security.ts +189 -0
- package/src/forge/server.ts +23 -2
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +407 -0
- package/src/forge/workspace/change-summary.ts +243 -0
- package/src/forge/workspace/forge-cli.ts +14 -0
- package/src/forge/workspace/git-summary.ts +328 -0
- package/templates/agent-workroom/AGENTS.md +29 -0
- package/templates/agent-workroom/README.md +34 -0
- package/templates/agent-workroom/forge.config.ts +3 -0
- package/templates/agent-workroom/package.json +33 -0
- package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
- package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
- package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
- package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
- package/templates/agent-workroom/src/forge/schema.ts +54 -0
- package/templates/agent-workroom/src/policies.ts +6 -0
- package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
- package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
- package/templates/agent-workroom/tsconfig.json +16 -0
- package/templates/agent-workroom/web/index.html +12 -0
- package/templates/agent-workroom/web/package.json +21 -0
- package/templates/agent-workroom/web/src/App.tsx +345 -0
- package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
- package/templates/agent-workroom/web/src/main.tsx +13 -0
- package/templates/agent-workroom/web/src/styles.css +545 -0
- package/templates/agent-workroom/web/tsconfig.json +27 -0
- package/templates/b2b-support-web/package.json +2 -0
- package/templates/b2b-support-web/tsconfig.json +4 -1
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/tsconfig.json +3 -1
- package/templates/minimal-web/web/package.json +2 -2
- package/templates/nuxt-web/.vscode/settings.json +14 -0
- package/templates/nuxt-web/README.md +30 -0
- package/templates/nuxt-web/forge.config.ts +3 -0
- package/templates/nuxt-web/package.json +33 -0
- package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
- package/templates/nuxt-web/src/commands/createNote.ts +26 -0
- package/templates/nuxt-web/src/forge/schema.ts +12 -0
- package/templates/nuxt-web/src/policies.ts +6 -0
- package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
- package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
- package/templates/nuxt-web/tsconfig.json +17 -0
- package/templates/nuxt-web/web/app.vue +67 -0
- package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
- package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
- package/templates/nuxt-web/web/composables/forge.ts +13 -0
- package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
- package/templates/nuxt-web/web/nuxt.config.ts +11 -0
- package/templates/nuxt-web/web/package.json +17 -0
- package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
- package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
- package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
- package/templates/nuxt-web/web/tsconfig.json +3 -0
- package/src/forge/_generated/actionSubscriptions.json +0 -2
- package/src/forge/_generated/actionSubscriptions.ts +0 -10
- package/src/forge/_generated/agentAdapterManifest.json +0 -2
- package/src/forge/_generated/agentAdapterManifest.ts +0 -73
- package/src/forge/_generated/agentContract.json +0 -2
- package/src/forge/_generated/agentContract.ts +0 -7829
- package/src/forge/_generated/agentQuickstart.md +0 -34
- package/src/forge/_generated/agentTools.json +0 -2
- package/src/forge/_generated/agentTools.md +0 -16
- package/src/forge/_generated/agentTools.ts +0 -12
- package/src/forge/_generated/aiContext.ts +0 -125
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -51
- package/src/forge/_generated/aiProviders.json +0 -2
- package/src/forge/_generated/aiProviders.ts +0 -23
- package/src/forge/_generated/aiRegistry.json +0 -2
- package/src/forge/_generated/aiRegistry.ts +0 -31
- package/src/forge/_generated/api.json +0 -2
- package/src/forge/_generated/api.ts +0 -8
- package/src/forge/_generated/appGraph.json +0 -2
- package/src/forge/_generated/appGraph.ts +0 -14775
- package/src/forge/_generated/appMap.md +0 -55
- package/src/forge/_generated/artifactManifest.json +0 -2
- package/src/forge/_generated/artifactManifest.ts +0 -7
- package/src/forge/_generated/authClaims.json +0 -2
- package/src/forge/_generated/authClaims.ts +0 -13
- package/src/forge/_generated/authConfig.json +0 -2
- package/src/forge/_generated/authConfig.ts +0 -17
- package/src/forge/_generated/authContext.ts +0 -23
- package/src/forge/_generated/authRegistry.json +0 -2
- package/src/forge/_generated/authRegistry.ts +0 -25
- package/src/forge/_generated/buildInfo.json +0 -2
- package/src/forge/_generated/buildInfo.ts +0 -9
- package/src/forge/_generated/capabilityMap.json +0 -2
- package/src/forge/_generated/capabilityMap.md +0 -15
- package/src/forge/_generated/capabilityMap.ts +0 -17
- package/src/forge/_generated/client.ts +0 -282
- package/src/forge/_generated/clientApi.ts +0 -9
- package/src/forge/_generated/clientManifest.json +0 -2
- package/src/forge/_generated/clientManifest.ts +0 -39
- package/src/forge/_generated/clientTypes.ts +0 -78
- package/src/forge/_generated/configRegistry.json +0 -2
- package/src/forge/_generated/configRegistry.ts +0 -4
- package/src/forge/_generated/dataGraph.json +0 -2
- package/src/forge/_generated/dataGraph.ts +0 -8
- package/src/forge/_generated/db.json +0 -2
- package/src/forge/_generated/db.ts +0 -2
- package/src/forge/_generated/dbSecurityManifest.json +0 -2
- package/src/forge/_generated/dbSecurityManifest.ts +0 -15
- package/src/forge/_generated/dbSessionContext.json +0 -2
- package/src/forge/_generated/dbSessionContext.ts +0 -39
- package/src/forge/_generated/deployManifest.json +0 -2
- package/src/forge/_generated/deployManifest.ts +0 -14
- package/src/forge/_generated/devManifest.json +0 -2
- package/src/forge/_generated/devManifest.ts +0 -62
- package/src/forge/_generated/envSchema.json +0 -2
- package/src/forge/_generated/envSchema.ts +0 -59
- package/src/forge/_generated/frontendGraph.json +0 -2
- package/src/forge/_generated/frontendGraph.ts +0 -27
- package/src/forge/_generated/importGuards.json +0 -2
- package/src/forge/_generated/importGuards.ts +0 -686
- package/src/forge/_generated/index.ts +0 -68
- package/src/forge/_generated/liveProductionManifest.json +0 -2
- package/src/forge/_generated/liveProductionManifest.ts +0 -23
- package/src/forge/_generated/liveProtocol.json +0 -2
- package/src/forge/_generated/liveProtocol.ts +0 -21
- package/src/forge/_generated/liveQueryRegistry.json +0 -2
- package/src/forge/_generated/liveQueryRegistry.ts +0 -9
- package/src/forge/_generated/liveTransportConfig.json +0 -2
- package/src/forge/_generated/liveTransportConfig.ts +0 -19
- package/src/forge/_generated/makeRegistry.json +0 -2
- package/src/forge/_generated/makeRegistry.ts +0 -177
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -66
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -167
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -249334
- package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
- package/src/forge/_generated/permissionMatrix.json +0 -2
- package/src/forge/_generated/permissionMatrix.ts +0 -7
- package/src/forge/_generated/policyRegistry.json +0 -2
- package/src/forge/_generated/policyRegistry.ts +0 -11
- package/src/forge/_generated/queryRegistry.json +0 -2
- package/src/forge/_generated/queryRegistry.ts +0 -9
- package/src/forge/_generated/react.d.ts +0 -22
- package/src/forge/_generated/react.ts +0 -29
- package/src/forge/_generated/reactManifest.json +0 -2
- package/src/forge/_generated/reactManifest.ts +0 -19
- package/src/forge/_generated/rlsPolicies.json +0 -2
- package/src/forge/_generated/rlsPolicies.sql +0 -34
- package/src/forge/_generated/rlsPolicies.ts +0 -6
- package/src/forge/_generated/runtimeGraph.json +0 -2
- package/src/forge/_generated/runtimeGraph.ts +0 -8
- package/src/forge/_generated/runtimeMatrix.json +0 -2
- package/src/forge/_generated/runtimeMatrix.ts +0 -334130
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -91
- package/src/forge/_generated/secretRegistry.json +0 -2
- package/src/forge/_generated/secretRegistry.ts +0 -50
- package/src/forge/_generated/secretsContext.ts +0 -11
- package/src/forge/_generated/serverApi.ts +0 -10
- package/src/forge/_generated/sourceMapManifest.json +0 -2
- package/src/forge/_generated/sourceMapManifest.ts +0 -7
- package/src/forge/_generated/sqlPlan.json +0 -2
- package/src/forge/_generated/sqlPlan.ts +0 -88
- package/src/forge/_generated/subscriptionManifest.json +0 -2
- package/src/forge/_generated/subscriptionManifest.ts +0 -7
- package/src/forge/_generated/symbolicationManifest.json +0 -2
- package/src/forge/_generated/symbolicationManifest.ts +0 -17
- package/src/forge/_generated/telemetryRegistry.json +0 -2
- package/src/forge/_generated/telemetryRegistry.ts +0 -9
- package/src/forge/_generated/telemetrySinks.json +0 -2
- package/src/forge/_generated/telemetrySinks.ts +0 -11
- package/src/forge/_generated/tenantScope.json +0 -2
- package/src/forge/_generated/tenantScope.ts +0 -8
- package/src/forge/_generated/testGraph.json +0 -2
- package/src/forge/_generated/testGraph.ts +0 -3118
- package/src/forge/_generated/testPlanRegistry.json +0 -2
- package/src/forge/_generated/testPlanRegistry.ts +0 -33
- package/src/forge/_generated/uiRoutes.json +0 -2
- package/src/forge/_generated/uiRoutes.ts +0 -16
- package/src/forge/_generated/uiScenarios.json +0 -2
- package/src/forge/_generated/uiScenarios.ts +0 -30
- package/src/forge/_generated/uiTestManifest.json +0 -2
- package/src/forge/_generated/uiTestManifest.ts +0 -27
- package/src/forge/_generated/workflowRegistry.json +0 -2
- package/src/forge/_generated/workflowRegistry.ts +0 -9
- package/src/forge/_generated/workflowSubscriptions.json +0 -2
- package/src/forge/_generated/workflowSubscriptions.ts +0 -10
|
@@ -16,11 +16,17 @@ export interface ClientManifest {
|
|
|
16
16
|
queries: string;
|
|
17
17
|
commands: string;
|
|
18
18
|
liveQueries: string;
|
|
19
|
+
externalQueries: string;
|
|
20
|
+
externalCommands: string;
|
|
19
21
|
};
|
|
20
22
|
react: {
|
|
21
23
|
entrypoint: string;
|
|
22
24
|
hooks: string[];
|
|
23
25
|
};
|
|
26
|
+
vue: {
|
|
27
|
+
entrypoint: string;
|
|
28
|
+
composables: string[];
|
|
29
|
+
};
|
|
24
30
|
excluded: {
|
|
25
31
|
actions: string[];
|
|
26
32
|
workflows: string[];
|
|
@@ -41,6 +47,18 @@ export interface ReactManifest {
|
|
|
41
47
|
clientSafe: true;
|
|
42
48
|
}
|
|
43
49
|
|
|
50
|
+
export interface VueManifest {
|
|
51
|
+
schemaVersion: string;
|
|
52
|
+
generatorVersion: string;
|
|
53
|
+
inputHash: string;
|
|
54
|
+
entrypoint: string;
|
|
55
|
+
composables: string[];
|
|
56
|
+
queries: string[];
|
|
57
|
+
commands: string[];
|
|
58
|
+
liveQueries: string[];
|
|
59
|
+
clientSafe: true;
|
|
60
|
+
}
|
|
61
|
+
|
|
44
62
|
const SERVER_ADAPTER_SUFFIX = ".server.ts";
|
|
45
63
|
|
|
46
64
|
function collectServerAdapters(classified: ClassifiedPackage[]): string[] {
|
|
@@ -101,6 +119,8 @@ export function buildClientManifest(
|
|
|
101
119
|
queries: "POST /queries/:name",
|
|
102
120
|
commands: "POST /commands/:name",
|
|
103
121
|
liveQueries: "GET /live/:name",
|
|
122
|
+
externalQueries: "POST /external/:service/queries/:name",
|
|
123
|
+
externalCommands: "POST /external/:service/commands/:name",
|
|
104
124
|
},
|
|
105
125
|
react: {
|
|
106
126
|
entrypoint: "src/forge/_generated/react.ts",
|
|
@@ -113,6 +133,17 @@ export function buildClientManifest(
|
|
|
113
133
|
"useLiveQuery",
|
|
114
134
|
],
|
|
115
135
|
},
|
|
136
|
+
vue: {
|
|
137
|
+
entrypoint: "src/forge/_generated/vue.ts",
|
|
138
|
+
composables: [
|
|
139
|
+
"provideForge",
|
|
140
|
+
"useForgeClient",
|
|
141
|
+
"useForgeAuth",
|
|
142
|
+
"useForgeQuery",
|
|
143
|
+
"useForgeCommand",
|
|
144
|
+
"useForgeLiveQuery",
|
|
145
|
+
],
|
|
146
|
+
},
|
|
116
147
|
excluded: {
|
|
117
148
|
actions,
|
|
118
149
|
workflows,
|
|
@@ -149,3 +180,31 @@ export function buildReactManifest(clientManifest: ClientManifest): ReactManifes
|
|
|
149
180
|
clientSafe: true,
|
|
150
181
|
};
|
|
151
182
|
}
|
|
183
|
+
|
|
184
|
+
export function buildVueManifest(clientManifest: ClientManifest): VueManifest {
|
|
185
|
+
const composables = [
|
|
186
|
+
"provideForge",
|
|
187
|
+
"useForgeClient",
|
|
188
|
+
"useForgeAuth",
|
|
189
|
+
"useForgeQuery",
|
|
190
|
+
"useForgeCommand",
|
|
191
|
+
"useForgeLiveQuery",
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
return {
|
|
195
|
+
schemaVersion: "1.0.0",
|
|
196
|
+
generatorVersion: GENERATOR_VERSION,
|
|
197
|
+
inputHash: hashStable(
|
|
198
|
+
canonicalJson({
|
|
199
|
+
clientInputHash: clientManifest.inputHash,
|
|
200
|
+
composables,
|
|
201
|
+
}),
|
|
202
|
+
),
|
|
203
|
+
entrypoint: "src/forge/_generated/vue.ts",
|
|
204
|
+
composables,
|
|
205
|
+
queries: clientManifest.queries,
|
|
206
|
+
commands: clientManifest.commands,
|
|
207
|
+
liveQueries: clientManifest.liveQueries,
|
|
208
|
+
clientSafe: true,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientManifest, ReactManifest } from "./build-manifest.ts";
|
|
1
|
+
import type { ClientManifest, ReactManifest, VueManifest } from "./build-manifest.ts";
|
|
2
2
|
|
|
3
3
|
export function renderClientTypesTs(): string {
|
|
4
4
|
return `export type ForgeStaticAuth = {
|
|
@@ -52,6 +52,22 @@ export class ForgeError extends Error {
|
|
|
52
52
|
export type QueryName = keyof typeof import("./api.ts").api.queries;
|
|
53
53
|
export type CommandName = keyof typeof import("./api.ts").api.commands;
|
|
54
54
|
export type LiveQueryName = keyof typeof import("./api.ts").api.liveQueries;
|
|
55
|
+
export type ExternalCommandName = string;
|
|
56
|
+
export type ExternalQueryName = string;
|
|
57
|
+
export type ExternalRuntimeRefObject = {
|
|
58
|
+
service: string;
|
|
59
|
+
name: string;
|
|
60
|
+
kind?: "command" | "query";
|
|
61
|
+
language?: string;
|
|
62
|
+
framework?: string;
|
|
63
|
+
transport?: string;
|
|
64
|
+
};
|
|
65
|
+
export type ExternalCommandRef =
|
|
66
|
+
| ExternalCommandName
|
|
67
|
+
| ExternalRuntimeRefObject;
|
|
68
|
+
export type ExternalQueryRef =
|
|
69
|
+
| ExternalQueryName
|
|
70
|
+
| ExternalRuntimeRefObject;
|
|
55
71
|
|
|
56
72
|
export type LiveSnapshot<T> = {
|
|
57
73
|
subscriptionId: string;
|
|
@@ -70,6 +86,8 @@ export type ForgeClient = {
|
|
|
70
86
|
readonly lastTraceId?: string;
|
|
71
87
|
query<Name extends QueryName>(name: Name, args: unknown): Promise<unknown>;
|
|
72
88
|
command<Name extends CommandName>(name: Name, args: unknown): Promise<unknown>;
|
|
89
|
+
externalQuery<Name extends ExternalQueryRef>(name: Name, args: unknown): Promise<unknown>;
|
|
90
|
+
externalCommand<Name extends ExternalCommandRef>(name: Name, args: unknown): Promise<unknown>;
|
|
73
91
|
liveQuery<Name extends LiveQueryName>(
|
|
74
92
|
name: Name,
|
|
75
93
|
args: unknown,
|
|
@@ -87,6 +105,8 @@ import type {
|
|
|
87
105
|
ForgeAuthProvider,
|
|
88
106
|
ForgeClient,
|
|
89
107
|
ForgeClientConfig,
|
|
108
|
+
ExternalCommandRef,
|
|
109
|
+
ExternalQueryRef,
|
|
90
110
|
LiveQueryOptions,
|
|
91
111
|
LiveSnapshot,
|
|
92
112
|
} from "./clientTypes.ts";
|
|
@@ -102,6 +122,11 @@ export type {
|
|
|
102
122
|
QueryName,
|
|
103
123
|
CommandName,
|
|
104
124
|
LiveQueryName,
|
|
125
|
+
ExternalCommandName,
|
|
126
|
+
ExternalQueryName,
|
|
127
|
+
ExternalRuntimeRefObject,
|
|
128
|
+
ExternalCommandRef,
|
|
129
|
+
ExternalQueryRef,
|
|
105
130
|
ForgeResolvedAuth,
|
|
106
131
|
LiveQueryOptions,
|
|
107
132
|
LiveSnapshot,
|
|
@@ -179,6 +204,16 @@ function parseJsonPayload(body: unknown): {
|
|
|
179
204
|
};
|
|
180
205
|
}
|
|
181
206
|
|
|
207
|
+
function normalizeExternalRef(
|
|
208
|
+
ref: ExternalCommandRef | ExternalQueryRef,
|
|
209
|
+
): { service: string; name: string } {
|
|
210
|
+
if (typeof ref === "string") {
|
|
211
|
+
const [service, ...entryParts] = ref.split(".");
|
|
212
|
+
return { service: service ?? "", name: entryParts.join(".") };
|
|
213
|
+
}
|
|
214
|
+
return { service: ref.service, name: ref.name };
|
|
215
|
+
}
|
|
216
|
+
|
|
182
217
|
class ForgeHttpClient implements ForgeClient {
|
|
183
218
|
lastTraceId?: string;
|
|
184
219
|
|
|
@@ -192,6 +227,14 @@ class ForgeHttpClient implements ForgeClient {
|
|
|
192
227
|
return this.invoke("commands", name, args);
|
|
193
228
|
}
|
|
194
229
|
|
|
230
|
+
externalQuery(name: ExternalQueryRef, args: unknown): Promise<unknown> {
|
|
231
|
+
return this.invokeExternal("queries", name, args);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
externalCommand(name: ExternalCommandRef, args: unknown): Promise<unknown> {
|
|
235
|
+
return this.invokeExternal("commands", name, args);
|
|
236
|
+
}
|
|
237
|
+
|
|
195
238
|
liveQuery(
|
|
196
239
|
name: string,
|
|
197
240
|
args: unknown,
|
|
@@ -268,6 +311,68 @@ class ForgeHttpClient implements ForgeClient {
|
|
|
268
311
|
return payload.result;
|
|
269
312
|
}
|
|
270
313
|
|
|
314
|
+
private async invokeExternal(
|
|
315
|
+
kind: "queries" | "commands",
|
|
316
|
+
name: ExternalCommandRef | ExternalQueryRef,
|
|
317
|
+
args: unknown,
|
|
318
|
+
): Promise<unknown> {
|
|
319
|
+
const normalized = normalizeExternalRef(name);
|
|
320
|
+
const serviceName = normalized.service;
|
|
321
|
+
const entryName = normalized.name;
|
|
322
|
+
if (!serviceName || !entryName) {
|
|
323
|
+
throw new ForgeError(\`External runtime name must be service.entry\`, {
|
|
324
|
+
code: "FORGE_EXTERNAL_RUNTIME_NOT_FOUND",
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
const baseUrl = this.config.url.replace(/\\/$/, "");
|
|
328
|
+
const url = \`\${baseUrl}/external/\${encodeURIComponent(serviceName)}/\${kind}/\${encodeURIComponent(entryName)}\`;
|
|
329
|
+
return this.invokeUrl(url, args);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
private async invokeUrl(url: string, args: unknown): Promise<unknown> {
|
|
333
|
+
const authHeaders = await resolveAuthHeaders(this.config.auth);
|
|
334
|
+
|
|
335
|
+
const response = await fetch(url, {
|
|
336
|
+
method: "POST",
|
|
337
|
+
headers: {
|
|
338
|
+
"Content-Type": "application/json",
|
|
339
|
+
...authHeaders,
|
|
340
|
+
},
|
|
341
|
+
body: JSON.stringify({ args }),
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
let body: unknown;
|
|
345
|
+
try {
|
|
346
|
+
body = await response.json();
|
|
347
|
+
} catch {
|
|
348
|
+
throw new ForgeError(\`HTTP \${response.status}\`, {
|
|
349
|
+
code: "FORGE_HTTP_ERROR",
|
|
350
|
+
status: response.status,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const payload = parseJsonPayload(body);
|
|
355
|
+
this.lastTraceId = payload.traceId;
|
|
356
|
+
|
|
357
|
+
if (!response.ok || payload.ok === false) {
|
|
358
|
+
const diagnostic = payload.diagnostics?.find((entry) => entry.code);
|
|
359
|
+
const code =
|
|
360
|
+
payload.error?.code ?? diagnostic?.code ?? "FORGE_REQUEST_FAILED";
|
|
361
|
+
const message =
|
|
362
|
+
payload.error?.message ??
|
|
363
|
+
diagnostic?.message ??
|
|
364
|
+
\`Request failed with status \${response.status}\`;
|
|
365
|
+
throw new ForgeError(message, {
|
|
366
|
+
code,
|
|
367
|
+
traceId: payload.traceId,
|
|
368
|
+
status: response.status,
|
|
369
|
+
details: payload.error?.details ?? payload.diagnostics,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return payload.result;
|
|
374
|
+
}
|
|
375
|
+
|
|
271
376
|
private async openLiveQuery(
|
|
272
377
|
name: string,
|
|
273
378
|
args: unknown,
|
|
@@ -297,19 +402,24 @@ class ForgeHttpClient implements ForgeClient {
|
|
|
297
402
|
const reader = response.body.getReader();
|
|
298
403
|
let buffer = "";
|
|
299
404
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
405
|
+
try {
|
|
406
|
+
while (!signal.aborted) {
|
|
407
|
+
const { done, value } = await reader.read();
|
|
408
|
+
if (done) {
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
buffer += decoder.decode(value, { stream: true });
|
|
412
|
+
let boundary = buffer.indexOf("\\n\\n");
|
|
413
|
+
while (boundary !== -1) {
|
|
414
|
+
const frame = buffer.slice(0, boundary);
|
|
415
|
+
buffer = buffer.slice(boundary + 2);
|
|
416
|
+
this.handleSseFrame(frame, onSnapshot, onError);
|
|
417
|
+
boundary = buffer.indexOf("\\n\\n");
|
|
418
|
+
}
|
|
312
419
|
}
|
|
420
|
+
} finally {
|
|
421
|
+
await reader.cancel().catch(() => undefined);
|
|
422
|
+
reader.releaseLock();
|
|
313
423
|
}
|
|
314
424
|
}
|
|
315
425
|
|
|
@@ -430,3 +540,68 @@ export declare const useLiveQuery: import("forge/react").ForgeReactBindings["use
|
|
|
430
540
|
export function renderReactManifestTs(manifest: ReactManifest): string {
|
|
431
541
|
return `export const reactManifest = ${JSON.stringify(manifest, null, 2)} as const;\n`;
|
|
432
542
|
}
|
|
543
|
+
|
|
544
|
+
export function renderVueTs(): string {
|
|
545
|
+
return `import { createForgeVueBindings } from "forge/vue";
|
|
546
|
+
import { createForgeClient } from "./client.ts";
|
|
547
|
+
|
|
548
|
+
export type {
|
|
549
|
+
ForgeDevAuthConfig,
|
|
550
|
+
ForgeVueAuth,
|
|
551
|
+
ForgeVueAuthProvider,
|
|
552
|
+
ForgeVueBindings,
|
|
553
|
+
ForgeVueClient,
|
|
554
|
+
ForgeVueClientConfig,
|
|
555
|
+
ForgeVueError,
|
|
556
|
+
ForgeVuePluginOptions,
|
|
557
|
+
UseForgeCommandOptions,
|
|
558
|
+
UseForgeCommandResult,
|
|
559
|
+
UseForgeLiveQueryOptions,
|
|
560
|
+
UseForgeLiveQueryResult,
|
|
561
|
+
UseForgeQueryOptions,
|
|
562
|
+
UseForgeQueryResult,
|
|
563
|
+
} from "forge/vue";
|
|
564
|
+
|
|
565
|
+
const forgeVue = createForgeVueBindings(createForgeClient);
|
|
566
|
+
|
|
567
|
+
export const ForgeVuePlugin = forgeVue.ForgeVuePlugin;
|
|
568
|
+
export const provideForge = forgeVue.provideForge;
|
|
569
|
+
export const useForgeClient = forgeVue.useForgeClient;
|
|
570
|
+
export const useForgeAuth = forgeVue.useForgeAuth;
|
|
571
|
+
export const useForgeQuery = forgeVue.useForgeQuery;
|
|
572
|
+
export const useForgeCommand = forgeVue.useForgeCommand;
|
|
573
|
+
export const useForgeLiveQuery = forgeVue.useForgeLiveQuery;
|
|
574
|
+
`;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
export function renderVueDts(): string {
|
|
578
|
+
return `export type {
|
|
579
|
+
ForgeDevAuthConfig,
|
|
580
|
+
ForgeVueAuth,
|
|
581
|
+
ForgeVueAuthProvider,
|
|
582
|
+
ForgeVueBindings,
|
|
583
|
+
ForgeVueClient,
|
|
584
|
+
ForgeVueClientConfig,
|
|
585
|
+
ForgeVueError,
|
|
586
|
+
ForgeVuePluginOptions,
|
|
587
|
+
UseForgeCommandOptions,
|
|
588
|
+
UseForgeCommandResult,
|
|
589
|
+
UseForgeLiveQueryOptions,
|
|
590
|
+
UseForgeLiveQueryResult,
|
|
591
|
+
UseForgeQueryOptions,
|
|
592
|
+
UseForgeQueryResult,
|
|
593
|
+
} from "forge/vue";
|
|
594
|
+
|
|
595
|
+
export declare const ForgeVuePlugin: import("forge/vue").ForgeVueBindings["ForgeVuePlugin"];
|
|
596
|
+
export declare const provideForge: import("forge/vue").ForgeVueBindings["provideForge"];
|
|
597
|
+
export declare const useForgeClient: import("forge/vue").ForgeVueBindings["useForgeClient"];
|
|
598
|
+
export declare const useForgeAuth: import("forge/vue").ForgeVueBindings["useForgeAuth"];
|
|
599
|
+
export declare const useForgeQuery: import("forge/vue").ForgeVueBindings["useForgeQuery"];
|
|
600
|
+
export declare const useForgeCommand: import("forge/vue").ForgeVueBindings["useForgeCommand"];
|
|
601
|
+
export declare const useForgeLiveQuery: import("forge/vue").ForgeVueBindings["useForgeLiveQuery"];
|
|
602
|
+
`;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
export function renderVueManifestTs(manifest: VueManifest): string {
|
|
606
|
+
return `export const vueManifest = ${JSON.stringify(manifest, null, 2)} as const;\n`;
|
|
607
|
+
}
|
|
@@ -36,7 +36,7 @@ function unwrapStringLiteral(node: SyntaxNode): string | null {
|
|
|
36
36
|
return null;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
function extractFieldsFromObject(objectNode: SyntaxNode): DataField[] {
|
|
39
|
+
function extractFieldsFromObject(objectNode: SyntaxNode, options: { skipConfigName?: boolean } = {}): DataField[] {
|
|
40
40
|
const fields: DataField[] = [];
|
|
41
41
|
|
|
42
42
|
for (const child of objectNode.namedChildren) {
|
|
@@ -55,7 +55,7 @@ function extractFieldsFromObject(objectNode: SyntaxNode): DataField[] {
|
|
|
55
55
|
? keyNode.text
|
|
56
56
|
: unwrapStringLiteral(keyNode);
|
|
57
57
|
|
|
58
|
-
if (!key || key === "name") {
|
|
58
|
+
if (!key || (options.skipConfigName && key === "name")) {
|
|
59
59
|
continue;
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -131,7 +131,7 @@ function parseCallArguments(callNode: SyntaxNode): ParsedDefineTable | null {
|
|
|
131
131
|
|
|
132
132
|
if (first.type === "object") {
|
|
133
133
|
const tableName = extractNameFromObject(first);
|
|
134
|
-
const fields = extractFieldsFromObject(first);
|
|
134
|
+
const fields = extractFieldsFromObject(first, { skipConfigName: true });
|
|
135
135
|
return { tableName, fields };
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -42,6 +42,61 @@ function stableSortTables(tables: DataTable[]): DataTable[] {
|
|
|
42
42
|
return [...tables].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
function stableSortTableChangesByReferences(tables: SqlChange[]): SqlChange[] {
|
|
46
|
+
const orderedInput = [...tables].sort((a, b) => {
|
|
47
|
+
const tableA = a.table ?? "";
|
|
48
|
+
const tableB = b.table ?? "";
|
|
49
|
+
return tableA < tableB ? -1 : tableA > tableB ? 1 : 0;
|
|
50
|
+
});
|
|
51
|
+
const byName = new Map<string, SqlChange>();
|
|
52
|
+
|
|
53
|
+
for (const table of orderedInput) {
|
|
54
|
+
if (table.table) {
|
|
55
|
+
byName.set(table.table, table);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const pending = new Set(byName.keys());
|
|
60
|
+
const emitted = new Set<string>();
|
|
61
|
+
const ordered: SqlChange[] = [];
|
|
62
|
+
|
|
63
|
+
while (pending.size > 0) {
|
|
64
|
+
let progressed = false;
|
|
65
|
+
|
|
66
|
+
for (const tableName of pending) {
|
|
67
|
+
const table = byName.get(tableName);
|
|
68
|
+
if (!table) {
|
|
69
|
+
pending.delete(tableName);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const dependencies = (table.columns ?? [])
|
|
74
|
+
.map((column) => column.references?.table)
|
|
75
|
+
.filter((dependency): dependency is string => Boolean(dependency))
|
|
76
|
+
.filter((dependency) => dependency !== tableName && byName.has(dependency));
|
|
77
|
+
|
|
78
|
+
if (dependencies.every((dependency) => emitted.has(dependency))) {
|
|
79
|
+
ordered.push(table);
|
|
80
|
+
emitted.add(tableName);
|
|
81
|
+
pending.delete(tableName);
|
|
82
|
+
progressed = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!progressed) {
|
|
87
|
+
for (const tableName of pending) {
|
|
88
|
+
const table = byName.get(tableName);
|
|
89
|
+
if (table) {
|
|
90
|
+
ordered.push(table);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return ordered;
|
|
98
|
+
}
|
|
99
|
+
|
|
45
100
|
function parseFieldType(
|
|
46
101
|
field: DataField,
|
|
47
102
|
tableName: string,
|
|
@@ -254,6 +309,7 @@ function buildTableChange(table: DataTable, diagnostics: Diagnostic[]): SqlChang
|
|
|
254
309
|
return {
|
|
255
310
|
kind: "create_table",
|
|
256
311
|
table: tableName,
|
|
312
|
+
accessName: table.name,
|
|
257
313
|
columns,
|
|
258
314
|
sql: buildCreateTableSql(tableName, columns),
|
|
259
315
|
};
|
|
@@ -342,6 +398,8 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
|
|
|
342
398
|
}
|
|
343
399
|
}
|
|
344
400
|
|
|
401
|
+
const orderedTables = stableSortTableChangesByReferences(tables);
|
|
402
|
+
|
|
345
403
|
indexes.sort((a, b) => {
|
|
346
404
|
const nameA = a.index?.name ?? "";
|
|
347
405
|
const nameB = b.index?.name ?? "";
|
|
@@ -364,7 +422,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
|
|
|
364
422
|
const payload = {
|
|
365
423
|
schemaVersion: SQL_PLAN_SCHEMA_VERSION,
|
|
366
424
|
systemTables: systemTables.map((change) => change.sql),
|
|
367
|
-
tables:
|
|
425
|
+
tables: orderedTables.map((change) => change.sql),
|
|
368
426
|
indexes: indexes.map((change) => change.sql),
|
|
369
427
|
};
|
|
370
428
|
|
|
@@ -376,7 +434,7 @@ export function buildSqlPlan(dataGraph: DataGraph): SqlPlan {
|
|
|
376
434
|
migrationId,
|
|
377
435
|
checksum,
|
|
378
436
|
systemTables,
|
|
379
|
-
tables,
|
|
437
|
+
tables: orderedTables,
|
|
380
438
|
indexes,
|
|
381
439
|
diagnostics: diagnostics.sort((a, b) => {
|
|
382
440
|
const fileA = a.file ?? "";
|
|
@@ -15,6 +15,7 @@ export function serializeSqlPlanJson(plan: SqlPlan): string {
|
|
|
15
15
|
tables: plan.tables.map((change) => ({
|
|
16
16
|
kind: change.kind,
|
|
17
17
|
table: change.table,
|
|
18
|
+
accessName: change.accessName,
|
|
18
19
|
columns: change.columns,
|
|
19
20
|
sql: change.sql,
|
|
20
21
|
})),
|
|
@@ -69,6 +70,9 @@ export function buildTableMap(
|
|
|
69
70
|
? { tenantScoped: true, tenantIdColumn }
|
|
70
71
|
: {}),
|
|
71
72
|
};
|
|
73
|
+
if (change.accessName && change.accessName !== change.table) {
|
|
74
|
+
map[change.accessName] = map[change.table]!;
|
|
75
|
+
}
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
return map;
|
|
@@ -14,6 +14,7 @@ export const FORGE_AUTH_INVALID_AUDIENCE = "FORGE_AUTH_INVALID_AUDIENCE" as cons
|
|
|
14
14
|
export const FORGE_AUTH_TOKEN_EXPIRED = "FORGE_AUTH_TOKEN_EXPIRED" as const;
|
|
15
15
|
export const FORGE_AUTH_JWKS_FAILED = "FORGE_AUTH_JWKS_FAILED" as const;
|
|
16
16
|
export const FORGE_AUTH_CLAIM_MISSING = "FORGE_AUTH_CLAIM_MISSING" as const;
|
|
17
|
+
export const FORGE_AUTH_CLAIM_INVALID = "FORGE_AUTH_CLAIM_INVALID" as const;
|
|
17
18
|
export const FORGE_AUTH_TENANT_MISSING = "FORGE_AUTH_TENANT_MISSING" as const;
|
|
18
19
|
export const FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION =
|
|
19
20
|
"FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION" as const;
|
|
@@ -26,11 +27,20 @@ export const FORGE_DUP_RUNTIME_ENTRY = "FORGE_DUP_RUNTIME_ENTRY" as const;
|
|
|
26
27
|
export const FORGE_RUNTIME_UNRESOLVABLE = "FORGE_RUNTIME_UNRESOLVABLE" as const;
|
|
27
28
|
export const FORGE_RUNTIME_NOT_FOUND = "FORGE_RUNTIME_NOT_FOUND" as const;
|
|
28
29
|
export const FORGE_RUNTIME_GUARD_BLOCKED = "FORGE_RUNTIME_GUARD_BLOCKED" as const;
|
|
30
|
+
export const FORGE_EXTERNAL_RUNTIME_NOT_FOUND =
|
|
31
|
+
"FORGE_EXTERNAL_RUNTIME_NOT_FOUND" as const;
|
|
32
|
+
export const FORGE_EXTERNAL_RUNTIME_UNSUPPORTED =
|
|
33
|
+
"FORGE_EXTERNAL_RUNTIME_UNSUPPORTED" as const;
|
|
34
|
+
export const FORGE_EXTERNAL_RUNTIME_FAILED =
|
|
35
|
+
"FORGE_EXTERNAL_RUNTIME_FAILED" as const;
|
|
36
|
+
export const FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE =
|
|
37
|
+
"FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE" as const;
|
|
29
38
|
export const FORGE_DEV_SERVER_ERROR = "FORGE_DEV_SERVER_ERROR" as const;
|
|
30
39
|
export const FORGE_DEV_WATCH_FAILED = "FORGE_DEV_WATCH_FAILED" as const;
|
|
31
40
|
export const FORGE_DEV_INVOKE_FAILED = "FORGE_DEV_INVOKE_FAILED" as const;
|
|
32
41
|
export const FORGE_DEV_DOCTOR_MISSING_ARTIFACT =
|
|
33
42
|
"FORGE_DEV_DOCTOR_MISSING_ARTIFACT" as const;
|
|
43
|
+
export const FORGE_DEV_DB_RESET = "FORGE_DEV_DB_RESET" as const;
|
|
34
44
|
export const FORGE_DB_CONNECT_FAILED = "FORGE_DB_CONNECT_FAILED" as const;
|
|
35
45
|
export const FORGE_DB_MIGRATION_FAILED = "FORGE_DB_MIGRATION_FAILED" as const;
|
|
36
46
|
export const FORGE_DB_UNSUPPORTED_FIELD_TYPE =
|
|
@@ -47,6 +57,7 @@ export const FORGE_RLS_UNSUPPORTED_TENANT_TYPE =
|
|
|
47
57
|
export const FORGE_RLS_FORCE_DISABLED = "FORGE_RLS_FORCE_DISABLED" as const;
|
|
48
58
|
export const FORGE_RLS_APPLY_FAILED = "FORGE_RLS_APPLY_FAILED" as const;
|
|
49
59
|
export const FORGE_RLS_TEST_FAILED = "FORGE_RLS_TEST_FAILED" as const;
|
|
60
|
+
export const FORGE_RLS_MUTATION_FAILED = "FORGE_RLS_MUTATION_FAILED" as const;
|
|
50
61
|
export const FORGE_RLS_SESSION_CONTEXT_MISSING =
|
|
51
62
|
"FORGE_RLS_SESSION_CONTEXT_MISSING" as const;
|
|
52
63
|
export const FORGE_RLS_SESSION_CONTEXT_UNSAFE =
|
|
@@ -90,6 +101,8 @@ export const FORGE_RELEASE_DIRTY_WORKTREE =
|
|
|
90
101
|
export const FORGE_RELEASE_GENERATED_DRIFT =
|
|
91
102
|
"FORGE_RELEASE_GENERATED_DRIFT" as const;
|
|
92
103
|
export const FORGE_RELEASE_ID_MISSING = "FORGE_RELEASE_ID_MISSING" as const;
|
|
104
|
+
export const FORGE_RELEASE_PACKAGE_PACK_FAILED =
|
|
105
|
+
"FORGE_RELEASE_PACKAGE_PACK_FAILED" as const;
|
|
93
106
|
export const FORGE_SOURCEMAP_PUBLIC_EXPOSURE =
|
|
94
107
|
"FORGE_SOURCEMAP_PUBLIC_EXPOSURE" as const;
|
|
95
108
|
export const FORGE_SOURCEMAP_UPLOAD_MISSING =
|
|
@@ -214,6 +227,8 @@ export const FORGE_TEST_DOCKER_REQUIRED = "FORGE_TEST_DOCKER_REQUIRED" as const;
|
|
|
214
227
|
export const FORGE_TEST_BROWSER_REQUIRED = "FORGE_TEST_BROWSER_REQUIRED" as const;
|
|
215
228
|
export const FORGE_VERIFY_CHANGED_INCOMPLETE =
|
|
216
229
|
"FORGE_VERIFY_CHANGED_INCOMPLETE" as const;
|
|
230
|
+
export const FORGE_VERIFY_NO_TESTS_SELECTED =
|
|
231
|
+
"FORGE_VERIFY_NO_TESTS_SELECTED" as const;
|
|
217
232
|
export const FORGE_VERIFY_SCRIPT_TIMEOUT =
|
|
218
233
|
"FORGE_VERIFY_SCRIPT_TIMEOUT" as const;
|
|
219
234
|
export const FORGE_REPAIR_SOURCE_NOT_FOUND =
|
|
@@ -315,6 +330,12 @@ export const FORGE_TELEMETRY_PAYLOAD_TRUNCATED =
|
|
|
315
330
|
"FORGE_TELEMETRY_PAYLOAD_TRUNCATED" as const;
|
|
316
331
|
export const FORGE_TELEMETRY_SINK_FAILED = "FORGE_TELEMETRY_SINK_FAILED" as const;
|
|
317
332
|
export const FORGE_TELEMETRY_UNKNOWN_SINK = "FORGE_TELEMETRY_UNKNOWN_SINK" as const;
|
|
333
|
+
export const FORGE_WEBHOOK_SIGNATURE_INVALID =
|
|
334
|
+
"FORGE_WEBHOOK_SIGNATURE_INVALID" as const;
|
|
335
|
+
export const FORGE_WEBHOOK_TIMESTAMP_INVALID =
|
|
336
|
+
"FORGE_WEBHOOK_TIMESTAMP_INVALID" as const;
|
|
337
|
+
export const FORGE_WEBHOOK_REPLAY_DETECTED =
|
|
338
|
+
"FORGE_WEBHOOK_REPLAY_DETECTED" as const;
|
|
318
339
|
export const FORGE_POLICY_DENIED = "FORGE_POLICY_DENIED" as const;
|
|
319
340
|
export const FORGE_POLICY_MISSING = "FORGE_POLICY_MISSING" as const;
|
|
320
341
|
export const FORGE_POLICY_UNKNOWN = "FORGE_POLICY_UNKNOWN" as const;
|
|
@@ -338,6 +359,7 @@ export const FORGE_AI_SECRET_MISSING = "FORGE_AI_SECRET_MISSING" as const;
|
|
|
338
359
|
export const FORGE_AI_DYNAMIC_PROVIDER = "FORGE_AI_DYNAMIC_PROVIDER" as const;
|
|
339
360
|
export const FORGE_AI_GENERATION_FAILED = "FORGE_AI_GENERATION_FAILED" as const;
|
|
340
361
|
export const FORGE_AI_USAGE_UNAVAILABLE = "FORGE_AI_USAGE_UNAVAILABLE" as const;
|
|
362
|
+
export const FORGE_AI_REDTEAM_FAILED = "FORGE_AI_REDTEAM_FAILED" as const;
|
|
341
363
|
export const FORGE_QUERY_WRITE_FORBIDDEN = "FORGE_QUERY_WRITE_FORBIDDEN" as const;
|
|
342
364
|
export const FORGE_QUERY_EMIT_FORBIDDEN = "FORGE_QUERY_EMIT_FORBIDDEN" as const;
|
|
343
365
|
export const FORGE_QUERY_SECRET_FORBIDDEN = "FORGE_QUERY_SECRET_FORBIDDEN" as const;
|
|
@@ -379,6 +401,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
379
401
|
FORGE_AUTH_TOKEN_EXPIRED,
|
|
380
402
|
FORGE_AUTH_JWKS_FAILED,
|
|
381
403
|
FORGE_AUTH_CLAIM_MISSING,
|
|
404
|
+
FORGE_AUTH_CLAIM_INVALID,
|
|
382
405
|
FORGE_AUTH_TENANT_MISSING,
|
|
383
406
|
FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION,
|
|
384
407
|
FORGE_AUTH_MODE_INVALID,
|
|
@@ -389,10 +412,15 @@ export const DIAGNOSTIC_CODES = [
|
|
|
389
412
|
FORGE_RUNTIME_UNRESOLVABLE,
|
|
390
413
|
FORGE_RUNTIME_NOT_FOUND,
|
|
391
414
|
FORGE_RUNTIME_GUARD_BLOCKED,
|
|
415
|
+
FORGE_EXTERNAL_RUNTIME_NOT_FOUND,
|
|
416
|
+
FORGE_EXTERNAL_RUNTIME_UNSUPPORTED,
|
|
417
|
+
FORGE_EXTERNAL_RUNTIME_FAILED,
|
|
418
|
+
FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE,
|
|
392
419
|
FORGE_DEV_SERVER_ERROR,
|
|
393
420
|
FORGE_DEV_WATCH_FAILED,
|
|
394
421
|
FORGE_DEV_INVOKE_FAILED,
|
|
395
422
|
FORGE_DEV_DOCTOR_MISSING_ARTIFACT,
|
|
423
|
+
FORGE_DEV_DB_RESET,
|
|
396
424
|
FORGE_DB_CONNECT_FAILED,
|
|
397
425
|
FORGE_DB_MIGRATION_FAILED,
|
|
398
426
|
FORGE_DB_UNSUPPORTED_FIELD_TYPE,
|
|
@@ -406,6 +434,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
406
434
|
FORGE_RLS_FORCE_DISABLED,
|
|
407
435
|
FORGE_RLS_APPLY_FAILED,
|
|
408
436
|
FORGE_RLS_TEST_FAILED,
|
|
437
|
+
FORGE_RLS_MUTATION_FAILED,
|
|
409
438
|
FORGE_RLS_SESSION_CONTEXT_MISSING,
|
|
410
439
|
FORGE_RLS_SESSION_CONTEXT_UNSAFE,
|
|
411
440
|
FORGE_DB_SUPERUSER_RUNTIME,
|
|
@@ -433,6 +462,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
433
462
|
FORGE_RELEASE_DIRTY_WORKTREE,
|
|
434
463
|
FORGE_RELEASE_GENERATED_DRIFT,
|
|
435
464
|
FORGE_RELEASE_ID_MISSING,
|
|
465
|
+
FORGE_RELEASE_PACKAGE_PACK_FAILED,
|
|
436
466
|
FORGE_SOURCEMAP_PUBLIC_EXPOSURE,
|
|
437
467
|
FORGE_SOURCEMAP_UPLOAD_MISSING,
|
|
438
468
|
FORGE_SOURCEMAP_UPLOAD_FAILED,
|
|
@@ -510,6 +540,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
510
540
|
FORGE_TEST_DOCKER_REQUIRED,
|
|
511
541
|
FORGE_TEST_BROWSER_REQUIRED,
|
|
512
542
|
FORGE_VERIFY_CHANGED_INCOMPLETE,
|
|
543
|
+
FORGE_VERIFY_NO_TESTS_SELECTED,
|
|
513
544
|
FORGE_REPAIR_SOURCE_NOT_FOUND,
|
|
514
545
|
FORGE_REPAIR_UNKNOWN_FAILURE,
|
|
515
546
|
FORGE_REPAIR_NO_RULE_MATCHED,
|
|
@@ -575,6 +606,9 @@ export const DIAGNOSTIC_CODES = [
|
|
|
575
606
|
FORGE_TELEMETRY_PAYLOAD_TRUNCATED,
|
|
576
607
|
FORGE_TELEMETRY_SINK_FAILED,
|
|
577
608
|
FORGE_TELEMETRY_UNKNOWN_SINK,
|
|
609
|
+
FORGE_WEBHOOK_SIGNATURE_INVALID,
|
|
610
|
+
FORGE_WEBHOOK_TIMESTAMP_INVALID,
|
|
611
|
+
FORGE_WEBHOOK_REPLAY_DETECTED,
|
|
578
612
|
FORGE_POLICY_DENIED,
|
|
579
613
|
FORGE_POLICY_MISSING,
|
|
580
614
|
FORGE_POLICY_UNKNOWN,
|
|
@@ -595,6 +629,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
595
629
|
FORGE_AI_DYNAMIC_PROVIDER,
|
|
596
630
|
FORGE_AI_GENERATION_FAILED,
|
|
597
631
|
FORGE_AI_USAGE_UNAVAILABLE,
|
|
632
|
+
FORGE_AI_REDTEAM_FAILED,
|
|
598
633
|
FORGE_QUERY_WRITE_FORBIDDEN,
|
|
599
634
|
FORGE_QUERY_EMIT_FORBIDDEN,
|
|
600
635
|
FORGE_QUERY_SECRET_FORBIDDEN,
|
|
@@ -49,7 +49,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
49
49
|
}
|
|
50
50
|
if (code === "FORGE_SECRET_DIRECT_PROCESS_ENV") {
|
|
51
51
|
return {
|
|
52
|
-
fixHint: "Use ctx.secrets or ctx.config
|
|
52
|
+
fixHint: "Use ctx.secrets or ctx.config for Forge runtime secrets/config; public frontend bridge env may use the framework's public env surface.",
|
|
53
53
|
suggestedCommands: ["forge repair diagnose --diagnostic FORGE_SECRET_DIRECT_PROCESS_ENV --json", "forge refactor replace-process-env <ENV_NAME> --dry-run --json"],
|
|
54
54
|
docs: ["src/forge/_generated/runtimeRules.md"],
|
|
55
55
|
};
|
|
@@ -71,7 +71,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
71
71
|
if (code.startsWith("FORGE_RLS_")) {
|
|
72
72
|
return {
|
|
73
73
|
fixHint: "Inspect generated RLS SQL and validate tenant isolation before applying migrations.",
|
|
74
|
-
suggestedCommands: ["forge rls check --json", "forge rls
|
|
74
|
+
suggestedCommands: ["forge rls check --json", "forge rls test --db postgres --json"],
|
|
75
75
|
docs: ["src/forge/_generated/agentContract.json"],
|
|
76
76
|
};
|
|
77
77
|
}
|
|
@@ -106,7 +106,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
106
106
|
if (code.startsWith("FORGE_FRONTEND_")) {
|
|
107
107
|
return {
|
|
108
108
|
fixHint: "Use the generated frontend bridge and inspect src/forge/_generated/frontendGraph.json before editing UI wiring.",
|
|
109
|
-
suggestedCommands: [
|
|
109
|
+
suggestedCommands: [
|
|
110
|
+
"forge inspect frontend --json",
|
|
111
|
+
"forge make ui --framework vite --dry-run --json",
|
|
112
|
+
"forge make ui --framework nuxt --dry-run --json",
|
|
113
|
+
"forge generate",
|
|
114
|
+
],
|
|
110
115
|
docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
|
|
111
116
|
};
|
|
112
117
|
}
|
|
@@ -37,6 +37,8 @@ export {
|
|
|
37
37
|
FORGE_LIVEQUERY_UNKNOWN,
|
|
38
38
|
FORGE_LIVEQUERY_SUBSCRIPTION_FAILED,
|
|
39
39
|
FORGE_LIVEQUERY_RERUN_FAILED,
|
|
40
|
+
FORGE_RELEASE_PACKAGE_PACK_FAILED,
|
|
41
|
+
FORGE_VERIFY_NO_TESTS_SELECTED,
|
|
40
42
|
DIAGNOSTIC_CODES,
|
|
41
43
|
} from "./codes.ts";
|
|
42
44
|
export type { DiagnosticCode } from "./codes.ts";
|