@burdenoff/fluidgrids-fe-sdk 2026.1112.11 → 2026.1113.2
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/{AiStudioPage-Q3455WO6.js → AiStudioPage-5KYZ8r8-.js} +464 -7
- package/dist/{ApprovalInboxPage-Bb8H9ruw.js → ApprovalInboxPage-BsJX4osU.js} +4 -3
- package/dist/{ConnectionFormDialog-Bg9_OdHX.js → ConnectionFormDialog-Dr1-CTan.js} +2 -1
- package/dist/CreateFluidgridsTagDocument-Dtp9KPLJ.js +1055 -0
- package/dist/{DataSinkDashboardPage-B5bqPnUn.js → DataSinkDashboardPage-8ZDn85e2.js} +1 -1
- package/dist/{DataTablesPage-Zz23QZQp.js → DataTablesPage-BBvABuxE.js} +5 -4
- package/dist/{EntityTagPicker-CuZAMby_.js → EntityTagPicker-BppBSEJk.js} +2 -2
- package/dist/{ExecutionDetailPage-UyXErYuS.js → ExecutionDetailPage-BXDF2eoT.js} +1601 -31
- package/dist/ExecutionsListDocument-CzdLPpj5.js +1259 -0
- package/dist/{ExecutionsListPage-CUJQA0Vk.js → ExecutionsListPage--4BthM8L.js} +286 -12
- package/dist/FailureTriagePanel-B5WCSRFo.js +1252 -0
- package/dist/{FluidGridsProvider-CGi9a1So.js → FluidGridsProvider-Dc_Jhtch.js} +8666 -8734
- package/dist/{HistoryPage-DLqmeQ12.js → HistoryPage-BvFk2m1m.js} +4 -3
- package/dist/{InsightsPage-CqtPCpj7.js → InsightsPage-Dwmb02F6.js} +2682 -5
- package/dist/{MissingNodesInstallModal-Df4fEAnr.js → MissingNodesInstallModal-Cze674hp.js} +2 -2
- package/dist/{NodesPage-YQ-hP60x.js → NodesPage-C5Dq-ru-.js} +3 -2
- package/dist/{OpenTemplateAsCodeButton-BmuHhDRr.js → OpenTemplateAsCodeButton-8MZHih6I.js} +2 -2
- package/dist/{PaidTemplateConfirm-BTrK35af.js → PaidTemplateConfirm-0G-gv29n.js} +1 -1
- package/dist/{PublishCustomNodeAction-5XXnSA3H.js → PublishCustomNodeAction-OOY35dUv.js} +1 -1
- package/dist/QuotaExhaustedDialog-wvu_-WJ-.js +55 -0
- package/dist/{RunnerStatusPill-Ctg4TJcP.js → RunnerStatusPill-Bh7mEsPh.js} +2 -1
- package/dist/{RunnersPage-CAt4YDhB.js → RunnersPage-DHeuUDil.js} +2 -2
- package/dist/{SettingsPage-CVvaQ_g9.js → SettingsPage-CfjXiGpb.js} +694 -14
- package/dist/{TagFilterSelect-DcusTt1p.js → TagFilterSelect-CAShgvbS.js} +1 -1
- package/dist/{TaskQueuesPage-C2dkenVF.js → TaskQueuesPage--Mmn36b-.js} +3 -3
- package/dist/{TemplateCard-DFbYdC2c.js → TemplateCard-BA_9em22.js} +644 -352
- package/dist/{TemplateConfigurationModal-Dw2UgWYF.js → TemplateConfigurationModal-BT3PaR0O.js} +4 -3
- package/dist/{TemplateDetailPanel-DDySr7_1.js → TemplateDetailPanel-BxFNnlXm.js} +2 -1
- package/dist/{TemplatePreview-D8zWdTGv.js → TemplatePreview-Bagja6WN.js} +7 -7
- package/dist/{TemplatesPage-XCwxJjN6.js → TemplatesPage-CAajpJ5w.js} +711 -6
- package/dist/{VariablesPage-DpiLh99E.js → VariablesPage-CgUBKhAe.js} +3 -3
- package/dist/{VersionDiffDialog-c27yet_-.js → VersionDiffDialog-D9W5Fm56.js} +233 -129
- package/dist/VersionLifecycleBar-DuphLOT0.js +131 -0
- package/dist/{WorkflowBuilder-CXqwzR7a.js → WorkflowBuilder-DMpSPElu.js} +16 -13
- package/dist/{WorkflowBuilder-BaNAX7Nk.js → WorkflowBuilder-v8h8skwG.js} +5 -5
- package/dist/WorkflowDefinitionDocument-DZLbTPUZ.js +321 -0
- package/dist/WorkflowEditLeaseStatusDocument-Dp62med3.js +627 -0
- package/dist/WorkflowProposalCard-zCdUpCk8.js +249 -0
- package/dist/WorkflowProposalDocument-BdUbsrd0.js +620 -0
- package/dist/{WorkflowSearchRedirect-DsQ71VcC.js → WorkflowSearchRedirect-G78lINAE.js} +1 -1
- package/dist/{WorkflowShareDialog-BRwTF9QB.js → WorkflowShareDialog-B7VOgr4-.js} +304 -3
- package/dist/WorkflowVersionsDocument-CfPMloRW.js +3195 -0
- package/dist/{WorkflowsList-DQW-WLl5.js → WorkflowsList-CPYzfE4K.js} +11 -9
- package/dist/agent-form-D0uLvzx4.js +718 -0
- package/dist/{agentTools-edsllozS.js → agentTools-DTXUqtfu.js} +4 -4
- package/dist/api-BZVyX5d2.js +2286 -0
- package/dist/api-BqA-f-AD.js +8064 -0
- package/dist/app-BJUvugPM.js +3813 -0
- package/dist/assert-rules-CPNrO44K.js +318 -0
- package/dist/attach-node-helpers-CNsYtLOR.js +32 -0
- package/dist/badge-CXfPhoMH.js +26 -0
- package/dist/{canvasNoteTools-DzNTcQGo.js → canvasNoteTools-DmfZwtnL.js} +3 -3
- package/dist/{channel-CZ70oI81.js → channel-DtF1n_ab.js} +1 -1
- package/dist/client-Ctl4jmY3.js +127 -0
- package/dist/code-editor-diagnostics-Zr0cIcx1.js +46 -0
- package/dist/{code-editor-field-B2l-B8in.js → code-editor-field-Cv907s3W.js} +2 -2
- package/dist/{codec-client-CJ95Rmqo.js → codec-client-CAYl6j46.js} +2 -1
- package/dist/conditionBuilder-D8aLGL1w.js +1134 -0
- package/dist/config-X97zrIvn.js +600 -0
- package/dist/{definition-canvas-Bshn_dSP.js → definition-canvas-DL25_6NH.js} +1 -1
- package/dist/{dialog-Cjb4lB4D.js → dialog-BVd152GS.js} +3 -14
- package/dist/durable-nodes-DXCCQYWD.js +81 -0
- package/dist/errors-xPZ-IbQd.js +142 -0
- package/dist/executions.js +2 -2
- package/dist/{flow-builder-B2JGvYeK.js → flow-builder-Dv5fWJ6F.js} +9781 -8416
- package/dist/{node-registry-refresh-Dy0uRg9f.js → global-client-DP_Wxe5t.js} +2 -27
- package/dist/global-operations-7pvXw_j9.js +145 -0
- package/dist/history.js +1 -1
- package/dist/{index-ChYBGz_a.d.ts → index-DtMUtXNq.d.ts} +306 -246
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4404 -47
- package/dist/input-ChT6Q-Pr.js +17 -0
- package/dist/logs-panel-DtG93ocy.js +342 -0
- package/dist/mapping-colors-BIX_YeCQ.js +48 -0
- package/dist/{node-detail-view-BDXhEGVD.js → node-detail-view-BKI_2kM6.js} +12 -11
- package/dist/{node-editor-tab-body-DBnsqYUK.js → node-editor-tab-body-Cc1MWEFR.js} +3 -3
- package/dist/{node-operation-selection-DAbS6jSY.js → node-operation-selection-Czeeb2D4.js} +2 -139
- package/dist/node-registry-refresh-s3okf83X.js +27 -0
- package/dist/nodes.js +1 -1
- package/dist/notesKey-5EaREBGA.js +12 -0
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -2
- package/dist/{popover-Cl7_tXph.js → popover-DDv7J1Kl.js} +717 -6
- package/dist/{quick-config-panel-C_Z0RXEG.js → quick-config-panel-BPCRfqWI.js} +4 -4
- package/dist/read-only-context-Dt9N9SIG.js +18 -0
- package/dist/{schedule-panel-CFAKmrBH.js → schedule-panel-C1KwfLCE.js} +197 -79
- package/dist/settings.js +1 -1
- package/dist/{shared-CMfn30xT.js → shared-Ctl9ZHo1.js} +2 -1
- package/dist/{sidebar-node-editor-DZZlDElK.js → sidebar-node-editor-d9Rlq5pU.js} +4 -4
- package/dist/sticky-notes-23j-wL6Q.js +96 -0
- package/dist/template-code-dqRunGOv.js +184 -0
- package/dist/template-preview-C01KV277.js +29 -0
- package/dist/templates.js +2 -2
- package/dist/token-refresh-link-BjN7H4qA.js +291 -0
- package/dist/useAgentDefinitions-ZKX2N9aP.js +3101 -0
- package/dist/useConnections-BlB0gbOB.js +931 -0
- package/dist/useDurableParity-BgLH_SCF.js +2088 -0
- package/dist/{useEntityTags-BpDeLhzV.js → useEntityTags-4iW6UTly.js} +227 -3
- package/dist/{useExecutions-D2iKpt1Z.js → useExecutions-Bm7q_UwN.js} +6 -3
- package/dist/useGlobalStoreClient-DMTrywdX.js +24 -0
- package/dist/{useHumanRequests-ZiR0sSzS.js → useHumanRequests-DwG2tQ3f.js} +2 -1
- package/dist/{useObservability-DIhzs9F-.js → useObservability-DPATdbw7.js} +4 -2
- package/dist/{useRunHistory-BhVY82Pg.js → useRunHistory-CGfjCsJ3.js} +1122 -4
- package/dist/{useVariables-2ddyJX4a.js → useVariables-DFdZofLQ.js} +2 -1
- package/dist/{useWorkflowCodeExport-BXy4NPsE.js → useWorkflowCodeExport-D_mCuhKP.js} +289 -4
- package/dist/useWorkflowOrganization-r5FWNBs6.js +1690 -0
- package/dist/useWorkflowProposal-Bh2_qjmM.js +7478 -0
- package/dist/{useWorkflows-Clsu0o8t.js → useWorkflows-aqVD7kGa.js} +694 -4
- package/dist/workflow-builder.js +5 -5
- package/dist/{workflow-code-transfer-DemcCpOv.js → workflow-code-transfer-5C0HUzae.js} +1 -53
- package/dist/workflow-host.js +4 -2
- package/dist/workflow-pages.d.ts +1 -1
- package/dist/workflow-pages.js +19 -19
- package/dist/workflow-preview.js +3 -2
- package/dist/workflows-list.js +1 -1
- package/package.json +1 -1
- package/dist/FailureTriagePanel-BjatYyAa.js +0 -311
- package/dist/WorkflowProposalCard-BvmJ5ea8.js +0 -1245
- package/dist/agent-form-Bfvm32j1.js +0 -83
- package/dist/api-Dw8nfVRD.js +0 -55
- package/dist/api-m8hX_l2k.js +0 -224
- package/dist/client-C9XSzSXr.js +0 -1147
- package/dist/graphql-operation-types-DZVhCBEi.js +0 -52817
- package/dist/useAgentDefinitions-B4sw7bLw.js +0 -550
- package/dist/useConnections-Cs7LCWEM.js +0 -401
- package/dist/useDurableParity-jtqJF547.js +0 -504
- package/dist/useWorkflowOrganization-C4y6BOnN.js +0 -282
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-QqidFIgr.js";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
// src/ui/input.tsx
|
|
7
|
+
const Input = forwardRef(({ className, type, ...props }, ref) => {
|
|
8
|
+
return /* @__PURE__ */ jsx("input", {
|
|
9
|
+
type,
|
|
10
|
+
className: cn("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", className),
|
|
11
|
+
ref,
|
|
12
|
+
...props
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
Input.displayName = "Input";
|
|
16
|
+
|
|
17
|
+
export { Input as t };
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { M as useFlowStore } from "./node-operation-selection-Czeeb2D4.js";
|
|
3
|
+
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
import { Icon } from "@iconify/react";
|
|
6
|
+
import { cn } from "@burdenoff/fe-libs/utils";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { useShallow } from "zustand/shallow";
|
|
9
|
+
import { Button } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
|
|
11
|
+
// src/builder/components/flow-builder/components/logs-panel/logs-panel.tsx
|
|
12
|
+
const JsonView = ({ data }) => {
|
|
13
|
+
const tr = useTr();
|
|
14
|
+
if (!data) return /* @__PURE__ */ jsx("div", {
|
|
15
|
+
className: "text-tertiary p-4",
|
|
16
|
+
children: tr("fluidgrids.builder.logsPanel.jsonViewNoData", "No data")
|
|
17
|
+
});
|
|
18
|
+
return /* @__PURE__ */ jsx("pre", {
|
|
19
|
+
className: "text-xs overflow-auto p-4 bg-card/50 rounded h-full",
|
|
20
|
+
children: JSON.stringify(data, null, 2)
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
const TableView = ({ data }) => {
|
|
24
|
+
const tr = useTr();
|
|
25
|
+
if (!data) return /* @__PURE__ */ jsx("div", {
|
|
26
|
+
className: "text-tertiary p-4",
|
|
27
|
+
children: tr("fluidgrids.builder.logsPanel.tableViewNoData", "No data")
|
|
28
|
+
});
|
|
29
|
+
const entries = Object.entries(data);
|
|
30
|
+
if (entries.length === 0) return /* @__PURE__ */ jsx("div", {
|
|
31
|
+
className: "text-tertiary p-4",
|
|
32
|
+
children: tr("fluidgrids.builder.logsPanel.tableViewEmptyObject", "Empty object")
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ jsx("div", {
|
|
35
|
+
className: "overflow-auto h-full",
|
|
36
|
+
children: /* @__PURE__ */ jsxs("table", {
|
|
37
|
+
className: "w-full text-xs",
|
|
38
|
+
children: [/* @__PURE__ */ jsx("thead", {
|
|
39
|
+
className: "bg-card-foreground/10 sticky top-0",
|
|
40
|
+
children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
41
|
+
/* @__PURE__ */ jsx("th", {
|
|
42
|
+
className: "text-left p-2",
|
|
43
|
+
children: tr("fluidgrids.builder.logsPanel.tableColumnField", "Field")
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsx("th", {
|
|
46
|
+
className: "text-left p-2",
|
|
47
|
+
children: tr("fluidgrids.builder.logsPanel.tableColumnType", "Type")
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ jsx("th", {
|
|
50
|
+
className: "text-left p-2",
|
|
51
|
+
children: tr("fluidgrids.builder.logsPanel.tableColumnValue", "Value")
|
|
52
|
+
})
|
|
53
|
+
] })
|
|
54
|
+
}), /* @__PURE__ */ jsx("tbody", { children: entries.map(([key, value]) => /* @__PURE__ */ jsxs("tr", {
|
|
55
|
+
className: "border-b border-card-foreground/10",
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsx("td", {
|
|
58
|
+
className: "p-2 font-medium text-accent",
|
|
59
|
+
children: key
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ jsx("td", {
|
|
62
|
+
className: "p-2 text-secondary",
|
|
63
|
+
children: typeof value
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ jsx("td", {
|
|
66
|
+
className: "p-2 truncate max-w-[200px]",
|
|
67
|
+
children: typeof value === "object" ? JSON.stringify(value) : String(value)
|
|
68
|
+
})
|
|
69
|
+
]
|
|
70
|
+
}, key)) })]
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
const LogListItem = ({ log, isSelected, onClick }) => {
|
|
75
|
+
const statusIcon = {
|
|
76
|
+
pending: "mdi:clock-outline",
|
|
77
|
+
running: "svg-spinners:ring-resize",
|
|
78
|
+
completed: "mdi:check-circle",
|
|
79
|
+
failed: "mdi:close-circle"
|
|
80
|
+
}[log.status];
|
|
81
|
+
const statusColor = {
|
|
82
|
+
pending: "text-tertiary",
|
|
83
|
+
running: "text-accent",
|
|
84
|
+
completed: "text-[var(--color-status-success-text)]",
|
|
85
|
+
failed: "text-[var(--color-status-error-text)]"
|
|
86
|
+
}[log.status];
|
|
87
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
88
|
+
onClick,
|
|
89
|
+
className: cn("w-full text-left p-2 flex items-center gap-2 text-xs transition-colors", isSelected ? "bg-primary/20 border-l-2 border-primary" : "hover:bg-card-foreground/10"),
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
92
|
+
icon: statusIcon,
|
|
93
|
+
className: cn("size-4", statusColor)
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ jsx("span", {
|
|
96
|
+
className: "truncate flex-1",
|
|
97
|
+
children: log.nodeName
|
|
98
|
+
}),
|
|
99
|
+
log.duration && /* @__PURE__ */ jsxs("span", {
|
|
100
|
+
className: "text-tertiary text-[10px]",
|
|
101
|
+
children: [log.duration.toFixed(2), "s"]
|
|
102
|
+
})
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
const LogDetailView = ({ log }) => {
|
|
107
|
+
const tr = useTr();
|
|
108
|
+
const [activeTab, setActiveTab] = useState("output");
|
|
109
|
+
const [viewMode, setViewMode] = useState("json");
|
|
110
|
+
if (!log) return /* @__PURE__ */ jsx("div", {
|
|
111
|
+
className: "flex-1 flex items-center justify-center text-tertiary text-sm",
|
|
112
|
+
children: tr("fluidgrids.builder.logsPanel.detailEmptyState", "Select a step to view details")
|
|
113
|
+
});
|
|
114
|
+
const statusColor = {
|
|
115
|
+
pending: "text-tertiary",
|
|
116
|
+
running: "text-accent",
|
|
117
|
+
completed: "text-[var(--color-status-success-text)]",
|
|
118
|
+
failed: "text-[var(--color-status-error-text)]"
|
|
119
|
+
}[log.status];
|
|
120
|
+
const data = activeTab === "input" ? log.inputArgs : log.output;
|
|
121
|
+
const itemCount = data ? Object.keys(data).length : 0;
|
|
122
|
+
const resumeUrl = typeof log.output?._resumeUrl === "string" ? log.output._resumeUrl : null;
|
|
123
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
124
|
+
className: "flex-1 flex flex-col",
|
|
125
|
+
children: [
|
|
126
|
+
/* @__PURE__ */ jsxs("div", {
|
|
127
|
+
className: "flex items-center justify-between p-2 border-b border-card-foreground/10",
|
|
128
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
129
|
+
className: "flex items-center gap-2",
|
|
130
|
+
children: [
|
|
131
|
+
/* @__PURE__ */ jsx("span", {
|
|
132
|
+
className: "text-sm font-medium",
|
|
133
|
+
children: log.nodeName
|
|
134
|
+
}),
|
|
135
|
+
/* @__PURE__ */ jsx("span", {
|
|
136
|
+
className: cn("text-xs capitalize", statusColor),
|
|
137
|
+
children: log.status === "completed" ? tr("fluidgrids.builder.logsPanel.statusSuccess", "Success") : log.status
|
|
138
|
+
}),
|
|
139
|
+
log.duration && /* @__PURE__ */ jsxs("span", {
|
|
140
|
+
className: "text-xs text-text-muted",
|
|
141
|
+
children: [
|
|
142
|
+
"in ",
|
|
143
|
+
(log.duration * 1e3).toFixed(0),
|
|
144
|
+
"ms"
|
|
145
|
+
]
|
|
146
|
+
})
|
|
147
|
+
]
|
|
148
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
149
|
+
className: "flex items-center gap-1",
|
|
150
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
151
|
+
variant: viewMode === "json" ? "secondary" : "ghost",
|
|
152
|
+
size: "icon",
|
|
153
|
+
className: "size-6",
|
|
154
|
+
onClick: () => setViewMode("json"),
|
|
155
|
+
title: tr("fluidgrids.builder.logsPanel.jsonViewTooltip", "JSON View"),
|
|
156
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
157
|
+
icon: "mdi:code-json",
|
|
158
|
+
className: "size-3"
|
|
159
|
+
})
|
|
160
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
161
|
+
variant: viewMode === "table" ? "secondary" : "ghost",
|
|
162
|
+
size: "icon",
|
|
163
|
+
className: "size-6",
|
|
164
|
+
onClick: () => setViewMode("table"),
|
|
165
|
+
title: tr("fluidgrids.builder.logsPanel.tableViewTooltip", "Table View"),
|
|
166
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
167
|
+
icon: "mdi:table",
|
|
168
|
+
className: "size-3"
|
|
169
|
+
})
|
|
170
|
+
})]
|
|
171
|
+
})]
|
|
172
|
+
}),
|
|
173
|
+
resumeUrl && /* @__PURE__ */ jsxs("div", {
|
|
174
|
+
className: "flex items-center gap-2 border-b border-card-foreground/10 px-2 py-2",
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ jsx("span", {
|
|
177
|
+
className: "shrink-0 text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground",
|
|
178
|
+
children: tr("fluidgrids.builder.logsPanel.resumeUrl", "Resume URL")
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ jsx("input", {
|
|
181
|
+
readOnly: true,
|
|
182
|
+
value: resumeUrl,
|
|
183
|
+
onFocus: (e) => e.currentTarget.select(),
|
|
184
|
+
className: "min-w-0 flex-1 rounded-md border border-border bg-muted/40 px-2 py-1 font-mono text-[11px] outline-none focus:border-primary"
|
|
185
|
+
}),
|
|
186
|
+
/* @__PURE__ */ jsx("button", {
|
|
187
|
+
type: "button",
|
|
188
|
+
onClick: () => void navigator.clipboard?.writeText(resumeUrl),
|
|
189
|
+
className: "shrink-0 rounded-md border border-border px-2 py-1 text-[11px] font-medium hover:bg-muted",
|
|
190
|
+
children: tr("fluidgrids.builder.logsPanel.copy", "Copy")
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}),
|
|
194
|
+
/* @__PURE__ */ jsxs("div", {
|
|
195
|
+
className: "flex border-b border-card-foreground/10",
|
|
196
|
+
children: [
|
|
197
|
+
/* @__PURE__ */ jsx("button", {
|
|
198
|
+
className: cn("px-4 py-2 text-xs font-medium transition-colors duration-200", activeTab === "input" ? "border-b-2 border-primary text-primary" : "text-secondary hover:text-primary"),
|
|
199
|
+
onClick: () => setActiveTab("input"),
|
|
200
|
+
children: tr("fluidgrids.builder.logsPanel.tabInput", "Input")
|
|
201
|
+
}),
|
|
202
|
+
/* @__PURE__ */ jsx("button", {
|
|
203
|
+
className: cn("px-4 py-2 text-xs font-medium transition-colors duration-200", activeTab === "output" ? "border-b-2 border-primary text-primary" : "text-secondary hover:text-primary"),
|
|
204
|
+
onClick: () => setActiveTab("output"),
|
|
205
|
+
children: tr("fluidgrids.builder.logsPanel.tabOutput", "Output")
|
|
206
|
+
}),
|
|
207
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1" }),
|
|
208
|
+
/* @__PURE__ */ jsxs("span", {
|
|
209
|
+
className: "px-4 py-2 text-xs text-tertiary",
|
|
210
|
+
children: [
|
|
211
|
+
itemCount,
|
|
212
|
+
" ",
|
|
213
|
+
itemCount !== 1 ? tr("fluidgrids.builder.logsPanel.itemCountOther", "items") : tr("fluidgrids.builder.logsPanel.itemCountOne", "item")
|
|
214
|
+
]
|
|
215
|
+
})
|
|
216
|
+
]
|
|
217
|
+
}),
|
|
218
|
+
/* @__PURE__ */ jsx("div", {
|
|
219
|
+
className: "flex-1 overflow-auto",
|
|
220
|
+
children: log.error && activeTab === "output" ? /* @__PURE__ */ jsxs("div", {
|
|
221
|
+
className: "p-4 bg-[var(--color-status-error-bg-subtle)] text-[var(--color-status-error-text)] text-xs",
|
|
222
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
223
|
+
className: "font-medium mb-1",
|
|
224
|
+
children: tr("fluidgrids.builder.logsPanel.errorHeading", "Error:")
|
|
225
|
+
}), log.error]
|
|
226
|
+
}) : viewMode === "json" ? /* @__PURE__ */ jsx(JsonView, { data }) : /* @__PURE__ */ jsx(TableView, { data })
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
const LogsPanel = () => {
|
|
232
|
+
const tr = useTr();
|
|
233
|
+
const [logs, selectedLogId, panelExpanded, selectLog, togglePanel, clearLogs] = useFlowStore(useShallow((s) => [
|
|
234
|
+
s.execution.logs,
|
|
235
|
+
s.execution.selectedLogId,
|
|
236
|
+
s.execution.panelExpanded,
|
|
237
|
+
s.actions.execution.selectLog,
|
|
238
|
+
s.actions.execution.togglePanel,
|
|
239
|
+
s.actions.execution.clearLogs
|
|
240
|
+
]));
|
|
241
|
+
const selectedLog = logs.find((l) => l.id === selectedLogId) || null;
|
|
242
|
+
const [panelHeight, setPanelHeight] = useState(350);
|
|
243
|
+
const isResizing = useRef(false);
|
|
244
|
+
const startY = useRef(0);
|
|
245
|
+
const startHeight = useRef(0);
|
|
246
|
+
const handleMouseDown = useCallback((e) => {
|
|
247
|
+
e.preventDefault();
|
|
248
|
+
isResizing.current = true;
|
|
249
|
+
startY.current = e.clientY;
|
|
250
|
+
startHeight.current = panelHeight;
|
|
251
|
+
document.body.style.cursor = "ns-resize";
|
|
252
|
+
document.body.style.userSelect = "none";
|
|
253
|
+
}, [panelHeight]);
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
const handleMouseMove = (e) => {
|
|
256
|
+
if (!isResizing.current) return;
|
|
257
|
+
const deltaY = startY.current - e.clientY;
|
|
258
|
+
const newHeight = Math.max(150, Math.min(600, startHeight.current + deltaY));
|
|
259
|
+
setPanelHeight(newHeight);
|
|
260
|
+
};
|
|
261
|
+
const handleMouseUp = () => {
|
|
262
|
+
isResizing.current = false;
|
|
263
|
+
document.body.style.cursor = "";
|
|
264
|
+
document.body.style.userSelect = "";
|
|
265
|
+
};
|
|
266
|
+
document.addEventListener("mousemove", handleMouseMove);
|
|
267
|
+
document.addEventListener("mouseup", handleMouseUp);
|
|
268
|
+
return () => {
|
|
269
|
+
document.removeEventListener("mousemove", handleMouseMove);
|
|
270
|
+
document.removeEventListener("mouseup", handleMouseUp);
|
|
271
|
+
};
|
|
272
|
+
}, []);
|
|
273
|
+
if (!panelExpanded && logs.length === 0) return null;
|
|
274
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
275
|
+
className: cn("relative border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm transition-[height] duration-150", !panelExpanded && "h-10"),
|
|
276
|
+
style: { height: panelExpanded ? panelHeight : 40 },
|
|
277
|
+
children: [
|
|
278
|
+
panelExpanded && /* @__PURE__ */ jsx("div", {
|
|
279
|
+
className: "absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize bg-transparent hover:bg-primary/30 transition-colors z-10 group",
|
|
280
|
+
onMouseDown: handleMouseDown,
|
|
281
|
+
children: /* @__PURE__ */ jsx("div", { className: "absolute top-0.5 left-1/2 -translate-x-1/2 w-8 h-0.5 rounded-full bg-card-foreground/20 group-hover:bg-primary/50 transition-colors" })
|
|
282
|
+
}),
|
|
283
|
+
/* @__PURE__ */ jsxs("div", {
|
|
284
|
+
className: "h-10 flex items-center justify-between px-3 border-b border-card-foreground/10",
|
|
285
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
286
|
+
className: "flex items-center gap-2",
|
|
287
|
+
children: [
|
|
288
|
+
/* @__PURE__ */ jsx(Button, {
|
|
289
|
+
variant: "ghost",
|
|
290
|
+
size: "icon",
|
|
291
|
+
className: "size-6",
|
|
292
|
+
onClick: togglePanel,
|
|
293
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
294
|
+
icon: panelExpanded ? "mdi:chevron-down" : "mdi:chevron-up",
|
|
295
|
+
className: "size-4"
|
|
296
|
+
})
|
|
297
|
+
}),
|
|
298
|
+
/* @__PURE__ */ jsx("span", {
|
|
299
|
+
className: "text-sm font-medium",
|
|
300
|
+
children: tr("fluidgrids.builder.logsPanel.title", "Logs")
|
|
301
|
+
}),
|
|
302
|
+
logs.length > 0 && /* @__PURE__ */ jsxs("span", {
|
|
303
|
+
className: "text-xs text-tertiary",
|
|
304
|
+
children: [
|
|
305
|
+
"(",
|
|
306
|
+
logs.length,
|
|
307
|
+
" ",
|
|
308
|
+
tr("fluidgrids.builder.logsPanel.stepsSuffix", "steps"),
|
|
309
|
+
")"
|
|
310
|
+
]
|
|
311
|
+
})
|
|
312
|
+
]
|
|
313
|
+
}), logs.length > 0 && /* @__PURE__ */ jsxs(Button, {
|
|
314
|
+
variant: "ghost",
|
|
315
|
+
size: "sm",
|
|
316
|
+
className: "h-6 text-xs",
|
|
317
|
+
onClick: clearLogs,
|
|
318
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
319
|
+
icon: "mdi:trash-can-outline",
|
|
320
|
+
className: "size-3 mr-1"
|
|
321
|
+
}), tr("fluidgrids.builder.logsPanel.clearExecution", "Clear execution")]
|
|
322
|
+
})]
|
|
323
|
+
}),
|
|
324
|
+
panelExpanded && /* @__PURE__ */ jsxs("div", {
|
|
325
|
+
className: "flex h-[calc(100%-40px)]",
|
|
326
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
327
|
+
className: "w-[200px] border-r border-card-foreground/10 overflow-y-auto",
|
|
328
|
+
children: logs.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
329
|
+
className: "p-4 text-xs text-tertiary text-center",
|
|
330
|
+
children: tr("fluidgrids.builder.logsPanel.emptyState", "No execution logs yet")
|
|
331
|
+
}) : logs.map((log) => /* @__PURE__ */ jsx(LogListItem, {
|
|
332
|
+
log,
|
|
333
|
+
isSelected: log.id === selectedLogId,
|
|
334
|
+
onClick: () => selectLog(log.id)
|
|
335
|
+
}, log.id))
|
|
336
|
+
}), /* @__PURE__ */ jsx(LogDetailView, { log: selectedLog })]
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
export { LogsPanel as n, TableView as r, JsonView as t };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { edgeColor } from "@burdenoff/fe-libs/shared/utils";
|
|
3
|
+
|
|
4
|
+
// src/builder/components/mapper/config/mapping-colors.ts
|
|
5
|
+
/**
|
|
6
|
+
* Colours for mapper edges and mapping-type chips (G19).
|
|
7
|
+
*
|
|
8
|
+
* Every value is a semantic token (a CSS `var()` reference to a `--color-`
|
|
9
|
+
* custom property) from fe-libs: the compatible / incompatible pair uses the
|
|
10
|
+
* canvas edge tokens and each mapping type gets a fixed categorical chart
|
|
11
|
+
* colour series, so the mapper follows light / dark mode, the brand and the
|
|
12
|
+
* high-contrast theme. These literal CSS-variable strings work in React Flow
|
|
13
|
+
* edge styles, SVG `style` props and inline styles.
|
|
14
|
+
*
|
|
15
|
+
* NOTE: never write syntactically class-like placeholders (ellipsis or
|
|
16
|
+
* wildcard arbitrary-value examples such as bracketed var references) in this
|
|
17
|
+
* file's docs — Tailwind v4 extracts candidates from published package
|
|
18
|
+
* content, and placeholder prose becomes invalid generated CSS in every
|
|
19
|
+
* consuming app (BOFF-6688 / BOFF-6718).
|
|
20
|
+
*/
|
|
21
|
+
const MAPPING_COMPATIBILITY_COLORS = {
|
|
22
|
+
compatible: edgeColor("compatible"),
|
|
23
|
+
incompatible: edgeColor("incompatible")
|
|
24
|
+
};
|
|
25
|
+
const MAPPING_TYPE_COLORS = {
|
|
26
|
+
direct: MAPPING_COMPATIBILITY_COLORS.compatible,
|
|
27
|
+
expression: "var(--color-chart-3)",
|
|
28
|
+
transform: "var(--color-chart-10)",
|
|
29
|
+
cast: "var(--color-chart-2)",
|
|
30
|
+
array: "var(--color-chart-4)",
|
|
31
|
+
object: "var(--color-chart-12)",
|
|
32
|
+
context: "var(--color-chart-11)"
|
|
33
|
+
};
|
|
34
|
+
/** Colour for a mapping type that is unknown or has no colour configured. */
|
|
35
|
+
const MAPPING_FALLBACK_COLOR = edgeColor("default");
|
|
36
|
+
function isMappingTypeKey(value) {
|
|
37
|
+
return Object.prototype.hasOwnProperty.call(MAPPING_TYPE_COLORS, value);
|
|
38
|
+
}
|
|
39
|
+
/** The token colour of a mapping type; unknown types get the default edge colour. */
|
|
40
|
+
function mappingTypeColor(mappingType) {
|
|
41
|
+
return isMappingTypeKey(mappingType) ? MAPPING_TYPE_COLORS[mappingType] : MAPPING_FALLBACK_COLOR;
|
|
42
|
+
}
|
|
43
|
+
/** Edge colour for a direct mapping, by whether the two field types are compatible. */
|
|
44
|
+
function compatibilityColor(isCompatible) {
|
|
45
|
+
return isCompatible ? MAPPING_COMPATIBILITY_COLORS.compatible : MAPPING_COMPATIBILITY_COLORS.incompatible;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { mappingTypeColor as a, compatibilityColor as i, MAPPING_FALLBACK_COLOR as n, MAPPING_TYPE_COLORS as r, MAPPING_COMPATIBILITY_COLORS as t };
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { a as TabButton, c as NDV_Z_INDEX, i as ReadOnlyFieldset, n as SchedulePanel, o as NodeSettingsPanel, r as NodeExecutionActions, s as NodeParamsForm, t as SCHEDULE_NODE_TYPE } from "./schedule-panel-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { M as useFlowStore, a as changedSourceFiles, c as diagnosticsByPath, d as isEditableSourcePath, f as projectLanguage, h as sourceLanguageOf, l as interfaceFields, o as childRunIdOf, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, s as defaultSourcePath, u as interfaceHandlers } from "./node-operation-selection-Czeeb2D4.js";
|
|
4
|
+
import { F as nodeTitle, In as getNodeDetail, Jt as useNodeExecution, P as nodeSubtitle, Y as FieldTree, Z as latestNodeLog, cn as clearCodeWorkflowDefinitionCache, et as useGuardedNavigate, fn as declaredSignals, tn as fieldsFromValue, un as useCodeWorkflowInterface, z as useNodeConfig } from "./FluidGridsProvider-Dc_Jhtch.js";
|
|
5
|
+
import { a as TabButton, c as NDV_Z_INDEX, i as ReadOnlyFieldset, n as SchedulePanel, o as NodeSettingsPanel, r as NodeExecutionActions, s as NodeParamsForm, t as SCHEDULE_NODE_TYPE } from "./schedule-panel-C1KwfLCE.js";
|
|
6
|
+
import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
|
|
7
|
+
import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
|
|
8
|
+
import { i as FileDownloadUrlDocument, n as WorkflowCodeSourceDocument, r as BuildWorkflowCodeDocument, t as WorkflowEditLeaseStatusDocument } from "./WorkflowEditLeaseStatusDocument-Dp62med3.js";
|
|
9
|
+
import { r as TableView, t as JsonView } from "./logs-panel-DtG93ocy.js";
|
|
10
|
+
import { hn as NodeStatesDocument, jt as useUnpinNodeDataMutation, qt as useWorkflowPinnedDataQuery, st as usePinNodeDataMutation } from "./useAgentDefinitions-ZKX2N9aP.js";
|
|
10
11
|
import { l as useDurableFunctionNodesEnabled, m as usePhaseCFlags } from "./feature-flags-B_b8PJ6Z.js";
|
|
11
12
|
import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
|
|
12
|
-
import { t as CodeEditorField } from "./code-editor-field-
|
|
13
|
-
import { h as fetchCodeBundleSdk } from "./api-
|
|
14
|
-
import { n as SignalRunDialog, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-
|
|
15
|
-
import { s as isAgentNodeType } from "./agent-form-
|
|
13
|
+
import { t as CodeEditorField } from "./code-editor-field-Cv907s3W.js";
|
|
14
|
+
import { h as fetchCodeBundleSdk } from "./api-BqA-f-AD.js";
|
|
15
|
+
import { n as SignalRunDialog, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-CGfjCsJ3.js";
|
|
16
|
+
import { s as isAgentNodeType } from "./agent-form-D0uLvzx4.js";
|
|
16
17
|
import { n as agentTracePath } from "./ai-usage-bmUn-gJP.js";
|
|
17
18
|
import * as React$1 from "react";
|
|
18
19
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { M as useFlowStore } from "./node-operation-selection-Czeeb2D4.js";
|
|
3
|
+
import { F as nodeTitle, Y as FieldTree } from "./FluidGridsProvider-Dc_Jhtch.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
5
|
import { m as usePhaseCFlags } from "./feature-flags-B_b8PJ6Z.js";
|
|
6
6
|
import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
|
|
7
|
-
import { a as TabButton, i as ReadOnlyFieldset, n as SchedulePanel, o as NodeSettingsPanel, s as NodeParamsForm, t as SCHEDULE_NODE_TYPE } from "./schedule-panel-
|
|
7
|
+
import { a as TabButton, i as ReadOnlyFieldset, n as SchedulePanel, o as NodeSettingsPanel, s as NodeParamsForm, t as SCHEDULE_NODE_TYPE } from "./schedule-panel-C1KwfLCE.js";
|
|
8
8
|
import { useState } from "react";
|
|
9
9
|
import { Icon } from "@iconify/react";
|
|
10
10
|
import { cn } from "@burdenoff/fe-libs/utils";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
3
|
+
import { t as editorSeverity } from "./code-editor-diagnostics-Zr0cIcx1.js";
|
|
3
4
|
import * as React$1 from "react";
|
|
4
5
|
import { useCallback, useEffect, useMemo } from "react";
|
|
5
6
|
import { create } from "zustand";
|
|
@@ -825,100 +826,6 @@ const useFlowStore = create()((set, get) => {
|
|
|
825
826
|
});
|
|
826
827
|
if (typeof window !== "undefined" && import.meta.env?.DEV) window.__fgFlowStore = useFlowStore;
|
|
827
828
|
|
|
828
|
-
// src/builder/contants/symbols.ts
|
|
829
|
-
const NODE_TYPE_DRAG_DATA_FORMAT = "application/flow-builder.node-type";
|
|
830
|
-
/**
|
|
831
|
-
* Optional companion to NODE_TYPE_DRAG_DATA_FORMAT: carries the operation name
|
|
832
|
-
* a node instance should be pinned to when dropped. Set by the Node Store
|
|
833
|
-
* operation rows so a dragged operation lands on the canvas already configured
|
|
834
|
-
* (no on-card operation dropdown). Absent for built-in / control-flow drags.
|
|
835
|
-
*/
|
|
836
|
-
const NODE_OPERATION_DRAG_DATA_FORMAT = "application/flow-builder.node-operation";
|
|
837
|
-
/**
|
|
838
|
-
* Node type of the canvas sticky note (n8n-style annotation). Stickies are
|
|
839
|
-
* pure canvas decorations persisted in the workflow definition: they have no
|
|
840
|
-
* handles, are skipped by flow validation, and are never reached by execution
|
|
841
|
-
* (the run planner is trigger-rooted and edge-driven).
|
|
842
|
-
*/
|
|
843
|
-
const STICKY_NOTE_TYPE = "sticky-note";
|
|
844
|
-
|
|
845
|
-
// src/builder/lib/sticky-notes.ts
|
|
846
|
-
/**
|
|
847
|
-
* Sticky notes are persisted OUTSIDE `definitionJson.data.nodes`, under a
|
|
848
|
-
* sibling `stickyNotes` key, so nothing execution-adjacent (backend
|
|
849
|
-
* validators, run planning, trigger sync, analytics over nodes) ever sees
|
|
850
|
-
* them. On the canvas they still live as React Flow nodes; these helpers
|
|
851
|
-
* convert between the two shapes at the save/load boundary.
|
|
852
|
-
*/
|
|
853
|
-
/**
|
|
854
|
-
* n8n-parity sticky-note palette. The keys are persisted in workflow JSON
|
|
855
|
-
* (`data.color`); each value is built from semantic categorical tokens
|
|
856
|
-
* (fe-libs chart-* series), so the tints follow light/dark mode and the brand
|
|
857
|
-
* themes. The default theme has no orange series, so orange is mixed from
|
|
858
|
-
* the yellow and red series rather than borrowed from a status token: the
|
|
859
|
-
* warning token resolves to the same hue as chart-4, which made orange and
|
|
860
|
-
* yellow notes look identical.
|
|
861
|
-
*/
|
|
862
|
-
const STICKY_COLORS = {
|
|
863
|
-
yellow: "var(--color-chart-4)",
|
|
864
|
-
orange: "color-mix(in srgb, var(--color-chart-4) 50%, var(--color-chart-5))",
|
|
865
|
-
blue: "var(--color-chart-1)",
|
|
866
|
-
green: "var(--color-chart-2)",
|
|
867
|
-
red: "var(--color-chart-5)",
|
|
868
|
-
purple: "var(--color-chart-3)",
|
|
869
|
-
gray: "var(--color-chart-axis)"
|
|
870
|
-
};
|
|
871
|
-
const DEFAULT_STICKY_COLOR = "yellow";
|
|
872
|
-
/** Palette key for a stored note colour; unknown or missing keys fall back to the default. */
|
|
873
|
-
function resolveStickyColor(color) {
|
|
874
|
-
return typeof color === "string" && Object.hasOwn(STICKY_COLORS, color) ? color : DEFAULT_STICKY_COLOR;
|
|
875
|
-
}
|
|
876
|
-
/**
|
|
877
|
-
* Opacity of a sticky note's body fill and border, in percent. These match
|
|
878
|
-
* the hex alpha suffixes the notes used before the palette moved to semantic
|
|
879
|
-
* tokens (`1F` ≈ 12 %, `59` ≈ 35 %), so existing notes look the same.
|
|
880
|
-
*/
|
|
881
|
-
const STICKY_FILL_PERCENT = 12;
|
|
882
|
-
const STICKY_BORDER_PERCENT = 35;
|
|
883
|
-
/**
|
|
884
|
-
* Translucent tint of a palette colour. The palette holds CSS variables
|
|
885
|
-
* (`var(--color-chart-4)`), so a hex alpha suffix cannot be appended: the
|
|
886
|
-
* result (`var(--color-chart-4)1F`) is invalid CSS and the browser drops the
|
|
887
|
-
* whole declaration. `color-mix` works with any colour value, including
|
|
888
|
-
* variables, and keeps the note following the active theme.
|
|
889
|
-
*/
|
|
890
|
-
function stickyTint(color, percent) {
|
|
891
|
-
return `color-mix(in srgb, ${color} ${Math.min(100, Math.max(0, percent))}%, transparent)`;
|
|
892
|
-
}
|
|
893
|
-
/** Inline fill and border colours for a sticky note body. */
|
|
894
|
-
function stickySurfaceStyle(color) {
|
|
895
|
-
return {
|
|
896
|
-
backgroundColor: stickyTint(color, 12),
|
|
897
|
-
borderColor: stickyTint(color, 35)
|
|
898
|
-
};
|
|
899
|
-
}
|
|
900
|
-
function isStickyNode(node) {
|
|
901
|
-
return node?.type === STICKY_NOTE_TYPE;
|
|
902
|
-
}
|
|
903
|
-
/** Split canvas nodes into executable nodes and sticky notes (for save). */
|
|
904
|
-
function partitionStickyNotes(nodes) {
|
|
905
|
-
return {
|
|
906
|
-
nodes: nodes.filter((n) => !isStickyNode(n)),
|
|
907
|
-
stickyNotes: nodes.filter((n) => isStickyNode(n))
|
|
908
|
-
};
|
|
909
|
-
}
|
|
910
|
-
/**
|
|
911
|
-
* Combine a loaded definition's nodes + stickyNotes into one canvas node list
|
|
912
|
-
* (for load). Tolerates legacy definitions that still carry sticky nodes
|
|
913
|
-
* inside `nodes` (de-duplicated by id).
|
|
914
|
-
*/
|
|
915
|
-
function mergeStickyNotes(def) {
|
|
916
|
-
const nodes = Array.isArray(def.nodes) ? def.nodes : [];
|
|
917
|
-
const stickies = Array.isArray(def.stickyNotes) ? def.stickyNotes : [];
|
|
918
|
-
const seen = new Set(nodes.map((n) => n.id));
|
|
919
|
-
return [...nodes, ...stickies.filter((s) => s?.id && !seen.has(s.id))];
|
|
920
|
-
}
|
|
921
|
-
|
|
922
829
|
// src/builder/components/flow-builder/components/ui/node-type-icon.tsx
|
|
923
830
|
/**
|
|
924
831
|
* True when a manifest icon value is an image reference (URL / data URI)
|
|
@@ -1805,50 +1712,6 @@ function LogicNodeCard({ title, subtitle, icon, accent, selected, executionStatu
|
|
|
1805
1712
|
});
|
|
1806
1713
|
}
|
|
1807
1714
|
|
|
1808
|
-
// src/builder/components/ndv/code-editor-diagnostics.ts
|
|
1809
|
-
/** Maps the service's severity strings onto CodeMirror's three. */
|
|
1810
|
-
function editorSeverity(value) {
|
|
1811
|
-
const lower = value.toLowerCase();
|
|
1812
|
-
if (lower.startsWith("warn")) return "warning";
|
|
1813
|
-
if (lower === "info" || lower === "hint" || lower === "suggestion") return "info";
|
|
1814
|
-
return "error";
|
|
1815
|
-
}
|
|
1816
|
-
/** Start offsets of each line of `text`. */
|
|
1817
|
-
function lineStarts(text) {
|
|
1818
|
-
const starts = [0];
|
|
1819
|
-
for (let i = 0; i < text.length; i += 1) if (text.charCodeAt(i) === 10) starts.push(i + 1);
|
|
1820
|
-
return starts;
|
|
1821
|
-
}
|
|
1822
|
-
/**
|
|
1823
|
-
* Converts line/column diagnostics into CodeMirror ranges over `text`. A
|
|
1824
|
-
* position beyond the text is clamped to its end, so a diagnostic computed for
|
|
1825
|
-
* an older text never throws. A column marks the token that starts there (up
|
|
1826
|
-
* to the next non-word character); no column marks the whole line.
|
|
1827
|
-
*/
|
|
1828
|
-
function toCodeMirrorDiagnostics(text, diagnostics) {
|
|
1829
|
-
const starts = lineStarts(text);
|
|
1830
|
-
return diagnostics.map((diagnostic) => {
|
|
1831
|
-
const lineIndex = Math.min(Math.max((diagnostic.line ?? 1) - 1, 0), starts.length - 1);
|
|
1832
|
-
const lineStart = starts[lineIndex];
|
|
1833
|
-
const lineEnd = lineIndex + 1 < starts.length ? starts[lineIndex + 1] - 1 : text.length;
|
|
1834
|
-
let from = lineStart;
|
|
1835
|
-
let to = lineEnd;
|
|
1836
|
-
if (diagnostic.column && diagnostic.column > 0) {
|
|
1837
|
-
from = Math.min(lineStart + diagnostic.column - 1, lineEnd);
|
|
1838
|
-
to = from;
|
|
1839
|
-
while (to < lineEnd && /[\w$]/.test(text.charAt(to))) to += 1;
|
|
1840
|
-
if (to === from) to = Math.min(from + 1, lineEnd);
|
|
1841
|
-
}
|
|
1842
|
-
const message = diagnostic.code ? `${diagnostic.code}: ${diagnostic.message}` : diagnostic.message;
|
|
1843
|
-
return {
|
|
1844
|
-
from,
|
|
1845
|
-
to,
|
|
1846
|
-
severity: diagnostic.severity,
|
|
1847
|
-
message
|
|
1848
|
-
};
|
|
1849
|
-
});
|
|
1850
|
-
}
|
|
1851
|
-
|
|
1852
1715
|
// src/builder/components/code-workflow/code-workflow-state.ts
|
|
1853
1716
|
/**
|
|
1854
1717
|
* Pure helpers behind the code-workflow node's card, Source, Trace and
|
|
@@ -2011,4 +1874,4 @@ function synchronizeOperationUpdate(currentData, updates, registeredOperations)
|
|
|
2011
1874
|
};
|
|
2012
1875
|
}
|
|
2013
1876
|
|
|
2014
|
-
export {
|
|
1877
|
+
export { NodeTypeIcon as A, outputHandlesSpacerHeight as C, NodeCardBody as D, NodeCard as E, isTriggerOperation as F, useFlowStore as M, useIsValidConnection as N, NodeCardHeader as O, isNodeTrigger as P, nodeAdaptersOf as S, resolveOutputHandles as T, InputHandles as _, changedSourceFiles as a, hasNodeManifest as b, diagnosticsByPath as c, isEditableSourcePath as d, projectLanguage as f, LogicNodeCard as g, sourceLanguageOf as h, WAIT_FOR_SIGNAL_NODE_TYPE as i, isImageIcon as j, nodeAccent as k, interfaceFields as l, readSignalName as m, synchronizeOperationUpdate as n, childRunIdOf as o, readCodeWorkflowState as p, CODE_WORKFLOW_NODE_TYPE as r, defaultSourcePath as s, resolveOperationName as t, interfaceHandlers as u, OutputHandles as v, resolveInputHandles as w, landingSourceHandle as x, alignPlainOutputEdges as y };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/builder/node-registry-refresh.ts
|
|
3
|
+
/**
|
|
4
|
+
* Refreshing the builder's node registry without loading it (BOFF-11826).
|
|
5
|
+
*
|
|
6
|
+
* A host calls `refreshNodeRegistry()` when it sets the workspace's clients, so
|
|
7
|
+
* a registry that is already loaded reloads for the new workspace. The registry
|
|
8
|
+
* itself (`blocks/index.ts`) is part of the builder's code. Importing it for
|
|
9
|
+
* this call put the builder's registry, its node components and every GraphQL
|
|
10
|
+
* document into each workflow page's first load. While the registry module has
|
|
11
|
+
* not loaded there is nothing loaded to refresh, so this module only holds the
|
|
12
|
+
* refresh the registry hands it when it loads.
|
|
13
|
+
*/
|
|
14
|
+
let refresh = null;
|
|
15
|
+
/** Called once by the registry module when it loads. */
|
|
16
|
+
function provideNodeRegistryRefresh(fn) {
|
|
17
|
+
refresh = fn;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Reloads the node registry if it has loaded; otherwise there is nothing to
|
|
21
|
+
* refresh and it resolves at once. The builder loads the registry on demand.
|
|
22
|
+
*/
|
|
23
|
+
function refreshNodeRegistry() {
|
|
24
|
+
return refresh ? refresh() : Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { refreshNodeRegistry as n, provideNodeRegistryRefresh as t };
|
package/dist/nodes.js
CHANGED