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
|
@@ -12,6 +12,8 @@ import { recoveryRequiresCompletionIssue } from "./parseCompletionContract.js";
|
|
|
12
12
|
import { validateCompletionContractForStage } from "./validateCompletionContract.js";
|
|
13
13
|
import { applyCloneChains } from "./cloneChain.js";
|
|
14
14
|
import { collectRouteIfSchemaIssues, collectRouteIfIllegalCombos, collectRouteAllGatedWarnings, } from "./routeIf.js";
|
|
15
|
+
import { mergeToolRequires } from "./toolRequires.js";
|
|
16
|
+
import { withBrowserRequires } from "./stageBrowser.js";
|
|
15
17
|
function schemaCompileIssue(stageId, field, err, pipelineId) {
|
|
16
18
|
const message = err instanceof Error ? err.message : String(err);
|
|
17
19
|
if (err instanceof UnresolvedSchemaRefError) {
|
|
@@ -128,7 +130,7 @@ export async function loadPipelineFromObject(raw, options = {}) {
|
|
|
128
130
|
}
|
|
129
131
|
async function buildLoadedPipelineFromMerge(merge, options) {
|
|
130
132
|
const { projectRoot, requireIo, pipelinePath } = options;
|
|
131
|
-
const { entries: rawEntries, pipelineId, agent: pipelineAgent, model: pipelineModel, schemas: pipelineSchemas, warnings: mergeWarnings, } = merge;
|
|
133
|
+
const { entries: rawEntries, pipelineId, agent: pipelineAgent, model: pipelineModel, schemas: pipelineSchemas, requires: pipelineRequires, warnings: mergeWarnings, } = merge;
|
|
132
134
|
const ctx = { pipelineId, path: pipelinePath };
|
|
133
135
|
const warnings = [...mergeWarnings];
|
|
134
136
|
const normalizeOutcome = normalizePipelineStageEntries(rawEntries, ctx);
|
|
@@ -181,7 +183,23 @@ async function buildLoadedPipelineFromMerge(merge, options) {
|
|
|
181
183
|
if (!inlineOutcome.ok) {
|
|
182
184
|
return loadFailure(inlineOutcome.issues);
|
|
183
185
|
}
|
|
184
|
-
|
|
186
|
+
let stage = inlineOutcome.value;
|
|
187
|
+
if (entry.requires !== undefined) {
|
|
188
|
+
const merged = mergeToolRequires([stage.requires, entry.requires], { pipelineId, label: `stage "${entry.id}"` });
|
|
189
|
+
if (!merged.ok)
|
|
190
|
+
return loadFailure(merged.issues);
|
|
191
|
+
stage = { ...stage, requires: merged.value };
|
|
192
|
+
}
|
|
193
|
+
const inlineRequires = withBrowserRequires(stage, {
|
|
194
|
+
pipelineId,
|
|
195
|
+
stageId: entry.id,
|
|
196
|
+
});
|
|
197
|
+
if (!inlineRequires.ok)
|
|
198
|
+
return loadFailure(inlineRequires.issues);
|
|
199
|
+
if (inlineRequires.value !== undefined) {
|
|
200
|
+
stage = { ...stage, requires: inlineRequires.value };
|
|
201
|
+
}
|
|
202
|
+
stages.push(stage);
|
|
185
203
|
stageSources[stageId] = { kind: "inline" };
|
|
186
204
|
continue;
|
|
187
205
|
}
|
|
@@ -229,10 +247,25 @@ async function buildLoadedPipelineFromMerge(merge, options) {
|
|
|
229
247
|
},
|
|
230
248
|
]);
|
|
231
249
|
}
|
|
250
|
+
let stageRequires = stageOutcome.value.requires;
|
|
251
|
+
if (entry.requires !== undefined) {
|
|
252
|
+
const merged = mergeToolRequires([stageRequires, entry.requires], { pipelineId, label: `stage "${entry.id}"` });
|
|
253
|
+
if (!merged.ok)
|
|
254
|
+
return loadFailure(merged.issues);
|
|
255
|
+
stageRequires = merged.value;
|
|
256
|
+
}
|
|
257
|
+
const browser = entry.browser ?? stageOutcome.value.browser;
|
|
258
|
+
const fileRequires = withBrowserRequires({ browser, requires: stageRequires }, { pipelineId, stageId: entry.id });
|
|
259
|
+
if (!fileRequires.ok)
|
|
260
|
+
return loadFailure(fileRequires.issues);
|
|
261
|
+
stageRequires = fileRequires.value;
|
|
232
262
|
const stage = {
|
|
233
263
|
...stageOutcome.value,
|
|
264
|
+
...(browser !== undefined ? { browser } : {}),
|
|
234
265
|
...(entry.skill !== undefined ? { skill: entry.skill } : {}),
|
|
235
266
|
...(entry.mcp !== undefined ? { mcp: entry.mcp } : {}),
|
|
267
|
+
...(entry.secrets !== undefined ? { secrets: entry.secrets } : {}),
|
|
268
|
+
...(stageRequires !== undefined ? { requires: stageRequires } : {}),
|
|
236
269
|
};
|
|
237
270
|
stages.push(stage);
|
|
238
271
|
stageSources[stageId] = { kind: "file", path: entry.body.absolutePath };
|
|
@@ -282,7 +315,11 @@ async function buildLoadedPipelineFromMerge(merge, options) {
|
|
|
282
315
|
...(pipelineAgent !== undefined ? { agent: pipelineAgent } : {}),
|
|
283
316
|
...(pipelineModel !== undefined ? { model: pipelineModel } : {}),
|
|
284
317
|
...(pipelineSchemas !== undefined ? { schemas: pipelineSchemas } : {}),
|
|
318
|
+
...(pipelineRequires !== undefined ? { requires: pipelineRequires } : {}),
|
|
285
319
|
};
|
|
320
|
+
const effectiveRequires = mergeToolRequires([pipelineRequires, ...loadedStages.map((s) => s.requires)], { pipelineId });
|
|
321
|
+
if (!effectiveRequires.ok)
|
|
322
|
+
return loadFailure(effectiveRequires.issues);
|
|
286
323
|
const nodeById = new Map(dag.nodes.map((node) => [node.id, node]));
|
|
287
324
|
for (const [stageId, after] of fileAfterById) {
|
|
288
325
|
const node = nodeById.get(stageId);
|
package/dist/config/loadStage.js
CHANGED
|
@@ -7,6 +7,9 @@ import { parseModelField } from "./modelField.js";
|
|
|
7
7
|
import { allowLegacyYamlAuthoring, dialectWarningForDocument, legacyAuthoringRejected, presentLegacyKeys, } from "./legacyYaml.js";
|
|
8
8
|
import { parsePreEmitChecks } from "./parsePreEmitChecks.js";
|
|
9
9
|
import { readYamlObject } from "./readYamlObject.js";
|
|
10
|
+
import { parseStageSecrets } from "../runtime/stageSecretDecl.js";
|
|
11
|
+
import { parseToolRequires } from "./toolRequires.js";
|
|
12
|
+
import { parseStageBrowser } from "./stageBrowser.js";
|
|
10
13
|
import { classifyYamlDocument, compileTargetContract, dialectFromKeys, mixedDialectIssue, STAGE_FILE_WIRING_KEYS, } from "./yamlDialect.js";
|
|
11
14
|
const afterCompletionByStage = new WeakMap();
|
|
12
15
|
/** After-phase IR from target `verify` (`when` includes after). Stamped onto DAG `completion`. */
|
|
@@ -348,6 +351,28 @@ function parseStageFields(raw, label, entryId, deferSchemaRefs, requireIo, compi
|
|
|
348
351
|
if (mcpOutcome.value !== undefined) {
|
|
349
352
|
stage.mcp = mcpOutcome.value;
|
|
350
353
|
}
|
|
354
|
+
const secretsOutcome = parseStageSecrets(raw.secrets, label, entryId);
|
|
355
|
+
if (!secretsOutcome.ok)
|
|
356
|
+
return secretsOutcome;
|
|
357
|
+
if (secretsOutcome.value !== undefined) {
|
|
358
|
+
stage.secrets = secretsOutcome.value;
|
|
359
|
+
}
|
|
360
|
+
const requiresOutcome = parseToolRequires(raw.requires, `stage ${label}`, {
|
|
361
|
+
code: "stage.invalid_requires",
|
|
362
|
+
category: "stage",
|
|
363
|
+
stageId: entryId,
|
|
364
|
+
});
|
|
365
|
+
if (!requiresOutcome.ok)
|
|
366
|
+
return requiresOutcome;
|
|
367
|
+
if (requiresOutcome.value !== undefined) {
|
|
368
|
+
stage.requires = requiresOutcome.value;
|
|
369
|
+
}
|
|
370
|
+
const browserOutcome = parseStageBrowser(raw.browser, label, entryId);
|
|
371
|
+
if (!browserOutcome.ok)
|
|
372
|
+
return browserOutcome;
|
|
373
|
+
if (browserOutcome.value !== undefined) {
|
|
374
|
+
stage.browser = browserOutcome.value;
|
|
375
|
+
}
|
|
351
376
|
const agentField = parseAgentField(raw.agent);
|
|
352
377
|
if (!agentField.ok) {
|
|
353
378
|
return loadFailure([
|
|
@@ -6,6 +6,7 @@ import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
|
6
6
|
import { parseModelField } from "./modelField.js";
|
|
7
7
|
const DEFAULT_PIPELINE_PATTERN = "*.pipeline.yaml";
|
|
8
8
|
const DEFAULT_TASK_PATTERN = "*.task.yaml";
|
|
9
|
+
const DEFAULT_TRIGGER_PATTERN = "*.trigger.yaml";
|
|
9
10
|
export function manifestPathForProject(projectRoot) {
|
|
10
11
|
return path.join(projectRoot, "stageflow.yaml");
|
|
11
12
|
}
|
|
@@ -39,6 +40,7 @@ function parsePatterns(raw, issues) {
|
|
|
39
40
|
const defaults = {
|
|
40
41
|
pipeline: DEFAULT_PIPELINE_PATTERN,
|
|
41
42
|
task: DEFAULT_TASK_PATTERN,
|
|
43
|
+
trigger: DEFAULT_TRIGGER_PATTERN,
|
|
42
44
|
};
|
|
43
45
|
if (raw === undefined || raw === null) {
|
|
44
46
|
return defaults;
|
|
@@ -58,15 +60,24 @@ function parsePatterns(raw, issues) {
|
|
|
58
60
|
: typeof record.task === "string" && record.task.trim().length > 0
|
|
59
61
|
? record.task.trim()
|
|
60
62
|
: null;
|
|
63
|
+
const trigger = record.trigger === undefined
|
|
64
|
+
? defaults.trigger
|
|
65
|
+
: typeof record.trigger === "string" && record.trigger.trim().length > 0
|
|
66
|
+
? record.trigger.trim()
|
|
67
|
+
: null;
|
|
61
68
|
if (pipeline === null) {
|
|
62
69
|
issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.pipeline must be a string"));
|
|
63
70
|
}
|
|
64
71
|
if (task === null) {
|
|
65
72
|
issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.task must be a string"));
|
|
66
73
|
}
|
|
74
|
+
if (trigger === null) {
|
|
75
|
+
issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.trigger must be a string"));
|
|
76
|
+
}
|
|
67
77
|
return {
|
|
68
78
|
pipeline: pipeline ?? defaults.pipeline,
|
|
69
79
|
task: task ?? defaults.task,
|
|
80
|
+
trigger: trigger ?? defaults.trigger,
|
|
70
81
|
};
|
|
71
82
|
}
|
|
72
83
|
export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoot) {
|
|
@@ -109,6 +120,14 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
|
|
|
109
120
|
exclude = parsed;
|
|
110
121
|
}
|
|
111
122
|
}
|
|
123
|
+
const triggersRaw = catalogRecord.triggers;
|
|
124
|
+
let triggers;
|
|
125
|
+
if (triggersRaw !== undefined) {
|
|
126
|
+
const parsed = parseStringArray(triggersRaw, "triggers", issues);
|
|
127
|
+
if (parsed !== null) {
|
|
128
|
+
triggers = parsed;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
112
131
|
const patterns = parsePatterns(catalogRecord.patterns, issues);
|
|
113
132
|
let agent;
|
|
114
133
|
const agentField = parseAgentField(record.agent);
|
|
@@ -136,6 +155,9 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
|
|
|
136
155
|
if (exclude !== undefined) {
|
|
137
156
|
catalog.exclude = exclude;
|
|
138
157
|
}
|
|
158
|
+
if (triggers !== undefined) {
|
|
159
|
+
catalog.triggers = triggers;
|
|
160
|
+
}
|
|
139
161
|
if (catalogRecord.patterns !== undefined) {
|
|
140
162
|
catalog.patterns = {};
|
|
141
163
|
if (typeof catalogRecord.patterns.pipeline === "string") {
|
|
@@ -144,6 +166,9 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
|
|
|
144
166
|
if (typeof catalogRecord.patterns.task === "string") {
|
|
145
167
|
catalog.patterns.task = patterns.task;
|
|
146
168
|
}
|
|
169
|
+
if (typeof catalogRecord.patterns.trigger === "string") {
|
|
170
|
+
catalog.patterns.trigger = patterns.trigger;
|
|
171
|
+
}
|
|
147
172
|
}
|
|
148
173
|
const manifest = {
|
|
149
174
|
version: 1,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { TaskFile } from "../types/task.js";
|
|
2
2
|
import { type LoadOutcome } from "./loadOutcome.js";
|
|
3
|
+
/** Structural TaskFile shape only — does not enforce workspace binding XOR. */
|
|
4
|
+
export declare function coerceTaskFile(raw: unknown): TaskFile | undefined;
|
|
3
5
|
export declare function parseTaskFile(raw: unknown, source?: string): LoadOutcome<TaskFile>;
|
|
4
6
|
export declare function loadTaskFromYamlOutcome(yamlText: string, source?: string): LoadOutcome<TaskFile>;
|
|
5
7
|
export declare function loadTaskOutcome(filePath: string): Promise<LoadOutcome<TaskFile>>;
|
package/dist/config/loadTask.js
CHANGED
|
@@ -1,12 +1,60 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { parse as parseYaml } from "yaml";
|
|
3
|
+
import { resolveWorkspaceBinding } from "../runtime/workspaceBinding.js";
|
|
3
4
|
import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
4
5
|
function isPlainObject(value) {
|
|
5
6
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
+
function parseGitIdentity(raw) {
|
|
9
|
+
if (!isPlainObject(raw))
|
|
10
|
+
return undefined;
|
|
11
|
+
const identity = {};
|
|
12
|
+
if (typeof raw.name === "string")
|
|
13
|
+
identity.name = raw.name;
|
|
14
|
+
if (typeof raw.email === "string")
|
|
15
|
+
identity.email = raw.email;
|
|
16
|
+
return identity;
|
|
17
|
+
}
|
|
18
|
+
/** Structural TaskFile shape only — does not enforce workspace binding XOR. */
|
|
19
|
+
export function coerceTaskFile(raw) {
|
|
8
20
|
const record = raw;
|
|
9
21
|
if (typeof record?.id !== "string" || typeof record?.goal !== "string") {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
if (record.input !== undefined && !isPlainObject(record.input)) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
id: record.id,
|
|
29
|
+
goal: record.goal,
|
|
30
|
+
context: typeof record.context === "string" ? record.context : undefined,
|
|
31
|
+
constraints: typeof record.constraints === "string" ? record.constraints : undefined,
|
|
32
|
+
checkout: typeof record.checkout === "string" ? record.checkout : undefined,
|
|
33
|
+
...(typeof record.repository === "string" ? { repository: record.repository } : {}),
|
|
34
|
+
...(typeof record.ref === "string" ? { ref: record.ref } : {}),
|
|
35
|
+
...(typeof record.run_branch_template === "string"
|
|
36
|
+
? { run_branch_template: record.run_branch_template }
|
|
37
|
+
: {}),
|
|
38
|
+
...(isPlainObject(record.git_identity)
|
|
39
|
+
? { git_identity: parseGitIdentity(record.git_identity) }
|
|
40
|
+
: {}),
|
|
41
|
+
...(record.input !== undefined ? { input: record.input } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function parseTaskFile(raw, source = "task") {
|
|
45
|
+
const record = raw;
|
|
46
|
+
const task = coerceTaskFile(raw);
|
|
47
|
+
if (task === undefined) {
|
|
48
|
+
if (typeof record?.id === "string" && typeof record?.goal === "string") {
|
|
49
|
+
return loadFailure([
|
|
50
|
+
{
|
|
51
|
+
code: "task.invalid_shape",
|
|
52
|
+
message: `Invalid ${source}: input must be an object`,
|
|
53
|
+
category: "task",
|
|
54
|
+
taskId: record.id,
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
10
58
|
return loadFailure([
|
|
11
59
|
{
|
|
12
60
|
code: "task.invalid_shape",
|
|
@@ -16,24 +64,15 @@ export function parseTaskFile(raw, source = "task") {
|
|
|
16
64
|
},
|
|
17
65
|
]);
|
|
18
66
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
]);
|
|
67
|
+
const binding = resolveWorkspaceBinding(task);
|
|
68
|
+
if (!binding.ok) {
|
|
69
|
+
return loadFailure(binding.issues.map((issue) => {
|
|
70
|
+
if (issue.category !== "task")
|
|
71
|
+
return issue;
|
|
72
|
+
return { ...issue, taskId: task.id };
|
|
73
|
+
}));
|
|
28
74
|
}
|
|
29
|
-
return loadSuccess(
|
|
30
|
-
id: record.id,
|
|
31
|
-
goal: record.goal,
|
|
32
|
-
context: typeof record.context === "string" ? record.context : undefined,
|
|
33
|
-
constraints: typeof record.constraints === "string" ? record.constraints : undefined,
|
|
34
|
-
checkout: typeof record.checkout === "string" ? record.checkout : undefined,
|
|
35
|
-
...(record.input !== undefined ? { input: record.input } : {}),
|
|
36
|
-
});
|
|
75
|
+
return loadSuccess(task);
|
|
37
76
|
}
|
|
38
77
|
export function loadTaskFromYamlOutcome(yamlText, source = "task yaml") {
|
|
39
78
|
let raw;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TriggerFile } from "../types/trigger.js";
|
|
2
|
+
import { type LoadOutcome } from "./loadOutcome.js";
|
|
3
|
+
/** Structural TriggerFile shape only. */
|
|
4
|
+
export declare function coerceTriggerFile(raw: unknown): TriggerFile | undefined;
|
|
5
|
+
export declare function parseTriggerFile(raw: unknown, source?: string): LoadOutcome<TriggerFile>;
|
|
6
|
+
export declare function loadTriggerFromYamlOutcome(yamlText: string, source?: string): LoadOutcome<TriggerFile>;
|
|
7
|
+
export declare function loadTriggerOutcome(filePath: string): Promise<LoadOutcome<TriggerFile>>;
|
|
8
|
+
export declare function loadTriggerFromYaml(yamlText: string, source?: string): TriggerFile;
|
|
9
|
+
export declare function loadTrigger(filePath: string): Promise<TriggerFile>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
4
|
+
function isPlainObject(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function parseSchedule(raw) {
|
|
8
|
+
if (!isPlainObject(raw) || typeof raw.cron !== "string")
|
|
9
|
+
return undefined;
|
|
10
|
+
return {
|
|
11
|
+
cron: raw.cron,
|
|
12
|
+
...(typeof raw.timezone === "string" ? { timezone: raw.timezone } : {}),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function parseEvent(raw) {
|
|
16
|
+
if (!isPlainObject(raw) || typeof raw.source !== "string")
|
|
17
|
+
return undefined;
|
|
18
|
+
return {
|
|
19
|
+
source: raw.source,
|
|
20
|
+
...(isPlainObject(raw.match) ? { match: raw.match } : {}),
|
|
21
|
+
...(isPlainObject(raw.config) ? { config: raw.config } : {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Structural TriggerFile shape only. */
|
|
25
|
+
export function coerceTriggerFile(raw) {
|
|
26
|
+
const record = raw;
|
|
27
|
+
if (typeof record?.id !== "string" ||
|
|
28
|
+
typeof record?.pipeline !== "string" ||
|
|
29
|
+
typeof record?.enabled !== "boolean") {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
if (record.task !== undefined && typeof record.task !== "string") {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
if (record.kind !== "manual" && record.kind !== "schedule" && record.kind !== "event") {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
let schedule;
|
|
39
|
+
if (record.schedule !== undefined) {
|
|
40
|
+
schedule = parseSchedule(record.schedule);
|
|
41
|
+
if (schedule === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
let event;
|
|
45
|
+
if (record.event !== undefined) {
|
|
46
|
+
event = parseEvent(record.event);
|
|
47
|
+
if (event === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
id: record.id,
|
|
52
|
+
pipeline: record.pipeline,
|
|
53
|
+
kind: record.kind,
|
|
54
|
+
enabled: record.enabled,
|
|
55
|
+
...(typeof record.task === "string" ? { task: record.task } : {}),
|
|
56
|
+
...(schedule !== undefined ? { schedule } : {}),
|
|
57
|
+
...(event !== undefined ? { event } : {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function parseTriggerFile(raw, source = "trigger") {
|
|
61
|
+
const record = raw;
|
|
62
|
+
const trigger = coerceTriggerFile(raw);
|
|
63
|
+
if (trigger === undefined) {
|
|
64
|
+
return loadFailure([
|
|
65
|
+
{
|
|
66
|
+
code: "trigger.invalid_shape",
|
|
67
|
+
message: `Invalid ${source}: id, pipeline, kind, and enabled are required`,
|
|
68
|
+
category: "trigger",
|
|
69
|
+
triggerId: typeof record?.id === "string" ? record.id : undefined,
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
return loadSuccess(trigger);
|
|
74
|
+
}
|
|
75
|
+
export function loadTriggerFromYamlOutcome(yamlText, source = "trigger yaml") {
|
|
76
|
+
let raw;
|
|
77
|
+
try {
|
|
78
|
+
raw = parseYaml(yamlText);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
82
|
+
return loadFailure([
|
|
83
|
+
{
|
|
84
|
+
code: "trigger.load_error",
|
|
85
|
+
message,
|
|
86
|
+
category: "trigger",
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
return parseTriggerFile(raw, source);
|
|
91
|
+
}
|
|
92
|
+
export async function loadTriggerOutcome(filePath) {
|
|
93
|
+
let yamlText;
|
|
94
|
+
try {
|
|
95
|
+
yamlText = await readFile(filePath, "utf8");
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
99
|
+
return loadFailure([
|
|
100
|
+
{
|
|
101
|
+
code: "trigger.load_error",
|
|
102
|
+
message,
|
|
103
|
+
category: "trigger",
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
return loadTriggerFromYamlOutcome(yamlText, `trigger file ${filePath}`);
|
|
108
|
+
}
|
|
109
|
+
export function loadTriggerFromYaml(yamlText, source = "trigger yaml") {
|
|
110
|
+
const outcome = loadTriggerFromYamlOutcome(yamlText, source);
|
|
111
|
+
if (!outcome.ok)
|
|
112
|
+
throw new Error(outcome.issues[0].message);
|
|
113
|
+
return outcome.value;
|
|
114
|
+
}
|
|
115
|
+
export async function loadTrigger(filePath) {
|
|
116
|
+
const outcome = await loadTriggerOutcome(filePath);
|
|
117
|
+
if (!outcome.ok)
|
|
118
|
+
throw new Error(outcome.issues[0].message);
|
|
119
|
+
return outcome.value;
|
|
120
|
+
}
|
|
@@ -29,7 +29,11 @@ export async function materializeStageModels(stages, options) {
|
|
|
29
29
|
if (!modelOutcome.ok) {
|
|
30
30
|
return loadFailure(modelOutcome.issues);
|
|
31
31
|
}
|
|
32
|
-
materialized.push({
|
|
32
|
+
materialized.push({
|
|
33
|
+
...stage,
|
|
34
|
+
model: modelOutcome.value.model,
|
|
35
|
+
model_tier: modelOutcome.value.tier,
|
|
36
|
+
});
|
|
33
37
|
}
|
|
34
38
|
return loadSuccess(materialized);
|
|
35
39
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { PayloadSchemaMap } from "../envelope/payloadSchema.js";
|
|
2
2
|
import type { InlinePipelineDefinition } from "../types/pipeline.js";
|
|
3
3
|
import { type LoadIssue, type LoadOutcome } from "./loadOutcome.js";
|
|
4
|
+
import { type ToolRequirement } from "./toolRequires.js";
|
|
4
5
|
export type RawMergedEntry = {
|
|
5
6
|
raw: unknown;
|
|
6
7
|
declaringPath: string;
|
|
@@ -11,6 +12,7 @@ export declare function mergePipelineStages(rootPath: string): Promise<LoadOutco
|
|
|
11
12
|
agent?: string;
|
|
12
13
|
model?: string;
|
|
13
14
|
schemas?: PayloadSchemaMap;
|
|
15
|
+
requires?: ToolRequirement[];
|
|
14
16
|
warnings: LoadIssue[];
|
|
15
17
|
}>>;
|
|
16
18
|
/** Synthetic `declaringPath` for stage entries with no backing file. */
|
|
@@ -21,5 +23,6 @@ export declare function mergeInlinePipelineStages(raw: InlinePipelineDefinition)
|
|
|
21
23
|
agent?: string;
|
|
22
24
|
model?: string;
|
|
23
25
|
schemas?: PayloadSchemaMap;
|
|
26
|
+
requires?: ToolRequirement[];
|
|
24
27
|
warnings: LoadIssue[];
|
|
25
28
|
}>>;
|
|
@@ -4,6 +4,7 @@ import { loadFailure, loadSuccess } from "./loadOutcome.js";
|
|
|
4
4
|
import { allowLegacyYamlAuthoring, dialectWarningForDocument, legacyAuthoringRejected, presentLegacyKeys, } from "./legacyYaml.js";
|
|
5
5
|
import { parseModelField } from "./modelField.js";
|
|
6
6
|
import { readYamlObject } from "./readYamlObject.js";
|
|
7
|
+
import { parseToolRequires } from "./toolRequires.js";
|
|
7
8
|
import { classifyYamlDocument, collectDocumentKeys, mixedDialectIssue, } from "./yamlDialect.js";
|
|
8
9
|
function isPlainObject(value) {
|
|
9
10
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -177,6 +178,14 @@ export async function mergePipelineStages(rootPath) {
|
|
|
177
178
|
if (!schemasOutcome.ok)
|
|
178
179
|
return schemasOutcome;
|
|
179
180
|
const schemas = schemasOutcome.value;
|
|
181
|
+
const requiresOutcome = parseToolRequires(raw.requires, `pipeline ${absRoot}`, {
|
|
182
|
+
code: "pipeline.invalid_requires",
|
|
183
|
+
category: "pipeline",
|
|
184
|
+
pipelineId,
|
|
185
|
+
});
|
|
186
|
+
if (!requiresOutcome.ok)
|
|
187
|
+
return requiresOutcome;
|
|
188
|
+
const requires = requiresOutcome.value;
|
|
180
189
|
const idLocations = new Map();
|
|
181
190
|
const entries = [];
|
|
182
191
|
const warnings = [];
|
|
@@ -198,6 +207,7 @@ export async function mergePipelineStages(rootPath) {
|
|
|
198
207
|
...(agent !== undefined ? { agent } : {}),
|
|
199
208
|
...(model !== undefined ? { model } : {}),
|
|
200
209
|
...(schemas !== undefined ? { schemas } : {}),
|
|
210
|
+
...(requires !== undefined ? { requires } : {}),
|
|
201
211
|
warnings,
|
|
202
212
|
});
|
|
203
213
|
}
|
|
@@ -252,6 +262,14 @@ export async function mergeInlinePipelineStages(raw) {
|
|
|
252
262
|
if (!schemasOutcome.ok)
|
|
253
263
|
return schemasOutcome;
|
|
254
264
|
const schemas = schemasOutcome.value;
|
|
265
|
+
const requiresOutcome = parseToolRequires(raw.requires, `inline pipeline ${pipelineId}`, {
|
|
266
|
+
code: "pipeline.invalid_requires",
|
|
267
|
+
category: "pipeline",
|
|
268
|
+
pipelineId,
|
|
269
|
+
});
|
|
270
|
+
if (!requiresOutcome.ok)
|
|
271
|
+
return requiresOutcome;
|
|
272
|
+
const requires = requiresOutcome.value;
|
|
255
273
|
const entries = [];
|
|
256
274
|
for (let index = 0; index < raw.stages.length; index++) {
|
|
257
275
|
const entry = raw.stages[index];
|
|
@@ -273,6 +291,7 @@ export async function mergeInlinePipelineStages(raw) {
|
|
|
273
291
|
...(agent !== undefined ? { agent } : {}),
|
|
274
292
|
...(model !== undefined ? { model } : {}),
|
|
275
293
|
...(schemas !== undefined ? { schemas } : {}),
|
|
294
|
+
...(requires !== undefined ? { requires } : {}),
|
|
276
295
|
warnings: [],
|
|
277
296
|
});
|
|
278
297
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { execFileSync } from "node:child_process";
|
|
2
1
|
import { randomBytes } from "node:crypto";
|
|
3
2
|
import { readdir, readFile, rename, stat, unlink, writeFile } from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import { runGitSync } from "../git/exec.js";
|
|
5
|
+
import { statusPorcelain } from "../git/operations.js";
|
|
5
6
|
import { loadPipelineOutcome } from "./loadPipeline.js";
|
|
6
7
|
import { afterCompletionForStage, loadStageOutcome } from "./loadStage.js";
|
|
7
8
|
import { withLegacyYamlAllowedAsync } from "./legacyYaml.js";
|
|
@@ -104,11 +105,10 @@ function verifyFingerprint(items) {
|
|
|
104
105
|
}
|
|
105
106
|
function gitToplevel(cwd) {
|
|
106
107
|
try {
|
|
107
|
-
return
|
|
108
|
+
return runGitSync({
|
|
108
109
|
cwd,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}).trim();
|
|
110
|
+
args: ["rev-parse", "--show-toplevel"],
|
|
111
|
+
}).stdout.trim();
|
|
112
112
|
}
|
|
113
113
|
catch {
|
|
114
114
|
return null;
|
|
@@ -119,12 +119,7 @@ export function fileDirtyVsHead(absPath) {
|
|
|
119
119
|
if (top === null)
|
|
120
120
|
return true;
|
|
121
121
|
try {
|
|
122
|
-
|
|
123
|
-
cwd: top,
|
|
124
|
-
encoding: "utf8",
|
|
125
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
126
|
-
});
|
|
127
|
-
return status.trim().length > 0;
|
|
122
|
+
return statusPorcelain(top, absPath).trim().length > 0;
|
|
128
123
|
}
|
|
129
124
|
catch {
|
|
130
125
|
return true;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type PipelineListing, type TaskListing } from "./browseCatalog.js";
|
|
2
|
+
import { type CatalogRoot, type ResolveCatalogRootsOptions } from "./resolveCatalogRoots.js";
|
|
3
|
+
export type CatalogRootError = {
|
|
4
|
+
project_root: string;
|
|
5
|
+
code: "catalog_root_unreadable" | "unknown_project_root";
|
|
6
|
+
message: string;
|
|
7
|
+
};
|
|
8
|
+
export type MultiProjectListResult<T> = {
|
|
9
|
+
items: T[];
|
|
10
|
+
root_errors: CatalogRootError[];
|
|
11
|
+
roots: CatalogRoot[];
|
|
12
|
+
tip?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare 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.";
|
|
15
|
+
export declare function listPipelinesMultiProject(options: ResolveCatalogRootsOptions & {
|
|
16
|
+
projectRootFilter?: string;
|
|
17
|
+
}): Promise<MultiProjectListResult<PipelineListing & {
|
|
18
|
+
project_root: string;
|
|
19
|
+
}>>;
|
|
20
|
+
export declare function listTasksMultiProject(options: ResolveCatalogRootsOptions & {
|
|
21
|
+
projectRootFilter?: string;
|
|
22
|
+
}): Promise<MultiProjectListResult<TaskListing & {
|
|
23
|
+
project_root: string;
|
|
24
|
+
}>>;
|
|
25
|
+
export declare function listModelsMultiProject(options: ResolveCatalogRootsOptions & {
|
|
26
|
+
projectRootFilter?: string;
|
|
27
|
+
}): Promise<MultiProjectListResult<{
|
|
28
|
+
id: string;
|
|
29
|
+
project_root: string;
|
|
30
|
+
}> & {
|
|
31
|
+
models: string[];
|
|
32
|
+
}>;
|