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.
Files changed (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,62 @@
1
+ import { z } from "zod";
2
+ import { PACKAGE_VERSION } from "../package-meta.js";
3
+ import { listPipelinesMultiProject, listTasksMultiProject } from "../config/multiProjectCatalog.js";
4
+ import { resolveCatalogRoots } from "../config/resolveCatalogRoots.js";
5
+ import { textResult } from "./toolResults.js";
6
+ import { toolchainHealthMap } from "../preflight/toolchain.js";
7
+ export function registerGetStartedTool(server, deps) {
8
+ server.registerTool("get_started", {
9
+ description: "First-run orientation for remote harnesses: host version, providers, toolchain hints, catalog roots with counts, and a three-call next_steps list. No arguments.",
10
+ inputSchema: z.object({}),
11
+ }, async () => {
12
+ const roots = await resolveCatalogRoots({
13
+ store: deps.store,
14
+ bootCwd: deps.cwd,
15
+ });
16
+ const pipelines = await listPipelinesMultiProject({
17
+ store: deps.store,
18
+ bootCwd: deps.cwd,
19
+ });
20
+ const tasks = await listTasksMultiProject({
21
+ store: deps.store,
22
+ bootCwd: deps.cwd,
23
+ });
24
+ const catalog_roots = roots.map((root) => ({
25
+ project_root: root.project_root,
26
+ kind: root.kind,
27
+ read_only: root.read_only,
28
+ pipeline_count: pipelines.items.filter((p) => p.project_root === root.project_root).length,
29
+ task_count: tasks.items.filter((t) => t.project_root === root.project_root)
30
+ .length,
31
+ }));
32
+ const firstRoot = catalog_roots.find((r) => r.kind === "seeded") ?? catalog_roots[0];
33
+ const samplePipeline = pipelines.items.find((p) => p.project_root === firstRoot?.project_root);
34
+ const sampleTask = tasks.items.find((t) => t.project_root === firstRoot?.project_root);
35
+ return textResult({
36
+ host: { version: PACKAGE_VERSION },
37
+ providers: deps.providerAuthContext
38
+ ? { note: "Use list_providers for status" }
39
+ : { configured: [] },
40
+ toolchain: toolchainHealthMap(),
41
+ catalog_roots,
42
+ next_steps: [
43
+ {
44
+ tool: "list_pipelines",
45
+ args: firstRoot ? { project_root: firstRoot.project_root } : {},
46
+ },
47
+ {
48
+ tool: "list_tasks",
49
+ args: firstRoot ? { project_root: firstRoot.project_root } : {},
50
+ },
51
+ {
52
+ tool: "start_run",
53
+ args: {
54
+ ...(firstRoot ? { project_root: firstRoot.project_root } : {}),
55
+ pipeline: samplePipeline?.path ?? "pipelines/demo.pipeline.yaml",
56
+ task_path: sampleTask?.path ?? "tasks/demo.task.yaml",
57
+ },
58
+ },
59
+ ],
60
+ });
61
+ });
62
+ }
@@ -1,4 +1,15 @@
1
1
  import type { RunStore } from "../runstore/port.js";
2
+ export declare function assertSafeRunId(runId: string): void;
3
+ export declare const PATH_DENIED_MESSAGE = "Artifact path denied";
4
+ export type ContainedPathMessages = {
5
+ relativeRequired: string;
6
+ escapes: string;
7
+ notFound: (relativePath: string) => string;
8
+ denied?: string;
9
+ };
10
+ export declare const CHECKOUT_PATH_MESSAGES: ContainedPathMessages;
11
+ export declare function assertSafeRelativePath(relativePath: string, messages: ContainedPathMessages): string[];
12
+ export declare function resolveContainedRelativePath(containerDir: string, relativePath: string, messages: ContainedPathMessages): Promise<string>;
2
13
  export declare function artifactMediaType(relativePath: string): string | undefined;
3
14
  export type ClassifiedArtifactContent = {
4
15
  kind: "image";
@@ -1,8 +1,8 @@
1
1
  import { isUtf8 } from "node:buffer";
2
- import { readFile, realpath } from "node:fs/promises";
2
+ import { readFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
- import { isInsideDir } from "../runstore/workspaceLayout.js";
5
- function assertSafeRunId(runId) {
4
+ import { classifyRealPathContainment } from "../runstore/workspaceLayout.js";
5
+ export function assertSafeRunId(runId) {
6
6
  if (typeof runId !== "string" || runId.trim().length === 0) {
7
7
  throw new Error("runId must be a non-empty string");
8
8
  }
@@ -13,6 +13,48 @@ function assertSafeRunId(runId) {
13
13
  throw new Error("runId must not contain path separators or ..");
14
14
  }
15
15
  }
16
+ export const PATH_DENIED_MESSAGE = "Artifact path denied";
17
+ const ARTIFACT_MESSAGES = {
18
+ relativeRequired: "path must be relative to the run workspace",
19
+ escapes: "path escapes the run workspace",
20
+ notFound: (relativePath) => `Artifact not found: ${relativePath}`,
21
+ denied: PATH_DENIED_MESSAGE,
22
+ };
23
+ export const CHECKOUT_PATH_MESSAGES = {
24
+ relativeRequired: "path must be relative to the checkout",
25
+ escapes: "path escapes the checkout",
26
+ notFound: (relativePath) => `Checkout file not found: ${relativePath}`,
27
+ denied: PATH_DENIED_MESSAGE,
28
+ };
29
+ export function assertSafeRelativePath(relativePath, messages) {
30
+ if (typeof relativePath !== "string" || relativePath.trim().length === 0) {
31
+ throw new Error("path must be a non-empty string");
32
+ }
33
+ if (path.isAbsolute(relativePath)) {
34
+ throw new Error(messages.relativeRequired);
35
+ }
36
+ const segments = relativePath.split(/[/\\]/);
37
+ if (segments.some((segment) => segment === "..")) {
38
+ throw new Error("path must not contain .. segments");
39
+ }
40
+ if (segments.some((segment) => segment === ".pi-agent") ||
41
+ path.basename(relativePath) === "auth.json") {
42
+ throw new Error(messages.denied ?? PATH_DENIED_MESSAGE);
43
+ }
44
+ return segments;
45
+ }
46
+ export async function resolveContainedRelativePath(containerDir, relativePath, messages) {
47
+ assertSafeRelativePath(relativePath, messages);
48
+ const candidate = path.resolve(containerDir, relativePath);
49
+ const containment = await classifyRealPathContainment(candidate, containerDir);
50
+ if (containment.status === "missing") {
51
+ throw new Error(messages.notFound(relativePath));
52
+ }
53
+ if (containment.status === "outside") {
54
+ throw new Error(messages.escapes);
55
+ }
56
+ return containment.realPath;
57
+ }
16
58
  export function artifactMediaType(relativePath) {
17
59
  const ext = path.extname(relativePath).toLowerCase();
18
60
  switch (ext) {
@@ -41,35 +83,9 @@ export function classifyArtifactContent(relativePath, bytes) {
41
83
  }
42
84
  async function resolveRunArtifactFile(store, runId, relativePath) {
43
85
  assertSafeRunId(runId);
44
- if (typeof relativePath !== "string" || relativePath.trim().length === 0) {
45
- throw new Error("path must be a non-empty string");
46
- }
47
- if (path.isAbsolute(relativePath)) {
48
- throw new Error("path must be relative to the run workspace");
49
- }
50
- const segments = relativePath.split(/[/\\]/);
51
- if (segments.some((segment) => segment === "..")) {
52
- throw new Error("path must not contain .. segments");
53
- }
54
- if (segments.some((segment) => segment === ".pi-agent") ||
55
- path.basename(relativePath) === "auth.json") {
56
- throw new Error("Artifact path denied");
57
- }
58
86
  await store.readRunMeta(runId);
59
87
  const workspaceDir = store.getWorkspaceDir(runId);
60
- const workspaceReal = await realpath(workspaceDir);
61
- const candidate = path.resolve(workspaceDir, relativePath);
62
- let fileReal;
63
- try {
64
- fileReal = await realpath(candidate);
65
- }
66
- catch {
67
- throw new Error(`Artifact not found: ${relativePath}`);
68
- }
69
- if (!isInsideDir(fileReal, workspaceReal)) {
70
- throw new Error("path escapes the run workspace");
71
- }
72
- return fileReal;
88
+ return resolveContainedRelativePath(workspaceDir, relativePath, ARTIFACT_MESSAGES);
73
89
  }
74
90
  export async function readRunArtifact(store, runId, relativePath) {
75
91
  const fileReal = await resolveRunArtifactFile(store, runId, relativePath);
@@ -38,10 +38,12 @@ function toolDepsFrom(deps) {
38
38
  manager: deps.manager,
39
39
  store: deps.store,
40
40
  cwd: deps.cwd,
41
+ ...(deps.agentDir !== undefined ? { agentDir: deps.agentDir } : {}),
41
42
  ...(deps.providerAuthContext !== undefined
42
43
  ? { providerAuthContext: deps.providerAuthContext }
43
44
  : {}),
44
45
  ...(deps.projectRoot !== undefined ? { projectRoot: deps.projectRoot } : {}),
46
+ ...(deps.providerBoot !== undefined ? { providerBoot: deps.providerBoot } : {}),
45
47
  };
46
48
  }
47
49
  function attachBusNotifications(server, bus) {
package/dist/mcp/tools.js CHANGED
@@ -1,16 +1,22 @@
1
1
  import { z } from "zod";
2
2
  import { registerCatalogTools } from "./catalogTools.js";
3
+ import { registerCheckoutTools } from "./checkoutTools.js";
3
4
  import { registerControlTools } from "./controlTools.js";
4
5
  import { registerProjectMcpTools } from "./projectMcpTools.js";
5
6
  import { registerProviderTools } from "./providerTools.js";
7
+ import { registerTriggerTools } from "./triggerTools.js";
6
8
  import { textResult } from "./toolResults.js";
7
9
  import { DEFAULT_TIMEOUT_MS, waitRun } from "./waitRun.js";
10
+ import { registerGetStartedTool } from "./getStartedTool.js";
8
11
  export function registerMcpTools(server, deps) {
9
12
  const { store } = deps;
13
+ registerGetStartedTool(server, deps);
10
14
  registerCatalogTools(server, deps);
11
15
  registerControlTools(server, deps);
16
+ registerCheckoutTools(server, deps);
12
17
  registerProviderTools(server, deps);
13
18
  registerProjectMcpTools(server, deps);
19
+ registerTriggerTools(server, deps);
14
20
  server.registerTool("wait_run", {
15
21
  description: "Long-poll until a run is waiting for HITL input and/or terminal (succeeded/failed), or until timeout_ms. Default until=any wakes on waiting OR terminal. Abort cancels only this wait (not the run). Optional notifications/progress when the client supplies _meta.progressToken. Compose: wait_run → answer_gate → wait_run.",
16
22
  inputSchema: z.object({
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/server";
2
+ import type { McpToolDeps } from "./deps.js";
3
+ export declare function registerTriggerTools(server: McpServer, deps: McpToolDeps): void;
@@ -0,0 +1,176 @@
1
+ import { z } from "zod";
2
+ import { CatalogPathError, catalogPathErrorBody, resolveWritableCatalogRoot, } from "../config/catalogRelativePath.js";
3
+ import { createTrigger, parseCreateTriggerBody } from "../config/createTrigger.js";
4
+ import { loadCatalogTriggers } from "../config/triggerCatalog.js";
5
+ import { writeAudit } from "../logging/audit.js";
6
+ import { logger as rootLogger } from "../logging/logger.js";
7
+ import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
8
+ import { fireTrigger } from "../runtime/triggerRunner.js";
9
+ import { mapStartFailure } from "../server/operatorResults.js";
10
+ import { callerIdFromRequestAuth, getRequestAuth, } from "../server/requestAuthContext.js";
11
+ import { textResult } from "./toolResults.js";
12
+ const auditLog = rootLogger.child({ component: "audit" });
13
+ const triggerScheduleSchema = z.object({
14
+ cron: z.string(),
15
+ timezone: z.string().optional(),
16
+ });
17
+ const gitIdentitySchema = z.object({
18
+ name: z.string().optional(),
19
+ email: z.string().optional(),
20
+ });
21
+ /**
22
+ * Same shape as TaskFile (src/types/task.ts), duplicated locally the same way
23
+ * src/mcp/catalogTools.ts's own taskFileSchema is: deliberately not shared
24
+ * across module boundaries for a schema this small.
25
+ */
26
+ const taskFileSchema = z.object({
27
+ id: z.string(),
28
+ goal: z.string(),
29
+ context: z.string().optional(),
30
+ constraints: z.string().optional(),
31
+ checkout: z.string().optional(),
32
+ repository: z.string().optional(),
33
+ ref: z.string().optional(),
34
+ run_branch_template: z.string().optional(),
35
+ git_identity: gitIdentitySchema.optional(),
36
+ input: z.record(z.string(), z.unknown()).optional(),
37
+ });
38
+ const triggerEventSchema = z.object({
39
+ source: z.string(),
40
+ match: z.record(z.string(), z.unknown()).optional(),
41
+ config: z.record(z.string(), z.unknown()).optional(),
42
+ });
43
+ const createTriggerSchema = z.object({
44
+ project_root: z
45
+ .string()
46
+ .optional()
47
+ .describe("Catalog project root to write into; required when multiple catalog roots are configured and no sole non-seeded root exists"),
48
+ directory: z.string(),
49
+ id: z.string(),
50
+ pipeline: z.string(),
51
+ task: z
52
+ .string()
53
+ .optional()
54
+ .describe("Catalog task id; omit to create a dynamic-mode trigger whose task is supplied at fire time"),
55
+ kind: z.enum(["manual", "schedule", "event"]),
56
+ schedule: triggerScheduleSchema.optional(),
57
+ event: triggerEventSchema.optional(),
58
+ enabled: z.boolean().optional(),
59
+ });
60
+ export function registerTriggerTools(server, deps) {
61
+ const { store, cwd, manager } = deps;
62
+ server.registerTool("list_triggers", {
63
+ description: "List catalog-declared triggers (same source as GET /api/triggers): manual/schedule/event kind, enabled, and store-recorded last_fired_at/last_run_id/next_run_at when present.",
64
+ inputSchema: z.object({}),
65
+ }, async () => {
66
+ const items = await loadCatalogTriggers(cwd, store);
67
+ if (items === undefined) {
68
+ return textResult({ error: "No Stageflow catalog found", status: 404 }, true);
69
+ }
70
+ return textResult({ triggers: items });
71
+ });
72
+ server.registerTool("get_trigger", {
73
+ description: "Look up one catalog trigger by id (same source as GET /api/triggers/:id).",
74
+ inputSchema: z.object({
75
+ id: z.string(),
76
+ }),
77
+ }, async ({ id }) => {
78
+ const items = await loadCatalogTriggers(cwd, store);
79
+ if (items === undefined) {
80
+ return textResult({ error: "No Stageflow catalog found", status: 404 }, true);
81
+ }
82
+ const found = items.find((item) => item.id === id);
83
+ if (!found) {
84
+ return textResult({ error: `Trigger not found: ${id}`, status: 404 }, true);
85
+ }
86
+ return textResult(found);
87
+ });
88
+ server.registerTool("fire_trigger", {
89
+ description: "Fire a catalog trigger by id: resolves its pipeline/task refs and starts a run through the same RunManager.startRun path as start_run (same as POST /api/triggers/:id/fire). Returns { runId } or { runId, queued: true, queuePosition }. Fails not_found (404) for an unknown id, or 409 when the trigger is disabled.",
90
+ inputSchema: z.object({
91
+ id: z.string(),
92
+ task: taskFileSchema
93
+ .optional()
94
+ .describe("Inline TaskFile, required to fire a dynamic-mode trigger (no catalog task) and rejected for a catalog-mode trigger"),
95
+ }),
96
+ }, async ({ id, task }) => {
97
+ const callerId = callerIdFromRequestAuth();
98
+ const result = await fireTrigger(id, store, manager, { cwd, task });
99
+ if (!result.ok) {
100
+ writeAudit(auditLog, {
101
+ caller_id: callerId,
102
+ surface: getRequestAuth()?.surface ?? "mcp",
103
+ action: "trigger_fire",
104
+ outcome: "error",
105
+ error_code: result.code,
106
+ });
107
+ return textResult({
108
+ ...mapStartFailure(result),
109
+ ...(result.status !== undefined ? { status: result.status } : {}),
110
+ }, true);
111
+ }
112
+ writeAudit(auditLog, {
113
+ caller_id: callerId,
114
+ surface: getRequestAuth()?.surface ?? "mcp",
115
+ action: "trigger_fire",
116
+ target_run_id: result.runId,
117
+ outcome: "ok",
118
+ });
119
+ return textResult({
120
+ runId: result.runId,
121
+ ...(result.queued === true
122
+ ? {
123
+ queued: true,
124
+ queuePosition: result.queuePosition,
125
+ ...(result.queuedCode !== undefined
126
+ ? { queuedCode: result.queuedCode }
127
+ : {}),
128
+ }
129
+ : {}),
130
+ });
131
+ });
132
+ server.registerTool("create_trigger", {
133
+ description: "Create a new *.trigger.yaml in the catalog (same validation/write path as POST /api/triggers): validates id format/uniqueness, pipeline/task refs, and kind-specific shape (schedule.cron parses via croner; event.source is required), writes the file, and re-loads it to confirm it round-trips. Returns the created trigger.",
134
+ inputSchema: createTriggerSchema,
135
+ }, async ({ project_root, ...body }) => {
136
+ const callerId = callerIdFromRequestAuth();
137
+ let wireRoot;
138
+ try {
139
+ ({ wireRoot } = await resolveWritableCatalogRoot({ store, bootCwd: cwd }, project_root));
140
+ }
141
+ catch (err) {
142
+ if (err instanceof CatalogPathError) {
143
+ return textResult(catalogPathErrorBody(err), true);
144
+ }
145
+ throw err;
146
+ }
147
+ const parsed = parseCreateTriggerBody(body);
148
+ if ("ok" in parsed) {
149
+ return textResult({ error: parsed.error, status: parsed.status }, true);
150
+ }
151
+ const stageflowCtx = await resolveStageflowContext(wireRoot.path);
152
+ if (stageflowCtx.manifestStatus !== "ok") {
153
+ return textResult({
154
+ error: "Project root not found; initialize stageflow.yaml",
155
+ status: 400,
156
+ }, true);
157
+ }
158
+ const result = await createTrigger(stageflowCtx.projectRoot, parsed);
159
+ if (!result.ok) {
160
+ writeAudit(auditLog, {
161
+ caller_id: callerId,
162
+ surface: getRequestAuth()?.surface ?? "mcp",
163
+ action: "trigger_create",
164
+ outcome: "error",
165
+ });
166
+ return textResult({ error: result.error, status: result.status }, true);
167
+ }
168
+ writeAudit(auditLog, {
169
+ caller_id: callerId,
170
+ surface: getRequestAuth()?.surface ?? "mcp",
171
+ action: "trigger_create",
172
+ outcome: "ok",
173
+ });
174
+ return textResult(result.trigger);
175
+ });
176
+ }
@@ -0,0 +1,14 @@
1
+ export type ProxyInstallResult = {
2
+ installed: boolean;
3
+ httpProxyHost?: string;
4
+ httpsProxyHost?: string;
5
+ noProxy: string;
6
+ };
7
+ export declare function effectiveNoProxy(env: NodeJS.ProcessEnv, bindHosts?: readonly string[]): string;
8
+ export declare function installProxyDispatcher(env?: NodeJS.ProcessEnv, options?: {
9
+ bindHosts?: readonly string[];
10
+ log?: (msg: string) => void;
11
+ }): ProxyInstallResult;
12
+ export declare function resetProxyDispatcherForTests(): void;
13
+ export declare function buildEgressHealth(env?: NodeJS.ProcessEnv): Record<string, unknown>;
14
+ export declare function proxyHealthFields(env?: NodeJS.ProcessEnv): Record<string, unknown>;
@@ -0,0 +1,78 @@
1
+ import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
2
+ import { stripUrlUserinfo } from "../logging/redact.js";
3
+ let installed = false;
4
+ function firstProxy(env) {
5
+ return (env.HTTPS_PROXY ||
6
+ env.https_proxy ||
7
+ env.HTTP_PROXY ||
8
+ env.http_proxy ||
9
+ undefined);
10
+ }
11
+ function parseProxyHost(raw) {
12
+ if (!raw)
13
+ return undefined;
14
+ try {
15
+ const u = new URL(raw);
16
+ return u.host;
17
+ }
18
+ catch {
19
+ return stripUrlUserinfo(raw);
20
+ }
21
+ }
22
+ export function effectiveNoProxy(env, bindHosts = ["127.0.0.1", "::1", "localhost"]) {
23
+ const existing = env.NO_PROXY ?? env.no_proxy ?? "";
24
+ const parts = existing
25
+ .split(",")
26
+ .map((s) => s.trim())
27
+ .filter(Boolean);
28
+ const set = new Set(parts.map((p) => p.toLowerCase()));
29
+ for (const host of bindHosts) {
30
+ if (!set.has(host.toLowerCase())) {
31
+ parts.push(host);
32
+ set.add(host.toLowerCase());
33
+ }
34
+ }
35
+ return parts.join(",");
36
+ }
37
+ export function installProxyDispatcher(env = process.env, options = {}) {
38
+ const proxy = firstProxy(env);
39
+ if (!proxy) {
40
+ return { installed: false, noProxy: env.NO_PROXY ?? env.no_proxy ?? "" };
41
+ }
42
+ const noProxy = effectiveNoProxy(env, options.bindHosts);
43
+ process.env.NO_PROXY = noProxy;
44
+ if (!installed) {
45
+ setGlobalDispatcher(new EnvHttpProxyAgent({ noProxy }));
46
+ installed = true;
47
+ options.log?.(`Installed EnvHttpProxyAgent; appended loopback to NO_PROXY (${noProxy})`);
48
+ }
49
+ return {
50
+ installed: true,
51
+ httpProxyHost: parseProxyHost(env.HTTP_PROXY ?? env.http_proxy),
52
+ httpsProxyHost: parseProxyHost(env.HTTPS_PROXY ?? env.https_proxy),
53
+ noProxy,
54
+ };
55
+ }
56
+ export function resetProxyDispatcherForTests() {
57
+ installed = false;
58
+ }
59
+ export function buildEgressHealth(env = process.env) {
60
+ const httpSet = Boolean(env.HTTP_PROXY || env.http_proxy);
61
+ const httpsSet = Boolean(env.HTTPS_PROXY || env.https_proxy);
62
+ const noProxySet = Boolean(env.NO_PROXY || env.no_proxy);
63
+ const caSet = Boolean(env.NODE_EXTRA_CA_CERTS || env.SSL_CERT_FILE || env.REQUESTS_CA_BUNDLE);
64
+ const proxyHost = parseProxyHost(env.HTTPS_PROXY ?? env.https_proxy) ??
65
+ parseProxyHost(env.HTTP_PROXY ?? env.http_proxy) ??
66
+ null;
67
+ return {
68
+ http_proxy: httpSet ? "set" : "unset",
69
+ https_proxy: httpsSet ? "set" : "unset",
70
+ no_proxy: noProxySet ? "set" : "unset",
71
+ proxy_host: proxyHost,
72
+ extra_ca_certs: caSet ? "set" : "unset",
73
+ dispatcher_installed: installed,
74
+ };
75
+ }
76
+ export function proxyHealthFields(env = process.env) {
77
+ return buildEgressHealth(env);
78
+ }
@@ -0,0 +1,40 @@
1
+ export type DocsRetrievalHit = {
2
+ path: string;
3
+ kind: "doc" | "example";
4
+ title: string;
5
+ excerpt: string;
6
+ };
7
+ export type DocsRetrievalResult = {
8
+ ok: boolean;
9
+ hits: DocsRetrievalHit[];
10
+ error?: string;
11
+ };
12
+ export type DocsRetriever = {
13
+ retrieve(query: string, options?: {
14
+ kind?: "docs" | "examples" | "any";
15
+ limit?: number;
16
+ }): Promise<DocsRetrievalResult>;
17
+ };
18
+ type CorpusEntry = {
19
+ path: string;
20
+ kind: "doc" | "example";
21
+ title: string;
22
+ topics: string[];
23
+ };
24
+ declare const CORPUS: CorpusEntry[];
25
+ export declare function resolveWorkshopCatalogRoot(explicit?: string): string;
26
+ /**
27
+ * Filesystem retriever over public docs/ + examples/ (allowlisted).
28
+ * Read failures for individual paths are skipped; empty matches still ok:true.
29
+ * Thrown/unexpected errors surface as ok:false so the agent can fall back to
30
+ * the baked playbook.
31
+ */
32
+ export declare function createFilesystemDocsRetriever(options?: {
33
+ rootDir?: string;
34
+ }): DocsRetriever;
35
+ export declare function createStubDocsRetriever(impl: DocsRetrievalHit[] | ((query: string, options?: {
36
+ kind?: "docs" | "examples" | "any";
37
+ limit?: number;
38
+ }) => DocsRetrievalResult | Promise<DocsRetrievalResult>)): DocsRetriever;
39
+ export declare function createFailingDocsRetriever(error?: string): DocsRetriever;
40
+ export { CORPUS as WORKSHOP_DOCS_CORPUS };