@neuronection/assistant-ui 0.9.0 → 0.10.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -2
  3. package/dist/about.d.ts +31 -1
  4. package/dist/about.js +1 -1
  5. package/dist/capability-chips.d.ts +19 -0
  6. package/dist/capability-chips.js +3 -0
  7. package/dist/capability-chips.js.map +1 -0
  8. package/dist/{chunk-3QGVWTBU.js → chunk-7RTSSBBR.js} +157 -4
  9. package/dist/chunk-7RTSSBBR.js.map +1 -0
  10. package/dist/chunk-HGJ5HINX.js +500 -0
  11. package/dist/chunk-HGJ5HINX.js.map +1 -0
  12. package/dist/{chunk-UWHUCQC6.js → chunk-LY2B3UJH.js} +10 -4
  13. package/dist/chunk-LY2B3UJH.js.map +1 -0
  14. package/dist/chunk-MLQAA2QV.js +68 -0
  15. package/dist/chunk-MLQAA2QV.js.map +1 -0
  16. package/dist/{chunk-OPTH3VUY.js → chunk-RI6CEWWF.js} +2 -2
  17. package/dist/chunk-RI6CEWWF.js.map +1 -0
  18. package/dist/chunk-XB7QWPHP.js +127 -0
  19. package/dist/chunk-XB7QWPHP.js.map +1 -0
  20. package/dist/connection-test-row.d.ts +4 -0
  21. package/dist/connection-test-row.js +1 -1
  22. package/dist/index.d.ts +4 -2
  23. package/dist/index.js +8 -6
  24. package/dist/index.js.map +1 -1
  25. package/dist/model-picker.d.ts +2 -0
  26. package/dist/model-picker.js +1 -1
  27. package/dist/model-registry.d.ts +84 -0
  28. package/dist/model-registry.js +3 -0
  29. package/dist/model-registry.js.map +1 -0
  30. package/dist/styles.css +1 -1
  31. package/dist/task-assignment-picker.d.ts +20 -5
  32. package/dist/task-assignment-picker.js +1 -1
  33. package/package.json +9 -1
  34. package/dist/chunk-3QGVWTBU.js.map +0 -1
  35. package/dist/chunk-OPTH3VUY.js.map +0 -1
  36. package/dist/chunk-TN35RR2R.js +0 -92
  37. package/dist/chunk-TN35RR2R.js.map +0 -1
  38. package/dist/chunk-UWHUCQC6.js.map +0 -1
@@ -0,0 +1,68 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ var CapabilityChips = React.forwardRef(
6
+ function CapabilityChips2({
7
+ caps,
8
+ selected,
9
+ onToggle,
10
+ variant = "toggle",
11
+ minSelected = 0,
12
+ disabled = false,
13
+ ariaLabel,
14
+ className
15
+ }, ref) {
16
+ const interactive = variant === "toggle" && Boolean(onToggle);
17
+ const locked = (value) => interactive && !disabled && selected.includes(value) && selected.length <= minSelected;
18
+ return /* @__PURE__ */ jsx(
19
+ "div",
20
+ {
21
+ ref,
22
+ "data-as": "capability-chips",
23
+ "data-variant": variant,
24
+ role: interactive ? "group" : void 0,
25
+ "aria-label": interactive ? ariaLabel : void 0,
26
+ className: cn("flex flex-wrap items-center gap-1.5", className),
27
+ children: caps.map((cap) => {
28
+ const on = selected.includes(cap.value);
29
+ if (!interactive) {
30
+ return /* @__PURE__ */ jsx(
31
+ "span",
32
+ {
33
+ "data-active": on || void 0,
34
+ className: cn(
35
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-[11px]",
36
+ on ? "border-[var(--as-primary)] bg-[var(--as-primary)]/10 text-[var(--as-primary)]" : "border-[var(--as-border)] text-[var(--as-muted-fg)]"
37
+ ),
38
+ children: cap.label
39
+ },
40
+ cap.value
41
+ );
42
+ }
43
+ return /* @__PURE__ */ jsx(
44
+ "button",
45
+ {
46
+ type: "button",
47
+ "aria-pressed": on,
48
+ disabled: disabled || locked(cap.value),
49
+ onClick: () => onToggle?.(cap.value),
50
+ className: cn(
51
+ "cursor-pointer rounded-full border px-2.5 py-0.5 text-[11px] transition-colors",
52
+ "focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
53
+ "disabled:pointer-events-none disabled:opacity-50",
54
+ on ? "border-[var(--as-primary)] bg-[var(--as-primary)]/10 text-[var(--as-primary)]" : "border-[var(--as-border)] text-[var(--as-muted-fg)] hover:bg-[var(--as-secondary)]"
55
+ ),
56
+ children: cap.label
57
+ },
58
+ cap.value
59
+ );
60
+ })
61
+ }
62
+ );
63
+ }
64
+ );
65
+
66
+ export { CapabilityChips };
67
+ //# sourceMappingURL=chunk-MLQAA2QV.js.map
68
+ //# sourceMappingURL=chunk-MLQAA2QV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/capability-chips/CapabilityChips.tsx"],"names":["CapabilityChips"],"mappings":";;;;AAmBO,IAAM,eAAA,GAAwB,KAAA,CAAA,UAAA;AAAA,EACnC,SAASA,gBAAAA,CACP;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,GAAU,QAAA;AAAA,IACV,WAAA,GAAc,CAAA;AAAA,IACd,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,WAAA,GAAc,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KACd,WAAA,IAAe,CAAC,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,MAAA,IAAU,WAAA;AAE7E,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAc,OAAA;AAAA,QACd,IAAA,EAAM,cAAc,OAAA,GAAU,MAAA;AAAA,QAC9B,YAAA,EAAY,cAAc,SAAA,GAAY,MAAA;AAAA,QACtC,SAAA,EAAW,EAAA,CAAG,qCAAA,EAAuC,SAAS,CAAA;AAAA,QAE7D,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACtC,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,uBACE,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,eAAa,EAAA,IAAM,MAAA;AAAA,gBACnB,SAAA,EAAW,EAAA;AAAA,kBACT,wEAAA;AAAA,kBACA,KACI,+EAAA,GACA;AAAA,iBACN;AAAA,gBAEC,QAAA,EAAA,GAAA,CAAI;AAAA,eAAA;AAAA,cATA,GAAA,CAAI;AAAA,aAUX;AAAA,UAEJ;AACA,UAAA,uBACE,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,cAAA,EAAc,EAAA;AAAA,cACd,QAAA,EAAU,QAAA,IAAY,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,cACtC,OAAA,EAAS,MAAM,QAAA,GAAW,GAAA,CAAI,KAAK,CAAA;AAAA,cACnC,SAAA,EAAW,EAAA;AAAA,gBACT,gFAAA;AAAA,gBACA,qGAAA;AAAA,gBACA,kDAAA;AAAA,gBACA,KACI,+EAAA,GACA;AAAA,eACN;AAAA,cAEC,QAAA,EAAA,GAAA,CAAI;AAAA,aAAA;AAAA,YAdA,GAAA,CAAI;AAAA,WAeX;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF","file":"chunk-MLQAA2QV.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface CapabilityDescriptor {\n value: string\n label: string\n}\n\nexport interface CapabilityChipsProps {\n caps: CapabilityDescriptor[]\n selected: string[]\n onToggle?: (value: string) => void\n variant?: 'toggle' | 'badge'\n minSelected?: number\n disabled?: boolean\n ariaLabel?: string\n className?: string\n}\n\nexport const CapabilityChips = React.forwardRef<HTMLDivElement, CapabilityChipsProps>(\n function CapabilityChips(\n {\n caps,\n selected,\n onToggle,\n variant = 'toggle',\n minSelected = 0,\n disabled = false,\n ariaLabel,\n className,\n },\n ref,\n ) {\n const interactive = variant === 'toggle' && Boolean(onToggle)\n const locked = (value: string) =>\n interactive && !disabled && selected.includes(value) && selected.length <= minSelected\n\n return (\n <div\n ref={ref}\n data-as=\"capability-chips\"\n data-variant={variant}\n role={interactive ? 'group' : undefined}\n aria-label={interactive ? ariaLabel : undefined}\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n {caps.map((cap) => {\n const on = selected.includes(cap.value)\n if (!interactive) {\n return (\n <span\n key={cap.value}\n data-active={on || undefined}\n className={cn(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-[11px]',\n on\n ? 'border-[var(--as-primary)] bg-[var(--as-primary)]/10 text-[var(--as-primary)]'\n : 'border-[var(--as-border)] text-[var(--as-muted-fg)]',\n )}\n >\n {cap.label}\n </span>\n )\n }\n return (\n <button\n key={cap.value}\n type=\"button\"\n aria-pressed={on}\n disabled={disabled || locked(cap.value)}\n onClick={() => onToggle?.(cap.value)}\n className={cn(\n 'cursor-pointer rounded-full border px-2.5 py-0.5 text-[11px] transition-colors',\n 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n 'disabled:pointer-events-none disabled:opacity-50',\n on\n ? 'border-[var(--as-primary)] bg-[var(--as-primary)]/10 text-[var(--as-primary)]'\n : 'border-[var(--as-border)] text-[var(--as-muted-fg)] hover:bg-[var(--as-secondary)]',\n )}\n >\n {cap.label}\n </button>\n )\n })}\n </div>\n )\n },\n)\n"]}
@@ -59,5 +59,5 @@ var ModelPicker = React.forwardRef(
59
59
  );
60
60
 
61
61
  export { ModelPicker };
62
- //# sourceMappingURL=chunk-OPTH3VUY.js.map
63
- //# sourceMappingURL=chunk-OPTH3VUY.js.map
62
+ //# sourceMappingURL=chunk-RI6CEWWF.js.map
63
+ //# sourceMappingURL=chunk-RI6CEWWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/model-picker/ModelPicker.tsx"],"names":["ModelPicker"],"mappings":";;;;;AA6CO,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EAC/B,SAASA,YAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,sBAAA;AAAA,IACd,iBAAA,GAAoB,qBAAA;AAAA,IACpB,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,OAAA,GAAkC,KAAA,CAAA,OAAA;AAAA,MACtC,MACE,SAAA,CAAU,OAAA;AAAA,QAAQ,CAAC,QAAA,KACjB,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9B,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAO,KAAA,CAAM;AAAA,SACf,CAAE;AAAA,OACJ;AAAA,MACF,CAAC,SAAS;AAAA,KACZ;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,EAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QACjC;AAAA;AAAA,KACF;AAAA,EAEJ;AACF","file":"chunk-RI6CEWWF.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport {\n Combobox,\n type ComboboxOption,\n} from '../combobox'\n\nexport interface ModelPickerModel {\n id: string\n name: string\n /** Short capability chip, e.g. `vision` or `tools`. */\n capability?: string\n /** Full capability set, matched by TaskAssignmentPicker `requires`. */\n capabilities?: string[]\n}\n\nexport interface ModelPickerProvider {\n id: string\n name: string\n models: ModelPickerModel[]\n}\n\nexport interface ModelPickerProps {\n providers: ModelPickerProvider[]\n value?: string\n onChange: (modelId: string) => void\n placeholder?: string\n searchPlaceholder?: string\n searchLabel?: string\n emptyLabel?: string\n loading?: boolean\n disabled?: boolean\n clearable?: boolean\n clearLabel?: string\n label?: string\n error?: string\n id?: string\n className?: string\n panelClassName?: string\n}\n\n/**\n * Grouped, searchable provider → model picker. Presentational: the model\n * list comes in via props, selection goes out via `onChange`.\n */\nexport const ModelPicker = React.forwardRef<HTMLButtonElement, ModelPickerProps>(\n function ModelPicker(\n {\n providers,\n value,\n onChange,\n placeholder = 'Select a model…',\n searchPlaceholder = 'Search models…',\n searchLabel,\n emptyLabel,\n loading = false,\n disabled = false,\n clearable = false,\n clearLabel,\n label,\n error,\n id,\n className,\n panelClassName,\n },\n ref,\n ) {\n const options: ComboboxOption[] = React.useMemo(\n () =>\n providers.flatMap((provider) =>\n provider.models.map((model) => ({\n value: model.id,\n label: model.name,\n group: provider.name,\n badge: model.capability,\n })),\n ),\n [providers],\n )\n\n return (\n <Combobox\n ref={ref}\n options={options}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyLabel={emptyLabel}\n loading={loading}\n disabled={disabled}\n clearable={clearable}\n clearLabel={clearLabel}\n label={label}\n error={error}\n id={id}\n className={cn('w-full', className)}\n panelClassName={panelClassName}\n />\n )\n },\n)\n"]}
@@ -0,0 +1,127 @@
1
+ import { ModelPicker } from './chunk-RI6CEWWF.js';
2
+ import { cn } from './chunk-BLJWR4ZV.js';
3
+ import * as React from 'react';
4
+ import { X } from 'lucide-react';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+
7
+ function filterProviders(providers, requires) {
8
+ if (!requires) return providers;
9
+ const matches = (model) => model.capability === requires || (model.capabilities?.includes(requires) ?? false);
10
+ return providers.map((provider) => ({
11
+ ...provider,
12
+ models: provider.models.filter(matches)
13
+ })).filter((provider) => provider.models.length > 0);
14
+ }
15
+ var TaskAssignmentPicker = React.forwardRef(function TaskAssignmentPicker2({
16
+ tasks,
17
+ sections,
18
+ providers,
19
+ value,
20
+ onAssign,
21
+ secondaryValue,
22
+ onAssignSecondary,
23
+ secondaryLabel = "Fallback model",
24
+ renderMeta,
25
+ unassignedLabel = "Not assigned",
26
+ clearLabel = "Clear assignment",
27
+ modelLabel = "Model",
28
+ disabled = false,
29
+ className
30
+ }, ref) {
31
+ const modelName = React.useCallback(
32
+ (modelId) => {
33
+ if (!modelId) return null;
34
+ for (const provider of providers) {
35
+ const model = provider.models.find((m) => m.id === modelId);
36
+ if (model) return { name: model.name, provider: provider.name };
37
+ }
38
+ return null;
39
+ },
40
+ [providers]
41
+ );
42
+ const renderRow = (task, showSecondary) => {
43
+ const assigned = modelName(value[task.id]);
44
+ const catalog = filterProviders(providers, task.requires);
45
+ return /* @__PURE__ */ jsxs(
46
+ "div",
47
+ {
48
+ className: "flex flex-col gap-2 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-3 sm:flex-row sm:items-center sm:justify-between",
49
+ children: [
50
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
51
+ /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-semibold text-[var(--as-fg)]", children: task.label }),
52
+ task.description ? /* @__PURE__ */ jsx("p", { className: "truncate text-xs text-[var(--as-muted-fg)]", children: task.description }) : null,
53
+ renderMeta ? renderMeta(task) : null,
54
+ /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-[var(--as-muted-fg)]", children: assigned ? /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ modelLabel,
56
+ ":",
57
+ " ",
58
+ /* @__PURE__ */ jsxs("span", { className: "font-medium text-[var(--as-fg)]", children: [
59
+ assigned.provider,
60
+ " / ",
61
+ assigned.name
62
+ ] })
63
+ ] }) : unassignedLabel })
64
+ ] }),
65
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [
66
+ showSecondary && onAssignSecondary ? /* @__PURE__ */ jsx(
67
+ ModelPicker,
68
+ {
69
+ providers: catalog,
70
+ value: secondaryValue?.[task.id] ?? "",
71
+ onChange: (modelId) => onAssignSecondary(task.id, modelId),
72
+ disabled,
73
+ clearable: Boolean(secondaryValue?.[task.id]),
74
+ clearLabel,
75
+ label: `${secondaryLabel} \u2014 ${task.label}`,
76
+ className: "w-48"
77
+ }
78
+ ) : null,
79
+ /* @__PURE__ */ jsx(
80
+ ModelPicker,
81
+ {
82
+ providers: catalog,
83
+ value: value[task.id] ?? "",
84
+ onChange: (modelId) => onAssign(task.id, modelId),
85
+ disabled,
86
+ clearable: Boolean(value[task.id]),
87
+ clearLabel,
88
+ label: `${modelLabel} \u2014 ${task.label}`,
89
+ className: "w-56"
90
+ }
91
+ ),
92
+ value[task.id] ? /* @__PURE__ */ jsx(
93
+ "button",
94
+ {
95
+ type: "button",
96
+ "aria-label": `${clearLabel} \u2014 ${task.label}`,
97
+ disabled,
98
+ onClick: () => onAssign(task.id, null),
99
+ 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)] disabled:pointer-events-none disabled:opacity-50",
100
+ children: /* @__PURE__ */ jsx(X, { className: "size-4", "aria-hidden": true })
101
+ }
102
+ ) : null
103
+ ] })
104
+ ]
105
+ },
106
+ task.id
107
+ );
108
+ };
109
+ return /* @__PURE__ */ jsx(
110
+ "div",
111
+ {
112
+ ref,
113
+ "data-as": "task-assignment-picker",
114
+ className: cn("flex w-full flex-col gap-3", className),
115
+ children: sections ? sections.map((section) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
116
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]", children: section.label }),
117
+ section.tasks.map(
118
+ (task) => renderRow(task, section.secondary || Boolean(task.secondary))
119
+ )
120
+ ] }, section.id)) : tasks.map((task) => renderRow(task, Boolean(task.secondary)))
121
+ }
122
+ );
123
+ });
124
+
125
+ export { TaskAssignmentPicker };
126
+ //# sourceMappingURL=chunk-XB7QWPHP.js.map
127
+ //# sourceMappingURL=chunk-XB7QWPHP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/task-assignment-picker/TaskAssignmentPicker.tsx"],"names":["TaskAssignmentPicker"],"mappings":"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","file":"chunk-XB7QWPHP.js","sourcesContent":["import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport {\n ModelPicker,\n type ModelPickerModel,\n type ModelPickerProvider,\n} from '../model-picker/ModelPicker'\n\nexport interface TaskAssignmentTask {\n id: string\n label: string\n description?: string\n /** When set, the row's picker offers only models matching this capability. */\n requires?: string\n /** Render the fallback-model picker for this row (needs `onAssignSecondary`). */\n secondary?: boolean\n}\n\nexport interface TaskAssignmentSection {\n id: string\n label: string\n /** Show the fallback picker on every task in the section (task-level wins). */\n secondary?: boolean\n tasks: TaskAssignmentTask[]\n}\n\nexport interface TaskAssignmentPickerProps {\n tasks: TaskAssignmentTask[]\n /** Grouped rendering; when set, `tasks` is ignored. */\n sections?: TaskAssignmentSection[]\n providers: ModelPickerProvider[]\n /** Current mapping: taskId → modelId (null/undefined = unassigned). */\n value: Record<string, string | null>\n onAssign: (taskId: string, modelId: string | null) => void\n /** Enables fallback-model rows for tasks flagged (directly or via section). */\n secondaryValue?: Record<string, string | null>\n onAssignSecondary?: (taskId: string, modelId: string | null) => void\n secondaryLabel?: string\n /** App-rendered per-row context (inherit notes, spend, badges). */\n renderMeta?: (task: TaskAssignmentTask) => React.ReactNode\n unassignedLabel?: string\n clearLabel?: string\n modelLabel?: string\n disabled?: boolean\n className?: string\n}\n\nfunction filterProviders(\n providers: ModelPickerProvider[],\n requires: string | undefined,\n): ModelPickerProvider[] {\n if (!requires) return providers\n const matches = (model: ModelPickerModel) =>\n model.capability === requires || (model.capabilities?.includes(requires) ?? false)\n return providers\n .map((provider) => ({\n ...provider,\n models: provider.models.filter(matches),\n }))\n .filter((provider) => provider.models.length > 0)\n}\n\nexport const TaskAssignmentPicker = React.forwardRef<\n HTMLDivElement,\n TaskAssignmentPickerProps\n>(function TaskAssignmentPicker(\n {\n tasks,\n sections,\n providers,\n value,\n onAssign,\n secondaryValue,\n onAssignSecondary,\n secondaryLabel = 'Fallback model',\n renderMeta,\n unassignedLabel = 'Not assigned',\n clearLabel = 'Clear assignment',\n modelLabel = 'Model',\n disabled = false,\n className,\n },\n ref,\n) {\n const modelName = React.useCallback(\n (modelId: string | null | undefined) => {\n if (!modelId) return null\n for (const provider of providers) {\n const model = provider.models.find((m) => m.id === modelId)\n if (model) return { name: model.name, provider: provider.name }\n }\n return null\n },\n [providers],\n )\n\n const renderRow = (task: TaskAssignmentTask, showSecondary: boolean) => {\n const assigned = modelName(value[task.id])\n const catalog = filterProviders(providers, task.requires)\n return (\n <div\n key={task.id}\n className=\"flex flex-col gap-2 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-3 sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-[var(--as-fg)]\">\n {task.label}\n </p>\n {task.description ? (\n <p className=\"truncate text-xs text-[var(--as-muted-fg)]\">\n {task.description}\n </p>\n ) : null}\n {renderMeta ? renderMeta(task) : null}\n <p className=\"mt-0.5 text-xs text-[var(--as-muted-fg)]\">\n {assigned ? (\n <>\n {modelLabel}:{' '}\n <span className=\"font-medium text-[var(--as-fg)]\">\n {assigned.provider} / {assigned.name}\n </span>\n </>\n ) : (\n unassignedLabel\n )}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {showSecondary && onAssignSecondary ? (\n <ModelPicker\n providers={catalog}\n value={secondaryValue?.[task.id] ?? ''}\n onChange={(modelId) => onAssignSecondary(task.id, modelId)}\n disabled={disabled}\n clearable={Boolean(secondaryValue?.[task.id])}\n clearLabel={clearLabel}\n label={`${secondaryLabel} — ${task.label}`}\n className=\"w-48\"\n />\n ) : null}\n <ModelPicker\n providers={catalog}\n value={value[task.id] ?? ''}\n onChange={(modelId) => onAssign(task.id, modelId)}\n disabled={disabled}\n clearable={Boolean(value[task.id])}\n clearLabel={clearLabel}\n label={`${modelLabel} — ${task.label}`}\n className=\"w-56\"\n />\n {value[task.id] ? (\n <button\n type=\"button\"\n aria-label={`${clearLabel} — ${task.label}`}\n disabled={disabled}\n onClick={() => onAssign(task.id, null)}\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)] disabled:pointer-events-none disabled:opacity-50\"\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"task-assignment-picker\"\n className={cn('flex w-full flex-col gap-3', className)}\n >\n {sections\n ? sections.map((section) => (\n <div key={section.id} className=\"flex flex-col gap-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]\">\n {section.label}\n </p>\n {section.tasks.map((task) =>\n renderRow(task, section.secondary || Boolean(task.secondary)),\n )}\n </div>\n ))\n : tasks.map((task) => renderRow(task, Boolean(task.secondary)))}\n </div>\n )\n})\n"]}
@@ -12,6 +12,10 @@ interface ConnectionTestRowProps {
12
12
  errorMessage?: string | null;
13
13
  onTest?: () => void;
14
14
  disabled?: boolean;
15
+ /** `row` = standalone bordered row; `inline` = bare, for embedding in app cards. */
16
+ variant?: 'row' | 'inline';
17
+ /** Extra app-side context rendered after the status (e.g. model count). */
18
+ meta?: React.ReactNode;
15
19
  className?: string;
16
20
  }
17
21
  /**
@@ -1,3 +1,3 @@
1
- export { ConnectionTestRow } from './chunk-UWHUCQC6.js';
1
+ export { ConnectionTestRow } from './chunk-LY2B3UJH.js';
2
2
  //# sourceMappingURL=connection-test-row.js.map
3
3
  //# sourceMappingURL=connection-test-row.js.map
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ import * as React from 'react';
8
8
  export { ThemeScope, ThemeScopeProps } from './theme-scope.js';
9
9
  export { L as LogoProps, a as LogoTheme, u as useLogoId } from './Logo-D8DEBUoL.js';
10
10
  export { CareerMark, HealthMark, NeuronectionMark, NeuronectionWordmark, NeuronectionWordmarkProps, StudyMark } from './logo.js';
11
- export { AboutCard, AboutCardProps, AboutCreator, AboutFooterLine, AboutFooterLineProps, AboutLicense, AboutLinkItem, AboutLinkList, AboutLinkListProps, AboutNote, AboutNoteContent, AboutNoteProps, AboutPanel, AboutPanelProps, FamilyApp, FamilyBadge, FamilyBadgeProps, FamilyCreator, FamilyMember, TechChips, TechChipsProps } from './about.js';
11
+ export { AboutCard, AboutCardProps, AboutCreator, AboutFooterLine, AboutFooterLineProps, AboutLicense, AboutLinkItem, AboutLinkList, AboutLinkListProps, AboutNote, AboutNoteContent, AboutNoteProps, AboutPanel, AboutPanelProps, AboutSponsorContent, FamilyApp, FamilyBadge, FamilyBadgeProps, FamilyCreator, FamilyMember, SponsorCard, SponsorCardProps, SponsorChannel, TechChips, TechChipsProps } from './about.js';
12
12
  export { AiAction, AiActionsDropdown, AiActionsDropdownProps } from './ai-actions-dropdown.js';
13
13
  export { AiButton, AiButtonProps } from './ai-button.js';
14
14
  export { AiMagicFill, AiMagicFillProps } from './ai-magic-fill.js';
@@ -43,9 +43,11 @@ export { RangeBar, RangeBarProps } from './range-bar.js';
43
43
  export { ScaleSlider, ScaleSliderProps, scaleColorForValue } from './scale-slider.js';
44
44
  export { SearchInput, SearchInputProps } from './search-input.js';
45
45
  export { ModelPicker, ModelPickerModel, ModelPickerProps, ModelPickerProvider } from './model-picker.js';
46
+ export { CapabilityChips, CapabilityChipsProps, CapabilityDescriptor } from './capability-chips.js';
47
+ export { ModelRegistry, ModelRegistryDraft, ModelRegistryModel, ModelRegistryPatch, ModelRegistryProps, ModelRegistryProvider, ModelRegistryRemoteModel, ModelRegistryRemoteState } from './model-registry.js';
46
48
  export { SelectionBar, SelectionBarProps } from './selection-bar.js';
47
49
  export { Spinner, SpinnerProps } from './spinner.js';
48
- export { TaskAssignmentPicker, TaskAssignmentPickerProps, TaskAssignmentTask } from './task-assignment-picker.js';
50
+ export { TaskAssignmentPicker, TaskAssignmentPickerProps, TaskAssignmentSection, TaskAssignmentTask } from './task-assignment-picker.js';
49
51
  export { Table, TableProps } from './table.js';
50
52
  export { InfoTooltip, InfoTooltipProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip.js';
51
53
  export { TimeList, TimeListProps } from './time-list.js';
package/dist/index.js CHANGED
@@ -1,16 +1,18 @@
1
+ export { ThemeScope } from './chunk-TGU3PKNM.js';
1
2
  export { TimeList } from './chunk-GVOC3ARM.js';
3
+ export { TimePicker, TimePickerContent } from './chunk-CR42EAF4.js';
2
4
  export { InfoTooltip, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './chunk-34NO2UOB.js';
3
5
  export { UndoNotice } from './chunk-OUHUVACM.js';
4
6
  export { ViewToggle } from './chunk-MXOBOS4Y.js';
5
7
  export { Stepper, Wizard } from './chunk-YMCMUAIF.js';
8
+ export { ModelRegistry } from './chunk-HGJ5HINX.js';
6
9
  export { SearchInput } from './chunk-H5U4KNXF.js';
10
+ export { CapabilityChips } from './chunk-MLQAA2QV.js';
7
11
  export { SelectionBar } from './chunk-HSUCCANX.js';
8
12
  export { Table } from './chunk-5LRRVD27.js';
9
- export { TaskAssignmentPicker } from './chunk-TN35RR2R.js';
13
+ export { TaskAssignmentPicker } from './chunk-XB7QWPHP.js';
10
14
  export { SettingsShell } from './chunk-AHLNXCP2.js';
11
- export { ThemeScope } from './chunk-TGU3PKNM.js';
12
- export { TimePicker, TimePickerContent } from './chunk-CR42EAF4.js';
13
- export { ModelPicker } from './chunk-OPTH3VUY.js';
15
+ export { ModelPicker } from './chunk-RI6CEWWF.js';
14
16
  export { PanelModal } from './chunk-G6557MEN.js';
15
17
  export { Portal } from './chunk-7YLR4AGA.js';
16
18
  export { ProviderForm } from './chunk-RJSN4TVT.js';
@@ -30,14 +32,14 @@ export { ErrorBanner } from './chunk-BJOY3XL7.js';
30
32
  export { ExpandableSearch } from './chunk-4SW3ESVI.js';
31
33
  export { FileQueue } from './chunk-IQKP2BWE.js';
32
34
  export { FileCard, formatBytes } from './chunk-J4OELYDR.js';
33
- export { ConnectionTestRow } from './chunk-UWHUCQC6.js';
35
+ export { ConnectionTestRow } from './chunk-LY2B3UJH.js';
34
36
  export { CheckIndicator } from './chunk-XE4TFW63.js';
35
37
  export { ChipInput } from './chunk-TPLQL62V.js';
36
38
  export { Combobox, ComboboxMulti } from './chunk-3RDFWXX6.js';
37
39
  export { ConfirmationModal } from './chunk-2YQSA5AE.js';
38
40
  export { rawTokens, semanticTokens } from './chunk-GDGKARRB.js';
39
41
  export { AiActionsDropdown } from './chunk-I37SYHM7.js';
40
- export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, TechChips } from './chunk-3QGVWTBU.js';
42
+ export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, SponsorCard, TechChips } from './chunk-7RTSSBBR.js';
41
43
  export { CareerMark, HealthMark, NeuronectionMark, NeuronectionWordmark, StudyMark, useLogoId } from './chunk-Q2JMEAKN.js';
42
44
  export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-RYE5YCFF.js';
43
45
  export { ChipList } from './chunk-QUPGIPTT.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/upload-dropzone/UploadDropzone.tsx"],"names":["UploadDropzone"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport { FolderUp, Loader2, Upload } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface UploadDropzoneProps {\n onFiles: (files: File[]) => void\n uploading?: boolean\n variant?: 'block' | 'row'\n label?: string\n hint?: string\n browseLabel?: string\n folderLabel?: string\n accept?: string\n multiple?: boolean\n allowFolders?: boolean\n disabled?: boolean\n className?: string\n}\n\n/**\n * Presentational dropzone: drag events and file-picker results go out via\n * `onFiles` — uploading, storage and progress stay app-side. Pass\n * `uploading` to render a busy state and suppress input.\n */\nexport const UploadDropzone = React.forwardRef<HTMLDivElement, UploadDropzoneProps>(\n function UploadDropzone(\n {\n onFiles,\n uploading = false,\n variant = 'block',\n label = 'Drop files here or click to browse',\n hint,\n browseLabel = 'Choose files',\n folderLabel = 'Choose folder',\n accept,\n multiple = true,\n allowFolders = false,\n disabled = false,\n className,\n },\n ref,\n ) {\n const [dragging, setDragging] = React.useState(false)\n const fileInput = React.useRef<HTMLInputElement>(null)\n const folderInput = React.useRef<HTMLInputElement>(null)\n\n const active = !disabled && !uploading\n\n const emit = (list: FileList | null) => {\n if (!active || !list || list.length === 0) return\n onFiles(Array.from(list))\n }\n\n const input = allowFolders ? (\n <>\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n <input\n ref={folderInput}\n type=\"file\"\n multiple\n className=\"hidden\"\n // @ts-expect-error non-standard but universally supported directory picker\n webkitdirectory=\"\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n </>\n ) : (\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n )\n\n return (\n <>\n {input}\n <div\n ref={ref}\n data-as=\"upload-dropzone\"\n data-variant={variant}\n data-dragging={dragging || undefined}\n role=\"button\"\n tabIndex={active ? 0 : -1}\n aria-label={label}\n aria-disabled={disabled || uploading || undefined}\n onClick={() => active && fileInput.current?.click()}\n onKeyDown={(event) => {\n if (active && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n onDragOver={(event) => {\n event.preventDefault()\n if (active) setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragging(false)\n emit(event.dataTransfer.files)\n }}\n className={cn(\n 'flex cursor-pointer items-center justify-center gap-3 border border-dashed border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] transition-colors',\n 'hover:border-[var(--as-primary)] hover:text-[var(--as-fg)]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]',\n variant === 'block' ? 'rounded-[var(--as-radius-lg)] p-8' : 'rounded-[var(--as-radius)] px-4 py-3',\n dragging && 'border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]',\n uploading && 'cursor-progress opacity-70',\n disabled && 'pointer-events-none opacity-50',\n className,\n )}\n >\n {uploading ? (\n <Loader2 className=\"size-5 shrink-0 animate-spin\" aria-hidden />\n ) : allowFolders ? (\n <FolderUp className=\"size-5 shrink-0\" aria-hidden />\n ) : (\n <Upload className=\"size-5 shrink-0\" aria-hidden />\n )}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium\" role={uploading ? 'status' : undefined}>\n {uploading ? `${browseLabel}…` : dragging ? folderLabel : label}\n </span>\n {hint ? <span className=\"truncate text-xs\">{hint}</span> : null}\n </span>\n </div>\n </>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":["../src/components/upload-dropzone/UploadDropzone.tsx"],"names":["UploadDropzone"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport { FolderUp, Loader2, Upload } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface UploadDropzoneProps {\n onFiles: (files: File[]) => void\n uploading?: boolean\n variant?: 'block' | 'row'\n label?: string\n hint?: string\n browseLabel?: string\n folderLabel?: string\n accept?: string\n multiple?: boolean\n allowFolders?: boolean\n disabled?: boolean\n className?: string\n}\n\n/**\n * Presentational dropzone: drag events and file-picker results go out via\n * `onFiles` — uploading, storage and progress stay app-side. Pass\n * `uploading` to render a busy state and suppress input.\n */\nexport const UploadDropzone = React.forwardRef<HTMLDivElement, UploadDropzoneProps>(\n function UploadDropzone(\n {\n onFiles,\n uploading = false,\n variant = 'block',\n label = 'Drop files here or click to browse',\n hint,\n browseLabel = 'Choose files',\n folderLabel = 'Choose folder',\n accept,\n multiple = true,\n allowFolders = false,\n disabled = false,\n className,\n },\n ref,\n ) {\n const [dragging, setDragging] = React.useState(false)\n const fileInput = React.useRef<HTMLInputElement>(null)\n const folderInput = React.useRef<HTMLInputElement>(null)\n\n const active = !disabled && !uploading\n\n const emit = (list: FileList | null) => {\n if (!active || !list || list.length === 0) return\n onFiles(Array.from(list))\n }\n\n const input = allowFolders ? (\n <>\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n <input\n ref={folderInput}\n type=\"file\"\n multiple\n className=\"hidden\"\n // @ts-expect-error non-standard but universally supported directory picker\n webkitdirectory=\"\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n </>\n ) : (\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n )\n\n return (\n <>\n {input}\n <div\n ref={ref}\n data-as=\"upload-dropzone\"\n data-variant={variant}\n data-dragging={dragging || undefined}\n role=\"button\"\n tabIndex={active ? 0 : -1}\n aria-label={label}\n aria-disabled={disabled || uploading || undefined}\n onClick={() => active && fileInput.current?.click()}\n onKeyDown={(event) => {\n if (active && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n onDragOver={(event) => {\n event.preventDefault()\n if (active) setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragging(false)\n emit(event.dataTransfer.files)\n }}\n className={cn(\n 'flex cursor-pointer items-center justify-center gap-3 border border-dashed border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] transition-colors',\n 'hover:border-[var(--as-primary)] hover:text-[var(--as-fg)]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]',\n variant === 'block' ? 'rounded-[var(--as-radius-lg)] p-8' : 'rounded-[var(--as-radius)] px-4 py-3',\n dragging && 'border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]',\n uploading && 'cursor-progress opacity-70',\n disabled && 'pointer-events-none opacity-50',\n className,\n )}\n >\n {uploading ? (\n <Loader2 className=\"size-5 shrink-0 animate-spin\" aria-hidden />\n ) : allowFolders ? (\n <FolderUp className=\"size-5 shrink-0\" aria-hidden />\n ) : (\n <Upload className=\"size-5 shrink-0\" aria-hidden />\n )}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium\" role={uploading ? 'status' : undefined}>\n {uploading ? `${browseLabel}…` : dragging ? folderLabel : label}\n </span>\n {hint ? <span className=\"truncate text-xs\">{hint}</span> : null}\n </span>\n </div>\n </>\n )\n },\n)\n"]}
@@ -5,6 +5,8 @@ interface ModelPickerModel {
5
5
  name: string;
6
6
  /** Short capability chip, e.g. `vision` or `tools`. */
7
7
  capability?: string;
8
+ /** Full capability set, matched by TaskAssignmentPicker `requires`. */
9
+ capabilities?: string[];
8
10
  }
9
11
  interface ModelPickerProvider {
10
12
  id: string;
@@ -1,3 +1,3 @@
1
- export { ModelPicker } from './chunk-OPTH3VUY.js';
1
+ export { ModelPicker } from './chunk-RI6CEWWF.js';
2
2
  //# sourceMappingURL=model-picker.js.map
3
3
  //# sourceMappingURL=model-picker.js.map
@@ -0,0 +1,84 @@
1
+ import * as React from 'react';
2
+ import { CapabilityDescriptor } from './capability-chips.js';
3
+
4
+ interface ModelRegistryProvider {
5
+ id: string;
6
+ name: string;
7
+ type?: string;
8
+ baseUrl?: string;
9
+ }
10
+ interface ModelRegistryModel {
11
+ id: string;
12
+ providerId: string;
13
+ externalId: string;
14
+ label?: string;
15
+ caps: string[];
16
+ enabled: boolean;
17
+ reasoningEffort?: string;
18
+ missing?: boolean;
19
+ }
20
+ interface ModelRegistryRemoteModel {
21
+ id: string;
22
+ caps: string[];
23
+ }
24
+ interface ModelRegistryDraft {
25
+ externalId: string;
26
+ label?: string;
27
+ caps: string[];
28
+ reasoningEffort?: string;
29
+ }
30
+ interface ModelRegistryPatch {
31
+ label?: string;
32
+ caps?: string[];
33
+ enabled?: boolean;
34
+ reasoningEffort?: string;
35
+ }
36
+ type ModelRegistryRemoteState = 'loading' | 'error' | 'ready';
37
+ interface ModelRegistryProps {
38
+ providers: ModelRegistryProvider[];
39
+ models: ModelRegistryModel[];
40
+ caps: CapabilityDescriptor[];
41
+ expandedProviderId?: string | null;
42
+ onExpandedProviderChange: (providerId: string | null) => void;
43
+ remoteModels?: ModelRegistryRemoteModel[];
44
+ remoteState?: ModelRegistryRemoteState;
45
+ remoteError?: string | null;
46
+ onRetryRemote?: () => void;
47
+ onAddModel: (providerId: string, draft: ModelRegistryDraft) => void;
48
+ onAddAll?: (providerId: string, drafts: ModelRegistryDraft[]) => void;
49
+ onUpdateModel: (model: ModelRegistryModel, patch: ModelRegistryPatch) => void;
50
+ onDeleteModel: (model: ModelRegistryModel) => void;
51
+ rank?: (items: ModelRegistryRemoteModel[], query: string) => ModelRegistryRemoteModel[];
52
+ reasoningEffortOptions?: string[];
53
+ addLabel?: string;
54
+ addedLabel?: string;
55
+ addAllLabel?: string;
56
+ configureLabel?: string;
57
+ editLabel?: string;
58
+ removeLabel?: string;
59
+ enabledLabel?: string;
60
+ missingLabel?: string;
61
+ capsLabel?: string;
62
+ searchPlaceholder?: string;
63
+ searchLabel?: string;
64
+ capFilterLabel?: string;
65
+ unclassifiedLabel?: string;
66
+ emptyProviderLabel?: string;
67
+ remoteEmptyLabel?: string;
68
+ remoteLoadingLabel?: string;
69
+ retryLabel?: string;
70
+ manualAddLabel?: string;
71
+ externalIdLabel?: string;
72
+ labelLabel?: string;
73
+ reasoningEffortLabel?: string;
74
+ reasoningEffortPlaceholder?: string;
75
+ saveLabel?: string;
76
+ cancelLabel?: string;
77
+ addDraftLabel?: string;
78
+ providersEmptyLabel?: string;
79
+ emptyAction?: React.ReactNode;
80
+ className?: string;
81
+ }
82
+ declare const ModelRegistry: React.ForwardRefExoticComponent<ModelRegistryProps & React.RefAttributes<HTMLDivElement>>;
83
+
84
+ export { ModelRegistry, type ModelRegistryDraft, type ModelRegistryModel, type ModelRegistryPatch, type ModelRegistryProps, type ModelRegistryProvider, type ModelRegistryRemoteModel, type ModelRegistryRemoteState };
@@ -0,0 +1,3 @@
1
+ export { ModelRegistry } from './chunk-HGJ5HINX.js';
2
+ //# sourceMappingURL=model-registry.js.map
3
+ //# sourceMappingURL=model-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"model-registry.js"}