@oomol-lab/open-flow 0.1.0-beta.84 → 0.1.0-beta.86

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 (97) hide show
  1. package/dist/browser/{FlowCanvas-B2g7NceZ.js → FlowCanvas-CHIaMaBv.js} +112 -16
  2. package/dist/browser/{createResourceDialog-Bi4fUnbD.js → createResourceDialog-C0E5yPe6.js} +3 -3
  3. package/dist/browser/{dialog-BzoSxhXQ.js → dialog-b3hsdu8i.js} +291 -143
  4. package/dist/browser/{exportPng-DLdtJvg3.js → exportPng-DGHcejgy.js} +2 -2
  5. package/dist/browser/{flowChanges-C567g-Pc.js → flowChanges-BvSWezEb.js} +375 -83
  6. package/dist/browser/{flowWorkspace-DBk4A-Ld.js → flowWorkspace-BKnMRClO.js} +1619 -475
  7. package/dist/browser/fr-CNTSedYU.js +593 -0
  8. package/dist/browser/ja-CxQBHr2J.js +593 -0
  9. package/dist/browser/ko-D1Exiv1h.js +593 -0
  10. package/dist/browser/licenses.md +1 -1
  11. package/dist/browser/{markdownContent-DIuJThGK.js → markdownContent-BR9-1ikU.js} +1 -1
  12. package/dist/browser/preview.css +181 -181
  13. package/dist/browser/preview.js +2103 -636
  14. package/dist/browser/ru-BzLZv0B7.js +593 -0
  15. package/dist/browser/{tooltip-DGj5pudg.js → tooltip-DSBF3bRw.js} +55 -23
  16. package/dist/browser/workbench.css +181 -181
  17. package/dist/browser/workbench.js +86 -17
  18. package/dist/browser/{workbenchSelect-BIaEVTx6.js → workbenchSelect-Di1Bm_-d.js} +2 -2
  19. package/dist/browser/{wrapLayout-C4moMKgb.js → wrapLayout-B0AT8_-i.js} +1 -1
  20. package/dist/browser/zh-CN-Dg_xSGde.js +593 -0
  21. package/dist/browser/zh-TW-oxuLwsV0.js +593 -0
  22. package/dist/command/index.js +61 -57
  23. package/dist/command/licenses.md +28 -4
  24. package/dist/common/authoring.d.ts +5 -5
  25. package/dist/common/authoringExamples.d.ts +3 -2
  26. package/dist/common/authoringSchema.d.ts +41 -4
  27. package/dist/common/catalogCache.d.ts +46 -0
  28. package/dist/common/connector-action.js +13 -10
  29. package/dist/common/connector-proxy.d.ts +96 -0
  30. package/dist/common/connector-proxy.js +5209 -0
  31. package/dist/common/control-api-conformance.js +312 -46
  32. package/dist/common/control-api.d.ts +12 -1
  33. package/dist/common/control-api.js +303 -41
  34. package/dist/common/control-requests.d.ts +4 -3
  35. package/dist/common/control-requests.js +14111 -171
  36. package/dist/common/engine-contract.d.ts +3 -2
  37. package/dist/common/event-source.js +55 -23
  38. package/dist/common/flow-authoring-node.d.ts +2 -0
  39. package/dist/common/flow-authoring.js +6936 -6781
  40. package/dist/common/flow-change-schema.d.ts +1 -1
  41. package/dist/common/flow-change.d.ts +2 -2
  42. package/dist/common/flow-change.js +91 -36
  43. package/dist/common/flow-connectionUsage.d.ts +1 -1
  44. package/dist/common/flow-encoding.js +93 -38
  45. package/dist/common/flow-requestParameters.d.ts +34 -0
  46. package/dist/common/flow-semantics.js +9429 -9236
  47. package/dist/common/flow-state.js +55 -23
  48. package/dist/common/flow-workflowFile.d.ts +3 -1
  49. package/dist/common/http-request.d.ts +6 -11
  50. package/dist/common/http-request.js +192 -141
  51. package/dist/common/licenses.md +1 -1
  52. package/dist/common/mcp.d.ts +3 -3
  53. package/dist/common/mcp.js +303 -41
  54. package/dist/common/run-events.js +1 -0
  55. package/dist/common/runtime-contract.js +10 -4
  56. package/dist/common/runtime-nodejs-compat.js +55 -23
  57. package/dist/common/scheduler-checkpoint.d.ts +3 -3
  58. package/dist/common/scheduler-dependencies.d.ts +22 -28
  59. package/dist/common/scheduler-node-execution.d.ts +1 -0
  60. package/dist/common/scheduler.d.ts +8 -2
  61. package/dist/common/scheduler.js +274 -95
  62. package/dist/common/workflow.js +51 -19
  63. package/dist/common/workflowAuthoring.d.ts +411 -0
  64. package/dist/render/browser/licenses.md +1 -1
  65. package/dist/render/browser/runtime.js +289 -61
  66. package/dist/render/node/index.js +85 -30
  67. package/dist/render/node/licenses.md +1 -1
  68. package/package.json +1 -1
  69. package/skills/open-flow/references/flow-authoring.md +14 -13
  70. package/src/base/common/jsonSchema.ts +11 -0
  71. package/src/connector/common/actionSchema.ts +4 -11
  72. package/src/connector/common/proxy.ts +152 -0
  73. package/src/control/common/api.ts +99 -3
  74. package/src/control/common/authoring.ts +23 -9
  75. package/src/control/common/authoringExamples.ts +9 -0
  76. package/src/control/common/authoringSchema.ts +21 -12
  77. package/src/control/common/catalogCache.ts +145 -0
  78. package/src/control/common/conformance.ts +9 -3
  79. package/src/control/common/connectorQueries.ts +17 -2
  80. package/src/control/common/requests.ts +1 -0
  81. package/src/control/common/workflowAuthoring.ts +120 -0
  82. package/src/execution/common/checkpoint.ts +18 -12
  83. package/src/execution/common/dependencies.ts +132 -15
  84. package/src/execution/common/events.ts +3 -0
  85. package/src/execution/common/node-execution.ts +22 -15
  86. package/src/execution/common/scheduler.ts +20 -31
  87. package/src/flow/common/change.ts +2 -1
  88. package/src/flow/common/changeSchema.ts +11 -1
  89. package/src/flow/common/connectionUsage.ts +4 -2
  90. package/src/flow/common/errorHandling.ts +3 -1
  91. package/src/flow/common/nodeChanges.ts +35 -18
  92. package/src/flow/common/requestParameters.ts +120 -0
  93. package/src/flow/common/semantics.ts +51 -1
  94. package/src/flow/common/sourceField.ts +3 -2
  95. package/src/flow/common/workflowFile.ts +2 -2
  96. package/src/http/common/httpRequest.ts +28 -78
  97. package/src/runtime/common/engineContract.ts +6 -3
@@ -1,14 +1,15 @@
1
1
  import { o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-CEgmsyvS.js";
2
- import { $ as waitBranchDescription, A as DropdownMenuItem, B as CompositeItem, C as IconifyProvider, D as DropdownMenuCheckboxItem, E as DropdownMenu, F as DropdownMenuSub, I as DropdownMenuSubContent, L as DropdownMenuSubTrigger, M as DropdownMenuRadioGroup, N as DropdownMenuRadioItem, O as DropdownMenuContent, P as DropdownMenuSeparator, R as DropdownMenuTrigger, _ as Z$1, a as CompositeRoot, c as PopoverContent, d as PopoverPanelContent, dt as useAriaLabelledBy, f as PopoverTitle, g as VirtualScrollArea, h as ScrollArea, i as Textarea, j as DropdownMenuLabel, k as DropdownMenuGroup, l as PopoverDescription, m as NativeScrollArea, p as PopoverTrigger, s as Popover, u as PopoverHeader, ut as Checkbox, v as ContentIcon } from "./wrapLayout-C4moMKgb.js";
2
+ import { $ as waitBranchDescription, A as DropdownMenuItem, B as CompositeItem, C as IconifyProvider, D as DropdownMenuCheckboxItem, E as DropdownMenu, F as DropdownMenuSub, I as DropdownMenuSubContent, L as DropdownMenuSubTrigger, M as DropdownMenuRadioGroup, N as DropdownMenuRadioItem, O as DropdownMenuContent, P as DropdownMenuSeparator, R as DropdownMenuTrigger, _ as Z$1, a as CompositeRoot, c as PopoverContent, d as PopoverPanelContent, dt as useAriaLabelledBy, f as PopoverTitle, g as VirtualScrollArea, h as ScrollArea, i as Textarea, j as DropdownMenuLabel, k as DropdownMenuGroup, l as PopoverDescription, m as NativeScrollArea, p as PopoverTrigger, s as Popover, u as PopoverHeader, ut as Checkbox, v as ContentIcon } from "./wrapLayout-B0AT8_-i.js";
3
3
  import { i as compute, l as val } from "./dist-bO8nvHFH.js";
4
4
  import { c as useLang, l as useTranslate, o as I18nProvider, r as isPlainObject, s as useI18n, u as useVal } from "./dist-BFmpkX4P.js";
5
- import { $ as useToolbarRootContext, A as string, Bn as transitionStatusMapping, Br as useStableCallback, Cr as cn, Er as useRenderElement, Fr as formatErrorMessage, In as useTransitionStatus, Ir as mergeProps, Ln as useOpenChangeComplete, Lr as useIsoLayoutEffect, Mr as useButton, Nn as useLabelableId, Or as EMPTY_OBJECT, Qt as useStore, Sr as buttonVariants, Un as useValueChanged, Wn as createChangeEventDetails, _r as fieldValidityMapping, a as createTooltipHandle, br as useControlled, c as TooltipPositioner, d as TooltipRoot, dr as useFormContext, fr as useRegisterFieldControl, i as TooltipTrigger, jr as useMergedRefs, l as TooltipPortal, mr as useBaseUiId, mt as triggerOpenStateMapping, n as TooltipContent, nn as require_builtin_esm_external_require_react, o as TooltipArrow, p as timeZoneOffsetMinutes, pr as useFieldRootContext, qn as clearPress, r as TooltipProvider, rr as none, s as TooltipPopup, t as Tooltip, u as TooltipTrigger$1, ur as useLabelableContext, vr as visuallyHidden, wr as cva, xr as Button$1, yr as visuallyHiddenInput, zr as error$1 } from "./tooltip-DGj5pudg.js";
6
- import { $ as waitAutoContinueSchema, A as comparisonIssue, At as variableInputCompatible, Bt as SelectChevron, Ct as limitDecisionQuestions, D as nodeSystemOutputPorts, Dt as matchesSchema, E as nodeErrorSchema, F as operatorsForType, Gt as SelectTrigger, Ht as SelectGroup, It as skipDuplicatesConfigSchema, J as webhookResponseAllowsBody, K as webhookHeaderValuePort, Kt as SelectValue, L as unaryOperator, O as supportsNodeErrorHandling, Ot as portsAssignable, P as operandHandle, Q as workflowOutputsPort, R as valueType, Rt as dequal, St as defaultDecisionQuestion, T as workflowToolNameIssue, Tt as webhookSupportsBody, U as decodeRevisionContent, Ut as SelectItem, Vt as SelectContent, Wt as SelectSeparator, X as webhookResponseTimeout, Y as webhookResponseInputs, Z as webhookStatusCodePort, _t as isHttpHost, a as DialogFooter, an as ChevronDown, at as httpHeaderSchema, b as nodeNameIssue, bt as decisionQuestionIssues, c as DialogTrigger, d as Field, et as defaultNodeRetry, f as FieldDescription, h as FieldLabel, i as DialogDescription, in as Input, kt as schemaObject, l as Icon, lt as httpRequestIssues, m as FieldGroup, n as DialogClose, nt as retryConfigurationSchema, o as DialogHeader, ot as httpQuerySchema, p as FieldError, pt as httpHeaderNameIssue, q as webhookHeadersPort, r as DialogContent, rn as Label, rt as supportsNodeRetry, s as DialogTitle, t as Dialog, tt as nodeRetryLimits, u as Spinner, ut as httpRequestTask, vt as decisionLimits, wt as webhookMethods, xt as decisionTask, zt as Select$1 } from "./dialog-BzoSxhXQ.js";
7
- import { C as isMac, S as toManifestNodeId, T as flowPngAspectRatios, _ as E$1, a as CanvasNodeIcon, b as toViewEdge, c as collapseAllNested, d as IconStack, f as selectableTimeZones, g as cronDescription, h as timeZoneOffset, i as pasteVideoLink, l as formatDuration, m as timeZoneLongLabel, n as setAddItemId, o as defaultTriggerIcon, p as timeZoneLabel, s as JSONViewer, t as FlowCanvas, u as useDebouncedValue, v as CanvasTooltip, w as isSameViewport, x as toManifestHandleName, y as CanvasStore } from "./FlowCanvas-B2g7NceZ.js";
8
- import { $ as resourceValue, $t as WorkflowExportDialog, A as schemaForEditor, An as TabsTrigger, Ar as serverAddress, B as datePickerValue, Bn as EmptyMedia, Br as ApiError, Cn as selectors, Cr as inputValue, D as defaultValueEditorSchema, Dn as Tabs, Dr as openApiTask, Dt as diagnosticMessage, E as supportsFeishuChatFilter, En as IconPickerButton, Er as openApiFieldIssues, F as calendarChange, Fn as InputGroupInput, Fr as workflowCandidateGroup, G as indexAddNodeOptions, Gn as SourceSelect, H as isDateFormat, Hn as Badge, Hr as eventSourceKind, I as calendarDate, In as Empty, Ir as workflowCapability, Jn as EventSourceSetup, Kn as createI18n, L as dateFromTimeZone, Ln as EmptyContent, Lr as workflowSelectionTask, M as getDefaultValue, Mn as followWorkbenchLink, Mr as sameWorkflowInterface, N as isUnconstrainedSchema, Nn as InputGroup, Nr as workflowAgentTool, O as editorComponent, On as TabsContent, Or as securityOptions, Ot as diagnosticNodeId, P as typeOfSchema, Pn as InputGroupAddon, Q as resourceData, R as dateInTimeZone, Rn as EmptyDescription, Sn as ComboboxRoot, Sr as triggerConfigValues, St as revisionView, T as feishuResourceKind, Tn as useComboboxRootContext, Tr as object$1, V as dateTimeWall, Vn as EmptyTitle, Vr as controlErrorCode, Wn as SourceForm, Y as connectorActionPresentation, Yn as errorNotice, Z as observeResource, Zt as dequal$1, _n as ComboboxList, _t as actionSummary, ar as webhookResponseDiagnostics, bn as ComboboxInputGroup, bt as canCancelRun, cn as selectionMenuItemClass, dn as valueEditor_module_default, dr as isJsonObject, dt as loadJson, en as WorkflowExportMenuItem, er as decodeResultList, fn as ComboboxItemIndicator, ft as designerGraph, gn as ComboboxPortal, gt as triggerNodeIcon, hn as ComboboxPositioner, ht as semanticNodeIcon, ir as resolutionOutputPorts, it as decodeAppCatalogResponse, j as valueForEditor, jr as servers, jt as connectionCatalog, k as editorGroups, kn as TabsList, kr as selectOperation, kt as schemaMismatchMessage, ln as ValueControl, mn as ComboboxPopup, mt as nodeTitle, n as agentTool, nn as IdTooltip, nr as executionReachableNodes, or as sourceOutputLabel, ot as getAppCatalogCache, pn as ComboboxItem, pt as nodeIcon, q as mapSource, qn as FeishuEventPicker, rn as FlowSettingsButton, rr as inputSourceCandidates, sn as selectionMenuContentClass, sr as sourcePort, tn as useWorkflowExportAction, tt as provider, un as ValueEditorFeedback, ur as triggerOutputDefinitions, vn as GroupCollectionProvider, vt as providerIcon, wn as useComboboxInputValueContext, wr as listOperations, xn as ComboboxInput, xr as triggerConfigValue, xt as hasRunFilter, yn as ComboboxTrigger, z as datePickerChange, zn as EmptyHeader } from "./flowChanges-C567g-Pc.js";
5
+ import { $ as useToolbarRootContext, A as string, Bn as transitionStatusMapping, Br as useStableCallback, Cr as cn, Er as useRenderElement, Fr as formatErrorMessage, In as useTransitionStatus, Ir as mergeProps, Ln as useOpenChangeComplete, Lr as useIsoLayoutEffect, Mr as useButton, Nn as useLabelableId, Or as EMPTY_OBJECT, Qt as useStore, Sr as buttonVariants, Un as useValueChanged, Wn as createChangeEventDetails, _r as fieldValidityMapping, a as createTooltipHandle, br as useControlled, c as TooltipPositioner, d as TooltipRoot, dr as useFormContext, fr as useRegisterFieldControl, i as TooltipTrigger, jr as useMergedRefs, l as TooltipPortal, mr as useBaseUiId, mt as triggerOpenStateMapping, n as TooltipContent, nn as require_builtin_esm_external_require_react, o as TooltipArrow, p as timeZoneOffsetMinutes, pr as useFieldRootContext, qn as clearPress, r as TooltipProvider, rr as none, s as TooltipPopup, t as Tooltip, u as TooltipTrigger$1, ur as useLabelableContext, vr as visuallyHidden, wr as cva, xr as Button$1, yr as visuallyHiddenInput, zr as error$1 } from "./tooltip-DSBF3bRw.js";
6
+ import { $ as waitAutoContinueSchema, $t as SelectGroup, A as comparisonIssue, Bt as schemaObject, D as nodeSystemOutputPorts, Dt as connectorProxyTask, E as nodeErrorSchema, Et as connectorProxySupportsBody, F as operatorsForType, Ft as webhookMethods, It as webhookSupportsBody, J as webhookResponseAllowsBody, K as webhookHeaderValuePort, L as unaryOperator, O as supportsNodeErrorHandling, P as operandHandle, Pt as httpHeaderNameIssue, Q as workflowOutputsPort, Qt as SelectContent, R as valueType, Rt as matchesSchema, St as connectorProxyHeaderSchema, T as workflowToolNameIssue, Tt as connectorProxyQuerySchema, U as decodeRevisionContent, Vt as variableInputCompatible, X as webhookResponseTimeout, Xt as Select$1, Y as webhookResponseInputs, Yt as dequal, Z as webhookStatusCodePort, Zt as SelectChevron, _t as defaultDecisionQuestion, a as DialogFooter, at as httpHeaderSchema, b as nodeNameIssue, c as DialogTrigger, ct as httpRequestIssues, d as Field, en as SelectItem, et as defaultNodeRetry, f as FieldDescription, ft as isHttpHost, gn as ChevronDown, gt as decisionTask, h as FieldLabel, hn as Input, ht as decisionQuestionIssues, i as DialogDescription, l as Icon, lt as httpRequestTask, m as FieldGroup, mn as Label, n as DialogClose, nn as SelectTrigger, nt as retryConfigurationSchema, o as DialogHeader, ot as httpQuerySchema, p as FieldError, pt as decisionLimits, q as webhookHeadersPort, qt as skipDuplicatesConfigSchema, r as DialogContent, rn as SelectValue, rt as supportsNodeRetry, s as DialogTitle, t as Dialog, tn as SelectSeparator, tt as nodeRetryLimits, u as Spinner, vt as limitDecisionQuestions, wt as connectorProxyIssues, xt as connectorProxyHasBody, yt as connectorProxyBodyInput, zt as portsAssignable } from "./dialog-b3hsdu8i.js";
7
+ import { C as isMac, S as toManifestNodeId, T as flowPngAspectRatios, _ as E$1, a as CanvasNodeIcon, b as toViewEdge, c as collapseAllNested, d as IconStack, f as selectableTimeZones, g as cronDescription, h as timeZoneOffset, i as pasteVideoLink, l as formatDuration, m as timeZoneLongLabel, n as setAddItemId, o as defaultTriggerIcon, p as timeZoneLabel, s as JSONViewer, t as FlowCanvas, u as useDebouncedValue, v as CanvasTooltip, w as isSameViewport, x as toManifestHandleName, y as CanvasStore } from "./FlowCanvas-CHIaMaBv.js";
8
+ import { $ as resourceValue, $t as WorkflowExportDialog, A as schemaForEditor, An as TabsTrigger, Ar as serverAddress, B as datePickerValue, Bn as EmptyMedia, Br as ApiError, Cn as selectors, Cr as inputValue, D as defaultValueEditorSchema, Dn as Tabs, Dr as openApiTask, Dt as diagnosticMessage, E as supportsFeishuChatFilter, En as IconPickerButton, Er as openApiFieldIssues, F as calendarChange, Fn as InputGroupInput, Fr as workflowCandidateGroup, G as indexAddNodeOptions, Gn as SourceSelect, H as isDateFormat, Hn as Badge, Hr as eventSourceKind, I as calendarDate, In as Empty, Ir as workflowCapability, Jn as EventSourceSetup, Kn as createI18n, L as dateFromTimeZone, Ln as EmptyContent, Lr as workflowSelectionTask, M as getDefaultValue, Mn as followWorkbenchLink, Mr as sameWorkflowInterface, N as isUnconstrainedSchema, Nn as InputGroup, Nr as workflowAgentTool, O as editorComponent, On as TabsContent, Or as securityOptions, Ot as diagnosticNodeId, P as typeOfSchema, Pn as InputGroupAddon, Q as resourceData, R as dateInTimeZone, Rn as EmptyDescription, Sn as ComboboxRoot, Sr as triggerConfigValues, St as revisionView, T as feishuResourceKind, Tn as useComboboxRootContext, Tr as object$1, V as dateTimeWall, Vn as EmptyTitle, Vr as controlErrorCode, Wn as SourceForm, Y as connectorActionPresentation, Yn as errorNotice, Z as observeResource, Zt as dequal$1, _n as ComboboxList, _t as actionSummary, ar as webhookResponseDiagnostics, bn as ComboboxInputGroup, bt as canCancelRun, cn as selectionMenuItemClass, dn as valueEditor_module_default, dr as isJsonObject, dt as loadJson, en as WorkflowExportMenuItem, er as decodeResultList, fn as ComboboxItemIndicator, ft as designerGraph, gn as ComboboxPortal, gt as triggerNodeIcon, hn as ComboboxPositioner, ht as semanticNodeIcon, ir as resolutionOutputPorts, it as decodeAppCatalogResponse, j as valueForEditor, jr as servers, jt as connectionCatalog, k as editorGroups, kn as TabsList, kr as selectOperation, kt as schemaMismatchMessage, ln as ValueControl, mn as ComboboxPopup, mt as nodeTitle, n as agentTool, nn as IdTooltip, nr as executionReachableNodes, or as sourceOutputLabel, ot as getAppCatalogCache, pn as ComboboxItem, pt as nodeIcon, q as mapSource, qn as FeishuEventPicker, rn as FlowSettingsButton, rr as inputSourceCandidates, sn as selectionMenuContentClass, sr as sourcePort, tn as useWorkflowExportAction, tt as provider, un as ValueEditorFeedback, ur as triggerOutputDefinitions, vn as GroupCollectionProvider, vt as providerIcon, wn as useComboboxInputValueContext, wr as listOperations, xn as ComboboxInput, xr as triggerConfigValue, xt as hasRunFilter, yn as ComboboxTrigger, z as datePickerChange, zn as EmptyHeader } from "./flowChanges-BvSWezEb.js";
9
+ import { r as resolveUiLanguage } from "./languages-gYzoQqCi.js";
9
10
  import { a as renameObjectField, i as objectValue, n as isJsonValue, o as setObjectField, r as jsonDataTypes, s as valueType$1, t as initialValue } from "./value-BbFQZZ_V.js";
10
11
  import { n as compile, r as validate } from "./flowRunInputEditorStore-ys1-w9GW.js";
11
- import { t as WorkbenchSelect } from "./workbenchSelect-BIaEVTx6.js";
12
+ import { t as WorkbenchSelect } from "./workbenchSelect-Di1Bm_-d.js";
12
13
  import * as React from "react";
13
14
  import reactExports, { Children, Fragment, Suspense, createContext, forwardRef, isValidElement, lazy, memo, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
14
15
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -231,7 +232,7 @@ function CanvasHistoryScope({ history, disabled, ...props }) {
231
232
  }
232
233
  //#endregion
233
234
  //#region src/workbench/browser/runtime/editor/commentInspector.tsx
234
- var MarkdownContent = lazy(() => import("./markdownContent-DIuJThGK.js"));
235
+ var MarkdownContent = lazy(() => import("./markdownContent-BR9-1ikU.js"));
235
236
  /** A comment is presentation data; editing it does not require the canvas store. */
236
237
  function CommentInspector({ title, content, disabled = false, readOnly, dark, onSave }) {
237
238
  const t = useTranslate();
@@ -519,14 +520,14 @@ function AccountControlButton({ disabled, status, label, hint, onClick }) {
519
520
  })]
520
521
  }) }), /* @__PURE__ */ jsx(TooltipContent, { children: hint ?? label })] });
521
522
  }
522
- function AccountSelect({ connections, disabled, loading = false, id, invalid, warning, addWhenEmpty, allowDeferred = false, label, selectedConnection, selectedId, onChange, onManage }) {
523
+ function AccountSelect({ connections, disabled, readOnly = false, loading = false, id, invalid, warning, addWhenEmpty, allowDeferred = false, label, selectedConnection, selectedId, onChange, onManage }) {
523
524
  const t = useTranslate();
524
525
  const [container, setContainer] = useState(null);
525
526
  const selected = selectedConnection ?? connections.find((candidate) => candidate.connectionId == selectedId);
526
527
  const showLoading = loading && selected == null && selectedId !== "";
527
528
  const builtInName = t("inspector.account.oomolBuiltIn");
528
529
  const displayName = (connection) => accountDisplayName(connection, connection.displayName, builtInName);
529
- const selectedLabel = selectedId === "" ? t("inspector.account.deferred") : selected == null ? selectedId == null ? void 0 : `${selectedId} (${t("inspector.account.unavailable")})` : `${displayName(selected)}${selected.isDefault ? ` (${t("inspector.account.teamDefault")})` : ""}`;
530
+ const selectedLabel = selectedId === "" ? t("inspector.account.deferred") : selected == null ? selectedId == null ? void 0 : readOnly ? selectedId : `${selectedId} (${t("inspector.account.unavailable")})` : `${displayName(selected)}${selected.isDefault ? ` (${t("inspector.account.teamDefault")})` : ""}`;
530
531
  const missingSelected = selectedId != null && selectedId !== "" && !connections.some((candidate) => candidate.connectionId == selectedId);
531
532
  const empty = !loading && connections.length == 0;
532
533
  const items = [
@@ -554,7 +555,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
554
555
  label: t("inspector.account.addAccount")
555
556
  }]
556
557
  ];
557
- if (!allowDeferred && !loading && addWhenEmpty && connections.length === 0 && selectedId == null) return /* @__PURE__ */ jsx(AccountControlButton, {
558
+ if (!readOnly && !allowDeferred && !loading && addWhenEmpty && connections.length === 0 && selectedId == null) return /* @__PURE__ */ jsx(AccountControlButton, {
558
559
  disabled,
559
560
  status: "warning",
560
561
  onClick: onManage,
@@ -564,7 +565,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
564
565
  ref: setContainer,
565
566
  className: "account-select relative min-w-0",
566
567
  children: [/* @__PURE__ */ jsxs(Select$1, {
567
- disabled: disabled || loading,
568
+ disabled: readOnly || disabled || loading,
568
569
  items,
569
570
  value: selectedId ?? null,
570
571
  onValueChange: (value) => {
@@ -581,8 +582,8 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
581
582
  "data-status": invalid ? "danger" : warning ? "warning" : void 0,
582
583
  className: `${fieldSelectTriggerClass} account-control`,
583
584
  children: /* @__PURE__ */ jsx(SelectValue, {
584
- className: !loading && selectedId != null ? "mr-5" : void 0,
585
- placeholder: t("inspector.account.chooseAccount"),
585
+ className: !readOnly && !loading && selectedId != null ? "mr-5" : void 0,
586
+ placeholder: t(readOnly ? "connectorAccess.noAccountSelected" : "inspector.account.chooseAccount"),
586
587
  children: showLoading ? /* @__PURE__ */ jsxs("span", {
587
588
  role: "status",
588
589
  className: "flex min-w-0 items-center gap-2 text-muted-foreground",
@@ -636,7 +637,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
636
637
  })] })
637
638
  ]
638
639
  })]
639
- }), !loading && selectedId != null && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(Button$1, {
640
+ }), !readOnly && !loading && selectedId != null && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(Button$1, {
640
641
  className: "account-select-clear absolute top-1/2 right-7 -translate-y-1/2 text-muted-foreground",
641
642
  type: "button",
642
643
  variant: "ghost",
@@ -659,17 +660,18 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
659
660
  })] })]
660
661
  });
661
662
  }
662
- function ConnectorAccount({ accessError, onConfigureAccess, action, actionError, actionId, activeConnections, authorizationPending, connection, connectionError, connectionId, connectors, disabled, fieldIdPrefix, loading, nodeId }) {
663
+ function ConnectorAccount({ accessError, onConfigureAccess, resource, actionError, actionId, activeConnections, authorizationPending, connection, connectionError, connectionId, connectors, disabled, fieldIdPrefix, loading, nodeId }) {
663
664
  const t = useTranslate();
664
665
  const available = activeConnections ?? [];
666
+ const authenticated = resource == null ? void 0 : "authenticated" in resource ? resource.authenticated : !resource.noSetup;
665
667
  const accessIssue = accessError ?? (actionError?.code == "connector.access-required" || actionError?.code == "connector.access-invalid" ? actionError.message : void 0);
666
- const pending = loading || accessIssue == null && actionError == null && (action == null || activeConnections == null && connectionError == null);
667
- const required = !pending && (accessIssue != null || connectionId !== "" && action?.authenticated == true && (connectionId == null || activeConnections != null && connection?.status != "active"));
668
+ const pending = loading || accessIssue == null && actionError == null && (resource == null || activeConnections == null && connectionError == null);
669
+ const required = !pending && (accessIssue != null || connectionId !== "" && authenticated == true && (connectionId == null || activeConnections != null && connection?.status != "active"));
668
670
  let onManage;
669
671
  let content;
670
672
  if (pending) content = /* @__PURE__ */ jsx("p", { children: t("inspector.account.loading") });
671
673
  else if (accessIssue != null) content = /* @__PURE__ */ jsx("p", { children: accessIssue });
672
- else if (actionError != null || action == null) {
674
+ else if (actionError != null || resource == null) {
673
675
  const canRetry = actionError?.code != "authorization.denied" && actionError?.code != "connector.action-not-found";
674
676
  content = /* @__PURE__ */ jsx(ConnectionAlert, {
675
677
  disabled,
@@ -787,19 +789,26 @@ function TriggerConnection({ activeConnections, authorizationPending, connection
787
789
  });
788
790
  }
789
791
  /** A persisted reference has no live account health or authorization state. */
790
- function SavedConnectionReference({ action, connectionId }) {
792
+ function SavedConnectionReference({ noSetup, connectionId }) {
791
793
  const t = useTranslate();
792
- return /* @__PURE__ */ jsxs(InspectorStatusSection, {
794
+ if (noSetup || connectionId?.startsWith("no_auth:")) return null;
795
+ return /* @__PURE__ */ jsx(InspectorStatusSection, {
793
796
  title: t("inspector.account.title"),
794
797
  section: "account",
795
- children: [/* @__PURE__ */ jsx("p", {
796
- className: "reference-value",
797
- children: action
798
- }), connectionId != null && /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: t("inspector.account.connection") }), /* @__PURE__ */ jsx(Input, {
799
- "aria-label": t("inspector.account.connection"),
800
- readOnly: true,
801
- value: connectionId
802
- })] })]
798
+ children: /* @__PURE__ */ jsxs(Field, {
799
+ className: "connection-field",
800
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
801
+ className: "sr-only",
802
+ children: t("inspector.account.connection")
803
+ }), /* @__PURE__ */ jsx(AccountSelect, {
804
+ readOnly: true,
805
+ connections: [],
806
+ selectedId: connectionId,
807
+ disabled: true,
808
+ onChange: () => {},
809
+ onManage: void 0
810
+ })]
811
+ })
803
812
  });
804
813
  }
805
814
  //#endregion
@@ -1176,7 +1185,7 @@ function NodePickerContent({ options, connections, loadConnections, browseOption
1176
1185
  onDragStart: (event) => drag(event, item),
1177
1186
  onDragEnd,
1178
1187
  className: `group/app h-auto justify-start whitespace-normal font-normal flex min-w-0 items-start gap-2.5 rounded-[calc(var(--ui-control-radius)+2px)] px-2.5 py-1.5 text-left outline-none hover:bg-accent focus-visible:bg-accent focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 ${compact ? "" : "[&>span:first-child]:translate-y-[2px]"}`,
1179
- children: [item.kind == "connector" || item.kind == "trigger" && "trigger" in item && (item.trigger.kind == "catalog" || item.trigger.kind == "connect") ? /* @__PURE__ */ jsx(ProviderAppIcon, { src: item.icon }) : /* @__PURE__ */ jsx("span", {
1188
+ children: [item.kind == "connector" || item.kind === "connector-proxy" || item.kind == "trigger" && "trigger" in item && (item.trigger.kind == "catalog" || item.trigger.kind == "connect") ? /* @__PURE__ */ jsx(ProviderAppIcon, { src: item.icon }) : /* @__PURE__ */ jsx("span", {
1180
1189
  className: "flex size-7 shrink-0 items-center justify-center rounded-[var(--ui-control-radius)] bg-muted",
1181
1190
  children: /* @__PURE__ */ jsx(ContentIcon, {
1182
1191
  src: item.icon,
@@ -1373,6 +1382,7 @@ function NodePickerContent({ options, connections, loadConnections, browseOption
1373
1382
  children: [app != null ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
1374
1383
  section(t("addNode.triggers"), visibleTriggers),
1375
1384
  actionSections(visibleActions),
1385
+ section(t("nodePicker.custom"), visibleActions.filter((item) => item.kind === "connector-proxy")),
1376
1386
  !choicesLoading && !choicesFailed && !catalogFailed && visibleActions.length == 0 && visibleTriggers.length == 0 && /* @__PURE__ */ jsx(PickerStatus, {})
1377
1387
  ] }) : searching ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
1378
1388
  matchedApps.length > 0 && /* @__PURE__ */ jsxs("section", {
@@ -1537,6 +1547,7 @@ function fallbackIcon$1(item) {
1537
1547
  case "http-request":
1538
1548
  case "openapi":
1539
1549
  case "connector":
1550
+ case "connector-proxy":
1540
1551
  case "connector-group": return "connection";
1541
1552
  case "llm": return "llm";
1542
1553
  case "approval": return "task";
@@ -3913,6 +3924,174 @@ function FlowStateButton({ client, flowId, nodes, history, notify, onClose }) {
3913
3924
  })
3914
3925
  });
3915
3926
  }
3927
+ var fieldTable_module_default = {
3928
+ list: "fieldTable_list_14bfd",
3929
+ columns: "fieldTable_columns_14bfd",
3930
+ nameHeading: "fieldTable_nameHeading_14bfd",
3931
+ typeHeading: "fieldTable_typeHeading_14bfd",
3932
+ valueHeading: "fieldTable_valueHeading_14bfd",
3933
+ row: "fieldTable_row_14bfd",
3934
+ nullableControl: "fieldTable_nullableControl_14bfd",
3935
+ nullableHeading: "fieldTable_nullableHeading_14bfd"
3936
+ };
3937
+ var fieldBranch_module_default = { branch: "fieldBranch_branch_a5820" };
3938
+ //#endregion
3939
+ //#region src/form/browser/fieldLayout.tsx
3940
+ var Geometry = createContext({
3941
+ depth: 0,
3942
+ layout: "values"
3943
+ });
3944
+ function FieldLayout({ children, depth = 0, layout = "values", columns, gap }) {
3945
+ return /* @__PURE__ */ jsx(Geometry.Provider, {
3946
+ value: {
3947
+ depth,
3948
+ layout,
3949
+ columns,
3950
+ gap
3951
+ },
3952
+ children
3953
+ });
3954
+ }
3955
+ var FieldRow = forwardRef(({ columns, gap, header, valueOnly, leadingControl, disclosureContent, trailingControl, actions, layout, depth, typeWidth, disclosure, label, sorting, disclosureInvalid, stacking = "editor", children, style, className, ...props }, ref) => {
3956
+ const geometry = useContext(Geometry);
3957
+ const level = depth ?? geometry.depth;
3958
+ const hasHeader = header != null || valueOnly === true;
3959
+ return /* @__PURE__ */ jsxs("div", {
3960
+ ...props,
3961
+ ref,
3962
+ className: [valueEditor_module_default.root, className].filter(Boolean).join(" "),
3963
+ "data-stacking": stacking,
3964
+ "data-layout": layout ?? geometry.layout,
3965
+ "data-header": hasHeader || void 0,
3966
+ "data-value-only": valueOnly || void 0,
3967
+ "data-nested-field": level > 0 || void 0,
3968
+ style: {
3969
+ "gridTemplateColumns": columns ?? geometry.columns,
3970
+ "columnGap": gap ?? geometry.gap,
3971
+ "--field-indent": `${level * 16}px`,
3972
+ ...typeWidth === "fixed" ? { "--field-type-width": "32px" } : typeWidth === "editable" ? { "--field-type-width": "56px" } : {},
3973
+ ...style
3974
+ },
3975
+ children: [
3976
+ hasHeader && /* @__PURE__ */ jsxs("div", {
3977
+ className: valueEditor_module_default.header,
3978
+ children: [
3979
+ leadingControl != null && /* @__PURE__ */ jsx("div", {
3980
+ className: valueEditor_module_default.leadingControl,
3981
+ children: leadingControl
3982
+ }),
3983
+ /* @__PURE__ */ jsxs("div", {
3984
+ className: valueEditor_module_default.toggleControl,
3985
+ children: [disclosure && (!sorting || leadingControl == null) && /* @__PURE__ */ jsx(Button$1, {
3986
+ type: "button",
3987
+ size: "icon-xs",
3988
+ className: "w-[var(--field-toggle-width,24px)]",
3989
+ variant: "disclosure",
3990
+ "aria-label": label,
3991
+ "aria-expanded": disclosure.expanded,
3992
+ "aria-invalid": disclosureInvalid || void 0,
3993
+ "aria-controls": disclosure.controls,
3994
+ onClick: disclosure.onToggle,
3995
+ children: disclosureContent ?? /* @__PURE__ */ jsx("i", {
3996
+ "aria-hidden": "true",
3997
+ className: disclosure.expanded ? "i-lucide-light:chevron-down" : "i-lucide-light:chevron-right"
3998
+ })
3999
+ }), !disclosure && leadingControl == null && disclosureContent]
4000
+ }),
4001
+ !valueOnly && (typeof header === "function" ? header(disclosure) : header)
4002
+ ]
4003
+ }),
4004
+ children,
4005
+ trailingControl,
4006
+ actions != null && /* @__PURE__ */ jsx("div", {
4007
+ className: valueEditor_module_default.options,
4008
+ children: actions
4009
+ })
4010
+ ]
4011
+ });
4012
+ });
4013
+ /** Expanded values stay in their cell; structural branches establish a child geometry and connector. */
4014
+ function FieldBody({ placement, endpoint = "control", depth, className, children, ...props }) {
4015
+ const geometry = useContext(Geometry);
4016
+ return /* @__PURE__ */ jsx("div", {
4017
+ ...props,
4018
+ className: [className, placement === "branch" && fieldBranch_module_default.branch].filter(Boolean).join(" "),
4019
+ "data-field-branch": placement === "branch" || void 0,
4020
+ "data-branch-endpoint": placement === "branch" ? endpoint : void 0,
4021
+ children: /* @__PURE__ */ jsx(FieldLayout, {
4022
+ ...geometry,
4023
+ depth: depth ?? geometry.depth + (placement === "branch" ? 1 : 0),
4024
+ children
4025
+ })
4026
+ });
4027
+ }
4028
+ //#endregion
4029
+ //#region src/form/browser/fieldTable.tsx
4030
+ /** Shared field geometry. Callers own definitions, values, actions and persistence. */
4031
+ var FieldTable = forwardRef(({ layout = "definition", fixedTypes, typeColumn = true, columnHeadings = true, output, nullable, empty, actionSlots = 1, standalone, className, children, ...props }, ref) => {
4032
+ const t = useTranslate();
4033
+ return /* @__PURE__ */ jsxs("div", {
4034
+ ...props,
4035
+ ref,
4036
+ className: [fieldTable_module_default.list, className].filter(Boolean).join(" "),
4037
+ "data-value-editor-scope": true,
4038
+ "data-layout": layout,
4039
+ "data-type-column": typeColumn || void 0,
4040
+ "data-output": output || void 0,
4041
+ "data-fixed-types": fixedTypes || void 0,
4042
+ "data-nullable": nullable || void 0,
4043
+ "data-empty": empty || void 0,
4044
+ "data-action-slots": actionSlots,
4045
+ "data-standalone": standalone || void 0,
4046
+ children: [columnHeadings && !empty && /* @__PURE__ */ jsxs("div", {
4047
+ className: fieldTable_module_default.columns,
4048
+ "data-layout": layout,
4049
+ "data-output": output || void 0,
4050
+ children: [
4051
+ /* @__PURE__ */ jsx("span", {
4052
+ className: fieldTable_module_default.nameHeading,
4053
+ children: t("valueEditor.columnName")
4054
+ }),
4055
+ typeColumn && /* @__PURE__ */ jsx("span", {
4056
+ className: fieldTable_module_default.typeHeading,
4057
+ children: t("valueEditor.columnType")
4058
+ }),
4059
+ !output && /* @__PURE__ */ jsx("span", {
4060
+ className: fieldTable_module_default.valueHeading,
4061
+ children: t("valueEditor.columnValue")
4062
+ }),
4063
+ nullable && /* @__PURE__ */ jsx("span", {
4064
+ className: fieldTable_module_default.nullableHeading,
4065
+ children: t("valueEditor.nullable")
4066
+ })
4067
+ ]
4068
+ }), /* @__PURE__ */ jsx(FieldLayout, {
4069
+ layout,
4070
+ children
4071
+ })]
4072
+ });
4073
+ });
4074
+ function FieldTableRow({ className, ...props }) {
4075
+ return /* @__PURE__ */ jsx("div", {
4076
+ ...props,
4077
+ className: [fieldTable_module_default.row, className].filter(Boolean).join(" ")
4078
+ });
4079
+ }
4080
+ function FieldNullable({ name, checked, onChange }) {
4081
+ const t = useTranslate();
4082
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
4083
+ render: /* @__PURE__ */ jsx("span", { className: fieldTable_module_default.nullableControl }),
4084
+ children: /* @__PURE__ */ jsx(Checkbox, {
4085
+ className: "not-data-disabled:cursor-pointer",
4086
+ "aria-label": `${name} ${t("valueEditor.nullable")}`,
4087
+ "aria-checked": checked,
4088
+ checked,
4089
+ indeterminate: !onChange && !checked,
4090
+ disabled: !onChange,
4091
+ onCheckedChange: (next) => onChange?.(next === true)
4092
+ })
4093
+ }), /* @__PURE__ */ jsx(TooltipContent, { children: t(checked ? "valueEditor.nullableDescription" : "valueEditor.notNullableDescription") })] });
4094
+ }
3916
4095
  //#endregion
3917
4096
  //#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/switch/root/SwitchRootContext.js
3918
4097
  var SwitchRootContext = /*#__PURE__*/ React.createContext(void 0);
@@ -6334,6 +6513,7 @@ function childFields(props) {
6334
6513
  hideValueTools: props.hideValueTools,
6335
6514
  expansionPolicy: props.expansionPolicy,
6336
6515
  schema: childSchema,
6516
+ nullable: isUnconstrainedSchema(childSchema),
6337
6517
  value: childValue,
6338
6518
  onChange: change,
6339
6519
  valueEditable,
@@ -6815,97 +6995,6 @@ function EditableChoices({ options, labels, value, label, disabled, invalid, mul
6815
6995
  })
6816
6996
  });
6817
6997
  }
6818
- var fieldBranch_module_default = { branch: "fieldBranch_branch_a5820" };
6819
- //#endregion
6820
- //#region src/form/browser/fieldLayout.tsx
6821
- var Geometry = createContext({
6822
- depth: 0,
6823
- layout: "values"
6824
- });
6825
- function FieldLayout({ children, depth = 0, layout = "values", columns, gap }) {
6826
- return /* @__PURE__ */ jsx(Geometry.Provider, {
6827
- value: {
6828
- depth,
6829
- layout,
6830
- columns,
6831
- gap
6832
- },
6833
- children
6834
- });
6835
- }
6836
- var FieldRow = forwardRef(({ columns, gap, header, valueOnly, leadingControl, disclosureContent, trailingControl, actions, layout, depth, typeWidth, disclosure, label, sorting, disclosureInvalid, stacking = "editor", children, style, className, ...props }, ref) => {
6837
- const geometry = useContext(Geometry);
6838
- const level = depth ?? geometry.depth;
6839
- const hasHeader = header != null || valueOnly === true;
6840
- return /* @__PURE__ */ jsxs("div", {
6841
- ...props,
6842
- ref,
6843
- className: [valueEditor_module_default.root, className].filter(Boolean).join(" "),
6844
- "data-stacking": stacking,
6845
- "data-layout": layout ?? geometry.layout,
6846
- "data-header": hasHeader || void 0,
6847
- "data-value-only": valueOnly || void 0,
6848
- "data-nested-field": level > 0 || void 0,
6849
- style: {
6850
- "gridTemplateColumns": columns ?? geometry.columns,
6851
- "columnGap": gap ?? geometry.gap,
6852
- "--field-indent": `${level * 16}px`,
6853
- ...typeWidth === "fixed" ? { "--field-type-width": "32px" } : typeWidth === "editable" ? { "--field-type-width": "56px" } : {},
6854
- ...style
6855
- },
6856
- children: [
6857
- hasHeader && /* @__PURE__ */ jsxs("div", {
6858
- className: valueEditor_module_default.header,
6859
- children: [
6860
- leadingControl != null && /* @__PURE__ */ jsx("div", {
6861
- className: valueEditor_module_default.leadingControl,
6862
- children: leadingControl
6863
- }),
6864
- /* @__PURE__ */ jsxs("div", {
6865
- className: valueEditor_module_default.toggleControl,
6866
- children: [disclosure && (!sorting || leadingControl == null) && /* @__PURE__ */ jsx(Button$1, {
6867
- type: "button",
6868
- size: "icon-xs",
6869
- className: "w-[var(--field-toggle-width,24px)]",
6870
- variant: "disclosure",
6871
- "aria-label": label,
6872
- "aria-expanded": disclosure.expanded,
6873
- "aria-invalid": disclosureInvalid || void 0,
6874
- "aria-controls": disclosure.controls,
6875
- onClick: disclosure.onToggle,
6876
- children: disclosureContent ?? /* @__PURE__ */ jsx("i", {
6877
- "aria-hidden": "true",
6878
- className: disclosure.expanded ? "i-lucide-light:chevron-down" : "i-lucide-light:chevron-right"
6879
- })
6880
- }), !disclosure && leadingControl == null && disclosureContent]
6881
- }),
6882
- !valueOnly && (typeof header === "function" ? header(disclosure) : header)
6883
- ]
6884
- }),
6885
- children,
6886
- trailingControl,
6887
- actions != null && /* @__PURE__ */ jsx("div", {
6888
- className: valueEditor_module_default.options,
6889
- children: actions
6890
- })
6891
- ]
6892
- });
6893
- });
6894
- /** Expanded values stay in their cell; structural branches establish a child geometry and connector. */
6895
- function FieldBody({ placement, endpoint = "control", depth, className, children, ...props }) {
6896
- const geometry = useContext(Geometry);
6897
- return /* @__PURE__ */ jsx("div", {
6898
- ...props,
6899
- className: [className, placement === "branch" && fieldBranch_module_default.branch].filter(Boolean).join(" "),
6900
- "data-field-branch": placement === "branch" || void 0,
6901
- "data-branch-endpoint": placement === "branch" ? endpoint : void 0,
6902
- children: /* @__PURE__ */ jsx(FieldLayout, {
6903
- ...geometry,
6904
- depth: depth ?? geometry.depth + (placement === "branch" ? 1 : 0),
6905
- children
6906
- })
6907
- });
6908
- }
6909
6998
  //#endregion
6910
6999
  //#region src/form/browser/fieldTypeAddon.tsx
6911
7000
  /** A compact definition control attached to a value, shared by Case and array items. */
@@ -19250,7 +19339,10 @@ function FieldValueEditor(suppliedProps) {
19250
19339
  const definitionEditable = props.onDefinitionChange != null && !disabled;
19251
19340
  const showDataType = editorComponent(schema) === "json" && !definitionEditable && valueEditable && props.valueSuffix == null && props.editor == null;
19252
19341
  const [selectedEditorSchema, setSelectedEditorSchema] = useState();
19253
- const editorSchema = showDataType ? selectedEditorSchema ?? defaultValueEditorSchema(schema) : schema;
19342
+ const editorSchema = showDataType ? selectedEditorSchema ?? defaultValueEditorSchema(schema, props.defaultEditor == null ? void 0 : {
19343
+ component: props.defaultEditor,
19344
+ value
19345
+ }) : schema;
19254
19346
  const editorProps = {
19255
19347
  ...props,
19256
19348
  schema: editorSchema
@@ -19380,7 +19472,8 @@ function FieldValueEditor(suppliedProps) {
19380
19472
  const inlineTools = !props.hideValueTools && (props.layout === "values" || props.layout === "ports") && valueEditable && !disabled && !sorting;
19381
19473
  const nullControl = (state.display === "null" || presence === "null") && props.editor === void 0 && !choiceOptions && !enumeration;
19382
19474
  const canReset = inlineTools && props.onReset != null && (showUnset || !!nullable && nullControl);
19383
- const canClear = inlineTools && state.canClear;
19475
+ const clearable = state.canClear || props.unset != null && presence === "null";
19476
+ const canClear = inlineTools && clearable;
19384
19477
  const canToggleJson = inlineTools && expanded && shape.collection && presence === "value";
19385
19478
  const arrayDefinition = !showDataType && hasHeader && source.type === "array" && !Array.isArray(source.items) && !choiceOptions;
19386
19479
  const changeValueEditor = (nextSchema) => {
@@ -19496,7 +19589,7 @@ function FieldValueEditor(suppliedProps) {
19496
19589
  className: "i-lucide-light:circle-slash"
19497
19590
  }), "null"]
19498
19591
  }),
19499
- state.canClear && /* @__PURE__ */ jsxs(Button$1, {
19592
+ clearable && /* @__PURE__ */ jsxs(Button$1, {
19500
19593
  type: "button",
19501
19594
  size: "xs",
19502
19595
  variant: "ghost",
@@ -20030,16 +20123,29 @@ function AgentTools(props) {
20030
20123
  ...props.editor
20031
20124
  });
20032
20125
  if (props.config.tools.length === 0) return null;
20126
+ const summary = actionSummary(props.config.tools, {}, Object.values(props.providers ?? {}));
20033
20127
  return /* @__PURE__ */ jsx(ActionSelectionDialog, {
20034
20128
  readOnly: true,
20035
20129
  title: t("agent.tools"),
20130
+ triggerHint: summary.workflows > 0 ? t("toolPicker.summary", {
20131
+ tools: summary.count,
20132
+ workflows: summary.workflows
20133
+ }) : t("actionPicker.selectionSummary", {
20134
+ actions: summary.count,
20135
+ providers: summary.providers.length
20136
+ }),
20036
20137
  entries: props.config.tools,
20037
20138
  providers: props.providers,
20038
20139
  trigger: /* @__PURE__ */ jsx(Button$1, {
20039
20140
  type: "button",
20040
20141
  variant: "ghost",
20041
20142
  size: "sm",
20042
- children: t("agent.tools")
20143
+ className: "gap-1.5 font-normal text-muted-foreground",
20144
+ children: /* @__PURE__ */ jsx(IconStack, {
20145
+ icons: summary.providers,
20146
+ count: summary.count,
20147
+ size: "sm"
20148
+ })
20043
20149
  }),
20044
20150
  settings: {
20045
20151
  title: t("agent.toolSettings"),
@@ -20271,7 +20377,7 @@ function EditableAgentSettingsProvider({ children, task, nodeId, store, connecto
20271
20377
  return false;
20272
20378
  }
20273
20379
  const decoded = decodeRevisionContent({
20274
- modelVersion: 13,
20380
+ modelVersion: 14,
20275
20381
  modules: {},
20276
20382
  document: {
20277
20383
  bindings: {},
@@ -20804,7 +20910,10 @@ function CodeEditor({ ariaDescribedBy, ariaLabel, diagnostics, disabled, errorLa
20804
20910
  }
20805
20911
  //#endregion
20806
20912
  //#region src/workbench/browser/runtime/editor/codeHttpHosts.tsx
20807
- function CodeHttpHosts({ disabled, hosts, onSave }) {
20913
+ function CodeHttpHosts(props) {
20914
+ const { hosts } = props;
20915
+ const editor = props.readOnly ? void 0 : props;
20916
+ const disabled = editor?.disabled ?? false;
20808
20917
  const t = useTranslate();
20809
20918
  const id = useId();
20810
20919
  const saved = hosts.join("\n");
@@ -20818,6 +20927,7 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
20818
20927
  setContainer(element?.closest(".open-flow-workbench") ?? element?.closest(".open-flow-theme") ?? null);
20819
20928
  }, []);
20820
20929
  const commit = async () => {
20930
+ if (editor == null) return;
20821
20931
  if (openedHosts !== saved) {
20822
20932
  setOpenedHosts(saved);
20823
20933
  setDraft(saved);
@@ -20831,7 +20941,7 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
20831
20941
  setError(void 0);
20832
20942
  setPending(true);
20833
20943
  try {
20834
- if (dequal$1(next, hosts) || await onSave(next)) setOpen(false);
20944
+ if (dequal$1(next, hosts) || await editor.onSave(next)) setOpen(false);
20835
20945
  } finally {
20836
20946
  setPending(false);
20837
20947
  }
@@ -20875,25 +20985,26 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
20875
20985
  /* @__PURE__ */ jsx(ValueEditorFeedback, {
20876
20986
  error,
20877
20987
  children: (errorId) => /* @__PURE__ */ jsx(Textarea, {
20878
- "aria-describedby": [`${id}-hint`, errorId].filter(Boolean).join(" "),
20988
+ "aria-describedby": [editor == null ? void 0 : `${id}-hint`, errorId].filter(Boolean).join(" ") || void 0,
20879
20989
  "aria-invalid": error != null || void 0,
20880
20990
  className: "min-h-14 font-mono text-xs",
20881
20991
  disabled: disabled || pending,
20882
20992
  id: `${id}-hosts`,
20883
- onChange: (event) => setDraft(event.target.value),
20993
+ onChange: editor == null ? void 0 : (event) => setDraft(event.target.value),
20884
20994
  placeholder: "api.example.com",
20995
+ readOnly: props.readOnly,
20885
20996
  rows: 2,
20886
20997
  spellCheck: false,
20887
- value: draft
20998
+ value: editor == null ? saved : draft
20888
20999
  })
20889
21000
  }),
20890
- /* @__PURE__ */ jsx(FieldDescription, {
21001
+ editor != null && /* @__PURE__ */ jsx(FieldDescription, {
20891
21002
  id: `${id}-hint`,
20892
21003
  children: t("inspector.task.httpHostsHint")
20893
21004
  })
20894
21005
  ]
20895
21006
  }),
20896
- /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button$1, {
21007
+ editor != null && /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button$1, {
20897
21008
  type: "button",
20898
21009
  variant: "outline",
20899
21010
  disabled: pending,
@@ -21354,16 +21465,49 @@ function CodeTaskSection(props) {
21354
21465
  const { selection, theme } = props;
21355
21466
  const task = selection.definition;
21356
21467
  if (task == null || !("moduleId" in task) || selection.module == null) return null;
21357
- return /* @__PURE__ */ jsxs(CodeTaskFrame, { children: [/* @__PURE__ */ jsx(CodeEditor, {
21358
- ariaLabel: t("inspector.task.source"),
21359
- disabled: true,
21360
- theme,
21361
- typing: codeTyping(task, task.capabilities),
21362
- uri: `publication:modules/${task.moduleId}.js`,
21363
- value: selection.module.source,
21364
- loadingLabel: t("inspector.task.editorLoading"),
21365
- errorLabel: t("inspector.task.editorUnavailable")
21366
- }), task.capabilities != null && /* @__PURE__ */ jsx(JSONViewer, { data: task.capabilities })] });
21468
+ const permission = task.capabilities?.find((capability) => "mode" in capability);
21469
+ const tools = [...permission?.mode == "independent" ? permission.actions : [], ...(task.capabilities ?? []).filter((item) => item.kind == "workflow")];
21470
+ const summary = actionSummary(tools, {}, Object.values(props.providers ?? {}));
21471
+ const httpHosts = task.capabilities?.find((capability) => capability.kind == "http")?.hosts ?? [];
21472
+ return /* @__PURE__ */ jsx(CodeTaskFrame, {
21473
+ actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [httpHosts.length > 0 && /* @__PURE__ */ jsx(CodeHttpHosts, {
21474
+ readOnly: true,
21475
+ hosts: httpHosts
21476
+ }), tools.length > 0 && /* @__PURE__ */ jsx(ActionSelectionDialog, {
21477
+ readOnly: true,
21478
+ title: t("actionPicker.configureActions"),
21479
+ triggerHint: summary.workflows > 0 ? t("toolPicker.summary", {
21480
+ tools: summary.count,
21481
+ workflows: summary.workflows
21482
+ }) : t("actionPicker.selectionSummary", {
21483
+ actions: summary.count,
21484
+ providers: summary.providers.length
21485
+ }),
21486
+ trigger: /* @__PURE__ */ jsx(Button$1, {
21487
+ type: "button",
21488
+ variant: "ghost",
21489
+ size: "sm",
21490
+ className: "gap-1.5 font-normal text-muted-foreground",
21491
+ children: /* @__PURE__ */ jsx(IconStack, {
21492
+ icons: summary.providers,
21493
+ count: summary.count,
21494
+ size: "sm"
21495
+ })
21496
+ }),
21497
+ entries: tools,
21498
+ providers: props.providers
21499
+ })] }),
21500
+ children: /* @__PURE__ */ jsx(CodeEditor, {
21501
+ ariaLabel: t("inspector.task.source"),
21502
+ disabled: true,
21503
+ theme,
21504
+ typing: codeTyping(task, task.capabilities),
21505
+ uri: `publication:modules/${task.moduleId}.js`,
21506
+ value: selection.module.source,
21507
+ loadingLabel: t("inspector.task.editorLoading"),
21508
+ errorLabel: t("inspector.task.editorUnavailable")
21509
+ })
21510
+ });
21367
21511
  }
21368
21512
  //#endregion
21369
21513
  //#region src/workbench/browser/runtime/editor/fieldPanelAnchor.ts
@@ -22583,7 +22727,7 @@ function SourceValueEditor({ fixed = false, sourceOnly = false, editor: customEd
22583
22727
  setSourceOpen(true);
22584
22728
  if (variables.enabled) variables.onOpen?.();
22585
22729
  }
22586
- } : void 0,
22730
+ } : presentation?.unset,
22587
22731
  label: fieldLabel,
22588
22732
  path: `/${fieldLabel.replaceAll("~", "~0").replaceAll("/", "~1")}`,
22589
22733
  disabled,
@@ -23179,83 +23323,6 @@ function presentConnectorInputs(inputs, t) {
23179
23323
  ...optional
23180
23324
  ];
23181
23325
  }
23182
- var fieldTable_module_default = {
23183
- list: "fieldTable_list_14bfd",
23184
- columns: "fieldTable_columns_14bfd",
23185
- nameHeading: "fieldTable_nameHeading_14bfd",
23186
- typeHeading: "fieldTable_typeHeading_14bfd",
23187
- valueHeading: "fieldTable_valueHeading_14bfd",
23188
- row: "fieldTable_row_14bfd",
23189
- nullableControl: "fieldTable_nullableControl_14bfd",
23190
- nullableHeading: "fieldTable_nullableHeading_14bfd"
23191
- };
23192
- //#endregion
23193
- //#region src/form/browser/fieldTable.tsx
23194
- /** Shared field geometry. Callers own definitions, values, actions and persistence. */
23195
- var FieldTable = forwardRef(({ layout = "definition", fixedTypes, typeColumn = true, columnHeadings = true, output, nullable, empty, actionSlots = 1, standalone, className, children, ...props }, ref) => {
23196
- const t = useTranslate();
23197
- return /* @__PURE__ */ jsxs("div", {
23198
- ...props,
23199
- ref,
23200
- className: [fieldTable_module_default.list, className].filter(Boolean).join(" "),
23201
- "data-value-editor-scope": true,
23202
- "data-layout": layout,
23203
- "data-type-column": typeColumn || void 0,
23204
- "data-output": output || void 0,
23205
- "data-fixed-types": fixedTypes || void 0,
23206
- "data-nullable": nullable || void 0,
23207
- "data-empty": empty || void 0,
23208
- "data-action-slots": actionSlots,
23209
- "data-standalone": standalone || void 0,
23210
- children: [columnHeadings && !empty && /* @__PURE__ */ jsxs("div", {
23211
- className: fieldTable_module_default.columns,
23212
- "data-layout": layout,
23213
- "data-output": output || void 0,
23214
- children: [
23215
- /* @__PURE__ */ jsx("span", {
23216
- className: fieldTable_module_default.nameHeading,
23217
- children: t("valueEditor.columnName")
23218
- }),
23219
- typeColumn && /* @__PURE__ */ jsx("span", {
23220
- className: fieldTable_module_default.typeHeading,
23221
- children: t("valueEditor.columnType")
23222
- }),
23223
- !output && /* @__PURE__ */ jsx("span", {
23224
- className: fieldTable_module_default.valueHeading,
23225
- children: t("valueEditor.columnValue")
23226
- }),
23227
- nullable && /* @__PURE__ */ jsx("span", {
23228
- className: fieldTable_module_default.nullableHeading,
23229
- children: t("valueEditor.nullable")
23230
- })
23231
- ]
23232
- }), /* @__PURE__ */ jsx(FieldLayout, {
23233
- layout,
23234
- children
23235
- })]
23236
- });
23237
- });
23238
- function FieldTableRow({ className, ...props }) {
23239
- return /* @__PURE__ */ jsx("div", {
23240
- ...props,
23241
- className: [fieldTable_module_default.row, className].filter(Boolean).join(" ")
23242
- });
23243
- }
23244
- function FieldNullable({ name, checked, onChange }) {
23245
- const t = useTranslate();
23246
- return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
23247
- render: /* @__PURE__ */ jsx("span", { className: fieldTable_module_default.nullableControl }),
23248
- children: /* @__PURE__ */ jsx(Checkbox, {
23249
- className: "not-data-disabled:cursor-pointer",
23250
- "aria-label": `${name} ${t("valueEditor.nullable")}`,
23251
- "aria-checked": checked,
23252
- checked,
23253
- indeterminate: !onChange && !checked,
23254
- disabled: !onChange,
23255
- onCheckedChange: (next) => onChange?.(next === true)
23256
- })
23257
- }), /* @__PURE__ */ jsx(TooltipContent, { children: t(checked ? "valueEditor.nullableDescription" : "valueEditor.notNullableDescription") })] });
23258
- }
23259
23326
  //#endregion
23260
23327
  //#region src/workbench/browser/runtime/editor/inspectorSection.tsx
23261
23328
  function InspectorSection({ title, children, className, contentInset = true, ...props }) {
@@ -23273,6 +23340,115 @@ function InspectorSection({ title, children, className, contentInset = true, ...
23273
23340
  });
23274
23341
  }
23275
23342
  //#endregion
23343
+ //#region src/workbench/browser/runtime/editor/connectorProxySection.tsx
23344
+ function ConnectorProxySection({ task, disabled, readOnly = false, hasBody, parameters, input, onSave, onClearBody }) {
23345
+ const t = useTranslate();
23346
+ const id = useId();
23347
+ const taskRef = useRef(task);
23348
+ const saveRef = useRef(onSave);
23349
+ useEffect(() => {
23350
+ taskRef.current = task;
23351
+ saveRef.current = onSave;
23352
+ }, [task, onSave]);
23353
+ const [changes] = useState(() => new TaskExecutorChanges(task.executor, (before, next) => {
23354
+ const current = taskRef.current;
23355
+ if (before.kind !== "connector-proxy" || next.kind !== "connector-proxy" || current.executor.kind !== "connector-proxy") return Promise.resolve(false);
23356
+ const merged = { ...current.executor };
23357
+ if (before.method !== next.method) merged.method = next.method;
23358
+ return saveRef.current(current, connectorProxyTask(merged, current.name, current));
23359
+ }));
23360
+ const [config, setConfig] = useState(changes.value);
23361
+ const [failed, setFailed] = useState(false);
23362
+ useEffect(() => {
23363
+ changes.sync(task.executor);
23364
+ setConfig(changes.value);
23365
+ }, [changes, task.executor]);
23366
+ if (config.kind !== "connector-proxy") return null;
23367
+ const supportsBody = connectorProxySupportsBody(config.method);
23368
+ const bodyError = task.executor.kind === "connector-proxy" && task.executor.method === config.method && connectorProxyIssues(config, hasBody).some((issue) => issue.code === "bodyUnsupported");
23369
+ async function save() {
23370
+ try {
23371
+ setFailed(!await changes.save());
23372
+ } catch {
23373
+ setFailed(true);
23374
+ }
23375
+ }
23376
+ function update(patch) {
23377
+ if (disabled || changes.value.kind !== "connector-proxy") return;
23378
+ changes.value = {
23379
+ ...changes.value,
23380
+ ...patch
23381
+ };
23382
+ setConfig(changes.value);
23383
+ save();
23384
+ }
23385
+ return /* @__PURE__ */ jsx(InspectorSection, {
23386
+ title: t("connectorProxy.title"),
23387
+ "data-inspector-section": "task",
23388
+ children: /* @__PURE__ */ jsxs("div", {
23389
+ className: "node-settings flex flex-col gap-3",
23390
+ "data-value-editor-scope": true,
23391
+ children: [
23392
+ input("endpoint", t("connectorProxy.endpoint")),
23393
+ /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, {
23394
+ htmlFor: `${id}-method`,
23395
+ children: t("httpRequest.method")
23396
+ }), /* @__PURE__ */ jsx(NativeSelect, {
23397
+ id: `${id}-method`,
23398
+ value: config.method,
23399
+ disabled,
23400
+ className: "w-full",
23401
+ onChange: (event) => update({ method: event.target.value }),
23402
+ children: [
23403
+ "GET",
23404
+ "POST",
23405
+ "PUT",
23406
+ "PATCH",
23407
+ "DELETE"
23408
+ ].map((method) => /* @__PURE__ */ jsx(NativeSelectOption, {
23409
+ value: method,
23410
+ children: method
23411
+ }, method))
23412
+ })] }),
23413
+ parameters,
23414
+ supportsBody && input("body", t("httpRequest.body")),
23415
+ bodyError && /* @__PURE__ */ jsxs("div", {
23416
+ className: "flex flex-col gap-2",
23417
+ children: [/* @__PURE__ */ jsx("p", {
23418
+ id: `${id}-body-error`,
23419
+ role: "alert",
23420
+ className: "text-xs text-destructive",
23421
+ children: t("connectorProxy.bodyUnsupported")
23422
+ }), !readOnly && /* @__PURE__ */ jsxs(Button$1, {
23423
+ variant: "outline",
23424
+ size: "field",
23425
+ disabled,
23426
+ "aria-describedby": `${id}-body-error`,
23427
+ onClick: () => void onClearBody(),
23428
+ children: [
23429
+ t("valueEditor.clear"),
23430
+ " ",
23431
+ t("httpRequest.body")
23432
+ ]
23433
+ })]
23434
+ }),
23435
+ failed && /* @__PURE__ */ jsx(ValueEditorFeedback, {
23436
+ error: t("httpRequest.saveFailed"),
23437
+ children: (errorId) => /* @__PURE__ */ jsx(Button$1, {
23438
+ variant: "outline",
23439
+ size: "field",
23440
+ "aria-invalid": true,
23441
+ "aria-describedby": errorId,
23442
+ disabled,
23443
+ onClick: () => void save(),
23444
+ children: t("httpRequest.retry")
23445
+ })
23446
+ })
23447
+ ]
23448
+ })
23449
+ });
23450
+ }
23451
+ //#endregion
23276
23452
  //#region src/workbench/browser/runtime/editor/decisionSection.tsx
23277
23453
  var textSchema = {
23278
23454
  type: "string",
@@ -24205,30 +24381,33 @@ function CreateEventSourceDialog({ client, sourceKind, notify, teamId, existingN
24205
24381
  }
24206
24382
  //#endregion
24207
24383
  //#region src/workbench/browser/runtime/editor/feishuEventFilters.tsx
24208
- function FeishuEventFilters({ field, config, events, managed, disabled, onChange }) {
24384
+ function FeishuEventFilters({ field, config, events, managed, disabled, readOnly = false, onChange }) {
24209
24385
  const t = useTranslate();
24210
24386
  const resource = isJsonObject(config.resource) ? config.resource : void 0;
24211
24387
  const kind = feishuResourceKind(events);
24388
+ const storedKind = resource?.kind;
24389
+ const displayKind = readOnly && (storedKind == "document" || storedKind == "calendar" || storedKind == "approval") ? storedKind : kind;
24212
24390
  const chats = Array.isArray(config.chatIds) ? config.chatIds.filter((item) => typeof item == "string") : [];
24213
24391
  const chatSupported = supportsFeishuChatFilter(events);
24214
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [field !== "resource" && (chatSupported || chats.length > 0) && /* @__PURE__ */ jsx("div", {
24392
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [field !== "resource" && (chatSupported || chats.length > 0) && /* @__PURE__ */ jsxs("div", {
24215
24393
  className: "flex flex-col gap-2",
24216
- children: chatSupported ? /* @__PURE__ */ jsx(ChatFilter, {
24394
+ children: [(chatSupported || readOnly) && /* @__PURE__ */ jsx(ChatFilter, {
24217
24395
  value: chats,
24218
24396
  disabled,
24397
+ readOnly,
24219
24398
  onChange: (value) => onChange("chatIds", value)
24220
- }, JSON.stringify(chats)) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
24399
+ }, JSON.stringify(chats)), !chatSupported && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
24221
24400
  role: "alert",
24222
24401
  className: "m-0 text-sm text-destructive",
24223
24402
  children: t("eventSources.incompatibleChats")
24224
- }), /* @__PURE__ */ jsx(Button$1, {
24403
+ }), !readOnly && /* @__PURE__ */ jsx(Button$1, {
24225
24404
  variant: "outline",
24226
24405
  size: "sm",
24227
24406
  className: "self-start",
24228
24407
  disabled,
24229
24408
  onClick: () => onChange("chatIds", void 0),
24230
24409
  children: t("eventSources.removeFilter")
24231
- })] })
24410
+ })] })]
24232
24411
  }), field !== "chatIds" && (kind != null || resource != null) && /* @__PURE__ */ jsxs("div", {
24233
24412
  className: "flex flex-col gap-3",
24234
24413
  children: [
@@ -24236,7 +24415,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24236
24415
  className: "flex items-center gap-2",
24237
24416
  children: [/* @__PURE__ */ jsx(Checkbox, {
24238
24417
  checked: resource != null,
24239
- disabled: disabled || resource == null && (!managed || kind == null),
24418
+ disabled: readOnly || disabled || resource == null && (!managed || kind == null),
24240
24419
  onCheckedChange: (checked) => onChange("resource", checked ? {
24241
24420
  kind,
24242
24421
  id: "",
@@ -24248,7 +24427,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24248
24427
  className: "m-0 text-xs leading-5 text-muted-foreground",
24249
24428
  children: t("eventSources.subscribeResourceHint")
24250
24429
  }),
24251
- !managed && /* @__PURE__ */ jsx("p", {
24430
+ !readOnly && !managed && /* @__PURE__ */ jsx("p", {
24252
24431
  className: "m-0 text-xs leading-5 text-muted-foreground",
24253
24432
  children: t("eventSources.managementRequired")
24254
24433
  }),
@@ -24257,8 +24436,8 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24257
24436
  className: "m-0 text-sm text-destructive",
24258
24437
  children: t("eventSources.incompatibleResource")
24259
24438
  }),
24260
- resource != null && kind != null && resource.kind == kind && /* @__PURE__ */ jsxs(Fragment$1, { children: [
24261
- kind == "document" && /* @__PURE__ */ jsx(SourceSelect, {
24439
+ resource != null && displayKind != null && resource.kind == displayKind && /* @__PURE__ */ jsxs(Fragment$1, { children: [
24440
+ displayKind == "document" && /* @__PURE__ */ jsx(SourceSelect, {
24262
24441
  label: t("eventSources.documentType"),
24263
24442
  value: typeof resource.documentType == "string" ? resource.documentType : "",
24264
24443
  options: [
@@ -24272,7 +24451,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24272
24451
  value,
24273
24452
  label: t(`eventSources.documentTypes.${value}`)
24274
24453
  })),
24275
- disabled: disabled || !managed,
24454
+ disabled: readOnly || disabled || !managed,
24276
24455
  onChange: (value) => onChange("resource", {
24277
24456
  ...resource,
24278
24457
  documentType: value
@@ -24280,9 +24459,10 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24280
24459
  }),
24281
24460
  /* @__PURE__ */ jsxs(Label, {
24282
24461
  className: "flex flex-col items-stretch gap-2",
24283
- children: [t(`eventSources.resourceIds.${kind}`), /* @__PURE__ */ jsx(Input, {
24462
+ children: [t(`eventSources.resourceIds.${displayKind}`), /* @__PURE__ */ jsx(Input, {
24284
24463
  value: typeof resource.id == "string" ? resource.id : "",
24285
- disabled: disabled || !managed,
24464
+ disabled: !readOnly && (disabled || !managed),
24465
+ readOnly,
24286
24466
  required: true,
24287
24467
  onChange: (event) => onChange("resource", {
24288
24468
  ...resource,
@@ -24292,23 +24472,25 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
24292
24472
  }),
24293
24473
  /* @__PURE__ */ jsx("p", {
24294
24474
  className: "m-0 text-xs leading-5 text-muted-foreground",
24295
- children: t(`eventSources.resourceHints.${kind}`)
24475
+ children: t(`eventSources.resourceHints.${displayKind}`)
24296
24476
  })
24297
24477
  ] })
24298
24478
  ]
24299
24479
  })] });
24300
24480
  }
24301
- function ChatFilter({ value, disabled, onChange }) {
24481
+ function ChatFilter({ value, disabled, readOnly = false, onChange }) {
24302
24482
  const t = useTranslate();
24303
24483
  const [text, setText] = useState(value.join("\n"));
24304
24484
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Label, {
24305
24485
  className: "flex flex-col items-stretch gap-2",
24306
24486
  children: [t("eventSources.specifiedChats"), /* @__PURE__ */ jsx(Textarea, {
24307
24487
  value: text,
24308
- disabled,
24488
+ disabled: disabled && !readOnly,
24489
+ readOnly,
24309
24490
  rows: 3,
24310
24491
  onChange: (event) => setText(event.target.value),
24311
24492
  onBlur: () => {
24493
+ if (readOnly || disabled) return;
24312
24494
  const ids = [...new Set(text.split("\n").map((item) => item.trim()).filter(Boolean))];
24313
24495
  if (JSON.stringify(ids) != JSON.stringify(value)) onChange(ids.length == 0 ? void 0 : ids);
24314
24496
  }
@@ -25384,15 +25566,18 @@ function EventSourceSelect({ label, value, options, disabled, onChange, onOpen }
25384
25566
  })
25385
25567
  });
25386
25568
  }
25387
- function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLabels, config: assignments, nodeId, connectionId, disabled, store }) {
25569
+ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLabels, config: assignments, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
25570
+ const disabled = temporarilyDisabled || readOnly;
25571
+ const editor = readOnly ? void 0 : store;
25388
25572
  const config = triggerConfigValues(inputs, assignments);
25389
25573
  const t = useTranslate();
25390
25574
  const [attempt, setAttempt] = useState(0);
25391
25575
  const sourceId = typeof config.sourceId == "string" ? config.sourceId : "";
25392
- const flowId = store.$.flowId.value;
25576
+ const flowId = editor?.$.flowId.value;
25393
25577
  const key = JSON.stringify([flowId, nodeId]);
25394
25578
  const [state, setState] = useState();
25395
25579
  useEffect(() => {
25580
+ if (editor == null) return;
25396
25581
  const controller = new AbortController();
25397
25582
  setState((current) => current?.key == key ? {
25398
25583
  ...current,
@@ -25402,7 +25587,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25402
25587
  key,
25403
25588
  loading: true
25404
25589
  });
25405
- store.loadEventSources(controller.signal).then((result) => {
25590
+ editor.loadEventSources(controller.signal).then((result) => {
25406
25591
  if (!controller.signal.aborted) setState({
25407
25592
  key,
25408
25593
  ...result,
@@ -25421,24 +25606,24 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25421
25606
  });
25422
25607
  return () => controller.abort();
25423
25608
  }, [
25424
- store,
25609
+ editor,
25425
25610
  key,
25426
25611
  attempt
25427
25612
  ]);
25428
25613
  const sources = state?.key == key ? state.sources : void 0;
25429
25614
  const matchingSources = sources?.filter((source) => source.provider == provider && source.connectionId == connectionId);
25430
- const options = matchingSources?.map((source) => ({
25615
+ const options = readOnly ? sourceId ? [{
25616
+ value: sourceId,
25617
+ label: sourceId
25618
+ }] : [] : matchingSources?.map((source) => ({
25431
25619
  value: source.sourceId,
25432
25620
  label: source.name
25433
25621
  }));
25434
25622
  const failed = state?.key == key && state.failed;
25435
25623
  const loading = state?.key != key || state.loading == true;
25436
25624
  const selectedSource = matchingSources?.find((source) => source.sourceId == sourceId);
25437
- const eventOptions = selectedSource?.eventTypes.map((type) => ({
25438
- value: type,
25439
- label: type
25440
- }));
25441
25625
  const selectedEvents = Array.isArray(config.eventTypes) ? config.eventTypes.filter((value) => typeof value == "string") : [];
25626
+ const eventOptions = readOnly ? selectedEvents : selectedSource?.eventTypes;
25442
25627
  const visibleInputs = inputs.filter((input) => {
25443
25628
  if ("group" in input || input.handle === "sourceId" || input.handle === "eventTypes") return true;
25444
25629
  if (!sourceId) return false;
@@ -25447,22 +25632,23 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25447
25632
  return true;
25448
25633
  });
25449
25634
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
25635
+ readOnly,
25450
25636
  onReset: () => {
25451
- return store.nodes.resetTriggerConfig(nodeId);
25637
+ return editor?.nodes.resetTriggerConfig(nodeId);
25452
25638
  },
25453
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
25639
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
25454
25640
  inputs: visibleInputs,
25455
25641
  fieldLabels,
25456
25642
  config: assignments,
25457
25643
  disabled,
25458
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
25644
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
25459
25645
  renderEditor: (input) => input.handle === "sourceId" ? /* @__PURE__ */ jsxs("div", {
25460
25646
  className: "flex min-w-0 flex-col gap-2",
25461
25647
  children: [
25462
25648
  options == null ? /* @__PURE__ */ jsx("div", {
25463
25649
  className: "flex h-[30px] w-full items-center rounded-[var(--ui-control-radius,var(--ui-radius))] border border-input bg-[var(--ui-control-background,var(--ui-muted))] px-2 text-xs text-muted-foreground",
25464
25650
  children: t("eventSources.loading")
25465
- }) : options.length > 0 ? /* @__PURE__ */ jsx(EventSourceSelect, {
25651
+ }) : readOnly || options.length > 0 ? /* @__PURE__ */ jsx(EventSourceSelect, {
25466
25652
  label: fieldLabels?.sourceId ?? t("eventSources.source"),
25467
25653
  value: sourceId,
25468
25654
  options,
@@ -25470,12 +25656,12 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25470
25656
  onOpen: () => setAttempt((value) => value + 1),
25471
25657
  onChange: (value) => {
25472
25658
  const source = matchingSources?.find((item) => item.sourceId == value);
25473
- if (source != null) store.nodes.setTriggerEventSource(nodeId, source);
25659
+ if (source != null) editor?.nodes.setTriggerEventSource(nodeId, source);
25474
25660
  }
25475
- }) : /* @__PURE__ */ jsxs("div", {
25661
+ }) : editor != null ? /* @__PURE__ */ jsxs("div", {
25476
25662
  className: "flex h-[30px] w-full items-center overflow-hidden rounded-[var(--ui-control-radius,var(--ui-radius))] border border-input bg-[var(--ui-control-background,var(--ui-muted))]",
25477
25663
  children: [/* @__PURE__ */ jsx(CreateEventSourceDialog, {
25478
- notify: store.notify,
25664
+ notify: editor.notify,
25479
25665
  className: "min-w-0 flex-1",
25480
25666
  trigger: /* @__PURE__ */ jsx(Button$1, {
25481
25667
  type: "button",
@@ -25484,7 +25670,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25484
25670
  className: "h-full w-full justify-start rounded-none border-0 bg-transparent px-2"
25485
25671
  }),
25486
25672
  sourceKind: eventSourceKind(provider),
25487
- client: store.eventSourceClient,
25673
+ client: editor.eventSourceClient,
25488
25674
  teamId: state?.key == key ? state.teamId ?? null : null,
25489
25675
  existingNames: sources?.map((source) => source.name) ?? [],
25490
25676
  disabled: disabled || state?.key != key || state.teamId === void 0,
@@ -25492,8 +25678,8 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25492
25678
  ...current,
25493
25679
  sources: [...current.sources ?? [], source]
25494
25680
  } : current),
25495
- onSelect: async (source) => store.$.flowId.value == flowId && await store.nodes.setTriggerEventSource(nodeId, source)
25496
- }, JSON.stringify([store.$.flowId.value, nodeId])), /* @__PURE__ */ jsx(Button$1, {
25681
+ onSelect: async (source) => editor.$.flowId.value == flowId && await editor.nodes.setTriggerEventSource(nodeId, source)
25682
+ }, JSON.stringify([editor.$.flowId.value, nodeId])), /* @__PURE__ */ jsx(Button$1, {
25497
25683
  type: "button",
25498
25684
  size: "icon-xs",
25499
25685
  variant: "ghost",
@@ -25507,7 +25693,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25507
25693
  className: `i-lucide-light:refresh-cw ${loading ? "animate-spin motion-reduce:animate-none" : ""}`
25508
25694
  })
25509
25695
  })]
25510
- }),
25696
+ }) : null,
25511
25697
  sourceId && options != null && !options.some((option) => option.value == sourceId) && /* @__PURE__ */ jsx("p", {
25512
25698
  role: "alert",
25513
25699
  className: "text-sm text-destructive",
@@ -25519,14 +25705,15 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25519
25705
  children: t("eventSources.loadFailed")
25520
25706
  })
25521
25707
  ]
25522
- }) : input.handle === "eventTypes" && provider === "feishu_app_bot" ? sourceId ? /* @__PURE__ */ jsxs("div", {
25708
+ }) : input.handle === "eventTypes" && provider === "feishu_app_bot" ? sourceId || readOnly ? /* @__PURE__ */ jsxs("div", {
25523
25709
  className: "flex flex-col gap-2",
25524
25710
  children: [/* @__PURE__ */ jsx(FeishuEventPicker, {
25711
+ readOnly,
25525
25712
  value: selectedEvents,
25526
- allowedEvents: (eventOptions ?? []).map((option) => option.value),
25713
+ allowedEvents: eventOptions ?? [],
25527
25714
  disabled: disabled || eventOptions == null,
25528
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "eventTypes", value)
25529
- }), /* @__PURE__ */ jsx("p", {
25715
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "eventTypes", value)
25716
+ }), !readOnly && /* @__PURE__ */ jsx("p", {
25530
25717
  className: "m-0 text-xs text-muted-foreground",
25531
25718
  children: t("eventSources.sourceEventsHint")
25532
25719
  })]
@@ -25534,12 +25721,13 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
25534
25721
  className: "flex h-[30px] items-center rounded-[var(--ui-control-radius,var(--ui-radius))] border border-input bg-[var(--ui-control-background,var(--ui-muted))] px-2 text-xs text-muted-foreground",
25535
25722
  children: t("eventSources.selectSourceFirst")
25536
25723
  }) : input.handle === "chatIds" || input.handle === "resource" ? /* @__PURE__ */ jsx(FeishuEventFilters, {
25724
+ readOnly,
25537
25725
  field: input.handle,
25538
25726
  config,
25539
25727
  events: selectedEvents,
25540
25728
  managed: selectedSource?.manageSubscriptions ?? false,
25541
25729
  disabled: disabled || selectedSource == null,
25542
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value)
25730
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value)
25543
25731
  }) : void 0
25544
25732
  });
25545
25733
  }
@@ -25822,109 +26010,6 @@ function GeneralSettings({ title, children, disabled = false, readOnly = false,
25822
26010
  }, nodeId);
25823
26011
  }
25824
26012
  //#endregion
25825
- //#region src/workbench/browser/runtime/editor/httpParameterEditor.tsx
25826
- var expanded$2 = () => true;
25827
- var object = (value) => value != null && typeof value === "object" && !Array.isArray(value) ? value : {};
25828
- function HttpParameterEditor({ group, task, entries, disabled, readOnly, variables, renderSource, onEdit }) {
25829
- const t = useTranslate();
25830
- if (task.executor.kind !== "http-request") return null;
25831
- const parameters = task.executor[group];
25832
- const root = parameters.mode === "object" ? entries[group] : void 0;
25833
- const label = t(`httpRequest.${group}`);
25834
- const schema = group === "query" ? httpQuerySchema : httpHeaderSchema;
25835
- const handle = (name) => `${group === "query" ? "query" : "header"}.${name}`;
25836
- const values = parameters.mode === "fields" ? Object.fromEntries(parameters.names.map((name) => {
25837
- const value = entries[handle(name)]?.value;
25838
- return [name, value === void 0 ? "" : value];
25839
- })) : object(root?.value);
25840
- const input = (port, entry, name) => {
25841
- const upstream = renderSource(port.handle, port);
25842
- return {
25843
- embedded: true,
25844
- definition: port,
25845
- variables,
25846
- disabled,
25847
- readOnly,
25848
- variableName: entry?.variableName,
25849
- connected: entry?.connected ?? false,
25850
- upstream: upstream == null ? void 0 : {
25851
- ...upstream,
25852
- onChange: (source) => onEdit({
25853
- kind: "source",
25854
- source: {
25855
- kind: "node",
25856
- ...source
25857
- },
25858
- field: name,
25859
- fields: values
25860
- })
25861
- },
25862
- onVariable: (next) => {
25863
- if (next == null) onEdit({
25864
- kind: "fields",
25865
- value: name == null ? {} : {
25866
- ...values,
25867
- [name]: ""
25868
- },
25869
- field: name
25870
- });
25871
- else onEdit({
25872
- kind: "variable",
25873
- name: next,
25874
- field: name,
25875
- fields: values
25876
- });
25877
- }
25878
- };
25879
- };
25880
- return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(FieldTable, {
25881
- standalone: true,
25882
- layout: "values",
25883
- typeColumn: false,
25884
- columnHeadings: false,
25885
- actionSlots: 2,
25886
- children: /* @__PURE__ */ jsx(NodeInputValue, {
25887
- ...input({
25888
- handle: group,
25889
- jsonSchema: schema,
25890
- nullable: true
25891
- }, root),
25892
- label,
25893
- value: values,
25894
- onValue: (next) => onEdit({
25895
- kind: "fields",
25896
- value: object(next)
25897
- }),
25898
- presentation: {
25899
- valueOnly: true,
25900
- hideOptions: true,
25901
- hideValueTools: true,
25902
- hideChildTypes: true,
25903
- expansionPolicy: expanded$2,
25904
- validateObjectFieldName: (name, current) => group === "query" ? !!name.trim() && (name === current || !Object.hasOwn(values, name)) : httpHeaderNameIssue(name, Object.keys(values).filter((key) => key !== current)) == null,
25905
- renderObjectField: (name, props) => /* @__PURE__ */ jsx(NodeInputValue, {
25906
- ...input({
25907
- handle: handle(name),
25908
- jsonSchema: props.schema,
25909
- nullable: true
25910
- }, parameters.mode === "fields" ? entries[handle(name)] : void 0, name),
25911
- label: props.label,
25912
- value: parameters.mode === "fields" ? entries[handle(name)]?.value : values[name],
25913
- presentation: props,
25914
- onValue: (value) => onEdit({
25915
- kind: "fields",
25916
- value: {
25917
- ...values,
25918
- [name]: value ?? null
25919
- },
25920
- field: name
25921
- })
25922
- })
25923
- }
25924
- })
25925
- })] });
25926
- }
25927
- //#endregion
25928
26013
  //#region src/workbench/browser/runtime/editor/httpRequestSection.tsx
25929
26014
  function HttpRequestSection({ task, disabled, onSave, parameters, input }) {
25930
26015
  const t = useTranslate();
@@ -26095,7 +26180,8 @@ function HttpRequestSection({ task, disabled, onSave, parameters, input }) {
26095
26180
  }
26096
26181
  //#endregion
26097
26182
  //#region src/workbench/browser/runtime/editor/useTriggerConfigOptions.ts
26098
- function useTriggerConfigOptions(store, nodeId, field, scope, enabled) {
26183
+ function useTriggerConfigOptions(store, nodeId, field, scope, requested) {
26184
+ const enabled = store != null && requested;
26099
26185
  const [attempt, setAttempt] = useState(0);
26100
26186
  const key = JSON.stringify([
26101
26187
  nodeId,
@@ -26104,7 +26190,7 @@ function useTriggerConfigOptions(store, nodeId, field, scope, enabled) {
26104
26190
  ]);
26105
26191
  const [state, setState] = useState();
26106
26192
  useEffect(() => {
26107
- if (!enabled) return;
26193
+ if (!enabled || store == null) return;
26108
26194
  const controller = new AbortController();
26109
26195
  setState((current) => ({
26110
26196
  failed: false,
@@ -26220,12 +26306,15 @@ function TeamSelect({ disabled, missing, options, value, onChange }) {
26220
26306
  })]
26221
26307
  });
26222
26308
  }
26223
- function StatusSelect({ disabled, missing, options, selected, teamSelected, onChange }) {
26309
+ function StatusSelect({ disabled, readOnly = false, missing, options, selected, teamSelected, onChange }) {
26224
26310
  const t = useTranslate();
26225
26311
  const descriptionId = useId();
26226
26312
  const errorId = useId();
26227
26313
  const [container, setContainer] = useState(null);
26228
- const choices = [...options.options ?? [], ...missing.map((value) => ({
26314
+ const choices = readOnly ? selected.map((value) => options.options?.find((item) => item.value == value) ?? {
26315
+ label: value,
26316
+ value
26317
+ }) : [...options.options ?? [], ...missing.map((value) => ({
26229
26318
  label: t("linearTrigger.unavailableStatus", { id: value }),
26230
26319
  value
26231
26320
  }))];
@@ -26247,7 +26336,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
26247
26336
  }),
26248
26337
  /* @__PURE__ */ jsxs(DropdownMenu, {
26249
26338
  onOpenChange: (open) => {
26250
- if (open) options.refresh();
26339
+ if (open && !readOnly) options.refresh();
26251
26340
  },
26252
26341
  children: [/* @__PURE__ */ jsxs(DropdownMenuTrigger, {
26253
26342
  render: /* @__PURE__ */ jsx(Button$1, {
@@ -26257,7 +26346,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
26257
26346
  className: "w-full min-w-0 justify-between",
26258
26347
  "data-field-control": true,
26259
26348
  "data-field-prompt": missing.length > 0 || void 0,
26260
- disabled,
26349
+ disabled: disabled && !readOnly,
26261
26350
  size: "field",
26262
26351
  title: missing.length > 0 ? t("linearTrigger.missingStatuses") : t("linearTrigger.statusHint"),
26263
26352
  type: "button",
@@ -26287,6 +26376,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
26287
26376
  const unavailable = missing.includes(item.value);
26288
26377
  return /* @__PURE__ */ jsxs(DropdownMenuCheckboxItem, {
26289
26378
  checked,
26379
+ disabled: readOnly,
26290
26380
  className: `mt-1 first-of-type:mt-0 min-h-7 rounded-[var(--ui-control-radius,var(--ui-radius))] py-1 text-xs leading-5 font-normal ${unavailable ? "text-destructive" : ""}`,
26291
26381
  onCheckedChange: (next) => onChange(next ? [...selected, item.value] : selected.filter((value) => value != item.value)),
26292
26382
  children: ["color" in item && item.color != null && /* @__PURE__ */ jsx("span", {
@@ -26325,33 +26415,37 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
26325
26415
  ]
26326
26416
  });
26327
26417
  }
26328
- function LinearTriggerConfig({ inputs, fieldLabels, config: assignments, nodeId, connectionId, disabled, store }) {
26418
+ function LinearTriggerConfig({ inputs, fieldLabels, config: assignments, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
26419
+ const disabled = readOnly || temporarilyDisabled;
26420
+ const editor = readOnly ? void 0 : store;
26329
26421
  const config = triggerConfigValues(inputs, assignments);
26330
26422
  const teamId = typeof config.teamId == "string" ? config.teamId : void 0;
26331
26423
  const selected = Array.isArray(config.stateIds) ? config.stateIds.filter((id) => typeof id == "string") : [];
26332
- const scope = JSON.stringify([store.$.flowId.value, connectionId]);
26333
- const teams = useTriggerConfigOptions(store, nodeId, "teamId", scope, connectionId != null);
26334
- const states = useTriggerConfigOptions(store, nodeId, "stateIds", JSON.stringify([scope, teamId]), connectionId != null && teamId != null);
26424
+ const scope = JSON.stringify([editor?.$.flowId.value, connectionId]);
26425
+ const teams = useTriggerConfigOptions(editor, nodeId, "teamId", scope, connectionId != null);
26426
+ const states = useTriggerConfigOptions(editor, nodeId, "stateIds", JSON.stringify([scope, teamId]), connectionId != null && teamId != null);
26335
26427
  const missingTeam = teamId != null && teams.options != null && !teams.options.some((item) => item.value == teamId);
26336
26428
  const missingStates = states.options == null ? [] : selected.filter((id) => !states.options.some((item) => item.value == id));
26337
26429
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
26338
- onReset: () => store.nodes.resetTriggerConfig(nodeId),
26339
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
26430
+ readOnly,
26431
+ onReset: () => editor?.nodes.resetTriggerConfig(nodeId),
26432
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
26340
26433
  inputs,
26341
26434
  fieldLabels,
26342
26435
  config: assignments,
26343
26436
  disabled,
26344
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
26437
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
26345
26438
  renderEditor: (input) => input.handle === "teamId" ? /* @__PURE__ */ jsx(TeamSelect, {
26346
26439
  disabled: disabled || connectionId == null,
26347
26440
  missing: missingTeam,
26348
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "teamId", value),
26441
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "teamId", value),
26349
26442
  options: teams,
26350
26443
  value: teamId
26351
26444
  }) : input.handle === "stateIds" ? /* @__PURE__ */ jsx(StatusSelect, {
26445
+ readOnly,
26352
26446
  disabled: disabled || connectionId == null || teamId == null || missingTeam,
26353
26447
  missing: missingStates,
26354
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "stateIds", value),
26448
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "stateIds", value),
26355
26449
  options: states,
26356
26450
  selected,
26357
26451
  teamSelected: teamId != null
@@ -26972,6 +27066,106 @@ function presentProviderOutputDescription(node, output, description, display) {
26972
27066
  return display?.outputs[output] ?? description;
26973
27067
  }
26974
27068
  //#endregion
27069
+ //#region src/workbench/browser/runtime/editor/requestParameterEditor.tsx
27070
+ var expanded$2 = () => true;
27071
+ var object = (value) => value != null && typeof value === "object" && !Array.isArray(value) ? value : {};
27072
+ function RequestParameterEditor({ group, parameters, schema, entries, disabled, readOnly, variables, renderSource, onEdit }) {
27073
+ const t = useTranslate();
27074
+ const root = parameters.mode === "object" ? entries[group] : void 0;
27075
+ const label = t(`httpRequest.${group}`);
27076
+ const handle = (name) => `${group === "query" ? "query" : "header"}.${name}`;
27077
+ const values = parameters.mode === "fields" ? Object.fromEntries(parameters.names.map((name) => {
27078
+ const value = entries[handle(name)]?.value;
27079
+ return [name, value === void 0 ? "" : value];
27080
+ })) : object(root?.value);
27081
+ const input = (port, entry, name) => {
27082
+ const upstream = renderSource(port.handle, port);
27083
+ return {
27084
+ embedded: true,
27085
+ definition: port,
27086
+ variables,
27087
+ disabled,
27088
+ readOnly,
27089
+ variableName: entry?.variableName,
27090
+ connected: entry?.connected ?? false,
27091
+ upstream: upstream == null ? void 0 : {
27092
+ ...upstream,
27093
+ onChange: (source) => onEdit({
27094
+ kind: "source",
27095
+ source: {
27096
+ kind: "node",
27097
+ ...source
27098
+ },
27099
+ field: name,
27100
+ fields: values
27101
+ })
27102
+ },
27103
+ onVariable: (next) => {
27104
+ if (next == null) onEdit({
27105
+ kind: "fields",
27106
+ value: name == null ? {} : {
27107
+ ...values,
27108
+ [name]: ""
27109
+ },
27110
+ field: name
27111
+ });
27112
+ else onEdit({
27113
+ kind: "variable",
27114
+ name: next,
27115
+ field: name,
27116
+ fields: values
27117
+ });
27118
+ }
27119
+ };
27120
+ };
27121
+ return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(FieldTable, {
27122
+ standalone: true,
27123
+ layout: "values",
27124
+ typeColumn: false,
27125
+ columnHeadings: false,
27126
+ actionSlots: 2,
27127
+ children: /* @__PURE__ */ jsx(NodeInputValue, {
27128
+ ...input({
27129
+ handle: group,
27130
+ jsonSchema: schema,
27131
+ nullable: true
27132
+ }, root),
27133
+ label,
27134
+ value: values,
27135
+ onValue: (next) => onEdit({
27136
+ kind: "fields",
27137
+ value: object(next)
27138
+ }),
27139
+ presentation: {
27140
+ valueOnly: true,
27141
+ hideOptions: true,
27142
+ hideValueTools: true,
27143
+ hideChildTypes: true,
27144
+ expansionPolicy: expanded$2,
27145
+ validateObjectFieldName: (name, current) => group === "query" ? !!name.trim() && (name === current || !Object.hasOwn(values, name)) : httpHeaderNameIssue(name, Object.keys(values).filter((key) => key !== current)) == null,
27146
+ renderObjectField: (name, props) => /* @__PURE__ */ jsx(NodeInputValue, {
27147
+ ...input({
27148
+ handle: handle(name),
27149
+ jsonSchema: props.schema,
27150
+ nullable: true
27151
+ }, parameters.mode === "fields" ? entries[handle(name)] : void 0, name),
27152
+ label: props.label,
27153
+ value: parameters.mode === "fields" ? entries[handle(name)]?.value : values[name],
27154
+ presentation: props,
27155
+ onValue: (value) => onEdit({
27156
+ kind: "fields",
27157
+ value: {
27158
+ ...values,
27159
+ [name]: value ?? null
27160
+ },
27161
+ field: name
27162
+ })
27163
+ })
27164
+ }
27165
+ })
27166
+ })] });
27167
+ }
27168
+ //#endregion
26975
27169
  //#region src/workbench/browser/runtime/editor/timeZoneSelect.tsx
26976
27170
  function TimeZoneSelect({ id, value, disabled, label, onChange, at = /* @__PURE__ */ new Date() }) {
26977
27171
  const t = useTranslate();
@@ -27406,24 +27600,27 @@ function SkipDuplicatesSection({ task, disabled, onSave, history }) {
27406
27600
  }
27407
27601
  //#endregion
27408
27602
  //#region src/workbench/browser/runtime/editor/tallyTriggerConfig.tsx
27409
- function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId, disabled, store }) {
27603
+ function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
27604
+ const disabled = readOnly || temporarilyDisabled;
27605
+ const editor = readOnly ? void 0 : store;
27410
27606
  const t = useTranslate();
27411
27607
  const values = triggerConfigValues(inputs, config);
27412
27608
  const formId = typeof values.formId == "string" ? values.formId : void 0;
27413
- const forms = useTriggerConfigOptions(store, nodeId, "formId", JSON.stringify([store.$.flowId.value, connectionId]), connectionId != null);
27609
+ const forms = useTriggerConfigOptions(editor, nodeId, "formId", JSON.stringify([editor?.$.flowId.value, connectionId]), connectionId != null);
27414
27610
  const missing = formId != null && forms.options != null && !forms.options.some((item) => item.value == formId);
27415
27611
  const items = [...forms.options ?? [], ...formId != null && !forms.options?.some((item) => item.value == formId) ? [{
27416
27612
  value: formId,
27417
27613
  label: formId
27418
27614
  }] : []];
27419
27615
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
27616
+ readOnly,
27420
27617
  inputs,
27421
27618
  fieldLabels,
27422
27619
  config,
27423
27620
  disabled,
27424
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
27425
- onReset: () => store.nodes.resetTriggerConfig(nodeId),
27426
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
27621
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
27622
+ onReset: () => editor?.nodes.resetTriggerConfig(nodeId),
27623
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
27427
27624
  renderEditor: (input) => input.handle == "formId" ? /* @__PURE__ */ jsxs("div", {
27428
27625
  className: "min-w-0",
27429
27626
  children: [
@@ -27435,7 +27632,7 @@ function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId,
27435
27632
  if (open) forms.refresh();
27436
27633
  },
27437
27634
  onValueChange: (value) => {
27438
- if (typeof value == "string") store.nodes.saveTriggerConfig(nodeId, "formId", value);
27635
+ if (typeof value == "string") editor?.nodes.saveTriggerConfig(nodeId, "formId", value);
27439
27636
  },
27440
27637
  children: [/* @__PURE__ */ jsx(SelectTrigger, {
27441
27638
  "aria-label": t("tallyTrigger.form"),
@@ -28677,7 +28874,7 @@ function inspectorIcon(node) {
28677
28874
  if (node.definition.executor.kind == "decision") return "decision";
28678
28875
  if (node.definition.executor.kind == "workflow") return "flow";
28679
28876
  if (node.definition.executor.kind == "openapi" || node.definition.executor.kind == "http-request" || node.definition.executor.kind == "skip-duplicates") return "task";
28680
- return node.definition.executor.kind == "connector" ? "connection" : "llm";
28877
+ return node.definition.executor.kind == "connector" || node.definition.executor.kind === "connector-proxy" ? "connection" : "llm";
28681
28878
  }
28682
28879
  return "task";
28683
28880
  }
@@ -28711,6 +28908,7 @@ function nodePurposePlaceholder(selection, t, action, displays) {
28711
28908
  case "workflow": return t("workflow.description");
28712
28909
  case "skip-duplicates": return;
28713
28910
  case "http-request": return t("httpRequest.description");
28911
+ case "connector-proxy": return t("connectorProxy.description");
28714
28912
  case "openapi": return t("openapi.description");
28715
28913
  case "connector": return action?.description;
28716
28914
  case "llm": return t(definition.executor.mode == "json" ? "addNode.llmStructuredDescription" : "addNode.llmChatDescription");
@@ -28762,7 +28960,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28762
28960
  loading: false,
28763
28961
  names: [],
28764
28962
  onOpen: void 0
28765
- }, readOnly = false, connectorAction, connectorActionError, connectorAccessError, connectorAuthorizationPending = false, connectorConnection, connectorConnectionError, activeConnectorConnections, connectorProviders, connectors: liveConnectors, connectorAccess, connectorCandidates, onConfigureConnectorAccess, prepareConnectorAction, connectorLoading = false, disabled: temporarilyDisabled = false, diagnostics, focus, revision, selection, sourceNodeIcons, store: writableStore, theme, triggerActiveConnections, triggerAuthorizationPending = false, triggerConnection, triggerConnectionError, triggerConnectionLoading = false, triggerDisplays, triggers: liveTriggers }) {
28963
+ }, readOnly = false, connectorAction, connectorProvider, connectorActionError, connectorAccessError, connectorAuthorizationPending = false, connectorConnection, connectorConnectionError, activeConnectorConnections, connectorProviders, connectors: liveConnectors, connectorAccess, connectorCandidates, onConfigureConnectorAccess, prepareConnectorAction, connectorLoading = false, disabled: temporarilyDisabled = false, diagnostics, focus, revision, selection, sourceNodeIcons, store: writableStore, theme, triggerActiveConnections, triggerAuthorizationPending = false, triggerConnection, triggerConnectionError, triggerConnectionLoading = false, triggerDisplays, triggers: liveTriggers }) {
28766
28964
  const store = readOnly ? void 0 : writableStore;
28767
28965
  const connectors = readOnly ? void 0 : liveConnectors;
28768
28966
  const triggers = readOnly ? void 0 : liveTriggers;
@@ -28784,6 +28982,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28784
28982
  const isAgent = task != null && "executor" in task && task.executor.kind == "agent";
28785
28983
  const isDecision = task != null && "executor" in task && task.executor.kind == "decision";
28786
28984
  const isHttpRequest = task != null && "executor" in task && task.executor.kind == "http-request";
28985
+ const proxy = task != null && "executor" in task && task.executor.kind === "connector-proxy" ? task.executor : void 0;
28986
+ const proxyProvider = proxy == null ? void 0 : connectorProvider ?? connectorProviders?.[proxy.providerId];
28787
28987
  const isOpenApi = task != null && "executor" in task && task.executor.kind == "openapi";
28788
28988
  const unconfiguredWorkflow = task != null && "executor" in task && task.executor.kind == "workflow" && !task.executor.flowId;
28789
28989
  const unconfiguredOpenApi = task != null && "executor" in task && task.executor.kind == "openapi" && !task.executor.path;
@@ -28826,6 +29026,98 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28826
29026
  selection?.id,
28827
29027
  selection?.kind
28828
29028
  ]);
29029
+ const requestInput = (handle, label) => {
29030
+ if (selection?.kind !== "task" || task == null) return null;
29031
+ const proxyBody = proxy != null && handle === "body";
29032
+ const definition = task.inputs.find((port) => "handle" in port && port.handle === handle) ?? (proxyBody ? connectorProxyBodyInput : void 0);
29033
+ if (definition == null) return null;
29034
+ const mapping = revision.inputMappings(selection.node)[handle];
29035
+ const source = mapping?.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
29036
+ const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
29037
+ const input = /* @__PURE__ */ jsx(NodeInputValue, {
29038
+ embedded: true,
29039
+ definition,
29040
+ label,
29041
+ presentation: {
29042
+ compact: !proxyBody,
29043
+ hideOptions: true,
29044
+ ...proxyBody ? {
29045
+ layout: "values",
29046
+ valueOnly: true,
29047
+ hideChildTypes: true,
29048
+ defaultEditor: "object",
29049
+ expansionPolicy: () => true,
29050
+ unset: {
29051
+ label: t(readOnly ? "valueEditor.unset" : "valueEditor.setValue"),
29052
+ required: false
29053
+ }
29054
+ } : {}
29055
+ },
29056
+ sourceOnly: handle.startsWith("auth."),
29057
+ readOnly,
29058
+ disabled,
29059
+ value: inputValue(mapping, definition.value),
29060
+ connected: mapping?.kind === "sources" && binding?.kind !== "variable",
29061
+ variableName: binding?.kind === "variable" ? binding.target : void 0,
29062
+ upstream: inputUpstreamSources({
29063
+ revision,
29064
+ sourceNodeIcons,
29065
+ selection,
29066
+ store,
29067
+ handleName: handle,
29068
+ port: definition,
29069
+ t,
29070
+ triggerDisplays
29071
+ }),
29072
+ variables,
29073
+ onValue: (value, deletion) => {
29074
+ store?.nodes.setInputValue(selection.id, handle, value, deletion);
29075
+ },
29076
+ onVariable: (name) => {
29077
+ store?.nodes.setInputVariable(selection.id, handle, name);
29078
+ },
29079
+ onReset: proxyBody && definition.value !== void 0 ? () => void store?.nodes.resetInputs(selection.id, [handle]) : void 0
29080
+ });
29081
+ return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), proxyBody ? /* @__PURE__ */ jsx(FieldTable, {
29082
+ standalone: true,
29083
+ layout: "values",
29084
+ typeColumn: false,
29085
+ columnHeadings: false,
29086
+ actionSlots: 2,
29087
+ children: input
29088
+ }) : input] }, handle);
29089
+ };
29090
+ const requestExecutor = task != null && "executor" in task && (task.executor.kind === "http-request" || task.executor.kind === "connector-proxy") ? task.executor : void 0;
29091
+ const requestParameters = requestExecutor != null && selection?.kind === "task" && ["query", "headers"].map((group) => /* @__PURE__ */ jsx(RequestParameterEditor, {
29092
+ group,
29093
+ parameters: requestExecutor[group],
29094
+ schema: proxy != null ? group === "query" ? connectorProxyQuerySchema : connectorProxyHeaderSchema : group === "query" ? httpQuerySchema : httpHeaderSchema,
29095
+ entries: Object.fromEntries(Object.entries(revision.inputMappings(selection.node)).map(([handle, mapping]) => {
29096
+ const source = mapping.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
29097
+ const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
29098
+ return [handle, {
29099
+ value: inputValue(mapping, void 0),
29100
+ connected: mapping.kind === "sources" && binding?.kind !== "variable",
29101
+ variableName: binding?.kind === "variable" ? binding.target : void 0
29102
+ }];
29103
+ })),
29104
+ variables,
29105
+ disabled,
29106
+ readOnly,
29107
+ renderSource: (handleName, port) => inputUpstreamSources({
29108
+ revision,
29109
+ sourceNodeIcons,
29110
+ selection,
29111
+ store,
29112
+ handleName,
29113
+ port,
29114
+ t,
29115
+ triggerDisplays
29116
+ }),
29117
+ onEdit: (edit) => {
29118
+ store?.nodes.saveRequestParameters(selection.id, group, edit);
29119
+ }
29120
+ }, group));
28829
29121
  const panel = /* @__PURE__ */ jsx(ScrollArea, {
28830
29122
  className: "inspector-scroll",
28831
29123
  tabIndex: -1,
@@ -28835,13 +29127,14 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28835
29127
  children: [
28836
29128
  selection?.kind === "trigger" && selection.trigger.kind === "webhook" && webhookDeployment != null && /* @__PURE__ */ jsx(WebhookDeployment, { ...webhookDeployment }, selection.id),
28837
29129
  readOnly && connector != null && /* @__PURE__ */ jsx(SavedConnectionReference, {
28838
- action: connector.action,
28839
- connectionId: connector.connectionId
29130
+ noSetup: connectorAction?.authenticated === false || connectorProviders?.[connector.action.split(".")[0]]?.noSetup,
29131
+ connectionId: proxy?.connectionId ?? connector?.connectionId
28840
29132
  }),
28841
- readOnly && selection?.kind === "trigger" && (selection.trigger.kind === "poll" || selection.trigger.kind === "integration") && /* @__PURE__ */ jsx(SavedConnectionReference, {
28842
- action: selection.trigger.definition.key,
28843
- connectionId: selection.trigger.connectionId
29133
+ readOnly && proxy != null && /* @__PURE__ */ jsx(SavedConnectionReference, {
29134
+ noSetup: proxyProvider?.noSetup,
29135
+ connectionId: proxy.connectionId
28844
29136
  }),
29137
+ readOnly && selection?.kind === "trigger" && (selection.trigger.kind === "poll" || selection.trigger.kind === "integration") && /* @__PURE__ */ jsx(SavedConnectionReference, { connectionId: selection.trigger.connectionId }),
28845
29138
  !readOnly && triggers != null && selection?.kind == "trigger" && /* @__PURE__ */ jsx(TriggerConnection, {
28846
29139
  activeConnections: triggerActiveConnections,
28847
29140
  authorizationPending: triggerAuthorizationPending,
@@ -28853,17 +29146,17 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28853
29146
  triggers,
28854
29147
  onConfigureAccess: (providerId) => void triggers.connect(providerId)
28855
29148
  }),
28856
- !readOnly && connectors != null && connector != null && nodeId != null && connectorAction?.authenticated !== false && /* @__PURE__ */ jsx(ConnectorAccount, {
28857
- action: connectorAction,
29149
+ !readOnly && connectors != null && (connector != null || proxy != null) && nodeId != null && (proxy != null ? proxyProvider?.noSetup !== true : connectorAction?.authenticated !== false) && /* @__PURE__ */ jsx(ConnectorAccount, {
29150
+ resource: proxy != null ? proxyProvider : connectorAction,
28858
29151
  actionError: connectorActionError,
28859
29152
  accessError: connectorAccessError,
28860
- actionId: connector.action,
28861
- onConfigureAccess: () => void connectors.connect(connectorAction?.serviceId ?? connector.action.split(".")[0]),
29153
+ actionId: proxy?.providerId ?? connector.action,
29154
+ onConfigureAccess: () => void connectors.connect(proxy?.providerId ?? connectorAction?.serviceId ?? connector.action.split(".")[0]),
28862
29155
  activeConnections: activeConnectorConnections,
28863
29156
  authorizationPending: connectorAuthorizationPending,
28864
29157
  connection: connectorConnection,
28865
29158
  connectionError: connectorConnectionError,
28866
- connectionId: connector.connectionId,
29159
+ connectionId: proxy?.connectionId ?? connector?.connectionId,
28867
29160
  connectors,
28868
29161
  disabled,
28869
29162
  fieldIdPrefix: `task-${selection?.id}`,
@@ -28888,6 +29181,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28888
29181
  isAgent && /* @__PURE__ */ jsx(AgentPrompt, {}),
28889
29182
  selection?.kind === "task" && selection.module != null && /* @__PURE__ */ jsx(CodeTaskSection, {
28890
29183
  readOnly,
29184
+ providers: connectorProviders,
28891
29185
  connectorAccess,
28892
29186
  connectorCandidates,
28893
29187
  onConfigureAccess: onConfigureConnectorAccess == null ? void 0 : () => onConfigureConnectorAccess(),
@@ -28900,7 +29194,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28900
29194
  store,
28901
29195
  theme
28902
29196
  }),
28903
- selection?.kind === "trigger" && (selection.trigger.kind === "integration" || selection.trigger.kind === "poll") && (!readOnly && store != null && [
29197
+ selection?.kind === "trigger" && (selection.trigger.kind === "integration" || selection.trigger.kind === "poll") && ([
28904
29198
  "feishu.on_event",
28905
29199
  "feishu_app_bot.on_event",
28906
29200
  "slackbot.on_event",
@@ -28910,6 +29204,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28910
29204
  "fireflies.on_meeting_ready",
28911
29205
  "jira.on_issue_event"
28912
29206
  ].includes(selection.trigger.definition.key) ? /* @__PURE__ */ jsx(EventSourceTriggerConfig, {
29207
+ readOnly,
28913
29208
  provider: selection.trigger.definition.provider === "slackbot" ? "slackbot" : selection.trigger.definition.provider === "intercom" ? "intercom" : selection.trigger.definition.provider === "sentry" ? "sentry" : selection.trigger.definition.provider === "zoom" ? "zoom" : selection.trigger.definition.provider === "fireflies" ? "fireflies" : selection.trigger.definition.provider === "jira" ? "jira" : "feishu_app_bot",
28914
29209
  inputs: providerConfigInputs,
28915
29210
  fieldLabels: providerDisplay?.configInputLabels,
@@ -28918,7 +29213,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28918
29213
  connectionId: selection.trigger.connectionId,
28919
29214
  disabled,
28920
29215
  store
28921
- }) : !readOnly && store != null && selection.trigger.definition.key === "linear.on_issue_changed" ? /* @__PURE__ */ jsx(LinearTriggerConfig, {
29216
+ }) : selection.trigger.definition.key === "linear.on_issue_changed" ? /* @__PURE__ */ jsx(LinearTriggerConfig, {
29217
+ readOnly,
28922
29218
  inputs: providerConfigInputs,
28923
29219
  fieldLabels: providerDisplay?.configInputLabels,
28924
29220
  config: selection.trigger.config,
@@ -28926,7 +29222,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
28926
29222
  connectionId: selection.trigger.connectionId,
28927
29223
  disabled,
28928
29224
  store
28929
- }) : !readOnly && store != null && selection.trigger.definition.key === "tally.on_form_response" ? /* @__PURE__ */ jsx(TallyTriggerConfig, {
29225
+ }) : selection.trigger.definition.key === "tally.on_form_response" ? /* @__PURE__ */ jsx(TallyTriggerConfig, {
29226
+ readOnly,
28930
29227
  inputs: providerConfigInputs,
28931
29228
  fieldLabels: providerDisplay?.configInputLabels,
28932
29229
  config: selection.trigger.config,
@@ -29061,74 +29358,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
29061
29358
  isHttpRequest && task != null && "executor" in task && /* @__PURE__ */ jsx(HttpRequestSection, {
29062
29359
  task,
29063
29360
  disabled,
29064
- input: (handle, label) => {
29065
- if (selection?.kind !== "task") return null;
29066
- const definition = task.inputs.find((port) => "handle" in port && port.handle === handle);
29067
- if (definition == null) return null;
29068
- const mapping = revision.inputMappings(selection.node)[handle];
29069
- const source = mapping?.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
29070
- const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
29071
- return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(NodeInputValue, {
29072
- embedded: true,
29073
- definition,
29074
- label,
29075
- presentation: {
29076
- compact: true,
29077
- hideOptions: true
29078
- },
29079
- sourceOnly: handle.startsWith("auth."),
29080
- readOnly,
29081
- disabled,
29082
- value: inputValue(mapping, definition.value),
29083
- connected: mapping?.kind === "sources" && binding?.kind !== "variable",
29084
- variableName: binding?.kind === "variable" ? binding.target : void 0,
29085
- upstream: inputUpstreamSources({
29086
- revision,
29087
- sourceNodeIcons,
29088
- selection,
29089
- store,
29090
- handleName: handle,
29091
- t,
29092
- triggerDisplays
29093
- }),
29094
- variables,
29095
- onValue: (value, deletion) => {
29096
- store?.nodes.setInputValue(selection.id, handle, value, deletion);
29097
- },
29098
- onVariable: (name) => {
29099
- store?.nodes.setInputVariable(selection.id, handle, name);
29100
- }
29101
- })] }, handle);
29102
- },
29103
- parameters: selection?.kind === "task" && ["query", "headers"].map((group) => /* @__PURE__ */ jsx(HttpParameterEditor, {
29104
- group,
29105
- task,
29106
- entries: Object.fromEntries(Object.entries(revision.inputMappings(selection.node)).map(([handle, mapping]) => {
29107
- const source = mapping.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
29108
- const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
29109
- return [handle, {
29110
- value: inputValue(mapping, void 0),
29111
- connected: mapping.kind === "sources" && binding?.kind !== "variable",
29112
- variableName: binding?.kind === "variable" ? binding.target : void 0
29113
- }];
29114
- })),
29115
- variables,
29116
- disabled,
29117
- readOnly,
29118
- renderSource: (handleName, port) => inputUpstreamSources({
29119
- revision,
29120
- sourceNodeIcons,
29121
- selection,
29122
- store,
29123
- handleName,
29124
- port,
29125
- t,
29126
- triggerDisplays
29127
- }),
29128
- onEdit: (edit) => {
29129
- store?.nodes.saveHttpParameters(selection.id, group, edit);
29130
- }
29131
- }, group)),
29361
+ input: requestInput,
29362
+ parameters: requestParameters,
29132
29363
  onSave: (before, value) => store?.nodes.saveTaskSettings(selection.id, {
29133
29364
  kind: "http-request",
29134
29365
  name: task.name,
@@ -29136,6 +29367,21 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
29136
29367
  task: value
29137
29368
  }) ?? Promise.resolve(false)
29138
29369
  }, `http:${selection?.id}`),
29370
+ proxy != null && task != null && "executor" in task && /* @__PURE__ */ jsx(ConnectorProxySection, {
29371
+ task,
29372
+ disabled,
29373
+ readOnly,
29374
+ hasBody: selection?.kind === "task" && connectorProxyHasBody(revision.inputMappings(selection.node).body, task.inputs.find((port) => "handle" in port && port.handle === "body")?.value),
29375
+ input: requestInput,
29376
+ parameters: requestParameters,
29377
+ onClearBody: () => store?.nodes.setInputValue(selection.id, "body", void 0) ?? Promise.resolve(false),
29378
+ onSave: (before, value) => store?.nodes.saveTaskSettings(selection.id, {
29379
+ kind: "connector-proxy",
29380
+ name: task.name,
29381
+ before,
29382
+ task: value
29383
+ }) ?? Promise.resolve(false)
29384
+ }, `proxy:${selection?.id}`),
29139
29385
  isOpenApi && task != null && "executor" in task && /* @__PURE__ */ jsx(OpenApiSection, {
29140
29386
  task,
29141
29387
  credentials: (onInvalidChange) => selection?.kind === "task" && task.inputs.filter((port) => "handle" in port && port.handle.startsWith("auth.")).map((definition) => {
@@ -29184,7 +29430,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
29184
29430
  task: value
29185
29431
  }) ?? Promise.resolve(false)
29186
29432
  }, `openapi:${selection?.id}`),
29187
- !isHttpRequest && !unconfiguredOpenApi && !unconfiguredWorkflow && (selection?.kind === "outputs" || selection?.kind === "approval" || selection?.kind === "wait" || selection?.kind === "task") && (() => {
29433
+ !isHttpRequest && proxy == null && !unconfiguredOpenApi && !unconfiguredWorkflow && (selection?.kind === "outputs" || selection?.kind === "approval" || selection?.kind === "wait" || selection?.kind === "task") && (() => {
29188
29434
  const definitions = selection.kind === "outputs" ? [...selection.node.outputDefs] : selection.kind === "task" ? [...selection.definition?.inputs ?? []] : [...selection.node.inputDefinitions];
29189
29435
  const handles = new Set(definitions.flatMap((definition) => "handle" in definition ? [definition.handle] : []));
29190
29436
  for (const handle of Object.keys(revision.inputMappings(selection.node))) if (!handles.has(handle) && !(selection.kind === "task" && selection.node.additionalInputs?.some((port) => port.handle === handle))) definitions.push({
@@ -29349,7 +29595,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
29349
29595
  readOnly,
29350
29596
  groups: true,
29351
29597
  layout: "ports",
29352
- title: t(isHttpRequest ? "httpRequest.responseOutputs" : "inspector.ports.outputsTitle"),
29598
+ title: t(isHttpRequest || proxy != null ? "httpRequest.responseOutputs" : "inspector.ports.outputsTitle"),
29353
29599
  output: true,
29354
29600
  values: presentDecisionOutputs(selection.definition, t),
29355
29601
  disabled: disabled || !("moduleId" in selection.node.task || isAgent),
@@ -30453,6 +30699,882 @@ function PublicationActor({ actorId, store }) {
30453
30699
  });
30454
30700
  }
30455
30701
  //#endregion
30702
+ //#region src/trigger/providers/fieldDescriptions.ts
30703
+ var driveChangesConfig = {
30704
+ driveId: "Shared drive ID. Leave empty to monitor the connected account.",
30705
+ includeCorpusRemovals: "Include the accessible file resource when an item leaves the change corpus.",
30706
+ includeItemsFromAllDrives: "Include items from My Drive and shared drives.",
30707
+ includeRemoved: "Include changes caused by deletion or loss of access.",
30708
+ pageSize: "Maximum number of changes read per page.",
30709
+ restrictToMyDrive: "Restrict changes to the My Drive hierarchy."
30710
+ };
30711
+ var englishTriggerFieldDescriptions = {
30712
+ "jira.on_issue_event": {
30713
+ configInputs: {
30714
+ sourceId: "Event source",
30715
+ eventTypes: "Events"
30716
+ },
30717
+ outputs: {
30718
+ event: "Event type",
30719
+ deliveryId: "Notification ID",
30720
+ cloudId: "Cloud site ID",
30721
+ issueId: "Issue ID",
30722
+ body: "Original event"
30723
+ }
30724
+ },
30725
+ "fireflies.on_meeting_ready": {
30726
+ configInputs: {
30727
+ sourceId: "Event source",
30728
+ eventTypes: "Events"
30729
+ },
30730
+ outputs: {
30731
+ event: "Event type",
30732
+ deliveryId: "Notification ID",
30733
+ accountId: "Account ID",
30734
+ meetingId: "Meeting / transcript ID",
30735
+ body: "Original object"
30736
+ }
30737
+ },
30738
+ "zoom.on_recording_ready": {
30739
+ configInputs: {
30740
+ sourceId: "Event source",
30741
+ eventTypes: "Events"
30742
+ },
30743
+ outputs: {
30744
+ event: "Event type",
30745
+ deliveryId: "Notification ID",
30746
+ accountId: "Zoom account ID",
30747
+ meetingUuid: "Meeting instance UUID",
30748
+ body: "Original object"
30749
+ }
30750
+ },
30751
+ "sentry.on_issue_alert": {
30752
+ configInputs: {
30753
+ sourceId: "Event source",
30754
+ eventTypes: "Events",
30755
+ projectIds: "Project IDs; empty includes all projects in the installation.",
30756
+ ruleNames: "Exact alert rule labels; empty includes all rules."
30757
+ },
30758
+ outputs: {
30759
+ event: "Event type",
30760
+ deliveryId: "Notification ID",
30761
+ organizationId: "Organization ID",
30762
+ issueId: "Issue ID",
30763
+ body: "Original object"
30764
+ }
30765
+ },
30766
+ "intercom.on_conversation_event": {
30767
+ configInputs: {
30768
+ sourceId: "Event source",
30769
+ eventTypes: "Events"
30770
+ },
30771
+ outputs: {
30772
+ event: "Event type",
30773
+ deliveryId: "Notification ID",
30774
+ workspaceId: "Workspace ID",
30775
+ objectId: "Conversation or ticket ID",
30776
+ body: "Original object"
30777
+ }
30778
+ },
30779
+ "slackbot.on_event": {
30780
+ configInputs: {
30781
+ sourceId: "Event source",
30782
+ eventTypes: "Events",
30783
+ channelIds: "Channel IDs; empty means all source channels."
30784
+ },
30785
+ outputs: {
30786
+ event: "Event type",
30787
+ deliveryId: "Event ID",
30788
+ appId: "Slack app ID",
30789
+ teamId: "Workspace ID",
30790
+ channel: "Conversation ID",
30791
+ user: "User ID",
30792
+ text: "Message text",
30793
+ ts: "Message timestamp",
30794
+ threadTs: "Parent thread timestamp, when present.",
30795
+ body: "Original Slack event"
30796
+ }
30797
+ },
30798
+ "asana.on_task_event": {
30799
+ configInputs: {
30800
+ projectId: "Project ID",
30801
+ eventTypes: "Events",
30802
+ customFieldId: "Custom field ID"
30803
+ },
30804
+ outputs: {
30805
+ projectId: "Project ID",
30806
+ events: "Matching events in this delivery."
30807
+ }
30808
+ },
30809
+ "calendly.on_booking_event": {
30810
+ configInputs: {
30811
+ scope: "Scope",
30812
+ eventTypes: "Events"
30813
+ },
30814
+ outputs: {
30815
+ event: "Business event type.",
30816
+ inviteeUri: "Invitee URI",
30817
+ createdAt: "Event timestamp.",
30818
+ body: "Original event data."
30819
+ }
30820
+ },
30821
+ "clickup.on_task_event": {
30822
+ configInputs: {
30823
+ workspaceId: "Workspace ID",
30824
+ listId: "List ID",
30825
+ eventTypes: "Events"
30826
+ },
30827
+ outputs: {
30828
+ event: "Business event type.",
30829
+ taskId: "Task ID",
30830
+ body: "Original event data."
30831
+ }
30832
+ },
30833
+ "pandadoc.on_document_event": {
30834
+ configInputs: { completedOnly: "Completed documents only" },
30835
+ outputs: { events: "Matching events in this delivery." }
30836
+ },
30837
+ "pipedrive.on_crm_event": {
30838
+ configInputs: { eventType: "Event" },
30839
+ outputs: {
30840
+ event: "Business event type.",
30841
+ deliveryId: "Delivery ID",
30842
+ objectId: "Object ID",
30843
+ body: "Original event data."
30844
+ }
30845
+ },
30846
+ "resend.on_email_event": {
30847
+ configInputs: { eventTypes: "Events" },
30848
+ outputs: {
30849
+ event: "Business event type.",
30850
+ deliveryId: "Delivery ID",
30851
+ emailId: "Email ID",
30852
+ createdAt: "Event timestamp.",
30853
+ body: "Original event data."
30854
+ }
30855
+ },
30856
+ "typeform.on_form_response": {
30857
+ configInputs: { formId: "Form ID" },
30858
+ outputs: { response: "Submission identity, time and original answers with stable field identifiers." }
30859
+ },
30860
+ "vercel.on_deployment_event": {
30861
+ configInputs: {
30862
+ teamId: "Team ID",
30863
+ projectId: "Project ID",
30864
+ environment: "Environment"
30865
+ },
30866
+ outputs: {
30867
+ event: "Business event type.",
30868
+ deliveryId: "Delivery ID",
30869
+ deploymentId: "Deployment ID",
30870
+ projectId: "Project ID",
30871
+ body: "Original event data."
30872
+ }
30873
+ },
30874
+ "tally.on_form_response": {
30875
+ configInputs: { formId: "Select a form accessible to this connection." },
30876
+ outputs: { response: "Submission identity, time, and fields, preserving field keys, types, values, options, and file metadata." }
30877
+ },
30878
+ "feishu_app_bot.on_event": {
30879
+ configInputs: {
30880
+ sourceId: "Event source that receives events for this trigger.",
30881
+ eventTypes: "Feishu event types that trigger a Run.",
30882
+ chatIds: "Chat IDs to receive events from. Leave empty to receive events from every chat available to the source.",
30883
+ resource: "Optional document, calendar, or approval resource to subscribe to."
30884
+ },
30885
+ outputs: {
30886
+ event: "Feishu event type.",
30887
+ deliveryId: "Unique delivery ID for this event.",
30888
+ appId: "ID of the Feishu application that received the event.",
30889
+ tenantKey: "Key of the Feishu tenant that produced the event.",
30890
+ occurredAt: "Time when the event occurred, when supplied by Feishu.",
30891
+ body: "Original Feishu event payload."
30892
+ }
30893
+ },
30894
+ "airtable.on_record_changed": {
30895
+ configInputs: {
30896
+ baseId: "ID of the Airtable base to monitor.",
30897
+ fields: "Fields to include in each returned record. Leave empty to include every field.",
30898
+ formula: "Airtable formula used to filter records. Leave empty to include every record.",
30899
+ maxRecordsPerPoll: "Maximum number of records processed per poll.",
30900
+ tableIdOrName: "ID or name of the Airtable table to monitor.",
30901
+ triggerField: "Date or time field used to detect created or updated records.",
30902
+ view: "Airtable view used to filter and order records. Leave empty to use the table default."
30903
+ },
30904
+ outputs: { events: "Records created or updated since the previous poll." }
30905
+ },
30906
+ "gmail.on_message_received": {
30907
+ configInputs: {
30908
+ includeDrafts: "Also trigger on draft messages.",
30909
+ includeSpamAndTrash: "Also trigger on messages in Spam and Trash.",
30910
+ labelNamesOrIds: "Only trigger on messages carrying all of these labels, referenced by name or ID.",
30911
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
30912
+ readStatus: "Only trigger on read messages, unread messages, or both.",
30913
+ search: "Gmail search query that each message must match.",
30914
+ sender: "Only trigger on messages whose sender matches this address or name."
30915
+ },
30916
+ outputs: { events: "Messages received since the previous poll." }
30917
+ },
30918
+ "github.on_repo_event": {
30919
+ configInputs: {
30920
+ events: "GitHub webhook events that trigger a Run.",
30921
+ insecureSsl: "Allow GitHub to deliver webhooks without SSL certificate verification.",
30922
+ owner: "Owner of the GitHub repository.",
30923
+ repo: "Name of the GitHub repository."
30924
+ },
30925
+ outputs: {
30926
+ body: "Original GitHub webhook payload.",
30927
+ deliveryId: "Unique GitHub webhook delivery ID.",
30928
+ event: "GitHub webhook event name."
30929
+ }
30930
+ },
30931
+ "github.watch_pull_request": {
30932
+ configInputs: {
30933
+ owner: "Owner of the GitHub repository.",
30934
+ repo: "Name of the GitHub repository.",
30935
+ number: "Number of the pull request to watch."
30936
+ },
30937
+ outputs: {
30938
+ pullRequest: "Current pull request details after an observed change.",
30939
+ version: "Stable identifier for the observed pull request version."
30940
+ }
30941
+ },
30942
+ "gitlab.on_project_event": {
30943
+ configInputs: {
30944
+ events: "GitLab project events that trigger a Run.",
30945
+ insecureSsl: "Allow GitLab to deliver webhooks without SSL certificate verification.",
30946
+ project: "Numeric project ID or URL-encoded project path.",
30947
+ pushBranchFilter: "Branch or wildcard pattern used to filter push events. Leave empty to include every branch."
30948
+ },
30949
+ outputs: {
30950
+ body: "Original GitLab webhook payload.",
30951
+ deliveryId: "Unique ID generated for this webhook delivery.",
30952
+ event: "Normalized GitLab event name.",
30953
+ gitlabEvent: "Original GitLab event header value."
30954
+ }
30955
+ },
30956
+ "googlecalendar.on_event_changed": {
30957
+ configInputs: {
30958
+ calendarId: "ID of the Google Calendar to monitor.",
30959
+ changes: "Calendar event changes that trigger a Run.",
30960
+ matchTerm: "Text that must appear in the event summary, description, location, or attendees. Leave empty to match every event.",
30961
+ maxEventsPerPoll: "Maximum number of calendar events processed per poll."
30962
+ },
30963
+ outputs: { events: "Calendar events created, updated, or cancelled since the previous poll." }
30964
+ },
30965
+ "googledrive.changes_detected": {
30966
+ configInputs: driveChangesConfig,
30967
+ outputs: { events: "Google Drive changes available when the notification was received." }
30968
+ },
30969
+ "googledrive.watch_changes": {
30970
+ configInputs: driveChangesConfig,
30971
+ outputs: { events: "Google Drive changes observed by notifications or periodic scans." }
30972
+ },
30973
+ "googledrive.on_file_change": {
30974
+ configInputs: {
30975
+ changeType: "Whether created or updated items trigger a Run.",
30976
+ driveId: "Shared drive ID. Leave empty to use My Drive.",
30977
+ folderId: "ID of the Google Drive folder to monitor.",
30978
+ itemTypes: "Whether to monitor files, folders, or both.",
30979
+ maxFilesPerPoll: "Maximum number of changed items processed per poll.",
30980
+ mimeTypes: "Only trigger on these MIME types. Leave empty to include every MIME type.",
30981
+ namePrefix: "Only trigger on items whose names start with this text. Leave empty to include every name."
30982
+ },
30983
+ outputs: { events: "Files or folders created or updated since the previous poll." }
30984
+ },
30985
+ "googlesheets.on_row_added": {
30986
+ configInputs: {
30987
+ columnRange: "A1 column range to read, such as A:Z.",
30988
+ dateTimeRender: "How date and time values are returned.",
30989
+ firstDataRow: "First row containing data below the header.",
30990
+ headerRow: "Row whose cells become output field names.",
30991
+ maxRowsPerPoll: "Maximum number of new rows processed per poll.",
30992
+ sheet: "Name of the worksheet to monitor.",
30993
+ spreadsheetId: "ID of the Google Sheets spreadsheet.",
30994
+ valueRender: "How cell values are returned."
30995
+ },
30996
+ outputs: { events: "Rows appended since the previous poll." }
30997
+ },
30998
+ "linear.on_issue_changed": {
30999
+ configInputs: {
31000
+ teamId: "Linear Team UUID. Use Copy model UUID in Linear to find it.",
31001
+ stateIds: "Statuses from the selected Team. Leave empty for every status. Matches current status, not every transition into it."
31002
+ },
31003
+ outputs: { events: "Linear issues created or updated since the previous poll." }
31004
+ },
31005
+ "notion.on_database_page_event": {
31006
+ configInputs: {
31007
+ dataSourceId: "Data source ID within the database. Leave empty to use the primary data source.",
31008
+ databaseId: "ID of the Notion database to monitor.",
31009
+ events: "Page changes that trigger a Run.",
31010
+ includeProperties: "Include page properties in each output event.",
31011
+ maxItemsPerPoll: "Maximum number of changed pages processed per poll."
31012
+ },
31013
+ outputs: { events: "Database pages added or updated since the previous poll." }
31014
+ },
31015
+ "one_drive.on_item_changed": {
31016
+ configInputs: {
31017
+ events: "OneDrive item changes that trigger a Run.",
31018
+ itemId: "Only monitor this file or folder ID. Leave empty to monitor multiple items.",
31019
+ itemTypes: "Whether to monitor files, folders, or both.",
31020
+ maxItemsPerPoll: "Maximum number of changed items processed per poll.",
31021
+ parentFolderId: "Only monitor items in this parent folder. Leave empty to monitor the whole drive."
31022
+ },
31023
+ outputs: { events: "OneDrive items created, updated, or deleted since the previous poll." }
31024
+ },
31025
+ "outlook.on_message_received": {
31026
+ configInputs: {
31027
+ folder: "Well-known mail folder name, folder ID, or an empty value for the whole mailbox.",
31028
+ includeDrafts: "Also trigger on draft messages.",
31029
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
31030
+ readStatus: "Only trigger on read messages, unread messages, or both.",
31031
+ senderAddress: "Exact sender address. Leave empty to allow any sender.",
31032
+ subjectContains: "Case-insensitive text that must appear in the message subject.",
31033
+ withAttachmentsOnly: "Only trigger on messages that have attachments."
31034
+ },
31035
+ outputs: { events: "Outlook messages received since the previous poll." }
31036
+ },
31037
+ "shopify.on_shop_event": {
31038
+ configInputs: { topics: "Shopify webhook topics that trigger a Run." },
31039
+ outputs: {
31040
+ apiVersion: "Shopify API version used for the webhook.",
31041
+ body: "Original Shopify webhook payload.",
31042
+ eventId: "Unique Shopify event ID.",
31043
+ shopDomain: "Domain of the Shopify shop that produced the event.",
31044
+ topic: "Shopify webhook topic.",
31045
+ triggeredAt: "Time when Shopify triggered the webhook.",
31046
+ webhookId: "ID of the Shopify webhook subscription."
31047
+ }
31048
+ },
31049
+ "slack.on_message_posted": {
31050
+ configInputs: {
31051
+ channelId: "Slack conversation ID to watch, such as C0122KQ70S7E.",
31052
+ fromUserIds: "Only trigger on messages from these Slack user IDs. Leave empty to allow any author.",
31053
+ ignoreUserIds: "Never trigger on messages from these Slack user IDs.",
31054
+ includeBotMessages: "Also trigger on messages posted by bots and apps.",
31055
+ includeSystemMessages: "Also trigger on Slack system notices.",
31056
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
31057
+ textContains: "Only trigger when message text contains this string, ignoring case."
31058
+ },
31059
+ outputs: { events: "Slack messages posted since the previous poll." }
31060
+ },
31061
+ "stripe.on_event": {
31062
+ configInputs: {
31063
+ apiVersion: "Stripe API version used for webhook events. Leave empty to use the account default.",
31064
+ events: "Stripe event types that trigger a Run.",
31065
+ includeConnectedAccounts: "Also receive events from connected Stripe accounts."
31066
+ },
31067
+ outputs: {
31068
+ body: "Original Stripe event payload.",
31069
+ event: "Stripe event type.",
31070
+ eventId: "Unique Stripe event ID.",
31071
+ livemode: "Whether the event was created in live mode."
31072
+ }
31073
+ },
31074
+ "telegram.on_update": {
31075
+ configInputs: {
31076
+ chatIds: "Only accept updates from these numeric Telegram chat IDs. Leave empty to allow every chat.",
31077
+ dropPendingUpdates: "Discard updates queued before the webhook is created or resumed.",
31078
+ updates: "Telegram update types that trigger a Run. Use * for the Telegram default set.",
31079
+ userIds: "Only accept updates from these numeric Telegram user IDs. Leave empty to allow every user."
31080
+ },
31081
+ outputs: {
31082
+ body: "Original Telegram update payload.",
31083
+ deliveryId: "Unique ID generated for this Telegram update.",
31084
+ event: "Telegram update type."
31085
+ }
31086
+ },
31087
+ "woocommerce.on_store_event": {
31088
+ configInputs: {
31089
+ events: "WooCommerce store events that trigger a Run.",
31090
+ webhookName: "Name shown for the webhook in WooCommerce."
31091
+ },
31092
+ outputs: {
31093
+ body: "Original WooCommerce webhook payload.",
31094
+ deliveryId: "Unique WooCommerce webhook delivery ID.",
31095
+ event: "WooCommerce event action.",
31096
+ resource: "WooCommerce resource type.",
31097
+ source: "URL of the WooCommerce store that produced the event.",
31098
+ topic: "Full WooCommerce webhook topic.",
31099
+ webhookId: "ID of the WooCommerce webhook subscription."
31100
+ }
31101
+ },
31102
+ "zendesk.on_event": {
31103
+ configInputs: { events: "Zendesk event types that trigger a Run." },
31104
+ outputs: {
31105
+ body: "Original Zendesk event payload.",
31106
+ deliveryId: "Unique ID generated for this Zendesk event delivery.",
31107
+ event: "Zendesk event type.",
31108
+ subject: "Zendesk subject associated with the event."
31109
+ }
31110
+ }
31111
+ };
31112
+ //#endregion
31113
+ //#region src/trigger/providers/fieldLabels.ts
31114
+ var triggerConfigFieldLabels = {
31115
+ "en": {
31116
+ "jira.on_issue_event": { sourceId: "Event source" },
31117
+ "fireflies.on_meeting_ready": { sourceId: "Event source" },
31118
+ "zoom.on_recording_ready": { sourceId: "Event source" },
31119
+ "sentry.on_issue_alert": { sourceId: "Event source" },
31120
+ "intercom.on_conversation_event": { sourceId: "Event source" },
31121
+ "slackbot.on_event": { sourceId: "Event source" },
31122
+ "asana.on_task_event": { projectId: "Project ID" },
31123
+ "calendly.on_booking_event": {},
31124
+ "clickup.on_task_event": { workspaceId: "Workspace ID" },
31125
+ "pandadoc.on_document_event": {},
31126
+ "pipedrive.on_crm_event": {},
31127
+ "resend.on_email_event": {},
31128
+ "typeform.on_form_response": { formId: "Form ID" },
31129
+ "vercel.on_deployment_event": {
31130
+ teamId: "Team ID",
31131
+ projectId: "Project ID"
31132
+ },
31133
+ "tally.on_form_response": { formId: "Form" },
31134
+ "feishu_app_bot.on_event": {
31135
+ sourceId: "Event source",
31136
+ eventTypes: "Events to receive"
31137
+ },
31138
+ "airtable.on_record_changed": {
31139
+ baseId: "Base",
31140
+ tableIdOrName: "Table",
31141
+ triggerField: "Trigger field"
31142
+ },
31143
+ "github.on_repo_event": {
31144
+ events: "Events",
31145
+ owner: "Repository owner",
31146
+ repo: "Repository"
31147
+ },
31148
+ "github.watch_pull_request": {
31149
+ owner: "Repository owner",
31150
+ repo: "Repository",
31151
+ number: "Pull request number"
31152
+ },
31153
+ "gitlab.on_project_event": {
31154
+ events: "Events",
31155
+ project: "Project"
31156
+ },
31157
+ "googlecalendar.on_event_changed": { calendarId: "Calendar" },
31158
+ "googledrive.on_file_change": {
31159
+ changeType: "Change type",
31160
+ folderId: "Folder"
31161
+ },
31162
+ "googlesheets.on_row_added": {
31163
+ sheet: "Worksheet",
31164
+ spreadsheetId: "Spreadsheet"
31165
+ },
31166
+ "linear.on_issue_changed": { teamId: "Team" },
31167
+ "notion.on_database_page_event": { databaseId: "Database" },
31168
+ "shopify.on_shop_event": { topics: "Topics" },
31169
+ "slack.on_message_posted": { channelId: "Channel" },
31170
+ "stripe.on_event": { events: "Events" },
31171
+ "telegram.on_update": { updates: "Updates" },
31172
+ "woocommerce.on_store_event": { events: "Events" },
31173
+ "zendesk.on_event": { events: "Events" }
31174
+ },
31175
+ "zh-CN": {
31176
+ "jira.on_issue_event": { sourceId: "事件源" },
31177
+ "fireflies.on_meeting_ready": { sourceId: "事件源" },
31178
+ "zoom.on_recording_ready": { sourceId: "事件源" },
31179
+ "sentry.on_issue_alert": { sourceId: "事件源" },
31180
+ "intercom.on_conversation_event": { sourceId: "事件源" },
31181
+ "slackbot.on_event": { sourceId: "事件源" },
31182
+ "asana.on_task_event": { projectId: "项目 ID" },
31183
+ "calendly.on_booking_event": {},
31184
+ "clickup.on_task_event": { workspaceId: "工作区 ID" },
31185
+ "pandadoc.on_document_event": {},
31186
+ "pipedrive.on_crm_event": {},
31187
+ "resend.on_email_event": {},
31188
+ "typeform.on_form_response": { formId: "表单 ID" },
31189
+ "vercel.on_deployment_event": {
31190
+ teamId: "团队 ID",
31191
+ projectId: "项目 ID"
31192
+ },
31193
+ "tally.on_form_response": { formId: "表单" },
31194
+ "feishu_app_bot.on_event": {
31195
+ sourceId: "事件源",
31196
+ eventTypes: "接收的事件"
31197
+ },
31198
+ "airtable.on_record_changed": {
31199
+ baseId: "Base",
31200
+ tableIdOrName: "数据表",
31201
+ triggerField: "触发字段"
31202
+ },
31203
+ "github.on_repo_event": {
31204
+ events: "事件",
31205
+ owner: "仓库所有者",
31206
+ repo: "仓库"
31207
+ },
31208
+ "github.watch_pull_request": {
31209
+ owner: "仓库所有者",
31210
+ repo: "仓库",
31211
+ number: "拉取请求编号"
31212
+ },
31213
+ "gitlab.on_project_event": {
31214
+ events: "事件",
31215
+ project: "项目"
31216
+ },
31217
+ "googlecalendar.on_event_changed": { calendarId: "日历" },
31218
+ "googledrive.on_file_change": {
31219
+ changeType: "变更类型",
31220
+ folderId: "文件夹"
31221
+ },
31222
+ "googlesheets.on_row_added": {
31223
+ sheet: "工作表",
31224
+ spreadsheetId: "电子表格"
31225
+ },
31226
+ "linear.on_issue_changed": { teamId: "团队" },
31227
+ "notion.on_database_page_event": { databaseId: "数据库" },
31228
+ "shopify.on_shop_event": { topics: "主题" },
31229
+ "slack.on_message_posted": { channelId: "频道" },
31230
+ "stripe.on_event": { events: "事件" },
31231
+ "telegram.on_update": { updates: "更新类型" },
31232
+ "woocommerce.on_store_event": { events: "事件" },
31233
+ "zendesk.on_event": { events: "事件" }
31234
+ },
31235
+ "zh-TW": {
31236
+ "jira.on_issue_event": { sourceId: "事件源" },
31237
+ "fireflies.on_meeting_ready": { sourceId: "事件源" },
31238
+ "zoom.on_recording_ready": { sourceId: "事件源" },
31239
+ "sentry.on_issue_alert": { sourceId: "事件源" },
31240
+ "intercom.on_conversation_event": { sourceId: "事件源" },
31241
+ "slackbot.on_event": { sourceId: "事件源" },
31242
+ "asana.on_task_event": { projectId: "專案 ID" },
31243
+ "calendly.on_booking_event": {},
31244
+ "clickup.on_task_event": { workspaceId: "工作區 ID" },
31245
+ "pandadoc.on_document_event": {},
31246
+ "pipedrive.on_crm_event": {},
31247
+ "resend.on_email_event": {},
31248
+ "typeform.on_form_response": { formId: "表單 ID" },
31249
+ "vercel.on_deployment_event": {
31250
+ teamId: "團隊 ID",
31251
+ projectId: "專案 ID"
31252
+ },
31253
+ "tally.on_form_response": { formId: "表單" },
31254
+ "feishu_app_bot.on_event": {
31255
+ sourceId: "事件來源",
31256
+ eventTypes: "接收的事件"
31257
+ },
31258
+ "airtable.on_record_changed": {
31259
+ baseId: "Base",
31260
+ tableIdOrName: "資料表",
31261
+ triggerField: "觸發欄位"
31262
+ },
31263
+ "github.on_repo_event": {
31264
+ events: "事件",
31265
+ owner: "儲存庫擁有者",
31266
+ repo: "儲存庫"
31267
+ },
31268
+ "github.watch_pull_request": {
31269
+ owner: "儲存庫擁有者",
31270
+ repo: "儲存庫",
31271
+ number: "提取要求編號"
31272
+ },
31273
+ "gitlab.on_project_event": {
31274
+ events: "事件",
31275
+ project: "專案"
31276
+ },
31277
+ "googlecalendar.on_event_changed": { calendarId: "日曆" },
31278
+ "googledrive.on_file_change": {
31279
+ changeType: "變更類型",
31280
+ folderId: "資料夾"
31281
+ },
31282
+ "googlesheets.on_row_added": {
31283
+ sheet: "工作表",
31284
+ spreadsheetId: "試算表"
31285
+ },
31286
+ "linear.on_issue_changed": { teamId: "團隊" },
31287
+ "notion.on_database_page_event": { databaseId: "資料庫" },
31288
+ "shopify.on_shop_event": { topics: "主題" },
31289
+ "slack.on_message_posted": { channelId: "頻道" },
31290
+ "stripe.on_event": { events: "事件" },
31291
+ "telegram.on_update": { updates: "更新類型" },
31292
+ "woocommerce.on_store_event": { events: "事件" },
31293
+ "zendesk.on_event": { events: "事件" }
31294
+ },
31295
+ "ja": {
31296
+ "jira.on_issue_event": { sourceId: "イベントソース" },
31297
+ "fireflies.on_meeting_ready": { sourceId: "イベントソース" },
31298
+ "zoom.on_recording_ready": { sourceId: "イベントソース" },
31299
+ "sentry.on_issue_alert": { sourceId: "イベントソース" },
31300
+ "intercom.on_conversation_event": { sourceId: "イベントソース" },
31301
+ "slackbot.on_event": { sourceId: "イベントソース" },
31302
+ "asana.on_task_event": { projectId: "プロジェクト ID" },
31303
+ "calendly.on_booking_event": {},
31304
+ "clickup.on_task_event": { workspaceId: "ワークスペース ID" },
31305
+ "pandadoc.on_document_event": {},
31306
+ "pipedrive.on_crm_event": {},
31307
+ "resend.on_email_event": {},
31308
+ "typeform.on_form_response": { formId: "フォーム ID" },
31309
+ "vercel.on_deployment_event": {
31310
+ teamId: "チーム ID",
31311
+ projectId: "プロジェクト ID"
31312
+ },
31313
+ "tally.on_form_response": { formId: "フォーム" },
31314
+ "feishu_app_bot.on_event": {
31315
+ sourceId: "イベントソース",
31316
+ eventTypes: "受信するイベント"
31317
+ },
31318
+ "airtable.on_record_changed": {
31319
+ baseId: "ベース",
31320
+ tableIdOrName: "テーブル",
31321
+ triggerField: "トリガーフィールド"
31322
+ },
31323
+ "github.on_repo_event": {
31324
+ events: "イベント",
31325
+ owner: "リポジトリの所有者",
31326
+ repo: "リポジトリ"
31327
+ },
31328
+ "github.watch_pull_request": {
31329
+ owner: "リポジトリの所有者",
31330
+ repo: "リポジトリ",
31331
+ number: "プルリクエスト番号"
31332
+ },
31333
+ "gitlab.on_project_event": {
31334
+ events: "イベント",
31335
+ project: "プロジェクト"
31336
+ },
31337
+ "googlecalendar.on_event_changed": { calendarId: "カレンダー" },
31338
+ "googledrive.on_file_change": {
31339
+ changeType: "変更の種類",
31340
+ folderId: "フォルダー"
31341
+ },
31342
+ "googlesheets.on_row_added": {
31343
+ sheet: "シート",
31344
+ spreadsheetId: "スプレッドシート"
31345
+ },
31346
+ "linear.on_issue_changed": { teamId: "チーム" },
31347
+ "notion.on_database_page_event": { databaseId: "データベース" },
31348
+ "shopify.on_shop_event": { topics: "トピック" },
31349
+ "slack.on_message_posted": { channelId: "チャンネル" },
31350
+ "stripe.on_event": { events: "イベント" },
31351
+ "telegram.on_update": { updates: "更新の種類" },
31352
+ "woocommerce.on_store_event": { events: "イベント" },
31353
+ "zendesk.on_event": { events: "イベント" }
31354
+ },
31355
+ "ko": {
31356
+ "jira.on_issue_event": { sourceId: "이벤트 소스" },
31357
+ "fireflies.on_meeting_ready": { sourceId: "이벤트 소스" },
31358
+ "zoom.on_recording_ready": { sourceId: "이벤트 소스" },
31359
+ "sentry.on_issue_alert": { sourceId: "이벤트 소스" },
31360
+ "intercom.on_conversation_event": { sourceId: "이벤트 소스" },
31361
+ "slackbot.on_event": { sourceId: "이벤트 소스" },
31362
+ "asana.on_task_event": { projectId: "프로젝트 ID" },
31363
+ "calendly.on_booking_event": {},
31364
+ "clickup.on_task_event": { workspaceId: "워크스페이스 ID" },
31365
+ "pandadoc.on_document_event": {},
31366
+ "pipedrive.on_crm_event": {},
31367
+ "resend.on_email_event": {},
31368
+ "typeform.on_form_response": { formId: "양식 ID" },
31369
+ "vercel.on_deployment_event": {
31370
+ teamId: "팀 ID",
31371
+ projectId: "프로젝트 ID"
31372
+ },
31373
+ "tally.on_form_response": { formId: "양식" },
31374
+ "feishu_app_bot.on_event": {
31375
+ sourceId: "이벤트 소스",
31376
+ eventTypes: "수신할 이벤트"
31377
+ },
31378
+ "airtable.on_record_changed": {
31379
+ baseId: "베이스",
31380
+ tableIdOrName: "테이블",
31381
+ triggerField: "트리거 필드"
31382
+ },
31383
+ "github.on_repo_event": {
31384
+ events: "이벤트",
31385
+ owner: "저장소 소유자",
31386
+ repo: "저장소"
31387
+ },
31388
+ "github.watch_pull_request": {
31389
+ owner: "저장소 소유자",
31390
+ repo: "저장소",
31391
+ number: "풀 리퀘스트 번호"
31392
+ },
31393
+ "gitlab.on_project_event": {
31394
+ events: "이벤트",
31395
+ project: "프로젝트"
31396
+ },
31397
+ "googlecalendar.on_event_changed": { calendarId: "캘린더" },
31398
+ "googledrive.on_file_change": {
31399
+ changeType: "변경 유형",
31400
+ folderId: "폴더"
31401
+ },
31402
+ "googlesheets.on_row_added": {
31403
+ sheet: "시트",
31404
+ spreadsheetId: "스프레드시트"
31405
+ },
31406
+ "linear.on_issue_changed": { teamId: "팀" },
31407
+ "notion.on_database_page_event": { databaseId: "데이터베이스" },
31408
+ "shopify.on_shop_event": { topics: "주제" },
31409
+ "slack.on_message_posted": { channelId: "채널" },
31410
+ "stripe.on_event": { events: "이벤트" },
31411
+ "telegram.on_update": { updates: "업데이트 유형" },
31412
+ "woocommerce.on_store_event": { events: "이벤트" },
31413
+ "zendesk.on_event": { events: "이벤트" }
31414
+ },
31415
+ "ru": {
31416
+ "jira.on_issue_event": { sourceId: "Источник событий" },
31417
+ "fireflies.on_meeting_ready": { sourceId: "Источник событий" },
31418
+ "zoom.on_recording_ready": { sourceId: "Источник событий" },
31419
+ "sentry.on_issue_alert": { sourceId: "Источник событий" },
31420
+ "intercom.on_conversation_event": { sourceId: "Источник событий" },
31421
+ "slackbot.on_event": { sourceId: "Источник событий" },
31422
+ "asana.on_task_event": { projectId: "ID проекта" },
31423
+ "calendly.on_booking_event": {},
31424
+ "clickup.on_task_event": { workspaceId: "ID рабочего пространства" },
31425
+ "pandadoc.on_document_event": {},
31426
+ "pipedrive.on_crm_event": {},
31427
+ "resend.on_email_event": {},
31428
+ "typeform.on_form_response": { formId: "ID формы" },
31429
+ "vercel.on_deployment_event": {
31430
+ teamId: "ID команды",
31431
+ projectId: "ID проекта"
31432
+ },
31433
+ "tally.on_form_response": { formId: "Форма" },
31434
+ "feishu_app_bot.on_event": {
31435
+ sourceId: "Источник событий",
31436
+ eventTypes: "Принимаемые события"
31437
+ },
31438
+ "airtable.on_record_changed": {
31439
+ baseId: "База",
31440
+ tableIdOrName: "Таблица",
31441
+ triggerField: "Поле триггера"
31442
+ },
31443
+ "github.on_repo_event": {
31444
+ events: "События",
31445
+ owner: "Владелец репозитория",
31446
+ repo: "Репозиторий"
31447
+ },
31448
+ "github.watch_pull_request": {
31449
+ owner: "Владелец репозитория",
31450
+ repo: "Репозиторий",
31451
+ number: "Номер запроса на слияние"
31452
+ },
31453
+ "gitlab.on_project_event": {
31454
+ events: "События",
31455
+ project: "Проект"
31456
+ },
31457
+ "googlecalendar.on_event_changed": { calendarId: "Календарь" },
31458
+ "googledrive.on_file_change": {
31459
+ changeType: "Тип изменения",
31460
+ folderId: "Папка"
31461
+ },
31462
+ "googlesheets.on_row_added": {
31463
+ sheet: "Лист",
31464
+ spreadsheetId: "Таблица"
31465
+ },
31466
+ "linear.on_issue_changed": { teamId: "Команда" },
31467
+ "notion.on_database_page_event": { databaseId: "База данных" },
31468
+ "shopify.on_shop_event": { topics: "Темы" },
31469
+ "slack.on_message_posted": { channelId: "Канал" },
31470
+ "stripe.on_event": { events: "События" },
31471
+ "telegram.on_update": { updates: "Типы обновлений" },
31472
+ "woocommerce.on_store_event": { events: "События" },
31473
+ "zendesk.on_event": { events: "События" }
31474
+ },
31475
+ "fr": {
31476
+ "jira.on_issue_event": { sourceId: "Source d’événements" },
31477
+ "fireflies.on_meeting_ready": { sourceId: "Source d’événements" },
31478
+ "zoom.on_recording_ready": { sourceId: "Source d’événements" },
31479
+ "sentry.on_issue_alert": { sourceId: "Source d’événements" },
31480
+ "intercom.on_conversation_event": { sourceId: "Source d’événements" },
31481
+ "slackbot.on_event": { sourceId: "Source d’événements" },
31482
+ "asana.on_task_event": { projectId: "ID du projet" },
31483
+ "calendly.on_booking_event": {},
31484
+ "clickup.on_task_event": { workspaceId: "ID de l’espace de travail" },
31485
+ "pandadoc.on_document_event": {},
31486
+ "pipedrive.on_crm_event": {},
31487
+ "resend.on_email_event": {},
31488
+ "typeform.on_form_response": { formId: "ID du formulaire" },
31489
+ "vercel.on_deployment_event": {
31490
+ teamId: "ID de l’équipe",
31491
+ projectId: "ID du projet"
31492
+ },
31493
+ "tally.on_form_response": { formId: "Formulaire" },
31494
+ "feishu_app_bot.on_event": {
31495
+ sourceId: "Source d’événements",
31496
+ eventTypes: "Événements à recevoir"
31497
+ },
31498
+ "airtable.on_record_changed": {
31499
+ baseId: "Base",
31500
+ tableIdOrName: "Table",
31501
+ triggerField: "Champ déclencheur"
31502
+ },
31503
+ "github.on_repo_event": {
31504
+ events: "Événements",
31505
+ owner: "Propriétaire du dépôt",
31506
+ repo: "Dépôt"
31507
+ },
31508
+ "github.watch_pull_request": {
31509
+ owner: "Propriétaire du dépôt",
31510
+ repo: "Dépôt",
31511
+ number: "Numéro de la demande de tirage"
31512
+ },
31513
+ "gitlab.on_project_event": {
31514
+ events: "Événements",
31515
+ project: "Projet"
31516
+ },
31517
+ "googlecalendar.on_event_changed": { calendarId: "Agenda" },
31518
+ "googledrive.on_file_change": {
31519
+ changeType: "Type de modification",
31520
+ folderId: "Dossier"
31521
+ },
31522
+ "googlesheets.on_row_added": {
31523
+ sheet: "Feuille",
31524
+ spreadsheetId: "Feuille de calcul"
31525
+ },
31526
+ "linear.on_issue_changed": { teamId: "Équipe" },
31527
+ "notion.on_database_page_event": { databaseId: "Base de données" },
31528
+ "shopify.on_shop_event": { topics: "Sujets" },
31529
+ "slack.on_message_posted": { channelId: "Canal" },
31530
+ "stripe.on_event": { events: "Événements" },
31531
+ "telegram.on_update": { updates: "Types de mise à jour" },
31532
+ "woocommerce.on_store_event": { events: "Événements" },
31533
+ "zendesk.on_event": { events: "Événements" }
31534
+ }
31535
+ };
31536
+ //#endregion
31537
+ //#region src/trigger/providers/localization.ts
31538
+ var loaders = {
31539
+ "zh-CN": () => import("./zh-CN-Dg_xSGde.js"),
31540
+ "zh-TW": () => import("./zh-TW-oxuLwsV0.js"),
31541
+ "ja": () => import("./ja-CxQBHr2J.js"),
31542
+ "ko": () => import("./ko-D1Exiv1h.js"),
31543
+ "ru": () => import("./ru-BzLZv0B7.js"),
31544
+ "fr": () => import("./fr-CNTSedYU.js")
31545
+ };
31546
+ var cached = /* @__PURE__ */ new Map();
31547
+ var english = Promise.resolve({});
31548
+ function loadTriggerTranslations(locale) {
31549
+ if (locale == "en") return english;
31550
+ const existing = cached.get(locale);
31551
+ if (existing != null) return existing;
31552
+ const request = loaders[locale]().then((module) => module.default);
31553
+ cached.set(locale, request);
31554
+ request.catch(() => {
31555
+ if (cached.get(locale) == request) cached.delete(locale);
31556
+ });
31557
+ return request;
31558
+ }
31559
+ async function localizeTrigger(definition, locale) {
31560
+ const copy = (await loadTriggerTranslations(locale))[definition.key];
31561
+ const englishFields = englishTriggerFieldDescriptions[definition.key];
31562
+ return {
31563
+ configInputs: fieldDescriptions(definition.configInputs, copy?.configInputs, englishFields?.configInputs),
31564
+ configInputLabels: triggerConfigFieldLabels[locale][definition.key] ?? {},
31565
+ displayName: copy?.displayName ?? definition.displayName,
31566
+ description: copy?.description ?? definition.description,
31567
+ outputs: fieldDescriptions(definition.outputs, copy?.outputs, englishFields?.outputs)
31568
+ };
31569
+ }
31570
+ function fieldDescriptions(fields, translations, fallback) {
31571
+ return Object.fromEntries(fields.flatMap((field) => {
31572
+ if (!("handle" in field)) return [];
31573
+ const description = translations?.[field.handle] ?? fallback?.[field.handle] ?? field.description;
31574
+ return description == null ? [] : [[field.handle, description]];
31575
+ }));
31576
+ }
31577
+ //#endregion
30456
31578
  //#region src/workbench/browser/runtime/editor/revisionCanvasSession.ts
30457
31579
  /** Layout restoration deliberately preserves the current viewport and other graphs. */
30458
31580
  function changeRevisionCanvasSession(session, graphId, change) {
@@ -30501,13 +31623,32 @@ function changeRevisionCanvasSession(session, graphId, change) {
30501
31623
  function RevisionCanvas({ draft, presentation, theme, interactiveMode$, defaultInteractiveMode, defaultDirection, defaultMiniMapExpanded, defaultInspectorOpen = false, defaultSelectedNodeIds, nodesDraggable = true, layoutMotion, label, background = "striped", showHeader = true }) {
30502
31624
  const root = useRef(null);
30503
31625
  const t = useTranslate();
30504
- const language = useLang();
31626
+ const language = resolveUiLanguage([useLang()]);
30505
31627
  const revision = useMemo(() => revisionView(draft), [draft]);
30506
31628
  const graphId = "flow";
30507
31629
  const [sessions, setSessions] = useState({});
30508
31630
  const [inspectorOpen, setInspectorOpen] = useState(defaultInspectorOpen);
30509
31631
  const [focus, setFocus] = useState();
30510
31632
  const [catalog, setCatalog] = useState();
31633
+ const [triggerCopy, setTriggerCopy] = useState();
31634
+ useEffect(() => {
31635
+ const definitions = Object.values(revision.graph().nodes).flatMap((node) => node.kind == "integration" || node.kind == "poll" ? [node.definition] : []);
31636
+ if (definitions.length === 0) return;
31637
+ let active = true;
31638
+ Promise.all(definitions.map(async (definition) => [definition.key, await localizeTrigger(definition, language)])).then((entries) => {
31639
+ if (active) setTriggerCopy({
31640
+ revision,
31641
+ language,
31642
+ display: Object.fromEntries(entries)
31643
+ });
31644
+ }, (error) => {
31645
+ if (active) console.warn("Could not load Preview Trigger translations.", error);
31646
+ });
31647
+ return () => {
31648
+ active = false;
31649
+ };
31650
+ }, [revision, language]);
31651
+ const triggerDisplays = triggerCopy?.revision === revision && triggerCopy.language === language ? triggerCopy.display : void 0;
30511
31652
  const needsProviders = revision.connectorProviderIds.size > 0;
30512
31653
  useEffect(() => {
30513
31654
  if (!needsProviders) return;
@@ -30655,7 +31796,8 @@ function RevisionCanvas({ draft, presentation, theme, interactiveMode$, defaultI
30655
31796
  revision,
30656
31797
  selection,
30657
31798
  theme,
30658
- connectorProviders: providerMetadata
31799
+ connectorProviders: providerMetadata,
31800
+ triggerDisplays
30659
31801
  }, `${graphId}:${selection.id}`) : comment?.kind === "comment" ? /* @__PURE__ */ jsx(CommentInspector, {
30660
31802
  title: comment.title,
30661
31803
  content: comment.content ?? "",
@@ -34862,9 +36004,10 @@ var NodeInspectorContainer = memo(function NodeInspectorContainer({ onAddWorkflo
34862
36004
  const variableNamesLoading = useVal(store.$.variableNamesLoading);
34863
36005
  const connectorSetupPending = useVal(store.$.connectorSetupPending);
34864
36006
  const connectorAction = useVal(store.connectors.$.selectedAction);
36007
+ const connectorProvider = useVal(store.connectors.$.selectedProvider);
34865
36008
  const accessState = useVal(store.connectorAccess.$);
34866
36009
  const connectorAccess = accessState.access;
34867
- const providerId = connectorAction?.authenticated ? connectorAction.serviceId : void 0;
36010
+ const providerId = connectorProvider != null && !connectorProvider.noSetup ? connectorProvider.serviceId : connectorAction?.authenticated ? connectorAction.serviceId : void 0;
34868
36011
  const triggerId = selection?.kind == "trigger" && (selection.trigger.kind == "poll" || selection.trigger.kind == "integration") ? selection.trigger.definition.key : void 0;
34869
36012
  const triggerProviderId = selection?.kind == "trigger" && (selection.trigger.kind == "poll" || selection.trigger.kind == "integration") ? selection.trigger.definition.provider : void 0;
34870
36013
  useEffect(() => {
@@ -34884,7 +36027,7 @@ var NodeInspectorContainer = memo(function NodeInspectorContainer({ onAddWorkflo
34884
36027
  store
34885
36028
  ]);
34886
36029
  const triggerCandidates = triggerProviderId == null ? void 0 : store.connectorAccess.allowedTriggerCandidates(triggerProviderId, triggerId);
34887
- const allowedCandidates = (providerId == null ? void 0 : accessState.candidates[providerId]?.candidates)?.filter((candidate) => candidate.permissions == null || candidate.permissions.allActions || candidate.permissions.actionIds.includes(connectorAction.actionId));
36030
+ const allowedCandidates = (providerId == null ? void 0 : accessState.candidates[providerId]?.candidates)?.filter((candidate) => candidate.permissions == null || (connectorProvider != null ? candidate.permissions.proxy : candidate.permissions.allActions || candidate.permissions.actionIds.includes(connectorAction.actionId)));
34888
36031
  const connectorActionError = useVal(store.connectors.$.selectedActionError);
34889
36032
  const connectorActionLoading = useVal(store.connectors.$.actionLoading);
34890
36033
  const connectorAuthorizationPending = useVal(store.connectors.$.selectedAuthorizationPending);
@@ -34927,6 +36070,7 @@ var NodeInspectorContainer = memo(function NodeInspectorContainer({ onAddWorkflo
34927
36070
  }
34928
36071
  },
34929
36072
  connectorAction,
36073
+ connectorProvider,
34930
36074
  connectorAccess,
34931
36075
  connectorCandidates: accessState.candidates,
34932
36076
  connectorAccessError: accessError,
@@ -34992,7 +36136,7 @@ function FlowEditor({ portalRoot, navigationIsland, onRun, onRunStarted, onClose
34992
36136
  const { ignoredNodeIds, onIgnoreNodes } = useIgnoredNodes(flowId ?? "");
34993
36137
  const renderPng = useCallback(async (options) => {
34994
36138
  const model = store.$.designer.value;
34995
- const { flowToPng } = await import("./exportPng-DLdtJvg3.js");
36139
+ const { flowToPng } = await import("./exportPng-DGHcejgy.js");
34996
36140
  return flowToPng(model, language, {
34997
36141
  ...options,
34998
36142
  ignoredNodeIds