stageflow 0.25.0 → 0.27.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 +10 -3
- 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/piAdapter.d.ts +9 -1
- package/dist/agent/piAdapter.js +58 -3
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/port.d.ts +6 -0
- package/dist/agent/streamLogRedact.d.ts +1 -1
- package/dist/agent/streamLogRedact.js +4 -11
- 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/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 +21 -3
- package/dist/cli/hostClient.js +93 -12
- package/dist/cli/initTemplates.d.ts +1 -1
- package/dist/cli/initTemplates.js +8 -1
- 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 +162 -8
- package/dist/cli.js +171 -30
- package/dist/config/catalogRelativePath.d.ts +62 -0
- package/dist/config/catalogRelativePath.js +118 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/hostConfig.d.ts +55 -0
- package/dist/config/hostConfig.js +333 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +190 -3
- package/dist/config/loadOutcome.d.ts +1 -1
- package/dist/config/loadPipeline.js +23 -2
- package/dist/config/loadStage.js +18 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- 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 +30 -0
- package/dist/config/multiProjectCatalog.js +142 -0
- package/dist/config/normalizePipelineStageEntry.js +20 -1
- package/dist/config/pipelineStageKeys.js +2 -0
- 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/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- 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/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/validateCatalog.d.ts +5 -1
- package/dist/config/validateCatalog.js +140 -1
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -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 +13 -0
- package/dist/logging/redact.js +88 -0
- package/dist/mcp/catalogTools.js +456 -80
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +179 -5
- package/dist/mcp/deps.d.ts +1 -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 +1 -0
- package/dist/mcp/tools.js +4 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -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/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.js +2 -2
- 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 +21 -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 +111 -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 +28 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +352 -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/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +72 -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/completionCheckRunner.d.ts +3 -0
- package/dist/runtime/completionCheckRunner.js +45 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/pipelineRunner.d.ts +36 -1
- package/dist/runtime/pipelineRunner.js +178 -17
- package/dist/runtime/pipelineScheduler.d.ts +15 -0
- package/dist/runtime/pipelineScheduler.js +135 -27
- 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 +158 -4
- package/dist/runtime/runManager.js +1596 -79
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +2 -0
- package/dist/runtime/runRetryCoordinator.js +19 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +195 -24
- 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 +193 -0
- package/dist/runtime/stageProcessLauncher.d.ts +18 -0
- package/dist/runtime/stageProcessLauncher.js +194 -38
- 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 +1 -0
- package/dist/runtime/stageRunner.js +3 -1
- 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/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/verifiedStageExecution.d.ts +1 -0
- package/dist/runtime/verifiedStageExecution.js +2 -1
- 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 +36 -2
- package/dist/server/bootstrap.js +209 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +241 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +103 -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 +98 -0
- package/dist/server/http.d.ts +12 -1
- package/dist/server/http.js +1085 -485
- 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/types/pipeline.d.ts +7 -0
- package/dist/types/stage.d.ts +8 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/ui/assets/index-B6hlSXXn.js +120 -0
- package/dist/ui/index.html +1 -1
- package/examples/README.md +98 -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/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 +144 -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/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 +5 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +11 -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-run/SKILL.md +20 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
- 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 +40 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { bareCachePath, ensureBareCache, } from "../git/cache.js";
|
|
4
|
+
import { GitError } from "../git/errors.js";
|
|
5
|
+
import { catFileCommit, checkRefFormat, deleteBranch, resolveRef, revParse, worktreeAdd, worktreePrune, worktreeRemove, } from "../git/operations.js";
|
|
6
|
+
import { ensureGlobalHome, globalStageflowHome } from "../project/globalHome.js";
|
|
7
|
+
const DEFAULT_BRANCH_TEMPLATE = "stageflow/run-<runId>";
|
|
8
|
+
const FULL_SHA_RE = /^[0-9a-f]{40}$/i;
|
|
9
|
+
export function derivedBindingKindFromMeta(meta) {
|
|
10
|
+
if (meta.repository != null && meta.repository !== "") {
|
|
11
|
+
return "repository";
|
|
12
|
+
}
|
|
13
|
+
if (meta.checkout_root != null && meta.checkout_root !== "") {
|
|
14
|
+
return "checkout";
|
|
15
|
+
}
|
|
16
|
+
return "unbound";
|
|
17
|
+
}
|
|
18
|
+
export function worktreePathForRun(runId) {
|
|
19
|
+
return path.join(globalStageflowHome(), "worktrees", runId);
|
|
20
|
+
}
|
|
21
|
+
function renderBranchTemplate(template, runId, taskId) {
|
|
22
|
+
return template.replaceAll("<runId>", runId).replaceAll("<taskId>", taskId);
|
|
23
|
+
}
|
|
24
|
+
export function resolveRunBranchTemplate(task) {
|
|
25
|
+
const fromTask = task.run_branch_template?.trim();
|
|
26
|
+
if (fromTask)
|
|
27
|
+
return fromTask;
|
|
28
|
+
const fromEnv = process.env.STAGEFLOW_RUN_BRANCH_TEMPLATE?.trim();
|
|
29
|
+
if (fromEnv)
|
|
30
|
+
return fromEnv;
|
|
31
|
+
return DEFAULT_BRANCH_TEMPLATE;
|
|
32
|
+
}
|
|
33
|
+
export class StartLinkError extends Error {
|
|
34
|
+
code;
|
|
35
|
+
status;
|
|
36
|
+
stderr;
|
|
37
|
+
constructor(message, options) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = "StartLinkError";
|
|
40
|
+
this.code = options.code;
|
|
41
|
+
this.status = options.status;
|
|
42
|
+
this.stderr = options.stderr;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function mapGitCode(code, phase) {
|
|
46
|
+
switch (code) {
|
|
47
|
+
case "auth_failed":
|
|
48
|
+
return { code: "repository_auth_failed", status: 401 };
|
|
49
|
+
case "repo_not_found":
|
|
50
|
+
return { code: "repository_not_found", status: 404 };
|
|
51
|
+
case "ref_not_found":
|
|
52
|
+
return { code: "ref_not_found", status: 404 };
|
|
53
|
+
case "network":
|
|
54
|
+
case "timeout":
|
|
55
|
+
return { code: "repository_fetch_failed", status: 502 };
|
|
56
|
+
case "disk_full":
|
|
57
|
+
return { code: "insufficient_disk", status: 507 };
|
|
58
|
+
case "git_missing":
|
|
59
|
+
return { code: "git_missing", status: 500 };
|
|
60
|
+
default:
|
|
61
|
+
if (phase === "worktree") {
|
|
62
|
+
return { code: "worktree_create_failed", status: 500 };
|
|
63
|
+
}
|
|
64
|
+
if (phase === "resolve") {
|
|
65
|
+
return { code: "ref_not_found", status: 404 };
|
|
66
|
+
}
|
|
67
|
+
return { code: "repository_fetch_failed", status: 502 };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function throwMappedGitError(err, phase) {
|
|
71
|
+
if (err instanceof StartLinkError)
|
|
72
|
+
throw err;
|
|
73
|
+
if (err instanceof GitError) {
|
|
74
|
+
const mapped = mapGitCode(err.code, phase);
|
|
75
|
+
throw new StartLinkError(err.message, {
|
|
76
|
+
code: mapped.code,
|
|
77
|
+
status: mapped.status,
|
|
78
|
+
stderr: err.stderr,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
async function runRollbackThunks(thunks) {
|
|
84
|
+
for (const thunk of thunks) {
|
|
85
|
+
try {
|
|
86
|
+
await thunk();
|
|
87
|
+
}
|
|
88
|
+
catch (cleanupErr) {
|
|
89
|
+
console.error(`repository link rollback failed: ${cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export async function reclaimWorkspaceBinding(meta, options) {
|
|
94
|
+
if (derivedBindingKindFromMeta(meta) !== "repository") {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const cachePath = bareCachePath(meta.repository);
|
|
98
|
+
try {
|
|
99
|
+
await worktreeRemove(cachePath, meta.checkout_root);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
await worktreePrune(cachePath);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
}
|
|
108
|
+
if (options?.keepRunBranch) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
await deleteBranch(cachePath, meta.run_branch);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export async function reclaimWorkspaceOnRunSucceeded(store, runId) {
|
|
118
|
+
try {
|
|
119
|
+
const meta = await store.readRunMeta(runId);
|
|
120
|
+
await reclaimWorkspaceBinding(meta, { keepRunBranch: true });
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
console.error(`reclaimWorkspaceOnRunSucceeded: failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function materializeWorkspaceBinding(options) {
|
|
127
|
+
const { runId, task, binding } = options;
|
|
128
|
+
const rollbacks = [];
|
|
129
|
+
const rollback = async () => runRollbackThunks(rollbacks);
|
|
130
|
+
if (binding.kind === "unbound") {
|
|
131
|
+
return { materialized: { runId }, rollback };
|
|
132
|
+
}
|
|
133
|
+
if (binding.kind === "checkout") {
|
|
134
|
+
const checkoutRoot = options.checkoutRoot;
|
|
135
|
+
if (checkoutRoot === undefined) {
|
|
136
|
+
throw new StartLinkError("Checkout path is required", {
|
|
137
|
+
code: "worktree_create_failed",
|
|
138
|
+
status: 500,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
let resolvedSha;
|
|
142
|
+
if (options.pinned?.resolvedSha) {
|
|
143
|
+
resolvedSha = options.pinned.resolvedSha;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
try {
|
|
147
|
+
const head = await revParse(checkoutRoot, ["HEAD"]);
|
|
148
|
+
if (FULL_SHA_RE.test(head)) {
|
|
149
|
+
resolvedSha = head;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// non-git path checkouts leave resolved_sha null (KD6/KD7)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
materialized: {
|
|
158
|
+
runId,
|
|
159
|
+
checkoutRoot,
|
|
160
|
+
...(resolvedSha !== undefined ? { resolvedSha } : {}),
|
|
161
|
+
},
|
|
162
|
+
rollback,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const repository = binding.repository;
|
|
166
|
+
const refToRecord = options.pinned?.ref ?? binding.ref;
|
|
167
|
+
let resolvedSha;
|
|
168
|
+
let cachePath;
|
|
169
|
+
if (options.pinned) {
|
|
170
|
+
cachePath = bareCachePath(repository);
|
|
171
|
+
const present = existsSync(cachePath) &&
|
|
172
|
+
(await catFileCommit(cachePath, options.pinned.resolvedSha));
|
|
173
|
+
if (!present) {
|
|
174
|
+
throw new StartLinkError(`Pinned SHA is not available in the local cache: ${options.pinned.resolvedSha}`, { code: "pinned_sha_unavailable", status: 404 });
|
|
175
|
+
}
|
|
176
|
+
resolvedSha = options.pinned.resolvedSha;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
try {
|
|
180
|
+
const ensured = await ensureBareCache(repository, binding.ref);
|
|
181
|
+
cachePath = ensured.cachePath;
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
throwMappedGitError(err, "fetch");
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
resolvedSha = await resolveRef(cachePath, binding.ref);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
throwMappedGitError(err, "resolve");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const template = resolveRunBranchTemplate(task);
|
|
194
|
+
const runBranch = renderBranchTemplate(template, runId, task.id);
|
|
195
|
+
const branchOk = await checkRefFormat(runBranch);
|
|
196
|
+
if (!branchOk) {
|
|
197
|
+
throw new StartLinkError(`Invalid run branch name from template: ${runBranch}`, { code: "invalid_run_branch", status: 400 });
|
|
198
|
+
}
|
|
199
|
+
ensureGlobalHome();
|
|
200
|
+
const checkoutRoot = worktreePathForRun(runId);
|
|
201
|
+
mkdirSync(path.dirname(checkoutRoot), { recursive: true });
|
|
202
|
+
try {
|
|
203
|
+
await worktreeAdd(cachePath, {
|
|
204
|
+
worktreePath: checkoutRoot,
|
|
205
|
+
branch: runBranch,
|
|
206
|
+
startPoint: resolvedSha,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
throwMappedGitError(err, "worktree");
|
|
211
|
+
}
|
|
212
|
+
rollbacks.push(async () => {
|
|
213
|
+
try {
|
|
214
|
+
await worktreeRemove(cachePath, checkoutRoot);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// prune recovers admin state when the dir is already gone
|
|
218
|
+
}
|
|
219
|
+
await worktreePrune(cachePath);
|
|
220
|
+
});
|
|
221
|
+
rollbacks.push(async () => {
|
|
222
|
+
await deleteBranch(cachePath, runBranch);
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
materialized: {
|
|
226
|
+
runId,
|
|
227
|
+
checkoutRoot,
|
|
228
|
+
repository,
|
|
229
|
+
ref: refToRecord,
|
|
230
|
+
resolvedSha,
|
|
231
|
+
runBranch,
|
|
232
|
+
},
|
|
233
|
+
rollback,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
@@ -17,7 +17,7 @@ export type ResumeTimedOutContext = {
|
|
|
17
17
|
maxActiveStagesPerRun: number;
|
|
18
18
|
operatorCatalog?: OperatorCatalog;
|
|
19
19
|
};
|
|
20
|
-
export declare function
|
|
20
|
+
export declare function assertResumableStage(status: string, events: ReadonlyArray<{
|
|
21
21
|
event: string;
|
|
22
22
|
reason?: string;
|
|
23
23
|
}>): {
|
|
@@ -11,11 +11,14 @@ import { openStageAttempt, } from "./stageAttemptBootstrap.js";
|
|
|
11
11
|
import { buildStageRoots, withResolvedAuthPath } from "./stageRoots.js";
|
|
12
12
|
import { isStageTimeoutReason, lastFailedReason, } from "../agent/stageTimeout.js";
|
|
13
13
|
import { deriveExecutionPatchFromEvent } from "../runstore/stageExecution.js";
|
|
14
|
-
export function
|
|
14
|
+
export function assertResumableStage(status, events) {
|
|
15
|
+
if (status === "interrupted") {
|
|
16
|
+
return { ok: true };
|
|
17
|
+
}
|
|
15
18
|
if (status !== "failed") {
|
|
16
19
|
return {
|
|
17
20
|
ok: false,
|
|
18
|
-
reason: `Stage is not
|
|
21
|
+
reason: `Stage is not resumable (status=${status})`,
|
|
19
22
|
status: 409,
|
|
20
23
|
};
|
|
21
24
|
}
|
|
@@ -49,6 +49,13 @@ export function wrapRunStoreWithChangeBus(store, bus) {
|
|
|
49
49
|
await store.updateRunStatus(runId, status);
|
|
50
50
|
bus.emit({ runId, kind: "status" });
|
|
51
51
|
};
|
|
52
|
+
const tryUpdateRunStatus = async (runId, status, expectedStatus) => {
|
|
53
|
+
const updated = await store.tryUpdateRunStatus(runId, status, expectedStatus);
|
|
54
|
+
if (updated) {
|
|
55
|
+
bus.emit({ runId, kind: "status" });
|
|
56
|
+
}
|
|
57
|
+
return updated;
|
|
58
|
+
};
|
|
52
59
|
const appendStageEvent = async (runId, stageId, event, options) => {
|
|
53
60
|
await store.appendStageEvent(runId, stageId, event, options);
|
|
54
61
|
if (event.event === "waiting_for_input" || event.event === "resumed") {
|
|
@@ -66,6 +73,8 @@ export function wrapRunStoreWithChangeBus(store, bus) {
|
|
|
66
73
|
return createRun;
|
|
67
74
|
if (prop === "updateRunStatus")
|
|
68
75
|
return updateRunStatus;
|
|
76
|
+
if (prop === "tryUpdateRunStatus")
|
|
77
|
+
return tryUpdateRunStatus;
|
|
69
78
|
if (prop === "appendStageEvent")
|
|
70
79
|
return appendStageEvent;
|
|
71
80
|
const cached = boundCache.get(prop);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { A2aStore } from "../a2a/store.js";
|
|
2
|
+
import type { RunStore } from "../runstore/port.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hard-delete a run across A2A, workspace, worktree/branch, then store rows last.
|
|
5
|
+
* Filesystem/git step failures are logged and do not abort the sequence (R10).
|
|
6
|
+
*/
|
|
7
|
+
export declare function deleteRunEverywhere(store: RunStore, a2aStore: A2aStore, runId: string): Promise<void>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { reclaimWorkspaceBinding } from "./repositoryMaterialize.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hard-delete a run across A2A, workspace, worktree/branch, then store rows last.
|
|
5
|
+
* Filesystem/git step failures are logged and do not abort the sequence (R10).
|
|
6
|
+
*/
|
|
7
|
+
export async function deleteRunEverywhere(store, a2aStore, runId) {
|
|
8
|
+
try {
|
|
9
|
+
await a2aStore.deleteByRunId(runId);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
console.error(`deleteRunEverywhere: A2A cleanup failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
13
|
+
}
|
|
14
|
+
let meta;
|
|
15
|
+
try {
|
|
16
|
+
meta = await store.readRunMeta(runId);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
meta = undefined;
|
|
20
|
+
}
|
|
21
|
+
const workspaceDir = store.getWorkspaceDir(runId);
|
|
22
|
+
try {
|
|
23
|
+
await rm(workspaceDir, { recursive: true, force: true });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error(`deleteRunEverywhere: workspace rm failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
27
|
+
}
|
|
28
|
+
if (meta !== undefined) {
|
|
29
|
+
try {
|
|
30
|
+
await reclaimWorkspaceBinding(meta);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error(`deleteRunEverywhere: reclaimWorkspaceBinding failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await store.deleteRun(runId);
|
|
37
|
+
}
|
|
@@ -1,32 +1,50 @@
|
|
|
1
1
|
import { type RunSubmission } from "../runstore/submission.js";
|
|
2
2
|
import type { AgentPort, OpaqueAnswer } from "../agent/port.js";
|
|
3
3
|
import type { InlinePipelineDefinition } from "../types/pipeline.js";
|
|
4
|
+
import { type DiskBreakdown, type FreeSpaceReader } from "../runstore/diskUsage.js";
|
|
4
5
|
import { type RunStore } from "../runstore/port.js";
|
|
5
6
|
import type { TaskFile } from "../types/task.js";
|
|
6
7
|
import { type PipelineRunResult } from "./pipelineRunner.js";
|
|
8
|
+
import { type SkillsPayload } from "./runSkills.js";
|
|
7
9
|
import { type FeedbackLoopDecisionKind } from "./feedbackLoopDecision.js";
|
|
8
10
|
import { type RetryStageResult } from "./runRetryCoordinator.js";
|
|
9
11
|
import { type StageExecutionMode } from "./stageConcurrency.js";
|
|
10
12
|
import { StageProcessLauncher } from "./stageProcessLauncher.js";
|
|
11
13
|
import { StageHitlController, type DeliverAnswerResult, type HitlSeams } from "./stageHitl.js";
|
|
12
14
|
import { type StartTaskInput } from "./taskInput.js";
|
|
15
|
+
import { type RetentionSweepReport, type RunRetentionSweepOptions } from "./runRetentionSweep.js";
|
|
16
|
+
import type { A2aStore } from "../a2a/store.js";
|
|
13
17
|
import type { OperatorCatalog } from "./stageAttemptBootstrap.js";
|
|
14
|
-
|
|
18
|
+
import { type StartFailureCode } from "./repositoryMaterialize.js";
|
|
19
|
+
export type BusyCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota";
|
|
20
|
+
export type { StartFailureCode } from "./repositoryMaterialize.js";
|
|
15
21
|
export type StartRunResult = {
|
|
16
22
|
ok: true;
|
|
17
23
|
runId: string;
|
|
18
24
|
done: Promise<PipelineRunResult>;
|
|
25
|
+
queued?: boolean;
|
|
26
|
+
queuePosition?: number;
|
|
27
|
+
/** Present when queued because the caller hit its concurrency quota. */
|
|
28
|
+
queuedCode?: "busy_caller_quota";
|
|
19
29
|
} | {
|
|
20
30
|
ok: false;
|
|
21
31
|
reason: string;
|
|
22
32
|
status?: number;
|
|
23
|
-
code?:
|
|
33
|
+
code?: StartFailureCode;
|
|
24
34
|
activeCount?: number;
|
|
25
35
|
maxConcurrent?: number;
|
|
26
36
|
activeRunIds?: string[];
|
|
37
|
+
scope?: "global" | "project" | "caller";
|
|
38
|
+
project_root?: string;
|
|
39
|
+
caller_id?: string;
|
|
27
40
|
conflictingRunId?: string;
|
|
28
41
|
conflictingCheckout?: string;
|
|
42
|
+
freeBytes?: number;
|
|
43
|
+
minFreeBytes?: number;
|
|
44
|
+
stderr?: string;
|
|
29
45
|
};
|
|
46
|
+
export declare const PROJECT_ROOT_UNAVAILABLE_REASON = "project_root_unavailable";
|
|
47
|
+
export declare const INSUFFICIENT_DISK_CANCEL_REASON = "insufficient_disk";
|
|
30
48
|
export type CapacityHealth = {
|
|
31
49
|
ok: true;
|
|
32
50
|
activeRunIds: string[];
|
|
@@ -35,6 +53,18 @@ export type CapacityHealth = {
|
|
|
35
53
|
slotsAvailable: number;
|
|
36
54
|
activeStageProcesses: number;
|
|
37
55
|
maxActiveStageProcesses: number | null;
|
|
56
|
+
disk?: DiskBreakdown;
|
|
57
|
+
stage_env_passthrough?: boolean;
|
|
58
|
+
proxy?: Record<string, unknown>;
|
|
59
|
+
container?: {
|
|
60
|
+
max_old_space_size_mb: number;
|
|
61
|
+
max_active_stage_processes: number;
|
|
62
|
+
memory_limit_bytes: number | null;
|
|
63
|
+
source: string;
|
|
64
|
+
};
|
|
65
|
+
cache?: {
|
|
66
|
+
root: string;
|
|
67
|
+
};
|
|
38
68
|
};
|
|
39
69
|
export type StartRunOnceResult = {
|
|
40
70
|
ok: true;
|
|
@@ -64,6 +94,32 @@ export type AbandonStageResult = {
|
|
|
64
94
|
reason: string;
|
|
65
95
|
status?: number;
|
|
66
96
|
};
|
|
97
|
+
export type CancelRunResult = {
|
|
98
|
+
ok: true;
|
|
99
|
+
runId: string;
|
|
100
|
+
} | {
|
|
101
|
+
ok: false;
|
|
102
|
+
reason: string;
|
|
103
|
+
status?: number;
|
|
104
|
+
};
|
|
105
|
+
export type DeleteRunChannel = "mcp" | "rest" | "cli";
|
|
106
|
+
export type DeleteRunResult = {
|
|
107
|
+
ok: true;
|
|
108
|
+
runId: string;
|
|
109
|
+
} | {
|
|
110
|
+
ok: false;
|
|
111
|
+
reason: string;
|
|
112
|
+
status?: number;
|
|
113
|
+
};
|
|
114
|
+
export type GcRunsChannel = "mcp" | "rest" | "cli" | "periodic";
|
|
115
|
+
export type GcRunsResult = ({
|
|
116
|
+
ok: true;
|
|
117
|
+
} & RetentionSweepReport) | {
|
|
118
|
+
ok: false;
|
|
119
|
+
reason: string;
|
|
120
|
+
status?: number;
|
|
121
|
+
};
|
|
122
|
+
export declare const FORCE_DELETE_CANCEL_REASON = "delete_run: force";
|
|
67
123
|
export type DecideFeedbackLoopResult = {
|
|
68
124
|
ok: true;
|
|
69
125
|
effect: "extended" | "continued" | "abandoned";
|
|
@@ -82,21 +138,34 @@ export type StopManualRecoveryResult = {
|
|
|
82
138
|
reason: string;
|
|
83
139
|
status?: number;
|
|
84
140
|
};
|
|
141
|
+
export declare const STAGEFLOW_AUTO_RESUME_INTERRUPTED = "STAGEFLOW_AUTO_RESUME_INTERRUPTED";
|
|
142
|
+
export declare const STAGEFLOW_MAX_AUTO_RESUMES = "STAGEFLOW_MAX_AUTO_RESUMES";
|
|
143
|
+
export declare function isAutoResumeInterruptedEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
144
|
+
export declare function parseMaxAutoResumes(env?: NodeJS.ProcessEnv): number;
|
|
85
145
|
export declare class RunManager {
|
|
86
146
|
private readonly options;
|
|
87
147
|
private readonly submissionsInFlight;
|
|
88
148
|
private readonly active;
|
|
149
|
+
private readonly schedulingHalts;
|
|
89
150
|
private readonly checkoutLeases;
|
|
90
151
|
private readonly provisionalIds;
|
|
152
|
+
private readonly admissionQueue;
|
|
153
|
+
private readonly pendingQueuedStarts;
|
|
154
|
+
private readonly queuedDone;
|
|
155
|
+
private admissionDrainInFlight;
|
|
91
156
|
private readonly resumeInFlight;
|
|
92
157
|
private readonly retryInFlight;
|
|
93
158
|
private readonly retryStartOwner;
|
|
94
159
|
private readonly retryStartWaiters;
|
|
95
160
|
private trackingGeneration;
|
|
96
161
|
private maxConcurrent;
|
|
162
|
+
private readonly maxQueued;
|
|
163
|
+
private readonly maxConcurrentPerProject;
|
|
164
|
+
private readonly callerQuotas;
|
|
97
165
|
private readonly maxActiveStagesPerRun;
|
|
98
166
|
private readonly executionMode;
|
|
99
167
|
private readonly stageProcessLauncher;
|
|
168
|
+
private a2aStore;
|
|
100
169
|
private readonly hitl;
|
|
101
170
|
private readonly attachedWaiting;
|
|
102
171
|
private readonly retryCoordinator;
|
|
@@ -104,6 +173,7 @@ export declare class RunManager {
|
|
|
104
173
|
private readonly cwd;
|
|
105
174
|
private readonly projectRoot;
|
|
106
175
|
private readonly isGitProject;
|
|
176
|
+
private acceptingWork;
|
|
107
177
|
constructor(options: {
|
|
108
178
|
agent: AgentPort;
|
|
109
179
|
store: RunStore;
|
|
@@ -113,15 +183,47 @@ export declare class RunManager {
|
|
|
113
183
|
operatorCatalog?: OperatorCatalog;
|
|
114
184
|
seams?: HitlSeams;
|
|
115
185
|
maxConcurrent?: number;
|
|
186
|
+
maxQueued?: number;
|
|
187
|
+
maxConcurrentPerProject?: number;
|
|
188
|
+
/** caller_id → max concurrent active runs for that caller. */
|
|
189
|
+
callerQuotas?: Record<string, number>;
|
|
116
190
|
maxActiveStagesPerRun?: number;
|
|
117
191
|
executionMode?: StageExecutionMode;
|
|
118
192
|
stageProcessLauncher?: StageProcessLauncher;
|
|
193
|
+
a2aStore?: A2aStore;
|
|
194
|
+
knownWritableProjectRoots?: () => Iterable<string> | Promise<Iterable<string>>;
|
|
195
|
+
freeSpaceReader?: FreeSpaceReader;
|
|
196
|
+
/** Test-only: await before materialize when activating a queued run. */
|
|
197
|
+
onBeforeQueuedMaterialize?: (runId: string) => void | Promise<void>;
|
|
119
198
|
});
|
|
120
199
|
getMaxConcurrent(): number;
|
|
121
200
|
setMaxConcurrent(n: number): CapacityHealth;
|
|
122
201
|
getActiveCount(): number;
|
|
202
|
+
stopAcceptingWork(): void;
|
|
203
|
+
isAcceptingWork(): boolean;
|
|
204
|
+
drainActiveStages(options: {
|
|
205
|
+
deadlineMs: number;
|
|
206
|
+
isEscalated?: () => boolean;
|
|
207
|
+
}): Promise<{
|
|
208
|
+
forced: boolean;
|
|
209
|
+
}>;
|
|
123
210
|
getActiveRunIds(): string[];
|
|
124
211
|
getHealth(): CapacityHealth;
|
|
212
|
+
getPerProjectCapacity(): {
|
|
213
|
+
maxConcurrent: number | undefined;
|
|
214
|
+
projects: Array<{
|
|
215
|
+
project_root: string;
|
|
216
|
+
activeCount: number;
|
|
217
|
+
maxConcurrent: number | undefined;
|
|
218
|
+
}>;
|
|
219
|
+
};
|
|
220
|
+
private countActiveForProject;
|
|
221
|
+
private countActiveForCaller;
|
|
222
|
+
private callerQuotaLimit;
|
|
223
|
+
/** Capacity plus on-demand durable-root disk breakdown (KTD16). */
|
|
224
|
+
getHealthWithDisk(): Promise<CapacityHealth>;
|
|
225
|
+
/** Refresh cached `disk_bytes` for one run after a terminal transition. */
|
|
226
|
+
refreshRunDiskBytes(runId: string): Promise<void>;
|
|
125
227
|
getHitlController(): StageHitlController;
|
|
126
228
|
/**
|
|
127
229
|
* KTD7/KTD8: discover waiting stages from the store; leave waiting; do not
|
|
@@ -140,10 +242,38 @@ export declare class RunManager {
|
|
|
140
242
|
reason: string;
|
|
141
243
|
}>;
|
|
142
244
|
}>;
|
|
245
|
+
autoResumeInterruptedStages(): Promise<{
|
|
246
|
+
resumed: Array<{
|
|
247
|
+
runId: string;
|
|
248
|
+
stageId: string;
|
|
249
|
+
}>;
|
|
250
|
+
capped: Array<{
|
|
251
|
+
runId: string;
|
|
252
|
+
stageId: string;
|
|
253
|
+
}>;
|
|
254
|
+
skipped: Array<{
|
|
255
|
+
runId: string;
|
|
256
|
+
stageId: string;
|
|
257
|
+
reason: string;
|
|
258
|
+
}>;
|
|
259
|
+
}>;
|
|
143
260
|
resumeStalledSchedules(): Promise<Array<{
|
|
144
261
|
runId: string;
|
|
145
262
|
}>>;
|
|
263
|
+
/** Rebuild in-memory admission queue from persisted `queued` rows (R27). */
|
|
264
|
+
reenqueuePersistedQueuedRuns(): Promise<void>;
|
|
146
265
|
abandonStage(runId: string, stageId: string): Promise<AbandonStageResult>;
|
|
266
|
+
cancelRun(runId: string, reason: string): Promise<CancelRunResult>;
|
|
267
|
+
setA2aStore(store: A2aStore): void;
|
|
268
|
+
deleteRun(runId: string, options?: {
|
|
269
|
+
force?: boolean;
|
|
270
|
+
channel: DeleteRunChannel;
|
|
271
|
+
}): Promise<DeleteRunResult>;
|
|
272
|
+
gcRuns(options?: {
|
|
273
|
+
execute?: boolean;
|
|
274
|
+
channel?: GcRunsChannel;
|
|
275
|
+
} & Pick<RunRetentionSweepOptions, "now" | "windows" | "env" | "artifactMaxBytes" | "bareCacheTtlMs">): Promise<GcRunsResult>;
|
|
276
|
+
private waitForPromise;
|
|
147
277
|
startRunOnce(input: Parameters<RunManager["startRun"]>[0], submission: RunSubmission): Promise<StartRunOnceResult>;
|
|
148
278
|
private startSubmittedRun;
|
|
149
279
|
startRun(input: StartTaskInput & {
|
|
@@ -154,10 +284,24 @@ export declare class RunManager {
|
|
|
154
284
|
gitSha?: string;
|
|
155
285
|
ciPrUrl?: string;
|
|
156
286
|
ciJobUrl?: string;
|
|
287
|
+
/**
|
|
288
|
+
* Absolute store-key project root from the wire (registered path or
|
|
289
|
+
* seeded-mapped absolute). When set, persisted as run project_root;
|
|
290
|
+
* Host boot / findProjectRoot are not used to override it.
|
|
291
|
+
*/
|
|
292
|
+
projectRoot?: string;
|
|
293
|
+
/** Attribution from auth only — never from request body/query. */
|
|
294
|
+
callerId?: string | null;
|
|
295
|
+
skills?: SkillsPayload;
|
|
157
296
|
}, submission?: RunSubmission): Promise<StartRunResult>;
|
|
158
|
-
rerun(runId: string
|
|
297
|
+
rerun(runId: string, options?: {
|
|
298
|
+
pinned?: boolean;
|
|
299
|
+
callerId?: string | null;
|
|
300
|
+
}): Promise<StartRunResult>;
|
|
159
301
|
retryStage(runId: string, stageId: string): Promise<RetryStageResult>;
|
|
160
|
-
resumeTimedOutStage(runId: string, stageId: string
|
|
302
|
+
resumeTimedOutStage(runId: string, stageId: string, options?: {
|
|
303
|
+
source?: "explicit" | "auto";
|
|
304
|
+
}): Promise<RetryStageResult>;
|
|
161
305
|
recoverManualStage(runId: string, stageId: string, guidance?: string): Promise<RetryStageResult>;
|
|
162
306
|
recoverManualStageUntilStop(runId: string, stageId: string, guidance?: string): Promise<{
|
|
163
307
|
ok: true;
|
|
@@ -203,7 +347,16 @@ export declare class RunManager {
|
|
|
203
347
|
private reconstructAndContinue;
|
|
204
348
|
private reserveAndStartPipeline;
|
|
205
349
|
private busyFailure;
|
|
350
|
+
private insufficientDiskFailure;
|
|
351
|
+
private checkDiskFloorAdmission;
|
|
352
|
+
private isProjectRootAvailable;
|
|
353
|
+
private tryAdmitOrEnqueue;
|
|
206
354
|
private tryReserve;
|
|
355
|
+
private ensureQueuedDone;
|
|
356
|
+
private resolveQueuedDone;
|
|
357
|
+
private attachQueuedDone;
|
|
358
|
+
private drainAdmissionQueue;
|
|
359
|
+
private startDequeuedAdmission;
|
|
207
360
|
private clearReservation;
|
|
208
361
|
private track;
|
|
209
362
|
private tryResumeStalledSchedule;
|
|
@@ -217,4 +370,5 @@ export declare class RunManager {
|
|
|
217
370
|
private quarantineAttachRun;
|
|
218
371
|
private untrackIfGeneration;
|
|
219
372
|
private removeActiveEntry;
|
|
373
|
+
private ensureSchedulingHalt;
|
|
220
374
|
}
|