@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,531 @@
1
+ import { dequal } from 'dequal/lite'
2
+ import { decisionTaskIssues } from '../../decision/common/decision.ts'
3
+ import { httpRequestIssues, httpAuthHandles, httpRequestTask, httpRequestUrl } from '../../http/common/httpRequest.ts'
4
+ import { openApiIssues, authHandles } from '../../openapi/common/openapi.ts'
5
+ import { nodeWorkflowReferences } from '../../workflow/common/workflow.ts'
6
+ import { isTriggerNode } from './change.ts'
7
+ export { renderPrompt } from './promptTemplate.ts'
8
+ export { connectionUsage, removeConnectionUsage } from './connectionUsage.ts'
9
+ import { matchesTriggerOutputs, normalizeTriggerOutputs } from '../../trigger/common/contract.ts'
10
+ import { nodeInputMappings } from './condition.ts'
11
+ import { connectionUsage } from './connectionUsage.ts'
12
+ export { matchesTriggerOutputs, normalizeTriggerOutputs, triggerOutputDefinitions, triggerOutputPorts } from '../../trigger/common/contract.ts'
13
+ import type { EngineContract } from '../../execution/common/engineContract.ts'
14
+ import type { RuntimeProgram } from '../../execution/common/runtime.ts'
15
+ import type { ConnectorActionCapability, ConnectorCapability, Graph, InputMapping, JsonValue, Port, RevisionContent, SchemaMismatch } from './change.ts'
16
+
17
+ import { findEngineContract } from '../../execution/common/engineContract.ts'
18
+ import { agentConfigIssues } from './agent.ts'
19
+ import { decodeTaskCapabilities } from './change.ts'
20
+ import { canonicalJsonBytes, canonicalModule, canonicalRevisionGraph, digestBytes } from './encoding.ts'
21
+ import { nodeInputPorts, validateFlowGraph } from './graph.ts'
22
+ import { inputValue } from './inputValue.ts'
23
+ import { compareDiagnostics, validateModuleGraph } from './modules.ts'
24
+ import { hasRetiredRef } from './schema.ts'
25
+ export { availableOutputs, graphOrder, nodeInputPorts } from './graph.ts'
26
+ export { validateModules } from './modules.ts'
27
+ export { matchesSchema, schemaValidationErrors, variableInputCompatible } from './schema.ts'
28
+ export { agentInput, agentToolInput, agentToolSchema } from './agent.ts'
29
+
30
+ export interface SemanticClosure {
31
+ readonly dependencies: {
32
+ readonly bindings: ReadonlySet<string>
33
+ readonly nodes: ReadonlySet<string>
34
+ readonly modules: ReadonlySet<string>
35
+ }
36
+ readonly digest: string
37
+ }
38
+
39
+ function entries<T>(value: Readonly<Record<string, T>>): readonly (readonly [string, T])[] {
40
+ return Object.keys(value)
41
+ .toSorted()
42
+ .map((key) => [key, value[key]!] as const)
43
+ }
44
+
45
+ export function flowDependencies(content: RevisionContent, triggerId?: string): SemanticClosure['dependencies'] {
46
+ if (triggerId != null) return flowDependencies(runRevision(content, triggerId))
47
+ const bindings = new Set<string>()
48
+ const modules = new Set<string>()
49
+
50
+ function visitModule(id: string): void {
51
+ if (modules.has(id)) return
52
+ modules.add(id)
53
+ const module = content.modules[id]
54
+ if (module == null) return
55
+ for (const imported of module.imports.toSorted()) visitModule(imported)
56
+ }
57
+
58
+ function visitInputMappings(value: Readonly<Record<string, InputMapping>>): void {
59
+ for (const mapping of Object.values(value)) {
60
+ if (mapping.kind != 'sources') continue
61
+ for (const source of mapping.sources) {
62
+ if (source.kind != 'binding') continue
63
+ bindings.add(source.bindingId)
64
+ }
65
+ }
66
+ }
67
+
68
+ function visitGraph(value: Graph): void {
69
+ for (const [, node] of entries(value.nodes)) {
70
+ if (!isTriggerNode(node)) visitInputMappings(nodeInputMappings(node))
71
+ switch (node.kind) {
72
+ case 'condition':
73
+ break
74
+ case 'task':
75
+ if ('moduleId' in node.task) visitModule(node.task.moduleId)
76
+ break
77
+ case 'outputs':
78
+ case 'value':
79
+ break
80
+ case 'approval':
81
+ case 'wait':
82
+ break
83
+ case 'poll':
84
+ case 'integration':
85
+ case 'cron':
86
+ case 'error':
87
+ case 'manual':
88
+ case 'start':
89
+ case 'webhook':
90
+ break
91
+ }
92
+ }
93
+ }
94
+
95
+ visitGraph(content.document.graph)
96
+
97
+ return { bindings, modules, nodes: new Set(Object.keys(content.document.graph.nodes)) }
98
+ }
99
+
100
+ export async function flowClosure(content: RevisionContent): Promise<SemanticClosure> {
101
+ const dependencies = flowDependencies(content)
102
+ return { dependencies, digest: await digestBytes(closureBytes(content, dependencies)) }
103
+ }
104
+
105
+ /** Canonical semantic bytes, also used by transactional storage upgrades. */
106
+ export function encodeFlowClosure(content: RevisionContent, triggerId?: string): Uint8Array {
107
+ const scoped = triggerId == null ? content : runRevision(content, triggerId)
108
+ return closureBytes(scoped, flowDependencies(scoped))
109
+ }
110
+
111
+ function closureBytes(content: RevisionContent, dependencies: SemanticClosure['dependencies']): Uint8Array {
112
+ const { bindings, modules } = dependencies
113
+ return canonicalJsonBytes({
114
+ bindings: Object.fromEntries([...bindings].toSorted().map((id) => [id, content.document.bindings[id] ?? null])),
115
+ graph: canonicalRevisionGraph(content, content.document.graph),
116
+ kind: 'open-flow-semantic-closure',
117
+ ...(content.modelVersion < 6 ? { subflows: {} } : {}),
118
+ modelVersion: content.modelVersion,
119
+ modules: Object.fromEntries([...modules].toSorted().map((id) => [id, content.modules[id] == null ? null : canonicalModule(content.modules[id])])),
120
+ ...(content.modelVersion < 6 ? { tasks: {} } : {}),
121
+ version: 2,
122
+ })
123
+ }
124
+
125
+ export function variableBindings(revision: RevisionContent, bindingIds: Iterable<string>): Readonly<Record<string, string>> {
126
+ return Object.fromEntries(
127
+ [...bindingIds].flatMap((bindingId) => {
128
+ const binding = revision.document.bindings[bindingId]
129
+ return binding?.kind == 'variable' ? [[bindingId, binding.target]] : []
130
+ }),
131
+ )
132
+ }
133
+
134
+ export interface FlowResourceReferences {
135
+ readonly calledFlowIds?: readonly string[]
136
+ readonly variableNames: readonly string[]
137
+ readonly connections: readonly { readonly providerId: string; readonly connectionId: string }[]
138
+ readonly errorSourceFlowIds: readonly string[]
139
+ }
140
+
141
+ export function flowResourceReferences(content: RevisionContent): FlowResourceReferences {
142
+ const connections = new Map<string, { readonly providerId: string; readonly connectionId: string }>()
143
+ for (const use of connectionUsage(content.document)) {
144
+ if (use.connectionId == null || use.connectionId === '') continue
145
+ connections.set(JSON.stringify([use.providerId, use.connectionId]), { providerId: use.providerId, connectionId: use.connectionId })
146
+ }
147
+ return {
148
+ calledFlowIds: [
149
+ ...new Set(
150
+ Object.values(content.document.graph.nodes).flatMap((node) =>
151
+ nodeWorkflowReferences(node)
152
+ .map(({ target }) => target.flowId)
153
+ .filter(Boolean),
154
+ ),
155
+ ),
156
+ ].toSorted(),
157
+ variableNames: [...new Set(Object.values(variableBindings(content, flowDependencies(content).bindings)))].toSorted(),
158
+ connections: [...connections].toSorted(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)).map(([, value]) => value),
159
+ errorSourceFlowIds: [
160
+ ...new Set(Object.values(content.document.graph.nodes).flatMap((node) => (node.kind == 'error' ? (node.sourceFlowIds ?? []) : []))),
161
+ ].toSorted(),
162
+ }
163
+ }
164
+
165
+ export interface Diagnostic {
166
+ readonly code: string
167
+ readonly column: number
168
+ readonly fields?: readonly string[]
169
+ readonly line: number
170
+ readonly message: string
171
+ readonly mismatch?: SchemaMismatch
172
+ readonly path: string
173
+ readonly values?: Readonly<Record<string, string | number>>
174
+ }
175
+
176
+ export interface FlowValidation {
177
+ readonly closure: SemanticClosure
178
+ readonly diagnostics: readonly Diagnostic[]
179
+ readonly valid: boolean
180
+ }
181
+
182
+ export type FlowInputsValidation = 'invalid' | 'valid'
183
+
184
+ export function validRunTrigger(revision: RevisionContent, value: unknown): boolean {
185
+ if (value == null || typeof value != 'object' || Array.isArray(value)) return false
186
+ const trigger = value as Readonly<Record<string, unknown>>
187
+ if (Object.keys(trigger).some((key) => key != 'nodeId' && key != 'outputs') || typeof trigger.nodeId != 'string' || !Object.hasOwn(trigger, 'outputs'))
188
+ return false
189
+ const node = revision.document.graph.nodes[trigger.nodeId]
190
+ return node != null && isTriggerNode(node) && matchesTriggerOutputs(node, trigger.outputs)
191
+ }
192
+
193
+ export function normalizeRunTrigger(
194
+ revision: RevisionContent,
195
+ value: unknown,
196
+ ): { readonly nodeId: string; readonly outputs: Readonly<Record<string, JsonValue>> } | undefined {
197
+ if (value == null || typeof value != 'object' || Array.isArray(value)) return
198
+ const trigger = value as Readonly<Record<string, unknown>>
199
+ if (Object.keys(trigger).some((key) => key != 'nodeId' && key != 'outputs') || typeof trigger.nodeId != 'string' || !Object.hasOwn(trigger, 'outputs')) return
200
+ const node = revision.document.graph.nodes[trigger.nodeId]
201
+ if (node == null || !isTriggerNode(node)) return
202
+ const outputs = normalizeTriggerOutputs(node, trigger.outputs)
203
+ return outputs == null ? undefined : { nodeId: trigger.nodeId, outputs }
204
+ }
205
+
206
+ export function validateFlowInputs(revision: RevisionContent, value: unknown): FlowInputsValidation {
207
+ if (value == null || typeof value != 'object' || Array.isArray(value)) return 'invalid'
208
+ const graph = revision.document.graph
209
+ for (const [nodeId, candidate] of Object.entries(value)) {
210
+ const node = graph.nodes[nodeId]
211
+ if (node == null || isTriggerNode(node) || node.kind == 'condition' || candidate == null || typeof candidate != 'object' || Array.isArray(candidate)) {
212
+ return 'invalid'
213
+ }
214
+ const inputs = nodeInputPorts(node)
215
+ for (const handle of Object.keys(candidate)) {
216
+ const port = inputs[handle]
217
+ if (port == null || hasRetiredRef(port.jsonSchema) || nodeInputMappings(node)[handle] != null || Object.hasOwn(port, 'value')) return 'invalid'
218
+ }
219
+ }
220
+ return 'valid'
221
+ }
222
+
223
+ export async function validateFlow(revision: RevisionContent, engine: EngineContract): Promise<FlowValidation> {
224
+ const closure = await flowClosure(revision)
225
+ const checked = validateModuleGraph(revision, [...closure.dependencies.modules], engine)
226
+ checked.diagnostics.push(...validateFlowGraph(revision))
227
+ const missingEntryModules = new Set<string>()
228
+ for (const [nodeId, node] of Object.entries(revision.document.graph.nodes)) {
229
+ if (node.kind != 'task' || !('moduleId' in node.task)) continue
230
+ if (revision.modules[node.task.moduleId] == null) {
231
+ checked.diagnostics.push({
232
+ code: 'task.module-missing',
233
+ column: 0,
234
+ line: 1,
235
+ message: `Inline Task "${nodeId}" references missing CodeModule "${node.task.moduleId}".`,
236
+ path: `/document/graph/nodes/${nodeId}/task/moduleId`,
237
+ values: { moduleId: node.task.moduleId, nodeId },
238
+ })
239
+ } else if (checked.analysis.get(node.task.moduleId)?.exports.has('default') == false && !missingEntryModules.has(node.task.moduleId)) {
240
+ missingEntryModules.add(node.task.moduleId)
241
+ checked.diagnostics.push({
242
+ code: 'task.missing-entry',
243
+ column: 0,
244
+ line: 1,
245
+ message: `CodeModule "${node.task.moduleId}" used by an Inline Task must export a default function.`,
246
+ path: `/modules/${node.task.moduleId}/source`,
247
+ values: { moduleId: node.task.moduleId },
248
+ })
249
+ }
250
+ try {
251
+ decodeTaskCapabilities(node.task.capabilities === undefined ? [] : node.task.capabilities)
252
+ } catch {
253
+ checked.diagnostics.push({
254
+ code: 'task.capability-incomplete',
255
+ column: 0,
256
+ line: 1,
257
+ message: `Inline Task "${nodeId}" has an incomplete Connector Capability.`,
258
+ path: `/document/graph/nodes/${nodeId}/task/capabilities`,
259
+ values: { nodeId },
260
+ })
261
+ }
262
+ }
263
+ for (const [nodeId, node] of Object.entries(revision.document.graph.nodes)) {
264
+ if (node.kind != 'task' || !('executor' in node.task)) continue
265
+ const task = node.task
266
+ for (const issue of decisionTaskIssues(task))
267
+ checked.diagnostics.push({
268
+ code: 'decision.config-invalid',
269
+ column: 0,
270
+ line: 1,
271
+ message: issue.message,
272
+ path: `/document/graph/nodes/${nodeId}/task/executor`,
273
+ })
274
+ for (const message of openApiIssues(task))
275
+ checked.diagnostics.push({ code: 'openapi.config-invalid', column: 0, line: 1, message, path: `/document/graph/nodes/${nodeId}/task/executor` })
276
+ if (task.executor.kind == 'http-request') {
277
+ for (const issue of httpRequestIssues(task.executor))
278
+ checked.diagnostics.push({
279
+ code: 'http-request.config-invalid',
280
+ column: 0,
281
+ line: 1,
282
+ message: issue.message,
283
+ path: `/document/graph/nodes/${nodeId}/task/executor/${issue.field}`,
284
+ })
285
+ if (node.inputs.url?.kind == 'value') {
286
+ try {
287
+ httpRequestUrl(node.inputs.url.value)
288
+ } catch {
289
+ checked.diagnostics.push({
290
+ code: 'http-request.url-invalid',
291
+ column: 0,
292
+ line: 1,
293
+ message: 'Enter an HTTP(S) URL without embedded credentials.',
294
+ path: `/document/graph/nodes/${nodeId}/inputs/url`,
295
+ })
296
+ }
297
+ }
298
+ if (task.executor.bodyFormat != 'none' && (node.inputs.body == null || node.inputs.body.kind == 'unset'))
299
+ checked.diagnostics.push({
300
+ code: 'http-request.body-required',
301
+ column: 0,
302
+ line: 1,
303
+ message: 'Set or bind the request body; JSON null is an explicit value.',
304
+ path: `/document/graph/nodes/${nodeId}/inputs/body`,
305
+ })
306
+ const expected = httpRequestTask(task.executor)
307
+
308
+ if (
309
+ !dequal(httpPortContracts(task.inputs), httpPortContracts(expected.inputs)) ||
310
+ !dequal(httpPortContracts(task.outputs), httpPortContracts(expected.outputs))
311
+ )
312
+ checked.diagnostics.push({
313
+ code: 'http-request.ports-invalid',
314
+ column: 0,
315
+ line: 1,
316
+ message: 'HTTP Request ports must match its configuration.',
317
+ path: `/document/graph/nodes/${nodeId}/task`,
318
+ })
319
+ }
320
+ if (task.executor.kind == 'openapi' || task.executor.kind == 'http-request') {
321
+ const handles = task.executor.kind == 'openapi' ? authHandles(task.executor.auth) : httpAuthHandles(task.executor)
322
+ for (const handle of handles) {
323
+ const mapping = node.inputs[handle]
324
+ if (mapping?.kind != 'sources' || mapping.sources.length == 0)
325
+ checked.diagnostics.push({
326
+ code: `${task.executor.kind}.auth-source`,
327
+ column: 0,
328
+ line: 1,
329
+ message: 'Authentication requires a deployment variable or upstream output.',
330
+ path: `/document/graph/nodes/${nodeId}/inputs/${handle}`,
331
+ })
332
+ }
333
+ }
334
+ for (const message of agentConfigIssues(task)) {
335
+ checked.diagnostics.push({ code: 'agent.config-invalid', column: 0, line: 1, message, path: `/document/graph/nodes/${nodeId}/task/executor` })
336
+ }
337
+ if (task.executor.kind == 'connector' && task.executor.action == 'leina.send_notification') {
338
+ const mapping = node.inputs.leinaId
339
+ const value = inputValue(mapping, nodeInputPorts(node).leinaId?.value)
340
+ if ((mapping?.kind != 'sources' || mapping.sources.length == 0) && (typeof value != 'string' || value.trim().length == 0)) {
341
+ checked.diagnostics.push({
342
+ code: 'leina.robot-required',
343
+ column: 0,
344
+ line: 1,
345
+ message: 'Select a Leina robot or bind its identifier to an input source.',
346
+ path: `/document/graph/nodes/${nodeId}/inputs/leinaId`,
347
+ })
348
+ }
349
+ }
350
+ if (task.executor.kind == 'connector' && task.executor.action.length == 0) {
351
+ checked.diagnostics.push({
352
+ code: 'task.connector-incomplete',
353
+ column: 0,
354
+ line: 1,
355
+ message: `Connector Task "${nodeId}" requires an action.`,
356
+ path: `/document/graph/nodes/${nodeId}/task/executor`,
357
+ values: { nodeId },
358
+ })
359
+ }
360
+ }
361
+ const diagnostics = checked.diagnostics.toSorted(compareDiagnostics)
362
+ return { closure, diagnostics, valid: diagnostics.length == 0 }
363
+ }
364
+
365
+ export interface PreparedFlow {
366
+ readonly inputDefs: readonly Port[]
367
+ readonly outputDefs: readonly Port[]
368
+ readonly outputMappings: Readonly<Record<string, InputMapping>>
369
+ readonly closureDigest: string
370
+ readonly engineContract: string
371
+ readonly graph: Graph
372
+ readonly modules: RevisionContent['modules']
373
+ }
374
+
375
+ export type PrepareFlowResult =
376
+ | { readonly kind: 'engine-unsupported' }
377
+ | { readonly kind: 'flow-invalid'; readonly validation: FlowValidation }
378
+ | { readonly flow: PreparedFlow; readonly kind: 'prepared'; readonly validation: FlowValidation }
379
+
380
+ function runRevision(revision: RevisionContent, triggerId: string): RevisionContent {
381
+ const graph = revision.document.graph
382
+ const reachable = new Set([triggerId])
383
+ for (const nodeId of reachable) {
384
+ for (const edge of graph.edges) if (edge.source == nodeId) reachable.add(edge.target)
385
+ }
386
+ function inputs(nodeId: string, mappings: Readonly<Record<string, InputMapping>>): Readonly<Record<string, InputMapping>> {
387
+ const ancestors = new Set<string>()
388
+ for (const edge of graph.edges) if (edge.target == nodeId) ancestors.add(edge.source)
389
+ for (const ancestor of ancestors) {
390
+ for (const edge of graph.edges) if (edge.target == ancestor) ancestors.add(edge.source)
391
+ }
392
+ return Object.fromEntries(
393
+ Object.entries(mappings).map(([handle, mapping]) => [
394
+ handle,
395
+ mapping.kind != 'sources'
396
+ ? mapping
397
+ : {
398
+ ...mapping,
399
+ sources: mapping.sources.filter(
400
+ (source) => source.kind != 'node' || graph.nodes[source.nodeId] == null || reachable.has(source.nodeId) || !ancestors.has(source.nodeId),
401
+ ),
402
+ },
403
+ ]),
404
+ )
405
+ }
406
+ const nodes: Record<string, Graph['nodes'][string]> = {}
407
+ for (const nodeId of reachable) {
408
+ const node = graph.nodes[nodeId]
409
+ if (node == null) continue
410
+ nodes[nodeId] =
411
+ node.kind == 'outputs'
412
+ ? { ...node, outputMappings: inputs(nodeId, node.outputMappings) }
413
+ : isTriggerNode(node)
414
+ ? node
415
+ : {
416
+ ...node,
417
+ inputs: inputs(nodeId, node.inputs),
418
+ }
419
+ }
420
+ const content = {
421
+ ...revision,
422
+ document: {
423
+ ...revision.document,
424
+ graph: { nodes, edges: graph.edges.filter((edge) => reachable.has(edge.source)) },
425
+ },
426
+ }
427
+ const { bindings } = flowDependencies(content)
428
+ return {
429
+ ...content,
430
+ document: { ...content.document, bindings: Object.fromEntries(Object.entries(content.document.bindings).filter(([id]) => bindings.has(id))) },
431
+ }
432
+ }
433
+
434
+ const httpPortContracts = (ports: import('./change.ts').ManagedTaskDefinition['inputs']) =>
435
+ ports
436
+ .filter((port) => 'handle' in port)
437
+ .map(({ handle, jsonSchema, nullable }) => ({ handle, jsonSchema, nullable }))
438
+ .toSorted((a, b) => a.handle.localeCompare(b.handle))
439
+
440
+ export async function prepareFlow(revision: RevisionContent, engineContract: string, triggerId?: string): Promise<PrepareFlowResult> {
441
+ const engine = findEngineContract(engineContract)
442
+ if (engine == null) return { kind: 'engine-unsupported' }
443
+ if (
444
+ !engine.httpRequests &&
445
+ Object.values(revision.document.graph.nodes).some((node) => node.kind == 'task' && 'executor' in node.task && node.task.executor.kind == 'http-request')
446
+ )
447
+ return { kind: 'engine-unsupported' }
448
+ if (!engine.workflowTools && Object.values(revision.document.graph.nodes).some((node) => nodeWorkflowReferences(node).some((ref) => ref.tool != null)))
449
+ return { kind: 'engine-unsupported' }
450
+ if (triggerId != null) {
451
+ const trigger = revision.document.graph.nodes[triggerId]
452
+ if (trigger == null || !isTriggerNode(trigger))
453
+ return {
454
+ kind: 'flow-invalid',
455
+ validation: {
456
+ closure: await flowClosure(revision),
457
+ diagnostics: [
458
+ {
459
+ code: 'graph.trigger-invalid',
460
+ column: 0,
461
+ line: 1,
462
+ message: 'Select an existing Trigger node.',
463
+ path: '/document/graph',
464
+ values: { nodeId: triggerId },
465
+ },
466
+ ],
467
+ valid: false,
468
+ },
469
+ }
470
+ revision = runRevision(revision, triggerId)
471
+ }
472
+ if (
473
+ !engine.webhookResponses &&
474
+ Object.values(revision.document.graph.nodes).some(
475
+ (node) => node.kind === 'webhook-response' || (node.kind === 'webhook' && node.options?.responseBody?.kind === 'webhook-response'),
476
+ )
477
+ )
478
+ return { kind: 'engine-unsupported' }
479
+ if (!engine.waitAutoContinue && Object.values(revision.document.graph.nodes).some((node) => node.kind == 'wait' && node.autoContinue != null))
480
+ return { kind: 'engine-unsupported' }
481
+ const validation = await validateFlow(revision, engine)
482
+ if (!validation.valid) return { kind: 'flow-invalid', validation }
483
+ const { closure } = validation
484
+ const start = Object.values(revision.document.graph.nodes).find((node) => node.kind == 'start')
485
+ const outputs = Object.values(revision.document.graph.nodes).find((node) => node.kind == 'outputs')
486
+ return {
487
+ flow: {
488
+ closureDigest: closure.digest,
489
+ engineContract,
490
+ inputDefs: start?.inputDefs ?? [],
491
+ outputDefs: outputs?.outputDefs ?? [],
492
+ outputMappings: outputs?.outputMappings ?? {},
493
+ graph: revision.document.graph,
494
+ modules: Object.fromEntries([...closure.dependencies.modules].toSorted().map((id) => [id, revision.modules[id]!])),
495
+ },
496
+ kind: 'prepared',
497
+ validation,
498
+ }
499
+ }
500
+
501
+ export function createRuntimeProgram(prepared: PreparedFlow, entryModuleId: string, engineDigest: string): RuntimeProgram | undefined {
502
+ if (!Object.hasOwn(prepared.modules, entryModuleId)) return
503
+ return {
504
+ engineContract: prepared.engineContract,
505
+ engineDigest,
506
+ entryModuleId,
507
+ modules: prepared.modules,
508
+ }
509
+ }
510
+
511
+ export function agentActions(flow: Pick<PreparedFlow, 'graph'>): readonly ConnectorActionCapability[] {
512
+ return Object.values(flow.graph.nodes).flatMap((node) => {
513
+ if (node.kind != 'task' || !('executor' in node.task)) return []
514
+ const task = node.task
515
+ if (task.executor.kind != 'agent') return []
516
+ const notice = task.executor.notification
517
+ return [...task.executor.tools.filter((tool) => tool.kind != 'workflow'), ...(notice != null ? [notice] : [])]
518
+ .filter((tool) => tool.connectionId !== '')
519
+ .map((tool) => ({
520
+ kind: 'connector' as const,
521
+ action: tool.action,
522
+ connections: tool.connectionId == null ? [] : [{ connectionId: tool.connectionId }],
523
+ }))
524
+ })
525
+ }
526
+
527
+ export function codeActions(flow: Pick<PreparedFlow, 'graph'>): readonly ConnectorCapability[] {
528
+ return Object.values(flow.graph.nodes).flatMap((node) =>
529
+ node.kind == 'task' && 'moduleId' in node.task ? (node.task.capabilities ?? []).filter((item) => item.kind == 'connector') : [],
530
+ )
531
+ }
@@ -0,0 +1,35 @@
1
+ import type { NodeSource, PortDefinition } from './change.ts'
2
+
3
+ import { schemaObject } from './schema.ts'
4
+
5
+ /** Only explicitly declared, first-level object properties are selectable. */
6
+ export function sourceFields(output: PortDefinition): readonly { readonly field: string; readonly port: PortDefinition }[] {
7
+ const schema = schemaObject(output.jsonSchema)
8
+ if (schema == null) return []
9
+ const properties = schemaObject(schema.properties ?? false)
10
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type]
11
+ if (properties == null || (schema.type !== undefined && !types.includes('object'))) return []
12
+ const required = Array.isArray(schema.required) ? schema.required : []
13
+ const missingParent = output.nullable || types.some((type) => type !== 'object')
14
+ return Object.entries(properties).map(([field, jsonSchema]) => {
15
+ const description = schemaObject(jsonSchema)?.description
16
+ return {
17
+ field,
18
+ port: {
19
+ ...(typeof description == 'string' ? { description } : {}),
20
+ jsonSchema,
21
+ nullable: missingParent || !required.includes(field),
22
+ },
23
+ }
24
+ })
25
+ }
26
+
27
+ export function sourcePort(output: PortDefinition, field: string | undefined): PortDefinition | undefined {
28
+ return field === undefined ? output : sourceFields(output).find((candidate) => candidate.field === field)?.port
29
+ }
30
+
31
+ /** Present a selected first-level field as a compact path from its output. */
32
+ export function sourceOutputLabel(source: Pick<NodeSource, 'output' | 'field' | 'system'>): string {
33
+ const output = source.system ? `$system / ${source.output}` : source.output
34
+ return source.field === undefined ? output : `${output} / ${source.field}`
35
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod'
2
+
3
+ export const triggerScheduleSchema = z.array(
4
+ z.union([
5
+ z.object({ type: z.literal('cron'), expression: z.string(), timezone: z.string() }),
6
+ z.object({ type: z.literal('every'), unit: z.enum(['day', 'hour', 'minute', 'month', 'week']), value: z.number() }),
7
+ ]),
8
+ )
@@ -0,0 +1,30 @@
1
+ import type { WaitAutoContinue } from './change.ts'
2
+
3
+ import { z } from 'zod'
4
+ import { isTimeZone } from '../../localization/common/timeZone.ts'
5
+
6
+ /** Drafts retain incomplete values; semantic validation gates publication and execution. */
7
+ export const waitAutoContinueDraftSchema = z.discriminatedUnion('kind', [
8
+ z.strictObject({ kind: z.literal('after'), durationMs: z.number().nullable() }),
9
+ z.strictObject({
10
+ kind: z.literal('at'),
11
+ at: z.string(),
12
+ timezone: z.string().optional(),
13
+ }),
14
+ ])
15
+
16
+ /** Static business configuration; the deployment owns the allowed wait lifetime. */
17
+ export const waitAutoContinueSchema = z.discriminatedUnion('kind', [
18
+ waitAutoContinueDraftSchema.options[0].extend({ durationMs: z.number().int().positive().max(Number.MAX_SAFE_INTEGER) }),
19
+ waitAutoContinueDraftSchema.options[1].extend({
20
+ at: z.iso.datetime({ offset: true }),
21
+ timezone: z.string().refine(isTimeZone, 'Select a valid IANA timezone.').optional(),
22
+ }),
23
+ ])
24
+
25
+ /** Resolve one registration's intent; the deployment separately enforces its lifetime. */
26
+ export function waitAutoContinueAt(config: WaitAutoContinue, waitingSince: number): number {
27
+ const timing = waitAutoContinueSchema.parse(config)
28
+ const at = timing.kind == 'after' ? waitingSince + timing.durationMs : Date.parse(timing.at)
29
+ return Math.max(waitingSince, at)
30
+ }
@@ -0,0 +1,7 @@
1
+ export const webhookMethods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const
2
+
3
+ export type WebhookMethod = (typeof webhookMethods)[number]
4
+
5
+ export function webhookSupportsBody(method: WebhookMethod): boolean {
6
+ return method !== 'GET'
7
+ }