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
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { resolveAgentPort } from "../agent/resolveAgentPort.js";
|
|
2
2
|
import { asAgentBackendId } from "../agent/agentBackend.js";
|
|
3
3
|
import { loadStageflowManifestOutcome } from "../config/loadStageflowManifest.js";
|
|
4
|
+
import { loadNamedSecretsFromAttemptDir } from "../logging/namedSecrets.js";
|
|
4
5
|
import { definitionIdForInstance } from "../runstore/stageInstanceId.js";
|
|
6
|
+
import { attemptWorkspaceDir } from "../runstore/workspaceLayout.js";
|
|
5
7
|
import { createRunStore } from "../runstore/createStore.js";
|
|
6
8
|
import { globalStageflowHome } from "../project/globalHome.js";
|
|
7
9
|
import { loadRunContext } from "./resumeReconstruct.js";
|
|
8
|
-
import { bindPiAgentDirEnv, rootsForStageWorker, withResolvedAuthPath, } from "./stageRoots.js";
|
|
10
|
+
import { bindPiAgentDirEnv, overlayStageBindingEnv, rootsForStageWorker, stageBindingEnvFromRun, withResolvedAuthPath, } from "./stageRoots.js";
|
|
11
|
+
import { buildStageEnvironment } from "./stageEnvironment.js";
|
|
12
|
+
import { ensureStageCacheDirs } from "./stageCacheEnv.js";
|
|
13
|
+
import { PACKAGE_VERSION } from "../package-meta.js";
|
|
9
14
|
import { runStage, isRunStageWaiting, } from "./stageRunner.js";
|
|
10
15
|
import { openStageAttempt } from "./stageAttemptBootstrap.js";
|
|
11
16
|
import { attemptContext } from "./stageAttemptContext.js";
|
|
12
17
|
import { loadActiveFeedbackLoopContext } from "./feedbackLoopCoordinator.js";
|
|
13
|
-
import { outcomeToWorkerResult, STAGE_WORKER_EXIT, } from "./stageWorkerProtocol.js";
|
|
18
|
+
import { outcomeToWorkerResult, SF_STAGE_WORKER, STAGE_WORKER_EXIT, } from "./stageWorkerProtocol.js";
|
|
14
19
|
export async function runStageWorker(input) {
|
|
15
20
|
const store = createRunStore({ rootDir: globalStageflowHome() });
|
|
16
21
|
const { meta, task, loaded } = await loadRunContext(store, input.runId, input.rootDir);
|
|
@@ -33,8 +38,29 @@ export async function runStageWorker(input) {
|
|
|
33
38
|
});
|
|
34
39
|
const workspaceDir = store.getWorkspaceDir(input.runId);
|
|
35
40
|
const checkoutRoot = meta.checkout_root;
|
|
41
|
+
const binding = input.env !== undefined
|
|
42
|
+
? {
|
|
43
|
+
env: input.env,
|
|
44
|
+
kind: input.bindingKind ?? "unbound",
|
|
45
|
+
}
|
|
46
|
+
: stageBindingEnvFromRun({
|
|
47
|
+
meta,
|
|
48
|
+
task,
|
|
49
|
+
runWorkspaceDir: workspaceDir,
|
|
50
|
+
hostEnv: process.env,
|
|
51
|
+
});
|
|
52
|
+
const baseEnv = process.env[SF_STAGE_WORKER] === "1"
|
|
53
|
+
? Object.fromEntries(Object.entries(process.env).filter((e) => e[1] !== undefined))
|
|
54
|
+
: buildStageEnvironment({
|
|
55
|
+
hostEnv: process.env,
|
|
56
|
+
cacheVars: ensureStageCacheDirs(),
|
|
57
|
+
packageVersion: PACKAGE_VERSION,
|
|
58
|
+
}).env;
|
|
59
|
+
const stageEnv = Object.fromEntries(Object.entries(overlayStageBindingEnv(baseEnv, binding.env, binding.kind))
|
|
60
|
+
.filter((e) => e[1] !== undefined));
|
|
36
61
|
const mode = input.mode ?? "run";
|
|
37
62
|
const attempt = input.attempt ?? 1;
|
|
63
|
+
loadNamedSecretsFromAttemptDir(attemptWorkspaceDir(workspaceDir, input.stageId, attempt));
|
|
38
64
|
const attemptCtx = input.attempt !== undefined ? attemptContext(input.attempt) : undefined;
|
|
39
65
|
const eventOptions = { attempt };
|
|
40
66
|
const roots = withResolvedAuthPath(rootsForStageWorker(workspaceDir, input.stageId, stage.model, checkoutRoot, attemptCtx), input.rootDir);
|
|
@@ -57,6 +83,7 @@ export async function runStageWorker(input) {
|
|
|
57
83
|
roots,
|
|
58
84
|
resumeToken: input.sessionFilePath,
|
|
59
85
|
sessionMode: "waiting_resume",
|
|
86
|
+
stageEnv,
|
|
60
87
|
onActivity: (event) => {
|
|
61
88
|
void store.appendStageEvent(input.runId, input.stageId, event, eventOptions);
|
|
62
89
|
},
|
|
@@ -83,6 +110,7 @@ export async function runStageWorker(input) {
|
|
|
83
110
|
factoryCwd: input.rootDir,
|
|
84
111
|
operatorCatalog: input.operatorCatalog,
|
|
85
112
|
skipGates: input.skipGates,
|
|
113
|
+
stageEnv,
|
|
86
114
|
});
|
|
87
115
|
return outcome;
|
|
88
116
|
}
|
|
@@ -116,6 +144,7 @@ export async function runStageWorker(input) {
|
|
|
116
144
|
...(resumeToken !== undefined ? { resumeToken } : {}),
|
|
117
145
|
sessionMode: mode,
|
|
118
146
|
...(feedbackLoopContext !== undefined ? { feedbackLoopContext } : {}),
|
|
147
|
+
stageEnv,
|
|
119
148
|
onActivity: (event) => {
|
|
120
149
|
void store.appendStageEvent(input.runId, input.stageId, event, eventOptions);
|
|
121
150
|
},
|
|
@@ -140,6 +169,7 @@ export async function runStageWorker(input) {
|
|
|
140
169
|
factoryCwd: input.rootDir,
|
|
141
170
|
operatorCatalog: input.operatorCatalog,
|
|
142
171
|
skipGates: input.skipGates,
|
|
172
|
+
stageEnv,
|
|
143
173
|
});
|
|
144
174
|
}
|
|
145
175
|
return runStage({
|
|
@@ -158,6 +188,7 @@ export async function runStageWorker(input) {
|
|
|
158
188
|
factoryCwd: input.rootDir,
|
|
159
189
|
operatorCatalog: input.operatorCatalog,
|
|
160
190
|
skipGates: input.skipGates,
|
|
191
|
+
stageEnv,
|
|
161
192
|
});
|
|
162
193
|
}
|
|
163
194
|
finally {
|
|
@@ -165,18 +196,35 @@ export async function runStageWorker(input) {
|
|
|
165
196
|
}
|
|
166
197
|
}
|
|
167
198
|
export function sendWorkerResult(result) {
|
|
168
|
-
if (typeof process.send
|
|
169
|
-
|
|
199
|
+
if (typeof process.send !== "function") {
|
|
200
|
+
return Promise.resolve();
|
|
170
201
|
}
|
|
202
|
+
return new Promise((resolve) => {
|
|
203
|
+
try {
|
|
204
|
+
const ok = process.send(result, (err) => {
|
|
205
|
+
void err;
|
|
206
|
+
resolve();
|
|
207
|
+
});
|
|
208
|
+
if (ok === false) {
|
|
209
|
+
resolve();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
resolve();
|
|
214
|
+
}
|
|
215
|
+
});
|
|
171
216
|
}
|
|
172
|
-
export function
|
|
173
|
-
const message = outcomeToWorkerResult(outcome);
|
|
174
|
-
sendWorkerResult(message);
|
|
217
|
+
export function exitCodeForOutcome(outcome) {
|
|
175
218
|
if (isRunStageWaiting(outcome)) {
|
|
176
|
-
|
|
219
|
+
return STAGE_WORKER_EXIT.WAITING;
|
|
177
220
|
}
|
|
178
221
|
if (outcome.ok) {
|
|
179
|
-
|
|
222
|
+
return STAGE_WORKER_EXIT.SUCCEEDED;
|
|
180
223
|
}
|
|
181
|
-
|
|
224
|
+
return STAGE_WORKER_EXIT.FAILED;
|
|
225
|
+
}
|
|
226
|
+
export async function exitForOutcome(outcome) {
|
|
227
|
+
const message = outcomeToWorkerResult(outcome);
|
|
228
|
+
await sendWorkerResult(message);
|
|
229
|
+
return exitCodeForOutcome(outcome);
|
|
182
230
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { RunStageOutcome } from "./stageRunner.js";
|
|
2
2
|
import type { OperatorCatalog } from "./stageAttemptBootstrap.js";
|
|
3
|
+
import type { DerivedBindingKind } from "./stageRoots.js";
|
|
3
4
|
export declare const SF_STAGE_WORKER = "SF_STAGE_WORKER";
|
|
4
5
|
export declare const STAGE_WORKER_EXIT: {
|
|
5
6
|
readonly SUCCEEDED: 0;
|
|
6
7
|
readonly FAILED: 1;
|
|
7
8
|
readonly WAITING: 2;
|
|
8
9
|
};
|
|
10
|
+
export declare const PROCESS_EXIT_FORCE_MS = 1000;
|
|
11
|
+
export declare function scheduleExitWithDrain(code: number): void;
|
|
9
12
|
export type StageWorkerInput = {
|
|
10
13
|
runId: string;
|
|
11
14
|
stageId: string;
|
|
@@ -16,6 +19,8 @@ export type StageWorkerInput = {
|
|
|
16
19
|
sessionFilePath?: string;
|
|
17
20
|
operatorCatalog?: OperatorCatalog;
|
|
18
21
|
skipGates?: boolean;
|
|
22
|
+
env?: Record<string, string>;
|
|
23
|
+
bindingKind?: DerivedBindingKind;
|
|
19
24
|
};
|
|
20
25
|
export type StageWorkerResult = {
|
|
21
26
|
type: "succeeded";
|
|
@@ -4,6 +4,14 @@ export const STAGE_WORKER_EXIT = {
|
|
|
4
4
|
FAILED: 1,
|
|
5
5
|
WAITING: 2,
|
|
6
6
|
};
|
|
7
|
+
export const PROCESS_EXIT_FORCE_MS = 1_000;
|
|
8
|
+
export function scheduleExitWithDrain(code) {
|
|
9
|
+
process.exitCode = code;
|
|
10
|
+
const timer = setTimeout(() => {
|
|
11
|
+
process.exit(code);
|
|
12
|
+
}, PROCESS_EXIT_FORCE_MS);
|
|
13
|
+
timer.unref();
|
|
14
|
+
}
|
|
7
15
|
export function outcomeToWorkerResult(outcome) {
|
|
8
16
|
if ("waiting" in outcome && outcome.waiting) {
|
|
9
17
|
return { type: "waiting" };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { InlinePipelineDefinition } from "../types/pipeline.js";
|
|
2
|
+
/** Cap for inline pipeline body + skills start payload (1 MiB). */
|
|
3
|
+
export declare const START_PAYLOAD_MAX_BYTES = 1048576;
|
|
4
|
+
export declare const START_TOKEN_REJECTED: "start.token_rejected";
|
|
5
|
+
export declare const INLINE_PIPELINE_TOO_LARGE: "inline_pipeline_too_large";
|
|
6
|
+
export type PipelinePersistenceFields = {
|
|
7
|
+
pipelineSource: "inline" | "path";
|
|
8
|
+
pipelineBody?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function pipelineBodyBytes(fields: PipelinePersistenceFields): number;
|
|
11
|
+
export type PipelinePersistenceResult = {
|
|
12
|
+
ok: true;
|
|
13
|
+
fields: PipelinePersistenceFields;
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
code: typeof INLINE_PIPELINE_TOO_LARGE;
|
|
17
|
+
bytes: number;
|
|
18
|
+
maxBytes: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function pipelinePersistenceForStart(pipeline: string | InlinePipelineDefinition): PipelinePersistenceResult;
|
|
21
|
+
/** MCP prefers `checkout`; `checkout_override` remains a temporary alias. */
|
|
22
|
+
export declare function pickCheckoutOverride(args: {
|
|
23
|
+
checkout?: string;
|
|
24
|
+
checkout_override?: string;
|
|
25
|
+
}): string | undefined;
|
|
26
|
+
export declare function isTokenShapedKey(key: string): boolean;
|
|
27
|
+
export declare function findTokenShapedField(value: unknown, pathPrefix?: string): string | undefined;
|
|
28
|
+
export declare function tokenRejectedPayload(field: string): {
|
|
29
|
+
error: string;
|
|
30
|
+
code: typeof START_TOKEN_REJECTED;
|
|
31
|
+
field: string;
|
|
32
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Cap for inline pipeline body + skills start payload (1 MiB). */
|
|
2
|
+
export const START_PAYLOAD_MAX_BYTES = 1_048_576;
|
|
3
|
+
export const START_TOKEN_REJECTED = "start.token_rejected";
|
|
4
|
+
export const INLINE_PIPELINE_TOO_LARGE = "inline_pipeline_too_large";
|
|
5
|
+
export function pipelineBodyBytes(fields) {
|
|
6
|
+
if (fields.pipelineBody === undefined)
|
|
7
|
+
return 0;
|
|
8
|
+
return Buffer.byteLength(fields.pipelineBody, "utf8");
|
|
9
|
+
}
|
|
10
|
+
export function pipelinePersistenceForStart(pipeline) {
|
|
11
|
+
if (typeof pipeline === "string") {
|
|
12
|
+
return { ok: true, fields: { pipelineSource: "path" } };
|
|
13
|
+
}
|
|
14
|
+
const body = JSON.stringify(pipeline);
|
|
15
|
+
const bytes = Buffer.byteLength(body, "utf8");
|
|
16
|
+
if (bytes > START_PAYLOAD_MAX_BYTES) {
|
|
17
|
+
return {
|
|
18
|
+
ok: false,
|
|
19
|
+
code: INLINE_PIPELINE_TOO_LARGE,
|
|
20
|
+
bytes,
|
|
21
|
+
maxBytes: START_PAYLOAD_MAX_BYTES,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
ok: true,
|
|
26
|
+
fields: { pipelineSource: "inline", pipelineBody: body },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** MCP prefers `checkout`; `checkout_override` remains a temporary alias. */
|
|
30
|
+
export function pickCheckoutOverride(args) {
|
|
31
|
+
return args.checkout ?? args.checkout_override;
|
|
32
|
+
}
|
|
33
|
+
const TOKEN_SHAPED_KEY = /^(token|github_token|gh_token|access_token|personal_access_token|pat|clone_token|git_token|api_token|auth_token)$/i;
|
|
34
|
+
export function isTokenShapedKey(key) {
|
|
35
|
+
return TOKEN_SHAPED_KEY.test(key);
|
|
36
|
+
}
|
|
37
|
+
export function findTokenShapedField(value, pathPrefix = "") {
|
|
38
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
for (const [key, child] of Object.entries(value)) {
|
|
42
|
+
const path = pathPrefix ? `${pathPrefix}.${key}` : key;
|
|
43
|
+
if (isTokenShapedKey(key))
|
|
44
|
+
return path;
|
|
45
|
+
if (key === "task" && child !== null && typeof child === "object") {
|
|
46
|
+
const nested = findTokenShapedField(child, path);
|
|
47
|
+
if (nested !== undefined)
|
|
48
|
+
return nested;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
export function tokenRejectedPayload(field) {
|
|
54
|
+
return {
|
|
55
|
+
error: `Clone credentials must stay on the Host; reject token-shaped start field "${field}"`,
|
|
56
|
+
code: START_TOKEN_REJECTED,
|
|
57
|
+
field,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { stringify as stringifyYaml } from "yaml";
|
|
3
|
-
import {
|
|
3
|
+
import { coerceTaskFile } from "../config/loadTask.js";
|
|
4
4
|
import { relPath } from "../config/validateCatalog.js";
|
|
5
5
|
import { payloadInstanceMismatch } from "../envelope/payloadSchema.js";
|
|
6
6
|
import { resolveTaskPath } from "./pipelineRunner.js";
|
|
7
7
|
export function isTaskFile(value) {
|
|
8
|
-
return
|
|
8
|
+
return coerceTaskFile(value) !== undefined;
|
|
9
9
|
}
|
|
10
10
|
export function taskFileToYaml(task) {
|
|
11
11
|
const doc = {
|
|
@@ -18,6 +18,15 @@ export function taskFileToYaml(task) {
|
|
|
18
18
|
doc.constraints = task.constraints;
|
|
19
19
|
if (task.checkout !== undefined)
|
|
20
20
|
doc.checkout = task.checkout;
|
|
21
|
+
if (task.repository !== undefined)
|
|
22
|
+
doc.repository = task.repository;
|
|
23
|
+
if (task.ref !== undefined)
|
|
24
|
+
doc.ref = task.ref;
|
|
25
|
+
if (task.run_branch_template !== undefined) {
|
|
26
|
+
doc.run_branch_template = task.run_branch_template;
|
|
27
|
+
}
|
|
28
|
+
if (task.git_identity !== undefined)
|
|
29
|
+
doc.git_identity = task.git_identity;
|
|
21
30
|
if (task.input !== undefined)
|
|
22
31
|
doc.input = task.input;
|
|
23
32
|
return stringifyYaml(doc);
|
|
@@ -78,9 +87,9 @@ export function resolveStartTaskInput(input, cwd) {
|
|
|
78
87
|
}
|
|
79
88
|
return { kind: "path", taskPath: resolveTaskPath(input.task, cwd) };
|
|
80
89
|
}
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
83
|
-
return { kind: "yaml", taskYaml: taskFileToYaml(
|
|
90
|
+
const coerced = coerceTaskFile(input.task);
|
|
91
|
+
if (coerced !== undefined) {
|
|
92
|
+
return { kind: "yaml", taskYaml: taskFileToYaml(coerced) };
|
|
84
93
|
}
|
|
85
94
|
throw new Error("task path, task object, or taskYaml is required");
|
|
86
95
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TriggerFile } from "../types/trigger.js";
|
|
2
|
+
export declare function findCatalogPathById(paths: string[], id: string): Promise<string | undefined>;
|
|
3
|
+
export declare function findTriggerDefinition(triggerPaths: string[], triggerId: string): Promise<{
|
|
4
|
+
path: string;
|
|
5
|
+
definition: TriggerFile;
|
|
6
|
+
} | undefined>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readYamlObject } from "../config/readYamlObject.js";
|
|
2
|
+
import { loadTriggerOutcome } from "../config/loadTrigger.js";
|
|
3
|
+
export async function findCatalogPathById(paths, id) {
|
|
4
|
+
for (const filePath of paths) {
|
|
5
|
+
try {
|
|
6
|
+
const raw = await readYamlObject(filePath);
|
|
7
|
+
if (raw?.id === id)
|
|
8
|
+
return filePath;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Unreadable/invalid catalog files are surfaced by `sf validate`; skip here.
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
export async function findTriggerDefinition(triggerPaths, triggerId) {
|
|
17
|
+
for (const filePath of triggerPaths) {
|
|
18
|
+
const outcome = await loadTriggerOutcome(filePath);
|
|
19
|
+
if (outcome.ok && outcome.value.id === triggerId) {
|
|
20
|
+
return { path: filePath, definition: outcome.value };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Subset-match: every key/value in `match` must equal-match `payload`. No `match` matches everything. */
|
|
2
|
+
export function matchesEventFilter(match, payload) {
|
|
3
|
+
if (!match)
|
|
4
|
+
return true;
|
|
5
|
+
return Object.entries(match).every(([key, value]) => payload[key] === value);
|
|
6
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TaskFile } from "../types/task.js";
|
|
2
|
+
export type TriggerFireEvent = {
|
|
3
|
+
triggerId: string;
|
|
4
|
+
task?: TaskFile;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Abstract seam for anything that decides "fire trigger X now" — a croner-backed
|
|
8
|
+
* schedule loop, a GitHub/email poller, a webhook receiver. No adapter implements
|
|
9
|
+
* this yet; it exists so those later adapters build against a locked contract.
|
|
10
|
+
*/
|
|
11
|
+
export interface TriggerSourcePort {
|
|
12
|
+
start(onFire: (event: TriggerFireEvent) => Promise<void>): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RunStore } from "../runstore/port.js";
|
|
2
|
+
import type { RunManager, StartRunResult } from "./runManager.js";
|
|
3
|
+
import type { TaskFile } from "../types/task.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a trigger id to its `*.trigger.yaml` catalog definition, resolves its
|
|
6
|
+
* `pipeline`/`task` refs to catalog files, and starts a real run through
|
|
7
|
+
* `RunManager.startRun` — the same internal entry point the CLI/MCP/console use.
|
|
8
|
+
* On a successful start, records the fire on the trigger's store row.
|
|
9
|
+
*
|
|
10
|
+
* `task` presence on the trigger definition is the either/or mode switch: a
|
|
11
|
+
* catalog-mode trigger (`task` set) rejects a supplied `options.task`; a
|
|
12
|
+
* dynamic-mode trigger (`task` absent) requires one.
|
|
13
|
+
*/
|
|
14
|
+
export declare function fireTrigger(triggerId: string, store: RunStore, runManager: RunManager, options?: {
|
|
15
|
+
cwd?: string;
|
|
16
|
+
task?: TaskFile;
|
|
17
|
+
}): Promise<StartRunResult>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { catalogContextFromStageflow } from "../config/resolveCatalogContext.js";
|
|
3
|
+
import { getCatalogScanPaths } from "../config/browseCatalog.js";
|
|
4
|
+
import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
|
|
5
|
+
import { findCatalogPathById, findTriggerDefinition } from "./triggerCatalog.js";
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a trigger id to its `*.trigger.yaml` catalog definition, resolves its
|
|
8
|
+
* `pipeline`/`task` refs to catalog files, and starts a real run through
|
|
9
|
+
* `RunManager.startRun` — the same internal entry point the CLI/MCP/console use.
|
|
10
|
+
* On a successful start, records the fire on the trigger's store row.
|
|
11
|
+
*
|
|
12
|
+
* `task` presence on the trigger definition is the either/or mode switch: a
|
|
13
|
+
* catalog-mode trigger (`task` set) rejects a supplied `options.task`; a
|
|
14
|
+
* dynamic-mode trigger (`task` absent) requires one.
|
|
15
|
+
*/
|
|
16
|
+
export async function fireTrigger(triggerId, store, runManager, options = {}) {
|
|
17
|
+
const cwd = options.cwd ?? process.cwd();
|
|
18
|
+
const ctx = catalogContextFromStageflow(await resolveStageflowContext(cwd));
|
|
19
|
+
const scanPaths = await getCatalogScanPaths(ctx);
|
|
20
|
+
if (!scanPaths) {
|
|
21
|
+
return { ok: false, reason: "No Stageflow catalog found", status: 404 };
|
|
22
|
+
}
|
|
23
|
+
const found = await findTriggerDefinition(scanPaths.triggerPaths, triggerId);
|
|
24
|
+
if (!found) {
|
|
25
|
+
return { ok: false, reason: `Trigger not found: ${triggerId}`, status: 404 };
|
|
26
|
+
}
|
|
27
|
+
const { path: triggerPath, definition: trigger } = found;
|
|
28
|
+
if (!trigger.enabled) {
|
|
29
|
+
return { ok: false, reason: `Trigger is disabled: ${triggerId}`, status: 409 };
|
|
30
|
+
}
|
|
31
|
+
const suppliedTask = options.task;
|
|
32
|
+
if (trigger.task !== undefined && suppliedTask !== undefined) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
reason: `Trigger "${triggerId}" already has a catalog task "${trigger.task}"; task override is not allowed`,
|
|
36
|
+
status: 422,
|
|
37
|
+
code: "trigger.task_override_not_allowed",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (trigger.task === undefined && suppliedTask === undefined) {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
reason: `Trigger "${triggerId}" has no catalog task; a task must be supplied when firing`,
|
|
44
|
+
status: 422,
|
|
45
|
+
code: "trigger.task_required",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const pipelinePath = await findCatalogPathById(scanPaths.pipelinePaths, trigger.pipeline);
|
|
49
|
+
if (!pipelinePath) {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
reason: `Trigger "${triggerId}" references unknown pipeline "${trigger.pipeline}"`,
|
|
53
|
+
status: 400,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
let taskInput;
|
|
57
|
+
if (trigger.task !== undefined) {
|
|
58
|
+
const taskPath = await findCatalogPathById(scanPaths.taskPaths, trigger.task);
|
|
59
|
+
if (!taskPath) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
reason: `Trigger "${triggerId}" references unknown task "${trigger.task}"`,
|
|
63
|
+
status: 400,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
taskInput = taskPath;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
taskInput = suppliedTask;
|
|
70
|
+
}
|
|
71
|
+
const projectRoot = ctx.projectRoot ?? undefined;
|
|
72
|
+
const definitionRef = projectRoot !== undefined
|
|
73
|
+
? path.relative(projectRoot, triggerPath).replace(/\\/g, "/")
|
|
74
|
+
: triggerPath;
|
|
75
|
+
await store.upsertTrigger({
|
|
76
|
+
id: triggerId,
|
|
77
|
+
definitionRef,
|
|
78
|
+
enabled: trigger.enabled,
|
|
79
|
+
});
|
|
80
|
+
const started = await runManager.startRun({
|
|
81
|
+
pipeline: pipelinePath,
|
|
82
|
+
task: taskInput,
|
|
83
|
+
...(projectRoot !== undefined ? { projectRoot } : {}),
|
|
84
|
+
});
|
|
85
|
+
if (started.ok) {
|
|
86
|
+
await store.recordTriggerFired(triggerId, started.runId);
|
|
87
|
+
}
|
|
88
|
+
return started;
|
|
89
|
+
}
|
|
@@ -2,6 +2,8 @@ import type { StageRunResult } from "../agent/port.js";
|
|
|
2
2
|
import type { RunStore } from "../runstore/port.js";
|
|
3
3
|
import type { ResolvedPipelineDag } from "../types/pipeline.js";
|
|
4
4
|
import type { StageConfig } from "../types/stage.js";
|
|
5
|
+
import type { BrowserRunner } from "../browser/browserHost.js";
|
|
6
|
+
import { type LoginCheckConfig, type LoginCheckOptions } from "../browser/loginCheck.js";
|
|
5
7
|
import type { StageRoots } from "./stageRoots.js";
|
|
6
8
|
/** Sidecar written before completion command checks so they can inspect fork_choice. */
|
|
7
9
|
export declare const COMPLETION_CANDIDATE_ENVELOPE_FILENAME = "completion-candidate-envelope.json";
|
|
@@ -28,4 +30,10 @@ export declare function createVerifiedStageExecution(options: {
|
|
|
28
30
|
stage: StageConfig;
|
|
29
31
|
dag?: ResolvedPipelineDag;
|
|
30
32
|
roots: StageRoots;
|
|
33
|
+
commandEnv?: NodeJS.ProcessEnv;
|
|
34
|
+
browserLogin?: {
|
|
35
|
+
check: LoginCheckConfig;
|
|
36
|
+
runner?: BrowserRunner;
|
|
37
|
+
options?: LoginCheckOptions;
|
|
38
|
+
};
|
|
31
39
|
}): VerifiedStageExecution;
|
|
@@ -9,6 +9,9 @@ import { COMPLETION_VERIFICATION_FAILURE_PREFIX, } from "../types/completion.js"
|
|
|
9
9
|
import { runCompletionContract, } from "./completionCheckRunner.js";
|
|
10
10
|
import { readCompletionCheckoutBaseline, writeCompletionCheckoutBaseline, } from "./completionCheckoutBaseline.js";
|
|
11
11
|
import { createGitCheckoutCapability } from "./gitCheckoutCapability.js";
|
|
12
|
+
import { readStagePersistedBrowserEnv } from "../browser/stageBrowserEnv.js";
|
|
13
|
+
import { defaultBrowserRunner } from "../browser/browserTeardown.js";
|
|
14
|
+
import { runLoginCheck, } from "../browser/loginCheck.js";
|
|
12
15
|
/** Sidecar written before completion command checks so they can inspect fork_choice. */
|
|
13
16
|
export const COMPLETION_CANDIDATE_ENVELOPE_FILENAME = "completion-candidate-envelope.json";
|
|
14
17
|
export function completionVerificationFailureReason(failedCheckIds) {
|
|
@@ -42,7 +45,7 @@ function gateDecisionsForAttempt(options) {
|
|
|
42
45
|
* module in stageRunner.
|
|
43
46
|
*/
|
|
44
47
|
export function createVerifiedStageExecution(options) {
|
|
45
|
-
const { store, runId, stageId, attempt, stage, dag, roots } = options;
|
|
48
|
+
const { store, runId, stageId, attempt, stage, dag, roots, commandEnv } = options;
|
|
46
49
|
const contract = dag?.nodes.find((node) => node.id === stageId)?.completion;
|
|
47
50
|
let checkout;
|
|
48
51
|
let checkoutBefore;
|
|
@@ -82,11 +85,23 @@ export function createVerifiedStageExecution(options) {
|
|
|
82
85
|
payloadSchema: stage.payload_schema,
|
|
83
86
|
artifactsDir,
|
|
84
87
|
commandWorkingDirectory: roots.cwd,
|
|
88
|
+
...(commandEnv !== undefined ? { commandEnv } : {}),
|
|
85
89
|
gates: gateDecisionsForAttempt({ store, runId, stageId, attempt }),
|
|
86
90
|
checkout,
|
|
87
91
|
checkoutBefore,
|
|
88
92
|
checkoutError,
|
|
89
93
|
checklistAttestations: candidate.envelope.checklist_attestations,
|
|
94
|
+
...(options.browserLogin !== undefined
|
|
95
|
+
? {
|
|
96
|
+
browserLogin: async () => {
|
|
97
|
+
const env = await readStagePersistedBrowserEnv(roots.runWorkspaceDir, stageId);
|
|
98
|
+
if (env === undefined) {
|
|
99
|
+
throw new Error("browser session env is missing for this stage");
|
|
100
|
+
}
|
|
101
|
+
return runLoginCheck(env, options.browserLogin.check, options.browserLogin.runner ?? defaultBrowserRunner, options.browserLogin.options);
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
: {}),
|
|
90
105
|
onCheckStart: async (check) => {
|
|
91
106
|
await store.upsertVerificationCheckResult(runId, stageId, {
|
|
92
107
|
check_id: check.id,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function verifyHmacSignature(rawBody: Buffer, headerValue: string, secret: string, scheme: "hex" | "base64"): boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
export function verifyHmacSignature(rawBody, headerValue, secret, scheme) {
|
|
3
|
+
const eqIndex = headerValue.indexOf("=");
|
|
4
|
+
const hasPrefix = eqIndex !== -1 && eqIndex < headerValue.length - 1;
|
|
5
|
+
const provided = hasPrefix ? headerValue.slice(eqIndex + 1) : headerValue;
|
|
6
|
+
const computed = crypto.createHmac("sha256", secret).update(rawBody).digest(scheme);
|
|
7
|
+
const providedBuffer = Buffer.from(provided, scheme);
|
|
8
|
+
const computedBuffer = Buffer.from(computed, scheme);
|
|
9
|
+
if (providedBuffer.length !== computedBuffer.length)
|
|
10
|
+
return false;
|
|
11
|
+
return crypto.timingSafeEqual(providedBuffer, computedBuffer);
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type LoadOutcome } from "../config/loadOutcome.js";
|
|
2
|
+
export type WorkspaceBinding = {
|
|
3
|
+
kind: "repository";
|
|
4
|
+
repository: string;
|
|
5
|
+
ref: string;
|
|
6
|
+
} | {
|
|
7
|
+
kind: "checkout";
|
|
8
|
+
path: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "unbound";
|
|
11
|
+
};
|
|
12
|
+
export type WorkspaceBindingInput = {
|
|
13
|
+
repository?: string;
|
|
14
|
+
ref?: string;
|
|
15
|
+
checkout?: string;
|
|
16
|
+
};
|
|
17
|
+
export type ResolveWorkspaceBindingOptions = {
|
|
18
|
+
checkoutOverride?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveWorkspaceBinding(task: WorkspaceBindingInput, options?: ResolveWorkspaceBindingOptions): LoadOutcome<WorkspaceBinding>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { loadFailure, loadSuccess } from "../config/loadOutcome.js";
|
|
2
|
+
const OWNER_REPO_RE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
3
|
+
function nonEmptyTrimmed(value) {
|
|
4
|
+
if (value === undefined)
|
|
5
|
+
return undefined;
|
|
6
|
+
const trimmed = value.trim();
|
|
7
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
8
|
+
}
|
|
9
|
+
function isGithubOwnerRepo(repository) {
|
|
10
|
+
return OWNER_REPO_RE.test(repository);
|
|
11
|
+
}
|
|
12
|
+
export function resolveWorkspaceBinding(task, options) {
|
|
13
|
+
const repository = nonEmptyTrimmed(task.repository);
|
|
14
|
+
const ref = nonEmptyTrimmed(task.ref);
|
|
15
|
+
const checkoutPath = nonEmptyTrimmed(options?.checkoutOverride ?? task.checkout);
|
|
16
|
+
const hasRepositoryField = repository !== undefined;
|
|
17
|
+
if (hasRepositoryField && checkoutPath !== undefined) {
|
|
18
|
+
return loadFailure([
|
|
19
|
+
{
|
|
20
|
+
code: "task.binding_conflict",
|
|
21
|
+
message: "Task cannot declare both repository and checkout (exactly one workspace binding)",
|
|
22
|
+
category: "task",
|
|
23
|
+
},
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
if (hasRepositoryField && ref === undefined) {
|
|
27
|
+
return loadFailure([
|
|
28
|
+
{
|
|
29
|
+
code: "task.repository_ref_required",
|
|
30
|
+
message: "Task repository requires a non-empty ref",
|
|
31
|
+
category: "task",
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
if (ref !== undefined && repository === undefined) {
|
|
36
|
+
return loadFailure([
|
|
37
|
+
{
|
|
38
|
+
code: "task.ref_without_repository",
|
|
39
|
+
message: "Task ref requires repository",
|
|
40
|
+
category: "task",
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
if (repository !== undefined && ref !== undefined) {
|
|
45
|
+
if (!isGithubOwnerRepo(repository)) {
|
|
46
|
+
return loadFailure([
|
|
47
|
+
{
|
|
48
|
+
code: "task.repository_invalid",
|
|
49
|
+
message: "Task repository must be a GitHub owner/repo (e.g. acme/api); hosts and URLs are not accepted",
|
|
50
|
+
category: "task",
|
|
51
|
+
},
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
return loadSuccess({ kind: "repository", repository, ref });
|
|
55
|
+
}
|
|
56
|
+
if (checkoutPath !== undefined) {
|
|
57
|
+
return loadSuccess({ kind: "checkout", path: checkoutPath });
|
|
58
|
+
}
|
|
59
|
+
return loadSuccess({ kind: "unbound" });
|
|
60
|
+
}
|