@burdenoff/fluidgrids-fe-sdk 2026.1111.16 → 2026.1111.18

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 (119) hide show
  1. package/README.md +41 -0
  2. package/dist/AiStudioPage-BHVEU4Wp.js +774 -0
  3. package/dist/ApprovalInboxPage-dbBDSJ-f.js +558 -0
  4. package/dist/DataSinkDashboardPage-1h2QsMzH.js +270 -0
  5. package/dist/DataTablesPage-BZy2z0LB.js +1690 -0
  6. package/dist/EntityTagPicker-BqRNsLCQ.js +135 -0
  7. package/dist/{ExecutionDetailPage-D-0_POAf.js → ExecutionDetailPage-BdcZmLT4.js} +799 -4420
  8. package/dist/ExecutionDetailPage-DvQ667OE.d.ts +10 -0
  9. package/dist/ExecutionsListPage-BCUJoAIE.js +2742 -0
  10. package/dist/{FailureTriagePanel-BHiduL7A.js → FailureTriagePanel-B9hDQymi.js} +4 -97
  11. package/dist/{FluidGridsProvider-DmvFADFa.js → FluidGridsProvider-dvZSNtSW.js} +10 -350
  12. package/dist/HistoryPage-BLoRpJ1R.d.ts +6 -0
  13. package/dist/{HistoryPage-BbUgxx1I.js → HistoryPage-U0tqupBN.js} +6 -4
  14. package/dist/HumanRequestCard-D-ooVPDn.js +439 -0
  15. package/dist/{InsightsPage-s6f5bU-8.js → InsightsPage-CALo16eB.js} +17 -328
  16. package/dist/ManagedAiPolicyAuthority-BxwJ3ptd.js +40 -0
  17. package/dist/{ManagedAiPolicyAuthority-CGux_DaV.d.ts → ManagedAiPolicyAuthority-DM3t3wNr.d.ts} +1 -5
  18. package/dist/ManagedAiPolicyAuthorityContext-CNkxIOZ1.js +10 -0
  19. package/dist/{MissingNodesInstallModal-B-9gHy2K.js → MissingNodesInstallModal-CMybsI8h.js} +3 -2
  20. package/dist/{NodesPage-ClvhUfbh.js → NodesPage-Bf5PhfBK.js} +7 -3
  21. package/dist/NodesPage-DEbnz9iU.d.ts +6 -0
  22. package/dist/{PublishCustomNodeAction-D2F7oN0S.js → PublishCustomNodeAction-5XXnSA3H.js} +3 -45
  23. package/dist/QuotaExhaustedDialog-7IFSaLyi.js +54 -0
  24. package/dist/RunnerStatusPill-Ctg4TJcP.js +187 -0
  25. package/dist/RunnersPage-CLCOCclc.js +467 -0
  26. package/dist/{ManagedAiPolicyAuthority-DsSaz-vg.js → SettingsPage-CJLZvv4J.js} +743 -773
  27. package/dist/SettingsPage-DMHQFj5-.d.ts +9 -0
  28. package/dist/TagFilterSelect-DCBOH6Ou.js +41 -0
  29. package/dist/TaskQueuesPage-9VgSnLdL.js +951 -0
  30. package/dist/TemplateCard-DsC0KNH1.js +1416 -0
  31. package/dist/{TemplateConfigurationModal-D_Mvgxqa.js → TemplateConfigurationModal-BhGWIzpm.js} +3 -2
  32. package/dist/{TemplateDetailPanel-DfFfUcOe.js → TemplateDetailPanel-D4cUVr-m.js} +3 -3
  33. package/dist/TemplatePreview-FayF6jxh.js +231 -0
  34. package/dist/TemplatesPage-BG3H-6v6.d.ts +10 -0
  35. package/dist/{TemplatesPage-Cku13bav.js → TemplatesPage-CsDNT54N.js} +11 -228
  36. package/dist/VariablesPage-67WR_lVE.js +949 -0
  37. package/dist/{VersionDiffDialog-Dq2xlPFI.js → VersionDiffDialog-DSN0mU0f.js} +2 -1
  38. package/dist/WorkflowBuilder-CPnXEL5J.js +555 -0
  39. package/dist/{WorkflowSearchRedirect-CaoOOpEl.js → WorkflowBuilder-YXRysvZc.js} +19 -585
  40. package/dist/{WorkflowProposalCard-8Vr56kQa.js → WorkflowProposalCard-qrEeNyYG.js} +4 -405
  41. package/dist/WorkflowSearchRedirect-DwDNZ_q5.js +36 -0
  42. package/dist/WorkflowShareDialog-mbIwRQUY.js +168 -0
  43. package/dist/WorkflowsList-CcNDQge5.d.ts +6 -0
  44. package/dist/{WorkflowsList-B2j1Pehb.js → WorkflowsList-DiiGyZkT.js} +12 -6
  45. package/dist/agent-form-Bfvm32j1.js +83 -0
  46. package/dist/{agentTools-DJ5o2ekg.js → agentTools-8s_25Q_F.js} +3 -2
  47. package/dist/{ai-usage-D5p7ZeRR.js → ai-usage-glCwHyQz.js} +1 -1
  48. package/dist/api-BrCHB5oA.js +224 -0
  49. package/dist/api-C8e0iV-Q.js +55 -0
  50. package/dist/button-DG7y_FVJ.js +48 -0
  51. package/dist/{canvasNoteTools-D3zUdEeg.js → canvasNoteTools-B6pYARgU.js} +2 -2
  52. package/dist/client-C9XSzSXr.js +1147 -0
  53. package/dist/code-editor-field-9-GdVE_8.js +111 -0
  54. package/dist/{codec-client-DstqyzTN.js → codec-client-CJ95Rmqo.js} +1 -1
  55. package/dist/constants-B2lhWNoN.js +202 -0
  56. package/dist/constants-XdvUxeWK.d.ts +162 -0
  57. package/dist/dialog-Cjb4lB4D.js +105 -0
  58. package/dist/executions.d.ts +1 -1
  59. package/dist/executions.js +2 -1
  60. package/dist/feature-flags-DM5myWaD.js +296 -0
  61. package/dist/flags.d.ts +3 -0
  62. package/dist/flags.js +4 -0
  63. package/dist/{flow-builder-DEzT8TQu.js → flow-builder-CZDKRc6f.js} +662 -10716
  64. package/dist/{node-endpoint-configs-DHFGA5MQ.js → graphql-operation-types-kX-MMjgW.js} +1 -1194
  65. package/dist/{graphql-types-XcDLtFwU.js → graphql-types-CDKVWH2R.js} +2 -202
  66. package/dist/history.d.ts +1 -1
  67. package/dist/history.js +1 -1
  68. package/dist/{index-DRf25-D3.d.ts → index-6JR2vD9J.d.ts} +33 -215
  69. package/dist/index-72XFgvbn.d.ts +132 -0
  70. package/dist/index-BcdtKBM-.d.ts +56 -0
  71. package/dist/{index-B3BWqafN.d.ts → index-DjiFgEQl.d.ts} +5 -131
  72. package/dist/index.d.ts +13 -9
  73. package/dist/index.js +52 -5300
  74. package/dist/{node-detail-view-LNqeIqN-.js → node-detail-view-CV4ZRwqh.js} +13 -8
  75. package/dist/node-editor-tab-body-DU-dh35X.js +174 -0
  76. package/dist/node-endpoint-configs-B5bjNMDW.js +37 -0
  77. package/dist/node-registry-refresh-Dy0uRg9f.js +84 -0
  78. package/dist/nodes.d.ts +1 -1
  79. package/dist/nodes.js +1 -1
  80. package/dist/observability.d.ts +1 -1
  81. package/dist/observability.js +2 -1
  82. package/dist/popover-BJHvrFGR.js +472 -0
  83. package/dist/{quick-config-panel-D3ogsaFL.js → quick-config-panel-ws3pLvbt.js} +3 -2
  84. package/dist/rolldown-runtime-hDbaFkMy.js +18 -0
  85. package/dist/run-display-BycKYSU0.js +46 -0
  86. package/dist/run-list-links-ByYC0OlV.js +98 -0
  87. package/dist/schedule-panel-C0mfGQSD.js +7542 -0
  88. package/dist/settings.d.ts +2 -1
  89. package/dist/settings.js +2 -1
  90. package/dist/shared-CMfn30xT.js +196 -0
  91. package/dist/sidebar-node-editor-CR1PiZO-.js +177 -0
  92. package/dist/templates.d.ts +1 -1
  93. package/dist/templates.js +2 -1
  94. package/dist/theme-provider-B3mIuz2d.js +11 -0
  95. package/dist/{useAgentDefinitions-NFtLytDR.js → useAgentDefinitions-B0dam3_o.js} +3 -397
  96. package/dist/useConnections-Cs7LCWEM.js +401 -0
  97. package/dist/useDurableParity-CzUQMFJ3.js +415 -0
  98. package/dist/useEntityTags-DhnsZcTl.js +236 -0
  99. package/dist/{useExecutions-DAzeWHS6.js → useExecutions-9aLuOt1c.js} +4 -3
  100. package/dist/{useObservability-COCZ0hUS.js → useObservability-CfEw3ZFD.js} +2 -2
  101. package/dist/{useRunHistory-CsYUbouO.js → useRunHistory-B1xJDwl1.js} +4 -3
  102. package/dist/{WorkflowShareDialog-6RRDe-_v.js → useWorkflowCodeExport-Bu2QYJzA.js} +7 -210
  103. package/dist/{useWorkflows-w4Dx2fF2.js → useWorkflows-BlVVu8NM.js} +3 -2
  104. package/dist/utils-uaL5UVxb.js +65 -0
  105. package/dist/workflow-builder.d.ts +1 -1
  106. package/dist/workflow-builder.js +4 -2
  107. package/dist/workflow-host.d.ts +6 -0
  108. package/dist/workflow-host.js +9 -0
  109. package/dist/workflow-pages.d.ts +55 -0
  110. package/dist/workflow-pages.js +113 -0
  111. package/dist/workflows-list.d.ts +1 -1
  112. package/dist/workflows-list.js +1 -1
  113. package/package.json +13 -1
  114. package/dist/ExecutionDetailPage-MvsnOnE1.d.ts +0 -4
  115. package/dist/HistoryPage-BqUizaFv.d.ts +0 -3
  116. package/dist/NodesPage-C97-9K2Y.d.ts +0 -3
  117. package/dist/TemplatesPage-D0qnXzHh.d.ts +0 -4
  118. package/dist/WorkflowsList-0d5GSKdh.d.ts +0 -3
  119. package/dist/agent-form-BvMWhQ42.js +0 -496
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { B as DataTablesTagsDocument, Bn as TagFluidgridsEntityDocument, Cn as RunWorkflowTestsDocument, Dn as SearchFluidgridsTagsDocument, Gr as WorkflowProposalDocument, Gt as ProposeWorkflowChangeDocument, I as CreateWorkflowTestCaseDocument, L as CreateWorkflowTestCaseFromRunDocument, O as CreateFluidgridsTagDocument, Oi as getFluidGridsClient, S as CancelWorkflowProposalDocument, Ui as throwIfResultError, Vi as isForbiddenError, Wt as ProposeRunFixDocument, X as DeleteWorkflowTestCaseDocument, Xt as RejectWorkflowProposalDocument, dr as UpdateWorkflowTestCaseDocument, er as UntagFluidgridsEntityDocument, f as AvailableFluidgridsTagsDocument, gi as WorkflowTestRunDocument, hi as WorkflowTestCasesDocument, l as ApplyWorkflowProposalDocument, qi as getFluidGridsConfig, tn as ReplaceFluidgridsEntityTagsDocument, vi as WorkflowTestRunsDocument, vt as FluidgridsEntityTagsDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
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 WorkflowTestRunSource, $u as ErrorType, QF as WorkflowTestExpectedStatus, ZF as WorkflowTestAssertionOperator, eI as WorkflowTestRunStatus } from "./graphql-types-XcDLtFwU.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";
5
6
  import { a as notifyFluidGridsAiCreditsUpdated } from "./aiCreditsBridge-BuE92tKo.js";
6
7
  import { useCallback, useEffect, useRef, useState } from "react";
7
8
  import { Icon } from "@iconify/react";
8
9
  import { jsx, jsxs } from "react/jsx-runtime";
9
10
  import { Badge, Button } from "@burdenoff/fe-libs/ui";
10
- import { TagBadge, TagsWidget } from "@burdenoff/fe-libs/tag";
11
11
 
12
12
  // src/builder/lib/assert-rules.ts
13
13
  /** Every operator, in the order the editors offer them. */
@@ -323,407 +323,6 @@ function ruleFromRow(row) {
323
323
  return rule;
324
324
  }
325
325
 
326
- // src/hooks/useEntityTags.ts
327
- /**
328
- * Entity tag hooks — thin wrappers over the generic FluidGrids tag API
329
- * (wspace-workflow-svc `tags` module → wspace-tags-svc).
330
- *
331
- * Uses the shared Apollo client directly rather than generated hooks, matching
332
- * the convention in useWorkflows.ts (works in embeds and other contexts that
333
- * mount the SDK without an ApolloProvider above them).
334
- */
335
- /**
336
- * Entity types accepted by the FluidGrids tag API (wspace-workflow-svc
337
- * `src/modules/tags/entity-tags.ts`). Workflows are tagged by `workflowKey`,
338
- * every other type by its id. Connections are tagged in the integrations
339
- * service, not here.
340
- */
341
- const FLUIDGRIDS_ENTITY_TYPES = [
342
- "FLUIDGRIDS_WORKFLOW",
343
- "FLUIDGRIDS_RUN",
344
- "FLUIDGRIDS_DATA_TABLE",
345
- "FLUIDGRIDS_TRIGGER",
346
- "FLUIDGRIDS_SCHEDULE"
347
- ];
348
- /** Display label for an assignment, degrading to the tag id when tags-svc omits the projection. */
349
- function tagLabel(assignment) {
350
- return assignment.tagInfo?.label ?? assignment.tagInfo?.key ?? assignment.tagId.slice(0, 8);
351
- }
352
- /** Tags currently assigned to an entity. */
353
- function useEntityTags(entityType, entityId) {
354
- const [tags, setTags] = useState([]);
355
- const [loading, setLoading] = useState(false);
356
- const [error, setError] = useState(null);
357
- const refetch = useCallback(async () => {
358
- if (!entityId) {
359
- setTags([]);
360
- return [];
361
- }
362
- setLoading(true);
363
- setError(null);
364
- try {
365
- const { data } = await getFluidGridsClient().query({
366
- query: FluidgridsEntityTagsDocument,
367
- variables: { input: {
368
- entityType,
369
- entityId
370
- } },
371
- fetchPolicy: "network-only"
372
- });
373
- const next = data?.fluidgridsEntityTags ?? [];
374
- setTags(next);
375
- return next;
376
- } catch (err) {
377
- setError(err);
378
- return [];
379
- } finally {
380
- setLoading(false);
381
- }
382
- }, [entityType, entityId]);
383
- useEffect(() => {
384
- refetch();
385
- }, [refetch]);
386
- return {
387
- tags,
388
- loading,
389
- error,
390
- refetch
391
- };
392
- }
393
- /** All assignable tags in the workspace. */
394
- function useAvailableTags(limit = 50, options = {}) {
395
- const [availableTags, setAvailableTags] = useState([]);
396
- const [loading, setLoading] = useState(false);
397
- const skip = options.skip ?? false;
398
- const fetchTags = useCallback(async () => {
399
- if (skip) return;
400
- setLoading(true);
401
- try {
402
- const { data } = await getFluidGridsClient().query({
403
- query: AvailableFluidgridsTagsDocument,
404
- variables: { limit },
405
- fetchPolicy: "network-only"
406
- });
407
- setAvailableTags(data?.availableFluidgridsTags ?? []);
408
- } catch {
409
- setAvailableTags([]);
410
- } finally {
411
- setLoading(false);
412
- }
413
- }, [limit, skip]);
414
- useEffect(() => {
415
- fetchTags();
416
- }, [fetchTags]);
417
- return {
418
- availableTags,
419
- loading,
420
- refetch: fetchTags
421
- };
422
- }
423
- /** Search assignable tags by label. */
424
- function useSearchTags() {
425
- return useCallback(async (query, limit = 20) => {
426
- if (!query.trim()) return [];
427
- try {
428
- const { data } = await getFluidGridsClient().query({
429
- query: SearchFluidgridsTagsDocument,
430
- variables: {
431
- query,
432
- limit
433
- },
434
- fetchPolicy: "network-only"
435
- });
436
- return data?.searchFluidgridsTags ?? [];
437
- } catch {
438
- return [];
439
- }
440
- }, []);
441
- }
442
- /** Assign a tag to an entity. */
443
- function useTagEntity() {
444
- return useCallback(async (entityType, entityId, tagId) => {
445
- const { data } = await getFluidGridsClient().mutate({
446
- mutation: TagFluidgridsEntityDocument,
447
- variables: { input: {
448
- entityType,
449
- entityId,
450
- tagId,
451
- source: "MANUAL"
452
- } }
453
- });
454
- return Boolean(data?.tagFluidgridsEntity);
455
- }, []);
456
- }
457
- /** Remove a tag from an entity. */
458
- function useUntagEntity() {
459
- return useCallback(async (entityType, entityId, tagId) => {
460
- const { data } = await getFluidGridsClient().mutate({
461
- mutation: UntagFluidgridsEntityDocument,
462
- variables: { input: {
463
- entityType,
464
- entityId,
465
- tagId
466
- } }
467
- });
468
- return Boolean(data?.untagFluidgridsEntity);
469
- }, []);
470
- }
471
- /** Replace the full tag set on an entity. */
472
- function useReplaceEntityTags() {
473
- return useCallback(async (entityType, entityId, tagIds) => {
474
- const { data } = await getFluidGridsClient().mutate({
475
- mutation: ReplaceFluidgridsEntityTagsDocument,
476
- variables: { input: {
477
- entityType,
478
- entityId,
479
- tagIds
480
- } }
481
- });
482
- return data?.replaceFluidgridsEntityTags ?? [];
483
- }, []);
484
- }
485
- /** Create a new assignable tag (inline creation from the picker). */
486
- function useCreateTag() {
487
- return useCallback(async (label, color) => {
488
- const { data } = await getFluidGridsClient().mutate({
489
- mutation: CreateFluidgridsTagDocument,
490
- variables: { input: {
491
- label,
492
- color
493
- } }
494
- });
495
- return data?.createFluidgridsTag ?? null;
496
- }, []);
497
- }
498
- /**
499
- * Create-time tagging: collect tag ids while the entity does not exist yet,
500
- * then flush them once it does.
501
- *
502
- * The flush is best-effort — the entity already exists by then, so a tag
503
- * failure must never block navigation; the detail-surface picker lets the
504
- * user retry.
505
- */
506
- function useDraftEntityTags(entityType) {
507
- const [draftTagIds, setDraftTagIds] = useState([]);
508
- const tagEntity = useTagEntity();
509
- return {
510
- draftTagIds,
511
- setDraftTagIds,
512
- flushTags: useCallback(async (entityId) => {
513
- if (!entityId || draftTagIds.length === 0) return;
514
- await Promise.all(draftTagIds.map((tagId) => tagEntity(entityType, entityId, tagId).catch(() => false)));
515
- }, [
516
- draftTagIds,
517
- entityType,
518
- tagEntity
519
- ])
520
- };
521
- }
522
- /**
523
- * Tag overlay for the Data Tables list: tableId -> assignments (G47).
524
- *
525
- * Separate from the list query, like {@link useWorkflowTagOverlay}: when
526
- * `tagAssignments` is not in the supergraph yet, only the chips go missing.
527
- */
528
- function useDataTableTagOverlay(limit = 200) {
529
- const [tagsById, setTagsById] = useState({});
530
- const fetchOverlay = useCallback(async () => {
531
- try {
532
- const { data } = await getFluidGridsClient().query({
533
- query: DataTablesTagsDocument,
534
- variables: { limit },
535
- fetchPolicy: "network-only"
536
- });
537
- const next = {};
538
- for (const table of data?.dataTables?.tables ?? []) {
539
- const assignments = table.tagAssignments ?? [];
540
- if (assignments.length > 0) next[table.id] = assignments;
541
- }
542
- setTagsById(next);
543
- } catch {
544
- setTagsById({});
545
- }
546
- }, [limit]);
547
- useEffect(() => {
548
- fetchOverlay();
549
- }, [fetchOverlay]);
550
- return {
551
- tagsById,
552
- refetch: fetchOverlay
553
- };
554
- }
555
-
556
- // src/components/shared/EntityTagPicker.tsx
557
- /**
558
- * EntityTagPicker — universal tag strip for FluidGrids entities.
559
- *
560
- * Reuse-first: the shared `TagsWidget` from `@burdenoff/fe-libs/tag` supplies
561
- * the search/create/vocabulary UX and the tags-svc graph sync; this wrapper
562
- * only owns persistence, which goes through the FluidGrids tag API
563
- * (`tagFluidgridsEntity` / `untagFluidgridsEntity` → wspace-tags-svc
564
- * assignment rows). We never stand up a parallel tag store.
565
- *
566
- * Workflows are tagged by `workflowKey`, not the version row id — pass the key
567
- * as `entityId` so every version of a workflow shares one tag set. Runs, data
568
- * tables, triggers and schedules are tagged by their id.
569
- *
570
- * Draft mode: omit `entityId` (create forms). Nothing is fetched or persisted;
571
- * selections are emitted through `onDraftChange` for the parent to flush with
572
- * `useDraftEntityTags` once the entity exists.
573
- */
574
- function toTagItem(assignment) {
575
- return {
576
- id: assignment.tagId,
577
- key: assignment.tagInfo?.key ?? assignment.tagId,
578
- label: assignment.tagInfo?.label ?? assignment.tagInfo?.key ?? "Tag",
579
- color: assignment.tagInfo?.color ?? null
580
- };
581
- }
582
- function EntityTagPicker({ entityType, entityId, onDraftChange, readOnly = false, onChange, className }) {
583
- const draftMode = !entityId;
584
- const { workspaceId } = getFluidGridsConfig();
585
- const { tags: assignments, refetch } = useEntityTags(entityType, entityId);
586
- const tagEntity = useTagEntity();
587
- const untagEntity = useUntagEntity();
588
- const [current, setCurrent] = useState([]);
589
- const currentRef = useRef([]);
590
- const assignmentKey = assignments.map((a) => a.tagId).join("|");
591
- const syncedKey = useRef(null);
592
- useEffect(() => {
593
- if (draftMode || syncedKey.current === assignmentKey) return;
594
- syncedKey.current = assignmentKey;
595
- const synced = assignments.map(toTagItem);
596
- currentRef.current = synced;
597
- setCurrent(synced);
598
- }, [
599
- assignmentKey,
600
- assignments,
601
- draftMode
602
- ]);
603
- const handleAdd = useCallback(async (tag) => {
604
- if (currentRef.current.some((t) => t.id === tag.id)) return;
605
- const next = [...currentRef.current, tag];
606
- currentRef.current = next;
607
- setCurrent(next);
608
- if (draftMode) {
609
- onDraftChange?.(next.map((t) => t.id));
610
- return;
611
- }
612
- try {
613
- await tagEntity(entityType, entityId, tag.id);
614
- await refetch();
615
- onChange?.();
616
- } catch {
617
- const rolledBack = currentRef.current.filter((t) => t.id !== tag.id);
618
- currentRef.current = rolledBack;
619
- setCurrent(rolledBack);
620
- }
621
- }, [
622
- draftMode,
623
- entityId,
624
- entityType,
625
- onChange,
626
- onDraftChange,
627
- refetch,
628
- tagEntity
629
- ]);
630
- const handleRemove = useCallback(async (tagId) => {
631
- const removed = currentRef.current.find((t) => t.id === tagId);
632
- const next = currentRef.current.filter((t) => t.id !== tagId);
633
- currentRef.current = next;
634
- setCurrent(next);
635
- if (draftMode) {
636
- onDraftChange?.(next.map((t) => t.id));
637
- return;
638
- }
639
- try {
640
- await untagEntity(entityType, entityId, tagId);
641
- await refetch();
642
- onChange?.();
643
- } catch {
644
- if (removed) {
645
- const rolledBack = [...currentRef.current, removed];
646
- currentRef.current = rolledBack;
647
- setCurrent(rolledBack);
648
- }
649
- }
650
- }, [
651
- draftMode,
652
- entityId,
653
- entityType,
654
- onChange,
655
- onDraftChange,
656
- refetch,
657
- untagEntity
658
- ]);
659
- if (readOnly) {
660
- if (current.length === 0) return null;
661
- return /* @__PURE__ */ jsx("div", {
662
- className: `flex flex-wrap items-center gap-1 ${className ?? ""}`,
663
- children: current.map((tag) => /* @__PURE__ */ jsx(TagBadge, {
664
- id: tag.id,
665
- label: tag.label,
666
- color: tag.color ?? void 0,
667
- size: "sm"
668
- }, tag.id))
669
- });
670
- }
671
- return /* @__PURE__ */ jsx(TagsWidget, {
672
- entityType,
673
- entityId: entityId ?? "",
674
- workspaceId: workspaceId || void 0,
675
- tags: current,
676
- onAdd: handleAdd,
677
- onRemove: handleRemove,
678
- syncGraphNotifications: !draftMode,
679
- className
680
- });
681
- }
682
-
683
- // src/modules/executions/utils/run-display.ts
684
- /**
685
- * Versions are stored as "v1"/"v2" (legacy: "1.0.0"). Render without
686
- * double-prefixing: "v1" stays "v1", "1.0.0" becomes "v1.0.0".
687
- */
688
- function formatRunVersion(version) {
689
- if (!version) return "";
690
- return version.startsWith("v") ? version : `v${version}`;
691
- }
692
- function asString(value) {
693
- return typeof value === "string" && value.trim() ? value : void 0;
694
- }
695
- /**
696
- * Build a nodeId → display mapping from a workflow definitionJson.
697
- * Label priority: user-set node label → manifest name → node type.
698
- * Returns an empty map for missing/malformed definitions (e.g. runs of
699
- * deleted workflows) — callers fall back to the raw nodeId.
700
- */
701
- function buildNodeDisplayMap(definitionJson) {
702
- const map = {};
703
- const nodes = definitionJson?.data?.nodes;
704
- if (!Array.isArray(nodes)) return map;
705
- for (const node of nodes) {
706
- const id = asString(node?.id);
707
- if (!id) continue;
708
- const label = asString(node?.data?.label) ?? asString(node?.data?.nodeData?.name) ?? asString(node?.type);
709
- if (!label) continue;
710
- const operation = asString(node?.data?.operation_name);
711
- map[id] = {
712
- label,
713
- operation: operation === "execute" ? void 0 : operation
714
- };
715
- }
716
- return map;
717
- }
718
- /**
719
- * "GitHub · searchIssues" title for a node, falling back to the raw nodeId
720
- * when the definition doesn't know this node.
721
- */
722
- function nodeDisplayTitle(display, fallback) {
723
- if (!display) return fallback;
724
- return display.operation ? `${display.label} · ${display.operation}` : display.label;
725
- }
726
-
727
326
  // src/builder/lib/workflow-tests.ts
728
327
  /**
729
328
  * Workflow test suites (BOFF-9960): the editable form of a saved test case,
@@ -1643,4 +1242,4 @@ function WorkflowProposalCard({ proposal, isDeciding = false, onOpenWorkflow, on
1643
1242
  });
1644
1243
  }
1645
1244
 
1646
- export { useTagEntity as A, useAvailableTags as C, useEntityTags as D, useDraftEntityTags as E, normaliseAssertRules as F, operatorSpec as I, readAssertRulesSetting as L, ASSERT_OPERATORS as M, describeAssertRuleProblem as N, useReplaceEntityTags as O, emptyAssertRuleRow as P, rowsFromRules as R, tagLabel as S, useDataTableTagOverlay as T, buildNodeDisplayMap as _, TEST_STATUS_TONE_CLASS as a, EntityTagPicker as b, draftToInput as c, isTestRunOpen as d, nextSortOrder as f, testStatusTone as g, testStatusLabel as h, useWorkflowTests as i, useUntagEntity as j, useSearchTags as k, emptyTestCaseDraft as l, testRunSummaryText as m, useWorkflowProposal as n, canSaveRunAsTestCase as o, pinnedOutputsFromCanvas as p, saveRunAsTestCase as r, draftFromTestCase as s, WorkflowProposalCard as t, enabledCaseIds as u, formatRunVersion as v, useCreateTag as w, FLUIDGRIDS_ENTITY_TYPES as x, nodeDisplayTitle as y, ruleFromRow as z };
1245
+ export { rowsFromRules as C, readAssertRulesSetting as S, ASSERT_OPERATORS as _, TEST_STATUS_TONE_CLASS as a, normaliseAssertRules as b, draftToInput as c, isTestRunOpen as d, nextSortOrder as f, testStatusTone as g, testStatusLabel as h, useWorkflowTests as i, emptyTestCaseDraft as l, testRunSummaryText as m, useWorkflowProposal as n, canSaveRunAsTestCase as o, pinnedOutputsFromCanvas as p, saveRunAsTestCase as r, draftFromTestCase as s, WorkflowProposalCard as t, enabledCaseIds as u, describeAssertRuleProblem as v, ruleFromRow as w, operatorSpec as x, emptyAssertRuleRow as y };
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
+ import { m as useWorkflowDefinition } from "./useWorkflows-BlVVu8NM.js";
4
+ import { Navigate, useParams } from "react-router";
5
+ import { Icon } from "@iconify/react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+
8
+ // src/pages/WorkflowSearchRedirect.tsx
9
+ var WorkflowSearchRedirect_exports = /* @__PURE__ */ __exportAll({ WorkflowSearchRedirect: () => WorkflowSearchRedirect });
10
+ /**
11
+ * Global search indexes WorkflowDefinition by its database id, but the
12
+ * builder route (`workflow/:workflowKey/:version`) is keyed by workflowKey +
13
+ * version. This page bridges the two: it resolves the id to its current
14
+ * workflowKey/version and redirects there.
15
+ */
16
+ function WorkflowSearchRedirect() {
17
+ const { id } = useParams();
18
+ const { workflow, loading, error } = useWorkflowDefinition(void 0, id);
19
+ if (loading) return /* @__PURE__ */ jsxs("div", {
20
+ className: "flex h-full min-h-[40vh] items-center justify-center gap-2 text-sm text-muted-foreground",
21
+ children: [/* @__PURE__ */ jsx(Icon, {
22
+ icon: "svg-spinners:ring-resize",
23
+ className: "size-4"
24
+ }), "Opening workflow…"]
25
+ });
26
+ if (error || !workflow) return /* @__PURE__ */ jsx(Navigate, {
27
+ to: "../list",
28
+ replace: true
29
+ });
30
+ return /* @__PURE__ */ jsx(Navigate, {
31
+ to: `../workflow/${workflow.workflowKey}/${workflow.version}`,
32
+ replace: true
33
+ });
34
+ }
35
+
36
+ export { WorkflowSearchRedirect_exports as n, WorkflowSearchRedirect as t };
@@ -0,0 +1,168 @@
1
+ "use client";
2
+ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
+ import { n as getFluidGridsClient } from "./client-C9XSzSXr.js";
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";
7
+ import { useMemo } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ import { ResourceShareDialog, createSharePrincipalLister } from "@burdenoff/fe-libs/connections";
10
+
11
+ // src/utils/workflow-sharing.ts
12
+ /** Whether someone reaching a workflow this way may change who it is shared with. */
13
+ function canShareWorkflow(access) {
14
+ return access === "OWNER" || access === "EDITOR" || access === "ADMINISTRATOR";
15
+ }
16
+ /** Whether someone reaching a workflow this way may change or run it. */
17
+ function canEditWorkflow(access) {
18
+ return access !== "VIEWER";
19
+ }
20
+ const VISIBILITY_OUT = {
21
+ WORKSPACE: "WORKSPACE",
22
+ RESTRICTED: "RESTRICTED"
23
+ };
24
+ const VISIBILITY_IN = {
25
+ ["WORKSPACE"]: "WORKSPACE",
26
+ ["RESTRICTED"]: "RESTRICTED"
27
+ };
28
+ const PRINCIPAL_OUT = {
29
+ USER: "USER",
30
+ GROUP: "GROUP",
31
+ PROJECT: "PROJECT"
32
+ };
33
+ const PRINCIPAL_IN = {
34
+ ["USER"]: "USER",
35
+ ["GROUP"]: "GROUP",
36
+ ["PROJECT"]: "PROJECT"
37
+ };
38
+ const ROLE_OUT = {
39
+ VIEWER: "VIEWER",
40
+ EDITOR: "EDITOR"
41
+ };
42
+ const ROLE_IN = {
43
+ ["VIEWER"]: "VIEWER",
44
+ ["EDITOR"]: "EDITOR"
45
+ };
46
+ /** The service's answer as the dialog sees it; `name` is what the title shows. */
47
+ function toResourceSharing(sharing, name = sharing.workflowKey) {
48
+ const shares = sharing.shares.map((share) => ({
49
+ principalType: PRINCIPAL_IN[share.principalType],
50
+ principalId: share.principalId,
51
+ role: ROLE_IN[share.role]
52
+ }));
53
+ return {
54
+ id: sharing.workflowKey,
55
+ name,
56
+ ownerId: sharing.ownerId ?? "",
57
+ visibility: VISIBILITY_IN[sharing.visibility],
58
+ canManage: canShareWorkflow(sharing.myAccess),
59
+ administrator: sharing.canTransferOwnership,
60
+ shares
61
+ };
62
+ }
63
+ /** The workflow service behind the generic Share dialog. */
64
+ function workflowSharingApi(client, listPrincipals) {
65
+ return {
66
+ async getSharing(workflowKey) {
67
+ const result = await client.query({
68
+ query: WorkflowSharingDocument,
69
+ variables: { workflowKey },
70
+ fetchPolicy: "network-only"
71
+ });
72
+ if (!result.data) throw new Error("Workflow not found");
73
+ return toResourceSharing(result.data.workflowSharing);
74
+ },
75
+ listPrincipals,
76
+ async share(input) {
77
+ const result = await client.mutate({
78
+ mutation: ShareWorkflowDocument,
79
+ variables: { input: {
80
+ workflowKey: input.resourceId,
81
+ visibility: VISIBILITY_OUT[input.visibility],
82
+ shares: input.shares.map((share) => ({
83
+ principalType: PRINCIPAL_OUT[share.principalType],
84
+ principalId: share.principalId,
85
+ role: ROLE_OUT[share.role]
86
+ })),
87
+ ...input.ownerId ? { ownerId: input.ownerId } : {}
88
+ } }
89
+ });
90
+ if (!result.data) throw new Error("Workflow not found");
91
+ return toResourceSharing(result.data.shareWorkflow);
92
+ }
93
+ };
94
+ }
95
+
96
+ // src/components/WorkflowShareDialog.tsx
97
+ /**
98
+ * WorkflowShareDialog — who can reach a workflow (BOFF-9726).
99
+ *
100
+ * The workflow version of fe-libs' ResourceShareDialog: a workflow is shared
101
+ * with people, groups or workspace projects as "Can view" or "Can edit", or
102
+ * left to the whole workspace. The workflow service decides who may change
103
+ * the sharing (its owner, an editor it is shared with, or a workspace admin)
104
+ * and answers NOT_FOUND to anyone else; this dialog only shows what the
105
+ * caller may do and sends the complete new sharing back.
106
+ */
107
+ var WorkflowShareDialog_exports = /* @__PURE__ */ __exportAll({ WorkflowShareDialog: () => WorkflowShareDialog });
108
+ function workflowShareCopy(tr, name) {
109
+ return {
110
+ title: (loaded) => tr("fluidgrids.sharing.title", "Share {{name}}", { name: name || loaded }),
111
+ titleLoading: tr("fluidgrids.sharing.titleLoading", "Share workflow"),
112
+ loading: tr("fluidgrids.sharing.loading", "Loading sharing…"),
113
+ readOnly: tr("fluidgrids.sharing.readOnly", "Only the owner, editors and workspace admins can change who can open this workflow."),
114
+ save: tr("fluidgrids.sharing.save", "Save"),
115
+ cancel: tr("fluidgrids.sharing.cancel", "Cancel"),
116
+ close: tr("fluidgrids.sharing.close", "Close"),
117
+ owner: tr("fluidgrids.sharing.owner", "Owner"),
118
+ add: tr("fluidgrids.sharing.add", "Share with people, groups or projects"),
119
+ addPlaceholder: tr("fluidgrids.sharing.addPlaceholder", "Search by name or email"),
120
+ sharedWith: tr("fluidgrids.sharing.sharedWith", "Shared with"),
121
+ onlyOwner: tr("fluidgrids.sharing.onlyOwner", "No one else yet. Only the owner and workspace admins can open it."),
122
+ none: tr("fluidgrids.sharing.none", "No one in particular."),
123
+ principalType: {
124
+ USER: tr("fluidgrids.sharing.type.user", "Person"),
125
+ GROUP: tr("fluidgrids.sharing.type.group", "Group"),
126
+ PROJECT: tr("fluidgrids.sharing.type.project", "Project")
127
+ },
128
+ roleFor: (grantee) => tr("fluidgrids.sharing.roleFor", "Access for {{name}}", { name: grantee }),
129
+ remove: (grantee) => tr("fluidgrids.sharing.remove", "Stop sharing with {{name}}", { name: grantee }),
130
+ visibility: {
131
+ legend: tr("fluidgrids.sharing.visibility.label", "Who can open this workflow"),
132
+ restricted: tr("fluidgrids.sharing.visibility.restricted", "Only people I choose"),
133
+ restrictedHint: tr("fluidgrids.sharing.visibility.restrictedHint", "You, the people, groups or projects you share it with, and workspace admins. Everyone else cannot find it."),
134
+ workspace: tr("fluidgrids.sharing.visibility.workspace", "Everyone in this workspace"),
135
+ workspaceHint: tr("fluidgrids.sharing.visibility.workspaceHint", "Anyone in the workspace can open it, as their workspace role allows.")
136
+ }
137
+ };
138
+ }
139
+ function WorkflowShareDialog({ open, onClose, workflowKey, workflowName, workspaceId, client, onShared, api: apiOverride }) {
140
+ const tr = useTr();
141
+ const api = useMemo(() => {
142
+ if (apiOverride) return apiOverride;
143
+ const apollo = client ?? getFluidGridsClient();
144
+ return workflowSharingApi(apollo, createSharePrincipalLister(apollo));
145
+ }, [apiOverride, client]);
146
+ const copy = useMemo(() => workflowShareCopy(tr, workflowName), [tr, workflowName]);
147
+ const roles = useMemo(() => [{
148
+ value: "VIEWER",
149
+ label: tr("fluidgrids.sharing.role.viewer", "Can view")
150
+ }, {
151
+ value: "EDITOR",
152
+ label: tr("fluidgrids.sharing.role.editor", "Can edit")
153
+ }], [tr]);
154
+ return /* @__PURE__ */ jsx(ResourceShareDialog, {
155
+ open,
156
+ onClose,
157
+ api,
158
+ resourceId: workflowKey,
159
+ workspaceId,
160
+ roles,
161
+ copy,
162
+ testIdPrefix: "share-workflow",
163
+ translate: tr,
164
+ onShared: onShared ? () => onShared() : void 0
165
+ });
166
+ }
167
+
168
+ export { canShareWorkflow as i, WorkflowShareDialog_exports as n, canEditWorkflow as r, WorkflowShareDialog as t };
@@ -0,0 +1,6 @@
1
+
2
+ declare namespace WorkflowsList_d_exports {
3
+ export { WorkflowsList };
4
+ }
5
+ declare function WorkflowsList(): import("react").JSX.Element;
6
+ export { WorkflowsList_d_exports as n, WorkflowsList as t };
@@ -1,13 +1,19 @@
1
1
  "use client";
2
- import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-w4Dx2fF2.js";
3
- import { Dn as FLUIDGRIDS_FLAGS, Dt as createThenOpen, Fn as useFluidGridsFlag, t as FluidGridsContext } from "./FluidGridsProvider-DmvFADFa.js";
4
- import { C as readProjectArchive, D as workflowNameFromFile, E as typeScriptModuleFile, O as CreateWorkflowRefusalDialog, S as primaryImportModule, T as typeScriptImportSource, _ as importFileKind, a as downloadWorkflowExport, c as canShareWorkflow, d as MAX_IMPORT_ARCHIVE_BYTES, f as MAX_IMPORT_SOURCE_BYTES, g as importAcceptAttribute, k as QuotaExhaustedDialog, l as CODE_EXPORT_FORMATS, m as checkTypeScriptImport, o as parseWorkflowImport, p as assertImportByteSize, r as useExportWorkflowAs, s as canEditWorkflow, t as WorkflowShareDialog, u as ImportSourceError } from "./WorkflowShareDialog-6RRDe-_v.js";
2
+ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
+ import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-BlVVu8NM.js";
4
+ import { Dt as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-dvZSNtSW.js";
5
+ import { C as typeScriptModuleFile, S as typeScriptImportSource, T as CreateWorkflowRefusalDialog, a as parseWorkflowImport, b as readProjectArchive, c as MAX_IMPORT_ARCHIVE_BYTES, d as checkTypeScriptImport, i as downloadWorkflowExport, l as MAX_IMPORT_SOURCE_BYTES, m as importFileKind, n as useExportWorkflowAs, o as CODE_EXPORT_FORMATS, p as importAcceptAttribute, s as ImportSourceError, u as assertImportByteSize, w as workflowNameFromFile, y as primaryImportModule } from "./useWorkflowCodeExport-Bu2QYJzA.js";
5
6
  import { f as BILLING_PLANS_PATH, y as isQuotaExhaustedFailure } from "./fluidgridsEvents-CNdcrUNN.js";
6
7
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
7
- import { CF as WorkflowExportFormat, gF as WorkflowAccessFilter, hI as FLUIDGRIDS_PERMISSIONS, vI as SdkPermissionButton, xI as useFluidGridsPermission, yI as SdkPermissionGate } from "./graphql-types-XcDLtFwU.js";
8
+ import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
9
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-7IFSaLyi.js";
8
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { $t as RenameWorkflowFolderDocument, Bi as describeOperationError, Et as MoveWorkflowFolderDocument, K as DeleteWorkflowFolderDocument, M as CreateWorkflowFolderDocument, N as CreateWorkflowProjectDocument, Oi as getFluidGridsClient, Pr as WorkflowFoldersDocument, Ui as throwIfResultError, Ur as WorkflowProjectsDocument, _ as BulkMoveWorkflowsToFolderDocument, en as RenameWorkflowProjectDocument, g as BulkDeleteWorkflowsDocument, h as BulkAssignWorkflowsToProjectDocument, oa as __exportAll, q as DeleteWorkflowProjectDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
10
- import { a as useExecutions } from "./useExecutions-DAzeWHS6.js";
11
+ import { CF as WorkflowExportFormat, gF as WorkflowAccessFilter } from "./graphql-types-CDKVWH2R.js";
12
+ import { i as canShareWorkflow, r as canEditWorkflow, t as WorkflowShareDialog } from "./WorkflowShareDialog-mbIwRQUY.js";
13
+ import { l as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
14
+ import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
15
+ import { $t as RenameWorkflowProjectDocument, G as DeleteWorkflowFolderDocument, Hr as WorkflowProjectsDocument, K as DeleteWorkflowProjectDocument, M as CreateWorkflowProjectDocument, Nr as WorkflowFoldersDocument, Qt as RenameWorkflowFolderDocument, Tt as MoveWorkflowFolderDocument, g as BulkMoveWorkflowsToFolderDocument, h as BulkDeleteWorkflowsDocument, j as CreateWorkflowFolderDocument, m as BulkAssignWorkflowsToProjectDocument } from "./graphql-operation-types-kX-MMjgW.js";
16
+ import { a as useExecutions } from "./useExecutions-9aLuOt1c.js";
11
17
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
12
18
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
13
19
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";