@oomol-lab/open-flow 0.1.0-beta.73 → 0.1.0-beta.75

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 (444) hide show
  1. package/LICENSE +36 -0
  2. package/NOTICE +7 -0
  3. package/README.md +41 -0
  4. package/dist/browser/{ContentIcon-CUQHjQIw.js → ContentIcon-FCpKiwjp.js} +2 -1
  5. package/dist/browser/{FlowCanvas-Dtf8_cQp.js → FlowCanvas-dzRBnlUT.js} +1 -1
  6. package/dist/browser/{createResourceDialog-BWJkjiOO.js → createResourceDialog-BeYDdUl-.js} +2 -2
  7. package/dist/browser/{dialog-CUy_fwx9.js → dialog-ZtpsFbl4.js} +337 -31
  8. package/dist/browser/{exportSvg-BOoy7-Db.js → exportSvg-DqXw1yf-.js} +2 -2
  9. package/dist/browser/{flowChanges-CgSnSqqP.js → flowChanges-b_5UobFj.js} +586 -87
  10. package/dist/browser/{flowWorkspace-Bf7H-r0t.js → flowWorkspace-ItojZbO4.js} +21162 -20242
  11. package/dist/browser/preview.css +254 -179
  12. package/dist/browser/preview.js +22201 -20625
  13. package/dist/browser/{typeScriptSession-B0hC-C8y.js → typeScriptSession-CSRwWmZm.js} +1 -1
  14. package/dist/browser/ui.css +72 -2
  15. package/dist/browser/workbench.css +254 -179
  16. package/dist/browser/workbench.js +22 -78
  17. package/dist/browser/{workbenchSelect-C3e4J93X.js → workbenchSelect-M441Lz0d.js} +1 -1
  18. package/dist/command/index.js +42 -42
  19. package/dist/common/authoring.d.ts +5 -5
  20. package/dist/common/authoringExamples.d.ts +3 -2
  21. package/dist/common/authoringFields.d.ts +1 -1
  22. package/dist/common/authoringSchema.d.ts +95 -8
  23. package/dist/common/connector-proxy.d.ts +1 -1
  24. package/dist/common/control-api-conformance.d.ts +1 -1
  25. package/dist/common/control-api-conformance.js +119 -31
  26. package/dist/common/control-api.d.ts +4 -3
  27. package/dist/common/control-api.js +117 -29
  28. package/dist/common/control-requests.d.ts +5 -4
  29. package/dist/common/control-requests.js +437 -103
  30. package/dist/common/cron-trigger.d.ts +1 -1
  31. package/dist/common/decision.d.ts +1 -1
  32. package/dist/common/draftOperations.d.ts +1 -1
  33. package/dist/common/engine-contract.d.ts +4 -2
  34. package/dist/common/event-source-definition.d.ts +1 -1
  35. package/dist/common/flow-agent.d.ts +1 -1
  36. package/dist/{browser → common}/flow-authoring-node.d.ts +3 -3
  37. package/dist/{browser → common}/flow-authoring.js +131 -30
  38. package/dist/{browser → common}/flow-change-schema.d.ts +177 -6
  39. package/dist/{browser → common}/flow-change.d.ts +35 -15
  40. package/dist/{browser → common}/flow-change.js +133 -32
  41. package/dist/common/flow-connectionUsage.d.ts +1 -1
  42. package/dist/common/flow-encoding.d.ts +1 -1
  43. package/dist/common/flow-encoding.js +89 -23
  44. package/dist/common/flow-errorHandling.d.ts +1 -1
  45. package/dist/common/flow-graph.d.ts +3 -2
  46. package/dist/common/flow-modules.d.ts +1 -1
  47. package/dist/common/flow-promptTemplate.d.ts +1 -1
  48. package/dist/common/flow-retry.d.ts +2 -2
  49. package/dist/common/flow-semantics.d.ts +1 -1
  50. package/dist/common/flow-semantics.js +966 -614
  51. package/dist/common/flow-workflowFile.d.ts +1 -1
  52. package/dist/common/flowInspection.d.ts +3 -3
  53. package/dist/common/http-request.d.ts +156 -0
  54. package/dist/common/http-request.js +5254 -0
  55. package/dist/common/integration-trigger.d.ts +1 -1
  56. package/dist/common/licenses.md +118 -1
  57. package/dist/common/liveDetails.d.ts +1 -1
  58. package/dist/common/mcp.d.ts +5 -4
  59. package/dist/common/mcp.js +117 -29
  60. package/dist/common/openapi.d.ts +1 -1
  61. package/dist/common/poll-trigger.d.ts +1 -1
  62. package/dist/common/run-events.js +11 -9
  63. package/dist/common/run-results.d.ts +8 -1
  64. package/dist/common/runtime-contract.d.ts +8 -2
  65. package/dist/common/runtime-contract.js +25 -5
  66. package/dist/common/scheduler-checkpoint.d.ts +1 -1
  67. package/dist/common/scheduler-dependencies.d.ts +1 -1
  68. package/dist/common/scheduler-node-execution.d.ts +1 -1
  69. package/dist/common/scheduler.d.ts +3 -3
  70. package/dist/common/scheduler.js +101 -33
  71. package/dist/common/trigger-catalog.d.ts +1 -1
  72. package/dist/common/trigger-config-options.d.ts +1 -1
  73. package/dist/common/trigger-config.d.ts +1 -1
  74. package/dist/common/trigger-contract.d.ts +2 -2
  75. package/dist/common/trigger-localization.d.ts +1 -1
  76. package/dist/common/webhook-response.d.ts +1 -3
  77. package/dist/common/webhook-trigger.d.ts +1 -1
  78. package/dist/common/webhook-trigger.js +12 -11
  79. package/dist/common/workflow.d.ts +17 -1
  80. package/dist/common/workflow.js +68 -22
  81. package/dist/index.d.ts +6 -3
  82. package/package.json +11 -6
  83. package/skills/open-flow/references/flow-authoring.md +1 -0
  84. package/skills/open-flow/references/flow-n8n-conversion.md +19 -15
  85. package/src/base/common/json.ts +90 -0
  86. package/src/canvas/common/commands.ts +15 -0
  87. package/src/connector/common/actionSchema.ts +168 -0
  88. package/src/connector/common/proxy.ts +44 -0
  89. package/src/control/common/api.ts +1506 -0
  90. package/src/control/common/authoring.ts +923 -0
  91. package/src/control/common/authoringCondition.ts +110 -0
  92. package/src/control/common/authoringDiagnosticFields.ts +136 -0
  93. package/src/control/common/authoringExamples.ts +200 -0
  94. package/src/control/common/authoringFields.ts +53 -0
  95. package/src/control/common/authoringLlm.ts +70 -0
  96. package/src/control/common/authoringOpenApi.ts +129 -0
  97. package/src/control/common/authoringSchema.ts +410 -0
  98. package/src/control/common/authoringTools.ts +123 -0
  99. package/src/control/common/authoringTriggers.ts +26 -0
  100. package/src/control/common/checkDecoders.ts +65 -0
  101. package/src/control/common/conformance.ts +1989 -0
  102. package/src/control/common/connectorDecoders.ts +370 -0
  103. package/src/control/common/connectorQueries.ts +61 -0
  104. package/src/control/common/decoding.ts +60 -0
  105. package/src/control/common/draftOperations.ts +61 -0
  106. package/src/control/common/errors.ts +114 -0
  107. package/src/control/common/eventSourceSchemas.ts +13 -0
  108. package/src/control/common/eventSources.ts +186 -0
  109. package/src/control/common/flowDecoders.ts +153 -0
  110. package/src/control/common/flowInspection.ts +181 -0
  111. package/src/control/common/flowNotifications.ts +37 -0
  112. package/src/control/common/liveDetails.ts +124 -0
  113. package/src/control/common/mcp.ts +241 -0
  114. package/src/control/common/mcpConformance.ts +142 -0
  115. package/src/control/common/providerAccess.ts +28 -0
  116. package/src/control/common/providerIconSprite.ts +42 -0
  117. package/src/control/common/publicationDecoders.ts +98 -0
  118. package/src/control/common/random.ts +16 -0
  119. package/src/control/common/requests.ts +112 -0
  120. package/src/control/common/resultQuery.ts +8 -0
  121. package/src/control/common/results.ts +176 -0
  122. package/src/control/common/revisionDecoders.ts +52 -0
  123. package/src/control/common/runDecoders.ts +240 -0
  124. package/src/control/common/triggerCatalog.ts +89 -0
  125. package/src/control/common/triggerDecoders.ts +175 -0
  126. package/src/decision/common/decision.ts +168 -0
  127. package/src/event-source/common/catalog.generated.json +65 -0
  128. package/src/event-source/common/definition.ts +66 -0
  129. package/src/event-source/common/index.ts +99 -0
  130. package/src/execution/common/checkpoint.ts +311 -0
  131. package/src/execution/common/dependencies.ts +440 -0
  132. package/src/execution/common/engineContract.ts +84 -0
  133. package/src/execution/common/events.ts +331 -0
  134. package/src/execution/common/node-execution.ts +469 -0
  135. package/src/execution/common/runLifecycle.ts +250 -0
  136. package/src/execution/common/runtime.ts +563 -0
  137. package/src/execution/common/scheduler.ts +697 -0
  138. package/src/execution/common/wait.ts +36 -0
  139. package/src/flow/common/agent.ts +305 -0
  140. package/src/flow/common/authoring.ts +30 -0
  141. package/src/flow/common/change.ts +1037 -0
  142. package/src/flow/common/changeSchema.ts +792 -0
  143. package/src/flow/common/codePermissions.ts +2 -0
  144. package/src/flow/common/condition.ts +265 -0
  145. package/src/flow/common/connectionUsage.ts +131 -0
  146. package/src/flow/common/edgeChanges.ts +35 -0
  147. package/src/flow/common/encoding.ts +437 -0
  148. package/src/flow/common/errorHandling.ts +34 -0
  149. package/src/flow/common/graph.ts +898 -0
  150. package/src/flow/common/inputValue.ts +16 -0
  151. package/src/flow/common/json.ts +8 -0
  152. package/src/flow/common/moduleChanges.ts +31 -0
  153. package/src/flow/common/modules.ts +292 -0
  154. package/src/flow/common/nodeChanges.ts +762 -0
  155. package/src/flow/common/portChanges.ts +36 -0
  156. package/src/flow/common/promptTemplate.ts +15 -0
  157. package/src/flow/common/retry.ts +20 -0
  158. package/src/flow/common/schema.ts +162 -0
  159. package/src/flow/common/schemaCompare.ts +176 -0
  160. package/src/flow/common/schemaComparer.ts +178 -0
  161. package/src/flow/common/schemaKeywords.ts +53 -0
  162. package/src/flow/common/semantics.ts +531 -0
  163. package/src/flow/common/sourceField.ts +35 -0
  164. package/src/flow/common/triggerScheduleSchema.ts +8 -0
  165. package/src/flow/common/wait.ts +30 -0
  166. package/src/flow/common/webhookMethod.ts +7 -0
  167. package/src/flow/common/webhookResponse.ts +71 -0
  168. package/src/flow/common/workflowFile.ts +97 -0
  169. package/src/http/common/authBindings.ts +12 -0
  170. package/src/http/common/headers.ts +5 -0
  171. package/src/http/common/httpRequest.ts +251 -0
  172. package/src/json-schema-subset/checker/array.ts +142 -0
  173. package/src/json-schema-subset/checker/cache.ts +57 -0
  174. package/src/json-schema-subset/checker/checker.ts +230 -0
  175. package/src/json-schema-subset/checker/enumAndConst.ts +113 -0
  176. package/src/json-schema-subset/checker/equals.ts +93 -0
  177. package/src/json-schema-subset/checker/numeric/checker.ts +50 -0
  178. package/src/json-schema-subset/checker/numeric/float.ts +121 -0
  179. package/src/json-schema-subset/checker/numeric/index.ts +1 -0
  180. package/src/json-schema-subset/checker/numeric/integer.ts +119 -0
  181. package/src/json-schema-subset/checker/numeric/integerNormalizer.ts +72 -0
  182. package/src/json-schema-subset/checker/object.ts +354 -0
  183. package/src/json-schema-subset/checker/range.ts +91 -0
  184. package/src/json-schema-subset/checker/string.ts +60 -0
  185. package/src/json-schema-subset/checker/tools/index.ts +3 -0
  186. package/src/json-schema-subset/checker/tools/mark.ts +82 -0
  187. package/src/json-schema-subset/checker/tools/quantum.ts +106 -0
  188. package/src/json-schema-subset/checker/tools/range.ts +210 -0
  189. package/src/json-schema-subset/checker/validator.ts +23 -0
  190. package/src/json-schema-subset/compiler/array.ts +163 -0
  191. package/src/json-schema-subset/compiler/combination.ts +109 -0
  192. package/src/json-schema-subset/compiler/common.ts +99 -0
  193. package/src/json-schema-subset/compiler/compiler.ts +188 -0
  194. package/src/json-schema-subset/compiler/enumAndConst.ts +75 -0
  195. package/src/json-schema-subset/compiler/index.ts +11 -0
  196. package/src/json-schema-subset/compiler/object.ts +411 -0
  197. package/src/json-schema-subset/compiler/primitive.ts +144 -0
  198. package/src/json-schema-subset/compiler/utils.ts +24 -0
  199. package/src/json-schema-subset/compiler/wrapper.ts +192 -0
  200. package/src/json-schema-subset/error.ts +55 -0
  201. package/src/json-schema-subset/expression/calculator.ts +442 -0
  202. package/src/json-schema-subset/expression/combination.ts +49 -0
  203. package/src/json-schema-subset/expression/expression.ts +191 -0
  204. package/src/json-schema-subset/expression/index.ts +25 -0
  205. package/src/json-schema-subset/expression/result.ts +88 -0
  206. package/src/json-schema-subset/expression/types.ts +36 -0
  207. package/src/json-schema-subset/extends/extendsContext.ts +89 -0
  208. package/src/json-schema-subset/extends/index.ts +2 -0
  209. package/src/json-schema-subset/extends/types.ts +12 -0
  210. package/src/json-schema-subset/global.ts +60 -0
  211. package/src/json-schema-subset/index.ts +8 -0
  212. package/src/json-schema-subset/preprocessing.ts +74 -0
  213. package/src/json-schema-subset/types.ts +8 -0
  214. package/src/json-schema-subset/utils.ts +95 -0
  215. package/src/localization/common/languages.ts +118 -0
  216. package/src/localization/common/timeZone.ts +25 -0
  217. package/src/openapi/common/openapi.ts +459 -0
  218. package/src/trigger/common/config.ts +56 -0
  219. package/src/trigger/common/configOptions.ts +15 -0
  220. package/src/trigger/common/configSchema.ts +8 -0
  221. package/src/trigger/common/contract.ts +132 -0
  222. package/src/trigger/common/cron.ts +151 -0
  223. package/src/trigger/common/integration.ts +498 -0
  224. package/src/trigger/common/poll.ts +187 -0
  225. package/src/trigger/common/webhook.ts +413 -0
  226. package/src/trigger/providers/airtable/locales/fr.json +18 -0
  227. package/src/trigger/providers/airtable/locales/ja.json +18 -0
  228. package/src/trigger/providers/airtable/locales/ko.json +18 -0
  229. package/src/trigger/providers/airtable/locales/ru.json +18 -0
  230. package/src/trigger/providers/airtable/locales/zh-CN.json +18 -0
  231. package/src/trigger/providers/airtable/locales/zh-TW.json +18 -0
  232. package/src/trigger/providers/asana/locales/fr.json +15 -0
  233. package/src/trigger/providers/asana/locales/ja.json +15 -0
  234. package/src/trigger/providers/asana/locales/ko.json +15 -0
  235. package/src/trigger/providers/asana/locales/ru.json +15 -0
  236. package/src/trigger/providers/asana/locales/zh-CN.json +15 -0
  237. package/src/trigger/providers/asana/locales/zh-TW.json +15 -0
  238. package/src/trigger/providers/calendly/locales/fr.json +16 -0
  239. package/src/trigger/providers/calendly/locales/ja.json +16 -0
  240. package/src/trigger/providers/calendly/locales/ko.json +16 -0
  241. package/src/trigger/providers/calendly/locales/ru.json +16 -0
  242. package/src/trigger/providers/calendly/locales/zh-CN.json +16 -0
  243. package/src/trigger/providers/calendly/locales/zh-TW.json +16 -0
  244. package/src/trigger/providers/catalog.generated.json +4996 -0
  245. package/src/trigger/providers/clickup/locales/fr.json +16 -0
  246. package/src/trigger/providers/clickup/locales/ja.json +16 -0
  247. package/src/trigger/providers/clickup/locales/ko.json +16 -0
  248. package/src/trigger/providers/clickup/locales/ru.json +16 -0
  249. package/src/trigger/providers/clickup/locales/zh-CN.json +16 -0
  250. package/src/trigger/providers/clickup/locales/zh-TW.json +16 -0
  251. package/src/trigger/providers/definitions.ts +19 -0
  252. package/src/trigger/providers/feishu/locales/fr.json +20 -0
  253. package/src/trigger/providers/feishu/locales/ja.json +20 -0
  254. package/src/trigger/providers/feishu/locales/ko.json +20 -0
  255. package/src/trigger/providers/feishu/locales/ru.json +20 -0
  256. package/src/trigger/providers/feishu/locales/zh-CN.json +20 -0
  257. package/src/trigger/providers/feishu/locales/zh-TW.json +20 -0
  258. package/src/trigger/providers/fieldDescriptions.ts +392 -0
  259. package/src/trigger/providers/fieldLabels.ts +256 -0
  260. package/src/trigger/providers/fireflies/locales/fr.json +17 -0
  261. package/src/trigger/providers/fireflies/locales/ja.json +17 -0
  262. package/src/trigger/providers/fireflies/locales/ko.json +17 -0
  263. package/src/trigger/providers/fireflies/locales/ru.json +17 -0
  264. package/src/trigger/providers/fireflies/locales/zh-CN.json +17 -0
  265. package/src/trigger/providers/fireflies/locales/zh-TW.json +17 -0
  266. package/src/trigger/providers/github/locales/fr.json +30 -0
  267. package/src/trigger/providers/github/locales/ja.json +30 -0
  268. package/src/trigger/providers/github/locales/ko.json +30 -0
  269. package/src/trigger/providers/github/locales/ru.json +30 -0
  270. package/src/trigger/providers/github/locales/zh-CN.json +30 -0
  271. package/src/trigger/providers/github/locales/zh-TW.json +30 -0
  272. package/src/trigger/providers/gitlab/locales/fr.json +18 -0
  273. package/src/trigger/providers/gitlab/locales/ja.json +18 -0
  274. package/src/trigger/providers/gitlab/locales/ko.json +18 -0
  275. package/src/trigger/providers/gitlab/locales/ru.json +18 -0
  276. package/src/trigger/providers/gitlab/locales/zh-CN.json +18 -0
  277. package/src/trigger/providers/gitlab/locales/zh-TW.json +18 -0
  278. package/src/trigger/providers/gmail/locales/fr.json +18 -0
  279. package/src/trigger/providers/gmail/locales/ja.json +18 -0
  280. package/src/trigger/providers/gmail/locales/ko.json +18 -0
  281. package/src/trigger/providers/gmail/locales/ru.json +18 -0
  282. package/src/trigger/providers/gmail/locales/zh-CN.json +18 -0
  283. package/src/trigger/providers/gmail/locales/zh-TW.json +18 -0
  284. package/src/trigger/providers/google-calendar/locales/fr.json +15 -0
  285. package/src/trigger/providers/google-calendar/locales/ja.json +15 -0
  286. package/src/trigger/providers/google-calendar/locales/ko.json +15 -0
  287. package/src/trigger/providers/google-calendar/locales/ru.json +15 -0
  288. package/src/trigger/providers/google-calendar/locales/zh-CN.json +15 -0
  289. package/src/trigger/providers/google-calendar/locales/zh-TW.json +15 -0
  290. package/src/trigger/providers/google-drive/locales/fr.json +48 -0
  291. package/src/trigger/providers/google-drive/locales/ja.json +48 -0
  292. package/src/trigger/providers/google-drive/locales/ko.json +48 -0
  293. package/src/trigger/providers/google-drive/locales/ru.json +48 -0
  294. package/src/trigger/providers/google-drive/locales/zh-CN.json +48 -0
  295. package/src/trigger/providers/google-drive/locales/zh-TW.json +48 -0
  296. package/src/trigger/providers/google-sheets/locales/fr.json +19 -0
  297. package/src/trigger/providers/google-sheets/locales/ja.json +19 -0
  298. package/src/trigger/providers/google-sheets/locales/ko.json +19 -0
  299. package/src/trigger/providers/google-sheets/locales/ru.json +19 -0
  300. package/src/trigger/providers/google-sheets/locales/zh-CN.json +19 -0
  301. package/src/trigger/providers/google-sheets/locales/zh-TW.json +19 -0
  302. package/src/trigger/providers/intercom/locales/fr.json +17 -0
  303. package/src/trigger/providers/intercom/locales/ja.json +17 -0
  304. package/src/trigger/providers/intercom/locales/ko.json +17 -0
  305. package/src/trigger/providers/intercom/locales/ru.json +17 -0
  306. package/src/trigger/providers/intercom/locales/zh-CN.json +17 -0
  307. package/src/trigger/providers/intercom/locales/zh-TW.json +17 -0
  308. package/src/trigger/providers/jira/locales/fr.json +17 -0
  309. package/src/trigger/providers/jira/locales/ja.json +17 -0
  310. package/src/trigger/providers/jira/locales/ko.json +17 -0
  311. package/src/trigger/providers/jira/locales/ru.json +17 -0
  312. package/src/trigger/providers/jira/locales/zh-CN.json +17 -0
  313. package/src/trigger/providers/jira/locales/zh-TW.json +17 -0
  314. package/src/trigger/providers/linear/locales/fr.json +13 -0
  315. package/src/trigger/providers/linear/locales/ja.json +13 -0
  316. package/src/trigger/providers/linear/locales/ko.json +13 -0
  317. package/src/trigger/providers/linear/locales/ru.json +13 -0
  318. package/src/trigger/providers/linear/locales/zh-CN.json +13 -0
  319. package/src/trigger/providers/linear/locales/zh-TW.json +13 -0
  320. package/src/trigger/providers/locales/fr.ts +71 -0
  321. package/src/trigger/providers/locales/ja.ts +71 -0
  322. package/src/trigger/providers/locales/ko.ts +71 -0
  323. package/src/trigger/providers/locales/ru.ts +71 -0
  324. package/src/trigger/providers/locales/zh-CN.ts +71 -0
  325. package/src/trigger/providers/locales/zh-TW.ts +71 -0
  326. package/src/trigger/providers/localization.ts +59 -0
  327. package/src/trigger/providers/notion/locales/fr.json +16 -0
  328. package/src/trigger/providers/notion/locales/ja.json +16 -0
  329. package/src/trigger/providers/notion/locales/ko.json +16 -0
  330. package/src/trigger/providers/notion/locales/ru.json +16 -0
  331. package/src/trigger/providers/notion/locales/zh-CN.json +16 -0
  332. package/src/trigger/providers/notion/locales/zh-TW.json +16 -0
  333. package/src/trigger/providers/one-drive/locales/fr.json +16 -0
  334. package/src/trigger/providers/one-drive/locales/ja.json +16 -0
  335. package/src/trigger/providers/one-drive/locales/ko.json +16 -0
  336. package/src/trigger/providers/one-drive/locales/ru.json +16 -0
  337. package/src/trigger/providers/one-drive/locales/zh-CN.json +16 -0
  338. package/src/trigger/providers/one-drive/locales/zh-TW.json +16 -0
  339. package/src/trigger/providers/outlook/locales/fr.json +18 -0
  340. package/src/trigger/providers/outlook/locales/ja.json +18 -0
  341. package/src/trigger/providers/outlook/locales/ko.json +18 -0
  342. package/src/trigger/providers/outlook/locales/ru.json +18 -0
  343. package/src/trigger/providers/outlook/locales/zh-CN.json +18 -0
  344. package/src/trigger/providers/outlook/locales/zh-TW.json +18 -0
  345. package/src/trigger/providers/pandadoc/locales/fr.json +12 -0
  346. package/src/trigger/providers/pandadoc/locales/ja.json +12 -0
  347. package/src/trigger/providers/pandadoc/locales/ko.json +12 -0
  348. package/src/trigger/providers/pandadoc/locales/ru.json +12 -0
  349. package/src/trigger/providers/pandadoc/locales/zh-CN.json +12 -0
  350. package/src/trigger/providers/pandadoc/locales/zh-TW.json +12 -0
  351. package/src/trigger/providers/pipedrive/locales/fr.json +15 -0
  352. package/src/trigger/providers/pipedrive/locales/ja.json +15 -0
  353. package/src/trigger/providers/pipedrive/locales/ko.json +15 -0
  354. package/src/trigger/providers/pipedrive/locales/ru.json +15 -0
  355. package/src/trigger/providers/pipedrive/locales/zh-CN.json +15 -0
  356. package/src/trigger/providers/pipedrive/locales/zh-TW.json +15 -0
  357. package/src/trigger/providers/remote.ts +163 -0
  358. package/src/trigger/providers/resend/locales/fr.json +16 -0
  359. package/src/trigger/providers/resend/locales/ja.json +16 -0
  360. package/src/trigger/providers/resend/locales/ko.json +16 -0
  361. package/src/trigger/providers/resend/locales/ru.json +16 -0
  362. package/src/trigger/providers/resend/locales/zh-CN.json +16 -0
  363. package/src/trigger/providers/resend/locales/zh-TW.json +16 -0
  364. package/src/trigger/providers/sentry/locales/fr.json +19 -0
  365. package/src/trigger/providers/sentry/locales/ja.json +19 -0
  366. package/src/trigger/providers/sentry/locales/ko.json +19 -0
  367. package/src/trigger/providers/sentry/locales/ru.json +19 -0
  368. package/src/trigger/providers/sentry/locales/zh-CN.json +19 -0
  369. package/src/trigger/providers/sentry/locales/zh-TW.json +19 -0
  370. package/src/trigger/providers/shopify/locales/fr.json +18 -0
  371. package/src/trigger/providers/shopify/locales/ja.json +18 -0
  372. package/src/trigger/providers/shopify/locales/ko.json +18 -0
  373. package/src/trigger/providers/shopify/locales/ru.json +18 -0
  374. package/src/trigger/providers/shopify/locales/zh-CN.json +18 -0
  375. package/src/trigger/providers/shopify/locales/zh-TW.json +18 -0
  376. package/src/trigger/providers/slack/locales/fr.json +18 -0
  377. package/src/trigger/providers/slack/locales/ja.json +18 -0
  378. package/src/trigger/providers/slack/locales/ko.json +18 -0
  379. package/src/trigger/providers/slack/locales/ru.json +18 -0
  380. package/src/trigger/providers/slack/locales/zh-CN.json +18 -0
  381. package/src/trigger/providers/slack/locales/zh-TW.json +18 -0
  382. package/src/trigger/providers/slackbot/locales/fr.json +23 -0
  383. package/src/trigger/providers/slackbot/locales/ja.json +23 -0
  384. package/src/trigger/providers/slackbot/locales/ko.json +23 -0
  385. package/src/trigger/providers/slackbot/locales/ru.json +23 -0
  386. package/src/trigger/providers/slackbot/locales/zh-CN.json +23 -0
  387. package/src/trigger/providers/slackbot/locales/zh-TW.json +23 -0
  388. package/src/trigger/providers/source-events.ts +25 -0
  389. package/src/trigger/providers/stripe/locales/fr.json +17 -0
  390. package/src/trigger/providers/stripe/locales/ja.json +17 -0
  391. package/src/trigger/providers/stripe/locales/ko.json +17 -0
  392. package/src/trigger/providers/stripe/locales/ru.json +17 -0
  393. package/src/trigger/providers/stripe/locales/zh-CN.json +17 -0
  394. package/src/trigger/providers/stripe/locales/zh-TW.json +17 -0
  395. package/src/trigger/providers/tally/locales/fr.json +12 -0
  396. package/src/trigger/providers/tally/locales/ja.json +12 -0
  397. package/src/trigger/providers/tally/locales/ko.json +12 -0
  398. package/src/trigger/providers/tally/locales/ru.json +12 -0
  399. package/src/trigger/providers/tally/locales/zh-CN.json +12 -0
  400. package/src/trigger/providers/tally/locales/zh-TW.json +12 -0
  401. package/src/trigger/providers/telegram/locales/fr.json +17 -0
  402. package/src/trigger/providers/telegram/locales/ja.json +17 -0
  403. package/src/trigger/providers/telegram/locales/ko.json +17 -0
  404. package/src/trigger/providers/telegram/locales/ru.json +17 -0
  405. package/src/trigger/providers/telegram/locales/zh-CN.json +17 -0
  406. package/src/trigger/providers/telegram/locales/zh-TW.json +17 -0
  407. package/src/trigger/providers/typeform/locales/fr.json +12 -0
  408. package/src/trigger/providers/typeform/locales/ja.json +12 -0
  409. package/src/trigger/providers/typeform/locales/ko.json +12 -0
  410. package/src/trigger/providers/typeform/locales/ru.json +12 -0
  411. package/src/trigger/providers/typeform/locales/zh-CN.json +12 -0
  412. package/src/trigger/providers/typeform/locales/zh-TW.json +12 -0
  413. package/src/trigger/providers/vercel/locales/fr.json +18 -0
  414. package/src/trigger/providers/vercel/locales/ja.json +18 -0
  415. package/src/trigger/providers/vercel/locales/ko.json +18 -0
  416. package/src/trigger/providers/vercel/locales/ru.json +18 -0
  417. package/src/trigger/providers/vercel/locales/zh-CN.json +18 -0
  418. package/src/trigger/providers/vercel/locales/zh-TW.json +18 -0
  419. package/src/trigger/providers/woocommerce/locales/fr.json +19 -0
  420. package/src/trigger/providers/woocommerce/locales/ja.json +19 -0
  421. package/src/trigger/providers/woocommerce/locales/ko.json +19 -0
  422. package/src/trigger/providers/woocommerce/locales/ru.json +19 -0
  423. package/src/trigger/providers/woocommerce/locales/zh-CN.json +19 -0
  424. package/src/trigger/providers/woocommerce/locales/zh-TW.json +19 -0
  425. package/src/trigger/providers/zendesk/locales/fr.json +15 -0
  426. package/src/trigger/providers/zendesk/locales/ja.json +15 -0
  427. package/src/trigger/providers/zendesk/locales/ko.json +15 -0
  428. package/src/trigger/providers/zendesk/locales/ru.json +15 -0
  429. package/src/trigger/providers/zendesk/locales/zh-CN.json +15 -0
  430. package/src/trigger/providers/zendesk/locales/zh-TW.json +15 -0
  431. package/src/trigger/providers/zoom/locales/fr.json +17 -0
  432. package/src/trigger/providers/zoom/locales/ja.json +17 -0
  433. package/src/trigger/providers/zoom/locales/ko.json +17 -0
  434. package/src/trigger/providers/zoom/locales/ru.json +17 -0
  435. package/src/trigger/providers/zoom/locales/zh-CN.json +17 -0
  436. package/src/trigger/providers/zoom/locales/zh-TW.json +17 -0
  437. package/src/types/index.ts +112 -0
  438. package/src/workflow/common/workflow.ts +273 -0
  439. package/dist/browser/lib-DrKav3HG.js +0 -11403
  440. /package/dist/{browser → common}/flow-authoring-edge.d.ts +0 -0
  441. /package/dist/{browser → common}/flow-authoring-module.d.ts +0 -0
  442. /package/dist/{browser → common}/flow-authoring.d.ts +0 -0
  443. /package/dist/{browser → common}/flow-input-value.d.ts +0 -0
  444. /package/dist/{browser → common}/webhook-method.d.ts +0 -0
@@ -0,0 +1,697 @@
1
+ import type { TaskCapability, Graph, JsonValue, WaitAction, WaitAutoContinue } from '../../flow/common/change.ts'
2
+ import type { NodeErrorData } from '../../flow/common/errorHandling.ts'
3
+ import type { PreparedFlow } from '../../flow/common/semantics.ts'
4
+ import type { WebhookResponseSnapshot } from '../../flow/common/webhookResponse.ts'
5
+ import type { PreviousNode } from '../../types/index.ts'
6
+ import type { FlowRunCheckpoint } from './checkpoint.ts'
7
+ import type { ExecutableNode, NodeResult } from './node-execution.ts'
8
+ import type { AgentCheckpoint } from './runtime.ts'
9
+
10
+ import * as Cause from 'effect/Cause'
11
+ import * as Clock from 'effect/Clock'
12
+ import * as Effect from 'effect/Effect'
13
+ import * as FiberSet from 'effect/FiberSet'
14
+ import * as Queue from 'effect/Queue'
15
+ import { nanoid } from 'nanoid'
16
+ import { isTriggerNode } from '../../flow/common/change.ts'
17
+ import { nodeInputMappings } from '../../flow/common/condition.ts'
18
+ import { nodeSystemOutputPorts, supportsNodeErrorHandling } from '../../flow/common/errorHandling.ts'
19
+ import { isResolutionNode, resolutionActions } from '../../flow/common/graph.ts'
20
+ import { waitAutoContinueAt as automaticDeadline } from '../../flow/common/wait.ts'
21
+ import { matchesTriggerOutputs, normalizeTriggerOutputs } from '../../trigger/common/contract.ts'
22
+ import { decodeFlowRunCheckpoint, validateCheckpoint } from './checkpoint.ts'
23
+ import { Dependencies } from './dependencies.ts'
24
+ import { projectExecutionId, sanitizeRuntimeErrorMessage } from './events.ts'
25
+ import { agentNotice, executeNode, NodeValidationError, nodeFailure, nodeTitle, resolveNodeInputs, usesPending, validateOutputs } from './node-execution.ts'
26
+ import { normalizeWaitComment as normalizeComment, withWaitNotificationMessage as notificationMessage } from './wait.ts'
27
+
28
+ export type { DependenciesCheckpoint } from './dependencies.ts'
29
+ export type { FlowRunCheckpoint, PendingWait, PendingWorkflowCall } from './checkpoint.ts'
30
+ export { decodeFlowRunCheckpoint } from './checkpoint.ts'
31
+ export { PortValidationError } from './node-execution.ts'
32
+
33
+ export const withWaitNotificationMessage: (value: JsonValue) => JsonValue = notificationMessage
34
+
35
+ export const normalizeWaitComment: (value?: string | null) => string | null = normalizeComment
36
+
37
+ export const waitAutoContinueAt: (config: WaitAutoContinue, waitingSince: number) => number = automaticDeadline
38
+
39
+ export interface WaitResolution {
40
+ readonly action: WaitAction
41
+ readonly resolvedAt: string
42
+ readonly comment: string | null
43
+ }
44
+
45
+ export type SchedulerEvent =
46
+ | {
47
+ readonly flowId: string
48
+ readonly parentJobId?: string
49
+ readonly parentRunId?: string
50
+ readonly runId: string
51
+ readonly type: 'run.started'
52
+ }
53
+ | {
54
+ readonly parentJobId?: string
55
+ readonly parentRunId?: string
56
+ readonly progress: number
57
+ readonly runId: string
58
+ readonly type: 'run.progress'
59
+ }
60
+ | {
61
+ readonly inputs: Readonly<Record<string, JsonValue>>
62
+ readonly jobId: string
63
+ readonly nodeId: string
64
+ readonly nodeKind:
65
+ | 'agent'
66
+ | 'approval'
67
+ | 'condition'
68
+ | 'connector'
69
+ | 'decision'
70
+ | 'javascript'
71
+ | 'openapi'
72
+ | 'http-request'
73
+ | 'llm'
74
+ | 'value'
75
+ | 'wait'
76
+ | 'outputs'
77
+ | 'workflow'
78
+ | 'webhook-response'
79
+ readonly nodeTitle?: string
80
+ readonly runId: string
81
+ readonly type: 'node.started'
82
+ }
83
+ | {
84
+ readonly jobId: string
85
+ readonly nodeId: string
86
+ readonly outputs: Readonly<Record<string, JsonValue>>
87
+ readonly runId: string
88
+ readonly systemOutputs?: Readonly<Record<string, JsonValue>>
89
+ readonly response?: WebhookResponseSnapshot
90
+ readonly type: 'node.completed'
91
+ }
92
+ | {
93
+ readonly code: string
94
+ readonly jobId: string
95
+ readonly message: string
96
+ readonly nodeId: string
97
+ readonly runId: string
98
+ readonly handled?: true
99
+ readonly systemOutputs?: Readonly<Record<string, JsonValue>>
100
+ readonly type: 'node.failed'
101
+ }
102
+ | {
103
+ readonly jobId: string
104
+ readonly level: 'debug' | 'error' | 'info' | 'warn'
105
+ readonly message: string
106
+ readonly nodeId: string
107
+ readonly runId: string
108
+ readonly type: 'node.log'
109
+ }
110
+ | {
111
+ readonly result: FlowRunResult
112
+ readonly runId: string
113
+ readonly type: 'run.completed'
114
+ }
115
+ | {
116
+ readonly message: string
117
+ readonly runId: string
118
+ readonly type: 'run.failed'
119
+ readonly failure?: Extract<SchedulerEvent, { readonly type: 'node.failed' }>
120
+ }
121
+
122
+ export interface FlowRunResult {
123
+ readonly kind: 'node-results'
124
+ readonly outputs?: Readonly<Record<string, JsonValue>>
125
+ readonly nodes: readonly {
126
+ readonly nodeId: string
127
+ readonly status: 'completed' | 'error-handled'
128
+ readonly systemOutputs?: Readonly<Record<string, JsonValue>>
129
+ readonly jobId: string
130
+ readonly outputs: Readonly<Record<string, JsonValue>>
131
+ }[]
132
+ }
133
+
134
+ export interface WaitRequest {
135
+ readonly autoContinue?: WaitAutoContinue
136
+ readonly jobId: string
137
+ readonly nodeId: string
138
+ readonly value: JsonValue
139
+ readonly waitId: string
140
+ readonly actions: readonly ['continue'] | readonly ['approve', 'reject']
141
+ readonly prompt: string
142
+ readonly notify: boolean
143
+ readonly notification?: {
144
+ readonly input: Readonly<Record<string, JsonValue>>
145
+ readonly messageHandle: string
146
+ }
147
+ }
148
+
149
+ export type WaitOperation =
150
+ | { readonly kind: 'create'; readonly wait: WaitRequest }
151
+ | { readonly kind: 'resolutions'; readonly waitIds: readonly string[]; readonly block: boolean }
152
+
153
+ export interface WaitHost {
154
+ readonly create: (wait: WaitRequest) => Effect.Effect<JsonValue | undefined, Error>
155
+ readonly resolutions: (waitIds: readonly string[], block: boolean) => Effect.Effect<Readonly<Record<string, WaitResolution>>, Error>
156
+ }
157
+
158
+ export const waitRetentionMs = 120_000
159
+
160
+ export type FlowRunOutcome =
161
+ | FlowRunResult
162
+ | {
163
+ readonly checkpoint: FlowRunCheckpoint
164
+ readonly kind: 'waiting'
165
+ readonly remainingMs?: number
166
+ }
167
+
168
+ interface TaskInvocationBase {
169
+ readonly workflowRunId?: string
170
+ readonly agent?: { readonly action: 'approve' | 'reject'; readonly checkpoint: AgentCheckpoint }
171
+ readonly additionalInputs: Readonly<Record<string, JsonValue>>
172
+ readonly blockId: string
173
+ readonly flowId: string
174
+ readonly input: Readonly<Record<string, JsonValue>>
175
+ readonly invocationId: string
176
+ readonly jobId: string
177
+ readonly nodeId: string
178
+ readonly runId: string
179
+ }
180
+
181
+ export type TaskInvocation = TaskInvocationBase &
182
+ (
183
+ | { readonly capabilities: readonly TaskCapability[]; readonly moduleId: string; readonly getPrevious: () => readonly PreviousNode[] }
184
+ | { readonly kind: 'managed' }
185
+ )
186
+
187
+ export interface TriggerSeed {
188
+ readonly nodeId: string
189
+ readonly outputs: Readonly<Record<string, JsonValue>>
190
+ }
191
+
192
+ export interface SchedulerFailure {
193
+ /** Trusted execution classification; absent means retries are forbidden. */
194
+ readonly retryable?: boolean
195
+ readonly catchable?: boolean
196
+ readonly code: string
197
+ readonly message: string
198
+ }
199
+
200
+ export type FlowRunOptions = {
201
+ readonly createId: () => string
202
+ readonly emit?: (event: SchedulerEvent) => Effect.Effect<void, Error>
203
+ readonly flowId: string
204
+ readonly invokeTask: (invocation: TaskInvocation) => Effect.Effect<unknown, Error>
205
+ readonly projectFailure?: (error: unknown) => SchedulerFailure
206
+ readonly runId: string
207
+ readonly waits?: WaitHost
208
+ readonly remainingMs?: number
209
+ } & RunLaunch
210
+
211
+ export type RunLaunch =
212
+ | {
213
+ readonly bindingValues?: Readonly<Record<string, string>>
214
+ readonly inputs?: Readonly<Record<string, Readonly<Record<string, JsonValue>>>>
215
+ readonly trigger: TriggerSeed
216
+ readonly resume?: never
217
+ }
218
+ | {
219
+ readonly resume: { readonly checkpoint: unknown }
220
+ readonly bindingValues?: never
221
+ readonly inputs?: never
222
+ readonly trigger?: never
223
+ }
224
+
225
+ interface RunGraph {
226
+ readonly inputDefs: PreparedFlow['inputDefs']
227
+ readonly outputDefs: PreparedFlow['outputDefs']
228
+ readonly outputMappings: PreparedFlow['outputMappings']
229
+ readonly flowId: string
230
+ readonly graph: Graph
231
+ }
232
+
233
+ interface RunContext {
234
+ readonly failures: WeakMap<Error, Extract<SchedulerEvent, { readonly type: 'node.failed' }>>
235
+ readonly counts: Record<string, Record<string, number>>
236
+ readonly bindingValues: Readonly<Record<string, string>>
237
+ readonly createId: FlowRunOptions['createId']
238
+ readonly emit: (event: SchedulerEvent) => Effect.Effect<void, Error>
239
+ readonly invokeTask: FlowRunOptions['invokeTask']
240
+ readonly prepared: PreparedFlow
241
+ readonly projectFailure: FlowRunOptions['projectFailure']
242
+ readonly waits: WaitHost | undefined
243
+ readonly remainingMs: number | undefined
244
+ }
245
+
246
+ function runGraph(
247
+ context: RunContext,
248
+ target: RunGraph,
249
+ runId: string,
250
+ launchInputs: Readonly<Record<string, Readonly<Record<string, JsonValue>>>> = {},
251
+ trigger?: TriggerSeed,
252
+ resume?: { readonly checkpoint: FlowRunCheckpoint },
253
+ ): Effect.Effect<FlowRunOutcome, Error> {
254
+ return Effect.scoped(
255
+ Effect.gen(function* () {
256
+ if (resume == null) {
257
+ yield* context.emit({
258
+ flowId: target.flowId,
259
+ runId,
260
+ type: 'run.started',
261
+ })
262
+ }
263
+ const order = Object.keys(target.graph.nodes).filter((id) => !isTriggerNode(target.graph.nodes[id]!))
264
+ const outgoing = new Map<string, Graph['edges'][number][]>()
265
+ for (const edge of target.graph.edges) {
266
+ const targets = outgoing.get(edge.source) ?? []
267
+ targets.push(edge)
268
+ outgoing.set(edge.source, targets)
269
+ }
270
+ const resultNodes = order.filter((id) => !outgoing.has(id)).toSorted()
271
+ const completed = new Map(Object.entries(resume?.checkpoint.results ?? {}))
272
+ const counts = (context.counts[''] ??= {})
273
+ const dependencies = new Dependencies(target.graph, resume?.checkpoint.dependencies)
274
+ const launch = resume?.checkpoint.inputs ?? launchInputs
275
+ if (resume == null) {
276
+ if (trigger != null) {
277
+ const node = target.graph.nodes[trigger.nodeId]
278
+ if (node == null || !isTriggerNode(node) || !matchesTriggerOutputs(node, trigger.outputs)) throw new Error('Trigger outputs are invalid.')
279
+ }
280
+ for (const [id, node] of Object.entries(target.graph.nodes)) {
281
+ if (!isTriggerNode(node)) continue
282
+ if (trigger?.nodeId == id) completed.set(id, { jobId: id, outputs: trigger.outputs })
283
+ }
284
+ }
285
+ const active = yield* FiberSet.make<void, Error>()
286
+ const runNode = yield* FiberSet.runtime(active)()
287
+ let firstCause: Cause.Cause<Error> | undefined
288
+ let firstFailure: Error | undefined
289
+ const pendingCalls = new Map((resume?.checkpoint.calls ?? []).map((call) => [call.jobId, call]))
290
+ const pendingWaits = new Map((resume?.checkpoint.waits ?? []).map((wait) => [wait.jobId, wait]))
291
+ const changes = yield* Queue.unbounded<void>()
292
+ let remainingMs = context.remainingMs
293
+ let measuredAt = yield* Clock.currentTimeMillis
294
+ let idleSince: number | undefined
295
+ const agents: Record<string, FlowRunCheckpoint['agents'][string]> = { ...resume?.checkpoint.agents }
296
+ const resolveInputs = (nodeId: string, node: ExecutableNode) => resolveNodeInputs(nodeId, node, dependencies, context.bindingValues, launch[nodeId])
297
+ const commit = (
298
+ nodeId: string,
299
+ jobId: string,
300
+ outputs: Readonly<Record<string, JsonValue>>,
301
+ releasedHandles: readonly string[] = Object.keys(outputs),
302
+ failure?: SchedulerFailure,
303
+ response?: WebhookResponseSnapshot,
304
+ ) =>
305
+ Effect.uninterruptible(
306
+ Effect.gen(function* () {
307
+ const node = target.graph.nodes[nodeId]!
308
+ const systemOutputs =
309
+ nodeSystemOutputPorts(node).error == null
310
+ ? undefined
311
+ : {
312
+ error:
313
+ failure == null
314
+ ? null
315
+ : ({
316
+ code: failure.code,
317
+ message: sanitizeRuntimeErrorMessage(failure.message),
318
+ nodeId,
319
+ nodeName: nodeTitle(node) ?? nodeId,
320
+ runId,
321
+ executionId: yield* Effect.tryPromise(() => projectExecutionId(runId, runId, jobId)),
322
+ } satisfies NodeErrorData),
323
+ }
324
+ const system = systemOutputs == null ? {} : { systemOutputs }
325
+ const handled = failure == null ? {} : { handled: true as const }
326
+ yield* context.emit(
327
+ failure == null
328
+ ? { jobId, nodeId, outputs, runId, ...system, ...(response == null ? {} : { response }), type: 'node.completed' }
329
+ : { ...failure, jobId, nodeId, runId, ...system, handled: true, type: 'node.failed' },
330
+ )
331
+ completed.set(nodeId, { jobId, outputs, ...system, ...handled })
332
+ dependencies.release(nodeId, outputs, releasedHandles, true, systemOutputs)
333
+ }),
334
+ )
335
+ const execute = (
336
+ nodeId: string,
337
+ node: ExecutableNode,
338
+ jobId: string,
339
+ nodeInputs: Readonly<Record<string, JsonValue>>,
340
+ resolution?: 'approve' | 'reject',
341
+ ) =>
342
+ executeNode(context, {
343
+ nodeId,
344
+ node,
345
+ jobId,
346
+ nodeInputs,
347
+ resolution,
348
+ flowId: target.flowId,
349
+ runId,
350
+ graph: target.graph,
351
+ dependencies,
352
+ previousIds: dependencies.state.nodes[nodeId]!.previous,
353
+ saved: agents[jobId],
354
+ workflowRunId: pendingCalls.get(jobId)?.childRunId,
355
+ })
356
+
357
+ const createWait = (nodeId: string, jobId: string, value: JsonValue) =>
358
+ Effect.gen(function* () {
359
+ if (context.waits == null) return yield* Effect.fail(new Error('Wait host is unavailable.'))
360
+ const node = target.graph.nodes[nodeId] as ExecutableNode
361
+ const waitId = nanoid()
362
+ const notify = isResolutionNode(node) && usesPending(target.graph, nodeId)
363
+ const notification = yield* context.waits.create({
364
+ jobId,
365
+ nodeId,
366
+ value,
367
+ waitId,
368
+ notify,
369
+ ...(node.kind == 'wait' && node.autoContinue != null ? { autoContinue: node.autoContinue } : {}),
370
+ actions: isResolutionNode(node) ? resolutionActions(node) : ['approve', 'reject'],
371
+ prompt: isResolutionNode(node) ? node.prompt : JSON.stringify(value, null, 2),
372
+ ...(isResolutionNode(node) ? {} : { notification: agentNotice(node, agents[jobId]!.input) }),
373
+ })
374
+ const pending = notification == null ? notification : withWaitNotificationMessage(notification)
375
+ if (notify) {
376
+ validateOutputs(nodeId, node, { pending: pending! })
377
+ dependencies.release(nodeId, { pending: pending! }, ['pending'], false)
378
+ }
379
+ pendingWaits.set(jobId, { jobId, nodeId, value, waitId, ...(notify ? { pending: pending! } : {}) })
380
+ yield* Queue.offer(changes, undefined)
381
+ })
382
+ const settleNode = (nodeId: string, jobId: string, result: NodeResult): Effect.Effect<void, Error> => {
383
+ if (result.kind == 'calling') {
384
+ pendingCalls.set(jobId, { jobId, nodeId, childRunId: result.childRunId, input: result.input })
385
+ return Effect.void
386
+ }
387
+ pendingCalls.delete(jobId)
388
+ if (result.kind == 'completed') {
389
+ delete agents[jobId]
390
+ return commit(nodeId, jobId, result.outputs, result.releasedHandles, undefined, result.response)
391
+ }
392
+ agents[jobId] = result.agent
393
+ return createWait(nodeId, jobId, result.value)
394
+ }
395
+
396
+ const observe = (nodeId: string, jobId: string, effect: Effect.Effect<void, Error>) =>
397
+ effect.pipe(
398
+ Effect.catchDefect((error) => Effect.fail(error instanceof Error ? error : new Error(String(error)))),
399
+ Effect.tapError((error) =>
400
+ Effect.gen(function* () {
401
+ const failure = { ...nodeFailure(error, context.projectFailure), jobId, nodeId, runId, type: 'node.failed' as const }
402
+ if (!context.failures.has(error)) context.failures.set(error, failure)
403
+ if (firstCause == null) {
404
+ firstFailure = error
405
+ firstCause = Cause.fail(error)
406
+ }
407
+ yield* context.emit(failure).pipe(Effect.ignore)
408
+ }),
409
+ ),
410
+ Effect.tapCause((cause) =>
411
+ Effect.sync(() => {
412
+ firstCause ??= cause
413
+ }),
414
+ ),
415
+ )
416
+ const executeReady = (nodeId: string) => {
417
+ if (firstCause != null) return
418
+ const node = target.graph.nodes[nodeId]!
419
+ if (isTriggerNode(node)) return
420
+ const jobId = context.createId()
421
+ const count = counts[nodeId] ?? 0
422
+ const limit = node.maxExecutions ?? 1000
423
+ if (count >= limit) {
424
+ runNode(
425
+ observe(nodeId, jobId, Effect.fail(new Error(`Node "${nodeId}" exceeded its maximum execution count (${limit}).`))).pipe(
426
+ Effect.ensuring(Queue.offer(changes, undefined)),
427
+ ),
428
+ )
429
+ return
430
+ }
431
+ counts[nodeId] = count + 1
432
+ dependencies.begin(nodeId, jobId)
433
+ runNode(
434
+ observe(
435
+ nodeId,
436
+ jobId,
437
+ Effect.gen(function* () {
438
+ const compute = Effect.gen(function* () {
439
+ const nodeInputs = yield* Effect.try({
440
+ try: () => resolveInputs(nodeId, node),
441
+ catch: (error) => new NodeValidationError('node.input-invalid', error),
442
+ })
443
+ if (isResolutionNode(node)) {
444
+ yield* context.emit({
445
+ inputs: Object.fromEntries(
446
+ Object.entries(nodeInputs).filter(([handle]) => {
447
+ const mapping = nodeInputMappings(node)[handle]
448
+ return mapping?.kind != 'sources' || mapping.sources.every((source) => source.kind != 'binding')
449
+ }),
450
+ ),
451
+ jobId,
452
+ nodeId,
453
+ nodeKind: node.kind,
454
+ ...(node.name == null ? {} : { nodeTitle: node.name }),
455
+ runId,
456
+ type: 'node.started',
457
+ })
458
+ yield* createWait(nodeId, jobId, nodeInputs)
459
+ return
460
+ }
461
+ return yield* execute(nodeId, node, jobId, nodeInputs)
462
+ })
463
+ const result = yield* compute.pipe(
464
+ Effect.catch((error) => {
465
+ const failure = nodeFailure(error, context.projectFailure)
466
+ if (!supportsNodeErrorHandling(node) || node.onError != 'error' || failure.catchable !== true) return Effect.fail(error)
467
+ return commit(nodeId, jobId, {}, [], failure)
468
+ }),
469
+ )
470
+ if (result != null) yield* settleNode(nodeId, jobId, result)
471
+ }),
472
+ ).pipe(Effect.ensuring(Queue.offer(changes, undefined))),
473
+ )
474
+ }
475
+ if (resume != null) {
476
+ yield* Effect.try({
477
+ try: () => validateCheckpoint(target, resume.checkpoint, resolveInputs),
478
+ catch: (error) => (error instanceof Error ? error : new Error(String(error))),
479
+ })
480
+ }
481
+ if (resume == null) {
482
+ if (trigger != null) dependencies.start(trigger.nodeId, trigger.outputs)
483
+ }
484
+
485
+ const applyResolutions = (resolutions: Readonly<Record<string, WaitResolution>>, now: number) => {
486
+ for (const saved of pendingWaits.values()) {
487
+ const resolution = resolutions[saved.waitId]
488
+ if (resolution == null) continue
489
+ const { action, resolvedAt, comment } = resolution
490
+ if (idleSince != null) {
491
+ idleSince = undefined
492
+ measuredAt = now
493
+ }
494
+ pendingWaits.delete(saved.jobId)
495
+ const node = target.graph.nodes[saved.nodeId] as ExecutableNode
496
+ runNode(
497
+ observe(
498
+ saved.nodeId,
499
+ saved.jobId,
500
+ Effect.gen(function* () {
501
+ if (isResolutionNode(node)) {
502
+ if (!resolutionActions(node).some((candidate) => candidate == action))
503
+ return yield* Effect.fail(new Error('Resolution does not match node actions.'))
504
+ yield* commit(
505
+ saved.nodeId,
506
+ saved.jobId,
507
+ validateOutputs(saved.nodeId, node, {
508
+ ...(saved.pending == null ? {} : { pending: saved.pending }),
509
+ [action]: { inputs: saved.value, action, resolvedAt, comment },
510
+ }),
511
+ [action],
512
+ )
513
+ } else {
514
+ if (action == 'continue') return yield* Effect.fail(new Error('Agent requires approve or reject.'))
515
+ yield* settleNode(saved.nodeId, saved.jobId, yield* execute(saved.nodeId, node, saved.jobId, agents[saved.jobId]!.input, action))
516
+ }
517
+ }),
518
+ ).pipe(Effect.ensuring(Queue.offer(changes, undefined))),
519
+ )
520
+ }
521
+ }
522
+ while (true) {
523
+ const now = yield* Clock.currentTimeMillis
524
+ if (idleSince == null && remainingMs != null) remainingMs -= now - measuredAt
525
+ measuredAt = now
526
+ if (remainingMs != null && remainingMs <= 0) return yield* Effect.fail(new Error('Run exceeded its execution deadline.'))
527
+ if (firstCause != null) {
528
+ yield* FiberSet.clear(active)
529
+ yield* context
530
+ .emit({
531
+ message: firstFailure?.message ?? 'Execution failed.',
532
+ runId,
533
+ type: 'run.failed',
534
+ ...(firstFailure == null ? {} : { failure: context.failures.get(firstFailure) }),
535
+ })
536
+ .pipe(Effect.ignore)
537
+ return yield* Effect.failCause(firstCause)
538
+ }
539
+ if (pendingWaits.size > 0 && context.waits != null)
540
+ applyResolutions(
541
+ yield* context.waits.resolutions(
542
+ [...pendingWaits.values()].map((wait) => wait.waitId),
543
+ false,
544
+ ),
545
+ now,
546
+ )
547
+ for (const call of pendingCalls.values()) {
548
+ yield* observe(
549
+ call.nodeId,
550
+ call.jobId,
551
+ Effect.gen(function* () {
552
+ const result = yield* execute(call.nodeId, target.graph.nodes[call.nodeId] as ExecutableNode, call.jobId, call.input)
553
+ yield* settleNode(call.nodeId, call.jobId, result)
554
+ }),
555
+ ).pipe(Effect.catch(() => Effect.void))
556
+ }
557
+ const ready = dependencies.ready()
558
+ for (const nodeId of ready) executeReady(nodeId)
559
+ const running = yield* FiberSet.size(active)
560
+ if (firstCause != null) continue
561
+ if (running == 0 && pendingWaits.size == 0 && pendingCalls.size == 0 && ready.length == 0) {
562
+ if (dependencies.incomplete) return yield* Effect.fail(new Error('Execution graph contains unresolved dependencies.'))
563
+ break
564
+ }
565
+ if (running > 0 || ready.length > 0) idleSince = undefined
566
+ else idleSince ??= now
567
+ const left = idleSince == null ? remainingMs : waitRetentionMs - (now - idleSince)
568
+ if (idleSince != null && (left! <= 0 || pendingCalls.size > 0)) {
569
+ const checkpoint: FlowRunCheckpoint = {
570
+ bindingValues: context.bindingValues,
571
+ inputs: launch,
572
+ results: Object.fromEntries(completed),
573
+ counts: context.counts,
574
+ dependencies: dependencies.state,
575
+ version: 6,
576
+ agents,
577
+ waits: [...pendingWaits.values()],
578
+ ...(pendingCalls.size == 0 ? {} : { calls: [...pendingCalls.values()] }),
579
+ }
580
+ const encoded = JSON.stringify(checkpoint)
581
+ if (new TextEncoder().encode(encoded).byteLength > 16 * 1024 * 1024) return yield* Effect.fail(new Error('Flow Run checkpoint exceeds 16 MiB.'))
582
+ return { kind: 'waiting', checkpoint: decodeFlowRunCheckpoint(JSON.parse(encoded)), ...(remainingMs == null ? {} : { remainingMs }) }
583
+ }
584
+ const activity = Queue.take(changes).pipe(Effect.as({}))
585
+ const decision =
586
+ pendingWaits.size == 0 || context.waits == null
587
+ ? Effect.never
588
+ : context.waits.resolutions(
589
+ [...pendingWaits.values()].map((wait) => wait.waitId),
590
+ true,
591
+ )
592
+ let next = Effect.raceFirst(activity, decision)
593
+ if (pendingCalls.size > 0) next = Effect.raceFirst(next, Effect.sleep(1000).pipe(Effect.as({})))
594
+ if (left != null) next = Effect.raceFirst(next, Effect.sleep(Math.max(0, left)).pipe(Effect.as({})))
595
+ const resolutions = yield* next
596
+ applyResolutions(resolutions, yield* Clock.currentTimeMillis)
597
+ }
598
+ yield* context.emit({ progress: 100, runId, type: 'run.progress' })
599
+ const outputNodeId = order.find((nodeId) => target.graph.nodes[nodeId]?.kind == 'outputs')
600
+ const businessOutputs = outputNodeId == null ? undefined : completed.get(outputNodeId)?.outputs
601
+ const result: FlowRunResult = {
602
+ kind: 'node-results',
603
+ ...(businessOutputs == null ? {} : { outputs: businessOutputs }),
604
+ nodes: resultNodes.flatMap((nodeId) => {
605
+ const saved = completed.get(nodeId)
606
+ return saved == null
607
+ ? []
608
+ : [
609
+ {
610
+ nodeId,
611
+ status: saved.handled ? ('error-handled' as const) : ('completed' as const),
612
+ jobId: saved.jobId,
613
+ outputs: saved.outputs,
614
+ ...(saved.systemOutputs == null ? {} : { systemOutputs: saved.systemOutputs }),
615
+ },
616
+ ]
617
+ }),
618
+ }
619
+ yield* context.emit({ result, runId, type: 'run.completed' })
620
+ return result
621
+ }),
622
+ )
623
+ }
624
+
625
+ export function runFlow(prepared: PreparedFlow, options: FlowRunOptions): Effect.Effect<FlowRunOutcome, Error> {
626
+ const emit = options.emit ?? (() => Effect.void)
627
+ const program = Effect.gen(function* () {
628
+ if (options.resume != null && (options.inputs != null || options.trigger != null || options.bindingValues != null)) {
629
+ return yield* Effect.fail(new Error('A resumed Flow Run cannot accept launch inputs, binding values, or a Trigger seed.'))
630
+ }
631
+ const decoded = options.resume == null ? undefined : decodeFlowRunCheckpoint(options.resume.checkpoint)
632
+ const outputs = (nodeId: string, value: Readonly<Record<string, JsonValue>>) =>
633
+ isResolutionNode(prepared.graph.nodes[nodeId]) && value.pending != null ? { ...value, pending: withWaitNotificationMessage(value.pending) } : value
634
+ const checkpoint =
635
+ decoded == null
636
+ ? undefined
637
+ : {
638
+ ...decoded,
639
+ results: Object.fromEntries(Object.entries(decoded.results).map(([id, result]) => [id, { ...result, outputs: outputs(id, result.outputs) }])),
640
+ dependencies: {
641
+ ...decoded.dependencies,
642
+ nodes: Object.fromEntries(
643
+ Object.entries(decoded.dependencies.nodes).map(([id, state]) => [
644
+ id,
645
+ {
646
+ ...state,
647
+ ...(state.output == null ? {} : { output: outputs(id, state.output) }),
648
+ input: Object.fromEntries(
649
+ Object.entries(state.input).map(([source, result]) => [source, { ...result, outputs: outputs(source, result.outputs) }]),
650
+ ),
651
+ },
652
+ ]),
653
+ ),
654
+ },
655
+ waits: decoded.waits.map((wait) => (wait.pending == null ? wait : Object.assign({}, wait, { pending: withWaitNotificationMessage(wait.pending) }))),
656
+ }
657
+ if (checkpoint != null && new TextEncoder().encode(JSON.stringify(checkpoint)).byteLength > 16 * 1024 * 1024) {
658
+ return yield* Effect.fail(new Error('Flow Run checkpoint exceeds 16 MiB.'))
659
+ }
660
+ if (checkpoint == null && options.trigger == null) {
661
+ return yield* Effect.fail(new Error('A Flow Run requires a Trigger seed.'))
662
+ }
663
+ const triggerNode = options.trigger == null ? undefined : prepared.graph.nodes[options.trigger.nodeId]
664
+ if (options.trigger != null && (triggerNode == null || !isTriggerNode(triggerNode))) {
665
+ return yield* Effect.fail(new Error(`Node "${options.trigger.nodeId}" is not a TriggerNode in Flow "${options.flowId}".`))
666
+ }
667
+ const triggerOutputs = triggerNode == null || !isTriggerNode(triggerNode) ? undefined : normalizeTriggerOutputs(triggerNode, options.trigger!.outputs)
668
+ if (options.trigger != null && triggerOutputs == null) return yield* Effect.fail(new Error('Trigger outputs are invalid.'))
669
+ const trigger = options.trigger == null ? undefined : { nodeId: options.trigger.nodeId, outputs: triggerOutputs! }
670
+ return yield* runGraph(
671
+ {
672
+ failures: new WeakMap(),
673
+ counts: Object.fromEntries(Object.entries(checkpoint?.counts ?? {}).map(([scope, counts]) => [scope, { ...counts }])),
674
+ bindingValues: checkpoint?.bindingValues ?? options.bindingValues ?? {},
675
+ createId: options.createId,
676
+ emit,
677
+ invokeTask: options.invokeTask,
678
+ prepared,
679
+ projectFailure: options.projectFailure,
680
+ waits: options.waits,
681
+ remainingMs: options.remainingMs,
682
+ },
683
+ {
684
+ flowId: options.flowId,
685
+ graph: prepared.graph,
686
+ inputDefs: prepared.inputDefs,
687
+ outputDefs: prepared.outputDefs,
688
+ outputMappings: prepared.outputMappings,
689
+ },
690
+ options.runId,
691
+ options.inputs,
692
+ trigger,
693
+ checkpoint == null ? undefined : { checkpoint },
694
+ )
695
+ })
696
+ return program
697
+ }