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,126 @@
1
+ import path from "node:path";
2
+ import { realpathSync } from "node:fs";
3
+ import { findCatalogRoot, resolveCatalogRoots } from "./resolveCatalogRoots.js";
4
+ export class CatalogPathError extends Error {
5
+ code;
6
+ registered_roots;
7
+ constructor(message, code, registered_roots) {
8
+ super(message);
9
+ this.name = "CatalogPathError";
10
+ this.code = code;
11
+ this.registered_roots = registered_roots;
12
+ }
13
+ }
14
+ function realOrResolve(p) {
15
+ try {
16
+ return realpathSync(p);
17
+ }
18
+ catch {
19
+ return path.resolve(p);
20
+ }
21
+ }
22
+ export function isInsideProjectRoot(projectRoot, candidate) {
23
+ const rootReal = realOrResolve(projectRoot);
24
+ const candidateReal = realOrResolve(candidate);
25
+ const rel = path.relative(rootReal, candidateReal);
26
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
27
+ }
28
+ /**
29
+ * Network-surface path contract: refuse absolute paths; resolve relative under
30
+ * a selected catalog root; refuse `..` escape via realpath containment.
31
+ */
32
+ export function resolveCatalogRelativePath(input) {
33
+ const field = input.fieldName ?? "path";
34
+ const registered = input.roots.map((r) => r.project_root);
35
+ if (path.isAbsolute(input.inputPath)) {
36
+ const rootsList = registered.length > 0
37
+ ? registered.join(", ")
38
+ : "(none — register a project or use seeded examples)";
39
+ throw new CatalogPathError(`Absolute ${field} is not allowed on network surfaces. Use a catalog-relative path under project_root (registered or seeded roots: ${rootsList}). Local CLI may pass absolute paths and auto-registers the project folder.`, "absolute_path_not_allowed", registered);
40
+ }
41
+ const root = selectCatalogRootForStart(input.roots, input.projectRoot);
42
+ const absolutePath = path.resolve(root.path, input.inputPath);
43
+ if (!isInsideProjectRoot(root.path, absolutePath)) {
44
+ throw new CatalogPathError(`${field} escapes project_root ${root.project_root}`, "path_outside_project_root", registered);
45
+ }
46
+ return {
47
+ absolutePath,
48
+ root,
49
+ relativePath: path.relative(root.path, absolutePath).replace(/\\/g, "/"),
50
+ };
51
+ }
52
+ export function catalogPathErrorBody(err) {
53
+ const body = {
54
+ error: err.message,
55
+ code: err.code,
56
+ registered_roots: err.registered_roots,
57
+ };
58
+ if (err.code === "absolute_path_not_allowed") {
59
+ body.hint =
60
+ "MCP/HTTP: relative path under project_root; CLI may pass absolute paths and auto-register.";
61
+ }
62
+ return body;
63
+ }
64
+ /**
65
+ * Pick the catalog root for start_run / POST /api/runs.
66
+ * Wire project_root (symbolic seeded id or absolute) maps to CatalogRoot.path
67
+ * (absolute store key). When omitted: sole root, or sole non-seeded root;
68
+ * otherwise require explicit — no invent.
69
+ */
70
+ export function selectCatalogRootForStart(roots, projectRoot) {
71
+ const registered = roots.map((r) => r.project_root);
72
+ if (projectRoot !== undefined) {
73
+ const found = findCatalogRoot(roots, projectRoot);
74
+ if (found === undefined) {
75
+ throw new CatalogPathError(`Unknown project_root: ${projectRoot}`, "unknown_project_root", registered);
76
+ }
77
+ return found;
78
+ }
79
+ if (roots.length === 0) {
80
+ throw new CatalogPathError("No catalog roots configured; ensure a project_root first", "unknown_project_root", registered);
81
+ }
82
+ if (roots.length === 1) {
83
+ return roots[0];
84
+ }
85
+ const writable = roots.filter((r) => r.kind !== "seeded");
86
+ if (writable.length === 1) {
87
+ return writable[0];
88
+ }
89
+ throw new CatalogPathError("project_root is required when multiple catalog roots are configured", "unknown_project_root", registered);
90
+ }
91
+ /**
92
+ * Shared helper: resolveCatalogRoots → selectCatalogRootForStart.
93
+ * All network-surface start-input call sites use this to avoid the hand-copy sequence.
94
+ */
95
+ export async function resolveCatalogStartInput(options, projectRoot) {
96
+ const roots = await resolveCatalogRoots(options);
97
+ const wireRoot = selectCatalogRootForStart(roots, projectRoot);
98
+ return { roots, wireRoot };
99
+ }
100
+ /**
101
+ * Like resolveCatalogStartInput but additionally refuses read-only roots.
102
+ * Used by write surfaces (POST /api/stages, POST /api/pipelines).
103
+ */
104
+ export async function resolveWritableCatalogRoot(options, projectRoot) {
105
+ const { roots, wireRoot } = await resolveCatalogStartInput(options, projectRoot);
106
+ if (wireRoot.read_only) {
107
+ throw new CatalogPathError(`Catalog root ${wireRoot.project_root} is read-only`, "catalog_root_read_only", roots.map((r) => r.project_root));
108
+ }
109
+ return { roots, wireRoot };
110
+ }
111
+ /**
112
+ * Local CLI control: turn a cwd-resolved filesystem path into a catalog-relative
113
+ * wire path + project_root so the network surface does not see an absolute path.
114
+ */
115
+ export function relativizeLocalPathForNetwork(cwd, inputPath) {
116
+ const abs = realOrResolve(path.resolve(cwd, inputPath));
117
+ const cwdAbs = realOrResolve(cwd);
118
+ const rel = path.relative(cwdAbs, abs);
119
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
120
+ throw new Error(`Path ${abs} is outside CLI cwd ${cwdAbs}; run from the project root, pass a path under cwd, or use an inline definition on the Host API`);
121
+ }
122
+ return {
123
+ path: rel === "" ? "." : rel.replace(/\\/g, "/"),
124
+ project_root: cwdAbs,
125
+ };
126
+ }
@@ -0,0 +1,27 @@
1
+ export type ConfigOriginKind = "catalog" | "inline" | "workspace" | "seeded";
2
+ export type ConfigOriginRecord = {
3
+ name: string;
4
+ origin: ConfigOriginKind;
5
+ path?: string;
6
+ };
7
+ export type BindingKindForOrigin = "repository" | "checkout" | "none";
8
+ export type TrustWorkspaceDecision = {
9
+ allow: boolean;
10
+ origin: ConfigOriginKind;
11
+ code?: "untrusted_config_origin";
12
+ message?: string;
13
+ };
14
+ export declare function bindingKindForOrigin(kind: "repository" | "checkout" | "unbound" | "none" | undefined): BindingKindForOrigin;
15
+ /**
16
+ * Decide whether workspace-sourced config (.mcp.json / skills under checkout)
17
+ * is permitted. Default: refuse for repository bindings; allow for checkout;
18
+ * host trust_workspace_config can allowlisted roots.
19
+ */
20
+ export declare function decideWorkspaceConfigTrust(options: {
21
+ bindingKind: BindingKindForOrigin;
22
+ projectRoot: string;
23
+ trustWorkspaceConfig?: string[];
24
+ source: "workspace" | "catalog" | "inline" | "seeded";
25
+ }): TrustWorkspaceDecision;
26
+ export declare function skillOriginKind(scope: "user" | "project" | "temporary", filePath: string, checkoutRoot: string | undefined): ConfigOriginKind;
27
+ export declare function catalogOrSeededOrigin(projectRoot: string | undefined, seededRoots: readonly string[]): ConfigOriginKind;
@@ -0,0 +1,59 @@
1
+ import path from "node:path";
2
+ export function bindingKindForOrigin(kind) {
3
+ if (kind === "repository" || kind === "checkout")
4
+ return kind;
5
+ return "none";
6
+ }
7
+ /**
8
+ * Decide whether workspace-sourced config (.mcp.json / skills under checkout)
9
+ * is permitted. Default: refuse for repository bindings; allow for checkout;
10
+ * host trust_workspace_config can allowlisted roots.
11
+ */
12
+ export function decideWorkspaceConfigTrust(options) {
13
+ if (options.source !== "workspace") {
14
+ return { allow: true, origin: options.source };
15
+ }
16
+ const trusted = (options.trustWorkspaceConfig ?? []).some((root) => root === options.projectRoot);
17
+ if (trusted) {
18
+ return { allow: true, origin: "workspace" };
19
+ }
20
+ if (options.bindingKind === "checkout") {
21
+ return { allow: true, origin: "workspace" };
22
+ }
23
+ if (options.bindingKind === "repository") {
24
+ return {
25
+ allow: false,
26
+ origin: "workspace",
27
+ code: "untrusted_config_origin",
28
+ message: `Workspace config is not trusted for repository binding at ${options.projectRoot}; set trust_workspace_config in HostConfig to allowlist this root`,
29
+ };
30
+ }
31
+ return {
32
+ allow: false,
33
+ origin: "workspace",
34
+ code: "untrusted_config_origin",
35
+ message: `Workspace config is not trusted at ${options.projectRoot}`,
36
+ };
37
+ }
38
+ function isUnderRoot(candidate, root) {
39
+ const resolvedRoot = path.resolve(root);
40
+ const resolved = path.resolve(candidate);
41
+ const rel = path.relative(resolvedRoot, resolved);
42
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
43
+ }
44
+ export function skillOriginKind(scope, filePath, checkoutRoot) {
45
+ if (scope === "temporary")
46
+ return "inline";
47
+ if (scope === "project" &&
48
+ checkoutRoot !== undefined &&
49
+ isUnderRoot(filePath, checkoutRoot)) {
50
+ return "workspace";
51
+ }
52
+ return "catalog";
53
+ }
54
+ export function catalogOrSeededOrigin(projectRoot, seededRoots) {
55
+ if (projectRoot !== undefined && seededRoots.some((root) => root === projectRoot)) {
56
+ return "seeded";
57
+ }
58
+ return "catalog";
59
+ }
@@ -0,0 +1,27 @@
1
+ import type { TriggerEvent, TriggerSchedule } from "../types/trigger.js";
2
+ import type { TriggerListItem } from "./triggerCatalog.js";
3
+ export type CreateTriggerInput = {
4
+ directory: string;
5
+ id: string;
6
+ pipeline: string;
7
+ task?: string;
8
+ kind: "manual" | "schedule" | "event";
9
+ schedule?: TriggerSchedule;
10
+ event?: TriggerEvent;
11
+ enabled?: boolean;
12
+ };
13
+ export type CreateTriggerParseError = {
14
+ ok: false;
15
+ status: 400;
16
+ error: string;
17
+ };
18
+ export type CreateTriggerResult = {
19
+ ok: true;
20
+ trigger: TriggerListItem;
21
+ } | {
22
+ ok: false;
23
+ status: 400 | 409 | 422 | 500;
24
+ error: string;
25
+ };
26
+ export declare function parseCreateTriggerBody(body: unknown): CreateTriggerInput | CreateTriggerParseError;
27
+ export declare function createTrigger(rawProjectRoot: string, input: CreateTriggerInput): Promise<CreateTriggerResult>;
@@ -0,0 +1,232 @@
1
+ import { mkdir, realpath, unlink, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Cron } from "croner";
4
+ import { stringify as stringifyYaml } from "yaml";
5
+ import { STAGE_ID_PATTERN } from "./createStage.js";
6
+ import { getCatalogScanPaths } from "./browseCatalog.js";
7
+ import { catalogContextFromStageflow } from "./resolveCatalogContext.js";
8
+ import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
9
+ import { loadTriggerOutcome } from "./loadTrigger.js";
10
+ import { collectPipelineIdsFromPaths, collectTaskIdsFromPaths } from "./validateCatalog.js";
11
+ import { findCatalogPathById } from "../runtime/triggerCatalog.js";
12
+ function isPlainObject(value) {
13
+ return value !== null && typeof value === "object" && !Array.isArray(value);
14
+ }
15
+ function validateTriggerId(id) {
16
+ if (id.length === 0 || id.length > 64) {
17
+ return "id must be 1-64 characters";
18
+ }
19
+ if (!STAGE_ID_PATTERN.test(id)) {
20
+ return "id must be lowercase kebab-case";
21
+ }
22
+ return null;
23
+ }
24
+ function parseScheduleField(raw) {
25
+ if (raw === undefined)
26
+ return { ok: true, value: undefined };
27
+ if (!isPlainObject(raw)) {
28
+ return { ok: false, message: "schedule must be an object" };
29
+ }
30
+ if (typeof raw.cron !== "string" || raw.cron.trim().length === 0) {
31
+ return { ok: false, message: "schedule.cron is required" };
32
+ }
33
+ if (raw.timezone !== undefined && typeof raw.timezone !== "string") {
34
+ return { ok: false, message: "schedule.timezone must be a string" };
35
+ }
36
+ return {
37
+ ok: true,
38
+ value: {
39
+ cron: raw.cron,
40
+ ...(typeof raw.timezone === "string" ? { timezone: raw.timezone } : {}),
41
+ },
42
+ };
43
+ }
44
+ function parseEventField(raw) {
45
+ if (raw === undefined)
46
+ return { ok: true, value: undefined };
47
+ if (!isPlainObject(raw)) {
48
+ return { ok: false, message: "event must be an object" };
49
+ }
50
+ if (typeof raw.source !== "string" || raw.source.trim().length === 0) {
51
+ return { ok: false, message: "event.source is required" };
52
+ }
53
+ if (raw.match !== undefined && !isPlainObject(raw.match)) {
54
+ return { ok: false, message: "event.match must be an object" };
55
+ }
56
+ if (raw.config !== undefined && !isPlainObject(raw.config)) {
57
+ return { ok: false, message: "event.config must be an object" };
58
+ }
59
+ return {
60
+ ok: true,
61
+ value: {
62
+ source: raw.source,
63
+ ...(isPlainObject(raw.match) ? { match: raw.match } : {}),
64
+ ...(isPlainObject(raw.config) ? { config: raw.config } : {}),
65
+ },
66
+ };
67
+ }
68
+ export function parseCreateTriggerBody(body) {
69
+ if (!isPlainObject(body)) {
70
+ return { ok: false, status: 400, error: "Request body must be an object" };
71
+ }
72
+ if (typeof body.directory !== "string" || !body.directory.trim()) {
73
+ return { ok: false, status: 400, error: "directory is required" };
74
+ }
75
+ const directory = body.directory.trim().replace(/\\/g, "/");
76
+ if (typeof body.id !== "string") {
77
+ return { ok: false, status: 400, error: "id is required" };
78
+ }
79
+ const idError = validateTriggerId(body.id);
80
+ if (idError) {
81
+ return { ok: false, status: 400, error: idError };
82
+ }
83
+ if (typeof body.pipeline !== "string" || !body.pipeline.trim()) {
84
+ return { ok: false, status: 400, error: "pipeline is required" };
85
+ }
86
+ if (body.task !== undefined && (typeof body.task !== "string" || !body.task.trim())) {
87
+ return { ok: false, status: 400, error: "task must be a non-empty string" };
88
+ }
89
+ if (body.kind !== "manual" && body.kind !== "schedule" && body.kind !== "event") {
90
+ return {
91
+ ok: false,
92
+ status: 400,
93
+ error: "kind must be one of: manual, schedule, event",
94
+ };
95
+ }
96
+ const schedule = parseScheduleField(body.schedule);
97
+ if (!schedule.ok) {
98
+ return { ok: false, status: 400, error: schedule.message };
99
+ }
100
+ const event = parseEventField(body.event);
101
+ if (!event.ok) {
102
+ return { ok: false, status: 400, error: event.message };
103
+ }
104
+ if (body.kind === "schedule" && schedule.value === undefined) {
105
+ return { ok: false, status: 400, error: "schedule.cron is required for kind=schedule" };
106
+ }
107
+ if (body.kind === "event" && event.value === undefined) {
108
+ return { ok: false, status: 400, error: "event.source is required for kind=event" };
109
+ }
110
+ if (body.enabled !== undefined && typeof body.enabled !== "boolean") {
111
+ return { ok: false, status: 400, error: "enabled must be a boolean" };
112
+ }
113
+ return {
114
+ directory,
115
+ id: body.id,
116
+ pipeline: body.pipeline,
117
+ ...(typeof body.task === "string" ? { task: body.task } : {}),
118
+ kind: body.kind,
119
+ ...(schedule.value !== undefined ? { schedule: schedule.value } : {}),
120
+ ...(event.value !== undefined ? { event: event.value } : {}),
121
+ ...(body.enabled !== undefined ? { enabled: body.enabled } : {}),
122
+ };
123
+ }
124
+ function resolveDirectory(projectRoot, directory) {
125
+ const absDirectory = path.resolve(projectRoot, directory);
126
+ const rel = path.relative(projectRoot, absDirectory);
127
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
128
+ return null;
129
+ }
130
+ return absDirectory;
131
+ }
132
+ function triggerInputToYaml(input, enabled) {
133
+ const doc = {
134
+ id: input.id,
135
+ pipeline: input.pipeline,
136
+ ...(input.task !== undefined ? { task: input.task } : {}),
137
+ kind: input.kind,
138
+ };
139
+ if (input.kind === "schedule" && input.schedule) {
140
+ doc.schedule = input.schedule;
141
+ }
142
+ if (input.kind === "event" && input.event) {
143
+ doc.event = input.event;
144
+ }
145
+ doc.enabled = enabled;
146
+ return stringifyYaml(doc);
147
+ }
148
+ export async function createTrigger(rawProjectRoot, input) {
149
+ const idError = validateTriggerId(input.id);
150
+ if (idError) {
151
+ return { ok: false, status: 400, error: idError };
152
+ }
153
+ const projectRoot = await realpath(rawProjectRoot).catch(() => rawProjectRoot);
154
+ const directory = resolveDirectory(projectRoot, input.directory);
155
+ if (!directory) {
156
+ return { ok: false, status: 400, error: "directory must be inside the project root" };
157
+ }
158
+ const ctx = catalogContextFromStageflow(await resolveStageflowContext(projectRoot));
159
+ const scanPaths = await getCatalogScanPaths(ctx);
160
+ if (!scanPaths) {
161
+ return {
162
+ ok: false,
163
+ status: 422,
164
+ error: "Catalog manifest not found; cannot validate trigger references",
165
+ };
166
+ }
167
+ const collisionPath = await findCatalogPathById(scanPaths.triggerPaths, input.id);
168
+ if (collisionPath) {
169
+ return {
170
+ ok: false,
171
+ status: 409,
172
+ error: `Trigger id already exists (${path.relative(projectRoot, collisionPath).replace(/\\/g, "/")})`,
173
+ };
174
+ }
175
+ const pipelineIds = await collectPipelineIdsFromPaths(scanPaths.pipelinePaths);
176
+ if (!pipelineIds.has(input.pipeline)) {
177
+ return {
178
+ ok: false,
179
+ status: 422,
180
+ error: `Trigger references unknown pipeline "${input.pipeline}"`,
181
+ };
182
+ }
183
+ if (input.task !== undefined) {
184
+ const taskIds = await collectTaskIdsFromPaths(scanPaths.taskPaths);
185
+ if (!taskIds.has(input.task)) {
186
+ return {
187
+ ok: false,
188
+ status: 422,
189
+ error: `Trigger references unknown task "${input.task}"`,
190
+ };
191
+ }
192
+ }
193
+ if (input.kind === "schedule") {
194
+ if (!input.schedule) {
195
+ return { ok: false, status: 422, error: "schedule.cron is required for kind=schedule" };
196
+ }
197
+ try {
198
+ new Cron(input.schedule.cron, input.schedule.timezone !== undefined ? { timezone: input.schedule.timezone } : {});
199
+ }
200
+ catch (err) {
201
+ const message = err instanceof Error ? err.message : String(err);
202
+ return { ok: false, status: 422, error: `Invalid schedule.cron: ${message}` };
203
+ }
204
+ }
205
+ const filePath = path.join(directory, `${input.id}.trigger.yaml`);
206
+ const relPath = path.relative(projectRoot, filePath).replace(/\\/g, "/");
207
+ const enabled = input.enabled ?? true;
208
+ try {
209
+ await mkdir(directory, { recursive: true });
210
+ await writeFile(filePath, triggerInputToYaml(input, enabled), "utf8");
211
+ }
212
+ catch (err) {
213
+ const message = err instanceof Error ? err.message : String(err);
214
+ return { ok: false, status: 500, error: message };
215
+ }
216
+ const loadOutcome = await loadTriggerOutcome(filePath);
217
+ if (!loadOutcome.ok) {
218
+ await unlink(filePath).catch(() => { });
219
+ return {
220
+ ok: false,
221
+ status: 500,
222
+ error: loadOutcome.issues[0]?.message ?? "Failed to load created trigger",
223
+ };
224
+ }
225
+ return {
226
+ ok: true,
227
+ trigger: {
228
+ ...loadOutcome.value,
229
+ definition_ref: relPath,
230
+ },
231
+ };
232
+ }
@@ -0,0 +1,117 @@
1
+ import type { PipelineListing } from "./listConfig.js";
2
+ import { type ValidationFinding, type ValidationResult } from "./validateCatalog.js";
3
+ export type DraftStageArtifact = {
4
+ path: string;
5
+ body: Record<string, unknown>;
6
+ };
7
+ export type DraftPackage = {
8
+ pipeline: {
9
+ id: string;
10
+ stages: Array<Record<string, unknown>>;
11
+ agent?: unknown;
12
+ model?: unknown;
13
+ schemas?: unknown;
14
+ requires?: unknown;
15
+ };
16
+ stages?: DraftStageArtifact[];
17
+ task?: {
18
+ filename: string;
19
+ body: Record<string, unknown>;
20
+ };
21
+ };
22
+ export type ValidateDraftPackageOptions = {
23
+ cwd?: string;
24
+ projectRoot?: string;
25
+ strict?: boolean;
26
+ };
27
+ export type OverwriteDraftPackageInput = {
28
+ directory: string;
29
+ draft: DraftPackage;
30
+ pipelineFilename?: string;
31
+ /**
32
+ * Escape hatch for Workshop “Save invalid anyway” (ticket 07).
33
+ * When true, skips the validate gate and writes the package as-is.
34
+ */
35
+ allowInvalid?: boolean;
36
+ };
37
+ export type CreateDraftPackageInput = OverwriteDraftPackageInput;
38
+ export type DraftPackageWriteResult = {
39
+ ok: true;
40
+ pipeline: PipelineListing;
41
+ pipelinePath: string;
42
+ stagePaths: string[];
43
+ taskPath?: string;
44
+ } | {
45
+ ok: false;
46
+ status: 400 | 404 | 409 | 422 | 500;
47
+ error: string;
48
+ findings?: ValidationFinding[];
49
+ };
50
+ export type OverwriteDraftPackageResult = DraftPackageWriteResult;
51
+ export type CreateDraftPackageResult = DraftPackageWriteResult;
52
+ export type DraftPackageDestination = {
53
+ directory: string;
54
+ pipelineFilename: string;
55
+ };
56
+ export type LoadDraftPackageOptions = {
57
+ /** When set, attach this task file into the draft. Otherwise task stays absent. */
58
+ taskPath?: string;
59
+ };
60
+ export type LoadDraftPackageResult = {
61
+ ok: true;
62
+ draft: DraftPackage;
63
+ destination: DraftPackageDestination;
64
+ pipelinePath: string;
65
+ taskPath?: string;
66
+ } | {
67
+ ok: false;
68
+ status: 400 | 404;
69
+ error: string;
70
+ };
71
+ export type DraftTaskArtifact = {
72
+ filename: string;
73
+ body: Record<string, unknown>;
74
+ };
75
+ export type LoadTaskArtifactResult = {
76
+ ok: true;
77
+ task: DraftTaskArtifact;
78
+ taskPath: string;
79
+ } | {
80
+ ok: false;
81
+ status: 400 | 404;
82
+ error: string;
83
+ };
84
+ export declare function validateDraftPackage(draft: DraftPackage, options?: ValidateDraftPackageOptions): Promise<ValidationResult>;
85
+ export declare function overwriteDraftPackage(projectRoot: string, input: OverwriteDraftPackageInput): Promise<OverwriteDraftPackageResult>;
86
+ export declare function createDraftPackage(projectRoot: string, input: CreateDraftPackageInput): Promise<CreateDraftPackageResult>;
87
+ export declare function parseDraftPackageBody(body: unknown): DraftPackage | {
88
+ ok: false;
89
+ status: 400;
90
+ error: string;
91
+ };
92
+ export declare function parseCreateDraftPackageBody(body: unknown): CreateDraftPackageInput | {
93
+ ok: false;
94
+ status: 400;
95
+ error: string;
96
+ };
97
+ export declare const parseOverwriteDraftPackageBody: typeof parseCreateDraftPackageBody;
98
+ export type OpenDraftPackageInput = {
99
+ path: string;
100
+ taskPath?: string;
101
+ };
102
+ export declare function parseOpenDraftPackageBody(body: unknown): OpenDraftPackageInput | {
103
+ ok: false;
104
+ status: 400;
105
+ error: string;
106
+ };
107
+ /** Load a catalog task file into a draft task artifact (attach without reloading the pipeline). */
108
+ export declare function loadTaskArtifact(projectRoot: string, taskRelPath: string): Promise<LoadTaskArtifactResult>;
109
+ export type AttachTaskBody = {
110
+ taskPath: string;
111
+ };
112
+ export declare function parseAttachTaskBody(body: unknown): AttachTaskBody | {
113
+ ok: false;
114
+ status: 400;
115
+ error: string;
116
+ };
117
+ export declare function loadDraftPackage(projectRoot: string, pipelineRelPath: string, options?: LoadDraftPackageOptions): Promise<LoadDraftPackageResult>;