@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
@@ -6636,6 +6636,76 @@ function _e(e) {
6636
6636
  }
6637
6637
  /*! For license information please see dagre.esm.js.LEGAL.txt */
6638
6638
  //#endregion
6639
+ //#region src/canvas/browser/base/routeCrossings.ts
6640
+ var epsilon = 1e-6;
6641
+ function samePoint(a, b) {
6642
+ return Math.abs(a.x - b.x) < epsilon && Math.abs(a.y - b.y) < epsilon;
6643
+ }
6644
+ function segment(a, b) {
6645
+ return {
6646
+ left: Math.min(a.x, b.x),
6647
+ right: Math.max(a.x, b.x),
6648
+ top: Math.min(a.y, b.y),
6649
+ bottom: Math.max(a.y, b.y)
6650
+ };
6651
+ }
6652
+ /** Allow only the common prefix/suffix, not later crossings between the same edges. */
6653
+ function sharedEnd(a, b, overlap, reverse) {
6654
+ const step = reverse ? -1 : 1;
6655
+ let i = reverse ? a.length - 1 : 0;
6656
+ let j = reverse ? b.length - 1 : 0;
6657
+ let start = a[i];
6658
+ if (!samePoint(start, b[j])) return false;
6659
+ if (Math.abs(overlap.left - start.x) < epsilon && Math.abs(overlap.right - start.x) < epsilon && Math.abs(overlap.top - start.y) < epsilon && Math.abs(overlap.bottom - start.y) < epsilon) return true;
6660
+ while (a[i + step] && b[j + step]) {
6661
+ const endA = a[i + step];
6662
+ const endB = b[j + step];
6663
+ const vertical = Math.abs(endA.x - start.x) < epsilon;
6664
+ const otherVertical = Math.abs(endB.x - start.x) < epsilon;
6665
+ const directionA = vertical ? endA.y - start.y : endA.x - start.x;
6666
+ const directionB = vertical ? endB.y - start.y : endB.x - start.x;
6667
+ if (vertical !== otherVertical || directionA * directionB < 0) return false;
6668
+ const end = Math.abs(directionA) <= Math.abs(directionB) ? endA : endB;
6669
+ const common = segment(start, end);
6670
+ if (overlap.left >= common.left - epsilon && overlap.right <= common.right + epsilon && overlap.top >= common.top - epsilon && overlap.bottom <= common.bottom + epsilon) return true;
6671
+ if (samePoint(end, endA)) i += step;
6672
+ if (samePoint(end, endB)) j += step;
6673
+ start = end;
6674
+ }
6675
+ return false;
6676
+ }
6677
+ /** Check orthogonal routes once after layout; stop at the first unrelated contact or overlap. */
6678
+ function hasRouteCrossings(routes) {
6679
+ const paths = [...routes.values()].map((points) => {
6680
+ const path = points.filter((point, index) => index === 0 || !samePoint(point, points[index - 1]));
6681
+ return {
6682
+ path,
6683
+ segments: path.slice(1).map((point, index) => segment(path[index], point))
6684
+ };
6685
+ });
6686
+ for (let i = 0; i < paths.length; i++) {
6687
+ const a = paths[i];
6688
+ for (let j = i + 1; j < paths.length; j++) {
6689
+ const b = paths[j];
6690
+ for (const first of a.segments) for (const second of b.segments) {
6691
+ const left = Math.max(first.left, second.left);
6692
+ const right = Math.min(first.right, second.right);
6693
+ const top = Math.max(first.top, second.top);
6694
+ const bottom = Math.min(first.bottom, second.bottom);
6695
+ if (left > right + epsilon || top > bottom + epsilon) continue;
6696
+ const overlap = {
6697
+ left,
6698
+ right,
6699
+ top,
6700
+ bottom
6701
+ };
6702
+ if (!sharedEnd(a.path, b.path, overlap, false) && !sharedEnd(a.path, b.path, overlap, true)) return true;
6703
+ }
6704
+ }
6705
+ }
6706
+ return false;
6707
+ }
6708
+ //#endregion
6639
6709
  //#region src/canvas/browser/base/routeLayout.ts
6640
6710
  var clearance = 16;
6641
6711
  var portOffset = 24;
@@ -7041,19 +7111,26 @@ function compactComponent(graph, insets, aspectRatio) {
7041
7111
  const gap = 48;
7042
7112
  const pathNodes = normalized.filter((node) => incoming.has(node.id) || outgoing.has(node.id));
7043
7113
  const crossSize = Math.max(...(pathNodes.length ? pathNodes : normalized).map((node) => node.height));
7044
- const bow = crossSize * .75;
7045
- const separation = crossSize + 48;
7114
+ const bow = crossSize * .5;
7115
+ const separation = crossSize + bow + gap;
7046
7116
  const bucketSize = Math.max(...normalized.map((node) => node.width)) + gap;
7047
7117
  const byId = new Map(normalized.map((node) => [node.id, node]));
7048
7118
  const forwardEdges = graph.edges.filter((edge) => byId.get(edge.source).column < byId.get(edge.target).column);
7049
7119
  const parents = Map.groupBy(forwardEdges, (edge) => edge.target);
7050
7120
  const children = Map.groupBy(forwardEdges, (edge) => edge.source);
7051
7121
  const ordered = normalized.toSorted((a, b) => a.column - b.column || a.y - b.y);
7052
- const remaining = /* @__PURE__ */ new Map();
7053
- for (const node of ordered.toReversed()) remaining.set(node.id, 1 + Math.max(0, ...(children.get(node.id) ?? []).filter((edge) => parents.get(edge.target)?.length === 1).map((edge) => remaining.get(edge.target))));
7054
7122
  const rankEnds = new Map([...Map.groupBy(normalized, (node) => node.column)].map(([rank, nodes]) => [rank, Math.max(...nodes.map((node) => node.x + node.width))]));
7123
+ const remaining = /* @__PURE__ */ new Map();
7124
+ for (const node of ordered.toReversed()) {
7125
+ const next = (children.get(node.id) ?? []).filter((edge) => parents.get(edge.target)?.length === 1).map((edge) => remaining.get(edge.target));
7126
+ remaining.set(node.id, {
7127
+ count: 1 + Math.max(0, ...next.map((path) => path.count)),
7128
+ size: Math.max(node.width, ...next.map((path) => rankEnds.get(node.column) - node.x + gap + path.size))
7129
+ });
7130
+ }
7055
7131
  const spans = /* @__PURE__ */ new Set([Infinity, ...rankEnds.values()]);
7056
- let best;
7132
+ const layouts = [];
7133
+ let unfolded;
7057
7134
  for (const span of spans) {
7058
7135
  const placed = /* @__PURE__ */ new Map();
7059
7136
  const buckets = /* @__PURE__ */ new Map();
@@ -7075,10 +7152,15 @@ function compactComponent(graph, insets, aspectRatio) {
7075
7152
  } else if (parent) {
7076
7153
  shift = parent.shift;
7077
7154
  start = parent.start;
7155
+ const length = primary - start + remaining.get(original.id).size;
7156
+ const capacity = Math.max(original.width, span - start);
7157
+ const runs = Math.max(1, Math.ceil((length + gap) / (capacity + gap)));
7158
+ const end = start + (length + gap) / runs - gap;
7159
+ const midpoint = (parent.node.x + parent.node.width + primary + original.width) / 2;
7078
7160
  if ((children.get(parent.node.id)?.length ?? 0) > 1) {
7079
7161
  shift = parent.node.y - byId.get(parent.node.id).y;
7080
7162
  start = primary;
7081
- } else if (primary + original.width > span && remaining.get(original.id) > 2) {
7163
+ } else if (midpoint > end + 1e-6 && remaining.get(original.id).count > 2) {
7082
7164
  primary = Math.max(0, start - span / 3);
7083
7165
  shift = parent.shift + side * separation;
7084
7166
  start = primary;
@@ -7107,7 +7189,7 @@ function compactComponent(graph, insets, aspectRatio) {
7107
7189
  order: placed.size,
7108
7190
  shift: node.y - original.y - drift,
7109
7191
  start,
7110
- extent: Math.max(node.x + node.width, ...upstream.map((entry) => entry.extent))
7192
+ extent: Math.max(node.x + node.width, parent && node.x < parent.node.x ? parent.node.x + parent.node.width + gap : 0, ...upstream.map((entry) => entry.extent))
7111
7193
  };
7112
7194
  placed.set(node.id, placement);
7113
7195
  for (let bucket = firstBucket; bucket <= lastBucket; bucket++) {
@@ -7121,23 +7203,37 @@ function compactComponent(graph, insets, aspectRatio) {
7121
7203
  const width = extent.height + insets.width + 48;
7122
7204
  const height = extent.width + insets.height + 48;
7123
7205
  const area = width * height;
7124
- const score = Math.max(width / aspectRatio, height);
7125
- if (!best || score < best.score - 1e-9 || Math.abs(score - best.score) < 1e-9 && (area < best.area || area === best.area && turns < best.turns)) best = {
7206
+ const candidate = {
7126
7207
  nodes,
7127
- score,
7208
+ score: Math.max(width / aspectRatio, height),
7128
7209
  area,
7129
7210
  turns
7130
7211
  };
7212
+ if (span === Infinity) unfolded = candidate;
7213
+ layouts.push(candidate);
7214
+ layouts.sort((a, b) => Math.abs(a.score - b.score) >= 1e-9 ? a.score - b.score : a.area - b.area || a.turns - b.turns);
7215
+ if (layouts.length > 2) layouts.pop();
7131
7216
  }
7132
- const routes = routeLayout(best.nodes, graph.edges.map((edge) => Object.assign({}, edge, {
7217
+ const edges = graph.edges.map((edge) => Object.assign({}, edge, {
7133
7218
  sourceOffset: edge.sourceOffset && layoutAxes(edge.sourceOffset, "vertical"),
7134
7219
  targetOffset: edge.targetOffset && layoutAxes(edge.targetOffset, "vertical")
7135
- })));
7220
+ }));
7221
+ if (!layouts.includes(unfolded)) layouts.push(unfolded);
7222
+ let best;
7223
+ for (const candidate of layouts) {
7224
+ const routes = routeLayout(candidate.nodes, edges);
7225
+ const crosses = hasRouteCrossings(routes);
7226
+ if (!best || !crosses) best = {
7227
+ nodes: candidate.nodes,
7228
+ routes
7229
+ };
7230
+ if (!crosses) break;
7231
+ }
7136
7232
  const physicalNodes = best.nodes.map((node) => Object.assign({}, node, layoutAxes(node, "vertical"), {
7137
7233
  width: node.height,
7138
7234
  height: node.width
7139
7235
  }));
7140
- const physicalRoutes = new Map([...routes].map(([id, points]) => [id, points.map((point) => layoutAxes(point, "vertical"))]));
7236
+ const physicalRoutes = new Map([...best.routes].map(([id, points]) => [id, points.map((point) => layoutAxes(point, "vertical"))]));
7141
7237
  return {
7142
7238
  positions: Object.fromEntries(physicalNodes.map(({ id, x, y }) => [id, {
7143
7239
  x,
@@ -48092,7 +48188,7 @@ function getAddItemId(dataTransfer) {
48092
48188
  return dataTransfer.getData(ADD_ITEM_KEY);
48093
48189
  }
48094
48190
  //#endregion
48095
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/util.js
48191
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/util.js
48096
48192
  function getEnumValues(entries) {
48097
48193
  const numericValues = Object.values(entries).filter((v) => typeof v === "number");
48098
48194
  return Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
@@ -48118,7 +48214,7 @@ var Cached = class {
48118
48214
  return this._value;
48119
48215
  }
48120
48216
  };
48121
- function cached(getter) {
48217
+ function cached$1(getter) {
48122
48218
  return new Cached(getter);
48123
48219
  }
48124
48220
  function nullish(input) {
@@ -48232,7 +48328,7 @@ var captureStackTrace = "captureStackTrace" in Error ? Error.captureStackTrace :
48232
48328
  function isObject(data) {
48233
48329
  return typeof data === "object" && data !== null && !Array.isArray(data);
48234
48330
  }
48235
- var allowsEval = /* @__PURE__*/ cached(() => {
48331
+ var allowsEval = /* @__PURE__*/ cached$1(() => {
48236
48332
  if (globalConfig.jitless) return false;
48237
48333
  if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) return false;
48238
48334
  try {
@@ -48417,6 +48513,17 @@ function prefixIssues(path, issues) {
48417
48513
  function unwrapMessage(message) {
48418
48514
  return typeof message === "string" ? message : message?.message;
48419
48515
  }
48516
+ /** The leading size checks of `defChecks` that set an upper bound, each paired with it. */
48517
+ function sizeCaps(defChecks) {
48518
+ const caps = [];
48519
+ for (const ch of defChecks ?? []) {
48520
+ const d = ch._zod.def;
48521
+ if (!/_(length|size)$|_equals$/.test(d.check)) break;
48522
+ const max = d.maximum ?? d.length ?? d.size;
48523
+ if (max >= 0) caps.push([max, ch]);
48524
+ }
48525
+ return caps;
48526
+ }
48420
48527
  function attachSchema(issues, start, inst) {
48421
48528
  var _a;
48422
48529
  for (let i = start; i < issues.length; i++) (_a = issues[i]).schema ?? (_a.schema = inst);
@@ -48633,7 +48740,7 @@ function constantCatch(value) {
48633
48740
  return fn;
48634
48741
  }
48635
48742
  //#endregion
48636
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/core.js
48743
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/core.js
48637
48744
  var _a$1;
48638
48745
  var _zodDesc = {
48639
48746
  value: void 0,
@@ -48739,7 +48846,7 @@ function config(newConfig) {
48739
48846
  return globalConfig;
48740
48847
  }
48741
48848
  //#endregion
48742
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/errors.js
48849
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/errors.js
48743
48850
  function _getMessage() {
48744
48851
  const internals = this._zod;
48745
48852
  internals.message ?? (internals.message = JSON.stringify(internals.def, jsonStringifyReplacer, 2));
@@ -48855,7 +48962,7 @@ function formatError(error, mapper = (issue) => issue.message) {
48855
48962
  return fieldErrors;
48856
48963
  }
48857
48964
  //#endregion
48858
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/parse.js
48965
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/parse.js
48859
48966
  function finalizeParams(callee, params) {
48860
48967
  return {
48861
48968
  callee: params?.callee ?? callee,
@@ -49058,7 +49165,7 @@ var _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {
49058
49165
  return _safeParseAsync(_Err)(schema, value, _ctx);
49059
49166
  };
49060
49167
  //#endregion
49061
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/regexes.js
49168
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/regexes.js
49062
49169
  /**
49063
49170
  * @deprecated CUID v1 is deprecated by its authors due to information leakage
49064
49171
  * (timestamps embedded in the id). Use {@link cuid2} instead.
@@ -49131,7 +49238,7 @@ var _null$2 = /^null$/i;
49131
49238
  var lowercase = /^[^A-Z]*$/;
49132
49239
  var uppercase = /^[^a-z]*$/;
49133
49240
  //#endregion
49134
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/checks.js
49241
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/checks.js
49135
49242
  var $ZodCheck = /*@__PURE__*/ $constructor("$ZodCheck", (inst, def) => {
49136
49243
  var _a;
49137
49244
  inst._zod ?? (inst._zod = {});
@@ -49427,7 +49534,7 @@ var $ZodCheckOverwrite = /*@__PURE__*/ $constructor("$ZodCheckOverwrite", (inst,
49427
49534
  };
49428
49535
  });
49429
49536
  //#endregion
49430
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/doc.js
49537
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/doc.js
49431
49538
  var Doc = class {
49432
49539
  constructor(args = [], closed = {}) {
49433
49540
  this.content = [];
@@ -49461,14 +49568,14 @@ var Doc = class {
49461
49568
  }
49462
49569
  };
49463
49570
  //#endregion
49464
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/versions.js
49571
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/versions.js
49465
49572
  var version = {
49466
49573
  major: 4,
49467
49574
  minor: 6,
49468
- patch: 5
49575
+ patch: 7
49469
49576
  };
49470
49577
  //#endregion
49471
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/schemas.js
49578
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/schemas.js
49472
49579
  var $ZodType = /*@__PURE__*/ $constructor("$ZodType", (inst, def) => {
49473
49580
  var _a;
49474
49581
  inst ?? (inst = {});
@@ -49981,6 +50088,26 @@ var $ZodNever = /*@__PURE__*/ $constructor("$ZodNever", (inst, def) => {
49981
50088
  return payload;
49982
50089
  };
49983
50090
  });
50091
+ function capSize(inst, size) {
50092
+ const caps = sizeCaps(inst._zod.def.checks);
50093
+ if (!caps.length) return;
50094
+ const cap = Math.min(...caps.map((c) => c[0]));
50095
+ const parse = inst._zod.parse;
50096
+ inst._zod.parse = (payload, ctx) => {
50097
+ const n = size(payload.value);
50098
+ if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
50099
+ for (const [max, ch] of sizeCaps(inst._zod.def.checks)) if (n > max && ch._zod.def.when(payload)) {
50100
+ const start = payload.issues.length;
50101
+ ch._zod.check(payload);
50102
+ payload.issues[start].continue = false;
50103
+ attachSchema(payload.issues, start, inst);
50104
+ return payload;
50105
+ }
50106
+ }
50107
+ return parse(payload, ctx);
50108
+ };
50109
+ }
50110
+ var arraySize = (input) => Array.isArray(input) ? input.length : -1;
49984
50111
  function handleArrayResult(result, final, index) {
49985
50112
  if (result.issues.length) final.issues.push(...prefixIssues(index, result.issues));
49986
50113
  final.value[index] = result.value;
@@ -50018,6 +50145,7 @@ var $ZodArray = /*@__PURE__*/ $constructor("$ZodArray", (inst, def) => {
50018
50145
  if (proms.length) return Promise.all(proms).then(() => payload);
50019
50146
  return payload;
50020
50147
  };
50148
+ capSize(inst, arraySize);
50021
50149
  });
50022
50150
  function handlePropertyResult(result, final, key, input, optin, optout) {
50023
50151
  const isPresent = key in input;
@@ -50112,7 +50240,7 @@ var $ZodObject = /*@__PURE__*/ $constructor("$ZodObject", (inst, def) => {
50112
50240
  get.raw = sh;
50113
50241
  Object.defineProperty(def, "shape", { get });
50114
50242
  }
50115
- const _normalized = cached(() => normalizeDef(def));
50243
+ const _normalized = cached$1(() => normalizeDef(def));
50116
50244
  defineLazyInternal(inst, "propValues", (zod) => {
50117
50245
  const shape = zod.def.shape;
50118
50246
  const propValues = {};
@@ -50126,7 +50254,7 @@ var $ZodObject = /*@__PURE__*/ $constructor("$ZodObject", (inst, def) => {
50126
50254
  }
50127
50255
  return propValues;
50128
50256
  });
50129
- const isObject$3 = isObject;
50257
+ const isObject$2 = isObject;
50130
50258
  const catchall = def.catchall;
50131
50259
  let value;
50132
50260
  const memo = globalConfig.memoizer;
@@ -50134,7 +50262,7 @@ var $ZodObject = /*@__PURE__*/ $constructor("$ZodObject", (inst, def) => {
50134
50262
  inst._zod.parse = (payload, ctx) => {
50135
50263
  value ?? (value = _normalized.value);
50136
50264
  const input = payload.value;
50137
- if (!isObject$3(input)) {
50265
+ if (!isObject$2(input)) {
50138
50266
  payload.issues.push({
50139
50267
  expected: "object",
50140
50268
  code: "invalid_type",
@@ -50171,7 +50299,7 @@ var $ZodObject = /*@__PURE__*/ $constructor("$ZodObject", (inst, def) => {
50171
50299
  var $ZodObjectJIT = /*@__PURE__*/ $constructor("$ZodObjectJIT", (inst, def) => {
50172
50300
  $ZodObject.init(inst, def);
50173
50301
  const superParse = inst._zod.parse;
50174
- const _normalized = cached(() => normalizeDef(def));
50302
+ const _normalized = cached$1(() => normalizeDef(def));
50175
50303
  const memo = globalConfig.memoizer;
50176
50304
  const generateFastpass = (shape) => {
50177
50305
  const normalized = _normalized.value;
@@ -50264,7 +50392,7 @@ var $ZodObjectJIT = /*@__PURE__*/ $constructor("$ZodObjectJIT", (inst, def) => {
50264
50392
  return doc.compile();
50265
50393
  };
50266
50394
  let fastpass;
50267
- const isObject$2 = isObject;
50395
+ const isObject$3 = isObject;
50268
50396
  const jit = !globalConfig.jitless;
50269
50397
  const fastEnabled = jit && allowsEval.value;
50270
50398
  const catchall = def.catchall;
@@ -50272,7 +50400,7 @@ var $ZodObjectJIT = /*@__PURE__*/ $constructor("$ZodObjectJIT", (inst, def) => {
50272
50400
  inst._zod.parse = (payload, ctx) => {
50273
50401
  value ?? (value = _normalized.value);
50274
50402
  const input = payload.value;
50275
- if (!isObject$2(input)) {
50403
+ if (!isObject$3(input)) {
50276
50404
  payload.issues.push({
50277
50405
  expected: "object",
50278
50406
  code: "invalid_type",
@@ -50380,7 +50508,7 @@ var $ZodDiscriminatedUnion = /*@__PURE__*/ $constructor("$ZodDiscriminatedUnion"
50380
50508
  const propShape = rawShape(option._zod.def);
50381
50509
  if (propShape && !Object.prototype.hasOwnProperty.call(propShape, def.discriminator)) throw new Error(`Invalid discriminated union option at index "${i}"`);
50382
50510
  });
50383
- const disc = cached(() => discriminatorMap(def));
50511
+ const disc = cached$1(() => discriminatorMap(def));
50384
50512
  inst._zod.parse = (payload, ctx) => {
50385
50513
  const input = payload.value;
50386
50514
  if (!isObject(input)) {
@@ -50936,7 +51064,7 @@ function handleRefineResult(result, payload, input, inst) {
50936
51064
  }
50937
51065
  }
50938
51066
  //#endregion
50939
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/memoizer.js
51067
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/memoizer.js
50940
51068
  var $ZodCyclicError = class extends Error {
50941
51069
  constructor() {
50942
51070
  super(`Cannot parse a reference cycle that closes through a transform`);
@@ -51189,7 +51317,7 @@ function isBackEdge(ctx, value) {
51189
51317
  return backEdges !== void 0 && isRef(value) && backEdges.has(value);
51190
51318
  }
51191
51319
  //#endregion
51192
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/locales/en.js
51320
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/locales/en.js
51193
51321
  var error$1 = () => {
51194
51322
  const Sizable = {
51195
51323
  string: {
@@ -51297,7 +51425,7 @@ function en_default$2() {
51297
51425
  return { localeError: error$1() };
51298
51426
  }
51299
51427
  //#endregion
51300
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/registries.js
51428
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/registries.js
51301
51429
  var _a;
51302
51430
  var $ZodRegistry = class {
51303
51431
  constructor() {
@@ -51344,7 +51472,7 @@ function registry() {
51344
51472
  (_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());
51345
51473
  var globalRegistry = globalThis.__zod_globalRegistry;
51346
51474
  //#endregion
51347
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/api.js
51475
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/api.js
51348
51476
  function snapshotChecks(def) {
51349
51477
  if (def.checks) def.checks = [...def.checks];
51350
51478
  return def;
@@ -51860,7 +51988,7 @@ function _check(fn, params) {
51860
51988
  return ch;
51861
51989
  }
51862
51990
  //#endregion
51863
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/to-json-schema.js
51991
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/to-json-schema.js
51864
51992
  function assignProps(target, ...sources) {
51865
51993
  for (const source of sources) for (const key of Reflect.ownKeys(source)) if (Object.prototype.propertyIsEnumerable.call(source, key)) assignProp(target, key, source[key]);
51866
51994
  return target;
@@ -52304,7 +52432,7 @@ var createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) =
52304
52432
  return finalize(ctx, schema);
52305
52433
  };
52306
52434
  //#endregion
52307
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.js
52435
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/core/json-schema-processors.js
52308
52436
  var narrowMin = (agg, key, value) => {
52309
52437
  if (agg[key] === void 0 || value > agg[key]) agg[key] = value;
52310
52438
  };
@@ -52765,7 +52893,7 @@ var lazyProcessor = (schema, ctx, _json, params) => {
52765
52893
  seen.ref = innerType;
52766
52894
  };
52767
52895
  //#endregion
52768
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/errors.js
52896
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/classic/errors.js
52769
52897
  var _installedErrorProtos = /* @__PURE__ */ new WeakSet([Object.prototype, Error.prototype]);
52770
52898
  function _lazyMethod(proto, key, make) {
52771
52899
  Object.defineProperty(proto, key, {
@@ -52815,7 +52943,7 @@ var initializer = (inst, issues) => {
52815
52943
  };
52816
52944
  var ZodRealError = /*@__PURE__*/ $constructor("ZodError", initializer, void 0, { Parent: Error });
52817
52945
  //#endregion
52818
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/parse.js
52946
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/classic/parse.js
52819
52947
  var parse = /* @__PURE__ */ _parse(ZodRealError);
52820
52948
  var parseAsync = /* @__PURE__ */ _parseAsync(ZodRealError);
52821
52949
  var safeParse = /* @__PURE__ */ _safeParse(ZodRealError);
@@ -52829,7 +52957,7 @@ var safeDecode = /* @__PURE__ */ _safeDecode(ZodRealError);
52829
52957
  var safeEncodeAsync = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
52830
52958
  var safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
52831
52959
  //#endregion
52832
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/schemas.js
52960
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/classic/schemas.js
52833
52961
  function _ensureDefaultLocale() {
52834
52962
  if (!globalConfig.localeError) config(en_default$2());
52835
52963
  }
@@ -53761,7 +53889,7 @@ function preprocess(fn, schema) {
53761
53889
  });
53762
53890
  }
53763
53891
  //#endregion
53764
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/iso.js
53892
+ //#region ../../node_modules/.bun/zod@4.6.7/node_modules/zod/v4/classic/iso.js
53765
53893
  function datetime(params) {
53766
53894
  return /* @__PURE__ */ _isoDateTime(ZodISODateTime, params);
53767
53895
  }
@@ -56145,6 +56273,882 @@ function FlowCanvasView(props) {
56145
56273
  }, props.identity);
56146
56274
  }
56147
56275
  //#endregion
56276
+ //#region src/trigger/providers/fieldDescriptions.ts
56277
+ var driveChangesConfig = {
56278
+ driveId: "Shared drive ID. Leave empty to monitor the connected account.",
56279
+ includeCorpusRemovals: "Include the accessible file resource when an item leaves the change corpus.",
56280
+ includeItemsFromAllDrives: "Include items from My Drive and shared drives.",
56281
+ includeRemoved: "Include changes caused by deletion or loss of access.",
56282
+ pageSize: "Maximum number of changes read per page.",
56283
+ restrictToMyDrive: "Restrict changes to the My Drive hierarchy."
56284
+ };
56285
+ var englishTriggerFieldDescriptions = {
56286
+ "jira.on_issue_event": {
56287
+ configInputs: {
56288
+ sourceId: "Event source",
56289
+ eventTypes: "Events"
56290
+ },
56291
+ outputs: {
56292
+ event: "Event type",
56293
+ deliveryId: "Notification ID",
56294
+ cloudId: "Cloud site ID",
56295
+ issueId: "Issue ID",
56296
+ body: "Original event"
56297
+ }
56298
+ },
56299
+ "fireflies.on_meeting_ready": {
56300
+ configInputs: {
56301
+ sourceId: "Event source",
56302
+ eventTypes: "Events"
56303
+ },
56304
+ outputs: {
56305
+ event: "Event type",
56306
+ deliveryId: "Notification ID",
56307
+ accountId: "Account ID",
56308
+ meetingId: "Meeting / transcript ID",
56309
+ body: "Original object"
56310
+ }
56311
+ },
56312
+ "zoom.on_recording_ready": {
56313
+ configInputs: {
56314
+ sourceId: "Event source",
56315
+ eventTypes: "Events"
56316
+ },
56317
+ outputs: {
56318
+ event: "Event type",
56319
+ deliveryId: "Notification ID",
56320
+ accountId: "Zoom account ID",
56321
+ meetingUuid: "Meeting instance UUID",
56322
+ body: "Original object"
56323
+ }
56324
+ },
56325
+ "sentry.on_issue_alert": {
56326
+ configInputs: {
56327
+ sourceId: "Event source",
56328
+ eventTypes: "Events",
56329
+ projectIds: "Project IDs; empty includes all projects in the installation.",
56330
+ ruleNames: "Exact alert rule labels; empty includes all rules."
56331
+ },
56332
+ outputs: {
56333
+ event: "Event type",
56334
+ deliveryId: "Notification ID",
56335
+ organizationId: "Organization ID",
56336
+ issueId: "Issue ID",
56337
+ body: "Original object"
56338
+ }
56339
+ },
56340
+ "intercom.on_conversation_event": {
56341
+ configInputs: {
56342
+ sourceId: "Event source",
56343
+ eventTypes: "Events"
56344
+ },
56345
+ outputs: {
56346
+ event: "Event type",
56347
+ deliveryId: "Notification ID",
56348
+ workspaceId: "Workspace ID",
56349
+ objectId: "Conversation or ticket ID",
56350
+ body: "Original object"
56351
+ }
56352
+ },
56353
+ "slackbot.on_event": {
56354
+ configInputs: {
56355
+ sourceId: "Event source",
56356
+ eventTypes: "Events",
56357
+ channelIds: "Channel IDs; empty means all source channels."
56358
+ },
56359
+ outputs: {
56360
+ event: "Event type",
56361
+ deliveryId: "Event ID",
56362
+ appId: "Slack app ID",
56363
+ teamId: "Workspace ID",
56364
+ channel: "Conversation ID",
56365
+ user: "User ID",
56366
+ text: "Message text",
56367
+ ts: "Message timestamp",
56368
+ threadTs: "Parent thread timestamp, when present.",
56369
+ body: "Original Slack event"
56370
+ }
56371
+ },
56372
+ "asana.on_task_event": {
56373
+ configInputs: {
56374
+ projectId: "Project ID",
56375
+ eventTypes: "Events",
56376
+ customFieldId: "Custom field ID"
56377
+ },
56378
+ outputs: {
56379
+ projectId: "Project ID",
56380
+ events: "Matching events in this delivery."
56381
+ }
56382
+ },
56383
+ "calendly.on_booking_event": {
56384
+ configInputs: {
56385
+ scope: "Scope",
56386
+ eventTypes: "Events"
56387
+ },
56388
+ outputs: {
56389
+ event: "Business event type.",
56390
+ inviteeUri: "Invitee URI",
56391
+ createdAt: "Event timestamp.",
56392
+ body: "Original event data."
56393
+ }
56394
+ },
56395
+ "clickup.on_task_event": {
56396
+ configInputs: {
56397
+ workspaceId: "Workspace ID",
56398
+ listId: "List ID",
56399
+ eventTypes: "Events"
56400
+ },
56401
+ outputs: {
56402
+ event: "Business event type.",
56403
+ taskId: "Task ID",
56404
+ body: "Original event data."
56405
+ }
56406
+ },
56407
+ "pandadoc.on_document_event": {
56408
+ configInputs: { completedOnly: "Completed documents only" },
56409
+ outputs: { events: "Matching events in this delivery." }
56410
+ },
56411
+ "pipedrive.on_crm_event": {
56412
+ configInputs: { eventType: "Event" },
56413
+ outputs: {
56414
+ event: "Business event type.",
56415
+ deliveryId: "Delivery ID",
56416
+ objectId: "Object ID",
56417
+ body: "Original event data."
56418
+ }
56419
+ },
56420
+ "resend.on_email_event": {
56421
+ configInputs: { eventTypes: "Events" },
56422
+ outputs: {
56423
+ event: "Business event type.",
56424
+ deliveryId: "Delivery ID",
56425
+ emailId: "Email ID",
56426
+ createdAt: "Event timestamp.",
56427
+ body: "Original event data."
56428
+ }
56429
+ },
56430
+ "typeform.on_form_response": {
56431
+ configInputs: { formId: "Form ID" },
56432
+ outputs: { response: "Submission identity, time and original answers with stable field identifiers." }
56433
+ },
56434
+ "vercel.on_deployment_event": {
56435
+ configInputs: {
56436
+ teamId: "Team ID",
56437
+ projectId: "Project ID",
56438
+ environment: "Environment"
56439
+ },
56440
+ outputs: {
56441
+ event: "Business event type.",
56442
+ deliveryId: "Delivery ID",
56443
+ deploymentId: "Deployment ID",
56444
+ projectId: "Project ID",
56445
+ body: "Original event data."
56446
+ }
56447
+ },
56448
+ "tally.on_form_response": {
56449
+ configInputs: { formId: "Select a form accessible to this connection." },
56450
+ outputs: { response: "Submission identity, time, and fields, preserving field keys, types, values, options, and file metadata." }
56451
+ },
56452
+ "feishu_app_bot.on_event": {
56453
+ configInputs: {
56454
+ sourceId: "Event source that receives events for this trigger.",
56455
+ eventTypes: "Feishu event types that trigger a Run.",
56456
+ chatIds: "Chat IDs to receive events from. Leave empty to receive events from every chat available to the source.",
56457
+ resource: "Optional document, calendar, or approval resource to subscribe to."
56458
+ },
56459
+ outputs: {
56460
+ event: "Feishu event type.",
56461
+ deliveryId: "Unique delivery ID for this event.",
56462
+ appId: "ID of the Feishu application that received the event.",
56463
+ tenantKey: "Key of the Feishu tenant that produced the event.",
56464
+ occurredAt: "Time when the event occurred, when supplied by Feishu.",
56465
+ body: "Original Feishu event payload."
56466
+ }
56467
+ },
56468
+ "airtable.on_record_changed": {
56469
+ configInputs: {
56470
+ baseId: "ID of the Airtable base to monitor.",
56471
+ fields: "Fields to include in each returned record. Leave empty to include every field.",
56472
+ formula: "Airtable formula used to filter records. Leave empty to include every record.",
56473
+ maxRecordsPerPoll: "Maximum number of records processed per poll.",
56474
+ tableIdOrName: "ID or name of the Airtable table to monitor.",
56475
+ triggerField: "Date or time field used to detect created or updated records.",
56476
+ view: "Airtable view used to filter and order records. Leave empty to use the table default."
56477
+ },
56478
+ outputs: { events: "Records created or updated since the previous poll." }
56479
+ },
56480
+ "gmail.on_message_received": {
56481
+ configInputs: {
56482
+ includeDrafts: "Also trigger on draft messages.",
56483
+ includeSpamAndTrash: "Also trigger on messages in Spam and Trash.",
56484
+ labelNamesOrIds: "Only trigger on messages carrying all of these labels, referenced by name or ID.",
56485
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
56486
+ readStatus: "Only trigger on read messages, unread messages, or both.",
56487
+ search: "Gmail search query that each message must match.",
56488
+ sender: "Only trigger on messages whose sender matches this address or name."
56489
+ },
56490
+ outputs: { events: "Messages received since the previous poll." }
56491
+ },
56492
+ "github.on_repo_event": {
56493
+ configInputs: {
56494
+ events: "GitHub webhook events that trigger a Run.",
56495
+ insecureSsl: "Allow GitHub to deliver webhooks without SSL certificate verification.",
56496
+ owner: "Owner of the GitHub repository.",
56497
+ repo: "Name of the GitHub repository."
56498
+ },
56499
+ outputs: {
56500
+ body: "Original GitHub webhook payload.",
56501
+ deliveryId: "Unique GitHub webhook delivery ID.",
56502
+ event: "GitHub webhook event name."
56503
+ }
56504
+ },
56505
+ "github.watch_pull_request": {
56506
+ configInputs: {
56507
+ owner: "Owner of the GitHub repository.",
56508
+ repo: "Name of the GitHub repository.",
56509
+ number: "Number of the pull request to watch."
56510
+ },
56511
+ outputs: {
56512
+ pullRequest: "Current pull request details after an observed change.",
56513
+ version: "Stable identifier for the observed pull request version."
56514
+ }
56515
+ },
56516
+ "gitlab.on_project_event": {
56517
+ configInputs: {
56518
+ events: "GitLab project events that trigger a Run.",
56519
+ insecureSsl: "Allow GitLab to deliver webhooks without SSL certificate verification.",
56520
+ project: "Numeric project ID or URL-encoded project path.",
56521
+ pushBranchFilter: "Branch or wildcard pattern used to filter push events. Leave empty to include every branch."
56522
+ },
56523
+ outputs: {
56524
+ body: "Original GitLab webhook payload.",
56525
+ deliveryId: "Unique ID generated for this webhook delivery.",
56526
+ event: "Normalized GitLab event name.",
56527
+ gitlabEvent: "Original GitLab event header value."
56528
+ }
56529
+ },
56530
+ "googlecalendar.on_event_changed": {
56531
+ configInputs: {
56532
+ calendarId: "ID of the Google Calendar to monitor.",
56533
+ changes: "Calendar event changes that trigger a Run.",
56534
+ matchTerm: "Text that must appear in the event summary, description, location, or attendees. Leave empty to match every event.",
56535
+ maxEventsPerPoll: "Maximum number of calendar events processed per poll."
56536
+ },
56537
+ outputs: { events: "Calendar events created, updated, or cancelled since the previous poll." }
56538
+ },
56539
+ "googledrive.changes_detected": {
56540
+ configInputs: driveChangesConfig,
56541
+ outputs: { events: "Google Drive changes available when the notification was received." }
56542
+ },
56543
+ "googledrive.watch_changes": {
56544
+ configInputs: driveChangesConfig,
56545
+ outputs: { events: "Google Drive changes observed by notifications or periodic scans." }
56546
+ },
56547
+ "googledrive.on_file_change": {
56548
+ configInputs: {
56549
+ changeType: "Whether created or updated items trigger a Run.",
56550
+ driveId: "Shared drive ID. Leave empty to use My Drive.",
56551
+ folderId: "ID of the Google Drive folder to monitor.",
56552
+ itemTypes: "Whether to monitor files, folders, or both.",
56553
+ maxFilesPerPoll: "Maximum number of changed items processed per poll.",
56554
+ mimeTypes: "Only trigger on these MIME types. Leave empty to include every MIME type.",
56555
+ namePrefix: "Only trigger on items whose names start with this text. Leave empty to include every name."
56556
+ },
56557
+ outputs: { events: "Files or folders created or updated since the previous poll." }
56558
+ },
56559
+ "googlesheets.on_row_added": {
56560
+ configInputs: {
56561
+ columnRange: "A1 column range to read, such as A:Z.",
56562
+ dateTimeRender: "How date and time values are returned.",
56563
+ firstDataRow: "First row containing data below the header.",
56564
+ headerRow: "Row whose cells become output field names.",
56565
+ maxRowsPerPoll: "Maximum number of new rows processed per poll.",
56566
+ sheet: "Name of the worksheet to monitor.",
56567
+ spreadsheetId: "ID of the Google Sheets spreadsheet.",
56568
+ valueRender: "How cell values are returned."
56569
+ },
56570
+ outputs: { events: "Rows appended since the previous poll." }
56571
+ },
56572
+ "linear.on_issue_changed": {
56573
+ configInputs: {
56574
+ teamId: "Linear Team UUID. Use Copy model UUID in Linear to find it.",
56575
+ stateIds: "Statuses from the selected Team. Leave empty for every status. Matches current status, not every transition into it."
56576
+ },
56577
+ outputs: { events: "Linear issues created or updated since the previous poll." }
56578
+ },
56579
+ "notion.on_database_page_event": {
56580
+ configInputs: {
56581
+ dataSourceId: "Data source ID within the database. Leave empty to use the primary data source.",
56582
+ databaseId: "ID of the Notion database to monitor.",
56583
+ events: "Page changes that trigger a Run.",
56584
+ includeProperties: "Include page properties in each output event.",
56585
+ maxItemsPerPoll: "Maximum number of changed pages processed per poll."
56586
+ },
56587
+ outputs: { events: "Database pages added or updated since the previous poll." }
56588
+ },
56589
+ "one_drive.on_item_changed": {
56590
+ configInputs: {
56591
+ events: "OneDrive item changes that trigger a Run.",
56592
+ itemId: "Only monitor this file or folder ID. Leave empty to monitor multiple items.",
56593
+ itemTypes: "Whether to monitor files, folders, or both.",
56594
+ maxItemsPerPoll: "Maximum number of changed items processed per poll.",
56595
+ parentFolderId: "Only monitor items in this parent folder. Leave empty to monitor the whole drive."
56596
+ },
56597
+ outputs: { events: "OneDrive items created, updated, or deleted since the previous poll." }
56598
+ },
56599
+ "outlook.on_message_received": {
56600
+ configInputs: {
56601
+ folder: "Well-known mail folder name, folder ID, or an empty value for the whole mailbox.",
56602
+ includeDrafts: "Also trigger on draft messages.",
56603
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
56604
+ readStatus: "Only trigger on read messages, unread messages, or both.",
56605
+ senderAddress: "Exact sender address. Leave empty to allow any sender.",
56606
+ subjectContains: "Case-insensitive text that must appear in the message subject.",
56607
+ withAttachmentsOnly: "Only trigger on messages that have attachments."
56608
+ },
56609
+ outputs: { events: "Outlook messages received since the previous poll." }
56610
+ },
56611
+ "shopify.on_shop_event": {
56612
+ configInputs: { topics: "Shopify webhook topics that trigger a Run." },
56613
+ outputs: {
56614
+ apiVersion: "Shopify API version used for the webhook.",
56615
+ body: "Original Shopify webhook payload.",
56616
+ eventId: "Unique Shopify event ID.",
56617
+ shopDomain: "Domain of the Shopify shop that produced the event.",
56618
+ topic: "Shopify webhook topic.",
56619
+ triggeredAt: "Time when Shopify triggered the webhook.",
56620
+ webhookId: "ID of the Shopify webhook subscription."
56621
+ }
56622
+ },
56623
+ "slack.on_message_posted": {
56624
+ configInputs: {
56625
+ channelId: "Slack conversation ID to watch, such as C0122KQ70S7E.",
56626
+ fromUserIds: "Only trigger on messages from these Slack user IDs. Leave empty to allow any author.",
56627
+ ignoreUserIds: "Never trigger on messages from these Slack user IDs.",
56628
+ includeBotMessages: "Also trigger on messages posted by bots and apps.",
56629
+ includeSystemMessages: "Also trigger on Slack system notices.",
56630
+ maxMessagesPerPoll: "Maximum number of messages processed per poll.",
56631
+ textContains: "Only trigger when message text contains this string, ignoring case."
56632
+ },
56633
+ outputs: { events: "Slack messages posted since the previous poll." }
56634
+ },
56635
+ "stripe.on_event": {
56636
+ configInputs: {
56637
+ apiVersion: "Stripe API version used for webhook events. Leave empty to use the account default.",
56638
+ events: "Stripe event types that trigger a Run.",
56639
+ includeConnectedAccounts: "Also receive events from connected Stripe accounts."
56640
+ },
56641
+ outputs: {
56642
+ body: "Original Stripe event payload.",
56643
+ event: "Stripe event type.",
56644
+ eventId: "Unique Stripe event ID.",
56645
+ livemode: "Whether the event was created in live mode."
56646
+ }
56647
+ },
56648
+ "telegram.on_update": {
56649
+ configInputs: {
56650
+ chatIds: "Only accept updates from these numeric Telegram chat IDs. Leave empty to allow every chat.",
56651
+ dropPendingUpdates: "Discard updates queued before the webhook is created or resumed.",
56652
+ updates: "Telegram update types that trigger a Run. Use * for the Telegram default set.",
56653
+ userIds: "Only accept updates from these numeric Telegram user IDs. Leave empty to allow every user."
56654
+ },
56655
+ outputs: {
56656
+ body: "Original Telegram update payload.",
56657
+ deliveryId: "Unique ID generated for this Telegram update.",
56658
+ event: "Telegram update type."
56659
+ }
56660
+ },
56661
+ "woocommerce.on_store_event": {
56662
+ configInputs: {
56663
+ events: "WooCommerce store events that trigger a Run.",
56664
+ webhookName: "Name shown for the webhook in WooCommerce."
56665
+ },
56666
+ outputs: {
56667
+ body: "Original WooCommerce webhook payload.",
56668
+ deliveryId: "Unique WooCommerce webhook delivery ID.",
56669
+ event: "WooCommerce event action.",
56670
+ resource: "WooCommerce resource type.",
56671
+ source: "URL of the WooCommerce store that produced the event.",
56672
+ topic: "Full WooCommerce webhook topic.",
56673
+ webhookId: "ID of the WooCommerce webhook subscription."
56674
+ }
56675
+ },
56676
+ "zendesk.on_event": {
56677
+ configInputs: { events: "Zendesk event types that trigger a Run." },
56678
+ outputs: {
56679
+ body: "Original Zendesk event payload.",
56680
+ deliveryId: "Unique ID generated for this Zendesk event delivery.",
56681
+ event: "Zendesk event type.",
56682
+ subject: "Zendesk subject associated with the event."
56683
+ }
56684
+ }
56685
+ };
56686
+ //#endregion
56687
+ //#region src/trigger/providers/fieldLabels.ts
56688
+ var triggerConfigFieldLabels = {
56689
+ "en": {
56690
+ "jira.on_issue_event": { sourceId: "Event source" },
56691
+ "fireflies.on_meeting_ready": { sourceId: "Event source" },
56692
+ "zoom.on_recording_ready": { sourceId: "Event source" },
56693
+ "sentry.on_issue_alert": { sourceId: "Event source" },
56694
+ "intercom.on_conversation_event": { sourceId: "Event source" },
56695
+ "slackbot.on_event": { sourceId: "Event source" },
56696
+ "asana.on_task_event": { projectId: "Project ID" },
56697
+ "calendly.on_booking_event": {},
56698
+ "clickup.on_task_event": { workspaceId: "Workspace ID" },
56699
+ "pandadoc.on_document_event": {},
56700
+ "pipedrive.on_crm_event": {},
56701
+ "resend.on_email_event": {},
56702
+ "typeform.on_form_response": { formId: "Form ID" },
56703
+ "vercel.on_deployment_event": {
56704
+ teamId: "Team ID",
56705
+ projectId: "Project ID"
56706
+ },
56707
+ "tally.on_form_response": { formId: "Form" },
56708
+ "feishu_app_bot.on_event": {
56709
+ sourceId: "Event source",
56710
+ eventTypes: "Events to receive"
56711
+ },
56712
+ "airtable.on_record_changed": {
56713
+ baseId: "Base",
56714
+ tableIdOrName: "Table",
56715
+ triggerField: "Trigger field"
56716
+ },
56717
+ "github.on_repo_event": {
56718
+ events: "Events",
56719
+ owner: "Repository owner",
56720
+ repo: "Repository"
56721
+ },
56722
+ "github.watch_pull_request": {
56723
+ owner: "Repository owner",
56724
+ repo: "Repository",
56725
+ number: "Pull request number"
56726
+ },
56727
+ "gitlab.on_project_event": {
56728
+ events: "Events",
56729
+ project: "Project"
56730
+ },
56731
+ "googlecalendar.on_event_changed": { calendarId: "Calendar" },
56732
+ "googledrive.on_file_change": {
56733
+ changeType: "Change type",
56734
+ folderId: "Folder"
56735
+ },
56736
+ "googlesheets.on_row_added": {
56737
+ sheet: "Worksheet",
56738
+ spreadsheetId: "Spreadsheet"
56739
+ },
56740
+ "linear.on_issue_changed": { teamId: "Team" },
56741
+ "notion.on_database_page_event": { databaseId: "Database" },
56742
+ "shopify.on_shop_event": { topics: "Topics" },
56743
+ "slack.on_message_posted": { channelId: "Channel" },
56744
+ "stripe.on_event": { events: "Events" },
56745
+ "telegram.on_update": { updates: "Updates" },
56746
+ "woocommerce.on_store_event": { events: "Events" },
56747
+ "zendesk.on_event": { events: "Events" }
56748
+ },
56749
+ "zh-CN": {
56750
+ "jira.on_issue_event": { sourceId: "事件源" },
56751
+ "fireflies.on_meeting_ready": { sourceId: "事件源" },
56752
+ "zoom.on_recording_ready": { sourceId: "事件源" },
56753
+ "sentry.on_issue_alert": { sourceId: "事件源" },
56754
+ "intercom.on_conversation_event": { sourceId: "事件源" },
56755
+ "slackbot.on_event": { sourceId: "事件源" },
56756
+ "asana.on_task_event": { projectId: "项目 ID" },
56757
+ "calendly.on_booking_event": {},
56758
+ "clickup.on_task_event": { workspaceId: "工作区 ID" },
56759
+ "pandadoc.on_document_event": {},
56760
+ "pipedrive.on_crm_event": {},
56761
+ "resend.on_email_event": {},
56762
+ "typeform.on_form_response": { formId: "表单 ID" },
56763
+ "vercel.on_deployment_event": {
56764
+ teamId: "团队 ID",
56765
+ projectId: "项目 ID"
56766
+ },
56767
+ "tally.on_form_response": { formId: "表单" },
56768
+ "feishu_app_bot.on_event": {
56769
+ sourceId: "事件源",
56770
+ eventTypes: "接收的事件"
56771
+ },
56772
+ "airtable.on_record_changed": {
56773
+ baseId: "Base",
56774
+ tableIdOrName: "数据表",
56775
+ triggerField: "触发字段"
56776
+ },
56777
+ "github.on_repo_event": {
56778
+ events: "事件",
56779
+ owner: "仓库所有者",
56780
+ repo: "仓库"
56781
+ },
56782
+ "github.watch_pull_request": {
56783
+ owner: "仓库所有者",
56784
+ repo: "仓库",
56785
+ number: "拉取请求编号"
56786
+ },
56787
+ "gitlab.on_project_event": {
56788
+ events: "事件",
56789
+ project: "项目"
56790
+ },
56791
+ "googlecalendar.on_event_changed": { calendarId: "日历" },
56792
+ "googledrive.on_file_change": {
56793
+ changeType: "变更类型",
56794
+ folderId: "文件夹"
56795
+ },
56796
+ "googlesheets.on_row_added": {
56797
+ sheet: "工作表",
56798
+ spreadsheetId: "电子表格"
56799
+ },
56800
+ "linear.on_issue_changed": { teamId: "团队" },
56801
+ "notion.on_database_page_event": { databaseId: "数据库" },
56802
+ "shopify.on_shop_event": { topics: "主题" },
56803
+ "slack.on_message_posted": { channelId: "频道" },
56804
+ "stripe.on_event": { events: "事件" },
56805
+ "telegram.on_update": { updates: "更新类型" },
56806
+ "woocommerce.on_store_event": { events: "事件" },
56807
+ "zendesk.on_event": { events: "事件" }
56808
+ },
56809
+ "zh-TW": {
56810
+ "jira.on_issue_event": { sourceId: "事件源" },
56811
+ "fireflies.on_meeting_ready": { sourceId: "事件源" },
56812
+ "zoom.on_recording_ready": { sourceId: "事件源" },
56813
+ "sentry.on_issue_alert": { sourceId: "事件源" },
56814
+ "intercom.on_conversation_event": { sourceId: "事件源" },
56815
+ "slackbot.on_event": { sourceId: "事件源" },
56816
+ "asana.on_task_event": { projectId: "專案 ID" },
56817
+ "calendly.on_booking_event": {},
56818
+ "clickup.on_task_event": { workspaceId: "工作區 ID" },
56819
+ "pandadoc.on_document_event": {},
56820
+ "pipedrive.on_crm_event": {},
56821
+ "resend.on_email_event": {},
56822
+ "typeform.on_form_response": { formId: "表單 ID" },
56823
+ "vercel.on_deployment_event": {
56824
+ teamId: "團隊 ID",
56825
+ projectId: "專案 ID"
56826
+ },
56827
+ "tally.on_form_response": { formId: "表單" },
56828
+ "feishu_app_bot.on_event": {
56829
+ sourceId: "事件來源",
56830
+ eventTypes: "接收的事件"
56831
+ },
56832
+ "airtable.on_record_changed": {
56833
+ baseId: "Base",
56834
+ tableIdOrName: "資料表",
56835
+ triggerField: "觸發欄位"
56836
+ },
56837
+ "github.on_repo_event": {
56838
+ events: "事件",
56839
+ owner: "儲存庫擁有者",
56840
+ repo: "儲存庫"
56841
+ },
56842
+ "github.watch_pull_request": {
56843
+ owner: "儲存庫擁有者",
56844
+ repo: "儲存庫",
56845
+ number: "提取要求編號"
56846
+ },
56847
+ "gitlab.on_project_event": {
56848
+ events: "事件",
56849
+ project: "專案"
56850
+ },
56851
+ "googlecalendar.on_event_changed": { calendarId: "日曆" },
56852
+ "googledrive.on_file_change": {
56853
+ changeType: "變更類型",
56854
+ folderId: "資料夾"
56855
+ },
56856
+ "googlesheets.on_row_added": {
56857
+ sheet: "工作表",
56858
+ spreadsheetId: "試算表"
56859
+ },
56860
+ "linear.on_issue_changed": { teamId: "團隊" },
56861
+ "notion.on_database_page_event": { databaseId: "資料庫" },
56862
+ "shopify.on_shop_event": { topics: "主題" },
56863
+ "slack.on_message_posted": { channelId: "頻道" },
56864
+ "stripe.on_event": { events: "事件" },
56865
+ "telegram.on_update": { updates: "更新類型" },
56866
+ "woocommerce.on_store_event": { events: "事件" },
56867
+ "zendesk.on_event": { events: "事件" }
56868
+ },
56869
+ "ja": {
56870
+ "jira.on_issue_event": { sourceId: "イベントソース" },
56871
+ "fireflies.on_meeting_ready": { sourceId: "イベントソース" },
56872
+ "zoom.on_recording_ready": { sourceId: "イベントソース" },
56873
+ "sentry.on_issue_alert": { sourceId: "イベントソース" },
56874
+ "intercom.on_conversation_event": { sourceId: "イベントソース" },
56875
+ "slackbot.on_event": { sourceId: "イベントソース" },
56876
+ "asana.on_task_event": { projectId: "プロジェクト ID" },
56877
+ "calendly.on_booking_event": {},
56878
+ "clickup.on_task_event": { workspaceId: "ワークスペース ID" },
56879
+ "pandadoc.on_document_event": {},
56880
+ "pipedrive.on_crm_event": {},
56881
+ "resend.on_email_event": {},
56882
+ "typeform.on_form_response": { formId: "フォーム ID" },
56883
+ "vercel.on_deployment_event": {
56884
+ teamId: "チーム ID",
56885
+ projectId: "プロジェクト ID"
56886
+ },
56887
+ "tally.on_form_response": { formId: "フォーム" },
56888
+ "feishu_app_bot.on_event": {
56889
+ sourceId: "イベントソース",
56890
+ eventTypes: "受信するイベント"
56891
+ },
56892
+ "airtable.on_record_changed": {
56893
+ baseId: "ベース",
56894
+ tableIdOrName: "テーブル",
56895
+ triggerField: "トリガーフィールド"
56896
+ },
56897
+ "github.on_repo_event": {
56898
+ events: "イベント",
56899
+ owner: "リポジトリの所有者",
56900
+ repo: "リポジトリ"
56901
+ },
56902
+ "github.watch_pull_request": {
56903
+ owner: "リポジトリの所有者",
56904
+ repo: "リポジトリ",
56905
+ number: "プルリクエスト番号"
56906
+ },
56907
+ "gitlab.on_project_event": {
56908
+ events: "イベント",
56909
+ project: "プロジェクト"
56910
+ },
56911
+ "googlecalendar.on_event_changed": { calendarId: "カレンダー" },
56912
+ "googledrive.on_file_change": {
56913
+ changeType: "変更の種類",
56914
+ folderId: "フォルダー"
56915
+ },
56916
+ "googlesheets.on_row_added": {
56917
+ sheet: "シート",
56918
+ spreadsheetId: "スプレッドシート"
56919
+ },
56920
+ "linear.on_issue_changed": { teamId: "チーム" },
56921
+ "notion.on_database_page_event": { databaseId: "データベース" },
56922
+ "shopify.on_shop_event": { topics: "トピック" },
56923
+ "slack.on_message_posted": { channelId: "チャンネル" },
56924
+ "stripe.on_event": { events: "イベント" },
56925
+ "telegram.on_update": { updates: "更新の種類" },
56926
+ "woocommerce.on_store_event": { events: "イベント" },
56927
+ "zendesk.on_event": { events: "イベント" }
56928
+ },
56929
+ "ko": {
56930
+ "jira.on_issue_event": { sourceId: "이벤트 소스" },
56931
+ "fireflies.on_meeting_ready": { sourceId: "이벤트 소스" },
56932
+ "zoom.on_recording_ready": { sourceId: "이벤트 소스" },
56933
+ "sentry.on_issue_alert": { sourceId: "이벤트 소스" },
56934
+ "intercom.on_conversation_event": { sourceId: "이벤트 소스" },
56935
+ "slackbot.on_event": { sourceId: "이벤트 소스" },
56936
+ "asana.on_task_event": { projectId: "프로젝트 ID" },
56937
+ "calendly.on_booking_event": {},
56938
+ "clickup.on_task_event": { workspaceId: "워크스페이스 ID" },
56939
+ "pandadoc.on_document_event": {},
56940
+ "pipedrive.on_crm_event": {},
56941
+ "resend.on_email_event": {},
56942
+ "typeform.on_form_response": { formId: "양식 ID" },
56943
+ "vercel.on_deployment_event": {
56944
+ teamId: "팀 ID",
56945
+ projectId: "프로젝트 ID"
56946
+ },
56947
+ "tally.on_form_response": { formId: "양식" },
56948
+ "feishu_app_bot.on_event": {
56949
+ sourceId: "이벤트 소스",
56950
+ eventTypes: "수신할 이벤트"
56951
+ },
56952
+ "airtable.on_record_changed": {
56953
+ baseId: "베이스",
56954
+ tableIdOrName: "테이블",
56955
+ triggerField: "트리거 필드"
56956
+ },
56957
+ "github.on_repo_event": {
56958
+ events: "이벤트",
56959
+ owner: "저장소 소유자",
56960
+ repo: "저장소"
56961
+ },
56962
+ "github.watch_pull_request": {
56963
+ owner: "저장소 소유자",
56964
+ repo: "저장소",
56965
+ number: "풀 리퀘스트 번호"
56966
+ },
56967
+ "gitlab.on_project_event": {
56968
+ events: "이벤트",
56969
+ project: "프로젝트"
56970
+ },
56971
+ "googlecalendar.on_event_changed": { calendarId: "캘린더" },
56972
+ "googledrive.on_file_change": {
56973
+ changeType: "변경 유형",
56974
+ folderId: "폴더"
56975
+ },
56976
+ "googlesheets.on_row_added": {
56977
+ sheet: "시트",
56978
+ spreadsheetId: "스프레드시트"
56979
+ },
56980
+ "linear.on_issue_changed": { teamId: "팀" },
56981
+ "notion.on_database_page_event": { databaseId: "데이터베이스" },
56982
+ "shopify.on_shop_event": { topics: "주제" },
56983
+ "slack.on_message_posted": { channelId: "채널" },
56984
+ "stripe.on_event": { events: "이벤트" },
56985
+ "telegram.on_update": { updates: "업데이트 유형" },
56986
+ "woocommerce.on_store_event": { events: "이벤트" },
56987
+ "zendesk.on_event": { events: "이벤트" }
56988
+ },
56989
+ "ru": {
56990
+ "jira.on_issue_event": { sourceId: "Источник событий" },
56991
+ "fireflies.on_meeting_ready": { sourceId: "Источник событий" },
56992
+ "zoom.on_recording_ready": { sourceId: "Источник событий" },
56993
+ "sentry.on_issue_alert": { sourceId: "Источник событий" },
56994
+ "intercom.on_conversation_event": { sourceId: "Источник событий" },
56995
+ "slackbot.on_event": { sourceId: "Источник событий" },
56996
+ "asana.on_task_event": { projectId: "ID проекта" },
56997
+ "calendly.on_booking_event": {},
56998
+ "clickup.on_task_event": { workspaceId: "ID рабочего пространства" },
56999
+ "pandadoc.on_document_event": {},
57000
+ "pipedrive.on_crm_event": {},
57001
+ "resend.on_email_event": {},
57002
+ "typeform.on_form_response": { formId: "ID формы" },
57003
+ "vercel.on_deployment_event": {
57004
+ teamId: "ID команды",
57005
+ projectId: "ID проекта"
57006
+ },
57007
+ "tally.on_form_response": { formId: "Форма" },
57008
+ "feishu_app_bot.on_event": {
57009
+ sourceId: "Источник событий",
57010
+ eventTypes: "Принимаемые события"
57011
+ },
57012
+ "airtable.on_record_changed": {
57013
+ baseId: "База",
57014
+ tableIdOrName: "Таблица",
57015
+ triggerField: "Поле триггера"
57016
+ },
57017
+ "github.on_repo_event": {
57018
+ events: "События",
57019
+ owner: "Владелец репозитория",
57020
+ repo: "Репозиторий"
57021
+ },
57022
+ "github.watch_pull_request": {
57023
+ owner: "Владелец репозитория",
57024
+ repo: "Репозиторий",
57025
+ number: "Номер запроса на слияние"
57026
+ },
57027
+ "gitlab.on_project_event": {
57028
+ events: "События",
57029
+ project: "Проект"
57030
+ },
57031
+ "googlecalendar.on_event_changed": { calendarId: "Календарь" },
57032
+ "googledrive.on_file_change": {
57033
+ changeType: "Тип изменения",
57034
+ folderId: "Папка"
57035
+ },
57036
+ "googlesheets.on_row_added": {
57037
+ sheet: "Лист",
57038
+ spreadsheetId: "Таблица"
57039
+ },
57040
+ "linear.on_issue_changed": { teamId: "Команда" },
57041
+ "notion.on_database_page_event": { databaseId: "База данных" },
57042
+ "shopify.on_shop_event": { topics: "Темы" },
57043
+ "slack.on_message_posted": { channelId: "Канал" },
57044
+ "stripe.on_event": { events: "События" },
57045
+ "telegram.on_update": { updates: "Типы обновлений" },
57046
+ "woocommerce.on_store_event": { events: "События" },
57047
+ "zendesk.on_event": { events: "События" }
57048
+ },
57049
+ "fr": {
57050
+ "jira.on_issue_event": { sourceId: "Source d’événements" },
57051
+ "fireflies.on_meeting_ready": { sourceId: "Source d’événements" },
57052
+ "zoom.on_recording_ready": { sourceId: "Source d’événements" },
57053
+ "sentry.on_issue_alert": { sourceId: "Source d’événements" },
57054
+ "intercom.on_conversation_event": { sourceId: "Source d’événements" },
57055
+ "slackbot.on_event": { sourceId: "Source d’événements" },
57056
+ "asana.on_task_event": { projectId: "ID du projet" },
57057
+ "calendly.on_booking_event": {},
57058
+ "clickup.on_task_event": { workspaceId: "ID de l’espace de travail" },
57059
+ "pandadoc.on_document_event": {},
57060
+ "pipedrive.on_crm_event": {},
57061
+ "resend.on_email_event": {},
57062
+ "typeform.on_form_response": { formId: "ID du formulaire" },
57063
+ "vercel.on_deployment_event": {
57064
+ teamId: "ID de l’équipe",
57065
+ projectId: "ID du projet"
57066
+ },
57067
+ "tally.on_form_response": { formId: "Formulaire" },
57068
+ "feishu_app_bot.on_event": {
57069
+ sourceId: "Source d’événements",
57070
+ eventTypes: "Événements à recevoir"
57071
+ },
57072
+ "airtable.on_record_changed": {
57073
+ baseId: "Base",
57074
+ tableIdOrName: "Table",
57075
+ triggerField: "Champ déclencheur"
57076
+ },
57077
+ "github.on_repo_event": {
57078
+ events: "Événements",
57079
+ owner: "Propriétaire du dépôt",
57080
+ repo: "Dépôt"
57081
+ },
57082
+ "github.watch_pull_request": {
57083
+ owner: "Propriétaire du dépôt",
57084
+ repo: "Dépôt",
57085
+ number: "Numéro de la demande de tirage"
57086
+ },
57087
+ "gitlab.on_project_event": {
57088
+ events: "Événements",
57089
+ project: "Projet"
57090
+ },
57091
+ "googlecalendar.on_event_changed": { calendarId: "Agenda" },
57092
+ "googledrive.on_file_change": {
57093
+ changeType: "Type de modification",
57094
+ folderId: "Dossier"
57095
+ },
57096
+ "googlesheets.on_row_added": {
57097
+ sheet: "Feuille",
57098
+ spreadsheetId: "Feuille de calcul"
57099
+ },
57100
+ "linear.on_issue_changed": { teamId: "Équipe" },
57101
+ "notion.on_database_page_event": { databaseId: "Base de données" },
57102
+ "shopify.on_shop_event": { topics: "Sujets" },
57103
+ "slack.on_message_posted": { channelId: "Canal" },
57104
+ "stripe.on_event": { events: "Événements" },
57105
+ "telegram.on_update": { updates: "Types de mise à jour" },
57106
+ "woocommerce.on_store_event": { events: "Événements" },
57107
+ "zendesk.on_event": { events: "Événements" }
57108
+ }
57109
+ };
57110
+ //#endregion
57111
+ //#region src/trigger/providers/localization.ts
57112
+ var loaders = {
57113
+ "zh-CN": () => import("./zh-CN-Dg_xSGde.js"),
57114
+ "zh-TW": () => import("./zh-TW-oxuLwsV0.js"),
57115
+ "ja": () => import("./ja-CxQBHr2J.js"),
57116
+ "ko": () => import("./ko-D1Exiv1h.js"),
57117
+ "ru": () => import("./ru-BzLZv0B7.js"),
57118
+ "fr": () => import("./fr-CNTSedYU.js")
57119
+ };
57120
+ var cached = /* @__PURE__ */ new Map();
57121
+ var english = Promise.resolve({});
57122
+ function loadTriggerTranslations(locale) {
57123
+ if (locale == "en") return english;
57124
+ const existing = cached.get(locale);
57125
+ if (existing != null) return existing;
57126
+ const request = loaders[locale]().then((module) => module.default);
57127
+ cached.set(locale, request);
57128
+ request.catch(() => {
57129
+ if (cached.get(locale) == request) cached.delete(locale);
57130
+ });
57131
+ return request;
57132
+ }
57133
+ async function localizeTrigger(definition, locale) {
57134
+ const copy = (await loadTriggerTranslations(locale))[definition.key];
57135
+ const englishFields = englishTriggerFieldDescriptions[definition.key];
57136
+ return {
57137
+ configInputs: fieldDescriptions(definition.configInputs, copy?.configInputs, englishFields?.configInputs),
57138
+ configInputLabels: triggerConfigFieldLabels[locale][definition.key] ?? {},
57139
+ displayName: copy?.displayName ?? definition.displayName,
57140
+ description: copy?.description ?? definition.description,
57141
+ outputs: fieldDescriptions(definition.outputs, copy?.outputs, englishFields?.outputs)
57142
+ };
57143
+ }
57144
+ function fieldDescriptions(fields, translations, fallback) {
57145
+ return Object.fromEntries(fields.flatMap((field) => {
57146
+ if (!("handle" in field)) return [];
57147
+ const description = translations?.[field.handle] ?? fallback?.[field.handle] ?? field.description;
57148
+ return description == null ? [] : [[field.handle, description]];
57149
+ }));
57150
+ }
57151
+ //#endregion
56148
57152
  //#region src/flow/common/inputValue.ts
56149
57153
  /** An explicit clear suppresses the default; absent mappings still inherit it. */
56150
57154
  function inputValue(mapping, fallback) {
@@ -56176,6 +57180,167 @@ function dequal$1(foo, bar) {
56176
57180
  return foo !== foo && bar !== bar;
56177
57181
  }
56178
57182
  //#endregion
57183
+ //#region src/http/common/headers.ts
57184
+ /** Header names are case-insensitive; never silently combine duplicate business fields. */
57185
+ function httpHeaderNameIssue(name, names) {
57186
+ if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) return "invalid";
57187
+ if (names.some((candidate) => candidate.toLowerCase() === name.toLowerCase())) return "duplicate";
57188
+ }
57189
+ //#endregion
57190
+ //#region src/flow/common/requestParameters.ts
57191
+ var requestParameterSchema = strictObject({
57192
+ mode: _enum(["fields", "object"]).default("fields"),
57193
+ names: array(string$1()).default([])
57194
+ });
57195
+ function requestParameterHandle(group, name) {
57196
+ return `${group === "query" ? "query" : "header"}.${name}`;
57197
+ }
57198
+ function requestParameterPorts(config, querySchema, queryValueSchema, headerSchema) {
57199
+ return ["query", "headers"].flatMap((group) => config[group].mode === "object" ? [{
57200
+ handle: group,
57201
+ jsonSchema: group === "query" ? querySchema : headerSchema,
57202
+ nullable: true
57203
+ }] : config[group].names.filter((name) => name.trim()).map((name) => ({
57204
+ handle: requestParameterHandle(group, name),
57205
+ jsonSchema: group === "query" ? queryValueSchema : { type: "string" },
57206
+ nullable: true
57207
+ })));
57208
+ }
57209
+ function retainRequestPorts(ports, old = []) {
57210
+ const remaining = new Map(ports.map((port) => [port.handle, port]));
57211
+ return [...old.flatMap((item) => {
57212
+ if ("group" in item) return [item];
57213
+ const next = remaining.get(item.handle);
57214
+ if (next == null) return [];
57215
+ remaining.delete(item.handle);
57216
+ return [dequal$1(item.jsonSchema, next.jsonSchema) && item.nullable == next.nullable ? item : next];
57217
+ }), ...remaining.values()];
57218
+ }
57219
+ function requestParameterIssues(config) {
57220
+ const issues = [];
57221
+ for (const group of ["query", "headers"]) {
57222
+ if (config[group].mode !== "fields") continue;
57223
+ const seen = /* @__PURE__ */ new Set();
57224
+ for (const [index, name] of config[group].names.entries()) {
57225
+ const key = group === "headers" ? name.toLowerCase() : name;
57226
+ if (!name.trim() || seen.has(key)) issues.push({
57227
+ field: group,
57228
+ index,
57229
+ code: "parameterNamesInvalid",
57230
+ message: "Parameter names must be nonempty and unique."
57231
+ });
57232
+ seen.add(key);
57233
+ if (group === "headers" && httpHeaderNameIssue(name, []) === "invalid") issues.push({
57234
+ field: group,
57235
+ index,
57236
+ code: "headerNameInvalid",
57237
+ message: "Invalid HTTP header name."
57238
+ });
57239
+ }
57240
+ }
57241
+ return issues;
57242
+ }
57243
+ //#endregion
57244
+ //#region src/connector/common/proxy.ts
57245
+ var connectorProxyConfigSchema = strictObject({
57246
+ providerId: string$1().min(1),
57247
+ connectionId: string$1().optional(),
57248
+ method: _enum([
57249
+ "GET",
57250
+ "POST",
57251
+ "PUT",
57252
+ "PATCH",
57253
+ "DELETE"
57254
+ ]).default("GET"),
57255
+ query: requestParameterSchema.default({
57256
+ mode: "fields",
57257
+ names: []
57258
+ }),
57259
+ headers: requestParameterSchema.default({
57260
+ mode: "fields",
57261
+ names: []
57262
+ }),
57263
+ bodyFormat: _enum(["none", "json"]).default("none")
57264
+ });
57265
+ var connectorProxyExecutorSchema = connectorProxyConfigSchema.extend({ kind: literal("connector-proxy") });
57266
+ var connectorProxyQueryValueSchema = { type: [
57267
+ "string",
57268
+ "number",
57269
+ "boolean",
57270
+ "null"
57271
+ ] };
57272
+ var connectorProxyQuerySchema = {
57273
+ type: "object",
57274
+ additionalProperties: connectorProxyQueryValueSchema
57275
+ };
57276
+ var connectorProxyHeaderSchema = {
57277
+ type: "object",
57278
+ additionalProperties: { type: "string" }
57279
+ };
57280
+ var connectorProxyBodyInput = {
57281
+ handle: "body",
57282
+ jsonSchema: {},
57283
+ nullable: true
57284
+ };
57285
+ function connectorProxySupportsBody(method) {
57286
+ return method !== "GET";
57287
+ }
57288
+ function connectorProxyHasBody(mapping, defaultValue) {
57289
+ if (mapping?.kind === "unset") return false;
57290
+ return mapping == null ? defaultValue !== void 0 : mapping.kind === "value" || mapping.sources.length > 0;
57291
+ }
57292
+ function connectorProxyTask(config, name = "Custom API Request", previous) {
57293
+ const { connectionId, ...settings } = config;
57294
+ const inputs = [
57295
+ {
57296
+ handle: "endpoint",
57297
+ jsonSchema: { type: "string" },
57298
+ nullable: false
57299
+ },
57300
+ ...requestParameterPorts(config, connectorProxyQuerySchema, connectorProxyQueryValueSchema, connectorProxyHeaderSchema),
57301
+ ...config.bodyFormat === "none" ? [] : [connectorProxyBodyInput]
57302
+ ];
57303
+ const outputs = [
57304
+ {
57305
+ handle: "body",
57306
+ jsonSchema: {},
57307
+ nullable: true
57308
+ },
57309
+ {
57310
+ handle: "statusCode",
57311
+ jsonSchema: { type: "integer" },
57312
+ nullable: false
57313
+ },
57314
+ {
57315
+ handle: "headers",
57316
+ jsonSchema: connectorProxyHeaderSchema,
57317
+ nullable: false
57318
+ },
57319
+ {
57320
+ handle: "bodyEncoding",
57321
+ jsonSchema: { const: "base64" },
57322
+ nullable: true
57323
+ }
57324
+ ];
57325
+ return {
57326
+ name,
57327
+ executor: {
57328
+ ...settings,
57329
+ ...connectionId === void 0 ? {} : { connectionId },
57330
+ kind: "connector-proxy"
57331
+ },
57332
+ inputs: retainRequestPorts(inputs, previous?.inputs),
57333
+ outputs: retainRequestPorts(outputs, previous?.outputs)
57334
+ };
57335
+ }
57336
+ function connectorProxyIssues(config, hasBody = config.bodyFormat !== "none") {
57337
+ return [...requestParameterIssues(config), ...!connectorProxySupportsBody(config.method) && hasBody ? [{
57338
+ field: "bodyFormat",
57339
+ code: "bodyUnsupported",
57340
+ message: "GET does not support a request body."
57341
+ }] : []];
57342
+ }
57343
+ //#endregion
56179
57344
  //#region ../../node_modules/.bun/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/deep-compare-strict.js
56180
57345
  function deepCompareStrict(a, b) {
56181
57346
  const typeofa = typeof a;
@@ -60278,18 +61443,7 @@ function isHttpHost(value) {
60278
61443
  return httpHostPattern.test(value) && (!value.startsWith("*.") || value.slice(2).includes("."));
60279
61444
  }
60280
61445
  //#endregion
60281
- //#region src/http/common/headers.ts
60282
- /** Header names are case-insensitive; never silently combine duplicate business fields. */
60283
- function httpHeaderNameIssue(name, names) {
60284
- if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) return "invalid";
60285
- if (names.some((candidate) => candidate.toLowerCase() === name.toLowerCase())) return "duplicate";
60286
- }
60287
- //#endregion
60288
61446
  //#region src/http/common/httpRequest.ts
60289
- var parameterSchema = strictObject({
60290
- mode: _enum(["fields", "object"]).default("fields"),
60291
- names: array(string$1()).default([])
60292
- });
60293
61447
  var httpRequestConfigSchema = strictObject({
60294
61448
  method: _enum([
60295
61449
  "GET",
@@ -60300,11 +61454,11 @@ var httpRequestConfigSchema = strictObject({
60300
61454
  "HEAD",
60301
61455
  "OPTIONS"
60302
61456
  ]).default("GET"),
60303
- query: parameterSchema.default({
61457
+ query: requestParameterSchema.default({
60304
61458
  mode: "fields",
60305
61459
  names: []
60306
61460
  }),
60307
- headers: parameterSchema.default({
61461
+ headers: requestParameterSchema.default({
60308
61462
  mode: "fields",
60309
61463
  names: []
60310
61464
  }),
@@ -60351,32 +61505,12 @@ var httpQuerySchema = {
60351
61505
  function httpAuthHandles(config) {
60352
61506
  return config.authentication.type == "none" ? [] : config.authentication.type == "basic" ? ["auth.username", "auth.password"] : ["auth.token"];
60353
61507
  }
60354
- function retain(ports, old) {
60355
- const remaining = new Map(ports.map((port) => [port.handle, port]));
60356
- return [...old.flatMap((item) => {
60357
- if ("group" in item) return [item];
60358
- const next = remaining.get(item.handle);
60359
- if (next == null) return [];
60360
- remaining.delete(item.handle);
60361
- return [dequal$1(item.jsonSchema, next.jsonSchema) && item.nullable == next.nullable ? item : next];
60362
- }), ...remaining.values()];
60363
- }
60364
61508
  function httpRequestTask(config = httpRequestConfigSchema.parse({}), name = "HTTP Request", previous) {
60365
61509
  const inputs = [{
60366
61510
  handle: "url",
60367
61511
  jsonSchema: { type: "string" },
60368
61512
  nullable: false
60369
- }];
60370
- for (const group of ["query", "headers"]) if (config[group].mode == "object") inputs.push({
60371
- handle: group,
60372
- jsonSchema: group == "query" ? httpQuerySchema : httpHeaderSchema,
60373
- nullable: true
60374
- });
60375
- else for (const parameterName of config[group].names.filter((value) => value.trim())) inputs.push({
60376
- handle: `${group == "query" ? "query" : "header"}.${parameterName}`,
60377
- jsonSchema: group == "query" ? queryValueSchema : { type: "string" },
60378
- nullable: true
60379
- });
61513
+ }, ...requestParameterPorts(config, httpQuerySchema, queryValueSchema, httpHeaderSchema)];
60380
61514
  if (config.bodyFormat != "none") inputs.push({
60381
61515
  handle: "body",
60382
61516
  jsonSchema: config.bodyFormat == "json" ? {} : config.bodyFormat == "text" ? { type: "string" } : httpQuerySchema,
@@ -60410,8 +61544,8 @@ function httpRequestTask(config = httpRequestConfigSchema.parse({}), name = "HTT
60410
61544
  ...config,
60411
61545
  kind: "http-request"
60412
61546
  },
60413
- inputs: retain(inputs, previous?.inputs ?? []),
60414
- outputs: retain(outputs, previous?.outputs ?? [])
61547
+ inputs: retainRequestPorts(inputs, previous?.inputs),
61548
+ outputs: retainRequestPorts(outputs, previous?.outputs)
60415
61549
  };
60416
61550
  }
60417
61551
  function httpRequestIssues(config) {
@@ -60421,26 +61555,7 @@ function httpRequestIssues(config) {
60421
61555
  code: "bodyUnsupported",
60422
61556
  message: "GET and HEAD do not support a request body."
60423
61557
  });
60424
- for (const group of ["query", "headers"]) {
60425
- if (config[group].mode != "fields") continue;
60426
- const seen = /* @__PURE__ */ new Set();
60427
- for (const [index, name] of config[group].names.entries()) {
60428
- const key = group == "headers" ? name.toLowerCase() : name;
60429
- if (!name.trim() || seen.has(key)) issues.push({
60430
- field: group,
60431
- index,
60432
- code: "parameterNamesInvalid",
60433
- message: "Parameter names must be nonempty and unique."
60434
- });
60435
- seen.add(key);
60436
- if (group == "headers" && httpHeaderNameIssue(name, []) === "invalid") issues.push({
60437
- field: group,
60438
- index,
60439
- code: "headerNameInvalid",
60440
- message: "Invalid HTTP header name."
60441
- });
60442
- }
60443
- }
61558
+ issues.push(...requestParameterIssues(config));
60444
61559
  const auth = config.authentication;
60445
61560
  if (auth.type != "none") {
60446
61561
  const group = auth.type == "apiKey" && auth.in == "query" ? "query" : "headers";
@@ -60866,7 +61981,8 @@ var managedFields = object$2({
60866
61981
  revisionId: text
60867
61982
  }),
60868
61983
  httpRequestExecutorSchema,
60869
- skipDuplicatesExecutorSchema
61984
+ skipDuplicatesExecutorSchema,
61985
+ connectorProxyExecutorSchema
60870
61986
  ])
60871
61987
  });
60872
61988
  var managed = managedFields.transform(limitDecisionTask);
@@ -61137,7 +62253,8 @@ var revision = object$2({
61137
62253
  literal(10),
61138
62254
  literal(11),
61139
62255
  literal(12),
61140
- literal(13)
62256
+ literal(13),
62257
+ literal(14)
61141
62258
  ]),
61142
62259
  document: document$1,
61143
62260
  modules: record$3(text, module$1)
@@ -61338,6 +62455,7 @@ array(union$1([...new Map(Object.entries(shapes).map(([kind, shape]) => [kind, s
61338
62455
  ...shape
61339
62456
  })])).values()])).min(1);
61340
62457
  function checkModelVersion(content) {
62458
+ if (content.modelVersion < 14 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind === "task" && "executor" in candidateNode.task && candidateNode.task.executor.kind === "connector-proxy")) throw new TypeError("Custom API Request requires Flow model v14.");
61341
62459
  if (content.modelVersion < 13 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind === "task" && "executor" in candidateNode.task && candidateNode.task.executor.kind === "skip-duplicates")) throw new Error("Skip Duplicates requires Flow model v13.");
61342
62460
  if (content.modelVersion < 12 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind == "task" && "moduleId" in candidateNode.task && candidateNode.task.capabilities?.some((item) => item.kind == "http"))) throw new TypeError("Code HTTP access requires Flow model version 12.");
61343
62461
  if (content.modelVersion < 11 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind == "task" && "executor" in candidateNode.task && candidateNode.task.executor.kind == "http-request")) throw new TypeError("HTTP Request requires Flow model version 11.");
@@ -61509,7 +62627,7 @@ var nodeErrorSchema = {
61509
62627
  }
61510
62628
  };
61511
62629
  function supportsNodeErrorHandling(node) {
61512
- return supportsNodeRetry(node) || node.kind === "task" && "executor" in node.task && node.task.executor.kind === "skip-duplicates";
62630
+ return supportsNodeRetry(node) || node.kind === "task" && "executor" in node.task && ["skip-duplicates", "connector-proxy"].includes(node.task.executor.kind);
61513
62631
  }
61514
62632
  function nodeSystemOutputPorts(node) {
61515
62633
  return supportsNodeErrorHandling(node) && node.onError == "error" ? { error: {
@@ -61566,6 +62684,13 @@ function connectionUsage$7(document) {
61566
62684
  name
61567
62685
  });
61568
62686
  if (task?.executor.kind == "connector") add("connector", task.executor.action, task.executor.connectionId);
62687
+ if (task?.executor.kind == "connector-proxy") uses.push({
62688
+ kind: "connector-proxy",
62689
+ providerId: task.executor.providerId,
62690
+ connectionId: task.executor.connectionId,
62691
+ nodeId,
62692
+ name
62693
+ });
61569
62694
  if (node.kind == "task" && "moduleId" in node.task) {
61570
62695
  for (const capability of node.task.capabilities ?? []) if ("mode" in capability && capability.mode == "independent") for (const action of capability.actions) add("code", action.action, action.connectionId);
61571
62696
  }
@@ -61780,6 +62905,17 @@ function triggerOutputPorts(trigger) {
61780
62905
  return Object.fromEntries(triggerOutputDefinitions(trigger).map(({ handle, ...port }) => [handle, port]));
61781
62906
  }
61782
62907
  //#endregion
62908
+ //#region src/base/common/jsonSchema.ts
62909
+ /** Keep local definition references usable when a property becomes a standalone schema. */
62910
+ function propertySchemaWithDefinitions(root, schema) {
62911
+ const property = toPlainObject(schema);
62912
+ if (property == null) return schema;
62913
+ const result = Object.assign({}, property);
62914
+ if (result.$defs == null && root.$defs != null) result.$defs = root.$defs;
62915
+ if (result.definitions == null && root.definitions != null) result.definitions = root.definitions;
62916
+ return result;
62917
+ }
62918
+ //#endregion
61783
62919
  //#region src/flow/common/sourceField.ts
61784
62920
  /** Only explicitly declared, first-level object properties are selectable. */
61785
62921
  function sourceFields(output) {
@@ -61796,7 +62932,7 @@ function sourceFields(output) {
61796
62932
  field,
61797
62933
  port: {
61798
62934
  ...typeof description == "string" ? { description } : {},
61799
- jsonSchema,
62935
+ jsonSchema: propertySchemaWithDefinitions(schema, jsonSchema),
61800
62936
  nullable: missingParent || !required.includes(field)
61801
62937
  }
61802
62938
  };
@@ -62612,8 +63748,8 @@ function selectOperation(value, sourceUrl, path, method) {
62612
63748
  }
62613
63749
  //#endregion
62614
63750
  //#region src/runtime/common/engineContract.ts
62615
- /** v10 adds persistent Flow State to the published v9 Node compatibility and fetch contract. */
62616
- var currentEngineContract = "open-flow-engine/v10";
63751
+ /** v11 adds Provider API requests through Connector Proxy. */
63752
+ var currentEngineContract = "open-flow-engine/v11";
62617
63753
  /** The published v8 Node compatibility contract, retained for existing Publications and Runs. */
62618
63754
  var nodejsEngineContract = "open-flow-engine/v8/nodejs-compat-v1";
62619
63755
  var platformSource = (contract) => `export const engineContract = ${JSON.stringify(contract)}
@@ -62663,13 +63799,19 @@ var v9Contract = {
62663
63799
  codeFetch: true,
62664
63800
  platformSource: platformSource("open-flow-engine/v9")
62665
63801
  };
62666
- var currentContract = {
63802
+ var v10Contract = {
62667
63803
  ...v9Contract,
62668
63804
  flowState: true,
63805
+ platformSource: platformSource("open-flow-engine/v10")
63806
+ };
63807
+ var currentContract = {
63808
+ ...v10Contract,
63809
+ connectorProxy: true,
62669
63810
  platformSource: platformSource(currentEngineContract)
62670
63811
  };
62671
63812
  function findEngineContract(contract) {
62672
- if (contract == "open-flow-engine/v10") return currentContract;
63813
+ if (contract == "open-flow-engine/v11") return currentContract;
63814
+ if (contract == "open-flow-engine/v10") return v10Contract;
62673
63815
  if (contract == "open-flow-engine/v9") return v9Contract;
62674
63816
  if (contract == "open-flow-engine/v8") return v8Contract;
62675
63817
  if (contract == "open-flow-engine/v8/nodejs-compat-v1") return nodejsContract;
@@ -63665,7 +64807,10 @@ var RevisionView = class {
63665
64807
  const separator = actionId.indexOf(".");
63666
64808
  if (separator > 0) connectorProviderIds.add(actionId.slice(0, separator));
63667
64809
  }
63668
- for (const node of Object.values(this.#document.graph.nodes)) if (node.kind == "integration" || node.kind == "poll") connectorProviderIds.add(node.definition.provider);
64810
+ for (const node of Object.values(this.#document.graph.nodes)) {
64811
+ if (node.kind == "integration" || node.kind == "poll") connectorProviderIds.add(node.definition.provider);
64812
+ if (node.kind === "task" && "executor" in node.task && node.task.executor.kind === "connector-proxy") connectorProviderIds.add(node.task.executor.providerId);
64813
+ }
63669
64814
  this.connectorProviderIds = connectorProviderIds;
63670
64815
  }
63671
64816
  inputMappings(node) {
@@ -64062,6 +65207,7 @@ var type$3 = _enum([
64062
65207
  "integration",
64063
65208
  "code",
64064
65209
  "connector",
65210
+ "connector-proxy",
64065
65211
  "agent",
64066
65212
  "llm",
64067
65213
  "decision",
@@ -64196,6 +65342,7 @@ var authoringConfigurations = {
64196
65342
  capabilities: authoringCapabilities.optional()
64197
65343
  }),
64198
65344
  "connector": authoringDefinitionSchemas.connector.omit({ outputMode: true }).strict(),
65345
+ "connector-proxy": connectorProxyConfigSchema,
64199
65346
  "openapi": authoringOpenApiSchema,
64200
65347
  "http-request": httpRequestConfigSchema,
64201
65348
  "skip-duplicates": skipDuplicatesConfigSchema,
@@ -64761,7 +65908,12 @@ function savedVerticalNodeWidths(value) {
64761
65908
  //#region src/workbench/browser/runtime/workspace.ts
64762
65909
  function semanticNodeIcon(node, connectorActions, providers = {}) {
64763
65910
  if (node.node.icon != null) return node.node.icon;
64764
- if (node.kind != "task" || node.definition == null || !("executor" in node.definition) || node.definition.executor.kind != "connector") return nodeIcon(node);
65911
+ if (node.kind != "task" || node.definition == null || !("executor" in node.definition)) return nodeIcon(node);
65912
+ if (node.definition.executor.kind === "connector-proxy") {
65913
+ const provider = providers[node.definition.executor.providerId];
65914
+ return provider == null ? nodeIcon(node) : providerIcon(provider);
65915
+ }
65916
+ if (node.definition.executor.kind !== "connector") return nodeIcon(node);
64765
65917
  const actionId = node.definition.executor.action;
64766
65918
  const provider = connectorActions[actionId] ?? providers[actionId.split(".")[0]];
64767
65919
  return provider == null ? nodeIcon(node) : providerIcon(provider);
@@ -64805,7 +65957,7 @@ function nodeIcon(node) {
64805
65957
  if (task.executor.kind == "http-request") return ":lucide-light:globe:";
64806
65958
  if (task.executor.kind == "skip-duplicates") return ":lucide-light:list-filter:";
64807
65959
  if (task.executor.kind == "openapi") return ":logos:openapi-icon:";
64808
- return task.executor.kind == "connector" ? ":carbon:connection-signal:" : ":carbon:machine-learning-model:";
65960
+ return task.executor.kind == "connector" || task.executor.kind === "connector-proxy" ? ":carbon:connection-signal:" : ":carbon:machine-learning-model:";
64809
65961
  }
64810
65962
  }
64811
65963
  }
@@ -65068,7 +66220,8 @@ function executorName(task, providerName, t) {
65068
66220
  if (task.executor.kind == "openapi") return "OpenAPI";
65069
66221
  if (task.executor.kind == "skip-duplicates") return t?.("flowState.nodeTitle") ?? "Skip Duplicates";
65070
66222
  if (task.executor.kind == "llm") return t?.("designer.executorLlm") ?? "LLM";
65071
- return `${t?.("designer.executorConnector") ?? "Connector"} · ${providerName ?? task.executor.action.split(".")[0]}`;
66223
+ const providerId = task.executor.kind === "connector-proxy" ? task.executor.providerId : task.executor.action.split(".")[0];
66224
+ return `${t?.("designer.executorConnector") ?? "Connector"} · ${providerName ?? providerId}`;
65072
66225
  }
65073
66226
  function triggerIcon(trigger) {
65074
66227
  switch (trigger.kind) {
@@ -65275,13 +66428,14 @@ function semanticDesignerNode(nodeId, resolved, ports, position, context) {
65275
66428
  const inputs = groupedInputs(resolved, designerInputs(nodeId, node, ports, context.revision));
65276
66429
  const outputs = groupedOutputs(resolved, designerOutputs(ports));
65277
66430
  const task = resolved.kind == "task" ? resolved.definition : void 0;
65278
- const connector = task != null && "executor" in task && task.executor.kind == "connector" ? task.executor : void 0;
65279
- const connectorAction = connector == null ? void 0 : context.connectorActions[connector.action];
65280
- const connectorProvider = connector == null ? void 0 : context.providers[connector.action.split(".")[0]];
65281
- const connections = connectorAction == null ? void 0 : context.connectionCatalogs[connectorAction.serviceId];
66431
+ const connector = task != null && "executor" in task && (task.executor.kind == "connector" || task.executor.kind === "connector-proxy") ? task.executor : void 0;
66432
+ const connectorAction = connector?.kind !== "connector" ? void 0 : context.connectorActions[connector.action];
66433
+ const providerId = connector?.kind === "connector-proxy" ? connector.providerId : connector?.action.split(".")[0];
66434
+ const connectorProvider = providerId == null ? void 0 : context.providers[providerId];
66435
+ const connections = providerId == null ? void 0 : context.connectionCatalogs[providerId];
65282
66436
  const connectionId = connector?.connectionId;
65283
66437
  const selectedConnection = connectionId == null ? void 0 : connections?.byId.get(connectionId);
65284
- const connectionRequired = connectionId !== "" && connectorAction?.authenticated == true && (connector?.connectionId == null || connections != null && selectedConnection?.status != "active") || nodeDiagnosticCount(resolved, context.diagnostics.filter((diagnostic) => diagnostic.code === "task.action-connection-required")) > 0;
66438
+ const connectionRequired = connectionId !== "" && (connector?.kind === "connector-proxy" ? connectorProvider != null && !connectorProvider.noSetup : connectorAction?.authenticated == true) && (connector?.connectionId == null || connections != null && selectedConnection?.status != "active") || nodeDiagnosticCount(resolved, context.diagnostics.filter((diagnostic) => diagnostic.code === "task.action-connection-required")) > 0;
65285
66439
  const nodeRun = context.runNodes.get(nodeId);
65286
66440
  const common = {
65287
66441
  description: node.description,
@@ -66622,6 +67776,214 @@ function FlowNodeList({ nodes, onFocusNode, onSelect, groupTriggers = false }) {
66622
67776
  })
66623
67777
  });
66624
67778
  }
67779
+ var fieldTable_module_default = {
67780
+ list: "fieldTable_list_14bfd",
67781
+ columns: "fieldTable_columns_14bfd",
67782
+ nameHeading: "fieldTable_nameHeading_14bfd",
67783
+ typeHeading: "fieldTable_typeHeading_14bfd",
67784
+ valueHeading: "fieldTable_valueHeading_14bfd",
67785
+ row: "fieldTable_row_14bfd",
67786
+ nullableControl: "fieldTable_nullableControl_14bfd",
67787
+ nullableHeading: "fieldTable_nullableHeading_14bfd"
67788
+ };
67789
+ var fieldBranch_module_default = { branch: "fieldBranch_branch_a5820" };
67790
+ var valueEditor_module_default = {
67791
+ root: "valueEditor_root_4a4f1",
67792
+ errorAnchor: "valueEditor_errorAnchor_4a4f1",
67793
+ body: "valueEditor_body_4a4f1",
67794
+ valueTools: "valueEditor_valueTools_4a4f1",
67795
+ options: "valueEditor_options_4a4f1",
67796
+ toolbar: "valueEditor_toolbar_4a4f1",
67797
+ presence: "valueEditor_presence_4a4f1",
67798
+ actions: "valueEditor_actions_4a4f1",
67799
+ collection: "valueEditor_collection_4a4f1",
67800
+ fieldName: "valueEditor_fieldName_4a4f1",
67801
+ fieldType: "valueEditor_fieldType_4a4f1",
67802
+ json: "valueEditor_json_4a4f1",
67803
+ description: "valueEditor_description_4a4f1",
67804
+ error: "valueEditor_error_4a4f1",
67805
+ summary: "valueEditor_summary_4a4f1",
67806
+ summaryError: "valueEditor_summaryError_4a4f1",
67807
+ srOnly: "valueEditor_srOnly_4a4f1",
67808
+ option: "valueEditor_option_4a4f1",
67809
+ header: "valueEditor_header_4a4f1",
67810
+ leadingControl: "valueEditor_leadingControl_4a4f1",
67811
+ toggleControl: "valueEditor_toggleControl_4a4f1",
67812
+ valueAddon: "valueEditor_valueAddon_4a4f1",
67813
+ summaryText: "valueEditor_summaryText_4a4f1",
67814
+ clearValue: "valueEditor_clearValue_4a4f1",
67815
+ resetValue: "valueEditor_resetValue_4a4f1",
67816
+ unsetValue: "valueEditor_unsetValue_4a4f1",
67817
+ arrayIndex: "valueEditor_arrayIndex_4a4f1",
67818
+ nullValue: "valueEditor_nullValue_4a4f1",
67819
+ nullChip: "valueEditor_nullChip_4a4f1",
67820
+ collectionActions: "valueEditor_collectionActions_4a4f1",
67821
+ emptyObjectContent: "valueEditor_emptyObjectContent_4a4f1",
67822
+ emptyObjectConstraint: "valueEditor_emptyObjectConstraint_4a4f1",
67823
+ jsonCode: "valueEditor_jsonCode_4a4f1",
67824
+ emptyString: "valueEditor_emptyString_4a4f1",
67825
+ booleanControl: "valueEditor_booleanControl_4a4f1",
67826
+ booleanIndicator: "valueEditor_booleanIndicator_4a4f1",
67827
+ objectNotice: "valueEditor_objectNotice_4a4f1",
67828
+ valuePrefix: "valueEditor_valuePrefix_4a4f1"
67829
+ };
67830
+ //#endregion
67831
+ //#region src/form/browser/fieldLayout.tsx
67832
+ var Geometry = createContext({
67833
+ depth: 0,
67834
+ layout: "values"
67835
+ });
67836
+ function FieldLayout({ children, depth = 0, layout = "values", columns, gap }) {
67837
+ return /* @__PURE__ */ jsx(Geometry.Provider, {
67838
+ value: {
67839
+ depth,
67840
+ layout,
67841
+ columns,
67842
+ gap
67843
+ },
67844
+ children
67845
+ });
67846
+ }
67847
+ 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) => {
67848
+ const geometry = useContext(Geometry);
67849
+ const level = depth ?? geometry.depth;
67850
+ const hasHeader = header != null || valueOnly === true;
67851
+ return /* @__PURE__ */ jsxs("div", {
67852
+ ...props,
67853
+ ref,
67854
+ className: [valueEditor_module_default.root, className].filter(Boolean).join(" "),
67855
+ "data-stacking": stacking,
67856
+ "data-layout": layout ?? geometry.layout,
67857
+ "data-header": hasHeader || void 0,
67858
+ "data-value-only": valueOnly || void 0,
67859
+ "data-nested-field": level > 0 || void 0,
67860
+ style: {
67861
+ "gridTemplateColumns": columns ?? geometry.columns,
67862
+ "columnGap": gap ?? geometry.gap,
67863
+ "--field-indent": `${level * 16}px`,
67864
+ ...typeWidth === "fixed" ? { "--field-type-width": "32px" } : typeWidth === "editable" ? { "--field-type-width": "56px" } : {},
67865
+ ...style
67866
+ },
67867
+ children: [
67868
+ hasHeader && /* @__PURE__ */ jsxs("div", {
67869
+ className: valueEditor_module_default.header,
67870
+ children: [
67871
+ leadingControl != null && /* @__PURE__ */ jsx("div", {
67872
+ className: valueEditor_module_default.leadingControl,
67873
+ children: leadingControl
67874
+ }),
67875
+ /* @__PURE__ */ jsxs("div", {
67876
+ className: valueEditor_module_default.toggleControl,
67877
+ children: [disclosure && (!sorting || leadingControl == null) && /* @__PURE__ */ jsx(Button$1, {
67878
+ type: "button",
67879
+ size: "icon-xs",
67880
+ className: "w-[var(--field-toggle-width,24px)]",
67881
+ variant: "disclosure",
67882
+ "aria-label": label,
67883
+ "aria-expanded": disclosure.expanded,
67884
+ "aria-invalid": disclosureInvalid || void 0,
67885
+ "aria-controls": disclosure.controls,
67886
+ onClick: disclosure.onToggle,
67887
+ children: disclosureContent ?? /* @__PURE__ */ jsx("i", {
67888
+ "aria-hidden": "true",
67889
+ className: disclosure.expanded ? "i-lucide-light:chevron-down" : "i-lucide-light:chevron-right"
67890
+ })
67891
+ }), !disclosure && leadingControl == null && disclosureContent]
67892
+ }),
67893
+ !valueOnly && (typeof header === "function" ? header(disclosure) : header)
67894
+ ]
67895
+ }),
67896
+ children,
67897
+ trailingControl,
67898
+ actions != null && /* @__PURE__ */ jsx("div", {
67899
+ className: valueEditor_module_default.options,
67900
+ children: actions
67901
+ })
67902
+ ]
67903
+ });
67904
+ });
67905
+ /** Expanded values stay in their cell; structural branches establish a child geometry and connector. */
67906
+ function FieldBody({ placement, endpoint = "control", depth, className, children, ...props }) {
67907
+ const geometry = useContext(Geometry);
67908
+ return /* @__PURE__ */ jsx("div", {
67909
+ ...props,
67910
+ className: [className, placement === "branch" && fieldBranch_module_default.branch].filter(Boolean).join(" "),
67911
+ "data-field-branch": placement === "branch" || void 0,
67912
+ "data-branch-endpoint": placement === "branch" ? endpoint : void 0,
67913
+ children: /* @__PURE__ */ jsx(FieldLayout, {
67914
+ ...geometry,
67915
+ depth: depth ?? geometry.depth + (placement === "branch" ? 1 : 0),
67916
+ children
67917
+ })
67918
+ });
67919
+ }
67920
+ //#endregion
67921
+ //#region src/form/browser/fieldTable.tsx
67922
+ /** Shared field geometry. Callers own definitions, values, actions and persistence. */
67923
+ var FieldTable = forwardRef(({ layout = "definition", fixedTypes, typeColumn = true, columnHeadings = true, output, nullable, empty, actionSlots = 1, standalone, className, children, ...props }, ref) => {
67924
+ const t = useTranslate();
67925
+ return /* @__PURE__ */ jsxs("div", {
67926
+ ...props,
67927
+ ref,
67928
+ className: [fieldTable_module_default.list, className].filter(Boolean).join(" "),
67929
+ "data-value-editor-scope": true,
67930
+ "data-layout": layout,
67931
+ "data-type-column": typeColumn || void 0,
67932
+ "data-output": output || void 0,
67933
+ "data-fixed-types": fixedTypes || void 0,
67934
+ "data-nullable": nullable || void 0,
67935
+ "data-empty": empty || void 0,
67936
+ "data-action-slots": actionSlots,
67937
+ "data-standalone": standalone || void 0,
67938
+ children: [columnHeadings && !empty && /* @__PURE__ */ jsxs("div", {
67939
+ className: fieldTable_module_default.columns,
67940
+ "data-layout": layout,
67941
+ "data-output": output || void 0,
67942
+ children: [
67943
+ /* @__PURE__ */ jsx("span", {
67944
+ className: fieldTable_module_default.nameHeading,
67945
+ children: t("valueEditor.columnName")
67946
+ }),
67947
+ typeColumn && /* @__PURE__ */ jsx("span", {
67948
+ className: fieldTable_module_default.typeHeading,
67949
+ children: t("valueEditor.columnType")
67950
+ }),
67951
+ !output && /* @__PURE__ */ jsx("span", {
67952
+ className: fieldTable_module_default.valueHeading,
67953
+ children: t("valueEditor.columnValue")
67954
+ }),
67955
+ nullable && /* @__PURE__ */ jsx("span", {
67956
+ className: fieldTable_module_default.nullableHeading,
67957
+ children: t("valueEditor.nullable")
67958
+ })
67959
+ ]
67960
+ }), /* @__PURE__ */ jsx(FieldLayout, {
67961
+ layout,
67962
+ children
67963
+ })]
67964
+ });
67965
+ });
67966
+ function FieldTableRow({ className, ...props }) {
67967
+ return /* @__PURE__ */ jsx("div", {
67968
+ ...props,
67969
+ className: [fieldTable_module_default.row, className].filter(Boolean).join(" ")
67970
+ });
67971
+ }
67972
+ function FieldNullable({ name, checked, onChange }) {
67973
+ const t = useTranslate();
67974
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
67975
+ render: /* @__PURE__ */ jsx("span", { className: fieldTable_module_default.nullableControl }),
67976
+ children: /* @__PURE__ */ jsx(Checkbox, {
67977
+ className: "not-data-disabled:cursor-pointer",
67978
+ "aria-label": `${name} ${t("valueEditor.nullable")}`,
67979
+ "aria-checked": checked,
67980
+ checked,
67981
+ indeterminate: !onChange && !checked,
67982
+ disabled: !onChange,
67983
+ onCheckedChange: (next) => onChange?.(next === true)
67984
+ })
67985
+ }), /* @__PURE__ */ jsx(TooltipContent, { children: t(checked ? "valueEditor.nullableDescription" : "valueEditor.notNullableDescription") })] });
67986
+ }
66625
67987
  //#endregion
66626
67988
  //#region src/ui/browser/label.tsx
66627
67989
  function Label({ className, ...props }) {
@@ -66807,46 +68169,6 @@ var Input = m$4.forwardRef(function Input({ className, type, controlSize = "defa
66807
68169
  ...props
66808
68170
  });
66809
68171
  });
66810
- var valueEditor_module_default = {
66811
- root: "valueEditor_root_4a4f1",
66812
- errorAnchor: "valueEditor_errorAnchor_4a4f1",
66813
- body: "valueEditor_body_4a4f1",
66814
- valueTools: "valueEditor_valueTools_4a4f1",
66815
- options: "valueEditor_options_4a4f1",
66816
- toolbar: "valueEditor_toolbar_4a4f1",
66817
- presence: "valueEditor_presence_4a4f1",
66818
- actions: "valueEditor_actions_4a4f1",
66819
- collection: "valueEditor_collection_4a4f1",
66820
- fieldName: "valueEditor_fieldName_4a4f1",
66821
- fieldType: "valueEditor_fieldType_4a4f1",
66822
- json: "valueEditor_json_4a4f1",
66823
- description: "valueEditor_description_4a4f1",
66824
- error: "valueEditor_error_4a4f1",
66825
- summary: "valueEditor_summary_4a4f1",
66826
- summaryError: "valueEditor_summaryError_4a4f1",
66827
- srOnly: "valueEditor_srOnly_4a4f1",
66828
- option: "valueEditor_option_4a4f1",
66829
- header: "valueEditor_header_4a4f1",
66830
- leadingControl: "valueEditor_leadingControl_4a4f1",
66831
- toggleControl: "valueEditor_toggleControl_4a4f1",
66832
- valueAddon: "valueEditor_valueAddon_4a4f1",
66833
- summaryText: "valueEditor_summaryText_4a4f1",
66834
- clearValue: "valueEditor_clearValue_4a4f1",
66835
- resetValue: "valueEditor_resetValue_4a4f1",
66836
- unsetValue: "valueEditor_unsetValue_4a4f1",
66837
- arrayIndex: "valueEditor_arrayIndex_4a4f1",
66838
- nullValue: "valueEditor_nullValue_4a4f1",
66839
- nullChip: "valueEditor_nullChip_4a4f1",
66840
- collectionActions: "valueEditor_collectionActions_4a4f1",
66841
- emptyObjectContent: "valueEditor_emptyObjectContent_4a4f1",
66842
- emptyObjectConstraint: "valueEditor_emptyObjectConstraint_4a4f1",
66843
- jsonCode: "valueEditor_jsonCode_4a4f1",
66844
- emptyString: "valueEditor_emptyString_4a4f1",
66845
- booleanControl: "valueEditor_booleanControl_4a4f1",
66846
- booleanIndicator: "valueEditor_booleanIndicator_4a4f1",
66847
- objectNotice: "valueEditor_objectNotice_4a4f1",
66848
- valuePrefix: "valueEditor_valuePrefix_4a4f1"
66849
- };
66850
68172
  //#endregion
66851
68173
  //#region src/form/browser/fieldControl.tsx
66852
68174
  /** Gives custom value controls the same attached validation feedback as built-in editors. */
@@ -78702,8 +80024,8 @@ function editorComponent(schema) {
78702
80024
  }
78703
80025
  return Object.values(editorGroups).some((group) => group.includes(type)) ? type : "json";
78704
80026
  }
78705
- /** Choose a starting editor from simple schema hints; unresolved JSON defaults to single-line text. */
78706
- function defaultValueEditorSchema(schema) {
80027
+ /** Prefer schema hints; an explicit fallback respects the stored value's type without converting it. */
80028
+ function defaultValueEditorSchema(schema, fallback) {
78707
80029
  const hints = { ...objectValue(schema) };
78708
80030
  if (hints["ui:widget"] === "any") delete hints["ui:widget"];
78709
80031
  delete hints.anyOf;
@@ -78714,7 +80036,8 @@ function defaultValueEditorSchema(schema) {
78714
80036
  if (hints.properties != null) hints.type = "object";
78715
80037
  else if (hints.items != null) hints.type = "array";
78716
80038
  }
78717
- return editorComponent(hints) === "json" ? schemaForEditor("string", schema) : hints;
80039
+ const component = fallback == null ? "string" : fallback.value == null ? fallback.component : valueType({}, fallback.value);
80040
+ return editorComponent(hints) === "json" ? schemaForEditor(component, schema) : hints;
78718
80041
  }
78719
80042
  /** Changing the editor replaces incompatible constraints, retaining descriptive metadata. */
78720
80043
  function schemaForEditor(component, previous) {
@@ -79007,14 +80330,14 @@ function AccountControlButton({ disabled, status, label, hint, onClick }) {
79007
80330
  })]
79008
80331
  }) }), /* @__PURE__ */ jsx(TooltipContent, { children: hint ?? label })] });
79009
80332
  }
79010
- function AccountSelect({ connections, disabled, loading = false, id, invalid, warning, addWhenEmpty, allowDeferred = false, label, selectedConnection, selectedId, onChange, onManage }) {
80333
+ function AccountSelect({ connections, disabled, readOnly = false, loading = false, id, invalid, warning, addWhenEmpty, allowDeferred = false, label, selectedConnection, selectedId, onChange, onManage }) {
79011
80334
  const t = useTranslate();
79012
80335
  const [container, setContainer] = useState(null);
79013
80336
  const selected = selectedConnection ?? connections.find((candidate) => candidate.connectionId == selectedId);
79014
80337
  const showLoading = loading && selected == null && selectedId !== "";
79015
80338
  const builtInName = t("inspector.account.oomolBuiltIn");
79016
80339
  const displayName = (connection) => accountDisplayName(connection, connection.displayName, builtInName);
79017
- 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")})` : ""}`;
80340
+ 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")})` : ""}`;
79018
80341
  const missingSelected = selectedId != null && selectedId !== "" && !connections.some((candidate) => candidate.connectionId == selectedId);
79019
80342
  const empty = !loading && connections.length == 0;
79020
80343
  const items = [
@@ -79042,7 +80365,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
79042
80365
  label: t("inspector.account.addAccount")
79043
80366
  }]
79044
80367
  ];
79045
- if (!allowDeferred && !loading && addWhenEmpty && connections.length === 0 && selectedId == null) return /* @__PURE__ */ jsx(AccountControlButton, {
80368
+ if (!readOnly && !allowDeferred && !loading && addWhenEmpty && connections.length === 0 && selectedId == null) return /* @__PURE__ */ jsx(AccountControlButton, {
79046
80369
  disabled,
79047
80370
  status: "warning",
79048
80371
  onClick: onManage,
@@ -79052,7 +80375,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
79052
80375
  ref: setContainer,
79053
80376
  className: "account-select relative min-w-0",
79054
80377
  children: [/* @__PURE__ */ jsxs(Select$1, {
79055
- disabled: disabled || loading,
80378
+ disabled: readOnly || disabled || loading,
79056
80379
  items,
79057
80380
  value: selectedId ?? null,
79058
80381
  onValueChange: (value) => {
@@ -79069,8 +80392,8 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
79069
80392
  "data-status": invalid ? "danger" : warning ? "warning" : void 0,
79070
80393
  className: `${fieldSelectTriggerClass} account-control`,
79071
80394
  children: /* @__PURE__ */ jsx(SelectValue, {
79072
- className: !loading && selectedId != null ? "mr-5" : void 0,
79073
- placeholder: t("inspector.account.chooseAccount"),
80395
+ className: !readOnly && !loading && selectedId != null ? "mr-5" : void 0,
80396
+ placeholder: t(readOnly ? "connectorAccess.noAccountSelected" : "inspector.account.chooseAccount"),
79074
80397
  children: showLoading ? /* @__PURE__ */ jsxs("span", {
79075
80398
  role: "status",
79076
80399
  className: "flex min-w-0 items-center gap-2 text-muted-foreground",
@@ -79124,7 +80447,7 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
79124
80447
  })] })
79125
80448
  ]
79126
80449
  })]
79127
- }), !loading && selectedId != null && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(Button$1, {
80450
+ }), !readOnly && !loading && selectedId != null && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(Button$1, {
79128
80451
  className: "account-select-clear absolute top-1/2 right-7 -translate-y-1/2 text-muted-foreground",
79129
80452
  type: "button",
79130
80453
  variant: "ghost",
@@ -79147,17 +80470,18 @@ function AccountSelect({ connections, disabled, loading = false, id, invalid, wa
79147
80470
  })] })]
79148
80471
  });
79149
80472
  }
79150
- function ConnectorAccount({ accessError, onConfigureAccess, action, actionError, actionId, activeConnections, authorizationPending, connection, connectionError, connectionId, connectors, disabled, fieldIdPrefix, loading, nodeId }) {
80473
+ function ConnectorAccount({ accessError, onConfigureAccess, resource, actionError, actionId, activeConnections, authorizationPending, connection, connectionError, connectionId, connectors, disabled, fieldIdPrefix, loading, nodeId }) {
79151
80474
  const t = useTranslate();
79152
80475
  const available = activeConnections ?? [];
80476
+ const authenticated = resource == null ? void 0 : "authenticated" in resource ? resource.authenticated : !resource.noSetup;
79153
80477
  const accessIssue = accessError ?? (actionError?.code == "connector.access-required" || actionError?.code == "connector.access-invalid" ? actionError.message : void 0);
79154
- const pending = loading || accessIssue == null && actionError == null && (action == null || activeConnections == null && connectionError == null);
79155
- const required = !pending && (accessIssue != null || connectionId !== "" && action?.authenticated == true && (connectionId == null || activeConnections != null && connection?.status != "active"));
80478
+ const pending = loading || accessIssue == null && actionError == null && (resource == null || activeConnections == null && connectionError == null);
80479
+ const required = !pending && (accessIssue != null || connectionId !== "" && authenticated == true && (connectionId == null || activeConnections != null && connection?.status != "active"));
79156
80480
  let onManage;
79157
80481
  let content;
79158
80482
  if (pending) content = /* @__PURE__ */ jsx("p", { children: t("inspector.account.loading") });
79159
80483
  else if (accessIssue != null) content = /* @__PURE__ */ jsx("p", { children: accessIssue });
79160
- else if (actionError != null || action == null) {
80484
+ else if (actionError != null || resource == null) {
79161
80485
  const canRetry = actionError?.code != "authorization.denied" && actionError?.code != "connector.action-not-found";
79162
80486
  content = /* @__PURE__ */ jsx(ConnectionAlert, {
79163
80487
  disabled,
@@ -79275,19 +80599,26 @@ function TriggerConnection({ activeConnections, authorizationPending, connection
79275
80599
  });
79276
80600
  }
79277
80601
  /** A persisted reference has no live account health or authorization state. */
79278
- function SavedConnectionReference({ action, connectionId }) {
80602
+ function SavedConnectionReference({ noSetup, connectionId }) {
79279
80603
  const t = useTranslate();
79280
- return /* @__PURE__ */ jsxs(InspectorStatusSection, {
80604
+ if (noSetup || connectionId?.startsWith("no_auth:")) return null;
80605
+ return /* @__PURE__ */ jsx(InspectorStatusSection, {
79281
80606
  title: t("inspector.account.title"),
79282
80607
  section: "account",
79283
- children: [/* @__PURE__ */ jsx("p", {
79284
- className: "reference-value",
79285
- children: action
79286
- }), connectionId != null && /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: t("inspector.account.connection") }), /* @__PURE__ */ jsx(Input, {
79287
- "aria-label": t("inspector.account.connection"),
79288
- readOnly: true,
79289
- value: connectionId
79290
- })] })]
80608
+ children: /* @__PURE__ */ jsxs(Field, {
80609
+ className: "connection-field",
80610
+ children: [/* @__PURE__ */ jsx(FieldLabel, {
80611
+ className: "sr-only",
80612
+ children: t("inspector.account.connection")
80613
+ }), /* @__PURE__ */ jsx(AccountSelect, {
80614
+ readOnly: true,
80615
+ connections: [],
80616
+ selectedId: connectionId,
80617
+ disabled: true,
80618
+ onChange: () => {},
80619
+ onManage: void 0
80620
+ })]
80621
+ })
79291
80622
  });
79292
80623
  }
79293
80624
  //#endregion
@@ -83236,6 +84567,7 @@ function childFields(props) {
83236
84567
  hideValueTools: props.hideValueTools,
83237
84568
  expansionPolicy: props.expansionPolicy,
83238
84569
  schema: childSchema,
84570
+ nullable: isUnconstrainedSchema(childSchema),
83239
84571
  value: childValue,
83240
84572
  onChange: change,
83241
84573
  valueEditable,
@@ -83717,97 +85049,6 @@ function EditableChoices({ options, labels, value, label, disabled, invalid, mul
83717
85049
  })
83718
85050
  });
83719
85051
  }
83720
- var fieldBranch_module_default = { branch: "fieldBranch_branch_a5820" };
83721
- //#endregion
83722
- //#region src/form/browser/fieldLayout.tsx
83723
- var Geometry = createContext({
83724
- depth: 0,
83725
- layout: "values"
83726
- });
83727
- function FieldLayout({ children, depth = 0, layout = "values", columns, gap }) {
83728
- return /* @__PURE__ */ jsx(Geometry.Provider, {
83729
- value: {
83730
- depth,
83731
- layout,
83732
- columns,
83733
- gap
83734
- },
83735
- children
83736
- });
83737
- }
83738
- 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) => {
83739
- const geometry = useContext(Geometry);
83740
- const level = depth ?? geometry.depth;
83741
- const hasHeader = header != null || valueOnly === true;
83742
- return /* @__PURE__ */ jsxs("div", {
83743
- ...props,
83744
- ref,
83745
- className: [valueEditor_module_default.root, className].filter(Boolean).join(" "),
83746
- "data-stacking": stacking,
83747
- "data-layout": layout ?? geometry.layout,
83748
- "data-header": hasHeader || void 0,
83749
- "data-value-only": valueOnly || void 0,
83750
- "data-nested-field": level > 0 || void 0,
83751
- style: {
83752
- "gridTemplateColumns": columns ?? geometry.columns,
83753
- "columnGap": gap ?? geometry.gap,
83754
- "--field-indent": `${level * 16}px`,
83755
- ...typeWidth === "fixed" ? { "--field-type-width": "32px" } : typeWidth === "editable" ? { "--field-type-width": "56px" } : {},
83756
- ...style
83757
- },
83758
- children: [
83759
- hasHeader && /* @__PURE__ */ jsxs("div", {
83760
- className: valueEditor_module_default.header,
83761
- children: [
83762
- leadingControl != null && /* @__PURE__ */ jsx("div", {
83763
- className: valueEditor_module_default.leadingControl,
83764
- children: leadingControl
83765
- }),
83766
- /* @__PURE__ */ jsxs("div", {
83767
- className: valueEditor_module_default.toggleControl,
83768
- children: [disclosure && (!sorting || leadingControl == null) && /* @__PURE__ */ jsx(Button$1, {
83769
- type: "button",
83770
- size: "icon-xs",
83771
- className: "w-[var(--field-toggle-width,24px)]",
83772
- variant: "disclosure",
83773
- "aria-label": label,
83774
- "aria-expanded": disclosure.expanded,
83775
- "aria-invalid": disclosureInvalid || void 0,
83776
- "aria-controls": disclosure.controls,
83777
- onClick: disclosure.onToggle,
83778
- children: disclosureContent ?? /* @__PURE__ */ jsx("i", {
83779
- "aria-hidden": "true",
83780
- className: disclosure.expanded ? "i-lucide-light:chevron-down" : "i-lucide-light:chevron-right"
83781
- })
83782
- }), !disclosure && leadingControl == null && disclosureContent]
83783
- }),
83784
- !valueOnly && (typeof header === "function" ? header(disclosure) : header)
83785
- ]
83786
- }),
83787
- children,
83788
- trailingControl,
83789
- actions != null && /* @__PURE__ */ jsx("div", {
83790
- className: valueEditor_module_default.options,
83791
- children: actions
83792
- })
83793
- ]
83794
- });
83795
- });
83796
- /** Expanded values stay in their cell; structural branches establish a child geometry and connector. */
83797
- function FieldBody({ placement, endpoint = "control", depth, className, children, ...props }) {
83798
- const geometry = useContext(Geometry);
83799
- return /* @__PURE__ */ jsx("div", {
83800
- ...props,
83801
- className: [className, placement === "branch" && fieldBranch_module_default.branch].filter(Boolean).join(" "),
83802
- "data-field-branch": placement === "branch" || void 0,
83803
- "data-branch-endpoint": placement === "branch" ? endpoint : void 0,
83804
- children: /* @__PURE__ */ jsx(FieldLayout, {
83805
- ...geometry,
83806
- depth: depth ?? geometry.depth + (placement === "branch" ? 1 : 0),
83807
- children
83808
- })
83809
- });
83810
- }
83811
85052
  //#endregion
83812
85053
  //#region src/form/browser/fieldTypeAddon.tsx
83813
85054
  /** A compact definition control attached to a value, shared by Case and array items. */
@@ -96152,7 +97393,10 @@ function FieldValueEditor(suppliedProps) {
96152
97393
  const definitionEditable = props.onDefinitionChange != null && !disabled;
96153
97394
  const showDataType = editorComponent(schema) === "json" && !definitionEditable && valueEditable && props.valueSuffix == null && props.editor == null;
96154
97395
  const [selectedEditorSchema, setSelectedEditorSchema] = useState();
96155
- const editorSchema = showDataType ? selectedEditorSchema ?? defaultValueEditorSchema(schema) : schema;
97396
+ const editorSchema = showDataType ? selectedEditorSchema ?? defaultValueEditorSchema(schema, props.defaultEditor == null ? void 0 : {
97397
+ component: props.defaultEditor,
97398
+ value
97399
+ }) : schema;
96156
97400
  const editorProps = {
96157
97401
  ...props,
96158
97402
  schema: editorSchema
@@ -96282,7 +97526,8 @@ function FieldValueEditor(suppliedProps) {
96282
97526
  const inlineTools = !props.hideValueTools && (props.layout === "values" || props.layout === "ports") && valueEditable && !disabled && !sorting;
96283
97527
  const nullControl = (state.display === "null" || presence === "null") && props.editor === void 0 && !choiceOptions && !enumeration;
96284
97528
  const canReset = inlineTools && props.onReset != null && (showUnset || !!nullable && nullControl);
96285
- const canClear = inlineTools && state.canClear;
97529
+ const clearable = state.canClear || props.unset != null && presence === "null";
97530
+ const canClear = inlineTools && clearable;
96286
97531
  const canToggleJson = inlineTools && expanded && shape.collection && presence === "value";
96287
97532
  const arrayDefinition = !showDataType && hasHeader && source.type === "array" && !Array.isArray(source.items) && !choiceOptions;
96288
97533
  const changeValueEditor = (nextSchema) => {
@@ -96398,7 +97643,7 @@ function FieldValueEditor(suppliedProps) {
96398
97643
  className: "i-lucide-light:circle-slash"
96399
97644
  }), "null"]
96400
97645
  }),
96401
- state.canClear && /* @__PURE__ */ jsxs(Button$1, {
97646
+ clearable && /* @__PURE__ */ jsxs(Button$1, {
96402
97647
  type: "button",
96403
97648
  size: "xs",
96404
97649
  variant: "ghost",
@@ -96961,16 +98206,29 @@ function AgentTools(props) {
96961
98206
  ...props.editor
96962
98207
  });
96963
98208
  if (props.config.tools.length === 0) return null;
98209
+ const summary = actionSummary(props.config.tools, {}, Object.values(props.providers ?? {}));
96964
98210
  return /* @__PURE__ */ jsx(ActionSelectionDialog, {
96965
98211
  readOnly: true,
96966
98212
  title: t("agent.tools"),
98213
+ triggerHint: summary.workflows > 0 ? t("toolPicker.summary", {
98214
+ tools: summary.count,
98215
+ workflows: summary.workflows
98216
+ }) : t("actionPicker.selectionSummary", {
98217
+ actions: summary.count,
98218
+ providers: summary.providers.length
98219
+ }),
96967
98220
  entries: props.config.tools,
96968
98221
  providers: props.providers,
96969
98222
  trigger: /* @__PURE__ */ jsx(Button$1, {
96970
98223
  type: "button",
96971
98224
  variant: "ghost",
96972
98225
  size: "sm",
96973
- children: t("agent.tools")
98226
+ className: "gap-1.5 font-normal text-muted-foreground",
98227
+ children: /* @__PURE__ */ jsx(IconStack, {
98228
+ icons: summary.providers,
98229
+ count: summary.count,
98230
+ size: "sm"
98231
+ })
96974
98232
  }),
96975
98233
  settings: {
96976
98234
  title: t("agent.toolSettings"),
@@ -97202,7 +98460,7 @@ function EditableAgentSettingsProvider({ children, task, nodeId, store, connecto
97202
98460
  return false;
97203
98461
  }
97204
98462
  const decoded = decodeRevisionContent({
97205
- modelVersion: 13,
98463
+ modelVersion: 14,
97206
98464
  modules: {},
97207
98465
  document: {
97208
98466
  bindings: {},
@@ -97797,7 +99055,10 @@ function CodeEditor({ ariaDescribedBy, ariaLabel, diagnostics, disabled, errorLa
97797
99055
  }
97798
99056
  //#endregion
97799
99057
  //#region src/workbench/browser/runtime/editor/codeHttpHosts.tsx
97800
- function CodeHttpHosts({ disabled, hosts, onSave }) {
99058
+ function CodeHttpHosts(props) {
99059
+ const { hosts } = props;
99060
+ const editor = props.readOnly ? void 0 : props;
99061
+ const disabled = editor?.disabled ?? false;
97801
99062
  const t = useTranslate();
97802
99063
  const id = useId();
97803
99064
  const saved = hosts.join("\n");
@@ -97811,6 +99072,7 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
97811
99072
  setContainer(element?.closest(".open-flow-workbench") ?? element?.closest(".open-flow-theme") ?? null);
97812
99073
  }, []);
97813
99074
  const commit = async () => {
99075
+ if (editor == null) return;
97814
99076
  if (openedHosts !== saved) {
97815
99077
  setOpenedHosts(saved);
97816
99078
  setDraft(saved);
@@ -97824,7 +99086,7 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
97824
99086
  setError(void 0);
97825
99087
  setPending(true);
97826
99088
  try {
97827
- if (dequal(next, hosts) || await onSave(next)) setOpen(false);
99089
+ if (dequal(next, hosts) || await editor.onSave(next)) setOpen(false);
97828
99090
  } finally {
97829
99091
  setPending(false);
97830
99092
  }
@@ -97868,25 +99130,26 @@ function CodeHttpHosts({ disabled, hosts, onSave }) {
97868
99130
  /* @__PURE__ */ jsx(ValueEditorFeedback, {
97869
99131
  error,
97870
99132
  children: (errorId) => /* @__PURE__ */ jsx(Textarea, {
97871
- "aria-describedby": [`${id}-hint`, errorId].filter(Boolean).join(" "),
99133
+ "aria-describedby": [editor == null ? void 0 : `${id}-hint`, errorId].filter(Boolean).join(" ") || void 0,
97872
99134
  "aria-invalid": error != null || void 0,
97873
99135
  className: "min-h-14 font-mono text-xs",
97874
99136
  disabled: disabled || pending,
97875
99137
  id: `${id}-hosts`,
97876
- onChange: (event) => setDraft(event.target.value),
99138
+ onChange: editor == null ? void 0 : (event) => setDraft(event.target.value),
97877
99139
  placeholder: "api.example.com",
99140
+ readOnly: props.readOnly,
97878
99141
  rows: 2,
97879
99142
  spellCheck: false,
97880
- value: draft
99143
+ value: editor == null ? saved : draft
97881
99144
  })
97882
99145
  }),
97883
- /* @__PURE__ */ jsx(FieldDescription, {
99146
+ editor != null && /* @__PURE__ */ jsx(FieldDescription, {
97884
99147
  id: `${id}-hint`,
97885
99148
  children: t("inspector.task.httpHostsHint")
97886
99149
  })
97887
99150
  ]
97888
99151
  }),
97889
- /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button$1, {
99152
+ editor != null && /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button$1, {
97890
99153
  type: "button",
97891
99154
  variant: "outline",
97892
99155
  disabled: pending,
@@ -98449,16 +99712,49 @@ function CodeTaskSection(props) {
98449
99712
  const { selection, theme } = props;
98450
99713
  const task = selection.definition;
98451
99714
  if (task == null || !("moduleId" in task) || selection.module == null) return null;
98452
- return /* @__PURE__ */ jsxs(CodeTaskFrame, { children: [/* @__PURE__ */ jsx(CodeEditor, {
98453
- ariaLabel: t("inspector.task.source"),
98454
- disabled: true,
98455
- theme,
98456
- typing: codeTyping(task, task.capabilities),
98457
- uri: `publication:modules/${task.moduleId}.js`,
98458
- value: selection.module.source,
98459
- loadingLabel: t("inspector.task.editorLoading"),
98460
- errorLabel: t("inspector.task.editorUnavailable")
98461
- }), task.capabilities != null && /* @__PURE__ */ jsx(JSONViewer, { data: task.capabilities })] });
99715
+ const permission = task.capabilities?.find((capability) => "mode" in capability);
99716
+ const tools = [...permission?.mode == "independent" ? permission.actions : [], ...(task.capabilities ?? []).filter((item) => item.kind == "workflow")];
99717
+ const summary = actionSummary(tools, {}, Object.values(props.providers ?? {}));
99718
+ const httpHosts = task.capabilities?.find((capability) => capability.kind == "http")?.hosts ?? [];
99719
+ return /* @__PURE__ */ jsx(CodeTaskFrame, {
99720
+ actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [httpHosts.length > 0 && /* @__PURE__ */ jsx(CodeHttpHosts, {
99721
+ readOnly: true,
99722
+ hosts: httpHosts
99723
+ }), tools.length > 0 && /* @__PURE__ */ jsx(ActionSelectionDialog, {
99724
+ readOnly: true,
99725
+ title: t("actionPicker.configureActions"),
99726
+ triggerHint: summary.workflows > 0 ? t("toolPicker.summary", {
99727
+ tools: summary.count,
99728
+ workflows: summary.workflows
99729
+ }) : t("actionPicker.selectionSummary", {
99730
+ actions: summary.count,
99731
+ providers: summary.providers.length
99732
+ }),
99733
+ trigger: /* @__PURE__ */ jsx(Button$1, {
99734
+ type: "button",
99735
+ variant: "ghost",
99736
+ size: "sm",
99737
+ className: "gap-1.5 font-normal text-muted-foreground",
99738
+ children: /* @__PURE__ */ jsx(IconStack, {
99739
+ icons: summary.providers,
99740
+ count: summary.count,
99741
+ size: "sm"
99742
+ })
99743
+ }),
99744
+ entries: tools,
99745
+ providers: props.providers
99746
+ })] }),
99747
+ children: /* @__PURE__ */ jsx(CodeEditor, {
99748
+ ariaLabel: t("inspector.task.source"),
99749
+ disabled: true,
99750
+ theme,
99751
+ typing: codeTyping(task, task.capabilities),
99752
+ uri: `publication:modules/${task.moduleId}.js`,
99753
+ value: selection.module.source,
99754
+ loadingLabel: t("inspector.task.editorLoading"),
99755
+ errorLabel: t("inspector.task.editorUnavailable")
99756
+ })
99757
+ });
98462
99758
  }
98463
99759
  //#endregion
98464
99760
  //#region src/workbench/browser/runtime/editor/fieldPanelAnchor.ts
@@ -99678,7 +100974,7 @@ function SourceValueEditor({ fixed = false, sourceOnly = false, editor: customEd
99678
100974
  setSourceOpen(true);
99679
100975
  if (variables.enabled) variables.onOpen?.();
99680
100976
  }
99681
- } : void 0,
100977
+ } : presentation?.unset,
99682
100978
  label: fieldLabel,
99683
100979
  path: `/${fieldLabel.replaceAll("~", "~0").replaceAll("/", "~1")}`,
99684
100980
  disabled,
@@ -100403,82 +101699,130 @@ function presentConnectorInputs(inputs, t) {
100403
101699
  ...optional
100404
101700
  ];
100405
101701
  }
100406
- var fieldTable_module_default = {
100407
- list: "fieldTable_list_14bfd",
100408
- columns: "fieldTable_columns_14bfd",
100409
- nameHeading: "fieldTable_nameHeading_14bfd",
100410
- typeHeading: "fieldTable_typeHeading_14bfd",
100411
- valueHeading: "fieldTable_valueHeading_14bfd",
100412
- row: "fieldTable_row_14bfd",
100413
- nullableControl: "fieldTable_nullableControl_14bfd",
100414
- nullableHeading: "fieldTable_nullableHeading_14bfd"
100415
- };
100416
101702
  //#endregion
100417
- //#region src/form/browser/fieldTable.tsx
100418
- /** Shared field geometry. Callers own definitions, values, actions and persistence. */
100419
- var FieldTable = forwardRef(({ layout = "definition", fixedTypes, typeColumn = true, columnHeadings = true, output, nullable, empty, actionSlots = 1, standalone, className, children, ...props }, ref) => {
100420
- const t = useTranslate();
100421
- return /* @__PURE__ */ jsxs("div", {
101703
+ //#region src/workbench/browser/runtime/editor/inspectorSection.tsx
101704
+ function InspectorSection({ title, children, className, contentInset = true, ...props }) {
101705
+ return /* @__PURE__ */ jsxs("section", {
101706
+ className: cn$1("inspector-section inspector-titled-section", className),
100422
101707
  ...props,
100423
- ref,
100424
- className: [fieldTable_module_default.list, className].filter(Boolean).join(" "),
100425
- "data-value-editor-scope": true,
100426
- "data-layout": layout,
100427
- "data-type-column": typeColumn || void 0,
100428
- "data-output": output || void 0,
100429
- "data-fixed-types": fixedTypes || void 0,
100430
- "data-nullable": nullable || void 0,
100431
- "data-empty": empty || void 0,
100432
- "data-action-slots": actionSlots,
100433
- "data-standalone": standalone || void 0,
100434
- children: [columnHeadings && !empty && /* @__PURE__ */ jsxs("div", {
100435
- className: fieldTable_module_default.columns,
100436
- "data-layout": layout,
100437
- "data-output": output || void 0,
100438
- children: [
100439
- /* @__PURE__ */ jsx("span", {
100440
- className: fieldTable_module_default.nameHeading,
100441
- children: t("valueEditor.columnName")
100442
- }),
100443
- typeColumn && /* @__PURE__ */ jsx("span", {
100444
- className: fieldTable_module_default.typeHeading,
100445
- children: t("valueEditor.columnType")
100446
- }),
100447
- !output && /* @__PURE__ */ jsx("span", {
100448
- className: fieldTable_module_default.valueHeading,
100449
- children: t("valueEditor.columnValue")
100450
- }),
100451
- nullable && /* @__PURE__ */ jsx("span", {
100452
- className: fieldTable_module_default.nullableHeading,
100453
- children: t("valueEditor.nullable")
100454
- })
100455
- ]
100456
- }), /* @__PURE__ */ jsx(FieldLayout, {
100457
- layout,
101708
+ children: [/* @__PURE__ */ jsx("h3", {
101709
+ className: "inspector-section-title",
101710
+ children: title
101711
+ }), /* @__PURE__ */ jsx("div", {
101712
+ className: "inspector-section-content",
101713
+ "data-inset": contentInset || void 0,
100458
101714
  children
100459
101715
  })]
100460
101716
  });
100461
- });
100462
- function FieldTableRow({ className, ...props }) {
100463
- return /* @__PURE__ */ jsx("div", {
100464
- ...props,
100465
- className: [fieldTable_module_default.row, className].filter(Boolean).join(" ")
100466
- });
100467
101717
  }
100468
- function FieldNullable({ name, checked, onChange }) {
101718
+ //#endregion
101719
+ //#region src/workbench/browser/runtime/editor/connectorProxySection.tsx
101720
+ function ConnectorProxySection({ task, disabled, readOnly = false, hasBody, parameters, input, onSave, onClearBody }) {
100469
101721
  const t = useTranslate();
100470
- return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
100471
- render: /* @__PURE__ */ jsx("span", { className: fieldTable_module_default.nullableControl }),
100472
- children: /* @__PURE__ */ jsx(Checkbox, {
100473
- className: "not-data-disabled:cursor-pointer",
100474
- "aria-label": `${name} ${t("valueEditor.nullable")}`,
100475
- "aria-checked": checked,
100476
- checked,
100477
- indeterminate: !onChange && !checked,
100478
- disabled: !onChange,
100479
- onCheckedChange: (next) => onChange?.(next === true)
101722
+ const id = useId();
101723
+ const taskRef = useRef(task);
101724
+ const saveRef = useRef(onSave);
101725
+ useEffect(() => {
101726
+ taskRef.current = task;
101727
+ saveRef.current = onSave;
101728
+ }, [task, onSave]);
101729
+ const [changes] = useState(() => new TaskExecutorChanges(task.executor, (before, next) => {
101730
+ const current = taskRef.current;
101731
+ if (before.kind !== "connector-proxy" || next.kind !== "connector-proxy" || current.executor.kind !== "connector-proxy") return Promise.resolve(false);
101732
+ const merged = { ...current.executor };
101733
+ if (before.method !== next.method) merged.method = next.method;
101734
+ return saveRef.current(current, connectorProxyTask(merged, current.name, current));
101735
+ }));
101736
+ const [config, setConfig] = useState(changes.value);
101737
+ const [failed, setFailed] = useState(false);
101738
+ useEffect(() => {
101739
+ changes.sync(task.executor);
101740
+ setConfig(changes.value);
101741
+ }, [changes, task.executor]);
101742
+ if (config.kind !== "connector-proxy") return null;
101743
+ const supportsBody = connectorProxySupportsBody(config.method);
101744
+ const bodyError = task.executor.kind === "connector-proxy" && task.executor.method === config.method && connectorProxyIssues(config, hasBody).some((issue) => issue.code === "bodyUnsupported");
101745
+ async function save() {
101746
+ try {
101747
+ setFailed(!await changes.save());
101748
+ } catch {
101749
+ setFailed(true);
101750
+ }
101751
+ }
101752
+ function update(patch) {
101753
+ if (disabled || changes.value.kind !== "connector-proxy") return;
101754
+ changes.value = {
101755
+ ...changes.value,
101756
+ ...patch
101757
+ };
101758
+ setConfig(changes.value);
101759
+ save();
101760
+ }
101761
+ return /* @__PURE__ */ jsx(InspectorSection, {
101762
+ title: t("connectorProxy.title"),
101763
+ "data-inspector-section": "task",
101764
+ children: /* @__PURE__ */ jsxs("div", {
101765
+ className: "node-settings flex flex-col gap-3",
101766
+ "data-value-editor-scope": true,
101767
+ children: [
101768
+ input("endpoint", t("connectorProxy.endpoint")),
101769
+ /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, {
101770
+ htmlFor: `${id}-method`,
101771
+ children: t("httpRequest.method")
101772
+ }), /* @__PURE__ */ jsx(NativeSelect, {
101773
+ id: `${id}-method`,
101774
+ value: config.method,
101775
+ disabled,
101776
+ className: "w-full",
101777
+ onChange: (event) => update({ method: event.target.value }),
101778
+ children: [
101779
+ "GET",
101780
+ "POST",
101781
+ "PUT",
101782
+ "PATCH",
101783
+ "DELETE"
101784
+ ].map((method) => /* @__PURE__ */ jsx(NativeSelectOption, {
101785
+ value: method,
101786
+ children: method
101787
+ }, method))
101788
+ })] }),
101789
+ parameters,
101790
+ supportsBody && input("body", t("httpRequest.body")),
101791
+ bodyError && /* @__PURE__ */ jsxs("div", {
101792
+ className: "flex flex-col gap-2",
101793
+ children: [/* @__PURE__ */ jsx("p", {
101794
+ id: `${id}-body-error`,
101795
+ role: "alert",
101796
+ className: "text-xs text-destructive",
101797
+ children: t("connectorProxy.bodyUnsupported")
101798
+ }), !readOnly && /* @__PURE__ */ jsxs(Button$1, {
101799
+ variant: "outline",
101800
+ size: "field",
101801
+ disabled,
101802
+ "aria-describedby": `${id}-body-error`,
101803
+ onClick: () => void onClearBody(),
101804
+ children: [
101805
+ t("valueEditor.clear"),
101806
+ " ",
101807
+ t("httpRequest.body")
101808
+ ]
101809
+ })]
101810
+ }),
101811
+ failed && /* @__PURE__ */ jsx(ValueEditorFeedback, {
101812
+ error: t("httpRequest.saveFailed"),
101813
+ children: (errorId) => /* @__PURE__ */ jsx(Button$1, {
101814
+ variant: "outline",
101815
+ size: "field",
101816
+ "aria-invalid": true,
101817
+ "aria-describedby": errorId,
101818
+ disabled,
101819
+ onClick: () => void save(),
101820
+ children: t("httpRequest.retry")
101821
+ })
101822
+ })
101823
+ ]
100480
101824
  })
100481
- }), /* @__PURE__ */ jsx(TooltipContent, { children: t(checked ? "valueEditor.nullableDescription" : "valueEditor.notNullableDescription") })] });
101825
+ });
100482
101826
  }
100483
101827
  //#endregion
100484
101828
  //#region src/ui/browser/helpButton.tsx
@@ -100515,22 +101859,6 @@ function HelpButton({ label, children, container, size = 24 }) {
100515
101859
  });
100516
101860
  }
100517
101861
  //#endregion
100518
- //#region src/workbench/browser/runtime/editor/inspectorSection.tsx
100519
- function InspectorSection({ title, children, className, contentInset = true, ...props }) {
100520
- return /* @__PURE__ */ jsxs("section", {
100521
- className: cn$1("inspector-section inspector-titled-section", className),
100522
- ...props,
100523
- children: [/* @__PURE__ */ jsx("h3", {
100524
- className: "inspector-section-title",
100525
- children: title
100526
- }), /* @__PURE__ */ jsx("div", {
100527
- className: "inspector-section-content",
100528
- "data-inset": contentInset || void 0,
100529
- children
100530
- })]
100531
- });
100532
- }
100533
- //#endregion
100534
101862
  //#region src/workbench/browser/runtime/editor/decisionSection.tsx
100535
101863
  var textSchema = {
100536
101864
  type: "string",
@@ -101707,13 +103035,13 @@ var catalog = [
101707
103035
  group: "contacts"
101708
103036
  }
101709
103037
  ];
101710
- function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents }) {
103038
+ function FeishuEventPicker({ value, onChange, disabled = false, readOnly = false, allowedEvents }) {
101711
103039
  const t = useTranslate();
101712
103040
  const id = useId();
101713
103041
  const [search, setSearch] = useState("");
101714
103042
  const [custom, setCustom] = useState("");
101715
103043
  const [invalid, setInvalid] = useState(false);
101716
- const entries = [...catalog.filter((entry) => allowedEvents == null || allowedEvents.includes(entry.id)).map((entry) => ({
103044
+ const entries = [...catalog.filter((entry) => (allowedEvents == null || allowedEvents.includes(entry.id)) && (!readOnly || value.includes(entry.id))).map((entry) => ({
101717
103045
  id: entry.id,
101718
103046
  group: entry.group,
101719
103047
  label: t(`eventSources.eventNames.${entry.id.replaceAll(".", "_")}`)
@@ -101742,7 +103070,7 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
101742
103070
  htmlFor: id,
101743
103071
  children: t("eventSources.events")
101744
103072
  }),
101745
- value.length > 0 && /* @__PURE__ */ jsx("div", {
103073
+ !readOnly && value.length > 0 && /* @__PURE__ */ jsx("div", {
101746
103074
  className: "flex flex-wrap gap-1.5",
101747
103075
  children: value.map((event) => /* @__PURE__ */ jsxs(Button$1, {
101748
103076
  type: "button",
@@ -101765,7 +103093,7 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
101765
103093
  id,
101766
103094
  type: "search",
101767
103095
  value: search,
101768
- disabled,
103096
+ disabled: disabled && !readOnly,
101769
103097
  placeholder: t("eventSources.searchEvents"),
101770
103098
  "aria-label": t("eventSources.searchEvents"),
101771
103099
  onChange: (event) => setSearch(event.target.value)
@@ -101784,7 +103112,7 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
101784
103112
  children: [/* @__PURE__ */ jsx(Checkbox, {
101785
103113
  className: "mt-0.5",
101786
103114
  checked: value.includes(entry.id),
101787
- disabled: disabled || !value.includes(entry.id) && value.length >= 200,
103115
+ disabled: readOnly || disabled || !value.includes(entry.id) && value.length >= 200,
101788
103116
  onCheckedChange: (checked) => onChange(checked === true ? [...value, entry.id] : value.filter((event) => event != entry.id))
101789
103117
  }), /* @__PURE__ */ jsxs("span", {
101790
103118
  className: "flex min-w-0 flex-col gap-0.5",
@@ -101802,7 +103130,7 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
101802
103130
  children: t("eventSources.noEventMatches")
101803
103131
  })]
101804
103132
  }),
101805
- value.length == 0 && /* @__PURE__ */ jsx("p", {
103133
+ !readOnly && value.length == 0 && /* @__PURE__ */ jsx("p", {
101806
103134
  className: "m-0 text-xs text-muted-foreground",
101807
103135
  children: t("eventSources.chooseEvents")
101808
103136
  }),
@@ -101815,7 +103143,7 @@ function FeishuEventPicker({ value, onChange, disabled = false, allowedEvents })
101815
103143
  unavailable.join(", ")
101816
103144
  ]
101817
103145
  }),
101818
- allowedEvents == null && /* @__PURE__ */ jsxs("details", { children: [
103146
+ !readOnly && allowedEvents == null && /* @__PURE__ */ jsxs("details", { children: [
101819
103147
  /* @__PURE__ */ jsx("summary", {
101820
103148
  className: "cursor-pointer text-xs text-muted-foreground",
101821
103149
  children: t("eventSources.customEvent")
@@ -103607,6 +104935,7 @@ var resources = {
103607
104935
  "missingStatuses": "Some selected statuses are no longer available. Remove or replace them."
103608
104936
  },
103609
104937
  nodePicker: {
104938
+ "custom": "Custom",
103610
104939
  "actionGroups": {
103611
104940
  "read": "Read actions",
103612
104941
  "write": "Write actions",
@@ -103835,6 +105164,12 @@ var resources = {
103835
105164
  "connector": "Connector",
103836
105165
  "workflow": "Workflow"
103837
105166
  },
105167
+ connectorProxy: {
105168
+ "bodyUnsupported": "GET requests do not support a request body.",
105169
+ "title": "Custom API Request",
105170
+ "description": "Call a Provider API using its connected account.",
105171
+ "endpoint": "Endpoint"
105172
+ },
103838
105173
  httpRequest: {
103839
105174
  "title": "HTTP Request",
103840
105175
  "description": "Send an HTTP request and use its response in the workflow.",
@@ -104997,6 +106332,7 @@ var resources = {
104997
106332
  "missingStatuses": "部分已选状态不再可用,请移除或重新选择。"
104998
106333
  },
104999
106334
  nodePicker: {
106335
+ "custom": "自定义",
105000
106336
  "actionGroups": {
105001
106337
  "read": "读取接口",
105002
106338
  "write": "写入接口",
@@ -105225,6 +106561,12 @@ var resources = {
105225
106561
  "connector": "连接器",
105226
106562
  "workflow": "工作流"
105227
106563
  },
106564
+ connectorProxy: {
106565
+ "bodyUnsupported": "GET 请求不支持请求体。",
106566
+ "title": "自定义 API 请求",
106567
+ "description": "使用已连接账号调用 Provider API。",
106568
+ "endpoint": "接口路径"
106569
+ },
105228
106570
  httpRequest: {
105229
106571
  "title": "HTTP 请求",
105230
106572
  "description": "发送 HTTP 请求,在工作流中使用响应数据。",
@@ -106387,6 +107729,7 @@ var resources = {
106387
107729
  "missingStatuses": "部分已選狀態不再可用,請移除或重新選擇。"
106388
107730
  },
106389
107731
  nodePicker: {
107732
+ "custom": "自訂",
106390
107733
  "actionGroups": {
106391
107734
  "read": "讀取介面",
106392
107735
  "write": "寫入介面",
@@ -106615,6 +107958,12 @@ var resources = {
106615
107958
  "connector": "連接器",
106616
107959
  "workflow": "工作流程"
106617
107960
  },
107961
+ connectorProxy: {
107962
+ "bodyUnsupported": "GET 請求不支援請求本文。",
107963
+ "title": "自訂 API 請求",
107964
+ "description": "使用已連線帳號呼叫 Provider API。",
107965
+ "endpoint": "介面路徑"
107966
+ },
106618
107967
  httpRequest: {
106619
107968
  "title": "HTTP 請求",
106620
107969
  "description": "傳送 HTTP 請求,在工作流程中使用回應資料。",
@@ -107777,6 +109126,7 @@ var resources = {
107777
109126
  "missingStatuses": "選択したステータスの一部は利用できません。削除するか選び直してください。"
107778
109127
  },
107779
109128
  nodePicker: {
109129
+ "custom": "カスタム",
107780
109130
  "actionGroups": {
107781
109131
  "read": "読み取り操作",
107782
109132
  "write": "書き込み操作",
@@ -108005,6 +109355,12 @@ var resources = {
108005
109355
  "connector": "コネクター",
108006
109356
  "workflow": "ワークフロー"
108007
109357
  },
109358
+ connectorProxy: {
109359
+ "bodyUnsupported": "GET リクエストはリクエストボディに対応していません。",
109360
+ "title": "カスタム API リクエスト",
109361
+ "description": "接続済みアカウントで Provider API を呼び出します。",
109362
+ "endpoint": "エンドポイント"
109363
+ },
108008
109364
  httpRequest: {
108009
109365
  "title": "HTTP リクエスト",
108010
109366
  "description": "HTTP リクエストを送信し、ワークフローでレスポンスを使用します。",
@@ -109167,6 +110523,7 @@ var resources = {
109167
110523
  "missingStatuses": "선택한 상태 중 일부를 사용할 수 없습니다. 삭제하거나 다시 선택하세요."
109168
110524
  },
109169
110525
  nodePicker: {
110526
+ "custom": "사용자 지정",
109170
110527
  "actionGroups": {
109171
110528
  "read": "읽기 작업",
109172
110529
  "write": "쓰기 작업",
@@ -109395,6 +110752,12 @@ var resources = {
109395
110752
  "connector": "커넥터",
109396
110753
  "workflow": "워크플로"
109397
110754
  },
110755
+ connectorProxy: {
110756
+ "bodyUnsupported": "GET 요청은 요청 본문을 지원하지 않습니다.",
110757
+ "title": "사용자 지정 API 요청",
110758
+ "description": "연결된 계정으로 Provider API를 호출합니다.",
110759
+ "endpoint": "엔드포인트"
110760
+ },
109398
110761
  httpRequest: {
109399
110762
  "title": "HTTP 요청",
109400
110763
  "description": "HTTP 요청을 보내고 워크플로에서 응답을 사용합니다.",
@@ -110557,6 +111920,7 @@ var resources = {
110557
111920
  "missingStatuses": "Некоторые выбранные статусы больше недоступны. Удалите или замените их."
110558
111921
  },
110559
111922
  nodePicker: {
111923
+ "custom": "Пользовательские",
110560
111924
  "actionGroups": {
110561
111925
  "read": "Операции чтения",
110562
111926
  "write": "Операции записи",
@@ -110785,6 +112149,12 @@ var resources = {
110785
112149
  "connector": "Коннектор",
110786
112150
  "workflow": "Рабочий процесс"
110787
112151
  },
112152
+ connectorProxy: {
112153
+ "bodyUnsupported": "GET-запросы не поддерживают тело запроса.",
112154
+ "title": "Пользовательский API-запрос",
112155
+ "description": "Вызов API провайдера через подключённый аккаунт.",
112156
+ "endpoint": "Путь запроса"
112157
+ },
110788
112158
  httpRequest: {
110789
112159
  "title": "HTTP-запрос",
110790
112160
  "description": "Отправить HTTP-запрос и использовать ответ в рабочем процессе.",
@@ -111947,6 +113317,7 @@ var resources = {
111947
113317
  "missingStatuses": "Certains statuts sélectionnés ne sont plus disponibles. Supprimez-les ou remplacez-les."
111948
113318
  },
111949
113319
  nodePicker: {
113320
+ "custom": "Personnalisé",
111950
113321
  "actionGroups": {
111951
113322
  "read": "Actions de lecture",
111952
113323
  "write": "Actions d’écriture",
@@ -112175,6 +113546,12 @@ var resources = {
112175
113546
  "connector": "Connecteur",
112176
113547
  "workflow": "Workflow"
112177
113548
  },
113549
+ connectorProxy: {
113550
+ "bodyUnsupported": "Les requêtes GET ne prennent pas en charge de corps.",
113551
+ "title": "Requête API personnalisée",
113552
+ "description": "Appeler une API du fournisseur avec le compte connecté.",
113553
+ "endpoint": "Point de terminaison"
113554
+ },
112178
113555
  httpRequest: {
112179
113556
  "title": "Requête HTTP",
112180
113557
  "description": "Envoyer une requête HTTP et utiliser sa réponse dans le workflow.",
@@ -112936,30 +114313,33 @@ function CreateEventSourceDialog({ client, sourceKind, notify, teamId, existingN
112936
114313
  }
112937
114314
  //#endregion
112938
114315
  //#region src/workbench/browser/runtime/editor/feishuEventFilters.tsx
112939
- function FeishuEventFilters({ field, config, events, managed, disabled, onChange }) {
114316
+ function FeishuEventFilters({ field, config, events, managed, disabled, readOnly = false, onChange }) {
112940
114317
  const t = useTranslate();
112941
114318
  const resource = isJsonObject(config.resource) ? config.resource : void 0;
112942
114319
  const kind = feishuResourceKind(events);
114320
+ const storedKind = resource?.kind;
114321
+ const displayKind = readOnly && (storedKind == "document" || storedKind == "calendar" || storedKind == "approval") ? storedKind : kind;
112943
114322
  const chats = Array.isArray(config.chatIds) ? config.chatIds.filter((item) => typeof item == "string") : [];
112944
114323
  const chatSupported = supportsFeishuChatFilter(events);
112945
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [field !== "resource" && (chatSupported || chats.length > 0) && /* @__PURE__ */ jsx("div", {
114324
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [field !== "resource" && (chatSupported || chats.length > 0) && /* @__PURE__ */ jsxs("div", {
112946
114325
  className: "flex flex-col gap-2",
112947
- children: chatSupported ? /* @__PURE__ */ jsx(ChatFilter, {
114326
+ children: [(chatSupported || readOnly) && /* @__PURE__ */ jsx(ChatFilter, {
112948
114327
  value: chats,
112949
114328
  disabled,
114329
+ readOnly,
112950
114330
  onChange: (value) => onChange("chatIds", value)
112951
- }, JSON.stringify(chats)) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
114331
+ }, JSON.stringify(chats)), !chatSupported && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
112952
114332
  role: "alert",
112953
114333
  className: "m-0 text-sm text-destructive",
112954
114334
  children: t("eventSources.incompatibleChats")
112955
- }), /* @__PURE__ */ jsx(Button$1, {
114335
+ }), !readOnly && /* @__PURE__ */ jsx(Button$1, {
112956
114336
  variant: "outline",
112957
114337
  size: "sm",
112958
114338
  className: "self-start",
112959
114339
  disabled,
112960
114340
  onClick: () => onChange("chatIds", void 0),
112961
114341
  children: t("eventSources.removeFilter")
112962
- })] })
114342
+ })] })]
112963
114343
  }), field !== "chatIds" && (kind != null || resource != null) && /* @__PURE__ */ jsxs("div", {
112964
114344
  className: "flex flex-col gap-3",
112965
114345
  children: [
@@ -112967,7 +114347,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
112967
114347
  className: "flex items-center gap-2",
112968
114348
  children: [/* @__PURE__ */ jsx(Checkbox, {
112969
114349
  checked: resource != null,
112970
- disabled: disabled || resource == null && (!managed || kind == null),
114350
+ disabled: readOnly || disabled || resource == null && (!managed || kind == null),
112971
114351
  onCheckedChange: (checked) => onChange("resource", checked ? {
112972
114352
  kind,
112973
114353
  id: "",
@@ -112979,7 +114359,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
112979
114359
  className: "m-0 text-xs leading-5 text-muted-foreground",
112980
114360
  children: t("eventSources.subscribeResourceHint")
112981
114361
  }),
112982
- !managed && /* @__PURE__ */ jsx("p", {
114362
+ !readOnly && !managed && /* @__PURE__ */ jsx("p", {
112983
114363
  className: "m-0 text-xs leading-5 text-muted-foreground",
112984
114364
  children: t("eventSources.managementRequired")
112985
114365
  }),
@@ -112988,8 +114368,8 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
112988
114368
  className: "m-0 text-sm text-destructive",
112989
114369
  children: t("eventSources.incompatibleResource")
112990
114370
  }),
112991
- resource != null && kind != null && resource.kind == kind && /* @__PURE__ */ jsxs(Fragment$1, { children: [
112992
- kind == "document" && /* @__PURE__ */ jsx(SourceSelect, {
114371
+ resource != null && displayKind != null && resource.kind == displayKind && /* @__PURE__ */ jsxs(Fragment$1, { children: [
114372
+ displayKind == "document" && /* @__PURE__ */ jsx(SourceSelect, {
112993
114373
  label: t("eventSources.documentType"),
112994
114374
  value: typeof resource.documentType == "string" ? resource.documentType : "",
112995
114375
  options: [
@@ -113003,7 +114383,7 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
113003
114383
  value,
113004
114384
  label: t(`eventSources.documentTypes.${value}`)
113005
114385
  })),
113006
- disabled: disabled || !managed,
114386
+ disabled: readOnly || disabled || !managed,
113007
114387
  onChange: (value) => onChange("resource", {
113008
114388
  ...resource,
113009
114389
  documentType: value
@@ -113011,9 +114391,10 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
113011
114391
  }),
113012
114392
  /* @__PURE__ */ jsxs(Label, {
113013
114393
  className: "flex flex-col items-stretch gap-2",
113014
- children: [t(`eventSources.resourceIds.${kind}`), /* @__PURE__ */ jsx(Input, {
114394
+ children: [t(`eventSources.resourceIds.${displayKind}`), /* @__PURE__ */ jsx(Input, {
113015
114395
  value: typeof resource.id == "string" ? resource.id : "",
113016
- disabled: disabled || !managed,
114396
+ disabled: !readOnly && (disabled || !managed),
114397
+ readOnly,
113017
114398
  required: true,
113018
114399
  onChange: (event) => onChange("resource", {
113019
114400
  ...resource,
@@ -113023,23 +114404,25 @@ function FeishuEventFilters({ field, config, events, managed, disabled, onChange
113023
114404
  }),
113024
114405
  /* @__PURE__ */ jsx("p", {
113025
114406
  className: "m-0 text-xs leading-5 text-muted-foreground",
113026
- children: t(`eventSources.resourceHints.${kind}`)
114407
+ children: t(`eventSources.resourceHints.${displayKind}`)
113027
114408
  })
113028
114409
  ] })
113029
114410
  ]
113030
114411
  })] });
113031
114412
  }
113032
- function ChatFilter({ value, disabled, onChange }) {
114413
+ function ChatFilter({ value, disabled, readOnly = false, onChange }) {
113033
114414
  const t = useTranslate();
113034
114415
  const [text, setText] = useState(value.join("\n"));
113035
114416
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Label, {
113036
114417
  className: "flex flex-col items-stretch gap-2",
113037
114418
  children: [t("eventSources.specifiedChats"), /* @__PURE__ */ jsx(Textarea, {
113038
114419
  value: text,
113039
- disabled,
114420
+ disabled: disabled && !readOnly,
114421
+ readOnly,
113040
114422
  rows: 3,
113041
114423
  onChange: (event) => setText(event.target.value),
113042
114424
  onBlur: () => {
114425
+ if (readOnly || disabled) return;
113043
114426
  const ids = [...new Set(text.split("\n").map((item) => item.trim()).filter(Boolean))];
113044
114427
  if (JSON.stringify(ids) != JSON.stringify(value)) onChange(ids.length == 0 ? void 0 : ids);
113045
114428
  }
@@ -114115,15 +115498,18 @@ function EventSourceSelect({ label, value, options, disabled, onChange, onOpen }
114115
115498
  })
114116
115499
  });
114117
115500
  }
114118
- function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLabels, config: assignments, nodeId, connectionId, disabled, store }) {
115501
+ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLabels, config: assignments, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
115502
+ const disabled = temporarilyDisabled || readOnly;
115503
+ const editor = readOnly ? void 0 : store;
114119
115504
  const config = triggerConfigValues(inputs, assignments);
114120
115505
  const t = useTranslate();
114121
115506
  const [attempt, setAttempt] = useState(0);
114122
115507
  const sourceId = typeof config.sourceId == "string" ? config.sourceId : "";
114123
- const flowId = store.$.flowId.value;
115508
+ const flowId = editor?.$.flowId.value;
114124
115509
  const key = JSON.stringify([flowId, nodeId]);
114125
115510
  const [state, setState] = useState();
114126
115511
  useEffect(() => {
115512
+ if (editor == null) return;
114127
115513
  const controller = new AbortController();
114128
115514
  setState((current) => current?.key == key ? {
114129
115515
  ...current,
@@ -114133,7 +115519,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114133
115519
  key,
114134
115520
  loading: true
114135
115521
  });
114136
- store.loadEventSources(controller.signal).then((result) => {
115522
+ editor.loadEventSources(controller.signal).then((result) => {
114137
115523
  if (!controller.signal.aborted) setState({
114138
115524
  key,
114139
115525
  ...result,
@@ -114152,24 +115538,24 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114152
115538
  });
114153
115539
  return () => controller.abort();
114154
115540
  }, [
114155
- store,
115541
+ editor,
114156
115542
  key,
114157
115543
  attempt
114158
115544
  ]);
114159
115545
  const sources = state?.key == key ? state.sources : void 0;
114160
115546
  const matchingSources = sources?.filter((source) => source.provider == provider && source.connectionId == connectionId);
114161
- const options = matchingSources?.map((source) => ({
115547
+ const options = readOnly ? sourceId ? [{
115548
+ value: sourceId,
115549
+ label: sourceId
115550
+ }] : [] : matchingSources?.map((source) => ({
114162
115551
  value: source.sourceId,
114163
115552
  label: source.name
114164
115553
  }));
114165
115554
  const failed = state?.key == key && state.failed;
114166
115555
  const loading = state?.key != key || state.loading == true;
114167
115556
  const selectedSource = matchingSources?.find((source) => source.sourceId == sourceId);
114168
- const eventOptions = selectedSource?.eventTypes.map((type) => ({
114169
- value: type,
114170
- label: type
114171
- }));
114172
115557
  const selectedEvents = Array.isArray(config.eventTypes) ? config.eventTypes.filter((value) => typeof value == "string") : [];
115558
+ const eventOptions = readOnly ? selectedEvents : selectedSource?.eventTypes;
114173
115559
  const visibleInputs = inputs.filter((input) => {
114174
115560
  if ("group" in input || input.handle === "sourceId" || input.handle === "eventTypes") return true;
114175
115561
  if (!sourceId) return false;
@@ -114178,22 +115564,23 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114178
115564
  return true;
114179
115565
  });
114180
115566
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
115567
+ readOnly,
114181
115568
  onReset: () => {
114182
- return store.nodes.resetTriggerConfig(nodeId);
115569
+ return editor?.nodes.resetTriggerConfig(nodeId);
114183
115570
  },
114184
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
115571
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
114185
115572
  inputs: visibleInputs,
114186
115573
  fieldLabels,
114187
115574
  config: assignments,
114188
115575
  disabled,
114189
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
115576
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
114190
115577
  renderEditor: (input) => input.handle === "sourceId" ? /* @__PURE__ */ jsxs("div", {
114191
115578
  className: "flex min-w-0 flex-col gap-2",
114192
115579
  children: [
114193
115580
  options == null ? /* @__PURE__ */ jsx("div", {
114194
115581
  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",
114195
115582
  children: t("eventSources.loading")
114196
- }) : options.length > 0 ? /* @__PURE__ */ jsx(EventSourceSelect, {
115583
+ }) : readOnly || options.length > 0 ? /* @__PURE__ */ jsx(EventSourceSelect, {
114197
115584
  label: fieldLabels?.sourceId ?? t("eventSources.source"),
114198
115585
  value: sourceId,
114199
115586
  options,
@@ -114201,12 +115588,12 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114201
115588
  onOpen: () => setAttempt((value) => value + 1),
114202
115589
  onChange: (value) => {
114203
115590
  const source = matchingSources?.find((item) => item.sourceId == value);
114204
- if (source != null) store.nodes.setTriggerEventSource(nodeId, source);
115591
+ if (source != null) editor?.nodes.setTriggerEventSource(nodeId, source);
114205
115592
  }
114206
- }) : /* @__PURE__ */ jsxs("div", {
115593
+ }) : editor != null ? /* @__PURE__ */ jsxs("div", {
114207
115594
  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))]",
114208
115595
  children: [/* @__PURE__ */ jsx(CreateEventSourceDialog, {
114209
- notify: store.notify,
115596
+ notify: editor.notify,
114210
115597
  className: "min-w-0 flex-1",
114211
115598
  trigger: /* @__PURE__ */ jsx(Button$1, {
114212
115599
  type: "button",
@@ -114215,7 +115602,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114215
115602
  className: "h-full w-full justify-start rounded-none border-0 bg-transparent px-2"
114216
115603
  }),
114217
115604
  sourceKind: eventSourceKind(provider),
114218
- client: store.eventSourceClient,
115605
+ client: editor.eventSourceClient,
114219
115606
  teamId: state?.key == key ? state.teamId ?? null : null,
114220
115607
  existingNames: sources?.map((source) => source.name) ?? [],
114221
115608
  disabled: disabled || state?.key != key || state.teamId === void 0,
@@ -114223,8 +115610,8 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114223
115610
  ...current,
114224
115611
  sources: [...current.sources ?? [], source]
114225
115612
  } : current),
114226
- onSelect: async (source) => store.$.flowId.value == flowId && await store.nodes.setTriggerEventSource(nodeId, source)
114227
- }, JSON.stringify([store.$.flowId.value, nodeId])), /* @__PURE__ */ jsx(Button$1, {
115613
+ onSelect: async (source) => editor.$.flowId.value == flowId && await editor.nodes.setTriggerEventSource(nodeId, source)
115614
+ }, JSON.stringify([editor.$.flowId.value, nodeId])), /* @__PURE__ */ jsx(Button$1, {
114228
115615
  type: "button",
114229
115616
  size: "icon-xs",
114230
115617
  variant: "ghost",
@@ -114238,7 +115625,7 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114238
115625
  className: `i-lucide-light:refresh-cw ${loading ? "animate-spin motion-reduce:animate-none" : ""}`
114239
115626
  })
114240
115627
  })]
114241
- }),
115628
+ }) : null,
114242
115629
  sourceId && options != null && !options.some((option) => option.value == sourceId) && /* @__PURE__ */ jsx("p", {
114243
115630
  role: "alert",
114244
115631
  className: "text-sm text-destructive",
@@ -114250,14 +115637,15 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114250
115637
  children: t("eventSources.loadFailed")
114251
115638
  })
114252
115639
  ]
114253
- }) : input.handle === "eventTypes" && provider === "feishu_app_bot" ? sourceId ? /* @__PURE__ */ jsxs("div", {
115640
+ }) : input.handle === "eventTypes" && provider === "feishu_app_bot" ? sourceId || readOnly ? /* @__PURE__ */ jsxs("div", {
114254
115641
  className: "flex flex-col gap-2",
114255
115642
  children: [/* @__PURE__ */ jsx(FeishuEventPicker, {
115643
+ readOnly,
114256
115644
  value: selectedEvents,
114257
- allowedEvents: (eventOptions ?? []).map((option) => option.value),
115645
+ allowedEvents: eventOptions ?? [],
114258
115646
  disabled: disabled || eventOptions == null,
114259
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "eventTypes", value)
114260
- }), /* @__PURE__ */ jsx("p", {
115647
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "eventTypes", value)
115648
+ }), !readOnly && /* @__PURE__ */ jsx("p", {
114261
115649
  className: "m-0 text-xs text-muted-foreground",
114262
115650
  children: t("eventSources.sourceEventsHint")
114263
115651
  })]
@@ -114265,12 +115653,13 @@ function EventSourceTriggerConfig({ inputs, provider = "feishu_app_bot", fieldLa
114265
115653
  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",
114266
115654
  children: t("eventSources.selectSourceFirst")
114267
115655
  }) : input.handle === "chatIds" || input.handle === "resource" ? /* @__PURE__ */ jsx(FeishuEventFilters, {
115656
+ readOnly,
114268
115657
  field: input.handle,
114269
115658
  config,
114270
115659
  events: selectedEvents,
114271
115660
  managed: selectedSource?.manageSubscriptions ?? false,
114272
115661
  disabled: disabled || selectedSource == null,
114273
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value)
115662
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value)
114274
115663
  }) : void 0
114275
115664
  });
114276
115665
  }
@@ -115093,109 +116482,6 @@ function GeneralSettings({ title, children, disabled = false, readOnly = false,
115093
116482
  }, nodeId);
115094
116483
  }
115095
116484
  //#endregion
115096
- //#region src/workbench/browser/runtime/editor/httpParameterEditor.tsx
115097
- var expanded$2 = () => true;
115098
- var object = (value) => value != null && typeof value === "object" && !Array.isArray(value) ? value : {};
115099
- function HttpParameterEditor({ group, task, entries, disabled, readOnly, variables, renderSource, onEdit }) {
115100
- const t = useTranslate();
115101
- if (task.executor.kind !== "http-request") return null;
115102
- const parameters = task.executor[group];
115103
- const root = parameters.mode === "object" ? entries[group] : void 0;
115104
- const label = t(`httpRequest.${group}`);
115105
- const schema = group === "query" ? httpQuerySchema : httpHeaderSchema;
115106
- const handle = (name) => `${group === "query" ? "query" : "header"}.${name}`;
115107
- const values = parameters.mode === "fields" ? Object.fromEntries(parameters.names.map((name) => {
115108
- const value = entries[handle(name)]?.value;
115109
- return [name, value === void 0 ? "" : value];
115110
- })) : object(root?.value);
115111
- const input = (port, entry, name) => {
115112
- const upstream = renderSource(port.handle, port);
115113
- return {
115114
- embedded: true,
115115
- definition: port,
115116
- variables,
115117
- disabled,
115118
- readOnly,
115119
- variableName: entry?.variableName,
115120
- connected: entry?.connected ?? false,
115121
- upstream: upstream == null ? void 0 : {
115122
- ...upstream,
115123
- onChange: (source) => onEdit({
115124
- kind: "source",
115125
- source: {
115126
- kind: "node",
115127
- ...source
115128
- },
115129
- field: name,
115130
- fields: values
115131
- })
115132
- },
115133
- onVariable: (next) => {
115134
- if (next == null) onEdit({
115135
- kind: "fields",
115136
- value: name == null ? {} : {
115137
- ...values,
115138
- [name]: ""
115139
- },
115140
- field: name
115141
- });
115142
- else onEdit({
115143
- kind: "variable",
115144
- name: next,
115145
- field: name,
115146
- fields: values
115147
- });
115148
- }
115149
- };
115150
- };
115151
- return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(FieldTable, {
115152
- standalone: true,
115153
- layout: "values",
115154
- typeColumn: false,
115155
- columnHeadings: false,
115156
- actionSlots: 2,
115157
- children: /* @__PURE__ */ jsx(NodeInputValue, {
115158
- ...input({
115159
- handle: group,
115160
- jsonSchema: schema,
115161
- nullable: true
115162
- }, root),
115163
- label,
115164
- value: values,
115165
- onValue: (next) => onEdit({
115166
- kind: "fields",
115167
- value: object(next)
115168
- }),
115169
- presentation: {
115170
- valueOnly: true,
115171
- hideOptions: true,
115172
- hideValueTools: true,
115173
- hideChildTypes: true,
115174
- expansionPolicy: expanded$2,
115175
- validateObjectFieldName: (name, current) => group === "query" ? !!name.trim() && (name === current || !Object.hasOwn(values, name)) : httpHeaderNameIssue(name, Object.keys(values).filter((key) => key !== current)) == null,
115176
- renderObjectField: (name, props) => /* @__PURE__ */ jsx(NodeInputValue, {
115177
- ...input({
115178
- handle: handle(name),
115179
- jsonSchema: props.schema,
115180
- nullable: true
115181
- }, parameters.mode === "fields" ? entries[handle(name)] : void 0, name),
115182
- label: props.label,
115183
- value: parameters.mode === "fields" ? entries[handle(name)]?.value : values[name],
115184
- presentation: props,
115185
- onValue: (value) => onEdit({
115186
- kind: "fields",
115187
- value: {
115188
- ...values,
115189
- [name]: value ?? null
115190
- },
115191
- field: name
115192
- })
115193
- })
115194
- }
115195
- })
115196
- })] });
115197
- }
115198
- //#endregion
115199
116485
  //#region src/workbench/browser/runtime/editor/httpRequestSection.tsx
115200
116486
  function HttpRequestSection({ task, disabled, onSave, parameters, input }) {
115201
116487
  const t = useTranslate();
@@ -115366,7 +116652,8 @@ function HttpRequestSection({ task, disabled, onSave, parameters, input }) {
115366
116652
  }
115367
116653
  //#endregion
115368
116654
  //#region src/workbench/browser/runtime/editor/useTriggerConfigOptions.ts
115369
- function useTriggerConfigOptions(store, nodeId, field, scope, enabled) {
116655
+ function useTriggerConfigOptions(store, nodeId, field, scope, requested) {
116656
+ const enabled = store != null && requested;
115370
116657
  const [attempt, setAttempt] = useState(0);
115371
116658
  const key = JSON.stringify([
115372
116659
  nodeId,
@@ -115375,7 +116662,7 @@ function useTriggerConfigOptions(store, nodeId, field, scope, enabled) {
115375
116662
  ]);
115376
116663
  const [state, setState] = useState();
115377
116664
  useEffect(() => {
115378
- if (!enabled) return;
116665
+ if (!enabled || store == null) return;
115379
116666
  const controller = new AbortController();
115380
116667
  setState((current) => ({
115381
116668
  failed: false,
@@ -115491,12 +116778,15 @@ function TeamSelect({ disabled, missing, options, value, onChange }) {
115491
116778
  })]
115492
116779
  });
115493
116780
  }
115494
- function StatusSelect({ disabled, missing, options, selected, teamSelected, onChange }) {
116781
+ function StatusSelect({ disabled, readOnly = false, missing, options, selected, teamSelected, onChange }) {
115495
116782
  const t = useTranslate();
115496
116783
  const descriptionId = useId();
115497
116784
  const errorId = useId();
115498
116785
  const [container, setContainer] = useState(null);
115499
- const choices = [...options.options ?? [], ...missing.map((value) => ({
116786
+ const choices = readOnly ? selected.map((value) => options.options?.find((item) => item.value == value) ?? {
116787
+ label: value,
116788
+ value
116789
+ }) : [...options.options ?? [], ...missing.map((value) => ({
115500
116790
  label: t("linearTrigger.unavailableStatus", { id: value }),
115501
116791
  value
115502
116792
  }))];
@@ -115518,7 +116808,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
115518
116808
  }),
115519
116809
  /* @__PURE__ */ jsxs(DropdownMenu, {
115520
116810
  onOpenChange: (open) => {
115521
- if (open) options.refresh();
116811
+ if (open && !readOnly) options.refresh();
115522
116812
  },
115523
116813
  children: [/* @__PURE__ */ jsxs(DropdownMenuTrigger, {
115524
116814
  render: /* @__PURE__ */ jsx(Button$1, {
@@ -115528,7 +116818,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
115528
116818
  className: "w-full min-w-0 justify-between",
115529
116819
  "data-field-control": true,
115530
116820
  "data-field-prompt": missing.length > 0 || void 0,
115531
- disabled,
116821
+ disabled: disabled && !readOnly,
115532
116822
  size: "field",
115533
116823
  title: missing.length > 0 ? t("linearTrigger.missingStatuses") : t("linearTrigger.statusHint"),
115534
116824
  type: "button",
@@ -115558,6 +116848,7 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
115558
116848
  const unavailable = missing.includes(item.value);
115559
116849
  return /* @__PURE__ */ jsxs(DropdownMenuCheckboxItem, {
115560
116850
  checked,
116851
+ disabled: readOnly,
115561
116852
  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" : ""}`,
115562
116853
  onCheckedChange: (next) => onChange(next ? [...selected, item.value] : selected.filter((value) => value != item.value)),
115563
116854
  children: ["color" in item && item.color != null && /* @__PURE__ */ jsx("span", {
@@ -115596,33 +116887,37 @@ function StatusSelect({ disabled, missing, options, selected, teamSelected, onCh
115596
116887
  ]
115597
116888
  });
115598
116889
  }
115599
- function LinearTriggerConfig({ inputs, fieldLabels, config: assignments, nodeId, connectionId, disabled, store }) {
116890
+ function LinearTriggerConfig({ inputs, fieldLabels, config: assignments, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
116891
+ const disabled = readOnly || temporarilyDisabled;
116892
+ const editor = readOnly ? void 0 : store;
115600
116893
  const config = triggerConfigValues(inputs, assignments);
115601
116894
  const teamId = typeof config.teamId == "string" ? config.teamId : void 0;
115602
116895
  const selected = Array.isArray(config.stateIds) ? config.stateIds.filter((id) => typeof id == "string") : [];
115603
- const scope = JSON.stringify([store.$.flowId.value, connectionId]);
115604
- const teams = useTriggerConfigOptions(store, nodeId, "teamId", scope, connectionId != null);
115605
- const states = useTriggerConfigOptions(store, nodeId, "stateIds", JSON.stringify([scope, teamId]), connectionId != null && teamId != null);
116896
+ const scope = JSON.stringify([editor?.$.flowId.value, connectionId]);
116897
+ const teams = useTriggerConfigOptions(editor, nodeId, "teamId", scope, connectionId != null);
116898
+ const states = useTriggerConfigOptions(editor, nodeId, "stateIds", JSON.stringify([scope, teamId]), connectionId != null && teamId != null);
115606
116899
  const missingTeam = teamId != null && teams.options != null && !teams.options.some((item) => item.value == teamId);
115607
116900
  const missingStates = states.options == null ? [] : selected.filter((id) => !states.options.some((item) => item.value == id));
115608
116901
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
115609
- onReset: () => store.nodes.resetTriggerConfig(nodeId),
115610
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
116902
+ readOnly,
116903
+ onReset: () => editor?.nodes.resetTriggerConfig(nodeId),
116904
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
115611
116905
  inputs,
115612
116906
  fieldLabels,
115613
116907
  config: assignments,
115614
116908
  disabled,
115615
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
116909
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
115616
116910
  renderEditor: (input) => input.handle === "teamId" ? /* @__PURE__ */ jsx(TeamSelect, {
115617
116911
  disabled: disabled || connectionId == null,
115618
116912
  missing: missingTeam,
115619
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "teamId", value),
116913
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "teamId", value),
115620
116914
  options: teams,
115621
116915
  value: teamId
115622
116916
  }) : input.handle === "stateIds" ? /* @__PURE__ */ jsx(StatusSelect, {
116917
+ readOnly,
115623
116918
  disabled: disabled || connectionId == null || teamId == null || missingTeam,
115624
116919
  missing: missingStates,
115625
- onChange: (value) => void store.nodes.saveTriggerConfig(nodeId, "stateIds", value),
116920
+ onChange: (value) => void editor?.nodes.saveTriggerConfig(nodeId, "stateIds", value),
115626
116921
  options: states,
115627
116922
  selected,
115628
116923
  teamSelected: teamId != null
@@ -116243,6 +117538,106 @@ function presentProviderOutputDescription(node, output, description, display) {
116243
117538
  return display?.outputs[output] ?? description;
116244
117539
  }
116245
117540
  //#endregion
117541
+ //#region src/workbench/browser/runtime/editor/requestParameterEditor.tsx
117542
+ var expanded$2 = () => true;
117543
+ var object = (value) => value != null && typeof value === "object" && !Array.isArray(value) ? value : {};
117544
+ function RequestParameterEditor({ group, parameters, schema, entries, disabled, readOnly, variables, renderSource, onEdit }) {
117545
+ const t = useTranslate();
117546
+ const root = parameters.mode === "object" ? entries[group] : void 0;
117547
+ const label = t(`httpRequest.${group}`);
117548
+ const handle = (name) => `${group === "query" ? "query" : "header"}.${name}`;
117549
+ const values = parameters.mode === "fields" ? Object.fromEntries(parameters.names.map((name) => {
117550
+ const value = entries[handle(name)]?.value;
117551
+ return [name, value === void 0 ? "" : value];
117552
+ })) : object(root?.value);
117553
+ const input = (port, entry, name) => {
117554
+ const upstream = renderSource(port.handle, port);
117555
+ return {
117556
+ embedded: true,
117557
+ definition: port,
117558
+ variables,
117559
+ disabled,
117560
+ readOnly,
117561
+ variableName: entry?.variableName,
117562
+ connected: entry?.connected ?? false,
117563
+ upstream: upstream == null ? void 0 : {
117564
+ ...upstream,
117565
+ onChange: (source) => onEdit({
117566
+ kind: "source",
117567
+ source: {
117568
+ kind: "node",
117569
+ ...source
117570
+ },
117571
+ field: name,
117572
+ fields: values
117573
+ })
117574
+ },
117575
+ onVariable: (next) => {
117576
+ if (next == null) onEdit({
117577
+ kind: "fields",
117578
+ value: name == null ? {} : {
117579
+ ...values,
117580
+ [name]: ""
117581
+ },
117582
+ field: name
117583
+ });
117584
+ else onEdit({
117585
+ kind: "variable",
117586
+ name: next,
117587
+ field: name,
117588
+ fields: values
117589
+ });
117590
+ }
117591
+ };
117592
+ };
117593
+ return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(FieldTable, {
117594
+ standalone: true,
117595
+ layout: "values",
117596
+ typeColumn: false,
117597
+ columnHeadings: false,
117598
+ actionSlots: 2,
117599
+ children: /* @__PURE__ */ jsx(NodeInputValue, {
117600
+ ...input({
117601
+ handle: group,
117602
+ jsonSchema: schema,
117603
+ nullable: true
117604
+ }, root),
117605
+ label,
117606
+ value: values,
117607
+ onValue: (next) => onEdit({
117608
+ kind: "fields",
117609
+ value: object(next)
117610
+ }),
117611
+ presentation: {
117612
+ valueOnly: true,
117613
+ hideOptions: true,
117614
+ hideValueTools: true,
117615
+ hideChildTypes: true,
117616
+ expansionPolicy: expanded$2,
117617
+ validateObjectFieldName: (name, current) => group === "query" ? !!name.trim() && (name === current || !Object.hasOwn(values, name)) : httpHeaderNameIssue(name, Object.keys(values).filter((key) => key !== current)) == null,
117618
+ renderObjectField: (name, props) => /* @__PURE__ */ jsx(NodeInputValue, {
117619
+ ...input({
117620
+ handle: handle(name),
117621
+ jsonSchema: props.schema,
117622
+ nullable: true
117623
+ }, parameters.mode === "fields" ? entries[handle(name)] : void 0, name),
117624
+ label: props.label,
117625
+ value: parameters.mode === "fields" ? entries[handle(name)]?.value : values[name],
117626
+ presentation: props,
117627
+ onValue: (value) => onEdit({
117628
+ kind: "fields",
117629
+ value: {
117630
+ ...values,
117631
+ [name]: value ?? null
117632
+ },
117633
+ field: name
117634
+ })
117635
+ })
117636
+ }
117637
+ })
117638
+ })] });
117639
+ }
117640
+ //#endregion
116246
117641
  //#region src/workbench/browser/runtime/editor/timeZoneSelect.tsx
116247
117642
  function TimeZoneSelect({ id, value, disabled, label, onChange, at = /* @__PURE__ */ new Date() }) {
116248
117643
  const t = useTranslate();
@@ -116677,24 +118072,27 @@ function SkipDuplicatesSection({ task, disabled, onSave, history }) {
116677
118072
  }
116678
118073
  //#endregion
116679
118074
  //#region src/workbench/browser/runtime/editor/tallyTriggerConfig.tsx
116680
- function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId, disabled, store }) {
118075
+ function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId, disabled: temporarilyDisabled, readOnly = false, store }) {
118076
+ const disabled = readOnly || temporarilyDisabled;
118077
+ const editor = readOnly ? void 0 : store;
116681
118078
  const t = useTranslate();
116682
118079
  const values = triggerConfigValues(inputs, config);
116683
118080
  const formId = typeof values.formId == "string" ? values.formId : void 0;
116684
- const forms = useTriggerConfigOptions(store, nodeId, "formId", JSON.stringify([store.$.flowId.value, connectionId]), connectionId != null);
118081
+ const forms = useTriggerConfigOptions(editor, nodeId, "formId", JSON.stringify([editor?.$.flowId.value, connectionId]), connectionId != null);
116685
118082
  const missing = formId != null && forms.options != null && !forms.options.some((item) => item.value == formId);
116686
118083
  const items = [...forms.options ?? [], ...formId != null && !forms.options?.some((item) => item.value == formId) ? [{
116687
118084
  value: formId,
116688
118085
  label: formId
116689
118086
  }] : []];
116690
118087
  return /* @__PURE__ */ jsx(TriggerConfigEditor, {
118088
+ readOnly,
116691
118089
  inputs,
116692
118090
  fieldLabels,
116693
118091
  config,
116694
118092
  disabled,
116695
- onChange: (name, value) => void store.nodes.saveTriggerConfig(nodeId, name, value),
116696
- onReset: () => store.nodes.resetTriggerConfig(nodeId),
116697
- onResetValue: (name) => void store.nodes.resetTriggerConfig(nodeId, [name]),
118093
+ onChange: (name, value) => void editor?.nodes.saveTriggerConfig(nodeId, name, value),
118094
+ onReset: () => editor?.nodes.resetTriggerConfig(nodeId),
118095
+ onResetValue: (name) => void editor?.nodes.resetTriggerConfig(nodeId, [name]),
116698
118096
  renderEditor: (input) => input.handle == "formId" ? /* @__PURE__ */ jsxs("div", {
116699
118097
  className: "min-w-0",
116700
118098
  children: [
@@ -116706,7 +118104,7 @@ function TallyTriggerConfig({ inputs, fieldLabels, config, nodeId, connectionId,
116706
118104
  if (open) forms.refresh();
116707
118105
  },
116708
118106
  onValueChange: (value) => {
116709
- if (typeof value == "string") store.nodes.saveTriggerConfig(nodeId, "formId", value);
118107
+ if (typeof value == "string") editor?.nodes.saveTriggerConfig(nodeId, "formId", value);
116710
118108
  },
116711
118109
  children: [/* @__PURE__ */ jsx(SelectTrigger, {
116712
118110
  "aria-label": t("tallyTrigger.form"),
@@ -117928,7 +119326,7 @@ function inspectorIcon(node) {
117928
119326
  if (node.definition.executor.kind == "decision") return "decision";
117929
119327
  if (node.definition.executor.kind == "workflow") return "flow";
117930
119328
  if (node.definition.executor.kind == "openapi" || node.definition.executor.kind == "http-request" || node.definition.executor.kind == "skip-duplicates") return "task";
117931
- return node.definition.executor.kind == "connector" ? "connection" : "llm";
119329
+ return node.definition.executor.kind == "connector" || node.definition.executor.kind === "connector-proxy" ? "connection" : "llm";
117932
119330
  }
117933
119331
  return "task";
117934
119332
  }
@@ -117962,6 +119360,7 @@ function nodePurposePlaceholder(selection, t, action, displays) {
117962
119360
  case "workflow": return t("workflow.description");
117963
119361
  case "skip-duplicates": return;
117964
119362
  case "http-request": return t("httpRequest.description");
119363
+ case "connector-proxy": return t("connectorProxy.description");
117965
119364
  case "openapi": return t("openapi.description");
117966
119365
  case "connector": return action?.description;
117967
119366
  case "llm": return t(definition.executor.mode == "json" ? "addNode.llmStructuredDescription" : "addNode.llmChatDescription");
@@ -118013,7 +119412,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118013
119412
  loading: false,
118014
119413
  names: [],
118015
119414
  onOpen: void 0
118016
- }, 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 }) {
119415
+ }, 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 }) {
118017
119416
  const store = readOnly ? void 0 : writableStore;
118018
119417
  const connectors = readOnly ? void 0 : liveConnectors;
118019
119418
  const triggers = readOnly ? void 0 : liveTriggers;
@@ -118035,6 +119434,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118035
119434
  const isAgent = task != null && "executor" in task && task.executor.kind == "agent";
118036
119435
  const isDecision = task != null && "executor" in task && task.executor.kind == "decision";
118037
119436
  const isHttpRequest = task != null && "executor" in task && task.executor.kind == "http-request";
119437
+ const proxy = task != null && "executor" in task && task.executor.kind === "connector-proxy" ? task.executor : void 0;
119438
+ const proxyProvider = proxy == null ? void 0 : connectorProvider ?? connectorProviders?.[proxy.providerId];
118038
119439
  const isOpenApi = task != null && "executor" in task && task.executor.kind == "openapi";
118039
119440
  const unconfiguredWorkflow = task != null && "executor" in task && task.executor.kind == "workflow" && !task.executor.flowId;
118040
119441
  const unconfiguredOpenApi = task != null && "executor" in task && task.executor.kind == "openapi" && !task.executor.path;
@@ -118077,6 +119478,98 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118077
119478
  selection?.id,
118078
119479
  selection?.kind
118079
119480
  ]);
119481
+ const requestInput = (handle, label) => {
119482
+ if (selection?.kind !== "task" || task == null) return null;
119483
+ const proxyBody = proxy != null && handle === "body";
119484
+ const definition = task.inputs.find((port) => "handle" in port && port.handle === handle) ?? (proxyBody ? connectorProxyBodyInput : void 0);
119485
+ if (definition == null) return null;
119486
+ const mapping = revision.inputMappings(selection.node)[handle];
119487
+ const source = mapping?.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
119488
+ const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
119489
+ const input = /* @__PURE__ */ jsx(NodeInputValue, {
119490
+ embedded: true,
119491
+ definition,
119492
+ label,
119493
+ presentation: {
119494
+ compact: !proxyBody,
119495
+ hideOptions: true,
119496
+ ...proxyBody ? {
119497
+ layout: "values",
119498
+ valueOnly: true,
119499
+ hideChildTypes: true,
119500
+ defaultEditor: "object",
119501
+ expansionPolicy: () => true,
119502
+ unset: {
119503
+ label: t(readOnly ? "valueEditor.unset" : "valueEditor.setValue"),
119504
+ required: false
119505
+ }
119506
+ } : {}
119507
+ },
119508
+ sourceOnly: handle.startsWith("auth."),
119509
+ readOnly,
119510
+ disabled,
119511
+ value: inputValue(mapping, definition.value),
119512
+ connected: mapping?.kind === "sources" && binding?.kind !== "variable",
119513
+ variableName: binding?.kind === "variable" ? binding.target : void 0,
119514
+ upstream: inputUpstreamSources({
119515
+ revision,
119516
+ sourceNodeIcons,
119517
+ selection,
119518
+ store,
119519
+ handleName: handle,
119520
+ port: definition,
119521
+ t,
119522
+ triggerDisplays
119523
+ }),
119524
+ variables,
119525
+ onValue: (value, deletion) => {
119526
+ store?.nodes.setInputValue(selection.id, handle, value, deletion);
119527
+ },
119528
+ onVariable: (name) => {
119529
+ store?.nodes.setInputVariable(selection.id, handle, name);
119530
+ },
119531
+ onReset: proxyBody && definition.value !== void 0 ? () => void store?.nodes.resetInputs(selection.id, [handle]) : void 0
119532
+ });
119533
+ return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), proxyBody ? /* @__PURE__ */ jsx(FieldTable, {
119534
+ standalone: true,
119535
+ layout: "values",
119536
+ typeColumn: false,
119537
+ columnHeadings: false,
119538
+ actionSlots: 2,
119539
+ children: input
119540
+ }) : input] }, handle);
119541
+ };
119542
+ const requestExecutor = task != null && "executor" in task && (task.executor.kind === "http-request" || task.executor.kind === "connector-proxy") ? task.executor : void 0;
119543
+ const requestParameters = requestExecutor != null && selection?.kind === "task" && ["query", "headers"].map((group) => /* @__PURE__ */ jsx(RequestParameterEditor, {
119544
+ group,
119545
+ parameters: requestExecutor[group],
119546
+ schema: proxy != null ? group === "query" ? connectorProxyQuerySchema : connectorProxyHeaderSchema : group === "query" ? httpQuerySchema : httpHeaderSchema,
119547
+ entries: Object.fromEntries(Object.entries(revision.inputMappings(selection.node)).map(([handle, mapping]) => {
119548
+ const source = mapping.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
119549
+ const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
119550
+ return [handle, {
119551
+ value: inputValue(mapping, void 0),
119552
+ connected: mapping.kind === "sources" && binding?.kind !== "variable",
119553
+ variableName: binding?.kind === "variable" ? binding.target : void 0
119554
+ }];
119555
+ })),
119556
+ variables,
119557
+ disabled,
119558
+ readOnly,
119559
+ renderSource: (handleName, port) => inputUpstreamSources({
119560
+ revision,
119561
+ sourceNodeIcons,
119562
+ selection,
119563
+ store,
119564
+ handleName,
119565
+ port,
119566
+ t,
119567
+ triggerDisplays
119568
+ }),
119569
+ onEdit: (edit) => {
119570
+ store?.nodes.saveRequestParameters(selection.id, group, edit);
119571
+ }
119572
+ }, group));
118080
119573
  const panel = /* @__PURE__ */ jsx(ScrollArea, {
118081
119574
  className: "inspector-scroll",
118082
119575
  tabIndex: -1,
@@ -118086,13 +119579,14 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118086
119579
  children: [
118087
119580
  selection?.kind === "trigger" && selection.trigger.kind === "webhook" && webhookDeployment != null && /* @__PURE__ */ jsx(WebhookDeployment, { ...webhookDeployment }, selection.id),
118088
119581
  readOnly && connector != null && /* @__PURE__ */ jsx(SavedConnectionReference, {
118089
- action: connector.action,
118090
- connectionId: connector.connectionId
119582
+ noSetup: connectorAction?.authenticated === false || connectorProviders?.[connector.action.split(".")[0]]?.noSetup,
119583
+ connectionId: proxy?.connectionId ?? connector?.connectionId
118091
119584
  }),
118092
- readOnly && selection?.kind === "trigger" && (selection.trigger.kind === "poll" || selection.trigger.kind === "integration") && /* @__PURE__ */ jsx(SavedConnectionReference, {
118093
- action: selection.trigger.definition.key,
118094
- connectionId: selection.trigger.connectionId
119585
+ readOnly && proxy != null && /* @__PURE__ */ jsx(SavedConnectionReference, {
119586
+ noSetup: proxyProvider?.noSetup,
119587
+ connectionId: proxy.connectionId
118095
119588
  }),
119589
+ readOnly && selection?.kind === "trigger" && (selection.trigger.kind === "poll" || selection.trigger.kind === "integration") && /* @__PURE__ */ jsx(SavedConnectionReference, { connectionId: selection.trigger.connectionId }),
118096
119590
  !readOnly && triggers != null && selection?.kind == "trigger" && /* @__PURE__ */ jsx(TriggerConnection, {
118097
119591
  activeConnections: triggerActiveConnections,
118098
119592
  authorizationPending: triggerAuthorizationPending,
@@ -118104,17 +119598,17 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118104
119598
  triggers,
118105
119599
  onConfigureAccess: (providerId) => void triggers.connect(providerId)
118106
119600
  }),
118107
- !readOnly && connectors != null && connector != null && nodeId != null && connectorAction?.authenticated !== false && /* @__PURE__ */ jsx(ConnectorAccount, {
118108
- action: connectorAction,
119601
+ !readOnly && connectors != null && (connector != null || proxy != null) && nodeId != null && (proxy != null ? proxyProvider?.noSetup !== true : connectorAction?.authenticated !== false) && /* @__PURE__ */ jsx(ConnectorAccount, {
119602
+ resource: proxy != null ? proxyProvider : connectorAction,
118109
119603
  actionError: connectorActionError,
118110
119604
  accessError: connectorAccessError,
118111
- actionId: connector.action,
118112
- onConfigureAccess: () => void connectors.connect(connectorAction?.serviceId ?? connector.action.split(".")[0]),
119605
+ actionId: proxy?.providerId ?? connector.action,
119606
+ onConfigureAccess: () => void connectors.connect(proxy?.providerId ?? connectorAction?.serviceId ?? connector.action.split(".")[0]),
118113
119607
  activeConnections: activeConnectorConnections,
118114
119608
  authorizationPending: connectorAuthorizationPending,
118115
119609
  connection: connectorConnection,
118116
119610
  connectionError: connectorConnectionError,
118117
- connectionId: connector.connectionId,
119611
+ connectionId: proxy?.connectionId ?? connector?.connectionId,
118118
119612
  connectors,
118119
119613
  disabled,
118120
119614
  fieldIdPrefix: `task-${selection?.id}`,
@@ -118139,6 +119633,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118139
119633
  isAgent && /* @__PURE__ */ jsx(AgentPrompt, {}),
118140
119634
  selection?.kind === "task" && selection.module != null && /* @__PURE__ */ jsx(CodeTaskSection, {
118141
119635
  readOnly,
119636
+ providers: connectorProviders,
118142
119637
  connectorAccess,
118143
119638
  connectorCandidates,
118144
119639
  onConfigureAccess: onConfigureConnectorAccess == null ? void 0 : () => onConfigureConnectorAccess(),
@@ -118151,7 +119646,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118151
119646
  store,
118152
119647
  theme
118153
119648
  }),
118154
- selection?.kind === "trigger" && (selection.trigger.kind === "integration" || selection.trigger.kind === "poll") && (!readOnly && store != null && [
119649
+ selection?.kind === "trigger" && (selection.trigger.kind === "integration" || selection.trigger.kind === "poll") && ([
118155
119650
  "feishu.on_event",
118156
119651
  "feishu_app_bot.on_event",
118157
119652
  "slackbot.on_event",
@@ -118161,6 +119656,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118161
119656
  "fireflies.on_meeting_ready",
118162
119657
  "jira.on_issue_event"
118163
119658
  ].includes(selection.trigger.definition.key) ? /* @__PURE__ */ jsx(EventSourceTriggerConfig, {
119659
+ readOnly,
118164
119660
  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",
118165
119661
  inputs: providerConfigInputs,
118166
119662
  fieldLabels: providerDisplay?.configInputLabels,
@@ -118169,7 +119665,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118169
119665
  connectionId: selection.trigger.connectionId,
118170
119666
  disabled,
118171
119667
  store
118172
- }) : !readOnly && store != null && selection.trigger.definition.key === "linear.on_issue_changed" ? /* @__PURE__ */ jsx(LinearTriggerConfig, {
119668
+ }) : selection.trigger.definition.key === "linear.on_issue_changed" ? /* @__PURE__ */ jsx(LinearTriggerConfig, {
119669
+ readOnly,
118173
119670
  inputs: providerConfigInputs,
118174
119671
  fieldLabels: providerDisplay?.configInputLabels,
118175
119672
  config: selection.trigger.config,
@@ -118177,7 +119674,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118177
119674
  connectionId: selection.trigger.connectionId,
118178
119675
  disabled,
118179
119676
  store
118180
- }) : !readOnly && store != null && selection.trigger.definition.key === "tally.on_form_response" ? /* @__PURE__ */ jsx(TallyTriggerConfig, {
119677
+ }) : selection.trigger.definition.key === "tally.on_form_response" ? /* @__PURE__ */ jsx(TallyTriggerConfig, {
119678
+ readOnly,
118181
119679
  inputs: providerConfigInputs,
118182
119680
  fieldLabels: providerDisplay?.configInputLabels,
118183
119681
  config: selection.trigger.config,
@@ -118312,74 +119810,8 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118312
119810
  isHttpRequest && task != null && "executor" in task && /* @__PURE__ */ jsx(HttpRequestSection, {
118313
119811
  task,
118314
119812
  disabled,
118315
- input: (handle, label) => {
118316
- if (selection?.kind !== "task") return null;
118317
- const definition = task.inputs.find((port) => "handle" in port && port.handle === handle);
118318
- if (definition == null) return null;
118319
- const mapping = revision.inputMappings(selection.node)[handle];
118320
- const source = mapping?.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
118321
- const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
118322
- return /* @__PURE__ */ jsxs(Field, { children: [/* @__PURE__ */ jsx(FieldLabel, { children: label }), /* @__PURE__ */ jsx(NodeInputValue, {
118323
- embedded: true,
118324
- definition,
118325
- label,
118326
- presentation: {
118327
- compact: true,
118328
- hideOptions: true
118329
- },
118330
- sourceOnly: handle.startsWith("auth."),
118331
- readOnly,
118332
- disabled,
118333
- value: inputValue(mapping, definition.value),
118334
- connected: mapping?.kind === "sources" && binding?.kind !== "variable",
118335
- variableName: binding?.kind === "variable" ? binding.target : void 0,
118336
- upstream: inputUpstreamSources({
118337
- revision,
118338
- sourceNodeIcons,
118339
- selection,
118340
- store,
118341
- handleName: handle,
118342
- t,
118343
- triggerDisplays
118344
- }),
118345
- variables,
118346
- onValue: (value, deletion) => {
118347
- store?.nodes.setInputValue(selection.id, handle, value, deletion);
118348
- },
118349
- onVariable: (name) => {
118350
- store?.nodes.setInputVariable(selection.id, handle, name);
118351
- }
118352
- })] }, handle);
118353
- },
118354
- parameters: selection?.kind === "task" && ["query", "headers"].map((group) => /* @__PURE__ */ jsx(HttpParameterEditor, {
118355
- group,
118356
- task,
118357
- entries: Object.fromEntries(Object.entries(revision.inputMappings(selection.node)).map(([handle, mapping]) => {
118358
- const source = mapping.kind === "sources" ? mapping.sources.find((item) => item.kind === "binding") : void 0;
118359
- const binding = source?.kind === "binding" ? revision.binding(source.bindingId) : void 0;
118360
- return [handle, {
118361
- value: inputValue(mapping, void 0),
118362
- connected: mapping.kind === "sources" && binding?.kind !== "variable",
118363
- variableName: binding?.kind === "variable" ? binding.target : void 0
118364
- }];
118365
- })),
118366
- variables,
118367
- disabled,
118368
- readOnly,
118369
- renderSource: (handleName, port) => inputUpstreamSources({
118370
- revision,
118371
- sourceNodeIcons,
118372
- selection,
118373
- store,
118374
- handleName,
118375
- port,
118376
- t,
118377
- triggerDisplays
118378
- }),
118379
- onEdit: (edit) => {
118380
- store?.nodes.saveHttpParameters(selection.id, group, edit);
118381
- }
118382
- }, group)),
119813
+ input: requestInput,
119814
+ parameters: requestParameters,
118383
119815
  onSave: (before, value) => store?.nodes.saveTaskSettings(selection.id, {
118384
119816
  kind: "http-request",
118385
119817
  name: task.name,
@@ -118387,6 +119819,21 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118387
119819
  task: value
118388
119820
  }) ?? Promise.resolve(false)
118389
119821
  }, `http:${selection?.id}`),
119822
+ proxy != null && task != null && "executor" in task && /* @__PURE__ */ jsx(ConnectorProxySection, {
119823
+ task,
119824
+ disabled,
119825
+ readOnly,
119826
+ hasBody: selection?.kind === "task" && connectorProxyHasBody(revision.inputMappings(selection.node).body, task.inputs.find((port) => "handle" in port && port.handle === "body")?.value),
119827
+ input: requestInput,
119828
+ parameters: requestParameters,
119829
+ onClearBody: () => store?.nodes.setInputValue(selection.id, "body", void 0) ?? Promise.resolve(false),
119830
+ onSave: (before, value) => store?.nodes.saveTaskSettings(selection.id, {
119831
+ kind: "connector-proxy",
119832
+ name: task.name,
119833
+ before,
119834
+ task: value
119835
+ }) ?? Promise.resolve(false)
119836
+ }, `proxy:${selection?.id}`),
118390
119837
  isOpenApi && task != null && "executor" in task && /* @__PURE__ */ jsx(OpenApiSection, {
118391
119838
  task,
118392
119839
  credentials: (onInvalidChange) => selection?.kind === "task" && task.inputs.filter((port) => "handle" in port && port.handle.startsWith("auth.")).map((definition) => {
@@ -118435,7 +119882,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118435
119882
  task: value
118436
119883
  }) ?? Promise.resolve(false)
118437
119884
  }, `openapi:${selection?.id}`),
118438
- !isHttpRequest && !unconfiguredOpenApi && !unconfiguredWorkflow && (selection?.kind === "outputs" || selection?.kind === "approval" || selection?.kind === "wait" || selection?.kind === "task") && (() => {
119885
+ !isHttpRequest && proxy == null && !unconfiguredOpenApi && !unconfiguredWorkflow && (selection?.kind === "outputs" || selection?.kind === "approval" || selection?.kind === "wait" || selection?.kind === "task") && (() => {
118439
119886
  const definitions = selection.kind === "outputs" ? [...selection.node.outputDefs] : selection.kind === "task" ? [...selection.definition?.inputs ?? []] : [...selection.node.inputDefinitions];
118440
119887
  const handles = new Set(definitions.flatMap((definition) => "handle" in definition ? [definition.handle] : []));
118441
119888
  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({
@@ -118600,7 +120047,7 @@ function NodeInspector({ onAddWorkflowOutputs, onAddResponseNode, webhookDeploym
118600
120047
  readOnly,
118601
120048
  groups: true,
118602
120049
  layout: "ports",
118603
- title: t(isHttpRequest ? "httpRequest.responseOutputs" : "inspector.ports.outputsTitle"),
120050
+ title: t(isHttpRequest || proxy != null ? "httpRequest.responseOutputs" : "inspector.ports.outputsTitle"),
118604
120051
  output: true,
118605
120052
  values: presentDecisionOutputs(selection.definition, t),
118606
120053
  disabled: disabled || !("moduleId" in selection.node.task || isAgent),
@@ -118777,13 +120224,32 @@ function WorkbenchInspectorToggle({ label, open, disabled = false, onToggle }) {
118777
120224
  function RevisionCanvas({ draft, presentation, theme, interactiveMode$, defaultInteractiveMode, defaultDirection, defaultMiniMapExpanded, defaultInspectorOpen = false, defaultSelectedNodeIds, nodesDraggable = true, layoutMotion, label, background = "striped", showHeader = true }) {
118778
120225
  const root = useRef(null);
118779
120226
  const t = useTranslate();
118780
- const language = useLang();
120227
+ const language = resolveUiLanguage([useLang()]);
118781
120228
  const revision = useMemo(() => revisionView(draft), [draft]);
118782
120229
  const graphId = "flow";
118783
120230
  const [sessions, setSessions] = useState({});
118784
120231
  const [inspectorOpen, setInspectorOpen] = useState(defaultInspectorOpen);
118785
120232
  const [focus, setFocus] = useState();
118786
120233
  const [catalog, setCatalog] = useState();
120234
+ const [triggerCopy, setTriggerCopy] = useState();
120235
+ useEffect(() => {
120236
+ const definitions = Object.values(revision.graph().nodes).flatMap((node) => node.kind == "integration" || node.kind == "poll" ? [node.definition] : []);
120237
+ if (definitions.length === 0) return;
120238
+ let active = true;
120239
+ Promise.all(definitions.map(async (definition) => [definition.key, await localizeTrigger(definition, language)])).then((entries) => {
120240
+ if (active) setTriggerCopy({
120241
+ revision,
120242
+ language,
120243
+ display: Object.fromEntries(entries)
120244
+ });
120245
+ }, (error) => {
120246
+ if (active) console.warn("Could not load Preview Trigger translations.", error);
120247
+ });
120248
+ return () => {
120249
+ active = false;
120250
+ };
120251
+ }, [revision, language]);
120252
+ const triggerDisplays = triggerCopy?.revision === revision && triggerCopy.language === language ? triggerCopy.display : void 0;
118787
120253
  const needsProviders = revision.connectorProviderIds.size > 0;
118788
120254
  useEffect(() => {
118789
120255
  if (!needsProviders) return;
@@ -118931,7 +120397,8 @@ function RevisionCanvas({ draft, presentation, theme, interactiveMode$, defaultI
118931
120397
  revision,
118932
120398
  selection,
118933
120399
  theme,
118934
- connectorProviders: providerMetadata
120400
+ connectorProviders: providerMetadata,
120401
+ triggerDisplays
118935
120402
  }, `${graphId}:${selection.id}`) : comment?.kind === "comment" ? /* @__PURE__ */ jsx(CommentInspector, {
118936
120403
  title: comment.title,
118937
120404
  content: comment.content ?? "",