stageflow 0.23.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 +24 -5
- package/dist/a2a/configDiscovery.d.ts +9 -0
- package/dist/a2a/configDiscovery.js +18 -0
- package/dist/a2a/contracts.d.ts +94 -0
- package/dist/a2a/contracts.js +164 -0
- package/dist/a2a/limits.d.ts +14 -0
- package/dist/a2a/limits.js +29 -0
- package/dist/a2a/registry.d.ts +46 -0
- package/dist/a2a/registry.js +178 -0
- package/dist/a2a/server.d.ts +36 -0
- package/dist/a2a/server.js +344 -0
- package/dist/a2a/service.d.ts +97 -0
- package/dist/a2a/service.js +545 -0
- package/dist/a2a/store.d.ts +109 -0
- package/dist/a2a/store.js +202 -0
- 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/a2aCommand.d.ts +8 -0
- package/dist/cli/a2aCommand.js +131 -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/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 +34 -0
- package/dist/cli/runStageCommand.js +426 -0
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +162 -8
- package/dist/cli.js +190 -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 +591 -76
- 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 +27 -0
- package/dist/runstore/createStore.js +75 -7
- 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 +119 -8
- 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 +37 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +401 -227
- 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 +283 -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/submission.d.ts +11 -0
- package/dist/runstore/submission.js +7 -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 +38 -1
- package/dist/runtime/pipelineRunner.js +179 -15
- package/dist/runtime/pipelineScheduler.d.ts +15 -0
- package/dist/runtime/pipelineScheduler.js +167 -42
- package/dist/runtime/reloadRunCatalog.js +12 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resolveEnvelopeRef.d.ts +30 -0
- package/dist/runtime/resolveEnvelopeRef.js +79 -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 +179 -4
- package/dist/runtime/runManager.js +1644 -83
- 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 +38 -2
- package/dist/server/bootstrap.js +219 -4
- 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 +109 -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 +6 -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,47 @@
|
|
|
1
|
+
import type { RunMeta, RunStore } from "../runstore/port.js";
|
|
2
|
+
import type { TaskFile } from "../types/task.js";
|
|
3
|
+
import type { WorkspaceBinding } from "./workspaceBinding.js";
|
|
4
|
+
export type StartFailureCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota" | "repository_auth_failed" | "repository_not_found" | "ref_not_found" | "repository_fetch_failed" | "worktree_create_failed" | "git_missing" | "insufficient_disk" | "disk_check_failed" | "pinned_sha_unavailable" | "invalid_run_branch" | "task.binding_conflict" | "task.repository_ref_required" | "task.ref_without_repository" | "task.repository_invalid" | "task.invalid_shape" | "task.load_error" | "start.token_rejected" | "inline_pipeline_too_large" | "skills_invalid_name" | "skills_invalid_path" | "skills_missing_skill_md" | "skills_payload_too_large" | "missing_tool" | "tool_version_mismatch" | "unknown_version" | "secret_unavailable" | "unresolved_var" | "shutting_down" | "autostart_disabled" | "ensure_project_not_allowed" | "claude_as_root";
|
|
5
|
+
export type MaterializedBinding = {
|
|
6
|
+
runId: string;
|
|
7
|
+
checkoutRoot?: string;
|
|
8
|
+
repository?: string;
|
|
9
|
+
ref?: string;
|
|
10
|
+
resolvedSha?: string;
|
|
11
|
+
runBranch?: string;
|
|
12
|
+
};
|
|
13
|
+
export type DerivedBindingKind = "repository" | "checkout" | "unbound";
|
|
14
|
+
export declare function derivedBindingKindFromMeta(meta: RunMeta): DerivedBindingKind;
|
|
15
|
+
export declare function worktreePathForRun(runId: string): string;
|
|
16
|
+
export declare function resolveRunBranchTemplate(task: TaskFile): string;
|
|
17
|
+
export declare class StartLinkError extends Error {
|
|
18
|
+
readonly code: StartFailureCode;
|
|
19
|
+
readonly status: number;
|
|
20
|
+
readonly stderr?: string;
|
|
21
|
+
constructor(message: string, options: {
|
|
22
|
+
code: StartFailureCode;
|
|
23
|
+
status: number;
|
|
24
|
+
stderr?: string;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export declare function throwMappedGitError(err: unknown, phase: "fetch" | "resolve" | "worktree"): never;
|
|
28
|
+
export type MaterializeOptions = {
|
|
29
|
+
runId: string;
|
|
30
|
+
task: TaskFile;
|
|
31
|
+
binding: WorkspaceBinding;
|
|
32
|
+
checkoutRoot?: string;
|
|
33
|
+
pinned?: {
|
|
34
|
+
ref: string;
|
|
35
|
+
resolvedSha: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type ReclaimWorkspaceBindingOptions = {
|
|
39
|
+
/** When true, remove the worktree but leave `run_branch` (SLIM must keep the branch). */
|
|
40
|
+
keepRunBranch?: boolean;
|
|
41
|
+
};
|
|
42
|
+
export declare function reclaimWorkspaceBinding(meta: RunMeta, options?: ReclaimWorkspaceBindingOptions): Promise<void>;
|
|
43
|
+
export declare function reclaimWorkspaceOnRunSucceeded(store: RunStore, runId: string): Promise<void>;
|
|
44
|
+
export declare function materializeWorkspaceBinding(options: MaterializeOptions): Promise<{
|
|
45
|
+
materialized: MaterializedBinding;
|
|
46
|
+
rollback: () => Promise<void>;
|
|
47
|
+
}>;
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type StoreLookupKind } from "../server/operatorResults.js";
|
|
2
|
+
import type { RunStore } from "../runstore/port.js";
|
|
3
|
+
import type { TaskFile } from "../types/task.js";
|
|
4
|
+
export type EnvelopeRefInput = {
|
|
5
|
+
runId: string;
|
|
6
|
+
stageId: string;
|
|
7
|
+
attempt?: number;
|
|
8
|
+
};
|
|
9
|
+
type EnvelopeRefStore = Pick<RunStore, "readRunMeta" | "readRun" | "readEnvelope">;
|
|
10
|
+
/** Carries enough to map onto either MCP's textResult shape or an A2aApplicationError. */
|
|
11
|
+
export declare class EnvelopeRefError extends Error {
|
|
12
|
+
readonly status: number;
|
|
13
|
+
readonly kind: StoreLookupKind;
|
|
14
|
+
constructor(message: string, status: number, kind: StoreLookupKind);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves one or more Envelope References (ADR-0002) into a TaskFile for
|
|
18
|
+
* the next standalone stage call — shared by the MCP run_stage tool and the
|
|
19
|
+
* A2A run_stage operation so this resolution logic exists in exactly one
|
|
20
|
+
* place (it was duplicated between them once already; see the reuse finding
|
|
21
|
+
* from this feature's code review).
|
|
22
|
+
*
|
|
23
|
+
* A single ref keeps today's exact shape: goal = its summary, input = its
|
|
24
|
+
* payload verbatim. Multiple refs namespace each resolved payload under its
|
|
25
|
+
* stageId (disambiguated by runId only if two refs share a stageId), so a
|
|
26
|
+
* stage author addresses each source by name in their own io.input.schema
|
|
27
|
+
* instead of one silently overwriting another on a key collision.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveEnvelopeRefsToTask(store: EnvelopeRefStore, refs: EnvelopeRefInput | EnvelopeRefInput[], checkout?: string): Promise<TaskFile>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { mapStoreLookupError } from "../server/operatorResults.js";
|
|
2
|
+
/** Carries enough to map onto either MCP's textResult shape or an A2aApplicationError. */
|
|
3
|
+
export class EnvelopeRefError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
kind;
|
|
6
|
+
constructor(message, status, kind) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.kind = kind;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function resolveOne(store, ref) {
|
|
13
|
+
try {
|
|
14
|
+
await store.readRunMeta(ref.runId);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const mapped = mapStoreLookupError(err, { policy: "run" });
|
|
18
|
+
throw new EnvelopeRefError(mapped.error, mapped.status, mapped.kind);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const detail = await store.readRun(ref.runId);
|
|
22
|
+
if (!detail.stages.some((s) => s.stage_id === ref.stageId)) {
|
|
23
|
+
throw new EnvelopeRefError(`Stage not found: ${ref.stageId}`, 404, "not_found");
|
|
24
|
+
}
|
|
25
|
+
return await store.readEnvelope(ref.runId, ref.stageId, ref.attempt);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof EnvelopeRefError)
|
|
29
|
+
throw err;
|
|
30
|
+
const mapped = mapStoreLookupError(err, { policy: "envelope" });
|
|
31
|
+
throw new EnvelopeRefError(mapped.error, mapped.status, mapped.kind);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolves one or more Envelope References (ADR-0002) into a TaskFile for
|
|
36
|
+
* the next standalone stage call — shared by the MCP run_stage tool and the
|
|
37
|
+
* A2A run_stage operation so this resolution logic exists in exactly one
|
|
38
|
+
* place (it was duplicated between them once already; see the reuse finding
|
|
39
|
+
* from this feature's code review).
|
|
40
|
+
*
|
|
41
|
+
* A single ref keeps today's exact shape: goal = its summary, input = its
|
|
42
|
+
* payload verbatim. Multiple refs namespace each resolved payload under its
|
|
43
|
+
* stageId (disambiguated by runId only if two refs share a stageId), so a
|
|
44
|
+
* stage author addresses each source by name in their own io.input.schema
|
|
45
|
+
* instead of one silently overwriting another on a key collision.
|
|
46
|
+
*/
|
|
47
|
+
export async function resolveEnvelopeRefsToTask(store, refs, checkout) {
|
|
48
|
+
const list = Array.isArray(refs) ? refs : [refs];
|
|
49
|
+
const resolved = [];
|
|
50
|
+
for (const ref of list) {
|
|
51
|
+
resolved.push({ ref, envelope: await resolveOne(store, ref) });
|
|
52
|
+
}
|
|
53
|
+
if (resolved.length === 1) {
|
|
54
|
+
const { ref, envelope } = resolved[0];
|
|
55
|
+
return {
|
|
56
|
+
id: `ref-${ref.runId}-${ref.stageId}`,
|
|
57
|
+
goal: envelope.summary,
|
|
58
|
+
input: envelope.payload ?? {},
|
|
59
|
+
...(checkout ? { checkout } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const usedKeys = new Set();
|
|
63
|
+
const input = {};
|
|
64
|
+
const summaryLines = [];
|
|
65
|
+
for (const { ref, envelope } of resolved) {
|
|
66
|
+
let key = ref.stageId;
|
|
67
|
+
if (usedKeys.has(key))
|
|
68
|
+
key = `${ref.stageId}:${ref.runId}`;
|
|
69
|
+
usedKeys.add(key);
|
|
70
|
+
input[key] = envelope.payload ?? {};
|
|
71
|
+
summaryLines.push(`${key}: ${envelope.summary}`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
id: `ref-${list.map((r) => r.stageId).join("+")}`,
|
|
75
|
+
goal: summaryLines.join("\n"),
|
|
76
|
+
input,
|
|
77
|
+
...(checkout ? { checkout } : {}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -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
|
+
}
|