@burdenoff/fluidgrids-fe-sdk 2026.1028.4 → 2026.1028.6

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 (40) hide show
  1. package/dist/ExecutionDetailPage-DHIQNBAZ.js +20 -0
  2. package/dist/{ExecutionsListPage-XQ5FQJ4M.js → ExecutionsListPage-IMN7OTNZ.js} +7 -7
  3. package/dist/{WorkflowBuilder-2UHPYNQI.js → WorkflowBuilder-VJAAKETX.js} +10 -9
  4. package/dist/{WorkflowsList-QBKX733V.js → WorkflowsList-3EWDWWIH.js} +7 -7
  5. package/dist/chunk-3KNW5QLR.js +328 -0
  6. package/dist/{chunk-UUUDSVC7.js → chunk-3VJ3AIFS.js} +2 -2
  7. package/dist/{chunk-JBLYBD2B.js → chunk-6J4RR46J.js} +6 -1
  8. package/dist/{chunk-CSBKB5EX.js → chunk-A2JSAGNQ.js} +1 -1
  9. package/dist/{chunk-DB23N7KO.js → chunk-ACUNTZTQ.js} +3 -3
  10. package/dist/{chunk-5LKZ4PNK.js → chunk-C4AY6JI2.js} +3 -1
  11. package/dist/{chunk-H7CJXSMI.js → chunk-F6NH55LU.js} +3 -3
  12. package/dist/chunk-FDEZGRRL.js +1201 -0
  13. package/dist/{chunk-UKTLRE7N.js → chunk-FO22JCOW.js} +5 -5
  14. package/dist/{chunk-P2NRMJ7Z.js → chunk-HHN2TIK2.js} +1 -1
  15. package/dist/{chunk-LWF5J43N.js → chunk-I2ZNBBRK.js} +1 -1
  16. package/dist/{chunk-SSJIK6WS.js → chunk-IQE7ZY6Q.js} +2 -2
  17. package/dist/chunk-LOZ6XNOX.js +10550 -0
  18. package/dist/{chunk-QGXA2USP.js → chunk-MKKBEVXO.js} +1 -1
  19. package/dist/{chunk-SRZITTB2.js → chunk-NAFJQGLV.js} +4 -4
  20. package/dist/{chunk-Y6YOY33Z.js → chunk-Q22GC7RJ.js} +1 -1
  21. package/dist/{chunk-AYFKS4MM.js → chunk-QW24ZBSR.js} +1 -1
  22. package/dist/{chunk-FOEEDKBP.js → chunk-RLA4YUDY.js} +22 -1
  23. package/dist/{chunk-63BP6O6E.js → chunk-RZQPHWFV.js} +2 -2
  24. package/dist/{chunk-JH6YDVT5.js → chunk-STPQQDIJ.js} +6 -10554
  25. package/dist/{chunk-ZF55RVJ3.js → chunk-UWNYWWWG.js} +4 -4
  26. package/dist/{chunk-CPEIOFYR.js → chunk-VP2RXXRF.js} +134 -5
  27. package/dist/{chunk-JAKWVVVQ.js → chunk-VQHBQAJY.js} +15 -3
  28. package/dist/{chunk-VXLUYQDO.js → chunk-XZPXIOGE.js} +17 -3
  29. package/dist/executions.js +12 -9
  30. package/dist/history.js +4 -4
  31. package/dist/index.d.ts +355 -74
  32. package/dist/index.js +34 -31
  33. package/dist/nodes.js +2 -2
  34. package/dist/observability.js +6 -4
  35. package/dist/settings.js +5 -4
  36. package/dist/templates.js +9 -8
  37. package/dist/workflow-builder.js +11 -10
  38. package/dist/workflows-list.js +7 -7
  39. package/package.json +1 -1
  40. package/dist/ExecutionDetailPage-MYBCDBV7.js +0 -17
@@ -1,10 +1,10 @@
1
- import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard } from './chunk-JH6YDVT5.js';
2
- import { QuotaExhaustedDialog } from './chunk-P2NRMJ7Z.js';
3
- import { useWorkflowDefinitions, useDuplicateWorkflow } from './chunk-63BP6O6E.js';
1
+ import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard } from './chunk-STPQQDIJ.js';
2
+ import { QuotaExhaustedDialog } from './chunk-HHN2TIK2.js';
3
+ import { useWorkflowDefinitions, useDuplicateWorkflow } from './chunk-RZQPHWFV.js';
4
4
  import { templatesControls } from './chunk-D3UWK7GY.js';
5
5
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
6
6
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
7
- import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-5LKZ4PNK.js';
7
+ import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-C4AY6JI2.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
9
9
  import { useState, useEffect, useMemo, useCallback } from 'react';
10
10
  import { useParams, useNavigate } from 'react-router';
@@ -1,9 +1,11 @@
1
- import { buildNodeDisplayMap, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-SSJIK6WS.js';
2
- import { useExecution, useExecutionActions, useAutoRefresh } from './chunk-UUUDSVC7.js';
3
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-JAKWVVVQ.js';
4
- import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-5LKZ4PNK.js';
1
+ import { buildNodeDisplayMap, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer } from './chunk-IQE7ZY6Q.js';
2
+ import { useExecution, useExecutionActions, useAutoRefresh } from './chunk-3VJ3AIFS.js';
3
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-3KNW5QLR.js';
4
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-FDEZGRRL.js';
5
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-VQHBQAJY.js';
6
+ import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-C4AY6JI2.js';
5
7
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
6
- import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-JBLYBD2B.js';
8
+ import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-6J4RR46J.js';
7
9
  import { useTr } from './chunk-UULVIT25.js';
8
10
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
9
11
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -922,6 +924,108 @@ function RunAiAssistPanel({
922
924
  }
923
925
  );
924
926
  }
927
+ function RunFailureClusterCard({
928
+ runId,
929
+ status,
930
+ canApply,
931
+ onOpenWorkflow
932
+ }) {
933
+ const tr = useTr();
934
+ const [cluster, setCluster] = useState(null);
935
+ const proposal = useWorkflowProposal();
936
+ const { open: openProposal } = proposal;
937
+ const failed = status === "FAILED" || status === "TERMINATED";
938
+ useEffect(() => {
939
+ if (!failed) return;
940
+ let active = true;
941
+ fetchRunFailureClusters({
942
+ filter: { runId, status: OPEN_STATUSES },
943
+ limit: 1
944
+ }).then((items) => {
945
+ if (active) setCluster(items[0] ?? null);
946
+ }).catch(() => {
947
+ if (active) setCluster(null);
948
+ });
949
+ return () => {
950
+ active = false;
951
+ };
952
+ }, [failed, runId]);
953
+ const proposalId = cluster?.proposalId ?? null;
954
+ useEffect(() => {
955
+ if (proposalId) void openProposal(proposalId);
956
+ }, [openProposal, proposalId]);
957
+ const dismiss = useCallback(async () => {
958
+ if (!cluster) return;
959
+ try {
960
+ await dismissRunFailureCluster(cluster.id);
961
+ setCluster(null);
962
+ } catch (error) {
963
+ toast.error(error instanceof Error ? error.message : String(error));
964
+ }
965
+ }, [cluster]);
966
+ if (!failed || !cluster) return null;
967
+ const bucket = BUCKET_LABELS[String(cluster.bucket)];
968
+ return /* @__PURE__ */ jsxs(
969
+ "section",
970
+ {
971
+ className: "mb-6 rounded-lg border border-border-secondary bg-background-primary p-4",
972
+ "data-testid": "run-failure-cluster",
973
+ "data-bucket": String(cluster.bucket),
974
+ children: [
975
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
976
+ /* @__PURE__ */ jsx(
977
+ Icon,
978
+ {
979
+ icon: "mdi:stethoscope",
980
+ width: 18,
981
+ className: "text-text-secondary"
982
+ }
983
+ ),
984
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-primary", children: tr("fluidgrids.triage.runCardTitle", "Repeated failure") }),
985
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-background-secondary px-2 py-0.5 text-xs text-text-secondary", children: [
986
+ bucket && /* @__PURE__ */ jsx(Icon, { icon: bucket.icon, width: 14 }),
987
+ tr(
988
+ `fluidgrids.triage.bucket.${String(cluster.bucket)}`,
989
+ bucket?.label ?? String(cluster.bucket)
990
+ )
991
+ ] }),
992
+ /* @__PURE__ */ jsx(
993
+ Button$1,
994
+ {
995
+ size: "sm",
996
+ variant: "ghost",
997
+ className: "ml-auto",
998
+ onClick: () => void dismiss(),
999
+ "data-testid": "run-failure-cluster-dismiss",
1000
+ children: tr("fluidgrids.triage.dismiss", "Dismiss")
1001
+ }
1002
+ )
1003
+ ] }),
1004
+ /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-text-primary", children: cluster.advice }),
1005
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-text-secondary", children: tr(
1006
+ "fluidgrids.triage.runCardCount",
1007
+ "{{count}} failed run(s) at {{node}} since {{since}}",
1008
+ {
1009
+ count: cluster.runCount,
1010
+ node: cluster.nodeId,
1011
+ since: new Date(String(cluster.firstSeenAt)).toLocaleString()
1012
+ }
1013
+ ) }),
1014
+ proposal.proposal && /* @__PURE__ */ jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsx(
1015
+ WorkflowProposalCard,
1016
+ {
1017
+ proposal: proposal.proposal,
1018
+ isDeciding: proposal.isDeciding,
1019
+ onOpenWorkflow,
1020
+ ...canApply ? { onApply: () => void proposal.apply() } : {},
1021
+ onReject: () => void proposal.reject(),
1022
+ onCancel: () => void proposal.cancel()
1023
+ }
1024
+ ) })
1025
+ ]
1026
+ }
1027
+ );
1028
+ }
925
1029
  function ExecutionDetailPage() {
926
1030
  const tr = useTr();
927
1031
  const { runId } = useParams();
@@ -952,6 +1056,9 @@ function ExecutionDetailPage() {
952
1056
  } = useRunHumanRequests(runId, {
953
1057
  pollIntervalMs: runCanChange ? 1e4 : 0
954
1058
  });
1059
+ const { decisions: policyDecisions, decide: decidePolicyApproval } = useRunPolicyDecisions(runId, {
1060
+ pollIntervalMs: runCanChange ? 1e4 : 0
1061
+ });
955
1062
  const awaitingPerson = humanRequests.some(
956
1063
  (request) => request.status === "PENDING"
957
1064
  );
@@ -1534,9 +1641,31 @@ function ExecutionDetailPage() {
1534
1641
  )
1535
1642
  }
1536
1643
  ),
1644
+ /* @__PURE__ */ jsx(
1645
+ RunFailureClusterCard,
1646
+ {
1647
+ runId: execution.id,
1648
+ status: execution.status,
1649
+ canApply: canApplyFix,
1650
+ onOpenWorkflow: (workflowKey, version) => navigate(
1651
+ `../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`
1652
+ )
1653
+ }
1654
+ ),
1537
1655
  /* @__PURE__ */ jsx(RunQueuedBanner, { status: execution.status, context: execution.context }),
1538
1656
  /* @__PURE__ */ jsx(RunDataPrunedNotice, { dataPrunedAt: execution.dataPrunedAt }),
1539
1657
  /* @__PURE__ */ jsx(RunHumanRequests, { requests: humanRequests }),
1658
+ /* @__PURE__ */ jsx(
1659
+ RunPolicyDecisions,
1660
+ {
1661
+ decisions: policyDecisions,
1662
+ waiting: execution.status === "WAITING",
1663
+ onDecide: async (id, approve) => {
1664
+ await decidePolicyApproval(id, approve);
1665
+ await Promise.all([refetch(), refetchHumanRequests()]);
1666
+ }
1667
+ }
1668
+ ),
1540
1669
  /* @__PURE__ */ jsx("div", { className: "border-b border-border-secondary mb-6", children: /* @__PURE__ */ jsx("nav", { className: "flex gap-4 -mb-px", children: tabs.map((tab) => /* @__PURE__ */ jsxs(
1541
1670
  "button",
1542
1671
  {
@@ -1,7 +1,7 @@
1
- import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-QGXA2USP.js';
2
- import { throwIfResultError } from './chunk-5LKZ4PNK.js';
1
+ import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-MKKBEVXO.js';
2
+ import { throwIfResultError } from './chunk-C4AY6JI2.js';
3
3
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
4
- import { WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument } from './chunk-JBLYBD2B.js';
4
+ import { WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument } from './chunk-6J4RR46J.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
6
6
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
7
7
  import { useState, useRef, useEffect, useCallback } from 'react';
@@ -257,6 +257,17 @@ function useWorkflowProposal() {
257
257
  },
258
258
  [clearTimer, poll]
259
259
  );
260
+ const open = useCallback(
261
+ async (id) => {
262
+ const run = ++runRef.current;
263
+ clearTimer();
264
+ setError(null);
265
+ setTimedOut(false);
266
+ setIsWorking(true);
267
+ await poll(run, id, Date.now());
268
+ },
269
+ [clearTimer, poll]
270
+ );
260
271
  const decide = useCallback(
261
272
  async (action) => {
262
273
  const id = proposal?.id;
@@ -310,6 +321,7 @@ function useWorkflowProposal() {
310
321
  error,
311
322
  timedOut,
312
323
  start,
324
+ open,
313
325
  apply,
314
326
  reject,
315
327
  cancel,
@@ -1,7 +1,8 @@
1
- import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, LogStreamingTab } from './chunk-LWF5J43N.js';
1
+ import { ActionPoliciesTab } from './chunk-FDEZGRRL.js';
2
+ import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, LogStreamingTab } from './chunk-I2ZNBBRK.js';
2
3
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
3
- import { useFlowStore, useSaveStatusStore, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, throwIfResultError } from './chunk-5LKZ4PNK.js';
4
- import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery } from './chunk-JBLYBD2B.js';
4
+ import { useFlowStore, useSaveStatusStore, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, throwIfResultError } from './chunk-C4AY6JI2.js';
5
+ import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery } from './chunk-6J4RR46J.js';
5
6
  import { useTr } from './chunk-UULVIT25.js';
6
7
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
7
8
  import { useState, useMemo, useEffect, useCallback } from 'react';
@@ -1240,6 +1241,18 @@ function SettingsPage({
1240
1241
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:database-clock-outline", width: 16 }),
1241
1242
  tr("fluidgrids.settings.page.runDataTab", "Run data")
1242
1243
  ] }),
1244
+ /* @__PURE__ */ jsxs(
1245
+ TabsTrigger,
1246
+ {
1247
+ value: "policies",
1248
+ className: "gap-1.5",
1249
+ "data-tour": "fluidgrids-settings-policies-tab",
1250
+ children: [
1251
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:shield-check-outline", width: 16 }),
1252
+ tr("fluidgrids.settings.page.policiesTab", "Policies")
1253
+ ]
1254
+ }
1255
+ ),
1243
1256
  /* @__PURE__ */ jsxs(TabsTrigger, { value: "notifications", className: "gap-1.5", children: [
1244
1257
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:bell-outline", width: 16 }),
1245
1258
  tr("fluidgrids.settings.page.notificationsTab", "Notifications")
@@ -1266,6 +1279,7 @@ function SettingsPage({
1266
1279
  /* @__PURE__ */ jsx(TabsContent, { value: "general", children: /* @__PURE__ */ jsx(GeneralTab, {}) }),
1267
1280
  /* @__PURE__ */ jsx(TabsContent, { value: "execution", children: /* @__PURE__ */ jsx(ExecutionTab, { workflowKey }) }),
1268
1281
  /* @__PURE__ */ jsx(TabsContent, { value: "run-data", children: /* @__PURE__ */ jsx(RunDataTab, {}) }),
1282
+ /* @__PURE__ */ jsx(TabsContent, { value: "policies", children: /* @__PURE__ */ jsx(ActionPoliciesTab, {}) }),
1269
1283
  /* @__PURE__ */ jsx(TabsContent, { value: "notifications", children: /* @__PURE__ */ jsx(NotificationsTab, {}) }),
1270
1284
  logStreamsEnabled ? /* @__PURE__ */ jsx(TabsContent, { value: "log-streaming", children: /* @__PURE__ */ jsx(LogStreamingTab, {}) }) : null,
1271
1285
  /* @__PURE__ */ jsx(TabsContent, { value: "api", children: /* @__PURE__ */ jsx(ApiTab, {}) })
@@ -1,21 +1,24 @@
1
1
  import './chunk-AD3BXTJS.js';
2
- export { ExecutionsListPage } from './chunk-H7CJXSMI.js';
3
- export { ExecutionDetailPage } from './chunk-CPEIOFYR.js';
4
- import './chunk-SSJIK6WS.js';
5
- import './chunk-UUUDSVC7.js';
2
+ export { ExecutionsListPage } from './chunk-F6NH55LU.js';
3
+ export { ExecutionDetailPage } from './chunk-VP2RXXRF.js';
4
+ import './chunk-IQE7ZY6Q.js';
5
+ import './chunk-3VJ3AIFS.js';
6
+ import './chunk-3KNW5QLR.js';
7
+ import './chunk-FDEZGRRL.js';
6
8
  import './chunk-5ERAJC2I.js';
7
- import './chunk-JAKWVVVQ.js';
8
- import './chunk-QGXA2USP.js';
9
- import './chunk-63BP6O6E.js';
9
+ import './chunk-VQHBQAJY.js';
10
+ import './chunk-MKKBEVXO.js';
11
+ import './chunk-RZQPHWFV.js';
10
12
  import './chunk-D3UWK7GY.js';
11
13
  import './chunk-PJAWNFJV.js';
14
+ import './chunk-LOZ6XNOX.js';
12
15
  import './chunk-4VJ3MDOV.js';
13
- import './chunk-5LKZ4PNK.js';
16
+ import './chunk-C4AY6JI2.js';
14
17
  import './chunk-JL7CASN5.js';
15
18
  import './chunk-PXIFUMLA.js';
16
19
  import './chunk-CY6KX4RG.js';
17
20
  import './chunk-WBH2XEWO.js';
18
- import './chunk-JBLYBD2B.js';
21
+ import './chunk-6J4RR46J.js';
19
22
  import './chunk-UULVIT25.js';
20
23
  import './chunk-NTWG3CJX.js';
21
24
  import './chunk-62GWEYJ5.js';
package/dist/history.js CHANGED
@@ -1,14 +1,14 @@
1
- export { HistoryPage } from './chunk-Y6YOY33Z.js';
2
- import './chunk-63BP6O6E.js';
1
+ export { HistoryPage } from './chunk-Q22GC7RJ.js';
2
+ import './chunk-RZQPHWFV.js';
3
3
  import './chunk-D3UWK7GY.js';
4
4
  import './chunk-PJAWNFJV.js';
5
5
  import './chunk-4VJ3MDOV.js';
6
- import './chunk-5LKZ4PNK.js';
6
+ import './chunk-C4AY6JI2.js';
7
7
  import './chunk-JL7CASN5.js';
8
8
  import './chunk-PXIFUMLA.js';
9
9
  import './chunk-CY6KX4RG.js';
10
10
  import './chunk-WBH2XEWO.js';
11
- import './chunk-JBLYBD2B.js';
11
+ import './chunk-6J4RR46J.js';
12
12
  import './chunk-UULVIT25.js';
13
13
  import './chunk-NTWG3CJX.js';
14
14
  import './chunk-62GWEYJ5.js';