@oomol-lab/open-flow 0.1.0-beta.73 → 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 +59 -22
  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,459 @@
1
+ import type { InputPort, JsonValue, ManagedTaskDefinition, Port } from '../../flow/common/change.ts'
2
+
3
+ import { dequal } from 'dequal/lite'
4
+ import { matchesSchema } from '../../flow/common/schema.ts'
5
+
6
+ type ObjectValue = { [key: string]: JsonValue }
7
+ export interface OpenApiAuth {
8
+ readonly id: string
9
+ readonly type: 'bearer' | 'basic' | 'apiKey'
10
+ readonly name?: string
11
+ readonly in?: 'header' | 'query'
12
+ }
13
+ export interface OpenApiExecutor {
14
+ readonly kind: 'openapi'
15
+ readonly sourceUrl: string
16
+ readonly method: string
17
+ readonly path: string
18
+ readonly serverUrl: string
19
+ readonly document: JsonValue
20
+ readonly auth: readonly OpenApiAuth[]
21
+ }
22
+ export interface OpenApiOperation {
23
+ readonly method: string
24
+ readonly path: string
25
+ readonly label: string
26
+ readonly tag: string
27
+ }
28
+ const methods = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']
29
+ export function object(value: unknown): ObjectValue {
30
+ if (value == null || typeof value != 'object' || Array.isArray(value)) throw new Error('Expected an OpenAPI object.')
31
+ return value as ObjectValue
32
+ }
33
+ export function httpUrl(value: string, base?: string): string {
34
+ const url = new URL(value, base)
35
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.hash)
36
+ throw new Error('An HTTP(S) URL without credentials or fragment is required.')
37
+ return url.href
38
+ }
39
+ export function parseOpenApi(value: unknown): ObjectValue {
40
+ const doc = object(value)
41
+ if (typeof doc.openapi != 'string' || !/^3\.[01]\.\d+$/.test(doc.openapi)) throw new Error('Only OpenAPI 3.0 and 3.1 JSON documents are supported.')
42
+ object(doc.paths)
43
+ return doc
44
+ }
45
+ function pointer(doc: ObjectValue, ref: string): JsonValue {
46
+ if (!ref.startsWith('#/')) throw new Error('External OpenAPI references are not supported.')
47
+ let value: JsonValue = doc
48
+ for (const key of decodeURIComponent(ref.slice(2))
49
+ .split('/')
50
+ .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))) {
51
+ const source = object(value)
52
+ if (!Object.hasOwn(source, key)) throw new Error('An OpenAPI reference is missing.')
53
+ value = source[key]!
54
+ }
55
+ return value
56
+ }
57
+ function resolved(doc: ObjectValue, value: JsonValue): ObjectValue {
58
+ let result = object(value)
59
+ const seen = new Set<string>()
60
+ while (typeof result.$ref == 'string') {
61
+ if (seen.has(result.$ref)) throw new Error('Circular non-schema reference is unsupported.')
62
+ seen.add(result.$ref)
63
+ const { $ref, ...siblings } = result
64
+ result = { ...object(pointer(doc, $ref)), ...siblings }
65
+ }
66
+ return result
67
+ }
68
+ export function listOperations(documentValue: JsonValue): OpenApiOperation[] {
69
+ const doc = parseOpenApi(documentValue)
70
+ return Object.entries(object(doc.paths)).flatMap(([path, value]) => {
71
+ const item = resolved(doc, value)
72
+ return methods
73
+ .filter((method) => item[method] != null)
74
+ .map((method) => {
75
+ const op = object(item[method])
76
+ return {
77
+ method,
78
+ path,
79
+ label: String(op.summary ?? op.operationId ?? `${method.toUpperCase()} ${path}`),
80
+ tag: String((op.tags as JsonValue[] | undefined)?.[0] ?? ''),
81
+ }
82
+ })
83
+ })
84
+ }
85
+ function operation(doc: ObjectValue, path: string, method: string): { item: ObjectValue; op: ObjectValue } {
86
+ const item = resolved(doc, object(doc.paths)[path]!)
87
+ if (!methods.includes(method) || item[method] == null) throw new Error('The selected operation is no longer available.')
88
+ return { item, op: object(item[method]) }
89
+ }
90
+ export function servers(value: JsonValue, path: string, method: string): readonly ObjectValue[] {
91
+ const doc = parseOpenApi(value)
92
+ const { item, op } = operation(doc, path, method)
93
+ const entries = op.servers ?? item.servers ?? doc.servers
94
+ if (!Array.isArray(entries) || entries.length == 0) return [{ url: '/' }]
95
+ return entries.map(object)
96
+ }
97
+ export function serverAddress(server: ObjectValue, sourceUrl: string, variables: Readonly<Record<string, string>> = {}): string {
98
+ return httpUrl(
99
+ String(server.url).replace(/\{([^}]+)\}/g, (_, name: string) => {
100
+ const definition = object(object(server.variables)[name])
101
+ const value = variables[name] ?? definition.default
102
+ if (typeof value != 'string' || (Array.isArray(definition.enum) && !definition.enum.includes(value))) throw new Error('A server variable is invalid.')
103
+ return value
104
+ }),
105
+ sourceUrl,
106
+ )
107
+ }
108
+ export function securityOptions(value: JsonValue, path: string, method: string): readonly { label: string; auth?: readonly OpenApiAuth[]; error?: string }[] {
109
+ const doc = parseOpenApi(value)
110
+ const { op } = operation(doc, path, method)
111
+ const requirements = op.security ?? doc.security ?? []
112
+ if (!Array.isArray(requirements)) throw new Error('Invalid security requirements.')
113
+ if (!requirements.length) return [{ label: 'None', auth: [] }]
114
+ return requirements.map((entry) => {
115
+ const names = Object.keys(object(entry))
116
+ const label = names.join(' + ') || 'None'
117
+ try {
118
+ if (!names.length) return { label, auth: [] }
119
+ const schemes = object(object(doc.components).securitySchemes)
120
+ return {
121
+ label,
122
+ auth: names.map((id): OpenApiAuth => {
123
+ const scheme = resolved(doc, schemes[id]!)
124
+ if (scheme.type == 'http' && ['bearer', 'basic'].includes(String(scheme.scheme).toLowerCase()))
125
+ return { id, type: String(scheme.scheme).toLowerCase() as 'bearer' | 'basic' }
126
+ if (scheme.type == 'apiKey' && (scheme.in == 'header' || scheme.in == 'query') && typeof scheme.name == 'string')
127
+ return { id, type: 'apiKey', name: scheme.name, in: scheme.in }
128
+ throw new Error('This security scheme is unsupported. Supply an access token using manual Bearer authentication if applicable.')
129
+ }),
130
+ }
131
+ } catch (error) {
132
+ return { label, error: (error as Error).message }
133
+ }
134
+ })
135
+ }
136
+ // The miniature document retains only the selected operation and reachable references.
137
+ export function snapshot(documentValue: JsonValue, path: string, method: string): JsonValue {
138
+ const doc = parseOpenApi(documentValue)
139
+ const { item, op } = operation(doc, path, method)
140
+ const security = op.security ?? doc.security ?? []
141
+ const result: ObjectValue = {
142
+ openapi: doc.openapi!,
143
+ paths: { [path]: { [method]: op, ...(item.parameters == null ? {} : { parameters: item.parameters }) } },
144
+ servers: servers(doc, path, method) as JsonValue,
145
+ security,
146
+ }
147
+ const visited = new Set<string>()
148
+ function copy(ref: string): void {
149
+ if (visited.has(ref)) return
150
+ visited.add(ref)
151
+ const value = pointer(doc, ref)
152
+ const keys = decodeURIComponent(ref.slice(2))
153
+ .split('/')
154
+ .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))
155
+ if (keys.some((key) => ['__proto__', 'constructor', 'prototype'].includes(key))) throw new Error('Unsupported reference key.')
156
+ let target = result
157
+ for (const key of keys.slice(0, -1)) {
158
+ if (!Object.hasOwn(target, key)) target[key] = {}
159
+ target = object(target[key])
160
+ }
161
+ target[keys.at(-1)!] = structuredClone(value)
162
+ visit(value)
163
+ }
164
+ function visit(value: JsonValue): void {
165
+ if (value == null || typeof value != 'object') return
166
+ if (Array.isArray(value)) {
167
+ value.forEach(visit)
168
+ return
169
+ }
170
+ if (typeof object(value).$ref == 'string') copy(object(value).$ref as string)
171
+ for (const [key, child] of Object.entries(value)) if (!['example', 'examples', 'default'].includes(key)) visit(child)
172
+ }
173
+ visit(result)
174
+ for (const entry of security as JsonValue[])
175
+ for (const name of Object.keys(object(entry))) copy(`#/components/securitySchemes/${name.replace(/~/g, '~0').replace(/\//g, '~1')}`)
176
+ return structuredClone(result)
177
+ }
178
+ function schema(doc: ObjectValue, schemaValue: JsonValue): JsonValue {
179
+ const defs: ObjectValue = {}
180
+ const ids = new Map<string, string>()
181
+ function convert(value: JsonValue): JsonValue {
182
+ if (typeof value == 'boolean') return value
183
+ const source = object(value)
184
+ if (source.format == 'binary' || source.$dynamicRef != null || source.$id != null) throw new Error('Binary and dynamically scoped schemas are unsupported.')
185
+ const result: ObjectValue = {}
186
+ for (const [key, child] of Object.entries(source)) {
187
+ if (['nullable', 'example', 'xml', 'discriminator', '__proto__'].includes(key)) continue
188
+ if (key == '$ref') {
189
+ if (typeof child != 'string') throw new Error('Invalid schema reference.')
190
+ let id = ids.get(child)
191
+ if (id == null) {
192
+ id = `s${ids.size}`
193
+ ids.set(child, id)
194
+ defs[id] = convert(pointer(doc, child))
195
+ }
196
+ result.$ref = `#/$defs/${id}`
197
+ } else if (['properties', 'patternProperties', '$defs', 'definitions', 'dependentSchemas'].includes(key)) {
198
+ result[key] = Object.fromEntries(Object.entries(object(child)).map(([name, childSchema]) => [name, convert(childSchema)]))
199
+ } else if (['allOf', 'anyOf', 'oneOf', 'prefixItems'].includes(key)) {
200
+ if (!Array.isArray(child)) throw new Error('Invalid schema composition.')
201
+ result[key] = child.map(convert)
202
+ } else if (['items', 'additionalProperties', 'not', 'if', 'then', 'else', 'contains', 'propertyNames', 'unevaluatedProperties'].includes(key))
203
+ result[key] = convert(child)
204
+ else result[key] = child
205
+ }
206
+ if (source.nullable === true) return { anyOf: [result, { type: 'null' }] }
207
+ for (const key of ['minimum', 'maximum']) {
208
+ const exclusive = key == 'minimum' ? 'exclusiveMinimum' : 'exclusiveMaximum'
209
+ if (typeof result[exclusive] == 'boolean') {
210
+ if (result[exclusive] && typeof result[key] == 'number') {
211
+ result[exclusive] = result[key]!
212
+ delete result[key]
213
+ } else delete result[exclusive]
214
+ }
215
+ }
216
+ return result
217
+ }
218
+ let converted = convert(schemaValue)
219
+ if (typeof converted == 'object' && converted != null && typeof object(converted).$ref == 'string') {
220
+ const id = String(object(converted).$ref).slice('#/$defs/'.length)
221
+ const { $ref: _ref, ...siblings } = object(converted)
222
+ converted = { ...object(defs[id]), ...siblings }
223
+ }
224
+ if (typeof converted == 'boolean') return converted
225
+ return { $schema: 'https://json-schema.org/draft/2020-12/schema', ...object(converted), ...(Object.keys(defs).length ? { $defs: defs } : {}) }
226
+ }
227
+ function parameters(config: OpenApiExecutor): ObjectValue[] {
228
+ const doc = parseOpenApi(config.document)
229
+ const { item, op } = operation(doc, config.path, config.method)
230
+ const entries = new Map<string, ObjectValue>()
231
+ for (const value of [...((item.parameters as JsonValue[]) ?? []), ...((op.parameters as JsonValue[]) ?? [])]) {
232
+ const p = resolved(doc, value)
233
+ if (!['path', 'query', 'header'].includes(String(p.in)) || typeof p.name != 'string' || p.content != null)
234
+ throw new Error('Only schema-based path, query and header parameters are supported.')
235
+ if (p.allowReserved === true) throw new Error('allowReserved parameters are unsupported.')
236
+ const style = p.style ?? (p.in == 'query' ? 'form' : 'simple')
237
+ if (style != (p.in == 'query' ? 'form' : 'simple')) throw new Error('Only form query and simple path/header serialization are supported.')
238
+ entries.set(`${p.in}.${p.in == 'header' ? p.name.toLowerCase() : p.name}`, p)
239
+ }
240
+ return [...entries.values()]
241
+ }
242
+ function jsonContent(doc: ObjectValue, value: JsonValue): { schema: JsonValue; required: boolean; mediaType: string } {
243
+ const content = resolved(doc, value)
244
+ const media = object(content.content)
245
+ const mediaType = media['application/json'] != null ? 'application/json' : Object.keys(media).find((key) => /^application\/.+\+json$/.test(key))
246
+ const json = mediaType == null ? undefined : media[mediaType]
247
+ if (json == null) throw new Error('Only JSON request and response bodies are supported.')
248
+ return { schema: schema(doc, object(json).schema ?? {}), required: content.required === true, mediaType: mediaType! }
249
+ }
250
+ export function authHandles(auth: readonly OpenApiAuth[]): string[] {
251
+ return auth.flatMap((scheme) => (scheme.type == 'basic' ? [`auth.${scheme.id}.username`, `auth.${scheme.id}.password`] : [`auth.${scheme.id}.token`]))
252
+ }
253
+ export function openApiTask(config: OpenApiExecutor, name = 'OpenAPI'): ManagedTaskDefinition {
254
+ if (!config.path) return { name, executor: config, inputs: [], outputs: [] }
255
+ const doc = parseOpenApi(config.document)
256
+ const { op } = operation(doc, config.path, config.method)
257
+ const params = parameters(config)
258
+ const inputs: InputPort[] = params.map((p) => {
259
+ const jsonSchema = schema(doc, p.schema ?? {})
260
+ const defaultValue = typeof jsonSchema == 'boolean' ? undefined : object(jsonSchema).default
261
+ return {
262
+ handle: `${p.in}.${p.name}`,
263
+ jsonSchema,
264
+ nullable: (p.required !== true && p.in != 'path') || matchesSchema(null, jsonSchema),
265
+ ...(typeof p.description == 'string' ? { description: p.description } : {}),
266
+ ...(defaultValue === undefined ? {} : { value: defaultValue }),
267
+ }
268
+ })
269
+ if (op.requestBody != null) {
270
+ if (config.method == 'get' || config.method == 'head') throw new Error('GET and HEAD request bodies are unsupported.')
271
+ const body = jsonContent(doc, op.requestBody)
272
+ inputs.push({ handle: 'body', jsonSchema: body.schema, nullable: !body.required || matchesSchema(null, body.schema) })
273
+ }
274
+ const occupied = new Set(params.map((p) => `${p.in}.${p.in == 'header' ? String(p.name).toLowerCase() : p.name}`))
275
+ for (const auth of config.auth) {
276
+ const location = auth.type == 'apiKey' ? `${auth.in}.${auth.in == 'header' ? auth.name?.toLowerCase() : auth.name}` : 'header.authorization'
277
+ if (occupied.has(location)) throw new Error('Authentication conflicts with a parameter or another security scheme.')
278
+ if (auth.type == 'apiKey' && (!auth.name || !['header', 'query'].includes(auth.in ?? ''))) throw new Error('API Key requires a name and location.')
279
+ occupied.add(location)
280
+ }
281
+ inputs.push(...authHandles(config.auth).map((handle) => ({ handle, jsonSchema: { type: 'string' }, nullable: false })))
282
+ const responses = object(op.responses)
283
+ const schemas: JsonValue[] = []
284
+ for (const [status, response] of Object.entries(responses))
285
+ if (/^2\d\d$|^2XX$/.test(status) || status == 'default') {
286
+ const r = resolved(doc, response)
287
+ if (r.content == null) schemas.push({ type: 'null' })
288
+ else {
289
+ jsonContent(doc, r)
290
+ for (const [mediaType, media] of Object.entries(object(r.content)))
291
+ if (/^application\/(json|.+\+json)$/.test(mediaType)) schemas.push(schema(doc, object(media).schema ?? {}))
292
+ }
293
+ }
294
+ if (!schemas.length) throw new Error('A successful JSON response definition is required.')
295
+ // Each branch keeps its own reference scope when compiled separately at execution.
296
+ const bodySchema =
297
+ schemas.length == 1 ? schemas[0]! : { $schema: 'https://json-schema.org/draft/2020-12/schema', anyOf: schemas.map((s, index) => inlineSchema(s, index)) }
298
+ const outputs: Port[] = [
299
+ { handle: 'body', jsonSchema: bodySchema, nullable: config.method == 'head' || schemas.some((item) => matchesSchema(null, item)) },
300
+ { handle: 'statusCode', jsonSchema: { type: 'integer' }, nullable: false },
301
+ { handle: 'headers', jsonSchema: { type: 'object', additionalProperties: { type: 'string' } }, nullable: false },
302
+ ]
303
+ return { name, executor: config, inputs, outputs }
304
+ }
305
+ function inlineSchema(value: JsonValue, index: number): JsonValue {
306
+ if (Array.isArray(value)) return value.map((item) => inlineSchema(item, index))
307
+ if (value == null || typeof value != 'object') return value
308
+ return Object.fromEntries(
309
+ Object.entries(value).map(([key, child]) => [
310
+ key,
311
+ key == '$ref' && typeof child == 'string' && child.startsWith('#/') ? `#/anyOf/${index}/${child.slice(2)}` : inlineSchema(child, index),
312
+ ]),
313
+ )
314
+ }
315
+ export interface OpenApiFieldIssue {
316
+ readonly field: 'sourceUrl' | 'operation' | 'serverUrl'
317
+ readonly message: string
318
+ }
319
+
320
+ /** The canvas validator and property panel share the same configuration contract. */
321
+ export function openApiFieldIssues(task: ManagedTaskDefinition): OpenApiFieldIssue[] {
322
+ if (task.executor.kind != 'openapi') return []
323
+ const config = task.executor
324
+ let field: OpenApiFieldIssue['field'] = 'sourceUrl'
325
+ try {
326
+ if (!config.sourceUrl.trim()) return [{ field, message: 'Enter an OpenAPI JSON document URL.' }]
327
+ httpUrl(config.sourceUrl)
328
+ field = 'operation'
329
+ if (!config.path) return [{ field, message: 'Select an OpenAPI operation.' }]
330
+ field = 'serverUrl'
331
+ httpUrl(config.serverUrl)
332
+ if (new URL(config.serverUrl).search) throw new Error('Server URLs must not contain a query string.')
333
+ field = 'operation'
334
+ if (!dequal(config.document, snapshot(config.document, config.path, config.method)))
335
+ return [{ field, message: 'Save only the selected operation and its dependencies.' }]
336
+ const expected = openApiTask(config, task.name)
337
+ if (!dequal(expected.inputs, task.inputs) || !dequal(expected.outputs, task.outputs))
338
+ return [{ field, message: 'OpenAPI ports must match the saved operation.' }]
339
+ return []
340
+ } catch (error) {
341
+ return [{ field, message: (error as Error).message }]
342
+ }
343
+ }
344
+
345
+ export function openApiIssues(task: ManagedTaskDefinition): string[] {
346
+ return openApiFieldIssues(task).map((issue) => issue.message)
347
+ }
348
+ export function selectOperation(value: JsonValue, sourceUrl: string, path: string, method: string): OpenApiExecutor {
349
+ const doc = snapshot(value, path, method)
350
+ const choices = securityOptions(doc, path, method)
351
+ const auth = choices.find((choice) => choice.auth != null)?.auth
352
+ if (auth == null) throw new Error(choices[0]?.error ?? 'Unsupported authentication.')
353
+ const config: OpenApiExecutor = {
354
+ kind: 'openapi',
355
+ sourceUrl: httpUrl(sourceUrl),
356
+ method,
357
+ path,
358
+ serverUrl: serverAddress(servers(doc, path, method)[0]!, sourceUrl),
359
+ document: doc,
360
+ auth,
361
+ }
362
+ openApiTask(config)
363
+ return config
364
+ }
365
+ function scalar(v: JsonValue): string {
366
+ if (v != null && typeof v == 'object') throw new Error('Nested parameter values are unsupported.')
367
+ return v == null ? '' : String(v)
368
+ }
369
+ export function buildRequest(config: OpenApiExecutor, input: Readonly<Record<string, JsonValue>>): { url: string; init: RequestInit } {
370
+ const task = openApiTask(config)
371
+ for (const port of task.inputs) {
372
+ if (!('handle' in port)) continue
373
+ const value = input[port.handle]
374
+ if (value === undefined) {
375
+ if (!port.nullable) throw new Error('A required input is missing.')
376
+ continue
377
+ }
378
+ if (!matchesSchema(value, port.jsonSchema)) throw new Error('A request input does not match its schema.')
379
+ }
380
+ let path = config.path
381
+ const query = new URLSearchParams()
382
+ const headers = new Headers({ accept: 'application/json' })
383
+
384
+ for (const p of parameters(config)) {
385
+ const value = input[`${p.in}.${p.name}`]
386
+ if (value === undefined) {
387
+ if (p.required === true || p.in == 'path') throw new Error('A required request parameter is missing.')
388
+ continue
389
+ }
390
+ const explode = p.explode ?? p.in == 'query'
391
+ const parts = Array.isArray(value)
392
+ ? value.map(scalar)
393
+ : value != null && typeof value == 'object'
394
+ ? Object.entries(value).flatMap(([k, v]) => (explode ? [`${k}=${scalar(v)}`] : [k, scalar(v)]))
395
+ : [scalar(value)]
396
+ if (p.in == 'path') {
397
+ const encoded =
398
+ value != null && typeof value == 'object' && !Array.isArray(value) && explode
399
+ ? Object.entries(value)
400
+ .map(([key, entry]) => `${encodeURIComponent(key)}=${encodeURIComponent(scalar(entry))}`)
401
+ .join(',')
402
+ : parts.map(encodeURIComponent).join(',')
403
+ path = path.replaceAll(`{${p.name}}`, encoded)
404
+ } else if (p.in == 'header') headers.set(String(p.name), parts.join(','))
405
+ else if (Array.isArray(value) && explode) for (const part of parts) query.append(String(p.name), part)
406
+ else if (value != null && typeof value == 'object' && !Array.isArray(value) && explode)
407
+ for (const [k, v] of Object.entries(value)) query.append(k, scalar(v))
408
+ else query.append(String(p.name), parts.join(','))
409
+ }
410
+ if (/\{[^}]+\}/.test(path)) throw new Error('A path parameter is missing.')
411
+ const url = new URL(httpUrl(config.serverUrl).replace(/\/$/, '') + '/' + path.replace(/^\//, ''))
412
+ for (const [key, value] of query) url.searchParams.append(key, value)
413
+ for (const auth of config.auth) {
414
+ const token = (part: string): string => {
415
+ const value = input[`auth.${auth.id}.${part}`]
416
+ if (typeof value != 'string' || !value) throw new Error('Authentication source is missing.')
417
+ return value
418
+ }
419
+ if (auth.type == 'bearer') headers.set('authorization', `Bearer ${token('token')}`)
420
+ else if (auth.type == 'basic') {
421
+ const username = token('username')
422
+ if (username.includes(':')) throw new Error('Basic authentication username cannot contain a colon.')
423
+ const bytes = new TextEncoder().encode(`${username}:${token('password')}`)
424
+ headers.set('authorization', `Basic ${btoa(Array.from(bytes, (b) => String.fromCharCode(b)).join(''))}`)
425
+ } else if (auth.in == 'header') headers.set(auth.name!, token('token'))
426
+ else {
427
+ if (url.searchParams.has(auth.name!)) throw new Error('Authentication conflicts with a query parameter.')
428
+ url.searchParams.set(auth.name!, token('token'))
429
+ }
430
+ }
431
+ const { op } = operation(parseOpenApi(config.document), config.path, config.method)
432
+ let body: string | undefined
433
+ if (op.requestBody != null && input.body !== undefined) {
434
+ body = JSON.stringify(input.body)
435
+ headers.set('content-type', jsonContent(parseOpenApi(config.document), op.requestBody).mediaType)
436
+ } else if (op.requestBody != null && jsonContent(parseOpenApi(config.document), op.requestBody).required) throw new Error('The request body is required.')
437
+ return { url: url.href, init: { method: config.method.toUpperCase(), headers, body, redirect: 'manual' } }
438
+ }
439
+ export function parseResponse(config: OpenApiExecutor, status: number, headers: Headers, text: string): Record<string, JsonValue> {
440
+ if (status < 200 || status >= 300) throw new Error(`API request failed with HTTP ${status}.`)
441
+ const doc = parseOpenApi(config.document)
442
+ const responses = object(operation(doc, config.path, config.method).op.responses)
443
+ const raw = responses[String(status)] ?? responses['2XX'] ?? responses.default
444
+ if (raw == null) throw new Error('The response status is not declared in the saved definition.')
445
+ const response = resolved(doc, raw)
446
+ let body: JsonValue = null
447
+ if (text && config.method != 'head' && status != 204 && status != 205) {
448
+ const type = (headers.get('content-type') ?? '').split(';')[0]!.trim().toLowerCase()
449
+ const media = object(response.content)[type]
450
+ if (media == null || !/^application\/(json|.+\+json)$/.test(type)) throw new Error('The response media type is not supported by the saved definition.')
451
+ try {
452
+ body = JSON.parse(text) as JsonValue
453
+ } catch {
454
+ throw new Error('The API returned invalid JSON.')
455
+ }
456
+ if (!matchesSchema(body, schema(doc, object(media).schema ?? {}))) throw new Error('The API response does not match the saved schema.')
457
+ } else if (response.content != null && config.method != 'head' && status != 204 && status != 205) throw new Error('The API returned an empty JSON response.')
458
+ return { body, statusCode: status, headers: Object.fromEntries([...headers].filter(([name]) => name != 'set-cookie')) }
459
+ }
@@ -0,0 +1,56 @@
1
+ import type { Group, InputPort, InputValues, JsonValue } from '../../flow/common/change.ts'
2
+
3
+ import { inputValue } from '../../flow/common/inputValue.ts'
4
+ import { matchesSchema } from '../../flow/common/schema.ts'
5
+
6
+ /** Deployment-bound selections owned by the Trigger configuration contract. */
7
+ export function clearTriggerExternalConfig(key: string, config: InputValues): InputValues {
8
+ const fields =
9
+ key == 'jira.on_issue_event' ||
10
+ key == 'intercom.on_conversation_event' ||
11
+ key == 'sentry.on_issue_alert' ||
12
+ key == 'zoom.on_recording_ready' ||
13
+ key == 'fireflies.on_meeting_ready'
14
+ ? ['sourceId', 'eventTypes']
15
+ : key == 'slackbot.on_event'
16
+ ? ['sourceId', 'eventTypes', 'channelIds']
17
+ : key == 'feishu_app_bot.on_event'
18
+ ? ['sourceId', 'eventTypes', 'resource', 'chatIds']
19
+ : key == 'linear.on_issue_changed'
20
+ ? ['teamId', 'stateIds']
21
+ : []
22
+ return { ...config, ...Object.fromEntries(fields.map((field) => [field, { kind: 'unset' as const }])) }
23
+ }
24
+
25
+ export function triggerConfigValue(input: InputPort, config: InputValues): JsonValue | undefined {
26
+ return inputValue(config[input.handle], input.value)
27
+ }
28
+
29
+ /** Provider-specific controls consume values, never persistence wrappers. */
30
+ export function triggerConfigValues(inputs: readonly (InputPort | Group)[], config: InputValues): Readonly<Record<string, JsonValue>> {
31
+ return Object.fromEntries(inputs.flatMap((input) => ('handle' in input ? [[input.handle, triggerConfigValue(input, config) ?? null]] : [])))
32
+ }
33
+
34
+ export function missingTriggerConfig(inputs: readonly (InputPort | Group)[], config: InputValues): readonly string[] {
35
+ return inputs.flatMap((input) => ('handle' in input && !input.nullable && triggerConfigValue(input, config) === undefined ? [input.handle] : []))
36
+ }
37
+
38
+ /** Resolves fixed inputs before a Provider sees them, using the same defaults/null semantics as node inputs. */
39
+ export function resolveTriggerConfig(inputs: readonly (InputPort | Group)[], config: InputValues): Readonly<Record<string, JsonValue>> {
40
+ const fields = inputs.filter((input): input is InputPort => 'handle' in input)
41
+ const handles = new Set(fields.map((input) => input.handle))
42
+ if (handles.size !== fields.length) throw new TypeError('Trigger config has duplicate input handles.')
43
+ const unknown = Object.keys(config).find((handle) => !handles.has(handle))
44
+ if (unknown != null) throw new TypeError(`Unknown Trigger config input "${unknown}".`)
45
+ const resolved = Object.fromEntries(
46
+ fields.map((input) => {
47
+ const value = triggerConfigValue(input, config) ?? null
48
+ if (!(value === null && input.nullable) && !matchesSchema(value, input.jsonSchema)) {
49
+ throw new TypeError(`Trigger config input "${input.handle}" does not match its declared schema.`)
50
+ }
51
+ return [input.handle, value]
52
+ }),
53
+ )
54
+ if (new TextEncoder().encode(JSON.stringify(resolved)).byteLength > 64 * 1024) throw new TypeError('Trigger config exceeds the 65536-byte limit.')
55
+ return resolved
56
+ }
@@ -0,0 +1,15 @@
1
+ import type { ConnectorProxy } from '../../connector/common/proxy.ts'
2
+ import type { JsonValue } from '../../flow/common/change.ts'
3
+
4
+ export interface TriggerConfigOption {
5
+ readonly value: string
6
+ readonly label: string
7
+ readonly color?: string
8
+ }
9
+
10
+ export interface TriggerConfigOptionsContext {
11
+ readonly field: string
12
+ readonly config: Readonly<Record<string, JsonValue>>
13
+ readonly connector: ConnectorProxy
14
+ readonly signal?: AbortSignal
15
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod'
2
+
3
+ export const configInputsSchema = z.array(
4
+ z.union([
5
+ z.strictObject({ handle: z.string().min(1), description: z.string().optional(), jsonSchema: z.json(), nullable: z.boolean(), value: z.json().optional() }),
6
+ z.strictObject({ group: z.string(), collapsed: z.boolean().optional() }),
7
+ ]),
8
+ )
@@ -0,0 +1,132 @@
1
+ import type { JsonValue, Port, PortDefinition, TriggerNode } from '../../flow/common/change.ts'
2
+
3
+ import { isJsonObject } from '../../base/common/json.ts'
4
+ import { matchesSchema } from '../../flow/common/schema.ts'
5
+ import { webhookMethods, webhookSupportsBody } from '../../flow/common/webhookMethod.ts'
6
+
7
+ export { webhookMethods, webhookSupportsBody }
8
+
9
+ export const errorOutputs: readonly Port[] = [
10
+ {
11
+ handle: 'workflow',
12
+ nullable: false,
13
+ jsonSchema: {
14
+ type: 'object',
15
+ additionalProperties: false,
16
+ required: ['flowId', 'name', 'revisionId', 'publicationId'],
17
+ properties: { flowId: { type: 'string' }, name: { type: 'string' }, revisionId: { type: 'string' }, publicationId: { type: ['string', 'null'] } },
18
+ },
19
+ },
20
+ {
21
+ handle: 'execution',
22
+ nullable: false,
23
+ jsonSchema: {
24
+ type: 'object',
25
+ additionalProperties: false,
26
+ required: ['runId', 'status', 'startedAt', 'finishedAt'],
27
+ properties: {
28
+ runId: { type: 'string' },
29
+ status: { enum: ['failed', 'indeterminate'] },
30
+ startedAt: { type: ['string', 'null'] },
31
+ finishedAt: { type: 'string' },
32
+ },
33
+ },
34
+ },
35
+ {
36
+ handle: 'error',
37
+ nullable: false,
38
+ jsonSchema: {
39
+ type: 'object',
40
+ additionalProperties: false,
41
+ required: ['code', 'message'],
42
+ properties: {
43
+ code: { type: 'string' },
44
+ message: { type: 'string' },
45
+ nodeId: { type: 'string' },
46
+ jobId: { type: 'string' },
47
+ path: { type: 'array', items: { type: 'string' } },
48
+ },
49
+ },
50
+ },
51
+ ]
52
+
53
+ export const sampleErrorOutputs: Readonly<Record<string, JsonValue>> = {
54
+ workflow: { flowId: 'example-flow', name: 'Example workflow', revisionId: 'example-revision', publicationId: 'example-publication' },
55
+ execution: { runId: 'example-run', status: 'failed', startedAt: '2026-01-01T00:00:00.000Z', finishedAt: '2026-01-01T00:00:01.000Z' },
56
+ error: { code: 'node.failed', message: 'Example failure', nodeId: 'example-node', jobId: 'example-job', path: [] },
57
+ }
58
+
59
+ export const webhookOutputs: readonly Port[] = [
60
+ { handle: 'headers', jsonSchema: { type: 'object', additionalProperties: { type: 'string' } }, nullable: false },
61
+ { handle: 'query', jsonSchema: { type: 'object', additionalProperties: { type: ['string', 'array'], items: { type: 'string' } } }, nullable: false },
62
+ { handle: 'body', jsonSchema: { type: 'object', additionalProperties: true }, nullable: false },
63
+ { handle: 'webhookUrl', jsonSchema: { type: 'string' }, nullable: false },
64
+ ]
65
+ const cronOutputs: readonly Port[] = [
66
+ {
67
+ handle: 'scheduledAt',
68
+ jsonSchema: { type: 'string', format: 'date-time' },
69
+ nullable: false,
70
+ },
71
+ ]
72
+
73
+ export function triggerOutputDefinitions(trigger: TriggerNode): readonly Port[] {
74
+ switch (trigger.kind) {
75
+ case 'error':
76
+ return errorOutputs
77
+ case 'manual':
78
+ return []
79
+ case 'start':
80
+ return trigger.inputDefs
81
+ case 'cron':
82
+ return cronOutputs
83
+ case 'poll':
84
+ case 'integration':
85
+ return trigger.definition.outputs
86
+ case 'webhook':
87
+ return webhookOutputs
88
+ .filter((port) => port.handle !== 'body' || webhookSupportsBody(trigger.method))
89
+ .map((port) =>
90
+ port.handle === 'body'
91
+ ? Object.assign({}, port, {
92
+ jsonSchema: {
93
+ type: 'object',
94
+ additionalProperties: false,
95
+ properties: Object.fromEntries(trigger.bodyFields.map((field) => [field.handle, field.jsonSchema])),
96
+ required: trigger.bodyFields.filter((field) => !field.nullable && !Object.hasOwn(field, 'value')).map((field) => field.handle),
97
+ },
98
+ })
99
+ : port,
100
+ )
101
+ }
102
+ }
103
+
104
+ export function triggerOutputPorts(trigger: TriggerNode): Readonly<Record<string, PortDefinition>> {
105
+ return Object.fromEntries(triggerOutputDefinitions(trigger).map(({ handle, ...port }) => [handle, port]))
106
+ }
107
+
108
+ export function matchesTriggerOutputs(trigger: TriggerNode, outputs: unknown): outputs is Readonly<Record<string, JsonValue>> {
109
+ if (!isJsonObject(outputs)) return false
110
+ const ports = triggerOutputDefinitions(trigger)
111
+ return (
112
+ new Set(ports.map((port) => port.handle)).size === ports.length &&
113
+ Object.keys(outputs).length === ports.length &&
114
+ ports.every(
115
+ (port) =>
116
+ Object.hasOwn(outputs, port.handle) && ((outputs[port.handle] === null && port.nullable) || matchesSchema(outputs[port.handle]!, port.jsonSchema)),
117
+ )
118
+ )
119
+ }
120
+
121
+ /** Resolve caller-supplied Start parameters into the complete output snapshot used by execution. */
122
+ export function normalizeTriggerOutputs(trigger: TriggerNode, outputs: unknown): Readonly<Record<string, JsonValue>> | undefined {
123
+ if (!isJsonObject(outputs)) return
124
+ const normalized =
125
+ trigger.kind == 'start'
126
+ ? {
127
+ ...outputs,
128
+ ...Object.fromEntries(trigger.inputDefs.filter((port) => port.nullable && !Object.hasOwn(outputs, port.handle)).map((port) => [port.handle, null])),
129
+ }
130
+ : outputs
131
+ return matchesTriggerOutputs(trigger, normalized) ? normalized : undefined
132
+ }