@oomol-lab/open-flow 0.1.0-beta.72 → 0.1.0-beta.74

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