stageflow 0.25.0 → 0.30.0
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/README.md +14 -3
- package/builtin-skills/browser/SKILL.md +42 -0
- package/dist/a2a/contracts.d.ts +1 -0
- package/dist/a2a/contracts.js +1 -0
- package/dist/a2a/registry.d.ts +2 -0
- package/dist/a2a/registry.js +20 -1
- package/dist/a2a/server.d.ts +7 -0
- package/dist/a2a/server.js +5 -2
- package/dist/a2a/service.d.ts +1 -1
- package/dist/a2a/service.js +57 -8
- package/dist/a2a/store.d.ts +8 -5
- package/dist/a2a/store.js +24 -67
- package/dist/agent/activity.d.ts +3 -0
- package/dist/agent/bootProviderConfig.d.ts +21 -0
- package/dist/agent/bootProviderConfig.js +74 -0
- package/dist/agent/claudeAdapter.js +2 -2
- package/dist/agent/cursorProvider.d.ts +2 -0
- package/dist/agent/cursorProvider.js +30 -5
- package/dist/agent/fakeAgent.d.ts +1 -0
- package/dist/agent/fakeAgent.js +13 -0
- package/dist/agent/piAdapter.d.ts +11 -24
- package/dist/agent/piAdapter.js +107 -50
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/piSessionFactory.d.ts +38 -0
- package/dist/agent/piSessionFactory.js +60 -0
- package/dist/agent/port.d.ts +8 -0
- package/dist/agent/streamLogRedact.d.ts +7 -1
- package/dist/agent/streamLogRedact.js +26 -11
- package/dist/browser/anchor.d.ts +27 -0
- package/dist/browser/anchor.js +127 -0
- package/dist/browser/auditSink.d.ts +38 -0
- package/dist/browser/auditSink.js +34 -0
- package/dist/browser/browserHost.d.ts +86 -0
- package/dist/browser/browserHost.js +7 -0
- package/dist/browser/browserSweep.d.ts +14 -0
- package/dist/browser/browserSweep.js +54 -0
- package/dist/browser/browserTeardown.d.ts +56 -0
- package/dist/browser/browserTeardown.js +235 -0
- package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
- package/dist/browser/fakeRemoteBrowserHost.js +34 -0
- package/dist/browser/gateHandoff.d.ts +25 -0
- package/dist/browser/gateHandoff.js +83 -0
- package/dist/browser/humanLogin.d.ts +18 -0
- package/dist/browser/humanLogin.js +34 -0
- package/dist/browser/keyProvider.d.ts +10 -0
- package/dist/browser/keyProvider.js +39 -0
- package/dist/browser/localBrowserHost.d.ts +10 -0
- package/dist/browser/localBrowserHost.js +152 -0
- package/dist/browser/localProfileLock.d.ts +2 -0
- package/dist/browser/localProfileLock.js +218 -0
- package/dist/browser/localProfileStore.d.ts +5 -0
- package/dist/browser/localProfileStore.js +91 -0
- package/dist/browser/loginCheck.d.ts +53 -0
- package/dist/browser/loginCheck.js +147 -0
- package/dist/browser/memoryProfileLock.d.ts +2 -0
- package/dist/browser/memoryProfileLock.js +53 -0
- package/dist/browser/memoryProfileStore.d.ts +2 -0
- package/dist/browser/memoryProfileStore.js +31 -0
- package/dist/browser/navigationAudit.d.ts +16 -0
- package/dist/browser/navigationAudit.js +53 -0
- package/dist/browser/persistedEnv.d.ts +3 -0
- package/dist/browser/persistedEnv.js +15 -0
- package/dist/browser/profileLock.d.ts +40 -0
- package/dist/browser/profileLock.js +10 -0
- package/dist/browser/profileStore.d.ts +23 -0
- package/dist/browser/profileStore.js +39 -0
- package/dist/browser/runLiveness.d.ts +13 -0
- package/dist/browser/runLiveness.js +39 -0
- package/dist/browser/sitePolicy.d.ts +10 -0
- package/dist/browser/sitePolicy.js +61 -0
- package/dist/browser/stageBrowserEnv.d.ts +22 -0
- package/dist/browser/stageBrowserEnv.js +147 -0
- package/dist/browser/stageProfileLock.d.ts +17 -0
- package/dist/browser/stageProfileLock.js +39 -0
- package/dist/cli/artifactCommand.js +9 -16
- package/dist/cli/backupCommand.d.ts +9 -0
- package/dist/cli/backupCommand.js +111 -0
- package/dist/cli/browserCommand.d.ts +44 -0
- package/dist/cli/browserCommand.js +472 -0
- package/dist/cli/debugRunCommand.d.ts +10 -0
- package/dist/cli/debugRunCommand.js +109 -0
- package/dist/cli/doctorCommand.d.ts +32 -0
- package/dist/cli/doctorCommand.js +453 -0
- package/dist/cli/envelopeCommand.js +9 -2
- package/dist/cli/exportAllCommand.d.ts +55 -0
- package/dist/cli/exportAllCommand.js +218 -0
- package/dist/cli/exportRunCommand.js +23 -21
- package/dist/cli/hostClient.d.ts +41 -3
- package/dist/cli/hostClient.js +129 -14
- package/dist/cli/initCommand.d.ts +1 -0
- package/dist/cli/initCommand.js +23 -7
- package/dist/cli/initTemplates.d.ts +5 -2
- package/dist/cli/initTemplates.js +32 -2
- package/dist/cli/resolveSafeOutPath.d.ts +2 -0
- package/dist/cli/resolveSafeOutPath.js +40 -0
- package/dist/cli/restoreCommand.d.ts +10 -0
- package/dist/cli/restoreCommand.js +90 -0
- package/dist/cli/runCommand.d.ts +3 -2
- package/dist/cli/runCommand.js +93 -11
- package/dist/cli/runOutput.d.ts +4 -0
- package/dist/cli/runOutput.js +33 -7
- package/dist/cli/runStageCommand.d.ts +1 -0
- package/dist/cli/runStageCommand.js +44 -25
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +168 -10
- package/dist/cli/triggerCommand.d.ts +12 -0
- package/dist/cli/triggerCommand.js +183 -0
- package/dist/cli/validateCommand.d.ts +1 -1
- package/dist/cli/validateCommand.js +23 -6
- package/dist/cli.js +202 -32
- package/dist/config/browseCatalog.d.ts +1 -0
- package/dist/config/browseCatalog.js +5 -4
- package/dist/config/builtinSkills.d.ts +4 -0
- package/dist/config/builtinSkills.js +23 -0
- package/dist/config/catalogRelativePath.d.ts +63 -0
- package/dist/config/catalogRelativePath.js +126 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/createTrigger.d.ts +27 -0
- package/dist/config/createTrigger.js +232 -0
- package/dist/config/draftPackage.d.ts +117 -0
- package/dist/config/draftPackage.js +550 -0
- package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
- package/dist/config/ensureCatalogScanRoot.js +73 -0
- package/dist/config/hostConfig.d.ts +57 -0
- package/dist/config/hostConfig.js +360 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +206 -5
- package/dist/config/loadOutcome.d.ts +7 -1
- package/dist/config/loadPipeline.js +39 -2
- package/dist/config/loadStage.js +25 -0
- package/dist/config/loadStageflowManifest.js +25 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- package/dist/config/loadTrigger.d.ts +9 -0
- package/dist/config/loadTrigger.js +120 -0
- package/dist/config/materializeStageModels.js +5 -1
- package/dist/config/mergePipelineIncludes.d.ts +3 -0
- package/dist/config/mergePipelineIncludes.js +19 -0
- package/dist/config/migrateYaml.js +6 -11
- package/dist/config/multiProjectCatalog.d.ts +32 -0
- package/dist/config/multiProjectCatalog.js +150 -0
- package/dist/config/normalizePipelineStageEntry.js +27 -1
- package/dist/config/parseCompletionContract.js +6 -0
- package/dist/config/pipelineStageKeys.js +3 -0
- package/dist/config/publishDraftPackage.d.ts +7 -0
- package/dist/config/publishDraftPackage.js +25 -0
- package/dist/config/resolveCatalogContext.js +1 -1
- package/dist/config/resolveCatalogRoots.d.ts +27 -0
- package/dist/config/resolveCatalogRoots.js +76 -0
- package/dist/config/resolveModel.d.ts +7 -1
- package/dist/config/resolveModel.js +11 -1
- package/dist/config/resolvePipelineDag.js +1 -1
- package/dist/config/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- package/dist/config/scanCatalogPaths.d.ts +1 -1
- package/dist/config/scanCatalogPaths.js +6 -2
- package/dist/config/secretFromEnvOrFile.d.ts +9 -0
- package/dist/config/secretFromEnvOrFile.js +34 -0
- package/dist/config/seededCatalog.d.ts +11 -0
- package/dist/config/seededCatalog.js +29 -0
- package/dist/config/stageBrowser.d.ts +12 -0
- package/dist/config/stageBrowser.js +118 -0
- package/dist/config/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/triggerCatalog.d.ts +10 -0
- package/dist/config/triggerCatalog.js +37 -0
- package/dist/config/validateCatalog.d.ts +17 -3
- package/dist/config/validateCatalog.js +223 -3
- package/dist/config/validateCompletionContract.js +8 -0
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -0
- package/dist/envelope/preEmitChecks.d.ts +1 -1
- package/dist/envelope/preEmitChecks.js +8 -0
- package/dist/errors/codes.d.ts +14 -0
- package/dist/errors/codes.js +59 -0
- package/dist/git/cache.d.ts +14 -0
- package/dist/git/cache.js +150 -0
- package/dist/git/credentials.d.ts +9 -0
- package/dist/git/credentials.js +88 -0
- package/dist/git/errors.d.ts +20 -0
- package/dist/git/errors.js +94 -0
- package/dist/git/exec.d.ts +16 -0
- package/dist/git/exec.js +135 -0
- package/dist/git/operations.d.ts +29 -0
- package/dist/git/operations.js +153 -0
- package/dist/git/version.d.ts +1 -0
- package/dist/git/version.js +10 -0
- package/dist/logging/audit.d.ts +16 -0
- package/dist/logging/audit.js +19 -0
- package/dist/logging/commonWords.d.ts +2 -0
- package/dist/logging/commonWords.js +13 -0
- package/dist/logging/logger.d.ts +49 -0
- package/dist/logging/logger.js +193 -0
- package/dist/logging/namedSecrets.d.ts +6 -0
- package/dist/logging/namedSecrets.js +58 -0
- package/dist/logging/redact.d.ts +17 -0
- package/dist/logging/redact.js +105 -0
- package/dist/mcp/catalogTools.js +492 -81
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +182 -6
- package/dist/mcp/deps.d.ts +3 -0
- package/dist/mcp/getStartedTool.d.ts +3 -0
- package/dist/mcp/getStartedTool.js +62 -0
- package/dist/mcp/readArtifact.d.ts +11 -0
- package/dist/mcp/readArtifact.js +46 -30
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/triggerTools.d.ts +3 -0
- package/dist/mcp/triggerTools.js +176 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -0
- package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
- package/dist/operatorAgent/docsRetrieval.js +269 -0
- package/dist/operatorAgent/draftContext.d.ts +16 -0
- package/dist/operatorAgent/draftContext.js +68 -0
- package/dist/operatorAgent/fakeHost.d.ts +39 -0
- package/dist/operatorAgent/fakeHost.js +92 -0
- package/dist/operatorAgent/host.d.ts +40 -0
- package/dist/operatorAgent/host.js +179 -0
- package/dist/operatorAgent/index.d.ts +9 -0
- package/dist/operatorAgent/index.js +8 -0
- package/dist/operatorAgent/piModel.d.ts +80 -0
- package/dist/operatorAgent/piModel.js +528 -0
- package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
- package/dist/operatorAgent/proposals.d.ts +32 -0
- package/dist/operatorAgent/proposals.js +144 -0
- package/dist/operatorAgent/types.d.ts +128 -0
- package/dist/operatorAgent/types.js +1 -0
- package/dist/package-meta.d.ts +2 -1
- package/dist/package-meta.js +2 -1
- package/dist/preflight/bash.d.ts +8 -0
- package/dist/preflight/bash.js +34 -0
- package/dist/preflight/claudeRoot.d.ts +11 -0
- package/dist/preflight/claudeRoot.js +23 -0
- package/dist/preflight/mcpCommands.d.ts +8 -0
- package/dist/preflight/mcpCommands.js +36 -0
- package/dist/preflight/pipelinePreflight.d.ts +40 -0
- package/dist/preflight/pipelinePreflight.js +192 -0
- package/dist/preflight/tls.d.ts +6 -0
- package/dist/preflight/tls.js +18 -0
- package/dist/preflight/toolchain.d.ts +45 -0
- package/dist/preflight/toolchain.js +219 -0
- package/dist/project/findManifestRoot.d.ts +3 -0
- package/dist/project/findManifestRoot.js +35 -0
- package/dist/project/findProjectRoot.js +3 -4
- package/dist/project/globalHome.d.ts +7 -0
- package/dist/project/globalHome.js +63 -2
- package/dist/project/resolveProjectContext.js +2 -2
- package/dist/project/resolveStageflowContext.d.ts +7 -0
- package/dist/project/resolveStageflowContext.js +46 -30
- package/dist/projection/projectRun.d.ts +2 -1
- package/dist/projection/projectRun.js +1 -0
- package/dist/runstore/assertTmpdir.d.ts +1 -0
- package/dist/runstore/assertTmpdir.js +25 -0
- package/dist/runstore/backup.d.ts +52 -0
- package/dist/runstore/backup.js +292 -0
- package/dist/runstore/createStore.d.ts +18 -1
- package/dist/runstore/createStore.js +64 -5
- package/dist/runstore/debugBundle.d.ts +60 -0
- package/dist/runstore/debugBundle.js +143 -0
- package/dist/runstore/diskUsage.d.ts +50 -0
- package/dist/runstore/diskUsage.js +214 -0
- package/dist/runstore/exportRunPayload.d.ts +8 -0
- package/dist/runstore/exportRunPayload.js +23 -0
- package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
- package/dist/runstore/normalizeCatalogPath.js +10 -0
- package/dist/runstore/paths.d.ts +5 -0
- package/dist/runstore/paths.js +145 -1
- package/dist/runstore/port.d.ts +139 -13
- package/dist/runstore/port.js +8 -1
- package/dist/runstore/restore.d.ts +81 -0
- package/dist/runstore/restore.js +355 -0
- package/dist/runstore/retention.d.ts +27 -0
- package/dist/runstore/retention.js +74 -0
- package/dist/runstore/runManifest.d.ts +146 -0
- package/dist/runstore/runManifest.js +288 -0
- package/dist/runstore/runProjection.d.ts +3 -1
- package/dist/runstore/runProjection.js +63 -1
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
- package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
- package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
- package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
- package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +78 -0
- package/dist/runstore/sqlite/schema.d.ts +20 -1
- package/dist/runstore/sqlite/schema.js +277 -1
- package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
- package/dist/runstore/sqlite/storeOpenError.js +11 -0
- package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
- package/dist/runstore/sqlite/storeSchemaError.js +8 -0
- package/dist/runstore/stageExecution.js +3 -0
- package/dist/runstore/storeFilesystem.d.ts +32 -0
- package/dist/runstore/storeFilesystem.js +148 -0
- package/dist/runstore/trackProjection.js +2 -0
- package/dist/runstore/workspaceLayout.d.ts +13 -0
- package/dist/runstore/workspaceLayout.js +76 -0
- package/dist/runtime/answerResume.d.ts +1 -0
- package/dist/runtime/answerResume.js +3 -1
- package/dist/runtime/completionCheckRunner.d.ts +15 -1
- package/dist/runtime/completionCheckRunner.js +67 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialBinding.d.ts +2 -0
- package/dist/runtime/credentialBinding.js +3 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/emailSource.d.ts +72 -0
- package/dist/runtime/emailSource.js +304 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/githubPollSource.d.ts +86 -0
- package/dist/runtime/githubPollSource.js +284 -0
- package/dist/runtime/pipelineRunner.d.ts +40 -1
- package/dist/runtime/pipelineRunner.js +181 -17
- package/dist/runtime/pipelineScheduler.d.ts +17 -0
- package/dist/runtime/pipelineScheduler.js +220 -28
- package/dist/runtime/reloadRunCatalog.js +6 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resumeTimedOut.d.ts +1 -1
- package/dist/runtime/resumeTimedOut.js +5 -2
- package/dist/runtime/runChangeBus.js +9 -0
- package/dist/runtime/runDeletion.d.ts +7 -0
- package/dist/runtime/runDeletion.js +37 -0
- package/dist/runtime/runManager.d.ts +169 -4
- package/dist/runtime/runManager.js +1748 -83
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +4 -0
- package/dist/runtime/runRetryCoordinator.js +20 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/scheduleSource.d.ts +38 -0
- package/dist/runtime/scheduleSource.js +119 -0
- package/dist/runtime/settingsFile.d.ts +5 -0
- package/dist/runtime/settingsFile.js +61 -54
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +250 -27
- package/dist/runtime/stageCacheEnv.d.ts +6 -0
- package/dist/runtime/stageCacheEnv.js +34 -0
- package/dist/runtime/stageConcurrency.d.ts +2 -1
- package/dist/runtime/stageConcurrency.js +4 -2
- package/dist/runtime/stageEnvironment.d.ts +38 -0
- package/dist/runtime/stageEnvironment.js +194 -0
- package/dist/runtime/stageHitl.d.ts +1 -0
- package/dist/runtime/stageHitl.js +5 -1
- package/dist/runtime/stageProcessLauncher.d.ts +20 -0
- package/dist/runtime/stageProcessLauncher.js +236 -41
- package/dist/runtime/stageRecovery.d.ts +3 -1
- package/dist/runtime/stageRecovery.js +19 -4
- package/dist/runtime/stageRoots.d.ts +38 -1
- package/dist/runtime/stageRoots.js +118 -0
- package/dist/runtime/stageRunner.d.ts +6 -0
- package/dist/runtime/stageRunner.js +32 -6
- package/dist/runtime/stageSecretDecl.d.ts +9 -0
- package/dist/runtime/stageSecretDecl.js +102 -0
- package/dist/runtime/stageSecrets.d.ts +40 -0
- package/dist/runtime/stageSecrets.js +181 -0
- package/dist/runtime/stageStreamLog.d.ts +1 -0
- package/dist/runtime/stageStreamLog.js +2 -1
- package/dist/runtime/stageWorker.d.ts +3 -2
- package/dist/runtime/stageWorker.js +58 -10
- package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
- package/dist/runtime/stageWorkerProtocol.js +8 -0
- package/dist/runtime/startPayload.d.ts +32 -0
- package/dist/runtime/startPayload.js +59 -0
- package/dist/runtime/taskInput.js +14 -5
- package/dist/runtime/triggerCatalog.d.ts +6 -0
- package/dist/runtime/triggerCatalog.js +24 -0
- package/dist/runtime/triggerEventMatch.d.ts +2 -0
- package/dist/runtime/triggerEventMatch.js +6 -0
- package/dist/runtime/triggerPort.d.ts +14 -0
- package/dist/runtime/triggerPort.js +1 -0
- package/dist/runtime/triggerRunner.d.ts +17 -0
- package/dist/runtime/triggerRunner.js +89 -0
- package/dist/runtime/verifiedStageExecution.d.ts +8 -0
- package/dist/runtime/verifiedStageExecution.js +16 -1
- package/dist/runtime/webhookSignature.d.ts +1 -0
- package/dist/runtime/webhookSignature.js +12 -0
- package/dist/runtime/workspaceBinding.d.ts +20 -0
- package/dist/runtime/workspaceBinding.js +60 -0
- package/dist/server/allowedHosts.d.ts +19 -0
- package/dist/server/allowedHosts.js +179 -0
- package/dist/server/bootstrap.d.ts +42 -2
- package/dist/server/bootstrap.js +273 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +254 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +106 -10
- package/dist/server/ensureGlobalService.d.ts +5 -1
- package/dist/server/ensureGlobalService.js +35 -1
- package/dist/server/healthSurfaces.d.ts +6 -0
- package/dist/server/healthSurfaces.js +123 -0
- package/dist/server/http.d.ts +27 -1
- package/dist/server/http.js +2254 -477
- package/dist/server/listenHost.d.ts +5 -0
- package/dist/server/listenHost.js +56 -0
- package/dist/server/mcpHost.d.ts +10 -1
- package/dist/server/mcpHost.js +36 -6
- package/dist/server/operatorResults.d.ts +2 -2
- package/dist/server/operatorResults.js +40 -29
- package/dist/server/requestAuthContext.d.ts +12 -0
- package/dist/server/requestAuthContext.js +21 -0
- package/dist/server/shutdown.d.ts +69 -0
- package/dist/server/shutdown.js +219 -0
- package/dist/server/triggerRoutes.d.ts +15 -0
- package/dist/server/triggerRoutes.js +268 -0
- package/dist/tools/askOperator.d.ts +3 -2
- package/dist/types/completion.d.ts +3 -0
- package/dist/types/pipeline.d.ts +10 -1
- package/dist/types/preEmitCheck.d.ts +7 -0
- package/dist/types/stage.d.ts +22 -0
- package/dist/types/stageflowManifest.d.ts +3 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/types/trigger.d.ts +18 -0
- package/dist/types/trigger.js +1 -0
- package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
- package/dist/ui/assets/index-CntB4bZR.js +133 -0
- package/dist/ui/index.html +2 -2
- package/dist/workshop/autosave.d.ts +58 -0
- package/dist/workshop/autosave.js +222 -0
- package/dist/workshop/buildStore.d.ts +79 -0
- package/dist/workshop/buildStore.js +326 -0
- package/dist/workshop/chatTurn.d.ts +232 -0
- package/dist/workshop/chatTurn.js +475 -0
- package/dist/workshop/modelSettings.d.ts +18 -0
- package/dist/workshop/modelSettings.js +44 -0
- package/dist/workshop/sessionStore.d.ts +61 -0
- package/dist/workshop/sessionStore.js +254 -0
- package/dist/workshop/workshopPin.d.ts +72 -0
- package/dist/workshop/workshopPin.js +193 -0
- package/examples/README.md +99 -0
- package/examples/archify-on-pr/README.md +213 -0
- package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
- package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
- package/examples/archify-on-pr/author-diagrams.yaml +106 -0
- package/examples/archify-on-pr/detect-changes.yaml +89 -0
- package/examples/browser-session/README.md +77 -0
- package/examples/browser-session/browser-session.pipeline.yaml +50 -0
- package/examples/browser-session/browser-session.task.yaml +6 -0
- package/examples/browser-session/check-login.yaml +22 -0
- package/examples/browser-session/fixture-server.mjs +64 -0
- package/examples/browser-session/human-login.yaml +31 -0
- package/examples/browser-session/merge.yaml +36 -0
- package/examples/browser-session/work-a.yaml +41 -0
- package/examples/browser-session/work-b.yaml +41 -0
- package/examples/ci-validate/README.md +35 -0
- package/examples/ci-validate/check.yaml +13 -0
- package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
- package/examples/ci-validate/validate.sh +5 -0
- package/examples/compliance-review-demo/README.md +125 -0
- package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
- package/examples/compliance-review-demo/connect-account.yaml +47 -0
- package/examples/compliance-review-demo/map-to-control.yaml +123 -0
- package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
- package/examples/compliance-review-demo/publish-report.yaml +79 -0
- package/examples/compliance-review-demo/review-verdict.yaml +122 -0
- package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
- package/examples/compliance-review-demo/store-evidence.yaml +143 -0
- package/examples/conditional-fork/README.md +89 -0
- package/examples/conditional-fork/branch-a.yaml +13 -0
- package/examples/conditional-fork/branch-b.yaml +13 -0
- package/examples/conditional-fork/decide.yaml +35 -0
- package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
- package/examples/conditional-fork/fork-demo.task.yaml +8 -0
- package/examples/context7-mcp/README.md +42 -0
- package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
- package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
- package/examples/context7-mcp/fetch-docs.yaml +52 -0
- package/examples/context7-mcp/resolve-library.yaml +31 -0
- package/examples/context7-mcp/write-brief.yaml +52 -0
- package/examples/feature-loop/README.md +104 -0
- package/examples/feature-loop/address-feedback.yaml +148 -0
- package/examples/feature-loop/align.yaml +116 -0
- package/examples/feature-loop/decompose.yaml +86 -0
- package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
- package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
- package/examples/feature-loop/feature-loop.task.yaml +25 -0
- package/examples/feature-loop/implement.yaml +128 -0
- package/examples/feature-loop/plan.yaml +111 -0
- package/examples/feature-loop/publish.yaml +167 -0
- package/examples/feature-loop/review.yaml +146 -0
- package/examples/feature-loop/verify.yaml +106 -0
- package/examples/feedback-loop/README.md +72 -0
- package/examples/feedback-loop/VERIFY.md +208 -0
- package/examples/feedback-loop/continue-only.task.yaml +4 -0
- package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
- package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
- package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
- package/examples/feedback-loop/implement.yaml +14 -0
- package/examples/feedback-loop/plan.yaml +14 -0
- package/examples/feedback-loop/review.yaml +15 -0
- package/examples/feedback-loop/send-back-once.task.yaml +6 -0
- package/examples/feedback-loop/submit.yaml +12 -0
- package/examples/generic-fan-in/README.md +151 -0
- package/examples/generic-fan-in/clarify.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
- package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
- package/examples/generic-fan-in/research.yaml +45 -0
- package/examples/generic-fan-in/synthesize.yaml +66 -0
- package/examples/generic-fan-in/validation.yaml +45 -0
- package/examples/github-release/README.md +78 -0
- package/examples/github-release/draft-release-notes.yaml +64 -0
- package/examples/github-release/github-release.pipeline.yaml +11 -0
- package/examples/github-release/github-release.task.yaml +13 -0
- package/examples/github-release/publish-github-release.yaml +64 -0
- package/examples/hello-world/README.md +28 -0
- package/examples/hello-world/hello.pipeline.yaml +4 -0
- package/examples/hello-world/my-task.task.yaml +6 -0
- package/examples/hello-world/research.yaml +18 -0
- package/examples/mcp-hitl-tour/README.md +113 -0
- package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
- package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
- package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
- package/examples/mcp-hitl-tour/gather.yaml +31 -0
- package/examples/mcp-hitl-tour/intake.yaml +62 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
- package/examples/mcp-hitl-tour/polish.yaml +33 -0
- package/examples/mcp-hitl-tour/review.yaml +17 -0
- package/examples/mcp-hitl-tour/ship.yaml +25 -0
- package/examples/oss-issue-contribution/README.md +218 -0
- package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
- package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
- package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
- package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
- package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
- package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
- package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
- package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
- package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
- package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
- package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
- package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
- package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
- package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
- package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
- package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
- package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
- package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
- package/examples/oss-quick-fix/README.md +65 -0
- package/examples/oss-quick-fix/implement-fix.yaml +84 -0
- package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
- package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
- package/examples/oss-quick-fix/ship-fix.yaml +81 -0
- package/examples/oss-quick-fix/understand-issue.yaml +67 -0
- package/examples/oss-quick-fix/verify-fix.yaml +73 -0
- package/examples/plan-review/README.md +37 -0
- package/examples/plan-review/plan-review-followup.yaml +13 -0
- package/examples/plan-review/plan-review.pipeline.yaml +9 -0
- package/examples/plan-review/plan-review.task.yaml +9 -0
- package/examples/plan-review/plan-review.yaml +25 -0
- package/examples/playwright-mcp/README.md +39 -0
- package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
- package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
- package/examples/playwright-mcp/screenshot.yaml +40 -0
- package/examples/retry-tour/README.md +75 -0
- package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
- package/examples/retry-tour/retry-tour.task.yaml +9 -0
- package/examples/route-if-tour/README.md +202 -0
- package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
- package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
- package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
- package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
- package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
- package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
- package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
- package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
- package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
- package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
- package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
- package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
- package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
- package/examples/route-wiring-smoke-test/README.md +377 -0
- package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
- package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
- package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
- package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
- package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
- package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
- package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
- package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
- package/examples/ship-feature/README.md +190 -0
- package/examples/ship-feature/feat-address-feedback.yaml +119 -0
- package/examples/ship-feature/feat-implement.yaml +180 -0
- package/examples/ship-feature/feat-plan.yaml +120 -0
- package/examples/ship-feature/feat-review.yaml +109 -0
- package/examples/ship-feature/feat-ship.yaml +203 -0
- package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
- package/examples/ship-feature/ship-feature.task.yaml +78 -0
- package/examples/stage-mcp/README.md +145 -0
- package/examples/stage-mcp/echo-mcp.mjs +20 -0
- package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
- package/examples/stage-mcp/use-echo.yaml +20 -0
- package/examples/stageflow.yaml +51 -0
- package/examples/verify-tour/README.md +80 -0
- package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
- package/examples/verify-tour/verify-tour.task.yaml +11 -0
- package/package.json +9 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +13 -5
- package/skills/stageflow/scripts/detect-host.mjs +14 -1
- package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
- package/skills/stageflow-author/SKILL.md +4 -3
- package/skills/stageflow-author/references/catalog-mapping.md +16 -0
- package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
- package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
- package/skills/stageflow-run/SKILL.md +22 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
- package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
- package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
- package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
- package/skills/stageflow-setup/SKILL.md +51 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { listModelsForContext, listPipelinesForContext, listTasksForContext, } from "./browseCatalog.js";
|
|
2
|
+
import { loadStageflowManifestOutcome, } from "./loadStageflowManifest.js";
|
|
3
|
+
import { findCatalogRoot, isRootReadable, resolveCatalogRoots, } from "./resolveCatalogRoots.js";
|
|
4
|
+
export const EMPTY_CATALOG_LIST_TIP = "No catalog entries listed. Register a project root (POST /api/projects or local sf run / ensure), ensure stageflow.yaml exists at that root, then retry list_pipelines / list_tasks. Packaged examples use project_root \"examples\" when present. Git is not required for discovery.";
|
|
5
|
+
function listTip(itemsLength, root_errors) {
|
|
6
|
+
if (itemsLength > 0)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (root_errors.some((e) => e.code === "unknown_project_root")) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return EMPTY_CATALOG_LIST_TIP;
|
|
12
|
+
}
|
|
13
|
+
async function catalogContextForRoot(root) {
|
|
14
|
+
const outcome = await loadStageflowManifestOutcome(root.path);
|
|
15
|
+
if (!outcome.ok) {
|
|
16
|
+
return {
|
|
17
|
+
projectRoot: root.path,
|
|
18
|
+
manifest: null,
|
|
19
|
+
manifestStatus: "invalid",
|
|
20
|
+
issues: outcome.issues,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
projectRoot: root.path,
|
|
25
|
+
manifest: outcome.value,
|
|
26
|
+
manifestStatus: "ok",
|
|
27
|
+
issues: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function selectRoots(options) {
|
|
31
|
+
const roots = await resolveCatalogRoots(options);
|
|
32
|
+
const root_errors = [];
|
|
33
|
+
if (options.projectRootFilter !== undefined) {
|
|
34
|
+
const match = findCatalogRoot(roots, options.projectRootFilter);
|
|
35
|
+
if (match === undefined) {
|
|
36
|
+
return {
|
|
37
|
+
roots,
|
|
38
|
+
selected: [],
|
|
39
|
+
root_errors: [
|
|
40
|
+
{
|
|
41
|
+
project_root: options.projectRootFilter,
|
|
42
|
+
code: "unknown_project_root",
|
|
43
|
+
message: `Unknown project_root: ${options.projectRootFilter}`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (!(await isRootReadable(match.path))) {
|
|
49
|
+
return {
|
|
50
|
+
roots,
|
|
51
|
+
selected: [],
|
|
52
|
+
root_errors: [
|
|
53
|
+
{
|
|
54
|
+
project_root: match.project_root,
|
|
55
|
+
code: "catalog_root_unreadable",
|
|
56
|
+
message: `Catalog root is unreadable: ${match.project_root}`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return { roots, selected: [match], root_errors };
|
|
62
|
+
}
|
|
63
|
+
const selected = [];
|
|
64
|
+
for (const root of roots) {
|
|
65
|
+
if (!(await isRootReadable(root.path))) {
|
|
66
|
+
root_errors.push({
|
|
67
|
+
project_root: root.project_root,
|
|
68
|
+
code: "catalog_root_unreadable",
|
|
69
|
+
message: `Catalog root is unreadable: ${root.project_root}`,
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
selected.push(root);
|
|
74
|
+
}
|
|
75
|
+
return { roots, selected, root_errors };
|
|
76
|
+
}
|
|
77
|
+
function withListTip(result) {
|
|
78
|
+
const tip = listTip(result.items.length, result.root_errors);
|
|
79
|
+
return tip !== undefined ? { ...result, tip } : result;
|
|
80
|
+
}
|
|
81
|
+
export async function listPipelinesMultiProject(options) {
|
|
82
|
+
const { roots, selected, root_errors } = await selectRoots(options);
|
|
83
|
+
const items = [];
|
|
84
|
+
for (const root of selected) {
|
|
85
|
+
try {
|
|
86
|
+
const ctx = await catalogContextForRoot(root);
|
|
87
|
+
const pipelines = await listPipelinesForContext(ctx);
|
|
88
|
+
for (const p of pipelines) {
|
|
89
|
+
items.push({ ...p, project_root: root.project_root });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
root_errors.push({
|
|
94
|
+
project_root: root.project_root,
|
|
95
|
+
code: "catalog_root_unreadable",
|
|
96
|
+
message: err instanceof Error ? err.message : String(err),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return withListTip({ items, root_errors, roots });
|
|
101
|
+
}
|
|
102
|
+
export async function listTasksMultiProject(options) {
|
|
103
|
+
const { roots, selected, root_errors } = await selectRoots(options);
|
|
104
|
+
const items = [];
|
|
105
|
+
for (const root of selected) {
|
|
106
|
+
try {
|
|
107
|
+
const ctx = await catalogContextForRoot(root);
|
|
108
|
+
const tasks = await listTasksForContext(ctx);
|
|
109
|
+
for (const t of tasks) {
|
|
110
|
+
items.push({ ...t, project_root: root.project_root });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
root_errors.push({
|
|
115
|
+
project_root: root.project_root,
|
|
116
|
+
code: "catalog_root_unreadable",
|
|
117
|
+
message: err instanceof Error ? err.message : String(err),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return withListTip({ items, root_errors, roots });
|
|
122
|
+
}
|
|
123
|
+
export async function listModelsMultiProject(options) {
|
|
124
|
+
const { roots, selected, root_errors } = await selectRoots(options);
|
|
125
|
+
const items = [];
|
|
126
|
+
const modelSet = new Set();
|
|
127
|
+
for (const root of selected) {
|
|
128
|
+
try {
|
|
129
|
+
const ctx = await catalogContextForRoot(root);
|
|
130
|
+
const models = await listModelsForContext(ctx);
|
|
131
|
+
for (const id of models) {
|
|
132
|
+
modelSet.add(id);
|
|
133
|
+
items.push({ id, project_root: root.project_root });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
root_errors.push({
|
|
138
|
+
project_root: root.project_root,
|
|
139
|
+
code: "catalog_root_unreadable",
|
|
140
|
+
message: err instanceof Error ? err.message : String(err),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
items,
|
|
146
|
+
models: [...modelSet].sort((a, b) => a.localeCompare(b)),
|
|
147
|
+
root_errors,
|
|
148
|
+
roots,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
9
9
|
import { parseStageMcp } from "./loadStage.js";
|
|
10
|
+
import { parseStageSecrets } from "../runtime/stageSecretDecl.js";
|
|
11
|
+
import { parseStageBrowser } from "./stageBrowser.js";
|
|
12
|
+
import { parseToolRequires } from "./toolRequires.js";
|
|
10
13
|
import { legacyAuthoringRejected, presentLegacyKeys } from "./legacyYaml.js";
|
|
11
14
|
import { compileTargetContract, dialectFromKeys, mixedDialectIssue, } from "./yamlDialect.js";
|
|
12
15
|
import { BODY_KEYS, isAllowedPipelineStageEntryKey, } from "./pipelineStageKeys.js";
|
|
@@ -39,7 +42,12 @@ function extractBodyRaw(raw) {
|
|
|
39
42
|
return body;
|
|
40
43
|
}
|
|
41
44
|
function hasBodyKey(raw) {
|
|
42
|
-
return Object.keys(raw).some((key) => BODY_KEYS.has(key) &&
|
|
45
|
+
return Object.keys(raw).some((key) => BODY_KEYS.has(key) &&
|
|
46
|
+
key !== "skill" &&
|
|
47
|
+
key !== "mcp" &&
|
|
48
|
+
key !== "secrets" &&
|
|
49
|
+
key !== "requires" &&
|
|
50
|
+
key !== "browser");
|
|
43
51
|
}
|
|
44
52
|
function readSkill(raw) {
|
|
45
53
|
if (raw.skill === undefined)
|
|
@@ -112,6 +120,21 @@ export function normalizePipelineStageEntries(rawEntries, ctx) {
|
|
|
112
120
|
if (!mcpOutcome.ok)
|
|
113
121
|
return mcpOutcome;
|
|
114
122
|
const mcp = mcpOutcome.value;
|
|
123
|
+
const secretsOutcome = parseStageSecrets(raw.secrets, `entry at index ${index} in ${declaringPath}`);
|
|
124
|
+
if (!secretsOutcome.ok)
|
|
125
|
+
return secretsOutcome;
|
|
126
|
+
const secrets = secretsOutcome.value;
|
|
127
|
+
const requiresOutcome = parseToolRequires(raw.requires, `stage entry at index ${index} in ${declaringPath}`, {
|
|
128
|
+
code: "stage.invalid_requires",
|
|
129
|
+
category: "stage",
|
|
130
|
+
});
|
|
131
|
+
if (!requiresOutcome.ok)
|
|
132
|
+
return requiresOutcome;
|
|
133
|
+
const requires = requiresOutcome.value;
|
|
134
|
+
const browserOutcome = parseStageBrowser(raw.browser, `entry at index ${index} in ${declaringPath}`, typeof raw.id === "string" ? raw.id : undefined);
|
|
135
|
+
if (!browserOutcome.ok)
|
|
136
|
+
return browserOutcome;
|
|
137
|
+
const browser = browserOutcome.value;
|
|
115
138
|
if (uses && hasBody) {
|
|
116
139
|
return loadFailure([
|
|
117
140
|
{
|
|
@@ -339,6 +362,9 @@ export function normalizePipelineStageEntries(rawEntries, ctx) {
|
|
|
339
362
|
...(entryFlag !== undefined ? { entry: entryFlag } : {}),
|
|
340
363
|
...(skill !== undefined ? { skill } : {}),
|
|
341
364
|
...(mcp !== undefined ? { mcp } : {}),
|
|
365
|
+
...(secrets !== undefined ? { secrets } : {}),
|
|
366
|
+
...(requires !== undefined ? { requires } : {}),
|
|
367
|
+
...(browser !== undefined ? { browser } : {}),
|
|
342
368
|
...(cloneCap !== undefined ? { clone_cap: cloneCap } : {}),
|
|
343
369
|
...(cloneMode !== undefined ? { clone_mode: cloneMode } : {}),
|
|
344
370
|
};
|
|
@@ -124,6 +124,12 @@ function parseCheck(raw, stageId, index) {
|
|
|
124
124
|
return failure(stageId, "completion", `checks[${index}]: unknown key "${unknown}"`);
|
|
125
125
|
return loadSuccess({ id, type: "payload_schema" });
|
|
126
126
|
}
|
|
127
|
+
if (raw.type === "browser_login") {
|
|
128
|
+
const unknown = hasOnlyKeys(raw, ["id", "type"]);
|
|
129
|
+
if (unknown)
|
|
130
|
+
return failure(stageId, "completion", `checks[${index}]: unknown key "${unknown}"`);
|
|
131
|
+
return loadSuccess({ id, type: "browser_login" });
|
|
132
|
+
}
|
|
127
133
|
if (raw.type === "gate") {
|
|
128
134
|
const unknown = hasOnlyKeys(raw, ["id", "type", "kind"]);
|
|
129
135
|
if (unknown)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CreateDraftPackageInput, type DraftPackageWriteResult } from "./draftPackage.js";
|
|
2
|
+
export type PublishDraftPackageMode = "create" | "overwrite" | "auto";
|
|
3
|
+
export type PublishDraftPackageResult = {
|
|
4
|
+
write: DraftPackageWriteResult;
|
|
5
|
+
catalogChanged: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function publishDraftPackage(projectRoot: string, input: CreateDraftPackageInput, mode: PublishDraftPackageMode): Promise<PublishDraftPackageResult>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createDraftPackage, overwriteDraftPackage, } from "./draftPackage.js";
|
|
2
|
+
import { ensureCatalogScanRoot } from "./ensureCatalogScanRoot.js";
|
|
3
|
+
export async function publishDraftPackage(projectRoot, input, mode) {
|
|
4
|
+
let write;
|
|
5
|
+
if (mode === "create") {
|
|
6
|
+
write = await createDraftPackage(projectRoot, input);
|
|
7
|
+
}
|
|
8
|
+
else if (mode === "overwrite") {
|
|
9
|
+
write = await overwriteDraftPackage(projectRoot, input);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
const created = await createDraftPackage(projectRoot, input);
|
|
13
|
+
if (created.ok || created.status !== 409) {
|
|
14
|
+
write = created;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
write = await overwriteDraftPackage(projectRoot, input);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!write.ok) {
|
|
21
|
+
return { write, catalogChanged: false };
|
|
22
|
+
}
|
|
23
|
+
const catalogChanged = await ensureCatalogScanRoot(projectRoot, input.directory);
|
|
24
|
+
return { write, catalogChanged };
|
|
25
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveStageflowContext, } from "../project/resolveStageflowContext.js";
|
|
2
2
|
export function catalogContextFromStageflow(ctx) {
|
|
3
3
|
return {
|
|
4
|
-
projectRoot: ctx.
|
|
4
|
+
projectRoot: ctx.manifestStatus === "not_git" ? null : ctx.projectRoot,
|
|
5
5
|
manifest: ctx.manifest,
|
|
6
6
|
manifestStatus: ctx.manifestStatus,
|
|
7
7
|
issues: ctx.manifestIssues,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RunStore } from "../runstore/port.js";
|
|
2
|
+
export type CatalogRootKind = "registered" | "seeded";
|
|
3
|
+
export type CatalogRoot = {
|
|
4
|
+
/** Wire id: absolute path for registered; symbolic id for seeded (e.g. "examples"). */
|
|
5
|
+
project_root: string;
|
|
6
|
+
/** Absolute filesystem path used for browsing. */
|
|
7
|
+
path: string;
|
|
8
|
+
kind: CatalogRootKind;
|
|
9
|
+
read_only: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type ResolveCatalogRootsOptions = {
|
|
12
|
+
store: RunStore;
|
|
13
|
+
/** Unused for catalog membership; retained so call sites may still pass Host cwd. */
|
|
14
|
+
bootCwd?: string;
|
|
15
|
+
/** Optional seeded roots (U10); default none. */
|
|
16
|
+
seededRoots?: Array<{
|
|
17
|
+
id: string;
|
|
18
|
+
path: string;
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Root set = registered store roots ∪ seeded roots.
|
|
23
|
+
* Wire project_root for seeded is the symbolic id; store/capacity use absolute paths.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveCatalogRoots(options: ResolveCatalogRootsOptions): Promise<CatalogRoot[]>;
|
|
26
|
+
export declare function isRootReadable(rootPath: string): Promise<boolean>;
|
|
27
|
+
export declare function findCatalogRoot(roots: CatalogRoot[], projectRoot: string): CatalogRoot | undefined;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { realpathSync, constants } from "node:fs";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
function realOrResolve(p) {
|
|
5
|
+
const resolved = path.resolve(p);
|
|
6
|
+
try {
|
|
7
|
+
return realpathSync(resolved);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return resolved;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Root set = registered store roots ∪ seeded roots.
|
|
15
|
+
* Wire project_root for seeded is the symbolic id; store/capacity use absolute paths.
|
|
16
|
+
*/
|
|
17
|
+
export async function resolveCatalogRoots(options) {
|
|
18
|
+
const roots = [];
|
|
19
|
+
const seenPaths = new Set();
|
|
20
|
+
const seededRoots = options.seededRoots ??
|
|
21
|
+
(await import("./seededCatalog.js")).defaultSeededRoots();
|
|
22
|
+
let registered = [];
|
|
23
|
+
try {
|
|
24
|
+
registered = await options.store.listRegisteredProjects();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
registered = [];
|
|
28
|
+
}
|
|
29
|
+
for (const root of registered) {
|
|
30
|
+
const abs = realOrResolve(root);
|
|
31
|
+
if (seenPaths.has(abs))
|
|
32
|
+
continue;
|
|
33
|
+
seenPaths.add(abs);
|
|
34
|
+
roots.push({
|
|
35
|
+
project_root: abs,
|
|
36
|
+
path: abs,
|
|
37
|
+
kind: "registered",
|
|
38
|
+
read_only: false,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
for (const seeded of seededRoots) {
|
|
42
|
+
const abs = realOrResolve(seeded.path);
|
|
43
|
+
if (seenPaths.has(abs))
|
|
44
|
+
continue;
|
|
45
|
+
seenPaths.add(abs);
|
|
46
|
+
roots.push({
|
|
47
|
+
project_root: seeded.id,
|
|
48
|
+
path: abs,
|
|
49
|
+
kind: "seeded",
|
|
50
|
+
read_only: true,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return roots;
|
|
54
|
+
}
|
|
55
|
+
export async function isRootReadable(rootPath) {
|
|
56
|
+
try {
|
|
57
|
+
await access(rootPath, constants.R_OK);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function findCatalogRoot(roots, projectRoot) {
|
|
65
|
+
if (!path.isAbsolute(projectRoot)) {
|
|
66
|
+
return roots.find((r) => r.project_root === projectRoot);
|
|
67
|
+
}
|
|
68
|
+
const normalized = realOrResolve(projectRoot);
|
|
69
|
+
const resolved = path.resolve(projectRoot);
|
|
70
|
+
return roots.find((r) => r.project_root === projectRoot ||
|
|
71
|
+
r.path === projectRoot ||
|
|
72
|
+
r.project_root === resolved ||
|
|
73
|
+
r.path === resolved ||
|
|
74
|
+
r.project_root === normalized ||
|
|
75
|
+
r.path === normalized);
|
|
76
|
+
}
|
|
@@ -8,6 +8,12 @@ export type ModelSelection = {
|
|
|
8
8
|
/** Stage yaml / inline `model`; overrides pipeline/global. */
|
|
9
9
|
stage?: string;
|
|
10
10
|
};
|
|
11
|
+
export type ModelAuthoredTier = "stage" | "pipeline" | "global";
|
|
12
|
+
export type ResolvedModelSelection = {
|
|
13
|
+
model: string;
|
|
14
|
+
tier: ModelAuthoredTier;
|
|
15
|
+
};
|
|
16
|
+
export declare function modelAuthoredTier(selection: ModelSelection): ModelAuthoredTier;
|
|
11
17
|
/**
|
|
12
18
|
* stage > pipeline > global. No silent hardcoded fallback — unset is a load error.
|
|
13
19
|
* Present-but-empty / whitespace follows parseModelField (load failure, not "").
|
|
@@ -15,6 +21,6 @@ export type ModelSelection = {
|
|
|
15
21
|
export declare function resolveModelOutcome(selection: ModelSelection, ctx: {
|
|
16
22
|
stageId: string;
|
|
17
23
|
pipelineId: string;
|
|
18
|
-
}): LoadOutcome<
|
|
24
|
+
}): LoadOutcome<ResolvedModelSelection>;
|
|
19
25
|
/** The global tier's model id from an already-loaded manifest, or undefined when missing/unset. */
|
|
20
26
|
export declare function globalModelFromManifest(loaded: LoadedManifest | null): string | undefined;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
2
2
|
import { parseModelField } from "./modelField.js";
|
|
3
|
+
export function modelAuthoredTier(selection) {
|
|
4
|
+
if (selection.stage !== undefined)
|
|
5
|
+
return "stage";
|
|
6
|
+
if (selection.pipeline !== undefined)
|
|
7
|
+
return "pipeline";
|
|
8
|
+
return "global";
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* stage > pipeline > global. No silent hardcoded fallback — unset is a load error.
|
|
5
12
|
* Present-but-empty / whitespace follows parseModelField (load failure, not "").
|
|
@@ -27,7 +34,10 @@ export function resolveModelOutcome(selection, ctx) {
|
|
|
27
34
|
},
|
|
28
35
|
]);
|
|
29
36
|
}
|
|
30
|
-
return loadSuccess(
|
|
37
|
+
return loadSuccess({
|
|
38
|
+
model: parsed.value,
|
|
39
|
+
tier: modelAuthoredTier(selection),
|
|
40
|
+
});
|
|
31
41
|
}
|
|
32
42
|
/** The global tier's model id from an already-loaded manifest, or undefined when missing/unset. */
|
|
33
43
|
export function globalModelFromManifest(loaded) {
|
|
@@ -18,7 +18,7 @@ function wrapRawStagesForNormalize(rawStages, ctx) {
|
|
|
18
18
|
}
|
|
19
19
|
const id = typeof raw.id === "string" && raw.id ? raw.id : undefined;
|
|
20
20
|
const hasUses = typeof raw.uses === "string";
|
|
21
|
-
const hasBody = Object.keys(raw).some((key) => BODY_KEYS.has(key) && key !== "skill" && key !== "mcp");
|
|
21
|
+
const hasBody = Object.keys(raw).some((key) => BODY_KEYS.has(key) && key !== "skill" && key !== "mcp" && key !== "browser");
|
|
22
22
|
if (hasUses || hasBody || !id) {
|
|
23
23
|
return { raw, declaringPath: ctx.path };
|
|
24
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type StageMcpErrorCode = "missing_catalog" | "unknown_server" | "reserved_name" | "unresolved_var" | "invalid_config" | "connect_failed";
|
|
1
|
+
export type StageMcpErrorCode = "missing_catalog" | "unknown_server" | "reserved_name" | "unresolved_var" | "invalid_config" | "untrusted_config_origin" | "connect_failed";
|
|
2
2
|
export declare class StageMcpError extends Error {
|
|
3
3
|
readonly code: StageMcpErrorCode;
|
|
4
4
|
constructor(message: string, code: StageMcpErrorCode);
|
|
@@ -15,6 +15,7 @@ export type InspectedMcpCatalog = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare function mcpCatalogPath(projectRoot: string): string;
|
|
17
17
|
export declare function parseMcpCatalog(raw: string, catalogPath?: string): McpCatalogServers;
|
|
18
|
+
export declare function mcpCatalogExists(projectRoot: string): Promise<boolean>;
|
|
18
19
|
export declare function loadMcpCatalog(projectRoot: string): Promise<InspectedMcpCatalog>;
|
|
19
20
|
export type ProjectMcpCatalogTransport = "stdio" | "http";
|
|
20
21
|
export type ProjectMcpCatalogEntry = {
|
|
@@ -32,4 +33,11 @@ export declare function resolveStageMcpServers(options: {
|
|
|
32
33
|
projectRoot: string;
|
|
33
34
|
allowlist?: readonly string[];
|
|
34
35
|
env: NodeJS.ProcessEnv;
|
|
36
|
+
stageId?: string;
|
|
37
|
+
bindingKind?: "repository" | "checkout" | "none";
|
|
38
|
+
trustWorkspaceConfig?: string[];
|
|
39
|
+
/** Host project root used for trust_workspace_config allowlist matching. */
|
|
40
|
+
trustProjectRoot?: string;
|
|
41
|
+
/** When true, .mcp.json is treated as workspace-sourced. */
|
|
42
|
+
workspaceSourced?: boolean;
|
|
35
43
|
}): Promise<ResolvedMcpServers>;
|
|
@@ -51,6 +51,18 @@ export function parseMcpCatalog(raw, catalogPath = MCP_CATALOG_FILENAME) {
|
|
|
51
51
|
}
|
|
52
52
|
return servers;
|
|
53
53
|
}
|
|
54
|
+
export async function mcpCatalogExists(projectRoot) {
|
|
55
|
+
try {
|
|
56
|
+
await readFile(mcpCatalogPath(projectRoot), "utf8");
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const code = err.code;
|
|
61
|
+
if (code === "ENOENT")
|
|
62
|
+
return false;
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
54
66
|
export async function loadMcpCatalog(projectRoot) {
|
|
55
67
|
const catalogPath = mcpCatalogPath(projectRoot);
|
|
56
68
|
let raw;
|
|
@@ -108,7 +120,7 @@ export function assertMcpAllowlistKnown(servers, allowlist) {
|
|
|
108
120
|
const INTERPOLATION_TOKEN = /\$\{([^}]*)\}/g;
|
|
109
121
|
const ENV_VAR_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
110
122
|
const ENV_VAR_WITH_DEFAULT = /^([A-Za-z_][A-Za-z0-9_]*):-(.*)$/;
|
|
111
|
-
function interpolateString(value, env, serverName) {
|
|
123
|
+
function interpolateString(value, env, serverName, stageId) {
|
|
112
124
|
return value.replace(INTERPOLATION_TOKEN, (_match, inner) => {
|
|
113
125
|
const withDefault = ENV_VAR_WITH_DEFAULT.exec(inner);
|
|
114
126
|
if (withDefault) {
|
|
@@ -120,24 +132,27 @@ function interpolateString(value, env, serverName) {
|
|
|
120
132
|
if (found !== undefined) {
|
|
121
133
|
return found;
|
|
122
134
|
}
|
|
123
|
-
|
|
135
|
+
const stagePart = stageId !== undefined ? ` (stage "${stageId}")` : "";
|
|
136
|
+
throw new StageMcpError(`Unresolved MCP catalog variable "${inner}" for server "${serverName}"${stagePart}. Declare it in secrets: (use as: env for tokens needed in MCP env) or use \${${inner}:-default}.`, "unresolved_var");
|
|
124
137
|
}
|
|
125
138
|
throw new StageMcpError(`MCP catalog server "${serverName}" has an invalid interpolation form`, "invalid_config");
|
|
126
139
|
});
|
|
127
140
|
}
|
|
128
|
-
function interpolateField(key, value, env, serverName) {
|
|
141
|
+
function interpolateField(key, value, env, serverName, stageId) {
|
|
129
142
|
if ((key === "command" || key === "url" || key === "cwd") && typeof value === "string") {
|
|
130
|
-
return interpolateString(value, env, serverName);
|
|
143
|
+
return interpolateString(value, env, serverName, stageId);
|
|
131
144
|
}
|
|
132
145
|
if (key === "args" && Array.isArray(value)) {
|
|
133
|
-
return value.map((item) => typeof item === "string"
|
|
146
|
+
return value.map((item) => typeof item === "string"
|
|
147
|
+
? interpolateString(item, env, serverName, stageId)
|
|
148
|
+
: item);
|
|
134
149
|
}
|
|
135
150
|
if ((key === "env" || key === "headers") && isPlainObject(value)) {
|
|
136
151
|
const copied = {};
|
|
137
152
|
for (const [field, fieldValue] of Object.entries(value)) {
|
|
138
153
|
copied[field] =
|
|
139
154
|
typeof fieldValue === "string"
|
|
140
|
-
? interpolateString(fieldValue, env, serverName)
|
|
155
|
+
? interpolateString(fieldValue, env, serverName, stageId)
|
|
141
156
|
: fieldValue;
|
|
142
157
|
}
|
|
143
158
|
return copied;
|
|
@@ -185,10 +200,10 @@ function stampSpawnRoot(resolved, projectRoot, serverName) {
|
|
|
185
200
|
}
|
|
186
201
|
return resolved;
|
|
187
202
|
}
|
|
188
|
-
function interpolateServer(entry, env, serverName, projectRoot) {
|
|
203
|
+
function interpolateServer(entry, env, serverName, projectRoot, stageId) {
|
|
189
204
|
const resolved = {};
|
|
190
205
|
for (const [key, value] of Object.entries(entry)) {
|
|
191
|
-
resolved[key] = interpolateField(key, value, env, serverName);
|
|
206
|
+
resolved[key] = interpolateField(key, value, env, serverName, stageId);
|
|
192
207
|
}
|
|
193
208
|
return stampSpawnRoot(resolved, projectRoot, serverName);
|
|
194
209
|
}
|
|
@@ -197,11 +212,23 @@ export async function resolveStageMcpServers(options) {
|
|
|
197
212
|
if (allowlist.length === 0) {
|
|
198
213
|
return {};
|
|
199
214
|
}
|
|
215
|
+
if (options.workspaceSourced === true) {
|
|
216
|
+
const { decideWorkspaceConfigTrust } = await import("./configOrigin.js");
|
|
217
|
+
const decision = decideWorkspaceConfigTrust({
|
|
218
|
+
bindingKind: options.bindingKind ?? "none",
|
|
219
|
+
projectRoot: options.trustProjectRoot ?? options.projectRoot,
|
|
220
|
+
trustWorkspaceConfig: options.trustWorkspaceConfig,
|
|
221
|
+
source: "workspace",
|
|
222
|
+
});
|
|
223
|
+
if (!decision.allow) {
|
|
224
|
+
throw new StageMcpError(decision.message ?? "untrusted_config_origin", "untrusted_config_origin");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
200
227
|
const catalog = await loadMcpCatalog(options.projectRoot);
|
|
201
228
|
assertMcpAllowlistKnown(catalog.servers, allowlist);
|
|
202
229
|
const resolved = {};
|
|
203
230
|
for (const name of allowlist) {
|
|
204
|
-
resolved[name] = interpolateServer(catalog.servers[name], options.env, name, options.projectRoot);
|
|
231
|
+
resolved[name] = interpolateServer(catalog.servers[name], options.env, name, options.projectRoot, options.stageId);
|
|
205
232
|
}
|
|
206
233
|
return resolved;
|
|
207
234
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { LoadedManifest } from "../types/stageflowManifest.js";
|
|
2
|
-
export type CatalogPathKind = "pipeline" | "task";
|
|
2
|
+
export type CatalogPathKind = "pipeline" | "task" | "trigger";
|
|
3
3
|
export declare function isExcluded(repoRelPath: string, exclude: string[] | undefined): boolean;
|
|
4
4
|
export declare function scanCatalogPaths(manifest: LoadedManifest, kind: CatalogPathKind): Promise<string[]>;
|
|
@@ -60,8 +60,12 @@ async function expandCatalogEntry(projectRoot, entry, kind, pattern) {
|
|
|
60
60
|
}
|
|
61
61
|
export async function scanCatalogPaths(manifest, kind) {
|
|
62
62
|
const { projectRoot, manifest: doc, patterns } = manifest;
|
|
63
|
-
const entries = kind === "pipeline"
|
|
64
|
-
|
|
63
|
+
const entries = kind === "pipeline"
|
|
64
|
+
? doc.catalog.pipelines
|
|
65
|
+
: kind === "task"
|
|
66
|
+
? doc.catalog.tasks
|
|
67
|
+
: (doc.catalog.triggers ?? []);
|
|
68
|
+
const pattern = kind === "pipeline" ? patterns.pipeline : kind === "task" ? patterns.task : patterns.trigger;
|
|
65
69
|
const exclude = doc.catalog.exclude;
|
|
66
70
|
const seen = new Set();
|
|
67
71
|
const resolved = [];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class SecretFromEnvError extends Error {
|
|
2
|
+
readonly code = "config_invalid";
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Read a secret from `NAME` or `NAME_FILE`. Both set → error.
|
|
7
|
+
* File values trim exactly one trailing newline (`\n` or `\r\n`).
|
|
8
|
+
*/
|
|
9
|
+
export declare function readSecretFromEnvOrFile(env: NodeJS.ProcessEnv, name: string): string | undefined;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
export class SecretFromEnvError extends Error {
|
|
3
|
+
code = "config_invalid";
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "SecretFromEnvError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Read a secret from `NAME` or `NAME_FILE`. Both set → error.
|
|
11
|
+
* File values trim exactly one trailing newline (`\n` or `\r\n`).
|
|
12
|
+
*/
|
|
13
|
+
export function readSecretFromEnvOrFile(env, name) {
|
|
14
|
+
const fileKey = `${name}_FILE`;
|
|
15
|
+
const plain = env[name];
|
|
16
|
+
const filePath = env[fileKey];
|
|
17
|
+
const hasPlain = plain !== undefined && plain.length > 0;
|
|
18
|
+
const hasFile = filePath !== undefined && filePath.length > 0;
|
|
19
|
+
if (hasPlain && hasFile) {
|
|
20
|
+
throw new SecretFromEnvError(`Set only one of ${name} or ${fileKey}, not both`);
|
|
21
|
+
}
|
|
22
|
+
if (hasFile) {
|
|
23
|
+
try {
|
|
24
|
+
return readFileSync(filePath, "utf8").replace(/\r?\n$/, "");
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
28
|
+
throw new SecretFromEnvError(`Failed to read ${fileKey}=${filePath}: ${detail}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (hasPlain)
|
|
32
|
+
return plain;
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Symbolic wire id for the packaged examples catalog root. */
|
|
2
|
+
export declare const SEEDED_EXAMPLES_ID = "examples";
|
|
3
|
+
/**
|
|
4
|
+
* Absolute path to packaged `examples/` when present next to the package root.
|
|
5
|
+
* Does not git-init; callers build CatalogContext with fixed projectRoot + manifest.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveSeededExamplesPath(fromUrl?: string): string | undefined;
|
|
8
|
+
export declare function defaultSeededRoots(): Array<{
|
|
9
|
+
id: string;
|
|
10
|
+
path: string;
|
|
11
|
+
}>;
|