@burdenoff/fluidgrids-fe-sdk 2026.1111.22 → 2026.1111.24

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 (70) hide show
  1. package/dist/{AiStudioPage-DIfF4LhQ.js → AiStudioPage-NfhraV2M.js} +5 -5
  2. package/dist/{ApprovalInboxPage-dbBDSJ-f.js → ApprovalInboxPage-D8vhnloO.js} +1 -1
  3. package/dist/{DataSinkDashboardPage-DDvNPS8Z.js → DataSinkDashboardPage-BfdKumMH.js} +1 -1
  4. package/dist/{DataTablesPage-BpnF13UT.js → DataTablesPage-DoVBkb_T.js} +3 -3
  5. package/dist/{EntityTagPicker-BqRNsLCQ.js → EntityTagPicker-Dk3CufFt.js} +1 -1
  6. package/dist/{ExecutionDetailPage-DYLWtHRG.js → ExecutionDetailPage-Dtpn7Xnl.js} +20 -15
  7. package/dist/{ExecutionsListPage-D63aCXJH.js → ExecutionsListPage-DeqJnEO7.js} +9 -9
  8. package/dist/{FailureTriagePanel-B9hDQymi.js → FailureTriagePanel-BzD4UJU5.js} +2 -2
  9. package/dist/{FluidGridsProvider-CWyQ8ziM.js → FluidGridsProvider-BuZERrTA.js} +245 -38
  10. package/dist/{HistoryPage-CNXgUMb0.js → HistoryPage-BC7ld-oQ.js} +2 -2
  11. package/dist/{HumanRequestCard-D-ooVPDn.js → HumanRequestCard-mOhr-Ic9.js} +239 -31
  12. package/dist/{InsightsPage-Duo83yAM.js → InsightsPage-C8X1g_Ya.js} +6 -6
  13. package/dist/{MissingNodesInstallModal-Q3RYBvS8.js → MissingNodesInstallModal-DUmwDs4e.js} +1 -1
  14. package/dist/{NodesPage-Bf5PhfBK.js → NodesPage-Dhg5Q2R5.js} +2 -2
  15. package/dist/{QuotaExhaustedDialog-ChBoJnRo.js → QuotaExhaustedDialog-RctNPfz_.js} +1 -1
  16. package/dist/{SettingsPage-DI_vIG7t.js → SettingsPage-BbE4S63W.js} +6 -6
  17. package/dist/{TagFilterSelect-DCBOH6Ou.js → TagFilterSelect-VC6JMK3F.js} +1 -1
  18. package/dist/{TaskQueuesPage-9VgSnLdL.js → TaskQueuesPage-C3R5ZoKs.js} +2 -2
  19. package/dist/{TemplateCard-6W2q2wiK.js → TemplateCard-D800haiE.js} +2 -2
  20. package/dist/{TemplateConfigurationModal-qNQGP7cm.js → TemplateConfigurationModal-DYs1YxYy.js} +1 -1
  21. package/dist/{TemplateDetailPanel-CQvYqhVO.js → TemplateDetailPanel-CKhCQlyo.js} +1 -1
  22. package/dist/{TemplatePreview-t3251W_n.js → TemplatePreview-DbF97Jwi.js} +3 -3
  23. package/dist/{TemplatesPage-Bvg6R2P9.js → TemplatesPage-BR6iOnC0.js} +5 -5
  24. package/dist/{VersionDiffDialog-DSN0mU0f.js → VersionDiffDialog-B00qeGiE.js} +1 -1
  25. package/dist/{WorkflowBuilder-C-hgvww2.js → WorkflowBuilder-BWqiMpdk.js} +3 -3
  26. package/dist/{WorkflowBuilder-DdvSGsxr.js → WorkflowBuilder-CWsUITzN.js} +8 -8
  27. package/dist/{WorkflowProposalCard-qrEeNyYG.js → WorkflowProposalCard-U31u1qcw.js} +2 -2
  28. package/dist/{WorkflowSearchRedirect-33Vs4FKc.js → WorkflowSearchRedirect-7Kc7NniX.js} +1 -1
  29. package/dist/{WorkflowShareDialog-mbIwRQUY.js → WorkflowShareDialog-Dv46nAyh.js} +2 -2
  30. package/dist/{WorkflowsList-C3bHLpSv.js → WorkflowsList-Bnov6LCT.js} +8 -8
  31. package/dist/{agentTools-BjhxAdlt.js → agentTools-yi8CDKzs.js} +3 -3
  32. package/dist/{ai-usage-glCwHyQz.js → ai-usage-bmUn-gJP.js} +1 -1
  33. package/dist/{api-C8e0iV-Q.js → api-C8WmUejq.js} +1 -1
  34. package/dist/{api-BrCHB5oA.js → api-DwaHAJtA.js} +1 -1
  35. package/dist/{canvasNoteTools-CZEFFhRp.js → canvasNoteTools-kRtdgYMQ.js} +2 -2
  36. package/dist/{code-editor-field-CfP0QYUD.js → code-editor-field-Dg2U8mk1.js} +1 -1
  37. package/dist/executions.js +2 -2
  38. package/dist/{flow-builder-CE8cNXNi.js → flow-builder-CEYMv_sG.js} +17 -17
  39. package/dist/{graphql-operation-types-kX-MMjgW.js → graphql-operation-types-BdU65FNm.js} +413 -1
  40. package/dist/{graphql-types-CDKVWH2R.js → graphql-types-v6CTGwA0.js} +470 -39
  41. package/dist/history.js +1 -1
  42. package/dist/{index-7eJQwsNS.d.ts → index-T8fJI6Ys.d.ts} +2073 -99
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.js +35 -35
  45. package/dist/{node-detail-view-BoR0vYZ3.js → node-detail-view-Ft8huQ5T.js} +9 -9
  46. package/dist/{node-editor-tab-body-DxMbKspp.js → node-editor-tab-body-CjwxJdlF.js} +2 -2
  47. package/dist/{node-endpoint-configs-B5bjNMDW.js → node-endpoint-configs-BrzQMy10.js} +1 -1
  48. package/dist/nodes.js +1 -1
  49. package/dist/observability.d.ts +1 -1
  50. package/dist/observability.js +2 -2
  51. package/dist/{popover-B1aKz7DC.js → popover-B6Rjrhar.js} +2 -2
  52. package/dist/{quick-config-panel-DXvLJdeW.js → quick-config-panel-D95dc_2F.js} +3 -3
  53. package/dist/{run-list-links-ByYC0OlV.js → run-list-links-eUhZB1ju.js} +1 -1
  54. package/dist/{schedule-panel-CY6S4JMd.js → schedule-panel-C-N92gxl.js} +157 -11
  55. package/dist/settings.js +1 -1
  56. package/dist/{sidebar-node-editor-FU3fvOjh.js → sidebar-node-editor-BHBicLCn.js} +3 -3
  57. package/dist/templates.js +2 -2
  58. package/dist/{useAgentDefinitions-B0dam3_o.js → useAgentDefinitions-DSU8Eek4.js} +1 -1
  59. package/dist/{useDurableParity-BApRraSO.js → useDurableParity-DEceXnEa.js} +2 -2
  60. package/dist/{useEntityTags-DhnsZcTl.js → useEntityTags-C8rPBi6W.js} +1 -1
  61. package/dist/{useExecutions-C2a4EcvC.js → useExecutions-D3S4aqIQ.js} +3 -3
  62. package/dist/{useObservability-BmbeK5bG.js → useObservability-B9cOl5mw.js} +1 -1
  63. package/dist/{useRunHistory-CqfDFRzr.js → useRunHistory-uTJepemz.js} +3 -3
  64. package/dist/{useWorkflowCodeExport-DebpM48M.js → useWorkflowCodeExport-L-5NIRiH.js} +3 -3
  65. package/dist/{useWorkflows-D1-rYzGK.js → useWorkflows-D9BlhpWH.js} +2 -2
  66. package/dist/workflow-builder.js +4 -4
  67. package/dist/workflow-pages.d.ts +1 -1
  68. package/dist/workflow-pages.js +17 -17
  69. package/dist/workflows-list.js +1 -1
  70. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
3
  import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { Icon } from "@iconify/react";
6
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { toast } from "sonner";
8
8
  import { gql } from "@apollo/client";
9
9
  import { Badge, Card, CardContent, CardHeader, Input, Label, Textarea } from "@burdenoff/fe-libs/ui";
@@ -90,6 +90,19 @@ const HUMAN_REQUEST_FIELDS = gql`
90
90
  respondedAt
91
91
  createdAt
92
92
  canRespond
93
+ quorum
94
+ requiredApprovals
95
+ myDecision
96
+ approvals {
97
+ id
98
+ requestId
99
+ approverId
100
+ assignedVia
101
+ assignedFrom
102
+ decision
103
+ comment
104
+ answeredAt
105
+ }
93
106
  }
94
107
  `;
95
108
  const GET_PENDING_HUMAN_REQUESTS = gql`
@@ -223,7 +236,11 @@ function useRunHumanRequests(runId, options) {
223
236
  refetch: fetchData
224
237
  };
225
238
  }
226
- /** Answer an in-app ask. Resolves to the decision; throws with the service's reason. */
239
+ /**
240
+ * Answer an in-app ask. Resolves to the decision the run continued with, or null when the answer
241
+ * was recorded and an approval quorum still needs more answers (BOFF-9956). Throws with the
242
+ * service's reason.
243
+ */
227
244
  function useRespondToHumanRequest() {
228
245
  const [loading, setLoading] = useState(false);
229
246
  return {
@@ -247,11 +264,163 @@ function useRespondToHumanRequest() {
247
264
  };
248
265
  }
249
266
 
267
+ // src/modules/human-response/utils/approval-progress.ts
268
+ function approvalCounts(approvals) {
269
+ let approved = 0;
270
+ let rejected = 0;
271
+ for (const approval of approvals) if (approval.decision === "APPROVED") approved++;
272
+ else if (approval.decision === "REJECTED") rejected++;
273
+ return {
274
+ approved,
275
+ rejected,
276
+ total: approvals.length
277
+ };
278
+ }
279
+ /** True for an approval that counts several answers (all, or N of them). */
280
+ function hasQuorum(request) {
281
+ return request.responseType === "APPROVAL" && (request.quorum === "all" || request.quorum === "count");
282
+ }
283
+ /** "1 of 2 approvals · 1 declined", or null for an ask without a quorum. */
284
+ function approvalProgressText(request, tr) {
285
+ if (!hasQuorum(request)) return null;
286
+ const counts = approvalCounts(request.approvals ?? []);
287
+ const required = request.requiredApprovals ?? counts.total;
288
+ const progress = request.quorum === "all" ? tr("fluidgrids.humanResponse.approvalProgressAll", "{{approved}} of {{required}} approvals (everyone must approve)", {
289
+ approved: counts.approved,
290
+ required
291
+ }) : tr("fluidgrids.humanResponse.approvalProgressCount", "{{approved}} of {{required}} approvals needed, from {{total}} approvers", {
292
+ approved: counts.approved,
293
+ required,
294
+ total: counts.total
295
+ });
296
+ if (counts.rejected === 0) return progress;
297
+ return `${progress} · ${tr("fluidgrids.humanResponse.approvalDeclinedCount", "{{count}} declined", { count: counts.rejected })}`;
298
+ }
299
+ /** An approver's answer in words. A missing answer reads differently once the ask closed. */
300
+ function approverDecisionLabel(decision, askOpen, tr) {
301
+ if (decision === "APPROVED") return tr("fluidgrids.humanResponse.approverApproved", "Approved");
302
+ if (decision === "REJECTED") return tr("fluidgrids.humanResponse.approverDeclined", "Declined");
303
+ return askOpen ? tr("fluidgrids.humanResponse.approverWaiting", "Not answered yet") : tr("fluidgrids.humanResponse.approverNoAnswer", "Did not answer");
304
+ }
305
+ /** The toast after an in-app answer: the run continued, or the answer waits for the others. */
306
+ function answeredToastText(decision, tr) {
307
+ if (decision === null) return tr("fluidgrids.humanResponse.approvalRecordedToast", "Your answer is recorded. The workflow continues once enough approvers have answered.");
308
+ return decision === "declined" ? tr("fluidgrids.humanResponse.declinedToast", "Declined — the workflow is continuing") : tr("fluidgrids.humanResponse.answeredToast", "Response sent — the workflow is continuing");
309
+ }
310
+ /**
311
+ * Why the caller cannot answer this ask here: they already answered it, it went to someone else,
312
+ * or it is answered through the link in its message.
313
+ */
314
+ function notAnswerableText(request, channelName, tr) {
315
+ if (request.myDecision === "APPROVED") return tr("fluidgrids.humanResponse.youApproved", "You approved this. It is waiting for the other approvers.");
316
+ if (request.myDecision === "REJECTED") return tr("fluidgrids.humanResponse.youDeclined", "You declined this. It is waiting for the other approvers.");
317
+ return request.channel === "IN_APP" ? tr("fluidgrids.humanResponse.notForYou", "This request was sent to someone else.") : tr("fluidgrids.humanResponse.answerByLink", "Answered through the link in the {{channel}} message.", { channel: channelName });
318
+ }
319
+
320
+ // src/modules/human-response/hooks/useApproverNames.ts
321
+ /**
322
+ * Names for the approvers of an approval (BOFF-9956). Approvers are stored as user ids; they are
323
+ * resolved through the shared actor-profile cache, the same lookup the run page uses for
324
+ * "triggered by" and `useRecipientLabel` uses for who an ask went to.
325
+ */
326
+ /** Display name per user id; ids the profile service does not know get the shared fallback. */
327
+ function useApproverNames(userIds) {
328
+ const idsKey = [...new Set(userIds)].join(",");
329
+ const inputs = useMemo(() => idsKey ? idsKey.split(",").map((actorId) => ({
330
+ actorId,
331
+ actorType: "user"
332
+ })) : [], [idsKey]);
333
+ const config = getFluidGridsConfig();
334
+ const profiles = useActorProfiles(inputs, {
335
+ workspaceId: config.workspaceId || void 0,
336
+ orgId: config.organizationId,
337
+ authToken: config.authToken
338
+ });
339
+ return useMemo(() => {
340
+ const names = {};
341
+ for (const input of inputs) names[input.actorId] = profiles[input.actorId]?.displayName ?? buildActorFallback({
342
+ actorId: input.actorId,
343
+ actorType: "user"
344
+ }).displayName;
345
+ return names;
346
+ }, [inputs, profiles]);
347
+ }
348
+
349
+ // src/modules/human-response/components/ApprovalApprovers.tsx
350
+ /**
351
+ * The approvers of an in-app approval (BOFF-9956): where the quorum stands, and who was asked, how
352
+ * (by name or through a role), what each answered, when, and their comment. Shown on the run page
353
+ * and in the Approvals inbox. Renders nothing for an ask that named no approvers and has no answer.
354
+ */
355
+ const DECISION_ICON = {
356
+ APPROVED: "mdi:check-circle-outline",
357
+ REJECTED: "mdi:close-circle-outline",
358
+ PENDING: "mdi:clock-outline"
359
+ };
360
+ const DECISION_TONE = {
361
+ APPROVED: "text-status-success-text",
362
+ REJECTED: "text-status-error-text",
363
+ PENDING: "text-text-secondary"
364
+ };
365
+ /** "1 of 2 approvals needed, from 3 approvers"; nothing for an ask without a quorum. */
366
+ function ApprovalProgress({ request }) {
367
+ const tr = useTr();
368
+ const text = approvalProgressText(request, tr);
369
+ if (!text) return null;
370
+ return /* @__PURE__ */ jsx("p", {
371
+ className: "text-xs font-medium text-text-primary",
372
+ "data-testid": "approval-progress",
373
+ children: text
374
+ });
375
+ }
376
+ function ApprovalApprovers({ request }) {
377
+ const tr = useTr();
378
+ const approvals = request.approvals ?? [];
379
+ const names = useApproverNames(approvals.map((approval) => approval.approverId));
380
+ if (approvals.length === 0) return null;
381
+ const askOpen = request.status === "PENDING";
382
+ return /* @__PURE__ */ jsxs("div", {
383
+ className: "w-full space-y-1.5",
384
+ "data-testid": "approval-approvers",
385
+ children: [/* @__PURE__ */ jsx(ApprovalProgress, { request }), /* @__PURE__ */ jsx("ul", {
386
+ className: "space-y-1",
387
+ children: approvals.map((approval) => /* @__PURE__ */ jsxs("li", {
388
+ className: "flex flex-col gap-0.5 text-xs sm:flex-row sm:flex-wrap sm:items-baseline sm:gap-x-2",
389
+ "data-testid": "approval-approver",
390
+ "data-decision": approval.decision,
391
+ children: [
392
+ /* @__PURE__ */ jsxs("span", {
393
+ className: "flex items-center gap-1 font-medium text-text-primary",
394
+ children: [/* @__PURE__ */ jsx(Icon, {
395
+ icon: DECISION_ICON[approval.decision],
396
+ width: 14,
397
+ className: DECISION_TONE[approval.decision]
398
+ }), names[approval.approverId] ?? approval.approverId]
399
+ }),
400
+ /* @__PURE__ */ jsxs("span", {
401
+ className: "text-text-secondary",
402
+ children: [
403
+ approverDecisionLabel(approval.decision, askOpen, tr),
404
+ approval.answeredAt && ` · ${new Date(approval.answeredAt).toLocaleString()}`,
405
+ approval.assignedFrom && ` · ${tr("fluidgrids.humanResponse.approverViaRole", "asked as {{role}}", { role: approval.assignedFrom })}`
406
+ ]
407
+ }),
408
+ approval.comment && /* @__PURE__ */ jsx("q", {
409
+ className: "w-full whitespace-pre-wrap break-words text-text-primary",
410
+ children: approval.comment
411
+ })
412
+ ]
413
+ }, approval.id))
414
+ })]
415
+ });
416
+ }
417
+
250
418
  // src/modules/human-response/components/HumanRequestCard.tsx
251
419
  /**
252
420
  * One "Send and Wait for Response" ask in the in-app inbox (BOFF-7651): what was asked, of whom,
253
421
  * through which channel and until when — and, when the caller may answer it in-app, the controls
254
- * to do so (Approve / Decline, a text box, or the custom form).
422
+ * to do so (Approve / Decline, a text box, or the custom form). An approval with several approvers
423
+ * (BOFF-9956) also shows where its quorum stands and takes an optional comment with the answer.
255
424
  */
256
425
  const CHANNEL_ICON = {
257
426
  EMAIL: "mdi:email-outline",
@@ -315,6 +484,62 @@ function FormControls({ requestId, fields, values, onChange }) {
315
484
  })
316
485
  });
317
486
  }
487
+ /** Approve / Decline, with an optional comment that is recorded with the answer (BOFF-9956). */
488
+ function ApprovalControls({ request, loading, onAnswer }) {
489
+ const tr = useTr();
490
+ const [comment, setComment] = useState("");
491
+ const note = comment.trim() ? { comment: comment.trim() } : {};
492
+ const commentId = `human-comment-${request.id}`;
493
+ return /* @__PURE__ */ jsxs("div", {
494
+ className: "space-y-2 pt-1",
495
+ children: [/* @__PURE__ */ jsxs("div", {
496
+ className: "space-y-1.5",
497
+ children: [/* @__PURE__ */ jsx(Label, {
498
+ htmlFor: commentId,
499
+ children: tr("fluidgrids.humanResponse.commentLabel", "Comment (optional)")
500
+ }), /* @__PURE__ */ jsx(Textarea, {
501
+ id: commentId,
502
+ value: comment,
503
+ maxLength: 2e3,
504
+ placeholder: tr("fluidgrids.humanResponse.commentPlaceholder", "Why you approve or decline. It is saved with your answer on the run."),
505
+ onChange: (event) => setComment(event.target.value),
506
+ "data-testid": "human-request-comment"
507
+ })]
508
+ }), /* @__PURE__ */ jsxs("div", {
509
+ className: "flex flex-wrap items-center gap-2",
510
+ children: [/* @__PURE__ */ jsxs(Button$1, {
511
+ "data-agent": "confirm",
512
+ size: "sm",
513
+ disabled: loading,
514
+ onClick: () => onAnswer({
515
+ action: "approve",
516
+ ...note
517
+ }),
518
+ "data-testid": "human-request-approve",
519
+ children: [/* @__PURE__ */ jsx(Icon, {
520
+ icon: "mdi:check",
521
+ className: "mr-1.5",
522
+ width: 16
523
+ }), request.approveLabel]
524
+ }), request.approvalType === "double" && /* @__PURE__ */ jsxs(Button$1, {
525
+ "data-agent": "confirm",
526
+ size: "sm",
527
+ variant: "destructive",
528
+ disabled: loading,
529
+ onClick: () => onAnswer({
530
+ action: "decline",
531
+ ...note
532
+ }),
533
+ "data-testid": "human-request-decline",
534
+ children: [/* @__PURE__ */ jsx(Icon, {
535
+ icon: "mdi:close",
536
+ className: "mr-1.5",
537
+ width: 16
538
+ }), request.declineLabel]
539
+ })]
540
+ })]
541
+ });
542
+ }
318
543
  function HumanRequestCard({ request, onAnswered }) {
319
544
  const tr = useTr();
320
545
  const { respond, loading } = useRespondToHumanRequest();
@@ -323,7 +548,7 @@ function HumanRequestCard({ request, onAnswered }) {
323
548
  const submit = async (answer) => {
324
549
  try {
325
550
  const decision = await respond(request.id, answer);
326
- toast.success(decision === "declined" ? tr("fluidgrids.humanResponse.declinedToast", "Declined — the workflow is continuing") : tr("fluidgrids.humanResponse.answeredToast", "Response sent — the workflow is continuing"));
551
+ toast.success(answeredToastText(decision, tr));
327
552
  onAnswered();
328
553
  } catch (err) {
329
554
  toast.error(err instanceof Error ? err.message : tr("fluidgrids.humanResponse.failed", "Your response could not be recorded"));
@@ -369,9 +594,10 @@ function HumanRequestCard({ request, onAnswered }) {
369
594
  className: "whitespace-pre-wrap break-words text-sm text-text-primary",
370
595
  children: request.message
371
596
  }),
597
+ /* @__PURE__ */ jsx(ApprovalApprovers, { request }),
372
598
  !request.canRespond && /* @__PURE__ */ jsx("p", {
373
599
  className: "text-xs text-text-secondary",
374
- children: request.channel === "IN_APP" ? tr("fluidgrids.humanResponse.notForYou", "This request was sent to someone else.") : tr("fluidgrids.humanResponse.answerByLink", "Answered through the link in the {{channel}} message.", { channel: channelLabel(request.channel, tr) })
600
+ children: notAnswerableText(request, channelLabel(request.channel, tr), tr)
375
601
  }),
376
602
  request.canRespond && request.responseType === "FREE_TEXT" && /* @__PURE__ */ jsxs("div", {
377
603
  className: "space-y-1.5",
@@ -393,32 +619,14 @@ function HumanRequestCard({ request, onAnswered }) {
393
619
  [name]: value
394
620
  }))
395
621
  }),
396
- request.canRespond && /* @__PURE__ */ jsx("div", {
622
+ request.canRespond && request.responseType === "APPROVAL" && /* @__PURE__ */ jsx(ApprovalControls, {
623
+ request,
624
+ loading,
625
+ onAnswer: submit
626
+ }),
627
+ request.canRespond && request.responseType !== "APPROVAL" && /* @__PURE__ */ jsx("div", {
397
628
  className: "flex flex-wrap items-center gap-2 pt-1",
398
- children: request.responseType === "APPROVAL" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Button$1, {
399
- "data-agent": "confirm",
400
- size: "sm",
401
- disabled: loading,
402
- onClick: () => submit({ action: "approve" }),
403
- "data-testid": "human-request-approve",
404
- children: [/* @__PURE__ */ jsx(Icon, {
405
- icon: "mdi:check",
406
- className: "mr-1.5",
407
- width: 16
408
- }), request.approveLabel]
409
- }), request.approvalType === "double" && /* @__PURE__ */ jsxs(Button$1, {
410
- "data-agent": "confirm",
411
- size: "sm",
412
- variant: "destructive",
413
- disabled: loading,
414
- onClick: () => submit({ action: "decline" }),
415
- "data-testid": "human-request-decline",
416
- children: [/* @__PURE__ */ jsx(Icon, {
417
- icon: "mdi:close",
418
- className: "mr-1.5",
419
- width: 16
420
- }), request.declineLabel]
421
- })] }) : /* @__PURE__ */ jsxs(Button$1, {
629
+ children: /* @__PURE__ */ jsxs(Button$1, {
422
630
  "data-agent": "confirm",
423
631
  size: "sm",
424
632
  disabled: loading || missingRequired || emptyText,
@@ -436,4 +644,4 @@ function HumanRequestCard({ request, onAnswered }) {
436
644
  });
437
645
  }
438
646
 
439
- export { useRunHumanRequests as a, useRespondToHumanRequest as i, channelLabel as n, useRecipientLabel as o, usePendingHumanRequests as r, HumanRequestCard as t };
647
+ export { useRespondToHumanRequest as a, usePendingHumanRequests as i, channelLabel as n, useRunHumanRequests as o, ApprovalApprovers as r, useRecipientLabel as s, HumanRequestCard as t };
@@ -1,16 +1,16 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
- import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-BmbeK5bG.js";
4
+ import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-B9cOl5mw.js";
5
5
  import { a as getTopFailingWorkflows, i as getTopFailingNodes, n as formatDuration, o as percentage, r as getFailureBreakdown } from "./utils-uaL5UVxb.js";
6
- import { n as FailureTriagePanel } from "./FailureTriagePanel-B9hDQymi.js";
6
+ import { n as FailureTriagePanel } from "./FailureTriagePanel-BzD4UJU5.js";
7
7
  import { o as useContinuousOptimisationEnabled } from "./feature-flags-DM5myWaD.js";
8
8
  import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
9
- import { HC as OptimisationDismissReason, UC as OptimisationKind, WC as OptimisationSuggestionStatus } from "./graphql-types-CDKVWH2R.js";
9
+ import { Cw as OptimisationSuggestionStatus, Sw as OptimisationKind, xw as OptimisationDismissReason } from "./graphql-types-v6CTGwA0.js";
10
10
  import { _ as throwIfResultError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
11
- import { Dn as SetContinuousOptimisationEnabledDocument, Ft as OptimisationSuggestionsDocument, Ht as ProposeOptimisationDocument, Pn as SnoozeOptimisationSuggestionDocument, Wr as WorkflowProposalDocument, Z as DismissOptimisationSuggestionDocument, pt as FgRunOptimisationScanDocument, rt as ErrorAnalyticsDocument, w as ContinuousOptimisationSettingsDocument, wi as WorkspaceAiUsageDocument } from "./graphql-operation-types-kX-MMjgW.js";
12
- import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-glCwHyQz.js";
13
- import { i as utcDay, r as runListPath } from "./run-list-links-ByYC0OlV.js";
11
+ import { $ as DismissOptimisationSuggestionDocument, E as ContinuousOptimisationSettingsDocument, Ei as WorkspaceAiUsageDocument, In as SnoozeOptimisationSuggestionDocument, Kr as WorkflowProposalDocument, Lt as OptimisationSuggestionsDocument, Wt as ProposeOptimisationDocument, at as ErrorAnalyticsDocument, ht as FgRunOptimisationScanDocument, kn as SetContinuousOptimisationEnabledDocument } from "./graphql-operation-types-BdU65FNm.js";
12
+ import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-bmUn-gJP.js";
13
+ import { i as utcDay, r as runListPath } from "./run-list-links-eUhZB1ju.js";
14
14
  import { t as proposalCanvasPath } from "./useRequestedProposal-B7uPXfZB.js";
15
15
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
16
16
  import { Link, useNavigate } from "react-router";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { a as DialogFooter, i as DialogDescription, l as DialogTitle, o as DialogHeader, r as DialogContent, t as Dialog } from "./dialog-Cjb4lB4D.js";
3
3
  import { t as Button } from "./button-DG7y_FVJ.js";
4
- import { r as Badge } from "./TemplateCard-6W2q2wiK.js";
4
+ import { r as Badge } from "./TemplateCard-D800haiE.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import { AlertTriangle, CheckCircle2, Download, ExternalLink, Loader2, Puzzle, ShoppingCart } from "lucide-react";
7
7
 
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
- import { t as fetchAllNodeEndpointConfigs } from "./node-endpoint-configs-B5bjNMDW.js";
5
- import { Dt as NodeEndpointConfigsDocument, Et as NodeEndpointConfigDocument, Ot as NodeManifestDocument } from "./graphql-operation-types-kX-MMjgW.js";
4
+ import { t as fetchAllNodeEndpointConfigs } from "./node-endpoint-configs-BrzQMy10.js";
5
+ import { At as NodeManifestDocument, Ot as NodeEndpointConfigDocument, kt as NodeEndpointConfigsDocument } from "./graphql-operation-types-BdU65FNm.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
7
7
  import { t as PublishCustomNodeAction } from "./PublishCustomNodeAction-5XXnSA3H.js";
8
8
  import { useCallback, useEffect, useMemo, useState } from "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
- import { gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CWyQ8ziM.js";
3
+ import { gn as useFluidGridsAnalytics } from "./FluidGridsProvider-BuZERrTA.js";
4
4
  import { c as emitWorkflowLimitHit, o as emitUpgradeClicked } from "./fluidgridsEvents-Dm5CaHtr.js";
5
5
  import { i as WORKFLOWS_QUOTA_NAME } from "./quota-Cdt8yz7N.js";
6
6
  import { useEffect, useRef } from "react";
@@ -3,18 +3,18 @@ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
5
5
  import { n as useManagedAiPolicyAuthority } from "./ManagedAiPolicyAuthorityContext-CNkxIOZ1.js";
6
- import { Br as WorkflowNotificationSettingsDocument, cr as UpdateWorkflowNotificationSettingsDocument, et as DurableHistoryCapsDocument, ir as UpdateManagedAiWorkspacePolicyDocument, rr as UpdateDurableHistoryCapsDocument, wt as ManagedAiWorkspacePolicyDocument } from "./graphql-operation-types-kX-MMjgW.js";
6
+ import { Et as ManagedAiWorkspacePolicyDocument, Hr as WorkflowNotificationSettingsDocument, ar as UpdateDurableHistoryCapsDocument, nt as DurableHistoryCapsDocument, or as UpdateManagedAiWorkspacePolicyDocument, ur as UpdateWorkflowNotificationSettingsDocument } from "./graphql-operation-types-BdU65FNm.js";
7
7
  import { c as budgetInputValue, d as withBudgetMode, f as EffectBadge, m as useActionPolicies, n as checkCodecServerUrl, p as effectLabel, s as BUDGET_DIMENSIONS, u as withBudgetLimit } from "./codec-client-CJ95Rmqo.js";
8
8
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
9
9
  import { c as useDurableParityEnabled, f as usePhaseCFlags, l as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
10
- import { M as saveCodecServerSettings, _ as fetchPauseRules, a as createPauseRule, c as deletePauseRule, f as fetchArchiveSettings, g as fetchCodecServerSettings, j as saveArchiveSettings, l as deleteSearchAttribute, o as createSearchAttribute, r as clearArchiveSettings, x as fetchSearchAttributes } from "./api-BrCHB5oA.js";
10
+ import { M as saveCodecServerSettings, _ as fetchPauseRules, a as createPauseRule, c as deletePauseRule, f as fetchArchiveSettings, g as fetchCodecServerSettings, j as saveArchiveSettings, l as deleteSearchAttribute, o as createSearchAttribute, r as clearArchiveSettings, x as fetchSearchAttributes } from "./api-DwaHAJtA.js";
11
11
  import { i as NativeSelect, o as StatusPill, t as FieldError, u as useResource } from "./shared-CMfn30xT.js";
12
- import { KF as WorkflowSearchAttributeType } from "./graphql-types-CDKVWH2R.js";
12
+ import { EI as WorkflowSearchAttributeType } from "./graphql-types-v6CTGwA0.js";
13
13
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
14
- import { Nt as useSaveStatusStore, tn as findSaveConflict } from "./FluidGridsProvider-CWyQ8ziM.js";
15
- import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-BmbeK5bG.js";
14
+ import { Nt as useSaveStatusStore, tn as findSaveConflict } from "./FluidGridsProvider-BuZERrTA.js";
15
+ import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-B9cOl5mw.js";
16
16
  import { n as useConnections } from "./useConnections-Cs7LCWEM.js";
17
- import { Nt as useUpdateWorkflowDefinitionMutation, Rt as useWorkflowDefinitionQuery, Vt as useWorkflowDefinitionsQuery, n as useAgentDefinitions } from "./useAgentDefinitions-B0dam3_o.js";
17
+ import { Nt as useUpdateWorkflowDefinitionMutation, Rt as useWorkflowDefinitionQuery, Vt as useWorkflowDefinitionsQuery, n as useAgentDefinitions } from "./useAgentDefinitions-DSU8Eek4.js";
18
18
  import { a as formToInput$2, i as emptyAgentForm, n as agentToForm, o as grantDays, r as describeRule, t as AgentFormError } from "./agent-form-Bfvm32j1.js";
19
19
  import { i as getGlobalStoreClient } from "./node-registry-refresh-Dy0uRg9f.js";
20
20
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { r as useAvailableTags } from "./useEntityTags-DhnsZcTl.js";
2
+ import { r as useAvailableTags } from "./useEntityTags-C8rPBi6W.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
 
@@ -5,8 +5,8 @@ import { m as describeOperationError } from "./client-C9XSzSXr.js";
5
5
  import { p as useSelfHostedWorkersEnabled } from "./feature-flags-DM5myWaD.js";
6
6
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
7
7
  import { a as RUN_CONTROL_DIALOG_STYLE, i as NativeSelect, o as StatusPill, t as FieldError, u as useResource } from "./shared-CMfn30xT.js";
8
- import { a as fetchTaskQueueStats, c as fetchWorkflowWorkers, d as updateTaskQueue, i as deleteWorkerToken, l as rotateWorkerToken, n as createWorkerToken, o as fetchTaskQueues, r as deleteTaskQueue, s as fetchWorkerTokens, t as createTaskQueue, u as setWorkerTokenConnectionAllowlist } from "./api-C8e0iV-Q.js";
9
- import { SF as WorkflowEnvironment } from "./graphql-types-CDKVWH2R.js";
8
+ import { a as fetchTaskQueueStats, c as fetchWorkflowWorkers, d as updateTaskQueue, i as deleteWorkerToken, l as rotateWorkerToken, n as createWorkerToken, o as fetchTaskQueues, r as deleteTaskQueue, s as fetchWorkerTokens, t as createTaskQueue, u as setWorkerTokenConnectionAllowlist } from "./api-C8WmUejq.js";
9
+ import { nI as WorkflowEnvironment } from "./graphql-types-v6CTGwA0.js";
10
10
  import { useState } from "react";
11
11
  import { Icon } from "@iconify/react";
12
12
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
3
3
  import { i as getGlobalStoreClient } from "./node-registry-refresh-Dy0uRg9f.js";
4
- import { A as StoreNodeProductsByTypeDocument, C as GetMyNodeInstallationsDocument, D as InstallWorkflowNodeDocument, c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, gn as useFluidGridsAnalytics, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, x as BrowseWorkflowTemplatesDocument } from "./FluidGridsProvider-CWyQ8ziM.js";
4
+ import { A as StoreNodeProductsByTypeDocument, C as GetMyNodeInstallationsDocument, D as InstallWorkflowNodeDocument, c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, gn as useFluidGridsAnalytics, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, x as BrowseWorkflowTemplatesDocument } from "./FluidGridsProvider-BuZERrTA.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { c as isQuotaExhaustedFailure } from "./quota-Cdt8yz7N.js";
7
7
  import { a as emitTemplateUsed, s as emitWorkflowCreated, t as emitNodeInstalled } from "./fluidgridsEvents-Dm5CaHtr.js";
@@ -1080,7 +1080,7 @@ async function dismissToastWhenShown(id) {
1080
1080
  }
1081
1081
 
1082
1082
  // src/hooks/store/useTemplateImportFlow.tsx
1083
- const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-qNQGP7cm.js").then((m) => ({ default: m.TemplateConfigurationModal })));
1083
+ const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-DYs1YxYy.js").then((m) => ({ default: m.TemplateConfigurationModal })));
1084
1084
  /**
1085
1085
  * "Use this template", the same everywhere it is offered: the builder's
1086
1086
  * template panel, the Templates page and the template preview page
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { a as DialogFooter, d as Input, i as DialogDescription, l as DialogTitle, o as DialogHeader, r as DialogContent, t as Dialog } from "./dialog-Cjb4lB4D.js";
3
3
  import { t as Button } from "./button-DG7y_FVJ.js";
4
- import { r as Badge } from "./TemplateCard-6W2q2wiK.js";
4
+ import { r as Badge } from "./TemplateCard-D800haiE.js";
5
5
  import { t as Label } from "./label-CDy86rIZ.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
7
7
  import { useEffect, useMemo, useState } from "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as Button } from "./button-DG7y_FVJ.js";
3
- import { n as templatePreview, r as Badge } from "./TemplateCard-6W2q2wiK.js";
3
+ import { n as templatePreview, r as Badge } from "./TemplateCard-D800haiE.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
6
6
  import { Icon } from "@iconify/react";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
4
- import { t as FlowBuilderPage } from "./flow-builder-CE8cNXNi.js";
5
- import { a as useTemplateImportFlow, l as useImportWorkflowTemplate } from "./TemplateCard-6W2q2wiK.js";
6
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
4
+ import { t as FlowBuilderPage } from "./flow-builder-CEYMv_sG.js";
5
+ import { a as useTemplateImportFlow, l as useImportWorkflowTemplate } from "./TemplateCard-D800haiE.js";
6
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-RctNPfz_.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
8
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
9
9
  import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-D1-rYzGK.js";
4
- import { a as useTemplateImportFlow, t as TemplateCard, u as useWorkflowTemplates, y as useGlobalStoreClient } from "./TemplateCard-6W2q2wiK.js";
5
- import { YF as WorkflowStatus } from "./graphql-types-CDKVWH2R.js";
3
+ import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-D9BlhpWH.js";
4
+ import { a as useTemplateImportFlow, t as TemplateCard, u as useWorkflowTemplates, y as useGlobalStoreClient } from "./TemplateCard-D800haiE.js";
5
+ import { kI as WorkflowStatus } from "./graphql-types-v6CTGwA0.js";
6
6
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
7
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
7
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-RctNPfz_.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { O as MyWorkflowTemplateSubmissionsDocument, P as WithdrawWorkflowTemplateSubmissionDocument, gn as useFluidGridsAnalytics, j as SubmitWorkflowTemplateDocument } from "./FluidGridsProvider-CWyQ8ziM.js";
9
+ import { O as MyWorkflowTemplateSubmissionsDocument, P as WithdrawWorkflowTemplateSubmissionDocument, gn as useFluidGridsAnalytics, j as SubmitWorkflowTemplateDocument } from "./FluidGridsProvider-BuZERrTA.js";
10
10
  import { a as emitTemplateUsed } from "./fluidgridsEvents-Dm5CaHtr.js";
11
11
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
12
12
  import { r as templatesControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
3
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
- import { Er as WorkflowDefinitionDocument, yi as WorkflowVersionDiffDocument } from "./graphql-operation-types-kX-MMjgW.js";
4
+ import { Or as WorkflowDefinitionDocument, xi as WorkflowVersionDiffDocument } from "./graphql-operation-types-BdU65FNm.js";
5
5
  import { t as canvasFromDefinition } from "./definition-canvas--3MPHoP-.js";
6
6
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { Background, Controls, Handle, MiniMap, Position, ReactFlow, ReactFlowProvider } from "@xyflow/react";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { n as FluidGridsProvider, vn as useCanvasEdges } from "./FluidGridsProvider-CWyQ8ziM.js";
2
+ import { n as FluidGridsProvider, vn as useCanvasEdges } from "./FluidGridsProvider-BuZERrTA.js";
3
3
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
4
4
  import { t as Button } from "./button-DG7y_FVJ.js";
5
5
  import { d as Input } from "./dialog-Cjb4lB4D.js";
6
- import { b as Card } from "./TemplateCard-6W2q2wiK.js";
6
+ import { b as Card } from "./TemplateCard-D800haiE.js";
7
7
  import { t as cn } from "./cn-QqidFIgr.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { _ as useNodeSelectedEvent, v as FluidGridsMark } from "./flow-builder-CE8cNXNi.js";
9
+ import { _ as useNodeSelectedEvent, v as FluidGridsMark } from "./flow-builder-CEYMv_sG.js";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
11
  import { Background, Controls, Handle, MarkerType, MiniMap, Position, ReactFlow, ReactFlowProvider, useReactFlow } from "@xyflow/react";
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-CE8cNXNi.js";
3
+ import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-CEYMv_sG.js";
4
4
  import { n as registerLiveCanvasHandler } from "./liveCanvas-D5ytXDp8.js";
5
5
  import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
6
- import { Er as WorkflowDefinitionDocument } from "./graphql-operation-types-kX-MMjgW.js";
6
+ import { Or as WorkflowDefinitionDocument } from "./graphql-operation-types-BdU65FNm.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
- import { B as createConfiguredNode, Dt as blankWorkflowCreateInput, Nt as useSaveStatusStore, Xt as rememberRevision, Z as paramsFromOperation, an as workflowFingerprint, en as codeBuildIdOf, g as registerWorkflowNodeTypes, h as registerNodeManifests, kt as classifyCreateRefusal, m as refetchStoreNodes, mn as resolveNodeOperation, o as NODE_CONFIGS, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-CWyQ8ziM.js";
8
+ import { B as createConfiguredNode, Dt as blankWorkflowCreateInput, Nt as useSaveStatusStore, Xt as rememberRevision, Z as paramsFromOperation, an as workflowFingerprint, en as codeBuildIdOf, g as registerWorkflowNodeTypes, h as registerNodeManifests, kt as classifyCreateRefusal, m as refetchStoreNodes, mn as resolveNodeOperation, o as NODE_CONFIGS, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-BuZERrTA.js";
9
9
  import { F as mergeStickyNotes, H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
10
10
  import { t as canvasFromDefinition } from "./definition-canvas--3MPHoP-.js";
11
- import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-D1-rYzGK.js";
12
- import { c as getWorkflowNodeTypes, o as buildNodeCheck, s as buildRequiredNodeTypes, v as useInstalledNodes } from "./TemplateCard-6W2q2wiK.js";
11
+ import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-D9BlhpWH.js";
12
+ import { c as getWorkflowNodeTypes, o as buildNodeCheck, s as buildRequiredNodeTypes, v as useInstalledNodes } from "./TemplateCard-D800haiE.js";
13
13
  import { c as withoutGuidedTourIntent, l as decideMissingWorkflow, o as isGuidedTourIntent, s as pickGuidedTour, u as isCreateIntent } from "./firstWorkflow-C_h0KMB2.js";
14
14
  import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
15
- import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-DebpM48M.js";
15
+ import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-L-5NIRiH.js";
16
16
  import { Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState } from "react";
17
17
  import { useLocation, useNavigate, useParams } from "react-router";
18
18
  import { Icon } from "@iconify/react";
@@ -1088,7 +1088,7 @@ function GuidedTourStarter({ ready }) {
1088
1088
  }
1089
1089
 
1090
1090
  // src/builder/app/workflow/work/page.tsx
1091
- const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-Q3RYBvS8.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1091
+ const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-DUmwDs4e.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1092
1092
  function WorkflowItem({ readonly = false }) {
1093
1093
  if (readonly) {
1094
1094
  const queryParams = new URLSearchParams(window.location.search);
@@ -1160,7 +1160,7 @@ function WorkflowItem({ readonly = false }) {
1160
1160
  setInstallErrors([]);
1161
1161
  try {
1162
1162
  const { getGlobalStoreClient } = await import("./node-registry-refresh-Dy0uRg9f.js").then((n) => n.a);
1163
- const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CWyQ8ziM.js").then((n) => n.y);
1163
+ const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-BuZERrTA.js").then((n) => n.y);
1164
1164
  const { getFluidGridsConfig } = await import("./client-C9XSzSXr.js").then((n) => n.b);
1165
1165
  const storeClient = getGlobalStoreClient();
1166
1166
  const cfg = getFluidGridsConfig();
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { _ as throwIfResultError, h as isForbiddenError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
- import { F as CreateWorkflowTestCaseDocument, I as CreateWorkflowTestCaseFromRunDocument, Sn as RunWorkflowTestsDocument, Ut as ProposeRunFixDocument, Wr as WorkflowProposalDocument, Wt as ProposeWorkflowChangeDocument, Y as DeleteWorkflowTestCaseDocument, Yt as RejectWorkflowProposalDocument, _i as WorkflowTestRunsDocument, c as ApplyWorkflowProposalDocument, hi as WorkflowTestRunDocument, mi as WorkflowTestCasesDocument, ur as UpdateWorkflowTestCaseDocument, x as CancelWorkflowProposalDocument } from "./graphql-operation-types-kX-MMjgW.js";
5
- import { $F as WorkflowTestRunSource, $u as ErrorType, QF as WorkflowTestExpectedStatus, ZF as WorkflowTestAssertionOperator, eI as WorkflowTestRunStatus } from "./graphql-types-CDKVWH2R.js";
4
+ import { C as CancelWorkflowProposalDocument, Gt as ProposeRunFixDocument, Kr as WorkflowProposalDocument, Kt as ProposeWorkflowChangeDocument, L as CreateWorkflowTestCaseDocument, R as CreateWorkflowTestCaseFromRunDocument, Z as DeleteWorkflowTestCaseDocument, Zt as RejectWorkflowProposalDocument, _i as WorkflowTestRunDocument, c as ApplyWorkflowProposalDocument, fr as UpdateWorkflowTestCaseDocument, gi as WorkflowTestCasesDocument, wn as RunWorkflowTestsDocument, yi as WorkflowTestRunsDocument } from "./graphql-operation-types-BdU65FNm.js";
5
+ import { MI as WorkflowTestExpectedStatus, NI as WorkflowTestRunSource, PI as WorkflowTestRunStatus, jI as WorkflowTestAssertionOperator, jd as ErrorType } from "./graphql-types-v6CTGwA0.js";
6
6
  import { a as notifyFluidGridsAiCreditsUpdated } from "./aiCreditsBridge-BuE92tKo.js";
7
7
  import { useCallback, useEffect, useRef, useState } from "react";
8
8
  import { Icon } from "@iconify/react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { m as useWorkflowDefinition } from "./useWorkflows-D1-rYzGK.js";
3
+ import { m as useWorkflowDefinition } from "./useWorkflows-D9BlhpWH.js";
4
4
  import { Navigate, useParams } from "react-router";
5
5
  import { Icon } from "@iconify/react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -2,8 +2,8 @@
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { JF as WorkflowShareRole, hF as WorkflowAccess, nI as WorkflowVisibility, qF as WorkflowSharePrincipalType } from "./graphql-types-CDKVWH2R.js";
6
- import { Mn as ShareWorkflowDocument, li as WorkflowSharingDocument } from "./graphql-operation-types-kX-MMjgW.js";
5
+ import { DI as WorkflowSharePrincipalType, II as WorkflowVisibility, JF as WorkflowAccess, OI as WorkflowShareRole } from "./graphql-types-v6CTGwA0.js";
6
+ import { Pn as ShareWorkflowDocument, di as WorkflowSharingDocument } from "./graphql-operation-types-BdU65FNm.js";
7
7
  import { useMemo } from "react";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { ResourceShareDialog, createSharePrincipalLister } from "@burdenoff/fe-libs/connections";