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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { mutationSnapshotsFromProposals, } from "./sessionMutations.js";
|
|
2
|
+
export function assistantTranscriptTextFromEvents(events) {
|
|
3
|
+
const parts = [];
|
|
4
|
+
for (const event of events) {
|
|
5
|
+
if (event.type === "message" && event.role === "assistant") {
|
|
6
|
+
parts.push(event.text);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return parts.join("\n\n").trim();
|
|
10
|
+
}
|
|
11
|
+
export function proposalPayloadsFromEvents(events) {
|
|
12
|
+
const proposals = [];
|
|
13
|
+
for (const event of events) {
|
|
14
|
+
if (event.type === "proposal") {
|
|
15
|
+
proposals.push(event.proposal);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return proposals;
|
|
19
|
+
}
|
|
20
|
+
export function transcriptMessagesForTurn(userMessage, attachments, events, options) {
|
|
21
|
+
const messages = [
|
|
22
|
+
{
|
|
23
|
+
role: "user",
|
|
24
|
+
text: userMessage,
|
|
25
|
+
...(attachments.length > 0 ? { attachments: [...attachments] } : {}),
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
for (const event of events) {
|
|
29
|
+
if (event.type === "message" && event.role !== "assistant") {
|
|
30
|
+
messages.push({ role: event.role, text: event.text });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const assistantText = assistantTranscriptTextFromEvents(events);
|
|
34
|
+
const proposals = proposalPayloadsFromEvents(events);
|
|
35
|
+
const mutations = proposals.length > 0
|
|
36
|
+
? mutationSnapshotsFromProposals(proposals, options?.autoApply === true)
|
|
37
|
+
: [];
|
|
38
|
+
if (assistantText.length > 0 || mutations.length > 0) {
|
|
39
|
+
messages.push({
|
|
40
|
+
role: "assistant",
|
|
41
|
+
text: assistantText,
|
|
42
|
+
...(mutations.length > 0 ? { mutations } : {}),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return messages;
|
|
46
|
+
}
|
package/examples/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Upgrading older YAML: [`sf migrate-yaml`](../docs/cli-reference.md#sf-migrate-ya
|
|
|
14
14
|
|
|
15
15
|
- **Route `if`** — `detect-changes` emits `author_diagrams` and skips `author-diagrams` when the PR diff has no diagram-relevant types
|
|
16
16
|
- **Multi-type output** — one pipeline authors 1–5 Archify diagram specs (`architecture`, `workflow`, `sequence`, `dataflow`, `lifecycle`)
|
|
17
|
-
- **Skill binding** — `skill: archify` on the
|
|
17
|
+
- **Skill binding** — `skill: archify` on the stage file; GHA provisions the skill via `sf skills install`
|
|
18
18
|
- **Deterministic handoff** — agents emit JSON specs; GHA runs `sf envelope get --format handoff` and Archify `deliver` outside the agent
|
|
19
19
|
- **Real automation** — [`.github/workflows/archify-pr-diagrams.yml`](../.github/workflows/archify-pr-diagrams.yml) posts sticky PR comments with browser-viewable HTML artifacts
|
|
20
20
|
|
|
@@ -10,7 +10,7 @@ for GHA to deliver as HTML.
|
|
|
10
10
|
|------|------|
|
|
11
11
|
| `archify-on-pr.pipeline.yaml` | detect-changes Route `if` → author-diagrams; `verify` + `on_verify_fail` on detect |
|
|
12
12
|
| `detect-changes.yaml` | Thin copy/emit from `ci-context.json` → `changes.json` + envelope |
|
|
13
|
-
| `author-diagrams.yaml` | Writes `{type}.spec.json` per selected type (skill: archify on
|
|
13
|
+
| `author-diagrams.yaml` | Writes `{type}.spec.json` per selected type (`skill: archify` on the stage file) |
|
|
14
14
|
| `archify-on-pr.task.yaml` | Task bound at run time |
|
|
15
15
|
| `../../scripts/prepare-ci-context.sh` | Deterministic PR/git context + diagram type selection before `sf run` |
|
|
16
16
|
| `../../scripts/validate-detect-envelope.mjs` | Verify helper: `changes.json` / envelope match `ci-context.json` |
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Channels smoke test
|
|
2
|
+
|
|
3
|
+
Two stages, one channel each: `send-email` sends one email (AgentMail) and then `send-text` sends one text (iMessage via Photon), through the connections on the Connections page. A stage can use one channel, so the two are separate stages. Nothing is sent until you start a run.
|
|
4
|
+
|
|
5
|
+
1. Connect AgentMail and iMessage on the Connections page. The stage expects the connection ids `agentmail` and `imessage`; if yours differ, edit `connection:` in the two stage files.
|
|
6
|
+
2. Pin your recipients: in `send-email.yaml` replace `to: [change-me@example.invalid]` with your email, and in `send-text.yaml` replace `to: "+10000000000"` with your phone in E.164 form (for example `+14155550123`). On a Free or Pro Photon project the phone must be a project user, and that person must have texted their assigned Photon line once, or the send is rejected.
|
|
7
|
+
3. Change `model:` to one you have a provider for.
|
|
8
|
+
4. Run `sf validate` on the pipeline, then open `channels-smoke` in the console and start it with `channels-smoke-task`. The run checks both connections live before the stage starts.
|
|
9
|
+
|
|
10
|
+
The Claude agent backend does not provide `send_message`; use a Pi model (the default).
|
|
11
|
+
|
|
12
|
+
The email subject is `Stageflow channels test`. The agent cannot change recipients, and declaring a second channel on either stage is rejected. A message that may have been sent is never resent: if a call returns `CHANNEL_SEND_OUTCOME_UNKNOWN`, check the provider before running again.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: send-email
|
|
2
|
+
# cursor/auto needs CURSOR_API_KEY on the host. Use another model if you prefer.
|
|
3
|
+
model: cursor/auto
|
|
4
|
+
# A stage uses one channel. Pin the recipient here: the agent can only send to it and cannot change it.
|
|
5
|
+
# `connection` is the id shown on the Connections page.
|
|
6
|
+
channels:
|
|
7
|
+
- connection: agentmail
|
|
8
|
+
to: [change-me@example.invalid]
|
|
9
|
+
operations: [send]
|
|
10
|
+
io:
|
|
11
|
+
input:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
14
|
+
additionalProperties: true
|
|
15
|
+
output:
|
|
16
|
+
schema:
|
|
17
|
+
type: object
|
|
18
|
+
required: [email]
|
|
19
|
+
properties:
|
|
20
|
+
email: { type: string, enum: [sent, failed] }
|
|
21
|
+
additionalProperties: false
|
|
22
|
+
system_prompt: |
|
|
23
|
+
Send one test email, then report the result.
|
|
24
|
+
Call send_message once with operationKey "smoke-email", subject "Stageflow channels test"
|
|
25
|
+
and text "Hello! This email was sent by a Stageflow test pipeline."
|
|
26
|
+
The recipient is fixed by configuration; never try to choose or change it.
|
|
27
|
+
If the call is repeated, use the same operationKey and the same content.
|
|
28
|
+
Never resend an uncertain submission (code CHANNEL_SEND_OUTCOME_UNKNOWN) with a different key.
|
|
29
|
+
Do not send messages through shell commands or any other tool.
|
|
30
|
+
Write a short receipt via write_stage_artifact. Do not include secrets.
|
|
31
|
+
When finished, call emit_stage_envelope exactly once with payload.email set to "sent" or "failed".
|
|
32
|
+
If the send failed, use status failure.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: send-text
|
|
2
|
+
model: cursor/auto
|
|
3
|
+
# One channel per stage. The recipient is a phone number in E.164 form. On a Free or Pro Photon
|
|
4
|
+
# project they must be a project user who has texted their assigned line once.
|
|
5
|
+
channels:
|
|
6
|
+
- connection: imessage
|
|
7
|
+
to: "+10000000000"
|
|
8
|
+
operations: [send]
|
|
9
|
+
io:
|
|
10
|
+
input:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
13
|
+
additionalProperties: true
|
|
14
|
+
output:
|
|
15
|
+
schema:
|
|
16
|
+
type: object
|
|
17
|
+
required: [text]
|
|
18
|
+
properties:
|
|
19
|
+
text: { type: string, enum: [sent, failed] }
|
|
20
|
+
additionalProperties: false
|
|
21
|
+
system_prompt: |
|
|
22
|
+
Send one test text message, then report the result.
|
|
23
|
+
Call send_message once with operationKey "smoke-text" and text
|
|
24
|
+
"Hello! This text was sent by a Stageflow test pipeline."
|
|
25
|
+
The recipient is fixed by configuration; never try to choose or change it.
|
|
26
|
+
If the call is repeated, use the same operationKey and the same content.
|
|
27
|
+
Never resend an uncertain submission (code CHANNEL_SEND_OUTCOME_UNKNOWN) with a different key.
|
|
28
|
+
Do not send messages through shell commands or any other tool.
|
|
29
|
+
Write a short receipt via write_stage_artifact. Do not include secrets.
|
|
30
|
+
When finished, call emit_stage_envelope exactly once with payload.text set to "sent" or "failed".
|
|
31
|
+
If the send failed, use status failure.
|
|
@@ -3,7 +3,7 @@ system_prompt: |
|
|
|
3
3
|
You are branch-a. Call emit_stage_envelope exactly once with status success,
|
|
4
4
|
a short summary that acknowledges branch-a ran, and artifacts []. Do not call
|
|
5
5
|
ask_operator.
|
|
6
|
-
model:
|
|
6
|
+
model: cursor/composer-2-5
|
|
7
7
|
io:
|
|
8
8
|
input:
|
|
9
9
|
schema:
|
|
@@ -65,14 +65,14 @@ stages:
|
|
|
65
65
|
clone_cap: 8
|
|
66
66
|
clone_mode: parallel
|
|
67
67
|
route:
|
|
68
|
-
- to: plan
|
|
68
|
+
- to: feature-plan
|
|
69
69
|
on_verify_fail:
|
|
70
70
|
mode: repair
|
|
71
71
|
max_attempts: 3
|
|
72
72
|
retry_safety: idempotent
|
|
73
73
|
include_failed_checks: true
|
|
74
|
-
- id: plan
|
|
75
|
-
uses: ./plan.yaml
|
|
74
|
+
- id: feature-plan
|
|
75
|
+
uses: ./feature-plan.yaml
|
|
76
76
|
route:
|
|
77
77
|
- to: align
|
|
78
78
|
on_verify_fail:
|
|
@@ -85,14 +85,14 @@ stages:
|
|
|
85
85
|
clone_cap: 8
|
|
86
86
|
clone_mode: sequential
|
|
87
87
|
route:
|
|
88
|
-
- to: implement
|
|
88
|
+
- to: feature-implement
|
|
89
89
|
on_verify_fail:
|
|
90
90
|
mode: repair
|
|
91
91
|
max_attempts: 3
|
|
92
92
|
retry_safety: idempotent
|
|
93
93
|
include_failed_checks: true
|
|
94
|
-
- id: implement
|
|
95
|
-
uses: ./implement.yaml
|
|
94
|
+
- id: feature-implement
|
|
95
|
+
uses: ./feature-implement.yaml
|
|
96
96
|
route:
|
|
97
97
|
- to: verify
|
|
98
98
|
on_verify_fail:
|
|
@@ -103,14 +103,14 @@ stages:
|
|
|
103
103
|
- id: verify
|
|
104
104
|
uses: ./verify.yaml
|
|
105
105
|
route:
|
|
106
|
-
- to: review
|
|
106
|
+
- to: feature-review
|
|
107
107
|
on_verify_fail:
|
|
108
108
|
mode: repair
|
|
109
109
|
max_attempts: 3
|
|
110
110
|
retry_safety: idempotent
|
|
111
111
|
include_failed_checks: true
|
|
112
|
-
- id: review
|
|
113
|
-
uses: ./review.yaml
|
|
112
|
+
- id: feature-review
|
|
113
|
+
uses: ./feature-review.yaml
|
|
114
114
|
route:
|
|
115
115
|
- to: address-feedback
|
|
116
116
|
on_verify_fail:
|
|
@@ -123,7 +123,7 @@ stages:
|
|
|
123
123
|
route:
|
|
124
124
|
- to: publish
|
|
125
125
|
- type: loop
|
|
126
|
-
to: review
|
|
126
|
+
to: feature-review
|
|
127
127
|
max_replays: 2
|
|
128
128
|
on_max_replays: wait_for_human
|
|
129
129
|
replay_session: new_session
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
id: feedback-loop-wait-human
|
|
2
2
|
stages:
|
|
3
|
-
- id: plan
|
|
3
|
+
- id: feedback-plan
|
|
4
4
|
entry: true
|
|
5
5
|
route:
|
|
6
|
-
- to: implement
|
|
7
|
-
uses: ./plan.yaml
|
|
8
|
-
- id: implement
|
|
6
|
+
- to: feedback-implement
|
|
7
|
+
uses: ./feedback-plan.yaml
|
|
8
|
+
- id: feedback-implement
|
|
9
9
|
route:
|
|
10
|
-
- to: review
|
|
11
|
-
uses: ./implement.yaml
|
|
12
|
-
- id: review
|
|
10
|
+
- to: feedback-review
|
|
11
|
+
uses: ./feedback-implement.yaml
|
|
12
|
+
- id: feedback-review
|
|
13
13
|
route:
|
|
14
14
|
- to: submit
|
|
15
15
|
- type: loop
|
|
16
|
-
to: implement
|
|
16
|
+
to: feedback-implement
|
|
17
17
|
max_replays: 1
|
|
18
18
|
on_max_replays: wait_for_human
|
|
19
19
|
replay_session: resume
|
|
20
|
-
uses: ./review.yaml
|
|
20
|
+
uses: ./feedback-review.yaml
|
|
21
21
|
- id: submit
|
|
22
22
|
uses: ./submit.yaml
|
|
23
23
|
replay_safe: false
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
id: feedback-loop
|
|
2
2
|
stages:
|
|
3
|
-
- id: plan
|
|
3
|
+
- id: feedback-plan
|
|
4
4
|
entry: true
|
|
5
5
|
route:
|
|
6
|
-
- to: implement
|
|
7
|
-
uses: ./plan.yaml
|
|
8
|
-
- id: implement
|
|
6
|
+
- to: feedback-implement
|
|
7
|
+
uses: ./feedback-plan.yaml
|
|
8
|
+
- id: feedback-implement
|
|
9
9
|
route:
|
|
10
|
-
- to: review
|
|
11
|
-
uses: ./implement.yaml
|
|
12
|
-
- id: review
|
|
10
|
+
- to: feedback-review
|
|
11
|
+
uses: ./feedback-implement.yaml
|
|
12
|
+
- id: feedback-review
|
|
13
13
|
route:
|
|
14
14
|
- to: submit
|
|
15
15
|
- type: loop
|
|
16
|
-
to: implement
|
|
16
|
+
to: feedback-implement
|
|
17
17
|
max_replays: 2
|
|
18
18
|
on_max_replays: require_continue
|
|
19
19
|
replay_session: resume
|
|
20
|
-
uses: ./review.yaml
|
|
20
|
+
uses: ./feedback-review.yaml
|
|
21
21
|
- id: submit
|
|
22
22
|
uses: ./submit.yaml
|
|
23
23
|
replay_safe: false
|
|
@@ -3,14 +3,14 @@ stages:
|
|
|
3
3
|
- id: clarify
|
|
4
4
|
entry: true
|
|
5
5
|
route:
|
|
6
|
-
- to: research
|
|
6
|
+
- to: fan-in-research
|
|
7
7
|
- to: validation
|
|
8
8
|
uses: ./clarify.yaml
|
|
9
|
-
- id: research
|
|
9
|
+
- id: fan-in-research
|
|
10
10
|
route:
|
|
11
11
|
- to: synthesize
|
|
12
12
|
on: [succeeded, failed, skipped]
|
|
13
|
-
uses: ./research.yaml
|
|
13
|
+
uses: ./fan-in-research.yaml
|
|
14
14
|
- id: validation
|
|
15
15
|
route:
|
|
16
16
|
- to: synthesize
|
|
@@ -3,13 +3,13 @@ stages:
|
|
|
3
3
|
- id: clarify
|
|
4
4
|
entry: true
|
|
5
5
|
route:
|
|
6
|
-
- to: research
|
|
6
|
+
- to: fan-in-research
|
|
7
7
|
- to: validation
|
|
8
8
|
uses: ./clarify.yaml
|
|
9
|
-
- id: research
|
|
9
|
+
- id: fan-in-research
|
|
10
10
|
route:
|
|
11
11
|
- to: synthesize
|
|
12
|
-
uses: ./research.yaml
|
|
12
|
+
uses: ./fan-in-research.yaml
|
|
13
13
|
- id: validation
|
|
14
14
|
route:
|
|
15
15
|
- to: synthesize
|
|
@@ -13,7 +13,6 @@ stages:
|
|
|
13
13
|
include_failed_checks: true
|
|
14
14
|
- id: oss-explain-issue
|
|
15
15
|
uses: ./oss-explain-issue.yaml
|
|
16
|
-
skill: ce-explain
|
|
17
16
|
on_verify_fail:
|
|
18
17
|
mode: repair
|
|
19
18
|
max_attempts: 3
|
|
@@ -85,7 +84,6 @@ stages:
|
|
|
85
84
|
include_failed_checks: true
|
|
86
85
|
- id: oss-explain-fix
|
|
87
86
|
uses: ./oss-explain-fix.yaml
|
|
88
|
-
skill: ce-explain
|
|
89
87
|
on_verify_fail:
|
|
90
88
|
mode: repair
|
|
91
89
|
max_attempts: 3
|
package/examples/stageflow.yaml
CHANGED
|
@@ -21,6 +21,7 @@ catalog:
|
|
|
21
21
|
- mcp-hitl-tour
|
|
22
22
|
- feature-loop
|
|
23
23
|
- ship-feature
|
|
24
|
+
- triggers-readiness
|
|
24
25
|
tasks:
|
|
25
26
|
- generic-fan-in
|
|
26
27
|
- stage-mcp
|
|
@@ -42,9 +43,14 @@ catalog:
|
|
|
42
43
|
- mcp-hitl-tour
|
|
43
44
|
- feature-loop
|
|
44
45
|
- ship-feature
|
|
46
|
+
- triggers-readiness
|
|
47
|
+
triggers:
|
|
48
|
+
- triggers
|
|
49
|
+
- triggers-readiness/triggers
|
|
45
50
|
patterns:
|
|
46
51
|
pipeline: "*.pipeline.yaml"
|
|
47
52
|
task: "*.task.yaml"
|
|
53
|
+
trigger: "*.trigger.yaml"
|
|
48
54
|
exclude:
|
|
49
55
|
- route-wiring-smoke-test/rejected
|
|
50
56
|
- stage-mcp/stage-mcp-dead.pipeline.yaml
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
id: sample-inbox-email
|
|
2
|
+
pipeline: hello
|
|
3
|
+
task: my-task
|
|
4
|
+
kind: event
|
|
5
|
+
enabled: false
|
|
6
|
+
event:
|
|
7
|
+
source: email.message
|
|
8
|
+
match:
|
|
9
|
+
subject: Invoice
|
|
10
|
+
config:
|
|
11
|
+
host: imap.example.com
|
|
12
|
+
port: 993
|
|
13
|
+
user: notifications@example.com
|
|
14
|
+
secretRef: EMAIL_PASSWORD
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Triggers readiness smoke catalog
|
|
2
|
+
|
|
3
|
+
Self-contained catalog for [Triggers readiness](../../docs/triggers-readiness.md). One trigger per checklist row, all targeting the minimal `readiness` pipeline.
|
|
4
|
+
|
|
5
|
+
| Trigger id | Kind | Default `enabled` | How to test |
|
|
6
|
+
|------------|------|-------------------|-------------|
|
|
7
|
+
| `readiness-manual` | manual | **true** | Triggers → **Fire** (or `sf trigger fire --run readiness-manual` via API id) |
|
|
8
|
+
| `readiness-schedule` | schedule | false | Enable in UI; cron `*/5 * * * *` UTC; needs Host scheduler |
|
|
9
|
+
| `readiness-github-pr` | event (`github.pull_request`) | false | Set `event.config.repo`, enable; needs `GITHUB_TOKEN` on Host |
|
|
10
|
+
| `readiness-webhook` | event (`webhook`) | false | Set `WEBHOOK_SECRET` on Host, enable; `POST /api/triggers/readiness-webhook/webhook` |
|
|
11
|
+
| `readiness-email` | event (`email.message`) | false | Edit IMAP `config`, set `EMAIL_PASSWORD`, enable; restart Host after create |
|
|
12
|
+
| `readiness-dynamic-manual` | manual (no `task`) | false | UI **Fire** disabled; `sf trigger fire readiness-dynamic-manual --task-inline '{"id":"t","goal":"Dynamic smoke"}'` |
|
|
13
|
+
|
|
14
|
+
## Validate and run pipeline (no trigger)
|
|
15
|
+
|
|
16
|
+
From the repository root:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
sf validate --strict \
|
|
20
|
+
--pipeline examples/triggers-readiness/readiness.pipeline.yaml \
|
|
21
|
+
--task examples/triggers-readiness/readiness.task.yaml
|
|
22
|
+
sf run \
|
|
23
|
+
--pipeline examples/triggers-readiness/readiness.pipeline.yaml \
|
|
24
|
+
--task examples/triggers-readiness/readiness.task.yaml
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Docker Compose
|
|
28
|
+
|
|
29
|
+
The image copies this tree to `/opt/stageflow/catalog/triggers-readiness` and registers it via `STAGEFLOW_ENSURE_PROJECT_ROOTS`. After `docker compose up --build -d`, open **Triggers** — you should see six `readiness-*` triggers.
|
|
30
|
+
|
|
31
|
+
Optional `.env` for event triggers:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
GITHUB_TOKEN=… # readiness-github-pr
|
|
35
|
+
WEBHOOK_SECRET=… # readiness-webhook (use a long random string)
|
|
36
|
+
EMAIL_PASSWORD=… # readiness-email (after you point config at a real mailbox)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Webhook smoke (replace secret and use the trigger id from the console if namespaced):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
BODY='{"hello":"triggers"}'
|
|
43
|
+
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $2}')
|
|
44
|
+
curl -sS -X POST "http://127.0.0.1:3847/api/triggers/readiness-webhook/webhook" \
|
|
45
|
+
-H "Content-Type: application/json" \
|
|
46
|
+
-H "x-hub-signature-256: $SIG" \
|
|
47
|
+
-d "$BODY"
|
|
48
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
id: readiness-emit
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are a trigger smoke-test stage. Reply with one short acknowledgment, then call emit_stage_envelope once with
|
|
4
|
+
status: success, a non-empty summary, artifacts: [], and payload: { "trigger_test": true }.
|
|
5
|
+
io:
|
|
6
|
+
input:
|
|
7
|
+
schema:
|
|
8
|
+
type: object
|
|
9
|
+
additionalProperties: true
|
|
10
|
+
output:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
13
|
+
required:
|
|
14
|
+
- trigger_test
|
|
15
|
+
properties:
|
|
16
|
+
trigger_test:
|
|
17
|
+
type: boolean
|
|
18
|
+
additionalProperties: false
|