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