@burdenoff/fluidgrids-fe-sdk 2026.1110.13 → 2026.1110.15

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 (45) hide show
  1. package/dist/{ExecutionDetailPage-3YFDDGKR.js → ExecutionDetailPage-4SROTSE6.js} +11 -11
  2. package/dist/{ExecutionsListPage-LQSTH2ZI.js → ExecutionsListPage-USYSLLK4.js} +8 -8
  3. package/dist/{WorkflowBuilder-IZR6F7N5.js → WorkflowBuilder-QVYJN4AV.js} +13 -13
  4. package/dist/{WorkflowsList-FA724ZVU.js → WorkflowsList-AAKPG2NB.js} +6 -6
  5. package/dist/{agentTools-ISAX2OP5.js → agentTools-D4CEXWE3.js} +2 -2
  6. package/dist/{chunk-KGZITAPA.js → chunk-2LJ5WON7.js} +5 -5
  7. package/dist/{chunk-EZGWG3YM.js → chunk-2TWTJOSU.js} +5 -5
  8. package/dist/{chunk-AL5QPU3W.js → chunk-3U6OJEBR.js} +2 -1
  9. package/dist/{chunk-HNH44BKA.js → chunk-ATK6IFZK.js} +4 -4
  10. package/dist/{chunk-CPUE7IAT.js → chunk-C6EMUPJL.js} +13 -13
  11. package/dist/{chunk-EM7LYTJI.js → chunk-E4JQIZYG.js} +10 -10
  12. package/dist/{chunk-UX5AWA4A.js → chunk-EXFTLY2C.js} +1 -1
  13. package/dist/{chunk-DJ6VN3MP.js → chunk-G3HMT2LN.js} +1 -1
  14. package/dist/{chunk-3DSR3JJL.js → chunk-G63OVVBC.js} +2 -2
  15. package/dist/{chunk-GNIJYZNL.js → chunk-GRGP5GS4.js} +2 -2
  16. package/dist/{chunk-45WET2TV.js → chunk-I77X7UAX.js} +5 -5
  17. package/dist/{chunk-UIOHTUZ7.js → chunk-JIQH4SXO.js} +4 -4
  18. package/dist/{chunk-D3V64LEJ.js → chunk-KWIQPBBA.js} +2 -2
  19. package/dist/{chunk-ZH7OMUYF.js → chunk-KX5UY3C3.js} +1 -1
  20. package/dist/{chunk-N76SCK7E.js → chunk-LBHHK2H2.js} +2 -2
  21. package/dist/{chunk-WX2WZWI5.js → chunk-M2Y3ZXOC.js} +442 -45
  22. package/dist/{chunk-SG4FNU7J.js → chunk-MCVL4CUP.js} +1 -1
  23. package/dist/{chunk-AE5EH6QC.js → chunk-ME2CQ2WC.js} +6 -6
  24. package/dist/{chunk-3MIYNJAX.js → chunk-OJCKL6ZE.js} +2 -2
  25. package/dist/{chunk-KIEJZVOI.js → chunk-PKXJROMZ.js} +2 -2
  26. package/dist/{chunk-HLBO6PI4.js → chunk-QNDTRESJ.js} +1 -1
  27. package/dist/{chunk-FVT3K4GZ.js → chunk-SHZYPTJU.js} +2 -2
  28. package/dist/{chunk-NXM2E7IB.js → chunk-UK2IGA6G.js} +3 -3
  29. package/dist/{chunk-BVIGBIYD.js → chunk-WHIC7LJR.js} +1 -1
  30. package/dist/{chunk-2SZX5K7F.js → chunk-XIHZXZJM.js} +2 -2
  31. package/dist/{chunk-CA7YZ2JN.js → chunk-YCGYKLUM.js} +5 -5
  32. package/dist/{chunk-Y5V7HQSA.js → chunk-YZNLW23N.js} +2 -2
  33. package/dist/executions.js +12 -12
  34. package/dist/history.js +5 -5
  35. package/dist/index.d.ts +40 -1
  36. package/dist/index.js +42 -42
  37. package/dist/{node-detail-view-7NY2H7RT.js → node-detail-view-KQ2PLIAA.js} +6 -6
  38. package/dist/nodes.js +2 -2
  39. package/dist/observability.js +5 -5
  40. package/dist/{quick-config-panel-JSQ2QSTJ.js → quick-config-panel-N7VR2V2X.js} +6 -6
  41. package/dist/settings.js +6 -6
  42. package/dist/templates.js +13 -13
  43. package/dist/workflow-builder.js +14 -14
  44. package/dist/workflows-list.js +6 -6
  45. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { TabButton, ReadOnlyFieldset, NodeSettingsPanel, NodeParamsForm, SchedulePanel, SCHEDULE_NODE_TYPE } from './chunk-WX2WZWI5.js';
1
+ import { TabButton, ReadOnlyFieldset, NodeSettingsPanel, NodeParamsForm, SchedulePanel, SCHEDULE_NODE_TYPE } from './chunk-M2Y3ZXOC.js';
2
2
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
3
- import { nodeTitle, FieldTree, usePhaseCFlags } from './chunk-GNIJYZNL.js';
3
+ import { nodeTitle, FieldTree, usePhaseCFlags } from './chunk-GRGP5GS4.js';
4
4
  import { useFlowStore } from './chunk-ATTUQMTG.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
6
6
  import { Icon } from '@iconify/react';
@@ -1,13 +1,13 @@
1
1
  import { CodeEditorField, normalizeCodeLanguage } from './chunk-KZCNJAMK.js';
2
2
  import { readAssertRulesSetting, rowsFromRules, normaliseAssertRules, ruleFromRow, describeAssertRuleProblem, operatorSpec, ASSERT_OPERATORS, emptyAssertRuleRow } from './chunk-JDLQ6QIB.js';
3
- import { AgentDefinitionSelectField, ConnectionSelector } from './chunk-2SZX5K7F.js';
4
- import { useResource, describeSchedule, NativeSelect, StatusPill, FieldError, isAgentNodeType, triggerSchedule, pauseSchedule, unpauseSchedule, backfillSchedule } from './chunk-BVIGBIYD.js';
5
- import { FluidGridsContext, isParamVisible, missingRequiredParameters, boundFieldsOf, asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, structuredParameterType, isStringOptionList, optionText, coerceNumber, nodeTitle, useRunGuard, paramsFromOperation, formatParameterValue, parseParameterValue, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText, useFluidGridsAnalytics, openRunQuotaUpgradePrompt } from './chunk-GNIJYZNL.js';
3
+ import { AgentDefinitionSelectField, ConnectionSelector } from './chunk-XIHZXZJM.js';
4
+ import { useResource, describeSchedule, NativeSelect, StatusPill, FieldError, isAgentNodeType, triggerSchedule, pauseSchedule, unpauseSchedule, backfillSchedule } from './chunk-WHIC7LJR.js';
5
+ import { FluidGridsContext, isParamVisible, missingRequiredParameters, boundFieldsOf, asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, structuredParameterType, isStringOptionList, optionText, coerceNumber, nodeTitle, useRunGuard, paramsFromOperation, formatParameterValue, parseParameterValue, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText, useFluidGridsAnalytics, openRunQuotaUpgradePrompt, collectExtensions } from './chunk-GRGP5GS4.js';
6
6
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
7
7
  import { useFlowStore } from './chunk-ATTUQMTG.js';
8
8
  import { getGlobalStoreClient } from './chunk-TYI2XOSI.js';
9
9
  import { cn } from './chunk-JL7CASN5.js';
10
- import { useRunFromNodeEligibilityQuery, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument } from './chunk-AL5QPU3W.js';
10
+ import { useRunFromNodeEligibilityQuery, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument, WorkflowCallInputsDocument } from './chunk-3U6OJEBR.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
12
12
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-PDODDDHY.js';
13
13
  import { throwIfResultError, describeOperationError } from './chunk-JKLZ6YZ3.js';
@@ -1205,6 +1205,254 @@ function WorkflowPickerField({
1205
1205
  )
1206
1206
  ] });
1207
1207
  }
1208
+
1209
+ // src/builder/lib/subworkflow-input-mapping.ts
1210
+ function isPlainObject(value) {
1211
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1212
+ }
1213
+ function readInputMapping(raw) {
1214
+ if (raw === void 0 || raw === null) return { kind: "none", entries: {} };
1215
+ if (isPlainObject(raw)) return { kind: "object", entries: raw };
1216
+ if (typeof raw !== "string") return { kind: "unreadable", entries: {} };
1217
+ if (raw.trim() === "") return { kind: "none", entries: {} };
1218
+ try {
1219
+ const parsed2 = JSON.parse(raw);
1220
+ return isPlainObject(parsed2) ? { kind: "json", entries: parsed2 } : { kind: "unreadable", entries: {} };
1221
+ } catch {
1222
+ return { kind: "unreadable", entries: {} };
1223
+ }
1224
+ }
1225
+ function inputMappingExpression(mapping, name) {
1226
+ if (!Object.hasOwn(mapping.entries, name)) return "";
1227
+ const value = mapping.entries[name];
1228
+ if (typeof value === "string") return value;
1229
+ if (value === void 0) return "";
1230
+ return JSON.stringify(value);
1231
+ }
1232
+ function writeInputMappingExpression(raw, name, expression) {
1233
+ const mapping = readInputMapping(raw);
1234
+ if (mapping.kind === "unreadable") return raw;
1235
+ const next = { ...mapping.entries };
1236
+ if (expression.trim() === "") delete next[name];
1237
+ else next[name] = expression;
1238
+ if (Object.keys(next).length === 0) return void 0;
1239
+ return mapping.kind === "object" ? next : JSON.stringify(next, null, 2);
1240
+ }
1241
+ var IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
1242
+ function inputMappingPlaceholder(name) {
1243
+ return IDENTIFIER.test(name) ? `output.${name}` : `output[${JSON.stringify(name)}]`;
1244
+ }
1245
+ function callInputsVersion(version) {
1246
+ if (typeof version === "number")
1247
+ return Number.isFinite(version) ? String(version) : void 0;
1248
+ if (typeof version === "string" && version.trim() !== "") return version;
1249
+ return void 0;
1250
+ }
1251
+ var WORKFLOW_CALL_INPUTS_DEBOUNCE_MS = 300;
1252
+ var IDLE = { status: "idle" };
1253
+ var LOADING = { status: "loading" };
1254
+ var ERROR = { status: "error" };
1255
+ async function requestWorkflowCallInputs(client, workflowKey, version) {
1256
+ const result = await client.query({
1257
+ query: WorkflowCallInputsDocument,
1258
+ variables: version === void 0 ? { workflowKey } : { workflowKey, version },
1259
+ // A called workflow can be edited in another tab; always ask for its current inputs.
1260
+ fetchPolicy: "network-only"
1261
+ });
1262
+ const inputs = result.data?.workflowCallInputs;
1263
+ if (!inputs) throw new Error("workflowCallInputs returned no data");
1264
+ return inputs;
1265
+ }
1266
+ function requestKeyOf(workflowKey, version) {
1267
+ return JSON.stringify([workflowKey, version ?? null]);
1268
+ }
1269
+ function useWorkflowCallInputs(workflowKey, version) {
1270
+ const context = useContext(FluidGridsContext);
1271
+ const client = context?.workspaceClient ?? getFluidGridsClientSafe();
1272
+ const [answer, setAnswer] = useState(null);
1273
+ const hasKey = workflowKey.trim() !== "";
1274
+ useEffect(() => {
1275
+ if (!hasKey || !client) return;
1276
+ const requestKey = requestKeyOf(workflowKey, version);
1277
+ let active = true;
1278
+ const timer = setTimeout(() => {
1279
+ requestWorkflowCallInputs(client, workflowKey, version).then(
1280
+ (inputs) => {
1281
+ if (!active) return;
1282
+ setAnswer({ requestKey, state: { status: "ready", inputs } });
1283
+ },
1284
+ () => {
1285
+ if (!active) return;
1286
+ setAnswer({ requestKey, state: ERROR });
1287
+ }
1288
+ );
1289
+ }, WORKFLOW_CALL_INPUTS_DEBOUNCE_MS);
1290
+ return () => {
1291
+ active = false;
1292
+ clearTimeout(timer);
1293
+ };
1294
+ }, [client, hasKey, workflowKey, version]);
1295
+ if (!hasKey) return IDLE;
1296
+ if (!client) return ERROR;
1297
+ return answer?.requestKey === requestKeyOf(workflowKey, version) ? answer.state : LOADING;
1298
+ }
1299
+ var SECTION_LABEL3 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1300
+ var HINT = "text-xs text-muted-foreground";
1301
+ function SubworkflowInputsSection({
1302
+ workflowKey,
1303
+ version,
1304
+ inputMapping,
1305
+ onChange,
1306
+ testIdPrefix
1307
+ }) {
1308
+ const tr = useTr();
1309
+ const titleId = useId();
1310
+ const state = useWorkflowCallInputs(workflowKey, callInputsVersion(version));
1311
+ if (state.status === "idle") return null;
1312
+ const testId = `${testIdPrefix}-workflow-inputs`;
1313
+ return /* @__PURE__ */ jsxs(
1314
+ "section",
1315
+ {
1316
+ "aria-labelledby": titleId,
1317
+ "data-testid": testId,
1318
+ className: "mt-1 flex flex-col gap-2 rounded-md border border-border bg-muted/20 p-2.5",
1319
+ children: [
1320
+ /* @__PURE__ */ jsx("div", { id: titleId, className: SECTION_LABEL3, children: tr("fluidgrids.builder.workflowInputs.title", "Workflow inputs") }),
1321
+ state.status === "loading" && /* @__PURE__ */ jsx("p", { role: "status", className: HINT, "data-testid": `${testId}-loading`, children: tr("fluidgrids.builder.workflowPicker.loading", "Loading\u2026") }),
1322
+ state.status === "error" && /* @__PURE__ */ jsx("p", { className: HINT, "data-testid": `${testId}-error`, children: tr(
1323
+ "fluidgrids.builder.workflowInputs.loadFailed",
1324
+ "Could not load this workflow's inputs. You can still map them in Input Mapping."
1325
+ ) }),
1326
+ state.status === "ready" && /* @__PURE__ */ jsx(
1327
+ DeclaredInputs,
1328
+ {
1329
+ inputs: state.inputs,
1330
+ inputMapping,
1331
+ onChange,
1332
+ testId
1333
+ }
1334
+ )
1335
+ ]
1336
+ }
1337
+ );
1338
+ }
1339
+ function DeclaredInputs({
1340
+ inputs,
1341
+ inputMapping,
1342
+ onChange,
1343
+ testId
1344
+ }) {
1345
+ const tr = useTr();
1346
+ const mapping = readInputMapping(inputMapping);
1347
+ if (!inputs.hasCallTrigger) {
1348
+ return /* @__PURE__ */ jsx("p", { className: HINT, "data-testid": `${testId}-no-call-trigger`, children: tr(
1349
+ "fluidgrids.builder.workflowInputs.noCallTrigger",
1350
+ "This workflow does not start with an Execute Workflow Trigger, so it takes any data. Add one to it to declare its inputs."
1351
+ ) });
1352
+ }
1353
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1354
+ inputs.problem && /* @__PURE__ */ jsx(
1355
+ "p",
1356
+ {
1357
+ role: "status",
1358
+ "data-testid": `${testId}-problem`,
1359
+ className: "rounded-md border border-status-warning-border bg-status-warning-bg-subtle px-2.5 py-2 text-xs text-status-warning-text",
1360
+ children: tr(
1361
+ "fluidgrids.builder.workflowInputs.problem",
1362
+ "This workflow's inputs cannot be read: {{problem}}",
1363
+ { problem: inputs.problem }
1364
+ )
1365
+ }
1366
+ ),
1367
+ !inputs.problem && inputs.fields.length === 0 && /* @__PURE__ */ jsx("p", { className: HINT, "data-testid": `${testId}-any-data`, children: tr(
1368
+ "fluidgrids.builder.workflowInputs.anyData",
1369
+ "This workflow accepts any data"
1370
+ ) }),
1371
+ inputs.fields.length > 0 && mapping.kind === "unreadable" && /* @__PURE__ */ jsx("p", { className: HINT, "data-testid": `${testId}-mapping-unreadable`, children: tr(
1372
+ "fluidgrids.builder.workflowInputs.mappingUnreadable",
1373
+ "Input Mapping is not a JSON object. Fix it there to map these inputs here."
1374
+ ) }),
1375
+ inputs.fields.map((field) => /* @__PURE__ */ jsx(
1376
+ InputField,
1377
+ {
1378
+ field,
1379
+ mapping,
1380
+ inputMapping,
1381
+ onChange,
1382
+ testId: `${testId}-field-${field.name}`
1383
+ },
1384
+ field.name
1385
+ ))
1386
+ ] });
1387
+ }
1388
+ function InputField({
1389
+ field,
1390
+ mapping,
1391
+ inputMapping,
1392
+ onChange,
1393
+ testId
1394
+ }) {
1395
+ const tr = useTr();
1396
+ const inputId = useId();
1397
+ const builderReadOnly = useBuilderReadOnly();
1398
+ const mapped = Object.keys(mapping.entries).length > 0;
1399
+ const missing = field.required && mapped && !Object.hasOwn(mapping.entries, field.name);
1400
+ const readOnly = builderReadOnly || mapping.kind === "unreadable";
1401
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
1402
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
1403
+ /* @__PURE__ */ jsx(
1404
+ "label",
1405
+ {
1406
+ htmlFor: inputId,
1407
+ className: "truncate font-mono text-xs font-medium text-foreground",
1408
+ children: field.name
1409
+ }
1410
+ ),
1411
+ field.required && /* @__PURE__ */ jsx("span", { className: "text-destructive", children: "*" }),
1412
+ missing && /* @__PURE__ */ jsx(
1413
+ "span",
1414
+ {
1415
+ role: "status",
1416
+ "data-testid": `${testId}-missing`,
1417
+ className: "rounded border border-status-warning-border bg-status-warning-bg-subtle px-1 text-[10px] font-medium text-status-warning-text",
1418
+ children: tr(
1419
+ "fluidgrids.builder.requiredParameters.fieldMissing",
1420
+ "Required to run"
1421
+ )
1422
+ }
1423
+ ),
1424
+ /* @__PURE__ */ jsx(
1425
+ "span",
1426
+ {
1427
+ "data-testid": `${testId}-type`,
1428
+ className: "ml-auto rounded border border-border px-1 text-[10px] uppercase tracking-wide text-muted-foreground",
1429
+ children: field.type
1430
+ }
1431
+ )
1432
+ ] }),
1433
+ /* @__PURE__ */ jsx(
1434
+ "input",
1435
+ {
1436
+ id: inputId,
1437
+ type: "text",
1438
+ value: inputMappingExpression(mapping, field.name),
1439
+ placeholder: inputMappingPlaceholder(field.name),
1440
+ readOnly,
1441
+ spellCheck: false,
1442
+ autoComplete: "off",
1443
+ onChange: readOnly ? void 0 : (event) => onChange(
1444
+ writeInputMappingExpression(
1445
+ inputMapping,
1446
+ field.name,
1447
+ event.target.value
1448
+ )
1449
+ ),
1450
+ "data-testid": testId,
1451
+ className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 font-mono text-xs outline-none transition-colors read-only:opacity-60 focus:border-primary"
1452
+ }
1453
+ )
1454
+ ] });
1455
+ }
1208
1456
  var LOAD_NODE_OPTIONS = gql`
1209
1457
  query LoadNodeOptions(
1210
1458
  $nodeType: String!
@@ -1336,6 +1584,160 @@ function useLoadNodeOptions(nodeType, nodeVersion, spec, connectionId) {
1336
1584
  }
1337
1585
  };
1338
1586
  }
1587
+
1588
+ // src/hooks/load-node-options-error.ts
1589
+ var KIND_BY_FAILURE = {
1590
+ CONNECTION_UNAVAILABLE: "connection",
1591
+ CREDENTIALS_REJECTED: "credentials",
1592
+ PROVIDER_ERROR: "provider"
1593
+ };
1594
+ var KIND_BY_I18N_KEY = {
1595
+ "node.errors.connectionResolutionFailed": "connection",
1596
+ "node.errors.loadOptionsCredentialsRejected": "credentials",
1597
+ "node.errors.loadOptionsProviderFailed": "provider"
1598
+ };
1599
+ var PROVIDER_CODE = /^[a-z][a-z0-9_.-]{1,63}$/i;
1600
+ function kindOf(extensions) {
1601
+ const { failure, i18nKey } = extensions;
1602
+ if (typeof failure === "string" && failure in KIND_BY_FAILURE) {
1603
+ return KIND_BY_FAILURE[failure] ?? null;
1604
+ }
1605
+ if (typeof i18nKey === "string" && i18nKey in KIND_BY_I18N_KEY) {
1606
+ return KIND_BY_I18N_KEY[i18nKey] ?? null;
1607
+ }
1608
+ return null;
1609
+ }
1610
+ function loadOptionsErrorInfo(error) {
1611
+ for (const extensions of collectExtensions(error)) {
1612
+ const kind = kindOf(extensions);
1613
+ if (!kind) continue;
1614
+ const code = extensions.providerCode;
1615
+ return {
1616
+ kind,
1617
+ providerCode: typeof code === "string" && PROVIDER_CODE.test(code) ? code : null
1618
+ };
1619
+ }
1620
+ return { kind: "unavailable", providerCode: null };
1621
+ }
1622
+ function errorMessage(tr, kind) {
1623
+ switch (kind) {
1624
+ case "connection":
1625
+ return tr(
1626
+ "fluidgrids.builder.nodeParamsForm.loadOptionsConnectionError",
1627
+ "This connection can't be used. It may have expired, been revoked or not be shared with you. Reconnect it, choose another connection, or enter a value."
1628
+ );
1629
+ case "credentials":
1630
+ return tr(
1631
+ "fluidgrids.builder.nodeParamsForm.loadOptionsCredentialsError",
1632
+ "The provider rejected this connection. Reconnect it, choose another connection, or enter a value."
1633
+ );
1634
+ case "provider":
1635
+ return tr(
1636
+ "fluidgrids.builder.nodeParamsForm.loadOptionsProviderError",
1637
+ "The provider returned an error while loading options. Try again, or enter a value."
1638
+ );
1639
+ case "unavailable":
1640
+ return tr(
1641
+ "fluidgrids.builder.nodeParamsForm.loadOptionsError",
1642
+ "Couldn't load options \u2014 enter a value manually."
1643
+ );
1644
+ }
1645
+ }
1646
+ function partTestId(testId, part) {
1647
+ return testId ? `${testId}-${part}` : void 0;
1648
+ }
1649
+ function LoadOptionsError({
1650
+ error,
1651
+ onRetry,
1652
+ testId
1653
+ }) {
1654
+ const tr = useTr();
1655
+ const { kind, providerCode } = loadOptionsErrorInfo(error);
1656
+ return /* @__PURE__ */ jsxs(
1657
+ "span",
1658
+ {
1659
+ role: "alert",
1660
+ "data-testid": partTestId(testId, "error"),
1661
+ "data-kind": kind,
1662
+ className: "flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] text-destructive",
1663
+ children: [
1664
+ /* @__PURE__ */ jsxs("span", { children: [
1665
+ errorMessage(tr, kind),
1666
+ providerCode ? ` (${providerCode})` : null
1667
+ ] }),
1668
+ /* @__PURE__ */ jsx(
1669
+ "button",
1670
+ {
1671
+ type: "button",
1672
+ onClick: onRetry,
1673
+ "data-testid": partTestId(testId, "retry"),
1674
+ className: "w-fit text-xs text-foreground underline",
1675
+ children: tr("fluidgrids.builder.nodeParamsForm.loadOptionsRetry", "Try again")
1676
+ }
1677
+ )
1678
+ ]
1679
+ }
1680
+ );
1681
+ }
1682
+ function LoadOptionsStatus({
1683
+ connected,
1684
+ missingParameters,
1685
+ error,
1686
+ empty,
1687
+ manual,
1688
+ onToggleManual,
1689
+ onRetry,
1690
+ testId
1691
+ }) {
1692
+ const tr = useTr();
1693
+ if (!connected) {
1694
+ return /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground", children: tr(
1695
+ "fluidgrids.builder.nodeParamsForm.loadOptionsNoConnection",
1696
+ "Connect an account above to load options, or type a value"
1697
+ ) });
1698
+ }
1699
+ if (missingParameters.length > 0) {
1700
+ return /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
1701
+ tr(
1702
+ "fluidgrids.builder.nodeParamsForm.loadOptionsMissingParameters",
1703
+ "Set fixed values for these parameters to load options:"
1704
+ ),
1705
+ " ",
1706
+ missingParameters.join(", ")
1707
+ ] });
1708
+ }
1709
+ if (error) {
1710
+ return /* @__PURE__ */ jsx(LoadOptionsError, { error, onRetry, testId });
1711
+ }
1712
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1713
+ empty && /* @__PURE__ */ jsx(
1714
+ "span",
1715
+ {
1716
+ "data-testid": partTestId(testId, "empty"),
1717
+ className: "text-[11px] text-muted-foreground",
1718
+ children: tr(
1719
+ "fluidgrids.builder.nodeParamsForm.loadOptionsEmpty",
1720
+ "No options found for this connection."
1721
+ )
1722
+ }
1723
+ ),
1724
+ /* @__PURE__ */ jsx(
1725
+ "button",
1726
+ {
1727
+ type: "button",
1728
+ onClick: onToggleManual,
1729
+ className: "w-fit text-xs underline",
1730
+ children: manual ? tr(
1731
+ "fluidgrids.builder.nodeParamsForm.loadOptionsChoose",
1732
+ "Choose from list"
1733
+ ) : tr(
1734
+ "fluidgrids.builder.nodeParamsForm.loadOptionsManual",
1735
+ "Enter IDs manually"
1736
+ )
1737
+ }
1738
+ )
1739
+ ] });
1740
+ }
1339
1741
  var EMPTY_VALUES = {};
1340
1742
  var EMPTY_PARAMETERS = [];
1341
1743
  function OptionListInput({
@@ -1415,7 +1817,7 @@ function NodeLoadOptionsSelect({
1415
1817
  ),
1416
1818
  [spec, parameterValues, parameterDefaults, unavailableParameters]
1417
1819
  );
1418
- const { options, loading, error } = useLoadNodeOptions(
1820
+ const { options, loading, error, refetch } = useLoadNodeOptions(
1419
1821
  nodeType,
1420
1822
  nodeVersion,
1421
1823
  resolved.spec,
@@ -1504,32 +1906,17 @@ function NodeLoadOptionsSelect({
1504
1906
  )
1505
1907
  ] })
1506
1908
  ] }),
1507
- !connectionId ? /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground", children: tr(
1508
- "fluidgrids.builder.nodeParamsForm.loadOptionsNoConnection",
1509
- "Connect an account above to load options, or type a value"
1510
- ) }) : waiting ? /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
1511
- tr(
1512
- "fluidgrids.builder.nodeParamsForm.loadOptionsMissingParameters",
1513
- "Set fixed values for these parameters to load options:"
1514
- ),
1515
- " ",
1516
- resolved.missingParameters.join(", ")
1517
- ] }) : error ? /* @__PURE__ */ jsx("span", { className: "text-[11px] text-destructive", children: tr(
1518
- "fluidgrids.builder.nodeParamsForm.loadOptionsError",
1519
- "Couldn't load options \u2014 enter a value manually."
1520
- ) }) : /* @__PURE__ */ jsx(
1521
- "button",
1909
+ /* @__PURE__ */ jsx(
1910
+ LoadOptionsStatus,
1522
1911
  {
1523
- type: "button",
1524
- onClick: () => setManual((current) => !current),
1525
- className: "w-fit text-xs underline",
1526
- children: manual ? tr(
1527
- "fluidgrids.builder.nodeParamsForm.loadOptionsChoose",
1528
- "Choose from list"
1529
- ) : tr(
1530
- "fluidgrids.builder.nodeParamsForm.loadOptionsManual",
1531
- "Enter IDs manually"
1532
- )
1912
+ connected: Boolean(connectionId),
1913
+ missingParameters: resolved.missingParameters,
1914
+ error,
1915
+ empty: !useManual && !loading && options.length === 0,
1916
+ manual,
1917
+ onToggleManual: () => setManual((current) => !current),
1918
+ onRetry: refetch,
1919
+ testId
1533
1920
  }
1534
1921
  )
1535
1922
  ] });
@@ -3547,7 +3934,7 @@ function ScheduleNextRuns({
3547
3934
  }
3548
3935
  var SCHEDULE_PREVIEW_COUNT = 5;
3549
3936
  var DEBOUNCE_MS = 400;
3550
- var IDLE = {
3937
+ var IDLE2 = {
3551
3938
  runs: [],
3552
3939
  loading: false,
3553
3940
  error: null,
@@ -3598,14 +3985,14 @@ async function requestSchedulePreview(client, variables) {
3598
3985
  );
3599
3986
  }
3600
3987
  function useSchedulePreview(rules, timezone, workflowKey, nodeId) {
3601
- const [state, setState] = useState(IDLE);
3988
+ const [state, setState] = useState(IDLE2);
3602
3989
  const context = useContext(FluidGridsContext);
3603
3990
  const client = context?.workspaceClient ?? getFluidGridsClientSafe();
3604
3991
  const requestKey = JSON.stringify([rules, timezone, workflowKey, nodeId]);
3605
3992
  const latest = useRef(0);
3606
3993
  useEffect(() => {
3607
3994
  if (!nodeId || !client) {
3608
- setState(IDLE);
3995
+ setState(IDLE2);
3609
3996
  return;
3610
3997
  }
3611
3998
  const variables = schedulePreviewVariables(
@@ -3615,7 +4002,7 @@ function useSchedulePreview(rules, timezone, workflowKey, nodeId) {
3615
4002
  nodeId
3616
4003
  );
3617
4004
  if (variables.length === 0) {
3618
- setState(IDLE);
4005
+ setState(IDLE2);
3619
4006
  return;
3620
4007
  }
3621
4008
  const ticket = ++latest.current;
@@ -5267,7 +5654,7 @@ function ChannelLinkAction({
5267
5654
  ) })
5268
5655
  ] });
5269
5656
  }
5270
- var SECTION_LABEL3 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
5657
+ var SECTION_LABEL4 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
5271
5658
  function NodeParamsForm({
5272
5659
  config,
5273
5660
  nodeType,
@@ -5391,12 +5778,12 @@ function NodeParamsForm({
5391
5778
  {
5392
5779
  value: typeof argsState.agentDefinitionId === "string" ? argsState.agentDefinitionId : null,
5393
5780
  onChange: (next) => writeFixed("agentDefinitionId", next),
5394
- sectionLabelClassName: SECTION_LABEL3,
5781
+ sectionLabelClassName: SECTION_LABEL4,
5395
5782
  testIdPrefix
5396
5783
  }
5397
5784
  ),
5398
5785
  connectionAdapters.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-2", "data-testid": `${testIdPrefix}-connections`, children: [
5399
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL3, children: tr(
5786
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr(
5400
5787
  "fluidgrids.builder.nodeParamsForm.connectionsSection",
5401
5788
  "Connections"
5402
5789
  ) }),
@@ -5561,7 +5948,17 @@ function NodeParamsForm({
5561
5948
  testId: `${testIdPrefix}-workflow-picker`
5562
5949
  }
5563
5950
  ),
5564
- p.description && /* @__PURE__ */ jsx("span", { className: "text-[11px] leading-snug text-muted-foreground", children: p.description })
5951
+ p.description && /* @__PURE__ */ jsx("span", { className: "text-[11px] leading-snug text-muted-foreground", children: p.description }),
5952
+ nodeType === "internal:subworkflow" && /* @__PURE__ */ jsx(
5953
+ SubworkflowInputsSection,
5954
+ {
5955
+ workflowKey: typeof argsState[p.name] === "string" ? argsState[p.name] : "",
5956
+ version: argsState.version,
5957
+ inputMapping: argsState.inputMapping,
5958
+ onChange: (next) => writeFixed("inputMapping", next),
5959
+ testIdPrefix
5960
+ }
5961
+ )
5565
5962
  ] }, p.name);
5566
5963
  }
5567
5964
  const mode = modeByField[p.name] ?? (mapping[p.name] !== void 0 ? "expression" : "fixed");
@@ -6199,7 +6596,7 @@ function RunOnSection({
6199
6596
  ) })
6200
6597
  ] });
6201
6598
  }
6202
- var SECTION_LABEL4 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
6599
+ var SECTION_LABEL5 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
6203
6600
  var inputCx = "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm outline-none transition-colors focus:border-primary disabled:opacity-50";
6204
6601
  function msToSeconds(ms, fallbackMs) {
6205
6602
  return Math.round((ms ?? fallbackMs) / 1e3 * 10) / 10;
@@ -6235,11 +6632,11 @@ function NodeSettingsPanel({
6235
6632
  {
6236
6633
  value: runOn,
6237
6634
  onChange: (next) => writeExecutionSettings({ runOn: next }),
6238
- sectionLabelClassName: SECTION_LABEL4
6635
+ sectionLabelClassName: SECTION_LABEL5
6239
6636
  }
6240
6637
  ),
6241
6638
  /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
6242
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr("fluidgrids.builder.nodeSettings.retrySection", "Retry on Fail") }),
6639
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL5, children: tr("fluidgrids.builder.nodeSettings.retrySection", "Retry on Fail") }),
6243
6640
  /* @__PURE__ */ jsxs("label", { className: "flex w-fit cursor-pointer items-center gap-2 text-sm", children: [
6244
6641
  /* @__PURE__ */ jsx(
6245
6642
  "input",
@@ -6386,7 +6783,7 @@ function NodeSettingsPanel({
6386
6783
  ] })
6387
6784
  ] }),
6388
6785
  /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
6389
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr("fluidgrids.builder.nodeSettings.onErrorSection", "On Error") }),
6786
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL5, children: tr("fluidgrids.builder.nodeSettings.onErrorSection", "On Error") }),
6390
6787
  /* @__PURE__ */ jsxs(
6391
6788
  "select",
6392
6789
  {
@@ -6442,7 +6839,7 @@ function NodeSettingsPanel({
6442
6839
  ) })
6443
6840
  ] }),
6444
6841
  /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
6445
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr("fluidgrids.builder.nodeSettings.timeoutSection", "Timeout") }),
6842
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL5, children: tr("fluidgrids.builder.nodeSettings.timeoutSection", "Timeout") }),
6446
6843
  /* @__PURE__ */ jsxs("label", { className: "flex w-fit cursor-pointer items-center gap-2 text-sm", children: [
6447
6844
  /* @__PURE__ */ jsx(
6448
6845
  "input",
@@ -6559,7 +6956,7 @@ function NodeSettingsPanel({
6559
6956
  ] })
6560
6957
  ] }),
6561
6958
  /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
6562
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr("fluidgrids.builder.nodeSettings.otherSection", "Other") }),
6959
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL5, children: tr("fluidgrids.builder.nodeSettings.otherSection", "Other") }),
6563
6960
  /* @__PURE__ */ jsxs("label", { className: "flex w-fit cursor-pointer items-center gap-2 text-sm", children: [
6564
6961
  /* @__PURE__ */ jsx(
6565
6962
  "input",
@@ -6594,7 +6991,7 @@ function NodeSettingsPanel({
6594
6991
  ] })
6595
6992
  ] }),
6596
6993
  /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
6597
- /* @__PURE__ */ jsx("div", { className: SECTION_LABEL4, children: tr("fluidgrids.builder.nodeSettings.notesSection", "Notes") }),
6994
+ /* @__PURE__ */ jsx("div", { className: SECTION_LABEL5, children: tr("fluidgrids.builder.nodeSettings.notesSection", "Notes") }),
6598
6995
  /* @__PURE__ */ jsx(
6599
6996
  "textarea",
6600
6997
  {
@@ -1,5 +1,5 @@
1
1
  import { PublishCustomNodeAction } from './chunk-XRGAH6IQ.js';
2
- import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-AL5QPU3W.js';
2
+ import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-3U6OJEBR.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
5
  import { useMemo, useState, useCallback, useEffect } from 'react';
@@ -1,11 +1,11 @@
1
- import { useRunStatusCounts, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination, runStatusLabels } from './chunk-EZGWG3YM.js';
2
- import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, searchFilterConflicts, WORKFLOW_ID_MAX_LENGTH, EMPTY_SEARCH_FILTER, buildSearchAttributeFilter, MAX_SEARCH_CONDITIONS, OPERATORS_BY_TYPE } from './chunk-D3V64LEJ.js';
3
- import { useWorkflowDefinitions } from './chunk-3DSR3JJL.js';
4
- import { useResource, fetchSearchAttributes, NativeSelect, FieldError, RUN_CONTROL_DIALOG_STYLE, parseJsonInput, JsonField, fetchBatchOperations, StatusPill, fetchBatchOperation, cancelBatchOperation, startBatchTerminate, startBatchExport, startBatchOperation, jsonArg } from './chunk-BVIGBIYD.js';
1
+ import { useRunStatusCounts, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination, runStatusLabels } from './chunk-2TWTJOSU.js';
2
+ import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, searchFilterConflicts, WORKFLOW_ID_MAX_LENGTH, EMPTY_SEARCH_FILTER, buildSearchAttributeFilter, MAX_SEARCH_CONDITIONS, OPERATORS_BY_TYPE } from './chunk-KWIQPBBA.js';
3
+ import { useWorkflowDefinitions } from './chunk-G63OVVBC.js';
4
+ import { useResource, fetchSearchAttributes, NativeSelect, FieldError, RUN_CONTROL_DIALOG_STYLE, parseJsonInput, JsonField, fetchBatchOperations, StatusPill, fetchBatchOperation, cancelBatchOperation, startBatchTerminate, startBatchExport, startBatchOperation, jsonArg } from './chunk-WHIC7LJR.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
6
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
7
- import { useDurableParityEnabled, usePhaseCFlags } from './chunk-GNIJYZNL.js';
8
- import { WorkflowBatchOperationUpdatedDocument } from './chunk-AL5QPU3W.js';
7
+ import { useDurableParityEnabled, usePhaseCFlags } from './chunk-GRGP5GS4.js';
8
+ import { WorkflowBatchOperationUpdatedDocument } from './chunk-3U6OJEBR.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
11
11
  import { describeOperationError } from './chunk-JKLZ6YZ3.js';
@@ -1,6 +1,6 @@
1
- import { versionsOfWorkflow, VersionDiffDialog } from './chunk-ZH7OMUYF.js';
1
+ import { versionsOfWorkflow, VersionDiffDialog } from './chunk-KX5UY3C3.js';
2
2
  import { historyControls } from './chunk-FNZZ5JJL.js';
3
- import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-3DSR3JJL.js';
3
+ import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-G63OVVBC.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';