@parhelia/core 0.3.12823 → 0.3.12827

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/editor/ContentTree.js +18 -54
  2. package/dist/editor/ContentTree.js.map +1 -1
  3. package/dist/editor/ai/InlineAiDialog.js +6 -1
  4. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  5. package/dist/editor/ai-image-editor/AiImageEditorDialog.js +29 -4
  6. package/dist/editor/ai-image-editor/AiImageEditorDialog.js.map +1 -1
  7. package/dist/editor/client/hooks/useQuota.d.ts +37 -5
  8. package/dist/editor/client/hooks/useQuota.js +81 -47
  9. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  10. package/dist/editor/reviews/DiffView.d.ts +1 -0
  11. package/dist/editor/reviews/DiffView.js +9 -4
  12. package/dist/editor/reviews/DiffView.js.map +1 -1
  13. package/dist/editor/services/aiService.d.ts +9 -3
  14. package/dist/editor/services/aiService.js.map +1 -1
  15. package/dist/editor/settings/QuotaInfo.js +34 -114
  16. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  17. package/dist/editor/settings/panels/ProviderConfigPanel.d.ts +3 -1
  18. package/dist/editor/settings/panels/ProviderConfigPanel.js +2 -2
  19. package/dist/editor/settings/panels/ProviderConfigPanel.js.map +1 -1
  20. package/dist/editor/settings/panels/ProvidersPanel.js +144 -9
  21. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  22. package/dist/editor/sidebar/ComponentTree.js +23 -2
  23. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  24. package/dist/editor/ui/PublishDialog.d.ts +5 -3
  25. package/dist/editor/ui/PublishDialog.js +30 -9
  26. package/dist/editor/ui/PublishDialog.js.map +1 -1
  27. package/dist/lib/nativeDragActivation.d.ts +19 -0
  28. package/dist/lib/nativeDragActivation.js +69 -0
  29. package/dist/lib/nativeDragActivation.js.map +1 -0
  30. package/dist/revision.d.ts +2 -2
  31. package/dist/revision.js +2 -2
  32. package/dist/setup/services/setupWizardService.d.ts +42 -0
  33. package/dist/setup/services/setupWizardService.js +28 -0
  34. package/dist/setup/services/setupWizardService.js.map +1 -1
  35. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  import { Users, Coins, Image as ImageIcon, BarChart3, DollarSign, CheckCircle2, } from "lucide-react";
4
4
  import { useEditContext } from "../client/editContext";
5
+ import { evaluateQuota, formatQuotaValue, normalizeQuotaInfo, } from "../client/hooks/useQuota";
5
6
  import { requestQuota } from "../services/aiService";
6
7
  import { QuotaUserPicker } from "./QuotaUserPicker";
7
8
  import { UsageLeaderboard } from "./UsageLeaderboard";
@@ -45,6 +46,28 @@ function DailyUsageBarChart(props) {
45
46
  return (_jsx("span", { className: "text-center", children: shouldShowLabel ? point.day : "" }, point.day));
46
47
  }) }), !hasValues && (_jsx("p", { className: "text-neutral-grey-50 mt-2 text-xs", children: "No usage recorded for this period." }))] }));
47
48
  }
49
+ const PERIOD_TITLES = {
50
+ dailyCost: "Today",
51
+ monthlyCost: "This month",
52
+ totalCost: "All time",
53
+ dailyImages: "Today",
54
+ monthlyImages: "This month",
55
+ totalImages: "All time",
56
+ };
57
+ const STATUS_BAR_CLASS = {
58
+ unlimited: "bg-feedback-green",
59
+ ok: "bg-feedback-green",
60
+ caution: "bg-feedback-orange",
61
+ warning: "bg-component-shared",
62
+ exceeded: "bg-feedback-red",
63
+ };
64
+ function QuotaMeter({ dimension }) {
65
+ const { key, unit, used, limit, unlimited, percentage, status } = dimension;
66
+ return (_jsxs("div", { "data-testid": `quota-meter-${key}`, "data-status": status, children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: PERIOD_TITLES[key] }), _jsxs("span", { className: "text-neutral-grey-50 text-sm", children: [formatQuotaValue(unit, used), " /", " ", unlimited ? "∞" : formatQuotaValue(unit, limit)] })] }), !unlimited && (_jsx("div", { className: "bg-neutral-grey-10 h-2 w-full rounded-full", children: _jsx("div", { className: `h-2 rounded-full ${STATUS_BAR_CLASS[status]}`, style: { width: `${Math.min(100, percentage)}%` } }) })), _jsx("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: unlimited ? "No limit" : `${Math.round(percentage)}% used` })] }));
67
+ }
68
+ function QuotaBox(props) {
69
+ return (_jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": props.testId, children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [props.icon, _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: props.title })] }) }), _jsx("div", { className: "space-y-4 p-4", children: props.children })] }));
70
+ }
48
71
  export function QuotaInfo() {
49
72
  const editContext = useEditContext();
50
73
  const liveQuotaInfo = editContext?.quotaInfo ?? null;
@@ -53,7 +76,6 @@ export function QuotaInfo() {
53
76
  const [selectedMonth, setSelectedMonth] = useState(today.getMonth());
54
77
  const [selectedYear, setSelectedYear] = useState(currentYear);
55
78
  const isAdministrator = editContext?.user?.isAdministrator === true;
56
- const currentUserName = editContext?.user?.name ?? "";
57
79
  const [selectedScope, setSelectedScope] = useState("me");
58
80
  const [selectedUserName, setSelectedUserName] = useState("");
59
81
  const [selectedUserDisplayName, setSelectedUserDisplayName] = useState("");
@@ -82,26 +104,7 @@ export function QuotaInfo() {
82
104
  userName: selectedScope === "user" ? selectedUserName : undefined,
83
105
  });
84
106
  if (response.type === "success" && response.data) {
85
- const payload = response.data;
86
- setScopedQuotaInfo({
87
- usage: {
88
- totalTokens: payload.usage.totalTokens,
89
- totalImages: payload.usage.totalImages,
90
- dailyTokens: payload.usage.dailyTokens,
91
- dailyImages: payload.usage.dailyImages,
92
- totalCost: payload.usage.totalCost,
93
- dailyCost: payload.usage.dailyCost,
94
- dailyHistory: payload.usage.dailyHistory ?? [],
95
- },
96
- limits: {
97
- totalTokens: payload.limits.totalTokens,
98
- dailyTokens: payload.limits.dailyTokens,
99
- monthlyTokens: -1,
100
- totalImages: payload.limits.totalImages,
101
- dailyImages: payload.limits.dailyImages,
102
- monthlyImages: -1,
103
- },
104
- });
107
+ setScopedQuotaInfo(normalizeQuotaInfo(response.data));
105
108
  setScopeError(null);
106
109
  }
107
110
  else {
@@ -115,6 +118,9 @@ export function QuotaInfo() {
115
118
  return;
116
119
  void loadScopedQuotaInfo();
117
120
  }, [isAdministrator, loadScopedQuotaInfo]);
121
+ const evaluation = useMemo(() => evaluateQuota(quotaInfo), [quotaInfo]);
122
+ const costDimensions = evaluation.dimensions.filter((d) => d.unit === "cost");
123
+ const imageDimensions = evaluation.dimensions.filter((d) => d.unit === "images");
118
124
  const dailyHistory = useMemo(() => quotaInfo?.usage.dailyHistory ?? [], [quotaInfo?.usage.dailyHistory]);
119
125
  const availableYears = useMemo(() => {
120
126
  const years = new Set([currentYear]);
@@ -169,42 +175,6 @@ export function QuotaInfo() {
169
175
  acc.imageCost += point.imageCost;
170
176
  return acc;
171
177
  }, { tokens: 0, images: 0, tokenCost: 0, imageCost: 0 }), [dailyChartPoints]);
172
- const formatQuotaPercentage = (used, limit) => {
173
- if (!limit || limit === 0 || limit === -1)
174
- return "No limit";
175
- if (!used && used !== 0)
176
- return "0%";
177
- if (isNaN(used) || isNaN(limit))
178
- return "0%";
179
- const percentage = Math.round((used / limit) * 100);
180
- return `${percentage}%`;
181
- };
182
- const getQuotaStatus = (used, limit) => {
183
- if (!limit || limit === 0 || limit === -1)
184
- return "unlimited";
185
- if (!used && used !== 0)
186
- return "ok";
187
- if (isNaN(used) || isNaN(limit))
188
- return "ok";
189
- const percentage = (used / limit) * 100;
190
- if (percentage >= 100)
191
- return "exceeded";
192
- if (percentage >= 90)
193
- return "warning";
194
- if (percentage >= 75)
195
- return "caution";
196
- return "ok";
197
- };
198
- const getProgressWidth = (used, limit) => {
199
- if (!limit ||
200
- limit === 0 ||
201
- limit === -1 ||
202
- !used ||
203
- isNaN(used) ||
204
- isNaN(limit))
205
- return 0;
206
- return Math.min(100, (used / limit) * 100);
207
- };
208
178
  const adminScopePanel = isAdministrator ? (_jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": "quota-admin-scope-panel", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Users, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Usage scope" })] }) }), _jsxs("div", { className: "p-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { htmlFor: "quota-scope-select", className: "text-neutral-grey-50 block text-xs font-medium", children: "View" }), _jsx(Select, { id: "quota-scope-select", value: selectedScope, onValueChange: (value) => setSelectedScope(value), options: [
209
179
  { value: "me", label: "Me" },
210
180
  { value: "all", label: "All users" },
@@ -218,59 +188,12 @@ export function QuotaInfo() {
218
188
  ? "Loading quota information..."
219
189
  : "No quota information available" }) }), isAdministrator && _jsx(UsageLeaderboard, {})] }));
220
190
  }
221
- return (_jsxs("div", { className: "space-y-10 px-10 pt-0 pb-10", "data-testid": "quota-info-section", children: [adminScopePanel, _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsxs("div", { className: "overflow-hidden rounded-lg bg-white", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Coins, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Token usage" })] }) }), _jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Total Usage" }), _jsxs("span", { className: "text-neutral-grey-50 text-sm", children: [quotaInfo.usage.totalTokens.toLocaleString(), " /", " ", quotaInfo.limits.totalTokens &&
222
- quotaInfo.limits.totalTokens > 0
223
- ? quotaInfo.limits.totalTokens.toLocaleString()
224
- : ""] })] }), quotaInfo.limits.totalTokens &&
225
- quotaInfo.limits.totalTokens > 0 && (_jsx("div", { className: "bg-neutral-grey-10 h-2 w-full rounded-full", children: _jsx("div", { className: `h-2 rounded-full ${getQuotaStatus(quotaInfo.usage.totalTokens, quotaInfo.limits.totalTokens) === "exceeded"
226
- ? "bg-feedback-red"
227
- : getQuotaStatus(quotaInfo.usage.totalTokens, quotaInfo.limits.totalTokens) === "warning"
228
- ? "bg-component-shared"
229
- : getQuotaStatus(quotaInfo.usage.totalTokens, quotaInfo.limits.totalTokens) === "caution"
230
- ? "bg-feedback-orange"
231
- : "bg-feedback-green"}`, style: {
232
- width: `${getProgressWidth(quotaInfo.usage.totalTokens, quotaInfo.limits.totalTokens)}%`,
233
- } }) })), _jsxs("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: [formatQuotaPercentage(quotaInfo.usage.totalTokens, quotaInfo.limits.totalTokens), " ", "used"] })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Daily Usage" }), _jsxs("span", { className: "text-neutral-grey-50 text-sm", children: [quotaInfo.usage.dailyTokens.toLocaleString(), " /", " ", quotaInfo.limits.dailyTokens &&
234
- quotaInfo.limits.dailyTokens > 0
235
- ? quotaInfo.limits.dailyTokens.toLocaleString()
236
- : "∞"] })] }), quotaInfo.limits.dailyTokens &&
237
- quotaInfo.limits.dailyTokens > 0 && (_jsx("div", { className: "bg-neutral-grey-10 h-2 w-full rounded-full", children: _jsx("div", { className: `h-2 rounded-full ${getQuotaStatus(quotaInfo.usage.dailyTokens, quotaInfo.limits.dailyTokens) === "exceeded"
238
- ? "bg-feedback-red"
239
- : getQuotaStatus(quotaInfo.usage.dailyTokens, quotaInfo.limits.dailyTokens) === "warning"
240
- ? "bg-component-shared"
241
- : getQuotaStatus(quotaInfo.usage.dailyTokens, quotaInfo.limits.dailyTokens) === "caution"
242
- ? "bg-feedback-orange"
243
- : "bg-feedback-green"}`, style: {
244
- width: `${getProgressWidth(quotaInfo.usage.dailyTokens, quotaInfo.limits.dailyTokens)}%`,
245
- } }) })), _jsx("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: quotaInfo.limits.dailyTokens === -1
246
- ? "No daily limit"
247
- : `${formatQuotaPercentage(quotaInfo.usage.dailyTokens, quotaInfo.limits.dailyTokens)} used today` })] })] })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ImageIcon, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Image usage" })] }) }), _jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Total Usage" }), _jsxs("span", { className: "text-neutral-grey-50 text-sm", children: [quotaInfo.usage.totalImages.toLocaleString(), " /", " ", quotaInfo.limits.totalImages &&
248
- quotaInfo.limits.totalImages > 0
249
- ? quotaInfo.limits.totalImages.toLocaleString()
250
- : "∞"] })] }), quotaInfo.limits.totalImages &&
251
- quotaInfo.limits.totalImages > 0 && (_jsx("div", { className: "bg-neutral-grey-10 h-2 w-full rounded-full", children: _jsx("div", { className: `h-2 rounded-full ${getQuotaStatus(quotaInfo.usage.totalImages, quotaInfo.limits.totalImages) === "exceeded"
252
- ? "bg-feedback-red"
253
- : getQuotaStatus(quotaInfo.usage.totalImages, quotaInfo.limits.totalImages) === "warning"
254
- ? "bg-component-shared"
255
- : getQuotaStatus(quotaInfo.usage.totalImages, quotaInfo.limits.totalImages) === "caution"
256
- ? "bg-feedback-orange"
257
- : "bg-feedback-green"}`, style: {
258
- width: `${getProgressWidth(quotaInfo.usage.totalImages, quotaInfo.limits.totalImages)}%`,
259
- } }) })), _jsxs("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: [formatQuotaPercentage(quotaInfo.usage.totalImages, quotaInfo.limits.totalImages), " ", "used"] })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Daily Usage" }), _jsxs("span", { className: "text-neutral-grey-50 text-sm", children: [quotaInfo.usage.dailyImages.toLocaleString(), " /", " ", quotaInfo.limits.dailyImages &&
260
- quotaInfo.limits.dailyImages > 0
261
- ? quotaInfo.limits.dailyImages.toLocaleString()
262
- : "∞"] })] }), quotaInfo.limits.dailyImages &&
263
- quotaInfo.limits.dailyImages > 0 && (_jsx("div", { className: "bg-neutral-grey-10 h-2 w-full rounded-full", children: _jsx("div", { className: `h-2 rounded-full ${getQuotaStatus(quotaInfo.usage.dailyImages, quotaInfo.limits.dailyImages) === "exceeded"
264
- ? "bg-feedback-red"
265
- : getQuotaStatus(quotaInfo.usage.dailyImages, quotaInfo.limits.dailyImages) === "warning"
266
- ? "bg-component-shared"
267
- : getQuotaStatus(quotaInfo.usage.dailyImages, quotaInfo.limits.dailyImages) === "caution"
268
- ? "bg-feedback-orange"
269
- : "bg-feedback-green"}`, style: {
270
- width: `${getProgressWidth(quotaInfo.usage.dailyImages, quotaInfo.limits.dailyImages)}%`,
271
- } }) })), _jsx("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: quotaInfo.limits.dailyImages === -1
272
- ? "No daily limit"
273
- : `${formatQuotaPercentage(quotaInfo.usage.dailyImages, quotaInfo.limits.dailyImages)} used today` })] })] })] })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": "quota-daily-usage-chart", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BarChart3, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsxs("div", { children: [_jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Daily usage chart" }), _jsx("p", { className: "text-neutral-grey-50 text-xs", children: "Month/year switchable daily usage across tokens, images, and cost." })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { className: "sr-only", htmlFor: "quota-usage-month", children: "Select month" }), _jsx(Select, { id: "quota-usage-month", value: String(selectedMonth), onValueChange: (value) => setSelectedMonth(Number(value)), options: MONTH_NAMES.map((monthName, index) => ({
191
+ const tokenRows = [
192
+ { label: "Today", value: quotaInfo.usage.dailyTokens },
193
+ { label: "This month", value: quotaInfo.usage.monthlyTokens },
194
+ { label: "All time", value: quotaInfo.usage.totalTokens },
195
+ ];
196
+ return (_jsxs("div", { className: "space-y-10 px-10 pt-0 pb-10", "data-testid": "quota-info-section", children: [adminScopePanel, _jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsx(QuotaBox, { title: "Cost budget", testId: "quota-cost-budget", icon: _jsx(DollarSign, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), children: costDimensions.map((dimension) => (_jsx(QuotaMeter, { dimension: dimension }, dimension.key))) }), _jsx(QuotaBox, { title: "Image usage", testId: "quota-image-usage", icon: _jsx(ImageIcon, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), children: imageDimensions.map((dimension) => (_jsx(QuotaMeter, { dimension: dimension }, dimension.key))) })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": "quota-daily-usage-chart", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BarChart3, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsxs("div", { children: [_jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Daily usage chart" }), _jsx("p", { className: "text-neutral-grey-50 text-xs", children: "Month/year switchable daily usage across tokens, images, and cost." })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { className: "sr-only", htmlFor: "quota-usage-month", children: "Select month" }), _jsx(Select, { id: "quota-usage-month", value: String(selectedMonth), onValueChange: (value) => setSelectedMonth(Number(value)), options: MONTH_NAMES.map((monthName, index) => ({
274
197
  value: String(index),
275
198
  label: monthName,
276
199
  })), className: "w-36", "data-testid": "quota-usage-month-select" }), _jsx("label", { className: "sr-only", htmlFor: "quota-usage-year", children: "Select year" }), _jsx(Select, { id: "quota-usage-year", value: String(selectedYear), onValueChange: (value) => setSelectedYear(Number(value)), options: availableYears.map((year) => ({
@@ -291,9 +214,6 @@ export function QuotaInfo() {
291
214
  })) }), _jsx(DailyUsageBarChart, { title: "Total Cost / day", unit: "USD", colorClass: "bg-feedback-orange", valueFormatter: (value) => value.toFixed(2), points: dailyChartPoints.map((point) => ({
292
215
  day: point.day,
293
216
  value: point.tokenCost + point.imageCost,
294
- })) })] }), dailyHistory.length === 0 && (_jsx("p", { className: "text-neutral-grey-50 mt-3 text-xs", children: "No historical usage payload received yet. The chart will populate as daily usage data is sent from the server." }))] })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(DollarSign, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Cost summary" })] }) }), _jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Total (All Time)" }), _jsxs("span", { className: "text-neutral-grey-100 text-base font-medium", children: ["$", (quotaInfo.usage.totalCost ?? 0).toFixed(2)] })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: "Today" }), _jsxs("span", { className: "text-neutral-grey-100 text-base font-medium", children: ["$", (quotaInfo.usage.dailyCost ?? 0).toFixed(2)] })] })] })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": "quota-status-summary", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Quota status" })] }) }), _jsxs("div", { className: "space-y-1 p-4 text-sm", children: [editContext?.isQuotaExceeded && (_jsx("p", { className: "text-feedback-red font-medium", "data-testid": "quota-exceeded-message", children: "\u26A0\uFE0F Quota limits have been exceeded" })), editContext?.getQuotaWarningMessage &&
295
- editContext.getQuotaWarningMessage() &&
296
- !editContext.isQuotaExceeded && (_jsxs("p", { className: "text-component-shared", children: ["\u26A0\uFE0F ", editContext.getQuotaWarningMessage()] })), !editContext?.isQuotaExceeded &&
297
- !editContext?.getQuotaWarningMessage?.() && (_jsx("p", { className: "text-feedback-green", children: "\u2705 All quotas are within limits" }))] })] }), isAdministrator && _jsx(UsageLeaderboard, {})] }));
217
+ })) })] }), dailyHistory.length === 0 && (_jsx("p", { className: "text-neutral-grey-50 mt-3 text-xs", children: "No historical usage payload received yet. The chart will populate as daily usage data is sent from the server." }))] })] }), _jsxs(QuotaBox, { title: "Token usage", testId: "quota-token-usage", icon: _jsx(Coins, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), children: [tokenRows.map((row) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-neutral-grey-50 text-sm font-medium", children: row.label }), _jsx("span", { className: "text-neutral-grey-100 text-base font-medium", children: row.value.toLocaleString() })] }, row.label))), _jsx("p", { className: "text-neutral-grey-50 text-xs", children: "Token counts are informational. Quotas are enforced on cost and image counts." })] }), _jsxs("div", { className: "overflow-hidden rounded-lg bg-white", "data-testid": "quota-status-summary", children: [_jsx("div", { className: "border-border-default border-b px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "text-neutral-grey-50 h-4 w-4", strokeWidth: 1 }), _jsx("h3", { className: "text-neutral-grey-100 text-sm font-medium", children: "Quota status" })] }) }), _jsxs("div", { className: "space-y-1 p-4 text-sm", children: [evaluation.exceeded && (_jsx("p", { className: "text-feedback-red font-medium", "data-testid": "quota-exceeded-message", children: "\u26A0\uFE0F Quota limits have been exceeded" })), evaluation.warningMessage && !evaluation.exceeded && (_jsxs("p", { className: "text-component-shared", children: ["\u26A0\uFE0F ", evaluation.warningMessage] })), !evaluation.exceeded && !evaluation.warningMessage && (_jsx("p", { className: "text-feedback-green", children: "\u2705 All quotas are within limits" }))] })] }), isAdministrator && _jsx(UsageLeaderboard, {})] }));
298
218
  }
299
219
  //# sourceMappingURL=QuotaInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuotaInfo.js","sourceRoot":"","sources":["../../../src/editor/settings/QuotaInfo.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuotaInfo.js","sourceRoot":"","sources":["../../../src/editor/settings/QuotaInfo.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EACL,KAAK,EACL,KAAK,EACL,KAAK,IAAI,SAAS,EAClB,SAAS,EACT,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,GAInB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,WAAW,GAAG;IAClB,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX,CAAC;AAUF,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,YAAY,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAM3B;IACC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE1D,OAAO,CACL,eAAK,SAAS,EAAC,+BAA+B,aAC5C,eAAK,SAAS,EAAC,wCAAwC,aACrD,YAAG,SAAS,EAAC,2CAA2C,YAAE,KAAK,GAAK,EACpE,aAAG,SAAS,EAAC,8BAA8B,sBACnC,cAAc,CAAC,QAAQ,CAAC,OAAG,IAAI,IACnC,IACA,EACN,cAAK,SAAS,EAAC,2BAA2B,YACxC,cAAK,SAAS,EAAC,iCAAiC,YAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,MAAM,aAAa,GACjB,KAAK,CAAC,KAAK,IAAI,CAAC;4BACd,CAAC,CAAC,CAAC;4BACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;wBAClD,OAAO,CACL,cAEE,SAAS,EAAC,6CAA6C,YAEvD,cACE,SAAS,EAAE,UAAU,UAAU,wDAAwD,EACvF,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,aAAa,GAAG,EAAE,EACtC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,GACjE,IAPG,KAAK,CAAC,GAAG,CAQV,CACP,CAAC;oBACJ,CAAC,CAAC,GACE,GACF,EACN,cACE,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAE;oBACL,mBAAmB,EAAE,UAAU,MAAM,CAAC,MAAM,mBAAmB;iBAChE,YAEA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,MAAM,eAAe,GACnB,KAAK,CAAC,GAAG,KAAK,CAAC;wBACf,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM;wBAC3B,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;oBACtB,OAAO,CACL,eAAsB,SAAS,EAAC,aAAa,YAC1C,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IADxB,KAAK,CAAC,GAAG,CAEb,CACR,CAAC;gBACJ,CAAC,CAAC,GACE,EACL,CAAC,SAAS,IAAI,CACb,YAAG,SAAS,EAAC,mCAAmC,mDAE5C,CACL,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAsC;IACvD,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,YAAY;IACzB,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,OAAO;IACpB,aAAa,EAAE,YAAY;IAC3B,WAAW,EAAE,UAAU;CACxB,CAAC;AAEF,MAAM,gBAAgB,GAA6C;IACjE,SAAS,EAAE,mBAAmB;IAC9B,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE,iBAAiB;CAC5B,CAAC;AAEF,SAAS,UAAU,CAAC,EAAE,SAAS,EAAiC;IAC9D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5E,OAAO,CACL,8BAAkB,eAAe,GAAG,EAAE,iBAAe,MAAM,aACzD,eAAK,SAAS,EAAC,wCAAwC,aACrD,gBAAO,SAAS,EAAC,0CAA0C,YACxD,aAAa,CAAC,GAAG,CAAC,GACb,EACR,gBAAM,SAAS,EAAC,8BAA8B,aAC3C,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAI,GAAG,EACnC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,IAC3C,IACH,EACL,CAAC,SAAS,IAAI,CACb,cAAK,SAAS,EAAC,4CAA4C,YACzD,cACE,SAAS,EAAE,oBAAoB,gBAAgB,CAAC,MAAM,CAAC,EAAE,EACzD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,GAC5C,GACH,CACP,EACD,YAAG,SAAS,EAAC,mCAAmC,YAC7C,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,GACzD,IACA,CACP,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAKjB;IACC,OAAO,CACL,eACE,SAAS,EAAC,qCAAqC,iBAClC,KAAK,CAAC,MAAM,aAEzB,cAAK,SAAS,EAAC,0CAA0C,YACvD,eAAK,SAAS,EAAC,yBAAyB,aACrC,KAAK,CAAC,IAAI,EACX,aAAI,SAAS,EAAC,2CAA2C,YACtD,KAAK,CAAC,KAAK,GACT,IACD,GACF,EACN,cAAK,SAAS,EAAC,eAAe,YAAE,KAAK,CAAC,QAAQ,GAAO,IACjD,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,WAAW,EAAE,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACpE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAa,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GACzD,QAAQ,CAAS,EAAE,CAAC,CAAC;IACvB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,IAAI,CACL,CAAC;IACF,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAElE,MAAM,SAAS,GACb,eAAe,IAAI,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAE9E,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACjD,IAAI,CAAC,eAAe;YAAE,OAAO;QAE7B,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,aAAa,KAAK,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClD,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9B,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC;YAClC,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;SAClE,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjD,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,aAAa,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,aAAa,CAAC,QAAQ,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC;QAC5D,CAAC;QAED,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,KAAK,mBAAmB,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC3B,CAAC;IAEF,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,EACzC,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAChC,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;QAE5D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAC/C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,GAAG;gBACH,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAE9B,IAAI,IAAI,KAAK,YAAY,IAAI,KAAK,KAAK,aAAa;gBAAE,SAAS;YAE/D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACrC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACrC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;YAC3C,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhD,MAAM,mBAAmB,GAAG,OAAO,CACjC,GAAG,EAAE,CACH,gBAAgB,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACb,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QAC3B,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QAC3B,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACjC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACjC,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CACrD,EACH,CAAC,gBAAgB,CAAC,CACnB,CAAC;IAEF,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,CACxC,eACE,SAAS,EAAC,qCAAqC,iBACnC,yBAAyB,aAErC,cAAK,SAAS,EAAC,0CAA0C,YACvD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,KAAK,IAAC,SAAS,EAAC,8BAA8B,EAAC,WAAW,EAAE,CAAC,GAAI,EAClE,aAAI,SAAS,EAAC,2CAA2C,4BAEpD,IACD,GACF,EACN,eAAK,SAAS,EAAC,KAAK,aAClB,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,aAAa,aAC1B,gBACE,OAAO,EAAC,oBAAoB,EAC5B,SAAS,EAAC,gDAAgD,qBAGpD,EACR,KAAC,MAAM,IACL,EAAE,EAAC,oBAAoB,EACvB,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAmB,CAAC,EAC/D,OAAO,EAAE;4CACP,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;4CAC5B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE;4CACpC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE;yCACxC,iBACW,oBAAoB,GAChC,IACE,EACL,aAAa,KAAK,MAAM,IAAI,CAC3B,eAAK,SAAS,EAAC,aAAa,aAC1B,gBAAO,SAAS,EAAC,gDAAgD,qBAEzD,EACR,KAAC,eAAe,IACd,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,uBAAuB,EACrC,WAAW,EAAC,wBAAwB,EACpC,YAAY,EAAC,mBAAmB,EAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;4CACjB,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4CACnC,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wCAC/C,CAAC,GACD,IACE,CACP,IACG,EACL,UAAU,IAAI,CACb,YACE,SAAS,EAAC,gCAAgC,iBAC9B,mBAAmB,YAE9B,UAAU,GACT,CACL,IACG,IACF,CACP,CAAC,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,eACE,SAAS,EAAC,6BAA6B,iBAC3B,oBAAoB,aAE/B,eAAe,EAChB,cAAK,SAAS,EAAC,yBAAyB,YACtC,YAAG,SAAS,EAAC,8BAA8B,YACxC,oBAAoB;4BACnB,CAAC,CAAC,8BAA8B;4BAChC,CAAC,CAAC,gCAAgC,GAClC,GACA,EACL,eAAe,IAAI,KAAC,gBAAgB,KAAG,IACpC,CACP,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAA4C;QACzD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE;QACtD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE;QAC7D,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE;KAC1D,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAC,6BAA6B,iBAC3B,oBAAoB,aAE/B,eAAe,EAChB,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,QAAQ,IACP,KAAK,EAAC,aAAa,EACnB,MAAM,EAAC,mBAAmB,EAC1B,IAAI,EACF,KAAC,UAAU,IACT,SAAS,EAAC,8BAA8B,EACxC,WAAW,EAAE,CAAC,GACd,YAGH,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CACjC,KAAC,UAAU,IAAqB,SAAS,EAAE,SAAS,IAAnC,SAAS,CAAC,GAAG,CAA0B,CACzD,CAAC,GACO,EAEX,KAAC,QAAQ,IACP,KAAK,EAAC,aAAa,EACnB,MAAM,EAAC,mBAAmB,EAC1B,IAAI,EACF,KAAC,SAAS,IACR,SAAS,EAAC,8BAA8B,EACxC,WAAW,EAAE,CAAC,GACd,YAGH,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAClC,KAAC,UAAU,IAAqB,SAAS,EAAE,SAAS,IAAnC,SAAS,CAAC,GAAG,CAA0B,CACzD,CAAC,GACO,IACP,EAGN,eACE,SAAS,EAAC,qCAAqC,iBACnC,yBAAyB,aAErC,cAAK,SAAS,EAAC,0CAA0C,YACvD,eAAK,SAAS,EAAC,mDAAmD,aAChE,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,SAAS,IACR,SAAS,EAAC,8BAA8B,EACxC,WAAW,EAAE,CAAC,GACd,EACF,0BACE,aAAI,SAAS,EAAC,2CAA2C,kCAEpD,EACL,YAAG,SAAS,EAAC,8BAA8B,mFAGvC,IACA,IACF,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBAAO,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,mBAAmB,6BAE9C,EACR,KAAC,MAAM,IACL,EAAE,EAAC,mBAAmB,EACtB,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,EAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gDAC9C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gDACpB,KAAK,EAAE,SAAS;6CACjB,CAAC,CAAC,EACH,SAAS,EAAC,MAAM,iBACJ,0BAA0B,GACtC,EAEF,gBAAO,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,kBAAkB,4BAE7C,EACR,KAAC,MAAM,IACL,EAAE,EAAC,kBAAkB,EACrB,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACxD,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gDACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;gDACnB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;6CACpB,CAAC,CAAC,EACH,SAAS,EAAC,MAAM,iBACJ,yBAAyB,GACrC,IACE,IACF,GACF,EAEN,eAAK,SAAS,EAAC,KAAK,aAClB,eAAK,SAAS,EAAC,gCAAgC,aAC7C,eAAK,SAAS,EAAC,+BAA+B,aAC5C,YAAG,SAAS,EAAC,0CAA0C,kCAEnD,EACJ,YAAG,SAAS,EAAC,kDAAkD,YAC5D,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,GAC1C,IACA,EACN,eAAK,SAAS,EAAC,+BAA+B,aAC5C,YAAG,SAAS,EAAC,0CAA0C,uCAEnD,EACJ,aAAG,SAAS,EAAC,kDAAkD,kBAC3D,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IACxC,IACA,EACN,eAAK,SAAS,EAAC,+BAA+B,aAC5C,YAAG,SAAS,EAAC,0CAA0C,kCAEnD,EACJ,YAAG,SAAS,EAAC,kDAAkD,YAC5D,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,GAC1C,IACA,EACN,eAAK,SAAS,EAAC,+BAA+B,aAC5C,YAAG,SAAS,EAAC,0CAA0C,uCAEnD,EACJ,aAAG,SAAS,EAAC,kDAAkD,kBAC3D,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IACxC,IACA,EACN,eAAK,SAAS,EAAC,+BAA+B,aAC5C,YAAG,SAAS,EAAC,0CAA0C,sCAEnD,EACJ,aAAG,SAAS,EAAC,kDAAkD,kBAE5D,CACC,mBAAmB,CAAC,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAC9D,CAAC,OAAO,CAAC,CAAC,CAAC,IACV,IACA,IACF,EAEN,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,kBAAkB,IACjB,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,QAAQ,EACb,UAAU,EAAC,kBAAkB,EAC7B,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EACjD,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4CACvC,GAAG,EAAE,KAAK,CAAC,GAAG;4CACd,KAAK,EAAE,KAAK,CAAC,MAAM;yCACpB,CAAC,CAAC,GACH,EACF,KAAC,kBAAkB,IACjB,KAAK,EAAC,mBAAmB,EACzB,IAAI,EAAC,KAAK,EACV,UAAU,EAAC,mBAAmB,EAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC3C,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4CACvC,GAAG,EAAE,KAAK,CAAC,GAAG;4CACd,KAAK,EAAE,KAAK,CAAC,SAAS;yCACvB,CAAC,CAAC,GACH,EACF,KAAC,kBAAkB,IACjB,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,QAAQ,EACb,UAAU,EAAC,kBAAkB,EAC7B,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EACjD,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4CACvC,GAAG,EAAE,KAAK,CAAC,GAAG;4CACd,KAAK,EAAE,KAAK,CAAC,MAAM;yCACpB,CAAC,CAAC,GACH,EACF,KAAC,kBAAkB,IACjB,KAAK,EAAC,mBAAmB,EACzB,IAAI,EAAC,KAAK,EACV,UAAU,EAAC,0BAA0B,EACrC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC3C,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4CACvC,GAAG,EAAE,KAAK,CAAC,GAAG;4CACd,KAAK,EAAE,KAAK,CAAC,SAAS;yCACvB,CAAC,CAAC,GACH,EACF,KAAC,kBAAkB,IACjB,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAC,KAAK,EACV,UAAU,EAAC,oBAAoB,EAC/B,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAC3C,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4CACvC,GAAG,EAAE,KAAK,CAAC,GAAG;4CACd,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;yCACzC,CAAC,CAAC,GACH,IACE,EAEL,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAC5B,YAAG,SAAS,EAAC,mCAAmC,+HAG5C,CACL,IACG,IACF,EAGN,MAAC,QAAQ,IACP,KAAK,EAAC,aAAa,EACnB,MAAM,EAAC,mBAAmB,EAC1B,IAAI,EACF,KAAC,KAAK,IAAC,SAAS,EAAC,8BAA8B,EAAC,WAAW,EAAE,CAAC,GAAI,aAGnE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,eAAqB,SAAS,EAAC,mCAAmC,aAChE,gBAAO,SAAS,EAAC,0CAA0C,YACxD,GAAG,CAAC,KAAK,GACJ,EACR,eAAM,SAAS,EAAC,6CAA6C,YAC1D,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,GACtB,KANC,GAAG,CAAC,KAAK,CAOb,CACP,CAAC,EACF,YAAG,SAAS,EAAC,8BAA8B,8FAGvC,IACK,EAGX,eACE,SAAS,EAAC,qCAAqC,iBACnC,sBAAsB,aAElC,cAAK,SAAS,EAAC,0CAA0C,YACvD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,YAAY,IACX,SAAS,EAAC,8BAA8B,EACxC,WAAW,EAAE,CAAC,GACd,EACF,aAAI,SAAS,EAAC,2CAA2C,6BAEpD,IACD,GACF,EACN,eAAK,SAAS,EAAC,uBAAuB,aACnC,UAAU,CAAC,QAAQ,IAAI,CACtB,YACE,SAAS,EAAC,+BAA+B,iBAC7B,wBAAwB,6DAGlC,CACL,EACA,UAAU,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CACpD,aAAG,SAAS,EAAC,uBAAuB,8BAC9B,UAAU,CAAC,cAAc,IAC3B,CACL,EACA,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,CACrD,YAAG,SAAS,EAAC,qBAAqB,oDAE9B,CACL,IACG,IACF,EAEL,eAAe,IAAI,KAAC,gBAAgB,KAAG,IACpC,CACP,CAAC;AACJ,CAAC"}
@@ -4,7 +4,9 @@ type ProviderConfigPanelProps = {
4
4
  title?: string;
5
5
  onClose?: () => void;
6
6
  actions?: React.ReactNode;
7
+ /** Rendered above the field groups (e.g. connection hints and test results). */
8
+ supplementalContent?: React.ReactNode;
7
9
  refreshToken?: number;
8
10
  };
9
- export declare function ProviderConfigPanel({ itemId, title, onClose, actions, refreshToken, }: ProviderConfigPanelProps): React.JSX.Element;
11
+ export declare function ProviderConfigPanel({ itemId, title, onClose, actions, supplementalContent, refreshToken, }: ProviderConfigPanelProps): React.JSX.Element;
10
12
  export default ProviderConfigPanel;
@@ -25,8 +25,8 @@ const FIELD_GROUPS = [
25
25
  ],
26
26
  },
27
27
  ];
28
- export function ProviderConfigPanel({ itemId, title, onClose, actions, refreshToken = 0, }) {
29
- return (_jsx(GroupedFieldConfigPanel, { itemId: itemId, title: title, onClose: onClose, actions: actions, refreshToken: refreshToken, fieldGroups: FIELD_GROUPS, headerIcon: _jsx(Server, { className: "h-4 w-4", strokeWidth: 1 }), loadErrorTitle: "Unable to load provider", emptyMessage: "No editable settings were found for this provider.", fallbackTitle: "AI Provider", footerLeadingText: "For all fields and advanced authentication options use the " }));
28
+ export function ProviderConfigPanel({ itemId, title, onClose, actions, supplementalContent, refreshToken = 0, }) {
29
+ return (_jsx(GroupedFieldConfigPanel, { itemId: itemId, title: title, onClose: onClose, actions: actions, supplementalContent: supplementalContent, refreshToken: refreshToken, fieldGroups: FIELD_GROUPS, headerIcon: _jsx(Server, { className: "h-4 w-4", strokeWidth: 1 }), loadErrorTitle: "Unable to load provider", emptyMessage: "No editable settings were found for this provider.", fallbackTitle: "AI Provider", footerLeadingText: "For all fields and advanced authentication options use the " }));
30
30
  }
31
31
  export default ProviderConfigPanel;
32
32
  //# sourceMappingURL=ProviderConfigPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderConfigPanel.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/ProviderConfigPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AAUnC,MAAM,YAAY,GAA2B;IAC3C;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI;QACpD,UAAU,EAAE;YACV,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACrC,CAAC,cAAc,CAAC;YAChB,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;SAChD;KACF;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI;QACtD,UAAU,EAAE;YACV,CAAC,SAAS,CAAC;YACX,CAAC,WAAW,CAAC;YACb,CAAC,eAAe,CAAC;YACjB,CAAC,UAAU,CAAC;YACZ,CAAC,OAAO,CAAC;SACV;KACF;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,YAAY,GAAG,CAAC,GACS;IACzB,OAAO,CACL,KAAC,uBAAuB,IACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI,EAC1D,cAAc,EAAC,yBAAyB,EACxC,YAAY,EAAC,oDAAoD,EACjE,aAAa,EAAC,aAAa,EAC3B,iBAAiB,EAAC,6DAA6D,GAC/E,CACH,CAAC;AACJ,CAAC;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ProviderConfigPanel.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/ProviderConfigPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AAYnC,MAAM,YAAY,GAA2B;IAC3C;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI;QACpD,UAAU,EAAE;YACV,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACrC,CAAC,cAAc,CAAC;YAChB,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;SAChD;KACF;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI;QACtD,UAAU,EAAE;YACV,CAAC,SAAS,CAAC;YACX,CAAC,WAAW,CAAC;YACb,CAAC,eAAe,CAAC;YACjB,CAAC,UAAU,CAAC;YACZ,CAAC,OAAO,CAAC;SACV;KACF;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,mBAAmB,EACnB,YAAY,GAAG,CAAC,GACS;IACzB,OAAO,CACL,KAAC,uBAAuB,IACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,CAAC,GAAI,EAC1D,cAAc,EAAC,yBAAyB,EACxC,YAAY,EAAC,oDAAoD,EACjE,aAAa,EAAC,aAAa,EAC3B,iBAAiB,EAAC,6DAA6D,GAC/E,CACH,CAAC;AACJ,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -6,9 +6,10 @@ import { Input } from "../../../components/ui/input";
6
6
  import { Select } from "../../../components/ui/select";
7
7
  import { Dialog, DialogContent, DialogFooter, } from "../../../components/ui/dialog";
8
8
  import { StyledDialogTitle } from "../../../components/ui/styled-dialog-title";
9
- import { setupWizardService, } from "../../../setup/services/setupWizardService";
10
- import { CheckCircle, Plus, RefreshCw } from "lucide-react";
9
+ import { setupWizardService, describeProviderCredentialProblem, } from "../../../setup/services/setupWizardService";
10
+ import { AlertTriangle, CheckCircle, CheckCircle2, PlugZap, Plus, RefreshCw, XCircle, } from "lucide-react";
11
11
  import { DeleteIcon } from "../../../components/ui/delete-icon";
12
+ import { cn } from "../../../lib/utils";
12
13
  import { useEditContext } from "../../client/editContext";
13
14
  import { useSearchParams } from "../../client/navigation";
14
15
  import { Splitter } from "../../ui/Splitter";
@@ -16,6 +17,45 @@ import { ProviderConfigPanel } from "./ProviderConfigPanel";
16
17
  import { ProviderIcon, resolveBrand } from "./ProviderIcon";
17
18
  import { useRequiredSettingsHeaderActions } from "../SettingsHeaderActionsContext";
18
19
  const SELECTED_PROVIDER_QUERY_PARAM = "providerId";
20
+ /**
21
+ * A failed test that only repeats the static credential hint adds nothing;
22
+ * the hint stays and the result line is skipped.
23
+ */
24
+ function isRedundantTestResult(provider, result) {
25
+ if (!result || result.success)
26
+ return false;
27
+ return describeProviderCredentialProblem(provider) === result.message;
28
+ }
29
+ /**
30
+ * One-line outcome of a connection test (green check or red cross).
31
+ */
32
+ function ConnectionTestResultLine({ result, className, }) {
33
+ const Icon = result.success ? CheckCircle2 : XCircle;
34
+ const text = result.success
35
+ ? `${result.message} (${result.durationMs} ms)`
36
+ : result.message;
37
+ const detail = result.probeUrl
38
+ ? `${result.probeUrl}${result.httpStatusCode ? ` (HTTP ${result.httpStatusCode})` : ""}`
39
+ : undefined;
40
+ return (_jsxs("div", { "data-testid": "provider-test-result", "data-status": result.success ? "success" : "error", title: detail, className: cn("flex items-start gap-1.5 text-xs", result.success ? "text-feedback-green" : "text-feedback-red", className), children: [_jsx(Icon, { className: "mt-0.5 h-3.5 w-3.5 shrink-0", strokeWidth: 1.5 }), _jsx("span", { className: "min-w-0 break-words", children: text })] }));
41
+ }
42
+ /**
43
+ * Static credential hint derived from the provider record: warns when the
44
+ * configured connection string is missing from ConnectionStrings.config or when
45
+ * no secret is configured at all; otherwise names the secret source.
46
+ */
47
+ function ProviderCredentialHint({ provider, className, }) {
48
+ const problem = describeProviderCredentialProblem(provider);
49
+ if (problem) {
50
+ return (_jsxs("div", { "data-testid": "provider-credential-hint", className: cn("text-feedback-orange flex items-start gap-1.5 text-xs", className), children: [_jsx(AlertTriangle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0", strokeWidth: 1.5 }), _jsx("span", { className: "min-w-0 break-words", children: problem })] }));
51
+ }
52
+ const name = provider.connectionStringName?.trim();
53
+ if (!name)
54
+ return null;
55
+ return (_jsxs("div", { className: cn("text-neutral-grey-50 text-xs", className), children: [provider.secretSource === "applicationDefaultCredentials"
56
+ ? "Application Default Credentials via "
57
+ : "Secret from ", "ConnectionStrings.config: ", _jsx("span", { className: "font-mono", children: name })] }));
58
+ }
19
59
  /**
20
60
  * Settings panel for AI Providers configuration.
21
61
  * Configure AI providers (Anthropic, OpenAI, OpenRouter, Google Vertex AI).
@@ -31,6 +71,10 @@ export function ProvidersPanel() {
31
71
  const [showForm, setShowForm] = useState(false);
32
72
  const [creating, setCreating] = useState(false);
33
73
  const [deleting, setDeleting] = useState(null);
74
+ const [testing, setTesting] = useState(null);
75
+ const [testResults, setTestResults] = useState({});
76
+ const [draftTesting, setDraftTesting] = useState(false);
77
+ const [draftTestResult, setDraftTestResult] = useState(null);
34
78
  const [formData, setFormData] = useState({
35
79
  type: "",
36
80
  name: "",
@@ -112,6 +156,64 @@ export function ProvidersPanel() {
112
156
  setError(e?.message || "Failed to load data");
113
157
  }
114
158
  };
159
+ // Re-read the provider records without touching the loading state, so the
160
+ // credential hints reflect edits made in the config panel.
161
+ const refreshProviders = useCallback(async () => {
162
+ try {
163
+ setProviders(await setupWizardService.getProviders());
164
+ }
165
+ catch {
166
+ // Keep the current list; the next full load reports errors.
167
+ }
168
+ }, []);
169
+ const handleTestConnection = async (providerId) => {
170
+ setTesting(providerId);
171
+ try {
172
+ const result = await setupWizardService.testProviderConnection({
173
+ providerId,
174
+ });
175
+ setTestResults((prev) => ({ ...prev, [providerId]: result }));
176
+ }
177
+ catch (e) {
178
+ setTestResults((prev) => ({
179
+ ...prev,
180
+ [providerId]: {
181
+ success: false,
182
+ message: e?.message || "Failed to test the connection",
183
+ durationMs: 0,
184
+ },
185
+ }));
186
+ }
187
+ finally {
188
+ setTesting(null);
189
+ }
190
+ void refreshProviders();
191
+ };
192
+ const handleTestDraft = async () => {
193
+ setDraftTesting(true);
194
+ setDraftTestResult(null);
195
+ try {
196
+ const result = await setupWizardService.testProviderConnection({
197
+ type: formData.type,
198
+ apiKey: formData.apiKey?.trim() || undefined,
199
+ connectionString: formData.connectionString?.trim() || undefined,
200
+ baseUrl: formData.baseUrl?.trim() ||
201
+ selectedProviderType?.defaultBaseUrl ||
202
+ "",
203
+ });
204
+ setDraftTestResult(result);
205
+ }
206
+ catch (e) {
207
+ setDraftTestResult({
208
+ success: false,
209
+ message: e?.message || "Failed to test the connection",
210
+ durationMs: 0,
211
+ });
212
+ }
213
+ finally {
214
+ setDraftTesting(false);
215
+ }
216
+ };
115
217
  const handleCreate = async () => {
116
218
  const hasApiKey = Boolean(formData.apiKey?.trim());
117
219
  const hasConnectionString = Boolean(formData.connectionString?.trim());
@@ -151,9 +253,14 @@ export function ProvidersPanel() {
151
253
  if (isOpen && wasClosed) {
152
254
  setFormData(createEmptyFormData());
153
255
  setError(null);
256
+ setDraftTestResult(null);
154
257
  }
155
258
  prevShowFormRef.current = showForm;
156
259
  }, [createEmptyFormData, showForm]);
260
+ // A test result only describes the values it was run against.
261
+ useEffect(() => {
262
+ setDraftTestResult(null);
263
+ }, [formData]);
157
264
  const handleDelete = (providerId) => {
158
265
  editContext?.confirm({
159
266
  header: "Delete Provider",
@@ -199,6 +306,10 @@ export function ProvidersPanel() {
199
306
  setSettingsHeaderActions(null);
200
307
  };
201
308
  }, [addProviderButton, setSettingsHeaderActions]);
309
+ const draftCanTest = !draftTesting &&
310
+ !creating &&
311
+ Boolean(formData.type) &&
312
+ Boolean(formData.apiKey?.trim() || formData.connectionString?.trim());
202
313
  // Build the providers list content
203
314
  const providersListContent = (_jsxs(SettingsPanelLayout, { children: [_jsxs("div", { className: "flex flex-col rounded-lg bg-white", children: [_jsx("div", { className: "border-border-default flex justify-end border-b p-4 md:hidden", children: addProviderButton }), providerTypes.length === 0 && state === "success" && (_jsx("div", { className: "border-feedback-orange bg-feedback-orange-light text-feedback-orange mx-4 mt-4 mb-3 rounded border p-3 text-xs", children: "No provider types are available. Please check the server configuration." })), error && !showForm && (_jsx("div", { className: "border-feedback-red bg-feedback-red-light text-feedback-red mx-4 mt-4 mb-3 rounded border p-2 text-xs whitespace-pre-wrap", children: error })), _jsx("div", { className: "px-4 py-3", children: providers.length === 0 && state === "success" ? (_jsx("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: _jsx("p", { className: "text-neutral-grey-50 text-sm", children: "No providers configured yet." }) })) : (_jsx("div", { className: "divide-border-default divide-y", children: providers.map((provider) => {
204
315
  const providerType = providerTypes.find((p) => p.providerId === provider.type);
@@ -212,6 +323,11 @@ export function ProvidersPanel() {
212
323
  // base URL is stored on the provider record itself.
213
324
  const displayBaseUrl = provider.baseUrl || providerType?.defaultBaseUrl || "";
214
325
  const isDefaultBaseUrl = !provider.baseUrl && !!displayBaseUrl;
326
+ const isTesting = testing === provider.id;
327
+ const rawTestResult = testResults[provider.id];
328
+ const testResult = isRedundantTestResult(provider, rawTestResult)
329
+ ? undefined
330
+ : rawTestResult;
215
331
  return (_jsxs("div", { role: "button", tabIndex: 0, onClick: () => handleOpenConfig(provider), onKeyDown: (e) => {
216
332
  if (e.key === "Enter" || e.key === " ") {
217
333
  e.preventDefault();
@@ -221,10 +337,13 @@ export function ProvidersPanel() {
221
337
  ? "bg-neutral-grey-5"
222
338
  : "hover:bg-neutral-grey-5 bg-white"}`, children: [_jsx(ProviderIcon, { providerId: provider.type, displayName: providerTypeDisplayName, providerName: provider.name, size: 24 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx("span", { className: "text-neutral-grey-100 truncate font-medium", children: provider.name }), _jsx("span", { className: "bg-neutral-grey-5 badge-pad-sm text-neutral-grey-50 shrink-0 rounded text-[10px] font-medium", children: providerTypeDisplayName })] }), displayBaseUrl && (_jsxs("div", { className: `text-neutral-grey-50 mt-0.5 truncate font-mono text-xs ${isDefaultBaseUrl ? "italic" : ""}`, title: isDefaultBaseUrl
223
339
  ? `${displayBaseUrl} (provider default)`
224
- : displayBaseUrl, children: [displayBaseUrl, isDefaultBaseUrl && (_jsx("span", { className: "not-italic", children: " (default)" }))] }))] }), _jsx("div", { className: "flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-focus-within:opacity-100 group-hover:opacity-100", children: _jsx(Button, { size: "sm", variant: "ghost", onClick: (e) => {
225
- e.stopPropagation();
226
- handleDelete(provider.id);
227
- }, disabled: deleting === provider.id, title: "Delete provider", className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-50", children: deleting === provider.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(DeleteIcon, { size: "md" })) }) })] }, provider.id));
340
+ : displayBaseUrl, children: [displayBaseUrl, isDefaultBaseUrl && (_jsx("span", { className: "not-italic", children: " (default)" }))] })), _jsx(ProviderCredentialHint, { provider: provider, className: "mt-1" }), testResult && (_jsx(ConnectionTestResultLine, { result: testResult, className: "mt-1" }))] }), _jsxs("div", { className: cn("flex shrink-0 items-center gap-0.5 transition-opacity group-focus-within:opacity-100 group-hover:opacity-100", isTesting ? "opacity-100" : "opacity-0"), children: [_jsx(Button, { size: "sm", variant: "ghost", onClick: (e) => {
341
+ e.stopPropagation();
342
+ void handleTestConnection(provider.id);
343
+ }, disabled: isTesting, title: "Test connection", "data-testid": "provider-test-connection", className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100", children: isTesting ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(PlugZap, { strokeWidth: 1, className: "h-4 w-4" })) }), _jsx(Button, { size: "sm", variant: "ghost", onClick: (e) => {
344
+ e.stopPropagation();
345
+ handleDelete(provider.id);
346
+ }, disabled: deleting === provider.id, title: "Delete provider", className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-50", children: deleting === provider.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(DeleteIcon, { size: "md" })) })] })] }, provider.id));
228
347
  }) })) })] }), _jsx(Dialog, { open: showForm, onOpenChange: (open) => {
229
348
  setShowForm(open);
230
349
  if (open) {
@@ -241,7 +360,9 @@ export function ProvidersPanel() {
241
360
  }, options: providerTypeOptions, placeholder: "Select a provider" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "provider-name", className: "text-neutral-grey-100 mb-1 block text-sm font-medium", children: "Name" }), _jsx(Input, { id: "provider-name", value: formData.name, onChange: (e) => setFormData({ ...formData, name: e.target.value }), placeholder: "My Provider" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "provider-config-value-input", className: "text-neutral-grey-100 mb-1 block text-sm font-medium", children: "API Key (optional)" }), _jsx(Input, { id: "provider-config-value-input", type: "text", name: "provider-config-value", autoComplete: "off", autoCapitalize: "none", spellCheck: false, className: formData.apiKey ? "[-webkit-text-security:disc]" : undefined, value: formData.apiKey || "", onChange: (e) => setFormData({ ...formData, apiKey: e.target.value }), placeholder: "sk-..." })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "provider-connection-string-input", className: "text-neutral-grey-100 mb-1 block text-sm font-medium", children: "Connection String Name (optional)" }), _jsx(Input, { id: "provider-connection-string-input", type: "text", value: formData.connectionString || "", onChange: (e) => setFormData({
242
361
  ...formData,
243
362
  connectionString: e.target.value,
244
- }), placeholder: "parhelia.ai.provider.<providerId>" }), _jsxs("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: ["Provide either an API key above or a connection-string entry. For the latter, add", " ", _jsx("code", { children: "<add name=\"parhelia.ai.provider.openrouter\" connectionString=\"ApiKey=...\" />" }), " ", "to ConnectionStrings.config, then enter its name above."] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "provider-baseurl", className: "text-neutral-grey-100 mb-1 block text-sm font-medium", children: "Base URL (optional)" }), _jsx(Input, { id: "provider-baseurl", value: formData.baseUrl, onChange: (e) => setFormData({ ...formData, baseUrl: e.target.value }), placeholder: selectedProviderType?.defaultBaseUrl || "" })] }), error && (_jsx("div", { className: "border-feedback-red bg-feedback-red-light text-feedback-red rounded border p-3 text-sm", children: error }))] }), _jsxs(DialogFooter, { className: "px-6 pb-6", children: [_jsx(Button, { variant: "outline", onClick: () => {
363
+ }), placeholder: "parhelia.ai.provider.<providerId>" }), _jsxs("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: ["Provide either an API key above or a connection-string entry. For the latter, add", " ", _jsx("code", { children: "<add name=\"parhelia.ai.provider.openrouter\" connectionString=\"ApiKey=...\" />" }), " ", "to ConnectionStrings.config, then enter its name above."] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "provider-baseurl", className: "text-neutral-grey-100 mb-1 block text-sm font-medium", children: "Base URL (optional)" }), _jsx(Input, { id: "provider-baseurl", value: formData.baseUrl, onChange: (e) => setFormData({ ...formData, baseUrl: e.target.value }), placeholder: selectedProviderType?.defaultBaseUrl || "" })] }), draftTestResult && (_jsx(ConnectionTestResultLine, { result: draftTestResult, className: cn("rounded border p-3 text-sm", draftTestResult.success
364
+ ? "border-feedback-green bg-feedback-green-light"
365
+ : "border-feedback-red bg-feedback-red-light") })), error && (_jsx("div", { className: "border-feedback-red bg-feedback-red-light text-feedback-red rounded border p-3 text-sm", children: error }))] }), _jsxs(DialogFooter, { className: "px-6 pb-6", children: [_jsx(Button, { variant: "outline", onClick: handleTestDraft, disabled: !draftCanTest, title: "Test connection", "data-testid": "provider-draft-test-connection", className: "mr-auto", children: draftTesting ? (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { strokeWidth: 1, className: "mr-2 h-4 w-4 animate-spin" }), "Testing..."] })) : (_jsxs(_Fragment, { children: [_jsx(PlugZap, { strokeWidth: 1, className: "mr-2 h-4 w-4" }), "Test connection"] })) }), _jsx(Button, { variant: "outline", onClick: () => {
245
366
  setShowForm(false);
246
367
  setFormData(createEmptyFormData());
247
368
  setError(null);
@@ -249,8 +370,21 @@ export function ProvidersPanel() {
249
370
  !formData.name ||
250
371
  (!formData.apiKey && !formData.connectionString) ||
251
372
  !formData.type, children: creating ? (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { strokeWidth: 1, className: "mr-2 h-4 w-4 animate-spin" }), "Creating..."] })) : (_jsxs(_Fragment, { children: [_jsx(CheckCircle, { strokeWidth: 1, className: "mr-2 h-4 w-4" }), "Create"] })) })] })] }) })] }));
373
+ // The list holds the freshest provider record (hints refresh after tests);
374
+ // fall back to the selection snapshot until the list catches up.
375
+ const selectedProviderRecord = selectedProvider
376
+ ? (providers.find((p) => p.id === selectedProvider.id) ?? selectedProvider)
377
+ : null;
378
+ const selectedRawTestResult = selectedProvider
379
+ ? testResults[selectedProvider.id]
380
+ : undefined;
381
+ const selectedTestResult = selectedProviderRecord &&
382
+ isRedundantTestResult(selectedProviderRecord, selectedRawTestResult)
383
+ ? undefined
384
+ : selectedRawTestResult;
385
+ const selectedIsTesting = Boolean(selectedProvider && testing === selectedProvider.id);
252
386
  // Build splitter panels - only show config panel when a provider is selected
253
- const panels = selectedProvider?.id
387
+ const panels = selectedProviderRecord?.id
254
388
  ? [
255
389
  {
256
390
  name: "providers-list",
@@ -261,7 +395,8 @@ export function ProvidersPanel() {
261
395
  {
262
396
  name: "provider-config",
263
397
  defaultSize: 400,
264
- content: (_jsx(ProviderConfigPanel, { itemId: selectedProvider.id, title: `Configure: ${selectedProvider.name || "Provider"}`, onClose: handleCloseConfig }, selectedProvider.id)),
398
+ content: (_jsx(ProviderConfigPanel, { itemId: selectedProviderRecord.id, title: `Configure: ${selectedProviderRecord.name || "Provider"}`, onClose: handleCloseConfig, actions: _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void handleTestConnection(selectedProviderRecord.id), disabled: selectedIsTesting, title: "Test connection", "data-testid": "provider-config-test-connection", children: [selectedIsTesting ? (_jsx(RefreshCw, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : (_jsx(PlugZap, { className: "h-3.5 w-3.5", strokeWidth: 1 })), "Test connection"] }), supplementalContent: describeProviderCredentialProblem(selectedProviderRecord) ||
399
+ selectedTestResult ? (_jsxs("div", { className: "border-border-default space-y-2 rounded-lg border bg-white p-4", children: [_jsx(ProviderCredentialHint, { provider: selectedProviderRecord }), selectedTestResult && (_jsx(ConnectionTestResultLine, { result: selectedTestResult }))] })) : undefined }, selectedProviderRecord.id)),
265
400
  className: "overflow-hidden",
266
401
  },
267
402
  ]