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
@@ -16,12 +16,23 @@ const CURSOR_SETTING_SOURCES_ENV = "PI_CURSOR_SETTING_SOURCES";
16
16
  *
17
17
  * Resolution order:
18
18
  * 1. STAGEFLOW_CURSOR_EXTENSION (absolute path to the extension .ts/.js)
19
- * 2. Path package from ~/.pi/agent/settings.json (same source interactive pi uses)
20
- * 3. npm install under ~/.pi/agent/npm/node_modules/pi-cursor-sdk
19
+ * 2. Path package from the Pi agent settings.json (same source interactive pi uses)
20
+ * 3. npm install under <pi-agent>/npm/node_modules/pi-cursor-sdk
21
21
  * (`dist/index.js` for 0.3+, `src/index.ts` for older publishes)
22
22
  * 4. Sibling checkout at ../pi-cursor-sdk relative to this repo
23
+ *
24
+ * A stage worker's HOME is an empty attempt directory, so the Pi agent dir is
25
+ * the directory of STAGEFLOW_PI_HOME_AUTH_PATH when the Host set it, not
26
+ * os.homedir().
23
27
  */
24
28
  const CURSOR_PACKAGE_ENTRIES = ["dist/index.js", "src/index.ts"];
29
+ /** Pi agent dir. Stage workers must not use os.homedir(): HOME is the attempt dir. */
30
+ function piAgentDir() {
31
+ const auth = process.env.STAGEFLOW_PI_HOME_AUTH_PATH?.trim();
32
+ if (auth)
33
+ return path.dirname(path.resolve(auth));
34
+ return path.join(os.homedir(), ".pi", "agent");
35
+ }
25
36
  export function cursorExtensionEntryInPackage(packageRoot) {
26
37
  for (const rel of CURSOR_PACKAGE_ENTRIES) {
27
38
  const full = path.join(packageRoot, rel);
@@ -40,7 +51,7 @@ export function resolveCursorExtensionPath() {
40
51
  if (fromSettings) {
41
52
  return fromSettings;
42
53
  }
43
- const npmEntry = cursorExtensionEntryInPackage(path.join(os.homedir(), ".pi", "agent", "npm", "node_modules", "pi-cursor-sdk"));
54
+ const npmEntry = cursorExtensionEntryInPackage(path.join(piAgentDir(), "npm", "node_modules", "pi-cursor-sdk"));
44
55
  if (npmEntry) {
45
56
  return npmEntry;
46
57
  }
@@ -84,6 +95,20 @@ function prepareCursor(modelRef) {
84
95
  restore: sealCursorSettingSources(),
85
96
  };
86
97
  }
98
+ export function workshopCursorBridgeHint(toolNames) {
99
+ const lines = toolNames.map((name) => `- pi__${name} (playbook name: ${name})`);
100
+ return [
101
+ "Cursor bridge: call the workshop tools by these MCP names. The playbook uses the bare names; they are the same tools.",
102
+ ...lines,
103
+ "When the operator asks you to create or edit the draft, do not finish without one of these tool calls.",
104
+ ].join("\n");
105
+ }
106
+ export function cursorBridgePrompt(message, modelId, toolNames) {
107
+ if (!modelId || !isCursorModelRef(modelId) || toolNames.length === 0) {
108
+ return message;
109
+ }
110
+ return `${message}\n\n${workshopCursorBridgeHint(toolNames)}`;
111
+ }
87
112
  export const cursorProviderSupport = {
88
113
  id: "cursor",
89
114
  matches: isCursorModelRef,
@@ -99,7 +124,8 @@ export const cursorProviderSupport = {
99
124
  };
100
125
  registerProviderSupport(cursorProviderSupport);
101
126
  function resolveFromPiSettings() {
102
- const settingsPath = path.join(os.homedir(), ".pi", "agent", "settings.json");
127
+ const agentDir = piAgentDir();
128
+ const settingsPath = path.join(agentDir, "settings.json");
103
129
  if (!existsSync(settingsPath)) {
104
130
  return undefined;
105
131
  }
@@ -113,7 +139,6 @@ function resolveFromPiSettings() {
113
139
  if (!Array.isArray(settings.packages)) {
114
140
  return undefined;
115
141
  }
116
- const agentDir = path.join(os.homedir(), ".pi", "agent");
117
142
  for (const entry of settings.packages) {
118
143
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
119
144
  continue;
@@ -3,6 +3,7 @@ import type { AgentPort, OpaqueAnswer, OpaqueWaitRequest, StageHandle, StageRunI
3
3
  export type FakeAgentBehavior = {
4
4
  type: "emit";
5
5
  envelope: unknown;
6
+ toolArgs?: string;
6
7
  } | {
7
8
  type: "never_emit";
8
9
  } | {
@@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "
2
2
  import path from "node:path";
3
3
  import { assertRequiredEnvelope, isAdvancingEnvelope, } from "../envelope/check.js";
4
4
  import { assertFeedbackLoopAction } from "../envelope/feedbackLoop.js";
5
+ import { loginCheckIssue } from "../browser/loginCheck.js";
5
6
  import { assertEnvelopePayload } from "../envelope/payloadSchema.js";
6
7
  import { assertForkEnvelope } from "../envelope/forkChoice.js";
7
8
  import { assertAnswerMatchesPrompt, parseAskOperatorAnswer, } from "../tools/askOperator.js";
@@ -127,6 +128,9 @@ export class FakeAgent {
127
128
  event: "tool_start",
128
129
  toolName: "fake_tool",
129
130
  toolCallId: "fake-1",
131
+ ...("toolArgs" in behavior && behavior.toolArgs !== undefined
132
+ ? { argsPreview: behavior.toolArgs }
133
+ : {}),
130
134
  });
131
135
  input.onActivity?.({
132
136
  event: "tool_end",
@@ -165,6 +169,15 @@ export class FakeAgent {
165
169
  assertForkEnvelope(envelope, input.forkEmitContext);
166
170
  }
167
171
  assertEnvelopePayload(envelope, input.stage.payload_schema);
172
+ if (envelope.status !== "failure") {
173
+ for (const check of input.stage.pre_emit_checks ?? []) {
174
+ if (check.type !== "browser_login_check")
175
+ continue;
176
+ const issue = loginCheckIssue(envelope.payload, check);
177
+ if (issue !== undefined)
178
+ throw new Error(issue);
179
+ }
180
+ }
168
181
  if (!isAdvancingEnvelope(envelope)) {
169
182
  input.onActivity?.({ event: "agent_end" });
170
183
  return {
@@ -1,4 +1,4 @@
1
- import { type AgentSession, type EventBus, type InlineExtension, DefaultResourceLoader, SessionManager, SettingsManager } from "@earendil-works/pi-coding-agent";
1
+ import { type AgentSession, type ExtensionFactory, SessionManager } from "@earendil-works/pi-coding-agent";
2
2
  import type { StageRoots } from "../runtime/stageRoots.js";
3
3
  import { type AskOperatorPrompt, type AskOperatorWaitBridge } from "../tools/askOperator.js";
4
4
  import "./cursorProvider.js";
@@ -6,9 +6,18 @@ import { type StageActivityObserver } from "./activityObserver.js";
6
6
  import type { AgentPort, OpaqueAnswer, StageHandle, StageHandleCloseOptions, StageRunInput, StageRunResult } from "./port.js";
7
7
  import type { StageGateKind } from "../types/stage.js";
8
8
  import { type StageUsage } from "../types/usage.js";
9
+ import { STAGEFLOW_PATH_DENIED } from "../runstore/workspaceLayout.js";
10
+ export { STAGEFLOW_PATH_DENIED };
11
+ export { createSealedResourceLoader } from "./piSessionFactory.js";
12
+ export declare const STAGEFLOW_PATH_DENY_EXTENSION_NAME = "stageflow-path-deny";
13
+ export declare function createDurableRootPathDenyExtension(options: {
14
+ runWorkspaceDir: string;
15
+ durableRoot: string;
16
+ checkoutRoot?: string;
17
+ }): ExtensionFactory;
9
18
  /**
10
19
  * Stage tool allowlist for sealed Pi sessions.
11
- * Includes `ask_operator` unless `gateKinds` is an empty list (R6).
20
+ * Includes `ask_operator` only when `gateKinds` is a non-empty list.
12
21
  * `write_stage_artifact` when registered (always, for bound and unbound —
13
22
  * bound/unbound only gates cwd / env bind).
14
23
  */
@@ -67,28 +76,6 @@ export type RouteSessionEventToProgressOptions = {
67
76
  export declare function routeSessionEventToProgress(event: Record<string, unknown>, options: RouteSessionEventToProgressOptions): void;
68
77
  export declare function composeStageUserPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
69
78
  export declare function composeFeedbackResumePrompt(input: StageRunInput): string;
70
- /**
71
- * DefaultResourceLoader with host/global discovery turned off.
72
- *
73
- * Without these flags the loader walks up from the run folder and would pick
74
- * up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
75
- * and APPEND_SYSTEM.md. Stages must not inherit that context.
76
- *
77
- * `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
78
- * is the isolated MCP seam. With `noExtensions: true`, discovered
79
- * global/project packages stay out; only those allowlists load.
80
- * `additionalSkillPaths` is the matching allowlist for one named skill.
81
- */
82
- export declare function createSealedResourceLoader(options: {
83
- cwd: string;
84
- agentDir: string;
85
- settingsManager: SettingsManager;
86
- systemPrompt: string;
87
- additionalExtensionPaths?: string[];
88
- additionalSkillPaths?: string[];
89
- extensionFactories?: InlineExtension[];
90
- eventBus?: EventBus;
91
- }): DefaultResourceLoader;
92
79
  /** Stable Pi session JSONL path under the run workspace stage dir. */
93
80
  export declare function stageSessionFilePath(roots: Pick<StageRoots, "runWorkspaceDir" | "attempt">, stageId: string): string;
94
81
  export declare function resolveStageSessionFile(input: StageRunInput): string;
@@ -26,15 +26,17 @@
26
26
  * fails closed with `StageSessionReconstructError` (KTD7). Epic proving
27
27
  * vehicle: pipeline `plan-review-proving` (Pi live wait + console answers).
28
28
  *
29
- * `ask_operator` is registered on sealed stage sessions unless the stage
30
- * declares `gate_kinds: []`.
29
+ * `ask_operator` is registered on sealed stage sessions only when the stage
30
+ * declares a non-empty `gate_kinds` list.
31
31
  */
32
32
  import { existsSync } from "node:fs";
33
33
  import { access, mkdir, readFile, writeFile } from "node:fs/promises";
34
34
  import path from "node:path";
35
- import { createAgentSession, DefaultResourceLoader, defineTool, ModelRuntime, resolveCliModel, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
35
+ import { BROWSER_SKILL_NAME } from "../config/builtinSkills.js";
36
+ import { defineTool, ModelRuntime, resolveCliModel, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
36
37
  import { StageMcpError } from "../config/resolveStageMcpServers.js";
37
38
  import { attachIsolatedMcp, STAGEFLOW_PI_MCP_EXTENSION_NAME, } from "./piIsolatedMcp.js";
39
+ import { createPiAgentSession, createSealedResourceLoader, } from "./piSessionFactory.js";
38
40
  import { isAdvancingEnvelope } from "../envelope/check.js";
39
41
  import { formatFeedbackLoopContext } from "../prompt/feedbackLoopContext.js";
40
42
  import { formatPriorEnvelope } from "../prompt/priorEnvelope.js";
@@ -49,9 +51,40 @@ import { createStageActivityObserver, } from "./activityObserver.js";
49
51
  import { DEFAULT_STAGE_TIMEOUT_MS, runtimeStageId, runStageViaOpen } from "./port.js";
50
52
  import { addModelUsage, emptyStageUsage } from "../types/usage.js";
51
53
  import { TIMEOUT_ABORT_TOOL_RESULT, composeTimeoutResumePrompt, stageTimeoutReason, } from "./stageTimeout.js";
54
+ import { globalStageflowHome } from "../project/globalHome.js";
55
+ import { durableRootFileToolDenial, STAGEFLOW_PATH_DENIED, } from "../runstore/workspaceLayout.js";
56
+ export { STAGEFLOW_PATH_DENIED };
57
+ export { createSealedResourceLoader } from "./piSessionFactory.js";
58
+ export const STAGEFLOW_PATH_DENY_EXTENSION_NAME = "stageflow-path-deny";
59
+ const PATH_DENY_FILE_TOOLS = new Set(["read", "write", "edit"]);
60
+ export function createDurableRootPathDenyExtension(options) {
61
+ const { runWorkspaceDir, durableRoot, checkoutRoot } = options;
62
+ const allowlistedRoots = checkoutRoot !== undefined && checkoutRoot !== ""
63
+ ? [checkoutRoot]
64
+ : undefined;
65
+ return (pi) => {
66
+ pi.on("tool_call", async (event, ctx) => {
67
+ if (!PATH_DENY_FILE_TOOLS.has(event.toolName)) {
68
+ return undefined;
69
+ }
70
+ const rawPath = event.input.path;
71
+ if (typeof rawPath !== "string" || rawPath.trim().length === 0) {
72
+ return undefined;
73
+ }
74
+ const candidate = path.isAbsolute(rawPath)
75
+ ? rawPath
76
+ : path.resolve(ctx.cwd, rawPath);
77
+ const reason = await durableRootFileToolDenial(candidate, runWorkspaceDir, durableRoot, allowlistedRoots);
78
+ if (reason !== undefined) {
79
+ return { block: true, reason };
80
+ }
81
+ return undefined;
82
+ });
83
+ };
84
+ }
52
85
  /**
53
86
  * Stage tool allowlist for sealed Pi sessions.
54
- * Includes `ask_operator` unless `gateKinds` is an empty list (R6).
87
+ * Includes `ask_operator` only when `gateKinds` is a non-empty list.
55
88
  * `write_stage_artifact` when registered (always, for bound and unbound —
56
89
  * bound/unbound only gates cwd / env bind).
57
90
  */
@@ -63,7 +96,7 @@ export function resolveStageToolNames(emitToolName, artifactToolName, askOperato
63
96
  "edit",
64
97
  emitToolName,
65
98
  ];
66
- if (gateKinds === undefined || gateKinds.length > 0) {
99
+ if (Array.isArray(gateKinds) && gateKinds.length > 0) {
67
100
  tools.push(askOperatorToolName);
68
101
  }
69
102
  if (artifactToolName) {
@@ -416,9 +449,16 @@ function buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName
416
449
  }
417
450
  const attempt = input.roots.attempt ?? 1;
418
451
  const attemptArtifactsPath = `stages/${runtimeStageId(input)}/attempts/${attempt}/artifacts/`;
419
- const skillBaseDir = input.stage.skill !== undefined && input.skillFilePath !== undefined
420
- ? path.dirname(input.skillFilePath)
421
- : undefined;
452
+ const skillBaseDirs = [
453
+ input.stage.skill !== undefined && input.skillFilePath !== undefined
454
+ ? path.dirname(input.skillFilePath)
455
+ : undefined,
456
+ input.browserSkillFilePath !== undefined
457
+ ? path.dirname(input.browserSkillFilePath)
458
+ : undefined,
459
+ ].filter((dir) => dir !== undefined);
460
+ const skillBaseDir = skillBaseDirs.length > 0 ? skillBaseDirs.join(", ") : undefined;
461
+ const browserGuidance = formatBrowserGuidance(input);
422
462
  const artifactGuidance = input.roots.mode === "bound" && artifactToolName !== undefined
423
463
  ? [
424
464
  `Project checkout (agent cwd): ${input.roots.checkoutRoot}`,
@@ -453,16 +493,38 @@ function buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName
453
493
  : "",
454
494
  "",
455
495
  artifactGuidance,
496
+ browserGuidance,
456
497
  emitHint,
457
498
  ]
458
499
  .filter(Boolean)
459
500
  .join("\n");
460
501
  }
502
+ function formatBrowserGuidance(input) {
503
+ const browser = input.stage.browser;
504
+ if (browser === undefined)
505
+ return "";
506
+ const lines = [
507
+ "This stage has a browser. Run only agent-browser commands in bash. The session is already set in the environment.",
508
+ ];
509
+ if (browser.allow_domains !== undefined && browser.allow_domains.length > 0) {
510
+ lines.push(`Allowed domains: ${browser.allow_domains.join(", ")}. Open no other domain.`);
511
+ }
512
+ if (input.browserSkillFilePath !== undefined &&
513
+ input.stage.skill !== BROWSER_SKILL_NAME) {
514
+ lines.push(input.stage.skill !== undefined
515
+ ? `Before you use the browser, read the browser skill at ${input.browserSkillFilePath}.`
516
+ : "Follow the browser skill.");
517
+ }
518
+ return lines.join("\n");
519
+ }
461
520
  export function composeStageUserPrompt(input, emitToolName, emitHintOverride, artifactToolName) {
462
521
  const body = buildUserPrompt(input, emitToolName, emitHintOverride, artifactToolName);
463
522
  if (input.stage.skill !== undefined) {
464
523
  return `/skill:${input.stage.skill} ${body}`;
465
524
  }
525
+ if (input.browserSkillFilePath !== undefined && input.stage.browser !== undefined) {
526
+ return `/skill:${BROWSER_SKILL_NAME} ${body}`;
527
+ }
466
528
  return body;
467
529
  }
468
530
  export function composeFeedbackResumePrompt(input) {
@@ -475,38 +537,6 @@ export function composeFeedbackResumePrompt(input) {
475
537
  formatFeedbackLoopContext(input.feedbackLoopContext, input.sessionMode ?? "feedback_resume"),
476
538
  ].join("\n\n");
477
539
  }
478
- /**
479
- * DefaultResourceLoader with host/global discovery turned off.
480
- *
481
- * Without these flags the loader walks up from the run folder and would pick
482
- * up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
483
- * and APPEND_SYSTEM.md. Stages must not inherit that context.
484
- *
485
- * `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
486
- * is the isolated MCP seam. With `noExtensions: true`, discovered
487
- * global/project packages stay out; only those allowlists load.
488
- * `additionalSkillPaths` is the matching allowlist for one named skill.
489
- */
490
- export function createSealedResourceLoader(options) {
491
- return new DefaultResourceLoader({
492
- cwd: options.cwd,
493
- agentDir: options.agentDir,
494
- settingsManager: options.settingsManager,
495
- systemPromptOverride: () => options.systemPrompt,
496
- appendSystemPromptOverride: () => [],
497
- additionalExtensionPaths: options.additionalExtensionPaths,
498
- additionalSkillPaths: options.additionalSkillPaths,
499
- ...(options.extensionFactories !== undefined
500
- ? { extensionFactories: options.extensionFactories }
501
- : {}),
502
- ...(options.eventBus !== undefined ? { eventBus: options.eventBus } : {}),
503
- noContextFiles: true,
504
- noExtensions: true,
505
- noSkills: true,
506
- noPromptTemplates: true,
507
- noThemes: true,
508
- });
509
- }
510
540
  function collectMcpExtensionToolNames(loader) {
511
541
  const inlinePath = `<inline:${STAGEFLOW_PI_MCP_EXTENSION_NAME}>`;
512
542
  const names = [];
@@ -773,11 +803,11 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
773
803
  }, input.feedbackLoopEmitContext);
774
804
  const emitTool = defineTool(emitDef);
775
805
  const gateKinds = input.stage.gate_kinds;
776
- const includeAsk = gateKinds === undefined || gateKinds.length > 0;
806
+ const includeAsk = Array.isArray(gateKinds) && gateKinds.length > 0;
777
807
  const askDef = includeAsk
778
808
  ? createAskOperatorTool({
779
809
  requestWait: (prompt) => askWaitChannel.requestWait(prompt),
780
- ...(gateKinds !== undefined ? { allowedKinds: gateKinds } : {}),
810
+ allowedKinds: gateKinds,
781
811
  })
782
812
  : undefined;
783
813
  const askTool = askDef ? defineTool(askDef) : undefined;
@@ -793,6 +823,10 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
793
823
  reason: `Skill "${input.stage.skill}" is not installed`,
794
824
  };
795
825
  }
826
+ const additionalSkillPaths = [
827
+ input.skillFilePath,
828
+ input.stage.browser !== undefined ? input.browserSkillFilePath : undefined,
829
+ ].filter((p, i, all) => p !== undefined && all.indexOf(p) === i);
796
830
  const additionalExtensionPaths = [];
797
831
  let restoreProvider;
798
832
  if (provider) {
@@ -825,18 +859,27 @@ async function prepareStageSessionWiring(input, sessionManager, existingAskWaitC
825
859
  restoreProvider?.();
826
860
  return { ok: false, reason };
827
861
  };
862
+ const extensionFactories = [
863
+ {
864
+ name: STAGEFLOW_PATH_DENY_EXTENSION_NAME,
865
+ factory: createDurableRootPathDenyExtension({
866
+ runWorkspaceDir: roots.runWorkspaceDir,
867
+ durableRoot: globalStageflowHome(),
868
+ ...(roots.checkoutRoot !== undefined
869
+ ? { checkoutRoot: roots.checkoutRoot }
870
+ : {}),
871
+ }),
872
+ },
873
+ ...(attached.extensionFactories ?? []),
874
+ ];
828
875
  const loader = createSealedResourceLoader({
829
876
  cwd: roots.cwd,
830
877
  agentDir: roots.agentDir,
831
878
  settingsManager,
832
879
  systemPrompt: input.stage.system_prompt,
833
880
  additionalExtensionPaths,
834
- ...(input.skillFilePath !== undefined
835
- ? { additionalSkillPaths: [input.skillFilePath] }
836
- : {}),
837
- ...(attached.extensionFactories !== undefined
838
- ? { extensionFactories: attached.extensionFactories }
839
- : {}),
881
+ ...(additionalSkillPaths.length > 0 ? { additionalSkillPaths } : {}),
882
+ extensionFactories,
840
883
  ...(attached.eventBus !== undefined ? { eventBus: attached.eventBus } : {}),
841
884
  });
842
885
  await loader.reload();
@@ -917,7 +960,7 @@ export async function reconstructStageSessionForAnswer(input, answer) {
917
960
  }
918
961
  let session;
919
962
  try {
920
- const created = await createAgentSession({
963
+ const created = await createPiAgentSession({
921
964
  cwd: input.roots.cwd,
922
965
  agentDir: input.roots.agentDir,
923
966
  modelRuntime: wiring.modelRuntime,
@@ -943,6 +986,13 @@ export async function reconstructStageSessionForAnswer(input, answer) {
943
986
  if (resolved.thinkingLevel) {
944
987
  session.setThinkingLevel(resolved.thinkingLevel);
945
988
  }
989
+ await input.onResolvedModel?.({
990
+ stageId: runtimeStageId(input),
991
+ model: resolved.model.id,
992
+ ...(resolved.thinkingLevel !== undefined
993
+ ? { thinkingLevel: resolved.thinkingLevel }
994
+ : {}),
995
+ });
946
996
  const liveSession = session;
947
997
  return {
948
998
  session: liveSession,
@@ -969,7 +1019,7 @@ export async function reconstructStageSessionForAnswer(input, answer) {
969
1019
  }
970
1020
  async function bindStageSession(input, sessionManager, wiring) {
971
1021
  const { roots } = input;
972
- const created = await createAgentSession({
1022
+ const created = await createPiAgentSession({
973
1023
  cwd: roots.cwd,
974
1024
  agentDir: roots.agentDir,
975
1025
  modelRuntime: wiring.modelRuntime,
@@ -1011,6 +1061,13 @@ async function bindStageSession(input, sessionManager, wiring) {
1011
1061
  if (resolved.thinkingLevel) {
1012
1062
  session.setThinkingLevel(resolved.thinkingLevel);
1013
1063
  }
1064
+ await input.onResolvedModel?.({
1065
+ stageId: runtimeStageId(input),
1066
+ model: resolved.model.id,
1067
+ ...(resolved.thinkingLevel !== undefined
1068
+ ? { thinkingLevel: resolved.thinkingLevel }
1069
+ : {}),
1070
+ });
1014
1071
  }
1015
1072
  catch (err) {
1016
1073
  await shutdownSession(session);
@@ -1,6 +1,8 @@
1
1
  import { type EventBus, type InlineExtension } from "@earendil-works/pi-coding-agent";
2
2
  import { type ResolvedMcpServers } from "../config/resolveStageMcpServers.js";
3
3
  export declare const STAGEFLOW_PI_MCP_EXTENSION_NAME = "stageflow-mcp";
4
+ export declare function jitiFsCacheDir(): string;
5
+ export declare function resetCreateMcpAdapterCacheForTests(): void;
4
6
  type IsolatedMcpServerEntry = Record<string, unknown> & {
5
7
  lifecycle: "lazy" | "eager";
6
8
  directTools: true;
@@ -1,10 +1,18 @@
1
+ import path from "node:path";
1
2
  import { createEventBus, } from "@earendil-works/pi-coding-agent";
2
3
  import { StageMcpError, } from "../config/resolveStageMcpServers.js";
4
+ import { globalStageflowHome } from "../project/globalHome.js";
3
5
  export const STAGEFLOW_PI_MCP_EXTENSION_NAME = "stageflow-mcp";
4
6
  const MCP_STATUS_EVENT = "pi-mcp-adapter/status/v1";
5
- const DEFAULT_ISOLATED_MCP_CONNECT_TIMEOUT_MS = 5_000;
7
+ const DEFAULT_ISOLATED_MCP_CONNECT_TIMEOUT_MS = 30_000;
6
8
  const STATUS_POLL_MS = 50;
7
9
  const PI_MCP_ADAPTER_SPEC = "pi-mcp-adapter";
10
+ export function jitiFsCacheDir() {
11
+ return path.join(globalStageflowHome(), "cache", "jiti");
12
+ }
13
+ export function resetCreateMcpAdapterCacheForTests() {
14
+ cachedCreateMcpAdapter = undefined;
15
+ }
8
16
  const ISOLATED_MCP_SETTINGS = {
9
17
  directTools: true,
10
18
  elicitation: false,
@@ -58,7 +66,7 @@ async function loadCreateMcpAdapter() {
58
66
  // Node does not type-strip .ts under node_modules.
59
67
  }
60
68
  const { createJiti } = await import("jiti/static");
61
- const jiti = createJiti(import.meta.url);
69
+ const jiti = createJiti(import.meta.url, { fsCache: jitiFsCacheDir() });
62
70
  const mod = (await jiti.import(PI_MCP_ADAPTER_SPEC));
63
71
  cachedCreateMcpAdapter = mod.createMcpAdapter;
64
72
  return cachedCreateMcpAdapter;
@@ -0,0 +1,38 @@
1
+ import { type CreateAgentSessionResult, type EventBus, type InlineExtension, type ToolDefinition, DefaultResourceLoader, type ModelRuntime, type SessionManager, type SettingsManager } from "@earendil-works/pi-coding-agent";
2
+ export declare const WORKSHOP_FORBIDDEN_BUILTIN_TOOLS: readonly ["bash", "write", "edit"];
3
+ export type SealedResourceLoaderOptions = {
4
+ cwd: string;
5
+ agentDir: string;
6
+ settingsManager: SettingsManager;
7
+ systemPrompt: string;
8
+ additionalExtensionPaths?: string[];
9
+ additionalSkillPaths?: string[];
10
+ extensionFactories?: InlineExtension[];
11
+ eventBus?: EventBus;
12
+ };
13
+ /**
14
+ * DefaultResourceLoader with host/global discovery turned off.
15
+ *
16
+ * Without these flags the loader walks up from the run folder and would pick
17
+ * up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
18
+ * and APPEND_SYSTEM.md. Stages must not inherit that context.
19
+ *
20
+ * `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
21
+ * is the isolated MCP seam. With `noExtensions: true`, discovered
22
+ * global/project packages stay out; only those allowlists load.
23
+ * `additionalSkillPaths` is the matching allowlist for one named skill.
24
+ */
25
+ export declare function createSealedResourceLoader(options: SealedResourceLoaderOptions): DefaultResourceLoader;
26
+ export type CreatePiAgentSessionOptions = {
27
+ cwd: string;
28
+ agentDir: string;
29
+ modelRuntime: ModelRuntime;
30
+ sessionManager: SessionManager;
31
+ customTools?: ToolDefinition[];
32
+ tools?: string[];
33
+ settingsManager?: SettingsManager;
34
+ resourceLoader: DefaultResourceLoader;
35
+ };
36
+ export declare function createPiAgentSession(options: CreatePiAgentSessionOptions): Promise<CreateAgentSessionResult>;
37
+ export declare function assertWorkshopToolsExcludeDiskShell(tools: readonly string[]): void;
38
+ export declare function resolveWorkshopToolNames(customToolNames: string[]): string[];
@@ -0,0 +1,60 @@
1
+ import { createAgentSession, DefaultResourceLoader, } from "@earendil-works/pi-coding-agent";
2
+ export const WORKSHOP_FORBIDDEN_BUILTIN_TOOLS = ["bash", "write", "edit"];
3
+ /**
4
+ * DefaultResourceLoader with host/global discovery turned off.
5
+ *
6
+ * Without these flags the loader walks up from the run folder and would pick
7
+ * up the consumer project's AGENTS.md, `.agents/skills/`, `.pi/extensions`,
8
+ * and APPEND_SYSTEM.md. Stages must not inherit that context.
9
+ *
10
+ * `additionalExtensionPaths` is the Cursor/provider seam. `extensionFactories`
11
+ * is the isolated MCP seam. With `noExtensions: true`, discovered
12
+ * global/project packages stay out; only those allowlists load.
13
+ * `additionalSkillPaths` is the matching allowlist for one named skill.
14
+ */
15
+ export function createSealedResourceLoader(options) {
16
+ return new DefaultResourceLoader({
17
+ cwd: options.cwd,
18
+ agentDir: options.agentDir,
19
+ settingsManager: options.settingsManager,
20
+ systemPromptOverride: () => options.systemPrompt,
21
+ appendSystemPromptOverride: () => [],
22
+ additionalExtensionPaths: options.additionalExtensionPaths,
23
+ additionalSkillPaths: options.additionalSkillPaths,
24
+ ...(options.extensionFactories !== undefined
25
+ ? { extensionFactories: options.extensionFactories }
26
+ : {}),
27
+ ...(options.eventBus !== undefined ? { eventBus: options.eventBus } : {}),
28
+ noContextFiles: true,
29
+ noExtensions: true,
30
+ noSkills: true,
31
+ noPromptTemplates: true,
32
+ noThemes: true,
33
+ });
34
+ }
35
+ export async function createPiAgentSession(options) {
36
+ return createAgentSession({
37
+ cwd: options.cwd,
38
+ agentDir: options.agentDir,
39
+ modelRuntime: options.modelRuntime,
40
+ ...(options.tools !== undefined ? { tools: options.tools } : {}),
41
+ ...(options.customTools !== undefined
42
+ ? { customTools: options.customTools }
43
+ : {}),
44
+ resourceLoader: options.resourceLoader,
45
+ sessionManager: options.sessionManager,
46
+ ...(options.settingsManager !== undefined
47
+ ? { settingsManager: options.settingsManager }
48
+ : {}),
49
+ });
50
+ }
51
+ export function assertWorkshopToolsExcludeDiskShell(tools) {
52
+ const forbidden = WORKSHOP_FORBIDDEN_BUILTIN_TOOLS.filter((name) => tools.includes(name));
53
+ if (forbidden.length > 0) {
54
+ throw new Error(`Workshop Pi allowlist must not include disk/shell builtins: ${forbidden.join(", ")}`);
55
+ }
56
+ }
57
+ export function resolveWorkshopToolNames(customToolNames) {
58
+ assertWorkshopToolsExcludeDiskShell(customToolNames);
59
+ return [...customToolNames];
60
+ }
@@ -63,6 +63,8 @@ export type StageRunInput = {
63
63
  /** Optional raw assistant-text-delta sink, fired alongside onActivity, not instead of it. */
64
64
  onAssistantTextDelta?: (delta: string) => void;
65
65
  skillFilePath?: string;
66
+ /** Bundled browser skill; set by the runtime when the stage has `browser`. */
67
+ browserSkillFilePath?: string;
66
68
  forkEmitContext?: ForkEmitContext;
67
69
  cloneEmitContext?: CloneEmitContext;
68
70
  /** Declared source policy; successful emits must continue or send work back. */
@@ -75,6 +77,12 @@ export type StageRunInput = {
75
77
  repairContext?: StageRepairContext;
76
78
  /** Live attempt-scoped QA trail; read at emit execute time, not bootstrap time. */
77
79
  readQaTrail?: () => QaExchange[] | Promise<QaExchange[]>;
80
+ /** Optional: record the provider-resolved model after resolveCliModel. */
81
+ onResolvedModel?: (info: {
82
+ stageId: string;
83
+ model: string;
84
+ thinkingLevel?: string;
85
+ }) => void | Promise<void>;
78
86
  };
79
87
  export declare function runtimeStageId(input: Pick<StageRunInput, "stage" | "stageId">): string;
80
88
  export type StageRunResult = {
@@ -1,2 +1,8 @@
1
- /** Scrub common secret-shaped substrings before text is persisted or returned. */
1
+ /** Scrub secret-shaped substrings and registered values before text is persisted. */
2
2
  export declare function redactSecrets(text: string): string;
3
+ /** Like redactSecrets plus cookie/storage/header shapes; for browser stages only. */
4
+ export declare function redactBrowserSecrets(text: string): string;
5
+ /** Tool/message previews of browser stages can carry cookie or token values. */
6
+ export declare function redactBrowserActivityEvent<T extends {
7
+ event: string;
8
+ }>(event: T): T;
@@ -1,13 +1,28 @@
1
- const SECRET_PATTERNS = [
2
- /\bsk-[A-Za-z0-9_-]{16,}\b/g,
3
- /\bghp_[A-Za-z0-9]{20,}\b/g,
4
- /\b[A-Za-z_]*KEY[A-Za-z_]*\s*[:=]\s*['"]?[A-Za-z0-9+/_-]{16,}['"]?/gi,
5
- ];
6
- /** Scrub common secret-shaped substrings before text is persisted or returned. */
1
+ import { BROWSER_STAGE_PATTERNS, redact, redactString, } from "../logging/redact.js";
2
+ import { getNamedSecrets } from "../logging/namedSecrets.js";
3
+ /** Scrub secret-shaped substrings and registered values before text is persisted. */
7
4
  export function redactSecrets(text) {
8
- let out = text;
9
- for (const pattern of SECRET_PATTERNS) {
10
- out = out.replace(pattern, "[redacted]");
11
- }
12
- return out;
5
+ return redactString(text, { namedSecrets: getNamedSecrets() });
6
+ }
7
+ /** Like redactSecrets plus cookie/storage/header shapes; for browser stages only. */
8
+ export function redactBrowserSecrets(text) {
9
+ return redactString(text, {
10
+ patterns: BROWSER_STAGE_PATTERNS,
11
+ namedSecrets: getNamedSecrets(),
12
+ });
13
+ }
14
+ const BROWSER_REDACTED_EVENTS = new Set([
15
+ "message",
16
+ "tool_start",
17
+ "tool_end",
18
+ "tool_progress",
19
+ ]);
20
+ /** Tool/message previews of browser stages can carry cookie or token values. */
21
+ export function redactBrowserActivityEvent(event) {
22
+ if (!BROWSER_REDACTED_EVENTS.has(event.event))
23
+ return event;
24
+ return redact(event, {
25
+ patterns: BROWSER_STAGE_PATTERNS,
26
+ namedSecrets: getNamedSecrets(),
27
+ });
13
28
  }