@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,175 @@
1
+ import type { TriggerKeySnapshot } from '../../flow/common/change.ts'
2
+ import type {
3
+ PollTriggerTestResult,
4
+ TriggerActivity,
5
+ TriggerActivityKind,
6
+ TriggerActivityPage,
7
+ TriggerBinding,
8
+ TriggerBindingDetail,
9
+ TriggerKeySummary,
10
+ } from './api.ts'
11
+
12
+ import { configInputsSchema } from '../../trigger/common/configSchema.ts'
13
+ import { integer, invalidResponse, jsonValue, optionalString, record, string } from './decoding.ts'
14
+
15
+ export function triggerKeySummary(value: unknown): TriggerKeySummary {
16
+ const source = record(value)
17
+ const type = source.type
18
+ if (type != 'integration' && type != 'poll') return invalidResponse()
19
+ return {
20
+ description: typeof source.description == 'string' ? source.description : invalidResponse(),
21
+ displayName: string(source.displayName),
22
+ key: string(source.key),
23
+ name: string(source.name),
24
+ provider: string(source.provider),
25
+ type: type as TriggerKeySummary['type'],
26
+ }
27
+ }
28
+
29
+ export function triggerKey(value: unknown): TriggerKeySnapshot {
30
+ const source = record(value)
31
+ const summary = triggerKeySummary(source)
32
+ const base = {
33
+ configInputs: configInputsSchema.parse(source.configInputs),
34
+ definitionVersion: source.definitionVersion === 2 ? 2 : invalidResponse(),
35
+ description: summary.description,
36
+ displayName: summary.displayName,
37
+ key: summary.key,
38
+ name: summary.name,
39
+ outputs: (Array.isArray(source.outputs) ? source.outputs : invalidResponse()).map((entry) => {
40
+ const port = record(entry)
41
+ return Object.assign(
42
+ {
43
+ handle: string(port.handle),
44
+ jsonSchema: jsonValue(port.jsonSchema),
45
+ nullable: typeof port.nullable === 'boolean' ? port.nullable : invalidResponse(),
46
+ },
47
+ port.description == null ? {} : { description: string(port.description) },
48
+ )
49
+ }),
50
+ provider: summary.provider,
51
+ }
52
+ if (summary.type == 'poll') return { ...base, type: 'poll' }
53
+ const endpoint = record(source.endpoint)
54
+ const body = record(endpoint.body)
55
+ if (!Array.isArray(endpoint.methods) || !Array.isArray(body.formats) || typeof body.allowArray != 'boolean' || typeof body.allowEmpty != 'boolean') {
56
+ return invalidResponse()
57
+ }
58
+ const methods = endpoint.methods.map(string)
59
+ const formats = body.formats.map(string)
60
+ const successStatus = integer(endpoint.successStatus)
61
+ if (
62
+ methods.some((method) => !['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'].includes(method)) ||
63
+ formats.some((format) => !['form', 'json', 'multipart', 'text'].includes(format)) ||
64
+ successStatus < 200 ||
65
+ successStatus > 299
66
+ ) {
67
+ return invalidResponse()
68
+ }
69
+ return {
70
+ ...base,
71
+ endpoint: {
72
+ body: {
73
+ allowArray: body.allowArray,
74
+ allowEmpty: body.allowEmpty,
75
+ formats: formats as Extract<TriggerKeySnapshot, { readonly type: 'integration' }>['endpoint']['body']['formats'],
76
+ },
77
+ methods: methods as Extract<TriggerKeySnapshot, { readonly type: 'integration' }>['endpoint']['methods'],
78
+ successStatus,
79
+ },
80
+ type: 'integration',
81
+ }
82
+ }
83
+
84
+ const triggerKinds: ReadonlySet<TriggerBinding['kind']> = new Set(['error', 'cron', 'integration', 'poll', 'webhook'])
85
+ const triggerHealth: ReadonlySet<TriggerBinding['health']> = new Set(['failed', 'healthy', 'initializing', 'needs_reauth', 'suspended'])
86
+ const triggerActivityKinds: ReadonlySet<TriggerActivityKind> = new Set([
87
+ 'delivery.failed',
88
+ 'health.failed',
89
+ 'health.needs_reauth',
90
+ 'health.recovered',
91
+ 'health.suspended',
92
+ 'operator.paused',
93
+ 'operator.resumed',
94
+ ])
95
+
96
+ export function triggerBinding(value: unknown): TriggerBinding {
97
+ const source = record(value)
98
+ const health = source.health
99
+ const listener = source.listener == null ? undefined : record(source.listener)
100
+ if (listener != null && listener.health != 'healthy' && listener.health != 'failed' && listener.health != 'needs_reauth') return invalidResponse()
101
+ const kind = source.kind
102
+ const runtimeVersion = integer(source.runtimeVersion)
103
+ if (source.version != 1 || typeof health != 'string' || !triggerHealth.has(health as TriggerBinding['health'])) return invalidResponse()
104
+ if (typeof kind != 'string' || !triggerKinds.has(kind as TriggerBinding['kind'])) return invalidResponse()
105
+ if (runtimeVersion <= 0) return invalidResponse()
106
+ return {
107
+ ...(source.currentPublicationId == null ? {} : { currentPublicationId: string(source.currentPublicationId) }),
108
+ ...(source.currentRevisionId == null ? {} : { currentRevisionId: string(source.currentRevisionId) }),
109
+ ...(source.endpointUrl == null ? {} : { endpointUrl: string(source.endpointUrl) }),
110
+ ...(listener == null
111
+ ? {}
112
+ : {
113
+ listener: {
114
+ health: listener.health as NonNullable<TriggerBinding['listener']>['health'],
115
+ ...(listener.lastErrorCode == null ? {} : { lastErrorCode: string(listener.lastErrorCode) }),
116
+ },
117
+ }),
118
+ flowId: string(source.flowId),
119
+ health: health as TriggerBinding['health'],
120
+ kind: kind as TriggerBinding['kind'],
121
+ ...(source.lastErrorCode == null ? {} : { lastErrorCode: string(source.lastErrorCode) }),
122
+ runtimeVersion,
123
+ triggerNodeId: string(source.triggerNodeId),
124
+ updatedAt: string(source.updatedAt),
125
+ version: 1,
126
+ }
127
+ }
128
+
129
+ export function triggerBindingDetail(value: unknown): TriggerBindingDetail {
130
+ const source = record(value)
131
+ if (source.version != 1) return invalidResponse()
132
+ return { binding: triggerBinding(source.binding), version: 1 }
133
+ }
134
+
135
+ function triggerActivity(value: unknown): TriggerActivity {
136
+ const source = record(value)
137
+ const kind = source.kind
138
+ if (typeof kind != 'string' || !triggerActivityKinds.has(kind as TriggerActivityKind)) return invalidResponse()
139
+ const errorCode = optionalString(source.errorCode)
140
+ const errorMessage = optionalString(source.errorMessage)
141
+ if (errorMessage != null && errorMessage.length > 512) return invalidResponse()
142
+ return {
143
+ activityId: string(source.activityId),
144
+ createdAt: string(source.createdAt),
145
+ ...(errorCode == null ? {} : { errorCode }),
146
+ ...(errorMessage == null ? {} : { errorMessage }),
147
+ kind: kind as TriggerActivityKind,
148
+ }
149
+ }
150
+
151
+ export function triggerActivityPage(value: unknown): TriggerActivityPage {
152
+ const source = record(value)
153
+ const nextCursor = optionalString(source.nextCursor)
154
+ if (source.version != 1 || !Array.isArray(source.activities)) return invalidResponse()
155
+ return {
156
+ activities: source.activities.map(triggerActivity),
157
+ ...(nextCursor == null ? {} : { nextCursor }),
158
+ version: 1,
159
+ }
160
+ }
161
+
162
+ export function pollTriggerTestResult(value: unknown): PollTriggerTestResult {
163
+ const source = record(value)
164
+ const filtered = integer(source.filtered)
165
+ if (source.version != 1 || !Array.isArray(source.events) || typeof source.hasMore != 'boolean' || filtered < 0) return invalidResponse()
166
+ return {
167
+ events: source.events.map((event) => {
168
+ const object = record(event)
169
+ return Object.fromEntries(Object.entries(object).map(([key, item]) => [key, jsonValue(item)]))
170
+ }),
171
+ filtered,
172
+ hasMore: source.hasMore,
173
+ version: 1,
174
+ }
175
+ }
@@ -0,0 +1,168 @@
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
+ export type DecisionQuestion = { readonly name: string; readonly instructions: string } & (
7
+ | { readonly type: 'noul'; readonly criteria?: { readonly true?: string; readonly false?: string } }
8
+ | { readonly type: 'choice'; readonly criteria: readonly { readonly name: string; readonly description: string }[] }
9
+ | { readonly type: 'score'; readonly criteria: readonly string[] }
10
+ )
11
+ export interface DecisionExecutor {
12
+ readonly kind: 'decision'
13
+ readonly questions: readonly DecisionQuestion[]
14
+ }
15
+ export interface DecisionIssue {
16
+ readonly question?: number
17
+ readonly field: 'questions' | 'name' | 'instructions' | 'criteria' | 'ports'
18
+ readonly message: string
19
+ }
20
+
21
+ export const decisionModel = 'typesafe/jev'
22
+ export const decisionLimits = { choice: 255, score: 10 } as const
23
+
24
+ /** Ordered prefixes are shared by authoring, schemas, validation, and execution. */
25
+ export function limitDecisionQuestion(question: DecisionQuestion): DecisionQuestion {
26
+ if (question.type === 'noul' || question.criteria.length <= decisionLimits[question.type]) return question
27
+ if (question.type === 'choice') return { ...question, criteria: question.criteria.slice(0, decisionLimits.choice) }
28
+ return { ...question, criteria: question.criteria.slice(0, decisionLimits.score) }
29
+ }
30
+
31
+ export function limitDecisionQuestions(questions: readonly DecisionQuestion[]): readonly DecisionQuestion[] {
32
+ const limited = questions.map(limitDecisionQuestion)
33
+ return limited.every((question, i) => question === questions[i]) ? questions : limited
34
+ }
35
+
36
+ /** Loading an oversized task also updates its previously generated output schemas. */
37
+ export function limitDecisionTask(task: ManagedTaskDefinition): ManagedTaskDefinition {
38
+ if (task.executor.kind !== 'decision') return task
39
+ const original = task.executor.questions
40
+ const questions = limitDecisionQuestions(original)
41
+ if (questions === original) return task
42
+ const outputs = task.outputs.map((port) => {
43
+ if (!('handle' in port)) return port
44
+ const index = original.findIndex((question) => question.name === port.handle)
45
+ if (index < 0 || original[index] === questions[index] || !dequal(port.jsonSchema, answerSchema(original[index]!))) return port
46
+ return { ...port, jsonSchema: decisionAnswerSchema(questions[index]!) }
47
+ })
48
+ return { ...task, executor: { ...task.executor, questions }, outputs }
49
+ }
50
+ export const decisionStateSchema: JsonValue = { type: ['string', 'object', 'array'] }
51
+ const probability: JsonValue = { type: 'number', minimum: 0, maximum: 1 }
52
+ export const defaultDecisionQuestion = (name = 'decision1'): DecisionQuestion => ({ name, type: 'noul', instructions: '' })
53
+
54
+ export function decisionQuestionIssues(questions: readonly DecisionQuestion[]): readonly DecisionIssue[] {
55
+ questions = limitDecisionQuestions(questions)
56
+ const issues: DecisionIssue[] = []
57
+ if (!questions.length) issues.push({ field: 'questions', message: 'Add at least one question.' })
58
+ questions.forEach((question, index) => {
59
+ const add = (field: DecisionIssue['field'], message: string) => issues.push({ question: index, field, message })
60
+ if (!question.name.trim() || question.name === '__proto__' || questions.some((other, i) => i !== index && other.name === question.name))
61
+ add('name', 'Question names must be non-empty and unique; __proto__ is reserved.')
62
+ if (!question.instructions.trim()) add('instructions', 'Describe the question to evaluate.')
63
+ if (question.type === 'choice') {
64
+ if (!question.criteria.length) add('criteria', 'Provide between 1 and 255 choices.')
65
+ const names = question.criteria.map((item) => item.name)
66
+ if (names.some((name) => !name.trim() || name === '__proto__') || new Set(names).size !== names.length)
67
+ add('criteria', 'Choice names must be non-empty and unique; __proto__ is reserved.')
68
+ }
69
+ if (question.type === 'score' && (question.criteria.length < 2 || question.criteria.some((level) => !level.trim())))
70
+ add('criteria', 'Provide between 2 and 10 non-empty levels, in increasing order.')
71
+ })
72
+ return issues
73
+ }
74
+
75
+ export function decisionAnswerSchema(question: DecisionQuestion): JsonValue {
76
+ return answerSchema(limitDecisionQuestion(question))
77
+ }
78
+
79
+ function answerSchema(question: DecisionQuestion): JsonValue {
80
+ const properties: Record<string, JsonValue> = { type: { const: question.type } }
81
+ if (question.type === 'noul') properties.noul = probability
82
+ else {
83
+ const keys = question.type === 'choice' ? question.criteria.map((item) => item.name) : question.criteria.map((_, index) => String(index))
84
+ properties.confidence = probability
85
+ properties.probabilities = {
86
+ type: 'object',
87
+ properties: Object.fromEntries(keys.map((key) => [key, probability])),
88
+ required: keys,
89
+ additionalProperties: false,
90
+ }
91
+ if (question.type === 'choice') properties.choice = { type: 'string', ...(keys.length ? { enum: keys } : {}) }
92
+ else {
93
+ properties.score = { type: 'number', minimum: 0, maximum: Math.max(0, keys.length - 1) }
94
+ properties.legend = {
95
+ type: 'object',
96
+ properties: Object.fromEntries(keys.map((key) => [key, { type: 'string' }])),
97
+ required: keys,
98
+ additionalProperties: false,
99
+ }
100
+ }
101
+ }
102
+ return { type: 'object', properties, required: Object.keys(properties) }
103
+ }
104
+
105
+ export function decisionTask(questions: readonly DecisionQuestion[] = [defaultDecisionQuestion()], name = 'AI Decision'): ManagedTaskDefinition {
106
+ questions = limitDecisionQuestions(questions)
107
+ const inputs: InputPort[] = [
108
+ { handle: 'target', description: 'Text, object, or array to evaluate across all questions.', jsonSchema: decisionStateSchema, nullable: false },
109
+ ]
110
+ const outputs: Port[] = questions.map((question) => ({ handle: question.name, jsonSchema: decisionAnswerSchema(question), nullable: false }))
111
+ return { name, executor: { kind: 'decision', questions }, inputs, outputs }
112
+ }
113
+
114
+ export function decisionTaskIssues(task: ManagedTaskDefinition): readonly DecisionIssue[] {
115
+ task = limitDecisionTask(task)
116
+ if (task.executor.kind !== 'decision') return []
117
+ const expected = decisionTask(task.executor.questions, task.name)
118
+ return [
119
+ ...decisionQuestionIssues(task.executor.questions),
120
+ ...(!dequal(task.inputs, expected.inputs) || !dequal(task.outputs, expected.outputs)
121
+ ? [{ field: 'ports' as const, message: 'AI Decision ports must match its questions.' }]
122
+ : []),
123
+ ]
124
+ }
125
+
126
+ export function decisionRequest(questions: readonly DecisionQuestion[], state: JsonValue): JsonValue {
127
+ questions = limitDecisionQuestions(questions)
128
+ const issues = decisionQuestionIssues(questions)
129
+ if (issues.length) throw new TypeError(issues[0]!.message)
130
+ if (!matchesSchema(state, decisionStateSchema)) throw new TypeError('Decision state must be text, an object, or an array.')
131
+ return {
132
+ model: decisionModel,
133
+ state,
134
+ questions: Object.fromEntries(
135
+ questions.map((question) => [
136
+ question.name,
137
+ {
138
+ type: question.type,
139
+ instructions: question.instructions,
140
+ ...(question.type === 'choice'
141
+ ? { criteria: Object.fromEntries(question.criteria.map((item) => [item.name, item.description || null])) }
142
+ : question.criteria == null
143
+ ? {}
144
+ : { criteria: question.criteria }),
145
+ },
146
+ ]),
147
+ ),
148
+ }
149
+ }
150
+
151
+ export function decisionAnswers(questions: readonly DecisionQuestion[], response: unknown): Readonly<Record<string, JsonValue>> {
152
+ questions = limitDecisionQuestions(questions)
153
+ const source = response as { answers?: unknown } | null
154
+ const answers = source?.answers
155
+ if (answers == null || typeof answers !== 'object' || Array.isArray(answers)) throw new TypeError('The model returned no answers.')
156
+ return Object.fromEntries(
157
+ questions.map((question) => {
158
+ const answer = Object.hasOwn(answers, question.name) ? (answers as Record<string, JsonValue>)[question.name] : undefined
159
+ if (answer === undefined || !matchesSchema(answer, decisionAnswerSchema(question))) throw new TypeError(`Invalid answer for "${question.name}".`)
160
+ if (question.type !== 'noul') {
161
+ const distribution = (answer as Record<string, JsonValue>).probabilities as Record<string, number>
162
+ if (Math.abs(Object.values(distribution).reduce((sum, value) => sum + value, 0) - 1) > 0.0001)
163
+ throw new TypeError(`Invalid probability distribution for "${question.name}".`)
164
+ }
165
+ return [question.name, answer]
166
+ }),
167
+ )
168
+ }
@@ -0,0 +1,65 @@
1
+ [
2
+ {
3
+ "key": "feishu_app_bot.on_event",
4
+ "kind": "feishu",
5
+ "provider": "feishu_app_bot",
6
+ "triggerId": "feishu_app_bot.on_event",
7
+ "maximumBodyBytes": 65536,
8
+ "applicationIngress": false,
9
+ "managed": false
10
+ },
11
+ {
12
+ "key": "fireflies.on_meeting_ready",
13
+ "kind": "fireflies",
14
+ "provider": "fireflies",
15
+ "triggerId": "fireflies.on_meeting_ready",
16
+ "maximumBodyBytes": 65536,
17
+ "applicationIngress": false,
18
+ "managed": false
19
+ },
20
+ {
21
+ "key": "intercom.on_conversation_event",
22
+ "kind": "intercom",
23
+ "provider": "intercom",
24
+ "triggerId": "intercom.on_conversation_event",
25
+ "maximumBodyBytes": 65536,
26
+ "applicationIngress": true,
27
+ "managed": false
28
+ },
29
+ {
30
+ "key": "jira.on_issue_event",
31
+ "kind": "jira",
32
+ "provider": "jira",
33
+ "triggerId": "jira.on_issue_event",
34
+ "maximumBodyBytes": 65536,
35
+ "applicationIngress": false,
36
+ "managed": true
37
+ },
38
+ {
39
+ "key": "sentry.on_issue_alert",
40
+ "kind": "sentry",
41
+ "provider": "sentry",
42
+ "triggerId": "sentry.on_issue_alert",
43
+ "maximumBodyBytes": 65536,
44
+ "applicationIngress": true,
45
+ "managed": false
46
+ },
47
+ {
48
+ "key": "slackbot.on_event",
49
+ "kind": "slack",
50
+ "provider": "slackbot",
51
+ "triggerId": "slackbot.on_event",
52
+ "maximumBodyBytes": 65536,
53
+ "applicationIngress": true,
54
+ "managed": false
55
+ },
56
+ {
57
+ "key": "zoom.on_recording_ready",
58
+ "kind": "zoom",
59
+ "provider": "zoom",
60
+ "triggerId": "zoom.on_recording_ready",
61
+ "maximumBodyBytes": 65536,
62
+ "applicationIngress": true,
63
+ "managed": false
64
+ }
65
+ ]
@@ -0,0 +1,66 @@
1
+ import type { JsonValue } from '../../flow/common/change.ts'
2
+
3
+ export interface SourceConfiguration {
4
+ readonly identity: string
5
+ readonly eventTypes: string[]
6
+ readonly config: Readonly<Record<string, JsonValue>>
7
+ readonly secrets: Readonly<Record<string, JsonValue>>
8
+ readonly state: Readonly<Record<string, JsonValue>>
9
+ }
10
+ export interface SourceEvent {
11
+ readonly ordering?: { readonly key: string; readonly version: number }
12
+ readonly id: string
13
+ readonly type: string
14
+ readonly payload: Readonly<Record<string, JsonValue>>
15
+ readonly matches: readonly string[]
16
+ }
17
+ export interface SourceSubscription {
18
+ readonly key: string
19
+ readonly config: Readonly<Record<string, JsonValue>>
20
+ }
21
+ export interface EventSourceDefinition {
22
+ readonly kind: string
23
+ readonly provider: string
24
+ readonly triggerId: string
25
+ readonly maximumBodyBytes: number
26
+ readonly applicationIngress: boolean
27
+ readonly managed: boolean
28
+ }
29
+ export type SourceOperation =
30
+ | { readonly action: 'initialize'; readonly input: Readonly<Record<string, JsonValue>> }
31
+ | { readonly action: 'update'; readonly source: SourceConfiguration; readonly input: Readonly<Record<string, JsonValue>> }
32
+ | { readonly action: 'inspect'; readonly source: SourceConfiguration }
33
+ | { readonly action: 'prepare'; readonly source: SourceConfiguration; readonly config: Readonly<Record<string, JsonValue>>; readonly endpointUrl?: string }
34
+ | {
35
+ readonly action: 'receive'
36
+ readonly source: SourceConfiguration
37
+ readonly headers: Readonly<Record<string, string>>
38
+ readonly rawBody: string
39
+ readonly consumers: readonly { readonly id: string; readonly config: Readonly<Record<string, JsonValue>> }[]
40
+ }
41
+
42
+ export class SourceIdentityError extends Error {}
43
+
44
+ export interface SourceReference {
45
+ readonly applicationId: string
46
+ readonly sourceId: string
47
+ }
48
+ export type SourceReferenceOperation = { readonly deploymentId: string } & (
49
+ | { readonly action: 'route'; readonly applicationId: string; readonly headers: Readonly<Record<string, string>>; readonly rawBody: string }
50
+ | {
51
+ readonly action: 'create'
52
+ readonly requestKey: string
53
+ readonly input: Readonly<Record<string, JsonValue>>
54
+ }
55
+ | { readonly action: 'get'; readonly reference: SourceReference }
56
+ | { readonly action: 'delete'; readonly reference: SourceReference | { readonly appId?: string; readonly requestKey: string } }
57
+ | {
58
+ readonly action: 'update'
59
+ readonly reference: SourceReference
60
+ readonly expectedRevision: number
61
+ readonly input: Readonly<Record<string, JsonValue>>
62
+ }
63
+ | { readonly action: 'prepare'; readonly reference: SourceReference; readonly config: Readonly<Record<string, JsonValue>>; readonly endpointUrl?: string }
64
+ | { readonly action: 'resource'; readonly reference: SourceReference; readonly key: string; readonly active: boolean }
65
+ | ({ readonly action: 'receive'; readonly reference: SourceReference } & Omit<Extract<SourceOperation, { action: 'receive' }>, 'source' | 'action'>)
66
+ )
@@ -0,0 +1,99 @@
1
+ import type { EventSourceDefinition, SourceConfiguration } from './definition.ts'
2
+
3
+ import { z } from 'zod'
4
+ import { eventSourceViewSchema } from '../../control/common/eventSources.ts'
5
+ import catalog from './catalog.generated.json' with { type: 'json' }
6
+ import { SourceIdentityError } from './definition.ts'
7
+
8
+ export type {
9
+ EventSourceDefinition,
10
+ SourceConfiguration,
11
+ SourceEvent,
12
+ SourceSubscription,
13
+ SourceOperation,
14
+ SourceReference,
15
+ SourceReferenceOperation,
16
+ } from './definition.ts'
17
+ export { SourceIdentityError } from './definition.ts'
18
+
19
+ export function eventSourceDefinition(kind: string): EventSourceDefinition {
20
+ for (const entry of catalog) if (entry.kind === kind) return entry
21
+ throw new SourceIdentityError(`Unknown event source kind: ${kind}`)
22
+ }
23
+
24
+ const jsonObject = z.record(z.string(), z.json())
25
+ const projectionSchema = z.object({ view: eventSourceViewSchema, ready: z.boolean(), expiresAt: z.number().optional() })
26
+ export const sourceConfigurationSchema = z.object({
27
+ identity: z.string().min(1),
28
+ eventTypes: z.array(z.string()),
29
+ config: jsonObject,
30
+ secrets: jsonObject,
31
+ state: jsonObject.refine((state) => projectionSchema.safeParse(state.projection).success, 'Connector source projection is invalid.'),
32
+ })
33
+
34
+ export function sourceReady(source: SourceConfiguration, now = Date.now()): boolean {
35
+ const projection = projectionSchema.safeParse(source.state.projection)
36
+ return projection.success && projection.data.ready && (projection.data.expiresAt == null || projection.data.expiresAt > now)
37
+ }
38
+
39
+ export function sourceView(source: SourceConfiguration, now = Date.now()): z.infer<typeof eventSourceViewSchema> {
40
+ if (source.state.projection == null)
41
+ return {
42
+ appId: null,
43
+ manageSubscriptions: null,
44
+ verificationTokenConfigured: null,
45
+ encryptKeyConfigured: null,
46
+ verifiedAt: null,
47
+ lastError: 'Source details are unavailable. Restore Connector access and refresh to retry.',
48
+ }
49
+ const projection = projectionSchema.parse(source.state.projection)
50
+ const expired = projection.expiresAt != null && projection.expiresAt <= now
51
+ return {
52
+ ...projection.view,
53
+ ...(expired ? { subscriptionStatus: 'error', lastError: 'The source subscription expired. Restore Connector access and retry publication.' } : {}),
54
+ }
55
+ }
56
+
57
+ export const sourceResultSchema = z.object({ source: sourceConfigurationSchema })
58
+ export const preparedSourceSchema = sourceResultSchema.extend({ subscriptions: z.array(z.object({ key: z.string(), config: jsonObject })) })
59
+ export const sourceReceiptSchema = z
60
+ .object({
61
+ source: sourceConfigurationSchema.optional(),
62
+ response: z.object({ status: z.number().int().min(200).max(599), body: z.string(), headers: z.record(z.string(), z.string()) }).optional(),
63
+ event: z
64
+ .object({
65
+ id: z.string().min(1),
66
+ type: z.string().min(1),
67
+ payload: jsonObject,
68
+ matches: z.array(z.string()),
69
+ ordering: z.object({ key: z.string(), version: z.number() }).optional(),
70
+ })
71
+ .optional(),
72
+ })
73
+ .refine((value) => (value.response == null) !== (value.event == null))
74
+
75
+ export type SourceResult = z.infer<typeof sourceResultSchema>
76
+ export type PreparedSource = z.infer<typeof preparedSourceSchema>
77
+ export type SourceReceipt = z.infer<typeof sourceReceiptSchema>
78
+
79
+ export const sourceReferenceSchema = z.object({ applicationId: z.string().min(1), sourceId: z.string().min(1) })
80
+ export const sourceReferenceSnapshotSchema = projectionSchema.extend({
81
+ reference: sourceReferenceSchema,
82
+ revision: z.number().int().positive(),
83
+ eventTypes: z.array(z.string()),
84
+ })
85
+ export const sourceReferenceResultSchema = z.object({ source: sourceReferenceSnapshotSchema })
86
+ export const sourceReferenceDeleteResultSchema = z.object({ deleted: z.literal(true) })
87
+ export const sourceReferenceResourceResultSchema = sourceReferenceResultSchema.extend({ outcome: z.enum(['ready', 'pending']) })
88
+ export const sourceReferenceRouteResultSchema = z.object({
89
+ references: z.array(sourceReferenceSchema),
90
+ response: sourceReceiptSchema.shape.response,
91
+ })
92
+ export const preparedSourceReferenceSchema = sourceReferenceResultSchema.extend({ subscriptions: z.array(z.object({ key: z.string() })) })
93
+ export const sourceReferenceReceiptSchema = z
94
+ .object({
95
+ ...sourceReceiptSchema.shape,
96
+ source: sourceReferenceSnapshotSchema.optional(),
97
+ })
98
+ .refine((value) => (value.response == null) !== (value.event == null))
99
+ export type SourceReferenceSnapshot = z.infer<typeof sourceReferenceSnapshotSchema>