patchwork-os 0.2.0-beta.1 → 0.2.0-beta.10.canary.95

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 (652) hide show
  1. package/README.bridge.md +14 -14
  2. package/README.md +201 -34
  3. package/deploy/README.md +1 -1
  4. package/deploy/bootstrap-vps.sh +14 -9
  5. package/deploy/deploy-dashboard.sh +25 -1
  6. package/deploy/macos/README.md +153 -0
  7. package/deploy/macos/com.patchwork.bridge.plist.template +54 -0
  8. package/deploy/macos/com.patchwork.tunnel.plist.template +76 -0
  9. package/deploy/macos/install-mac-bridge.sh +244 -0
  10. package/deploy/macos/uninstall-mac-bridge.sh +22 -0
  11. package/dist/activityLog.d.ts +6 -0
  12. package/dist/activityLog.js +63 -26
  13. package/dist/activityLog.js.map +1 -1
  14. package/dist/adapters/claude.js +22 -16
  15. package/dist/adapters/claude.js.map +1 -1
  16. package/dist/adapters/gemini.js +15 -11
  17. package/dist/adapters/gemini.js.map +1 -1
  18. package/dist/adapters/openai.js +9 -9
  19. package/dist/adapters/openai.js.map +1 -1
  20. package/dist/ajv2020.d.ts +25 -0
  21. package/dist/ajv2020.js +33 -0
  22. package/dist/ajv2020.js.map +1 -0
  23. package/dist/analyticsAggregator.js +1 -1
  24. package/dist/analyticsAggregator.js.map +1 -1
  25. package/dist/analyticsConfig.d.ts +29 -0
  26. package/dist/analyticsConfig.js +102 -0
  27. package/dist/analyticsConfig.js.map +1 -0
  28. package/dist/analyticsPrefs.d.ts +38 -2
  29. package/dist/analyticsPrefs.js +148 -23
  30. package/dist/analyticsPrefs.js.map +1 -1
  31. package/dist/analyticsSend.d.ts +17 -1
  32. package/dist/analyticsSend.js +67 -5
  33. package/dist/analyticsSend.js.map +1 -1
  34. package/dist/approvalHttp.d.ts +14 -0
  35. package/dist/approvalHttp.js +212 -9
  36. package/dist/approvalHttp.js.map +1 -1
  37. package/dist/approvalInsights.js +13 -5
  38. package/dist/approvalInsights.js.map +1 -1
  39. package/dist/approvalQueue.d.ts +97 -3
  40. package/dist/approvalQueue.js +193 -19
  41. package/dist/approvalQueue.js.map +1 -1
  42. package/dist/approvalSignals.js +19 -11
  43. package/dist/approvalSignals.js.map +1 -1
  44. package/dist/automation.d.ts +35 -10
  45. package/dist/automation.js +133 -37
  46. package/dist/automation.js.map +1 -1
  47. package/dist/automationSuggestions.js +10 -8
  48. package/dist/automationSuggestions.js.map +1 -1
  49. package/dist/bridge.d.ts +2 -0
  50. package/dist/bridge.js +202 -25
  51. package/dist/bridge.js.map +1 -1
  52. package/dist/bridgeLockDiscovery.d.ts +27 -1
  53. package/dist/bridgeLockDiscovery.js +38 -11
  54. package/dist/bridgeLockDiscovery.js.map +1 -1
  55. package/dist/bridgeToken.js +3 -2
  56. package/dist/bridgeToken.js.map +1 -1
  57. package/dist/claudeDriver.js +23 -8
  58. package/dist/claudeDriver.js.map +1 -1
  59. package/dist/claudeOrchestrator.d.ts +1 -1
  60. package/dist/claudeOrchestrator.js +87 -44
  61. package/dist/claudeOrchestrator.js.map +1 -1
  62. package/dist/commands/analytics.d.ts +8 -0
  63. package/dist/commands/analytics.js +134 -0
  64. package/dist/commands/analytics.js.map +1 -0
  65. package/dist/commands/auditEnv.d.ts +36 -0
  66. package/dist/commands/auditEnv.js +202 -0
  67. package/dist/commands/auditEnv.js.map +1 -0
  68. package/dist/commands/dashboard.js +8 -1
  69. package/dist/commands/dashboard.js.map +1 -1
  70. package/dist/commands/doctor.d.ts +35 -0
  71. package/dist/commands/doctor.js +51 -0
  72. package/dist/commands/doctor.js.map +1 -0
  73. package/dist/commands/install.js +3 -0
  74. package/dist/commands/install.js.map +1 -1
  75. package/dist/commands/launchd.js +15 -16
  76. package/dist/commands/launchd.js.map +1 -1
  77. package/dist/commands/patchworkInit.d.ts +5 -0
  78. package/dist/commands/patchworkInit.js +89 -7
  79. package/dist/commands/patchworkInit.js.map +1 -1
  80. package/dist/commands/recipe.d.ts +110 -0
  81. package/dist/commands/recipe.js +512 -9
  82. package/dist/commands/recipe.js.map +1 -1
  83. package/dist/commands/recipeInstall.js +11 -4
  84. package/dist/commands/recipeInstall.js.map +1 -1
  85. package/dist/commands/shadowScan.d.ts +34 -0
  86. package/dist/commands/shadowScan.js +142 -0
  87. package/dist/commands/shadowScan.js.map +1 -0
  88. package/dist/commands/task.js +2 -2
  89. package/dist/commands/task.js.map +1 -1
  90. package/dist/commands/tools.d.ts +20 -1
  91. package/dist/commands/tools.js +112 -3
  92. package/dist/commands/tools.js.map +1 -1
  93. package/dist/commands/tracesImport.js +21 -4
  94. package/dist/commands/tracesImport.js.map +1 -1
  95. package/dist/commitIssueLinkLog.d.ts +16 -0
  96. package/dist/commitIssueLinkLog.js +110 -24
  97. package/dist/commitIssueLinkLog.js.map +1 -1
  98. package/dist/companions/registry.js +15 -7
  99. package/dist/companions/registry.js.map +1 -1
  100. package/dist/config.d.ts +47 -3
  101. package/dist/config.js +111 -21
  102. package/dist/config.js.map +1 -1
  103. package/dist/connectorRoutes.js +866 -57
  104. package/dist/connectorRoutes.js.map +1 -1
  105. package/dist/connectors/airtable.d.ts +230 -0
  106. package/dist/connectors/airtable.js +700 -0
  107. package/dist/connectors/airtable.js.map +1 -0
  108. package/dist/connectors/asana.js +13 -9
  109. package/dist/connectors/asana.js.map +1 -1
  110. package/dist/connectors/baseConnector.js +25 -3
  111. package/dist/connectors/baseConnector.js.map +1 -1
  112. package/dist/connectors/caldiy.d.ts +137 -0
  113. package/dist/connectors/caldiy.js +424 -0
  114. package/dist/connectors/caldiy.js.map +1 -0
  115. package/dist/connectors/circleci.d.ts +162 -0
  116. package/dist/connectors/circleci.js +576 -0
  117. package/dist/connectors/circleci.js.map +1 -0
  118. package/dist/connectors/cloudflare.d.ts +132 -0
  119. package/dist/connectors/cloudflare.js +622 -0
  120. package/dist/connectors/cloudflare.js.map +1 -0
  121. package/dist/connectors/confluence.js +35 -0
  122. package/dist/connectors/confluence.js.map +1 -1
  123. package/dist/connectors/connectorRedirectUri.d.ts +30 -0
  124. package/dist/connectors/connectorRedirectUri.js +38 -0
  125. package/dist/connectors/connectorRedirectUri.js.map +1 -0
  126. package/dist/connectors/connectorRegistry.d.ts +63 -0
  127. package/dist/connectors/connectorRegistry.js +354 -0
  128. package/dist/connectors/connectorRegistry.js.map +1 -0
  129. package/dist/connectors/datadog.js +33 -4
  130. package/dist/connectors/datadog.js.map +1 -1
  131. package/dist/connectors/discord.js +14 -10
  132. package/dist/connectors/discord.js.map +1 -1
  133. package/dist/connectors/elasticsearch.d.ts +141 -0
  134. package/dist/connectors/elasticsearch.js +601 -0
  135. package/dist/connectors/elasticsearch.js.map +1 -0
  136. package/dist/connectors/figma.d.ts +130 -0
  137. package/dist/connectors/figma.js +387 -0
  138. package/dist/connectors/figma.js.map +1 -0
  139. package/dist/connectors/github.d.ts +17 -0
  140. package/dist/connectors/github.js +53 -2
  141. package/dist/connectors/github.js.map +1 -1
  142. package/dist/connectors/gitlab.js +12 -6
  143. package/dist/connectors/gitlab.js.map +1 -1
  144. package/dist/connectors/gmail.js +72 -21
  145. package/dist/connectors/gmail.js.map +1 -1
  146. package/dist/connectors/googleCalendar.js +8 -8
  147. package/dist/connectors/googleCalendar.js.map +1 -1
  148. package/dist/connectors/googleDocs.d.ts +103 -0
  149. package/dist/connectors/googleDocs.js +409 -0
  150. package/dist/connectors/googleDocs.js.map +1 -0
  151. package/dist/connectors/googleDrive.d.ts +12 -0
  152. package/dist/connectors/googleDrive.js +35 -8
  153. package/dist/connectors/googleDrive.js.map +1 -1
  154. package/dist/connectors/grafana.d.ts +133 -0
  155. package/dist/connectors/grafana.js +478 -0
  156. package/dist/connectors/grafana.js.map +1 -0
  157. package/dist/connectors/jira.d.ts +25 -0
  158. package/dist/connectors/jira.js +227 -1
  159. package/dist/connectors/jira.js.map +1 -1
  160. package/dist/connectors/linear.js +1 -1
  161. package/dist/connectors/linear.js.map +1 -1
  162. package/dist/connectors/mcpOAuth.js +78 -16
  163. package/dist/connectors/mcpOAuth.js.map +1 -1
  164. package/dist/connectors/monday.d.ts +217 -0
  165. package/dist/connectors/monday.js +655 -0
  166. package/dist/connectors/monday.js.map +1 -0
  167. package/dist/connectors/mongodb.d.ts +139 -0
  168. package/dist/connectors/mongodb.js +455 -0
  169. package/dist/connectors/mongodb.js.map +1 -0
  170. package/dist/connectors/oauthStateStore.d.ts +20 -0
  171. package/dist/connectors/oauthStateStore.js +94 -4
  172. package/dist/connectors/oauthStateStore.js.map +1 -1
  173. package/dist/connectors/obsidian.d.ts +83 -0
  174. package/dist/connectors/obsidian.js +441 -0
  175. package/dist/connectors/obsidian.js.map +1 -0
  176. package/dist/connectors/paystack.d.ts +159 -0
  177. package/dist/connectors/paystack.js +607 -0
  178. package/dist/connectors/paystack.js.map +1 -0
  179. package/dist/connectors/pipedrive.d.ts +189 -0
  180. package/dist/connectors/pipedrive.js +559 -0
  181. package/dist/connectors/pipedrive.js.map +1 -0
  182. package/dist/connectors/postgres.d.ts +127 -0
  183. package/dist/connectors/postgres.js +512 -0
  184. package/dist/connectors/postgres.js.map +1 -0
  185. package/dist/connectors/posthog.d.ts +119 -0
  186. package/dist/connectors/posthog.js +479 -0
  187. package/dist/connectors/posthog.js.map +1 -0
  188. package/dist/connectors/redis.d.ts +140 -0
  189. package/dist/connectors/redis.js +571 -0
  190. package/dist/connectors/redis.js.map +1 -0
  191. package/dist/connectors/resend.d.ts +131 -0
  192. package/dist/connectors/resend.js +529 -0
  193. package/dist/connectors/resend.js.map +1 -0
  194. package/dist/connectors/salesforce.d.ts +136 -0
  195. package/dist/connectors/salesforce.js +603 -0
  196. package/dist/connectors/salesforce.js.map +1 -0
  197. package/dist/connectors/secrets.d.ts +51 -0
  198. package/dist/connectors/secrets.js +102 -0
  199. package/dist/connectors/secrets.js.map +1 -0
  200. package/dist/connectors/sendgrid.d.ts +102 -0
  201. package/dist/connectors/sendgrid.js +423 -0
  202. package/dist/connectors/sendgrid.js.map +1 -0
  203. package/dist/connectors/shopify.d.ts +145 -0
  204. package/dist/connectors/shopify.js +502 -0
  205. package/dist/connectors/shopify.js.map +1 -0
  206. package/dist/connectors/slack.d.ts +1 -1
  207. package/dist/connectors/slack.js +61 -9
  208. package/dist/connectors/slack.js.map +1 -1
  209. package/dist/connectors/snowflake.d.ts +119 -0
  210. package/dist/connectors/snowflake.js +615 -0
  211. package/dist/connectors/snowflake.js.map +1 -0
  212. package/dist/connectors/supabase.d.ts +92 -0
  213. package/dist/connectors/supabase.js +630 -0
  214. package/dist/connectors/supabase.js.map +1 -0
  215. package/dist/connectors/todoist.d.ts +117 -0
  216. package/dist/connectors/todoist.js +485 -0
  217. package/dist/connectors/todoist.js.map +1 -0
  218. package/dist/connectors/tokenStorage.js +56 -14
  219. package/dist/connectors/tokenStorage.js.map +1 -1
  220. package/dist/connectors/twilio.d.ts +118 -0
  221. package/dist/connectors/twilio.js +475 -0
  222. package/dist/connectors/twilio.js.map +1 -0
  223. package/dist/connectors/vercel.d.ts +110 -0
  224. package/dist/connectors/vercel.js +479 -0
  225. package/dist/connectors/vercel.js.map +1 -0
  226. package/dist/connectors/webflow.d.ts +118 -0
  227. package/dist/connectors/webflow.js +393 -0
  228. package/dist/connectors/webflow.js.map +1 -0
  229. package/dist/connectors/woocommerce.d.ts +220 -0
  230. package/dist/connectors/woocommerce.js +464 -0
  231. package/dist/connectors/woocommerce.js.map +1 -0
  232. package/dist/crypto.js +7 -2
  233. package/dist/crypto.js.map +1 -1
  234. package/dist/decisionReplay.js +15 -6
  235. package/dist/decisionReplay.js.map +1 -1
  236. package/dist/decisionTraceLog.d.ts +28 -0
  237. package/dist/decisionTraceLog.js +156 -29
  238. package/dist/decisionTraceLog.js.map +1 -1
  239. package/dist/drivers/claude/api.js +5 -4
  240. package/dist/drivers/claude/api.js.map +1 -1
  241. package/dist/drivers/claude/envSanitizer.d.ts +0 -6
  242. package/dist/drivers/claude/envSanitizer.js +17 -2
  243. package/dist/drivers/claude/envSanitizer.js.map +1 -1
  244. package/dist/drivers/claude/streamParser.js +5 -4
  245. package/dist/drivers/claude/streamParser.js.map +1 -1
  246. package/dist/drivers/claude/subprocess.js +22 -3
  247. package/dist/drivers/claude/subprocess.js.map +1 -1
  248. package/dist/drivers/gemini/index.d.ts +22 -0
  249. package/dist/drivers/gemini/index.js +256 -129
  250. package/dist/drivers/gemini/index.js.map +1 -1
  251. package/dist/drivers/local/index.d.ts +17 -0
  252. package/dist/drivers/local/index.js +99 -0
  253. package/dist/drivers/local/index.js.map +1 -1
  254. package/dist/drivers/openai/index.js +30 -2
  255. package/dist/drivers/openai/index.js.map +1 -1
  256. package/dist/extensionClient.d.ts +37 -4
  257. package/dist/extensionClient.js +58 -16
  258. package/dist/extensionClient.js.map +1 -1
  259. package/dist/featureFlags.d.ts +91 -0
  260. package/dist/featureFlags.js +174 -3
  261. package/dist/featureFlags.js.map +1 -1
  262. package/dist/fileLock.js +21 -12
  263. package/dist/fileLock.js.map +1 -1
  264. package/dist/fileLockSync.d.ts +67 -0
  265. package/dist/fileLockSync.js +126 -0
  266. package/dist/fileLockSync.js.map +1 -0
  267. package/dist/fp/activityAnalytics.js +26 -12
  268. package/dist/fp/activityAnalytics.js.map +1 -1
  269. package/dist/fp/automationInterpreter.d.ts +15 -1
  270. package/dist/fp/automationInterpreter.js +217 -82
  271. package/dist/fp/automationInterpreter.js.map +1 -1
  272. package/dist/fp/automationProgram.d.ts +30 -0
  273. package/dist/fp/automationProgram.js.map +1 -1
  274. package/dist/fp/automationState.d.ts +24 -5
  275. package/dist/fp/automationState.js +56 -9
  276. package/dist/fp/automationState.js.map +1 -1
  277. package/dist/fp/automationUtils.js +1 -1
  278. package/dist/fp/automationUtils.js.map +1 -1
  279. package/dist/fp/commandDescription.js +7 -1
  280. package/dist/fp/commandDescription.js.map +1 -1
  281. package/dist/fp/extensionSnapshot.js +8 -2
  282. package/dist/fp/extensionSnapshot.js.map +1 -1
  283. package/dist/fp/interpreterContext.d.ts +66 -1
  284. package/dist/fp/interpreterContext.js +91 -1
  285. package/dist/fp/interpreterContext.js.map +1 -1
  286. package/dist/fp/policyParser.js +29 -1
  287. package/dist/fp/policyParser.js.map +1 -1
  288. package/dist/fsWatchWithFallback.d.ts +36 -0
  289. package/dist/fsWatchWithFallback.js +128 -0
  290. package/dist/fsWatchWithFallback.js.map +1 -0
  291. package/dist/haltPushDispatch.d.ts +33 -0
  292. package/dist/haltPushDispatch.js +103 -0
  293. package/dist/haltPushDispatch.js.map +1 -0
  294. package/dist/httpBodyValidation.d.ts +41 -0
  295. package/dist/httpBodyValidation.js +45 -0
  296. package/dist/httpBodyValidation.js.map +1 -0
  297. package/dist/inboxRoutes.d.ts +22 -0
  298. package/dist/inboxRoutes.js +61 -1
  299. package/dist/inboxRoutes.js.map +1 -1
  300. package/dist/index.js +1053 -76
  301. package/dist/index.js.map +1 -1
  302. package/dist/installGuard.js +6 -2
  303. package/dist/installGuard.js.map +1 -1
  304. package/dist/lockfile.js +31 -4
  305. package/dist/lockfile.js.map +1 -1
  306. package/dist/oauth.d.ts +9 -0
  307. package/dist/oauth.js +33 -0
  308. package/dist/oauth.js.map +1 -1
  309. package/dist/oauthRoutes.d.ts +1 -1
  310. package/dist/oauthRoutes.js +5 -3
  311. package/dist/oauthRoutes.js.map +1 -1
  312. package/dist/orchestrator/childBridgeRegistry.js +29 -11
  313. package/dist/orchestrator/childBridgeRegistry.js.map +1 -1
  314. package/dist/patchworkConfig.d.ts +44 -1
  315. package/dist/patchworkConfig.js +28 -3
  316. package/dist/patchworkConfig.js.map +1 -1
  317. package/dist/pluginLoader.js +10 -1
  318. package/dist/pluginLoader.js.map +1 -1
  319. package/dist/pluginWatcher.js +12 -14
  320. package/dist/pluginWatcher.js.map +1 -1
  321. package/dist/preToolUseHook.js +3 -2
  322. package/dist/preToolUseHook.js.map +1 -1
  323. package/dist/processTree.d.ts +34 -0
  324. package/dist/processTree.js +105 -0
  325. package/dist/processTree.js.map +1 -0
  326. package/dist/prompts.js +3 -3
  327. package/dist/prompts.js.map +1 -1
  328. package/dist/recipeOrchestration.d.ts +9 -0
  329. package/dist/recipeOrchestration.js +341 -24
  330. package/dist/recipeOrchestration.js.map +1 -1
  331. package/dist/recipeRoutes.d.ts +58 -2
  332. package/dist/recipeRoutes.js +744 -115
  333. package/dist/recipeRoutes.js.map +1 -1
  334. package/dist/recipes/RecipeOrchestrator.d.ts +2 -0
  335. package/dist/recipes/RecipeOrchestrator.js +6 -1
  336. package/dist/recipes/RecipeOrchestrator.js.map +1 -1
  337. package/dist/recipes/agentExecutor.d.ts +25 -5
  338. package/dist/recipes/agentExecutor.js.map +1 -1
  339. package/dist/recipes/chainedRunner.d.ts +2 -0
  340. package/dist/recipes/chainedRunner.js +142 -5
  341. package/dist/recipes/chainedRunner.js.map +1 -1
  342. package/dist/recipes/connectorPreflight.d.ts +66 -0
  343. package/dist/recipes/connectorPreflight.js +169 -0
  344. package/dist/recipes/connectorPreflight.js.map +1 -0
  345. package/dist/recipes/dependencyGraph.js +13 -5
  346. package/dist/recipes/dependencyGraph.js.map +1 -1
  347. package/dist/recipes/githubInstallSource.d.ts +128 -0
  348. package/dist/recipes/githubInstallSource.js +206 -0
  349. package/dist/recipes/githubInstallSource.js.map +1 -0
  350. package/dist/recipes/haltCategory.d.ts +119 -0
  351. package/dist/recipes/haltCategory.js +188 -0
  352. package/dist/recipes/haltCategory.js.map +1 -0
  353. package/dist/recipes/idempotencyKey.d.ts +134 -0
  354. package/dist/recipes/idempotencyKey.js +322 -0
  355. package/dist/recipes/idempotencyKey.js.map +1 -0
  356. package/dist/recipes/installer.js +48 -2
  357. package/dist/recipes/installer.js.map +1 -1
  358. package/dist/recipes/judgeSummary.d.ts +50 -0
  359. package/dist/recipes/judgeSummary.js +47 -0
  360. package/dist/recipes/judgeSummary.js.map +1 -0
  361. package/dist/recipes/judgeVerdict.d.ts +48 -0
  362. package/dist/recipes/judgeVerdict.js +174 -0
  363. package/dist/recipes/judgeVerdict.js.map +1 -0
  364. package/dist/recipes/migrations/index.d.ts +9 -0
  365. package/dist/recipes/migrations/index.js +133 -0
  366. package/dist/recipes/migrations/index.js.map +1 -1
  367. package/dist/recipes/names.d.ts +20 -0
  368. package/dist/recipes/names.js +25 -0
  369. package/dist/recipes/names.js.map +1 -1
  370. package/dist/recipes/parser.js +88 -5
  371. package/dist/recipes/parser.js.map +1 -1
  372. package/dist/recipes/replayRun.js +1 -1
  373. package/dist/recipes/replayRun.js.map +1 -1
  374. package/dist/recipes/runBudget.d.ts +70 -0
  375. package/dist/recipes/runBudget.js +109 -0
  376. package/dist/recipes/runBudget.js.map +1 -0
  377. package/dist/recipes/scheduler.d.ts +30 -0
  378. package/dist/recipes/scheduler.js +69 -19
  379. package/dist/recipes/scheduler.js.map +1 -1
  380. package/dist/recipes/schema.d.ts +36 -0
  381. package/dist/recipes/schemaGenerator.js +103 -5
  382. package/dist/recipes/schemaGenerator.js.map +1 -1
  383. package/dist/recipes/stepObservation.js +9 -0
  384. package/dist/recipes/stepObservation.js.map +1 -1
  385. package/dist/recipes/toolRegistry.js +20 -3
  386. package/dist/recipes/toolRegistry.js.map +1 -1
  387. package/dist/recipes/tools/fanOut.d.ts +20 -0
  388. package/dist/recipes/tools/fanOut.js +199 -0
  389. package/dist/recipes/tools/fanOut.js.map +1 -0
  390. package/dist/recipes/tools/file.js +5 -2
  391. package/dist/recipes/tools/file.js.map +1 -1
  392. package/dist/recipes/tools/github.d.ts +1 -1
  393. package/dist/recipes/tools/github.js +75 -1
  394. package/dist/recipes/tools/github.js.map +1 -1
  395. package/dist/recipes/tools/gmail.js +27 -5
  396. package/dist/recipes/tools/gmail.js.map +1 -1
  397. package/dist/recipes/tools/googleDrive.js +64 -0
  398. package/dist/recipes/tools/googleDrive.js.map +1 -1
  399. package/dist/recipes/tools/http.d.ts +10 -0
  400. package/dist/recipes/tools/http.js +176 -0
  401. package/dist/recipes/tools/http.js.map +1 -0
  402. package/dist/recipes/tools/index.d.ts +2 -0
  403. package/dist/recipes/tools/index.js +2 -0
  404. package/dist/recipes/tools/index.js.map +1 -1
  405. package/dist/recipes/tools/slack.js +1 -1
  406. package/dist/recipes/validation.d.ts +17 -0
  407. package/dist/recipes/validation.js +29 -11
  408. package/dist/recipes/validation.js.map +1 -1
  409. package/dist/recipes/workspaceRoot.d.ts +37 -0
  410. package/dist/recipes/workspaceRoot.js +73 -0
  411. package/dist/recipes/workspaceRoot.js.map +1 -0
  412. package/dist/recipes/yamlPositions.d.ts +56 -0
  413. package/dist/recipes/yamlPositions.js +183 -0
  414. package/dist/recipes/yamlPositions.js.map +1 -0
  415. package/dist/recipes/yamlRunner.d.ts +182 -8
  416. package/dist/recipes/yamlRunner.js +877 -217
  417. package/dist/recipes/yamlRunner.js.map +1 -1
  418. package/dist/recipesHttp.d.ts +19 -3
  419. package/dist/recipesHttp.js +67 -11
  420. package/dist/recipesHttp.js.map +1 -1
  421. package/dist/resources.js +21 -13
  422. package/dist/resources.js.map +1 -1
  423. package/dist/runLog.d.ts +58 -5
  424. package/dist/runLog.js +98 -21
  425. package/dist/runLog.js.map +1 -1
  426. package/dist/sanitizeParsedJson.d.ts +39 -0
  427. package/dist/sanitizeParsedJson.js +55 -0
  428. package/dist/sanitizeParsedJson.js.map +1 -0
  429. package/dist/schemas/recipe.v1.json +885 -196
  430. package/dist/server.d.ts +160 -3
  431. package/dist/server.js +1099 -122
  432. package/dist/server.js.map +1 -1
  433. package/dist/sessionCheckpoint.d.ts +8 -0
  434. package/dist/sessionCheckpoint.js +33 -3
  435. package/dist/sessionCheckpoint.js.map +1 -1
  436. package/dist/ssrfGuard.d.ts +16 -0
  437. package/dist/ssrfGuard.js +87 -4
  438. package/dist/ssrfGuard.js.map +1 -1
  439. package/dist/streamableHttp.d.ts +9 -4
  440. package/dist/streamableHttp.js +76 -20
  441. package/dist/streamableHttp.js.map +1 -1
  442. package/dist/telemetry.js +19 -12
  443. package/dist/telemetry.js.map +1 -1
  444. package/dist/testing/shadowRun.d.ts +52 -0
  445. package/dist/testing/shadowRun.js +71 -0
  446. package/dist/testing/shadowRun.js.map +1 -0
  447. package/dist/tools/batchLsp.d.ts +3 -0
  448. package/dist/tools/bridgeDoctor.d.ts +11 -0
  449. package/dist/tools/bridgeDoctor.js +48 -2
  450. package/dist/tools/bridgeDoctor.js.map +1 -1
  451. package/dist/tools/bridgeStatus.d.ts +0 -12
  452. package/dist/tools/bridgeStatus.js +2 -28
  453. package/dist/tools/bridgeStatus.js.map +1 -1
  454. package/dist/tools/cancelClaudeTask.d.ts +1 -0
  455. package/dist/tools/clipboard.d.ts +2 -0
  456. package/dist/tools/closeTabs.d.ts +1 -0
  457. package/dist/tools/codeLens.d.ts +1 -0
  458. package/dist/tools/createIssueFromAIComment.d.ts +1 -0
  459. package/dist/tools/ctxGetTaskContext.d.ts +9 -0
  460. package/dist/tools/ctxGetTaskContext.js +50 -2
  461. package/dist/tools/ctxGetTaskContext.js.map +1 -1
  462. package/dist/tools/ctxQueryTraces.js +32 -24
  463. package/dist/tools/ctxQueryTraces.js.map +1 -1
  464. package/dist/tools/ctxSaveTrace.d.ts +1 -0
  465. package/dist/tools/debug.d.ts +4 -0
  466. package/dist/tools/decorations.d.ts +2 -0
  467. package/dist/tools/detectUnusedCode.js +9 -7
  468. package/dist/tools/detectUnusedCode.js.map +1 -1
  469. package/dist/tools/documentLinks.d.ts +1 -0
  470. package/dist/tools/editText.d.ts +1 -0
  471. package/dist/tools/editText.js +2 -1
  472. package/dist/tools/editText.js.map +1 -1
  473. package/dist/tools/enrichCommit.d.ts +1 -0
  474. package/dist/tools/enrichStackTrace.js +11 -5
  475. package/dist/tools/enrichStackTrace.js.map +1 -1
  476. package/dist/tools/explainDiagnostic.d.ts +1 -0
  477. package/dist/tools/explainSymbol.d.ts +1 -0
  478. package/dist/tools/fileOperations.d.ts +3 -0
  479. package/dist/tools/fileOperations.js +2 -1
  480. package/dist/tools/fileOperations.js.map +1 -1
  481. package/dist/tools/fileWatcher.d.ts +2 -0
  482. package/dist/tools/fileWatcher.js +8 -2
  483. package/dist/tools/fileWatcher.js.map +1 -1
  484. package/dist/tools/findFiles.d.ts +1 -0
  485. package/dist/tools/fixAllLintErrors.d.ts +1 -0
  486. package/dist/tools/fixAllLintErrors.js +10 -5
  487. package/dist/tools/fixAllLintErrors.js.map +1 -1
  488. package/dist/tools/foldingRanges.d.ts +1 -0
  489. package/dist/tools/formatDocument.d.ts +1 -0
  490. package/dist/tools/formatDocument.js +10 -5
  491. package/dist/tools/formatDocument.js.map +1 -1
  492. package/dist/tools/generateTests.d.ts +1 -0
  493. package/dist/tools/getAIComments.d.ts +1 -0
  494. package/dist/tools/getAnalyticsReport.js +5 -1
  495. package/dist/tools/getAnalyticsReport.js.map +1 -1
  496. package/dist/tools/getBufferContent.d.ts +1 -0
  497. package/dist/tools/getChangeImpact.d.ts +1 -0
  498. package/dist/tools/getChangeImpact.js +23 -14
  499. package/dist/tools/getChangeImpact.js.map +1 -1
  500. package/dist/tools/getClaudeTaskStatus.d.ts +1 -0
  501. package/dist/tools/getCodeCoverage.d.ts +1 -0
  502. package/dist/tools/getCodeCoverage.js +32 -14
  503. package/dist/tools/getCodeCoverage.js.map +1 -1
  504. package/dist/tools/getCommitsForIssue.d.ts +1 -0
  505. package/dist/tools/getDebugState.d.ts +1 -0
  506. package/dist/tools/getDiagnostics.js +32 -29
  507. package/dist/tools/getDiagnostics.js.map +1 -1
  508. package/dist/tools/getDiffFromHandoff.js +8 -2
  509. package/dist/tools/getDiffFromHandoff.js.map +1 -1
  510. package/dist/tools/getDocumentSymbols.d.ts +1 -0
  511. package/dist/tools/getGitHotspots.d.ts +1 -0
  512. package/dist/tools/getImportedSignatures.d.ts +1 -0
  513. package/dist/tools/getImportedSignatures.js +18 -14
  514. package/dist/tools/getImportedSignatures.js.map +1 -1
  515. package/dist/tools/getPRTemplate.d.ts +1 -0
  516. package/dist/tools/getProjectContext.js +23 -10
  517. package/dist/tools/getProjectContext.js.map +1 -1
  518. package/dist/tools/getSymbolHistory.d.ts +1 -0
  519. package/dist/tools/getToolCapabilities.d.ts +10 -5
  520. package/dist/tools/getToolCapabilities.js +79 -202
  521. package/dist/tools/getToolCapabilities.js.map +1 -1
  522. package/dist/tools/getTypeSignature.d.ts +1 -0
  523. package/dist/tools/getWorkspaceSettings.d.ts +1 -0
  524. package/dist/tools/gitWrite.d.ts +11 -0
  525. package/dist/tools/github/actions.d.ts +2 -0
  526. package/dist/tools/github/composite.d.ts +3 -0
  527. package/dist/tools/github/issues.d.ts +4 -0
  528. package/dist/tools/github/pr.d.ts +7 -0
  529. package/dist/tools/handoffNote.d.ts +1 -0
  530. package/dist/tools/handoffNote.js +2 -1
  531. package/dist/tools/handoffNote.js.map +1 -1
  532. package/dist/tools/headless/lspClient.js +3 -0
  533. package/dist/tools/headless/lspClient.js.map +1 -1
  534. package/dist/tools/hoverAtCursor.d.ts +1 -0
  535. package/dist/tools/httpClient.d.ts +2 -0
  536. package/dist/tools/httpClient.js +38 -71
  537. package/dist/tools/httpClient.js.map +1 -1
  538. package/dist/tools/inlayHints.d.ts +1 -0
  539. package/dist/tools/launchQuickTask.d.ts +1 -0
  540. package/dist/tools/listClaudeTasks.d.ts +1 -0
  541. package/dist/tools/listClaudeTasks.js +10 -8
  542. package/dist/tools/listClaudeTasks.js.map +1 -1
  543. package/dist/tools/listTerminals.d.ts +1 -0
  544. package/dist/tools/lsp.d.ts +15 -0
  545. package/dist/tools/lsp.js +17 -0
  546. package/dist/tools/lsp.js.map +1 -1
  547. package/dist/tools/navigateToSymbolByName.d.ts +1 -0
  548. package/dist/tools/openDiff.d.ts +1 -0
  549. package/dist/tools/openDiff.js +4 -1
  550. package/dist/tools/openDiff.js.map +1 -1
  551. package/dist/tools/openFile.d.ts +1 -0
  552. package/dist/tools/openFile.js +4 -1
  553. package/dist/tools/openFile.js.map +1 -1
  554. package/dist/tools/openInBrowser.js +6 -1
  555. package/dist/tools/openInBrowser.js.map +1 -1
  556. package/dist/tools/organizeImports.d.ts +1 -0
  557. package/dist/tools/organizeImports.js +5 -3
  558. package/dist/tools/organizeImports.js.map +1 -1
  559. package/dist/tools/performanceReport.js +5 -3
  560. package/dist/tools/performanceReport.js.map +1 -1
  561. package/dist/tools/planPersistence.d.ts +3 -0
  562. package/dist/tools/planPersistence.js +4 -1
  563. package/dist/tools/planPersistence.js.map +1 -1
  564. package/dist/tools/previewEdit.d.ts +1 -0
  565. package/dist/tools/previewEdit.js +15 -4
  566. package/dist/tools/previewEdit.js.map +1 -1
  567. package/dist/tools/recentTracesDigest.js +54 -11
  568. package/dist/tools/recentTracesDigest.js.map +1 -1
  569. package/dist/tools/refactorAnalyze.d.ts +1 -0
  570. package/dist/tools/refactorExtractFunction.js +4 -1
  571. package/dist/tools/refactorExtractFunction.js.map +1 -1
  572. package/dist/tools/refactorPreview.d.ts +1 -0
  573. package/dist/tools/refactorPreview.js +10 -2
  574. package/dist/tools/refactorPreview.js.map +1 -1
  575. package/dist/tools/replaceBlock.d.ts +1 -0
  576. package/dist/tools/replaceBlock.js +2 -1
  577. package/dist/tools/replaceBlock.js.map +1 -1
  578. package/dist/tools/resumeClaudeTask.d.ts +1 -0
  579. package/dist/tools/runClaudeTask.d.ts +1 -0
  580. package/dist/tools/runTests.js +15 -4
  581. package/dist/tools/runTests.js.map +1 -1
  582. package/dist/tools/screenshot.d.ts +1 -0
  583. package/dist/tools/screenshotAndAnnotate.js +6 -2
  584. package/dist/tools/screenshotAndAnnotate.js.map +1 -1
  585. package/dist/tools/searchAndReplace.d.ts +1 -0
  586. package/dist/tools/searchAndReplace.js +17 -7
  587. package/dist/tools/searchAndReplace.js.map +1 -1
  588. package/dist/tools/searchTools.js +20 -19
  589. package/dist/tools/searchTools.js.map +1 -1
  590. package/dist/tools/searchWorkspace.d.ts +1 -0
  591. package/dist/tools/selectionRanges.d.ts +1 -0
  592. package/dist/tools/semanticTokens.d.ts +1 -0
  593. package/dist/tools/signatureHelp.d.ts +1 -0
  594. package/dist/tools/spawnWorkspace.js +15 -7
  595. package/dist/tools/spawnWorkspace.js.map +1 -1
  596. package/dist/tools/terminal.d.ts +6 -0
  597. package/dist/tools/testRunners/pytest.js +6 -2
  598. package/dist/tools/testRunners/pytest.js.map +1 -1
  599. package/dist/tools/testRunners/vitestJest.js +3 -1
  600. package/dist/tools/testRunners/vitestJest.js.map +1 -1
  601. package/dist/tools/testTraceToSource.d.ts +1 -0
  602. package/dist/tools/transaction.d.ts +4 -0
  603. package/dist/tools/transaction.js +4 -1
  604. package/dist/tools/transaction.js.map +1 -1
  605. package/dist/tools/typeHierarchy.d.ts +1 -0
  606. package/dist/tools/utils.d.ts +18 -0
  607. package/dist/tools/utils.js +103 -18
  608. package/dist/tools/utils.js.map +1 -1
  609. package/dist/tools/vscodeCommands.d.ts +2 -0
  610. package/dist/tools/vscodeTasks.d.ts +2 -0
  611. package/dist/tools/workspaceSettings.d.ts +1 -0
  612. package/dist/transport.d.ts +3 -1
  613. package/dist/transport.js +103 -52
  614. package/dist/transport.js.map +1 -1
  615. package/dist/winShim.d.ts +34 -0
  616. package/dist/winShim.js +94 -0
  617. package/dist/winShim.js.map +1 -0
  618. package/dist/wireHaltPushDispatch.d.ts +38 -0
  619. package/dist/wireHaltPushDispatch.js +71 -0
  620. package/dist/wireHaltPushDispatch.js.map +1 -0
  621. package/dist/writeFileAtomic.d.ts +23 -0
  622. package/dist/writeFileAtomic.js +121 -0
  623. package/dist/writeFileAtomic.js.map +1 -0
  624. package/package.json +23 -7
  625. package/scripts/postinstall.mjs +42 -2
  626. package/scripts/smoke/run-all.mjs +213 -0
  627. package/scripts/start-all.mjs +572 -0
  628. package/scripts/start-all.ps1 +209 -0
  629. package/scripts/start-all.sh +73 -17
  630. package/scripts/start-orchestrator.ps1 +158 -0
  631. package/scripts/start-remote.mjs +122 -0
  632. package/templates/automation-policies/recipe-authoring.json +1 -1
  633. package/templates/automation-policies/security-first.json +1 -1
  634. package/templates/automation-policies/strict-lint.json +1 -1
  635. package/templates/automation-policies/test-driven.json +1 -1
  636. package/templates/automation-policy.example.json +1 -1
  637. package/templates/co.patchwork-os.bridge.plist +2 -2
  638. package/templates/recipes/approval-queue-ui-test.yaml +1 -1
  639. package/templates/recipes/ctx-loop-test.yaml +1 -1
  640. package/templates/recipes/fix-errors-on-save.yaml +71 -0
  641. package/templates/recipes/morning-brief.yaml +5 -2
  642. package/templates/recipes/project-health-check.yaml +4 -1
  643. package/templates/recipes/sentry-to-linear.yaml +72 -38
  644. package/templates/recipes/webhook/apple-watch-health-log.yaml +145 -0
  645. package/templates/recipes/webhook/customer-escalation.yaml +8 -9
  646. package/templates/recipes/webhook/meeting-prep.yaml +11 -5
  647. package/dist/commands/marketplace.d.ts +0 -16
  648. package/dist/commands/marketplace.js +0 -32
  649. package/dist/commands/marketplace.js.map +0 -1
  650. package/dist/recipes/legacyRecipeCompat.d.ts +0 -10
  651. package/dist/recipes/legacyRecipeCompat.js +0 -131
  652. package/dist/recipes/legacyRecipeCompat.js.map +0 -1
@@ -26,7 +26,8 @@
26
26
  "description": "Human-readable description of what this recipe does"
27
27
  },
28
28
  "maxConcurrency": {
29
- "type": "number",
29
+ "type": "integer",
30
+ "minimum": 1,
30
31
  "description": "Maximum number of chained steps that may execute in parallel"
31
32
  },
32
33
  "maxDepth": {
@@ -199,6 +200,49 @@
199
200
  "type": "number",
200
201
  "description": "Milliseconds to wait between retries (default 1000)"
201
202
  },
203
+ "timeout_ms": {
204
+ "type": "number",
205
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
206
+ },
207
+ "expect": {
208
+ "type": "object",
209
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
210
+ "properties": {
211
+ "schema": {
212
+ "type": "object",
213
+ "description": "JSON Schema validated against the step output via AJV"
214
+ },
215
+ "equals": {
216
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
217
+ },
218
+ "matches": {
219
+ "type": "string",
220
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
221
+ },
222
+ "contains": {
223
+ "oneOf": [
224
+ {
225
+ "type": "string"
226
+ },
227
+ {
228
+ "type": "array",
229
+ "items": {
230
+ "type": "string"
231
+ }
232
+ }
233
+ ],
234
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
235
+ },
236
+ "on_fail": {
237
+ "type": "string",
238
+ "enum": [
239
+ "halt",
240
+ "warn"
241
+ ],
242
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
243
+ }
244
+ }
245
+ },
202
246
  "agent": {
203
247
  "type": "object",
204
248
  "required": [
@@ -230,6 +274,17 @@
230
274
  "into": {
231
275
  "type": "string",
232
276
  "description": "Variable name to store output in context"
277
+ },
278
+ "mcpAccess": {
279
+ "type": "boolean",
280
+ "description": "When true, grants the agent step access to MCP tools registered on the bridge. Defaults to false for subprocess driver steps."
281
+ },
282
+ "kind": {
283
+ "type": "string",
284
+ "enum": [
285
+ "judge"
286
+ ],
287
+ "description": "When set to 'judge', the agent step emits a structured verdictReason and stores the verdict in the run log."
233
288
  }
234
289
  }
235
290
  }
@@ -281,6 +336,49 @@
281
336
  "type": "number",
282
337
  "description": "Milliseconds to wait between retries (default 1000)"
283
338
  },
339
+ "timeout_ms": {
340
+ "type": "number",
341
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
342
+ },
343
+ "expect": {
344
+ "type": "object",
345
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
346
+ "properties": {
347
+ "schema": {
348
+ "type": "object",
349
+ "description": "JSON Schema validated against the step output via AJV"
350
+ },
351
+ "equals": {
352
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
353
+ },
354
+ "matches": {
355
+ "type": "string",
356
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
357
+ },
358
+ "contains": {
359
+ "oneOf": [
360
+ {
361
+ "type": "string"
362
+ },
363
+ {
364
+ "type": "array",
365
+ "items": {
366
+ "type": "string"
367
+ }
368
+ }
369
+ ],
370
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
371
+ },
372
+ "on_fail": {
373
+ "type": "string",
374
+ "enum": [
375
+ "halt",
376
+ "warn"
377
+ ],
378
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
379
+ }
380
+ }
381
+ },
284
382
  "tool": {
285
383
  "type": "string",
286
384
  "not": {
@@ -347,6 +445,49 @@
347
445
  "type": "number",
348
446
  "description": "Milliseconds to wait between retries (default 1000)"
349
447
  },
448
+ "timeout_ms": {
449
+ "type": "number",
450
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
451
+ },
452
+ "expect": {
453
+ "type": "object",
454
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
455
+ "properties": {
456
+ "schema": {
457
+ "type": "object",
458
+ "description": "JSON Schema validated against the step output via AJV"
459
+ },
460
+ "equals": {
461
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
462
+ },
463
+ "matches": {
464
+ "type": "string",
465
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
466
+ },
467
+ "contains": {
468
+ "oneOf": [
469
+ {
470
+ "type": "string"
471
+ },
472
+ {
473
+ "type": "array",
474
+ "items": {
475
+ "type": "string"
476
+ }
477
+ }
478
+ ],
479
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
480
+ },
481
+ "on_fail": {
482
+ "type": "string",
483
+ "enum": [
484
+ "halt",
485
+ "warn"
486
+ ],
487
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
488
+ }
489
+ }
490
+ },
350
491
  "recipe": {
351
492
  "type": "string",
352
493
  "description": "Nested recipe name or path"
@@ -386,223 +527,745 @@
386
527
  }
387
528
  },
388
529
  "parallel": {
389
- "type": "array",
390
- "description": "Run these steps concurrently. All must finish before later steps that await this group.",
391
- "items": {
392
- "oneOf": [
393
- {
394
- "type": "object",
395
- "required": [
396
- "agent"
397
- ],
398
- "properties": {
399
- "id": {
400
- "type": "string",
401
- "description": "Unique chained step identifier used for outputs and dependencies"
402
- },
403
- "awaits": {
404
- "type": "array",
405
- "description": "Step IDs that must complete before this step runs",
406
- "items": {
407
- "type": "string"
408
- }
409
- },
410
- "when": {
411
- "type": "string",
412
- "description": "Template condition that controls whether this step runs"
413
- },
414
- "optional": {
415
- "type": "boolean",
416
- "description": "Whether step failure should be tolerated"
417
- },
418
- "risk": {
419
- "type": "string",
420
- "enum": [
421
- "low",
422
- "medium",
423
- "high"
530
+ "description": "Run these steps concurrently. Array form: steps run in parallel. Object form: map-reduce — each item in `each` is bound to `as` and the steps array runs once per item.",
531
+ "oneOf": [
532
+ {
533
+ "type": "array",
534
+ "description": "Run these steps concurrently.",
535
+ "items": {
536
+ "oneOf": [
537
+ {
538
+ "type": "object",
539
+ "required": [
540
+ "agent"
424
541
  ],
425
- "description": "Risk level for this step"
426
- },
427
- "transform": {
428
- "type": "string",
429
- "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
430
- },
431
- "retry": {
432
- "type": "number",
433
- "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
434
- },
435
- "retryDelay": {
436
- "type": "number",
437
- "description": "Milliseconds to wait between retries (default 1000)"
542
+ "properties": {
543
+ "id": {
544
+ "type": "string",
545
+ "description": "Unique chained step identifier used for outputs and dependencies"
546
+ },
547
+ "awaits": {
548
+ "type": "array",
549
+ "description": "Step IDs that must complete before this step runs",
550
+ "items": {
551
+ "type": "string"
552
+ }
553
+ },
554
+ "when": {
555
+ "type": "string",
556
+ "description": "Template condition that controls whether this step runs"
557
+ },
558
+ "optional": {
559
+ "type": "boolean",
560
+ "description": "Whether step failure should be tolerated"
561
+ },
562
+ "risk": {
563
+ "type": "string",
564
+ "enum": [
565
+ "low",
566
+ "medium",
567
+ "high"
568
+ ],
569
+ "description": "Risk level for this step"
570
+ },
571
+ "transform": {
572
+ "type": "string",
573
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
574
+ },
575
+ "retry": {
576
+ "type": "number",
577
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
578
+ },
579
+ "retryDelay": {
580
+ "type": "number",
581
+ "description": "Milliseconds to wait between retries (default 1000)"
582
+ },
583
+ "timeout_ms": {
584
+ "type": "number",
585
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
586
+ },
587
+ "expect": {
588
+ "type": "object",
589
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
590
+ "properties": {
591
+ "schema": {
592
+ "type": "object",
593
+ "description": "JSON Schema validated against the step output via AJV"
594
+ },
595
+ "equals": {
596
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
597
+ },
598
+ "matches": {
599
+ "type": "string",
600
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
601
+ },
602
+ "contains": {
603
+ "oneOf": [
604
+ {
605
+ "type": "string"
606
+ },
607
+ {
608
+ "type": "array",
609
+ "items": {
610
+ "type": "string"
611
+ }
612
+ }
613
+ ],
614
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
615
+ },
616
+ "on_fail": {
617
+ "type": "string",
618
+ "enum": [
619
+ "halt",
620
+ "warn"
621
+ ],
622
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
623
+ }
624
+ }
625
+ },
626
+ "agent": {
627
+ "type": "object",
628
+ "required": [
629
+ "prompt"
630
+ ],
631
+ "description": "Agent step configuration",
632
+ "properties": {
633
+ "prompt": {
634
+ "type": "string"
635
+ },
636
+ "model": {
637
+ "type": "string"
638
+ },
639
+ "driver": {
640
+ "type": "string",
641
+ "enum": [
642
+ "claude",
643
+ "claude-code",
644
+ "api",
645
+ "openai",
646
+ "grok",
647
+ "gemini",
648
+ "anthropic"
649
+ ]
650
+ },
651
+ "into": {
652
+ "type": "string"
653
+ },
654
+ "mcpAccess": {
655
+ "type": "boolean",
656
+ "description": "When true, grants the agent step access to MCP tools registered on the bridge. Defaults to false for subprocess driver steps."
657
+ },
658
+ "kind": {
659
+ "type": "string",
660
+ "enum": [
661
+ "judge"
662
+ ],
663
+ "description": "When set to 'judge', the agent step emits a structured verdictReason and stores the verdict in the run log."
664
+ }
665
+ }
666
+ }
667
+ }
438
668
  },
439
- "agent": {
669
+ {
440
670
  "type": "object",
441
671
  "required": [
442
- "prompt"
672
+ "tool"
443
673
  ],
444
- "description": "Agent step configuration",
445
674
  "properties": {
446
- "prompt": {
447
- "type": "string"
675
+ "id": {
676
+ "type": "string",
677
+ "description": "Unique chained step identifier used for outputs and dependencies"
448
678
  },
449
- "model": {
450
- "type": "string"
679
+ "awaits": {
680
+ "type": "array",
681
+ "description": "Step IDs that must complete before this step runs",
682
+ "items": {
683
+ "type": "string"
684
+ }
451
685
  },
452
- "driver": {
686
+ "when": {
687
+ "type": "string",
688
+ "description": "Template condition that controls whether this step runs"
689
+ },
690
+ "optional": {
691
+ "type": "boolean",
692
+ "description": "Whether step failure should be tolerated"
693
+ },
694
+ "risk": {
453
695
  "type": "string",
454
696
  "enum": [
455
- "claude",
456
- "claude-code",
457
- "api",
458
- "openai",
459
- "grok",
460
- "gemini",
461
- "anthropic"
462
- ]
697
+ "low",
698
+ "medium",
699
+ "high"
700
+ ],
701
+ "description": "Risk level for this step"
702
+ },
703
+ "transform": {
704
+ "type": "string",
705
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
706
+ },
707
+ "retry": {
708
+ "type": "number",
709
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
710
+ },
711
+ "retryDelay": {
712
+ "type": "number",
713
+ "description": "Milliseconds to wait between retries (default 1000)"
714
+ },
715
+ "timeout_ms": {
716
+ "type": "number",
717
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
718
+ },
719
+ "expect": {
720
+ "type": "object",
721
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
722
+ "properties": {
723
+ "schema": {
724
+ "type": "object",
725
+ "description": "JSON Schema validated against the step output via AJV"
726
+ },
727
+ "equals": {
728
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
729
+ },
730
+ "matches": {
731
+ "type": "string",
732
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
733
+ },
734
+ "contains": {
735
+ "oneOf": [
736
+ {
737
+ "type": "string"
738
+ },
739
+ {
740
+ "type": "array",
741
+ "items": {
742
+ "type": "string"
743
+ }
744
+ }
745
+ ],
746
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
747
+ },
748
+ "on_fail": {
749
+ "type": "string",
750
+ "enum": [
751
+ "halt",
752
+ "warn"
753
+ ],
754
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
755
+ }
756
+ }
757
+ },
758
+ "tool": {
759
+ "type": "string",
760
+ "not": {
761
+ "enum": []
762
+ }
463
763
  },
464
764
  "into": {
465
765
  "type": "string"
466
766
  }
467
767
  }
468
- }
469
- }
470
- },
471
- {
472
- "type": "object",
473
- "required": [
474
- "tool"
475
- ],
476
- "properties": {
477
- "id": {
478
- "type": "string",
479
- "description": "Unique chained step identifier used for outputs and dependencies"
480
768
  },
481
- "awaits": {
482
- "type": "array",
483
- "description": "Step IDs that must complete before this step runs",
484
- "items": {
485
- "type": "string"
486
- }
487
- },
488
- "when": {
489
- "type": "string",
490
- "description": "Template condition that controls whether this step runs"
491
- },
492
- "optional": {
493
- "type": "boolean",
494
- "description": "Whether step failure should be tolerated"
495
- },
496
- "risk": {
497
- "type": "string",
498
- "enum": [
499
- "low",
500
- "medium",
501
- "high"
769
+ {
770
+ "type": "object",
771
+ "anyOf": [
772
+ {
773
+ "required": [
774
+ "recipe"
775
+ ]
776
+ },
777
+ {
778
+ "required": [
779
+ "chain"
780
+ ]
781
+ }
502
782
  ],
503
- "description": "Risk level for this step"
504
- },
505
- "transform": {
506
- "type": "string",
507
- "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
508
- },
509
- "retry": {
510
- "type": "number",
511
- "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
512
- },
513
- "retryDelay": {
514
- "type": "number",
515
- "description": "Milliseconds to wait between retries (default 1000)"
516
- },
517
- "tool": {
518
- "type": "string",
519
- "not": {
520
- "enum": []
783
+ "properties": {
784
+ "id": {
785
+ "type": "string",
786
+ "description": "Unique chained step identifier used for outputs and dependencies"
787
+ },
788
+ "awaits": {
789
+ "type": "array",
790
+ "description": "Step IDs that must complete before this step runs",
791
+ "items": {
792
+ "type": "string"
793
+ }
794
+ },
795
+ "when": {
796
+ "type": "string",
797
+ "description": "Template condition that controls whether this step runs"
798
+ },
799
+ "optional": {
800
+ "type": "boolean",
801
+ "description": "Whether step failure should be tolerated"
802
+ },
803
+ "risk": {
804
+ "type": "string",
805
+ "enum": [
806
+ "low",
807
+ "medium",
808
+ "high"
809
+ ],
810
+ "description": "Risk level for this step"
811
+ },
812
+ "transform": {
813
+ "type": "string",
814
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
815
+ },
816
+ "retry": {
817
+ "type": "number",
818
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
819
+ },
820
+ "retryDelay": {
821
+ "type": "number",
822
+ "description": "Milliseconds to wait between retries (default 1000)"
823
+ },
824
+ "timeout_ms": {
825
+ "type": "number",
826
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
827
+ },
828
+ "expect": {
829
+ "type": "object",
830
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
831
+ "properties": {
832
+ "schema": {
833
+ "type": "object",
834
+ "description": "JSON Schema validated against the step output via AJV"
835
+ },
836
+ "equals": {
837
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
838
+ },
839
+ "matches": {
840
+ "type": "string",
841
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
842
+ },
843
+ "contains": {
844
+ "oneOf": [
845
+ {
846
+ "type": "string"
847
+ },
848
+ {
849
+ "type": "array",
850
+ "items": {
851
+ "type": "string"
852
+ }
853
+ }
854
+ ],
855
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
856
+ },
857
+ "on_fail": {
858
+ "type": "string",
859
+ "enum": [
860
+ "halt",
861
+ "warn"
862
+ ],
863
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
864
+ }
865
+ }
866
+ },
867
+ "recipe": {
868
+ "type": "string",
869
+ "description": "Nested recipe name or path"
870
+ },
871
+ "chain": {
872
+ "type": "string",
873
+ "description": "Alias for nested recipe name or path"
874
+ },
875
+ "vars": {
876
+ "type": "object",
877
+ "description": "Template variables passed into a nested recipe step",
878
+ "additionalProperties": {
879
+ "type": "string"
880
+ }
881
+ },
882
+ "output": {
883
+ "type": "string",
884
+ "description": "Output key for the nested recipe result"
885
+ }
521
886
  }
522
- },
523
- "into": {
524
- "type": "string"
525
887
  }
526
- }
527
- },
528
- {
529
- "type": "object",
530
- "anyOf": [
531
- {
532
- "required": [
533
- "recipe"
534
- ]
535
- },
536
- {
537
- "required": [
538
- "chain"
888
+ ]
889
+ }
890
+ },
891
+ {
892
+ "type": "object",
893
+ "description": "Map-reduce form — iterate over a collection and run steps once per item.",
894
+ "required": [
895
+ "each",
896
+ "steps"
897
+ ],
898
+ "properties": {
899
+ "each": {
900
+ "type": "string",
901
+ "description": "Template expression that resolves to an array of items to iterate over (e.g. '{{outputs.list}}')."
902
+ },
903
+ "as": {
904
+ "type": "string",
905
+ "description": "Variable name each item is bound to inside the steps (default: 'item')."
906
+ },
907
+ "steps": {
908
+ "type": "array",
909
+ "description": "Steps to run for each item in the collection.",
910
+ "items": {
911
+ "oneOf": [
912
+ {
913
+ "type": "object",
914
+ "required": [
915
+ "agent"
916
+ ],
917
+ "properties": {
918
+ "id": {
919
+ "type": "string",
920
+ "description": "Unique chained step identifier used for outputs and dependencies"
921
+ },
922
+ "awaits": {
923
+ "type": "array",
924
+ "description": "Step IDs that must complete before this step runs",
925
+ "items": {
926
+ "type": "string"
927
+ }
928
+ },
929
+ "when": {
930
+ "type": "string",
931
+ "description": "Template condition that controls whether this step runs"
932
+ },
933
+ "optional": {
934
+ "type": "boolean",
935
+ "description": "Whether step failure should be tolerated"
936
+ },
937
+ "risk": {
938
+ "type": "string",
939
+ "enum": [
940
+ "low",
941
+ "medium",
942
+ "high"
943
+ ],
944
+ "description": "Risk level for this step"
945
+ },
946
+ "transform": {
947
+ "type": "string",
948
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
949
+ },
950
+ "retry": {
951
+ "type": "number",
952
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
953
+ },
954
+ "retryDelay": {
955
+ "type": "number",
956
+ "description": "Milliseconds to wait between retries (default 1000)"
957
+ },
958
+ "timeout_ms": {
959
+ "type": "number",
960
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
961
+ },
962
+ "expect": {
963
+ "type": "object",
964
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
965
+ "properties": {
966
+ "schema": {
967
+ "type": "object",
968
+ "description": "JSON Schema validated against the step output via AJV"
969
+ },
970
+ "equals": {
971
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
972
+ },
973
+ "matches": {
974
+ "type": "string",
975
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
976
+ },
977
+ "contains": {
978
+ "oneOf": [
979
+ {
980
+ "type": "string"
981
+ },
982
+ {
983
+ "type": "array",
984
+ "items": {
985
+ "type": "string"
986
+ }
987
+ }
988
+ ],
989
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
990
+ },
991
+ "on_fail": {
992
+ "type": "string",
993
+ "enum": [
994
+ "halt",
995
+ "warn"
996
+ ],
997
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
998
+ }
999
+ }
1000
+ },
1001
+ "agent": {
1002
+ "type": "object",
1003
+ "required": [
1004
+ "prompt"
1005
+ ],
1006
+ "description": "Agent step configuration",
1007
+ "properties": {
1008
+ "prompt": {
1009
+ "type": "string"
1010
+ },
1011
+ "model": {
1012
+ "type": "string"
1013
+ },
1014
+ "driver": {
1015
+ "type": "string",
1016
+ "enum": [
1017
+ "claude",
1018
+ "claude-code",
1019
+ "api",
1020
+ "openai",
1021
+ "grok",
1022
+ "gemini",
1023
+ "anthropic"
1024
+ ]
1025
+ },
1026
+ "into": {
1027
+ "type": "string"
1028
+ },
1029
+ "mcpAccess": {
1030
+ "type": "boolean",
1031
+ "description": "When true, grants the agent step access to MCP tools registered on the bridge. Defaults to false for subprocess driver steps."
1032
+ },
1033
+ "kind": {
1034
+ "type": "string",
1035
+ "enum": [
1036
+ "judge"
1037
+ ],
1038
+ "description": "When set to 'judge', the agent step emits a structured verdictReason and stores the verdict in the run log."
1039
+ }
1040
+ }
1041
+ }
1042
+ }
1043
+ },
1044
+ {
1045
+ "type": "object",
1046
+ "required": [
1047
+ "tool"
1048
+ ],
1049
+ "properties": {
1050
+ "id": {
1051
+ "type": "string",
1052
+ "description": "Unique chained step identifier used for outputs and dependencies"
1053
+ },
1054
+ "awaits": {
1055
+ "type": "array",
1056
+ "description": "Step IDs that must complete before this step runs",
1057
+ "items": {
1058
+ "type": "string"
1059
+ }
1060
+ },
1061
+ "when": {
1062
+ "type": "string",
1063
+ "description": "Template condition that controls whether this step runs"
1064
+ },
1065
+ "optional": {
1066
+ "type": "boolean",
1067
+ "description": "Whether step failure should be tolerated"
1068
+ },
1069
+ "risk": {
1070
+ "type": "string",
1071
+ "enum": [
1072
+ "low",
1073
+ "medium",
1074
+ "high"
1075
+ ],
1076
+ "description": "Risk level for this step"
1077
+ },
1078
+ "transform": {
1079
+ "type": "string",
1080
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
1081
+ },
1082
+ "retry": {
1083
+ "type": "number",
1084
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
1085
+ },
1086
+ "retryDelay": {
1087
+ "type": "number",
1088
+ "description": "Milliseconds to wait between retries (default 1000)"
1089
+ },
1090
+ "timeout_ms": {
1091
+ "type": "number",
1092
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
1093
+ },
1094
+ "expect": {
1095
+ "type": "object",
1096
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
1097
+ "properties": {
1098
+ "schema": {
1099
+ "type": "object",
1100
+ "description": "JSON Schema validated against the step output via AJV"
1101
+ },
1102
+ "equals": {
1103
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
1104
+ },
1105
+ "matches": {
1106
+ "type": "string",
1107
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
1108
+ },
1109
+ "contains": {
1110
+ "oneOf": [
1111
+ {
1112
+ "type": "string"
1113
+ },
1114
+ {
1115
+ "type": "array",
1116
+ "items": {
1117
+ "type": "string"
1118
+ }
1119
+ }
1120
+ ],
1121
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
1122
+ },
1123
+ "on_fail": {
1124
+ "type": "string",
1125
+ "enum": [
1126
+ "halt",
1127
+ "warn"
1128
+ ],
1129
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
1130
+ }
1131
+ }
1132
+ },
1133
+ "tool": {
1134
+ "type": "string",
1135
+ "not": {
1136
+ "enum": []
1137
+ }
1138
+ },
1139
+ "into": {
1140
+ "type": "string"
1141
+ }
1142
+ }
1143
+ },
1144
+ {
1145
+ "type": "object",
1146
+ "anyOf": [
1147
+ {
1148
+ "required": [
1149
+ "recipe"
1150
+ ]
1151
+ },
1152
+ {
1153
+ "required": [
1154
+ "chain"
1155
+ ]
1156
+ }
1157
+ ],
1158
+ "properties": {
1159
+ "id": {
1160
+ "type": "string",
1161
+ "description": "Unique chained step identifier used for outputs and dependencies"
1162
+ },
1163
+ "awaits": {
1164
+ "type": "array",
1165
+ "description": "Step IDs that must complete before this step runs",
1166
+ "items": {
1167
+ "type": "string"
1168
+ }
1169
+ },
1170
+ "when": {
1171
+ "type": "string",
1172
+ "description": "Template condition that controls whether this step runs"
1173
+ },
1174
+ "optional": {
1175
+ "type": "boolean",
1176
+ "description": "Whether step failure should be tolerated"
1177
+ },
1178
+ "risk": {
1179
+ "type": "string",
1180
+ "enum": [
1181
+ "low",
1182
+ "medium",
1183
+ "high"
1184
+ ],
1185
+ "description": "Risk level for this step"
1186
+ },
1187
+ "transform": {
1188
+ "type": "string",
1189
+ "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
1190
+ },
1191
+ "retry": {
1192
+ "type": "number",
1193
+ "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
1194
+ },
1195
+ "retryDelay": {
1196
+ "type": "number",
1197
+ "description": "Milliseconds to wait between retries (default 1000)"
1198
+ },
1199
+ "timeout_ms": {
1200
+ "type": "number",
1201
+ "description": "Wall-clock timeout in milliseconds. If the step takes longer, the run halts with category step_timeout. Agent steps are not subject to this timeout."
1202
+ },
1203
+ "expect": {
1204
+ "type": "object",
1205
+ "description": "Per-step assertions evaluated against the step output. Multiple fields are AND-composed.",
1206
+ "properties": {
1207
+ "schema": {
1208
+ "type": "object",
1209
+ "description": "JSON Schema validated against the step output via AJV"
1210
+ },
1211
+ "equals": {
1212
+ "description": "Deep-equal comparison. Strings compared verbatim; objects/arrays compared via JSON canonical form."
1213
+ },
1214
+ "matches": {
1215
+ "type": "string",
1216
+ "description": "Regex (string source, no flags) matched against the stringified output. Max 500 chars."
1217
+ },
1218
+ "contains": {
1219
+ "oneOf": [
1220
+ {
1221
+ "type": "string"
1222
+ },
1223
+ {
1224
+ "type": "array",
1225
+ "items": {
1226
+ "type": "string"
1227
+ }
1228
+ }
1229
+ ],
1230
+ "description": "Substring(s) that must appear in the stringified output. Array → all must be present."
1231
+ },
1232
+ "on_fail": {
1233
+ "type": "string",
1234
+ "enum": [
1235
+ "halt",
1236
+ "warn"
1237
+ ],
1238
+ "description": "halt (default): step becomes error on assertion failure. warn: step passes but failure list is attached to stepResult.expectWarnings."
1239
+ }
1240
+ }
1241
+ },
1242
+ "recipe": {
1243
+ "type": "string",
1244
+ "description": "Nested recipe name or path"
1245
+ },
1246
+ "chain": {
1247
+ "type": "string",
1248
+ "description": "Alias for nested recipe name or path"
1249
+ },
1250
+ "vars": {
1251
+ "type": "object",
1252
+ "description": "Template variables passed into a nested recipe step",
1253
+ "additionalProperties": {
1254
+ "type": "string"
1255
+ }
1256
+ },
1257
+ "output": {
1258
+ "type": "string",
1259
+ "description": "Output key for the nested recipe result"
1260
+ }
1261
+ }
1262
+ }
539
1263
  ]
540
1264
  }
541
- ],
542
- "properties": {
543
- "id": {
544
- "type": "string",
545
- "description": "Unique chained step identifier used for outputs and dependencies"
546
- },
547
- "awaits": {
548
- "type": "array",
549
- "description": "Step IDs that must complete before this step runs",
550
- "items": {
551
- "type": "string"
552
- }
553
- },
554
- "when": {
555
- "type": "string",
556
- "description": "Template condition that controls whether this step runs"
557
- },
558
- "optional": {
559
- "type": "boolean",
560
- "description": "Whether step failure should be tolerated"
561
- },
562
- "risk": {
563
- "type": "string",
564
- "enum": [
565
- "low",
566
- "medium",
567
- "high"
568
- ],
569
- "description": "Risk level for this step"
570
- },
571
- "transform": {
572
- "type": "string",
573
- "description": "Template rendered after tool execution. Use $result to reference the tool output. Supports all template expressions."
574
- },
575
- "retry": {
576
- "type": "number",
577
- "description": "Number of times to retry this step on failure (overrides recipe-level on_error.retry)"
578
- },
579
- "retryDelay": {
580
- "type": "number",
581
- "description": "Milliseconds to wait between retries (default 1000)"
582
- },
583
- "recipe": {
584
- "type": "string",
585
- "description": "Nested recipe name or path"
586
- },
587
- "chain": {
588
- "type": "string",
589
- "description": "Alias for nested recipe name or path"
590
- },
591
- "vars": {
592
- "type": "object",
593
- "description": "Template variables passed into a nested recipe step",
594
- "additionalProperties": {
595
- "type": "string"
596
- }
597
- },
598
- "output": {
599
- "type": "string",
600
- "description": "Output key for the nested recipe result"
601
- }
602
1265
  }
603
1266
  }
604
- ]
605
- }
1267
+ }
1268
+ ]
606
1269
  }
607
1270
  }
608
1271
  }
@@ -675,10 +1338,36 @@
675
1338
  },
676
1339
  "notify": {
677
1340
  "type": "boolean",
678
- "description": "Reserved. yamlRunner currently posts Slack notifications on any step failure when slack is connected; gating on this flag is not yet wired.",
1341
+ "description": "When false, suppresses Slack notifications on step failure even when a Slack connector is connected.",
679
1342
  "default": true
680
1343
  }
681
1344
  }
1345
+ },
1346
+ "budget": {
1347
+ "type": "object",
1348
+ "description": "Per-recipe token budget (PR2b). When set, the runner tracks cumulative tokens across API driver calls; on breach the run halts with budget_exceeded. Subscription drivers (Claude CLI) don't report token counts and are skipped.",
1349
+ "properties": {
1350
+ "tokensMax": {
1351
+ "type": "number",
1352
+ "description": "Cumulative input + output tokens allowed across the whole run"
1353
+ },
1354
+ "onBreach": {
1355
+ "type": "string",
1356
+ "enum": [
1357
+ "halt",
1358
+ "warn"
1359
+ ],
1360
+ "description": "halt (default): stop run on next admission check. warn: continue but record the breach in the run log.",
1361
+ "default": "halt"
1362
+ }
1363
+ }
1364
+ },
1365
+ "servers": {
1366
+ "type": "array",
1367
+ "description": "Plugin package specifiers (npm package names or file paths) whose tools are loaded and available to steps in this recipe. Loaded once at run start.",
1368
+ "items": {
1369
+ "type": "string"
1370
+ }
682
1371
  }
683
1372
  }
684
1373
  }