forgeos 0.1.0-alpha.2 → 0.1.0-alpha.20
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 +4 -0
- package/AGENTS.md +168 -81
- package/CHANGELOG.md +199 -0
- package/README.md +88 -14
- 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/target/classes/dev/forgeos/adapter/Auth.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
- package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java/target/maven-archiver/pom.properties +3 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -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/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
- package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
- package/bin/forge.mjs +18 -0
- package/docs/changelog.md +212 -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/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
- package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
- package/package.json +29 -7
- 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 +1511 -123
- package/src/forge/agent-adapters/types.ts +216 -1
- package/src/forge/agent-memory/bridge.ts +1192 -0
- package/src/forge/agent-memory/context-pack.ts +151 -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 +84 -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 +191 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +736 -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 +671 -3
- package/src/forge/cli/auth.ts +36 -1
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +300 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1285 -7
- 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 +250 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/main.ts +49 -3
- package/src/forge/cli/new.ts +3 -1
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +290 -1
- package/src/forge/cli/parse.ts +770 -36
- 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 +2163 -0
- package/src/forge/cli/verify.ts +1422 -32
- package/src/forge/compiler/agent-contract/build.ts +725 -41
- package/src/forge/compiler/agent-contract/types.ts +85 -0
- package/src/forge/compiler/ai-registry/build.ts +62 -1
- package/src/forge/compiler/ai-registry/constants.ts +1 -1
- package/src/forge/compiler/ai-registry/parse.ts +168 -5
- 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/forge-apis.ts +1 -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/dev-manifest/build.ts +3 -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 +5 -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 +85 -13
- package/src/forge/compiler/integration/add.ts +498 -22
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/make-registry/build.ts +19 -7
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +78 -7
- 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 +101 -8
- 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 +44 -1
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/ai-registry.ts +25 -1
- package/src/forge/compiler/types/app-graph.ts +9 -2
- package/src/forge/compiler/types/cli.ts +76 -1
- package/src/forge/compiler/types/dev-manifest.ts +3 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +126 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +13 -0
- package/src/forge/delta/recorder.ts +402 -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 +489 -0
- package/src/forge/delta/store.ts +2975 -0
- package/src/forge/delta/timeline.ts +104 -0
- package/src/forge/dev/server.ts +768 -15
- 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 +149 -6
- package/src/forge/make/templates.ts +343 -2
- package/src/forge/make/types.ts +3 -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/ai/context.ts +210 -5
- package/src/forge/runtime/ai/types.ts +70 -0
- package/src/forge/runtime/auth/claims.ts +32 -0
- package/src/forge/runtime/auth/errors.ts +2 -0
- package/src/forge/runtime/context/create-context.ts +30 -6
- 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 +112 -2
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/scrubber.ts +91 -10
- package/src/forge/runtime/webhooks/security.ts +184 -0
- package/src/forge/server.ts +100 -2
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +407 -0
- package/src/forge/workspace/change-summary.ts +209 -0
- package/src/forge/workspace/forge-cli.ts +14 -0
- package/src/forge/workspace/git-summary.ts +279 -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/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 -7696
- package/src/forge/_generated/agentQuickstart.md +0 -32
- package/src/forge/_generated/aiContext.ts +0 -59
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -35
- 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 -29
- 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 -14667
- package/src/forge/_generated/appMap.md +0 -35
- 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 -47
- 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 -67
- 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 -163
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -61
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -147
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -245249
- 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 -327385
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -79
- 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 -3108
- 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
|
@@ -15,6 +15,64 @@ export interface PackageSignals {
|
|
|
15
15
|
nativeAddonEvidence: string[];
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
export interface SignalProfile {
|
|
19
|
+
calls: number;
|
|
20
|
+
totalMs: number;
|
|
21
|
+
entrypoints: number;
|
|
22
|
+
exports: number;
|
|
23
|
+
textFragments: number;
|
|
24
|
+
corpusBytes: number;
|
|
25
|
+
packageCount: number;
|
|
26
|
+
topPackages: SignalPackageProfile[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface SignalPackageProfile {
|
|
30
|
+
packageName: string;
|
|
31
|
+
calls: number;
|
|
32
|
+
totalMs: number;
|
|
33
|
+
entrypoints: number;
|
|
34
|
+
exports: number;
|
|
35
|
+
textFragments: number;
|
|
36
|
+
corpusBytes: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let activeProfile: SignalProfile | undefined;
|
|
40
|
+
let activePackageProfiles: Map<string, SignalPackageProfile> | undefined;
|
|
41
|
+
|
|
42
|
+
export function resetSignalProfile(): void {
|
|
43
|
+
activeProfile = {
|
|
44
|
+
calls: 0,
|
|
45
|
+
totalMs: 0,
|
|
46
|
+
entrypoints: 0,
|
|
47
|
+
exports: 0,
|
|
48
|
+
textFragments: 0,
|
|
49
|
+
corpusBytes: 0,
|
|
50
|
+
packageCount: 0,
|
|
51
|
+
topPackages: [],
|
|
52
|
+
};
|
|
53
|
+
activePackageProfiles = new Map();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function getSignalProfile(): SignalProfile | undefined {
|
|
57
|
+
if (!activeProfile) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const topPackages = [...(activePackageProfiles?.values() ?? [])]
|
|
61
|
+
.sort((a, b) => b.totalMs - a.totalMs)
|
|
62
|
+
.slice(0, 10)
|
|
63
|
+
.map((entry) => ({ ...entry }));
|
|
64
|
+
return {
|
|
65
|
+
...activeProfile,
|
|
66
|
+
packageCount: activePackageProfiles?.size ?? 0,
|
|
67
|
+
topPackages,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function clearSignalProfile(): void {
|
|
72
|
+
activeProfile = undefined;
|
|
73
|
+
activePackageProfiles = undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
18
76
|
const NODE_BUILTIN_PATTERNS = [
|
|
19
77
|
/\bnode:/,
|
|
20
78
|
/\brequire\s*\(\s*["'](?:fs|child_process|net|http|https|dns|tls|os|crypto)["']/,
|
|
@@ -89,9 +147,12 @@ function collectEnvVars(text: string): string[] {
|
|
|
89
147
|
}
|
|
90
148
|
|
|
91
149
|
export function gatherSignals(api: PackageApi): PackageSignals {
|
|
150
|
+
const started = activeProfile ? performance.now() : 0;
|
|
92
151
|
const texts: string[] = [];
|
|
152
|
+
let exportCount = 0;
|
|
93
153
|
for (const ep of api.entrypoints) {
|
|
94
154
|
for (const exp of ep.exports) {
|
|
155
|
+
exportCount += 1;
|
|
95
156
|
texts.push(exp.signature);
|
|
96
157
|
if (exp.overloads) texts.push(...exp.overloads);
|
|
97
158
|
if (exp.declarations) texts.push(...exp.declarations);
|
|
@@ -112,7 +173,7 @@ export function gatherSignals(api: PackageApi): PackageSignals {
|
|
|
112
173
|
const nativeAddonEvidence = collectMatches(corpus, NATIVE_ADDON_PATTERNS);
|
|
113
174
|
const envVars = collectEnvVars(corpus);
|
|
114
175
|
|
|
115
|
-
|
|
176
|
+
const result = {
|
|
116
177
|
usesNodeBuiltins: nodeBuiltins.length > 0,
|
|
117
178
|
nodeBuiltins,
|
|
118
179
|
usesNetwork: networkEvidence.length > 0,
|
|
@@ -126,4 +187,33 @@ export function gatherSignals(api: PackageApi): PackageSignals {
|
|
|
126
187
|
usesNativeAddon: nativeAddonEvidence.length > 0,
|
|
127
188
|
nativeAddonEvidence,
|
|
128
189
|
};
|
|
190
|
+
|
|
191
|
+
if (activeProfile) {
|
|
192
|
+
const durationMs = performance.now() - started;
|
|
193
|
+
activeProfile.calls += 1;
|
|
194
|
+
activeProfile.totalMs += durationMs;
|
|
195
|
+
activeProfile.entrypoints += api.entrypoints.length;
|
|
196
|
+
activeProfile.exports += exportCount;
|
|
197
|
+
activeProfile.textFragments += texts.length;
|
|
198
|
+
activeProfile.corpusBytes += corpus.length;
|
|
199
|
+
|
|
200
|
+
const packageProfile = activePackageProfiles?.get(api.name) ?? {
|
|
201
|
+
packageName: api.name,
|
|
202
|
+
calls: 0,
|
|
203
|
+
totalMs: 0,
|
|
204
|
+
entrypoints: 0,
|
|
205
|
+
exports: 0,
|
|
206
|
+
textFragments: 0,
|
|
207
|
+
corpusBytes: 0,
|
|
208
|
+
};
|
|
209
|
+
packageProfile.calls += 1;
|
|
210
|
+
packageProfile.totalMs += durationMs;
|
|
211
|
+
packageProfile.entrypoints += api.entrypoints.length;
|
|
212
|
+
packageProfile.exports += exportCount;
|
|
213
|
+
packageProfile.textFragments += texts.length;
|
|
214
|
+
packageProfile.corpusBytes += corpus.length;
|
|
215
|
+
activePackageProfiles?.set(api.name, packageProfile);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return result;
|
|
129
219
|
}
|
|
@@ -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;
|
|
@@ -61,6 +61,9 @@ function buildRoutes(
|
|
|
61
61
|
{ method: "GET", path: "/health", purpose: "health" },
|
|
62
62
|
{ method: "GET", path: "/entries", purpose: "entries" },
|
|
63
63
|
{ method: "GET", path: "/queries", purpose: "queries" },
|
|
64
|
+
{ method: "POST", path: "/ai/agents/chat", purpose: "ai-agent-chat" },
|
|
65
|
+
{ method: "POST", path: "/ai/agents/run", purpose: "ai-agent-run" },
|
|
66
|
+
{ method: "GET", path: "/ai/providers", purpose: "ai-providers" },
|
|
64
67
|
{ method: "GET", path: "/workflows", purpose: "workflows" },
|
|
65
68
|
{ method: "GET", path: "/workflows/runs", purpose: "workflow-runs" },
|
|
66
69
|
{ method: "POST", path: "/workflows/process", purpose: "workflow-process" },
|