@neuronection/assistant-ui 0.55.0 → 0.57.0
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/CHANGELOG.md +12 -0
- package/dist/{chunk-YHMVPFEN.js → chunk-FPX3AI3Z.js} +150 -24
- package/dist/chunk-FPX3AI3Z.js.map +1 -0
- package/dist/index.d.ts +28 -1
- package/dist/index.js +1 -1
- package/dist/model-registry.d.ts +27 -0
- package/dist/model-registry.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-YHMVPFEN.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @neuronection/assistant-ui
|
|
2
2
|
|
|
3
|
+
## 0.57.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`087968c`](https://github.com/neuronection/assistant-ui/commit/087968cbc8b8b2dd477a897c0221ac001550d2db) Thanks [@constLiakos](https://github.com/constLiakos)! - **ModelRegistry: provider context, modern manual toggle, capability implications.** Three additive refinements to the add/edit modal. A discreet **provider context banner** (configured name + base URL, sr-only `providerContextLabel` prefix) sits at the top so the form always answers "model of _what_?". The **manual-id toggle** becomes a labelled ghost control with a pen icon, right-aligned, and swaps direction copy when manual entry is active (`useCatalogLabel`, default 'Pick from the catalog', with a library icon). New `capImplications` prop expresses **selection implications between combinable caps** — e.g. `{ vision: ['text'], tools: ['text'] }`: selecting a modifier auto-enables its text base, and deselecting the base drops everything that implies it (catalog picks normalize the same way). All optional; without them the form behaves exactly as before. Docs updated in the same change.
|
|
8
|
+
|
|
9
|
+
## 0.56.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`ca62ca8`](https://github.com/neuronection/assistant-ui/commit/ca62ca8cc92816788b35bf254cf1b8376725c112) Thanks [@constLiakos](https://github.com/constLiakos)! - **ModelRegistry: capability-kind add/edit form (plan 26 follow-up).** The add/edit modal becomes capability-conditional and grouped. New additive optional props: `standaloneCaps` + `standaloneLabel` (capabilities that are standalone kinds — decision, stt, tts, embeddings — render in their own cluster and select exclusively: a standalone kind replaces the chat caps and vice versa, expressing the family's D4 slot-separation law in the form) and `decisionTransport` + `decisionTransportLabel` (the app's shipping transport, e.g. `systemone`: a decision selection renders a read-only transport row and carries `decisionTransport` on `ModelRegistryDraft`/`Patch`/`Model`). Generation options — temperature, max tokens, reasoning effort — now render only when a chat-family capability (`text`/`vision`/`tools`) is selected; decision/stt/tts/embeddings models get the minimal form. Without the new props the form behaves exactly as before. Docs page updated in the same change; visual baselines need the CI rebaseline flow for the model-registry story if it renders the modal.
|
|
14
|
+
|
|
3
15
|
## 0.55.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
@@ -6,9 +6,31 @@ import { Button } from './chunk-4WBBF5LH.js';
|
|
|
6
6
|
import { Spinner } from './chunk-SQHW7TYF.js';
|
|
7
7
|
import { cn } from './chunk-RVVXVTH3.js';
|
|
8
8
|
import * as React from 'react';
|
|
9
|
-
import { ChevronDown, ChevronRight, Pencil, X, Plus, Check, ChevronUp } from 'lucide-react';
|
|
9
|
+
import { ChevronDown, ChevronRight, Pencil, X, Plus, PenLine, Library, Check, ChevronUp } from 'lucide-react';
|
|
10
10
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
11
11
|
|
|
12
|
+
var PARAMETRIC_CAPS = /* @__PURE__ */ new Set(["text", "vision", "tools"]);
|
|
13
|
+
var hasParametricCaps = (caps) => caps.some((cap) => PARAMETRIC_CAPS.has(cap));
|
|
14
|
+
var normalizeCaps = (next, standalone) => {
|
|
15
|
+
const standaloneHit = next.find((cap) => standalone.has(cap));
|
|
16
|
+
return standaloneHit ? [standaloneHit] : next;
|
|
17
|
+
};
|
|
18
|
+
var applyImplications = (next, implications, toggled, selected) => {
|
|
19
|
+
if (Object.keys(implications).length === 0) return next;
|
|
20
|
+
if (selected) {
|
|
21
|
+
const implied = implications[toggled] ?? [];
|
|
22
|
+
return [...next, ...implied.filter((cap) => !next.includes(cap))];
|
|
23
|
+
}
|
|
24
|
+
const dependents = Object.entries(implications).filter(([, values]) => values.includes(toggled)).map(([cap]) => cap);
|
|
25
|
+
return dependents.length === 0 ? next : next.filter((cap) => cap !== toggled && !dependents.includes(cap));
|
|
26
|
+
};
|
|
27
|
+
var withImplications = (caps, implications) => {
|
|
28
|
+
let out = [...caps];
|
|
29
|
+
for (const cap of caps) {
|
|
30
|
+
out = applyImplications(out, implications, cap, true);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
};
|
|
12
34
|
var CUSTOM = "__custom__";
|
|
13
35
|
function NumberField({
|
|
14
36
|
label,
|
|
@@ -102,11 +124,16 @@ var ModelRegistry = React.forwardRef(
|
|
|
102
124
|
editTitle = "Edit model",
|
|
103
125
|
selectModelLabel = "Model",
|
|
104
126
|
manualIdToggleLabel = "Enter the model id manually",
|
|
127
|
+
useCatalogLabel = "Pick from the catalog",
|
|
128
|
+
providerContextLabel = "Provider",
|
|
105
129
|
editLabel = "Edit",
|
|
106
130
|
removeLabel = "Remove",
|
|
107
131
|
missingLabel = "Missing",
|
|
108
132
|
capsLabel = "Capabilities",
|
|
109
133
|
capsHint,
|
|
134
|
+
standaloneCaps,
|
|
135
|
+
standaloneLabel = "Standalone",
|
|
136
|
+
capImplications,
|
|
110
137
|
searchPlaceholder = "Search models\u2026",
|
|
111
138
|
searchLabel = "Search models",
|
|
112
139
|
emptyProviderLabel = "No models yet \u2014 use Add model to pick from the live catalog.",
|
|
@@ -119,6 +146,8 @@ var ModelRegistry = React.forwardRef(
|
|
|
119
146
|
maxTokensLabel = "Max tokens",
|
|
120
147
|
labelLabel = "Display label",
|
|
121
148
|
reasoningEffortLabel = "Reasoning effort",
|
|
149
|
+
decisionTransport,
|
|
150
|
+
decisionTransportLabel = "Transport",
|
|
122
151
|
saveLabel = "Save",
|
|
123
152
|
cancelLabel = "Cancel",
|
|
124
153
|
addDraftLabel = "Add model",
|
|
@@ -128,6 +157,18 @@ var ModelRegistry = React.forwardRef(
|
|
|
128
157
|
}, ref) {
|
|
129
158
|
const [modal, setModal] = React.useState(null);
|
|
130
159
|
const [draftError, setDraftError] = React.useState(null);
|
|
160
|
+
const standaloneSet = React.useMemo(
|
|
161
|
+
() => new Set(standaloneCaps ?? []),
|
|
162
|
+
[standaloneCaps]
|
|
163
|
+
);
|
|
164
|
+
const combinableCaps = React.useMemo(
|
|
165
|
+
() => caps.filter((cap) => !standaloneSet.has(cap.value)),
|
|
166
|
+
[caps, standaloneSet]
|
|
167
|
+
);
|
|
168
|
+
const standaloneDescriptors = React.useMemo(
|
|
169
|
+
() => caps.filter((cap) => standaloneSet.has(cap.value)),
|
|
170
|
+
[caps, standaloneSet]
|
|
171
|
+
);
|
|
131
172
|
const descriptorFor = React.useCallback(
|
|
132
173
|
(value) => caps.find((cap) => cap.value === value) ?? { value, label: value },
|
|
133
174
|
[caps]
|
|
@@ -140,16 +181,18 @@ var ModelRegistry = React.forwardRef(
|
|
|
140
181
|
onExpandedProviderChange(expandedProviderId === providerId ? null : providerId);
|
|
141
182
|
};
|
|
142
183
|
const openAddModal = (providerId) => {
|
|
184
|
+
const firstCap = combinableCaps[0] ?? caps[0];
|
|
143
185
|
setModal({
|
|
144
186
|
mode: "add",
|
|
145
187
|
providerId,
|
|
146
188
|
externalId: "",
|
|
147
189
|
label: "",
|
|
148
|
-
caps:
|
|
190
|
+
caps: firstCap ? [firstCap.value] : [],
|
|
149
191
|
reasoningEffort: "",
|
|
150
192
|
reasoningCustom: false,
|
|
151
193
|
temperature: "",
|
|
152
194
|
maxTokens: "",
|
|
195
|
+
decisionTransport: "",
|
|
153
196
|
extra: {},
|
|
154
197
|
extraTouched: false,
|
|
155
198
|
labelTouched: false,
|
|
@@ -169,6 +212,7 @@ var ModelRegistry = React.forwardRef(
|
|
|
169
212
|
reasoningCustom: model.reasoningEffort != null && model.reasoningEffort !== "" && !(reasoningEffortOptions ?? []).includes(model.reasoningEffort),
|
|
170
213
|
temperature: model.temperature != null ? String(model.temperature) : "",
|
|
171
214
|
maxTokens: model.maxTokens != null ? String(model.maxTokens) : "",
|
|
215
|
+
decisionTransport: model.decisionTransport ?? "",
|
|
172
216
|
extra: { ...model.extra ?? {} },
|
|
173
217
|
extraTouched: false,
|
|
174
218
|
model,
|
|
@@ -183,22 +227,36 @@ var ModelRegistry = React.forwardRef(
|
|
|
183
227
|
};
|
|
184
228
|
const selectRemote = (remoteId) => {
|
|
185
229
|
const remote = (remoteModels ?? []).find((entry) => entry.id === remoteId);
|
|
186
|
-
setModal(
|
|
187
|
-
(current)
|
|
230
|
+
setModal((current) => {
|
|
231
|
+
if (!current) return current;
|
|
232
|
+
const normalized = remote ? normalizeCaps([...remote.caps], standaloneSet) : current.caps;
|
|
233
|
+
const nextCaps = withImplications(normalized, capImplications ?? {});
|
|
234
|
+
return {
|
|
188
235
|
...current,
|
|
189
236
|
externalId: remoteId,
|
|
190
|
-
caps:
|
|
237
|
+
caps: nextCaps,
|
|
238
|
+
decisionTransport: nextCaps.includes("decision") ? decisionTransport ?? current.decisionTransport ?? "" : "",
|
|
191
239
|
label: current.labelTouched ? current.label : beautifyId(remoteId)
|
|
192
|
-
}
|
|
193
|
-
);
|
|
240
|
+
};
|
|
241
|
+
});
|
|
194
242
|
};
|
|
195
243
|
const toggleDraftCap = (value) => {
|
|
196
|
-
setModal(
|
|
197
|
-
(current)
|
|
244
|
+
setModal((current) => {
|
|
245
|
+
if (!current) return current;
|
|
246
|
+
const isStandalone = standaloneSet.has(value);
|
|
247
|
+
const raw = isStandalone ? (
|
|
248
|
+
// a standalone kind replaces everything (or clears when toggled off)
|
|
249
|
+
current.caps.includes(value) ? current.caps.filter((entry) => entry !== value) : [value]
|
|
250
|
+
) : current.caps.includes(value) ? current.caps.filter((entry) => entry !== value) : [...current.caps.filter((entry) => !standaloneSet.has(entry)), value];
|
|
251
|
+
const nextCaps = isStandalone ? raw : applyImplications(raw, capImplications ?? {}, value, !current.caps.includes(value));
|
|
252
|
+
return {
|
|
198
253
|
...current,
|
|
199
|
-
caps:
|
|
200
|
-
|
|
201
|
-
|
|
254
|
+
caps: nextCaps,
|
|
255
|
+
// The decision capability stamps the app's shipping transport;
|
|
256
|
+
// without it there is no transport to carry.
|
|
257
|
+
decisionTransport: nextCaps.includes("decision") ? decisionTransport ?? current.decisionTransport ?? "" : ""
|
|
258
|
+
};
|
|
259
|
+
});
|
|
202
260
|
};
|
|
203
261
|
const patchField = (field, value) => {
|
|
204
262
|
setModal((current) => current ? { ...current, [field]: value } : current);
|
|
@@ -217,6 +275,7 @@ var ModelRegistry = React.forwardRef(
|
|
|
217
275
|
return;
|
|
218
276
|
}
|
|
219
277
|
const extra = modal.extraTouched || Object.values(modal.extra).some((value) => value.trim() !== "") ? { ...modal.extra } : void 0;
|
|
278
|
+
const isDecision = modal.caps.includes("decision");
|
|
220
279
|
const payload = {
|
|
221
280
|
externalId,
|
|
222
281
|
label: modal.label.trim() || void 0,
|
|
@@ -224,12 +283,19 @@ var ModelRegistry = React.forwardRef(
|
|
|
224
283
|
reasoningEffort: modal.reasoningEffort.trim(),
|
|
225
284
|
temperature: numberOr(modal.temperature),
|
|
226
285
|
maxTokens: numberOr(modal.maxTokens),
|
|
286
|
+
...isDecision && modal.decisionTransport ? { decisionTransport: modal.decisionTransport } : {},
|
|
227
287
|
...extra !== void 0 ? { extra } : {}
|
|
228
288
|
};
|
|
229
289
|
if (modal.mode === "add") {
|
|
230
290
|
onAddModel(modal.providerId, payload);
|
|
231
291
|
} else if (modal.model) {
|
|
232
|
-
|
|
292
|
+
const patch = { ...payload };
|
|
293
|
+
if (isDecision) {
|
|
294
|
+
patch.decisionTransport = modal.decisionTransport || decisionTransport;
|
|
295
|
+
} else {
|
|
296
|
+
patch.decisionTransport = void 0;
|
|
297
|
+
}
|
|
298
|
+
onUpdateModel(modal.model, patch);
|
|
233
299
|
}
|
|
234
300
|
resetModal();
|
|
235
301
|
};
|
|
@@ -260,6 +326,24 @@ var ModelRegistry = React.forwardRef(
|
|
|
260
326
|
return /* @__PURE__ */ jsx(Modal, { open: true, onOpenChange: (open) => !open ? resetModal() : void 0, children: /* @__PURE__ */ jsxs(ModalContent, { className: "max-h-[85vh] w-full max-w-lg overflow-y-auto", children: [
|
|
261
327
|
/* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(ModalTitle, { className: "text-base", children: modal.mode === "add" ? addTitle : `${editTitle} \u2014 ${modal.externalId}` }) }),
|
|
262
328
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 p-4", children: [
|
|
329
|
+
provider ? /* @__PURE__ */ jsxs(
|
|
330
|
+
"div",
|
|
331
|
+
{
|
|
332
|
+
"data-as": "model-registry-provider-context",
|
|
333
|
+
className: "flex min-w-0 items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-muted)]/50 px-3 py-2",
|
|
334
|
+
children: [
|
|
335
|
+
/* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
|
|
336
|
+
providerContextLabel,
|
|
337
|
+
":"
|
|
338
|
+
] }),
|
|
339
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs font-medium text-[var(--as-fg)]", children: provider.name }),
|
|
340
|
+
provider.baseUrl ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
341
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-[var(--as-border)]", children: "\xB7" }),
|
|
342
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-mono text-[10px] text-[var(--as-muted-fg)]", children: provider.baseUrl })
|
|
343
|
+
] }) : null
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
) : null,
|
|
263
347
|
modal.mode === "add" ? remoteState === "loading" ? /* @__PURE__ */ jsxs("p", { className: "flex items-center justify-center gap-2 py-4 text-xs text-[var(--as-muted-fg)]", children: [
|
|
264
348
|
/* @__PURE__ */ jsx(Spinner, { size: "sm" }),
|
|
265
349
|
remoteLoadingLabel
|
|
@@ -279,13 +363,17 @@ var ModelRegistry = React.forwardRef(
|
|
|
279
363
|
className: "w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 font-mono text-sm text-[var(--as-fg)]"
|
|
280
364
|
}
|
|
281
365
|
)
|
|
282
|
-
] }) : /* @__PURE__ */
|
|
366
|
+
] }) : /* @__PURE__ */ jsxs(
|
|
283
367
|
"button",
|
|
284
368
|
{
|
|
285
369
|
type: "button",
|
|
286
|
-
|
|
370
|
+
"data-as": "model-registry-manual-toggle",
|
|
371
|
+
className: "inline-flex cursor-pointer items-center gap-1.5 self-end rounded-[var(--as-radius)] border border-[var(--as-border)] bg-transparent px-2.5 py-1 text-xs text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
287
372
|
onClick: () => setModal((c) => c ? { ...c, manual: true } : c),
|
|
288
|
-
children:
|
|
373
|
+
children: [
|
|
374
|
+
/* @__PURE__ */ jsx(PenLine, { className: "size-3.5", "aria-hidden": true }),
|
|
375
|
+
manualIdToggleLabel
|
|
376
|
+
]
|
|
289
377
|
}
|
|
290
378
|
)
|
|
291
379
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -316,9 +404,16 @@ var ModelRegistry = React.forwardRef(
|
|
|
316
404
|
"button",
|
|
317
405
|
{
|
|
318
406
|
type: "button",
|
|
319
|
-
|
|
407
|
+
"data-as": "model-registry-manual-toggle",
|
|
408
|
+
className: "inline-flex cursor-pointer items-center gap-1.5 self-end rounded-[var(--as-radius)] border border-[var(--as-border)] bg-transparent px-2.5 py-1 text-xs text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
320
409
|
onClick: () => setModal((c) => c ? { ...c, manual: !c.manual } : c),
|
|
321
|
-
children:
|
|
410
|
+
children: modal.manual ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
411
|
+
/* @__PURE__ */ jsx(Library, { className: "size-3.5", "aria-hidden": true }),
|
|
412
|
+
useCatalogLabel
|
|
413
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
414
|
+
/* @__PURE__ */ jsx(PenLine, { className: "size-3.5", "aria-hidden": true }),
|
|
415
|
+
manualIdToggleLabel
|
|
416
|
+
] })
|
|
322
417
|
}
|
|
323
418
|
)
|
|
324
419
|
] }) : /* @__PURE__ */ jsx("p", { className: "font-mono text-sm text-[var(--as-fg)]", children: modal.externalId }),
|
|
@@ -338,7 +433,31 @@ var ModelRegistry = React.forwardRef(
|
|
|
338
433
|
] }),
|
|
339
434
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
340
435
|
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--as-fg)]", children: capsLabel }),
|
|
341
|
-
/* @__PURE__ */
|
|
436
|
+
standaloneDescriptors.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
437
|
+
/* @__PURE__ */ jsx(
|
|
438
|
+
CapabilityChips,
|
|
439
|
+
{
|
|
440
|
+
caps: combinableCaps,
|
|
441
|
+
selected: modal.caps,
|
|
442
|
+
onToggle: toggleDraftCap,
|
|
443
|
+
ariaLabel: capsLabel
|
|
444
|
+
}
|
|
445
|
+
),
|
|
446
|
+
/* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 pt-1 text-[10px] font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]", children: [
|
|
447
|
+
/* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-[var(--as-border)]", "aria-hidden": true }),
|
|
448
|
+
standaloneLabel,
|
|
449
|
+
/* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-[var(--as-border)]", "aria-hidden": true })
|
|
450
|
+
] }),
|
|
451
|
+
/* @__PURE__ */ jsx(
|
|
452
|
+
CapabilityChips,
|
|
453
|
+
{
|
|
454
|
+
caps: standaloneDescriptors,
|
|
455
|
+
selected: modal.caps,
|
|
456
|
+
onToggle: toggleDraftCap,
|
|
457
|
+
ariaLabel: standaloneLabel
|
|
458
|
+
}
|
|
459
|
+
)
|
|
460
|
+
] }) : /* @__PURE__ */ jsx(
|
|
342
461
|
CapabilityChips,
|
|
343
462
|
{
|
|
344
463
|
caps,
|
|
@@ -347,9 +466,16 @@ var ModelRegistry = React.forwardRef(
|
|
|
347
466
|
ariaLabel: capsLabel
|
|
348
467
|
}
|
|
349
468
|
),
|
|
469
|
+
modal.caps.includes("decision") && decisionTransport ? /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1.5 text-xs text-[var(--as-muted-fg)]", children: [
|
|
470
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
471
|
+
decisionTransportLabel,
|
|
472
|
+
":"
|
|
473
|
+
] }),
|
|
474
|
+
/* @__PURE__ */ jsx("code", { className: "rounded-[var(--as-radius-sm)] bg-[var(--as-muted)] px-1.5 py-0.5 font-mono text-[10px] font-semibold uppercase tracking-wide text-[var(--as-fg)]", children: decisionTransport })
|
|
475
|
+
] }) : null,
|
|
350
476
|
capsHint ? /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: capsHint }) : null
|
|
351
477
|
] }),
|
|
352
|
-
reasoningEffortOptions ? /* @__PURE__ */ jsxs("label", { className: "block space-y-1 text-sm", children: [
|
|
478
|
+
hasParametricCaps(modal.caps) && reasoningEffortOptions ? /* @__PURE__ */ jsxs("label", { className: "block space-y-1 text-sm", children: [
|
|
353
479
|
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--as-fg)]", children: reasoningEffortLabel }),
|
|
354
480
|
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 sm:flex-row", children: modal.reasoningCustom ? /* @__PURE__ */ jsx(
|
|
355
481
|
"input",
|
|
@@ -380,7 +506,7 @@ var ModelRegistry = React.forwardRef(
|
|
|
380
506
|
}
|
|
381
507
|
) })
|
|
382
508
|
] }) : null,
|
|
383
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
|
|
509
|
+
hasParametricCaps(modal.caps) ? /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
|
|
384
510
|
/* @__PURE__ */ jsx(
|
|
385
511
|
NumberField,
|
|
386
512
|
{
|
|
@@ -404,7 +530,7 @@ var ModelRegistry = React.forwardRef(
|
|
|
404
530
|
min: "1"
|
|
405
531
|
}
|
|
406
532
|
)
|
|
407
|
-
] }),
|
|
533
|
+
] }) : null,
|
|
408
534
|
(extraFields ?? []).map((field) => {
|
|
409
535
|
const value = modal.extra[field.key] ?? "";
|
|
410
536
|
const common = "w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)]";
|
|
@@ -616,5 +742,5 @@ var ModelRegistry = React.forwardRef(
|
|
|
616
742
|
);
|
|
617
743
|
|
|
618
744
|
export { ModelRegistry };
|
|
619
|
-
//# sourceMappingURL=chunk-
|
|
620
|
-
//# sourceMappingURL=chunk-
|
|
745
|
+
//# sourceMappingURL=chunk-FPX3AI3Z.js.map
|
|
746
|
+
//# sourceMappingURL=chunk-FPX3AI3Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/model-registry/ModelRegistry.tsx"],"names":["ModelRegistry"],"mappings":";;;;;;;;;;;AA0JA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,CAAA;AAG3D,IAAM,iBAAA,GAAoB,CAAC,IAAA,KACzB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AAO7C,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAgB,UAAA,KAA8C;AACnF,EAAA,MAAM,aAAA,GAAgB,KAAK,IAAA,CAAK,CAAC,QAAQ,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AAC5D,EAAA,OAAO,aAAA,GAAgB,CAAC,aAAa,CAAA,GAAI,IAAA;AAC3C,CAAA;AAQA,IAAM,iBAAA,GAAoB,CACxB,IAAA,EACA,YAAA,EACA,SACA,QAAA,KACa;AACb,EAAA,IAAI,OAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AACnD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAO,CAAA,IAAK,EAAC;AAC1C,IAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,CAAQ,YAAY,EAC3C,MAAA,CAAO,CAAC,GAAG,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,CAAC,CAAA,CAC/C,IAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AACrB,EAAA,OAAO,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,OAAA,IAAW,CAAC,UAAA,CAAW,QAAA,CAAS,GAAG,CAAC,CAAA;AAC3G,CAAA;AAGA,IAAM,gBAAA,GAAmB,CACvB,IAAA,EACA,YAAA,KACa;AACb,EAAA,IAAI,GAAA,GAAM,CAAC,GAAG,IAAI,CAAA;AAClB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,GAAA,GAAM,iBAAA,CAAkB,GAAA,EAAK,YAAA,EAAc,GAAA,EAAK,IAAI,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,IAAM,MAAA,GAAS,YAAA;AAWf,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,GAAA;AAAA,EACP,GAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AAC9B,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,OAAW,EAAA,GAAK,CAAA,GAAI,OAAO,KAAK,CAAA;AACtD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAO,OAAA,GAAU,KAAA;AACvB,IAAA,QAAA,CAAS,MAAA,CAAO,GAAA,IAAO,IAAA,IAAQ,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACzE,CAAA;AACA,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EACf,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACjE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,IAAA;AAAA,UACA,GAAA;AAAA,UACA,GAAA;AAAA,UACA,KAAA;AAAA,UACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAChD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,QAAA,KAAA,KAAU,EAAA,mBACT,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAY,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,YACpB,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,oEAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,SACpC,GACE,IAAA;AAAA,wBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,GAAG,KAAK,CAAA,UAAA,CAAA;AAAA,cACpB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,cAChC,SAAA,EAAU,iFAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,WAC9C;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,GAAG,KAAK,CAAA,UAAA,CAAA;AAAA,cACpB,SAAS,MAAM,IAAA,CAAK,CAAC,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,cACjC,SAAA,EAAU,iFAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA;AAChD,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAoBO,IAAM,aAAA,GAAsB,KAAA,CAAA,UAAA;AAAA,EACjC,SAASA,cAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,kBAAA;AAAA,IACA,wBAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,WAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA,GAAc,SAAA;AAAA,IACd,WAAA;AAAA,IACA,sBAAA;AAAA,IACA,QAAA,GAAW,WAAA;AAAA,IACX,WAAA,GAAc,SAAA;AAAA,IACd,QAAA,GAAW,WAAA;AAAA,IACX,SAAA,GAAY,YAAA;AAAA,IACZ,gBAAA,GAAmB,OAAA;AAAA,IACnB,mBAAA,GAAsB,6BAAA;AAAA,IACtB,eAAA,GAAkB,uBAAA;AAAA,IAClB,oBAAA,GAAuB,UAAA;AAAA,IACvB,SAAA,GAAY,MAAA;AAAA,IACZ,WAAA,GAAc,QAAA;AAAA,IACd,YAAA,GAAe,SAAA;AAAA,IACf,SAAA,GAAY,cAAA;AAAA,IACZ,QAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,GAAkB,YAAA;AAAA,IAClB,eAAA;AAAA,IACA,iBAAA,GAAoB,qBAAA;AAAA,IACpB,WAAA,GAAc,eAAA;AAAA,IACd,kBAAA,GAAqB,mEAAA;AAAA,IACrB,uBAAA,GAA0B,2BAAA;AAAA,IAC1B,gBAAA,GAAmB,gCAAA;AAAA,IACnB,kBAAA,GAAqB,sBAAA;AAAA,IACrB,UAAA,GAAa,OAAA;AAAA,IACb,iBAAA,GAAoB,cAAA;AAAA,IACpB,gBAAA,GAAmB,aAAA;AAAA,IACnB,cAAA,GAAiB,YAAA;AAAA,IACjB,UAAA,GAAa,eAAA;AAAA,IACb,oBAAA,GAAuB,kBAAA;AAAA,IACvB,iBAAA;AAAA,IACA,sBAAA,GAAyB,WAAA;AAAA,IACzB,SAAA,GAAY,MAAA;AAAA,IACZ,WAAA,GAAc,QAAA;AAAA,IACd,aAAA,GAAgB,WAAA;AAAA,IAChB,mBAAA,GAAsB,mBAAA;AAAA,IACtB,WAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAA4B,IAAI,CAAA;AAChE,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,eAAwB,IAAI,CAAA;AAEtE,IAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,OAAA;AAAA,MAC1B,MAAM,IAAI,GAAA,CAAI,cAAA,IAAkB,EAAE,CAAA;AAAA,MAClC,CAAC,cAAc;AAAA,KACjB;AACA,IAAA,MAAM,cAAA,GAAuB,KAAA,CAAA,OAAA;AAAA,MAC3B,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MACxD,CAAC,MAAM,aAAa;AAAA,KACtB;AACA,IAAA,MAAM,qBAAA,GAA8B,KAAA,CAAA,OAAA;AAAA,MAClC,MAAM,KAAK,MAAA,CAAO,CAAC,QAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MACvD,CAAC,MAAM,aAAa;AAAA,KACtB;AAEA,IAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,KAAA,KACC,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,IAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,MACnE,CAAC,IAAI;AAAA,KACP;AAEA,IAAA,MAAM,UAAA,GAAmB,kBAAY,MAAM;AACzC,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,cAAA,GAAiB,CAAC,UAAA,KAAuB;AAC7C,MAAA,wBAAA,CAAyB,kBAAA,KAAuB,UAAA,GAAa,IAAA,GAAO,UAAU,CAAA;AAAA,IAChF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,UAAA,KAAuB;AAC3C,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAC5C,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,UAAA;AAAA,QACA,UAAA,EAAY,EAAA;AAAA,QACZ,KAAA,EAAO,EAAA;AAAA,QACP,MAAM,QAAA,GAAW,CAAC,QAAA,CAAS,KAAK,IAAI,EAAC;AAAA,QACrC,eAAA,EAAiB,EAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,WAAA,EAAa,EAAA;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,QACX,iBAAA,EAAmB,EAAA;AAAA,QACnB,OAAO,EAAC;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,YAAA,EAAc,KAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA8B;AACnD,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,KAAA,EAAO,MAAM,KAAA,IAAS,EAAA;AAAA,QACtB,IAAA,EAAM,CAAC,GAAG,KAAA,CAAM,IAAI,CAAA;AAAA,QACpB,YAAA,EAAc,IAAA;AAAA,QACd,eAAA,EAAiB,MAAM,eAAA,IAAmB,EAAA;AAAA,QAC1C,eAAA,EACE,KAAA,CAAM,eAAA,IAAmB,IAAA,IACzB,KAAA,CAAM,eAAA,KAAoB,EAAA,IAC1B,CAAA,CAAE,sBAAA,IAA0B,EAAC,EAAG,QAAA,CAAS,MAAM,eAAe,CAAA;AAAA,QAChE,aAAa,KAAA,CAAM,WAAA,IAAe,OAAO,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,GAAI,EAAA;AAAA,QACrE,WAAW,KAAA,CAAM,SAAA,IAAa,OAAO,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,GAAI,EAAA;AAAA,QAC/D,iBAAA,EAAmB,MAAM,iBAAA,IAAqB,EAAA;AAAA,QAC9C,OAAO,EAAE,GAAI,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG;AAAA,QAChC,YAAA,EAAc,KAAA;AAAA,QACd,KAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,EAAa,KAAA,KAAkB;AACtD,MAAA,QAAA;AAAA,QAAS,CAAC,OAAA,KACR,OAAA,GACI,EAAE,GAAG,OAAA,EAAS,OAAO,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAO,CAAC,GAAG,GAAG,OAAM,EAAG,YAAA,EAAc,MAAK,GAC5E;AAAA,OACN;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAqB;AACzC,MAAA,MAAM,MAAA,GAAA,CAAU,gBAAgB,EAAC,EAAG,KAAK,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,QAAQ,CAAA;AACzE,MAAA,QAAA,CAAS,CAAC,OAAA,KAAY;AACpB,QAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,QAAA,MAAM,UAAA,GAAa,MAAA,GAAS,aAAA,CAAc,CAAC,GAAG,OAAO,IAAI,CAAA,EAAG,aAAa,CAAA,GAAI,OAAA,CAAQ,IAAA;AAGrF,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,UAAA,EAAY,eAAA,IAAmB,EAAE,CAAA;AACnE,QAAA,OAAO;AAAA,UACL,GAAG,OAAA;AAAA,UACH,UAAA,EAAY,QAAA;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,iBAAA,EAAmB,SAAS,QAAA,CAAS,UAAU,IAC1C,iBAAA,IAAqB,OAAA,CAAQ,qBAAqB,EAAA,GACnD,EAAA;AAAA,UACJ,OAAO,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,KAAA,GAAQ,WAAW,QAAQ;AAAA,SACnE;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,MAAA,QAAA,CAAS,CAAC,OAAA,KAAY;AACpB,QAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,QAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC5C,QAAA,MAAM,GAAA,GAAM,YAAA;AAAA;AAAA,UAER,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,IACzB,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,KAAK,CAAA,GAC9C,CAAC,KAAK;AAAA,YACR,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GACzB,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,KAAK,CAAA,GAC9C,CAAC,GAAG,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,aAAA,CAAc,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA;AAC1E,QAAA,MAAM,QAAA,GAAW,YAAA,GACb,GAAA,GACA,iBAAA,CAAkB,KAAK,eAAA,IAAmB,EAAC,EAAG,KAAA,EAAO,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AACtF,QAAA,OAAO;AAAA,UACL,GAAG,OAAA;AAAA,UACH,IAAA,EAAM,QAAA;AAAA;AAAA;AAAA,UAGN,iBAAA,EAAmB,SAAS,QAAA,CAAS,UAAU,IAC1C,iBAAA,IAAqB,OAAA,CAAQ,qBAAqB,EAAA,GACnD;AAAA,SACN;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAyB,KAAA,KAAkB;AAC7D,MAAA,QAAA,CAAS,CAAC,OAAA,KAAa,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,CAAC,KAAK,GAAG,KAAA,EAAM,GAAI,OAAQ,CAAA;AAAA,IAC5E,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAA+B;AAC/C,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,MAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,IAC5C,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,IAAA,EAAK;AACzC,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,aAAA,CAAc,uBAAuB,CAAA;AACrC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GACJ,MAAM,YAAA,IAAgB,MAAA,CAAO,OAAO,KAAA,CAAM,KAAK,EAAE,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,IAAA,OAAW,EAAE,CAAA,GAChF,EAAE,GAAG,KAAA,CAAM,OAAM,GACjB,MAAA;AACN,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACjD,MAAA,MAAM,OAAA,GAA8B;AAAA,QAClC,UAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,IAAK,MAAA;AAAA,QAC7B,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,eAAA,EAAiB,KAAA,CAAM,eAAA,CAAgB,IAAA,EAAK;AAAA,QAC5C,WAAA,EAAa,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA;AAAA,QACvC,SAAA,EAAW,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA;AAAA,QACnC,GAAI,cAAc,KAAA,CAAM,iBAAA,GACpB,EAAE,iBAAA,EAAmB,KAAA,CAAM,iBAAA,EAAkB,GAC7C,EAAC;AAAA,QACL,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU;AAAC,OACzC;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,UAAA,CAAW,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,MACtC,CAAA,MAAA,IAAW,MAAM,KAAA,EAAO;AACtB,QAAA,MAAM,KAAA,GAA4B,EAAE,GAAG,OAAA,EAAQ;AAC/C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,CAAM,iBAAA,GAAoB,MAAM,iBAAA,IAAqB,iBAAA;AAAA,QACvD,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAAA,QAC5B;AACA,QAAA,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MAClC;AACA,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAA2D;AACpF,MAAA,MAAM,KAAA,GAAQ,gBAAgB,EAAC;AAC/B,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,YAC5B,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,MAAM,KAAA,CAAM,EAAA;AAAA,YACZ,cAAc,KAAA,CAAM;AAAA,WACtB,CAAE;AAAA;AACJ,OACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,MAAM,UAAU,CAAA;AACxE,MAAA,MAAM,OAAA,GAAU,QAAA,GAAW,iBAAA,CAAkB,QAAQ,IAAI,EAAC;AAC1D,MAAA,MAAM,YAAA,GAAA,CAAgB,YAAA,IAAgB,EAAC,EAAG,MAAA;AAAA,QACxC,CAAC,MAAA,KACC,CAAC,MAAA,CAAO,IAAA;AAAA,UACN,CAAC,UAAU,KAAA,CAAM,UAAA,KAAe,MAAM,UAAA,IAAc,KAAA,CAAM,eAAe,MAAA,CAAO;AAAA;AAClF,OACJ,CAAE,MAAA;AACF,MAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAI,IAAA,EAAC,cAAc,CAAC,IAAA,KAAmB,CAAC,IAAA,GAAO,YAAW,GAAI,MAAA,EACnE,QAAA,kBAAA,IAAA,CAAC,YAAA,EAAA,EAAa,WAAU,8CAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,aACnB,QAAA,EAAA,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,QAAA,GAAW,GAAG,SAAS,CAAA,QAAA,EAAM,KAAA,CAAM,UAAU,IACvE,CAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA,mBACC,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAQ,iCAAA;AAAA,cACR,SAAA,EAAU,+HAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,SAAA,EAAW,QAAA,EAAA;AAAA,kBAAA,oBAAA;AAAA,kBAAqB;AAAA,iBAAA,EAAC,CAAA;AAAA,gCACjD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACb,mBAAS,IAAA,EACZ,CAAA;AAAA,gBACC,QAAA,CAAS,0BACR,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,2BAA0B,QAAA,EAAA,MAAA,EAEtD,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EACb,mBAAS,OAAA,EACZ;AAAA,iBAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA,WACN,GACE,IAAA;AAAA,UACH,KAAA,CAAM,SAAS,KAAA,GACd,WAAA,KAAgB,4BACd,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+EAAA,EACX,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAK,IAAA,EAAK,CAAA;AAAA,YAClB;AAAA,WAAA,EACH,CAAA,GACE,WAAA,KAAgB,OAAA,mBAClB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,cACpE,aAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAK,OAAA,EAAS,aAAA,EAC1C,QAAA,EAAA,UAAA,EACH,CAAA,GACE;AAAA,aAAA,EACN,CAAA;AAAA,YACC,KAAA,CAAM,MAAA,mBACL,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,yBAAA,EACf,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA,gBAAA,EACH,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,OAAO,KAAA,CAAM,UAAA;AAAA,kBACb,UAAU,CAAC,KAAA,KAAU,WAAW,YAAA,EAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,kBAChE,SAAA,EAAU;AAAA;AAAA;AACZ,aAAA,EACF,CAAA,mBAEA,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAQ,8BAAA;AAAA,gBACR,SAAA,EAAU,8VAAA;AAAA,gBACV,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA,KAAO,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK,GAAI,CAAE,CAAA;AAAA,gBAE/D,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,kBACzC;AAAA;AAAA;AAAA;AACH,WAAA,EAEJ,oBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,MAAA,mBACL,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EACf,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA,gBAAA,EACH,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,OAAO,KAAA,CAAM,UAAA;AAAA,kBACb,UAAU,CAAC,KAAA,KAAU,WAAW,YAAA,EAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,kBAChE,SAAA,EAAU;AAAA;AAAA;AACZ,aAAA,EACF,CAAA,mBAEA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,OAAA;AAAA,gBACX,OAAO,KAAA,CAAM,UAAA;AAAA,gBACb,UAAU,CAAC,OAAA,KAAa,OAAA,GAAU,YAAA,CAAa,OAAO,CAAA,GAAI,MAAA;AAAA,gBAC1D,KAAA,EAAO,gBAAA;AAAA,gBACP,iBAAA;AAAA,gBACA,WAAA;AAAA,gBACA,UAAA,EAAY;AAAA;AAAA,aACd;AAAA,4BAEF,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAQ,8BAAA;AAAA,gBACR,SAAA,EAAU,8VAAA;AAAA,gBACV,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,MAAO,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,CAAA,CAAE,MAAA,KAAW,CAAE,CAAA;AAAA,gBAEnE,QAAA,EAAA,KAAA,CAAM,yBACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,kBACzC;AAAA,iBAAA,EACH,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,kBACzC;AAAA,iBAAA,EACH;AAAA;AAAA;AAEJ,WAAA,EACF,oBAGF,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAyC,gBAAM,UAAA,EAAW,CAAA;AAAA,0BAEzE,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,4BACtE,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,KAAA,CAAM,KAAA;AAAA,gBACb,QAAA,EAAU,CAAC,KAAA,KACT,QAAA;AAAA,kBAAS,CAAC,OAAA,KACR,OAAA,GACI,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,YAAA,EAAc,IAAA,EAAK,GAC5D;AAAA,iBACN;AAAA,gBAEF,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,YACpE,qBAAA,CAAsB,MAAA,GAAS,CAAA,mBAC9B,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,cAAA;AAAA,kBACN,UAAU,KAAA,CAAM,IAAA;AAAA,kBAChB,QAAA,EAAU,cAAA;AAAA,kBACV,SAAA,EAAW;AAAA;AAAA,eACb;AAAA,8BACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0GAAA,EACX,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,gBAC/D,eAAA;AAAA,gCACD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,eAAW,IAAA,EAAC;AAAA,eAAA,EAClE,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,qBAAA;AAAA,kBACN,UAAU,KAAA,CAAM,IAAA;AAAA,kBAChB,QAAA,EAAU,cAAA;AAAA,kBACV,SAAA,EAAW;AAAA;AAAA;AACb,aAAA,EACF,CAAA,mBAEA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,UAAU,KAAA,CAAM,IAAA;AAAA,gBAChB,QAAA,EAAU,cAAA;AAAA,gBACV,SAAA,EAAW;AAAA;AAAA,aACb;AAAA,YAED,KAAA,CAAM,KAAK,QAAA,CAAS,UAAU,KAAK,iBAAA,mBAClC,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DAAA,EACX,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,sBAAA;AAAA,gBAAuB;AAAA,eAAA,EAAC,CAAA;AAAA,8BAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kJAAA,EACb,QAAA,EAAA,iBAAA,EACH;AAAA,aAAA,EACF,CAAA,GACE,IAAA;AAAA,YACH,2BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAqC,oBAAS,CAAA,GACzD;AAAA,WAAA,EACN,CAAA;AAAA,UACC,iBAAA,CAAkB,MAAM,IAAI,CAAA,IAAK,yCAChC,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,yBAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA,oBAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,gBAAM,eAAA,mBACL,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,KAAA,CAAM,eAAA;AAAA,gBACb,WAAA,EAAa,iBAAA;AAAA,gBACb,UAAU,CAAC,KAAA,KAAU,WAAW,iBAAA,EAAmB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBACrE,SAAA,EAAU;AAAA;AAAA,aACZ,mBAEA,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,KAAA,CAAM,eAAA,GAAkB,MAAA,GAAS,KAAA,CAAM,eAAA;AAAA,gBAC9C,QAAA,EAAU,CAAC,KAAA,KACT,QAAA;AAAA,kBAAS,CAAC,YACR,OAAA,GACI;AAAA,oBACE,GAAG,OAAA;AAAA,oBACH,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,KAAA,KAAU,MAAA;AAAA,oBACxC,eAAA,EACE,MAAM,MAAA,CAAO,KAAA,KAAU,SACnB,OAAA,CAAQ,eAAA,GACR,MAAM,MAAA,CAAO;AAAA,mBACrB,GACA;AAAA,iBACN;AAAA,gBAEF,SAAA,EAAU,yIAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,kBACjB,sBAAA,CAAuB,GAAA,CAAI,CAAC,MAAA,qBAC3B,GAAA,CAAC,YAAoB,KAAA,EAAO,MAAA,EACzB,QAAA,EAAA,MAAA,EAAA,EADU,MAEb,CACD,CAAA;AAAA,kCACD,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,MAAA,EAAS,QAAA,EAAA,iBAAA,EAAkB;AAAA;AAAA;AAAA,aAC5C,EAEJ;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,UACH,kBAAkB,KAAA,CAAM,IAAI,oBAC3B,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,gBAAA;AAAA,gBACP,OAAO,KAAA,CAAM,WAAA;AAAA,gBACb,QAAA,EAAU,CAAC,KAAA,KAAU,UAAA,CAAW,eAAe,KAAK,CAAA;AAAA,gBACpD,OAAA,EAAS,MAAM,UAAA,CAAW,aAAA,EAAe,EAAE,CAAA;AAAA,gBAC3C,IAAA,EAAK,KAAA;AAAA,gBACL,GAAA,EAAI,GAAA;AAAA,gBACJ,GAAA,EAAI;AAAA;AAAA,aACN;AAAA,4BACA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,cAAA;AAAA,gBACP,OAAO,KAAA,CAAM,SAAA;AAAA,gBACb,QAAA,EAAU,CAAC,KAAA,KAAU,UAAA,CAAW,aAAa,KAAK,CAAA;AAAA,gBAClD,OAAA,EAAS,MAAM,UAAA,CAAW,WAAA,EAAa,EAAE,CAAA;AAAA,gBACzC,IAAA,EAAK,KAAA;AAAA,gBACL,GAAA,EAAI;AAAA;AAAA;AACN,WAAA,EACF,CAAA,GACE,IAAA;AAAA,UAAA,CACF,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,KAAU;AAClC,YAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA;AACxC,YAAA,MAAM,MAAA,GACJ,iIAAA;AACF,YAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAsB,SAAA,EAAU,yBAAA,EAC/B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,cACtE,MAAM,SAAA,mBACL,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,CAAA;AAAA,kBACN,KAAA;AAAA,kBACA,aAAa,KAAA,CAAM,WAAA;AAAA,kBACnB,QAAA,EAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,MAAM,GAAA,EAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,kBAClE,SAAA,EAAW;AAAA;AAAA,eACb,mBAEA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA;AAAA,kBACA,aAAa,KAAA,CAAM,WAAA;AAAA,kBACnB,QAAA,EAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,MAAM,GAAA,EAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,kBAClE,SAAA,EAAW;AAAA;AAAA;AACb,aAAA,EAAA,EAjBQ,MAAM,GAmBlB,CAAA;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,UAAA,uBACE,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,iCAAA,EACvB,sBACH,CAAA,GACE;AAAA,SAAA,EACN,CAAA;AAAA,6BACC,WAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,IAAA,KAAS,SAAS,QAAA,mBACvB,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,QAAA,EAAU,WAAA,KAAgB,OAAA,IAAW,YAAA,KAAiB,CAAA;AAAA,cACtD,SAAS,MAAM;AACb,gBAAA,QAAA;AAAA,kBACE,KAAA,CAAM,UAAA;AAAA,kBAAA,CACL,YAAA,IAAgB,EAAC,EACf,MAAA;AAAA,oBACC,CAAC,MAAA,KACC,CAAC,MAAA,CAAO,IAAA;AAAA,sBACN,CAAC,UACC,KAAA,CAAM,UAAA,KAAe,MAAM,UAAA,IAC3B,KAAA,CAAM,eAAe,MAAA,CAAO;AAAA;AAChC,mBACJ,CACC,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,oBAChB,YAAY,MAAA,CAAO,EAAA;AAAA,oBACnB,MAAM,MAAA,CAAO,IAAA;AAAA,oBACb,eAAA,EAAiB,EAAA;AAAA,oBACjB,WAAA,EAAa,IAAA;AAAA,oBACb,SAAA,EAAW;AAAA,mBACb,CAAE;AAAA,iBACN;AACA,gBAAA,UAAA,EAAW;AAAA,cACb,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,gBACjB,WAAA;AAAA,gBAAY,IAAA;AAAA,gBAAG,YAAA;AAAA,gBAAa;AAAA;AAAA;AAAA,WAC/B,GACE,IAAA;AAAA,0BACJ,GAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,YACxC,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,0BACA,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAS,WAAA,EACzB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,eAAW,IAAA,EAAC,CAAA;AAAA,YAClB,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,aAAA,GAAgB;AAAA,WAAA,EAC1C;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,gBAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,QAEpD,QAAA,EAAA;AAAA,UAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa;AAC3B,YAAA,MAAM,QAAA,GAAW,uBAAuB,QAAA,CAAS,EAAA;AACjD,YAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,UAAA,KAAe,SAAS,EAAE,CAAA;AAChF,YAAA,uBACE,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAQ,yBAAA;AAAA,gBACR,SAAA,EAAW,EAAA;AAAA,kBACT,4EAAA;AAAA,kBACA,WACI,wDAAA,GACA;AAAA,iBACN;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,IAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,eAAA,EAAe,QAAA;AAAA,sBACf,OAAA,EAAS,MAAM,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA;AAAA,sBACzC,SAAA,EAAU,uKAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wCAAA,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,SAAA,EAAW,EAAA;AAAA,8BACT,+FAAA;AAAA,8BACA,WACI,oDAAA,GACA;AAAA,6BACN;AAAA,4BAEC,QAAA,EAAA,QAAA,mBACC,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,IAAA,EAAC,CAAA,mBAE5C,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,yBAEjD;AAAA,wCACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,0CAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6EAAA,EACb,QAAA,EAAA;AAAA,4BAAA,QAAA,CAAS,IAAA;AAAA,4BACT,QAAA,CAAS,uBACR,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qIAAA,EACb,QAAA,EAAA,QAAA,CAAS,MACZ,CAAA,GACE,IAAA;AAAA,4BACH,cAAA,CAAe,MAAA,mBACd,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+HAAA,EACb,QAAA,EAAA;AAAA,8BAAA,cAAA,CAAe,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA;AAAA,8BAAO,GAAA;AAAA,8BACvD,cAAA,CAAe;AAAA,6BAAA,EAClB,CAAA,GACE;AAAA,2BAAA,EACN,CAAA;AAAA,0BACC,QAAA,CAAS,0BACR,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4DAAA,EACb,QAAA,EAAA,QAAA,CAAS,SACZ,CAAA,GACE;AAAA,yBAAA,EACN;AAAA;AAAA;AAAA,mBACF;AAAA,kBACC,QAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,CAAC,QAAA,CAAS,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,uBAC9C,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EACV,QAAA,EAAA,kBAAA,EACH,CAAA,GACE,IAAA;AAAA,oBACH,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7B,sBAAA,uBACE,IAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BAEC,SAAA,EAAW,EAAA;AAAA,4BACT,kHAAA;AAAA,4BACA,MAAM,OAAA,IAAW;AAAA,2BACnB;AAAA,0BAEC,QAAA,EAAA;AAAA,4BAAA,eAAA,IAAmB,CAAC,SAAS,QAAA,mBAC5B,GAAA;AAAA,8BAAC,OAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAK,UAAA;AAAA,gCACL,YAAA,EAAY,CAAA,EAAG,WAAW,CAAA,QAAA,EAAM,MAAM,UAAU,CAAA,CAAA;AAAA,gCAChD,SAAS,KAAA,CAAM,OAAA;AAAA,gCACf,UAAU,CAAC,KAAA,KAAU,gBAAgB,KAAA,EAAO,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,gCAChE,SAAA,EAAU;AAAA;AAAA,6BACZ,GACE,IAAA;AAAA,4CACJ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EACb,gBAAM,UAAA,EACT,CAAA;AAAA,4BACC,MAAM,OAAA,mBACL,GAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACb,wBACH,CAAA,GACE,IAAA;AAAA,4CACJ,GAAA;AAAA,8BAAC,eAAA;AAAA,8BAAA;AAAA,gCACC,OAAA,EAAQ,OAAA;AAAA,gCACR,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA;AAAA,gCAClC,UAAU,KAAA,CAAM;AAAA;AAAA,6BAClB;AAAA,4BACC,CAAC,SAAS,QAAA,mBACT,IAAA;AAAA,8BAAC,MAAA;AAAA,8BAAA;AAAA,gCACC,OAAA,EAAQ,SAAA;AAAA,gCACR,IAAA,EAAK,IAAA;AAAA,gCACL,YAAA,EAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,UAAU,CAAA,CAAA;AAAA,gCAC5C,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,gCAElC,QAAA,EAAA;AAAA,kDAAA,GAAA,CAAC,MAAA,EAAA,EAAO,eAAW,IAAA,EAAC,CAAA;AAAA,kCACnB;AAAA;AAAA;AAAA,6BACH,GACE,IAAA;AAAA,4BACH,CAAC,SAAS,QAAA,mBACT,GAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAK,QAAA;AAAA,gCACL,YAAA,EAAY,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAM,UAAU,CAAA,CAAA;AAAA,gCAC9C,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,gCAClC,SAAA,EAAU,yPAAA;AAAA,gCAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,6BACpC,GACE;AAAA;AAAA,yBAAA;AAAA,wBAhDC,KAAA,CAAM;AAAA,uBAiDb;AAAA,oBAEJ,CAAC,CAAA;AAAA,oBACA,CAAC,QAAA,CAAS,QAAA,mBACT,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,kBAAA,IAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,SAAA;AAAA,wBACR,IAAA,EAAK,IAAA;AAAA,wBACL,iBAAe,KAAA,EAAO,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,eAAe,QAAA,CAAS,EAAA;AAAA,wBACtE,OAAA,EAAS,MAAM,YAAA,CAAa,QAAA,CAAS,EAAE,CAAA;AAAA,wBAEvC,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,IAAA,EAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,0BACjB;AAAA;AAAA;AAAA,uBAEL,CAAA,GACE;AAAA,mBAAA,EACN,CAAA,GACE;AAAA;AAAA,eAAA;AAAA,cA/HC,QAAA,CAAS;AAAA,aAgIhB;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,UAAU,MAAA,KAAW,CAAA,mBACpB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mDAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA,mBAAA,EAAoB,CAAA;AAAA,YACrE;AAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,UACH,WAAA;AAAY;AAAA;AAAA,KACf;AAAA,EAEJ;AACF","file":"chunk-FPX3AI3Z.js","sourcesContent":["import * as React from 'react'\nimport { Check, ChevronDown, ChevronRight, ChevronUp, Library, Pencil, PenLine, Plus, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Button } from '../button'\nimport { CapabilityChips, type CapabilityDescriptor } from '../capability-chips'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalFooter } from '../modal/Modal'\nimport { ModelPicker, type ModelPickerProvider } from '../model-picker/ModelPicker'\nimport { Spinner } from '../spinner'\nimport { beautifyId } from '../../lib/fuzzy'\n\nexport interface ModelRegistryProvider {\n id: string\n name: string\n type?: string\n baseUrl?: string\n /** Read-only provider: hides Add/Edit/Remove (e.g. org-managed providers). */\n readOnly?: boolean\n}\n\nexport interface ModelRegistryModel {\n id: string\n providerId: string\n externalId: string\n label?: string\n caps: string[]\n enabled: boolean\n reasoningEffort?: string\n temperature?: number | null\n maxTokens?: number | null\n /** The model's decision transport (e.g. `systemone`) — set when `caps`\n * carries the app's decision capability. */\n decisionTransport?: string\n /** App-defined extra fields (see `extraFields`), carried verbatim. */\n extra?: Record<string, string>\n missing?: boolean\n}\n\nexport interface ModelRegistryRemoteModel {\n id: string\n caps: string[]\n}\n\nexport interface ModelRegistryDraft {\n externalId: string\n label?: string\n caps: string[]\n reasoningEffort?: string\n temperature?: number | null\n maxTokens?: number | null\n decisionTransport?: string\n extra?: Record<string, string>\n}\n\nexport interface ModelRegistryPatch {\n label?: string\n caps?: string[]\n reasoningEffort?: string\n temperature?: number | null\n maxTokens?: number | null\n decisionTransport?: string\n extra?: Record<string, string>\n}\n\nexport interface ModelRegistryExtraField {\n key: string\n label: string\n placeholder?: string\n /** Render a multi-line textarea instead of a single-line input. */\n multiline?: boolean\n}\n\nexport type ModelRegistryRemoteState = 'loading' | 'error' | 'ready'\n\nexport interface ModelRegistryProps {\n providers: ModelRegistryProvider[]\n models: ModelRegistryModel[]\n caps: CapabilityDescriptor[]\n expandedProviderId?: string | null\n onExpandedProviderChange: (providerId: string | null) => void\n remoteModels?: ModelRegistryRemoteModel[]\n remoteState?: ModelRegistryRemoteState\n remoteError?: string | null\n onRetryRemote?: () => void\n onAddModel: (providerId: string, draft: ModelRegistryDraft) => void\n onAddAll?: (providerId: string, drafts: ModelRegistryDraft[]) => void\n onUpdateModel: (model: ModelRegistryModel, patch: ModelRegistryPatch) => void\n onDeleteModel: (model: ModelRegistryModel) => void\n /** Toggle a model's enabled flag; renders the row checkbox when set. */\n onToggleEnabled?: (model: ModelRegistryModel, enabled: boolean) => void\n enableLabel?: string\n /** App-declared extra fields rendered in the add/edit modal (e.g. a\n * description line); values ride `extra` on Draft/Patch/Model. */\n extraFields?: ModelRegistryExtraField[]\n reasoningEffortOptions?: string[]\n addLabel?: string\n addAllLabel?: string\n addTitle?: string\n editTitle?: string\n selectModelLabel?: string\n manualIdToggleLabel?: string\n /** Shown on the manual↔catalog toggle when manual entry is active\n * (returning to the catalog picker). */\n useCatalogLabel?: string\n /** Visually-hidden prefix for the provider context banner. */\n providerContextLabel?: string\n editLabel?: string\n removeLabel?: string\n missingLabel?: string\n capsLabel?: string\n /** Muted explainer under the capability chips (what they gate). */\n capsHint?: string\n /** Capability values that are standalone kinds (e.g. decision, stt, tts,\n * embeddings): selecting one makes the model exactly that kind — the\n * chat-family caps combine, standalone kinds replace everything (the\n * family's slot-separation law, D4, expressed in the form). */\n standaloneCaps?: string[]\n /** Label for the standalone-kinds cluster (`standaloneCaps`). */\n standaloneLabel?: string\n /** Selection implications between combinable caps (e.g.\n * `{ vision: ['text'], tools: ['text'] }` — every vision/tool-capable\n * model is a text model too): selecting a key auto-enables its values,\n * and deselecting a value deselects everything that implies it. */\n capImplications?: Record<string, string[]>\n searchPlaceholder?: string\n searchLabel?: string\n emptyProviderLabel?: string\n externalIdRequiredLabel?: string\n remoteEmptyLabel?: string\n remoteLoadingLabel?: string\n retryLabel?: string\n customOptionLabel?: string\n temperatureLabel?: string\n maxTokensLabel?: string\n labelLabel?: string\n reasoningEffortLabel?: string\n /** The app's shipping decision transport (e.g. `systemone`): when set,\n * models with the decision capability render a read-only transport row\n * and carry the value on Draft/Patch. */\n decisionTransport?: string\n decisionTransportLabel?: string\n saveLabel?: string\n cancelLabel?: string\n addDraftLabel?: string\n providersEmptyLabel?: string\n emptyAction?: React.ReactNode\n className?: string\n}\n\n/**\n * Capabilities whose models take generation-side parameters (temperature,\n * max tokens, reasoning effort). Other capabilities (stt/tts/embeddings/\n * decision) render without those sections — plan 26 follow-up: options\n * are shown per capability, never always.\n */\nconst PARAMETRIC_CAPS = new Set(['text', 'vision', 'tools'])\n\n/** Whether any selected capability takes generation-side parameters. */\nconst hasParametricCaps = (caps: string[]): boolean =>\n caps.some((cap) => PARAMETRIC_CAPS.has(cap))\n\n/**\n * Catalog normalization for `standaloneCaps` (remote model pick): a caps\n * set may carry either one standalone kind (alone) or any combination of\n * the chat-family caps — never both, never two standalone kinds.\n */\nconst normalizeCaps = (next: string[], standalone: ReadonlySet<string>): string[] => {\n const standaloneHit = next.find((cap) => standalone.has(cap))\n return standaloneHit ? [standaloneHit] : next\n}\n\n/**\n * `capImplications` closure over a selection toggle: selecting a cap\n * enables its implications (vision → text); deselecting a cap drops\n * everything that implies it (text off → vision + tools off). Idempotent\n * for caps the implications do not mention.\n */\nconst applyImplications = (\n next: string[],\n implications: Record<string, string[]>,\n toggled: string,\n selected: boolean,\n): string[] => {\n if (Object.keys(implications).length === 0) return next\n if (selected) {\n const implied = implications[toggled] ?? []\n return [...next, ...implied.filter((cap) => !next.includes(cap))]\n }\n const dependents = Object.entries(implications)\n .filter(([, values]) => values.includes(toggled))\n .map(([cap]) => cap)\n return dependents.length === 0 ? next : next.filter((cap) => cap !== toggled && !dependents.includes(cap))\n}\n\n/** ON-implications folded over a whole caps set (catalog picks). */\nconst withImplications = (\n caps: string[],\n implications: Record<string, string[]>,\n): string[] => {\n let out = [...caps]\n for (const cap of caps) {\n out = applyImplications(out, implications, cap, true)\n }\n return out\n}\n\nconst CUSTOM = '__custom__'\ninterface NumberFieldProps {\n label: string\n value: string\n onChange: (value: string) => void\n onClear: () => void\n step?: string\n min?: string\n max?: string\n}\n\nfunction NumberField({\n label,\n value,\n onChange,\n onClear,\n step = '1',\n min,\n max,\n}: NumberFieldProps) {\n const bump = (delta: number) => {\n const current = value.trim() === '' ? 0 : Number(value)\n if (!Number.isFinite(current)) return\n const next = current + delta\n onChange(String(min != null && next < Number(min) ? Number(min) : next))\n }\n return (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{label}</span>\n <span className=\"relative block\">\n <input\n type=\"number\"\n step={step}\n min={min}\n max={max}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 pr-16 text-sm text-[var(--as-fg)] [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n />\n <span className=\"absolute inset-y-0 right-1.5 flex items-center gap-1\">\n {value !== '' ? (\n <button\n type=\"button\"\n aria-label={`${label} clear`}\n onClick={onClear}\n className=\"cursor-pointer text-[var(--as-muted-fg)] hover:text-[var(--as-fg)]\"\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n <span className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-label={`${label} increment`}\n onClick={() => bump(Number(step))}\n className=\"cursor-pointer leading-none text-[var(--as-muted-fg)] hover:text-[var(--as-fg)]\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <button\n type=\"button\"\n aria-label={`${label} decrement`}\n onClick={() => bump(-Number(step))}\n className=\"cursor-pointer leading-none text-[var(--as-muted-fg)] hover:text-[var(--as-fg)]\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n </span>\n </span>\n </label>\n )\n}\n\ninterface ModalState {\n mode: 'add' | 'edit'\n providerId: string\n externalId: string\n label: string\n caps: string[]\n reasoningEffort: string\n reasoningCustom: boolean\n temperature: string\n maxTokens: string\n decisionTransport: string\n extra: Record<string, string>\n extraTouched: boolean\n labelTouched: boolean\n model?: ModelRegistryModel\n manual: boolean\n}\n\nexport const ModelRegistry = React.forwardRef<HTMLDivElement, ModelRegistryProps>(\n function ModelRegistry(\n {\n providers,\n models,\n caps,\n expandedProviderId,\n onExpandedProviderChange,\n remoteModels,\n remoteState = 'ready',\n remoteError,\n onRetryRemote,\n onAddModel,\n onAddAll,\n onUpdateModel,\n onDeleteModel,\n onToggleEnabled,\n enableLabel = 'Enabled',\n extraFields,\n reasoningEffortOptions,\n addLabel = 'Add model',\n addAllLabel = 'Add all',\n addTitle = 'Add model',\n editTitle = 'Edit model',\n selectModelLabel = 'Model',\n manualIdToggleLabel = 'Enter the model id manually',\n useCatalogLabel = 'Pick from the catalog',\n providerContextLabel = 'Provider',\n editLabel = 'Edit',\n removeLabel = 'Remove',\n missingLabel = 'Missing',\n capsLabel = 'Capabilities',\n capsHint,\n standaloneCaps,\n standaloneLabel = 'Standalone',\n capImplications,\n searchPlaceholder = 'Search models…',\n searchLabel = 'Search models',\n emptyProviderLabel = 'No models yet — use Add model to pick from the live catalog.',\n externalIdRequiredLabel = 'The model id is required.',\n remoteEmptyLabel = 'The provider listed no models.',\n remoteLoadingLabel = 'Loading models…',\n retryLabel = 'Retry',\n customOptionLabel = 'Custom…',\n temperatureLabel = 'Temperature',\n maxTokensLabel = 'Max tokens',\n labelLabel = 'Display label',\n reasoningEffortLabel = 'Reasoning effort',\n decisionTransport,\n decisionTransportLabel = 'Transport',\n saveLabel = 'Save',\n cancelLabel = 'Cancel',\n addDraftLabel = 'Add model',\n providersEmptyLabel = 'No providers yet.',\n emptyAction,\n className,\n },\n ref,\n ) {\n const [modal, setModal] = React.useState<ModalState | null>(null)\n const [draftError, setDraftError] = React.useState<string | null>(null)\n\n const standaloneSet = React.useMemo(\n () => new Set(standaloneCaps ?? []),\n [standaloneCaps],\n )\n const combinableCaps = React.useMemo(\n () => caps.filter((cap) => !standaloneSet.has(cap.value)),\n [caps, standaloneSet],\n )\n const standaloneDescriptors = React.useMemo(\n () => caps.filter((cap) => standaloneSet.has(cap.value)),\n [caps, standaloneSet],\n )\n\n const descriptorFor = React.useCallback(\n (value: string): CapabilityDescriptor =>\n caps.find((cap) => cap.value === value) ?? { value, label: value },\n [caps],\n )\n\n const resetModal = React.useCallback(() => {\n setModal(null)\n setDraftError(null)\n }, [])\n\n const toggleProvider = (providerId: string) => {\n onExpandedProviderChange(expandedProviderId === providerId ? null : providerId)\n }\n\n const openAddModal = (providerId: string) => {\n const firstCap = combinableCaps[0] ?? caps[0]\n setModal({\n mode: 'add',\n providerId,\n externalId: '',\n label: '',\n caps: firstCap ? [firstCap.value] : [],\n reasoningEffort: '',\n reasoningCustom: false,\n temperature: '',\n maxTokens: '',\n decisionTransport: '',\n extra: {},\n extraTouched: false,\n labelTouched: false,\n manual: false,\n })\n setDraftError(null)\n }\n\n const openEditModal = (model: ModelRegistryModel) => {\n setModal({\n mode: 'edit',\n providerId: model.providerId,\n externalId: model.externalId,\n label: model.label ?? '',\n caps: [...model.caps],\n labelTouched: true,\n reasoningEffort: model.reasoningEffort ?? '',\n reasoningCustom:\n model.reasoningEffort != null &&\n model.reasoningEffort !== '' &&\n !(reasoningEffortOptions ?? []).includes(model.reasoningEffort),\n temperature: model.temperature != null ? String(model.temperature) : '',\n maxTokens: model.maxTokens != null ? String(model.maxTokens) : '',\n decisionTransport: model.decisionTransport ?? '',\n extra: { ...(model.extra ?? {}) },\n extraTouched: false,\n model,\n manual: false,\n })\n setDraftError(null)\n }\n\n const patchExtraField = (key: string, value: string) => {\n setModal((current) =>\n current\n ? { ...current, extra: { ...current.extra, [key]: value }, extraTouched: true }\n : current,\n )\n }\n\n const selectRemote = (remoteId: string) => {\n const remote = (remoteModels ?? []).find((entry) => entry.id === remoteId)\n setModal((current) => {\n if (!current) return current\n const normalized = remote ? normalizeCaps([...remote.caps], standaloneSet) : current.caps\n // catalog caps pass through the ON-implications (a vision/tool\n // catalog entry carries its text base)\n const nextCaps = withImplications(normalized, capImplications ?? {})\n return {\n ...current,\n externalId: remoteId,\n caps: nextCaps,\n decisionTransport: nextCaps.includes('decision')\n ? (decisionTransport ?? current.decisionTransport ?? '')\n : '',\n label: current.labelTouched ? current.label : beautifyId(remoteId),\n }\n })\n }\n\n const toggleDraftCap = (value: string) => {\n setModal((current) => {\n if (!current) return current\n const isStandalone = standaloneSet.has(value)\n const raw = isStandalone\n ? // a standalone kind replaces everything (or clears when toggled off)\n current.caps.includes(value)\n ? current.caps.filter((entry) => entry !== value)\n : [value]\n : current.caps.includes(value)\n ? current.caps.filter((entry) => entry !== value)\n : [...current.caps.filter((entry) => !standaloneSet.has(entry)), value]\n const nextCaps = isStandalone\n ? raw\n : applyImplications(raw, capImplications ?? {}, value, !current.caps.includes(value))\n return {\n ...current,\n caps: nextCaps,\n // The decision capability stamps the app's shipping transport;\n // without it there is no transport to carry.\n decisionTransport: nextCaps.includes('decision')\n ? (decisionTransport ?? current.decisionTransport ?? '')\n : '',\n }\n })\n }\n\n const patchField = (field: keyof ModalState, value: string) => {\n setModal((current) => (current ? { ...current, [field]: value } : current))\n }\n\n const numberOr = (raw: string): number | null => {\n const trimmed = raw.trim()\n if (!trimmed) return null\n const parsed = Number(trimmed)\n return Number.isFinite(parsed) ? parsed : null\n }\n\n const submitModal = () => {\n if (!modal) return\n const externalId = modal.externalId.trim()\n if (!externalId) {\n setDraftError(externalIdRequiredLabel)\n return\n }\n const extra: Record<string, string> | undefined =\n modal.extraTouched || Object.values(modal.extra).some((value) => value.trim() !== '')\n ? { ...modal.extra }\n : undefined\n const isDecision = modal.caps.includes('decision')\n const payload: ModelRegistryDraft = {\n externalId,\n label: modal.label.trim() || undefined,\n caps: modal.caps,\n reasoningEffort: modal.reasoningEffort.trim(),\n temperature: numberOr(modal.temperature),\n maxTokens: numberOr(modal.maxTokens),\n ...(isDecision && modal.decisionTransport\n ? { decisionTransport: modal.decisionTransport }\n : {}),\n ...(extra !== undefined ? { extra } : {}),\n }\n if (modal.mode === 'add') {\n onAddModel(modal.providerId, payload)\n } else if (modal.model) {\n const patch: ModelRegistryPatch = { ...payload }\n if (isDecision) {\n patch.decisionTransport = modal.decisionTransport || decisionTransport\n } else {\n patch.decisionTransport = undefined\n }\n onUpdateModel(modal.model, patch)\n }\n resetModal()\n }\n\n const remoteForProvider = (provider: ModelRegistryProvider): ModelPickerProvider[] => {\n const items = remoteModels ?? []\n if (items.length === 0) return []\n return [\n {\n id: provider.id,\n name: provider.name,\n models: items.map((entry) => ({\n id: entry.id,\n name: entry.id,\n capabilities: entry.caps,\n })),\n },\n ]\n }\n\n const renderModal = () => {\n if (!modal) return null\n const provider = providers.find((entry) => entry.id === modal.providerId)\n const catalog = provider ? remoteForProvider(provider) : []\n const pendingCount = (remoteModels ?? []).filter(\n (remote) =>\n !models.some(\n (model) => model.providerId === modal.providerId && model.externalId === remote.id,\n ),\n ).length\n return (\n <Modal open onOpenChange={(open: boolean) => (!open ? resetModal() : undefined)}>\n <ModalContent className=\"max-h-[85vh] w-full max-w-lg overflow-y-auto\">\n <ModalHeader>\n <ModalTitle className=\"text-base\">\n {modal.mode === 'add' ? addTitle : `${editTitle} — ${modal.externalId}`}\n </ModalTitle>\n </ModalHeader>\n <div className=\"flex flex-col gap-4 p-4\">\n {provider ? (\n <div\n data-as=\"model-registry-provider-context\"\n className=\"flex min-w-0 items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-muted)]/50 px-3 py-2\"\n >\n <span className=\"sr-only\">{providerContextLabel}:</span>\n <span className=\"shrink-0 text-xs font-medium text-[var(--as-fg)]\">\n {provider.name}\n </span>\n {provider.baseUrl ? (\n <>\n <span aria-hidden className=\"text-[var(--as-border)]\">\n ·\n </span>\n <span className=\"truncate font-mono text-[10px] text-[var(--as-muted-fg)]\">\n {provider.baseUrl}\n </span>\n </>\n ) : null}\n </div>\n ) : null}\n {modal.mode === 'add' ? (\n remoteState === 'loading' ? (\n <p className=\"flex items-center justify-center gap-2 py-4 text-xs text-[var(--as-muted-fg)]\">\n <Spinner size=\"sm\" />\n {remoteLoadingLabel}\n </p>\n ) : remoteState === 'error' ? (\n <>\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"truncate text-xs text-[var(--as-danger)]\">{remoteError}</p>\n {onRetryRemote ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetryRemote}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n {modal.manual ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">\n {selectModelLabel}\n </span>\n <input\n type=\"text\"\n value={modal.externalId}\n onChange={(event) => patchField('externalId', event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 font-mono text-sm text-[var(--as-fg)]\"\n />\n </label>\n ) : (\n <button\n type=\"button\"\n data-as=\"model-registry-manual-toggle\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 self-end rounded-[var(--as-radius)] border border-[var(--as-border)] bg-transparent px-2.5 py-1 text-xs text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n onClick={() => setModal((c) => (c ? { ...c, manual: true } : c))}\n >\n <PenLine className=\"size-3.5\" aria-hidden />\n {manualIdToggleLabel}\n </button>\n )}\n </>\n ) : (\n <>\n {modal.manual ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">\n {selectModelLabel}\n </span>\n <input\n type=\"text\"\n value={modal.externalId}\n onChange={(event) => patchField('externalId', event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 font-mono text-sm text-[var(--as-fg)]\"\n />\n </label>\n ) : (\n <ModelPicker\n providers={catalog}\n value={modal.externalId}\n onChange={(modelId) => (modelId ? selectRemote(modelId) : undefined)}\n label={selectModelLabel}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyLabel={remoteEmptyLabel}\n />\n )}\n <button\n type=\"button\"\n data-as=\"model-registry-manual-toggle\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 self-end rounded-[var(--as-radius)] border border-[var(--as-border)] bg-transparent px-2.5 py-1 text-xs text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n onClick={() => setModal((c) => (c ? { ...c, manual: !c.manual } : c))}\n >\n {modal.manual ? (\n <>\n <Library className=\"size-3.5\" aria-hidden />\n {useCatalogLabel}\n </>\n ) : (\n <>\n <PenLine className=\"size-3.5\" aria-hidden />\n {manualIdToggleLabel}\n </>\n )}\n </button>\n </>\n )\n ) : (\n <p className=\"font-mono text-sm text-[var(--as-fg)]\">{modal.externalId}</p>\n )}\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{labelLabel}</span>\n <input\n type=\"text\"\n value={modal.label}\n onChange={(event) =>\n setModal((current) =>\n current\n ? { ...current, label: event.target.value, labelTouched: true }\n : current,\n )\n }\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)]\"\n />\n </label>\n <div className=\"space-y-1\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{capsLabel}</span>\n {standaloneDescriptors.length > 0 ? (\n <>\n <CapabilityChips\n caps={combinableCaps}\n selected={modal.caps}\n onToggle={toggleDraftCap}\n ariaLabel={capsLabel}\n />\n <p className=\"flex items-center gap-2 pt-1 text-[10px] font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]\">\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n {standaloneLabel}\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n </p>\n <CapabilityChips\n caps={standaloneDescriptors}\n selected={modal.caps}\n onToggle={toggleDraftCap}\n ariaLabel={standaloneLabel}\n />\n </>\n ) : (\n <CapabilityChips\n caps={caps}\n selected={modal.caps}\n onToggle={toggleDraftCap}\n ariaLabel={capsLabel}\n />\n )}\n {modal.caps.includes('decision') && decisionTransport ? (\n <p className=\"flex items-center gap-1.5 text-xs text-[var(--as-muted-fg)]\">\n <span>{decisionTransportLabel}:</span>\n <code className=\"rounded-[var(--as-radius-sm)] bg-[var(--as-muted)] px-1.5 py-0.5 font-mono text-[10px] font-semibold uppercase tracking-wide text-[var(--as-fg)]\">\n {decisionTransport}\n </code>\n </p>\n ) : null}\n {capsHint ? (\n <p className=\"text-xs text-[var(--as-muted-fg)]\">{capsHint}</p>\n ) : null}\n </div>\n {hasParametricCaps(modal.caps) && reasoningEffortOptions ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">\n {reasoningEffortLabel}\n </span>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {modal.reasoningCustom ? (\n <input\n type=\"text\"\n value={modal.reasoningEffort}\n placeholder={customOptionLabel}\n onChange={(event) => patchField('reasoningEffort', event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 font-mono text-sm text-[var(--as-fg)] sm:flex-1\"\n />\n ) : (\n <select\n value={modal.reasoningCustom ? CUSTOM : modal.reasoningEffort}\n onChange={(event) =>\n setModal((current) =>\n current\n ? {\n ...current,\n reasoningCustom: event.target.value === CUSTOM,\n reasoningEffort:\n event.target.value === CUSTOM\n ? current.reasoningEffort\n : event.target.value,\n }\n : current,\n )\n }\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)] sm:w-40\"\n >\n <option value=\"\">—</option>\n {reasoningEffortOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n <option value={CUSTOM}>{customOptionLabel}</option>\n </select>\n )}\n </div>\n </label>\n ) : null}\n {hasParametricCaps(modal.caps) ? (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <NumberField\n label={temperatureLabel}\n value={modal.temperature}\n onChange={(value) => patchField('temperature', value)}\n onClear={() => patchField('temperature', '')}\n step=\"0.1\"\n min=\"0\"\n max=\"2\"\n />\n <NumberField\n label={maxTokensLabel}\n value={modal.maxTokens}\n onChange={(value) => patchField('maxTokens', value)}\n onClear={() => patchField('maxTokens', '')}\n step=\"256\"\n min=\"1\"\n />\n </div>\n ) : null}\n {(extraFields ?? []).map((field) => {\n const value = modal.extra[field.key] ?? ''\n const common =\n 'w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)]'\n return (\n <label key={field.key} className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{field.label}</span>\n {field.multiline ? (\n <textarea\n rows={2}\n value={value}\n placeholder={field.placeholder}\n onChange={(event) => patchExtraField(field.key, event.target.value)}\n className={common}\n />\n ) : (\n <input\n type=\"text\"\n value={value}\n placeholder={field.placeholder}\n onChange={(event) => patchExtraField(field.key, event.target.value)}\n className={common}\n />\n )}\n </label>\n )\n })}\n {draftError ? (\n <p role=\"alert\" className=\"text-xs text-[var(--as-danger)]\">\n {draftError}\n </p>\n ) : null}\n </div>\n <ModalFooter>\n {modal.mode === 'add' && onAddAll ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={remoteState !== 'ready' || pendingCount === 0}\n onClick={() => {\n onAddAll(\n modal.providerId,\n (remoteModels ?? [])\n .filter(\n (remote) =>\n !models.some(\n (model) =>\n model.providerId === modal.providerId &&\n model.externalId === remote.id,\n ),\n )\n .map((remote) => ({\n externalId: remote.id,\n caps: remote.caps,\n reasoningEffort: '',\n temperature: null,\n maxTokens: null,\n })),\n )\n resetModal()\n }}\n >\n <Plus aria-hidden />\n {addAllLabel} ({pendingCount})\n </Button>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" onClick={resetModal}>\n {cancelLabel}\n </Button>\n <Button size=\"sm\" onClick={submitModal}>\n <Check aria-hidden />\n {modal.mode === 'add' ? addDraftLabel : saveLabel}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"model-registry\"\n className={cn('flex w-full flex-col gap-4', className)}\n >\n {providers.map((provider) => {\n const expanded = expandedProviderId === provider.id\n const providerModels = models.filter((model) => model.providerId === provider.id)\n return (\n <div\n key={provider.id}\n data-as=\"model-registry-provider\"\n className={cn(\n 'rounded-[var(--as-radius-lg)] border bg-[var(--as-surface)] transition-all',\n expanded\n ? 'border-[var(--as-primary)] shadow-[var(--as-shadow-1)]'\n : 'border-[var(--as-border)]',\n )}\n >\n <button\n type=\"button\"\n aria-expanded={expanded}\n onClick={() => toggleProvider(provider.id)}\n className=\"group flex w-full cursor-pointer items-center gap-4 p-4 text-left focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <span\n className={cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-[var(--as-radius)] transition-colors',\n expanded\n ? 'bg-[var(--as-primary)] text-[var(--as-primary-fg)]'\n : 'bg-[var(--as-muted)] text-[var(--as-muted-fg)] group-hover:bg-[var(--as-primary)]/10 group-hover:text-[var(--as-primary)]',\n )}\n >\n {expanded ? (\n <ChevronDown className=\"size-5\" aria-hidden />\n ) : (\n <ChevronRight className=\"size-5\" aria-hidden />\n )}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2 text-sm font-semibold text-[var(--as-fg)]\">\n {provider.name}\n {provider.type ? (\n <span className=\"rounded-full border border-[var(--as-border)] px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-[var(--as-muted-fg)]\">\n {provider.type}\n </span>\n ) : null}\n {providerModels.length ? (\n <span className=\"rounded-full bg-[var(--as-muted)] px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-widest text-[var(--as-muted-fg)]\">\n {providerModels.filter((model) => model.enabled).length}/\n {providerModels.length}\n </span>\n ) : null}\n </span>\n {provider.baseUrl ? (\n <span className=\"block truncate font-mono text-xs text-[var(--as-muted-fg)]\">\n {provider.baseUrl}\n </span>\n ) : null}\n </span>\n </button>\n {expanded ? (\n <div className=\"as-anim-fade flex flex-col gap-2 border-t border-[var(--as-border)] p-4\">\n {!provider.readOnly && providerModels.length === 0 ? (\n <p className=\"text-xs text-[var(--as-muted-fg)]\">\n {emptyProviderLabel}\n </p>\n ) : null}\n {providerModels.map((model) => {\n return (\n <div\n key={model.id}\n className={cn(\n 'flex min-w-0 items-center gap-2 rounded-[var(--as-radius-sm)] border border-[var(--as-border)] px-3 py-2 text-sm',\n model.missing && 'opacity-50',\n )}\n >\n {onToggleEnabled && !provider.readOnly ? (\n <input\n type=\"checkbox\"\n aria-label={`${enableLabel} — ${model.externalId}`}\n checked={model.enabled}\n onChange={(event) => onToggleEnabled(model, event.target.checked)}\n className=\"size-4 shrink-0 cursor-pointer accent-[var(--as-primary)]\"\n />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs text-[var(--as-fg)]\">\n {model.externalId}\n </span>\n {model.missing ? (\n <span className=\"text-xs text-[var(--as-warning)]\">\n {missingLabel}\n </span>\n ) : null}\n <CapabilityChips\n variant=\"badge\"\n caps={model.caps.map(descriptorFor)}\n selected={model.caps}\n />\n {!provider.readOnly ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${editLabel} ${model.externalId}`}\n onClick={() => openEditModal(model)}\n >\n <Pencil aria-hidden />\n {editLabel}\n </Button>\n ) : null}\n {!provider.readOnly ? (\n <button\n type=\"button\"\n aria-label={`${removeLabel} ${model.externalId}`}\n onClick={() => onDeleteModel(model)}\n className=\"cursor-pointer rounded-[var(--as-radius-sm)] p-1.5 text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </div>\n )\n })}\n {!provider.readOnly ? (\n <div className=\"pt-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-expanded={modal?.mode === 'add' && modal.providerId === provider.id}\n onClick={() => openAddModal(provider.id)}\n >\n <Plus aria-hidden />\n {addLabel}\n </Button>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n })}\n {providers.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <p className=\"text-sm text-[var(--as-muted-fg)]\">{providersEmptyLabel}</p>\n {emptyAction}\n </div>\n ) : null}\n {renderModal()}\n </div>\n )\n },\n)\n\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -466,7 +466,7 @@ interface FlowTelemetryStripProps {
|
|
|
466
466
|
declare const FlowTelemetryStrip: React.ForwardRefExoticComponent<FlowTelemetryStripProps & React.RefAttributes<HTMLDivElement>>;
|
|
467
467
|
|
|
468
468
|
declare const badgeVariants: (props?: ({
|
|
469
|
-
variant?: "default" | "warning" | "success" | "danger" | "secondary" | "outline" |
|
|
469
|
+
variant?: "ai" | "default" | "warning" | "success" | "danger" | "secondary" | "outline" | null | undefined;
|
|
470
470
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
471
471
|
interface BadgeProps extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {
|
|
472
472
|
}
|
|
@@ -1575,6 +1575,9 @@ interface ModelRegistryModel {
|
|
|
1575
1575
|
reasoningEffort?: string;
|
|
1576
1576
|
temperature?: number | null;
|
|
1577
1577
|
maxTokens?: number | null;
|
|
1578
|
+
/** The model's decision transport (e.g. `systemone`) — set when `caps`
|
|
1579
|
+
* carries the app's decision capability. */
|
|
1580
|
+
decisionTransport?: string;
|
|
1578
1581
|
/** App-defined extra fields (see `extraFields`), carried verbatim. */
|
|
1579
1582
|
extra?: Record<string, string>;
|
|
1580
1583
|
missing?: boolean;
|
|
@@ -1590,6 +1593,7 @@ interface ModelRegistryDraft {
|
|
|
1590
1593
|
reasoningEffort?: string;
|
|
1591
1594
|
temperature?: number | null;
|
|
1592
1595
|
maxTokens?: number | null;
|
|
1596
|
+
decisionTransport?: string;
|
|
1593
1597
|
extra?: Record<string, string>;
|
|
1594
1598
|
}
|
|
1595
1599
|
interface ModelRegistryPatch {
|
|
@@ -1598,6 +1602,7 @@ interface ModelRegistryPatch {
|
|
|
1598
1602
|
reasoningEffort?: string;
|
|
1599
1603
|
temperature?: number | null;
|
|
1600
1604
|
maxTokens?: number | null;
|
|
1605
|
+
decisionTransport?: string;
|
|
1601
1606
|
extra?: Record<string, string>;
|
|
1602
1607
|
}
|
|
1603
1608
|
interface ModelRegistryExtraField {
|
|
@@ -1635,12 +1640,29 @@ interface ModelRegistryProps {
|
|
|
1635
1640
|
editTitle?: string;
|
|
1636
1641
|
selectModelLabel?: string;
|
|
1637
1642
|
manualIdToggleLabel?: string;
|
|
1643
|
+
/** Shown on the manual↔catalog toggle when manual entry is active
|
|
1644
|
+
* (returning to the catalog picker). */
|
|
1645
|
+
useCatalogLabel?: string;
|
|
1646
|
+
/** Visually-hidden prefix for the provider context banner. */
|
|
1647
|
+
providerContextLabel?: string;
|
|
1638
1648
|
editLabel?: string;
|
|
1639
1649
|
removeLabel?: string;
|
|
1640
1650
|
missingLabel?: string;
|
|
1641
1651
|
capsLabel?: string;
|
|
1642
1652
|
/** Muted explainer under the capability chips (what they gate). */
|
|
1643
1653
|
capsHint?: string;
|
|
1654
|
+
/** Capability values that are standalone kinds (e.g. decision, stt, tts,
|
|
1655
|
+
* embeddings): selecting one makes the model exactly that kind — the
|
|
1656
|
+
* chat-family caps combine, standalone kinds replace everything (the
|
|
1657
|
+
* family's slot-separation law, D4, expressed in the form). */
|
|
1658
|
+
standaloneCaps?: string[];
|
|
1659
|
+
/** Label for the standalone-kinds cluster (`standaloneCaps`). */
|
|
1660
|
+
standaloneLabel?: string;
|
|
1661
|
+
/** Selection implications between combinable caps (e.g.
|
|
1662
|
+
* `{ vision: ['text'], tools: ['text'] }` — every vision/tool-capable
|
|
1663
|
+
* model is a text model too): selecting a key auto-enables its values,
|
|
1664
|
+
* and deselecting a value deselects everything that implies it. */
|
|
1665
|
+
capImplications?: Record<string, string[]>;
|
|
1644
1666
|
searchPlaceholder?: string;
|
|
1645
1667
|
searchLabel?: string;
|
|
1646
1668
|
emptyProviderLabel?: string;
|
|
@@ -1653,6 +1675,11 @@ interface ModelRegistryProps {
|
|
|
1653
1675
|
maxTokensLabel?: string;
|
|
1654
1676
|
labelLabel?: string;
|
|
1655
1677
|
reasoningEffortLabel?: string;
|
|
1678
|
+
/** The app's shipping decision transport (e.g. `systemone`): when set,
|
|
1679
|
+
* models with the decision capability render a read-only transport row
|
|
1680
|
+
* and carry the value on Draft/Patch. */
|
|
1681
|
+
decisionTransport?: string;
|
|
1682
|
+
decisionTransportLabel?: string;
|
|
1656
1683
|
saveLabel?: string;
|
|
1657
1684
|
cancelLabel?: string;
|
|
1658
1685
|
addDraftLabel?: string;
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ export { SettingsShell } from './chunk-YPDIA54W.js';
|
|
|
17
17
|
export { RangeBar } from './chunk-3UDWLHLD.js';
|
|
18
18
|
export { ScaleSlider, scaleColorForValue } from './chunk-NLHODVBI.js';
|
|
19
19
|
export { SearchInput } from './chunk-UUIMMMSJ.js';
|
|
20
|
-
export { ModelRegistry } from './chunk-
|
|
20
|
+
export { ModelRegistry } from './chunk-FPX3AI3Z.js';
|
|
21
21
|
export { ProfileSwitcher } from './chunk-6ANLDUGL.js';
|
|
22
22
|
export { CUSTOM_PRESET_KEY, ProviderForm } from './chunk-UMI4M4MF.js';
|
|
23
23
|
export { DEFAULT_SETUP_ERROR_COPY, ProviderSetupForm, SETUP_ERROR_CODES } from './chunk-6G7H6YP6.js';
|