@burdenoff/fluidgrids-fe-sdk 2026.1021.9 → 2026.1021.10

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.
@@ -1,5 +1,5 @@
1
- export { ExecutionDetailPage } from './chunk-XOUL22OI.js';
2
- import './chunk-3SCUZ75C.js';
1
+ export { ExecutionDetailPage } from './chunk-QL7CDZ7B.js';
2
+ import './chunk-GU233T6U.js';
3
3
  import './chunk-QBFAJNUC.js';
4
4
  import './chunk-ONVGFVNH.js';
5
5
  import './chunk-JL7CASN5.js';
@@ -1,5 +1,5 @@
1
- export { ExecutionsListPage } from './chunk-OM24EQUG.js';
2
- import './chunk-3SCUZ75C.js';
1
+ export { ExecutionsListPage } from './chunk-YB6WGQTY.js';
2
+ import './chunk-GU233T6U.js';
3
3
  import './chunk-QBFAJNUC.js';
4
4
  import './chunk-O6E247J6.js';
5
5
  import './chunk-D3UWK7GY.js';
@@ -122,6 +122,14 @@ var NODE_STATUS_CONFIG = {
122
122
  borderColor: "border-red-200 dark:border-red-800",
123
123
  icon: "mdi:timer-off-outline"
124
124
  },
125
+ // A node parked by a Wait node, an external webhook/form resume, or a person (BOFF-7651).
126
+ WAITING: {
127
+ label: "Waiting",
128
+ color: "text-purple-600 dark:text-purple-400",
129
+ bgColor: "bg-purple-50 dark:bg-purple-900/20",
130
+ borderColor: "border-purple-200 dark:border-purple-800",
131
+ icon: "mdi:timer-sand"
132
+ },
125
133
  WAITING_SUBWORKFLOW: {
126
134
  label: "Waiting",
127
135
  color: "text-purple-600 dark:text-purple-400",
@@ -138,7 +146,7 @@ function ExecutionStatusBadge({
138
146
  animated = true
139
147
  }) {
140
148
  const tr = useTr();
141
- const config = RUN_STATUS_CONFIG[status];
149
+ const config = RUN_STATUS_CONFIG[status] ?? RUN_STATUS_CONFIG.PENDING;
142
150
  const labels = {
143
151
  PENDING: tr(
144
152
  "fluidgrids.executions.executionFilters.statusPending",
@@ -196,7 +204,7 @@ function ExecutionStatusBadge({
196
204
  className: animated && isRunning ? "animate-spin" : ""
197
205
  }
198
206
  ),
199
- showLabel && /* @__PURE__ */ jsx("span", { children: labels[status] })
207
+ showLabel && /* @__PURE__ */ jsx("span", { children: labels[status] ?? config.label })
200
208
  ]
201
209
  }
202
210
  );
@@ -208,7 +216,7 @@ function NodeStatusBadge({
208
216
  showLabel = true,
209
217
  animated = true
210
218
  }) {
211
- const config = NODE_STATUS_CONFIG[status];
219
+ const config = NODE_STATUS_CONFIG[status] ?? NODE_STATUS_CONFIG.PENDING;
212
220
  const sizeClasses = {
213
221
  sm: "px-1.5 py-0.5 text-xs gap-1",
214
222
  md: "px-2 py-1 text-sm gap-1.5",
@@ -1,4 +1,4 @@
1
- import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-3SCUZ75C.js';
1
+ import { useExecution, buildNodeDisplayMap, useExecutionActions, useAutoRefresh, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-GU233T6U.js';
2
2
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ONVGFVNH.js';
3
3
  import { getFluidGridsConfig } from './chunk-UZG3ZIQM.js';
4
4
  import { RunLogsDocument, RunLogAppendedDocument } from './chunk-L2UWPFJM.js';
@@ -165,6 +165,38 @@ function useRunLogs(runId, options = {}) {
165
165
  refetch
166
166
  };
167
167
  }
168
+
169
+ // src/modules/human-response/utils/recipient.ts
170
+ var USER_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
171
+ function recipientParts(recipient) {
172
+ return (recipient ?? "").split(",").map((part) => part.trim()).filter(Boolean);
173
+ }
174
+ function inAppResponderIds(recipient) {
175
+ return [
176
+ ...new Set(recipientParts(recipient).filter((part) => USER_ID.test(part)))
177
+ ];
178
+ }
179
+
180
+ // src/modules/human-response/hooks/useRecipientLabel.ts
181
+ function useRecipientLabel(request, fallback) {
182
+ const idsKey = request.channel === "IN_APP" ? inAppResponderIds(request.recipient).join(",") : "";
183
+ const inputs = useMemo(
184
+ () => idsKey ? idsKey.split(",").map((actorId) => ({ actorId, actorType: "user" })) : [],
185
+ [idsKey]
186
+ );
187
+ const config = getFluidGridsConfig();
188
+ const profiles = useActorProfiles(inputs, {
189
+ workspaceId: config.workspaceId || void 0,
190
+ orgId: config.organizationId,
191
+ authToken: config.authToken
192
+ });
193
+ if (!request.recipient) return fallback;
194
+ if (!idsKey) return request.recipient;
195
+ const ids = new Set(idsKey.split(","));
196
+ return recipientParts(request.recipient).map(
197
+ (part) => ids.has(part) ? profiles[part]?.displayName ?? buildActorFallback({ actorId: part, actorType: "user" }).displayName : part
198
+ ).join(", ");
199
+ }
168
200
  var HUMAN_REQUEST_FIELDS = gql`
169
201
  fragment WorkflowHumanRequestFields on WorkflowHumanRequest {
170
202
  id
@@ -446,7 +478,10 @@ function HumanRequestCard({
446
478
  (field) => field.required && !(values[field.name] ?? "").trim()
447
479
  );
448
480
  const emptyText = request.responseType === "FREE_TEXT" && !text.trim();
449
- const recipient = request.channel === "IN_APP" && !request.recipient ? tr("fluidgrids.humanResponse.anyMember", "any workspace member") : request.recipient;
481
+ const recipient = useRecipientLabel(
482
+ request,
483
+ request.channel === "IN_APP" ? tr("fluidgrids.humanResponse.anyMember", "any workspace member") : ""
484
+ );
450
485
  return /* @__PURE__ */ jsxs(
451
486
  Card,
452
487
  {
@@ -474,7 +509,7 @@ function HumanRequestCard({
474
509
  "fluidgrids.humanResponse.askedVia",
475
510
  "Asked {{recipient}} via {{channel}}",
476
511
  {
477
- recipient: recipient ?? "",
512
+ recipient,
478
513
  channel: channelLabel(request.channel, tr)
479
514
  }
480
515
  ),
@@ -640,45 +675,49 @@ function RunHumanRequests({ requests }) {
640
675
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:account-clock-outline", width: 18 }),
641
676
  tr("fluidgrids.humanResponse.runHeading", "Waiting on people")
642
677
  ] }),
643
- requests.map((request) => {
644
- const answer = answerRows(request, tr);
645
- const recipient = request.recipient || tr("fluidgrids.humanResponse.anyMember", "any workspace member");
646
- return /* @__PURE__ */ jsxs(
647
- "div",
648
- {
649
- className: "flex flex-col gap-0.5 text-sm sm:flex-row sm:flex-wrap sm:items-baseline sm:gap-x-2",
650
- "data-testid": "run-human-request",
651
- "data-status": request.status,
652
- children: [
653
- /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: request.title }),
654
- /* @__PURE__ */ jsxs("span", { className: "text-text-secondary", children: [
655
- tr(
656
- "fluidgrids.humanResponse.askedVia",
657
- "Asked {{recipient}} via {{channel}}",
658
- { recipient, channel: channelLabel(request.channel, tr) }
659
- ),
660
- " \xB7 ",
661
- outcome(request, tr)
662
- ] }),
663
- answer.length > 0 && /* @__PURE__ */ jsx(
664
- "dl",
665
- {
666
- className: "mt-1 w-full space-y-0.5 text-xs sm:mt-0",
667
- "data-testid": "run-human-answer",
668
- children: answer.map((row) => /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
669
- /* @__PURE__ */ jsxs("dt", { className: "shrink-0 font-medium text-text-secondary", children: [
670
- row.label,
671
- ":"
672
- ] }),
673
- /* @__PURE__ */ jsx("dd", { className: "whitespace-pre-wrap break-words text-text-primary", children: row.value })
674
- ] }, row.key))
675
- }
676
- )
677
- ]
678
- },
679
- request.id
680
- );
681
- })
678
+ requests.map((request) => /* @__PURE__ */ jsx(RunHumanRequestRow, { request }, request.id))
679
+ ]
680
+ }
681
+ );
682
+ }
683
+ function RunHumanRequestRow({ request }) {
684
+ const tr = useTr();
685
+ const answer = answerRows(request, tr);
686
+ const recipient = useRecipientLabel(
687
+ request,
688
+ tr("fluidgrids.humanResponse.anyMember", "any workspace member")
689
+ );
690
+ return /* @__PURE__ */ jsxs(
691
+ "div",
692
+ {
693
+ className: "flex flex-col gap-0.5 text-sm sm:flex-row sm:flex-wrap sm:items-baseline sm:gap-x-2",
694
+ "data-testid": "run-human-request",
695
+ "data-status": request.status,
696
+ children: [
697
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: request.title }),
698
+ /* @__PURE__ */ jsxs("span", { className: "text-text-secondary", children: [
699
+ tr(
700
+ "fluidgrids.humanResponse.askedVia",
701
+ "Asked {{recipient}} via {{channel}}",
702
+ { recipient, channel: channelLabel(request.channel, tr) }
703
+ ),
704
+ " \xB7 ",
705
+ outcome(request, tr)
706
+ ] }),
707
+ answer.length > 0 && /* @__PURE__ */ jsx(
708
+ "dl",
709
+ {
710
+ className: "mt-1 w-full space-y-0.5 text-xs sm:mt-0",
711
+ "data-testid": "run-human-answer",
712
+ children: answer.map((row) => /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
713
+ /* @__PURE__ */ jsxs("dt", { className: "shrink-0 font-medium text-text-secondary", children: [
714
+ row.label,
715
+ ":"
716
+ ] }),
717
+ /* @__PURE__ */ jsx("dd", { className: "whitespace-pre-wrap break-words text-text-primary", children: row.value })
718
+ ] }, row.key))
719
+ }
720
+ )
682
721
  ]
683
722
  }
684
723
  );
@@ -1,4 +1,4 @@
1
- import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-3SCUZ75C.js';
1
+ import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-GU233T6U.js';
2
2
  import { useWorkflowDefinitions } from './chunk-O6E247J6.js';
3
3
  import { useExecutionsStore } from './chunk-UZG3ZIQM.js';
4
4
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,7 +1,7 @@
1
1
  import './chunk-AD3BXTJS.js';
2
- export { ExecutionsListPage } from './chunk-OM24EQUG.js';
3
- export { ExecutionDetailPage } from './chunk-XOUL22OI.js';
4
- import './chunk-3SCUZ75C.js';
2
+ export { ExecutionsListPage } from './chunk-YB6WGQTY.js';
3
+ export { ExecutionDetailPage } from './chunk-QL7CDZ7B.js';
4
+ import './chunk-GU233T6U.js';
5
5
  import './chunk-QBFAJNUC.js';
6
6
  import './chunk-ONVGFVNH.js';
7
7
  import './chunk-JL7CASN5.js';
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ export { WorkflowBuilder as WorkflowBuilderPage } from './chunk-RFG3PJX3.js';
4
4
  export { WorkflowsList } from './chunk-3RIZZY32.js';
5
5
  import './chunk-6N27YGMB.js';
6
6
  import './chunk-AD3BXTJS.js';
7
- export { ExecutionsListPage } from './chunk-OM24EQUG.js';
8
- import { usePendingHumanRequests, HumanRequestCard } from './chunk-XOUL22OI.js';
9
- export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-XOUL22OI.js';
10
- import './chunk-3SCUZ75C.js';
7
+ export { ExecutionsListPage } from './chunk-YB6WGQTY.js';
8
+ import { usePendingHumanRequests, HumanRequestCard } from './chunk-QL7CDZ7B.js';
9
+ export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-QL7CDZ7B.js';
10
+ import './chunk-GU233T6U.js';
11
11
  export { HistoryPage } from './chunk-EPYVZPGU.js';
12
12
  export { NodesPage, fetchAllNodesWithManifests, useLazyNodeManifest, useNodeEndpoint, useNodeEndpoints, useNodeManifest } from './chunk-6B6XOZ4V.js';
13
13
  export { DataSinkDashboardPage, ErrorAnalyticsPage, InsightsPage } from './chunk-KZYQPCMK.js';
@@ -72,12 +72,12 @@ var WorkflowBuilder3 = lazy(
72
72
  }))
73
73
  );
74
74
  var ExecutionsListPage2 = lazy(
75
- () => import('./ExecutionsListPage-KBDJJNV6.js').then((m) => ({
75
+ () => import('./ExecutionsListPage-3IFRZU6A.js').then((m) => ({
76
76
  default: m.ExecutionsListPage
77
77
  }))
78
78
  );
79
79
  var ExecutionDetailPage2 = lazy(
80
- () => import('./ExecutionDetailPage-CEXLJ6GN.js').then((m) => ({
80
+ () => import('./ExecutionDetailPage-6UKPMPL2.js').then((m) => ({
81
81
  default: m.ExecutionDetailPage
82
82
  }))
83
83
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fluidgrids-fe-sdk",
3
- "version": "2026.1021.9",
3
+ "version": "2026.1021.10",
4
4
  "description": "FluidGrids Workflow Builder SDK - Embeddable visual workflow automation",
5
5
  "type": "module",
6
6
  "imports": {