@relayflows/sdk 2.0.9 → 2.0.11

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 (485) hide show
  1. package/dist/adapters/base.d.ts +46 -0
  2. package/dist/adapters/base.d.ts.map +1 -0
  3. package/dist/adapters/base.js +15 -0
  4. package/dist/adapters/base.js.map +1 -0
  5. package/dist/adapters/claude.d.ts +5 -0
  6. package/dist/adapters/claude.d.ts.map +1 -0
  7. package/dist/adapters/claude.js +44 -0
  8. package/dist/adapters/claude.js.map +1 -0
  9. package/dist/adapters/codex.d.ts +5 -0
  10. package/dist/adapters/codex.d.ts.map +1 -0
  11. package/dist/adapters/codex.js +45 -0
  12. package/dist/adapters/codex.js.map +1 -0
  13. package/dist/adapters/index.d.ts +14 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +29 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/wrapper.d.ts +12 -0
  18. package/dist/adapters/wrapper.d.ts.map +1 -0
  19. package/dist/adapters/wrapper.js +31 -0
  20. package/dist/adapters/wrapper.js.map +1 -0
  21. package/dist/agent-relay-receipt.d.ts +24 -0
  22. package/dist/agent-relay-receipt.d.ts.map +1 -0
  23. package/dist/agent-relay-receipt.js +66 -0
  24. package/dist/agent-relay-receipt.js.map +1 -0
  25. package/dist/agent-relay-state.d.ts +18 -0
  26. package/dist/agent-relay-state.d.ts.map +1 -0
  27. package/dist/agent-relay-state.js +58 -0
  28. package/dist/agent-relay-state.js.map +1 -0
  29. package/dist/agent-relay-transport.d.ts +31 -0
  30. package/dist/agent-relay-transport.d.ts.map +1 -0
  31. package/dist/agent-relay-transport.js +199 -0
  32. package/dist/agent-relay-transport.js.map +1 -0
  33. package/dist/authored-budget.d.ts +13 -0
  34. package/dist/authored-budget.d.ts.map +1 -0
  35. package/dist/authored-budget.js +78 -0
  36. package/dist/authored-budget.js.map +1 -0
  37. package/dist/authored-flow-error.d.ts +2 -21
  38. package/dist/authored-flow-error.d.ts.map +1 -1
  39. package/dist/authored-flow-error.js +1 -12
  40. package/dist/authored-flow-error.js.map +1 -1
  41. package/dist/authored-flow-executor.d.ts +13 -7
  42. package/dist/authored-flow-executor.d.ts.map +1 -1
  43. package/dist/authored-flow-executor.js +116 -235
  44. package/dist/authored-flow-executor.js.map +1 -1
  45. package/dist/authored-flow-loader.d.ts +10 -1
  46. package/dist/authored-flow-loader.d.ts.map +1 -1
  47. package/dist/authored-flow-loader.js +56 -3
  48. package/dist/authored-flow-loader.js.map +1 -1
  49. package/dist/authored-flow-operation.d.ts +9 -1
  50. package/dist/authored-flow-operation.d.ts.map +1 -1
  51. package/dist/authored-flow-operation.js +35 -4
  52. package/dist/authored-flow-operation.js.map +1 -1
  53. package/dist/authored-helper-effect.d.ts +12 -0
  54. package/dist/authored-helper-effect.d.ts.map +1 -0
  55. package/dist/authored-helper-effect.js +144 -0
  56. package/dist/authored-helper-effect.js.map +1 -0
  57. package/dist/authored-mcp.d.ts +17 -0
  58. package/dist/authored-mcp.d.ts.map +1 -0
  59. package/dist/authored-mcp.js +171 -0
  60. package/dist/authored-mcp.js.map +1 -0
  61. package/dist/authored-memory.d.ts +7 -0
  62. package/dist/authored-memory.d.ts.map +1 -0
  63. package/dist/authored-memory.js +60 -0
  64. package/dist/authored-memory.js.map +1 -0
  65. package/dist/authored-plugin-effect.d.ts +16 -0
  66. package/dist/authored-plugin-effect.d.ts.map +1 -0
  67. package/dist/authored-plugin-effect.js +163 -0
  68. package/dist/authored-plugin-effect.js.map +1 -0
  69. package/dist/authored-step-output.d.ts +23 -0
  70. package/dist/authored-step-output.d.ts.map +1 -0
  71. package/dist/authored-step-output.js +67 -0
  72. package/dist/authored-step-output.js.map +1 -0
  73. package/dist/authored-worker-step.d.ts +15 -0
  74. package/dist/authored-worker-step.d.ts.map +1 -0
  75. package/dist/authored-worker-step.js +136 -0
  76. package/dist/authored-worker-step.js.map +1 -0
  77. package/dist/budget-preflight.d.ts +5 -0
  78. package/dist/budget-preflight.d.ts.map +1 -0
  79. package/dist/budget-preflight.js +33 -0
  80. package/dist/budget-preflight.js.map +1 -0
  81. package/dist/budget.d.ts +14 -0
  82. package/dist/budget.d.ts.map +1 -0
  83. package/dist/budget.js +52 -0
  84. package/dist/budget.js.map +1 -0
  85. package/dist/bundle-transport.d.ts +18 -0
  86. package/dist/bundle-transport.d.ts.map +1 -0
  87. package/dist/bundle-transport.js +111 -0
  88. package/dist/bundle-transport.js.map +1 -0
  89. package/dist/bundle-typescript.d.ts +8 -0
  90. package/dist/bundle-typescript.d.ts.map +1 -0
  91. package/dist/bundle-typescript.js +108 -0
  92. package/dist/bundle-typescript.js.map +1 -0
  93. package/dist/bundle.d.ts +25 -0
  94. package/dist/bundle.d.ts.map +1 -0
  95. package/dist/bundle.js +199 -0
  96. package/dist/bundle.js.map +1 -0
  97. package/dist/child-stop.d.ts +59 -0
  98. package/dist/child-stop.d.ts.map +1 -0
  99. package/dist/child-stop.js +94 -0
  100. package/dist/child-stop.js.map +1 -0
  101. package/dist/cli/add.d.ts +6 -0
  102. package/dist/cli/add.d.ts.map +1 -0
  103. package/dist/cli/add.js +47 -0
  104. package/dist/cli/add.js.map +1 -0
  105. package/dist/cli/build.d.ts +13 -0
  106. package/dist/cli/build.d.ts.map +1 -0
  107. package/dist/cli/build.js +224 -0
  108. package/dist/cli/build.js.map +1 -0
  109. package/dist/cli/bundle-preflight.d.ts +5 -0
  110. package/dist/cli/bundle-preflight.d.ts.map +1 -0
  111. package/dist/cli/bundle-preflight.js +28 -0
  112. package/dist/cli/bundle-preflight.js.map +1 -0
  113. package/dist/cli/check-helper-body.d.ts +4 -0
  114. package/dist/cli/check-helper-body.d.ts.map +1 -0
  115. package/dist/cli/check-helper-body.js +15 -0
  116. package/dist/cli/check-helper-body.js.map +1 -0
  117. package/dist/cli/check-triggers.d.ts +14 -0
  118. package/dist/cli/check-triggers.d.ts.map +1 -0
  119. package/dist/cli/check-triggers.js +37 -0
  120. package/dist/cli/check-triggers.js.map +1 -0
  121. package/dist/cli/check-typescript.d.ts +20 -0
  122. package/dist/cli/check-typescript.d.ts.map +1 -0
  123. package/dist/cli/check-typescript.js +54 -0
  124. package/dist/cli/check-typescript.js.map +1 -0
  125. package/dist/cli/check.d.ts +36 -3
  126. package/dist/cli/check.d.ts.map +1 -1
  127. package/dist/cli/check.js +122 -11
  128. package/dist/cli/check.js.map +1 -1
  129. package/dist/cli/cloud-run.d.ts +8 -0
  130. package/dist/cli/cloud-run.d.ts.map +1 -0
  131. package/dist/cli/cloud-run.js +50 -0
  132. package/dist/cli/cloud-run.js.map +1 -0
  133. package/dist/cli/deploy.d.ts +9 -0
  134. package/dist/cli/deploy.d.ts.map +1 -0
  135. package/dist/cli/deploy.js +58 -0
  136. package/dist/cli/deploy.js.map +1 -0
  137. package/dist/cli/deterministic-failure.d.ts +5 -0
  138. package/dist/cli/deterministic-failure.d.ts.map +1 -0
  139. package/dist/cli/deterministic-failure.js +66 -0
  140. package/dist/cli/deterministic-failure.js.map +1 -0
  141. package/dist/cli/direct-run.d.ts.map +1 -1
  142. package/dist/cli/direct-run.js +83 -18
  143. package/dist/cli/direct-run.js.map +1 -1
  144. package/dist/cli/hn-monitor.d.ts.map +1 -1
  145. package/dist/cli/hn-monitor.js +2 -1
  146. package/dist/cli/hn-monitor.js.map +1 -1
  147. package/dist/cli/replay.d.ts +12 -0
  148. package/dist/cli/replay.d.ts.map +1 -0
  149. package/dist/cli/replay.js +82 -0
  150. package/dist/cli/replay.js.map +1 -0
  151. package/dist/cli/reuse.d.ts +8 -0
  152. package/dist/cli/reuse.d.ts.map +1 -0
  153. package/dist/cli/reuse.js +25 -0
  154. package/dist/cli/reuse.js.map +1 -0
  155. package/dist/cli/run-digest.d.ts +4 -0
  156. package/dist/cli/run-digest.d.ts.map +1 -0
  157. package/dist/cli/run-digest.js +24 -0
  158. package/dist/cli/run-digest.js.map +1 -0
  159. package/dist/cli/run.d.ts +16 -5
  160. package/dist/cli/run.d.ts.map +1 -1
  161. package/dist/cli/run.js +99 -17
  162. package/dist/cli/run.js.map +1 -1
  163. package/dist/cli/serve-webhook.d.ts +40 -0
  164. package/dist/cli/serve-webhook.d.ts.map +1 -0
  165. package/dist/cli/serve-webhook.js +233 -0
  166. package/dist/cli/serve-webhook.js.map +1 -0
  167. package/dist/cli/tick-runner.d.ts.map +1 -1
  168. package/dist/cli/tick-runner.js +2 -1
  169. package/dist/cli/tick-runner.js.map +1 -1
  170. package/dist/cli-adapter.d.ts +8 -14
  171. package/dist/cli-adapter.d.ts.map +1 -1
  172. package/dist/cli-adapter.js +19 -64
  173. package/dist/cli-adapter.js.map +1 -1
  174. package/dist/cli-watch.d.ts +13 -0
  175. package/dist/cli-watch.d.ts.map +1 -0
  176. package/dist/cli-watch.js +185 -0
  177. package/dist/cli-watch.js.map +1 -0
  178. package/dist/cli.d.ts +4 -0
  179. package/dist/cli.d.ts.map +1 -1
  180. package/dist/cli.js +387 -14
  181. package/dist/cli.js.map +1 -1
  182. package/dist/cloud-http.d.ts +22 -0
  183. package/dist/cloud-http.d.ts.map +1 -0
  184. package/dist/cloud-http.js +84 -0
  185. package/dist/cloud-http.js.map +1 -0
  186. package/dist/cloud-run.d.ts +38 -0
  187. package/dist/cloud-run.d.ts.map +1 -0
  188. package/dist/cloud-run.js +112 -0
  189. package/dist/cloud-run.js.map +1 -0
  190. package/dist/compile.d.ts +21 -3
  191. package/dist/compile.d.ts.map +1 -1
  192. package/dist/compile.js +97 -23
  193. package/dist/compile.js.map +1 -1
  194. package/dist/create-flow.d.ts +17 -0
  195. package/dist/create-flow.d.ts.map +1 -0
  196. package/dist/create-flow.js +72 -0
  197. package/dist/create-flow.js.map +1 -0
  198. package/dist/daemon-connection.d.ts +14 -0
  199. package/dist/daemon-connection.d.ts.map +1 -1
  200. package/dist/daemon-connection.js +33 -1
  201. package/dist/daemon-connection.js.map +1 -1
  202. package/dist/demo-hn-monitor.js +2 -1
  203. package/dist/demo-hn-monitor.js.map +1 -1
  204. package/dist/effect-channel.d.ts +30 -0
  205. package/dist/effect-channel.d.ts.map +1 -0
  206. package/dist/effect-channel.js +71 -0
  207. package/dist/effect-channel.js.map +1 -0
  208. package/dist/failure-kinds.d.ts +14 -3
  209. package/dist/failure-kinds.d.ts.map +1 -1
  210. package/dist/failure-kinds.js +27 -0
  211. package/dist/failure-kinds.js.map +1 -1
  212. package/dist/gate-contract.d.ts.map +1 -1
  213. package/dist/gate-contract.js +9 -0
  214. package/dist/gate-contract.js.map +1 -1
  215. package/dist/helper-preflight.d.ts +18 -0
  216. package/dist/helper-preflight.d.ts.map +1 -0
  217. package/dist/helper-preflight.js +32 -0
  218. package/dist/helper-preflight.js.map +1 -0
  219. package/dist/helper-storage.d.ts +5 -0
  220. package/dist/helper-storage.d.ts.map +1 -0
  221. package/dist/helper-storage.js +31 -0
  222. package/dist/helper-storage.js.map +1 -0
  223. package/dist/helper-writeback.d.ts +12 -0
  224. package/dist/helper-writeback.d.ts.map +1 -0
  225. package/dist/helper-writeback.js +95 -0
  226. package/dist/helper-writeback.js.map +1 -0
  227. package/dist/index.d.ts +10 -2
  228. package/dist/index.d.ts.map +1 -1
  229. package/dist/index.js +7 -1
  230. package/dist/index.js.map +1 -1
  231. package/dist/input-binding.d.ts +4 -0
  232. package/dist/input-binding.d.ts.map +1 -0
  233. package/dist/input-binding.js +78 -0
  234. package/dist/input-binding.js.map +1 -0
  235. package/dist/journal-client.d.ts +12 -4
  236. package/dist/journal-client.d.ts.map +1 -1
  237. package/dist/journal-client.js +17 -6
  238. package/dist/journal-client.js.map +1 -1
  239. package/dist/journal-offset.d.ts +3 -0
  240. package/dist/journal-offset.d.ts.map +1 -0
  241. package/dist/journal-offset.js +69 -0
  242. package/dist/journal-offset.js.map +1 -0
  243. package/dist/journal-reader.d.ts +30 -0
  244. package/dist/journal-reader.d.ts.map +1 -0
  245. package/dist/journal-reader.js +156 -0
  246. package/dist/journal-reader.js.map +1 -0
  247. package/dist/json-schema.d.ts +2 -0
  248. package/dist/json-schema.d.ts.map +1 -1
  249. package/dist/json-schema.js +38 -22
  250. package/dist/json-schema.js.map +1 -1
  251. package/dist/llm-worker.d.ts +16 -0
  252. package/dist/llm-worker.d.ts.map +1 -0
  253. package/dist/llm-worker.js +79 -0
  254. package/dist/llm-worker.js.map +1 -0
  255. package/dist/local-agent.d.ts +8 -0
  256. package/dist/local-agent.d.ts.map +1 -0
  257. package/dist/local-agent.js +25 -0
  258. package/dist/local-agent.js.map +1 -0
  259. package/dist/mcp-client.d.ts +15 -0
  260. package/dist/mcp-client.d.ts.map +1 -0
  261. package/dist/mcp-client.js +104 -0
  262. package/dist/mcp-client.js.map +1 -0
  263. package/dist/mcp-config.d.ts +4 -0
  264. package/dist/mcp-config.d.ts.map +1 -0
  265. package/dist/mcp-config.js +61 -0
  266. package/dist/mcp-config.js.map +1 -0
  267. package/dist/mcp-stdio.d.ts +24 -0
  268. package/dist/mcp-stdio.d.ts.map +1 -0
  269. package/dist/mcp-stdio.js +89 -0
  270. package/dist/mcp-stdio.js.map +1 -0
  271. package/dist/model-pricing.d.ts +22 -0
  272. package/dist/model-pricing.d.ts.map +1 -0
  273. package/dist/model-pricing.js +30 -0
  274. package/dist/model-pricing.js.map +1 -0
  275. package/dist/mount-registry.d.ts +9 -0
  276. package/dist/mount-registry.d.ts.map +1 -0
  277. package/dist/mount-registry.js +47 -0
  278. package/dist/mount-registry.js.map +1 -0
  279. package/dist/named-gate-lowering.d.ts +9 -0
  280. package/dist/named-gate-lowering.d.ts.map +1 -0
  281. package/dist/named-gate-lowering.js +152 -0
  282. package/dist/named-gate-lowering.js.map +1 -0
  283. package/dist/named-gates.d.ts +10 -0
  284. package/dist/named-gates.d.ts.map +1 -0
  285. package/dist/named-gates.js +69 -0
  286. package/dist/named-gates.js.map +1 -0
  287. package/dist/observer-link.d.ts +129 -0
  288. package/dist/observer-link.d.ts.map +1 -0
  289. package/dist/observer-link.js +274 -0
  290. package/dist/observer-link.js.map +1 -0
  291. package/dist/plugin-loader.d.ts +13 -0
  292. package/dist/plugin-loader.d.ts.map +1 -0
  293. package/dist/plugin-loader.js +110 -0
  294. package/dist/plugin-loader.js.map +1 -0
  295. package/dist/plugin-manifest.d.ts +27 -0
  296. package/dist/plugin-manifest.d.ts.map +1 -0
  297. package/dist/plugin-manifest.js +89 -0
  298. package/dist/plugin-manifest.js.map +1 -0
  299. package/dist/preflight.d.ts +26 -2
  300. package/dist/preflight.d.ts.map +1 -1
  301. package/dist/preflight.js +175 -1
  302. package/dist/preflight.js.map +1 -1
  303. package/dist/progress.d.ts +14 -0
  304. package/dist/progress.d.ts.map +1 -0
  305. package/dist/progress.js +39 -0
  306. package/dist/progress.js.map +1 -0
  307. package/dist/protocol.d.ts +11 -0
  308. package/dist/protocol.d.ts.map +1 -1
  309. package/dist/pty-sidechannel.d.ts +14 -0
  310. package/dist/pty-sidechannel.d.ts.map +1 -0
  311. package/dist/pty-sidechannel.js +103 -0
  312. package/dist/pty-sidechannel.js.map +1 -0
  313. package/dist/scope-compiler.d.ts +52 -0
  314. package/dist/scope-compiler.d.ts.map +1 -0
  315. package/dist/scope-compiler.js +62 -0
  316. package/dist/scope-compiler.js.map +1 -0
  317. package/dist/slack-preflight.d.ts +6 -0
  318. package/dist/slack-preflight.d.ts.map +1 -0
  319. package/dist/slack-preflight.js +28 -0
  320. package/dist/slack-preflight.js.map +1 -0
  321. package/dist/slack-writeback.d.ts +40 -0
  322. package/dist/slack-writeback.d.ts.map +1 -0
  323. package/dist/slack-writeback.js +60 -0
  324. package/dist/slack-writeback.js.map +1 -0
  325. package/dist/spec.d.ts +134 -4
  326. package/dist/spec.d.ts.map +1 -1
  327. package/dist/spec.js.map +1 -1
  328. package/dist/step-dependencies.d.ts.map +1 -1
  329. package/dist/step-dependencies.js +2 -1
  330. package/dist/step-dependencies.js.map +1 -1
  331. package/dist/step-fields.d.ts +4 -4
  332. package/dist/step-fields.d.ts.map +1 -1
  333. package/dist/step-fields.js +5 -2
  334. package/dist/step-fields.js.map +1 -1
  335. package/dist/trigger-executor.d.ts +7 -0
  336. package/dist/trigger-executor.d.ts.map +1 -0
  337. package/dist/trigger-executor.js +35 -0
  338. package/dist/trigger-executor.js.map +1 -0
  339. package/dist/validate.d.ts.map +1 -1
  340. package/dist/validate.js +53 -6
  341. package/dist/validate.js.map +1 -1
  342. package/dist/webhook-rate-limit.d.ts +29 -0
  343. package/dist/webhook-rate-limit.d.ts.map +1 -0
  344. package/dist/webhook-rate-limit.js +38 -0
  345. package/dist/webhook-rate-limit.js.map +1 -0
  346. package/dist/webhook-signature.d.ts +22 -0
  347. package/dist/webhook-signature.d.ts.map +1 -0
  348. package/dist/webhook-signature.js +53 -0
  349. package/dist/webhook-signature.js.map +1 -0
  350. package/dist/worker-cli.d.ts +16 -1
  351. package/dist/worker-cli.d.ts.map +1 -1
  352. package/dist/worker-cli.js +129 -12
  353. package/dist/worker-cli.js.map +1 -1
  354. package/dist/worker-input.d.ts +4 -0
  355. package/dist/worker-input.d.ts.map +1 -0
  356. package/dist/worker-input.js +14 -0
  357. package/dist/worker-input.js.map +1 -0
  358. package/dist/worker-lease.d.ts +5 -0
  359. package/dist/worker-lease.d.ts.map +1 -0
  360. package/dist/worker-lease.js +80 -0
  361. package/dist/worker-lease.js.map +1 -0
  362. package/dist/worker-spend.d.ts +19 -0
  363. package/dist/worker-spend.d.ts.map +1 -0
  364. package/dist/worker-spend.js +22 -0
  365. package/dist/worker-spend.js.map +1 -0
  366. package/dist/worker-usage.d.ts +7 -0
  367. package/dist/worker-usage.d.ts.map +1 -0
  368. package/dist/worker-usage.js +54 -0
  369. package/dist/worker-usage.js.map +1 -0
  370. package/dist/worker.d.ts +2 -0
  371. package/dist/worker.d.ts.map +1 -1
  372. package/dist/worker.js +29 -9
  373. package/dist/worker.js.map +1 -1
  374. package/dist/wrapper-session.d.ts +1 -1
  375. package/dist/wrapper-session.d.ts.map +1 -1
  376. package/dist/wrapper-session.js +56 -19
  377. package/dist/wrapper-session.js.map +1 -1
  378. package/dist/yaml-helper-effect.d.ts +8 -0
  379. package/dist/yaml-helper-effect.d.ts.map +1 -0
  380. package/dist/yaml-helper-effect.js +79 -0
  381. package/dist/yaml-helper-effect.js.map +1 -0
  382. package/dist/yaml-helpers.d.ts +18 -0
  383. package/dist/yaml-helpers.d.ts.map +1 -0
  384. package/dist/yaml-helpers.js +116 -0
  385. package/dist/yaml-helpers.js.map +1 -0
  386. package/package.json +19 -2
  387. package/src/adapters/base.ts +53 -0
  388. package/src/adapters/claude.ts +55 -0
  389. package/src/adapters/codex.ts +56 -0
  390. package/src/adapters/index.ts +36 -0
  391. package/src/adapters/wrapper.ts +42 -0
  392. package/src/agent-relay-receipt.ts +120 -0
  393. package/src/agent-relay-state.ts +73 -0
  394. package/src/agent-relay-transport.ts +273 -0
  395. package/src/authored-budget.ts +69 -0
  396. package/src/authored-flow-error.ts +10 -10
  397. package/src/authored-flow-executor.ts +171 -347
  398. package/src/authored-flow-loader.ts +60 -3
  399. package/src/authored-flow-operation.ts +38 -5
  400. package/src/authored-helper-effect.ts +143 -0
  401. package/src/authored-mcp.ts +166 -0
  402. package/src/authored-memory.ts +55 -0
  403. package/src/authored-plugin-effect.ts +152 -0
  404. package/src/authored-step-output.ts +107 -0
  405. package/src/authored-worker-step.ts +181 -0
  406. package/src/budget-preflight.ts +31 -0
  407. package/src/budget.ts +49 -0
  408. package/src/bundle-transport.ts +79 -0
  409. package/src/bundle-typescript.ts +98 -0
  410. package/src/bundle.ts +182 -0
  411. package/src/child-stop.ts +138 -0
  412. package/src/cli/add.ts +45 -0
  413. package/src/cli/build.ts +214 -0
  414. package/src/cli/bundle-preflight.ts +28 -0
  415. package/src/cli/check-helper-body.ts +14 -0
  416. package/src/cli/check-triggers.ts +41 -0
  417. package/src/cli/check-typescript.ts +63 -0
  418. package/src/cli/check.ts +132 -14
  419. package/src/cli/cloud-run.ts +47 -0
  420. package/src/cli/deploy.ts +52 -0
  421. package/src/cli/deterministic-failure.ts +69 -0
  422. package/src/cli/direct-run.ts +79 -18
  423. package/src/cli/hn-monitor.ts +2 -1
  424. package/src/cli/replay.ts +81 -0
  425. package/src/cli/reuse.ts +23 -0
  426. package/src/cli/run-digest.ts +24 -0
  427. package/src/cli/run.ts +104 -21
  428. package/src/cli/serve-webhook.ts +246 -0
  429. package/src/cli/tick-runner.ts +2 -1
  430. package/src/cli-adapter.ts +31 -74
  431. package/src/cli-watch.ts +174 -0
  432. package/src/cli.ts +396 -17
  433. package/src/cloud-http.ts +100 -0
  434. package/src/cloud-run.ts +137 -0
  435. package/src/compile.ts +102 -23
  436. package/src/create-flow.ts +82 -0
  437. package/src/daemon-connection.ts +32 -1
  438. package/src/demo-hn-monitor.ts +2 -1
  439. package/src/effect-channel.ts +97 -0
  440. package/src/failure-kinds.ts +38 -0
  441. package/src/gate-contract.ts +7 -0
  442. package/src/helper-preflight.ts +34 -0
  443. package/src/helper-storage.ts +23 -0
  444. package/src/helper-writeback.ts +83 -0
  445. package/src/index.ts +26 -0
  446. package/src/input-binding.ts +76 -0
  447. package/src/journal-client.ts +20 -7
  448. package/src/journal-offset.ts +60 -0
  449. package/src/journal-reader.ts +165 -0
  450. package/src/json-schema.ts +34 -18
  451. package/src/llm-worker.ts +82 -0
  452. package/src/local-agent.ts +30 -0
  453. package/src/mcp-client.ts +97 -0
  454. package/src/mcp-config.ts +42 -0
  455. package/src/mcp-stdio.ts +84 -0
  456. package/src/model-pricing.ts +32 -0
  457. package/src/mount-registry.ts +44 -0
  458. package/src/named-gate-lowering.ts +147 -0
  459. package/src/named-gates.ts +76 -0
  460. package/src/observer-link.ts +368 -0
  461. package/src/plugin-loader.ts +88 -0
  462. package/src/plugin-manifest.ts +76 -0
  463. package/src/preflight.ts +178 -4
  464. package/src/progress.ts +51 -0
  465. package/src/protocol.ts +12 -0
  466. package/src/pty-sidechannel.ts +92 -0
  467. package/src/scope-compiler.ts +105 -0
  468. package/src/slack-preflight.ts +25 -0
  469. package/src/slack-writeback.ts +63 -0
  470. package/src/spec.ts +112 -4
  471. package/src/step-dependencies.ts +3 -1
  472. package/src/step-fields.ts +5 -2
  473. package/src/trigger-executor.ts +34 -0
  474. package/src/validate.ts +47 -6
  475. package/src/webhook-rate-limit.ts +69 -0
  476. package/src/webhook-signature.ts +74 -0
  477. package/src/worker-cli.ts +150 -11
  478. package/src/worker-input.ts +15 -0
  479. package/src/worker-lease.ts +85 -0
  480. package/src/worker-spend.ts +23 -0
  481. package/src/worker-usage.ts +48 -0
  482. package/src/worker.ts +34 -10
  483. package/src/wrapper-session.ts +50 -15
  484. package/src/yaml-helper-effect.ts +78 -0
  485. package/src/yaml-helpers.ts +131 -0
@@ -0,0 +1,84 @@
1
+ export class CloudFlowError extends Error {
2
+ code;
3
+ status;
4
+ constructor(code, message, status) {
5
+ super(message);
6
+ this.code = code;
7
+ this.status = status;
8
+ this.name = 'CloudFlowError';
9
+ }
10
+ }
11
+ export function cloudConnection(options) {
12
+ const rawToken = options.token ?? process.env['FLOWS_CLOUD_TOKEN'];
13
+ const token = rawToken?.trim();
14
+ if (!token || /[\r\n]/u.test(rawToken) || /^(?:rk|ot)_live_/u.test(token)) {
15
+ throw new CloudFlowError('configuration', 'Set FLOWS_CLOUD_TOKEN to a scoped Cloud API token (workflow:invoke:write and workflow:runs:read).');
16
+ }
17
+ let url;
18
+ try {
19
+ url = new URL(options.apiUrl ?? process.env['FLOWS_CLOUD_URL'] ?? 'https://agentrelay.com/cloud');
20
+ }
21
+ catch {
22
+ throw new CloudFlowError('configuration', 'FLOWS_CLOUD_URL must be an absolute Cloud application base URL.');
23
+ }
24
+ if (url.protocol !== 'https:'
25
+ || url.username || url.password || url.search || url.hash || !/^\/[A-Za-z0-9/_-]*$/u.test(url.pathname)) {
26
+ throw new CloudFlowError('configuration', 'Cloud URL must use HTTPS and a plain base path.');
27
+ }
28
+ return { baseUrl: `${url.origin}${url.pathname.replace(/\/+$/u, '')}`, token };
29
+ }
30
+ export async function cloudRequest(path, options, body) {
31
+ const { baseUrl, token } = cloudConnection(options);
32
+ const timeout = options.requestTimeoutMs ?? 30_000;
33
+ if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 2_147_483_647) {
34
+ throw new CloudFlowError('configuration', 'requestTimeoutMs must be a positive 32-bit integer.');
35
+ }
36
+ const deadline = AbortSignal.timeout(timeout);
37
+ let response;
38
+ try {
39
+ response = await fetch(`${baseUrl}${path}`, {
40
+ method: body === undefined ? 'GET' : 'POST',
41
+ headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json' },
42
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
43
+ signal: options.signal ? AbortSignal.any([options.signal, deadline]) : deadline,
44
+ // A redirect must never carry the credential to a different origin.
45
+ redirect: 'error',
46
+ });
47
+ }
48
+ catch (error) {
49
+ options.signal?.throwIfAborted();
50
+ throw transportError(deadline.aborted ? deadline.reason : error);
51
+ }
52
+ if (!response.ok) {
53
+ // Do not echo server response bodies: they may contain credentials or source.
54
+ throw new CloudFlowError('http_error', `Cloud request failed with HTTP ${response.status}.`, response.status);
55
+ }
56
+ try {
57
+ return await response.json();
58
+ }
59
+ catch (error) {
60
+ options.signal?.throwIfAborted();
61
+ if (!(error instanceof SyntaxError))
62
+ throw transportError(deadline.aborted ? deadline.reason : error);
63
+ throw new CloudFlowError('invalid_response', 'Cloud returned a non-JSON response.');
64
+ }
65
+ }
66
+ // Defensive path-segment constraint; accepting a new server ID format needs an SDK change.
67
+ export function cloudRunId(value) {
68
+ if (typeof value !== 'string' || !/^[A-Za-z0-9_-]{1,128}$/u.test(value)) {
69
+ throw new CloudFlowError('invalid_response', 'Cloud run ID must contain only letters, digits, underscores, or hyphens.');
70
+ }
71
+ return value;
72
+ }
73
+ export function isCloudRecord(value) {
74
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
75
+ }
76
+ function transportError(error) {
77
+ const cause = error instanceof Error ? error.cause : undefined;
78
+ const code = isCloudRecord(cause) ? cause.code : undefined;
79
+ const transient = (error instanceof Error && error.name === 'TimeoutError')
80
+ || ['ECONNRESET', 'ECONNREFUSED', 'EAI_AGAIN', 'ETIMEDOUT',
81
+ 'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_HEADERS_TIMEOUT', 'UND_ERR_BODY_TIMEOUT', 'UND_ERR_SOCKET'].includes(String(code));
82
+ return new CloudFlowError(transient ? 'transient_error' : 'transport_error', transient ? 'Cloud transport temporarily unavailable.' : 'Cloud transport failed; check TLS and the configured URL (redirects are refused).');
83
+ }
84
+ //# sourceMappingURL=cloud-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-http.js","sourceRoot":"","sources":["../src/cloud-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { RunCompletionReason } from './protocol.js';
2
+ import type { FlowSpec } from './spec.js';
3
+ import { type CloudConnectionOptions } from './cloud-http.js';
4
+ export type CloudFlowSource = FlowSpec | {
5
+ path: string;
6
+ };
7
+ export interface RunInCloudOptions extends CloudConnectionOptions {
8
+ /** Existing Cloud workspace to run in; provisioning/authorization remains server-side. */
9
+ workspaceId?: string;
10
+ }
11
+ export interface CloudRunReceipt {
12
+ runId: string;
13
+ status: 'pending' | 'running';
14
+ /** Local correlation hash of the compiled spec; NOT server attestation or a sealed bundle digest. */
15
+ specHash: string;
16
+ /** Authenticated run API resource; this is not a public sharing URL. */
17
+ apiUrl: string;
18
+ }
19
+ export type CloudRunState = {
20
+ runId: string;
21
+ status: 'pending' | 'running';
22
+ } | {
23
+ runId: string;
24
+ status: 'completed' | 'failed' | 'cancelled';
25
+ completionReason: RunCompletionReason;
26
+ };
27
+ /**
28
+ * Submit a declarative flow to Cloud's pinned v2 runtime. Compilation only
29
+ * happens here; Cloud owns provisioning and the Rust engine owns execution.
30
+ * Returns acceptance, not completion. No local daemon, CLI probe, or node up.
31
+ */
32
+ export declare function runInCloud(flow: CloudFlowSource, options?: RunInCloudOptions): Promise<CloudRunReceipt>;
33
+ export declare function getCloudFlowRun(runId: string, options?: CloudConnectionOptions): Promise<CloudRunState>;
34
+ /** Wait without a fixed execution deadline. Abort stops observation, not the hosted run. */
35
+ export declare function waitForCloudFlowRun(runId: string, options?: CloudConnectionOptions & {
36
+ pollIntervalMs?: number;
37
+ }): Promise<CloudRunState>;
38
+ //# sourceMappingURL=cloud-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-run.d.ts","sourceRoot":"","sources":["../src/cloud-run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAMzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC/D,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,MAAM,aAAa,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,GAChD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAAC,gBAAgB,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAE3G;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,aAAa,CAAC,CAkBxB;AAED,4FAA4F;AAC5F,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAAsB,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
@@ -0,0 +1,112 @@
1
+ import { RUN_COMPLETION_REASONS } from '@relayflows/surface';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { setTimeout } from 'node:timers/promises';
4
+ import { parse as parseYaml } from 'yaml';
5
+ import { canonicalize, specHash } from './canonical.js';
6
+ import { CompileError, compileSpec, kernelToAuthoring, toKernelSpec } from './compile.js';
7
+ import { CloudFlowError, cloudConnection, cloudRequest, cloudRunId, isCloudRecord, } from './cloud-http.js';
8
+ /**
9
+ * Submit a declarative flow to Cloud's pinned v2 runtime. Compilation only
10
+ * happens here; Cloud owns provisioning and the Rust engine owns execution.
11
+ * Returns acceptance, not completion. No local daemon, CLI probe, or node up.
12
+ */
13
+ export async function runInCloud(flow, options = {}) {
14
+ const { baseUrl } = cloudConnection(options);
15
+ let spec;
16
+ try {
17
+ options.signal?.throwIfAborted();
18
+ if ('path' in flow) {
19
+ if (!/\.(?:ya?ml|json)$/iu.test(flow.path)) {
20
+ throw new CloudFlowError('unsupported_source', 'Cloud v2 currently accepts declarative YAML or JSON specs; authored TypeScript flows are not supported by the hosted runtime.');
21
+ }
22
+ const parsed = parseYaml(await readFile(flow.path, 'utf8'));
23
+ try {
24
+ spec = compileSpec(parsed);
25
+ }
26
+ catch (error) {
27
+ if (!(error instanceof CompileError))
28
+ throw error;
29
+ // Prefer the authoring dialect; accept compiled kernel JSON for local-CLI
30
+ // compatibility. If both fail, retain the original authoring diagnostic.
31
+ try {
32
+ spec = compileSpec(kernelToAuthoring(parsed));
33
+ }
34
+ catch {
35
+ throw error;
36
+ }
37
+ }
38
+ }
39
+ else {
40
+ spec = compileSpec(flow);
41
+ }
42
+ }
43
+ catch (error) {
44
+ options.signal?.throwIfAborted();
45
+ if (error instanceof CloudFlowError)
46
+ throw error;
47
+ throw new CloudFlowError('invalid_input', 'Cannot read or compile the declarative flow. Check the file path and YAML/JSON spec.');
48
+ }
49
+ options.signal?.throwIfAborted();
50
+ const hash = specHash(toKernelSpec(spec));
51
+ const result = await cloudRequest('/api/v1/workflows/run', options, {
52
+ // JSON is a YAML subset. Sending canonical data preserves the exact spec
53
+ // while using the server's existing YAML-to-config admission path.
54
+ workflow: canonicalize(spec),
55
+ fileType: 'yaml',
56
+ relayflowVersion: 'v2',
57
+ ...(options.workspaceId === undefined ? {} : { workspaceId: options.workspaceId }),
58
+ });
59
+ if (!isCloudRecord(result) || (result.status !== 'pending' && result.status !== 'running')) {
60
+ throw new CloudFlowError('invalid_response', 'Cloud did not return an accepted run.');
61
+ }
62
+ const runId = cloudRunId(result.runId);
63
+ return { runId, status: result.status, specHash: hash, apiUrl: `${baseUrl}/api/v1/workflows/runs/${runId}` };
64
+ }
65
+ export async function getCloudFlowRun(runId, options = {}) {
66
+ cloudRunId(runId);
67
+ const result = await cloudRequest(`/api/v1/workflows/runs/${runId}`, options);
68
+ if (!isCloudRecord(result) || result.runId !== runId || result.relayflowVersion !== 'v2'
69
+ || typeof result.status !== 'string'
70
+ || !['pending', 'running', 'completed', 'failed', 'cancelled'].includes(result.status)) {
71
+ throw new CloudFlowError('invalid_response', 'Cloud returned an invalid v2 run record.');
72
+ }
73
+ if (result.status === 'pending' || result.status === 'running')
74
+ return { runId, status: result.status };
75
+ const report = result.result;
76
+ const reason = isCloudRecord(report) ? report.completionReason : undefined;
77
+ if (typeof reason !== 'string' || !RUN_COMPLETION_REASONS.includes(reason)
78
+ || (result.status === 'completed' && (reason !== 'success' || !isCloudRecord(report) || report.ok !== true || report.status !== 'completed'))
79
+ || (result.status === 'failed' && !['step_failed', 'budget_exceeded'].includes(reason))
80
+ || (result.status === 'cancelled' && reason !== 'canceled')) {
81
+ throw new CloudFlowError('invalid_response', 'Cloud terminal record lacks a valid, consistent run completionReason; no execution outcome is attested.');
82
+ }
83
+ return { runId, status: result.status, completionReason: reason };
84
+ }
85
+ /** Wait without a fixed execution deadline. Abort stops observation, not the hosted run. */
86
+ export async function waitForCloudFlowRun(runId, options = {}) {
87
+ const interval = options.pollIntervalMs ?? 2_000;
88
+ if (!Number.isSafeInteger(interval) || interval < 1 || interval > 60_000) {
89
+ throw new CloudFlowError('configuration', 'pollIntervalMs must be an integer from 1 to 60000.');
90
+ }
91
+ let failures = 0;
92
+ for (;;) {
93
+ options.signal?.throwIfAborted();
94
+ try {
95
+ const run = await getCloudFlowRun(runId, options);
96
+ failures = 0;
97
+ if (run.status !== 'pending' && run.status !== 'running')
98
+ return run;
99
+ }
100
+ catch (error) {
101
+ options.signal?.throwIfAborted();
102
+ const transient = error instanceof CloudFlowError && (error.code === 'transient_error'
103
+ || (error.code === 'http_error' && [408, 429, 500, 502, 503, 504].includes(error.status ?? 0)));
104
+ if (!transient)
105
+ throw error;
106
+ // Only safe GET observation retries. Delay caps at 30s; no overall run deadline.
107
+ failures = Math.min(failures + 1, 16);
108
+ }
109
+ await setTimeout(failures ? Math.min(interval * 2 ** (failures - 1), 30_000) : interval, undefined, { signal: options.signal });
110
+ }
111
+ }
112
+ //# sourceMappingURL=cloud-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-run.js","sourceRoot":"","sources":["../src/cloud-run.ts"],"names":[],"mappings":"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"}
package/dist/compile.d.ts CHANGED
@@ -3,20 +3,38 @@ import { SPEC_SCHEMA_VERSION } from './spec.js';
3
3
  import { canonicalize, specHash } from './canonical.js';
4
4
  export declare class CompileError extends Error {
5
5
  readonly errors: string[];
6
- constructor(errors: string[]);
6
+ /** Optional diagnostic kind for callers that classify refusals (e.g. preflight). */
7
+ readonly kind?: string;
8
+ constructor(errors: string[], kind?: string);
7
9
  }
10
+ /**
11
+ * Parse the f.run timeout before submitting any command to the kernel.
12
+ *
13
+ * Accepts a positive whole-millisecond `number`, or a duration string of the
14
+ * form `<coefficient><unit>` where unit is `ms` / `s` / `m` — matched by an
15
+ * anchored regex that captures the coefficient first (group 1) and the unit
16
+ * second (group 2), so a future edit cannot silently swap them. Fractional
17
+ * coefficients that resolve to integer milliseconds are accepted; the
18
+ * multiplication is rounded to the nearest integer so `1.1s → 1100`
19
+ * survives float-precision (`1.1 * 1000 = 1100.0000000000002`) rather than
20
+ * being rejected by `isSafeInteger`.
21
+ */
22
+ export declare function parseStepTimeout(timeout: unknown): number;
8
23
  /**
9
24
  * Compile a YAML string into a validated authoring `FlowSpec`.
10
25
  * Throws `CompileError` on a YAML parse error or any validation failure.
11
26
  */
12
- export declare function compileYaml(yaml: string): FlowSpec;
27
+ export declare function compileYaml(yaml: string): CompiledFlowSpec;
13
28
  /** Kernel-dialect canonical JSON of `compileYaml` (sorted keys, no whitespace). */
14
29
  export declare function compileYamlToCanonicalJson(yaml: string): string;
15
30
  /**
16
31
  * Validate a parsed spec object and apply authoring defaults, returning a
17
32
  * normalized `FlowSpec`. Throws `CompileError` on validation failure.
18
33
  */
19
- export declare function compileSpec(spec: unknown): FlowSpec;
34
+ export type CompiledFlowSpec = Omit<FlowSpec, 'budget'> & {
35
+ budget?: import('./spec.js').BudgetSpec;
36
+ };
37
+ export declare function compileSpec(spec: unknown): CompiledFlowSpec;
20
38
  /**
21
39
  * Map an authoring `FlowSpec` to the kernel spec dialect — the single shape at
22
40
  * the SDK↔kernel boundary (`kernel/relayflowd-core/src/spec.rs`). Authoring
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAGV,QAAQ,EAER,aAAa,EAYd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAKxD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACd,MAAM,EAAE,MAAM,EAAE;CAK7B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAMlD;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CA8BnD;AAgID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,CA+B1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA8BzD;AA6RD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAIxG;AAED,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAGV,QAAQ,EAER,aAAa,EAYd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAMxD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACX,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM;CAM5C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA4BzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAM1D;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,WAAW,EAAE,UAAU,CAAA;CAAE,CAAC;AAEtG,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAiD3D;AAqID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,CAuB1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA8BzD;AAwSD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAIxG;AAED,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC"}
package/dist/compile.js CHANGED
@@ -14,19 +14,72 @@
14
14
  // proven, not asserted: `tests/spec-parity.test.ts` and the kernel's
15
15
  // `tests/spec_parity.rs` pin both sides to the same `testdata/` fixture.
16
16
  import { parse as parseYaml } from 'yaml';
17
+ import { parseBudget, toKernelBudget } from './budget.js';
18
+ import { bindingDependencies } from './input-binding.js';
19
+ import { namedGateFailure } from './named-gates.js';
20
+ import { lowerNamedGates } from './named-gate-lowering.js';
17
21
  import { SPEC_SCHEMA_VERSION } from './spec.js';
18
22
  import { canonicalize, specHash } from './canonical.js';
19
23
  import { validateOutputDeclaration } from './output-schema.js';
20
24
  import { validateSpec } from './validate.js';
21
25
  import { snapshotJsonValue } from './json-value.js';
26
+ import { expandYamlHelpers } from './yaml-helpers.js';
22
27
  export class CompileError extends Error {
23
28
  errors;
24
- constructor(errors) {
29
+ /** Optional diagnostic kind for callers that classify refusals (e.g. preflight). */
30
+ kind;
31
+ constructor(errors, kind) {
25
32
  super('spec compile failed:\n - ' + errors.join('\n - '));
26
33
  this.name = 'CompileError';
27
34
  this.errors = errors;
35
+ if (kind !== undefined)
36
+ this.kind = kind;
28
37
  }
29
38
  }
39
+ /**
40
+ * Parse the f.run timeout before submitting any command to the kernel.
41
+ *
42
+ * Accepts a positive whole-millisecond `number`, or a duration string of the
43
+ * form `<coefficient><unit>` where unit is `ms` / `s` / `m` — matched by an
44
+ * anchored regex that captures the coefficient first (group 1) and the unit
45
+ * second (group 2), so a future edit cannot silently swap them. Fractional
46
+ * coefficients that resolve to integer milliseconds are accepted; the
47
+ * multiplication is rounded to the nearest integer so `1.1s → 1100`
48
+ * survives float-precision (`1.1 * 1000 = 1100.0000000000002`) rather than
49
+ * being rejected by `isSafeInteger`.
50
+ */
51
+ export function parseStepTimeout(timeout) {
52
+ const unitToMs = { ms: 1, s: 1000, m: 60_000 };
53
+ let milliseconds;
54
+ if (typeof timeout === 'number') {
55
+ milliseconds = timeout;
56
+ }
57
+ else if (typeof timeout === 'string') {
58
+ const match = /^(\d+(?:\.\d+)?)(ms|s|m)$/.exec(timeout);
59
+ if (match === null) {
60
+ milliseconds = NaN;
61
+ }
62
+ else {
63
+ const coefficient = Number(match[1]);
64
+ const unit = match[2];
65
+ // Round to defeat float precision (1.1 * 1000 = 1100.0000000000002).
66
+ // Fractional milliseconds themselves (e.g. `1.5ms`) still round to `2`,
67
+ // which the isSafeInteger check below accepts. Sub-ms precision is not
68
+ // a supported unit — authors expressing "1.5ms" get the closest int.
69
+ milliseconds = Math.round(coefficient * unitToMs[unit]);
70
+ }
71
+ }
72
+ else {
73
+ milliseconds = NaN;
74
+ }
75
+ if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {
76
+ throw new CompileError(['f.run timeout must be a positive whole number of milliseconds or a duration such as "10s" or "5m".'], 'timeout_invalid');
77
+ }
78
+ if (milliseconds > 15 * 60_000) {
79
+ throw new CompileError(['f.run timeout exceeds the maximum of 15 minutes declared in SURFACE.md.'], 'lease_exceeded');
80
+ }
81
+ return milliseconds;
82
+ }
30
83
  /**
31
84
  * Compile a YAML string into a validated authoring `FlowSpec`.
32
85
  * Throws `CompileError` on a YAML parse error or any validation failure.
@@ -42,23 +95,34 @@ export function compileYaml(yaml) {
42
95
  export function compileYamlToCanonicalJson(yaml) {
43
96
  return canonicalize(toKernelSpec(compileYaml(yaml)));
44
97
  }
45
- /**
46
- * Validate a parsed spec object and apply authoring defaults, returning a
47
- * normalized `FlowSpec`. Throws `CompileError` on validation failure.
48
- */
49
98
  export function compileSpec(spec) {
50
99
  let snapshot;
51
100
  try {
52
101
  snapshot = snapshotJsonValue(spec, 'spec');
102
+ snapshot = expandYamlHelpers(snapshot);
53
103
  }
54
104
  catch (error) {
55
105
  throw new CompileError([
56
106
  error instanceof Error ? error.message : 'spec: expected JSON-compatible data',
57
107
  ]);
58
108
  }
109
+ if (snapshot !== null && typeof snapshot === 'object' && !Array.isArray(snapshot) && 'budget' in snapshot && snapshot.budget !== undefined) {
110
+ // parseBudget throws BudgetSyntaxError on any malformed header. Without
111
+ // this wrap, that throw escaped compileSpec's own CompileError contract,
112
+ // so callers (validate, cli/check) that only catch CompileError would
113
+ // surface the budget error as an uncaught exception instead of a
114
+ // diagnostic. Rewrap as CompileError so it flows through the same
115
+ // gate-1 refusal path as every other invalid spec.
116
+ try {
117
+ snapshot = { ...snapshot, budget: parseBudget(snapshot.budget) };
118
+ }
119
+ catch (error) {
120
+ throw new CompileError([`spec.budget: ${error instanceof Error ? error.message : 'budget_syntax_invalid'}`], 'budget_syntax_invalid');
121
+ }
122
+ }
59
123
  const validation = validateSpec(snapshot);
60
124
  if (!validation.ok)
61
- throw new CompileError(validation.errors);
125
+ throw new CompileError(validation.errors, namedGateFailure(validation.errors));
62
126
  const input = snapshot;
63
127
  // Preserve named declarations and selectors through authoring normalization.
64
128
  // They are resolved exactly once at the kernel boundary, after public
@@ -75,6 +139,8 @@ export function compileSpec(spec) {
75
139
  ...(input.triggers?.length ? { triggers: input.triggers } : {}),
76
140
  steps,
77
141
  ...(input.budget !== undefined ? { budget: input.budget } : {}),
142
+ ...(input.workspace !== undefined ? { workspace: input.workspace } : {}),
143
+ ...(input.tools !== undefined ? { tools: input.tools } : {}),
78
144
  };
79
145
  return flow;
80
146
  }
@@ -84,7 +150,9 @@ function compileStep(step) {
84
150
  const base = {
85
151
  id: step.id,
86
152
  type: step.type,
87
- ...(step.dependsOn !== undefined ? { dependsOn: step.dependsOn } : {}),
153
+ ...((step.dependsOn !== undefined || step.input !== undefined)
154
+ ? { dependsOn: step.input === undefined ? step.dependsOn : [...new Set([...(step.dependsOn ?? []), ...bindingDependencies(step.input)])] } : {}),
155
+ ...(step.input !== undefined ? { input: step.input } : {}),
88
156
  maxIterations,
89
157
  ...(step.memory !== undefined ? { memory: step.memory } : {}),
90
158
  ...(step.requirements !== undefined ? { requirements: step.requirements } : {}),
@@ -107,6 +175,7 @@ function compileStep(step) {
107
175
  // #138: `timeoutMs` is deterministic-only — worker-backed verbs own
108
176
  // their dispatch timeout. It must be spread HERE and nowhere in `base`.
109
177
  ...(s.timeoutMs !== undefined ? { timeoutMs: s.timeoutMs } : {}),
178
+ ...(s.lease_ms !== undefined ? { lease_ms: parseStepTimeout(s.lease_ms) } : {}),
110
179
  };
111
180
  }
112
181
  case 'llm': {
@@ -134,6 +203,8 @@ function compileStep(step) {
134
203
  ...(s.agent !== undefined ? { agent: s.agent } : {}),
135
204
  ...(s.cli !== undefined ? { cli: s.cli } : {}),
136
205
  ...(s.model !== undefined ? { model: s.model } : {}),
206
+ ...(s.cwd !== undefined ? { cwd: s.cwd } : {}),
207
+ ...(s.transport !== undefined ? { transport: s.transport } : {}),
137
208
  recoveryMode,
138
209
  ...(s.surfaces !== undefined ? { surfaces: s.surfaces } : {}),
139
210
  ...(s.permissions !== undefined ? { permissions: s.permissions } : {}),
@@ -221,16 +292,8 @@ export function toKernelSpec(flow) {
221
292
  // reverts the other, and `validateSpec` and `flows check` would both still
222
293
  // look correct. See ops/reviews/20260903-pr139-repair-0903.md section 10.
223
294
  ...(compiled.triggers?.length ? { triggers: compiled.triggers.map(toKernelTrigger) } : {}),
224
- steps: compiled.steps.map((step) => toKernelStep(resolveNamedAgent(step, compiled.agents))),
225
- ...(compiled.budget !== undefined
226
- ? {
227
- budget: {
228
- ...(compiled.budget.maxTokensIn !== undefined ? { max_tokens_in: compiled.budget.maxTokensIn } : {}),
229
- ...(compiled.budget.maxTokensOut !== undefined ? { max_tokens_out: compiled.budget.maxTokensOut } : {}),
230
- ...(compiled.budget.maxDollars !== undefined ? { max_dollars: compiled.budget.maxDollars } : {}),
231
- },
232
- }
233
- : {}),
295
+ steps: lowerNamedGates(compiled.steps).map((step) => toKernelStep(resolveNamedAgent(step, compiled.agents))),
296
+ ...(compiled.budget !== undefined ? { budget: toKernelBudget(compiled.budget) } : {}),
234
297
  };
235
298
  }
236
299
  /**
@@ -312,15 +375,15 @@ function kernelTriggerToAuthoring(value, at) {
312
375
  }
313
376
  function kernelStepToAuthoring(value, at) {
314
377
  const unionKeys = [
315
- 'id', 'type', 'depends_on', 'max_iterations', 'retry', 'verification', 'memory', 'requirements',
316
- 'command', 'timeout_ms', 'prompt', 'model', 'cli', 'instruction',
378
+ 'id', 'type', 'depends_on', 'max_iterations', 'retry', 'verification', 'memory', 'requirements', 'input',
379
+ 'command', 'timeout_ms', 'lease_ms', 'prompt', 'model', 'cli', 'instruction',
317
380
  'recovery_mode', 'surfaces', 'permissions',
318
381
  ];
319
382
  const step = requireKernelObject(value, unionKeys, at);
320
383
  const type = step['type'];
321
- const commonKeys = ['id', 'type', 'depends_on', 'max_iterations', 'retry', 'verification', 'memory', 'requirements'];
384
+ const commonKeys = ['id', 'type', 'depends_on', 'max_iterations', 'retry', 'verification', 'memory', 'requirements', 'input'];
322
385
  const typeKeys = type === 'deterministic'
323
- ? ['command', 'timeout_ms']
386
+ ? ['command', 'timeout_ms', 'lease_ms']
324
387
  : type === 'llm'
325
388
  ? ['prompt', 'model', 'cli']
326
389
  : type === 'agent'
@@ -333,6 +396,7 @@ function kernelStepToAuthoring(value, at) {
333
396
  const common = {
334
397
  id: step['id'],
335
398
  type,
399
+ ...(step['input'] !== undefined ? { input: step['input'] } : {}),
336
400
  ...(step['requirements'] !== undefined ? { requirements: kernelRequirementsToAuthoring(step['requirements'], `${at}.requirements`) } : {}),
337
401
  ...(dependsOn !== undefined && (!Array.isArray(dependsOn) || dependsOn.length > 0)
338
402
  ? { dependsOn }
@@ -346,6 +410,7 @@ function kernelStepToAuthoring(value, at) {
346
410
  ...common,
347
411
  command: step['command'],
348
412
  ...(step['timeout_ms'] !== undefined ? { timeoutMs: step['timeout_ms'] } : {}),
413
+ ...(step['lease_ms'] !== undefined ? { lease_ms: step['lease_ms'] } : {}),
349
414
  };
350
415
  }
351
416
  if (type === 'llm') {
@@ -399,8 +464,12 @@ function kernelMemoryToAuthoring(value, at) {
399
464
  };
400
465
  }
401
466
  function kernelBudgetToAuthoring(value, at) {
402
- const budget = requireKernelObject(value, ['max_tokens_in', 'max_tokens_out', 'max_dollars'], at);
467
+ const budget = requireKernelObject(value, ['max_tokens_in', 'max_tokens_out', 'max_dollars', 'max_tokens', 'max_wallclock_ms', 'window', 'pricing'], at);
403
468
  return {
469
+ ...(budget['pricing'] !== undefined ? { pricing: budget['pricing'] } : {}),
470
+ ...(budget['max_tokens'] !== undefined ? { maxTokens: budget['max_tokens'] } : {}),
471
+ ...(budget['max_wallclock_ms'] !== undefined ? { maxWallclockMs: budget['max_wallclock_ms'] } : {}),
472
+ ...(budget['window'] !== undefined ? { window: budget['window'] } : {}),
404
473
  ...(budget['max_tokens_in'] !== undefined ? { maxTokensIn: budget['max_tokens_in'] } : {}),
405
474
  ...(budget['max_tokens_out'] !== undefined ? { maxTokensOut: budget['max_tokens_out'] } : {}),
406
475
  ...(budget['max_dollars'] !== undefined ? { maxDollars: budget['max_dollars'] } : {}),
@@ -443,7 +512,9 @@ function isObject(value) {
443
512
  function toKernelStep(step) {
444
513
  const common = {
445
514
  id: step.id,
446
- depends_on: step.dependsOn ?? [],
515
+ depends_on: step.input === undefined ? step.dependsOn ?? []
516
+ : [...new Set([...(step.dependsOn ?? []), ...bindingDependencies(step.input)])],
517
+ ...(step.input !== undefined ? { input: step.input } : {}),
447
518
  max_iterations: step.maxIterations ?? 1,
448
519
  retry: { ...KERNEL_RETRY_DEFAULTS },
449
520
  verification: toKernelVerification(step),
@@ -468,6 +539,7 @@ function toKernelStep(step) {
468
539
  type: 'deterministic',
469
540
  command: step.command,
470
541
  ...(step.timeoutMs !== undefined ? { timeout_ms: step.timeoutMs } : {}),
542
+ ...(step.lease_ms !== undefined ? { lease_ms: parseStepTimeout(step.lease_ms) } : {}),
471
543
  };
472
544
  case 'llm': {
473
545
  return {
@@ -485,6 +557,8 @@ function toKernelStep(step) {
485
557
  instruction: step.instruction,
486
558
  ...(step.cli !== undefined ? { cli: step.cli } : {}),
487
559
  ...(step.model !== undefined ? { model: step.model } : {}),
560
+ ...(step.cwd !== undefined ? { cwd: step.cwd } : {}),
561
+ ...(step.transport !== undefined ? { transport: step.transport } : {}),
488
562
  recovery_mode: step.recoveryMode ?? 'reset',
489
563
  };
490
564
  const surfaces = {