stageflow 0.32.0 → 0.35.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 (335) hide show
  1. package/README.md +4 -3
  2. package/dist/agent/adapterSpill.d.ts +14 -0
  3. package/dist/agent/adapterSpill.js +83 -0
  4. package/dist/agent/agentBackend.d.ts +2 -2
  5. package/dist/agent/agentBackend.js +2 -2
  6. package/dist/agent/claudeAdapter.d.ts +13 -2
  7. package/dist/agent/claudeAdapter.js +50 -6
  8. package/dist/agent/cursorProvider.d.ts +3 -0
  9. package/dist/agent/cursorProvider.js +23 -6
  10. package/dist/agent/fakeAgent.d.ts +3 -3
  11. package/dist/agent/fakeAgent.js +0 -6
  12. package/dist/agent/piAdapter.d.ts +2 -2
  13. package/dist/agent/piAdapter.js +116 -15
  14. package/dist/agent/piIsolatedMcp.d.ts +1 -0
  15. package/dist/agent/piIsolatedMcp.js +19 -1
  16. package/dist/agent/piIsolatedMcpProbe.d.ts +11 -0
  17. package/dist/agent/piIsolatedMcpProbe.js +20 -0
  18. package/dist/agent/port.d.ts +2 -2
  19. package/dist/agent/providerAuth.d.ts +6 -0
  20. package/dist/agent/providerAuth.js +86 -17
  21. package/dist/agent/{resolveAgentPort.d.ts → resolveStagePort.d.ts} +8 -6
  22. package/dist/agent/{resolveAgentPort.js → resolveStagePort.js} +13 -9
  23. package/dist/agent/stageTurnDriver.d.ts +33 -0
  24. package/dist/agent/stageTurnDriver.js +64 -0
  25. package/dist/agent/toolOutputBudget.d.ts +46 -0
  26. package/dist/agent/toolOutputBudget.js +97 -0
  27. package/dist/agent/toolOutputBudgetExtension.d.ts +22 -0
  28. package/dist/agent/toolOutputBudgetExtension.js +141 -0
  29. package/dist/agent/toolOutputSpill.d.ts +34 -0
  30. package/dist/agent/toolOutputSpill.js +85 -0
  31. package/dist/browser/agentBrowserLiveViewRelay.d.ts +41 -0
  32. package/dist/browser/agentBrowserLiveViewRelay.js +801 -0
  33. package/dist/browser/anchor.d.ts +2 -0
  34. package/dist/browser/anchor.js +2 -1
  35. package/dist/browser/auditSink.d.ts +8 -0
  36. package/dist/browser/browserHost.d.ts +29 -0
  37. package/dist/browser/browserSweep.d.ts +4 -1
  38. package/dist/browser/browserSweep.js +7 -0
  39. package/dist/browser/browserTeardown.d.ts +1 -0
  40. package/dist/browser/browserTeardown.js +32 -2
  41. package/dist/browser/containerBrowserEndpoint.d.ts +11 -0
  42. package/dist/browser/containerBrowserEndpoint.js +57 -0
  43. package/dist/browser/containerBrowserHost.d.ts +24 -0
  44. package/dist/browser/containerBrowserHost.js +147 -0
  45. package/dist/browser/dockerSandboxOrchestrator.d.ts +26 -0
  46. package/dist/browser/dockerSandboxOrchestrator.js +142 -0
  47. package/dist/browser/fakeLiveViewRelay.d.ts +15 -0
  48. package/dist/browser/fakeLiveViewRelay.js +94 -0
  49. package/dist/browser/fakeLiveViewSource.d.ts +6 -0
  50. package/dist/browser/fakeLiveViewSource.js +16 -0
  51. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -1
  52. package/dist/browser/fakeRemoteBrowserHost.js +2 -1
  53. package/dist/browser/fakeSandboxOrchestrator.d.ts +9 -0
  54. package/dist/browser/fakeSandboxOrchestrator.js +44 -0
  55. package/dist/browser/gateHandoff.d.ts +0 -2
  56. package/dist/browser/gateHandoff.js +5 -11
  57. package/dist/browser/hostCapabilities.d.ts +23 -0
  58. package/dist/browser/hostCapabilities.js +23 -0
  59. package/dist/browser/humanLogin.d.ts +2 -2
  60. package/dist/browser/humanLogin.js +11 -2
  61. package/dist/browser/liveViewPersisted.d.ts +11 -0
  62. package/dist/browser/liveViewPersisted.js +22 -0
  63. package/dist/browser/liveViewRelay.d.ts +76 -0
  64. package/dist/browser/liveViewRelay.js +1 -0
  65. package/dist/browser/liveViewSessions.d.ts +25 -0
  66. package/dist/browser/liveViewSessions.js +139 -0
  67. package/dist/browser/liveViewSource.d.ts +25 -0
  68. package/dist/browser/liveViewSource.js +7 -0
  69. package/dist/browser/liveViewTickets.d.ts +46 -0
  70. package/dist/browser/liveViewTickets.js +122 -0
  71. package/dist/browser/localBrowserHost.d.ts +10 -0
  72. package/dist/browser/localBrowserHost.js +53 -7
  73. package/dist/browser/ownerScope.d.ts +10 -0
  74. package/dist/browser/ownerScope.js +6 -0
  75. package/dist/browser/profileStore.d.ts +5 -2
  76. package/dist/browser/profileStore.js +3 -5
  77. package/dist/browser/sandboxOrchestrator.d.ts +60 -0
  78. package/dist/browser/sandboxOrchestrator.js +8 -0
  79. package/dist/browser/sessionApiSandboxOrchestrator.d.ts +34 -0
  80. package/dist/browser/sessionApiSandboxOrchestrator.js +108 -0
  81. package/dist/browser/stageBrowserEnv.d.ts +7 -0
  82. package/dist/browser/stageBrowserEnv.js +53 -15
  83. package/dist/browser/stageHandoff.d.ts +47 -0
  84. package/dist/browser/stageHandoff.js +101 -0
  85. package/dist/browser/stageProfileLock.d.ts +1 -0
  86. package/dist/browser/stageProfileLock.js +1 -3
  87. package/dist/browser/volumeProfileStore.d.ts +7 -0
  88. package/dist/browser/volumeProfileStore.js +35 -0
  89. package/dist/cli/browserCommand.d.ts +3 -1
  90. package/dist/cli/browserCommand.js +25 -20
  91. package/dist/cli/resolveCliProjectRoot.d.ts +7 -0
  92. package/dist/cli/resolveCliProjectRoot.js +27 -0
  93. package/dist/cli/runCommand.d.ts +1 -1
  94. package/dist/cli/runCommand.js +59 -17
  95. package/dist/cli/skillsCommand.d.ts +20 -0
  96. package/dist/cli/skillsCommand.js +74 -31
  97. package/dist/cli/validateCommand.d.ts +1 -1
  98. package/dist/cli/validateCommand.js +22 -4
  99. package/dist/cli.js +4 -4
  100. package/dist/config/browseCatalog.d.ts +2 -0
  101. package/dist/config/browseCatalog.js +6 -0
  102. package/dist/config/catalogRelativePath.d.ts +4 -0
  103. package/dist/config/catalogRelativePath.js +37 -9
  104. package/dist/config/createStage.d.ts +1 -0
  105. package/dist/config/createStage.js +11 -2
  106. package/dist/config/createTask.d.ts +30 -0
  107. package/dist/config/createTask.js +161 -0
  108. package/dist/config/createTrigger.d.ts +15 -0
  109. package/dist/config/createTrigger.js +32 -25
  110. package/dist/config/draftPackage.d.ts +41 -0
  111. package/dist/config/draftPackage.js +216 -23
  112. package/dist/config/ensureCatalogScanRoot.d.ts +2 -1
  113. package/dist/config/ensureCatalogScanRoot.js +6 -2
  114. package/dist/config/findTaskInCatalog.d.ts +33 -0
  115. package/dist/config/findTaskInCatalog.js +69 -0
  116. package/dist/config/hostConfig.d.ts +21 -0
  117. package/dist/config/hostConfig.js +113 -1
  118. package/dist/config/importTask.d.ts +19 -0
  119. package/dist/config/importTask.js +133 -0
  120. package/dist/config/installSkillRequest.d.ts +40 -0
  121. package/dist/config/installSkillRequest.js +286 -0
  122. package/dist/config/listConfig.d.ts +0 -16
  123. package/dist/config/listConfig.js +0 -3
  124. package/dist/config/loadOutcome.d.ts +11 -6
  125. package/dist/config/loadPipeline.js +0 -1
  126. package/dist/config/loadStage.js +2 -0
  127. package/dist/config/loadStageflowManifest.js +4 -1
  128. package/dist/config/loadTask.js +2 -0
  129. package/dist/config/loadTrigger.js +2 -0
  130. package/dist/config/mergePipelineIncludes.js +3 -0
  131. package/dist/config/normalizePipelineStageEntry.js +10 -1
  132. package/dist/config/printTargetYaml.js +0 -1
  133. package/dist/config/publishDraftPackage.d.ts +5 -1
  134. package/dist/config/publishDraftPackage.js +4 -1
  135. package/dist/config/resolveCatalogRoots.d.ts +4 -1
  136. package/dist/config/resolveCatalogRoots.js +18 -1
  137. package/dist/config/skillUsageIndex.d.ts +6 -0
  138. package/dist/config/skillUsageIndex.js +39 -0
  139. package/dist/config/stageBrowser.js +13 -0
  140. package/dist/config/triggerAdapterStatus.d.ts +11 -0
  141. package/dist/config/triggerAdapterStatus.js +90 -0
  142. package/dist/config/triggerCatalog.d.ts +41 -2
  143. package/dist/config/triggerCatalog.js +107 -15
  144. package/dist/config/updateTask.d.ts +30 -0
  145. package/dist/config/updateTask.js +119 -0
  146. package/dist/config/updateTrigger.d.ts +38 -0
  147. package/dist/config/updateTrigger.js +220 -0
  148. package/dist/config/validateCatalog.d.ts +6 -2
  149. package/dist/config/validateCatalog.js +48 -7
  150. package/dist/config/workshopCatalogFilenames.d.ts +37 -0
  151. package/dist/config/workshopCatalogFilenames.js +125 -0
  152. package/dist/config/workshopCatalogRepair.d.ts +7 -0
  153. package/dist/config/workshopCatalogRepair.js +144 -0
  154. package/dist/config/yamlParsePosition.d.ts +4 -0
  155. package/dist/config/yamlParsePosition.js +9 -0
  156. package/dist/hosted/containment.d.ts +3 -0
  157. package/dist/hosted/containment.js +36 -0
  158. package/dist/hosted/errors.d.ts +21 -0
  159. package/dist/hosted/errors.js +30 -0
  160. package/dist/hosted/packageSkills.d.ts +3 -0
  161. package/dist/hosted/packageSkills.js +80 -0
  162. package/dist/hosted/runtime.d.ts +12 -0
  163. package/dist/hosted/runtime.js +596 -0
  164. package/dist/hosted/sequencer.d.ts +28 -0
  165. package/dist/hosted/sequencer.js +129 -0
  166. package/dist/hosted/translate.d.ts +3 -0
  167. package/dist/hosted/translate.js +43 -0
  168. package/dist/hosted/types.d.ts +108 -0
  169. package/dist/hosted/types.js +10 -0
  170. package/dist/index.d.ts +9 -1
  171. package/dist/index.js +6 -0
  172. package/dist/mcp/getStartedTool.js +15 -6
  173. package/dist/mcp/triggerTools.js +2 -8
  174. package/dist/operatorAgent/agentPort.d.ts +11 -0
  175. package/dist/operatorAgent/agentPort.js +12 -0
  176. package/dist/operatorAgent/index.d.ts +1 -0
  177. package/dist/operatorAgent/index.js +1 -0
  178. package/dist/operatorAgent/piModel.js +26 -6
  179. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  180. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +4 -2
  181. package/dist/operatorAgent/profiles/workshopAuthorTools.js +103 -16
  182. package/dist/package-meta.d.ts +1 -1
  183. package/dist/package-meta.js +1 -1
  184. package/dist/project/ensureProjectRootsFromEnv.d.ts +3 -0
  185. package/dist/project/ensureProjectRootsFromEnv.js +22 -0
  186. package/dist/project/globalHome.d.ts +1 -0
  187. package/dist/project/globalHome.js +18 -0
  188. package/dist/project/workspaceCatalog.d.ts +10 -0
  189. package/dist/project/workspaceCatalog.js +91 -0
  190. package/dist/projection/projectRun.d.ts +0 -1
  191. package/dist/projection/projectRun.js +0 -1
  192. package/dist/runstore/backup.js +14 -4
  193. package/dist/runstore/port.d.ts +11 -1
  194. package/dist/runstore/restore.js +5 -2
  195. package/dist/runstore/sqlite/SqliteRunStore.d.ts +8 -0
  196. package/dist/runstore/sqlite/SqliteRunStore.js +29 -9
  197. package/dist/runstore/sqlite/migrations/012-trigger-fires.d.ts +7 -0
  198. package/dist/runstore/sqlite/migrations/012-trigger-fires.js +18 -0
  199. package/dist/runstore/sqlite/migrations/index.js +2 -0
  200. package/dist/runstore/stageSnapshot.d.ts +3 -1
  201. package/dist/runstore/stageSnapshot.js +19 -0
  202. package/dist/runstore/workspaceLayout.js +27 -0
  203. package/dist/runstore/writeContainedArtifact.d.ts +1 -0
  204. package/dist/runstore/writeContainedArtifact.js +52 -0
  205. package/dist/runtime/containerLimits.d.ts +0 -3
  206. package/dist/runtime/containerLimits.js +0 -5
  207. package/dist/runtime/credentialBinding.d.ts +3 -0
  208. package/dist/runtime/credentialBinding.js +23 -6
  209. package/dist/runtime/emailSource.js +20 -28
  210. package/dist/runtime/githubPollSource.js +20 -28
  211. package/dist/runtime/pipelineRunner.d.ts +4 -4
  212. package/dist/runtime/pipelineScheduler.d.ts +2 -2
  213. package/dist/runtime/pipelineScheduler.js +3 -0
  214. package/dist/runtime/resumeReconstruct.d.ts +2 -2
  215. package/dist/runtime/resumeTimedOut.d.ts +2 -2
  216. package/dist/runtime/runManager.d.ts +18 -2
  217. package/dist/runtime/runManager.js +95 -30
  218. package/dist/runtime/runRetentionSweep.d.ts +0 -2
  219. package/dist/runtime/runRetentionSweep.js +0 -8
  220. package/dist/runtime/runRetryCoordinator.d.ts +2 -2
  221. package/dist/runtime/scheduleSource.js +15 -24
  222. package/dist/runtime/stageAttemptBootstrap.d.ts +2 -2
  223. package/dist/runtime/stageAttemptBootstrap.js +10 -1
  224. package/dist/runtime/stageProcessLauncher.js +2 -2
  225. package/dist/runtime/stageRoots.js +12 -1
  226. package/dist/runtime/stageRunner.d.ts +2 -2
  227. package/dist/runtime/stageRunner.js +8 -2
  228. package/dist/runtime/stageWorker.js +2 -2
  229. package/dist/runtime/triggerPort.d.ts +5 -3
  230. package/dist/runtime/triggerRunner.d.ts +1 -0
  231. package/dist/runtime/triggerRunner.js +27 -20
  232. package/dist/runtime/webhookAccept.d.ts +25 -0
  233. package/dist/runtime/webhookAccept.js +56 -0
  234. package/dist/server/bootstrap.d.ts +7 -2
  235. package/dist/server/bootstrap.js +15 -1
  236. package/dist/server/controlToken.d.ts +1 -1
  237. package/dist/server/controlToken.js +18 -2
  238. package/dist/server/healthSurfaces.d.ts +12 -0
  239. package/dist/server/healthSurfaces.js +27 -6
  240. package/dist/server/http.d.ts +19 -10
  241. package/dist/server/http.js +605 -85
  242. package/dist/server/liveViewPath.d.ts +9 -0
  243. package/dist/server/liveViewPath.js +8 -0
  244. package/dist/server/liveViewRoutes.d.ts +58 -0
  245. package/dist/server/liveViewRoutes.js +565 -0
  246. package/dist/server/mcpHost.d.ts +4 -2
  247. package/dist/server/mcpHost.js +2 -0
  248. package/dist/server/readCatalogFile.d.ts +29 -0
  249. package/dist/server/readCatalogFile.js +215 -0
  250. package/dist/server/triggerRoutes.d.ts +1 -0
  251. package/dist/server/triggerRoutes.js +200 -73
  252. package/dist/tools/readEmail.d.ts +3 -3
  253. package/dist/tools/writeStageArtifact.d.ts +9 -0
  254. package/dist/tools/writeStageArtifact.js +2 -47
  255. package/dist/types/pipeline.d.ts +1 -1
  256. package/dist/types/stage.d.ts +1 -1
  257. package/dist/types/stageflowManifest.d.ts +1 -1
  258. package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  259. package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  260. package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  261. package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  262. package/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  263. package/dist/ui/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  264. package/dist/ui/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  265. package/dist/ui/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  266. package/dist/ui/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  267. package/dist/ui/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  268. package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  269. package/dist/ui/assets/index-BoFPkKFg.js +256 -0
  270. package/dist/ui/assets/{index-Bv4p1aPK.css → index-CIPbbBUi.css} +1 -1
  271. package/dist/ui/index.html +4 -4
  272. package/dist/workshop/autosave.d.ts +2 -2
  273. package/dist/workshop/autosave.js +4 -6
  274. package/dist/workshop/buildStore.d.ts +2 -0
  275. package/dist/workshop/chatAttachments.d.ts +27 -0
  276. package/dist/workshop/chatAttachments.js +98 -0
  277. package/dist/workshop/chatTurn.d.ts +5 -2
  278. package/dist/workshop/chatTurn.js +22 -18
  279. package/dist/workshop/sessionMutations.d.ts +17 -0
  280. package/dist/workshop/sessionMutations.js +107 -0
  281. package/dist/workshop/sessionStore.d.ts +10 -0
  282. package/dist/workshop/sessionStore.js +52 -0
  283. package/dist/workshop/workshopPin.d.ts +4 -3
  284. package/dist/workshop/workshopPin.js +26 -6
  285. package/dist/workshop/workshopTranscriptTurn.d.ts +8 -0
  286. package/dist/workshop/workshopTranscriptTurn.js +46 -0
  287. package/examples/README.md +1 -1
  288. package/examples/archify-on-pr/README.md +1 -1
  289. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +0 -1
  290. package/examples/archify-on-pr/author-diagrams.yaml +1 -0
  291. package/examples/conditional-fork/branch-a.yaml +1 -1
  292. package/examples/conditional-fork/decide.yaml +2 -1
  293. package/examples/feature-loop/{implement.yaml → feature-implement.yaml} +1 -1
  294. package/examples/feature-loop/feature-loop.pipeline.yaml +10 -10
  295. package/examples/feature-loop/{plan.yaml → feature-plan.yaml} +1 -1
  296. package/examples/feature-loop/{review.yaml → feature-review.yaml} +1 -1
  297. package/examples/feedback-loop/{implement.yaml → feedback-implement.yaml} +1 -1
  298. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +9 -9
  299. package/examples/feedback-loop/feedback-loop.pipeline.yaml +9 -9
  300. package/examples/feedback-loop/{plan.yaml → feedback-plan.yaml} +1 -1
  301. package/examples/feedback-loop/{review.yaml → feedback-review.yaml} +1 -1
  302. package/examples/generic-fan-in/{research.yaml → fan-in-research.yaml} +1 -1
  303. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +3 -3
  304. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +3 -3
  305. package/examples/hello-world/{research.yaml → hello-research.yaml} +1 -1
  306. package/examples/hello-world/hello.pipeline.yaml +2 -2
  307. package/examples/mcp-hitl-tour/{review.yaml → mcp-hitl-review.yaml} +1 -1
  308. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +3 -3
  309. package/examples/oss-issue-contribution/oss-explain-fix.yaml +1 -0
  310. package/examples/oss-issue-contribution/oss-explain-issue.yaml +1 -0
  311. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +0 -2
  312. package/examples/stageflow.yaml +6 -0
  313. package/examples/triggers/sample-github-pr.trigger.yaml +12 -0
  314. package/examples/triggers/sample-inbox-email.trigger.yaml +14 -0
  315. package/examples/triggers/sample-manual-hello.trigger.yaml +5 -0
  316. package/examples/triggers/sample-nightly-hello.trigger.yaml +8 -0
  317. package/examples/triggers/sample-signed-webhook.trigger.yaml +11 -0
  318. package/examples/triggers-readiness/README.md +48 -0
  319. package/examples/triggers-readiness/readiness-emit.yaml +18 -0
  320. package/examples/triggers-readiness/readiness.pipeline.yaml +4 -0
  321. package/examples/triggers-readiness/readiness.task.yaml +6 -0
  322. package/examples/triggers-readiness/stageflow.yaml +13 -0
  323. package/examples/triggers-readiness/triggers/readiness-dynamic-manual.trigger.yaml +4 -0
  324. package/examples/triggers-readiness/triggers/readiness-email.trigger.yaml +12 -0
  325. package/examples/triggers-readiness/triggers/readiness-github-pr.trigger.yaml +12 -0
  326. package/examples/triggers-readiness/triggers/readiness-manual.trigger.yaml +5 -0
  327. package/examples/triggers-readiness/triggers/readiness-schedule.trigger.yaml +8 -0
  328. package/examples/triggers-readiness/triggers/readiness-webhook.trigger.yaml +11 -0
  329. package/package.json +9 -1
  330. package/skills/stageflow/references/control-surface.md +1 -1
  331. package/skills/stageflow-author/references/catalog-write-conventions.md +2 -2
  332. package/skills/stageflow-run/SKILL.md +1 -1
  333. package/skills/stageflow-run/references/mcp-call.md +1 -1
  334. package/skills/stageflow-setup/SKILL.md +1 -1
  335. package/dist/ui/assets/index-59cjF0OA.js +0 -133
@@ -0,0 +1,144 @@
1
+ import { readdir, rename, rm, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readYamlObject } from "./readYamlObject.js";
4
+ import { canonicalCatalogBasenameForDocument, isMisnamedCatalogBasename, legacyBareCatalogFilenames, normalizePipelineCatalogFilename, normalizeTaskCatalogFilename, reconcileWorkshopCatalogFilenames, } from "./workshopCatalogFilenames.js";
5
+ async function fileExists(absPath) {
6
+ try {
7
+ await stat(absPath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function renameIfNeeded(fromAbs, toAbs, renamed) {
15
+ if (fromAbs === toAbs)
16
+ return;
17
+ if (!(await fileExists(fromAbs)))
18
+ return;
19
+ if (await fileExists(toAbs)) {
20
+ await rm(fromAbs, { force: true });
21
+ return;
22
+ }
23
+ await rename(fromAbs, toAbs);
24
+ renamed.push({
25
+ from: path.basename(fromAbs),
26
+ to: path.basename(toAbs),
27
+ });
28
+ }
29
+ export async function repairMisnamedWorkshopCatalogFiles(packageDirectory) {
30
+ const renamed = [];
31
+ const removed = [];
32
+ let entries;
33
+ try {
34
+ entries = await readdir(packageDirectory);
35
+ }
36
+ catch {
37
+ return { renamed, removed };
38
+ }
39
+ for (const entry of entries) {
40
+ if (!isMisnamedCatalogBasename(entry))
41
+ continue;
42
+ const absPath = path.join(packageDirectory, entry);
43
+ let raw;
44
+ try {
45
+ raw = await readYamlObject(absPath);
46
+ }
47
+ catch {
48
+ continue;
49
+ }
50
+ const canonical = canonicalCatalogBasenameForDocument(raw, entry);
51
+ if (!canonical || canonical === entry)
52
+ continue;
53
+ const targetAbs = path.join(packageDirectory, canonical);
54
+ await renameIfNeeded(absPath, targetAbs, renamed);
55
+ }
56
+ return { renamed, removed };
57
+ }
58
+ export async function reconcileWorkshopCatalogPackageDir(packageDirectory, pipelineId, taskId, options) {
59
+ const result = await repairMisnamedWorkshopCatalogFiles(packageDirectory);
60
+ const pipelineBasename = options?.pipelineBasename?.trim() ||
61
+ normalizePipelineCatalogFilename(pipelineId);
62
+ const taskBasename = taskId?.trim()
63
+ ? options?.taskBasename?.trim() ||
64
+ normalizeTaskCatalogFilename(taskId)
65
+ : null;
66
+ for (const legacy of legacyBareCatalogFilenames(pipelineId)) {
67
+ if (legacy === pipelineBasename)
68
+ continue;
69
+ const legacyAbs = path.join(packageDirectory, legacy);
70
+ const canonicalAbs = path.join(packageDirectory, pipelineBasename);
71
+ if (!(await fileExists(legacyAbs)))
72
+ continue;
73
+ if (!(await fileExists(canonicalAbs))) {
74
+ let raw;
75
+ try {
76
+ raw = await readYamlObject(legacyAbs);
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ if (canonicalCatalogBasenameForDocument(raw) === pipelineBasename) {
82
+ await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
83
+ continue;
84
+ }
85
+ }
86
+ if (await fileExists(canonicalAbs)) {
87
+ await rm(legacyAbs, { force: true });
88
+ result.removed.push(legacy);
89
+ }
90
+ }
91
+ if (taskId?.trim() && taskBasename) {
92
+ for (const legacy of legacyBareCatalogFilenames(taskId)) {
93
+ if (legacy === taskBasename || legacy === pipelineBasename)
94
+ continue;
95
+ const legacyAbs = path.join(packageDirectory, legacy);
96
+ const canonicalAbs = path.join(packageDirectory, taskBasename);
97
+ if (!(await fileExists(legacyAbs)))
98
+ continue;
99
+ if (!(await fileExists(canonicalAbs))) {
100
+ let raw;
101
+ try {
102
+ raw = await readYamlObject(legacyAbs);
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ if (canonicalCatalogBasenameForDocument(raw) === taskBasename) {
108
+ await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
109
+ continue;
110
+ }
111
+ }
112
+ if (await fileExists(canonicalAbs)) {
113
+ await rm(legacyAbs, { force: true });
114
+ result.removed.push(legacy);
115
+ }
116
+ }
117
+ }
118
+ const { removeCandidates } = reconcileWorkshopCatalogFilenames(pipelineId, taskId, pipelineBasename, taskBasename);
119
+ for (const legacy of removeCandidates) {
120
+ const legacyAbs = path.join(packageDirectory, legacy);
121
+ const canonicalAbs = path.join(packageDirectory, pipelineBasename);
122
+ if (!(await fileExists(legacyAbs)))
123
+ continue;
124
+ if (legacyAbs === canonicalAbs)
125
+ continue;
126
+ if (taskBasename && legacy === taskBasename)
127
+ continue;
128
+ if (!(await fileExists(canonicalAbs)))
129
+ continue;
130
+ await rm(legacyAbs, { force: true });
131
+ result.removed.push(legacy);
132
+ }
133
+ return result;
134
+ }
135
+ export async function repairWorkshopCatalogTree(projectRoot, relativeDirectories) {
136
+ const merged = { renamed: [], removed: [] };
137
+ for (const rel of relativeDirectories) {
138
+ const dir = path.resolve(projectRoot, rel);
139
+ const part = await repairMisnamedWorkshopCatalogFiles(dir);
140
+ merged.renamed.push(...part.renamed);
141
+ merged.removed.push(...part.removed);
142
+ }
143
+ return merged;
144
+ }
@@ -0,0 +1,4 @@
1
+ export declare function yamlParsePosition(err: unknown): {
2
+ line: number;
3
+ column: number;
4
+ } | undefined;
@@ -0,0 +1,9 @@
1
+ import { YAMLParseError } from "yaml";
2
+ export function yamlParsePosition(err) {
3
+ if (!(err instanceof YAMLParseError))
4
+ return undefined;
5
+ const pos = err.linePos?.[0];
6
+ if (!pos)
7
+ return undefined;
8
+ return { line: pos.line, column: pos.col };
9
+ }
@@ -0,0 +1,3 @@
1
+ export declare function isContained(rootReal: string, candidateReal: string): boolean;
2
+ export declare function resolveDirectory(root: string): Promise<string>;
3
+ export declare function containedRealPath(rootReal: string, target: string): Promise<string>;
@@ -0,0 +1,36 @@
1
+ import { realpath, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export function isContained(rootReal, candidateReal) {
4
+ const relative = path.relative(rootReal, candidateReal);
5
+ return (relative === "" ||
6
+ (relative !== ".." &&
7
+ !relative.startsWith(`..${path.sep}`) &&
8
+ !path.isAbsolute(relative)));
9
+ }
10
+ export async function resolveDirectory(root) {
11
+ const absolute = path.resolve(root);
12
+ let info;
13
+ try {
14
+ info = await stat(absolute);
15
+ }
16
+ catch {
17
+ throw new Error(`package root does not exist: ${absolute}`);
18
+ }
19
+ if (!info.isDirectory()) {
20
+ throw new Error(`package root is not a directory: ${absolute}`);
21
+ }
22
+ return realpath(absolute);
23
+ }
24
+ export async function containedRealPath(rootReal, target) {
25
+ let real;
26
+ try {
27
+ real = await realpath(target);
28
+ }
29
+ catch {
30
+ throw new Error(`path is not readable: ${target}`);
31
+ }
32
+ if (!isContained(rootReal, real)) {
33
+ throw new Error(`path escapes package root: ${target}`);
34
+ }
35
+ return real;
36
+ }
@@ -0,0 +1,21 @@
1
+ export declare const HOSTED_ERROR_CODES: readonly ["invalid_input", "package_invalid", "agent_failed", "event_sink_failed", "cancelled", "timed_out", "hitl_unsupported", "internal"];
2
+ export type HostedErrorCode = (typeof HOSTED_ERROR_CODES)[number];
3
+ export type HostedRuntimeErrorDetails = {
4
+ code: HostedErrorCode;
5
+ externalRunId: string;
6
+ externalAttemptId: string;
7
+ runId?: string;
8
+ eventType?: string;
9
+ sequence?: number;
10
+ localResult?: import("./types.js").HostedPipelineResult;
11
+ };
12
+ export declare class HostedRuntimeError extends Error {
13
+ readonly code: HostedErrorCode;
14
+ readonly externalRunId: string;
15
+ readonly externalAttemptId: string;
16
+ readonly runId?: string;
17
+ readonly eventType?: string;
18
+ readonly sequence?: number;
19
+ readonly localResult?: import("./types.js").HostedPipelineResult;
20
+ constructor(message: string, details: HostedRuntimeErrorDetails);
21
+ }
@@ -0,0 +1,30 @@
1
+ export const HOSTED_ERROR_CODES = [
2
+ "invalid_input",
3
+ "package_invalid",
4
+ "agent_failed",
5
+ "event_sink_failed",
6
+ "cancelled",
7
+ "timed_out",
8
+ "hitl_unsupported",
9
+ "internal",
10
+ ];
11
+ export class HostedRuntimeError extends Error {
12
+ code;
13
+ externalRunId;
14
+ externalAttemptId;
15
+ runId;
16
+ eventType;
17
+ sequence;
18
+ localResult;
19
+ constructor(message, details) {
20
+ super(message);
21
+ this.name = "HostedRuntimeError";
22
+ this.code = details.code;
23
+ this.externalRunId = details.externalRunId;
24
+ this.externalAttemptId = details.externalAttemptId;
25
+ this.runId = details.runId;
26
+ this.eventType = details.eventType;
27
+ this.sequence = details.sequence;
28
+ this.localResult = details.localResult;
29
+ }
30
+ }
@@ -0,0 +1,3 @@
1
+ import { type SkillsPayload } from "../runtime/runSkills.js";
2
+ /** Skills shipped with a hosted package live at `<packageRoot>/.pi/skills/<name>/`. */
3
+ export declare function loadPackageSkills(packageRoot: string): Promise<SkillsPayload | undefined>;
@@ -0,0 +1,80 @@
1
+ import { readdir, readFile, realpath, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { assertValidSkillName, assertValidSkillRelativePath, validateSkillsPayload, } from "../runtime/runSkills.js";
4
+ import { isContained } from "./containment.js";
5
+ /** Skills shipped with a hosted package live at `<packageRoot>/.pi/skills/<name>/`. */
6
+ export async function loadPackageSkills(packageRoot) {
7
+ const skillsRoot = path.join(packageRoot, ".pi", "skills");
8
+ let entries;
9
+ try {
10
+ entries = await readdir(skillsRoot, { withFileTypes: true });
11
+ }
12
+ catch (error) {
13
+ if (error.code === "ENOENT")
14
+ return undefined;
15
+ throw error;
16
+ }
17
+ const skillsRootReal = await realpath(skillsRoot);
18
+ if (!isContained(packageRoot, skillsRootReal)) {
19
+ throw new Error("package skills directory escapes the package root");
20
+ }
21
+ const skills = {};
22
+ for (const entry of entries) {
23
+ if (entry.name.startsWith("."))
24
+ continue;
25
+ const nameCheck = assertValidSkillName(entry.name);
26
+ if (!nameCheck.ok)
27
+ throw new Error(nameCheck.reason);
28
+ const skillDir = path.join(skillsRoot, entry.name);
29
+ let info;
30
+ try {
31
+ info = await stat(skillDir);
32
+ }
33
+ catch {
34
+ continue;
35
+ }
36
+ if (!info.isDirectory())
37
+ continue;
38
+ const skillReal = await realpath(skillDir);
39
+ if (!isContained(skillsRootReal, skillReal)) {
40
+ throw new Error(`package skill "${entry.name}" escapes the package root`);
41
+ }
42
+ const files = await readSkillFiles(skillDir, skillReal);
43
+ if (files["SKILL.md"] === undefined)
44
+ continue;
45
+ skills[entry.name] = files;
46
+ }
47
+ if (Object.keys(skills).length === 0)
48
+ return undefined;
49
+ const validated = validateSkillsPayload(skills);
50
+ if (!validated.ok)
51
+ throw new Error(validated.reason);
52
+ return validated.skills;
53
+ }
54
+ async function readSkillFiles(skillDir, skillReal) {
55
+ const files = {};
56
+ await walk(skillDir);
57
+ return files;
58
+ async function walk(dir) {
59
+ const entries = await readdir(dir, { withFileTypes: true });
60
+ for (const entry of entries) {
61
+ const abs = path.join(dir, entry.name);
62
+ const rel = path.relative(skillDir, abs);
63
+ const real = await realpath(abs);
64
+ if (!isContained(skillReal, real)) {
65
+ throw new Error(`package skill file "${rel}" escapes the package root`);
66
+ }
67
+ const target = await stat(real);
68
+ if (target.isDirectory()) {
69
+ await walk(abs);
70
+ continue;
71
+ }
72
+ if (!target.isFile())
73
+ continue;
74
+ const pathCheck = assertValidSkillRelativePath(rel);
75
+ if (!pathCheck.ok)
76
+ throw new Error(pathCheck.reason);
77
+ files[rel] = await readFile(real, "utf8");
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,12 @@
1
+ import type { StagePort } from "../agent/port.js";
2
+ import type { RunStore } from "../runstore/port.js";
3
+ import { type HostedEventSink, type HostedPipelineInput, type HostedPipelineResult } from "./types.js";
4
+ export type HostedRuntime = {
5
+ run(input: HostedPipelineInput): Promise<HostedPipelineResult>;
6
+ };
7
+ export declare function createHostedRuntime(dependencies: {
8
+ agent: StagePort;
9
+ localStore: RunStore;
10
+ eventSink: HostedEventSink;
11
+ eventDeliveryTimeoutMs?: number;
12
+ }): HostedRuntime;