@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.
- package/CHANGELOG.md +8 -0
- package/README.md +3 -2
- package/dist/about.d.ts +31 -1
- package/dist/about.js +1 -1
- package/dist/capability-chips.d.ts +19 -0
- package/dist/capability-chips.js +3 -0
- package/dist/capability-chips.js.map +1 -0
- package/dist/{chunk-3QGVWTBU.js → chunk-7RTSSBBR.js} +157 -4
- package/dist/chunk-7RTSSBBR.js.map +1 -0
- package/dist/chunk-HGJ5HINX.js +500 -0
- package/dist/chunk-HGJ5HINX.js.map +1 -0
- package/dist/{chunk-UWHUCQC6.js → chunk-LY2B3UJH.js} +10 -4
- package/dist/chunk-LY2B3UJH.js.map +1 -0
- package/dist/chunk-MLQAA2QV.js +68 -0
- package/dist/chunk-MLQAA2QV.js.map +1 -0
- package/dist/{chunk-OPTH3VUY.js → chunk-RI6CEWWF.js} +2 -2
- package/dist/chunk-RI6CEWWF.js.map +1 -0
- package/dist/chunk-XB7QWPHP.js +127 -0
- package/dist/chunk-XB7QWPHP.js.map +1 -0
- package/dist/connection-test-row.d.ts +4 -0
- package/dist/connection-test-row.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/model-picker.d.ts +2 -0
- package/dist/model-picker.js +1 -1
- package/dist/model-registry.d.ts +84 -0
- package/dist/model-registry.js +3 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/task-assignment-picker.d.ts +20 -5
- package/dist/task-assignment-picker.js +1 -1
- package/package.json +9 -1
- package/dist/chunk-3QGVWTBU.js.map +0 -1
- package/dist/chunk-OPTH3VUY.js.map +0 -1
- package/dist/chunk-TN35RR2R.js +0 -92
- package/dist/chunk-TN35RR2R.js.map +0 -1
- 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"]}
|
|
@@ -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":";;;;;;AAgDA,SAAS,eAAA,CACP,WACA,QAAA,EACuB;AACvB,EAAA,IAAI,CAAC,UAAU,OAAO,SAAA;AACtB,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KACf,KAAA,CAAM,UAAA,KAAe,aAAa,KAAA,CAAM,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA,IAAK,KAAA,CAAA;AAC9E,EAAA,OAAO,SAAA,CACJ,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,IAClB,GAAG,QAAA;AAAA,IACH,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,OAAO;AAAA,GACxC,CAAE,EACD,MAAA,CAAO,CAAC,aAAa,QAAA,CAAS,MAAA,CAAO,SAAS,CAAC,CAAA;AACpD;AAEO,IAAM,oBAAA,GAA6B,KAAA,CAAA,UAAA,CAGxC,SAASA,qBAAAA,CACT;AAAA,EACE,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA,GAAiB,gBAAA;AAAA,EACjB,UAAA;AAAA,EACA,eAAA,GAAkB,cAAA;AAAA,EAClB,UAAA,GAAa,kBAAA;AAAA,EACb,UAAA,GAAa,OAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAkB,KAAA,CAAA,WAAA;AAAA,IACtB,CAAC,OAAA,KAAuC;AACtC,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1D,QAAA,IAAI,KAAA,SAAc,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,QAAA,EAAU,SAAS,IAAA,EAAK;AAAA,MAChE;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,EAA0B,aAAA,KAA2B;AACtE,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,SAAA,EAAW,IAAA,CAAK,QAAQ,CAAA;AACxD,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,qKAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EACV,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA;AAAA,YACC,IAAA,CAAK,8BACJ,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,4CAAA,EACV,QAAA,EAAA,IAAA,CAAK,aACR,CAAA,GACE,IAAA;AAAA,YACH,UAAA,GAAa,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAAA,4BACjC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,qCACC,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,cAAW,GAAA;AAAA,cAAE,GAAA;AAAA,8BACd,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,gBAAA,QAAA,CAAS,QAAA;AAAA,gBAAS,KAAA;AAAA,gBAAI,QAAA,CAAS;AAAA,eAAA,EAClC;AAAA,aAAA,EACF,IAEA,eAAA,EAEJ;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,aAAA,IAAiB,iBAAA,mBAChB,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,OAAA;AAAA,gBACX,KAAA,EAAO,cAAA,GAAiB,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AAAA,gBACpC,UAAU,CAAC,OAAA,KAAY,iBAAA,CAAkB,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,gBACzD,QAAA;AAAA,gBACA,SAAA,EAAW,OAAA,CAAQ,cAAA,GAAiB,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,gBAC5C,UAAA;AAAA,gBACA,KAAA,EAAO,CAAA,EAAG,cAAc,CAAA,QAAA,EAAM,KAAK,KAAK,CAAA,CAAA;AAAA,gBACxC,SAAA,EAAU;AAAA;AAAA,aACZ,GACE,IAAA;AAAA,4BACJ,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,OAAA;AAAA,gBACX,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AAAA,gBACzB,UAAU,CAAC,OAAA,KAAY,QAAA,CAAS,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,gBAChD,QAAA;AAAA,gBACA,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,gBACjC,UAAA;AAAA,gBACA,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,QAAA,EAAM,KAAK,KAAK,CAAA,CAAA;AAAA,gBACpC,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,YACC,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,mBACZ,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAY,CAAA,EAAG,UAAU,CAAA,QAAA,EAAM,KAAK,KAAK,CAAA,CAAA;AAAA,gBACzC,QAAA;AAAA,gBACA,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,gBACrC,SAAA,EAAU,0SAAA;AAAA,gBAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,aACpC,GACE;AAAA,WAAA,EACN;AAAA;AAAA,OAAA;AAAA,MA5DK,IAAA,CAAK;AAAA,KA6DZ;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAQ,wBAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,MAEpD,QAAA,EAAA,QAAA,GACG,SAAS,GAAA,CAAI,CAAC,4BACZ,IAAA,CAAC,KAAA,EAAA,EAAqB,WAAU,qBAAA,EAC9B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yEAAA,EACV,QAAA,EAAA,OAAA,CAAQ,KAAA,EACX,CAAA;AAAA,QACC,QAAQ,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,SAClB,SAAA,CAAU,IAAA,EAAM,QAAQ,SAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC;AAAA;AAC9D,OAAA,EAAA,EANQ,OAAA,CAAQ,EAOlB,CACD,CAAA,GACD,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAC;AAAA;AAAA,GAClE;AAEJ,CAAC","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
|
/**
|
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-
|
|
13
|
+
export { TaskAssignmentPicker } from './chunk-XB7QWPHP.js';
|
|
10
14
|
export { SettingsShell } from './chunk-AHLNXCP2.js';
|
|
11
|
-
export {
|
|
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-
|
|
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-
|
|
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":"
|
|
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"]}
|
package/dist/model-picker.d.ts
CHANGED
|
@@ -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;
|
package/dist/model-picker.js
CHANGED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"model-registry.js"}
|