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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/LICENSE +36 -0
  2. package/NOTICE +7 -0
  3. package/README.md +40 -0
  4. package/dist/browser/{createResourceDialog-BWJkjiOO.js → createResourceDialog-DI9pL-Yr.js} +2 -2
  5. package/dist/browser/{dialog-CUy_fwx9.js → dialog-BYJGvItc.js} +54 -19
  6. package/dist/browser/{flowChanges-CgSnSqqP.js → flowChanges-RL-H4CjD.js} +306 -48
  7. package/dist/browser/{flowWorkspace-Bf7H-r0t.js → flowWorkspace-BkDsETj0.js} +20745 -20186
  8. package/dist/browser/preview.css +73 -3
  9. package/dist/browser/preview.js +21410 -20607
  10. package/dist/browser/{typeScriptSession-B0hC-C8y.js → typeScriptSession-CSRwWmZm.js} +1 -1
  11. package/dist/browser/ui.css +72 -2
  12. package/dist/browser/workbench.css +73 -3
  13. package/dist/browser/workbench.js +14 -76
  14. package/dist/browser/{workbenchSelect-C3e4J93X.js → workbenchSelect-BcWPWGzw.js} +1 -1
  15. package/dist/command/index.js +34 -34
  16. package/dist/common/authoring.d.ts +1 -1
  17. package/dist/common/authoringFields.d.ts +1 -1
  18. package/dist/common/authoringSchema.d.ts +28 -4
  19. package/dist/common/connector-proxy.d.ts +1 -1
  20. package/dist/common/control-api-conformance.d.ts +1 -1
  21. package/dist/common/control-api-conformance.js +61 -24
  22. package/dist/common/control-api.d.ts +4 -3
  23. package/dist/common/control-api.js +90 -42
  24. package/dist/common/control-requests.d.ts +2 -1
  25. package/dist/common/control-requests.js +204 -42
  26. package/dist/common/cron-trigger.d.ts +1 -1
  27. package/dist/common/decision.d.ts +1 -1
  28. package/dist/common/draftOperations.d.ts +1 -1
  29. package/dist/common/engine-contract.d.ts +3 -2
  30. package/dist/common/event-source-definition.d.ts +1 -1
  31. package/dist/common/flow-agent.d.ts +1 -1
  32. package/dist/{browser → common}/flow-authoring-node.d.ts +3 -3
  33. package/dist/{browser → common}/flow-authoring.js +75 -23
  34. package/dist/{browser → common}/flow-change-schema.d.ts +177 -6
  35. package/dist/{browser → common}/flow-change.d.ts +35 -15
  36. package/dist/{browser → common}/flow-change.js +77 -25
  37. package/dist/common/flow-connectionUsage.d.ts +1 -1
  38. package/dist/common/flow-encoding.d.ts +1 -1
  39. package/dist/common/flow-encoding.js +34 -16
  40. package/dist/common/flow-errorHandling.d.ts +1 -1
  41. package/dist/common/flow-graph.d.ts +1 -1
  42. package/dist/common/flow-modules.d.ts +1 -1
  43. package/dist/common/flow-promptTemplate.d.ts +1 -1
  44. package/dist/common/flow-retry.d.ts +1 -1
  45. package/dist/common/flow-semantics.d.ts +1 -1
  46. package/dist/common/flow-semantics.js +151 -32
  47. package/dist/common/flow-workflowFile.d.ts +1 -1
  48. package/dist/common/flowInspection.d.ts +3 -3
  49. package/dist/common/integration-trigger.d.ts +1 -1
  50. package/dist/common/licenses.md +118 -1
  51. package/dist/common/liveDetails.d.ts +1 -1
  52. package/dist/common/mcp.d.ts +2 -1
  53. package/dist/common/mcp.js +59 -22
  54. package/dist/common/openapi.d.ts +1 -1
  55. package/dist/common/poll-trigger.d.ts +1 -1
  56. package/dist/common/run-results.d.ts +8 -1
  57. package/dist/common/runtime-contract.d.ts +8 -2
  58. package/dist/common/runtime-contract.js +22 -5
  59. package/dist/common/scheduler-checkpoint.d.ts +1 -1
  60. package/dist/common/scheduler-dependencies.d.ts +1 -1
  61. package/dist/common/scheduler-node-execution.d.ts +1 -1
  62. package/dist/common/scheduler.d.ts +2 -2
  63. package/dist/common/scheduler.js +31 -12
  64. package/dist/common/trigger-catalog.d.ts +1 -1
  65. package/dist/common/trigger-config-options.d.ts +1 -1
  66. package/dist/common/trigger-config.d.ts +1 -1
  67. package/dist/common/trigger-contract.d.ts +2 -2
  68. package/dist/common/trigger-localization.d.ts +1 -1
  69. package/dist/common/webhook-response.d.ts +1 -1
  70. package/dist/common/webhook-trigger.d.ts +1 -1
  71. package/dist/common/workflow.d.ts +17 -1
  72. package/dist/common/workflow.js +68 -22
  73. package/dist/index.d.ts +6 -3
  74. package/package.json +7 -6
  75. package/src/base/common/json.ts +90 -0
  76. package/src/canvas/common/commands.ts +15 -0
  77. package/src/connector/common/actionSchema.ts +168 -0
  78. package/src/connector/common/proxy.ts +44 -0
  79. package/src/control/common/api.ts +1505 -0
  80. package/src/control/common/authoring.ts +912 -0
  81. package/src/control/common/authoringCondition.ts +110 -0
  82. package/src/control/common/authoringDiagnosticFields.ts +136 -0
  83. package/src/control/common/authoringExamples.ts +192 -0
  84. package/src/control/common/authoringFields.ts +53 -0
  85. package/src/control/common/authoringLlm.ts +70 -0
  86. package/src/control/common/authoringOpenApi.ts +129 -0
  87. package/src/control/common/authoringSchema.ts +404 -0
  88. package/src/control/common/authoringTools.ts +123 -0
  89. package/src/control/common/authoringTriggers.ts +26 -0
  90. package/src/control/common/checkDecoders.ts +65 -0
  91. package/src/control/common/conformance.ts +1989 -0
  92. package/src/control/common/connectorDecoders.ts +370 -0
  93. package/src/control/common/connectorQueries.ts +61 -0
  94. package/src/control/common/decoding.ts +60 -0
  95. package/src/control/common/draftOperations.ts +61 -0
  96. package/src/control/common/errors.ts +114 -0
  97. package/src/control/common/eventSourceSchemas.ts +13 -0
  98. package/src/control/common/eventSources.ts +186 -0
  99. package/src/control/common/flowDecoders.ts +153 -0
  100. package/src/control/common/flowInspection.ts +181 -0
  101. package/src/control/common/flowNotifications.ts +37 -0
  102. package/src/control/common/liveDetails.ts +124 -0
  103. package/src/control/common/mcp.ts +241 -0
  104. package/src/control/common/mcpConformance.ts +142 -0
  105. package/src/control/common/providerAccess.ts +28 -0
  106. package/src/control/common/providerIconSprite.ts +42 -0
  107. package/src/control/common/publicationDecoders.ts +98 -0
  108. package/src/control/common/random.ts +16 -0
  109. package/src/control/common/requests.ts +112 -0
  110. package/src/control/common/resultQuery.ts +8 -0
  111. package/src/control/common/results.ts +176 -0
  112. package/src/control/common/revisionDecoders.ts +52 -0
  113. package/src/control/common/runDecoders.ts +240 -0
  114. package/src/control/common/triggerCatalog.ts +89 -0
  115. package/src/control/common/triggerDecoders.ts +175 -0
  116. package/src/decision/common/decision.ts +168 -0
  117. package/src/event-source/common/catalog.generated.json +65 -0
  118. package/src/event-source/common/definition.ts +66 -0
  119. package/src/event-source/common/index.ts +99 -0
  120. package/src/execution/common/checkpoint.ts +311 -0
  121. package/src/execution/common/dependencies.ts +440 -0
  122. package/src/execution/common/engineContract.ts +80 -0
  123. package/src/execution/common/events.ts +328 -0
  124. package/src/execution/common/node-execution.ts +467 -0
  125. package/src/execution/common/runLifecycle.ts +250 -0
  126. package/src/execution/common/runtime.ts +563 -0
  127. package/src/execution/common/scheduler.ts +696 -0
  128. package/src/execution/common/wait.ts +36 -0
  129. package/src/flow/common/agent.ts +305 -0
  130. package/src/flow/common/authoring.ts +30 -0
  131. package/src/flow/common/change.ts +1036 -0
  132. package/src/flow/common/changeSchema.ts +783 -0
  133. package/src/flow/common/codePermissions.ts +2 -0
  134. package/src/flow/common/condition.ts +265 -0
  135. package/src/flow/common/connectionUsage.ts +131 -0
  136. package/src/flow/common/edgeChanges.ts +35 -0
  137. package/src/flow/common/encoding.ts +437 -0
  138. package/src/flow/common/errorHandling.ts +34 -0
  139. package/src/flow/common/graph.ts +892 -0
  140. package/src/flow/common/inputValue.ts +16 -0
  141. package/src/flow/common/json.ts +8 -0
  142. package/src/flow/common/moduleChanges.ts +31 -0
  143. package/src/flow/common/modules.ts +292 -0
  144. package/src/flow/common/nodeChanges.ts +762 -0
  145. package/src/flow/common/portChanges.ts +36 -0
  146. package/src/flow/common/promptTemplate.ts +15 -0
  147. package/src/flow/common/retry.ts +20 -0
  148. package/src/flow/common/schema.ts +162 -0
  149. package/src/flow/common/schemaCompare.ts +176 -0
  150. package/src/flow/common/schemaComparer.ts +178 -0
  151. package/src/flow/common/schemaKeywords.ts +53 -0
  152. package/src/flow/common/semantics.ts +474 -0
  153. package/src/flow/common/sourceField.ts +35 -0
  154. package/src/flow/common/triggerScheduleSchema.ts +8 -0
  155. package/src/flow/common/wait.ts +30 -0
  156. package/src/flow/common/webhookMethod.ts +7 -0
  157. package/src/flow/common/webhookResponse.ts +75 -0
  158. package/src/flow/common/workflowFile.ts +97 -0
  159. package/src/json-schema-subset/checker/array.ts +142 -0
  160. package/src/json-schema-subset/checker/cache.ts +57 -0
  161. package/src/json-schema-subset/checker/checker.ts +230 -0
  162. package/src/json-schema-subset/checker/enumAndConst.ts +113 -0
  163. package/src/json-schema-subset/checker/equals.ts +93 -0
  164. package/src/json-schema-subset/checker/numeric/checker.ts +50 -0
  165. package/src/json-schema-subset/checker/numeric/float.ts +121 -0
  166. package/src/json-schema-subset/checker/numeric/index.ts +1 -0
  167. package/src/json-schema-subset/checker/numeric/integer.ts +119 -0
  168. package/src/json-schema-subset/checker/numeric/integerNormalizer.ts +72 -0
  169. package/src/json-schema-subset/checker/object.ts +354 -0
  170. package/src/json-schema-subset/checker/range.ts +91 -0
  171. package/src/json-schema-subset/checker/string.ts +60 -0
  172. package/src/json-schema-subset/checker/tools/index.ts +3 -0
  173. package/src/json-schema-subset/checker/tools/mark.ts +82 -0
  174. package/src/json-schema-subset/checker/tools/quantum.ts +106 -0
  175. package/src/json-schema-subset/checker/tools/range.ts +210 -0
  176. package/src/json-schema-subset/checker/validator.ts +23 -0
  177. package/src/json-schema-subset/compiler/array.ts +163 -0
  178. package/src/json-schema-subset/compiler/combination.ts +109 -0
  179. package/src/json-schema-subset/compiler/common.ts +99 -0
  180. package/src/json-schema-subset/compiler/compiler.ts +188 -0
  181. package/src/json-schema-subset/compiler/enumAndConst.ts +75 -0
  182. package/src/json-schema-subset/compiler/index.ts +11 -0
  183. package/src/json-schema-subset/compiler/object.ts +411 -0
  184. package/src/json-schema-subset/compiler/primitive.ts +144 -0
  185. package/src/json-schema-subset/compiler/utils.ts +24 -0
  186. package/src/json-schema-subset/compiler/wrapper.ts +192 -0
  187. package/src/json-schema-subset/error.ts +55 -0
  188. package/src/json-schema-subset/expression/calculator.ts +442 -0
  189. package/src/json-schema-subset/expression/combination.ts +49 -0
  190. package/src/json-schema-subset/expression/expression.ts +191 -0
  191. package/src/json-schema-subset/expression/index.ts +25 -0
  192. package/src/json-schema-subset/expression/result.ts +88 -0
  193. package/src/json-schema-subset/expression/types.ts +36 -0
  194. package/src/json-schema-subset/extends/extendsContext.ts +89 -0
  195. package/src/json-schema-subset/extends/index.ts +2 -0
  196. package/src/json-schema-subset/extends/types.ts +12 -0
  197. package/src/json-schema-subset/global.ts +60 -0
  198. package/src/json-schema-subset/index.ts +8 -0
  199. package/src/json-schema-subset/preprocessing.ts +74 -0
  200. package/src/json-schema-subset/types.ts +8 -0
  201. package/src/json-schema-subset/utils.ts +95 -0
  202. package/src/localization/common/languages.ts +118 -0
  203. package/src/localization/common/timeZone.ts +25 -0
  204. package/src/openapi/common/authBindings.ts +12 -0
  205. package/src/openapi/common/openapi.ts +459 -0
  206. package/src/trigger/common/config.ts +56 -0
  207. package/src/trigger/common/configOptions.ts +15 -0
  208. package/src/trigger/common/configSchema.ts +8 -0
  209. package/src/trigger/common/contract.ts +132 -0
  210. package/src/trigger/common/cron.ts +151 -0
  211. package/src/trigger/common/integration.ts +498 -0
  212. package/src/trigger/common/poll.ts +187 -0
  213. package/src/trigger/common/webhook.ts +412 -0
  214. package/src/trigger/providers/airtable/locales/fr.json +18 -0
  215. package/src/trigger/providers/airtable/locales/ja.json +18 -0
  216. package/src/trigger/providers/airtable/locales/ko.json +18 -0
  217. package/src/trigger/providers/airtable/locales/ru.json +18 -0
  218. package/src/trigger/providers/airtable/locales/zh-CN.json +18 -0
  219. package/src/trigger/providers/airtable/locales/zh-TW.json +18 -0
  220. package/src/trigger/providers/asana/locales/fr.json +15 -0
  221. package/src/trigger/providers/asana/locales/ja.json +15 -0
  222. package/src/trigger/providers/asana/locales/ko.json +15 -0
  223. package/src/trigger/providers/asana/locales/ru.json +15 -0
  224. package/src/trigger/providers/asana/locales/zh-CN.json +15 -0
  225. package/src/trigger/providers/asana/locales/zh-TW.json +15 -0
  226. package/src/trigger/providers/calendly/locales/fr.json +16 -0
  227. package/src/trigger/providers/calendly/locales/ja.json +16 -0
  228. package/src/trigger/providers/calendly/locales/ko.json +16 -0
  229. package/src/trigger/providers/calendly/locales/ru.json +16 -0
  230. package/src/trigger/providers/calendly/locales/zh-CN.json +16 -0
  231. package/src/trigger/providers/calendly/locales/zh-TW.json +16 -0
  232. package/src/trigger/providers/catalog.generated.json +4996 -0
  233. package/src/trigger/providers/clickup/locales/fr.json +16 -0
  234. package/src/trigger/providers/clickup/locales/ja.json +16 -0
  235. package/src/trigger/providers/clickup/locales/ko.json +16 -0
  236. package/src/trigger/providers/clickup/locales/ru.json +16 -0
  237. package/src/trigger/providers/clickup/locales/zh-CN.json +16 -0
  238. package/src/trigger/providers/clickup/locales/zh-TW.json +16 -0
  239. package/src/trigger/providers/definitions.ts +19 -0
  240. package/src/trigger/providers/feishu/locales/fr.json +20 -0
  241. package/src/trigger/providers/feishu/locales/ja.json +20 -0
  242. package/src/trigger/providers/feishu/locales/ko.json +20 -0
  243. package/src/trigger/providers/feishu/locales/ru.json +20 -0
  244. package/src/trigger/providers/feishu/locales/zh-CN.json +20 -0
  245. package/src/trigger/providers/feishu/locales/zh-TW.json +20 -0
  246. package/src/trigger/providers/fieldDescriptions.ts +392 -0
  247. package/src/trigger/providers/fieldLabels.ts +256 -0
  248. package/src/trigger/providers/fireflies/locales/fr.json +17 -0
  249. package/src/trigger/providers/fireflies/locales/ja.json +17 -0
  250. package/src/trigger/providers/fireflies/locales/ko.json +17 -0
  251. package/src/trigger/providers/fireflies/locales/ru.json +17 -0
  252. package/src/trigger/providers/fireflies/locales/zh-CN.json +17 -0
  253. package/src/trigger/providers/fireflies/locales/zh-TW.json +17 -0
  254. package/src/trigger/providers/github/locales/fr.json +30 -0
  255. package/src/trigger/providers/github/locales/ja.json +30 -0
  256. package/src/trigger/providers/github/locales/ko.json +30 -0
  257. package/src/trigger/providers/github/locales/ru.json +30 -0
  258. package/src/trigger/providers/github/locales/zh-CN.json +30 -0
  259. package/src/trigger/providers/github/locales/zh-TW.json +30 -0
  260. package/src/trigger/providers/gitlab/locales/fr.json +18 -0
  261. package/src/trigger/providers/gitlab/locales/ja.json +18 -0
  262. package/src/trigger/providers/gitlab/locales/ko.json +18 -0
  263. package/src/trigger/providers/gitlab/locales/ru.json +18 -0
  264. package/src/trigger/providers/gitlab/locales/zh-CN.json +18 -0
  265. package/src/trigger/providers/gitlab/locales/zh-TW.json +18 -0
  266. package/src/trigger/providers/gmail/locales/fr.json +18 -0
  267. package/src/trigger/providers/gmail/locales/ja.json +18 -0
  268. package/src/trigger/providers/gmail/locales/ko.json +18 -0
  269. package/src/trigger/providers/gmail/locales/ru.json +18 -0
  270. package/src/trigger/providers/gmail/locales/zh-CN.json +18 -0
  271. package/src/trigger/providers/gmail/locales/zh-TW.json +18 -0
  272. package/src/trigger/providers/google-calendar/locales/fr.json +15 -0
  273. package/src/trigger/providers/google-calendar/locales/ja.json +15 -0
  274. package/src/trigger/providers/google-calendar/locales/ko.json +15 -0
  275. package/src/trigger/providers/google-calendar/locales/ru.json +15 -0
  276. package/src/trigger/providers/google-calendar/locales/zh-CN.json +15 -0
  277. package/src/trigger/providers/google-calendar/locales/zh-TW.json +15 -0
  278. package/src/trigger/providers/google-drive/locales/fr.json +48 -0
  279. package/src/trigger/providers/google-drive/locales/ja.json +48 -0
  280. package/src/trigger/providers/google-drive/locales/ko.json +48 -0
  281. package/src/trigger/providers/google-drive/locales/ru.json +48 -0
  282. package/src/trigger/providers/google-drive/locales/zh-CN.json +48 -0
  283. package/src/trigger/providers/google-drive/locales/zh-TW.json +48 -0
  284. package/src/trigger/providers/google-sheets/locales/fr.json +19 -0
  285. package/src/trigger/providers/google-sheets/locales/ja.json +19 -0
  286. package/src/trigger/providers/google-sheets/locales/ko.json +19 -0
  287. package/src/trigger/providers/google-sheets/locales/ru.json +19 -0
  288. package/src/trigger/providers/google-sheets/locales/zh-CN.json +19 -0
  289. package/src/trigger/providers/google-sheets/locales/zh-TW.json +19 -0
  290. package/src/trigger/providers/intercom/locales/fr.json +17 -0
  291. package/src/trigger/providers/intercom/locales/ja.json +17 -0
  292. package/src/trigger/providers/intercom/locales/ko.json +17 -0
  293. package/src/trigger/providers/intercom/locales/ru.json +17 -0
  294. package/src/trigger/providers/intercom/locales/zh-CN.json +17 -0
  295. package/src/trigger/providers/intercom/locales/zh-TW.json +17 -0
  296. package/src/trigger/providers/jira/locales/fr.json +17 -0
  297. package/src/trigger/providers/jira/locales/ja.json +17 -0
  298. package/src/trigger/providers/jira/locales/ko.json +17 -0
  299. package/src/trigger/providers/jira/locales/ru.json +17 -0
  300. package/src/trigger/providers/jira/locales/zh-CN.json +17 -0
  301. package/src/trigger/providers/jira/locales/zh-TW.json +17 -0
  302. package/src/trigger/providers/linear/locales/fr.json +13 -0
  303. package/src/trigger/providers/linear/locales/ja.json +13 -0
  304. package/src/trigger/providers/linear/locales/ko.json +13 -0
  305. package/src/trigger/providers/linear/locales/ru.json +13 -0
  306. package/src/trigger/providers/linear/locales/zh-CN.json +13 -0
  307. package/src/trigger/providers/linear/locales/zh-TW.json +13 -0
  308. package/src/trigger/providers/locales/fr.ts +71 -0
  309. package/src/trigger/providers/locales/ja.ts +71 -0
  310. package/src/trigger/providers/locales/ko.ts +71 -0
  311. package/src/trigger/providers/locales/ru.ts +71 -0
  312. package/src/trigger/providers/locales/zh-CN.ts +71 -0
  313. package/src/trigger/providers/locales/zh-TW.ts +71 -0
  314. package/src/trigger/providers/localization.ts +59 -0
  315. package/src/trigger/providers/notion/locales/fr.json +16 -0
  316. package/src/trigger/providers/notion/locales/ja.json +16 -0
  317. package/src/trigger/providers/notion/locales/ko.json +16 -0
  318. package/src/trigger/providers/notion/locales/ru.json +16 -0
  319. package/src/trigger/providers/notion/locales/zh-CN.json +16 -0
  320. package/src/trigger/providers/notion/locales/zh-TW.json +16 -0
  321. package/src/trigger/providers/one-drive/locales/fr.json +16 -0
  322. package/src/trigger/providers/one-drive/locales/ja.json +16 -0
  323. package/src/trigger/providers/one-drive/locales/ko.json +16 -0
  324. package/src/trigger/providers/one-drive/locales/ru.json +16 -0
  325. package/src/trigger/providers/one-drive/locales/zh-CN.json +16 -0
  326. package/src/trigger/providers/one-drive/locales/zh-TW.json +16 -0
  327. package/src/trigger/providers/outlook/locales/fr.json +18 -0
  328. package/src/trigger/providers/outlook/locales/ja.json +18 -0
  329. package/src/trigger/providers/outlook/locales/ko.json +18 -0
  330. package/src/trigger/providers/outlook/locales/ru.json +18 -0
  331. package/src/trigger/providers/outlook/locales/zh-CN.json +18 -0
  332. package/src/trigger/providers/outlook/locales/zh-TW.json +18 -0
  333. package/src/trigger/providers/pandadoc/locales/fr.json +12 -0
  334. package/src/trigger/providers/pandadoc/locales/ja.json +12 -0
  335. package/src/trigger/providers/pandadoc/locales/ko.json +12 -0
  336. package/src/trigger/providers/pandadoc/locales/ru.json +12 -0
  337. package/src/trigger/providers/pandadoc/locales/zh-CN.json +12 -0
  338. package/src/trigger/providers/pandadoc/locales/zh-TW.json +12 -0
  339. package/src/trigger/providers/pipedrive/locales/fr.json +15 -0
  340. package/src/trigger/providers/pipedrive/locales/ja.json +15 -0
  341. package/src/trigger/providers/pipedrive/locales/ko.json +15 -0
  342. package/src/trigger/providers/pipedrive/locales/ru.json +15 -0
  343. package/src/trigger/providers/pipedrive/locales/zh-CN.json +15 -0
  344. package/src/trigger/providers/pipedrive/locales/zh-TW.json +15 -0
  345. package/src/trigger/providers/remote.ts +163 -0
  346. package/src/trigger/providers/resend/locales/fr.json +16 -0
  347. package/src/trigger/providers/resend/locales/ja.json +16 -0
  348. package/src/trigger/providers/resend/locales/ko.json +16 -0
  349. package/src/trigger/providers/resend/locales/ru.json +16 -0
  350. package/src/trigger/providers/resend/locales/zh-CN.json +16 -0
  351. package/src/trigger/providers/resend/locales/zh-TW.json +16 -0
  352. package/src/trigger/providers/sentry/locales/fr.json +19 -0
  353. package/src/trigger/providers/sentry/locales/ja.json +19 -0
  354. package/src/trigger/providers/sentry/locales/ko.json +19 -0
  355. package/src/trigger/providers/sentry/locales/ru.json +19 -0
  356. package/src/trigger/providers/sentry/locales/zh-CN.json +19 -0
  357. package/src/trigger/providers/sentry/locales/zh-TW.json +19 -0
  358. package/src/trigger/providers/shopify/locales/fr.json +18 -0
  359. package/src/trigger/providers/shopify/locales/ja.json +18 -0
  360. package/src/trigger/providers/shopify/locales/ko.json +18 -0
  361. package/src/trigger/providers/shopify/locales/ru.json +18 -0
  362. package/src/trigger/providers/shopify/locales/zh-CN.json +18 -0
  363. package/src/trigger/providers/shopify/locales/zh-TW.json +18 -0
  364. package/src/trigger/providers/slack/locales/fr.json +18 -0
  365. package/src/trigger/providers/slack/locales/ja.json +18 -0
  366. package/src/trigger/providers/slack/locales/ko.json +18 -0
  367. package/src/trigger/providers/slack/locales/ru.json +18 -0
  368. package/src/trigger/providers/slack/locales/zh-CN.json +18 -0
  369. package/src/trigger/providers/slack/locales/zh-TW.json +18 -0
  370. package/src/trigger/providers/slackbot/locales/fr.json +23 -0
  371. package/src/trigger/providers/slackbot/locales/ja.json +23 -0
  372. package/src/trigger/providers/slackbot/locales/ko.json +23 -0
  373. package/src/trigger/providers/slackbot/locales/ru.json +23 -0
  374. package/src/trigger/providers/slackbot/locales/zh-CN.json +23 -0
  375. package/src/trigger/providers/slackbot/locales/zh-TW.json +23 -0
  376. package/src/trigger/providers/source-events.ts +25 -0
  377. package/src/trigger/providers/stripe/locales/fr.json +17 -0
  378. package/src/trigger/providers/stripe/locales/ja.json +17 -0
  379. package/src/trigger/providers/stripe/locales/ko.json +17 -0
  380. package/src/trigger/providers/stripe/locales/ru.json +17 -0
  381. package/src/trigger/providers/stripe/locales/zh-CN.json +17 -0
  382. package/src/trigger/providers/stripe/locales/zh-TW.json +17 -0
  383. package/src/trigger/providers/tally/locales/fr.json +12 -0
  384. package/src/trigger/providers/tally/locales/ja.json +12 -0
  385. package/src/trigger/providers/tally/locales/ko.json +12 -0
  386. package/src/trigger/providers/tally/locales/ru.json +12 -0
  387. package/src/trigger/providers/tally/locales/zh-CN.json +12 -0
  388. package/src/trigger/providers/tally/locales/zh-TW.json +12 -0
  389. package/src/trigger/providers/telegram/locales/fr.json +17 -0
  390. package/src/trigger/providers/telegram/locales/ja.json +17 -0
  391. package/src/trigger/providers/telegram/locales/ko.json +17 -0
  392. package/src/trigger/providers/telegram/locales/ru.json +17 -0
  393. package/src/trigger/providers/telegram/locales/zh-CN.json +17 -0
  394. package/src/trigger/providers/telegram/locales/zh-TW.json +17 -0
  395. package/src/trigger/providers/typeform/locales/fr.json +12 -0
  396. package/src/trigger/providers/typeform/locales/ja.json +12 -0
  397. package/src/trigger/providers/typeform/locales/ko.json +12 -0
  398. package/src/trigger/providers/typeform/locales/ru.json +12 -0
  399. package/src/trigger/providers/typeform/locales/zh-CN.json +12 -0
  400. package/src/trigger/providers/typeform/locales/zh-TW.json +12 -0
  401. package/src/trigger/providers/vercel/locales/fr.json +18 -0
  402. package/src/trigger/providers/vercel/locales/ja.json +18 -0
  403. package/src/trigger/providers/vercel/locales/ko.json +18 -0
  404. package/src/trigger/providers/vercel/locales/ru.json +18 -0
  405. package/src/trigger/providers/vercel/locales/zh-CN.json +18 -0
  406. package/src/trigger/providers/vercel/locales/zh-TW.json +18 -0
  407. package/src/trigger/providers/woocommerce/locales/fr.json +19 -0
  408. package/src/trigger/providers/woocommerce/locales/ja.json +19 -0
  409. package/src/trigger/providers/woocommerce/locales/ko.json +19 -0
  410. package/src/trigger/providers/woocommerce/locales/ru.json +19 -0
  411. package/src/trigger/providers/woocommerce/locales/zh-CN.json +19 -0
  412. package/src/trigger/providers/woocommerce/locales/zh-TW.json +19 -0
  413. package/src/trigger/providers/zendesk/locales/fr.json +15 -0
  414. package/src/trigger/providers/zendesk/locales/ja.json +15 -0
  415. package/src/trigger/providers/zendesk/locales/ko.json +15 -0
  416. package/src/trigger/providers/zendesk/locales/ru.json +15 -0
  417. package/src/trigger/providers/zendesk/locales/zh-CN.json +15 -0
  418. package/src/trigger/providers/zendesk/locales/zh-TW.json +15 -0
  419. package/src/trigger/providers/zoom/locales/fr.json +17 -0
  420. package/src/trigger/providers/zoom/locales/ja.json +17 -0
  421. package/src/trigger/providers/zoom/locales/ko.json +17 -0
  422. package/src/trigger/providers/zoom/locales/ru.json +17 -0
  423. package/src/trigger/providers/zoom/locales/zh-CN.json +17 -0
  424. package/src/trigger/providers/zoom/locales/zh-TW.json +17 -0
  425. package/src/types/index.ts +112 -0
  426. package/src/workflow/common/workflow.ts +273 -0
  427. package/dist/browser/lib-DrKav3HG.js +0 -11403
  428. /package/dist/{browser → common}/flow-authoring-edge.d.ts +0 -0
  429. /package/dist/{browser → common}/flow-authoring-module.d.ts +0 -0
  430. /package/dist/{browser → common}/flow-authoring.d.ts +0 -0
  431. /package/dist/{browser → common}/flow-input-value.d.ts +0 -0
  432. /package/dist/{browser → common}/webhook-method.d.ts +0 -0
@@ -0,0 +1,563 @@
1
+ import type { CodeModule, ConnectorCapability, TaskCapability, JsonValue } from '../../flow/common/change.ts'
2
+
3
+ import { dequal } from 'dequal/lite'
4
+ import { currentEngineContract, nodejsEngineContract } from './engineContract.ts'
5
+
6
+ export { currentEngineContract, nodejsEngineContract, findEngineContract, type EngineContract } from './engineContract.ts'
7
+
8
+ export type RuntimeModule = Pick<CodeModule, 'imports' | 'source'>
9
+
10
+ /** Snapshot a Task result before JSON transport can discard or coerce invalid values. */
11
+ export function snapshotRuntimeResult(value: unknown): JsonValue | undefined {
12
+ // This function is also serialized into the isolated runtime; keep it self-contained.
13
+ const parents = new Set<object>()
14
+ const copy = (item: unknown, depth: number): JsonValue => {
15
+ if (depth > 64) throw new Error('Task result exceeds the maximum JSON depth.')
16
+ if (item === null || typeof item == 'string' || typeof item == 'boolean') return item
17
+ if (typeof item == 'number' && Number.isFinite(item)) return item
18
+ if (
19
+ typeof item != 'object' ||
20
+ parents.has(item) ||
21
+ (!Array.isArray(item) && Object.getPrototypeOf(item) !== Object.prototype && Object.getPrototypeOf(item) !== null) ||
22
+ Object.getOwnPropertySymbols(item).length > 0
23
+ )
24
+ throw new Error('Task result must contain only JSON values.')
25
+ parents.add(item)
26
+ const result = Array.isArray(item)
27
+ ? Array.from(item, (child) => copy(child, depth + 1))
28
+ : Object.fromEntries(
29
+ Object.entries(item)
30
+ .filter(([, child]) => depth != 0 || child !== undefined)
31
+ .map(([key, child]) => [key, copy(child, depth + 1)]),
32
+ )
33
+ parents.delete(item)
34
+ return result
35
+ }
36
+ return value === undefined ? undefined : copy(value, 0)
37
+ }
38
+
39
+ export const nodejsRuntimeConformanceCases: readonly RuntimeConformanceCase[] = [
40
+ {
41
+ name: 'supports Node builtin imports and asynchronous virtual file operations',
42
+ async verify(harness) {
43
+ const value = await harness.invoke({
44
+ capability: async () => ({ body: null, status: 403 }),
45
+ input: null,
46
+ invocationId: 'nodejs-files',
47
+ program: {
48
+ ...program(
49
+ harness,
50
+ `import assert from 'node:assert/strict';
51
+ import { Buffer } from 'node:buffer'; import path from 'node:path'; import fs from 'node:fs/promises';
52
+ export default async () => {
53
+ const file = path.join('/tmp', 'conformance.txt');
54
+ await fs.writeFile(file, Buffer.from('你好'));
55
+ const text = await fs.readFile(file, 'utf8');
56
+ assert.equal(text, '你好');
57
+ await fs.unlink(file);
58
+ return { text, bytes: Buffer.byteLength(text) };
59
+ }`,
60
+ ),
61
+ engineContract: nodejsEngineContract,
62
+ },
63
+ })
64
+ equal(value, { text: '你好', bytes: 6 }, 'Node virtual files')
65
+ },
66
+ },
67
+ {
68
+ name: 'preserves abort reasons and cancels Promise timers',
69
+ async verify(harness) {
70
+ const value = await harness.invoke({
71
+ capability: async () => ({ body: null, status: 403 }),
72
+ input: null,
73
+ invocationId: 'nodejs-abort',
74
+ program: {
75
+ ...program(
76
+ harness,
77
+ `import { setTimeout } from 'node:timers/promises';
78
+ export default async () => {
79
+ const controller = new AbortController(); const reason = { message: 'stop' };
80
+ const combined = AbortSignal.any([controller.signal]);
81
+ const pending = setTimeout(60000, 'late', { signal: combined });
82
+ controller.abort(reason); controller.abort('ignored');
83
+ let thrown; try { combined.throwIfAborted(); } catch (error) { thrown = error; }
84
+ try { await pending; return false; } catch (error) {
85
+ return { sameReason: combined.reason === reason && thrown === reason, name: error.name };
86
+ }
87
+ }`,
88
+ ),
89
+ engineContract: nodejsEngineContract,
90
+ },
91
+ })
92
+ equal(value, { sameReason: true, name: 'AbortError' }, 'Node cancellation')
93
+ },
94
+ },
95
+ ]
96
+
97
+ export interface RuntimeProgram {
98
+ readonly engineContract: string
99
+ readonly engineDigest: string
100
+ readonly entryModuleId: string
101
+ readonly modules: Readonly<Record<string, RuntimeModule>>
102
+ }
103
+
104
+ export interface RuntimeCapabilityCall {
105
+ readonly nodeId?: string
106
+ readonly jobId?: string
107
+ readonly callId: string
108
+ readonly invocationId: string
109
+ readonly kind: string
110
+ readonly payload: JsonValue
111
+ readonly signal: AbortSignal
112
+ }
113
+
114
+ export interface RuntimeCapabilityResponse {
115
+ readonly body: JsonValue
116
+ readonly status: number
117
+ }
118
+
119
+ export interface LlmTaskInvocation {
120
+ readonly input: Readonly<Record<string, JsonValue>>
121
+ readonly invocationId: string
122
+ readonly mode: 'chat' | 'json'
123
+ readonly signal: AbortSignal
124
+ readonly version: 1
125
+ }
126
+
127
+ export type LlmTaskResult =
128
+ | { readonly kind: 'completed'; readonly value: JsonValue; readonly version: 1 }
129
+ | {
130
+ readonly retryable?: boolean
131
+ readonly code: 'llm.output-invalid' | 'llm.unavailable'
132
+ readonly kind: 'failed'
133
+ readonly message: string
134
+ readonly version: 1
135
+ }
136
+
137
+ export type InvokeLlmTask = (invocation: LlmTaskInvocation) => Promise<LlmTaskResult>
138
+
139
+ export interface AgentCheckpoint {
140
+ readonly state: JsonValue
141
+ readonly callId: string
142
+ readonly toolId: string
143
+ readonly input: Readonly<Record<string, JsonValue>>
144
+ readonly rounds: number
145
+ readonly version: 1
146
+ }
147
+
148
+ export type AgentResult = { readonly kind: 'completed'; readonly output: JsonValue } | { readonly kind: 'suspended'; readonly checkpoint: AgentCheckpoint }
149
+
150
+ export interface AgentInvocation {
151
+ readonly input: Readonly<Record<string, JsonValue>>
152
+ readonly invocationId: string
153
+ readonly signal: AbortSignal
154
+ readonly resume?: { readonly action: 'approve' | 'reject'; readonly checkpoint: AgentCheckpoint }
155
+ }
156
+
157
+ export interface RuntimeInvocation {
158
+ readonly capabilities?: readonly TaskCapability[]
159
+ readonly capability: (call: RuntimeCapabilityCall) => Promise<RuntimeCapabilityResponse>
160
+ readonly input: JsonValue
161
+ readonly invocationId: string
162
+ readonly program: RuntimeProgram
163
+ readonly signal?: AbortSignal
164
+ }
165
+
166
+ export interface RuntimeHarness {
167
+ readonly engineDigest: string
168
+ invoke(invocation: RuntimeInvocation): Promise<JsonValue | undefined>
169
+ }
170
+
171
+ export interface RuntimeConformanceCase {
172
+ readonly name: string
173
+ verify(harness: RuntimeHarness): Promise<void>
174
+ }
175
+
176
+ function program(harness: RuntimeHarness, source: string, modules: Readonly<Record<string, RuntimeModule>> = {}): RuntimeProgram {
177
+ return {
178
+ engineContract: currentEngineContract,
179
+ engineDigest: harness.engineDigest,
180
+ entryModuleId: 'main',
181
+ modules: {
182
+ ...modules,
183
+ main: { imports: Object.keys(modules), source },
184
+ },
185
+ }
186
+ }
187
+
188
+ function equal(actual: unknown, expected: unknown, message: string): void {
189
+ if (!dequal(actual, expected)) {
190
+ throw new Error(`${message}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}.`)
191
+ }
192
+ }
193
+
194
+ async function rejects(operation: Promise<unknown>, pattern: RegExp, message: string): Promise<void> {
195
+ try {
196
+ await operation
197
+ } catch (error) {
198
+ if (pattern.test(error instanceof Error ? error.message : String(error))) return
199
+ throw new Error(`${message}: received ${error instanceof Error ? error.message : String(error)}.`, { cause: error })
200
+ }
201
+ throw new Error(`${message}: operation unexpectedly succeeded.`)
202
+ }
203
+
204
+ export const runtimeConformanceCases: readonly RuntimeConformanceCase[] = [
205
+ {
206
+ name: 'rejects Task results that JSON transport would discard or coerce',
207
+ async verify(harness) {
208
+ for (const expression of [
209
+ '{ value: () => 42 }',
210
+ '{ value: Symbol("value") }',
211
+ '{ value: NaN }',
212
+ '{ value: Infinity }',
213
+ '{ value: 1n }',
214
+ '{ value: { nested: undefined } }',
215
+ '{ value: [undefined] }',
216
+ '{ value: Array(1) }',
217
+ '{ value: new Date() }',
218
+ '{ value: { toJSON() { return "hidden" } } }',
219
+ '{ [Symbol("key")]: 1 }',
220
+ '(() => { const value = {}; value.self = value; return { value } })()',
221
+ ]) {
222
+ await rejects(
223
+ harness.invoke({
224
+ capability: async () => ({ body: null, status: 200 }),
225
+ input: null,
226
+ invocationId: 'invalid-task-result',
227
+ program: program(harness, `export default () => (${expression})`),
228
+ }),
229
+ /Task result must contain only JSON values/,
230
+ `Invalid Task result: ${expression}`,
231
+ )
232
+ }
233
+ },
234
+ },
235
+ {
236
+ name: 'snapshots JSON results while preserving missing ports and shared values',
237
+ async verify(harness) {
238
+ const value = await harness.invoke({
239
+ capability: async () => ({ body: null, status: 200 }),
240
+ input: null,
241
+ invocationId: 'json-task-result',
242
+ program: program(
243
+ harness,
244
+ `export default () => {
245
+ const shared = { text: 'hello', values: [1, true, null] };
246
+ return { missing: undefined, nullable: null, first: shared, second: shared };
247
+ }`,
248
+ ),
249
+ })
250
+ const shared = { text: 'hello', values: [1, true, null] }
251
+ equal(value, { nullable: null, first: shared, second: shared }, 'JSON Task result')
252
+ },
253
+ },
254
+ {
255
+ name: 'preserves Action error codes and fixed per-call Connection selection',
256
+ async verify(harness) {
257
+ const declarations: readonly ConnectorCapability[] = [
258
+ {
259
+ kind: 'connector',
260
+ action: 'example.echo',
261
+ connections: [{ connectionId: 'work', alias: 'office' }, { connectionId: 'home' }],
262
+ },
263
+ ]
264
+ const result = await harness.invoke({
265
+ capabilities: declarations,
266
+ capability: async ({ payload }) => {
267
+ const selected = resolveAction(declarations, payload)
268
+ if (selected.input.fail) throw Object.assign(new Error('Provider unavailable.'), { code: 'connector.unavailable' })
269
+ return { body: selected.connectionId ?? null, status: 200 }
270
+ },
271
+ input: null,
272
+ invocationId: 'action-accounts',
273
+ program: program(
274
+ harness,
275
+ `export default async (_, context) => {
276
+ const values = await Promise.all([
277
+ context.actions.example.echo({}, { connectionAlias: 'office' }),
278
+ context.actions['example.echo']({}, { connectionId: 'home' }),
279
+ ])
280
+ try { await context.actions.example.echo({ fail: true }, { connectionId: 'work' }) }
281
+ catch (error) { values.push(error.code) }
282
+ return values
283
+ }`,
284
+ ),
285
+ })
286
+ equal(result, ['work', 'home', 'connector.unavailable'], 'Action selection and recovery')
287
+ },
288
+ },
289
+ {
290
+ name: 'shares Action entries and assigns independent concurrent call identities',
291
+ async verify(harness) {
292
+ const calls: RuntimeCapabilityCall[] = []
293
+ const value = await harness.invoke({
294
+ capabilities: [{ kind: 'connector', action: 'example.echo', connections: [] }],
295
+ capability: async (call) => {
296
+ calls.push(call)
297
+ return { body: call.payload, status: 200 }
298
+ },
299
+ input: null,
300
+ invocationId: 'action-calls',
301
+ program: program(
302
+ harness,
303
+ `export default async (_input, context) => {
304
+ const call = context.actions.example.echo
305
+ return { same: call === context.actions['example.echo'], values: await Promise.all([call({ value: 1 }), call({ value: 2 }), call({ value: 3 })]) }
306
+ }`,
307
+ ),
308
+ })
309
+ equal(value, { same: true, values: [1, 2, 3].map((item) => ({ action: 'example.echo', input: { value: item } })) }, 'Action results')
310
+ equal(new Set(calls.map((call) => call.callId)).size, 3, 'Independent Action identities')
311
+ equal(
312
+ calls.map((call) => call.invocationId),
313
+ ['action-calls', 'action-calls', 'action-calls'],
314
+ 'Task identity',
315
+ )
316
+ },
317
+ },
318
+
319
+ {
320
+ name: 'loads the fixed ESM closure and platform module',
321
+ async verify(harness) {
322
+ const value = await harness.invoke({
323
+ capability: async () => {
324
+ throw new Error('Capability must not be called.')
325
+ },
326
+ input: { value: 6 },
327
+ invocationId: 'module-closure',
328
+ program: program(
329
+ harness,
330
+ `import { double } from './helper.mjs'
331
+ import { engineContract, identity } from 'open-flow:platform'
332
+ export default (input) => ({ engineContract, value: identity(double(input.value)) })`,
333
+ { helper: { imports: [], source: 'export const double = (value) => value * 2' } },
334
+ ),
335
+ })
336
+ equal(value, { engineContract: currentEngineContract, value: 12 }, 'ESM closure result')
337
+ },
338
+ },
339
+ {
340
+ name: 'rejects modules outside the fixed closure',
341
+ async verify(harness) {
342
+ await rejects(
343
+ harness.invoke({
344
+ capability: async () => ({ body: null, status: 200 }),
345
+ input: null,
346
+ invocationId: 'closed-linker',
347
+ program: program(
348
+ harness,
349
+ `import fs from 'node:fs'
350
+ export default () => fs.readFileSync('/etc/passwd', 'utf8')`,
351
+ ),
352
+ }),
353
+ /invalid|unsupported|cannot import|not part of/i,
354
+ 'Closed linker',
355
+ )
356
+ },
357
+ },
358
+ {
359
+ name: 'copies asynchronous Capability requests and responses',
360
+ async verify(harness) {
361
+ const calls: RuntimeCapabilityCall[] = []
362
+ const value = await harness.invoke({
363
+ capability: async (call) => {
364
+ calls.push(call)
365
+ return { body: { accepted: true, echoed: call.payload }, status: 200 }
366
+ },
367
+ input: { issue: 42 },
368
+ invocationId: 'async-capability',
369
+ program: program(harness, `export default async (input, capability) => capability.artifact.put({ action: 'read', input })`),
370
+ })
371
+ equal(value, { body: { accepted: true, echoed: { action: 'read', input: { issue: 42 } } }, status: 200 }, 'Capability result')
372
+ equal(
373
+ calls.map(({ invocationId, kind, payload }) => ({ invocationId, kind, payload })),
374
+ [{ invocationId: 'async-capability', kind: 'artifact.put', payload: { action: 'read', input: { issue: 42 } } }],
375
+ 'Capability request',
376
+ )
377
+ },
378
+ },
379
+ {
380
+ name: 'returns final outputs without exposing intermediate output capability',
381
+ async verify(harness) {
382
+ const value = await harness.invoke({
383
+ capability: async () => {
384
+ throw new Error('Capability must not be called.')
385
+ },
386
+ input: null,
387
+ invocationId: 'final-outputs',
388
+ program: program(
389
+ harness,
390
+ `export default async (_input, context) => ({ available: typeof context.outputs, previous: await context.getPrevious(), value: 1 })`,
391
+ ),
392
+ })
393
+ equal(value, { available: 'undefined', previous: [], value: 1 }, 'Final Task outputs')
394
+ },
395
+ },
396
+ {
397
+ name: 'cancels a pending Capability and the user invocation',
398
+ async verify(harness) {
399
+ const cancellation = new AbortController()
400
+ let capabilityAborted = false
401
+ let capabilityStarted!: () => void
402
+ const started = new Promise<void>((resolve) => {
403
+ capabilityStarted = resolve
404
+ })
405
+ const invoked = harness.invoke({
406
+ capabilities: [{ kind: 'connector', action: 'example.wait', connections: [] }],
407
+ capability: async ({ signal }) => {
408
+ capabilityStarted()
409
+ return await new Promise<RuntimeCapabilityResponse>((_resolve, reject) =>
410
+ signal.addEventListener(
411
+ 'abort',
412
+ () => {
413
+ capabilityAborted = true
414
+ reject(signal.reason)
415
+ },
416
+ { once: true },
417
+ ),
418
+ )
419
+ },
420
+ input: null,
421
+ invocationId: 'canceled-capability',
422
+ program: program(harness, `export default async (_input, context) => context.actions.example.wait({})`),
423
+ signal: cancellation.signal,
424
+ })
425
+ await started
426
+ cancellation.abort(new Error('Invocation canceled.'))
427
+ await rejects(invoked, /cancel|abort|disposed/i, 'Canceled invocation')
428
+ equal(capabilityAborted, true, 'Capability cancellation')
429
+ },
430
+ },
431
+ ]
432
+
433
+ export function createActions(invoke: (payload: JsonValue) => Promise<RuntimeCapabilityResponse>): Readonly<Record<string, unknown>> {
434
+ // Keep validation inside the function serialized into the isolated runtime.
435
+ // eslint-disable-next-line unicorn/consistent-function-scoping
436
+ const json = (value: unknown, parents: Set<object>): void => {
437
+ if (value === null || typeof value == 'string' || typeof value == 'boolean' || (typeof value == 'number' && Number.isFinite(value))) return
438
+ if (
439
+ typeof value != 'object' ||
440
+ parents.has(value) ||
441
+ (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) ||
442
+ Object.getOwnPropertySymbols(value).length > 0
443
+ )
444
+ throw Object.assign(new Error('Action parameters must contain only JSON values.'), { code: 'capability.invalid' })
445
+ parents.add(value)
446
+ for (const child of Array.isArray(value) ? value : Object.values(value)) json(child, parents)
447
+ parents.delete(value)
448
+ }
449
+ const target: Record<string, unknown> = Object.create(null)
450
+ const calls = new Map<string, (input?: JsonValue, options?: JsonValue) => Promise<JsonValue>>()
451
+ const providers = new Map<string, Readonly<Record<string, unknown>>>()
452
+ const actionCall = (action: string): ((input?: JsonValue, options?: JsonValue) => Promise<JsonValue>) => {
453
+ let call = calls.get(action)
454
+ if (call != null) return call
455
+ call = async (input: JsonValue = {}, options?: JsonValue): Promise<JsonValue> => {
456
+ json(input, new Set())
457
+ if (options !== undefined) json(options, new Set())
458
+ const response = await invoke({ action, input, ...(options === undefined ? {} : { options }) })
459
+ return response.body
460
+ }
461
+ calls.set(action, call)
462
+ return call
463
+ }
464
+ target.call = async (action: JsonValue, input: JsonValue = {}, options?: JsonValue): Promise<JsonValue> => {
465
+ if (typeof action != 'string') throw Object.assign(new Error('Action ID must be a string.'), { code: 'capability.invalid' })
466
+ return actionCall(action)(input, options)
467
+ }
468
+ Object.freeze(target)
469
+ return new Proxy(target, {
470
+ get(object, property) {
471
+ if (typeof property != 'string') return Reflect.get(object, property)
472
+ if (Object.hasOwn(object, property)) return object[property]
473
+ if (property.includes('.')) return actionCall(property)
474
+ let methods = providers.get(property)
475
+ if (methods == null) {
476
+ const provider = property
477
+ const providerTarget = Object.freeze(Object.create(null) as Record<string, unknown>)
478
+ methods = new Proxy(providerTarget, {
479
+ get(_object, name) {
480
+ return typeof name == 'string' ? actionCall(`${provider}.${name}`) : undefined
481
+ },
482
+ })
483
+ providers.set(property, methods)
484
+ }
485
+ return methods
486
+ },
487
+ })
488
+ }
489
+
490
+ export function resolveAction(
491
+ declarations: readonly ConnectorCapability[],
492
+ payload: unknown,
493
+ ): { readonly action: string; readonly connectionId?: string; readonly input: Readonly<Record<string, JsonValue>> } {
494
+ const invalid = Object.assign(new Error('The Action request is invalid.'), { code: 'capability.invalid' })
495
+ const denied = Object.assign(new Error('The Action or Connection is unavailable for this Code node.'), { code: 'capability.denied' })
496
+ if (payload == null || typeof payload != 'object' || Array.isArray(payload)) throw invalid
497
+ const source = payload as Record<string, JsonValue>
498
+ if (
499
+ Object.keys(source).some((key) => !['action', 'input', 'options'].includes(key)) ||
500
+ typeof source.action != 'string' ||
501
+ !/^[A-Za-z0-9_-]+\.[A-Za-z0-9_.-]+$/.test(source.action) ||
502
+ source.input == null ||
503
+ typeof source.input != 'object' ||
504
+ Array.isArray(source.input)
505
+ )
506
+ throw invalid
507
+ const permissions = declarations.find((declaration) => 'mode' in declaration)
508
+ const allowed = permissions?.mode == 'independent' ? permissions.actions.find((entry) => entry.action == source.action) : undefined
509
+ if (permissions?.mode == 'independent' && allowed == null) throw denied
510
+ const hints = declarations.flatMap((declaration) => {
511
+ if ('mode' in declaration) return []
512
+ if ('action' in declaration) {
513
+ if (declaration.action != source.action) return []
514
+ return [
515
+ ...declaration.connections.flatMap((connection) =>
516
+ connection.alias == null ? [] : [{ action: declaration.action, connectionId: connection.connectionId, alias: connection.alias }],
517
+ ),
518
+ ...(declaration.connectionId == null ? [] : [{ action: declaration.action, connectionId: declaration.connectionId }]),
519
+ ]
520
+ }
521
+ return declaration.connectionHints?.filter((hint) => hint.action == source.action) ?? []
522
+ })
523
+ let connectionId = hints.find((hint) => hint.alias == null)?.connectionId
524
+ if (Object.hasOwn(source, 'options')) {
525
+ if (source.options == null || typeof source.options != 'object' || Array.isArray(source.options)) throw invalid
526
+ const options = source.options as Record<string, JsonValue>
527
+ const keys = Object.keys(options)
528
+ if (keys.length != 1) throw invalid
529
+ if (typeof options.connectionId == 'string' && options.connectionId.length > 0 && keys[0] == 'connectionId') {
530
+ connectionId = options.connectionId
531
+ } else if (typeof options.connectionAlias == 'string' && options.connectionAlias.length > 0 && keys[0] == 'connectionAlias') {
532
+ connectionId = hints.find((item) => item.alias == options.connectionAlias)?.connectionId
533
+ if (connectionId == null) throw denied
534
+ } else throw invalid
535
+ }
536
+ if (permissions?.mode == 'independent') {
537
+ if (connectionId != null && connectionId != allowed?.connectionId) throw denied
538
+ connectionId = allowed?.connectionId
539
+ }
540
+ if (permissions?.mode == 'shared' && Object.hasOwn(source, 'options') && connectionId == null) throw denied
541
+ return { action: source.action, input: source.input as Readonly<Record<string, JsonValue>>, ...(connectionId == null ? {} : { connectionId }) }
542
+ }
543
+
544
+ export interface DecisionTaskInvocation {
545
+ readonly questions: readonly import('../../decision/common/decision.ts').DecisionQuestion[]
546
+ readonly state: JsonValue
547
+ readonly invocationId: string
548
+ readonly signal: AbortSignal
549
+ readonly version: 1
550
+ }
551
+ export type InvokeDecisionTask = (invocation: DecisionTaskInvocation) => Promise<LlmTaskResult>
552
+
553
+ /** Serialized into the sandbox alongside the strict JSON snapshot helper. */
554
+ export function createWorkflows(invoke: (payload: JsonValue) => Promise<RuntimeCapabilityResponse>) {
555
+ return Object.freeze({
556
+ async call(name: string, input: Readonly<Record<string, JsonValue>> = {}): Promise<JsonValue> {
557
+ if (typeof name != 'string' || input == null || typeof input != 'object' || Array.isArray(input))
558
+ throw Object.assign(new Error('Workflow name and input object are required.'), { code: 'capability.invalid' })
559
+ const value = snapshotRuntimeResult(input)!
560
+ return (await invoke({ name, input: value })).body
561
+ },
562
+ })
563
+ }