@burdenoff/fluidgrids-fe-sdk 2026.1111.21 → 2026.1111.23
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 +13 -0
- package/dist/{AiStudioPage-CJdzRL26.js → AiStudioPage-CLrMe8v8.js} +5 -5
- package/dist/{ApprovalInboxPage-dbBDSJ-f.js → ApprovalInboxPage-D8vhnloO.js} +1 -1
- package/dist/{DataSinkDashboardPage-hrwQSvks.js → DataSinkDashboardPage-DDvNPS8Z.js} +1 -1
- package/dist/{DataTablesPage-BZy2z0LB.js → DataTablesPage-BpnF13UT.js} +9 -1
- package/dist/{ExecutionDetailPage-DKp421Fj.js → ExecutionDetailPage-DmICvIpH.js} +12 -7
- package/dist/{ExecutionsListPage-DwJQfDPt.js → ExecutionsListPage-D63aCXJH.js} +4 -4
- package/dist/{FluidGridsProvider-CbY91ZQq.js → FluidGridsProvider-CWyQ8ziM.js} +2 -1
- package/dist/{HistoryPage-BLXZJDoJ.js → HistoryPage-CNXgUMb0.js} +1 -1
- package/dist/{HumanRequestCard-D-ooVPDn.js → HumanRequestCard-mOhr-Ic9.js} +239 -31
- package/dist/{InsightsPage-ChnoW5U4.js → InsightsPage-Duo83yAM.js} +1 -1
- package/dist/{MissingNodesInstallModal-mYFfy9Gg.js → MissingNodesInstallModal-Q3RYBvS8.js} +1 -1
- package/dist/{QuotaExhaustedDialog-DWm_YWL7.js → QuotaExhaustedDialog-ChBoJnRo.js} +3 -2
- package/dist/{SettingsPage-CXoKX0px.js → SettingsPage-DI_vIG7t.js} +2 -2
- package/dist/{TemplateCard-HIMsb47R.js → TemplateCard-6W2q2wiK.js} +4 -3
- package/dist/{TemplateConfigurationModal-BNtbJ2fv.js → TemplateConfigurationModal-qNQGP7cm.js} +1 -1
- package/dist/{TemplateDetailPanel-C6Zh2WRF.js → TemplateDetailPanel-CQvYqhVO.js} +1 -1
- package/dist/{TemplatePreview-_wUMSwh_.js → TemplatePreview-Bb2f4enx.js} +4 -4
- package/dist/{TemplatesPage-DBfL-ao9.js → TemplatesPage-Bvg6R2P9.js} +6 -5
- package/dist/{WorkflowBuilder-CMZi6wQE.js → WorkflowBuilder-CabLzwS5.js} +8 -8
- package/dist/{WorkflowBuilder-CYmpQtIQ.js → WorkflowBuilder-TgKSGNlu.js} +3 -3
- package/dist/{WorkflowSearchRedirect-iWzvY9Qo.js → WorkflowSearchRedirect-33Vs4FKc.js} +1 -1
- package/dist/{WorkflowsList-C8aoqtRE.js → WorkflowsList-C3bHLpSv.js} +147 -22
- package/dist/agent-tools.js +1 -1
- package/dist/{agentTools-CrEWQ5st.js → agentTools-BU5crBtm.js} +3 -3
- package/dist/{canvasNoteTools-6BQYNCee.js → canvasNoteTools-DeSl4BAF.js} +2 -2
- package/dist/{code-editor-field-CoRq10k7.js → code-editor-field-CfP0QYUD.js} +1 -1
- package/dist/executions.js +2 -2
- package/dist/{flow-builder-Dwev-C_g.js → flow-builder-xokwiaT1.js} +16 -73
- package/dist/fluidgridsEvents-Dm5CaHtr.js +162 -0
- package/dist/history.js +1 -1
- package/dist/{index-6JR2vD9J.d.ts → index-D507rsk2.d.ts} +19 -19
- package/dist/index.d.ts +3 -2
- package/dist/index.js +31 -29
- package/dist/{node-detail-view-BFBSKj5w.js → node-detail-view-DGrDIjS-.js} +5 -5
- package/dist/{node-editor-tab-body-Cz9kOlxu.js → node-editor-tab-body-eOsmnUvx.js} +2 -2
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -2
- package/dist/{popover-xPh0iIzy.js → popover-B1aKz7DC.js} +1 -1
- package/dist/{quick-config-panel-Ym05lyGn.js → quick-config-panel-Bc7isfv0.js} +3 -3
- package/dist/quota-Cdt8yz7N.js +152 -0
- package/dist/quota.d.ts +3 -0
- package/dist/quota.js +4 -0
- package/dist/runsQuota-DsniKiSg.d.ts +20 -0
- package/dist/runsQuota-DvXR6mRN.js +100 -0
- package/dist/{schedule-panel-54D5W5Qk.js → schedule-panel-BnqaUnnz.js} +153 -7
- package/dist/settings.js +1 -1
- package/dist/{sidebar-node-editor-LL3ofDN7.js → sidebar-node-editor-CdlEDGKh.js} +3 -3
- package/dist/templates.js +2 -2
- package/dist/{uiMarkTools-nlmzsHQM.js → uiMarkTools-DZ6akjQK.js} +1 -1
- package/dist/useActionParam-B0ebTZmg.js +83 -0
- package/dist/{useDurableParity-BScby67i.js → useDurableParity-BApRraSO.js} +1 -1
- package/dist/{useExecutions-B0VzQcY2.js → useExecutions-C2a4EcvC.js} +2 -2
- package/dist/{useObservability-FfQGgW6W.js → useObservability-BmbeK5bG.js} +2 -2
- package/dist/{useRunHistory-BZJg72kd.js → useRunHistory-CqfDFRzr.js} +1 -1
- package/dist/{useWorkflowCodeExport-CUWMlJbi.js → useWorkflowCodeExport-DebpM48M.js} +1 -1
- package/dist/{useWorkflows-Czz5DlL0.js → useWorkflows-D1-rYzGK.js} +2 -2
- package/dist/workflow-builder.js +4 -4
- package/dist/workflow-pages.d.ts +1 -1
- package/dist/workflow-pages.js +15 -15
- package/dist/workflows-list.d.ts +6 -0
- package/dist/workflows-list.js +3 -2
- package/package.json +5 -1
- package/dist/fluidgridsEvents-CNdcrUNN.js +0 -310
package/README.md
CHANGED
|
@@ -345,6 +345,19 @@ with the pages and the main entry.
|
|
|
345
345
|
`./flags` carries only the FluidGrids feature flag hooks, for a shell that reads
|
|
346
346
|
a flag on every page (for example to list a navigation item).
|
|
347
347
|
|
|
348
|
+
`./quota` carries only `readRunsQuota` and the `RunsQuota` type, for a host
|
|
349
|
+
surface (a plan or profile popup) that reads the workspace's run allowance
|
|
350
|
+
outside the builder:
|
|
351
|
+
|
|
352
|
+
```ts
|
|
353
|
+
import {
|
|
354
|
+
readRunsQuota,
|
|
355
|
+
type RunsQuota,
|
|
356
|
+
} from "@burdenoff/fluidgrids-fe-sdk/quota";
|
|
357
|
+
|
|
358
|
+
const quota: RunsQuota | null = await readRunsQuota(apolloClient, workspaceId);
|
|
359
|
+
```
|
|
360
|
+
|
|
348
361
|
## Agent tools (optional)
|
|
349
362
|
|
|
350
363
|
`./agent-tools` carries FluidGrids' AI agent tools (`createFluidGridsAgentTools`)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
3
|
import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
|
|
4
|
-
import { a as useAiWorkflowTemplates, i as enrichDraftNodes, n as AI_DRAFT_MAX_PROMPT_LENGTH, r as draftToCanvas, t as FlowBuilderPage } from "./flow-builder-
|
|
5
|
-
import { Ot as builderPathOf, kt as classifyCreateRefusal, u as ensureNodeTypesLoaded, z as buildOperationSeed } from "./FluidGridsProvider-
|
|
4
|
+
import { a as useAiWorkflowTemplates, i as enrichDraftNodes, n as AI_DRAFT_MAX_PROMPT_LENGTH, r as draftToCanvas, t as FlowBuilderPage } from "./flow-builder-xokwiaT1.js";
|
|
5
|
+
import { Ot as builderPathOf, kt as classifyCreateRefusal, u as ensureNodeTypesLoaded, z as buildOperationSeed } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
6
6
|
import { _ as throwIfResultError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
7
7
|
import { a as notifyFluidGridsAiCreditsUpdated, t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
|
|
8
8
|
import { Pr as WorkflowGenerationDocument, y as CancelWorkflowGenerationDocument, yt as GenerateWorkflowFromPromptDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
9
|
-
import { n as useCreateWorkflow } from "./useWorkflows-
|
|
9
|
+
import { n as useCreateWorkflow } from "./useWorkflows-D1-rYzGK.js";
|
|
10
10
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
11
|
-
import {
|
|
12
|
-
import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-
|
|
11
|
+
import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
|
|
12
|
+
import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-DebpM48M.js";
|
|
13
13
|
import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
14
14
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
15
15
|
import { useNavigate } from "react-router";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
3
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
4
|
-
import {
|
|
4
|
+
import { i as usePendingHumanRequests, t as HumanRequestCard } from "./HumanRequestCard-mOhr-Ic9.js";
|
|
5
5
|
import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
|
|
6
6
|
import { _ as throwIfResultError, h as isForbiddenError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
7
7
|
import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
3
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
4
|
-
import { n as useDataSinks, t as useDataSinkData } from "./useObservability-
|
|
4
|
+
import { n as useDataSinks, t as useDataSinkData } from "./useObservability-BmbeK5bG.js";
|
|
5
5
|
import { s as prettyJson, t as formatBytes } from "./utils-uaL5UVxb.js";
|
|
6
6
|
import { useEffect, useMemo, useState } from "react";
|
|
7
7
|
import { Icon } from "@iconify/react";
|
|
@@ -5,6 +5,7 @@ import { t as TagFilterSelect } from "./TagFilterSelect-DCBOH6Ou.js";
|
|
|
5
5
|
import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
6
6
|
import { a as useDataTableTagOverlay, n as tagLabel } from "./useEntityTags-DhnsZcTl.js";
|
|
7
7
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
8
|
+
import { i as useOpenRequest, n as ACTION_PARAM_VALUES, r as useActionParam } from "./useActionParam-B0ebTZmg.js";
|
|
8
9
|
import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
9
10
|
import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
|
|
10
11
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1356,7 +1357,8 @@ function TableRowsPanel({ table, onTableChanged, onEditTable, onDeleteTable, del
|
|
|
1356
1357
|
function DataTablesPage() {
|
|
1357
1358
|
const tr = useTr();
|
|
1358
1359
|
const navigate = useNavigate();
|
|
1359
|
-
const
|
|
1360
|
+
const createTablePermission = useFluidGridsPermission(FLUIDGRIDS_PERMISSIONS.DATA_TABLE_CREATE);
|
|
1361
|
+
const canCreateTable = createTablePermission.allowed;
|
|
1360
1362
|
const [searchInput, setSearchInput] = useState("");
|
|
1361
1363
|
const [search, setSearch] = useState("");
|
|
1362
1364
|
const [tagFilter, setTagFilter] = useState("");
|
|
@@ -1366,6 +1368,12 @@ function DataTablesPage() {
|
|
|
1366
1368
|
const [selectedId, setSelectedId] = useState(null);
|
|
1367
1369
|
const [tableDialogOpen, setTableDialogOpen] = useState(false);
|
|
1368
1370
|
const [editingTable, setEditingTable] = useState(null);
|
|
1371
|
+
const newTableRequest = useActionParam(ACTION_PARAM_VALUES.new, createTablePermission);
|
|
1372
|
+
const openCreateTable = useCallback(() => {
|
|
1373
|
+
setEditingTable(null);
|
|
1374
|
+
setTableDialogOpen(true);
|
|
1375
|
+
}, []);
|
|
1376
|
+
useOpenRequest(newTableRequest.requested, openCreateTable, newTableRequest.handled);
|
|
1369
1377
|
const selectedTable = useMemo(() => tables.find((table) => table.id === selectedId) ?? null, [selectedId, tables]);
|
|
1370
1378
|
useEffect(() => {
|
|
1371
1379
|
if (tables.length === 0) {
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
|
-
import { i as useRunPending, n as useDurableParityRunFields, o as ExecutionStatusBadge, r as useRunMetadata, s as NodeStatusBadge, t as setRunVersioningOverride } from "./useDurableParity-
|
|
3
|
+
import { i as useRunPending, n as useDurableParityRunFields, o as ExecutionStatusBadge, r as useRunMetadata, s as NodeStatusBadge, t as setRunVersioningOverride } from "./useDurableParity-BApRraSO.js";
|
|
4
4
|
import { n as formatRunVersion, r as nodeDisplayTitle, t as buildNodeDisplayMap } from "./run-display-BycKYSU0.js";
|
|
5
5
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
6
6
|
import { s as isAgentNodeType } from "./agent-form-Bfvm32j1.js";
|
|
7
|
-
import { Cn as canSignalRun, I as describeRunError, L as describeRunStep, On as runSignalTargets, Tn as durableInterfaceOf, cn as nodeStateDurationMs, ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-
|
|
7
|
+
import { Cn as canSignalRun, I as describeRunError, L as describeRunStep, On as runSignalTargets, Tn as durableInterfaceOf, cn as nodeStateDurationMs, ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
8
8
|
import { n as useFgAskable, r as useFgAskableSelection } from "./askAboutBridge-BV8m95kk.js";
|
|
9
|
-
import { f as callbackTone, g as shortRunId, h as runChainLinks, m as parseMetadataDefinition, n as useExecution, p as overrideRequestOf, r as useExecutionActions, t as useAutoRefresh } from "./useExecutions-
|
|
9
|
+
import { f as callbackTone, g as shortRunId, h as runChainLinks, m as parseMetadataDefinition, n as useExecution, p as overrideRequestOf, r as useExecutionActions, t as useAutoRefresh } from "./useExecutions-C2a4EcvC.js";
|
|
10
10
|
import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
|
|
11
11
|
import { Yr as WorkflowRunHierarchyDocument, dn as RunAiUsageDocument, o as AgentStepUpdatedDocument, s as AgentTraceDocument, ut as ExplainRunDocument, xn as RunLogsDocument, yn as RunLogAppendedDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
12
12
|
import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
13
13
|
import { t as EntityTagPicker } from "./EntityTagPicker-BqRNsLCQ.js";
|
|
14
|
-
import {
|
|
14
|
+
import { n as channelLabel, o as useRunHumanRequests, r as ApprovalApprovers, s as useRecipientLabel } from "./HumanRequestCard-mOhr-Ic9.js";
|
|
15
15
|
import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions, i as decodePayloads, l as formatBudgetUsd, n as checkCodecServerUrl, o as isEncodedPayload, r as containsEncodedPayload, t as CodecServerError } from "./codec-client-CJ95Rmqo.js";
|
|
16
16
|
import { n as useWorkflowProposal, o as canSaveRunAsTestCase, r as saveRunAsTestCase, t as WorkflowProposalCard } from "./WorkflowProposalCard-qrEeNyYG.js";
|
|
17
17
|
import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
|
|
18
18
|
import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-B9hDQymi.js";
|
|
19
|
-
import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-
|
|
19
|
+
import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-CqfDFRzr.js";
|
|
20
20
|
import { $u as ErrorType, L as AgentStepKind, LF as WorkflowQueryRejectCondition, tI as WorkflowUpdateWaitFor, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
|
|
21
21
|
import { a as formatTokens, d as formatMicroUsd, o as modelLabel, r as aiCost } from "./ai-usage-glCwHyQz.js";
|
|
22
22
|
import { c as useDurableParityEnabled, f as usePhaseCFlags, m as useWorkflowTestsEnabled, s as useDurableFunctionNodesEnabled } from "./feature-flags-DM5myWaD.js";
|
|
23
23
|
import { A as revokeSignalToken, B as updateActivityOptions, D as resetActivities, E as queryRun, N as sendRunUpdate, O as resetRun, R as unpauseActivities, S as fetchSignalTokens, V as upsertRunSearchAttributes, _ as fetchPauseRules, b as fetchRunUpdate, d as failActivityById, g as fetchCodecServerSettings, i as completeActivityById, k as resetRunToLastCleanTask, s as createSignalToken, v as fetchRunControlFields, w as pauseActivities, y as fetchRunHistoryArchive } from "./api-BrCHB5oA.js";
|
|
24
24
|
import { a as fetchTaskQueueStats } from "./api-C8e0iV-Q.js";
|
|
25
25
|
import { a as RUN_CONTROL_DIALOG_STYLE, c as parseJsonInput, i as NativeSelect, l as parseJsonObjectInput, n as JsonBlock, o as StatusPill, r as JsonField, s as newRunControlId, t as FieldError, u as useResource } from "./shared-CMfn30xT.js";
|
|
26
|
-
import { v as useWorkflowVersions } from "./useWorkflows-
|
|
26
|
+
import { v as useWorkflowVersions } from "./useWorkflows-D1-rYzGK.js";
|
|
27
27
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
28
28
|
import { Link, useNavigate, useParams, useSearchParams } from "react-router";
|
|
29
29
|
import { Icon } from "@iconify/react";
|
|
@@ -1355,7 +1355,8 @@ function answerRows(request, tr) {
|
|
|
1355
1355
|
// src/modules/human-response/components/RunHumanRequests.tsx
|
|
1356
1356
|
/**
|
|
1357
1357
|
* Run detail: the asks a "Send and Wait for Response" node made (BOFF-7651) — who was asked, by
|
|
1358
|
-
* which channel, until when, and what came back.
|
|
1358
|
+
* which channel, until when, and what came back. An approval lists its approvers with each one's
|
|
1359
|
+
* answer and comment (BOFF-9956). Renders nothing for runs that asked nobody.
|
|
1359
1360
|
*/
|
|
1360
1361
|
function outcome(request, tr) {
|
|
1361
1362
|
const when = request.respondedAt ? new Date(request.respondedAt).toLocaleString() : "";
|
|
@@ -1405,6 +1406,10 @@ function RunHumanRequestRow({ request }) {
|
|
|
1405
1406
|
outcome(request, tr)
|
|
1406
1407
|
]
|
|
1407
1408
|
}),
|
|
1409
|
+
(request.approvals?.length ?? 0) > 0 && /* @__PURE__ */ jsx("div", {
|
|
1410
|
+
className: "mt-1 w-full sm:mt-0",
|
|
1411
|
+
children: /* @__PURE__ */ jsx(ApprovalApprovers, { request })
|
|
1412
|
+
}),
|
|
1408
1413
|
answer.length > 0 && /* @__PURE__ */ jsx("dl", {
|
|
1409
1414
|
className: "mt-1 w-full space-y-0.5 text-xs sm:mt-0",
|
|
1410
1415
|
"data-testid": "run-human-answer",
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
3
|
import { M as DEFAULT_EXECUTIONS_FILTER, N as useExecutionsStore, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
4
|
-
import { c as OPERATORS_BY_TYPE, i as useExecutionStats, l as buildSearchAttributeFilter, o as useExecutionsWithStore, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, y as validateDateRange } from "./useExecutions-
|
|
4
|
+
import { c as OPERATORS_BY_TYPE, i as useExecutionStats, l as buildSearchAttributeFilter, o as useExecutionsWithStore, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, y as validateDateRange } from "./useExecutions-C2a4EcvC.js";
|
|
5
5
|
import { c as useDurableParityEnabled, f as usePhaseCFlags } from "./feature-flags-DM5myWaD.js";
|
|
6
6
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
7
7
|
import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
|
|
8
8
|
import { t as executionsControls } from "./pageControlSpecs-DZJ9K37m.js";
|
|
9
9
|
import { t as TagFilterSelect } from "./TagFilterSelect-DCBOH6Ou.js";
|
|
10
|
-
import { a as useRunStatusCounts, c as runStatusLabels, l as RUN_STATUS_CONFIG, o as ExecutionStatusBadge } from "./useDurableParity-
|
|
10
|
+
import { a as useRunStatusCounts, c as runStatusLabels, l as RUN_STATUS_CONFIG, o as ExecutionStatusBadge } from "./useDurableParity-BApRraSO.js";
|
|
11
11
|
import { n as formatRunVersion } from "./run-display-BycKYSU0.js";
|
|
12
|
-
import { ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-
|
|
12
|
+
import { ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
13
13
|
import { n as runListLinkKey, t as runListFilterFromSearch } from "./run-list-links-ByYC0OlV.js";
|
|
14
|
-
import { h as useWorkflowDefinitions } from "./useWorkflows-
|
|
14
|
+
import { h as useWorkflowDefinitions } from "./useWorkflows-D1-rYzGK.js";
|
|
15
15
|
import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
|
|
16
16
|
import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
17
17
|
import { C as jsonArg, F as startBatchOperation, I as startBatchTerminate, P as startBatchExport, m as fetchBatchOperations, n as cancelBatchOperation, p as fetchBatchOperation, x as fetchSearchAttributes } from "./api-BrCHB5oA.js";
|
|
@@ -6,7 +6,8 @@ import { A as nodeAccent, C as nodeAdaptersOf, D as NodeCard, E as resolveOutput
|
|
|
6
6
|
import { n as FluidGridsTranslationProvider, r as useTr, t as ENGLISH_FALLBACK_TRANSLATOR } from "./TranslationBridge-Da-TPgQm.js";
|
|
7
7
|
import { s as useDurableFunctionNodesEnabled } from "./feature-flags-DM5myWaD.js";
|
|
8
8
|
import { A as CreateWorkflowDefinitionDocument, At as NodePaletteEntriesDocument, Er as WorkflowDefinitionDocument, L as CreateWorkflowVersionDocument, Tn as SaveWorkflowDraftDocument, _n as RunFromNodeDocument, at as ExecuteStepDocument, it as EventRegistrationsDocument, kt as NodeManifestsDocument, ot as ExecutionDetailDocument, qn as TriggerWorkflowDocument, qr as WorkflowRunDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
9
|
-
import {
|
|
9
|
+
import { a as collectExtensions, n as QUOTA_EXHAUSTED_CODE, o as errorCodesOf, r as RUNS_QUOTA_NAME, s as findQuotaRefusal } from "./quota-Cdt8yz7N.js";
|
|
10
|
+
import { i as emitRunStarted, n as emitRunFailed, r as emitRunLimitHit, s as emitWorkflowCreated } from "./fluidgridsEvents-Dm5CaHtr.js";
|
|
10
11
|
import { n as useFgAskable } from "./askAboutBridge-BV8m95kk.js";
|
|
11
12
|
import { t as fetchAllNodeEndpointConfigs } from "./node-endpoint-configs-B5bjNMDW.js";
|
|
12
13
|
import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
|
-
import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-
|
|
3
|
+
import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-D1-rYzGK.js";
|
|
4
4
|
import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-DSN0mU0f.js";
|
|
5
5
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
6
6
|
import { x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
|
|
@@ -3,7 +3,7 @@ import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
|
3
3
|
import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
|
|
4
4
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { Icon } from "@iconify/react";
|
|
6
|
-
import {
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { toast } from "sonner";
|
|
8
8
|
import { gql } from "@apollo/client";
|
|
9
9
|
import { Badge, Card, CardContent, CardHeader, Input, Label, Textarea } from "@burdenoff/fe-libs/ui";
|
|
@@ -90,6 +90,19 @@ const HUMAN_REQUEST_FIELDS = gql`
|
|
|
90
90
|
respondedAt
|
|
91
91
|
createdAt
|
|
92
92
|
canRespond
|
|
93
|
+
quorum
|
|
94
|
+
requiredApprovals
|
|
95
|
+
myDecision
|
|
96
|
+
approvals {
|
|
97
|
+
id
|
|
98
|
+
requestId
|
|
99
|
+
approverId
|
|
100
|
+
assignedVia
|
|
101
|
+
assignedFrom
|
|
102
|
+
decision
|
|
103
|
+
comment
|
|
104
|
+
answeredAt
|
|
105
|
+
}
|
|
93
106
|
}
|
|
94
107
|
`;
|
|
95
108
|
const GET_PENDING_HUMAN_REQUESTS = gql`
|
|
@@ -223,7 +236,11 @@ function useRunHumanRequests(runId, options) {
|
|
|
223
236
|
refetch: fetchData
|
|
224
237
|
};
|
|
225
238
|
}
|
|
226
|
-
/**
|
|
239
|
+
/**
|
|
240
|
+
* Answer an in-app ask. Resolves to the decision the run continued with, or null when the answer
|
|
241
|
+
* was recorded and an approval quorum still needs more answers (BOFF-9956). Throws with the
|
|
242
|
+
* service's reason.
|
|
243
|
+
*/
|
|
227
244
|
function useRespondToHumanRequest() {
|
|
228
245
|
const [loading, setLoading] = useState(false);
|
|
229
246
|
return {
|
|
@@ -247,11 +264,163 @@ function useRespondToHumanRequest() {
|
|
|
247
264
|
};
|
|
248
265
|
}
|
|
249
266
|
|
|
267
|
+
// src/modules/human-response/utils/approval-progress.ts
|
|
268
|
+
function approvalCounts(approvals) {
|
|
269
|
+
let approved = 0;
|
|
270
|
+
let rejected = 0;
|
|
271
|
+
for (const approval of approvals) if (approval.decision === "APPROVED") approved++;
|
|
272
|
+
else if (approval.decision === "REJECTED") rejected++;
|
|
273
|
+
return {
|
|
274
|
+
approved,
|
|
275
|
+
rejected,
|
|
276
|
+
total: approvals.length
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/** True for an approval that counts several answers (all, or N of them). */
|
|
280
|
+
function hasQuorum(request) {
|
|
281
|
+
return request.responseType === "APPROVAL" && (request.quorum === "all" || request.quorum === "count");
|
|
282
|
+
}
|
|
283
|
+
/** "1 of 2 approvals · 1 declined", or null for an ask without a quorum. */
|
|
284
|
+
function approvalProgressText(request, tr) {
|
|
285
|
+
if (!hasQuorum(request)) return null;
|
|
286
|
+
const counts = approvalCounts(request.approvals ?? []);
|
|
287
|
+
const required = request.requiredApprovals ?? counts.total;
|
|
288
|
+
const progress = request.quorum === "all" ? tr("fluidgrids.humanResponse.approvalProgressAll", "{{approved}} of {{required}} approvals (everyone must approve)", {
|
|
289
|
+
approved: counts.approved,
|
|
290
|
+
required
|
|
291
|
+
}) : tr("fluidgrids.humanResponse.approvalProgressCount", "{{approved}} of {{required}} approvals needed, from {{total}} approvers", {
|
|
292
|
+
approved: counts.approved,
|
|
293
|
+
required,
|
|
294
|
+
total: counts.total
|
|
295
|
+
});
|
|
296
|
+
if (counts.rejected === 0) return progress;
|
|
297
|
+
return `${progress} · ${tr("fluidgrids.humanResponse.approvalDeclinedCount", "{{count}} declined", { count: counts.rejected })}`;
|
|
298
|
+
}
|
|
299
|
+
/** An approver's answer in words. A missing answer reads differently once the ask closed. */
|
|
300
|
+
function approverDecisionLabel(decision, askOpen, tr) {
|
|
301
|
+
if (decision === "APPROVED") return tr("fluidgrids.humanResponse.approverApproved", "Approved");
|
|
302
|
+
if (decision === "REJECTED") return tr("fluidgrids.humanResponse.approverDeclined", "Declined");
|
|
303
|
+
return askOpen ? tr("fluidgrids.humanResponse.approverWaiting", "Not answered yet") : tr("fluidgrids.humanResponse.approverNoAnswer", "Did not answer");
|
|
304
|
+
}
|
|
305
|
+
/** The toast after an in-app answer: the run continued, or the answer waits for the others. */
|
|
306
|
+
function answeredToastText(decision, tr) {
|
|
307
|
+
if (decision === null) return tr("fluidgrids.humanResponse.approvalRecordedToast", "Your answer is recorded. The workflow continues once enough approvers have answered.");
|
|
308
|
+
return decision === "declined" ? tr("fluidgrids.humanResponse.declinedToast", "Declined — the workflow is continuing") : tr("fluidgrids.humanResponse.answeredToast", "Response sent — the workflow is continuing");
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Why the caller cannot answer this ask here: they already answered it, it went to someone else,
|
|
312
|
+
* or it is answered through the link in its message.
|
|
313
|
+
*/
|
|
314
|
+
function notAnswerableText(request, channelName, tr) {
|
|
315
|
+
if (request.myDecision === "APPROVED") return tr("fluidgrids.humanResponse.youApproved", "You approved this. It is waiting for the other approvers.");
|
|
316
|
+
if (request.myDecision === "REJECTED") return tr("fluidgrids.humanResponse.youDeclined", "You declined this. It is waiting for the other approvers.");
|
|
317
|
+
return request.channel === "IN_APP" ? tr("fluidgrids.humanResponse.notForYou", "This request was sent to someone else.") : tr("fluidgrids.humanResponse.answerByLink", "Answered through the link in the {{channel}} message.", { channel: channelName });
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// src/modules/human-response/hooks/useApproverNames.ts
|
|
321
|
+
/**
|
|
322
|
+
* Names for the approvers of an approval (BOFF-9956). Approvers are stored as user ids; they are
|
|
323
|
+
* resolved through the shared actor-profile cache, the same lookup the run page uses for
|
|
324
|
+
* "triggered by" and `useRecipientLabel` uses for who an ask went to.
|
|
325
|
+
*/
|
|
326
|
+
/** Display name per user id; ids the profile service does not know get the shared fallback. */
|
|
327
|
+
function useApproverNames(userIds) {
|
|
328
|
+
const idsKey = [...new Set(userIds)].join(",");
|
|
329
|
+
const inputs = useMemo(() => idsKey ? idsKey.split(",").map((actorId) => ({
|
|
330
|
+
actorId,
|
|
331
|
+
actorType: "user"
|
|
332
|
+
})) : [], [idsKey]);
|
|
333
|
+
const config = getFluidGridsConfig();
|
|
334
|
+
const profiles = useActorProfiles(inputs, {
|
|
335
|
+
workspaceId: config.workspaceId || void 0,
|
|
336
|
+
orgId: config.organizationId,
|
|
337
|
+
authToken: config.authToken
|
|
338
|
+
});
|
|
339
|
+
return useMemo(() => {
|
|
340
|
+
const names = {};
|
|
341
|
+
for (const input of inputs) names[input.actorId] = profiles[input.actorId]?.displayName ?? buildActorFallback({
|
|
342
|
+
actorId: input.actorId,
|
|
343
|
+
actorType: "user"
|
|
344
|
+
}).displayName;
|
|
345
|
+
return names;
|
|
346
|
+
}, [inputs, profiles]);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// src/modules/human-response/components/ApprovalApprovers.tsx
|
|
350
|
+
/**
|
|
351
|
+
* The approvers of an in-app approval (BOFF-9956): where the quorum stands, and who was asked, how
|
|
352
|
+
* (by name or through a role), what each answered, when, and their comment. Shown on the run page
|
|
353
|
+
* and in the Approvals inbox. Renders nothing for an ask that named no approvers and has no answer.
|
|
354
|
+
*/
|
|
355
|
+
const DECISION_ICON = {
|
|
356
|
+
APPROVED: "mdi:check-circle-outline",
|
|
357
|
+
REJECTED: "mdi:close-circle-outline",
|
|
358
|
+
PENDING: "mdi:clock-outline"
|
|
359
|
+
};
|
|
360
|
+
const DECISION_TONE = {
|
|
361
|
+
APPROVED: "text-status-success-text",
|
|
362
|
+
REJECTED: "text-status-error-text",
|
|
363
|
+
PENDING: "text-text-secondary"
|
|
364
|
+
};
|
|
365
|
+
/** "1 of 2 approvals needed, from 3 approvers"; nothing for an ask without a quorum. */
|
|
366
|
+
function ApprovalProgress({ request }) {
|
|
367
|
+
const tr = useTr();
|
|
368
|
+
const text = approvalProgressText(request, tr);
|
|
369
|
+
if (!text) return null;
|
|
370
|
+
return /* @__PURE__ */ jsx("p", {
|
|
371
|
+
className: "text-xs font-medium text-text-primary",
|
|
372
|
+
"data-testid": "approval-progress",
|
|
373
|
+
children: text
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
function ApprovalApprovers({ request }) {
|
|
377
|
+
const tr = useTr();
|
|
378
|
+
const approvals = request.approvals ?? [];
|
|
379
|
+
const names = useApproverNames(approvals.map((approval) => approval.approverId));
|
|
380
|
+
if (approvals.length === 0) return null;
|
|
381
|
+
const askOpen = request.status === "PENDING";
|
|
382
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
383
|
+
className: "w-full space-y-1.5",
|
|
384
|
+
"data-testid": "approval-approvers",
|
|
385
|
+
children: [/* @__PURE__ */ jsx(ApprovalProgress, { request }), /* @__PURE__ */ jsx("ul", {
|
|
386
|
+
className: "space-y-1",
|
|
387
|
+
children: approvals.map((approval) => /* @__PURE__ */ jsxs("li", {
|
|
388
|
+
className: "flex flex-col gap-0.5 text-xs sm:flex-row sm:flex-wrap sm:items-baseline sm:gap-x-2",
|
|
389
|
+
"data-testid": "approval-approver",
|
|
390
|
+
"data-decision": approval.decision,
|
|
391
|
+
children: [
|
|
392
|
+
/* @__PURE__ */ jsxs("span", {
|
|
393
|
+
className: "flex items-center gap-1 font-medium text-text-primary",
|
|
394
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
395
|
+
icon: DECISION_ICON[approval.decision],
|
|
396
|
+
width: 14,
|
|
397
|
+
className: DECISION_TONE[approval.decision]
|
|
398
|
+
}), names[approval.approverId] ?? approval.approverId]
|
|
399
|
+
}),
|
|
400
|
+
/* @__PURE__ */ jsxs("span", {
|
|
401
|
+
className: "text-text-secondary",
|
|
402
|
+
children: [
|
|
403
|
+
approverDecisionLabel(approval.decision, askOpen, tr),
|
|
404
|
+
approval.answeredAt && ` · ${new Date(approval.answeredAt).toLocaleString()}`,
|
|
405
|
+
approval.assignedFrom && ` · ${tr("fluidgrids.humanResponse.approverViaRole", "asked as {{role}}", { role: approval.assignedFrom })}`
|
|
406
|
+
]
|
|
407
|
+
}),
|
|
408
|
+
approval.comment && /* @__PURE__ */ jsx("q", {
|
|
409
|
+
className: "w-full whitespace-pre-wrap break-words text-text-primary",
|
|
410
|
+
children: approval.comment
|
|
411
|
+
})
|
|
412
|
+
]
|
|
413
|
+
}, approval.id))
|
|
414
|
+
})]
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
|
|
250
418
|
// src/modules/human-response/components/HumanRequestCard.tsx
|
|
251
419
|
/**
|
|
252
420
|
* One "Send and Wait for Response" ask in the in-app inbox (BOFF-7651): what was asked, of whom,
|
|
253
421
|
* through which channel and until when — and, when the caller may answer it in-app, the controls
|
|
254
|
-
* to do so (Approve / Decline, a text box, or the custom form).
|
|
422
|
+
* to do so (Approve / Decline, a text box, or the custom form). An approval with several approvers
|
|
423
|
+
* (BOFF-9956) also shows where its quorum stands and takes an optional comment with the answer.
|
|
255
424
|
*/
|
|
256
425
|
const CHANNEL_ICON = {
|
|
257
426
|
EMAIL: "mdi:email-outline",
|
|
@@ -315,6 +484,62 @@ function FormControls({ requestId, fields, values, onChange }) {
|
|
|
315
484
|
})
|
|
316
485
|
});
|
|
317
486
|
}
|
|
487
|
+
/** Approve / Decline, with an optional comment that is recorded with the answer (BOFF-9956). */
|
|
488
|
+
function ApprovalControls({ request, loading, onAnswer }) {
|
|
489
|
+
const tr = useTr();
|
|
490
|
+
const [comment, setComment] = useState("");
|
|
491
|
+
const note = comment.trim() ? { comment: comment.trim() } : {};
|
|
492
|
+
const commentId = `human-comment-${request.id}`;
|
|
493
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
494
|
+
className: "space-y-2 pt-1",
|
|
495
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
496
|
+
className: "space-y-1.5",
|
|
497
|
+
children: [/* @__PURE__ */ jsx(Label, {
|
|
498
|
+
htmlFor: commentId,
|
|
499
|
+
children: tr("fluidgrids.humanResponse.commentLabel", "Comment (optional)")
|
|
500
|
+
}), /* @__PURE__ */ jsx(Textarea, {
|
|
501
|
+
id: commentId,
|
|
502
|
+
value: comment,
|
|
503
|
+
maxLength: 2e3,
|
|
504
|
+
placeholder: tr("fluidgrids.humanResponse.commentPlaceholder", "Why you approve or decline. It is saved with your answer on the run."),
|
|
505
|
+
onChange: (event) => setComment(event.target.value),
|
|
506
|
+
"data-testid": "human-request-comment"
|
|
507
|
+
})]
|
|
508
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
509
|
+
className: "flex flex-wrap items-center gap-2",
|
|
510
|
+
children: [/* @__PURE__ */ jsxs(Button$1, {
|
|
511
|
+
"data-agent": "confirm",
|
|
512
|
+
size: "sm",
|
|
513
|
+
disabled: loading,
|
|
514
|
+
onClick: () => onAnswer({
|
|
515
|
+
action: "approve",
|
|
516
|
+
...note
|
|
517
|
+
}),
|
|
518
|
+
"data-testid": "human-request-approve",
|
|
519
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
520
|
+
icon: "mdi:check",
|
|
521
|
+
className: "mr-1.5",
|
|
522
|
+
width: 16
|
|
523
|
+
}), request.approveLabel]
|
|
524
|
+
}), request.approvalType === "double" && /* @__PURE__ */ jsxs(Button$1, {
|
|
525
|
+
"data-agent": "confirm",
|
|
526
|
+
size: "sm",
|
|
527
|
+
variant: "destructive",
|
|
528
|
+
disabled: loading,
|
|
529
|
+
onClick: () => onAnswer({
|
|
530
|
+
action: "decline",
|
|
531
|
+
...note
|
|
532
|
+
}),
|
|
533
|
+
"data-testid": "human-request-decline",
|
|
534
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
535
|
+
icon: "mdi:close",
|
|
536
|
+
className: "mr-1.5",
|
|
537
|
+
width: 16
|
|
538
|
+
}), request.declineLabel]
|
|
539
|
+
})]
|
|
540
|
+
})]
|
|
541
|
+
});
|
|
542
|
+
}
|
|
318
543
|
function HumanRequestCard({ request, onAnswered }) {
|
|
319
544
|
const tr = useTr();
|
|
320
545
|
const { respond, loading } = useRespondToHumanRequest();
|
|
@@ -323,7 +548,7 @@ function HumanRequestCard({ request, onAnswered }) {
|
|
|
323
548
|
const submit = async (answer) => {
|
|
324
549
|
try {
|
|
325
550
|
const decision = await respond(request.id, answer);
|
|
326
|
-
toast.success(decision
|
|
551
|
+
toast.success(answeredToastText(decision, tr));
|
|
327
552
|
onAnswered();
|
|
328
553
|
} catch (err) {
|
|
329
554
|
toast.error(err instanceof Error ? err.message : tr("fluidgrids.humanResponse.failed", "Your response could not be recorded"));
|
|
@@ -369,9 +594,10 @@ function HumanRequestCard({ request, onAnswered }) {
|
|
|
369
594
|
className: "whitespace-pre-wrap break-words text-sm text-text-primary",
|
|
370
595
|
children: request.message
|
|
371
596
|
}),
|
|
597
|
+
/* @__PURE__ */ jsx(ApprovalApprovers, { request }),
|
|
372
598
|
!request.canRespond && /* @__PURE__ */ jsx("p", {
|
|
373
599
|
className: "text-xs text-text-secondary",
|
|
374
|
-
children:
|
|
600
|
+
children: notAnswerableText(request, channelLabel(request.channel, tr), tr)
|
|
375
601
|
}),
|
|
376
602
|
request.canRespond && request.responseType === "FREE_TEXT" && /* @__PURE__ */ jsxs("div", {
|
|
377
603
|
className: "space-y-1.5",
|
|
@@ -393,32 +619,14 @@ function HumanRequestCard({ request, onAnswered }) {
|
|
|
393
619
|
[name]: value
|
|
394
620
|
}))
|
|
395
621
|
}),
|
|
396
|
-
request.canRespond && /* @__PURE__ */ jsx(
|
|
622
|
+
request.canRespond && request.responseType === "APPROVAL" && /* @__PURE__ */ jsx(ApprovalControls, {
|
|
623
|
+
request,
|
|
624
|
+
loading,
|
|
625
|
+
onAnswer: submit
|
|
626
|
+
}),
|
|
627
|
+
request.canRespond && request.responseType !== "APPROVAL" && /* @__PURE__ */ jsx("div", {
|
|
397
628
|
className: "flex flex-wrap items-center gap-2 pt-1",
|
|
398
|
-
children:
|
|
399
|
-
"data-agent": "confirm",
|
|
400
|
-
size: "sm",
|
|
401
|
-
disabled: loading,
|
|
402
|
-
onClick: () => submit({ action: "approve" }),
|
|
403
|
-
"data-testid": "human-request-approve",
|
|
404
|
-
children: [/* @__PURE__ */ jsx(Icon, {
|
|
405
|
-
icon: "mdi:check",
|
|
406
|
-
className: "mr-1.5",
|
|
407
|
-
width: 16
|
|
408
|
-
}), request.approveLabel]
|
|
409
|
-
}), request.approvalType === "double" && /* @__PURE__ */ jsxs(Button$1, {
|
|
410
|
-
"data-agent": "confirm",
|
|
411
|
-
size: "sm",
|
|
412
|
-
variant: "destructive",
|
|
413
|
-
disabled: loading,
|
|
414
|
-
onClick: () => submit({ action: "decline" }),
|
|
415
|
-
"data-testid": "human-request-decline",
|
|
416
|
-
children: [/* @__PURE__ */ jsx(Icon, {
|
|
417
|
-
icon: "mdi:close",
|
|
418
|
-
className: "mr-1.5",
|
|
419
|
-
width: 16
|
|
420
|
-
}), request.declineLabel]
|
|
421
|
-
})] }) : /* @__PURE__ */ jsxs(Button$1, {
|
|
629
|
+
children: /* @__PURE__ */ jsxs(Button$1, {
|
|
422
630
|
"data-agent": "confirm",
|
|
423
631
|
size: "sm",
|
|
424
632
|
disabled: loading || missingRequired || emptyText,
|
|
@@ -436,4 +644,4 @@ function HumanRequestCard({ request, onAnswered }) {
|
|
|
436
644
|
});
|
|
437
645
|
}
|
|
438
646
|
|
|
439
|
-
export {
|
|
647
|
+
export { useRespondToHumanRequest as a, usePendingHumanRequests as i, channelLabel as n, useRunHumanRequests as o, ApprovalApprovers as r, useRecipientLabel as s, HumanRequestCard as t };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
|
|
3
3
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
4
|
-
import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-
|
|
4
|
+
import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-BmbeK5bG.js";
|
|
5
5
|
import { a as getTopFailingWorkflows, i as getTopFailingNodes, n as formatDuration, o as percentage, r as getFailureBreakdown } from "./utils-uaL5UVxb.js";
|
|
6
6
|
import { n as FailureTriagePanel } from "./FailureTriagePanel-B9hDQymi.js";
|
|
7
7
|
import { o as useContinuousOptimisationEnabled } from "./feature-flags-DM5myWaD.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { a as DialogFooter, i as DialogDescription, l as DialogTitle, o as DialogHeader, r as DialogContent, t as Dialog } from "./dialog-Cjb4lB4D.js";
|
|
3
3
|
import { t as Button } from "./button-DG7y_FVJ.js";
|
|
4
|
-
import { r as Badge } from "./TemplateCard-
|
|
4
|
+
import { r as Badge } from "./TemplateCard-6W2q2wiK.js";
|
|
5
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { AlertTriangle, CheckCircle2, Download, ExternalLink, Loader2, Puzzle, ShoppingCart } from "lucide-react";
|
|
7
7
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
3
|
-
import { gn as useFluidGridsAnalytics } from "./FluidGridsProvider-
|
|
4
|
-
import { c as emitWorkflowLimitHit,
|
|
3
|
+
import { gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
4
|
+
import { c as emitWorkflowLimitHit, o as emitUpgradeClicked } from "./fluidgridsEvents-Dm5CaHtr.js";
|
|
5
|
+
import { i as WORKFLOWS_QUOTA_NAME } from "./quota-Cdt8yz7N.js";
|
|
5
6
|
import { useEffect, useRef } from "react";
|
|
6
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
8
|
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@burdenoff/fe-libs/ui";
|
|
@@ -11,8 +11,8 @@ import { M as saveCodecServerSettings, _ as fetchPauseRules, a as createPauseRul
|
|
|
11
11
|
import { i as NativeSelect, o as StatusPill, t as FieldError, u as useResource } from "./shared-CMfn30xT.js";
|
|
12
12
|
import { KF as WorkflowSearchAttributeType } from "./graphql-types-CDKVWH2R.js";
|
|
13
13
|
import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
|
|
14
|
-
import { Nt as useSaveStatusStore, tn as findSaveConflict } from "./FluidGridsProvider-
|
|
15
|
-
import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-
|
|
14
|
+
import { Nt as useSaveStatusStore, tn as findSaveConflict } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
15
|
+
import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-BmbeK5bG.js";
|
|
16
16
|
import { n as useConnections } from "./useConnections-Cs7LCWEM.js";
|
|
17
17
|
import { Nt as useUpdateWorkflowDefinitionMutation, Rt as useWorkflowDefinitionQuery, Vt as useWorkflowDefinitionsQuery, n as useAgentDefinitions } from "./useAgentDefinitions-B0dam3_o.js";
|
|
18
18
|
import { a as formToInput$2, i as emptyAgentForm, n as agentToForm, o as grantDays, r as describeRule, t as AgentFormError } from "./agent-form-Bfvm32j1.js";
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
|
|
3
3
|
import { i as getGlobalStoreClient } from "./node-registry-refresh-Dy0uRg9f.js";
|
|
4
|
-
import { A as StoreNodeProductsByTypeDocument, C as GetMyNodeInstallationsDocument, D as InstallWorkflowNodeDocument, c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, gn as useFluidGridsAnalytics, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, x as BrowseWorkflowTemplatesDocument } from "./FluidGridsProvider-
|
|
4
|
+
import { A as StoreNodeProductsByTypeDocument, C as GetMyNodeInstallationsDocument, D as InstallWorkflowNodeDocument, c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, gn as useFluidGridsAnalytics, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, x as BrowseWorkflowTemplatesDocument } from "./FluidGridsProvider-CWyQ8ziM.js";
|
|
5
5
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
6
|
-
import {
|
|
6
|
+
import { c as isQuotaExhaustedFailure } from "./quota-Cdt8yz7N.js";
|
|
7
|
+
import { a as emitTemplateUsed, s as emitWorkflowCreated, t as emitNodeInstalled } from "./fluidgridsEvents-Dm5CaHtr.js";
|
|
7
8
|
import { t as cn } from "./cn-QqidFIgr.js";
|
|
8
9
|
import { t as Button } from "./button-DG7y_FVJ.js";
|
|
9
10
|
import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
@@ -1079,7 +1080,7 @@ async function dismissToastWhenShown(id) {
|
|
|
1079
1080
|
}
|
|
1080
1081
|
|
|
1081
1082
|
// src/hooks/store/useTemplateImportFlow.tsx
|
|
1082
|
-
const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-
|
|
1083
|
+
const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-qNQGP7cm.js").then((m) => ({ default: m.TemplateConfigurationModal })));
|
|
1083
1084
|
/**
|
|
1084
1085
|
* "Use this template", the same everywhere it is offered: the builder's
|
|
1085
1086
|
* template panel, the Templates page and the template preview page
|
package/dist/{TemplateConfigurationModal-BNtbJ2fv.js → TemplateConfigurationModal-qNQGP7cm.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { a as DialogFooter, d as Input, i as DialogDescription, l as DialogTitle, o as DialogHeader, r as DialogContent, t as Dialog } from "./dialog-Cjb4lB4D.js";
|
|
3
3
|
import { t as Button } from "./button-DG7y_FVJ.js";
|
|
4
|
-
import { r as Badge } from "./TemplateCard-
|
|
4
|
+
import { r as Badge } from "./TemplateCard-6W2q2wiK.js";
|
|
5
5
|
import { t as Label } from "./label-CDy86rIZ.js";
|
|
6
6
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
7
7
|
import { useEffect, useMemo, useState } from "react";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as Button } from "./button-DG7y_FVJ.js";
|
|
3
|
-
import { n as templatePreview, r as Badge } from "./TemplateCard-
|
|
3
|
+
import { n as templatePreview, r as Badge } from "./TemplateCard-6W2q2wiK.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
5
|
import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
|
|
6
6
|
import { Icon } from "@iconify/react";
|