@burdenoff/fluidgrids-fe-sdk 2026.1111.15 → 2026.1111.17

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 (112) hide show
  1. package/README.md +41 -0
  2. package/dist/AiStudioPage-kJHSsIcj.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-DO38vZ_F.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-B9RR_CI_.js → FluidGridsProvider-dvZSNtSW.js} +28 -350
  12. package/dist/HistoryPage-BLoRpJ1R.d.ts +6 -0
  13. package/dist/{HistoryPage-CA42pU85.js → HistoryPage-U0tqupBN.js} +6 -4
  14. package/dist/HumanRequestCard-D-ooVPDn.js +439 -0
  15. package/dist/{InsightsPage-CBoN_Mj9.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-Dm0nMBXM.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-CKihmbJE.js → SettingsPage-CgkRlCM5.js} +19 -50
  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-Bs_V-E4u.js → TemplateConfigurationModal-BhGWIzpm.js} +3 -2
  32. package/dist/{TemplateDetailPanel-MlT39VLG.js → TemplateDetailPanel-D4cUVr-m.js} +3 -3
  33. package/dist/TemplatePreview-GthzCOSo.js +231 -0
  34. package/dist/TemplatesPage-BG3H-6v6.d.ts +10 -0
  35. package/dist/{TemplatesPage-CHVpWBuw.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-DEi_9YOb.js +555 -0
  39. package/dist/{WorkflowSearchRedirect-3gyHcYY2.js → WorkflowBuilder-iPqXgbYr.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-0Ai1HED-.js → WorkflowShareDialog-B_gn968c.js} +6 -52
  43. package/dist/{WorkflowsList-CJ3KmMHX.js → WorkflowsList-CA20dVIl.js} +11 -6
  44. package/dist/WorkflowsList-CcNDQge5.d.ts +6 -0
  45. package/dist/agent-form-Bfvm32j1.js +83 -0
  46. package/dist/{agentTools-B1IK1JEO.js → agentTools-CkRJB7r5.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-eewVHVuy.js → canvasNoteTools-CQIc7Oxg.js} +2 -2
  52. package/dist/client-C9XSzSXr.js +1147 -0
  53. package/dist/{codec-client-DstqyzTN.js → codec-client-CJ95Rmqo.js} +1 -1
  54. package/dist/constants-B2lhWNoN.js +202 -0
  55. package/dist/constants-XdvUxeWK.d.ts +162 -0
  56. package/dist/dialog-Cjb4lB4D.js +105 -0
  57. package/dist/executions.d.ts +1 -1
  58. package/dist/executions.js +2 -1
  59. package/dist/feature-flags-DM5myWaD.js +296 -0
  60. package/dist/flags.d.ts +3 -0
  61. package/dist/flags.js +4 -0
  62. package/dist/{flow-builder-C_3sY3pZ.js → flow-builder-y2Y1iG4Y.js} +182 -1821
  63. package/dist/{node-endpoint-configs-DHFGA5MQ.js → graphql-operation-types-kX-MMjgW.js} +1 -1194
  64. package/dist/{graphql-types-XcDLtFwU.js → graphql-types-CDKVWH2R.js} +2 -202
  65. package/dist/history.d.ts +1 -1
  66. package/dist/history.js +1 -1
  67. package/dist/index-72XFgvbn.d.ts +132 -0
  68. package/dist/index-BcdtKBM-.d.ts +56 -0
  69. package/dist/{index-B3BWqafN.d.ts → index-DjiFgEQl.d.ts} +5 -131
  70. package/dist/{index-DRf25-D3.d.ts → index-W2o__Nm6.d.ts} +32 -214
  71. package/dist/index.d.ts +13 -9
  72. package/dist/index.js +50 -5300
  73. package/dist/{node-detail-view-CAws5qjg.js → node-detail-view-B91kXzIy.js} +11 -8
  74. package/dist/node-endpoint-configs-B5bjNMDW.js +37 -0
  75. package/dist/node-registry-refresh-Dy0uRg9f.js +84 -0
  76. package/dist/nodes.d.ts +1 -1
  77. package/dist/nodes.js +1 -1
  78. package/dist/observability.d.ts +1 -1
  79. package/dist/observability.js +2 -1
  80. package/dist/{quick-config-panel-DOzNkSVV.js → quick-config-panel-DggPl1vY.js} +2 -2
  81. package/dist/rolldown-runtime-hDbaFkMy.js +18 -0
  82. package/dist/run-display-BycKYSU0.js +46 -0
  83. package/dist/run-list-links-ByYC0OlV.js +98 -0
  84. package/dist/settings.d.ts +2 -1
  85. package/dist/settings.js +2 -1
  86. package/dist/shared-CMfn30xT.js +196 -0
  87. package/dist/templates.d.ts +1 -1
  88. package/dist/templates.js +2 -1
  89. package/dist/theme-provider-B3mIuz2d.js +11 -0
  90. package/dist/{useAgentDefinitions-NFtLytDR.js → useAgentDefinitions-Dpz0HDTq.js} +2 -1
  91. package/dist/useDurableParity-CzUQMFJ3.js +415 -0
  92. package/dist/useEntityTags-DhnsZcTl.js +236 -0
  93. package/dist/{useExecutions-DkS0FTfw.js → useExecutions-9aLuOt1c.js} +4 -3
  94. package/dist/{useObservability-BkxhHZsX.js → useObservability-CfEw3ZFD.js} +2 -2
  95. package/dist/{useRunHistory-DHehG09Z.js → useRunHistory-B1xJDwl1.js} +4 -3
  96. package/dist/{useWorkflows-DyhtoVwp.js → useWorkflows-BlVVu8NM.js} +3 -2
  97. package/dist/utils-uaL5UVxb.js +65 -0
  98. package/dist/workflow-builder.d.ts +1 -1
  99. package/dist/workflow-builder.js +4 -2
  100. package/dist/workflow-host.d.ts +6 -0
  101. package/dist/workflow-host.js +9 -0
  102. package/dist/workflow-pages.d.ts +55 -0
  103. package/dist/workflow-pages.js +113 -0
  104. package/dist/workflows-list.d.ts +1 -1
  105. package/dist/workflows-list.js +1 -1
  106. package/package.json +13 -1
  107. package/dist/ExecutionDetailPage-MvsnOnE1.d.ts +0 -4
  108. package/dist/HistoryPage-BqUizaFv.d.ts +0 -3
  109. package/dist/NodesPage-C97-9K2Y.d.ts +0 -3
  110. package/dist/TemplatesPage-D0qnXzHh.d.ts +0 -4
  111. package/dist/WorkflowsList-0d5GSKdh.d.ts +0 -3
  112. 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 };
@@ -1,59 +1,13 @@
1
1
  "use client";
2
- import { Bi as describeOperationError, Nn as ShareWorkflowDocument, Oi as getFluidGridsClient, Ui as throwIfResultError, ft as ExportWorkflowCodeDocument, ui as WorkflowSharingDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
3
- import { fn as useFluidGridsAnalytics } from "./FluidGridsProvider-B9RR_CI_.js";
2
+ import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { c as emitWorkflowLimitHit, h as WORKFLOWS_QUOTA_NAME, o as emitUpgradeClicked } from "./fluidgridsEvents-CNdcrUNN.js";
6
- import { CF as WorkflowExportFormat, Fd as FidelityLevel, JF as WorkflowShareRole, hF as WorkflowAccess, nI as WorkflowVisibility, qF as WorkflowSharePrincipalType } from "./graphql-types-XcDLtFwU.js";
4
+ import { Mn as ShareWorkflowDocument, dt as ExportWorkflowCodeDocument, li as WorkflowSharingDocument } from "./graphql-operation-types-kX-MMjgW.js";
5
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-7IFSaLyi.js";
6
+ import { CF as WorkflowExportFormat, Fd as FidelityLevel, JF as WorkflowShareRole, hF as WorkflowAccess, nI as WorkflowVisibility, qF as WorkflowSharePrincipalType } from "./graphql-types-CDKVWH2R.js";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
- import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@burdenoff/fe-libs/ui";
8
+ import { jsx } from "react/jsx-runtime";
10
9
  import { ResourceShareDialog, createSharePrincipalLister } from "@burdenoff/fe-libs/connections";
11
10
 
12
- // src/components/shared/QuotaExhaustedDialog.tsx
13
- /**
14
- * Alert shown when a workflow-creating action (save/duplicate/import) is
15
- * rejected with `QUOTA_EXHAUSTED` for `fluidgrids.workflows.count`. Mirrors
16
- * the "Folder Limit Reached" dialog in microfe-files' BrowserPage.tsx, built
17
- * on the same `AlertDialog` primitives already used elsewhere in this SDK
18
- * (see card-workflow.tsx's delete-confirmation dialog).
19
- */
20
- function QuotaExhaustedDialog({ open, onOpenChange, onUpgrade, title, description, surface, limitHit = true }) {
21
- const tr = useTr();
22
- const { bus, workspaceId } = useFluidGridsAnalytics();
23
- const wasOpen = useRef(false);
24
- useEffect(() => {
25
- if (open && !wasOpen.current && limitHit) emitWorkflowLimitHit(bus, {
26
- workspaceId,
27
- surface
28
- });
29
- wasOpen.current = open;
30
- }, [
31
- open,
32
- bus,
33
- workspaceId,
34
- surface,
35
- limitHit
36
- ]);
37
- const handleUpgrade = () => {
38
- emitUpgradeClicked(bus, {
39
- workspaceId,
40
- surface: "quota-dialog",
41
- quotaKey: WORKFLOWS_QUOTA_NAME
42
- });
43
- onUpgrade();
44
- };
45
- const resolvedTitle = title ?? tr("fluidgrids.components.quotaExhaustedDialog.title", "Workflow Limit Reached");
46
- const resolvedDescription = description ?? tr("fluidgrids.components.quotaExhaustedDialog.description", "You've reached the workflow limit for your plan. Upgrade your plan to create more workflows.");
47
- return /* @__PURE__ */ jsx(AlertDialog, {
48
- open,
49
- onOpenChange,
50
- children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [/* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }), /* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })] }), /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [/* @__PURE__ */ jsx(AlertDialogCancel, { children: tr("fluidgrids.components.quotaExhaustedDialog.dismiss", "Dismiss") }), /* @__PURE__ */ jsx(AlertDialogAction, {
51
- onClick: handleUpgrade,
52
- children: tr("fluidgrids.components.quotaExhaustedDialog.viewPlans", "View plans")
53
- })] })] })
54
- });
55
- }
56
-
57
11
  // src/components/shared/CreateWorkflowRefusalDialog.tsx
58
12
  /**
59
13
  * Says why "Create Workflow" created nothing, on the page it was pressed on.
@@ -764,4 +718,4 @@ function WorkflowShareDialog({ open, onClose, workflowKey, workflowName, workspa
764
718
  });
765
719
  }
766
720
 
767
- export { readProjectArchive as C, workflowNameFromFile as D, typeScriptModuleFile as E, CreateWorkflowRefusalDialog as O, primaryImportModule as S, typeScriptImportSource as T, importFileKind as _, downloadWorkflowExport as a, lineOfNode as b, canShareWorkflow as c, MAX_IMPORT_ARCHIVE_BYTES as d, MAX_IMPORT_SOURCE_BYTES as f, importAcceptAttribute as g, fileBaseName as h, useWorkflowCodeExport as i, QuotaExhaustedDialog as k, CODE_EXPORT_FORMATS as l, checkTypeScriptImport as m, downloadWorkflowCodeExport as n, parseWorkflowImport as o, assertImportByteSize as p, useExportWorkflowAs as r, canEditWorkflow as s, WorkflowShareDialog as t, ImportSourceError as u, isLosslessReport as v, sortFidelityItems as w, orderedExportFiles as x, isLossyFidelityItem as y };
721
+ export { readProjectArchive as C, workflowNameFromFile as D, typeScriptModuleFile as E, CreateWorkflowRefusalDialog as O, primaryImportModule as S, typeScriptImportSource as T, importFileKind as _, downloadWorkflowExport as a, lineOfNode as b, canShareWorkflow as c, MAX_IMPORT_ARCHIVE_BYTES as d, MAX_IMPORT_SOURCE_BYTES as f, importAcceptAttribute as g, fileBaseName as h, useWorkflowCodeExport as i, CODE_EXPORT_FORMATS as l, checkTypeScriptImport as m, downloadWorkflowCodeExport as n, parseWorkflowImport as o, assertImportByteSize as p, useExportWorkflowAs as r, canEditWorkflow as s, WorkflowShareDialog as t, ImportSourceError as u, isLosslessReport as v, sortFidelityItems as w, orderedExportFiles as x, isLossyFidelityItem as y };
@@ -1,13 +1,18 @@
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-DyhtoVwp.js";
3
- import { Dt as createThenOpen, En as FLUIDGRIDS_FLAGS, Pn as useFluidGridsFlag, t as FluidGridsContext } from "./FluidGridsProvider-B9RR_CI_.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-0Ai1HED-.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 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, 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-B_gn968c.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-DkS0FTfw.js";
11
+ import { CF as WorkflowExportFormat, gF as WorkflowAccessFilter } from "./graphql-types-CDKVWH2R.js";
12
+ import { l as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
13
+ import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
14
+ 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";
15
+ import { a as useExecutions } from "./useExecutions-9aLuOt1c.js";
11
16
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
12
17
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
13
18
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -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 };
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ // src/modules/agent-definitions/utils/agent-form.ts
3
+ const MAX_GRANT_DAYS = 365;
4
+ const MAX_TOOL_RULES = 100;
5
+ const MAX_CONNECTIONS = 100;
6
+ var AgentFormError = class extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "AgentFormError";
10
+ }
11
+ };
12
+ function emptyAgentForm() {
13
+ return {
14
+ name: "",
15
+ description: "",
16
+ tools: [{
17
+ nodeType: "",
18
+ operations: ""
19
+ }],
20
+ connectionScope: [],
21
+ requireToolApproval: false,
22
+ status: "ACTIVE"
23
+ };
24
+ }
25
+ function agentToForm(agent) {
26
+ return {
27
+ name: agent.name,
28
+ description: agent.description ?? "",
29
+ tools: agent.toolAllowlist.length > 0 ? agent.toolAllowlist.map((rule) => ({
30
+ nodeType: rule.nodeType,
31
+ operations: rule.operations.join(", ")
32
+ })) : [{
33
+ nodeType: "",
34
+ operations: ""
35
+ }],
36
+ connectionScope: [...agent.connectionScope],
37
+ requireToolApproval: agent.requireToolApproval,
38
+ status: agent.status
39
+ };
40
+ }
41
+ function splitOperations(value) {
42
+ return [...new Set(value.split(",").map((operation) => operation.trim()).filter(Boolean))];
43
+ }
44
+ /** Validate the form and build the mutation input. Throws AgentFormError on invalid input. */
45
+ function formToInput(form) {
46
+ const name = form.name.trim();
47
+ if (name.length === 0 || name.length > 200) throw new AgentFormError("Give the agent a name of 1 to 200 characters.");
48
+ const description = form.description.trim();
49
+ if (description.length > 2e3) throw new AgentFormError("The description must be at most 2000 characters.");
50
+ const rules = form.tools.map((row) => ({
51
+ nodeType: row.nodeType.trim(),
52
+ operations: splitOperations(row.operations)
53
+ })).filter((rule) => rule.nodeType.length > 0 || rule.operations.length > 0);
54
+ if (rules.some((rule) => rule.nodeType.length === 0)) throw new AgentFormError("Every tool rule needs a node type.");
55
+ if (rules.length > 100) throw new AgentFormError(`At most ${100} tool rules.`);
56
+ const connectionScope = [...new Set(form.connectionScope.filter(Boolean))];
57
+ if (connectionScope.length > 100) throw new AgentFormError(`At most ${100} connections.`);
58
+ return {
59
+ name,
60
+ description: description || null,
61
+ toolAllowlist: rules,
62
+ connectionScope,
63
+ requireToolApproval: form.requireToolApproval,
64
+ status: form.status
65
+ };
66
+ }
67
+ /** Whole days for a grant, or an error message when out of range. */
68
+ function grantDays(value) {
69
+ const days = Number(value);
70
+ if (!Number.isInteger(days) || days < 1 || days > 365) throw new AgentFormError(`A grant lasts between 1 and ${365} days.`);
71
+ return days;
72
+ }
73
+ /** "store/slack: postMessage, listChannels" / "store/notion: any operation". */
74
+ function describeRule(rule) {
75
+ return rule.operations.length > 0 ? `${rule.nodeType}: ${rule.operations.join(", ")}` : `${rule.nodeType}: any operation`;
76
+ }
77
+ /** Whether a node type is the AI Agent node (raw types carry a `store:` prefix and an op suffix). */
78
+ function isAgentNodeType(nodeType) {
79
+ if (!nodeType) return false;
80
+ return nodeType === "store/ai-agent" || nodeType.includes("store/ai-agent");
81
+ }
82
+
83
+ export { formToInput as a, emptyAgentForm as i, agentToForm as n, grantDays as o, describeRule as r, isAgentNodeType as s, AgentFormError as t };
@@ -1,7 +1,8 @@
1
1
  "use client";
2
- import { At as useSaveStatusStore, J as paramsFromOperation, K as nodeTitle, L as createConfiguredNode, W as fixedParameterState, Y as selectedOperationOf, _ as registryNodeData, f as isNodeConfigsInitialized, o as NODE_CONFIGS, pt as autosaveAllowedFor, xt as isFlowComplete } from "./FluidGridsProvider-B9RR_CI_.js";
2
+ import { At as useSaveStatusStore, J as paramsFromOperation, K as nodeTitle, L as createConfiguredNode, W as fixedParameterState, Y as selectedOperationOf, _ as registryNodeData, f as isNodeConfigsInitialized, o as NODE_CONFIGS, pt as autosaveAllowedFor, xt as isFlowComplete } from "./FluidGridsProvider-dvZSNtSW.js";
3
3
  import { E as resolveOutputHandles, H as useFlowStore, T as resolveInputHandles } from "./node-operation-selection--oy-yEq_.js";
4
- import { Et as isNodeTypeHiddenFromPalette, N as computeAttachPosition } from "./flow-builder-C_3sY3pZ.js";
4
+ import { j as isNodeTypeHiddenFromPalette } from "./TemplateCard-DsC0KNH1.js";
5
+ import { y as computeAttachPosition } from "./flow-builder-y2Y1iG4Y.js";
5
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
6
7
  import { z } from "zod";
7
8