stageflow 0.33.0 → 0.36.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 +3 -3
- package/dist/agent/adapterSpill.d.ts +14 -0
- package/dist/agent/adapterSpill.js +83 -0
- package/dist/agent/agentBackend.d.ts +2 -2
- package/dist/agent/agentBackend.js +2 -2
- package/dist/agent/claudeAdapter.d.ts +13 -2
- package/dist/agent/claudeAdapter.js +56 -6
- package/dist/agent/cursorProvider.d.ts +3 -0
- package/dist/agent/cursorProvider.js +23 -6
- package/dist/agent/fakeAgent.d.ts +3 -3
- package/dist/agent/piAdapter.d.ts +2 -2
- package/dist/agent/piAdapter.js +125 -15
- package/dist/agent/piIsolatedMcp.d.ts +1 -0
- package/dist/agent/piIsolatedMcp.js +19 -1
- package/dist/agent/piIsolatedMcpProbe.d.ts +11 -0
- package/dist/agent/piIsolatedMcpProbe.js +20 -0
- package/dist/agent/port.d.ts +4 -2
- package/dist/agent/providerAuth.js +36 -3
- package/dist/agent/{resolveAgentPort.d.ts → resolveStagePort.d.ts} +8 -8
- package/dist/agent/{resolveAgentPort.js → resolveStagePort.js} +11 -11
- package/dist/agent/stageTurnDriver.d.ts +33 -0
- package/dist/agent/stageTurnDriver.js +64 -0
- package/dist/agent/toolOutputBudget.d.ts +46 -0
- package/dist/agent/toolOutputBudget.js +97 -0
- package/dist/agent/toolOutputBudgetExtension.d.ts +22 -0
- package/dist/agent/toolOutputBudgetExtension.js +141 -0
- package/dist/agent/toolOutputSpill.d.ts +34 -0
- package/dist/agent/toolOutputSpill.js +85 -0
- package/dist/browser/agentBrowserLiveViewRelay.d.ts +41 -0
- package/dist/browser/agentBrowserLiveViewRelay.js +801 -0
- package/dist/browser/anchor.d.ts +2 -0
- package/dist/browser/anchor.js +2 -1
- package/dist/browser/auditSink.d.ts +8 -0
- package/dist/browser/browserHost.d.ts +29 -0
- package/dist/browser/browserSweep.d.ts +4 -1
- package/dist/browser/browserSweep.js +7 -0
- package/dist/browser/browserTeardown.d.ts +1 -0
- package/dist/browser/browserTeardown.js +32 -2
- package/dist/browser/containerBrowserEndpoint.d.ts +11 -0
- package/dist/browser/containerBrowserEndpoint.js +57 -0
- package/dist/browser/containerBrowserHost.d.ts +24 -0
- package/dist/browser/containerBrowserHost.js +147 -0
- package/dist/browser/dockerSandboxOrchestrator.d.ts +26 -0
- package/dist/browser/dockerSandboxOrchestrator.js +142 -0
- package/dist/browser/fakeLiveViewRelay.d.ts +15 -0
- package/dist/browser/fakeLiveViewRelay.js +94 -0
- package/dist/browser/fakeLiveViewSource.d.ts +6 -0
- package/dist/browser/fakeLiveViewSource.js +16 -0
- package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -1
- package/dist/browser/fakeRemoteBrowserHost.js +2 -1
- package/dist/browser/fakeSandboxOrchestrator.d.ts +9 -0
- package/dist/browser/fakeSandboxOrchestrator.js +44 -0
- package/dist/browser/gateHandoff.d.ts +0 -2
- package/dist/browser/gateHandoff.js +5 -11
- package/dist/browser/hostCapabilities.d.ts +23 -0
- package/dist/browser/hostCapabilities.js +23 -0
- package/dist/browser/humanLogin.d.ts +2 -2
- package/dist/browser/humanLogin.js +11 -2
- package/dist/browser/liveViewPersisted.d.ts +11 -0
- package/dist/browser/liveViewPersisted.js +22 -0
- package/dist/browser/liveViewRelay.d.ts +76 -0
- package/dist/browser/liveViewRelay.js +1 -0
- package/dist/browser/liveViewSessions.d.ts +25 -0
- package/dist/browser/liveViewSessions.js +139 -0
- package/dist/browser/liveViewSource.d.ts +25 -0
- package/dist/browser/liveViewSource.js +7 -0
- package/dist/browser/liveViewTickets.d.ts +46 -0
- package/dist/browser/liveViewTickets.js +122 -0
- package/dist/browser/localBrowserHost.d.ts +10 -0
- package/dist/browser/localBrowserHost.js +53 -7
- package/dist/browser/ownerScope.d.ts +10 -0
- package/dist/browser/ownerScope.js +6 -0
- package/dist/browser/profileStore.d.ts +5 -2
- package/dist/browser/profileStore.js +3 -5
- package/dist/browser/sandboxOrchestrator.d.ts +60 -0
- package/dist/browser/sandboxOrchestrator.js +8 -0
- package/dist/browser/sessionApiSandboxOrchestrator.d.ts +34 -0
- package/dist/browser/sessionApiSandboxOrchestrator.js +108 -0
- package/dist/browser/stageBrowserEnv.d.ts +7 -0
- package/dist/browser/stageBrowserEnv.js +53 -15
- package/dist/browser/stageHandoff.d.ts +47 -0
- package/dist/browser/stageHandoff.js +101 -0
- package/dist/browser/stageProfileLock.d.ts +1 -0
- package/dist/browser/stageProfileLock.js +1 -3
- package/dist/browser/volumeProfileStore.d.ts +7 -0
- package/dist/browser/volumeProfileStore.js +35 -0
- package/dist/channels/config.d.ts +11 -0
- package/dist/channels/config.js +95 -0
- package/dist/channels/configWriter.d.ts +40 -0
- package/dist/channels/configWriter.js +148 -0
- package/dist/channels/connectionEdits.d.ts +34 -0
- package/dist/channels/connectionEdits.js +53 -0
- package/dist/channels/errorInfo.d.ts +18 -0
- package/dist/channels/errorInfo.js +71 -0
- package/dist/channels/errors.d.ts +12 -0
- package/dist/channels/errors.js +13 -0
- package/dist/channels/health.d.ts +41 -0
- package/dist/channels/health.js +99 -0
- package/dist/channels/host.d.ts +55 -0
- package/dist/channels/host.js +185 -0
- package/dist/channels/http.d.ts +31 -0
- package/dist/channels/http.js +79 -0
- package/dist/channels/index.d.ts +10 -0
- package/dist/channels/index.js +9 -0
- package/dist/channels/ledger.d.ts +37 -0
- package/dist/channels/ledger.js +95 -0
- package/dist/channels/providers/agentmail.d.ts +26 -0
- package/dist/channels/providers/agentmail.js +81 -0
- package/dist/channels/providers/kit.d.ts +40 -0
- package/dist/channels/providers/kit.js +78 -0
- package/dist/channels/providers/photonImessage.d.ts +45 -0
- package/dist/channels/providers/photonImessage.js +152 -0
- package/dist/channels/providers/photonWhatsapp.d.ts +49 -0
- package/dist/channels/providers/photonWhatsapp.js +146 -0
- package/dist/channels/providers/slack.d.ts +25 -0
- package/dist/channels/providers/slack.js +101 -0
- package/dist/channels/providers/telegram.d.ts +21 -0
- package/dist/channels/providers/telegram.js +100 -0
- package/dist/channels/providers.d.ts +5 -0
- package/dist/channels/providers.js +22 -0
- package/dist/channels/registry.d.ts +54 -0
- package/dist/channels/registry.js +186 -0
- package/dist/channels/secretStore.d.ts +21 -0
- package/dist/channels/secretStore.js +75 -0
- package/dist/channels/secrets.d.ts +15 -0
- package/dist/channels/secrets.js +50 -0
- package/dist/channels/service.d.ts +54 -0
- package/dist/channels/service.js +307 -0
- package/dist/channels/stageChannels.d.ts +45 -0
- package/dist/channels/stageChannels.js +110 -0
- package/dist/channels/types.d.ts +142 -0
- package/dist/channels/types.js +1 -0
- package/dist/cli/browserCommand.d.ts +3 -1
- package/dist/cli/browserCommand.js +25 -20
- package/dist/cli/doctorCommand.js +3 -1
- package/dist/cli/resolveCliProjectRoot.d.ts +7 -0
- package/dist/cli/resolveCliProjectRoot.js +27 -0
- package/dist/cli/runCommand.d.ts +1 -1
- package/dist/cli/runCommand.js +59 -17
- package/dist/cli/skillsCommand.d.ts +20 -0
- package/dist/cli/skillsCommand.js +74 -31
- package/dist/cli/validateCommand.d.ts +1 -1
- package/dist/cli/validateCommand.js +22 -4
- package/dist/cli.js +4 -4
- package/dist/config/browseCatalog.d.ts +2 -0
- package/dist/config/browseCatalog.js +6 -0
- package/dist/config/catalogRelativePath.d.ts +4 -0
- package/dist/config/catalogRelativePath.js +37 -9
- package/dist/config/createStage.d.ts +1 -0
- package/dist/config/createStage.js +11 -2
- package/dist/config/createTask.d.ts +30 -0
- package/dist/config/createTask.js +161 -0
- package/dist/config/createTrigger.d.ts +15 -0
- package/dist/config/createTrigger.js +32 -25
- package/dist/config/draftPackage.d.ts +42 -0
- package/dist/config/draftPackage.js +220 -23
- package/dist/config/ensureCatalogScanRoot.d.ts +2 -1
- package/dist/config/ensureCatalogScanRoot.js +6 -2
- package/dist/config/findTaskInCatalog.d.ts +33 -0
- package/dist/config/findTaskInCatalog.js +69 -0
- package/dist/config/hostConfig.d.ts +21 -0
- package/dist/config/hostConfig.js +114 -1
- package/dist/config/importTask.d.ts +19 -0
- package/dist/config/importTask.js +133 -0
- package/dist/config/installSkillRequest.d.ts +40 -0
- package/dist/config/installSkillRequest.js +286 -0
- package/dist/config/loadOutcome.d.ts +11 -6
- package/dist/config/loadPipeline.js +27 -4
- package/dist/config/loadStage.js +17 -0
- package/dist/config/loadStageflowManifest.js +4 -1
- package/dist/config/loadTask.js +2 -0
- package/dist/config/loadTrigger.js +2 -0
- package/dist/config/mergePipelineIncludes.d.ts +3 -0
- package/dist/config/mergePipelineIncludes.js +30 -0
- package/dist/config/normalizePipelineStageEntry.js +10 -1
- package/dist/config/pipelineStageKeys.js +1 -0
- package/dist/config/printTargetYaml.js +0 -1
- package/dist/config/publishDraftPackage.d.ts +5 -1
- package/dist/config/publishDraftPackage.js +4 -1
- package/dist/config/resolveCatalogRoots.d.ts +4 -1
- package/dist/config/resolveCatalogRoots.js +18 -1
- package/dist/config/skillUsageIndex.d.ts +6 -0
- package/dist/config/skillUsageIndex.js +39 -0
- package/dist/config/stageBrowser.js +13 -0
- package/dist/config/triggerAdapterStatus.d.ts +11 -0
- package/dist/config/triggerAdapterStatus.js +90 -0
- package/dist/config/triggerCatalog.d.ts +41 -2
- package/dist/config/triggerCatalog.js +107 -15
- package/dist/config/updateTask.d.ts +30 -0
- package/dist/config/updateTask.js +119 -0
- package/dist/config/updateTrigger.d.ts +38 -0
- package/dist/config/updateTrigger.js +220 -0
- package/dist/config/validateCatalog.d.ts +9 -2
- package/dist/config/validateCatalog.js +71 -7
- package/dist/config/workshopCatalogFilenames.d.ts +37 -0
- package/dist/config/workshopCatalogFilenames.js +125 -0
- package/dist/config/workshopCatalogRepair.d.ts +7 -0
- package/dist/config/workshopCatalogRepair.js +144 -0
- package/dist/config/yamlParsePosition.d.ts +4 -0
- package/dist/config/yamlParsePosition.js +9 -0
- package/dist/errors/codes.d.ts +1 -1
- package/dist/errors/codes.js +1 -0
- package/dist/hosted/runtime.d.ts +2 -2
- package/dist/hosted/types.d.ts +1 -1
- package/dist/hosted/types.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/mcp/catalogTools.js +1 -0
- package/dist/mcp/getStartedTool.js +15 -6
- package/dist/mcp/triggerTools.js +2 -8
- package/dist/operatorAgent/agentPort.d.ts +11 -0
- package/dist/operatorAgent/agentPort.js +12 -0
- package/dist/operatorAgent/index.d.ts +1 -0
- package/dist/operatorAgent/index.js +1 -0
- package/dist/operatorAgent/piModel.js +26 -6
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +4 -2
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +103 -16
- package/dist/package-meta.d.ts +1 -1
- package/dist/package-meta.js +1 -1
- package/dist/preflight/channelChecks.d.ts +17 -0
- package/dist/preflight/channelChecks.js +106 -0
- package/dist/preflight/pipelinePreflight.d.ts +9 -2
- package/dist/preflight/pipelinePreflight.js +9 -1
- package/dist/project/ensureProjectRootsFromEnv.d.ts +3 -0
- package/dist/project/ensureProjectRootsFromEnv.js +22 -0
- package/dist/project/globalHome.d.ts +1 -0
- package/dist/project/globalHome.js +18 -0
- package/dist/project/workspaceCatalog.d.ts +10 -0
- package/dist/project/workspaceCatalog.js +91 -0
- package/dist/runstore/backup.js +14 -4
- package/dist/runstore/port.d.ts +11 -1
- package/dist/runstore/restore.js +5 -2
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +8 -0
- package/dist/runstore/sqlite/SqliteRunStore.js +29 -9
- package/dist/runstore/sqlite/migrations/012-trigger-fires.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/012-trigger-fires.js +18 -0
- package/dist/runstore/sqlite/migrations/index.js +2 -0
- package/dist/runstore/stageSnapshot.d.ts +3 -1
- package/dist/runstore/stageSnapshot.js +19 -0
- package/dist/runstore/workspaceLayout.js +27 -0
- package/dist/runstore/writeContainedArtifact.d.ts +1 -0
- package/dist/runstore/writeContainedArtifact.js +52 -0
- package/dist/runtime/credentialBinding.js +14 -6
- package/dist/runtime/emailSource.js +20 -28
- package/dist/runtime/githubPollSource.js +20 -28
- package/dist/runtime/pipelineRunner.d.ts +4 -4
- package/dist/runtime/pipelineRunner.js +3 -1
- package/dist/runtime/pipelineScheduler.d.ts +2 -2
- package/dist/runtime/pipelineScheduler.js +3 -0
- package/dist/runtime/repositoryMaterialize.d.ts +1 -1
- package/dist/runtime/resumeReconstruct.d.ts +2 -2
- package/dist/runtime/resumeTimedOut.d.ts +2 -2
- package/dist/runtime/runManager.d.ts +18 -2
- package/dist/runtime/runManager.js +99 -31
- package/dist/runtime/runRetryCoordinator.d.ts +2 -2
- package/dist/runtime/scheduleSource.js +15 -24
- package/dist/runtime/stageAttemptBootstrap.d.ts +2 -2
- package/dist/runtime/stageAttemptBootstrap.js +26 -1
- package/dist/runtime/stageProcessLauncher.js +33 -3
- package/dist/runtime/stageRoots.js +8 -1
- package/dist/runtime/stageRunner.d.ts +2 -2
- package/dist/runtime/stageRunner.js +8 -2
- package/dist/runtime/stageWorker.js +2 -2
- package/dist/runtime/triggerPort.d.ts +5 -3
- package/dist/runtime/triggerRunner.d.ts +1 -0
- package/dist/runtime/triggerRunner.js +27 -20
- package/dist/runtime/webhookAccept.d.ts +25 -0
- package/dist/runtime/webhookAccept.js +56 -0
- package/dist/server/bootstrap.d.ts +10 -2
- package/dist/server/bootstrap.js +19 -1
- package/dist/server/channelRoutes.d.ts +9 -0
- package/dist/server/channelRoutes.js +88 -0
- package/dist/server/controlToken.d.ts +1 -1
- package/dist/server/controlToken.js +18 -2
- package/dist/server/healthSurfaces.d.ts +12 -0
- package/dist/server/healthSurfaces.js +27 -6
- package/dist/server/http.d.ts +19 -10
- package/dist/server/http.js +616 -85
- package/dist/server/liveViewPath.d.ts +9 -0
- package/dist/server/liveViewPath.js +8 -0
- package/dist/server/liveViewRoutes.d.ts +58 -0
- package/dist/server/liveViewRoutes.js +565 -0
- package/dist/server/mcpHost.d.ts +4 -2
- package/dist/server/mcpHost.js +2 -0
- package/dist/server/readCatalogFile.d.ts +29 -0
- package/dist/server/readCatalogFile.js +215 -0
- package/dist/server/triggerRoutes.d.ts +1 -0
- package/dist/server/triggerRoutes.js +200 -73
- package/dist/tools/sendMessage.d.ts +21 -0
- package/dist/tools/sendMessage.js +25 -0
- package/dist/tools/writeStageArtifact.d.ts +9 -0
- package/dist/tools/writeStageArtifact.js +2 -47
- package/dist/types/pipeline.d.ts +5 -2
- package/dist/types/stage.d.ts +14 -1
- package/dist/types/stageflowManifest.d.ts +1 -1
- package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/ui/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/ui/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/ui/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/ui/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/ui/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/ui/assets/index-BOhqnPNg.js +260 -0
- package/dist/ui/assets/{index-Bv4p1aPK.css → index-Clv4sJpU.css} +1 -1
- package/dist/ui/index.html +4 -4
- package/dist/workshop/autosave.d.ts +2 -2
- package/dist/workshop/autosave.js +4 -6
- package/dist/workshop/buildStore.d.ts +2 -0
- package/dist/workshop/chatAttachments.d.ts +27 -0
- package/dist/workshop/chatAttachments.js +98 -0
- package/dist/workshop/chatTurn.d.ts +5 -2
- package/dist/workshop/chatTurn.js +22 -18
- package/dist/workshop/sessionMutations.d.ts +17 -0
- package/dist/workshop/sessionMutations.js +107 -0
- package/dist/workshop/sessionStore.d.ts +10 -0
- package/dist/workshop/sessionStore.js +52 -0
- package/dist/workshop/workshopPin.d.ts +4 -3
- package/dist/workshop/workshopPin.js +26 -6
- package/dist/workshop/workshopTranscriptTurn.d.ts +8 -0
- package/dist/workshop/workshopTranscriptTurn.js +46 -0
- package/examples/README.md +1 -1
- package/examples/archify-on-pr/README.md +1 -1
- package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +0 -1
- package/examples/archify-on-pr/author-diagrams.yaml +1 -0
- package/examples/channels-smoke/README.md +12 -0
- package/examples/channels-smoke/channels-smoke.pipeline.yaml +11 -0
- package/examples/channels-smoke/channels-smoke.task.yaml +3 -0
- package/examples/channels-smoke/send-email.yaml +32 -0
- package/examples/channels-smoke/send-text.yaml +31 -0
- package/examples/conditional-fork/branch-a.yaml +1 -1
- package/examples/conditional-fork/decide.yaml +2 -1
- package/examples/feature-loop/{implement.yaml → feature-implement.yaml} +1 -1
- package/examples/feature-loop/feature-loop.pipeline.yaml +10 -10
- package/examples/feature-loop/{plan.yaml → feature-plan.yaml} +1 -1
- package/examples/feature-loop/{review.yaml → feature-review.yaml} +1 -1
- package/examples/feedback-loop/{implement.yaml → feedback-implement.yaml} +1 -1
- package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +9 -9
- package/examples/feedback-loop/feedback-loop.pipeline.yaml +9 -9
- package/examples/feedback-loop/{plan.yaml → feedback-plan.yaml} +1 -1
- package/examples/feedback-loop/{review.yaml → feedback-review.yaml} +1 -1
- package/examples/generic-fan-in/{research.yaml → fan-in-research.yaml} +1 -1
- package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +3 -3
- package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +3 -3
- package/examples/hello-world/{research.yaml → hello-research.yaml} +1 -1
- package/examples/hello-world/hello.pipeline.yaml +2 -2
- package/examples/mcp-hitl-tour/{review.yaml → mcp-hitl-review.yaml} +1 -1
- package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +3 -3
- package/examples/oss-issue-contribution/oss-explain-fix.yaml +1 -0
- package/examples/oss-issue-contribution/oss-explain-issue.yaml +1 -0
- package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +0 -2
- package/examples/stageflow.yaml +6 -0
- package/examples/triggers/sample-github-pr.trigger.yaml +12 -0
- package/examples/triggers/sample-inbox-email.trigger.yaml +14 -0
- package/examples/triggers/sample-manual-hello.trigger.yaml +5 -0
- package/examples/triggers/sample-nightly-hello.trigger.yaml +8 -0
- package/examples/triggers/sample-signed-webhook.trigger.yaml +11 -0
- package/examples/triggers-readiness/README.md +48 -0
- package/examples/triggers-readiness/readiness-emit.yaml +18 -0
- package/examples/triggers-readiness/readiness.pipeline.yaml +4 -0
- package/examples/triggers-readiness/readiness.task.yaml +6 -0
- package/examples/triggers-readiness/stageflow.yaml +13 -0
- package/examples/triggers-readiness/triggers/readiness-dynamic-manual.trigger.yaml +4 -0
- package/examples/triggers-readiness/triggers/readiness-email.trigger.yaml +12 -0
- package/examples/triggers-readiness/triggers/readiness-github-pr.trigger.yaml +12 -0
- package/examples/triggers-readiness/triggers/readiness-manual.trigger.yaml +5 -0
- package/examples/triggers-readiness/triggers/readiness-schedule.trigger.yaml +8 -0
- package/examples/triggers-readiness/triggers/readiness-webhook.trigger.yaml +11 -0
- package/package.json +8 -3
- package/skills/stageflow/references/control-surface.md +1 -1
- package/skills/stageflow-author/references/catalog-write-conventions.md +2 -2
- package/skills/stageflow-run/SKILL.md +1 -1
- package/skills/stageflow-run/references/mcp-call.md +1 -1
- package/skills/stageflow-setup/SKILL.md +1 -1
- package/dist/ui/assets/index-59cjF0OA.js +0 -133
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
1
3
|
import path from "node:path";
|
|
2
4
|
import { globalStageflowHome } from "../project/globalHome.js";
|
|
3
5
|
import { INLINE_PIPELINE_PATH, loadPipelineFromObjectOutcome, loadPipelineOutcome, resolvePipelinePath, } from "./loadPipeline.js";
|
|
@@ -12,6 +14,9 @@ import { MCP_CATALOG_FILENAME, StageMcpError, assertMcpAllowlistKnown, loadMcpCa
|
|
|
12
14
|
import { loadSecretRegistry } from "../runtime/stageSecrets.js";
|
|
13
15
|
import { isForeverDeniedSecret } from "../runtime/stageEnvironment.js";
|
|
14
16
|
import { findMissingMcpCommands } from "../preflight/mcpCommands.js";
|
|
17
|
+
import { ChannelError } from "../channels/errors.js";
|
|
18
|
+
import { ChannelRegistry } from "../channels/registry.js";
|
|
19
|
+
import { validateStageChannels } from "../channels/stageChannels.js";
|
|
15
20
|
export function relPath(cwd, absPath) {
|
|
16
21
|
return path.relative(cwd, absPath).replace(/\\/g, "/");
|
|
17
22
|
}
|
|
@@ -122,12 +127,21 @@ function findingCatalog(cwd, absPath, message, code, severity) {
|
|
|
122
127
|
category: "catalog",
|
|
123
128
|
}, severity);
|
|
124
129
|
}
|
|
130
|
+
function withIssueLocation(finding, issue) {
|
|
131
|
+
if (issue.line === undefined && issue.column === undefined)
|
|
132
|
+
return finding;
|
|
133
|
+
return {
|
|
134
|
+
...finding,
|
|
135
|
+
...(issue.line !== undefined ? { line: issue.line } : {}),
|
|
136
|
+
...(issue.column !== undefined ? { column: issue.column } : {}),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
125
139
|
export function findingsFromLoadIssues(cwd, absPath, issues) {
|
|
126
140
|
return issues.flatMap((issue) => {
|
|
127
141
|
if (issue.category === "pipeline") {
|
|
128
142
|
if (issue.code === "pipeline.model_applies" || issue.code === "pipeline.route_all_gated") {
|
|
129
143
|
return [
|
|
130
|
-
baseFinding({
|
|
144
|
+
withIssueLocation(baseFinding({
|
|
131
145
|
cwd,
|
|
132
146
|
absPath,
|
|
133
147
|
message: issue.message,
|
|
@@ -135,26 +149,26 @@ export function findingsFromLoadIssues(cwd, absPath, issues) {
|
|
|
135
149
|
category: "pipeline",
|
|
136
150
|
pipelineId: issue.pipelineId,
|
|
137
151
|
stageId: issue.stageId,
|
|
138
|
-
}, "warning"),
|
|
152
|
+
}, "warning"), issue),
|
|
139
153
|
];
|
|
140
154
|
}
|
|
141
155
|
return [
|
|
142
|
-
findingPipelineError(cwd, absPath, issue.message, issue.code, issue.pipelineId, issue.stageId),
|
|
156
|
+
withIssueLocation(findingPipelineError(cwd, absPath, issue.message, issue.code, issue.pipelineId, issue.stageId), issue),
|
|
143
157
|
];
|
|
144
158
|
}
|
|
145
159
|
if (issue.category === "stage") {
|
|
146
160
|
return [
|
|
147
|
-
findingStageError(cwd, absPath, issue.message, issue.code, issue.stageId),
|
|
161
|
+
withIssueLocation(findingStageError(cwd, absPath, issue.message, issue.code, issue.stageId), issue),
|
|
148
162
|
];
|
|
149
163
|
}
|
|
150
164
|
if (issue.category === "task") {
|
|
151
165
|
return [
|
|
152
|
-
findingTaskError(cwd, absPath, issue.message, issue.code),
|
|
166
|
+
withIssueLocation(findingTaskError(cwd, absPath, issue.message, issue.code), issue),
|
|
153
167
|
];
|
|
154
168
|
}
|
|
155
169
|
if (issue.category === "trigger") {
|
|
156
170
|
return [
|
|
157
|
-
findingTriggerError(cwd, absPath, issue.message, issue.code),
|
|
171
|
+
withIssueLocation(findingTriggerError(cwd, absPath, issue.message, issue.code), issue),
|
|
158
172
|
];
|
|
159
173
|
}
|
|
160
174
|
if (issue.category === "catalog") {
|
|
@@ -164,7 +178,7 @@ export function findingsFromLoadIssues(cwd, absPath, issues) {
|
|
|
164
178
|
code === "catalog.legacy_yaml"
|
|
165
179
|
? "warning"
|
|
166
180
|
: "error";
|
|
167
|
-
return [findingCatalog(cwd, absPath, issue.message, code, severity)];
|
|
181
|
+
return [withIssueLocation(findingCatalog(cwd, absPath, issue.message, code, severity), issue)];
|
|
168
182
|
}
|
|
169
183
|
return [];
|
|
170
184
|
});
|
|
@@ -245,6 +259,23 @@ function collectMcpAllowlistNames(loaded) {
|
|
|
245
259
|
}
|
|
246
260
|
return [...names];
|
|
247
261
|
}
|
|
262
|
+
function findingsForStageChannels(cwd, pipelinePath, loaded, projectRoot, providers) {
|
|
263
|
+
const users = loaded.stages.filter((stage) => (stage.channels?.length ?? 0) > 0);
|
|
264
|
+
if (users.length === 0)
|
|
265
|
+
return [];
|
|
266
|
+
let registry;
|
|
267
|
+
try {
|
|
268
|
+
registry = new ChannelRegistry({ cwd: projectRoot, providers });
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const code = error instanceof ChannelError ? error.code : "CHANNEL_INVALID_INPUT";
|
|
272
|
+
const field = error instanceof ChannelError && error.detail?.connectionId
|
|
273
|
+
? ` (connection "${error.detail.connectionId}"${error.detail.field ? `, field "${error.detail.field}"` : ""})`
|
|
274
|
+
: "";
|
|
275
|
+
return users.map((stage) => findingStageError(cwd, pipelinePath, `connections.yaml could not be loaded: ${code}${field}`, "stage.channel_unavailable", stage.id));
|
|
276
|
+
}
|
|
277
|
+
return users.flatMap((stage) => validateStageChannels(registry, stage).map((issue) => findingStageError(cwd, pipelinePath, issue.message, "stage.channel_unavailable", issue.stageId)));
|
|
278
|
+
}
|
|
248
279
|
function findingsForStageSecrets(cwd, pipelinePath, loaded) {
|
|
249
280
|
const registry = loadSecretRegistry(process.env);
|
|
250
281
|
const findings = [];
|
|
@@ -427,6 +458,7 @@ async function runPipelineValidation(nameOrPath, options) {
|
|
|
427
458
|
}
|
|
428
459
|
findings.push(...(await findingsForStageMcpCatalog(cwd, outcome.value)));
|
|
429
460
|
findings.push(...findingsForStageSecrets(cwd, pipelinePath, outcome.value));
|
|
461
|
+
findings.push(...findingsForStageChannels(cwd, pipelinePath, outcome.value, projectRoot, options.channelProviders));
|
|
430
462
|
findings.push(...findingsForStageflowHomeAbsolutePaths(cwd, outcome.value));
|
|
431
463
|
if (validateStages && outcome.value.stageSources) {
|
|
432
464
|
for (const source of Object.values(outcome.value.stageSources)) {
|
|
@@ -450,6 +482,7 @@ export async function validatePipeline(nameOrPath, options = {}) {
|
|
|
450
482
|
cwd,
|
|
451
483
|
projectRoot,
|
|
452
484
|
validateStages,
|
|
485
|
+
channelProviders: options.channelProviders,
|
|
453
486
|
});
|
|
454
487
|
return buildValidationResult("pipeline", core.findings, strict);
|
|
455
488
|
}
|
|
@@ -461,6 +494,7 @@ export async function loadPipelineValidated(nameOrPath, options = {}) {
|
|
|
461
494
|
cwd,
|
|
462
495
|
projectRoot,
|
|
463
496
|
validateStages,
|
|
497
|
+
channelProviders: options.channelProviders,
|
|
464
498
|
});
|
|
465
499
|
if (core.ok) {
|
|
466
500
|
return { ok: true, loaded: core.loaded, findings: core.findings };
|
|
@@ -615,6 +649,30 @@ async function validateSingleTask(invocationCwd, taskArg) {
|
|
|
615
649
|
}
|
|
616
650
|
return [];
|
|
617
651
|
}
|
|
652
|
+
async function validateSingleStage(invocationCwd, stageArg, stageContent) {
|
|
653
|
+
const ctx = await resolveCatalogContext(invocationCwd);
|
|
654
|
+
const relCwd = ctx.projectRoot ?? invocationCwd;
|
|
655
|
+
const stagePath = path.resolve(invocationCwd, stageArg);
|
|
656
|
+
if (stageContent === undefined) {
|
|
657
|
+
return validateStageFile(relCwd, stagePath);
|
|
658
|
+
}
|
|
659
|
+
const tmpDir = await mkdtemp(path.join(tmpdir(), "sf-stage-validate-"));
|
|
660
|
+
const tmpPath = path.join(tmpDir, path.basename(stagePath));
|
|
661
|
+
try {
|
|
662
|
+
await writeFile(tmpPath, stageContent, "utf8");
|
|
663
|
+
const findings = await validateStageFile(relCwd, tmpPath);
|
|
664
|
+
const displayPath = relPath(relCwd, stagePath);
|
|
665
|
+
const tmpRel = relPath(relCwd, tmpPath);
|
|
666
|
+
return findings.map((finding) => finding.path === tmpRel ||
|
|
667
|
+
finding.path === tmpPath ||
|
|
668
|
+
finding.path.includes(tmpDir)
|
|
669
|
+
? { ...finding, path: displayPath }
|
|
670
|
+
: finding);
|
|
671
|
+
}
|
|
672
|
+
finally {
|
|
673
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
674
|
+
}
|
|
675
|
+
}
|
|
618
676
|
async function validateSingleTrigger(invocationCwd, triggerArg) {
|
|
619
677
|
const ctx = await resolveCatalogContext(invocationCwd);
|
|
620
678
|
const relCwd = ctx.projectRoot ?? invocationCwd;
|
|
@@ -647,6 +705,9 @@ export async function validateCatalog(options) {
|
|
|
647
705
|
if (options.scope === "trigger" && !options.trigger) {
|
|
648
706
|
throw new Error("validateCatalog: trigger is required when scope is \"trigger\"");
|
|
649
707
|
}
|
|
708
|
+
if (options.scope === "stage" && !options.stage) {
|
|
709
|
+
throw new Error("validateCatalog: stage is required when scope is \"stage\"");
|
|
710
|
+
}
|
|
650
711
|
const allFindings = [];
|
|
651
712
|
if (options.scope === "pipeline") {
|
|
652
713
|
return validatePipeline(options.pipeline, {
|
|
@@ -662,6 +723,9 @@ export async function validateCatalog(options) {
|
|
|
662
723
|
else if (options.scope === "trigger") {
|
|
663
724
|
allFindings.push(...(await validateSingleTrigger(cwd, options.trigger)));
|
|
664
725
|
}
|
|
726
|
+
else if (options.scope === "stage") {
|
|
727
|
+
allFindings.push(...(await validateSingleStage(cwd, options.stage, options.stageContent)));
|
|
728
|
+
}
|
|
665
729
|
else {
|
|
666
730
|
allFindings.push(...(await validateManifestAll(cwd)));
|
|
667
731
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare function normalizePipelineCatalogFilename(pipelineId: string, filename?: string | null): string;
|
|
2
|
+
export declare function taskIdFromDraftTask(task: {
|
|
3
|
+
filename?: string;
|
|
4
|
+
body?: Record<string, unknown>;
|
|
5
|
+
}): string;
|
|
6
|
+
export declare function normalizeTaskCatalogFilename(taskId: string, filename?: string | null): string;
|
|
7
|
+
export type DraftTaskArtifact = {
|
|
8
|
+
filename: string;
|
|
9
|
+
body: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
export type DraftPackageFilenames = {
|
|
12
|
+
pipeline: {
|
|
13
|
+
id: string;
|
|
14
|
+
};
|
|
15
|
+
task?: DraftTaskArtifact;
|
|
16
|
+
};
|
|
17
|
+
export type CatalogYamlKind = "pipeline" | "task" | "other";
|
|
18
|
+
export declare function classifyCatalogYamlDocument(raw: Record<string, unknown>): CatalogYamlKind;
|
|
19
|
+
export declare function legacyBareCatalogFilenames(entityId: string): string[];
|
|
20
|
+
export declare function isMisnamedCatalogBasename(basename: string): boolean;
|
|
21
|
+
export declare function canonicalCatalogBasenameForDocument(raw: Record<string, unknown>, sourceBasename?: string): string | null;
|
|
22
|
+
export type WorkshopCatalogRepairMove = {
|
|
23
|
+
from: string;
|
|
24
|
+
to: string;
|
|
25
|
+
};
|
|
26
|
+
export type WorkshopCatalogRepairResult = {
|
|
27
|
+
renamed: WorkshopCatalogRepairMove[];
|
|
28
|
+
removed: string[];
|
|
29
|
+
};
|
|
30
|
+
export declare function reconcileWorkshopCatalogFilenames(pipelineId: string, taskId?: string | null, canonicalPipelineBasename?: string, canonicalTaskBasename?: string | null): {
|
|
31
|
+
renameCandidates: WorkshopCatalogRepairMove[];
|
|
32
|
+
removeCandidates: string[];
|
|
33
|
+
};
|
|
34
|
+
export declare function normalizeDraftCatalogFilenames<T extends DraftPackageFilenames>(draft: T, pipelineFilename?: string | null): {
|
|
35
|
+
draft: T;
|
|
36
|
+
pipelineFilename: string;
|
|
37
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
const PIPELINE_SUFFIX = ".pipeline.yaml";
|
|
2
|
+
const TASK_SUFFIX = ".task.yaml";
|
|
3
|
+
function basenameOnly(name) {
|
|
4
|
+
const trimmed = name.trim();
|
|
5
|
+
const parts = trimmed.split(/[\\/]/);
|
|
6
|
+
return parts[parts.length - 1]?.trim() || trimmed;
|
|
7
|
+
}
|
|
8
|
+
export function normalizePipelineCatalogFilename(pipelineId, filename) {
|
|
9
|
+
const id = pipelineId.trim() || "untitled";
|
|
10
|
+
const base = filename?.trim() ? basenameOnly(filename) : "";
|
|
11
|
+
if (base.endsWith(PIPELINE_SUFFIX)) {
|
|
12
|
+
const stem = base.slice(0, -PIPELINE_SUFFIX.length);
|
|
13
|
+
if (stem === id)
|
|
14
|
+
return base;
|
|
15
|
+
}
|
|
16
|
+
return `${id}${PIPELINE_SUFFIX}`;
|
|
17
|
+
}
|
|
18
|
+
export function taskIdFromDraftTask(task) {
|
|
19
|
+
const bodyId = task.body?.id;
|
|
20
|
+
if (typeof bodyId === "string" && bodyId.trim())
|
|
21
|
+
return bodyId.trim();
|
|
22
|
+
const base = task.filename?.trim() ? basenameOnly(task.filename) : "";
|
|
23
|
+
if (!base)
|
|
24
|
+
return "task";
|
|
25
|
+
return (base
|
|
26
|
+
.replace(/\.task\.ya?ml$/i, "")
|
|
27
|
+
.replace(/\.ya?ml$/i, "")
|
|
28
|
+
.trim() || "task");
|
|
29
|
+
}
|
|
30
|
+
export function normalizeTaskCatalogFilename(taskId, filename) {
|
|
31
|
+
const id = taskId.trim() || "task";
|
|
32
|
+
const base = filename?.trim() ? basenameOnly(filename) : "";
|
|
33
|
+
if (base.endsWith(TASK_SUFFIX)) {
|
|
34
|
+
const stem = base.slice(0, -TASK_SUFFIX.length);
|
|
35
|
+
if (stem === id)
|
|
36
|
+
return base;
|
|
37
|
+
}
|
|
38
|
+
return `${id}${TASK_SUFFIX}`;
|
|
39
|
+
}
|
|
40
|
+
const CATALOG_KIND_SUFFIX_PATTERN = /\.(pipeline|task|trigger)\.ya?ml$/i;
|
|
41
|
+
const BARE_YAML_PATTERN = /\.ya?ml$/i;
|
|
42
|
+
export function classifyCatalogYamlDocument(raw) {
|
|
43
|
+
if (Array.isArray(raw.stages))
|
|
44
|
+
return "pipeline";
|
|
45
|
+
if (typeof raw.goal === "string" || typeof raw.pipeline === "string") {
|
|
46
|
+
return "task";
|
|
47
|
+
}
|
|
48
|
+
return "other";
|
|
49
|
+
}
|
|
50
|
+
export function legacyBareCatalogFilenames(entityId) {
|
|
51
|
+
const id = entityId.trim();
|
|
52
|
+
if (!id)
|
|
53
|
+
return [];
|
|
54
|
+
return [`${id}.yaml`, `${id}.yml`];
|
|
55
|
+
}
|
|
56
|
+
export function isMisnamedCatalogBasename(basename) {
|
|
57
|
+
const name = basename.trim();
|
|
58
|
+
if (!BARE_YAML_PATTERN.test(name))
|
|
59
|
+
return false;
|
|
60
|
+
if (!CATALOG_KIND_SUFFIX_PATTERN.test(name))
|
|
61
|
+
return true;
|
|
62
|
+
return /\.(pipeline|task)\.yml$/i.test(name);
|
|
63
|
+
}
|
|
64
|
+
export function canonicalCatalogBasenameForDocument(raw, sourceBasename) {
|
|
65
|
+
const kind = classifyCatalogYamlDocument(raw);
|
|
66
|
+
const id = raw.id;
|
|
67
|
+
if (typeof id !== "string" || !id.trim())
|
|
68
|
+
return null;
|
|
69
|
+
if (kind === "pipeline")
|
|
70
|
+
return normalizePipelineCatalogFilename(id);
|
|
71
|
+
if (kind === "task")
|
|
72
|
+
return normalizeTaskCatalogFilename(id);
|
|
73
|
+
if (sourceBasename && CATALOG_KIND_SUFFIX_PATTERN.test(sourceBasename)) {
|
|
74
|
+
const stem = sourceBasename.replace(/\.ya?ml$/i, "");
|
|
75
|
+
const kindSuffix = stem.match(/\.(pipeline|task|trigger)$/i)?.[1]?.toLowerCase();
|
|
76
|
+
if (kindSuffix === "pipeline") {
|
|
77
|
+
return normalizePipelineCatalogFilename(id);
|
|
78
|
+
}
|
|
79
|
+
if (kindSuffix === "task") {
|
|
80
|
+
return normalizeTaskCatalogFilename(id);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
export function reconcileWorkshopCatalogFilenames(pipelineId, taskId, canonicalPipelineBasename, canonicalTaskBasename) {
|
|
86
|
+
const renameCandidates = [];
|
|
87
|
+
const removeCandidates = [];
|
|
88
|
+
const pipelineCanonical = canonicalPipelineBasename?.trim() ||
|
|
89
|
+
normalizePipelineCatalogFilename(pipelineId);
|
|
90
|
+
const taskCanonical = taskId?.trim()
|
|
91
|
+
? canonicalTaskBasename?.trim() ||
|
|
92
|
+
normalizeTaskCatalogFilename(taskId)
|
|
93
|
+
: null;
|
|
94
|
+
for (const legacy of legacyBareCatalogFilenames(pipelineId)) {
|
|
95
|
+
if (legacy === pipelineCanonical)
|
|
96
|
+
continue;
|
|
97
|
+
removeCandidates.push(legacy);
|
|
98
|
+
}
|
|
99
|
+
if (taskId?.trim()) {
|
|
100
|
+
for (const legacy of legacyBareCatalogFilenames(taskId)) {
|
|
101
|
+
if (legacy === taskCanonical || legacy === pipelineCanonical)
|
|
102
|
+
continue;
|
|
103
|
+
removeCandidates.push(legacy);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { renameCandidates, removeCandidates };
|
|
107
|
+
}
|
|
108
|
+
export function normalizeDraftCatalogFilenames(draft, pipelineFilename) {
|
|
109
|
+
const pipelineFilenameOut = normalizePipelineCatalogFilename(draft.pipeline.id, pipelineFilename);
|
|
110
|
+
if (!draft.task) {
|
|
111
|
+
return { draft, pipelineFilename: pipelineFilenameOut };
|
|
112
|
+
}
|
|
113
|
+
const taskId = taskIdFromDraftTask(draft.task);
|
|
114
|
+
const taskFilename = normalizeTaskCatalogFilename(taskId, draft.task.filename);
|
|
115
|
+
if (taskFilename === draft.task.filename) {
|
|
116
|
+
return { draft, pipelineFilename: pipelineFilenameOut };
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
draft: {
|
|
120
|
+
...draft,
|
|
121
|
+
task: { ...draft.task, filename: taskFilename },
|
|
122
|
+
},
|
|
123
|
+
pipelineFilename: pipelineFilenameOut,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type WorkshopCatalogRepairResult } from "./workshopCatalogFilenames.js";
|
|
2
|
+
export declare function repairMisnamedWorkshopCatalogFiles(packageDirectory: string): Promise<WorkshopCatalogRepairResult>;
|
|
3
|
+
export declare function reconcileWorkshopCatalogPackageDir(packageDirectory: string, pipelineId: string, taskId?: string | null, options?: {
|
|
4
|
+
pipelineBasename?: string;
|
|
5
|
+
taskBasename?: string | null;
|
|
6
|
+
}): Promise<WorkshopCatalogRepairResult>;
|
|
7
|
+
export declare function repairWorkshopCatalogTree(projectRoot: string, relativeDirectories: string[]): Promise<WorkshopCatalogRepairResult>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readdir, rename, rm, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readYamlObject } from "./readYamlObject.js";
|
|
4
|
+
import { canonicalCatalogBasenameForDocument, isMisnamedCatalogBasename, legacyBareCatalogFilenames, normalizePipelineCatalogFilename, normalizeTaskCatalogFilename, reconcileWorkshopCatalogFilenames, } from "./workshopCatalogFilenames.js";
|
|
5
|
+
async function fileExists(absPath) {
|
|
6
|
+
try {
|
|
7
|
+
await stat(absPath);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function renameIfNeeded(fromAbs, toAbs, renamed) {
|
|
15
|
+
if (fromAbs === toAbs)
|
|
16
|
+
return;
|
|
17
|
+
if (!(await fileExists(fromAbs)))
|
|
18
|
+
return;
|
|
19
|
+
if (await fileExists(toAbs)) {
|
|
20
|
+
await rm(fromAbs, { force: true });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
await rename(fromAbs, toAbs);
|
|
24
|
+
renamed.push({
|
|
25
|
+
from: path.basename(fromAbs),
|
|
26
|
+
to: path.basename(toAbs),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export async function repairMisnamedWorkshopCatalogFiles(packageDirectory) {
|
|
30
|
+
const renamed = [];
|
|
31
|
+
const removed = [];
|
|
32
|
+
let entries;
|
|
33
|
+
try {
|
|
34
|
+
entries = await readdir(packageDirectory);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { renamed, removed };
|
|
38
|
+
}
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
if (!isMisnamedCatalogBasename(entry))
|
|
41
|
+
continue;
|
|
42
|
+
const absPath = path.join(packageDirectory, entry);
|
|
43
|
+
let raw;
|
|
44
|
+
try {
|
|
45
|
+
raw = await readYamlObject(absPath);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const canonical = canonicalCatalogBasenameForDocument(raw, entry);
|
|
51
|
+
if (!canonical || canonical === entry)
|
|
52
|
+
continue;
|
|
53
|
+
const targetAbs = path.join(packageDirectory, canonical);
|
|
54
|
+
await renameIfNeeded(absPath, targetAbs, renamed);
|
|
55
|
+
}
|
|
56
|
+
return { renamed, removed };
|
|
57
|
+
}
|
|
58
|
+
export async function reconcileWorkshopCatalogPackageDir(packageDirectory, pipelineId, taskId, options) {
|
|
59
|
+
const result = await repairMisnamedWorkshopCatalogFiles(packageDirectory);
|
|
60
|
+
const pipelineBasename = options?.pipelineBasename?.trim() ||
|
|
61
|
+
normalizePipelineCatalogFilename(pipelineId);
|
|
62
|
+
const taskBasename = taskId?.trim()
|
|
63
|
+
? options?.taskBasename?.trim() ||
|
|
64
|
+
normalizeTaskCatalogFilename(taskId)
|
|
65
|
+
: null;
|
|
66
|
+
for (const legacy of legacyBareCatalogFilenames(pipelineId)) {
|
|
67
|
+
if (legacy === pipelineBasename)
|
|
68
|
+
continue;
|
|
69
|
+
const legacyAbs = path.join(packageDirectory, legacy);
|
|
70
|
+
const canonicalAbs = path.join(packageDirectory, pipelineBasename);
|
|
71
|
+
if (!(await fileExists(legacyAbs)))
|
|
72
|
+
continue;
|
|
73
|
+
if (!(await fileExists(canonicalAbs))) {
|
|
74
|
+
let raw;
|
|
75
|
+
try {
|
|
76
|
+
raw = await readYamlObject(legacyAbs);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (canonicalCatalogBasenameForDocument(raw) === pipelineBasename) {
|
|
82
|
+
await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (await fileExists(canonicalAbs)) {
|
|
87
|
+
await rm(legacyAbs, { force: true });
|
|
88
|
+
result.removed.push(legacy);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (taskId?.trim() && taskBasename) {
|
|
92
|
+
for (const legacy of legacyBareCatalogFilenames(taskId)) {
|
|
93
|
+
if (legacy === taskBasename || legacy === pipelineBasename)
|
|
94
|
+
continue;
|
|
95
|
+
const legacyAbs = path.join(packageDirectory, legacy);
|
|
96
|
+
const canonicalAbs = path.join(packageDirectory, taskBasename);
|
|
97
|
+
if (!(await fileExists(legacyAbs)))
|
|
98
|
+
continue;
|
|
99
|
+
if (!(await fileExists(canonicalAbs))) {
|
|
100
|
+
let raw;
|
|
101
|
+
try {
|
|
102
|
+
raw = await readYamlObject(legacyAbs);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (canonicalCatalogBasenameForDocument(raw) === taskBasename) {
|
|
108
|
+
await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (await fileExists(canonicalAbs)) {
|
|
113
|
+
await rm(legacyAbs, { force: true });
|
|
114
|
+
result.removed.push(legacy);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const { removeCandidates } = reconcileWorkshopCatalogFilenames(pipelineId, taskId, pipelineBasename, taskBasename);
|
|
119
|
+
for (const legacy of removeCandidates) {
|
|
120
|
+
const legacyAbs = path.join(packageDirectory, legacy);
|
|
121
|
+
const canonicalAbs = path.join(packageDirectory, pipelineBasename);
|
|
122
|
+
if (!(await fileExists(legacyAbs)))
|
|
123
|
+
continue;
|
|
124
|
+
if (legacyAbs === canonicalAbs)
|
|
125
|
+
continue;
|
|
126
|
+
if (taskBasename && legacy === taskBasename)
|
|
127
|
+
continue;
|
|
128
|
+
if (!(await fileExists(canonicalAbs)))
|
|
129
|
+
continue;
|
|
130
|
+
await rm(legacyAbs, { force: true });
|
|
131
|
+
result.removed.push(legacy);
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
export async function repairWorkshopCatalogTree(projectRoot, relativeDirectories) {
|
|
136
|
+
const merged = { renamed: [], removed: [] };
|
|
137
|
+
for (const rel of relativeDirectories) {
|
|
138
|
+
const dir = path.resolve(projectRoot, rel);
|
|
139
|
+
const part = await repairMisnamedWorkshopCatalogFiles(dir);
|
|
140
|
+
merged.renamed.push(...part.renamed);
|
|
141
|
+
merged.removed.push(...part.removed);
|
|
142
|
+
}
|
|
143
|
+
return merged;
|
|
144
|
+
}
|
package/dist/errors/codes.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const BUSY_CHECKOUT: "busy_checkout";
|
|
|
4
4
|
/** Per-caller concurrency quota: queued when under global capacity; reject when queue full. */
|
|
5
5
|
export declare const BUSY_CALLER_QUOTA: "busy_caller_quota";
|
|
6
6
|
export declare const ABORTED: "aborted";
|
|
7
|
-
export declare const NETWORK_ERROR_CODES: readonly ["busy_capacity", "busy_checkout", "busy_caller_quota", "aborted", "unknown_project_root", "absolute_path_not_allowed", "path_outside_project_root", "catalog_root_unreadable", "ensure_project_not_allowed", "config_invalid", "config_unknown_key", "provider_not_configured", "a2a_configuration_error", "untrusted_config_origin", "command_not_on_path", "missing_tool", "tool_version_mismatch", "unknown_version", "secret_unavailable", "not_ready", "internal_error", "retry_in_progress", "hitl_not_retriable", "run_not_retryable", "stage_not_failed", "manual_recovery_required", "run_not_found", "stage_not_found", "artifact_not_found", "artifact_path_denied", "envelope_not_found", "insufficient_disk", "disk_check_failed", "shutting_down", "start.token_rejected", "inline_pipeline_too_large", "skills_invalid_name", "skills_invalid_path", "skills_missing_skill_md", "skills_payload_too_large", "pinned_sha_unavailable", "store_integrity_failed", "store_unsupported_filesystem", "tmpdir_unusable", "backup_insufficient_disk"];
|
|
7
|
+
export declare const NETWORK_ERROR_CODES: readonly ["busy_capacity", "busy_checkout", "busy_caller_quota", "aborted", "unknown_project_root", "absolute_path_not_allowed", "path_outside_project_root", "catalog_root_unreadable", "ensure_project_not_allowed", "config_invalid", "config_unknown_key", "provider_not_configured", "a2a_configuration_error", "untrusted_config_origin", "command_not_on_path", "missing_tool", "tool_version_mismatch", "unknown_version", "secret_unavailable", "channel_check_failed", "not_ready", "internal_error", "retry_in_progress", "hitl_not_retriable", "run_not_retryable", "stage_not_failed", "manual_recovery_required", "run_not_found", "stage_not_found", "artifact_not_found", "artifact_path_denied", "envelope_not_found", "insufficient_disk", "disk_check_failed", "shutting_down", "start.token_rejected", "inline_pipeline_too_large", "skills_invalid_name", "skills_invalid_path", "skills_missing_skill_md", "skills_payload_too_large", "pinned_sha_unavailable", "store_integrity_failed", "store_unsupported_filesystem", "tmpdir_unusable", "backup_insufficient_disk"];
|
|
8
8
|
export type NetworkErrorCode = (typeof NETWORK_ERROR_CODES)[number] | string;
|
|
9
9
|
export type NetworkErrorBody = {
|
|
10
10
|
code: NetworkErrorCode;
|
package/dist/errors/codes.js
CHANGED
package/dist/hosted/runtime.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StagePort } from "../agent/port.js";
|
|
2
2
|
import type { RunStore } from "../runstore/port.js";
|
|
3
3
|
import { type HostedEventSink, type HostedPipelineInput, type HostedPipelineResult } from "./types.js";
|
|
4
4
|
export type HostedRuntime = {
|
|
5
5
|
run(input: HostedPipelineInput): Promise<HostedPipelineResult>;
|
|
6
6
|
};
|
|
7
7
|
export declare function createHostedRuntime(dependencies: {
|
|
8
|
-
agent:
|
|
8
|
+
agent: StagePort;
|
|
9
9
|
localStore: RunStore;
|
|
10
10
|
eventSink: HostedEventSink;
|
|
11
11
|
eventDeliveryTimeoutMs?: number;
|
package/dist/hosted/types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const HOSTED_DELIVERY_ATTEMPTS = 2;
|
|
|
7
7
|
export declare const DEFAULT_EVENT_DELIVERY_TIMEOUT_MS = 10000;
|
|
8
8
|
/**
|
|
9
9
|
* After cancellation or timeout, Core waits at most this long for in-flight
|
|
10
|
-
* stage work to stop. `
|
|
10
|
+
* stage work to stop. `StagePort` handles must stop inside `close()`.
|
|
11
11
|
*/
|
|
12
12
|
export declare const HOSTED_CANCEL_GRACE_MS = 5000;
|
|
13
13
|
export type HostedRunContext = {
|
package/dist/hosted/types.js
CHANGED
|
@@ -5,6 +5,6 @@ export const HOSTED_DELIVERY_ATTEMPTS = 2;
|
|
|
5
5
|
export const DEFAULT_EVENT_DELIVERY_TIMEOUT_MS = 10_000;
|
|
6
6
|
/**
|
|
7
7
|
* After cancellation or timeout, Core waits at most this long for in-flight
|
|
8
|
-
* stage work to stop. `
|
|
8
|
+
* stage work to stop. `StagePort` handles must stop inside `close()`.
|
|
9
9
|
*/
|
|
10
10
|
export const HOSTED_CANCEL_GRACE_MS = 5_000;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,9 @@ export { resolveStageflowContext, projectContextFromStageflow, type StageflowCon
|
|
|
5
5
|
export { PACKAGE_NAME, PACKAGE_VERSION } from "./package-meta.js";
|
|
6
6
|
export type { StageEnvelope } from "./types/envelope.js";
|
|
7
7
|
export { assertRequiredEnvelope, isAdvancingEnvelope, } from "./envelope/check.js";
|
|
8
|
-
export type {
|
|
9
|
-
export {
|
|
8
|
+
export type { StagePort, StageHandle, StageHandleEvent, StageRunInput, StageRunResult, } from "./agent/port.js";
|
|
9
|
+
export { createPiStagePort } from "./agent/resolveStagePort.js";
|
|
10
|
+
export { createPiAgentPort, resolveAgentPort, type AgentPort, } from "./operatorAgent/agentPort.js";
|
|
10
11
|
export { configurePiProviderApiKey } from "./agent/providerAuth.js";
|
|
11
12
|
export type { StageActivityEvent, StageLogLine } from "./agent/activity.js";
|
|
12
13
|
export type { StageRoots } from "./runtime/stageRoots.js";
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,8 @@ export { resolveProjectContext, legacyProjectContext, } from "./project/resolveP
|
|
|
4
4
|
export { resolveStageflowContext, projectContextFromStageflow, } from "./project/resolveStageflowContext.js";
|
|
5
5
|
export { PACKAGE_NAME, PACKAGE_VERSION } from "./package-meta.js";
|
|
6
6
|
export { assertRequiredEnvelope, isAdvancingEnvelope, } from "./envelope/check.js";
|
|
7
|
-
export {
|
|
7
|
+
export { createPiStagePort } from "./agent/resolveStagePort.js";
|
|
8
|
+
export { createPiAgentPort, resolveAgentPort, } from "./operatorAgent/agentPort.js";
|
|
8
9
|
export { configurePiProviderApiKey } from "./agent/providerAuth.js";
|
|
9
10
|
export { runPipeline, startPipeline } from "./runtime/pipelineRunner.js";
|
|
10
11
|
export { createHostedRuntime, } from "./hosted/runtime.js";
|
package/dist/mcp/catalogTools.js
CHANGED
|
@@ -29,9 +29,12 @@ export function registerGetStartedTool(server, deps) {
|
|
|
29
29
|
task_count: tasks.items.filter((t) => t.project_root === root.project_root)
|
|
30
30
|
.length,
|
|
31
31
|
}));
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const authoringRoot = catalog_roots.find((r) => r.kind === "workspace" && r.read_only !== true) ??
|
|
33
|
+
catalog_roots.find((r) => r.kind === "registered") ??
|
|
34
|
+
catalog_roots[0];
|
|
35
|
+
const browseRoot = catalog_roots.find((r) => r.kind === "seeded") ?? authoringRoot;
|
|
36
|
+
const samplePipeline = pipelines.items.find((p) => p.project_root === browseRoot?.project_root);
|
|
37
|
+
const sampleTask = tasks.items.find((t) => t.project_root === browseRoot?.project_root);
|
|
35
38
|
return textResult({
|
|
36
39
|
host: { version: PACKAGE_VERSION },
|
|
37
40
|
providers: deps.providerAuthContext
|
|
@@ -42,16 +45,22 @@ export function registerGetStartedTool(server, deps) {
|
|
|
42
45
|
next_steps: [
|
|
43
46
|
{
|
|
44
47
|
tool: "list_pipelines",
|
|
45
|
-
args:
|
|
48
|
+
args: authoringRoot
|
|
49
|
+
? { project_root: authoringRoot.project_root }
|
|
50
|
+
: {},
|
|
46
51
|
},
|
|
47
52
|
{
|
|
48
53
|
tool: "list_tasks",
|
|
49
|
-
args:
|
|
54
|
+
args: authoringRoot
|
|
55
|
+
? { project_root: authoringRoot.project_root }
|
|
56
|
+
: {},
|
|
50
57
|
},
|
|
51
58
|
{
|
|
52
59
|
tool: "start_run",
|
|
53
60
|
args: {
|
|
54
|
-
...(
|
|
61
|
+
...(authoringRoot
|
|
62
|
+
? { project_root: authoringRoot.project_root }
|
|
63
|
+
: {}),
|
|
55
64
|
pipeline: samplePipeline?.path ?? "pipelines/demo.pipeline.yaml",
|
|
56
65
|
task_path: sampleTask?.path ?? "tasks/demo.task.yaml",
|
|
57
66
|
},
|