@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 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: caps[0] ? [caps[0].value] : [],
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) => 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: remote ? [...remote.caps] : current.caps,
237
+ caps: nextCaps,
238
+ decisionTransport: nextCaps.includes("decision") ? decisionTransport ?? current.decisionTransport ?? "" : "",
191
239
  label: current.labelTouched ? current.label : beautifyId(remoteId)
192
- } : current
193
- );
240
+ };
241
+ });
194
242
  };
195
243
  const toggleDraftCap = (value) => {
196
- setModal(
197
- (current) => 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: current.caps.includes(value) ? current.caps.filter((entry) => entry !== value) : [...current.caps, value]
200
- } : current
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
- onUpdateModel(modal.model, payload);
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__ */ jsx(
366
+ ] }) : /* @__PURE__ */ jsxs(
283
367
  "button",
284
368
  {
285
369
  type: "button",
286
- className: "cursor-pointer self-start text-xs text-[var(--as-muted-fg)] underline-offset-2 hover:text-[var(--as-fg)] hover:underline",
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: manualIdToggleLabel
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
- className: "cursor-pointer self-start text-xs text-[var(--as-muted-fg)] underline-offset-2 hover:text-[var(--as-fg)] hover:underline",
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: manualIdToggleLabel
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__ */ jsx(
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-YHMVPFEN.js.map
620
- //# sourceMappingURL=chunk-YHMVPFEN.js.map
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":"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","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" | "ai" | null | undefined;
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-YHMVPFEN.js';
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';