@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.
- package/README.md +41 -0
- package/dist/AiStudioPage-kJHSsIcj.js +774 -0
- package/dist/ApprovalInboxPage-dbBDSJ-f.js +558 -0
- package/dist/DataSinkDashboardPage-1h2QsMzH.js +270 -0
- package/dist/DataTablesPage-BZy2z0LB.js +1690 -0
- package/dist/EntityTagPicker-BqRNsLCQ.js +135 -0
- package/dist/{ExecutionDetailPage-DO38vZ_F.js → ExecutionDetailPage-BdcZmLT4.js} +799 -4420
- package/dist/ExecutionDetailPage-DvQ667OE.d.ts +10 -0
- package/dist/ExecutionsListPage-BCUJoAIE.js +2742 -0
- package/dist/{FailureTriagePanel-BHiduL7A.js → FailureTriagePanel-B9hDQymi.js} +4 -97
- package/dist/{FluidGridsProvider-B9RR_CI_.js → FluidGridsProvider-dvZSNtSW.js} +28 -350
- package/dist/HistoryPage-BLoRpJ1R.d.ts +6 -0
- package/dist/{HistoryPage-CA42pU85.js → HistoryPage-U0tqupBN.js} +6 -4
- package/dist/HumanRequestCard-D-ooVPDn.js +439 -0
- package/dist/{InsightsPage-CBoN_Mj9.js → InsightsPage-CALo16eB.js} +17 -328
- package/dist/ManagedAiPolicyAuthority-BxwJ3ptd.js +40 -0
- package/dist/{ManagedAiPolicyAuthority-CGux_DaV.d.ts → ManagedAiPolicyAuthority-DM3t3wNr.d.ts} +1 -5
- package/dist/ManagedAiPolicyAuthorityContext-CNkxIOZ1.js +10 -0
- package/dist/{MissingNodesInstallModal-Dm0nMBXM.js → MissingNodesInstallModal-CMybsI8h.js} +3 -2
- package/dist/{NodesPage-ClvhUfbh.js → NodesPage-Bf5PhfBK.js} +7 -3
- package/dist/NodesPage-DEbnz9iU.d.ts +6 -0
- package/dist/{PublishCustomNodeAction-D2F7oN0S.js → PublishCustomNodeAction-5XXnSA3H.js} +3 -45
- package/dist/QuotaExhaustedDialog-7IFSaLyi.js +54 -0
- package/dist/RunnerStatusPill-Ctg4TJcP.js +187 -0
- package/dist/RunnersPage-CLCOCclc.js +467 -0
- package/dist/{ManagedAiPolicyAuthority-CKihmbJE.js → SettingsPage-CgkRlCM5.js} +19 -50
- package/dist/SettingsPage-DMHQFj5-.d.ts +9 -0
- package/dist/TagFilterSelect-DCBOH6Ou.js +41 -0
- package/dist/TaskQueuesPage-9VgSnLdL.js +951 -0
- package/dist/TemplateCard-DsC0KNH1.js +1416 -0
- package/dist/{TemplateConfigurationModal-Bs_V-E4u.js → TemplateConfigurationModal-BhGWIzpm.js} +3 -2
- package/dist/{TemplateDetailPanel-MlT39VLG.js → TemplateDetailPanel-D4cUVr-m.js} +3 -3
- package/dist/TemplatePreview-GthzCOSo.js +231 -0
- package/dist/TemplatesPage-BG3H-6v6.d.ts +10 -0
- package/dist/{TemplatesPage-CHVpWBuw.js → TemplatesPage-CsDNT54N.js} +11 -228
- package/dist/VariablesPage-67WR_lVE.js +949 -0
- package/dist/{VersionDiffDialog-Dq2xlPFI.js → VersionDiffDialog-DSN0mU0f.js} +2 -1
- package/dist/WorkflowBuilder-DEi_9YOb.js +555 -0
- package/dist/{WorkflowSearchRedirect-3gyHcYY2.js → WorkflowBuilder-iPqXgbYr.js} +19 -585
- package/dist/{WorkflowProposalCard-8Vr56kQa.js → WorkflowProposalCard-qrEeNyYG.js} +4 -405
- package/dist/WorkflowSearchRedirect-DwDNZ_q5.js +36 -0
- package/dist/{WorkflowShareDialog-0Ai1HED-.js → WorkflowShareDialog-B_gn968c.js} +6 -52
- package/dist/{WorkflowsList-CJ3KmMHX.js → WorkflowsList-CA20dVIl.js} +11 -6
- package/dist/WorkflowsList-CcNDQge5.d.ts +6 -0
- package/dist/agent-form-Bfvm32j1.js +83 -0
- package/dist/{agentTools-B1IK1JEO.js → agentTools-CkRJB7r5.js} +3 -2
- package/dist/{ai-usage-D5p7ZeRR.js → ai-usage-glCwHyQz.js} +1 -1
- package/dist/api-BrCHB5oA.js +224 -0
- package/dist/api-C8e0iV-Q.js +55 -0
- package/dist/button-DG7y_FVJ.js +48 -0
- package/dist/{canvasNoteTools-eewVHVuy.js → canvasNoteTools-CQIc7Oxg.js} +2 -2
- package/dist/client-C9XSzSXr.js +1147 -0
- package/dist/{codec-client-DstqyzTN.js → codec-client-CJ95Rmqo.js} +1 -1
- package/dist/constants-B2lhWNoN.js +202 -0
- package/dist/constants-XdvUxeWK.d.ts +162 -0
- package/dist/dialog-Cjb4lB4D.js +105 -0
- package/dist/executions.d.ts +1 -1
- package/dist/executions.js +2 -1
- package/dist/feature-flags-DM5myWaD.js +296 -0
- package/dist/flags.d.ts +3 -0
- package/dist/flags.js +4 -0
- package/dist/{flow-builder-C_3sY3pZ.js → flow-builder-y2Y1iG4Y.js} +182 -1821
- package/dist/{node-endpoint-configs-DHFGA5MQ.js → graphql-operation-types-kX-MMjgW.js} +1 -1194
- package/dist/{graphql-types-XcDLtFwU.js → graphql-types-CDKVWH2R.js} +2 -202
- package/dist/history.d.ts +1 -1
- package/dist/history.js +1 -1
- package/dist/index-72XFgvbn.d.ts +132 -0
- package/dist/index-BcdtKBM-.d.ts +56 -0
- package/dist/{index-B3BWqafN.d.ts → index-DjiFgEQl.d.ts} +5 -131
- package/dist/{index-DRf25-D3.d.ts → index-W2o__Nm6.d.ts} +32 -214
- package/dist/index.d.ts +13 -9
- package/dist/index.js +50 -5300
- package/dist/{node-detail-view-CAws5qjg.js → node-detail-view-B91kXzIy.js} +11 -8
- package/dist/node-endpoint-configs-B5bjNMDW.js +37 -0
- package/dist/node-registry-refresh-Dy0uRg9f.js +84 -0
- package/dist/nodes.d.ts +1 -1
- package/dist/nodes.js +1 -1
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -1
- package/dist/{quick-config-panel-DOzNkSVV.js → quick-config-panel-DggPl1vY.js} +2 -2
- package/dist/rolldown-runtime-hDbaFkMy.js +18 -0
- package/dist/run-display-BycKYSU0.js +46 -0
- package/dist/run-list-links-ByYC0OlV.js +98 -0
- package/dist/settings.d.ts +2 -1
- package/dist/settings.js +2 -1
- package/dist/shared-CMfn30xT.js +196 -0
- package/dist/templates.d.ts +1 -1
- package/dist/templates.js +2 -1
- package/dist/theme-provider-B3mIuz2d.js +11 -0
- package/dist/{useAgentDefinitions-NFtLytDR.js → useAgentDefinitions-Dpz0HDTq.js} +2 -1
- package/dist/useDurableParity-CzUQMFJ3.js +415 -0
- package/dist/useEntityTags-DhnsZcTl.js +236 -0
- package/dist/{useExecutions-DkS0FTfw.js → useExecutions-9aLuOt1c.js} +4 -3
- package/dist/{useObservability-BkxhHZsX.js → useObservability-CfEw3ZFD.js} +2 -2
- package/dist/{useRunHistory-DHehG09Z.js → useRunHistory-B1xJDwl1.js} +4 -3
- package/dist/{useWorkflows-DyhtoVwp.js → useWorkflows-BlVVu8NM.js} +3 -2
- package/dist/utils-uaL5UVxb.js +65 -0
- package/dist/workflow-builder.d.ts +1 -1
- package/dist/workflow-builder.js +4 -2
- package/dist/workflow-host.d.ts +6 -0
- package/dist/workflow-host.js +9 -0
- package/dist/workflow-pages.d.ts +55 -0
- package/dist/workflow-pages.js +113 -0
- package/dist/workflows-list.d.ts +1 -1
- package/dist/workflows-list.js +1 -1
- package/package.json +13 -1
- package/dist/ExecutionDetailPage-MvsnOnE1.d.ts +0 -4
- package/dist/HistoryPage-BqUizaFv.d.ts +0 -3
- package/dist/NodesPage-C97-9K2Y.d.ts +0 -3
- package/dist/TemplatesPage-D0qnXzHh.d.ts +0 -4
- package/dist/WorkflowsList-0d5GSKdh.d.ts +0 -3
- package/dist/agent-form-BvMWhQ42.js +0 -496
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
6
|
-
import {
|
|
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
|
|
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,
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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 {
|
|
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 {
|
|
10
|
-
import {
|
|
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,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-
|
|
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 {
|
|
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
|
|