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
|
@@ -16,12 +16,23 @@ const CURSOR_SETTING_SOURCES_ENV = "PI_CURSOR_SETTING_SOURCES";
|
|
|
16
16
|
*
|
|
17
17
|
* Resolution order:
|
|
18
18
|
* 1. STAGEFLOW_CURSOR_EXTENSION (absolute path to the extension .ts/.js)
|
|
19
|
-
* 2. Path package from
|
|
20
|
-
* 3. npm install under
|
|
19
|
+
* 2. Path package from the Pi agent settings.json (same source interactive pi uses)
|
|
20
|
+
* 3. npm install under <pi-agent>/npm/node_modules/pi-cursor-sdk
|
|
21
21
|
* (`dist/index.js` for 0.3+, `src/index.ts` for older publishes)
|
|
22
22
|
* 4. Sibling checkout at ../pi-cursor-sdk relative to this repo
|
|
23
|
+
*
|
|
24
|
+
* A stage worker's HOME is an empty attempt directory, so the Pi agent dir is
|
|
25
|
+
* the directory of STAGEFLOW_PI_HOME_AUTH_PATH when the Host set it, not
|
|
26
|
+
* os.homedir().
|
|
23
27
|
*/
|
|
24
28
|
const CURSOR_PACKAGE_ENTRIES = ["dist/index.js", "src/index.ts"];
|
|
29
|
+
/** Pi agent dir. Stage workers must not use os.homedir(): HOME is the attempt dir. */
|
|
30
|
+
function piAgentDir() {
|
|
31
|
+
const auth = process.env.STAGEFLOW_PI_HOME_AUTH_PATH?.trim();
|
|
32
|
+
if (auth)
|
|
33
|
+
return path.dirname(path.resolve(auth));
|
|
34
|
+
return path.join(os.homedir(), ".pi", "agent");
|
|
35
|
+
}
|
|
25
36
|
export function cursorExtensionEntryInPackage(packageRoot) {
|
|
26
37
|
for (const rel of CURSOR_PACKAGE_ENTRIES) {
|
|
27
38
|
const full = path.join(packageRoot, rel);
|
|
@@ -40,7 +51,7 @@ export function resolveCursorExtensionPath() {
|
|
|
40
51
|
if (fromSettings) {
|
|
41
52
|
return fromSettings;
|
|
42
53
|
}
|
|
43
|
-
const npmEntry = cursorExtensionEntryInPackage(path.join(
|
|
54
|
+
const npmEntry = cursorExtensionEntryInPackage(path.join(piAgentDir(), "npm", "node_modules", "pi-cursor-sdk"));
|
|
44
55
|
if (npmEntry) {
|
|
45
56
|
return npmEntry;
|
|
46
57
|
}
|
|
@@ -84,6 +95,20 @@ function prepareCursor(modelRef) {
|
|
|
84
95
|
restore: sealCursorSettingSources(),
|
|
85
96
|
};
|
|
86
97
|
}
|
|
98
|
+
export function workshopCursorBridgeHint(toolNames) {
|
|
99
|
+
const lines = toolNames.map((name) => `- pi__${name} (playbook name: ${name})`);
|
|
100
|
+
return [
|
|
101
|
+
"Cursor bridge: call the workshop tools by these MCP names. The playbook uses the bare names; they are the same tools.",
|
|
102
|
+
...lines,
|
|
103
|
+
"When the operator asks you to create or edit the draft, do not finish without one of these tool calls.",
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
export function cursorBridgePrompt(message, modelId, toolNames) {
|
|
107
|
+
if (!modelId || !isCursorModelRef(modelId) || toolNames.length === 0) {
|
|
108
|
+
return message;
|
|
109
|
+
}
|
|
110
|
+
return `${message}\n\n${workshopCursorBridgeHint(toolNames)}`;
|
|
111
|
+
}
|
|
87
112
|
export const cursorProviderSupport = {
|
|
88
113
|
id: "cursor",
|
|
89
114
|
matches: isCursorModelRef,
|
|
@@ -99,7 +124,8 @@ export const cursorProviderSupport = {
|
|
|
99
124
|
};
|
|
100
125
|
registerProviderSupport(cursorProviderSupport);
|
|
101
126
|
function resolveFromPiSettings() {
|
|
102
|
-
const
|
|
127
|
+
const agentDir = piAgentDir();
|
|
128
|
+
const settingsPath = path.join(agentDir, "settings.json");
|
|
103
129
|
if (!existsSync(settingsPath)) {
|
|
104
130
|
return undefined;
|
|
105
131
|
}
|
|
@@ -113,7 +139,6 @@ function resolveFromPiSettings() {
|
|
|
113
139
|
if (!Array.isArray(settings.packages)) {
|
|
114
140
|
return undefined;
|
|
115
141
|
}
|
|
116
|
-
const agentDir = path.join(os.homedir(), ".pi", "agent");
|
|
117
142
|
for (const entry of settings.packages) {
|
|
118
143
|
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
119
144
|
continue;
|
package/dist/agent/fakeAgent.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { assertRequiredEnvelope, isAdvancingEnvelope, } from "../envelope/check.js";
|
|
4
4
|
import { assertFeedbackLoopAction } from "../envelope/feedbackLoop.js";
|
|
5
|
+
import { loginCheckIssue } from "../browser/loginCheck.js";
|
|
5
6
|
import { assertEnvelopePayload } from "../envelope/payloadSchema.js";
|
|
6
7
|
import { assertForkEnvelope } from "../envelope/forkChoice.js";
|
|
7
8
|
import { assertAnswerMatchesPrompt, parseAskOperatorAnswer, } from "../tools/askOperator.js";
|
|
@@ -127,6 +128,9 @@ export class FakeAgent {
|
|
|
127
128
|
event: "tool_start",
|
|
128
129
|
toolName: "fake_tool",
|
|
129
130
|
toolCallId: "fake-1",
|
|
131
|
+
...("toolArgs" in behavior && behavior.toolArgs !== undefined
|
|
132
|
+
? { argsPreview: behavior.toolArgs }
|
|
133
|
+
: {}),
|
|
130
134
|
});
|
|
131
135
|
input.onActivity?.({
|
|
132
136
|
event: "tool_end",
|
|
@@ -165,6 +169,15 @@ export class FakeAgent {
|
|
|
165
169
|
assertForkEnvelope(envelope, input.forkEmitContext);
|
|
166
170
|
}
|
|
167
171
|
assertEnvelopePayload(envelope, input.stage.payload_schema);
|
|
172
|
+
if (envelope.status !== "failure") {
|
|
173
|
+
for (const check of input.stage.pre_emit_checks ?? []) {
|
|
174
|
+
if (check.type !== "browser_login_check")
|
|
175
|
+
continue;
|
|
176
|
+
const issue = loginCheckIssue(envelope.payload, check);
|
|
177
|
+
if (issue !== undefined)
|
|
178
|
+
throw new Error(issue);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
168
181
|
if (!isAdvancingEnvelope(envelope)) {
|
|
169
182
|
input.onActivity?.({ event: "agent_end" });
|
|
170
183
|
return {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentSession, type
|
|
1
|
+
import { type AgentSession, type ExtensionFactory, SessionManager } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import type { StageRoots } from "../runtime/stageRoots.js";
|
|
3
3
|
import { type AskOperatorPrompt, type AskOperatorWaitBridge } from "../tools/askOperator.js";
|
|
4
4
|
import "./cursorProvider.js";
|
|
@@ -6,9 +6,18 @@ import { type StageActivityObserver } from "./activityObserver.js";
|
|
|
6
6
|
import type { AgentPort, OpaqueAnswer, StageHandle, StageHandleCloseOptions, StageRunInput, StageRunResult } from "./port.js";
|
|
7
7
|
import type { StageGateKind } from "../types/stage.js";
|
|
8
8
|
import { type StageUsage } from "../types/usage.js";
|
|
9
|
+
import { STAGEFLOW_PATH_DENIED } from "../runstore/workspaceLayout.js";
|
|
10
|
+
export { STAGEFLOW_PATH_DENIED };
|
|
11
|
+
export { createSealedResourceLoader } from "./piSessionFactory.js";
|
|
12
|
+
export declare const STAGEFLOW_PATH_DENY_EXTENSION_NAME = "stageflow-path-deny";
|
|
13
|
+
export declare function createDurableRootPathDenyExtension(options: {
|
|
14
|
+
runWorkspaceDir: string;
|
|
15
|
+
durableRoot: string;
|
|
16
|
+
checkoutRoot?: string;
|
|
17
|
+
}): ExtensionFactory;
|
|
9
18
|
/**
|
|
10
19
|
* Stage tool allowlist for sealed Pi sessions.
|
|
11
|
-
* Includes `ask_operator`
|
|
20
|
+
* Includes `ask_operator` only when `gateKinds` is a non-empty list.
|
|
12
21
|
* `write_stage_artifact` when registered (always, for bound and unbound —
|
|
13
22
|
* bound/unbound only gates cwd / env bind).
|
|
14
23
|
*/
|
|
@@ -67,28 +76,6 @@ export type RouteSessionEventToProgressOptions = {
|
|
|
67
76
|
export declare function routeSessionEventToProgress(event: Record<string, unknown>, options: RouteSessionEventToProgressOptions): void;
|
|
68
77
|
export declare function composeStageUserPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
|
|
69
78
|
export declare function composeFeedbackResumePrompt(input: StageRunInput): string;
|
|
70
|
-
/**
|
|
71
|
-
* DefaultResourceLoader with host/global discovery turned off.
|
|
72
|
-
*
|
|
73
|
-
* Without these flags the loader walks up from the run folder and would pick
|
|
74
|
-
* up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
|
|
75
|
-
* and APPEND_SYSTEM.md. Stages must not inherit that context.
|
|
76
|
-
*
|
|
77
|
-
* `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
|
|
78
|
-
* is the isolated MCP seam. With `noExtensions: true`, discovered
|
|
79
|
-
* global/project packages stay out; only those allowlists load.
|
|
80
|
-
* `additionalSkillPaths` is the matching allowlist for one named skill.
|
|
81
|
-
*/
|
|
82
|
-
export declare function createSealedResourceLoader(options: {
|
|
83
|
-
cwd: string;
|
|
84
|
-
agentDir: string;
|
|
85
|
-
settingsManager: SettingsManager;
|
|
86
|
-
systemPrompt: string;
|
|
87
|
-
additionalExtensionPaths?: string[];
|
|
88
|
-
additionalSkillPaths?: string[];
|
|
89
|
-
extensionFactories?: InlineExtension[];
|
|
90
|
-
eventBus?: EventBus;
|
|
91
|
-
}): DefaultResourceLoader;
|
|
92
79
|
/** Stable Pi session JSONL path under the run workspace stage dir. */
|
|
93
80
|
export declare function stageSessionFilePath(roots: Pick<StageRoots, "runWorkspaceDir" | "attempt">, stageId: string): string;
|
|
94
81
|
export declare function resolveStageSessionFile(input: StageRunInput): string;
|
package/dist/agent/piAdapter.js
CHANGED
|
@@ -26,15 +26,17 @@
|
|
|
26
26
|
* fails closed with `StageSessionReconstructError` (KTD7). Epic proving
|
|
27
27
|
* vehicle: pipeline `plan-review-proving` (Pi live wait + console answers).
|
|
28
28
|
*
|
|
29
|
-
* `ask_operator` is registered on sealed stage sessions
|
|
30
|
-
* declares `gate_kinds
|
|
29
|
+
* `ask_operator` is registered on sealed stage sessions only when the stage
|
|
30
|
+
* declares a non-empty `gate_kinds` list.
|
|
31
31
|
*/
|
|
32
32
|
import { existsSync } from "node:fs";
|
|
33
33
|
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
34
34
|
import path from "node:path";
|
|
35
|
-
import {
|
|
35
|
+
import { BROWSER_SKILL_NAME } from "../config/builtinSkills.js";
|
|
36
|
+
import { defineTool, ModelRuntime, resolveCliModel, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
36
37
|
import { StageMcpError } from "../config/resolveStageMcpServers.js";
|
|
37
38
|
import { attachIsolatedMcp, STAGEFLOW_PI_MCP_EXTENSION_NAME, } from "./piIsolatedMcp.js";
|
|
39
|
+
import { createPiAgentSession, createSealedResourceLoader, } from "./piSessionFactory.js";
|
|
38
40
|
import { isAdvancingEnvelope } from "../envelope/check.js";
|
|
39
41
|
import { formatFeedbackLoopContext } from "../prompt/feedbackLoopContext.js";
|
|
40
42
|
import { formatPriorEnvelope } from "../prompt/priorEnvelope.js";
|
|
@@ -49,9 +51,40 @@ import { createStageActivityObserver, } from "./activityObserver.js";
|
|
|
49
51
|
import { DEFAULT_STAGE_TIMEOUT_MS, runtimeStageId, runStageViaOpen } from "./port.js";
|
|
50
52
|
import { addModelUsage, emptyStageUsage } from "../types/usage.js";
|
|
51
53
|
import { TIMEOUT_ABORT_TOOL_RESULT, composeTimeoutResumePrompt, stageTimeoutReason, } from "./stageTimeout.js";
|
|
54
|
+
import { globalStageflowHome } from "../project/globalHome.js";
|
|
55
|
+
import { durableRootFileToolDenial, STAGEFLOW_PATH_DENIED, } from "../runstore/workspaceLayout.js";
|
|
56
|
+
export { STAGEFLOW_PATH_DENIED };
|
|
57
|
+
export { createSealedResourceLoader } from "./piSessionFactory.js";
|
|
58
|
+
export const STAGEFLOW_PATH_DENY_EXTENSION_NAME = "stageflow-path-deny";
|
|
59
|
+
const PATH_DENY_FILE_TOOLS = new Set(["read", "write", "edit"]);
|
|
60
|
+
export function createDurableRootPathDenyExtension(options) {
|
|
61
|
+
const { runWorkspaceDir, durableRoot, checkoutRoot } = options;
|
|
62
|
+
const allowlistedRoots = checkoutRoot !== undefined && checkoutRoot !== ""
|
|
63
|
+
? [checkoutRoot]
|
|
64
|
+
: undefined;
|
|
65
|
+
return (pi) => {
|
|
66
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
67
|
+
if (!PATH_DENY_FILE_TOOLS.has(event.toolName)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const rawPath = event.input.path;
|
|
71
|
+
if (typeof rawPath !== "string" || rawPath.trim().length === 0) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const candidate = path.isAbsolute(rawPath)
|
|
75
|
+
? rawPath
|
|
76
|
+
: path.resolve(ctx.cwd, rawPath);
|
|
77
|
+
const reason = await durableRootFileToolDenial(candidate, runWorkspaceDir, durableRoot, allowlistedRoots);
|
|
78
|
+
if (reason !== undefined) {
|
|
79
|
+
return { block: true, reason };
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
}
|
|
52
85
|
/**
|
|
53
86
|
* Stage tool allowlist for sealed Pi sessions.
|
|
54
|
-
* Includes `ask_operator`
|
|
87
|
+
* Includes `ask_operator` only when `gateKinds` is a non-empty list.
|
|
55
88
|
* `write_stage_artifact` when registered (always, for bound and unbound —
|
|
56
89
|
* bound/unbound only gates cwd / env bind).
|
|
57
90
|
*/
|
|
@@ -63,7 +96,7 @@ export function resolveStageToolNames(emitToolName, artifactToolName, askOperato
|
|
|
63
96
|
"edit",
|
|
64
97
|
emitToolName,
|
|
65
98
|
];
|
|
66
|
-
if (gateKinds
|
|
99
|
+
if (Array.isArray(gateKinds) && gateKinds.length > 0) {
|
|
67
100
|
tools.push(askOperatorToolName);
|
|
68
101
|
}
|
|
69
102
|
if (artifactToolName) {
|
|
@@ -416,9 +449,16 @@ function buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName
|
|
|
416
449
|
}
|
|
417
450
|
const attempt = input.roots.attempt ?? 1;
|
|
418
451
|
const attemptArtifactsPath = `stages/${runtimeStageId(input)}/attempts/${attempt}/artifacts/`;
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
|
|
452
|
+
const skillBaseDirs = [
|
|
453
|
+
input.stage.skill !== undefined && input.skillFilePath !== undefined
|
|
454
|
+
? path.dirname(input.skillFilePath)
|
|
455
|
+
: undefined,
|
|
456
|
+
input.browserSkillFilePath !== undefined
|
|
457
|
+
? path.dirname(input.browserSkillFilePath)
|
|
458
|
+
: undefined,
|
|
459
|
+
].filter((dir) => dir !== undefined);
|
|
460
|
+
const skillBaseDir = skillBaseDirs.length > 0 ? skillBaseDirs.join(", ") : undefined;
|
|
461
|
+
const browserGuidance = formatBrowserGuidance(input);
|
|
422
462
|
const artifactGuidance = input.roots.mode === "bound" && artifactToolName !== undefined
|
|
423
463
|
? [
|
|
424
464
|
`Project checkout (agent cwd): ${input.roots.checkoutRoot}`,
|
|
@@ -453,16 +493,38 @@ function buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName
|
|
|
453
493
|
: "",
|
|
454
494
|
"",
|
|
455
495
|
artifactGuidance,
|
|
496
|
+
browserGuidance,
|
|
456
497
|
emitHint,
|
|
457
498
|
]
|
|
458
499
|
.filter(Boolean)
|
|
459
500
|
.join("\n");
|
|
460
501
|
}
|
|
502
|
+
function formatBrowserGuidance(input) {
|
|
503
|
+
const browser = input.stage.browser;
|
|
504
|
+
if (browser === undefined)
|
|
505
|
+
return "";
|
|
506
|
+
const lines = [
|
|
507
|
+
"This stage has a browser. Run only agent-browser commands in bash. The session is already set in the environment.",
|
|
508
|
+
];
|
|
509
|
+
if (browser.allow_domains !== undefined && browser.allow_domains.length > 0) {
|
|
510
|
+
lines.push(`Allowed domains: ${browser.allow_domains.join(", ")}. Open no other domain.`);
|
|
511
|
+
}
|
|
512
|
+
if (input.browserSkillFilePath !== undefined &&
|
|
513
|
+
input.stage.skill !== BROWSER_SKILL_NAME) {
|
|
514
|
+
lines.push(input.stage.skill !== undefined
|
|
515
|
+
? `Before you use the browser, read the browser skill at ${input.browserSkillFilePath}.`
|
|
516
|
+
: "Follow the browser skill.");
|
|
517
|
+
}
|
|
518
|
+
return lines.join("\n");
|
|
519
|
+
}
|
|
461
520
|
export function composeStageUserPrompt(input, emitToolName, emitHintOverride, artifactToolName) {
|
|
462
521
|
const body = buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName);
|
|
463
522
|
if (input.stage.skill !== undefined) {
|
|
464
523
|
return `/skill:${input.stage.skill} ${body}`;
|
|
465
524
|
}
|
|
525
|
+
if (input.browserSkillFilePath !== undefined && input.stage.browser !== undefined) {
|
|
526
|
+
return `/skill:${BROWSER_SKILL_NAME} ${body}`;
|
|
527
|
+
}
|
|
466
528
|
return body;
|
|
467
529
|
}
|
|
468
530
|
export function composeFeedbackResumePrompt(input) {
|
|
@@ -475,38 +537,6 @@ export function composeFeedbackResumePrompt(input) {
|
|
|
475
537
|
formatFeedbackLoopContext(input.feedbackLoopContext, input.sessionMode ?? "feedback_resume"),
|
|
476
538
|
].join("\n\n");
|
|
477
539
|
}
|
|
478
|
-
/**
|
|
479
|
-
* DefaultResourceLoader with host/global discovery turned off.
|
|
480
|
-
*
|
|
481
|
-
* Without these flags the loader walks up from the run folder and would pick
|
|
482
|
-
* up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
|
|
483
|
-
* and APPEND_SYSTEM.md. Stages must not inherit that context.
|
|
484
|
-
*
|
|
485
|
-
* `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
|
|
486
|
-
* is the isolated MCP seam. With `noExtensions: true`, discovered
|
|
487
|
-
* global/project packages stay out; only those allowlists load.
|
|
488
|
-
* `additionalSkillPaths` is the matching allowlist for one named skill.
|
|
489
|
-
*/
|
|
490
|
-
export function createSealedResourceLoader(options) {
|
|
491
|
-
return new DefaultResourceLoader({
|
|
492
|
-
cwd: options.cwd,
|
|
493
|
-
agentDir: options.agentDir,
|
|
494
|
-
settingsManager: options.settingsManager,
|
|
495
|
-
systemPromptOverride: () => options.systemPrompt,
|
|
496
|
-
appendSystemPromptOverride: () => [],
|
|
497
|
-
additionalExtensionPaths: options.additionalExtensionPaths,
|
|
498
|
-
additionalSkillPaths: options.additionalSkillPaths,
|
|
499
|
-
...(options.extensionFactories !== undefined
|
|
500
|
-
? { extensionFactories: options.extensionFactories }
|
|
501
|
-
: {}),
|
|
502
|
-
...(options.eventBus !== undefined ? { eventBus: options.eventBus } : {}),
|
|
503
|
-
noContextFiles: true,
|
|
504
|
-
noExtensions: true,
|
|
505
|
-
noSkills: true,
|
|
506
|
-
noPromptTemplates: true,
|
|
507
|
-
noThemes: true,
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
540
|
function collectMcpExtensionToolNames(loader) {
|
|
511
541
|
const inlinePath = `<inline:${STAGEFLOW_PI_MCP_EXTENSION_NAME}>`;
|
|
512
542
|
const names = [];
|
|
@@ -773,11 +803,11 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
|
|
|
773
803
|
}, input.feedbackLoopEmitContext);
|
|
774
804
|
const emitTool = defineTool(emitDef);
|
|
775
805
|
const gateKinds = input.stage.gate_kinds;
|
|
776
|
-
const includeAsk = gateKinds
|
|
806
|
+
const includeAsk = Array.isArray(gateKinds) && gateKinds.length > 0;
|
|
777
807
|
const askDef = includeAsk
|
|
778
808
|
? createAskOperatorTool({
|
|
779
809
|
requestWait: (prompt) => askWaitChannel.requestWait(prompt),
|
|
780
|
-
|
|
810
|
+
allowedKinds: gateKinds,
|
|
781
811
|
})
|
|
782
812
|
: undefined;
|
|
783
813
|
const askTool = askDef ? defineTool(askDef) : undefined;
|
|
@@ -793,6 +823,10 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
|
|
|
793
823
|
reason: `Skill "${input.stage.skill}" is not installed`,
|
|
794
824
|
};
|
|
795
825
|
}
|
|
826
|
+
const additionalSkillPaths = [
|
|
827
|
+
input.skillFilePath,
|
|
828
|
+
input.stage.browser !== undefined ? input.browserSkillFilePath : undefined,
|
|
829
|
+
].filter((p, i, all) => p !== undefined && all.indexOf(p) === i);
|
|
796
830
|
const additionalExtensionPaths = [];
|
|
797
831
|
let restoreProvider;
|
|
798
832
|
if (provider) {
|
|
@@ -825,18 +859,27 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
|
|
|
825
859
|
restoreProvider?.();
|
|
826
860
|
return { ok: false, reason };
|
|
827
861
|
};
|
|
862
|
+
const extensionFactories = [
|
|
863
|
+
{
|
|
864
|
+
name: STAGEFLOW_PATH_DENY_EXTENSION_NAME,
|
|
865
|
+
factory: createDurableRootPathDenyExtension({
|
|
866
|
+
runWorkspaceDir: roots.runWorkspaceDir,
|
|
867
|
+
durableRoot: globalStageflowHome(),
|
|
868
|
+
...(roots.checkoutRoot !== undefined
|
|
869
|
+
? { checkoutRoot: roots.checkoutRoot }
|
|
870
|
+
: {}),
|
|
871
|
+
}),
|
|
872
|
+
},
|
|
873
|
+
...(attached.extensionFactories ?? []),
|
|
874
|
+
];
|
|
828
875
|
const loader = createSealedResourceLoader({
|
|
829
876
|
cwd: roots.cwd,
|
|
830
877
|
agentDir: roots.agentDir,
|
|
831
878
|
settingsManager,
|
|
832
879
|
systemPrompt: input.stage.system_prompt,
|
|
833
880
|
additionalExtensionPaths,
|
|
834
|
-
...(
|
|
835
|
-
|
|
836
|
-
: {}),
|
|
837
|
-
...(attached.extensionFactories !== undefined
|
|
838
|
-
? { extensionFactories: attached.extensionFactories }
|
|
839
|
-
: {}),
|
|
881
|
+
...(additionalSkillPaths.length > 0 ? { additionalSkillPaths } : {}),
|
|
882
|
+
extensionFactories,
|
|
840
883
|
...(attached.eventBus !== undefined ? { eventBus: attached.eventBus } : {}),
|
|
841
884
|
});
|
|
842
885
|
await loader.reload();
|
|
@@ -917,7 +960,7 @@ export async function reconstructStageSessionForAnswer(input, answer) {
|
|
|
917
960
|
}
|
|
918
961
|
let session;
|
|
919
962
|
try {
|
|
920
|
-
const created = await
|
|
963
|
+
const created = await createPiAgentSession({
|
|
921
964
|
cwd: input.roots.cwd,
|
|
922
965
|
agentDir: input.roots.agentDir,
|
|
923
966
|
modelRuntime: wiring.modelRuntime,
|
|
@@ -943,6 +986,13 @@ export async function reconstructStageSessionForAnswer(input, answer) {
|
|
|
943
986
|
if (resolved.thinkingLevel) {
|
|
944
987
|
session.setThinkingLevel(resolved.thinkingLevel);
|
|
945
988
|
}
|
|
989
|
+
await input.onResolvedModel?.({
|
|
990
|
+
stageId: runtimeStageId(input),
|
|
991
|
+
model: resolved.model.id,
|
|
992
|
+
...(resolved.thinkingLevel !== undefined
|
|
993
|
+
? { thinkingLevel: resolved.thinkingLevel }
|
|
994
|
+
: {}),
|
|
995
|
+
});
|
|
946
996
|
const liveSession = session;
|
|
947
997
|
return {
|
|
948
998
|
session: liveSession,
|
|
@@ -969,7 +1019,7 @@ export async function reconstructStageSessionForAnswer(input, answer) {
|
|
|
969
1019
|
}
|
|
970
1020
|
async function bindStageSession(input, sessionManager, wiring) {
|
|
971
1021
|
const { roots } = input;
|
|
972
|
-
const created = await
|
|
1022
|
+
const created = await createPiAgentSession({
|
|
973
1023
|
cwd: roots.cwd,
|
|
974
1024
|
agentDir: roots.agentDir,
|
|
975
1025
|
modelRuntime: wiring.modelRuntime,
|
|
@@ -1011,6 +1061,13 @@ async function bindStageSession(input, sessionManager, wiring) {
|
|
|
1011
1061
|
if (resolved.thinkingLevel) {
|
|
1012
1062
|
session.setThinkingLevel(resolved.thinkingLevel);
|
|
1013
1063
|
}
|
|
1064
|
+
await input.onResolvedModel?.({
|
|
1065
|
+
stageId: runtimeStageId(input),
|
|
1066
|
+
model: resolved.model.id,
|
|
1067
|
+
...(resolved.thinkingLevel !== undefined
|
|
1068
|
+
? { thinkingLevel: resolved.thinkingLevel }
|
|
1069
|
+
: {}),
|
|
1070
|
+
});
|
|
1014
1071
|
}
|
|
1015
1072
|
catch (err) {
|
|
1016
1073
|
await shutdownSession(session);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type EventBus, type InlineExtension } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { type ResolvedMcpServers } from "../config/resolveStageMcpServers.js";
|
|
3
3
|
export declare const STAGEFLOW_PI_MCP_EXTENSION_NAME = "stageflow-mcp";
|
|
4
|
+
export declare function jitiFsCacheDir(): string;
|
|
5
|
+
export declare function resetCreateMcpAdapterCacheForTests(): void;
|
|
4
6
|
type IsolatedMcpServerEntry = Record<string, unknown> & {
|
|
5
7
|
lifecycle: "lazy" | "eager";
|
|
6
8
|
directTools: true;
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { createEventBus, } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import { StageMcpError, } from "../config/resolveStageMcpServers.js";
|
|
4
|
+
import { globalStageflowHome } from "../project/globalHome.js";
|
|
3
5
|
export const STAGEFLOW_PI_MCP_EXTENSION_NAME = "stageflow-mcp";
|
|
4
6
|
const MCP_STATUS_EVENT = "pi-mcp-adapter/status/v1";
|
|
5
|
-
const DEFAULT_ISOLATED_MCP_CONNECT_TIMEOUT_MS =
|
|
7
|
+
const DEFAULT_ISOLATED_MCP_CONNECT_TIMEOUT_MS = 30_000;
|
|
6
8
|
const STATUS_POLL_MS = 50;
|
|
7
9
|
const PI_MCP_ADAPTER_SPEC = "pi-mcp-adapter";
|
|
10
|
+
export function jitiFsCacheDir() {
|
|
11
|
+
return path.join(globalStageflowHome(), "cache", "jiti");
|
|
12
|
+
}
|
|
13
|
+
export function resetCreateMcpAdapterCacheForTests() {
|
|
14
|
+
cachedCreateMcpAdapter = undefined;
|
|
15
|
+
}
|
|
8
16
|
const ISOLATED_MCP_SETTINGS = {
|
|
9
17
|
directTools: true,
|
|
10
18
|
elicitation: false,
|
|
@@ -58,7 +66,7 @@ async function loadCreateMcpAdapter() {
|
|
|
58
66
|
// Node does not type-strip .ts under node_modules.
|
|
59
67
|
}
|
|
60
68
|
const { createJiti } = await import("jiti/static");
|
|
61
|
-
const jiti = createJiti(import.meta.url);
|
|
69
|
+
const jiti = createJiti(import.meta.url, { fsCache: jitiFsCacheDir() });
|
|
62
70
|
const mod = (await jiti.import(PI_MCP_ADAPTER_SPEC));
|
|
63
71
|
cachedCreateMcpAdapter = mod.createMcpAdapter;
|
|
64
72
|
return cachedCreateMcpAdapter;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type CreateAgentSessionResult, type EventBus, type InlineExtension, type ToolDefinition, DefaultResourceLoader, type ModelRuntime, type SessionManager, type SettingsManager } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export declare const WORKSHOP_FORBIDDEN_BUILTIN_TOOLS: readonly ["bash", "write", "edit"];
|
|
3
|
+
export type SealedResourceLoaderOptions = {
|
|
4
|
+
cwd: string;
|
|
5
|
+
agentDir: string;
|
|
6
|
+
settingsManager: SettingsManager;
|
|
7
|
+
systemPrompt: string;
|
|
8
|
+
additionalExtensionPaths?: string[];
|
|
9
|
+
additionalSkillPaths?: string[];
|
|
10
|
+
extensionFactories?: InlineExtension[];
|
|
11
|
+
eventBus?: EventBus;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* DefaultResourceLoader with host/global discovery turned off.
|
|
15
|
+
*
|
|
16
|
+
* Without these flags the loader walks up from the run folder and would pick
|
|
17
|
+
* up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
|
|
18
|
+
* and APPEND_SYSTEM.md. Stages must not inherit that context.
|
|
19
|
+
*
|
|
20
|
+
* `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
|
|
21
|
+
* is the isolated MCP seam. With `noExtensions: true`, discovered
|
|
22
|
+
* global/project packages stay out; only those allowlists load.
|
|
23
|
+
* `additionalSkillPaths` is the matching allowlist for one named skill.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createSealedResourceLoader(options: SealedResourceLoaderOptions): DefaultResourceLoader;
|
|
26
|
+
export type CreatePiAgentSessionOptions = {
|
|
27
|
+
cwd: string;
|
|
28
|
+
agentDir: string;
|
|
29
|
+
modelRuntime: ModelRuntime;
|
|
30
|
+
sessionManager: SessionManager;
|
|
31
|
+
customTools?: ToolDefinition[];
|
|
32
|
+
tools?: string[];
|
|
33
|
+
settingsManager?: SettingsManager;
|
|
34
|
+
resourceLoader: DefaultResourceLoader;
|
|
35
|
+
};
|
|
36
|
+
export declare function createPiAgentSession(options: CreatePiAgentSessionOptions): Promise<CreateAgentSessionResult>;
|
|
37
|
+
export declare function assertWorkshopToolsExcludeDiskShell(tools: readonly string[]): void;
|
|
38
|
+
export declare function resolveWorkshopToolNames(customToolNames: string[]): string[];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createAgentSession, DefaultResourceLoader, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export const WORKSHOP_FORBIDDEN_BUILTIN_TOOLS = ["bash", "write", "edit"];
|
|
3
|
+
/**
|
|
4
|
+
* DefaultResourceLoader with host/global discovery turned off.
|
|
5
|
+
*
|
|
6
|
+
* Without these flags the loader walks up from the run folder and would pick
|
|
7
|
+
* up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
|
|
8
|
+
* and APPEND_SYSTEM.md. Stages must not inherit that context.
|
|
9
|
+
*
|
|
10
|
+
* `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
|
|
11
|
+
* is the isolated MCP seam. With `noExtensions: true`, discovered
|
|
12
|
+
* global/project packages stay out; only those allowlists load.
|
|
13
|
+
* `additionalSkillPaths` is the matching allowlist for one named skill.
|
|
14
|
+
*/
|
|
15
|
+
export function createSealedResourceLoader(options) {
|
|
16
|
+
return new DefaultResourceLoader({
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
agentDir: options.agentDir,
|
|
19
|
+
settingsManager: options.settingsManager,
|
|
20
|
+
systemPromptOverride: () => options.systemPrompt,
|
|
21
|
+
appendSystemPromptOverride: () => [],
|
|
22
|
+
additionalExtensionPaths: options.additionalExtensionPaths,
|
|
23
|
+
additionalSkillPaths: options.additionalSkillPaths,
|
|
24
|
+
...(options.extensionFactories !== undefined
|
|
25
|
+
? { extensionFactories: options.extensionFactories }
|
|
26
|
+
: {}),
|
|
27
|
+
...(options.eventBus !== undefined ? { eventBus: options.eventBus } : {}),
|
|
28
|
+
noContextFiles: true,
|
|
29
|
+
noExtensions: true,
|
|
30
|
+
noSkills: true,
|
|
31
|
+
noPromptTemplates: true,
|
|
32
|
+
noThemes: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function createPiAgentSession(options) {
|
|
36
|
+
return createAgentSession({
|
|
37
|
+
cwd: options.cwd,
|
|
38
|
+
agentDir: options.agentDir,
|
|
39
|
+
modelRuntime: options.modelRuntime,
|
|
40
|
+
...(options.tools !== undefined ? { tools: options.tools } : {}),
|
|
41
|
+
...(options.customTools !== undefined
|
|
42
|
+
? { customTools: options.customTools }
|
|
43
|
+
: {}),
|
|
44
|
+
resourceLoader: options.resourceLoader,
|
|
45
|
+
sessionManager: options.sessionManager,
|
|
46
|
+
...(options.settingsManager !== undefined
|
|
47
|
+
? { settingsManager: options.settingsManager }
|
|
48
|
+
: {}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function assertWorkshopToolsExcludeDiskShell(tools) {
|
|
52
|
+
const forbidden = WORKSHOP_FORBIDDEN_BUILTIN_TOOLS.filter((name) => tools.includes(name));
|
|
53
|
+
if (forbidden.length > 0) {
|
|
54
|
+
throw new Error(`Workshop Pi allowlist must not include disk/shell builtins: ${forbidden.join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function resolveWorkshopToolNames(customToolNames) {
|
|
58
|
+
assertWorkshopToolsExcludeDiskShell(customToolNames);
|
|
59
|
+
return [...customToolNames];
|
|
60
|
+
}
|
package/dist/agent/port.d.ts
CHANGED
|
@@ -63,6 +63,8 @@ export type StageRunInput = {
|
|
|
63
63
|
/** Optional raw assistant-text-delta sink, fired alongside onActivity, not instead of it. */
|
|
64
64
|
onAssistantTextDelta?: (delta: string) => void;
|
|
65
65
|
skillFilePath?: string;
|
|
66
|
+
/** Bundled browser skill; set by the runtime when the stage has `browser`. */
|
|
67
|
+
browserSkillFilePath?: string;
|
|
66
68
|
forkEmitContext?: ForkEmitContext;
|
|
67
69
|
cloneEmitContext?: CloneEmitContext;
|
|
68
70
|
/** Declared source policy; successful emits must continue or send work back. */
|
|
@@ -75,6 +77,12 @@ export type StageRunInput = {
|
|
|
75
77
|
repairContext?: StageRepairContext;
|
|
76
78
|
/** Live attempt-scoped QA trail; read at emit execute time, not bootstrap time. */
|
|
77
79
|
readQaTrail?: () => QaExchange[] | Promise<QaExchange[]>;
|
|
80
|
+
/** Optional: record the provider-resolved model after resolveCliModel. */
|
|
81
|
+
onResolvedModel?: (info: {
|
|
82
|
+
stageId: string;
|
|
83
|
+
model: string;
|
|
84
|
+
thinkingLevel?: string;
|
|
85
|
+
}) => void | Promise<void>;
|
|
78
86
|
};
|
|
79
87
|
export declare function runtimeStageId(input: Pick<StageRunInput, "stage" | "stageId">): string;
|
|
80
88
|
export type StageRunResult = {
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
/** Scrub
|
|
1
|
+
/** Scrub secret-shaped substrings and registered values before text is persisted. */
|
|
2
2
|
export declare function redactSecrets(text: string): string;
|
|
3
|
+
/** Like redactSecrets plus cookie/storage/header shapes; for browser stages only. */
|
|
4
|
+
export declare function redactBrowserSecrets(text: string): string;
|
|
5
|
+
/** Tool/message previews of browser stages can carry cookie or token values. */
|
|
6
|
+
export declare function redactBrowserActivityEvent<T extends {
|
|
7
|
+
event: string;
|
|
8
|
+
}>(event: T): T;
|
|
@@ -1,13 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
/\b[A-Za-z_]*KEY[A-Za-z_]*\s*[:=]\s*['"]?[A-Za-z0-9+/_-]{16,}['"]?/gi,
|
|
5
|
-
];
|
|
6
|
-
/** Scrub common secret-shaped substrings before text is persisted or returned. */
|
|
1
|
+
import { BROWSER_STAGE_PATTERNS, redact, redactString, } from "../logging/redact.js";
|
|
2
|
+
import { getNamedSecrets } from "../logging/namedSecrets.js";
|
|
3
|
+
/** Scrub secret-shaped substrings and registered values before text is persisted. */
|
|
7
4
|
export function redactSecrets(text) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return
|
|
5
|
+
return redactString(text, { namedSecrets: getNamedSecrets() });
|
|
6
|
+
}
|
|
7
|
+
/** Like redactSecrets plus cookie/storage/header shapes; for browser stages only. */
|
|
8
|
+
export function redactBrowserSecrets(text) {
|
|
9
|
+
return redactString(text, {
|
|
10
|
+
patterns: BROWSER_STAGE_PATTERNS,
|
|
11
|
+
namedSecrets: getNamedSecrets(),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
const BROWSER_REDACTED_EVENTS = new Set([
|
|
15
|
+
"message",
|
|
16
|
+
"tool_start",
|
|
17
|
+
"tool_end",
|
|
18
|
+
"tool_progress",
|
|
19
|
+
]);
|
|
20
|
+
/** Tool/message previews of browser stages can carry cookie or token values. */
|
|
21
|
+
export function redactBrowserActivityEvent(event) {
|
|
22
|
+
if (!BROWSER_REDACTED_EVENTS.has(event.event))
|
|
23
|
+
return event;
|
|
24
|
+
return redact(event, {
|
|
25
|
+
patterns: BROWSER_STAGE_PATTERNS,
|
|
26
|
+
namedSecrets: getNamedSecrets(),
|
|
27
|
+
});
|
|
13
28
|
}
|