stageflow 0.25.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -3
- package/builtin-skills/browser/SKILL.md +42 -0
- package/dist/a2a/contracts.d.ts +1 -0
- package/dist/a2a/contracts.js +1 -0
- package/dist/a2a/registry.d.ts +2 -0
- package/dist/a2a/registry.js +20 -1
- package/dist/a2a/server.d.ts +7 -0
- package/dist/a2a/server.js +5 -2
- package/dist/a2a/service.d.ts +1 -1
- package/dist/a2a/service.js +57 -8
- package/dist/a2a/store.d.ts +8 -5
- package/dist/a2a/store.js +24 -67
- package/dist/agent/activity.d.ts +3 -0
- package/dist/agent/bootProviderConfig.d.ts +21 -0
- package/dist/agent/bootProviderConfig.js +74 -0
- package/dist/agent/claudeAdapter.js +2 -2
- package/dist/agent/cursorProvider.d.ts +2 -0
- package/dist/agent/cursorProvider.js +30 -5
- package/dist/agent/fakeAgent.d.ts +1 -0
- package/dist/agent/fakeAgent.js +13 -0
- package/dist/agent/piAdapter.d.ts +11 -24
- package/dist/agent/piAdapter.js +107 -50
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/piSessionFactory.d.ts +38 -0
- package/dist/agent/piSessionFactory.js +60 -0
- package/dist/agent/port.d.ts +8 -0
- package/dist/agent/streamLogRedact.d.ts +7 -1
- package/dist/agent/streamLogRedact.js +26 -11
- package/dist/browser/anchor.d.ts +27 -0
- package/dist/browser/anchor.js +127 -0
- package/dist/browser/auditSink.d.ts +38 -0
- package/dist/browser/auditSink.js +34 -0
- package/dist/browser/browserHost.d.ts +86 -0
- package/dist/browser/browserHost.js +7 -0
- package/dist/browser/browserSweep.d.ts +14 -0
- package/dist/browser/browserSweep.js +54 -0
- package/dist/browser/browserTeardown.d.ts +56 -0
- package/dist/browser/browserTeardown.js +235 -0
- package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
- package/dist/browser/fakeRemoteBrowserHost.js +34 -0
- package/dist/browser/gateHandoff.d.ts +25 -0
- package/dist/browser/gateHandoff.js +83 -0
- package/dist/browser/humanLogin.d.ts +18 -0
- package/dist/browser/humanLogin.js +34 -0
- package/dist/browser/keyProvider.d.ts +10 -0
- package/dist/browser/keyProvider.js +39 -0
- package/dist/browser/localBrowserHost.d.ts +10 -0
- package/dist/browser/localBrowserHost.js +152 -0
- package/dist/browser/localProfileLock.d.ts +2 -0
- package/dist/browser/localProfileLock.js +218 -0
- package/dist/browser/localProfileStore.d.ts +5 -0
- package/dist/browser/localProfileStore.js +91 -0
- package/dist/browser/loginCheck.d.ts +53 -0
- package/dist/browser/loginCheck.js +147 -0
- package/dist/browser/memoryProfileLock.d.ts +2 -0
- package/dist/browser/memoryProfileLock.js +53 -0
- package/dist/browser/memoryProfileStore.d.ts +2 -0
- package/dist/browser/memoryProfileStore.js +31 -0
- package/dist/browser/navigationAudit.d.ts +16 -0
- package/dist/browser/navigationAudit.js +53 -0
- package/dist/browser/persistedEnv.d.ts +3 -0
- package/dist/browser/persistedEnv.js +15 -0
- package/dist/browser/profileLock.d.ts +40 -0
- package/dist/browser/profileLock.js +10 -0
- package/dist/browser/profileStore.d.ts +23 -0
- package/dist/browser/profileStore.js +39 -0
- package/dist/browser/runLiveness.d.ts +13 -0
- package/dist/browser/runLiveness.js +39 -0
- package/dist/browser/sitePolicy.d.ts +10 -0
- package/dist/browser/sitePolicy.js +61 -0
- package/dist/browser/stageBrowserEnv.d.ts +22 -0
- package/dist/browser/stageBrowserEnv.js +147 -0
- package/dist/browser/stageProfileLock.d.ts +17 -0
- package/dist/browser/stageProfileLock.js +39 -0
- package/dist/cli/artifactCommand.js +9 -16
- package/dist/cli/backupCommand.d.ts +9 -0
- package/dist/cli/backupCommand.js +111 -0
- package/dist/cli/browserCommand.d.ts +44 -0
- package/dist/cli/browserCommand.js +472 -0
- package/dist/cli/debugRunCommand.d.ts +10 -0
- package/dist/cli/debugRunCommand.js +109 -0
- package/dist/cli/doctorCommand.d.ts +32 -0
- package/dist/cli/doctorCommand.js +453 -0
- package/dist/cli/envelopeCommand.js +9 -2
- package/dist/cli/exportAllCommand.d.ts +55 -0
- package/dist/cli/exportAllCommand.js +218 -0
- package/dist/cli/exportRunCommand.js +23 -21
- package/dist/cli/hostClient.d.ts +41 -3
- package/dist/cli/hostClient.js +129 -14
- package/dist/cli/initCommand.d.ts +1 -0
- package/dist/cli/initCommand.js +23 -7
- package/dist/cli/initTemplates.d.ts +5 -2
- package/dist/cli/initTemplates.js +32 -2
- package/dist/cli/resolveSafeOutPath.d.ts +2 -0
- package/dist/cli/resolveSafeOutPath.js +40 -0
- package/dist/cli/restoreCommand.d.ts +10 -0
- package/dist/cli/restoreCommand.js +90 -0
- package/dist/cli/runCommand.d.ts +3 -2
- package/dist/cli/runCommand.js +93 -11
- package/dist/cli/runOutput.d.ts +4 -0
- package/dist/cli/runOutput.js +33 -7
- package/dist/cli/runStageCommand.d.ts +1 -0
- package/dist/cli/runStageCommand.js +44 -25
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +168 -10
- package/dist/cli/triggerCommand.d.ts +12 -0
- package/dist/cli/triggerCommand.js +183 -0
- package/dist/cli/validateCommand.d.ts +1 -1
- package/dist/cli/validateCommand.js +23 -6
- package/dist/cli.js +202 -32
- package/dist/config/browseCatalog.d.ts +1 -0
- package/dist/config/browseCatalog.js +5 -4
- package/dist/config/builtinSkills.d.ts +4 -0
- package/dist/config/builtinSkills.js +23 -0
- package/dist/config/catalogRelativePath.d.ts +63 -0
- package/dist/config/catalogRelativePath.js +126 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/createTrigger.d.ts +27 -0
- package/dist/config/createTrigger.js +232 -0
- package/dist/config/draftPackage.d.ts +117 -0
- package/dist/config/draftPackage.js +550 -0
- package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
- package/dist/config/ensureCatalogScanRoot.js +73 -0
- package/dist/config/hostConfig.d.ts +57 -0
- package/dist/config/hostConfig.js +360 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +206 -5
- package/dist/config/loadOutcome.d.ts +7 -1
- package/dist/config/loadPipeline.js +39 -2
- package/dist/config/loadStage.js +25 -0
- package/dist/config/loadStageflowManifest.js +25 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- package/dist/config/loadTrigger.d.ts +9 -0
- package/dist/config/loadTrigger.js +120 -0
- package/dist/config/materializeStageModels.js +5 -1
- package/dist/config/mergePipelineIncludes.d.ts +3 -0
- package/dist/config/mergePipelineIncludes.js +19 -0
- package/dist/config/migrateYaml.js +6 -11
- package/dist/config/multiProjectCatalog.d.ts +32 -0
- package/dist/config/multiProjectCatalog.js +150 -0
- package/dist/config/normalizePipelineStageEntry.js +27 -1
- package/dist/config/parseCompletionContract.js +6 -0
- package/dist/config/pipelineStageKeys.js +3 -0
- package/dist/config/publishDraftPackage.d.ts +7 -0
- package/dist/config/publishDraftPackage.js +25 -0
- package/dist/config/resolveCatalogContext.js +1 -1
- package/dist/config/resolveCatalogRoots.d.ts +27 -0
- package/dist/config/resolveCatalogRoots.js +76 -0
- package/dist/config/resolveModel.d.ts +7 -1
- package/dist/config/resolveModel.js +11 -1
- package/dist/config/resolvePipelineDag.js +1 -1
- package/dist/config/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- package/dist/config/scanCatalogPaths.d.ts +1 -1
- package/dist/config/scanCatalogPaths.js +6 -2
- package/dist/config/secretFromEnvOrFile.d.ts +9 -0
- package/dist/config/secretFromEnvOrFile.js +34 -0
- package/dist/config/seededCatalog.d.ts +11 -0
- package/dist/config/seededCatalog.js +29 -0
- package/dist/config/stageBrowser.d.ts +12 -0
- package/dist/config/stageBrowser.js +118 -0
- package/dist/config/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/triggerCatalog.d.ts +10 -0
- package/dist/config/triggerCatalog.js +37 -0
- package/dist/config/validateCatalog.d.ts +17 -3
- package/dist/config/validateCatalog.js +223 -3
- package/dist/config/validateCompletionContract.js +8 -0
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -0
- package/dist/envelope/preEmitChecks.d.ts +1 -1
- package/dist/envelope/preEmitChecks.js +8 -0
- package/dist/errors/codes.d.ts +14 -0
- package/dist/errors/codes.js +59 -0
- package/dist/git/cache.d.ts +14 -0
- package/dist/git/cache.js +150 -0
- package/dist/git/credentials.d.ts +9 -0
- package/dist/git/credentials.js +88 -0
- package/dist/git/errors.d.ts +20 -0
- package/dist/git/errors.js +94 -0
- package/dist/git/exec.d.ts +16 -0
- package/dist/git/exec.js +135 -0
- package/dist/git/operations.d.ts +29 -0
- package/dist/git/operations.js +153 -0
- package/dist/git/version.d.ts +1 -0
- package/dist/git/version.js +10 -0
- package/dist/logging/audit.d.ts +16 -0
- package/dist/logging/audit.js +19 -0
- package/dist/logging/commonWords.d.ts +2 -0
- package/dist/logging/commonWords.js +13 -0
- package/dist/logging/logger.d.ts +49 -0
- package/dist/logging/logger.js +193 -0
- package/dist/logging/namedSecrets.d.ts +6 -0
- package/dist/logging/namedSecrets.js +58 -0
- package/dist/logging/redact.d.ts +17 -0
- package/dist/logging/redact.js +105 -0
- package/dist/mcp/catalogTools.js +492 -81
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +182 -6
- package/dist/mcp/deps.d.ts +3 -0
- package/dist/mcp/getStartedTool.d.ts +3 -0
- package/dist/mcp/getStartedTool.js +62 -0
- package/dist/mcp/readArtifact.d.ts +11 -0
- package/dist/mcp/readArtifact.js +46 -30
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/triggerTools.d.ts +3 -0
- package/dist/mcp/triggerTools.js +176 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -0
- package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
- package/dist/operatorAgent/docsRetrieval.js +269 -0
- package/dist/operatorAgent/draftContext.d.ts +16 -0
- package/dist/operatorAgent/draftContext.js +68 -0
- package/dist/operatorAgent/fakeHost.d.ts +39 -0
- package/dist/operatorAgent/fakeHost.js +92 -0
- package/dist/operatorAgent/host.d.ts +40 -0
- package/dist/operatorAgent/host.js +179 -0
- package/dist/operatorAgent/index.d.ts +9 -0
- package/dist/operatorAgent/index.js +8 -0
- package/dist/operatorAgent/piModel.d.ts +80 -0
- package/dist/operatorAgent/piModel.js +528 -0
- package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
- package/dist/operatorAgent/proposals.d.ts +32 -0
- package/dist/operatorAgent/proposals.js +144 -0
- package/dist/operatorAgent/types.d.ts +128 -0
- package/dist/operatorAgent/types.js +1 -0
- package/dist/package-meta.d.ts +2 -1
- package/dist/package-meta.js +2 -1
- package/dist/preflight/bash.d.ts +8 -0
- package/dist/preflight/bash.js +34 -0
- package/dist/preflight/claudeRoot.d.ts +11 -0
- package/dist/preflight/claudeRoot.js +23 -0
- package/dist/preflight/mcpCommands.d.ts +8 -0
- package/dist/preflight/mcpCommands.js +36 -0
- package/dist/preflight/pipelinePreflight.d.ts +40 -0
- package/dist/preflight/pipelinePreflight.js +192 -0
- package/dist/preflight/tls.d.ts +6 -0
- package/dist/preflight/tls.js +18 -0
- package/dist/preflight/toolchain.d.ts +45 -0
- package/dist/preflight/toolchain.js +219 -0
- package/dist/project/findManifestRoot.d.ts +3 -0
- package/dist/project/findManifestRoot.js +35 -0
- package/dist/project/findProjectRoot.js +3 -4
- package/dist/project/globalHome.d.ts +7 -0
- package/dist/project/globalHome.js +63 -2
- package/dist/project/resolveProjectContext.js +2 -2
- package/dist/project/resolveStageflowContext.d.ts +7 -0
- package/dist/project/resolveStageflowContext.js +46 -30
- package/dist/projection/projectRun.d.ts +2 -1
- package/dist/projection/projectRun.js +1 -0
- package/dist/runstore/assertTmpdir.d.ts +1 -0
- package/dist/runstore/assertTmpdir.js +25 -0
- package/dist/runstore/backup.d.ts +52 -0
- package/dist/runstore/backup.js +292 -0
- package/dist/runstore/createStore.d.ts +18 -1
- package/dist/runstore/createStore.js +64 -5
- package/dist/runstore/debugBundle.d.ts +60 -0
- package/dist/runstore/debugBundle.js +143 -0
- package/dist/runstore/diskUsage.d.ts +50 -0
- package/dist/runstore/diskUsage.js +214 -0
- package/dist/runstore/exportRunPayload.d.ts +8 -0
- package/dist/runstore/exportRunPayload.js +23 -0
- package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
- package/dist/runstore/normalizeCatalogPath.js +10 -0
- package/dist/runstore/paths.d.ts +5 -0
- package/dist/runstore/paths.js +145 -1
- package/dist/runstore/port.d.ts +139 -13
- package/dist/runstore/port.js +8 -1
- package/dist/runstore/restore.d.ts +81 -0
- package/dist/runstore/restore.js +355 -0
- package/dist/runstore/retention.d.ts +27 -0
- package/dist/runstore/retention.js +74 -0
- package/dist/runstore/runManifest.d.ts +146 -0
- package/dist/runstore/runManifest.js +288 -0
- package/dist/runstore/runProjection.d.ts +3 -1
- package/dist/runstore/runProjection.js +63 -1
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
- package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
- package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
- package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
- package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +78 -0
- package/dist/runstore/sqlite/schema.d.ts +20 -1
- package/dist/runstore/sqlite/schema.js +277 -1
- package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
- package/dist/runstore/sqlite/storeOpenError.js +11 -0
- package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
- package/dist/runstore/sqlite/storeSchemaError.js +8 -0
- package/dist/runstore/stageExecution.js +3 -0
- package/dist/runstore/storeFilesystem.d.ts +32 -0
- package/dist/runstore/storeFilesystem.js +148 -0
- package/dist/runstore/trackProjection.js +2 -0
- package/dist/runstore/workspaceLayout.d.ts +13 -0
- package/dist/runstore/workspaceLayout.js +76 -0
- package/dist/runtime/answerResume.d.ts +1 -0
- package/dist/runtime/answerResume.js +3 -1
- package/dist/runtime/completionCheckRunner.d.ts +15 -1
- package/dist/runtime/completionCheckRunner.js +67 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialBinding.d.ts +2 -0
- package/dist/runtime/credentialBinding.js +3 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/emailSource.d.ts +72 -0
- package/dist/runtime/emailSource.js +304 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/githubPollSource.d.ts +86 -0
- package/dist/runtime/githubPollSource.js +284 -0
- package/dist/runtime/pipelineRunner.d.ts +40 -1
- package/dist/runtime/pipelineRunner.js +181 -17
- package/dist/runtime/pipelineScheduler.d.ts +17 -0
- package/dist/runtime/pipelineScheduler.js +220 -28
- package/dist/runtime/reloadRunCatalog.js +6 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resumeTimedOut.d.ts +1 -1
- package/dist/runtime/resumeTimedOut.js +5 -2
- package/dist/runtime/runChangeBus.js +9 -0
- package/dist/runtime/runDeletion.d.ts +7 -0
- package/dist/runtime/runDeletion.js +37 -0
- package/dist/runtime/runManager.d.ts +169 -4
- package/dist/runtime/runManager.js +1748 -83
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +4 -0
- package/dist/runtime/runRetryCoordinator.js +20 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/scheduleSource.d.ts +38 -0
- package/dist/runtime/scheduleSource.js +119 -0
- package/dist/runtime/settingsFile.d.ts +5 -0
- package/dist/runtime/settingsFile.js +61 -54
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +250 -27
- package/dist/runtime/stageCacheEnv.d.ts +6 -0
- package/dist/runtime/stageCacheEnv.js +34 -0
- package/dist/runtime/stageConcurrency.d.ts +2 -1
- package/dist/runtime/stageConcurrency.js +4 -2
- package/dist/runtime/stageEnvironment.d.ts +38 -0
- package/dist/runtime/stageEnvironment.js +194 -0
- package/dist/runtime/stageHitl.d.ts +1 -0
- package/dist/runtime/stageHitl.js +5 -1
- package/dist/runtime/stageProcessLauncher.d.ts +20 -0
- package/dist/runtime/stageProcessLauncher.js +236 -41
- package/dist/runtime/stageRecovery.d.ts +3 -1
- package/dist/runtime/stageRecovery.js +19 -4
- package/dist/runtime/stageRoots.d.ts +38 -1
- package/dist/runtime/stageRoots.js +118 -0
- package/dist/runtime/stageRunner.d.ts +6 -0
- package/dist/runtime/stageRunner.js +32 -6
- package/dist/runtime/stageSecretDecl.d.ts +9 -0
- package/dist/runtime/stageSecretDecl.js +102 -0
- package/dist/runtime/stageSecrets.d.ts +40 -0
- package/dist/runtime/stageSecrets.js +181 -0
- package/dist/runtime/stageStreamLog.d.ts +1 -0
- package/dist/runtime/stageStreamLog.js +2 -1
- package/dist/runtime/stageWorker.d.ts +3 -2
- package/dist/runtime/stageWorker.js +58 -10
- package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
- package/dist/runtime/stageWorkerProtocol.js +8 -0
- package/dist/runtime/startPayload.d.ts +32 -0
- package/dist/runtime/startPayload.js +59 -0
- package/dist/runtime/taskInput.js +14 -5
- package/dist/runtime/triggerCatalog.d.ts +6 -0
- package/dist/runtime/triggerCatalog.js +24 -0
- package/dist/runtime/triggerEventMatch.d.ts +2 -0
- package/dist/runtime/triggerEventMatch.js +6 -0
- package/dist/runtime/triggerPort.d.ts +14 -0
- package/dist/runtime/triggerPort.js +1 -0
- package/dist/runtime/triggerRunner.d.ts +17 -0
- package/dist/runtime/triggerRunner.js +89 -0
- package/dist/runtime/verifiedStageExecution.d.ts +8 -0
- package/dist/runtime/verifiedStageExecution.js +16 -1
- package/dist/runtime/webhookSignature.d.ts +1 -0
- package/dist/runtime/webhookSignature.js +12 -0
- package/dist/runtime/workspaceBinding.d.ts +20 -0
- package/dist/runtime/workspaceBinding.js +60 -0
- package/dist/server/allowedHosts.d.ts +19 -0
- package/dist/server/allowedHosts.js +179 -0
- package/dist/server/bootstrap.d.ts +42 -2
- package/dist/server/bootstrap.js +273 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +254 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +106 -10
- package/dist/server/ensureGlobalService.d.ts +5 -1
- package/dist/server/ensureGlobalService.js +35 -1
- package/dist/server/healthSurfaces.d.ts +6 -0
- package/dist/server/healthSurfaces.js +123 -0
- package/dist/server/http.d.ts +27 -1
- package/dist/server/http.js +2254 -477
- package/dist/server/listenHost.d.ts +5 -0
- package/dist/server/listenHost.js +56 -0
- package/dist/server/mcpHost.d.ts +10 -1
- package/dist/server/mcpHost.js +36 -6
- package/dist/server/operatorResults.d.ts +2 -2
- package/dist/server/operatorResults.js +40 -29
- package/dist/server/requestAuthContext.d.ts +12 -0
- package/dist/server/requestAuthContext.js +21 -0
- package/dist/server/shutdown.d.ts +69 -0
- package/dist/server/shutdown.js +219 -0
- package/dist/server/triggerRoutes.d.ts +15 -0
- package/dist/server/triggerRoutes.js +268 -0
- package/dist/tools/askOperator.d.ts +3 -2
- package/dist/types/completion.d.ts +3 -0
- package/dist/types/pipeline.d.ts +10 -1
- package/dist/types/preEmitCheck.d.ts +7 -0
- package/dist/types/stage.d.ts +22 -0
- package/dist/types/stageflowManifest.d.ts +3 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/types/trigger.d.ts +18 -0
- package/dist/types/trigger.js +1 -0
- package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
- package/dist/ui/assets/index-CntB4bZR.js +133 -0
- package/dist/ui/index.html +2 -2
- package/dist/workshop/autosave.d.ts +58 -0
- package/dist/workshop/autosave.js +222 -0
- package/dist/workshop/buildStore.d.ts +79 -0
- package/dist/workshop/buildStore.js +326 -0
- package/dist/workshop/chatTurn.d.ts +232 -0
- package/dist/workshop/chatTurn.js +475 -0
- package/dist/workshop/modelSettings.d.ts +18 -0
- package/dist/workshop/modelSettings.js +44 -0
- package/dist/workshop/sessionStore.d.ts +61 -0
- package/dist/workshop/sessionStore.js +254 -0
- package/dist/workshop/workshopPin.d.ts +72 -0
- package/dist/workshop/workshopPin.js +193 -0
- package/examples/README.md +99 -0
- package/examples/archify-on-pr/README.md +213 -0
- package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
- package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
- package/examples/archify-on-pr/author-diagrams.yaml +106 -0
- package/examples/archify-on-pr/detect-changes.yaml +89 -0
- package/examples/browser-session/README.md +77 -0
- package/examples/browser-session/browser-session.pipeline.yaml +50 -0
- package/examples/browser-session/browser-session.task.yaml +6 -0
- package/examples/browser-session/check-login.yaml +22 -0
- package/examples/browser-session/fixture-server.mjs +64 -0
- package/examples/browser-session/human-login.yaml +31 -0
- package/examples/browser-session/merge.yaml +36 -0
- package/examples/browser-session/work-a.yaml +41 -0
- package/examples/browser-session/work-b.yaml +41 -0
- package/examples/ci-validate/README.md +35 -0
- package/examples/ci-validate/check.yaml +13 -0
- package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
- package/examples/ci-validate/validate.sh +5 -0
- package/examples/compliance-review-demo/README.md +125 -0
- package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
- package/examples/compliance-review-demo/connect-account.yaml +47 -0
- package/examples/compliance-review-demo/map-to-control.yaml +123 -0
- package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
- package/examples/compliance-review-demo/publish-report.yaml +79 -0
- package/examples/compliance-review-demo/review-verdict.yaml +122 -0
- package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
- package/examples/compliance-review-demo/store-evidence.yaml +143 -0
- package/examples/conditional-fork/README.md +89 -0
- package/examples/conditional-fork/branch-a.yaml +13 -0
- package/examples/conditional-fork/branch-b.yaml +13 -0
- package/examples/conditional-fork/decide.yaml +35 -0
- package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
- package/examples/conditional-fork/fork-demo.task.yaml +8 -0
- package/examples/context7-mcp/README.md +42 -0
- package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
- package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
- package/examples/context7-mcp/fetch-docs.yaml +52 -0
- package/examples/context7-mcp/resolve-library.yaml +31 -0
- package/examples/context7-mcp/write-brief.yaml +52 -0
- package/examples/feature-loop/README.md +104 -0
- package/examples/feature-loop/address-feedback.yaml +148 -0
- package/examples/feature-loop/align.yaml +116 -0
- package/examples/feature-loop/decompose.yaml +86 -0
- package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
- package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
- package/examples/feature-loop/feature-loop.task.yaml +25 -0
- package/examples/feature-loop/implement.yaml +128 -0
- package/examples/feature-loop/plan.yaml +111 -0
- package/examples/feature-loop/publish.yaml +167 -0
- package/examples/feature-loop/review.yaml +146 -0
- package/examples/feature-loop/verify.yaml +106 -0
- package/examples/feedback-loop/README.md +72 -0
- package/examples/feedback-loop/VERIFY.md +208 -0
- package/examples/feedback-loop/continue-only.task.yaml +4 -0
- package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
- package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
- package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
- package/examples/feedback-loop/implement.yaml +14 -0
- package/examples/feedback-loop/plan.yaml +14 -0
- package/examples/feedback-loop/review.yaml +15 -0
- package/examples/feedback-loop/send-back-once.task.yaml +6 -0
- package/examples/feedback-loop/submit.yaml +12 -0
- package/examples/generic-fan-in/README.md +151 -0
- package/examples/generic-fan-in/clarify.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
- package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
- package/examples/generic-fan-in/research.yaml +45 -0
- package/examples/generic-fan-in/synthesize.yaml +66 -0
- package/examples/generic-fan-in/validation.yaml +45 -0
- package/examples/github-release/README.md +78 -0
- package/examples/github-release/draft-release-notes.yaml +64 -0
- package/examples/github-release/github-release.pipeline.yaml +11 -0
- package/examples/github-release/github-release.task.yaml +13 -0
- package/examples/github-release/publish-github-release.yaml +64 -0
- package/examples/hello-world/README.md +28 -0
- package/examples/hello-world/hello.pipeline.yaml +4 -0
- package/examples/hello-world/my-task.task.yaml +6 -0
- package/examples/hello-world/research.yaml +18 -0
- package/examples/mcp-hitl-tour/README.md +113 -0
- package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
- package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
- package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
- package/examples/mcp-hitl-tour/gather.yaml +31 -0
- package/examples/mcp-hitl-tour/intake.yaml +62 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
- package/examples/mcp-hitl-tour/polish.yaml +33 -0
- package/examples/mcp-hitl-tour/review.yaml +17 -0
- package/examples/mcp-hitl-tour/ship.yaml +25 -0
- package/examples/oss-issue-contribution/README.md +218 -0
- package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
- package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
- package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
- package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
- package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
- package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
- package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
- package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
- package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
- package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
- package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
- package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
- package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
- package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
- package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
- package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
- package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
- package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
- package/examples/oss-quick-fix/README.md +65 -0
- package/examples/oss-quick-fix/implement-fix.yaml +84 -0
- package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
- package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
- package/examples/oss-quick-fix/ship-fix.yaml +81 -0
- package/examples/oss-quick-fix/understand-issue.yaml +67 -0
- package/examples/oss-quick-fix/verify-fix.yaml +73 -0
- package/examples/plan-review/README.md +37 -0
- package/examples/plan-review/plan-review-followup.yaml +13 -0
- package/examples/plan-review/plan-review.pipeline.yaml +9 -0
- package/examples/plan-review/plan-review.task.yaml +9 -0
- package/examples/plan-review/plan-review.yaml +25 -0
- package/examples/playwright-mcp/README.md +39 -0
- package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
- package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
- package/examples/playwright-mcp/screenshot.yaml +40 -0
- package/examples/retry-tour/README.md +75 -0
- package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
- package/examples/retry-tour/retry-tour.task.yaml +9 -0
- package/examples/route-if-tour/README.md +202 -0
- package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
- package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
- package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
- package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
- package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
- package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
- package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
- package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
- package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
- package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
- package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
- package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
- package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
- package/examples/route-wiring-smoke-test/README.md +377 -0
- package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
- package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
- package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
- package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
- package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
- package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
- package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
- package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
- package/examples/ship-feature/README.md +190 -0
- package/examples/ship-feature/feat-address-feedback.yaml +119 -0
- package/examples/ship-feature/feat-implement.yaml +180 -0
- package/examples/ship-feature/feat-plan.yaml +120 -0
- package/examples/ship-feature/feat-review.yaml +109 -0
- package/examples/ship-feature/feat-ship.yaml +203 -0
- package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
- package/examples/ship-feature/ship-feature.task.yaml +78 -0
- package/examples/stage-mcp/README.md +145 -0
- package/examples/stage-mcp/echo-mcp.mjs +20 -0
- package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
- package/examples/stage-mcp/use-echo.yaml +20 -0
- package/examples/stageflow.yaml +51 -0
- package/examples/verify-tour/README.md +80 -0
- package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
- package/examples/verify-tour/verify-tour.task.yaml +11 -0
- package/package.json +9 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +13 -5
- package/skills/stageflow/scripts/detect-host.mjs +14 -1
- package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
- package/skills/stageflow-author/SKILL.md +4 -3
- package/skills/stageflow-author/references/catalog-mapping.md +16 -0
- package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
- package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
- package/skills/stageflow-run/SKILL.md +22 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
- package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
- package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
- package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
- package/skills/stageflow-setup/SKILL.md +51 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
|
@@ -1,3 +1,57 @@
|
|
|
1
|
+
export const A2A_SCHEMA_SQL = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS a2a_contexts (
|
|
3
|
+
context_id TEXT PRIMARY KEY,
|
|
4
|
+
caller_id TEXT NOT NULL,
|
|
5
|
+
created_at TEXT NOT NULL
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
CREATE TABLE IF NOT EXISTS a2a_tasks (
|
|
9
|
+
task_id TEXT PRIMARY KEY,
|
|
10
|
+
context_id TEXT NOT NULL,
|
|
11
|
+
caller_id TEXT NOT NULL,
|
|
12
|
+
publication_id TEXT NOT NULL,
|
|
13
|
+
publication_revision TEXT NOT NULL,
|
|
14
|
+
submission_key TEXT NOT NULL UNIQUE,
|
|
15
|
+
run_id TEXT,
|
|
16
|
+
state TEXT NOT NULL,
|
|
17
|
+
result_json TEXT,
|
|
18
|
+
created_at TEXT NOT NULL,
|
|
19
|
+
updated_at TEXT NOT NULL
|
|
20
|
+
);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS a2a_tasks_context ON a2a_tasks(context_id);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS a2a_tasks_caller ON a2a_tasks(caller_id);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS a2a_messages (
|
|
25
|
+
caller_id TEXT NOT NULL,
|
|
26
|
+
message_id TEXT NOT NULL,
|
|
27
|
+
task_id TEXT NOT NULL,
|
|
28
|
+
operation TEXT NOT NULL,
|
|
29
|
+
request_hash TEXT NOT NULL,
|
|
30
|
+
outcome_json TEXT,
|
|
31
|
+
created_at TEXT NOT NULL,
|
|
32
|
+
PRIMARY KEY (caller_id, message_id)
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE IF NOT EXISTS a2a_artifacts (
|
|
36
|
+
artifact_id TEXT PRIMARY KEY,
|
|
37
|
+
task_id TEXT NOT NULL,
|
|
38
|
+
name TEXT NOT NULL,
|
|
39
|
+
media_type TEXT,
|
|
40
|
+
size INTEGER NOT NULL,
|
|
41
|
+
content_path TEXT NOT NULL,
|
|
42
|
+
hash TEXT NOT NULL,
|
|
43
|
+
created_at TEXT NOT NULL
|
|
44
|
+
);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS a2a_artifacts_task ON a2a_artifacts(task_id);
|
|
46
|
+
`;
|
|
47
|
+
export const SCHEMA_MIGRATIONS_DDL = `
|
|
48
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
49
|
+
version INTEGER PRIMARY KEY,
|
|
50
|
+
name TEXT NOT NULL,
|
|
51
|
+
applied_at TEXT NOT NULL,
|
|
52
|
+
min_stageflow_version TEXT NOT NULL
|
|
53
|
+
);
|
|
54
|
+
`;
|
|
1
55
|
export const SCHEMA_SQL = `
|
|
2
56
|
CREATE TABLE IF NOT EXISTS runs (
|
|
3
57
|
run_id TEXT PRIMARY KEY,
|
|
@@ -14,7 +68,29 @@ CREATE TABLE IF NOT EXISTS runs (
|
|
|
14
68
|
ci_job_url TEXT,
|
|
15
69
|
pipeline_path TEXT,
|
|
16
70
|
task_path TEXT,
|
|
17
|
-
project_root TEXT
|
|
71
|
+
project_root TEXT,
|
|
72
|
+
repository TEXT,
|
|
73
|
+
ref TEXT,
|
|
74
|
+
resolved_sha TEXT,
|
|
75
|
+
run_branch TEXT,
|
|
76
|
+
git_author_name TEXT,
|
|
77
|
+
git_author_email TEXT,
|
|
78
|
+
cancel_reason TEXT,
|
|
79
|
+
finished_at TEXT,
|
|
80
|
+
slimmed_at TEXT,
|
|
81
|
+
disk_bytes INTEGER,
|
|
82
|
+
disk_measured_at TEXT,
|
|
83
|
+
config_origins_json TEXT,
|
|
84
|
+
pipeline_source TEXT,
|
|
85
|
+
pipeline_body TEXT,
|
|
86
|
+
caller_id TEXT,
|
|
87
|
+
run_manifest TEXT,
|
|
88
|
+
skip_gates INTEGER
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
92
|
+
project_root TEXT PRIMARY KEY NOT NULL,
|
|
93
|
+
created_at TEXT NOT NULL
|
|
18
94
|
);
|
|
19
95
|
|
|
20
96
|
CREATE TABLE IF NOT EXISTS run_submissions (
|
|
@@ -65,6 +141,7 @@ CREATE TABLE IF NOT EXISTS stage_executions (
|
|
|
65
141
|
envelope_json TEXT,
|
|
66
142
|
cost_usd REAL,
|
|
67
143
|
usage_json TEXT,
|
|
144
|
+
auto_resume_count INTEGER NOT NULL DEFAULT 0,
|
|
68
145
|
PRIMARY KEY (run_id, stage_id, attempt),
|
|
69
146
|
FOREIGN KEY (run_id) REFERENCES runs(run_id)
|
|
70
147
|
);
|
|
@@ -170,3 +247,202 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_fork_generations_parent_number
|
|
|
170
247
|
CREATE INDEX IF NOT EXISTS idx_fork_generations_run_replay
|
|
171
248
|
ON fork_generations (run_id, replay_id, created_at);
|
|
172
249
|
`;
|
|
250
|
+
export function ensureCheckoutRootColumn(db) {
|
|
251
|
+
const cols = db.prepare(`PRAGMA table_info(runs)`).all();
|
|
252
|
+
if (!cols.some((c) => c.name === "checkout_root")) {
|
|
253
|
+
db.exec(`ALTER TABLE runs ADD COLUMN checkout_root TEXT`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export function ensureCiIdentityColumns(db) {
|
|
257
|
+
const cols = db.prepare(`PRAGMA table_info(runs)`).all();
|
|
258
|
+
const names = new Set(cols.map((c) => c.name));
|
|
259
|
+
for (const name of ["git_sha", "ci_pr_url", "ci_job_url"]) {
|
|
260
|
+
if (!names.has(name)) {
|
|
261
|
+
db.exec(`ALTER TABLE runs ADD COLUMN ${name} TEXT`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export function ensurePipelineDagColumn(db) {
|
|
266
|
+
const cols = db.prepare(`PRAGMA table_info(runs)`).all();
|
|
267
|
+
if (!cols.some((c) => c.name === "pipeline_dag_json")) {
|
|
268
|
+
db.exec(`ALTER TABLE runs ADD COLUMN pipeline_dag_json TEXT`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export function ensureRunLocatorColumns(db) {
|
|
272
|
+
const cols = db.prepare(`PRAGMA table_info(runs)`).all();
|
|
273
|
+
const names = new Set(cols.map((c) => c.name));
|
|
274
|
+
for (const name of ["pipeline_path", "task_path", "project_root"]) {
|
|
275
|
+
if (!names.has(name)) {
|
|
276
|
+
db.exec(`ALTER TABLE runs ADD COLUMN ${name} TEXT`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export function ensureStageExecutionsTable(db) {
|
|
281
|
+
db.exec(`
|
|
282
|
+
CREATE TABLE IF NOT EXISTS stage_executions (
|
|
283
|
+
run_id TEXT NOT NULL,
|
|
284
|
+
stage_id TEXT NOT NULL,
|
|
285
|
+
attempt INTEGER NOT NULL,
|
|
286
|
+
status TEXT NOT NULL,
|
|
287
|
+
verification_outcome TEXT NOT NULL DEFAULT 'not_run',
|
|
288
|
+
started_at TEXT,
|
|
289
|
+
finished_at TEXT,
|
|
290
|
+
envelope_json TEXT,
|
|
291
|
+
auto_resume_count INTEGER NOT NULL DEFAULT 0,
|
|
292
|
+
PRIMARY KEY (run_id, stage_id, attempt),
|
|
293
|
+
FOREIGN KEY (run_id) REFERENCES runs(run_id)
|
|
294
|
+
);
|
|
295
|
+
CREATE INDEX IF NOT EXISTS idx_stage_executions_run_stage
|
|
296
|
+
ON stage_executions (run_id, stage_id, attempt);
|
|
297
|
+
`);
|
|
298
|
+
}
|
|
299
|
+
export function ensureStageExecutionAutoResumeCountColumn(db) {
|
|
300
|
+
const cols = db
|
|
301
|
+
.prepare(`PRAGMA table_info(stage_executions)`)
|
|
302
|
+
.all();
|
|
303
|
+
if (cols.length === 0)
|
|
304
|
+
return;
|
|
305
|
+
if (!cols.some((c) => c.name === "auto_resume_count")) {
|
|
306
|
+
db.exec(`ALTER TABLE stage_executions ADD COLUMN auto_resume_count INTEGER NOT NULL DEFAULT 0`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
export function ensureStageExecutionVerificationOutcomeColumn(db) {
|
|
310
|
+
const cols = db
|
|
311
|
+
.prepare(`PRAGMA table_info(stage_executions)`)
|
|
312
|
+
.all();
|
|
313
|
+
if (!cols.some((c) => c.name === "verification_outcome")) {
|
|
314
|
+
db.exec(`ALTER TABLE stage_executions ADD COLUMN verification_outcome TEXT NOT NULL DEFAULT 'not_run'`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
export function ensureStageExecutionCostColumns(db) {
|
|
318
|
+
const cols = db
|
|
319
|
+
.prepare(`PRAGMA table_info(stage_executions)`)
|
|
320
|
+
.all();
|
|
321
|
+
const names = new Set(cols.map((c) => c.name));
|
|
322
|
+
if (!names.has("cost_usd")) {
|
|
323
|
+
db.exec(`ALTER TABLE stage_executions ADD COLUMN cost_usd REAL`);
|
|
324
|
+
}
|
|
325
|
+
if (!names.has("usage_json")) {
|
|
326
|
+
db.exec(`ALTER TABLE stage_executions ADD COLUMN usage_json TEXT`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
export function backfillVerificationOutcomes(db) {
|
|
330
|
+
db.exec(`
|
|
331
|
+
UPDATE stage_executions
|
|
332
|
+
SET verification_outcome = CASE
|
|
333
|
+
WHEN status = 'succeeded'
|
|
334
|
+
AND EXISTS (
|
|
335
|
+
SELECT 1 FROM verification_check_results AS check_result
|
|
336
|
+
WHERE check_result.run_id = stage_executions.run_id
|
|
337
|
+
AND check_result.stage_id = stage_executions.stage_id
|
|
338
|
+
AND check_result.attempt = stage_executions.attempt
|
|
339
|
+
)
|
|
340
|
+
AND NOT EXISTS (
|
|
341
|
+
SELECT 1 FROM verification_check_results AS check_result
|
|
342
|
+
WHERE check_result.run_id = stage_executions.run_id
|
|
343
|
+
AND check_result.stage_id = stage_executions.stage_id
|
|
344
|
+
AND check_result.attempt = stage_executions.attempt
|
|
345
|
+
AND check_result.status != 'passed'
|
|
346
|
+
)
|
|
347
|
+
THEN 'passed'
|
|
348
|
+
WHEN status = 'failed'
|
|
349
|
+
AND EXISTS (
|
|
350
|
+
SELECT 1 FROM verification_check_results AS check_result
|
|
351
|
+
WHERE check_result.run_id = stage_executions.run_id
|
|
352
|
+
AND check_result.stage_id = stage_executions.stage_id
|
|
353
|
+
AND check_result.attempt = stage_executions.attempt
|
|
354
|
+
)
|
|
355
|
+
THEN 'failed'
|
|
356
|
+
ELSE verification_outcome
|
|
357
|
+
END
|
|
358
|
+
WHERE verification_outcome = 'not_run';
|
|
359
|
+
`);
|
|
360
|
+
}
|
|
361
|
+
export function ensureStageEventsAttemptColumn(db) {
|
|
362
|
+
const cols = db
|
|
363
|
+
.prepare(`PRAGMA table_info(stage_events)`)
|
|
364
|
+
.all();
|
|
365
|
+
if (!cols.some((c) => c.name === "attempt")) {
|
|
366
|
+
db.exec(`ALTER TABLE stage_events ADD COLUMN attempt INTEGER NOT NULL DEFAULT 1`);
|
|
367
|
+
db.exec(`
|
|
368
|
+
CREATE INDEX IF NOT EXISTS idx_stage_events_run_stage_attempt_at
|
|
369
|
+
ON stage_events (run_id, stage_id, attempt, at);
|
|
370
|
+
`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export function ensureVerificationCheckResultsTable(db) {
|
|
374
|
+
db.exec(`
|
|
375
|
+
CREATE TABLE IF NOT EXISTS verification_check_results (
|
|
376
|
+
run_id TEXT NOT NULL,
|
|
377
|
+
stage_id TEXT NOT NULL,
|
|
378
|
+
attempt INTEGER NOT NULL,
|
|
379
|
+
check_id TEXT NOT NULL,
|
|
380
|
+
check_type TEXT NOT NULL,
|
|
381
|
+
status TEXT NOT NULL,
|
|
382
|
+
started_at TEXT,
|
|
383
|
+
finished_at TEXT,
|
|
384
|
+
evidence_json TEXT,
|
|
385
|
+
PRIMARY KEY (run_id, stage_id, attempt, check_id),
|
|
386
|
+
FOREIGN KEY (run_id, stage_id, attempt)
|
|
387
|
+
REFERENCES stage_executions(run_id, stage_id, attempt)
|
|
388
|
+
);
|
|
389
|
+
CREATE INDEX IF NOT EXISTS idx_verification_check_results_execution
|
|
390
|
+
ON verification_check_results (run_id, stage_id, attempt, check_id);
|
|
391
|
+
`);
|
|
392
|
+
}
|
|
393
|
+
export function ensureFeedbackReplayStagePassEnvelopeColumn(db) {
|
|
394
|
+
const cols = db
|
|
395
|
+
.prepare(`PRAGMA table_info(feedback_replay_stage_passes)`)
|
|
396
|
+
.all();
|
|
397
|
+
if (cols.length === 0)
|
|
398
|
+
return;
|
|
399
|
+
if (!cols.some((c) => c.name === "emitted_envelope_json")) {
|
|
400
|
+
db.exec(`ALTER TABLE feedback_replay_stage_passes ADD COLUMN emitted_envelope_json TEXT`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
export function ensureFeedbackReplayStagePassSessionOriginColumn(db) {
|
|
404
|
+
const cols = db
|
|
405
|
+
.prepare(`PRAGMA table_info(feedback_replay_stage_passes)`)
|
|
406
|
+
.all();
|
|
407
|
+
if (cols.length === 0)
|
|
408
|
+
return;
|
|
409
|
+
if (!cols.some((c) => c.name === "session_origin_attempt")) {
|
|
410
|
+
db.exec(`ALTER TABLE feedback_replay_stage_passes ADD COLUMN session_origin_attempt INTEGER`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
export function ensureFeedbackLoopDeferredSendBackColumn(db) {
|
|
414
|
+
const cols = db
|
|
415
|
+
.prepare(`PRAGMA table_info(feedback_loops)`)
|
|
416
|
+
.all();
|
|
417
|
+
if (cols.length === 0)
|
|
418
|
+
return;
|
|
419
|
+
if (!cols.some((c) => c.name === "deferred_send_back_json")) {
|
|
420
|
+
db.exec(`ALTER TABLE feedback_loops ADD COLUMN deferred_send_back_json TEXT`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
export function ensureConfigOriginsColumn(db) {
|
|
424
|
+
const cols = db.prepare(`PRAGMA table_info(runs)`).all();
|
|
425
|
+
if (!cols.some((c) => c.name === "config_origins_json")) {
|
|
426
|
+
db.exec(`ALTER TABLE runs ADD COLUMN config_origins_json TEXT`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
export function applyBaselineSchema(db) {
|
|
430
|
+
db.exec(SCHEMA_MIGRATIONS_DDL);
|
|
431
|
+
db.exec(SCHEMA_SQL);
|
|
432
|
+
ensureCheckoutRootColumn(db);
|
|
433
|
+
ensureCiIdentityColumns(db);
|
|
434
|
+
ensurePipelineDagColumn(db);
|
|
435
|
+
ensureRunLocatorColumns(db);
|
|
436
|
+
ensureStageExecutionsTable(db);
|
|
437
|
+
ensureStageExecutionVerificationOutcomeColumn(db);
|
|
438
|
+
ensureStageExecutionCostColumns(db);
|
|
439
|
+
ensureStageExecutionAutoResumeCountColumn(db);
|
|
440
|
+
ensureStageEventsAttemptColumn(db);
|
|
441
|
+
ensureVerificationCheckResultsTable(db);
|
|
442
|
+
ensureFeedbackReplayStagePassEnvelopeColumn(db);
|
|
443
|
+
ensureFeedbackReplayStagePassSessionOriginColumn(db);
|
|
444
|
+
ensureFeedbackLoopDeferredSendBackColumn(db);
|
|
445
|
+
ensureConfigOriginsColumn(db);
|
|
446
|
+
db.exec(A2A_SCHEMA_SQL);
|
|
447
|
+
backfillVerificationOutcomes(db);
|
|
448
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type StoreOpenErrorCode = "store_integrity_failed" | "store_unsupported_filesystem" | "tmpdir_unusable";
|
|
2
|
+
export declare class StoreOpenError extends Error {
|
|
3
|
+
readonly code: StoreOpenErrorCode;
|
|
4
|
+
readonly detail?: Record<string, unknown>;
|
|
5
|
+
constructor(message: string, code: StoreOpenErrorCode, detail?: Record<string, unknown>);
|
|
6
|
+
}
|
|
@@ -14,6 +14,9 @@ export function deriveExecutionPatchFromEvent(event, current) {
|
|
|
14
14
|
else if (eventName === "waiting_for_input") {
|
|
15
15
|
patch.status = "waiting_for_input";
|
|
16
16
|
}
|
|
17
|
+
else if (eventName === "interrupted") {
|
|
18
|
+
patch.status = "interrupted";
|
|
19
|
+
}
|
|
17
20
|
else if (event.event === "succeeded" || event.event === "failed") {
|
|
18
21
|
patch.status = event.event;
|
|
19
22
|
patch.finished_at = at;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const ALLOW_NETWORK_STORE_ENV = "STAGEFLOW_ALLOW_NETWORK_STORE";
|
|
2
|
+
export type MountInfoEntry = {
|
|
3
|
+
mountPoint: string;
|
|
4
|
+
fsType: string;
|
|
5
|
+
};
|
|
6
|
+
export type StoreFilesystemClassification = {
|
|
7
|
+
fsType: string | null;
|
|
8
|
+
mountPoint: string | null;
|
|
9
|
+
status: "ok" | "refused" | "warn" | "skipped";
|
|
10
|
+
reason?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parse `/proc/self/mountinfo` lines into mount point + fstype pairs.
|
|
14
|
+
* Field layout: ... mount-point ... - fstype ...
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseMountInfo(content: string): MountInfoEntry[];
|
|
17
|
+
export declare function classifyPathFilesystem(resolvedPath: string, mounts: MountInfoEntry[]): {
|
|
18
|
+
fsType: string;
|
|
19
|
+
mountPoint: string;
|
|
20
|
+
} | null;
|
|
21
|
+
export declare function classifyStoreFilesystem(options: {
|
|
22
|
+
homePath: string;
|
|
23
|
+
platform?: NodeJS.Platform;
|
|
24
|
+
mountInfoContent?: string;
|
|
25
|
+
env?: NodeJS.ProcessEnv;
|
|
26
|
+
}): StoreFilesystemClassification;
|
|
27
|
+
export declare function assertStoreFilesystemSupported(homePath: string, options?: {
|
|
28
|
+
platform?: NodeJS.Platform;
|
|
29
|
+
mountInfoContent?: string;
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
warn?: (message: string) => void;
|
|
32
|
+
}): StoreFilesystemClassification;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { StoreOpenError } from "./sqlite/storeOpenError.js";
|
|
5
|
+
export const ALLOW_NETWORK_STORE_ENV = "STAGEFLOW_ALLOW_NETWORK_STORE";
|
|
6
|
+
const REFUSED_FSTYPES = new Set([
|
|
7
|
+
"nfs",
|
|
8
|
+
"nfs4",
|
|
9
|
+
"cifs",
|
|
10
|
+
"smbfs",
|
|
11
|
+
"fuse.sshfs",
|
|
12
|
+
]);
|
|
13
|
+
const WARN_FSTYPES = new Set(["9p", "virtiofs"]);
|
|
14
|
+
/**
|
|
15
|
+
* Parse `/proc/self/mountinfo` lines into mount point + fstype pairs.
|
|
16
|
+
* Field layout: ... mount-point ... - fstype ...
|
|
17
|
+
*/
|
|
18
|
+
export function parseMountInfo(content) {
|
|
19
|
+
const entries = [];
|
|
20
|
+
for (const line of content.split("\n")) {
|
|
21
|
+
if (line.trim() === "")
|
|
22
|
+
continue;
|
|
23
|
+
const sep = line.indexOf(" - ");
|
|
24
|
+
if (sep < 0)
|
|
25
|
+
continue;
|
|
26
|
+
const left = line.slice(0, sep);
|
|
27
|
+
const right = line.slice(sep + 3);
|
|
28
|
+
const leftParts = left.split(" ");
|
|
29
|
+
const rightParts = right.split(" ");
|
|
30
|
+
if (leftParts.length < 5 || rightParts.length < 1)
|
|
31
|
+
continue;
|
|
32
|
+
const mountPoint = unescapeMountField(leftParts[4]);
|
|
33
|
+
const fsType = rightParts[0];
|
|
34
|
+
entries.push({ mountPoint, fsType });
|
|
35
|
+
}
|
|
36
|
+
return entries;
|
|
37
|
+
}
|
|
38
|
+
function unescapeMountField(value) {
|
|
39
|
+
return value
|
|
40
|
+
.replace(/\\040/g, " ")
|
|
41
|
+
.replace(/\\011/g, "\t")
|
|
42
|
+
.replace(/\\012/g, "\n")
|
|
43
|
+
.replace(/\\134/g, "\\");
|
|
44
|
+
}
|
|
45
|
+
export function classifyPathFilesystem(resolvedPath, mounts) {
|
|
46
|
+
const target = path.resolve(resolvedPath);
|
|
47
|
+
let best;
|
|
48
|
+
let bestLen = -1;
|
|
49
|
+
for (const entry of mounts) {
|
|
50
|
+
const mp = path.resolve(entry.mountPoint);
|
|
51
|
+
if (target === mp || target.startsWith(mp.endsWith("/") ? mp : `${mp}/`)) {
|
|
52
|
+
if (mp.length > bestLen) {
|
|
53
|
+
best = entry;
|
|
54
|
+
bestLen = mp.length;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (best === undefined)
|
|
59
|
+
return null;
|
|
60
|
+
return { fsType: best.fsType, mountPoint: best.mountPoint };
|
|
61
|
+
}
|
|
62
|
+
export function classifyStoreFilesystem(options) {
|
|
63
|
+
const platform = options.platform ?? os.platform();
|
|
64
|
+
if (platform !== "linux") {
|
|
65
|
+
return {
|
|
66
|
+
fsType: null,
|
|
67
|
+
mountPoint: null,
|
|
68
|
+
status: "skipped",
|
|
69
|
+
reason: "filesystem detection is Linux-only (mountinfo)",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
let content = options.mountInfoContent;
|
|
73
|
+
if (content === undefined) {
|
|
74
|
+
try {
|
|
75
|
+
content = readFileSync("/proc/self/mountinfo", "utf8");
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return {
|
|
79
|
+
fsType: null,
|
|
80
|
+
mountPoint: null,
|
|
81
|
+
status: "skipped",
|
|
82
|
+
reason: `mountinfo unreadable: ${err instanceof Error ? err.message : String(err)}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const mounts = parseMountInfo(content);
|
|
87
|
+
const match = classifyPathFilesystem(options.homePath, mounts);
|
|
88
|
+
if (match === null) {
|
|
89
|
+
return {
|
|
90
|
+
fsType: null,
|
|
91
|
+
mountPoint: null,
|
|
92
|
+
status: "ok",
|
|
93
|
+
reason: "no matching mount; treating as local",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const env = options.env ?? process.env;
|
|
97
|
+
const allowNetwork = env[ALLOW_NETWORK_STORE_ENV] === "1" ||
|
|
98
|
+
env[ALLOW_NETWORK_STORE_ENV]?.toLowerCase() === "true";
|
|
99
|
+
if (REFUSED_FSTYPES.has(match.fsType)) {
|
|
100
|
+
if (allowNetwork) {
|
|
101
|
+
return {
|
|
102
|
+
fsType: match.fsType,
|
|
103
|
+
mountPoint: match.mountPoint,
|
|
104
|
+
status: "warn",
|
|
105
|
+
reason: `network filesystem ${match.fsType} allowed via ${ALLOW_NETWORK_STORE_ENV}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
fsType: match.fsType,
|
|
110
|
+
mountPoint: match.mountPoint,
|
|
111
|
+
status: "refused",
|
|
112
|
+
reason: `unsupported network filesystem ${match.fsType}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (WARN_FSTYPES.has(match.fsType)) {
|
|
116
|
+
return {
|
|
117
|
+
fsType: match.fsType,
|
|
118
|
+
mountPoint: match.mountPoint,
|
|
119
|
+
status: "warn",
|
|
120
|
+
reason: `${match.fsType} may be unreliable for SQLite WAL`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
fsType: match.fsType,
|
|
125
|
+
mountPoint: match.mountPoint,
|
|
126
|
+
status: "ok",
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function assertStoreFilesystemSupported(homePath, options) {
|
|
130
|
+
const classification = classifyStoreFilesystem({
|
|
131
|
+
homePath,
|
|
132
|
+
platform: options?.platform,
|
|
133
|
+
mountInfoContent: options?.mountInfoContent,
|
|
134
|
+
env: options?.env,
|
|
135
|
+
});
|
|
136
|
+
if (classification.status === "refused") {
|
|
137
|
+
throw new StoreOpenError(`store_unsupported_filesystem: ${classification.fsType} at ${homePath}` +
|
|
138
|
+
` (mount ${classification.mountPoint}). Use a local volume, or set ${ALLOW_NETWORK_STORE_ENV}=1 to override (unsupported).`, "store_unsupported_filesystem", {
|
|
139
|
+
fs_type: classification.fsType,
|
|
140
|
+
mount_point: classification.mountPoint,
|
|
141
|
+
path: homePath,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (classification.status === "warn") {
|
|
145
|
+
options?.warn?.(`stageflow: store filesystem warning: ${classification.reason ?? classification.fsType} at ${homePath}`);
|
|
146
|
+
}
|
|
147
|
+
return classification;
|
|
148
|
+
}
|
|
@@ -66,6 +66,8 @@ function deriveReadiness(stage, dag, snapshotsById, halted) {
|
|
|
66
66
|
return { readiness: "running" };
|
|
67
67
|
if (status === "waiting_for_input")
|
|
68
68
|
return { readiness: "waiting" };
|
|
69
|
+
if (status === "interrupted")
|
|
70
|
+
return { readiness: "interrupted" };
|
|
69
71
|
if (halted && !stageStarted(stage)) {
|
|
70
72
|
return { readiness: "skipped" };
|
|
71
73
|
}
|
|
@@ -18,6 +18,19 @@ export declare function stageLogPath(workspaceDir: string, stageId: string): str
|
|
|
18
18
|
/** @deprecated Use attemptSessionPath with an explicit attempt number. */
|
|
19
19
|
export declare function stageSessionPath(workspaceDir: string, stageId: string): string;
|
|
20
20
|
export declare function isInsideDir(child: string, parent: string): boolean;
|
|
21
|
+
export declare const STAGEFLOW_PATH_DENIED = "stageflow_path_denied";
|
|
22
|
+
export type RealPathContainment = {
|
|
23
|
+
status: "inside";
|
|
24
|
+
realPath: string;
|
|
25
|
+
} | {
|
|
26
|
+
status: "outside";
|
|
27
|
+
realPath: string;
|
|
28
|
+
} | {
|
|
29
|
+
status: "missing";
|
|
30
|
+
};
|
|
31
|
+
export declare function classifyRealPathContainment(candidatePath: string, containerDir: string): Promise<RealPathContainment>;
|
|
32
|
+
export declare function resolveEffectiveRealPath(candidatePath: string): Promise<string | undefined>;
|
|
33
|
+
export declare function durableRootFileToolDenial(candidatePath: string, runWorkspaceDir: string, durableRoot: string, allowlistedRoots?: readonly string[]): Promise<typeof STAGEFLOW_PATH_DENIED | undefined>;
|
|
21
34
|
export declare function resolveArtifactTarget(runWorkspaceDir: string, stageId: string, attempt: number, relativePath: string): {
|
|
22
35
|
absolutePath: string;
|
|
23
36
|
runRelativePath: string;
|
|
@@ -63,6 +63,82 @@ export function isInsideDir(child, parent) {
|
|
|
63
63
|
relative !== ".." &&
|
|
64
64
|
!path.isAbsolute(relative)));
|
|
65
65
|
}
|
|
66
|
+
export const STAGEFLOW_PATH_DENIED = "stageflow_path_denied";
|
|
67
|
+
export async function classifyRealPathContainment(candidatePath, containerDir) {
|
|
68
|
+
const containerReal = await realpath(containerDir);
|
|
69
|
+
let fileReal;
|
|
70
|
+
try {
|
|
71
|
+
fileReal = await realpath(candidatePath);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { status: "missing" };
|
|
75
|
+
}
|
|
76
|
+
if (isInsideDir(fileReal, containerReal)) {
|
|
77
|
+
return { status: "inside", realPath: fileReal };
|
|
78
|
+
}
|
|
79
|
+
return { status: "outside", realPath: fileReal };
|
|
80
|
+
}
|
|
81
|
+
export async function resolveEffectiveRealPath(candidatePath) {
|
|
82
|
+
try {
|
|
83
|
+
return await realpath(candidatePath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
const missing = [];
|
|
87
|
+
let current = candidatePath;
|
|
88
|
+
while (true) {
|
|
89
|
+
missing.unshift(path.basename(current));
|
|
90
|
+
const parent = path.dirname(current);
|
|
91
|
+
if (parent === current) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const realParent = await realpath(parent);
|
|
96
|
+
return path.join(realParent, ...missing);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
current = parent;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export async function durableRootFileToolDenial(candidatePath, runWorkspaceDir, durableRoot, allowlistedRoots) {
|
|
105
|
+
const fileReal = await resolveEffectiveRealPath(candidatePath);
|
|
106
|
+
if (fileReal === undefined) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
let workspaceReal;
|
|
110
|
+
try {
|
|
111
|
+
workspaceReal = await realpath(runWorkspaceDir);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (isInsideDir(fileReal, workspaceReal)) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
for (const root of allowlistedRoots ?? []) {
|
|
120
|
+
try {
|
|
121
|
+
const allowReal = await realpath(root);
|
|
122
|
+
if (isInsideDir(fileReal, allowReal)) {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// skip roots that cannot be resolved
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
let durableReal;
|
|
131
|
+
try {
|
|
132
|
+
durableReal = await realpath(durableRoot);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
durableReal = path.resolve(durableRoot);
|
|
136
|
+
}
|
|
137
|
+
if (isInsideDir(fileReal, durableReal)) {
|
|
138
|
+
return STAGEFLOW_PATH_DENIED;
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
66
142
|
export function resolveArtifactTarget(runWorkspaceDir, stageId, attempt, relativePath) {
|
|
67
143
|
guardStageId(stageId);
|
|
68
144
|
guardAttempt(attempt);
|
|
@@ -4,6 +4,7 @@ export declare const WAIT_WITHOUT_WORKER_DISPATCH = "stage entered wait without
|
|
|
4
4
|
export type AnswerResumeAdapterResult = {
|
|
5
5
|
ok: boolean;
|
|
6
6
|
reason?: string;
|
|
7
|
+
verification?: "failed_retrying";
|
|
7
8
|
};
|
|
8
9
|
export declare function orchestrateAnswerResume(options: {
|
|
9
10
|
prefixMode: "live" | "restart";
|