@burdenoff/fluidgrids-fe-sdk 2026.922.11 → 2026.922.13
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/dist/index.d.ts +71 -1
- package/dist/index.js +420 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -42,7 +42,7 @@ import { Icon } from '@iconify/react';
|
|
|
42
42
|
import { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';
|
|
43
43
|
import '@xyflow/react/dist/style.css';
|
|
44
44
|
import { Button } from '@burdenoff/fe-libs/button';
|
|
45
|
-
import { Tabs, TabsList, TabsTrigger, TabsContent, Card, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Badge, CardHeader, Label, Input, Switch, Dialog, DialogContent, DialogHeader, DialogTitle, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DialogFooter } from '@burdenoff/fe-libs/ui';
|
|
45
|
+
import { Tabs, TabsList, TabsTrigger, TabsContent, Card, CardContent, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Badge, CardHeader, Label, Input, Switch, Dialog, DialogContent, DialogHeader, DialogTitle, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DialogFooter, Textarea } from '@burdenoff/fe-libs/ui';
|
|
46
46
|
import { toast } from 'sonner';
|
|
47
47
|
import { gql } from '@apollo/client';
|
|
48
48
|
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
@@ -1010,17 +1010,24 @@ function ExternalProvidersTab() {
|
|
|
1010
1010
|
const { saveConfig, loading: saving } = useSaveSecretsProviderConfig();
|
|
1011
1011
|
const { testConnection, loading: testing } = useTestSecretsProviderConnection();
|
|
1012
1012
|
const awsConfig = configs.find((c) => c.provider === "AWS_SECRETS_MANAGER");
|
|
1013
|
-
const [prefix, setPrefix] = useState(
|
|
1014
|
-
|
|
1015
|
-
);
|
|
1016
|
-
const [
|
|
1017
|
-
const [
|
|
1018
|
-
|
|
1019
|
-
awsConfig
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1013
|
+
const [prefix, setPrefix] = useState("");
|
|
1014
|
+
const [region, setRegion] = useState("ap-south-1");
|
|
1015
|
+
const [enabled, setEnabled] = useState(false);
|
|
1016
|
+
const [lastTest, setLastTest] = useState(null);
|
|
1017
|
+
const [hydratedConfigId, setHydratedConfigId] = useState(null);
|
|
1018
|
+
useEffect(() => {
|
|
1019
|
+
if (!awsConfig || awsConfig.id === hydratedConfigId) return;
|
|
1020
|
+
setPrefix(awsConfig.awsSecretsManagerPrefix ?? "");
|
|
1021
|
+
setRegion(awsConfig.awsRegion ?? "ap-south-1");
|
|
1022
|
+
setEnabled(awsConfig.isEnabled);
|
|
1023
|
+
setLastTest(
|
|
1024
|
+
awsConfig.lastTestStatus ? {
|
|
1025
|
+
success: awsConfig.lastTestStatus === "SUCCESS",
|
|
1026
|
+
message: awsConfig.lastTestMessage ?? ""
|
|
1027
|
+
} : null
|
|
1028
|
+
);
|
|
1029
|
+
setHydratedConfigId(awsConfig.id);
|
|
1030
|
+
}, [awsConfig, hydratedConfigId]);
|
|
1024
1031
|
const handleSave = useCallback(async () => {
|
|
1025
1032
|
try {
|
|
1026
1033
|
await saveConfig({
|
|
@@ -1173,6 +1180,404 @@ function VariablesPage() {
|
|
|
1173
1180
|
] })
|
|
1174
1181
|
] });
|
|
1175
1182
|
}
|
|
1183
|
+
var TOOL_APPROVAL_FIELDS = gql`
|
|
1184
|
+
fragment ToolApprovalRequestFields on ToolApprovalRequest {
|
|
1185
|
+
id
|
|
1186
|
+
runId
|
|
1187
|
+
nodeId
|
|
1188
|
+
workflowId
|
|
1189
|
+
workflowKey
|
|
1190
|
+
status
|
|
1191
|
+
toolCalls {
|
|
1192
|
+
callId
|
|
1193
|
+
name
|
|
1194
|
+
argsJson
|
|
1195
|
+
}
|
|
1196
|
+
decisions {
|
|
1197
|
+
callId
|
|
1198
|
+
decision
|
|
1199
|
+
reason
|
|
1200
|
+
}
|
|
1201
|
+
timeoutAt
|
|
1202
|
+
timeoutAction
|
|
1203
|
+
requestedAt
|
|
1204
|
+
decidedAt
|
|
1205
|
+
decidedBy
|
|
1206
|
+
}
|
|
1207
|
+
`;
|
|
1208
|
+
var GET_PENDING_TOOL_APPROVALS = gql`
|
|
1209
|
+
${TOOL_APPROVAL_FIELDS}
|
|
1210
|
+
query GetPendingToolApprovals($limit: Int, $offset: Int) {
|
|
1211
|
+
pendingToolApprovals(limit: $limit, offset: $offset) {
|
|
1212
|
+
totalCount
|
|
1213
|
+
items {
|
|
1214
|
+
...ToolApprovalRequestFields
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
`;
|
|
1219
|
+
var DECIDE_TOOL_APPROVAL = gql`
|
|
1220
|
+
${TOOL_APPROVAL_FIELDS}
|
|
1221
|
+
mutation DecideToolApproval(
|
|
1222
|
+
$id: ID!
|
|
1223
|
+
$decisions: [ToolApprovalDecisionInput!]!
|
|
1224
|
+
) {
|
|
1225
|
+
decideToolApproval(id: $id, decisions: $decisions) {
|
|
1226
|
+
success
|
|
1227
|
+
error
|
|
1228
|
+
resumedFromNodeId
|
|
1229
|
+
request {
|
|
1230
|
+
...ToolApprovalRequestFields
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
`;
|
|
1235
|
+
function usePendingToolApprovals(options) {
|
|
1236
|
+
const limit = options?.limit ?? 50;
|
|
1237
|
+
const offset = options?.offset ?? 0;
|
|
1238
|
+
const pollIntervalMs = options?.pollIntervalMs ?? 15e3;
|
|
1239
|
+
const [items, setItems] = useState([]);
|
|
1240
|
+
const [totalCount, setTotalCount] = useState(0);
|
|
1241
|
+
const [loading, setLoading] = useState(true);
|
|
1242
|
+
const [error, setError] = useState(null);
|
|
1243
|
+
const fetchData = useCallback(async () => {
|
|
1244
|
+
setError(null);
|
|
1245
|
+
try {
|
|
1246
|
+
const client = getFluidGridsClient();
|
|
1247
|
+
const result = await client.query({
|
|
1248
|
+
query: GET_PENDING_TOOL_APPROVALS,
|
|
1249
|
+
variables: { limit, offset },
|
|
1250
|
+
fetchPolicy: "network-only"
|
|
1251
|
+
});
|
|
1252
|
+
setItems(result.data?.pendingToolApprovals?.items ?? []);
|
|
1253
|
+
setTotalCount(result.data?.pendingToolApprovals?.totalCount ?? 0);
|
|
1254
|
+
} catch (err) {
|
|
1255
|
+
setError(err);
|
|
1256
|
+
} finally {
|
|
1257
|
+
setLoading(false);
|
|
1258
|
+
}
|
|
1259
|
+
}, [limit, offset]);
|
|
1260
|
+
useEffect(() => {
|
|
1261
|
+
fetchData();
|
|
1262
|
+
if (pollIntervalMs <= 0) return;
|
|
1263
|
+
const interval = setInterval(fetchData, pollIntervalMs);
|
|
1264
|
+
return () => clearInterval(interval);
|
|
1265
|
+
}, [fetchData, pollIntervalMs]);
|
|
1266
|
+
return { items, totalCount, loading, error, refetch: fetchData };
|
|
1267
|
+
}
|
|
1268
|
+
function useDecideToolApproval() {
|
|
1269
|
+
const [loading, setLoading] = useState(false);
|
|
1270
|
+
const [error, setError] = useState(null);
|
|
1271
|
+
const decide = useCallback(
|
|
1272
|
+
async (id, decisions) => {
|
|
1273
|
+
setLoading(true);
|
|
1274
|
+
setError(null);
|
|
1275
|
+
try {
|
|
1276
|
+
const client = getFluidGridsClient();
|
|
1277
|
+
const result = throwIfResultError(
|
|
1278
|
+
await client.mutate({
|
|
1279
|
+
mutation: DECIDE_TOOL_APPROVAL,
|
|
1280
|
+
variables: { id, decisions }
|
|
1281
|
+
})
|
|
1282
|
+
);
|
|
1283
|
+
const response = result.data?.decideToolApproval;
|
|
1284
|
+
if (!response?.success) {
|
|
1285
|
+
throw new Error(response?.error ?? "Failed to record the decision");
|
|
1286
|
+
}
|
|
1287
|
+
return response;
|
|
1288
|
+
} catch (err) {
|
|
1289
|
+
setError(err);
|
|
1290
|
+
throw err;
|
|
1291
|
+
} finally {
|
|
1292
|
+
setLoading(false);
|
|
1293
|
+
}
|
|
1294
|
+
},
|
|
1295
|
+
[]
|
|
1296
|
+
);
|
|
1297
|
+
const decideAll = useCallback(
|
|
1298
|
+
async (request, decision, reason) => {
|
|
1299
|
+
return decide(
|
|
1300
|
+
request.id,
|
|
1301
|
+
request.toolCalls.map((call) => ({
|
|
1302
|
+
callId: call.callId,
|
|
1303
|
+
decision,
|
|
1304
|
+
reason
|
|
1305
|
+
}))
|
|
1306
|
+
);
|
|
1307
|
+
},
|
|
1308
|
+
[decide]
|
|
1309
|
+
);
|
|
1310
|
+
return { decide, decideAll, loading, error };
|
|
1311
|
+
}
|
|
1312
|
+
function formatArgs(argsJson) {
|
|
1313
|
+
try {
|
|
1314
|
+
return JSON.stringify(JSON.parse(argsJson), null, 2);
|
|
1315
|
+
} catch {
|
|
1316
|
+
return argsJson;
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
function timeAgo(iso, tr) {
|
|
1320
|
+
const then = new Date(iso).getTime();
|
|
1321
|
+
const diffMs = Date.now() - then;
|
|
1322
|
+
const minutes = Math.floor(diffMs / 6e4);
|
|
1323
|
+
if (minutes < 1) return tr("fluidgrids.toolApproval.justNow", "just now");
|
|
1324
|
+
if (minutes < 60)
|
|
1325
|
+
return tr("fluidgrids.toolApproval.minutesAgo", "{{minutes}}m ago", {
|
|
1326
|
+
minutes
|
|
1327
|
+
});
|
|
1328
|
+
const hours = Math.floor(minutes / 60);
|
|
1329
|
+
if (hours < 24)
|
|
1330
|
+
return tr("fluidgrids.toolApproval.hoursAgo", "{{hours}}h ago", { hours });
|
|
1331
|
+
const days = Math.floor(hours / 24);
|
|
1332
|
+
return tr("fluidgrids.toolApproval.daysAgo", "{{days}}d ago", { days });
|
|
1333
|
+
}
|
|
1334
|
+
function RejectDialog({
|
|
1335
|
+
open,
|
|
1336
|
+
onOpenChange,
|
|
1337
|
+
onConfirm,
|
|
1338
|
+
submitting
|
|
1339
|
+
}) {
|
|
1340
|
+
const tr = useTr();
|
|
1341
|
+
const [reason, setReason] = useState("");
|
|
1342
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { children: [
|
|
1343
|
+
/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: tr(
|
|
1344
|
+
"fluidgrids.toolApproval.rejectDialogTitle",
|
|
1345
|
+
"Reject tool call"
|
|
1346
|
+
) }) }),
|
|
1347
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
1348
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "reject-reason", children: tr(
|
|
1349
|
+
"fluidgrids.toolApproval.rejectReasonLabel",
|
|
1350
|
+
"Reason (optional)"
|
|
1351
|
+
) }),
|
|
1352
|
+
/* @__PURE__ */ jsx(
|
|
1353
|
+
Textarea,
|
|
1354
|
+
{
|
|
1355
|
+
id: "reject-reason",
|
|
1356
|
+
value: reason,
|
|
1357
|
+
onChange: (e) => setReason(e.target.value),
|
|
1358
|
+
placeholder: tr(
|
|
1359
|
+
"fluidgrids.toolApproval.rejectReasonPlaceholder",
|
|
1360
|
+
"Why is this call being rejected? The agent sees this."
|
|
1361
|
+
)
|
|
1362
|
+
}
|
|
1363
|
+
)
|
|
1364
|
+
] }),
|
|
1365
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
1366
|
+
/* @__PURE__ */ jsx(
|
|
1367
|
+
Button,
|
|
1368
|
+
{
|
|
1369
|
+
variant: "outline",
|
|
1370
|
+
onClick: () => onOpenChange(false),
|
|
1371
|
+
disabled: submitting,
|
|
1372
|
+
children: tr("fluidgrids.toolApproval.cancel", "Cancel")
|
|
1373
|
+
}
|
|
1374
|
+
),
|
|
1375
|
+
/* @__PURE__ */ jsx(
|
|
1376
|
+
Button,
|
|
1377
|
+
{
|
|
1378
|
+
variant: "destructive",
|
|
1379
|
+
onClick: () => onConfirm(reason),
|
|
1380
|
+
disabled: submitting,
|
|
1381
|
+
children: submitting ? tr("fluidgrids.toolApproval.rejecting", "Rejecting\u2026") : tr("fluidgrids.toolApproval.rejectConfirm", "Reject")
|
|
1382
|
+
}
|
|
1383
|
+
)
|
|
1384
|
+
] })
|
|
1385
|
+
] }) });
|
|
1386
|
+
}
|
|
1387
|
+
function RequestCard({ request, onDecided }) {
|
|
1388
|
+
const tr = useTr();
|
|
1389
|
+
const { decideAll, loading } = useDecideToolApproval();
|
|
1390
|
+
const [showReject, setShowReject] = useState(false);
|
|
1391
|
+
const handleDecide = async (decision, reason) => {
|
|
1392
|
+
try {
|
|
1393
|
+
await decideAll(request, decision, reason);
|
|
1394
|
+
toast.success(
|
|
1395
|
+
decision === "APPROVED" ? tr(
|
|
1396
|
+
"fluidgrids.toolApproval.approvedToast",
|
|
1397
|
+
"Tool call approved \u2014 run resumed"
|
|
1398
|
+
) : tr(
|
|
1399
|
+
"fluidgrids.toolApproval.rejectedToast",
|
|
1400
|
+
"Tool call rejected \u2014 run resumed"
|
|
1401
|
+
)
|
|
1402
|
+
);
|
|
1403
|
+
setShowReject(false);
|
|
1404
|
+
onDecided();
|
|
1405
|
+
} catch (err) {
|
|
1406
|
+
toast.error(
|
|
1407
|
+
err instanceof Error ? err.message : tr(
|
|
1408
|
+
"fluidgrids.toolApproval.decisionFailed",
|
|
1409
|
+
"Failed to record the decision"
|
|
1410
|
+
)
|
|
1411
|
+
);
|
|
1412
|
+
}
|
|
1413
|
+
};
|
|
1414
|
+
return /* @__PURE__ */ jsxs(
|
|
1415
|
+
Card,
|
|
1416
|
+
{
|
|
1417
|
+
className: "border border-border-secondary bg-background-secondary",
|
|
1418
|
+
"data-testid": "tool-approval-card",
|
|
1419
|
+
"data-request-id": request.id,
|
|
1420
|
+
children: [
|
|
1421
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "pb-3", children: [
|
|
1422
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
1423
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1424
|
+
/* @__PURE__ */ jsx(
|
|
1425
|
+
Icon,
|
|
1426
|
+
{
|
|
1427
|
+
icon: "mdi:robot-outline",
|
|
1428
|
+
width: 18,
|
|
1429
|
+
className: "text-text-secondary"
|
|
1430
|
+
}
|
|
1431
|
+
),
|
|
1432
|
+
/* @__PURE__ */ jsxs("span", { className: "text-sm font-semibold text-text-primary", children: [
|
|
1433
|
+
tr("fluidgrids.toolApproval.nodeLabel", "Node"),
|
|
1434
|
+
":",
|
|
1435
|
+
" ",
|
|
1436
|
+
request.nodeId
|
|
1437
|
+
] })
|
|
1438
|
+
] }),
|
|
1439
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", className: "font-mono text-[10px]", children: request.workflowKey })
|
|
1440
|
+
] }),
|
|
1441
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-text-secondary", children: [
|
|
1442
|
+
tr("fluidgrids.toolApproval.requestedAt", "Requested {{when}}", {
|
|
1443
|
+
when: timeAgo(request.requestedAt, tr)
|
|
1444
|
+
}),
|
|
1445
|
+
request.timeoutAt && ` \xB7 ${tr(
|
|
1446
|
+
"fluidgrids.toolApproval.autoResolvesAt",
|
|
1447
|
+
"auto-resolves at {{time}}",
|
|
1448
|
+
{
|
|
1449
|
+
time: new Date(request.timeoutAt).toLocaleString()
|
|
1450
|
+
}
|
|
1451
|
+
)}`
|
|
1452
|
+
] })
|
|
1453
|
+
] }),
|
|
1454
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-3", children: [
|
|
1455
|
+
request.toolCalls.map((call) => /* @__PURE__ */ jsxs(
|
|
1456
|
+
"div",
|
|
1457
|
+
{
|
|
1458
|
+
className: "rounded-md border border-border-secondary bg-background-primary p-3",
|
|
1459
|
+
children: [
|
|
1460
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center gap-2", children: [
|
|
1461
|
+
/* @__PURE__ */ jsx(
|
|
1462
|
+
Icon,
|
|
1463
|
+
{
|
|
1464
|
+
icon: "mdi:function-variant",
|
|
1465
|
+
width: 14,
|
|
1466
|
+
className: "text-text-secondary"
|
|
1467
|
+
}
|
|
1468
|
+
),
|
|
1469
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-primary", children: call.name })
|
|
1470
|
+
] }),
|
|
1471
|
+
/* @__PURE__ */ jsx("pre", { className: "overflow-x-auto whitespace-pre-wrap break-all text-xs text-text-secondary", children: formatArgs(call.argsJson) })
|
|
1472
|
+
]
|
|
1473
|
+
},
|
|
1474
|
+
call.callId
|
|
1475
|
+
)),
|
|
1476
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 pt-1", children: [
|
|
1477
|
+
/* @__PURE__ */ jsxs(
|
|
1478
|
+
Button,
|
|
1479
|
+
{
|
|
1480
|
+
size: "sm",
|
|
1481
|
+
disabled: loading,
|
|
1482
|
+
onClick: () => handleDecide("APPROVED"),
|
|
1483
|
+
"data-testid": "tool-approval-approve",
|
|
1484
|
+
children: [
|
|
1485
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:check", className: "mr-1.5", width: 16 }),
|
|
1486
|
+
tr("fluidgrids.toolApproval.approve", "Approve")
|
|
1487
|
+
]
|
|
1488
|
+
}
|
|
1489
|
+
),
|
|
1490
|
+
/* @__PURE__ */ jsxs(
|
|
1491
|
+
Button,
|
|
1492
|
+
{
|
|
1493
|
+
size: "sm",
|
|
1494
|
+
variant: "destructive",
|
|
1495
|
+
disabled: loading,
|
|
1496
|
+
onClick: () => setShowReject(true),
|
|
1497
|
+
"data-testid": "tool-approval-reject",
|
|
1498
|
+
children: [
|
|
1499
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:close", className: "mr-1.5", width: 16 }),
|
|
1500
|
+
tr("fluidgrids.toolApproval.reject", "Reject")
|
|
1501
|
+
]
|
|
1502
|
+
}
|
|
1503
|
+
)
|
|
1504
|
+
] })
|
|
1505
|
+
] }),
|
|
1506
|
+
/* @__PURE__ */ jsx(
|
|
1507
|
+
RejectDialog,
|
|
1508
|
+
{
|
|
1509
|
+
open: showReject,
|
|
1510
|
+
onOpenChange: setShowReject,
|
|
1511
|
+
submitting: loading,
|
|
1512
|
+
onConfirm: (reason) => handleDecide("REJECTED", reason || void 0)
|
|
1513
|
+
}
|
|
1514
|
+
)
|
|
1515
|
+
]
|
|
1516
|
+
}
|
|
1517
|
+
);
|
|
1518
|
+
}
|
|
1519
|
+
function ApprovalInboxPage() {
|
|
1520
|
+
const tr = useTr();
|
|
1521
|
+
const navigate = useNavigate();
|
|
1522
|
+
const { items, totalCount, loading, error, refetch } = usePendingToolApprovals();
|
|
1523
|
+
return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
|
|
1524
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6", children: [
|
|
1525
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1526
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: tr("fluidgrids.toolApproval.pageTitle", "Tool Approvals") }),
|
|
1527
|
+
/* @__PURE__ */ jsx("p", { className: "text-text-secondary mt-1", children: tr(
|
|
1528
|
+
"fluidgrids.toolApproval.pageSubtitle",
|
|
1529
|
+
"AI Agent tool calls waiting for a human decision before they run"
|
|
1530
|
+
) })
|
|
1531
|
+
] }),
|
|
1532
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../runs"), children: [
|
|
1533
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:arrow-left", className: "mr-2", width: 16 }),
|
|
1534
|
+
tr("fluidgrids.toolApproval.backToRuns", "Back to Runs")
|
|
1535
|
+
] })
|
|
1536
|
+
] }),
|
|
1537
|
+
loading && items.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-text-secondary text-sm", children: tr("fluidgrids.toolApproval.loading", "Loading\u2026") }),
|
|
1538
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", role: "alert", children: tr(
|
|
1539
|
+
"fluidgrids.toolApproval.loadFailed",
|
|
1540
|
+
"Failed to load pending approvals: {{message}}",
|
|
1541
|
+
{
|
|
1542
|
+
message: error.message
|
|
1543
|
+
}
|
|
1544
|
+
) }),
|
|
1545
|
+
!loading && !error && items.length === 0 && /* @__PURE__ */ jsx(Card, { className: "border border-border-secondary bg-background-secondary", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col items-center gap-2 py-10 text-center", children: [
|
|
1546
|
+
/* @__PURE__ */ jsx(
|
|
1547
|
+
Icon,
|
|
1548
|
+
{
|
|
1549
|
+
icon: "mdi:shield-check-outline",
|
|
1550
|
+
width: 32,
|
|
1551
|
+
className: "text-text-secondary"
|
|
1552
|
+
}
|
|
1553
|
+
),
|
|
1554
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-text-primary", children: tr(
|
|
1555
|
+
"fluidgrids.toolApproval.emptyTitle",
|
|
1556
|
+
"Nothing waiting for approval"
|
|
1557
|
+
) }),
|
|
1558
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: tr(
|
|
1559
|
+
"fluidgrids.toolApproval.emptySubtitle",
|
|
1560
|
+
"Runs will appear here when an AI Agent with tool approval enabled proposes a tool call."
|
|
1561
|
+
) })
|
|
1562
|
+
] }) }),
|
|
1563
|
+
items.length > 0 && /* @__PURE__ */ jsx(
|
|
1564
|
+
"div",
|
|
1565
|
+
{
|
|
1566
|
+
className: "mb-3 text-xs text-text-secondary",
|
|
1567
|
+
"data-testid": "tool-approval-count",
|
|
1568
|
+
children: tr(
|
|
1569
|
+
"fluidgrids.toolApproval.count",
|
|
1570
|
+
"{{count}} pending ({{total}} total)",
|
|
1571
|
+
{
|
|
1572
|
+
count: items.length,
|
|
1573
|
+
total: totalCount
|
|
1574
|
+
}
|
|
1575
|
+
)
|
|
1576
|
+
}
|
|
1577
|
+
),
|
|
1578
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: items.map((request) => /* @__PURE__ */ jsx(RequestCard, { request, onDecided: refetch }, request.id)) })
|
|
1579
|
+
] });
|
|
1580
|
+
}
|
|
1176
1581
|
|
|
1177
1582
|
// src/graphql/client-helpers.ts
|
|
1178
1583
|
function createFluidGridsClients(config2) {
|
|
@@ -1236,7 +1641,7 @@ var NODE_STATUS_CONFIG = {
|
|
|
1236
1641
|
error: { label: "Error", color: "text-red-600", bgColor: "bg-red-100" },
|
|
1237
1642
|
skipped: { label: "Skipped", color: "text-gray-400", bgColor: "bg-gray-50" }
|
|
1238
1643
|
};
|
|
1239
|
-
var
|
|
1644
|
+
var Textarea2 = React4.forwardRef(
|
|
1240
1645
|
({ className, ...props }, ref) => {
|
|
1241
1646
|
return /* @__PURE__ */ jsx(
|
|
1242
1647
|
"textarea",
|
|
@@ -1251,7 +1656,7 @@ var Textarea = React4.forwardRef(
|
|
|
1251
1656
|
);
|
|
1252
1657
|
}
|
|
1253
1658
|
);
|
|
1254
|
-
|
|
1659
|
+
Textarea2.displayName = "Textarea";
|
|
1255
1660
|
function Tabs2({
|
|
1256
1661
|
className,
|
|
1257
1662
|
...props
|
|
@@ -1672,6 +2077,6 @@ var PopoverContent = React4.forwardRef(({ className, align = "center", sideOffse
|
|
|
1672
2077
|
) }));
|
|
1673
2078
|
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
1674
2079
|
|
|
1675
|
-
export { Checkbox, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FluidGridsRoot, NODE_STATUS_CONFIG, Popover, PopoverContent, PopoverTrigger, RUN_STATUS_CONFIG, ScrollArea, ScrollBar, Select2 as Select, SelectContent2 as SelectContent, SelectGroup, SelectItem2 as SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger2 as SelectTrigger, SelectValue2 as SelectValue, Separator, Switch2 as Switch, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Textarea, VariablesPage, WorkflowEmbedPage, createFluidGridsClients, useCreateVariable, useDeleteVariable, useRevealVariableValue, useSaveSecretsProviderConfig, useSecretsProviderConfigs, useTestSecretsProviderConnection, useUpdateVariable, useVariables };
|
|
2080
|
+
export { ApprovalInboxPage, Checkbox, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FluidGridsRoot, NODE_STATUS_CONFIG, Popover, PopoverContent, PopoverTrigger, RUN_STATUS_CONFIG, ScrollArea, ScrollBar, Select2 as Select, SelectContent2 as SelectContent, SelectGroup, SelectItem2 as SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger2 as SelectTrigger, SelectValue2 as SelectValue, Separator, Switch2 as Switch, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Textarea2 as Textarea, VariablesPage, WorkflowEmbedPage, createFluidGridsClients, useCreateVariable, useDecideToolApproval, useDeleteVariable, usePendingToolApprovals, useRevealVariableValue, useSaveSecretsProviderConfig, useSecretsProviderConfigs, useTestSecretsProviderConnection, useUpdateVariable, useVariables };
|
|
1676
2081
|
//# sourceMappingURL=index.js.map
|
|
1677
2082
|
//# sourceMappingURL=index.js.map
|