@tradalab/lyra 3.4.0 → 3.5.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/dist/blocks/index.d.ts +17 -3
- package/dist/blocks/index.js +6 -24
- package/dist/blocks/index.js.map +1 -1
- package/package.json +1 -1
package/dist/blocks/index.d.ts
CHANGED
|
@@ -33,10 +33,17 @@ type PanelItemType = {
|
|
|
33
33
|
hasError?: boolean;
|
|
34
34
|
content: ReactNode;
|
|
35
35
|
};
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
/**
|
|
37
|
+
* No URL binding, on purpose.
|
|
38
|
+
*
|
|
39
|
+
* An `enable_url` prop used to mirror the open item into a query param, and that made this file
|
|
40
|
+
* import `next/navigation` at module scope. Since the `blocks` barrel re-exports everything, one
|
|
41
|
+
* import here made the WHOLE barrel require Next, so anything that is not itself a Next app could
|
|
42
|
+
* not import any block at all - which is how nekit broke. The prop had no caller in any of the 26
|
|
43
|
+
* consumers, and `name` existed only to build its query key, so both came out with the router.
|
|
44
|
+
*/
|
|
45
|
+
declare function Panel({ items }: {
|
|
38
46
|
items: PanelItemType[];
|
|
39
|
-
enable_url?: boolean;
|
|
40
47
|
}): React.JSX.Element | null;
|
|
41
48
|
interface PanelItemProps {
|
|
42
49
|
children: ReactNode;
|
|
@@ -373,6 +380,13 @@ interface LlmSettingsApi {
|
|
|
373
380
|
onPull?(cb: (p: LlmPullProgress) => void): () => void;
|
|
374
381
|
/** Runtimes already running on this machine, offered as providers to add. */
|
|
375
382
|
detect?(): Promise<LlmFound[]>;
|
|
383
|
+
/**
|
|
384
|
+
* An extra line under one slot, for a fact only the app knows - loom warns that N chunks were
|
|
385
|
+
* indexed by a different embedding model than the one now bound. Without a hook for it, adopting
|
|
386
|
+
* this block means silently dropping such a warning, which is what kept loom on its own 687-line
|
|
387
|
+
* copy of this screen.
|
|
388
|
+
*/
|
|
389
|
+
slotNote?(slot: string): React.ReactNode;
|
|
376
390
|
}
|
|
377
391
|
interface LlmSettingsLabels {
|
|
378
392
|
slots?: string;
|
package/dist/blocks/index.js
CHANGED
|
@@ -7,11 +7,10 @@ import '../chunk-2HDU26FC.js';
|
|
|
7
7
|
import { Button, Input } from '../chunk-VGOGWZCF.js';
|
|
8
8
|
import { cn } from '../chunk-XH55BHUU.js';
|
|
9
9
|
import * as React5 from 'react';
|
|
10
|
-
import { createContext,
|
|
10
|
+
import { createContext, useState, useContext, useCallback, useId, useSyncExternalStore, useEffect } from 'react';
|
|
11
11
|
import { Slot, RadioGroup as RadioGroup$1 } from 'radix-ui';
|
|
12
12
|
import { FormProvider, Controller, useFormContext } from 'react-hook-form';
|
|
13
13
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
14
|
-
import { useRouter, useSearchParams } from 'next/navigation';
|
|
15
14
|
import { ChevronRight, CheckIcon, CopyIcon, PlusIcon, FolderOpen, Folder, File } from 'lucide-react';
|
|
16
15
|
|
|
17
16
|
var Form = FormProvider;
|
|
@@ -73,33 +72,15 @@ function FormMessage({ className, ...props }) {
|
|
|
73
72
|
}
|
|
74
73
|
return /* @__PURE__ */ jsx("p", { "data-slot": "form-message", id: formMessageId, className: cn("text-destructive text-sm", className), ...props, children: body });
|
|
75
74
|
}
|
|
76
|
-
function Panel({
|
|
77
|
-
const
|
|
78
|
-
const params = useSearchParams();
|
|
79
|
-
const defaultKey = items[0]?.key;
|
|
80
|
-
const panelKey = useMemo(() => `panel${name ? "-" + name : ""}`, [name]);
|
|
81
|
-
const panelFromUrl = useMemo(() => {
|
|
82
|
-
if (!enable_url) return defaultKey;
|
|
83
|
-
return params.get(panelKey) ?? defaultKey;
|
|
84
|
-
}, [enable_url, params, defaultKey, panelKey]);
|
|
85
|
-
const [active, setActive] = useState(panelFromUrl);
|
|
86
|
-
useEffect(() => {
|
|
87
|
-
if (!enable_url) return;
|
|
88
|
-
setActive(panelFromUrl);
|
|
89
|
-
}, [panelFromUrl, enable_url]);
|
|
75
|
+
function Panel({ items }) {
|
|
76
|
+
const [active, setActive] = useState(items[0]?.key);
|
|
90
77
|
const current = items.find((s) => s.key === active) ?? items[0];
|
|
91
78
|
if (!current) return null;
|
|
92
|
-
const navigate = (key) => {
|
|
93
|
-
if (key === active) return;
|
|
94
|
-
setActive(key);
|
|
95
|
-
if (!enable_url) return;
|
|
96
|
-
router.replace(`?${panelKey}=${key}`, { scroll: false });
|
|
97
|
-
};
|
|
98
79
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-6 h-full min-h-0 flex flex-col", children: [
|
|
99
80
|
/* @__PURE__ */ jsx("div", { className: "lg:hidden", children: /* @__PURE__ */ jsx("div", { className: "inline-flex rounded-lg bg-muted p-1", children: items?.map((s) => /* @__PURE__ */ jsx(
|
|
100
81
|
"button",
|
|
101
82
|
{
|
|
102
|
-
onClick: () =>
|
|
83
|
+
onClick: () => setActive(s.key),
|
|
103
84
|
className: cn(
|
|
104
85
|
"rounded-md px-3 py-1.5 text-sm transition-all",
|
|
105
86
|
active === s.key ? "bg-background text-foreground shadow-sm" : s.danger ? "text-destructive" : "text-muted-foreground hover:text-foreground"
|
|
@@ -113,7 +94,7 @@ function Panel({ name, items, enable_url }) {
|
|
|
113
94
|
s.key
|
|
114
95
|
)) }) }),
|
|
115
96
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-8 lg:grid-cols-[240px_1fr] flex-1 min-h-0", children: [
|
|
116
|
-
/* @__PURE__ */ jsx("aside", { className: "hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]", children: items?.map((s) => /* @__PURE__ */ jsx(PanelItem, { active: active === s.key, icon: s.icon, danger: s.danger, hasError: s.hasError, onClick: () =>
|
|
97
|
+
/* @__PURE__ */ jsx("aside", { className: "hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]", children: items?.map((s) => /* @__PURE__ */ jsx(PanelItem, { active: active === s.key, icon: s.icon, danger: s.danger, hasError: s.hasError, onClick: () => setActive(s.key), children: s.label }, s.key)) }),
|
|
117
98
|
/* @__PURE__ */ jsx("div", { className: "space-y-6 overflow-y-auto min-h-0 pr-1 [overflow:overlay]", children: current.content })
|
|
118
99
|
] })
|
|
119
100
|
] });
|
|
@@ -1163,6 +1144,7 @@ function LlmSettings({
|
|
|
1163
1144
|
] })
|
|
1164
1145
|
] }),
|
|
1165
1146
|
slot.error ? /* @__PURE__ */ jsx("p", { className: "text-destructive text-xs", children: slot.error }) : null,
|
|
1147
|
+
api.slotNote?.(slot.name),
|
|
1166
1148
|
current?.manages && api.pull && missing && !pulling ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3", children: [
|
|
1167
1149
|
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs", children: t.notDownloaded }),
|
|
1168
1150
|
/* @__PURE__ */ jsxs(
|
package/dist/blocks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/blocks/form.tsx","../../src/blocks/panel.tsx","../../src/blocks/confirm/confirm-dialog.tsx","../../src/blocks/confirm/confirm-provider.tsx","../../src/blocks/confirm/use-confirm.tsx","../../src/blocks/tree/index.tsx","../../src/blocks/tz-picker.tsx","../../src/blocks/option-picker.tsx","../../src/blocks/mcp-settings.tsx","../../src/blocks/llm-settings.tsx","../../src/blocks/plate.ts","../../src/blocks/plate-picker.tsx","../../src/blocks/device-setting.ts","../../src/blocks/use-plate.ts","../../src/blocks/use-compact.ts","../../src/blocks/preference-script.tsx"],"names":["React","jsx","jsxs","createContext","useState","useContext","useId","React2","React3","FALLBACK","React4","messageOf","provider","Fragment","RadioGroupPrimitive","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["\nimport * as React from \"react\"\nimport { type Label as LabelPrimitive, Slot } from \"radix-ui\"\nimport { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues } from \"react-hook-form\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Label } from \"~/ui/primitives/label.js\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext || {}\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"grid gap-2\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return <Label data-slot=\"form-label\" data-error={!!error} className={cn(\"data-[error=true]:text-destructive\", className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p data-slot=\"form-message\" id={formMessageId} className={cn(\"text-destructive text-sm\", className)} {...props}>\n {body}\n </p>\n )\n}\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField }\n","\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { type LucideIcon } from \"lucide-react\"\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"~/ui/primitives/card.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype PanelItemType = {\n key: string\n label: string\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n content: ReactNode\n}\n\nexport function Panel({ name, items, enable_url }: { name?: string; items: PanelItemType[]; enable_url?: boolean }) {\n const router = useRouter()\n const params = useSearchParams()\n\n const defaultKey = items[0]?.key\n\n const panelKey = useMemo(() => `panel${name ? \"-\" + name : \"\"}`, [name])\n\n // get panel from url\n const panelFromUrl = useMemo(() => {\n if (!enable_url) return defaultKey\n return params.get(panelKey) ?? defaultKey\n }, [enable_url, params, defaultKey, panelKey])\n\n // set active\n const [active, setActive] = useState(panelFromUrl)\n\n // sync URL → state\n useEffect(() => {\n if (!enable_url) return\n setActive(panelFromUrl)\n }, [panelFromUrl, enable_url])\n\n const current = items.find(s => s.key === active) ?? items[0]\n if (!current) return null\n\n const navigate = (key: string) => {\n if (key === active) return\n setActive(key)\n if (!enable_url) return\n router.replace(`?${panelKey}=${key}`, { scroll: false })\n }\n\n return (\n <div className=\"space-y-6 h-full min-h-0 flex flex-col\">\n {/* Mobi */}\n <div className=\"lg:hidden\">\n <div className=\"inline-flex rounded-lg bg-muted p-1\">\n {items?.map(s => (\n <button\n key={s.key}\n onClick={() => navigate(s.key)}\n className={cn(\n \"rounded-md px-3 py-1.5 text-sm transition-all\",\n active === s.key ? \"bg-background text-foreground shadow-sm\" : s.danger ? \"text-destructive\" : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <span className=\"relative flex items-center gap-2\">\n {s.icon && <s.icon className=\"h-4 w-4\" />}\n {s.label}\n {s.hasError && <span className=\"absolute -top-1 -right-2 flex h-2 w-2 rounded-full bg-destructive\" />}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Desktop */}\n <div className=\"grid grid-cols-1 gap-8 lg:grid-cols-[240px_1fr] flex-1 min-h-0\">\n {/* Sidebar */}\n <aside className=\"hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">\n {items?.map(s => (\n <PanelItem key={s.key} active={active === s.key} icon={s.icon} danger={s.danger} hasError={s.hasError} onClick={() => navigate(s.key)}>\n {s.label}\n </PanelItem>\n ))}\n </aside>\n {/* Content */}\n <div className=\"space-y-6 overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">{current.content}</div>\n </div>\n </div>\n )\n}\n\nexport interface PanelItemProps {\n children: ReactNode\n active?: boolean\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n onClick?: () => void\n}\n\nfunction PanelItem({ children, active, icon: Icon, danger, hasError, onClick }: PanelItemProps) {\n return (\n <div\n onClick={onClick}\n className={cn(\n \"cursor-pointer rounded-md px-3 py-2 text-sm transition-colors flex items-center justify-between\",\n active ? \"bg-muted font-medium\" : danger ? \"text-destructive hover:bg-destructive/10\" : \"text-muted-foreground hover:bg-muted\"\n )}\n >\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n {children}\n </span>\n {hasError && <span className=\"h-2 w-2 rounded-full bg-destructive\" />}\n </div>\n )\n}\n\nexport interface PanelCardProps {\n title: string\n description?: string\n hint?: string\n action?: ReactNode\n children?: ReactNode\n}\n\nexport function PanelCard({ title, description, hint, action, children }: PanelCardProps) {\n return (\n <Card className={cn({ \"pb-3\": hint || action })}>\n <CardHeader>\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && <CardDescription className=\"max-w-2xl\">{description}</CardDescription>}\n </CardHeader>\n {children && <CardContent>{children}</CardContent>}\n {(hint || action) && (\n <CardFooter className=\"flex items-center justify-between border-t !pt-3 !pb-0\">\n <p className=\"text-sm text-muted-foreground\">{hint}</p>\n {action}\n </CardFooter>\n )}\n </Card>\n )\n}\n","\nimport { Dialog, DialogContent, DialogDescription, DialogOverlay, DialogTitle } from \"~/ui/primitives/dialog.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype Props = {\n options: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmDialog({ options, onConfirm, onCancel }: Props) {\n return (\n <Dialog open onOpenChange={val => !val && onCancel()}>\n <DialogOverlay className=\"fixed inset-0 bg-white/10\" />\n <DialogContent className={cn(\"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\", \"p-4 w-[400px]\", \"focus:outline-none\")}>\n <DialogTitle className=\"text-sm font-medium\">{options.title}</DialogTitle>\n {options.description != null && (\n <DialogDescription asChild>\n <div className=\"mt-2 text-sm text-muted-foreground\">{options.description}</div>\n </DialogDescription>\n )}\n\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel}>\n {options.cancelText ?? \"Cancel\"}\n </Button>\n <Button size=\"sm\" onClick={onConfirm} className={cn(options.danger && \"bg-red-600 hover:bg-red-700 text-white\")}>\n {options.confirmText ?? \"Confirm\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\nimport { createContext, type ReactNode, useState } from \"react\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { ConfirmDialog } from \"./confirm-dialog.js\"\n\nexport type ConfirmFn = (options: ConfirmOptions) => Promise<boolean>\n\nexport const ConfirmContext = createContext<ConfirmFn | null>(null)\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n options: ConfirmOptions\n resolve: (v: boolean) => void\n } | null>(null)\n\n const confirm: ConfirmFn = options => new Promise<boolean>(resolve => setState({ options, resolve }))\n\n const close = (result: boolean) => {\n state?.resolve(result)\n setState(null)\n }\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n\n {state && <ConfirmDialog options={state.options} onConfirm={() => close(true)} onCancel={() => close(false)} />}\n </ConfirmContext.Provider>\n )\n}\n","\nimport { useContext } from \"react\"\nimport { ConfirmContext } from \"./confirm-provider.js\"\n\nexport const useConfirm = () => {\n const ctx = useContext(ConfirmContext)\n if (!ctx) {\n throw new Error(\"useConfirm must be used inside ConfirmProvider\")\n }\n return ctx\n}\n","\nimport { ChevronRight, File, Folder, FolderOpen } from \"lucide-react\"\nimport { createContext, type HTMLAttributes, type ReactNode, useCallback, useContext, useId, useState } from \"react\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype TreeContextType = {\n expandedIds: Set<string>\n selectedIds: string[]\n toggleExpanded: (nodeId: string) => void\n handleSelection: (nodeId: string, ctrlKey: boolean) => void\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n indent?: number\n animateExpand?: boolean\n}\n\nconst TreeContext = createContext<TreeContextType | undefined>(undefined)\n\nconst useTree = () => {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error(\"Tree components must be used within a TreeProvider\")\n }\n return context\n}\n\ntype TreeNodeContextType = {\n nodeId: string\n level: number\n isLast: boolean\n parentPath: boolean[]\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextType | undefined>(undefined)\n\nconst useTreeNode = () => {\n const context = useContext(TreeNodeContext)\n if (!context) {\n throw new Error(\"TreeNode components must be used within a TreeNode\")\n }\n return context\n}\n\nexport type TreeProviderProps = {\n children: ReactNode\n defaultExpandedIds?: string[]\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n selectedIds?: string[]\n onSelectionChange?: (selectedIds: string[]) => void\n expandedIds?: Set<string>\n onExpandedChange?: (expandedIds: Set<string>) => void\n indent?: number\n animateExpand?: boolean\n className?: string\n}\n\nexport const TreeProvider = ({\n children,\n defaultExpandedIds = [],\n showLines = true,\n showIcons = true,\n selectable = true,\n multiSelect = false,\n selectedIds,\n onSelectionChange,\n indent = 20,\n animateExpand = true,\n className,\n expandedIds,\n onExpandedChange,\n}: TreeProviderProps) => {\n const [internalExpandedIds, setInternalExpandedIds] = useState<Set<string>>(new Set(defaultExpandedIds))\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(selectedIds ?? [])\n\n const isControlledSelected = selectedIds !== undefined && onSelectionChange !== undefined\n const currentSelectedIds = isControlledSelected ? selectedIds : internalSelectedIds\n\n const isControlledExpanded = expandedIds !== undefined && onExpandedChange !== undefined\n const currentExpandedIds = isControlledExpanded ? expandedIds : internalExpandedIds\n\n const toggleExpanded = useCallback(\n (nodeId: string) => {\n const newSet = new Set<string>(currentExpandedIds)\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId)\n } else {\n newSet.add(nodeId)\n }\n\n if (isControlledExpanded) {\n onExpandedChange?.(newSet)\n } else {\n setInternalExpandedIds(newSet)\n }\n },\n [currentExpandedIds, isControlledExpanded, onExpandedChange]\n )\n\n const handleSelection = useCallback(\n (nodeId: string, ctrlKey = false) => {\n if (!selectable) {\n return\n }\n\n let newSelection: string[]\n\n if (multiSelect && ctrlKey) {\n newSelection = currentSelectedIds.includes(nodeId) ? currentSelectedIds.filter(id => id !== nodeId) : [...currentSelectedIds, nodeId]\n } else {\n newSelection = currentSelectedIds.includes(nodeId) ? [] : [nodeId]\n }\n\n if (isControlledSelected) {\n onSelectionChange?.(newSelection)\n } else {\n setInternalSelectedIds(newSelection)\n }\n },\n [selectable, multiSelect, currentSelectedIds, isControlledSelected, onSelectionChange]\n )\n\n return (\n <TreeContext.Provider\n value={{\n expandedIds: currentExpandedIds,\n selectedIds: currentSelectedIds,\n toggleExpanded,\n handleSelection,\n showLines,\n showIcons,\n selectable,\n multiSelect,\n indent,\n animateExpand,\n }}\n >\n <div className={cn(\"w-full\", className)}>{children}</div>\n </TreeContext.Provider>\n )\n}\n\nexport type TreeViewProps = HTMLAttributes<HTMLDivElement>\n\nexport const TreeView = ({ className, children, ...props }: TreeViewProps) => (\n <div className={cn(\"p-2\", className)} {...props}>\n {children}\n </div>\n)\n\nexport type TreeNodeProps = HTMLAttributes<HTMLDivElement> & {\n nodeId?: string\n level?: number\n isLast?: boolean\n parentPath?: boolean[]\n children?: ReactNode\n}\n\nexport const TreeNode = ({ nodeId: providedNodeId, level = 0, isLast = false, parentPath = [], children, className, onClick: _onClick, ...props }: TreeNodeProps) => {\n const generatedId = useId()\n const nodeId = providedNodeId ?? generatedId\n\n // Build the parent path - mark positions where the parent was the last child\n const currentPath = level === 0 ? [] : [...parentPath]\n if (level > 0 && parentPath.length < level - 1) {\n // Fill in missing levels with false (not last)\n while (currentPath.length < level - 1) {\n currentPath.push(false)\n }\n }\n if (level > 0) {\n currentPath[level - 1] = isLast\n }\n\n return (\n <TreeNodeContext.Provider\n value={{\n nodeId,\n level,\n isLast,\n parentPath: currentPath,\n }}\n >\n <div className={cn(\"select-none\", className)} {...props}>\n {children}\n </div>\n </TreeNodeContext.Provider>\n )\n}\n\nexport type TreeNodeTriggerProps = HTMLAttributes<HTMLDivElement> & {\n expandOnClick?: boolean\n}\n\nexport const TreeNodeTrigger = ({ children, className, onClick, expandOnClick = false, ...props }: TreeNodeTriggerProps) => {\n const { selectedIds, handleSelection, toggleExpanded, indent } = useTree()\n const { nodeId, level } = useTreeNode()\n const isSelected = selectedIds.includes(nodeId)\n\n return (\n <div\n className={cn(\n \"group relative mx-1 flex cursor-pointer items-center rounded-md px-3 transition-all duration-200\",\n \"hover:bg-accent/50\",\n isSelected && \"bg-accent/80\",\n className\n )}\n style={{ paddingLeft: level * (indent ?? 0) + 8, paddingTop: \"var(--tree-item-py)\", paddingBottom: \"var(--tree-item-py)\" }}\n onClick={e => {\n handleSelection(nodeId, e.ctrlKey || e.metaKey)\n if (expandOnClick) toggleExpanded(nodeId)\n onClick?.(e)\n }}\n onDoubleClick={e => {\n if (e.ctrlKey || e.metaKey) return\n toggleExpanded(nodeId)\n }}\n {...props}\n >\n <TreeLines />\n {children}\n </div>\n )\n}\n\nexport const TreeLines = () => {\n const { showLines, indent } = useTree()\n const { level, isLast, parentPath } = useTreeNode()\n\n if (!showLines || level === 0) {\n return null\n }\n\n return (\n <div className=\"pointer-events-none absolute top-0 bottom-0 left-0\">\n {/* Render vertical lines for all parent levels */}\n {Array.from({ length: level }, (_, index) => {\n const shouldHideLine = parentPath[index] === true\n if (shouldHideLine && index === level - 1) {\n return null\n }\n\n return (\n <div\n className=\"absolute top-0 bottom-0 border-border/40 border-l\"\n key={index.toString()}\n style={{\n left: index * (indent ?? 0) + 12,\n display: shouldHideLine ? \"none\" : \"block\",\n }}\n />\n )\n })}\n\n {/* Horizontal connector line */}\n <div\n className=\"absolute top-1/2 border-border/40 border-t\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n width: (indent ?? 0) - 4,\n transform: \"translateY(-1px)\",\n }}\n />\n\n {/* Vertical line to midpoint for last items */}\n {isLast && (\n <div\n className=\"absolute top-0 border-border/40 border-l\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n height: \"50%\",\n }}\n />\n )}\n </div>\n )\n}\n\nexport type TreeNodeContentProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeNodeContent = ({ children, hasChildren = false, className, ...props }: TreeNodeContentProps) => {\n const { expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren || !isExpanded) {\n return null\n }\n\n return (\n <div className={className} {...props}>\n {children}\n </div>\n )\n}\n\nexport type TreeExpanderProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeExpander = ({ hasChildren = false, className, onClick, ...props }: TreeExpanderProps) => {\n const { expandedIds, toggleExpanded } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren) {\n return <div className=\"mr-1 h-4 w-4\" />\n }\n\n return (\n <div\n className={cn(\"mr-1 flex h-4 w-4 items-center justify-center transition-transform duration-150\", isExpanded && \"rotate-90\", className)}\n onClick={e => {\n e.stopPropagation()\n toggleExpanded(nodeId)\n onClick?.(e)\n }}\n {...props}\n >\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )\n}\n\nexport type TreeIconProps = HTMLAttributes<HTMLDivElement> & {\n icon?: ReactNode\n hasChildren?: boolean\n}\n\nexport const TreeIcon = ({ icon, hasChildren = false, className, ...props }: TreeIconProps) => {\n const { showIcons, expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!showIcons) {\n return null\n }\n\n const getDefaultIcon = () => (hasChildren ? isExpanded ? <FolderOpen className=\"h-4 w-4\" /> : <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />)\n\n return (\n <div className={cn(\"mr-2 flex h-4 w-4 items-center justify-center text-muted-foreground transition-transform\", className)} {...props}>\n {icon || getDefaultIcon()}\n </div>\n )\n}\n\nexport type TreeLabelProps = HTMLAttributes<HTMLSpanElement>\n\nexport const TreeLabel = ({ className, ...props }: TreeLabelProps) => <span className={cn(\"font flex-1 truncate text-sm\", className)} {...props} />\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick an IANA timezone instead of typing one.\n *\n * A zone is a spelling test with silent failure: `Asia/HoChiMinh`, `GMT+7` and `ICT` all look\n * right and none of them is a zone. Go's `time.LoadLocation` does not reject a wrong one\n * loudly - it fails, logs, and the caller falls back to UTC - so a typo becomes a whole site's\n * timesheet shifted by seven hours, which nobody reads as a spelling mistake.\n *\n * ⚠️ `Asia/Saigon` is NOT one of those typos. `Intl.supportedValuesOf(\"timeZone\")` returns the\n * CLDR canonical names, and CLDR canonical for Vietnam IS `Asia/Saigon` - `Asia/Ho_Chi_Minh`\n * does not appear in that list at all. Same for `Asia/Calcutta` over `Asia/Kolkata` and\n * `Europe/Kiev` over `Europe/Kyiv`; see IANA_PRIMARY below for the measured set.\n *\n * The offered names are RENAMED to their IANA primaries anyway, because the offered name is the\n * STORED name, and the stored name is what every backend, log line and export then carries. Go\n * tzdata, this platform, and the people reading a Vietnamese timesheet all say\n * `Asia/Ho_Chi_Minh`; a control that can only offer `Asia/Saigon` reads as broken to all three,\n * and being technically correct did not stop somebody asking why the city was missing.\n *\n * A value stored under EITHER spelling still renders as itself with a correct offset: `Intl`\n * resolves both, and the entry list appends whatever is stored when the offered list omits it.\n *\n * Lives in lyra rather than nekit even though it carries domain logic, because the rule that\n * decides is not \"UI vs logic\" - it is whether the component knows where its data comes from.\n * `PeoplePicker` next door takes an injected `search` for exactly that reason. This one reads\n * `Intl`, which is in the runtime: no network, no session, nothing an app has to hand it.\n *\n * Every zone is shown WITH its current offset. Four hundred names sorted alphabetically is\n * unusable; \"Asia/Ho_Chi_Minh · GMT+7\" is something a person can confirm at a glance, and that\n * glance is the only check standing between a typo and a wrong month.\n */\n\n/** A curated fallback for a runtime without `Intl.supportedValuesOf` (pre-2022 browsers).\n * Short on purpose - it exists so the control still works, not to be a tz database. */\nconst FALLBACK_ZONES = [\n \"UTC\",\n \"Asia/Ho_Chi_Minh\",\n \"Asia/Bangkok\",\n \"Asia/Singapore\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Asia/Shanghai\",\n \"Asia/Kolkata\",\n \"Europe/London\",\n \"Europe/Berlin\",\n \"America/New_York\",\n \"America/Los_Angeles\",\n]\n\n/**\n * CLDR canonical name -> the IANA primary name, for the zones where they disagree.\n *\n * MEASURED, not recalled: Node 22 / ICU reports 417 zones, and for each pair below the CLDR\n * spelling is present, the IANA spelling is absent, and `Intl` resolves the IANA spelling\n * anyway. That last fact is what makes the rename safe - the offset lookup does not care which\n * name it is handed.\n *\n * ⚠️ Renaming the OFFERED name, not the accepted one. A site already saved as `Asia/Saigon`\n * keeps working and keeps showing `Asia/Saigon`, because the entry list appends a stored value\n * the offered list does not contain. Nothing is rewritten behind anybody.\n *\n * This list changes about once a decade, when IANA renames a zone and CLDR declines to follow.\n * If a pair here ever starts appearing under both spellings, delete that row rather than\n * shadowing a real entry.\n */\nconst IANA_PRIMARY: Record<string, string> = {\n \"America/Buenos_Aires\": \"America/Argentina/Buenos_Aires\",\n \"America/Godthab\": \"America/Nuuk\",\n \"Asia/Calcutta\": \"Asia/Kolkata\",\n \"Asia/Katmandu\": \"Asia/Kathmandu\",\n \"Asia/Rangoon\": \"Asia/Yangon\",\n \"Asia/Saigon\": \"Asia/Ho_Chi_Minh\",\n \"Atlantic/Faeroe\": \"Atlantic/Faroe\",\n \"Europe/Kiev\": \"Europe/Kyiv\",\n \"Pacific/Ponape\": \"Pacific/Pohnpei\",\n \"Pacific/Truk\": \"Pacific/Chuuk\",\n}\n\nexport interface TzPickerLabels {\n /** Shown when the value is empty and `allowInherit`. Default: \"Inherit\". */\n inherit?: string\n /** Placeholder for the search input. Default: \"Search timezone\". */\n search?: string\n /** Shown when the filter matches nothing. Default: \"No match\". */\n noMatch?: string\n // No `suggested`/`all` headings: the list is one flat group now. Declaring labels nothing\n // renders is how a message file ends up with keys three translators maintain for no screen.\n}\n\ninterface Zone {\n name: string\n offset: string\n}\n\n/**\n * Built once per page load, not per render: resolving the offset of ~420 zones means ~420\n * `Intl.DateTimeFormat` constructions, cheap once and visible on every keystroke.\n */\nlet cachedZones: Zone[] | null = null\n\nfunction allZones(): Zone[] {\n if (cachedZones) return cachedZones\n let names: string[]\n try {\n const supported = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n names = supported ? supported(\"timeZone\") : FALLBACK_ZONES\n } catch {\n names = FALLBACK_ZONES\n }\n cachedZones = names.map((name) => {\n const primary = IANA_PRIMARY[name] ?? name\n // The offset is resolved from the name being SHOWN, so a wrong row in the table above\n // surfaces as a wrong offset next to the name rather than as a silently different zone.\n return { name: primary, offset: offsetOf(primary) }\n })\n return cachedZones\n}\n\n/** The zone's offset right now, as ICU spells it: \"GMT+7\", not \"UTC+7\". DST makes it a\n * snapshot, which is what a person recognising their own zone needs - not a promise about\n * January. */\nfunction offsetOf(tz: string): string {\n try {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: tz,\n timeZoneName: \"shortOffset\",\n }).formatToParts(new Date())\n return parts.find((p) => p.type === \"timeZoneName\")?.value ?? \"\"\n } catch {\n return \"\"\n }\n}\n\n/**\n * The viewer\\u2019s own zone, under the SAME spelling the offered list uses.\n *\n * \\u26a0\\ufe0f The mapping is not optional. `resolvedOptions().timeZone` reports the CLDR canonical name\n * even when the machine is set to the IANA one - a laptop on `Asia/Ho_Chi_Minh` answers\n * `Asia/Saigon` - so without this the lookup below misses, and the \"your own zone first\"\n * shortcut silently stops working for exactly the countries IANA_PRIMARY covers. Silently,\n * because the control still renders a perfectly good list; it just no longer helps.\n */\nfunction browserTz(): string {\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\"\n return IANA_PRIMARY[tz] ?? tz\n } catch {\n return \"UTC\"\n }\n}\n\nexport interface TzPickerProps {\n /** IANA zone name, or \"\" for inherit. */\n value: string\n onChange: (tz: string) => void\n /**\n * Whether an empty value is meaningful here. It usually is: a device inherits from its site,\n * a site from its unit, a unit from its parent. Set false where a zone must be chosen.\n */\n allowInherit?: boolean\n labels?: TzPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}\n\n/**\n * Field names are `tz`/`name`, NOT `value`/`label`, on purpose: Base UI treats an item shaped\n * `{ value, label }` as self-describing and renders `label` directly, silently ignoring\n * `itemToStringLabel`. The offset would then vanish from the input - which is the one part of\n * the label that makes a zone recognisable.\n */\ninterface Entry {\n tz: string\n name: string\n offset: string\n}\n\nexport function TzPicker({\n value,\n onChange,\n allowInherit = true,\n labels,\n disabled,\n id,\n className,\n}: TzPickerProps) {\n const l = {\n inherit: labels?.inherit ?? \"Inherit\",\n search: labels?.search ?? \"Search timezone\",\n noMatch: labels?.noMatch ?? \"No match\",\n }\n const own = React.useMemo(() => browserTz(), [])\n\n const entries = React.useMemo<Entry[]>(() => {\n const zones = allZones()\n const out: Entry[] = []\n if (allowInherit) out.push({ tz: \"\", name: l.inherit, offset: \"\" })\n // The person filling this form is almost always near the place they are describing, so\n // their own zone is the likeliest answer - and the one hardest to find by scrolling.\n const ownZone = zones.find((z) => z.name === own)\n if (ownZone) out.push({ tz: own, name: own, offset: ownZone.offset })\n for (const z of zones) {\n if (z.name === own) continue\n out.push({ tz: z.name, name: z.name, offset: z.offset })\n }\n // A stored zone the LIST does not contain - an alias CLDR canonicalises away\n // (`Asia/Ho_Chi_Minh`), or one dropped from a later release. It keeps its own name, so the\n // control never misreports what is saved, and it still gets an offset: `Intl` resolves the\n // alias fine even though `supportedValuesOf` omits it. Only a genuinely invalid zone ends\n // up with an empty offset here.\n if (value !== \"\" && !zones.some((z) => z.name === value)) {\n out.push({ tz: value, name: value, offset: offsetOf(value) })\n }\n return out\n }, [allowInherit, l.inherit, own, value])\n\n const selected = entries.find((e) => e.tz === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(item: Entry | null) => onChange(item?.tz ?? \"\")}\n // Searchable by name AND offset: somebody who knows \"+7\" but not the city can still land\n // on it.\n itemToStringLabel={(e: Entry) => (e.offset ? `${e.name} · ${e.offset}` : e.name)}\n itemToStringValue={(e: Entry) => e.tz}\n isItemEqualToValue={(a: Entry, b: Entry) => a.tz === b.tz}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: a combobox trigger sized to its content renders short\n and clipped inside a form column, which reads as a different kind of field. */}\n <ComboboxInput\n id={id}\n placeholder={l.search}\n className={className ?? \"w-full\"}\n // A clear button only where empty is a legitimate answer. Where a zone is required,\n // clearing would offer a state the form cannot save.\n showClear={allowInherit}\n />\n <ComboboxContent>\n <ComboboxEmpty>{l.noMatch}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.tz || \"__inherit\"} value={entry}>\n <span className=\"flex-1 truncate\">{entry.name}</span>\n <span className=\"text-muted-foreground text-xs\">{entry.offset}</span>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick one id from a known set.\n *\n * The set is INJECTED. That is what lets this live in lyra: it never learns where the\n * options came from, so it works the same for org members, groups, or anything else the app\n * has already loaded - which is exactly how the three copies it replaces differed.\n *\n * Why it exists at all: the screens that use it used to ask for raw uuids typed into a text\n * box. Nobody knows a uuid, so the only way anyone filled those fields was by copying from\n * somewhere else, and a copy can be off by one row. In `people` that attached a personnel\n * record to the wrong account - a wrong-but-valid uid passes every server check and is found\n * by whoever opens someone else's file under their own name.\n *\n * Filtering is client-side, deliberately: every set here is org-scoped and already loaded for\n * the surrounding screen, so matching locally is instant and costs no round trip. A picker\n * paging over every account that exists (admin's platform-wide search) is a different\n * component with a different failure mode - see `PeoplePicker` in `@tradalab/lyra/people`,\n * which takes an async `search` and does not hold a controlled value.\n */\n\n/** One choosable thing: an id plus what a person actually recognises it by. */\nexport interface PickOption {\n id: string\n label: string\n /** Secondary line - an email, a status. Searchable along with the label. */\n hint?: string\n}\n\nexport interface OptionPickerLabels {\n /** Shown when nothing is selected. */\n placeholder?: string\n /** Placeholder inside the search box. */\n search?: string\n /** Shown when the filter matches nothing. */\n empty?: string\n}\n\nconst FALLBACK: Required<OptionPickerLabels> = {\n placeholder: \"Select…\",\n search: \"Search\",\n empty: \"No match\",\n}\n\n/**\n * Field names are `id`/`label`, and `label` is what Base UI renders when an item is shaped\n * `{ value, label }`. This shape uses `id`, so `itemToStringLabel` below is what actually\n * decides the input text - the same trap TzPicker documents.\n */\ninterface Entry extends PickOption {\n /** Present only for the empty selection, so `value` can round-trip \"\" safely. */\n none?: boolean\n}\n\nexport function OptionPicker({\n value,\n onChange,\n options,\n labels,\n disabled,\n id,\n className,\n}: {\n value: string\n onChange: (id: string) => void\n options: PickOption[]\n labels?: OptionPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}) {\n const t = (k: keyof OptionPickerLabels) => labels?.[k] ?? FALLBACK[k]\n const placeholder = labels?.placeholder ?? FALLBACK.placeholder\n\n const entries = React.useMemo<Entry[]>(() => {\n const out: Entry[] = [{ id: \"\", label: placeholder, none: true }, ...options]\n // A stored id that is nobody on the list: the account left the org, or the record was\n // linked before this control existed. Show the raw id rather than an empty box - the\n // field is NOT empty, and rendering it as empty invites overwriting it by accident.\n if (value !== \"\" && !options.some((o) => o.id === value)) {\n out.push({ id: value, label: value })\n }\n return out\n }, [options, value, placeholder])\n\n const selected = entries.find((e) => e.id === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(e: Entry | null) => onChange(e?.id ?? \"\")}\n // The id is part of the searchable text, not only the label: somebody holding a uid\n // from a log must still be able to find the person it belongs to.\n itemToStringLabel={(e: Entry) => (e.none ? e.label : `${e.label} ${e.hint ?? \"\"} ${e.id}`)}\n isItemEqualToValue={(a: Entry, b: Entry) => a.id === b.id}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: sized to content it renders short and clipped inside\n a form column. */}\n <ComboboxInput id={id} placeholder={t(\"search\")} className={className ?? \"w-full\"} />\n <ComboboxContent>\n <ComboboxEmpty>{t(\"empty\")}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.id || \"__none\"} value={entry}>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm\">{entry.label}</span>\n {entry.hint ? (\n <span className=\"text-muted-foreground truncate text-xs\">{entry.hint}</span>\n ) : null}\n </div>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's MCP tools: the user's switch, one switch per tool,\n * the programs allowed in, and the calls as they happen.\n *\n * The api is INJECTED and its types are declared here, shaped like the `scorixMCP` that\n * `scorix generate proto` emits, so an app passes that object as is. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * `copy` is injected too, and without it there is no copy button: `navigator.clipboard` needs\n * a secure context, which only WebView2 grants a scorix app. Reaching for it here would work\n * on Windows and do nothing on macOS and Linux.\n */\n\nexport interface McpTool {\n name: string\n description: string\n destructive: boolean\n enabled: boolean\n}\n\nexport interface McpClient {\n path: string\n name?: string\n approved_at: string\n}\n\nexport interface McpStatus {\n offered: boolean\n enabled: boolean\n running: boolean\n tools: McpTool[]\n clients: McpClient[]\n client: { command: string; args: string[] }\n audit_log: string\n}\n\nexport interface McpCall {\n tool: string\n client: string\n client_path: string\n outcome: \"ok\" | \"error\" | \"denied\"\n error?: string\n ms: number\n}\n\nexport interface McpSettingsApi {\n status(): Promise<McpStatus>\n enable(enabled: boolean): Promise<McpStatus>\n setTool(name: string, enabled: boolean): Promise<McpStatus>\n revokeClient(path: string): Promise<McpStatus>\n onCall?(cb: (call: McpCall) => void): () => void\n}\n\nexport interface McpSettingsLabels {\n enable?: string\n enableHint?: string\n running?: string\n stopped?: string\n notOffered?: string\n connect?: string\n connectHint?: string\n copy?: string\n copied?: string\n copyConfig?: string\n tools?: string\n toolsHint?: string\n asksFirst?: string\n asksFirstHint?: string\n clients?: string\n clientsHint?: string\n clientsEmpty?: string\n revoke?: string\n activity?: string\n activityEmpty?: string\n ok?: string\n error?: string\n denied?: string\n auditLog?: string\n auditLogHint?: string\n retry?: string\n}\n\nconst FALLBACK: Required<McpSettingsLabels> = {\n enable: \"Allow MCP clients\",\n enableHint: \"Let an AI agent such as Claude Desktop or Cursor use the tools this app offers.\",\n running: \"Running\",\n stopped: \"Off\",\n notOffered: \"This build of the app offers no MCP tools.\",\n connect: \"Connect a client\",\n connectHint: \"Add this to the client's MCP configuration, then restart the client.\",\n copy: \"Copy\",\n copied: \"Copied\",\n copyConfig: \"Copy configuration\",\n tools: \"Tools\",\n toolsHint: \"A tool turned off is hidden from every client.\",\n asksFirst: \"Asks first\",\n asksFirstHint: \"You confirm every call in a dialog.\",\n clients: \"Allowed programs\",\n clientsHint: \"A program is added when you allow it, the first time it runs a tool.\",\n clientsEmpty: \"No program allowed yet.\",\n revoke: \"Remove\",\n activity: \"Recent calls\",\n activityEmpty: \"Calls show up here while this screen is open.\",\n ok: \"OK\",\n error: \"Failed\",\n denied: \"Denied\",\n auditLog: \"Audit log\",\n auditLogHint: \"Every call is written here, with credential-like arguments hidden.\",\n retry: \"Retry\",\n}\n\nconst RECENT_CALLS = 20\n\nconst OUTCOME_VARIANT = { ok: \"secondary\", error: \"destructive\", denied: \"outline\" } as const\n\ninterface SeenCall extends McpCall {\n key: number\n at: Date\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction baseName(path: string): string {\n return path.split(/[\\\\/]/).pop() || path\n}\n\nexport function McpSettings({\n api,\n serverName,\n copy,\n labels,\n locale,\n className,\n}: {\n api: McpSettingsApi\n /** The key under `mcpServers` in the configuration snippet: the app's own short name. */\n serverName: string\n copy?: (text: string) => Promise<void>\n labels?: McpSettingsLabels\n locale?: string\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const id = React.useId()\n const [status, setStatus] = React.useState<McpStatus | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n const [calls, setCalls] = React.useState<SeenCall[]>([])\n // Bumped when a change starts and when it ends, so a refresh that raced one is dropped\n // instead of putting back what the change just replaced.\n const changes = React.useRef(0)\n const callKey = React.useRef(0)\n\n const load = React.useCallback(() => {\n setLoadError(null)\n api.status().then(setStatus, (err: unknown) => setLoadError(messageOf(err)))\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onCall) return\n return api.onCall((call) => {\n setCalls((prev) => [{ ...call, key: ++callKey.current, at: new Date() }, ...prev].slice(0, RECENT_CALLS))\n // A program the user just allowed did so in a native dialog, outside this screen; the\n // call it then makes is the only sign that the list of programs changed.\n const started = changes.current\n api.status().then(\n (next) => {\n if (changes.current === started) setStatus(next)\n },\n // A refresh nobody asked for keeps the last answer on screen rather than raising an error.\n () => {},\n )\n })\n }, [api])\n\n React.useEffect(() => {\n if (!copied) return\n const timer = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timer)\n }, [copied])\n\n const change = async (action: () => Promise<McpStatus>) => {\n changes.current++\n setBusy(true)\n setError(null)\n try {\n setStatus(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n changes.current++\n setBusy(false)\n }\n }\n\n if (!status) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!status.offered) {\n return (\n <FieldGroup className={className}>\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.enable}</FieldLegend>\n <FieldDescription>{t.notOffered}</FieldDescription>\n </FieldSet>\n </FieldGroup>\n )\n }\n\n // Serialised, not assembled by hand: a Windows path pasted into JSON needs its backslashes\n // escaped, and a snippet the client cannot parse fails with no hint of why.\n const snippet = JSON.stringify(\n { mcpServers: { [serverName]: { command: status.client.command, args: status.client.args } } },\n null,\n 2,\n )\n const day = (iso: string) => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString(locale)\n }\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long path or\n // config line would widen the whole screen instead of truncating or scrolling.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <Field orientation=\"horizontal\">\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-enable`} className=\"text-sm\">\n {t.enable}\n </FieldLabel>\n <Badge variant=\"outline\">{status.running ? t.running : t.stopped}</Badge>\n </div>\n <FieldDescription>{t.enableHint}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-enable`}\n checked={status.enabled}\n disabled={busy}\n onCheckedChange={(on) => void change(() => api.enable(on))}\n />\n </Field>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.connect}</FieldLegend>\n <FieldDescription>{t.connectHint}</FieldDescription>\n <div className=\"relative\">\n <pre className=\"bg-muted/50 overflow-x-auto border px-3 py-2 font-mono text-xs leading-relaxed\">{snippet}</pre>\n {copy ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"bg-background absolute top-2 right-2\"\n aria-label={t.copyConfig}\n onClick={() =>\n void copy(snippet).then(\n () => setCopied(true),\n (err: unknown) => setError(messageOf(err)),\n )\n }\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n {copied ? t.copied : t.copy}\n </Button>\n ) : null}\n </div>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.tools}</FieldLegend>\n <FieldDescription>{t.toolsHint}</FieldDescription>\n {status.tools.map((tool) => (\n <Field key={tool.name} orientation=\"horizontal\" data-disabled={!status.enabled}>\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-tool-${tool.name}`} className=\"font-mono text-xs\">\n {tool.name}\n </FieldLabel>\n {tool.destructive ? (\n <Badge variant=\"destructive\" title={t.asksFirstHint}>\n {t.asksFirst}\n </Badge>\n ) : null}\n </div>\n <FieldDescription>{tool.description}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-tool-${tool.name}`}\n size=\"sm\"\n checked={tool.enabled}\n disabled={busy || !status.enabled}\n onCheckedChange={(on) => void change(() => api.setTool(tool.name, on))}\n />\n </Field>\n ))}\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.clients}</FieldLegend>\n <FieldDescription>{t.clientsHint}</FieldDescription>\n {status.clients.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.clientsEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {status.clients.map((client) => {\n const who = client.name || baseName(client.path)\n return (\n <li key={client.path} className=\"flex items-center gap-3 px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{who}</div>\n {/* Cut at the start: the end of a path names the program, and the start is the\n same home directory on every row. bdi keeps the path itself left to right. */}\n <div\n className=\"text-muted-foreground truncate text-left font-mono text-xs [direction:rtl]\"\n title={client.path}\n >\n <bdi>{client.path}</bdi>\n </div>\n </div>\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">{day(client.approved_at)}</span>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.revoke} ${who}`}\n disabled={busy}\n onClick={() => void change(() => api.revokeClient(client.path))}\n >\n {t.revoke}\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n </FieldSet>\n\n {api.onCall ? (\n <>\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.activity}</FieldLegend>\n {calls.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.activityEmpty}</p>\n ) : (\n <ul aria-label={t.activity} className=\"divide-y border\">\n {calls.map((call) => (\n <li key={call.key} className=\"flex items-center gap-3 px-3 py-1.5 text-xs\" title={call.error}>\n <span className=\"text-muted-foreground tabular-nums\">{call.at.toLocaleTimeString(locale)}</span>\n <span className=\"min-w-0 flex-1 truncate font-mono\">{call.tool}</span>\n <span className=\"text-muted-foreground max-w-40 truncate\" title={call.client_path}>\n {call.client || baseName(call.client_path)}\n </span>\n <Badge variant={OUTCOME_VARIANT[call.outcome]}>{t[call.outcome]}</Badge>\n <span className=\"text-muted-foreground w-14 text-right tabular-nums\">{call.ms} ms</span>\n </li>\n ))}\n </ul>\n )}\n </FieldSet>\n </>\n ) : null}\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.auditLog}</FieldLegend>\n <FieldDescription>{t.auditLogHint}</FieldDescription>\n <code\n className=\"bg-muted/50 block truncate border px-3 py-2 text-left font-mono text-xs [direction:rtl]\"\n title={status.audit_log}\n >\n <bdi>{status.audit_log}</bdi>\n </code>\n </FieldSet>\n </FieldGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { PlusIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { NativeSelect, NativeSelectOption } from \"~/ui/primitives/native-select.js\"\nimport { Progress } from \"~/ui/primitives/progress.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's language models: which provider and model each of the\n * app's slots uses, the providers the user added with their keys, and downloads with progress.\n *\n * The api is INJECTED and its types are declared here, shaped like the JSON of scorix's\n * `mod:llm:*` commands, so an app maps each method to one `invoke` call. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * Keys never come back from the api: a provider lists which secret fields hold a value, and the\n * form sends only the ones the user typed into or cleared.\n */\n\nexport type LlmCapability = \"chat\" | \"embed\" | \"vision\" | \"audio\" | \"tools\" | \"transcribe\" | (string & {})\n\nexport interface LlmField {\n key: string\n label: string\n kind: \"text\" | \"url\" | \"secret\" | \"bool\"\n required: boolean\n default?: string\n description?: string\n}\n\nexport interface LlmDriver {\n name: string\n fields: LlmField[]\n}\n\nexport interface LlmProvider {\n id: string\n /** Absent for a provider the app runs itself. */\n driver?: string\n values: Record<string, string>\n /** The secret fields that hold a value; never the value. */\n secrets: string[]\n capabilities: LlmCapability[]\n local: boolean\n /** Can download and delete models. */\n manages: boolean\n editable: boolean\n error?: string\n}\n\nexport interface LlmSlot {\n name: string\n label: string\n description?: string\n needs: LlmCapability[]\n local_only: boolean\n provider?: string\n model?: string\n error?: string\n}\n\nexport interface LlmState {\n providers: LlmProvider[]\n slots: LlmSlot[]\n}\n\nexport interface LlmModel {\n id: string\n size?: number\n parameter_size?: string\n quantization?: string\n}\n\nexport interface LlmFound {\n name: string\n driver: string\n base_url: string\n version?: string\n}\n\nexport interface LlmProviderInput {\n id: string\n driver: string\n values: Record<string, string>\n /** Only the secret fields being changed; an empty string removes one. */\n secrets: Record<string, string>\n}\n\nexport interface LlmPullProgress {\n provider: string\n model: string\n status: string\n done: number\n total: number\n}\n\nexport interface LlmSettingsApi {\n state(): Promise<LlmState>\n drivers(): Promise<LlmDriver[]>\n saveProvider(input: LlmProviderInput): Promise<LlmState>\n deleteProvider(id: string): Promise<LlmState>\n bind(slot: string, provider: string, model: string): Promise<LlmState>\n unbind(slot: string): Promise<LlmState>\n models(provider: string): Promise<LlmModel[]>\n /** Without these three there is no download button. */\n pull?(provider: string, model: string): Promise<boolean>\n cancelPull?(provider: string, model: string): Promise<boolean>\n onPull?(cb: (p: LlmPullProgress) => void): () => void\n /** Runtimes already running on this machine, offered as providers to add. */\n detect?(): Promise<LlmFound[]>\n}\n\nexport interface LlmSettingsLabels {\n slots?: string\n slotsHint?: string\n notSet?: string\n model?: string\n modelHint?: string\n localOnly?: string\n localOnlyHint?: string\n download?: string\n notDownloaded?: string\n cancel?: string\n providers?: string\n providersHint?: string\n providersEmpty?: string\n add?: string\n edit?: string\n remove?: string\n removeConfirm?: string\n keep?: string\n byApp?: string\n thisMachine?: string\n remote?: string\n keySaved?: string\n driver?: string\n id?: string\n idHint?: string\n save?: string\n keyKeep?: string\n keyRemove?: string\n running?: string\n addFound?: string\n retry?: string\n capabilities?: Partial<Record<string, string>>\n}\n\nconst FALLBACK: Required<Omit<LlmSettingsLabels, \"capabilities\">> = {\n slots: \"Models for this app\",\n slotsHint: \"Each feature uses the provider and model chosen here.\",\n notSet: \"Not set\",\n model: \"Model\",\n modelHint: \"Type a name or pick one the provider has.\",\n localOnly: \"This machine only\",\n localOnlyHint: \"What this feature reads never leaves the computer.\",\n download: \"Download\",\n notDownloaded: \"Not on this computer yet\",\n cancel: \"Cancel\",\n providers: \"Providers\",\n providersHint: \"Services and programs that run models.\",\n providersEmpty: \"No provider yet.\",\n add: \"Add provider\",\n edit: \"Edit\",\n remove: \"Remove\",\n removeConfirm: \"Remove\",\n keep: \"Keep\",\n byApp: \"run by the app\",\n thisMachine: \"this machine\",\n remote: \"remote\",\n keySaved: \"key saved\",\n driver: \"Type\",\n id: \"Name\",\n idHint: \"Lowercase letters, digits, dot, dash and underscore.\",\n save: \"Save\",\n keyKeep: \"Saved; leave empty to keep it\",\n keyRemove: \"Remove key\",\n running: \"Running on this computer\",\n addFound: \"Add\",\n retry: \"Retry\",\n}\n\nconst CAPABILITY: Record<string, string> = {\n chat: \"chat\",\n embed: \"embeddings\",\n vision: \"vision\",\n audio: \"audio\",\n tools: \"tools\",\n transcribe: \"speech to text\",\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction hostOf(url: string | undefined): string {\n if (!url) return \"\"\n try {\n const u = new URL(url)\n return u.host + (u.pathname === \"/\" ? \"\" : u.pathname)\n } catch {\n return url\n }\n}\n\n// Ollama reports each layer on its own, and after the weights come a license and a template of a\n// few KB: in whole megabytes they would read \"0 MB / 0 MB\".\nfunction sizeOf(bytes: number): string {\n if (bytes >= 1 << 30) return `${(bytes / (1 << 30)).toFixed(1)} GB`\n if (bytes >= 1 << 20) return `${Math.round(bytes / (1 << 20))} MB`\n return `${Math.ceil(bytes / 1024)} KB`\n}\n\n// The same test the module applies on bind, so the list offers only what it would accept.\nfunction serves(slot: LlmSlot, p: LlmProvider): boolean {\n return slot.needs.every((c) => p.capabilities.includes(c)) && (!slot.local_only || p.local)\n}\n\ninterface Draft {\n /** Set when editing; a new provider has none yet. */\n existing?: LlmProvider\n driver: string\n id: string\n values: Record<string, string>\n secrets: Record<string, string>\n}\n\n// A provider id has no slash, so this cannot join two different pairs into one key.\nconst pullKey = (provider: string, model: string) => `${provider}/${model}`\n\nexport function LlmSettings({\n api,\n labels,\n className,\n}: {\n api: LlmSettingsApi\n labels?: LlmSettingsLabels\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const cap = (c: string) => labels?.capabilities?.[c] ?? CAPABILITY[c] ?? c\n const id = React.useId()\n const [state, setState] = React.useState<LlmState | null>(null)\n const [drivers, setDrivers] = React.useState<LlmDriver[]>([])\n const [found, setFound] = React.useState<LlmFound[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [draft, setDraft] = React.useState<Draft | null>(null)\n const [draftError, setDraftError] = React.useState<string | null>(null)\n const [removing, setRemoving] = React.useState<string | null>(null)\n const [models, setModels] = React.useState<Record<string, LlmModel[]>>({})\n const [typed, setTyped] = React.useState<Record<string, string>>({})\n const [pulls, setPulls] = React.useState<Record<string, LlmPullProgress>>({})\n\n const load = React.useCallback(() => {\n setLoadError(null)\n Promise.all([api.state(), api.drivers()]).then(\n ([s, d]) => {\n setState(s)\n setDrivers(d)\n },\n (err: unknown) => setLoadError(messageOf(err)),\n )\n // Offered, not required: a screen with nothing detected is a normal one.\n api.detect?.().then(setFound, () => {})\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onPull) return\n return api.onPull((p) => setPulls((prev) => ({ ...prev, [pullKey(p.provider, p.model)]: p })))\n }, [api])\n\n const listModels = React.useCallback(\n (provider: string) => {\n api.models(provider).then(\n (ms) => setModels((prev) => ({ ...prev, [provider]: ms })),\n // A provider that cannot list its models still takes a typed name.\n () => setModels((prev) => ({ ...prev, [provider]: [] })),\n )\n },\n [api],\n )\n\n const bound = React.useMemo(() => new Set((state?.slots ?? []).map((s) => s.provider).filter(Boolean) as string[]), [state])\n React.useEffect(() => {\n for (const p of bound) if (!(p in models)) listModels(p)\n }, [bound, models, listModels])\n\n const change = async (action: () => Promise<LlmState>) => {\n setBusy(true)\n setError(null)\n try {\n setState(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n if (!state) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n const provider = (pid: string | undefined) => state.providers.find((p) => p.id === pid)\n\n const saveDraft = async () => {\n if (!draft) return\n const d = drivers.find((x) => x.name === draft.driver)\n const values: Record<string, string> = {}\n const secrets: Record<string, string> = {}\n for (const f of d?.fields ?? []) {\n if (f.kind !== \"secret\") {\n if (draft.values[f.key]) values[f.key] = draft.values[f.key] as string\n } else if (f.key in draft.secrets) {\n secrets[f.key] = draft.secrets[f.key] as string\n }\n }\n setBusy(true)\n setDraftError(null)\n try {\n setState(await api.saveProvider({ id: draft.id, driver: draft.driver, values, secrets }))\n setModels((prev) => {\n const next = { ...prev }\n delete next[draft.id]\n return next\n })\n setDraft(null)\n } catch (err) {\n // Kept next to the form, which stays open with what was typed.\n setDraftError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n const startDraft = (next: Draft) => {\n setDraft(next)\n setDraftError(null)\n setRemoving(null)\n }\n\n const newDraft = (driver: string, values: Record<string, string> = {}, name = driver): Draft => {\n const taken = new Set(state.providers.map((p) => p.id))\n let pid = name\n for (let i = 2; taken.has(pid); i++) pid = `${name}-${i}`\n return { driver, id: pid, values, secrets: {} }\n }\n\n const form = (d: Draft) => {\n const spec = drivers.find((x) => x.name === d.driver)\n const set = (patch: Partial<Draft>) => setDraft({ ...d, ...patch })\n return (\n <div className=\"bg-muted/30 flex flex-col gap-3 border px-3 py-3\" data-testid=\"provider-form\">\n {draftError ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{draftError}</AlertDescription>\n </Alert>\n ) : null}\n {d.existing ? null : (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <Field>\n <FieldLabel htmlFor={`${id}-driver`}>{t.driver}</FieldLabel>\n <NativeSelect id={`${id}-driver`} value={d.driver} onChange={(e) => set(newDraft(e.target.value))}>\n {drivers.map((x) => (\n <NativeSelectOption key={x.name} value={x.name}>\n {x.name}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n </Field>\n <Field>\n <FieldLabel htmlFor={`${id}-id`}>{t.id}</FieldLabel>\n <Input id={`${id}-id`} value={d.id} spellCheck={false} onChange={(e) => set({ id: e.target.value.toLowerCase() })} />\n <FieldDescription>{t.idHint}</FieldDescription>\n </Field>\n </div>\n )}\n {spec?.fields.map((f) => {\n const fid = `${id}-f-${f.key}`\n if (f.kind === \"bool\") {\n const on = (d.values[f.key] ?? f.default ?? \"false\") === \"true\"\n return (\n <Field key={f.key} orientation=\"horizontal\">\n <FieldContent>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </FieldContent>\n <Switch id={fid} size=\"sm\" checked={on} onCheckedChange={(v) => set({ values: { ...d.values, [f.key]: v ? \"true\" : \"false\" } })} />\n </Field>\n )\n }\n if (f.kind === \"secret\") {\n const saved = d.existing?.secrets.includes(f.key) ?? false\n const cleared = d.secrets[f.key] === \"\" && saved\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={fid}\n type=\"password\"\n autoComplete=\"off\"\n placeholder={saved && !cleared ? t.keyKeep : undefined}\n value={d.secrets[f.key] ?? \"\"}\n onChange={(e) => {\n const secrets = { ...d.secrets, [f.key]: e.target.value }\n // Emptied again: back to \"leave it as it is\", not \"remove it\".\n if (e.target.value === \"\" && !cleared) delete secrets[f.key]\n set({ secrets })\n }}\n />\n {saved && !cleared ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => set({ secrets: { ...d.secrets, [f.key]: \"\" } })}>\n {t.keyRemove}\n </Button>\n ) : null}\n </div>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n }\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <Input\n id={fid}\n type={f.kind === \"url\" ? \"url\" : \"text\"}\n spellCheck={false}\n placeholder={f.default}\n required={f.required}\n value={d.values[f.key] ?? \"\"}\n onChange={(e) => set({ values: { ...d.values, [f.key]: e.target.value } })}\n />\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n })}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setDraft(null)}>\n {t.cancel}\n </Button>\n <Button size=\"sm\" disabled={busy || !d.id} onClick={() => void saveDraft()}>\n {t.save}\n </Button>\n </div>\n </div>\n )\n }\n\n const unused = found.filter((f) => !state.providers.some((p) => p.values.base_url === f.base_url))\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long URL\n // would widen the whole screen instead of truncating.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.slots}</FieldLegend>\n <FieldDescription>{t.slotsHint}</FieldDescription>\n <ul className=\"divide-y border\">\n {state.slots.map((slot) => {\n const current = provider(slot.provider)\n const choices = state.providers.filter((p) => p.id === slot.provider || serves(slot, p))\n const known = slot.provider ? models[slot.provider] : undefined\n const draftModel = typed[slot.name] ?? slot.model ?? \"\"\n // Downloads follow the model the slot is bound to, not the text being typed: a\n // button that came and went with every keystroke would offer half a name.\n const chosen = slot.model ?? \"\"\n const pull = current ? pulls[pullKey(current.id, chosen)] : undefined\n const pulling = pull !== undefined\n const missing = known !== undefined && chosen !== \"\" && !known.some((m) => m.id === chosen)\n const commit = () => {\n if (!slot.provider || draftModel === (slot.model ?? \"\")) return\n void change(() => api.bind(slot.name, slot.provider as string, draftModel))\n }\n return (\n <li key={slot.name} className=\"flex flex-col gap-2 px-3 py-3\" data-testid={`slot-${slot.name}`}>\n <div className=\"flex flex-wrap items-start gap-x-6 gap-y-2\">\n <div className=\"min-w-40 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{slot.label}</span>\n {slot.local_only ? (\n <Badge variant=\"outline\" title={t.localOnlyHint}>\n {t.localOnly}\n </Badge>\n ) : null}\n </div>\n {slot.description ? <p className=\"text-muted-foreground text-xs\">{slot.description}</p> : null}\n </div>\n <div className=\"flex w-full gap-2 sm:w-auto\">\n <NativeSelect\n aria-label={`${slot.label}: ${t.providers}`}\n className=\"sm:w-40\"\n value={slot.provider ?? \"\"}\n disabled={busy}\n onChange={(e) => {\n const next = e.target.value\n setTyped((prev) => {\n const rest = { ...prev }\n delete rest[slot.name]\n return rest\n })\n void change(() => (next ? api.bind(slot.name, next, \"\") : api.unbind(slot.name)))\n }}\n >\n <NativeSelectOption value=\"\">{t.notSet}</NativeSelectOption>\n {choices.map((p) => (\n <NativeSelectOption key={p.id} value={p.id}>\n {p.id}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n <Input\n aria-label={`${slot.label}: ${t.model}`}\n title={t.modelHint}\n // Chrome draws the datalist arrow in solid black, louder than anything else here.\n className=\"sm:w-56 [&::-webkit-calendar-picker-indicator]:opacity-30\"\n list={`${id}-models-${slot.name}`}\n spellCheck={false}\n placeholder={t.model}\n disabled={busy || !slot.provider}\n value={draftModel}\n onChange={(e) => setTyped((prev) => ({ ...prev, [slot.name]: e.target.value }))}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit()\n }}\n />\n <datalist id={`${id}-models-${slot.name}`}>\n {known?.map((m) => (\n <option key={m.id} value={m.id}>\n {[m.parameter_size, m.quantization, m.size ? sizeOf(m.size) : \"\"].filter(Boolean).join(\" · \")}\n </option>\n ))}\n </datalist>\n </div>\n </div>\n {slot.error ? <p className=\"text-destructive text-xs\">{slot.error}</p> : null}\n {current?.manages && api.pull && missing && !pulling ? (\n <div className=\"flex items-center justify-end gap-3\">\n <span className=\"text-muted-foreground text-xs\">{t.notDownloaded}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => {\n const key = pullKey(current.id, chosen)\n const end = () =>\n setPulls((prev) => {\n const rest = { ...prev }\n delete rest[key]\n return rest\n })\n setPulls((prev) => ({ ...prev, [key]: { provider: current.id, model: chosen, status: \"\", done: 0, total: 0 } }))\n api.pull?.(current.id, chosen).then(\n (done) => {\n end()\n if (done) listModels(current.id)\n },\n (err: unknown) => {\n end()\n setError(messageOf(err))\n },\n )\n }}\n >\n {t.download} {chosen}\n </Button>\n </div>\n ) : null}\n {pulling && current ? (\n <div className=\"flex items-center gap-3\" data-testid={`pull-${slot.name}`}>\n <Progress className=\"flex-1\" value={pull.total > 0 ? (pull.done / pull.total) * 100 : 0} />\n <span className=\"text-muted-foreground w-28 text-right text-xs tabular-nums\">\n {pull.total > 0 ? `${sizeOf(pull.done)} / ${sizeOf(pull.total)}` : pull.status}\n </span>\n {api.cancelPull ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => void api.cancelPull?.(current.id, pull.model)}>\n {t.cancel}\n </Button>\n ) : null}\n </div>\n ) : null}\n </li>\n )\n })}\n </ul>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <FieldLegend>{t.providers}</FieldLegend>\n <FieldDescription>{t.providersHint}</FieldDescription>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={busy || drivers.length === 0}\n onClick={() => startDraft(newDraft(drivers[0]?.name ?? \"\"))}\n >\n <PlusIcon />\n {t.add}\n </Button>\n </div>\n {draft && !draft.existing ? form(draft) : null}\n {state.providers.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.providersEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {state.providers.map((p) =>\n draft?.existing?.id === p.id ? (\n <li key={p.id} className=\"p-0\">\n {form(draft)}\n </li>\n ) : (\n <li key={p.id} className=\"flex items-center gap-3 px-3 py-2\" data-testid={`provider-${p.id}`}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{p.id}</span>\n {/* A provider named after its driver, as a detected one is, says it once. */}\n {p.driver !== p.id ? <span className=\"text-muted-foreground text-xs\">{p.driver ?? t.byApp}</span> : null}\n </div>\n <div className=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs [&>*:not(:first-child)]:before:mr-2 [&>*:not(:first-child)]:before:content-['·']\">\n {p.values.base_url ? (\n <span className=\"max-w-64 truncate font-mono\" title={p.values.base_url}>\n {hostOf(p.values.base_url)}\n </span>\n ) : null}\n <span>{p.local ? t.thisMachine : t.remote}</span>\n {p.secrets.length > 0 ? <span>{t.keySaved}</span> : null}\n {p.capabilities.length > 0 ? <span>{p.capabilities.map(cap).join(\", \")}</span> : null}\n </div>\n {p.error ? <p className=\"text-destructive text-xs\">{p.error}</p> : null}\n </div>\n {p.editable ? (\n removing === p.id ? (\n <>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setRemoving(null)}>\n {t.keep}\n </Button>\n <Button\n size=\"xs\"\n variant=\"destructive\"\n disabled={busy}\n onClick={() => {\n setRemoving(null)\n void change(() => api.deleteProvider(p.id))\n }}\n >\n {t.removeConfirm} {p.id}\n </Button>\n </>\n ) : (\n <>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.edit} ${p.id}`}\n disabled={busy}\n onClick={() => startDraft({ existing: p, driver: p.driver ?? \"\", id: p.id, values: { ...p.values }, secrets: {} })}\n >\n {t.edit}\n </Button>\n <Button size=\"xs\" variant=\"ghost\" aria-label={`${t.remove} ${p.id}`} disabled={busy} onClick={() => setRemoving(p.id)}>\n {t.remove}\n </Button>\n </>\n )\n ) : null}\n </li>\n ),\n )}\n </ul>\n )}\n {unused.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-muted-foreground text-xs\">{t.running}</p>\n <ul className=\"divide-y border border-dashed\">\n {unused.map((f) => (\n <li key={f.base_url} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-sm\">{f.name}</span>\n {f.version ? <span className=\"text-muted-foreground text-xs\">{f.version}</span> : null}\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate font-mono text-xs\">{f.base_url}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n aria-label={`${t.addFound} ${f.name}`}\n disabled={busy || !drivers.some((d) => d.name === f.driver)}\n onClick={() => startDraft(newDraft(f.driver, { base_url: f.base_url }, f.name))}\n >\n {t.addFound}\n </Button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </FieldSet>\n </FieldGroup>\n )\n}\n","/**\n * Plates: the palette a reader picks, applied by putting `data-plate` on any element.\n *\n * This module holds NAMES and nothing else. The colours live once, in `styles/globals.css`, and a\n * swatch reads them the same way the rest of the UI does - by sitting inside a `data-plate` scope\n * and using `bg-primary`. Copying the values here would be the second table that drifts.\n *\n * Absent `data-plate`, `--primary` is lyra's neutral. That is the default every app ships with, so\n * adopting plates costs an app nothing until a reader chooses.\n */\nexport const PLATES = [\n \"pink\",\n \"rose\",\n \"crimson\",\n \"rust\",\n \"orange\",\n \"ochre\",\n \"amber\",\n \"honey\",\n \"gold\",\n \"olive\",\n \"lime\",\n \"green\",\n \"teal\",\n \"cyan\",\n \"azure\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"magenta\",\n] as const\n\nexport type Plate = (typeof PLATES)[number]\n\n/**\n * The plates certified to be told apart from each other, not merely from the status tokens.\n *\n * Only these may carry MEANING. The distinction is not decorative: a plate a reader picks for\n * pleasure needs no relation to anyone else's, but a plate that says \"which space you are typing\n * into\" stops working the moment two of them look alike - so that use gets the subset measured at\n * dE76 >= 29.7 pairwise, in both themes.\n */\nexport const BEARING_PLATES = [\n \"pink\",\n \"rust\",\n \"amber\",\n \"olive\",\n \"green\",\n \"teal\",\n \"azure\",\n \"blue\",\n \"violet\",\n] as const\n\nexport type BearingPlate = (typeof BEARING_PLATES)[number]\n\nexport function isPlate(s: string): s is Plate {\n return (PLATES as readonly string[]).includes(s)\n}\n\n/**\n * The plate for an id, from the certified subset.\n *\n * Derived, never chosen, and that is the point when the colour is a fence rather than a preference:\n * if two organisations could both pick blue the signal stops working for both of them. Deriving on\n * the CLIENT is deliberate too - the alternative is every server that shows a coloured surface\n * keeping its own copy of the name list, which is the shape chat ended up in (a Go slice, a CSS\n * block and a TS union, with nothing holding them together).\n *\n * FNV-1a rather than a cryptographic hash: this picks a colour, so spreading matters and secrecy\n * does not, and it stays synchronous - SubtleCrypto would make every call site async for nothing.\n */\nexport function derivePlate(id: string): BearingPlate {\n let h = 0x811c9dc5\n for (let i = 0; i < id.length; i++) {\n h ^= id.charCodeAt(i)\n h = Math.imul(h, 0x01000193) >>> 0\n }\n return BEARING_PLATES[h % BEARING_PLATES.length]!\n}\n","\"use client\"\n\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\nimport { RadioGroup } from \"~/ui/primitives/radio-group.js\"\nimport { cn } from \"~/utils/cn.js\"\nimport { PLATES, isPlate, type Plate } from \"./plate.js\"\n\n/**\n * Pick a plate, or none.\n *\n * Presentation only: it takes the current value and hands back the next one. Where the choice is\n * stored is the app's business - a session preference on the web, a config file in a scorix shell -\n * and keeping that out of here is what lets one component serve both, since a desktop shell has no\n * session to read.\n *\n * Built on lyra's own `RadioGroup`, not on a row of buttons. The first version hand-rolled\n * `role=\"radiogroup\"` over twenty tabbable buttons, which CLAIMED radio semantics and delivered\n * something else: twenty tab stops instead of one, and no arrow keys. Radix gives the roving tabindex\n * and the arrow-key navigation, and `RadioGroupItem` is simply a different styling of the same item -\n * a dot - so the swatch uses the primitive item directly.\n *\n * `null` is a real option, not an empty state: the neutral default is what every app ships, so a\n * reader who tried a colour has to be able to get back. It sits first because that is where a reader\n * looks for \"undo\". Radix values are strings, so it travels as a sentinel.\n */\nconst NONE = \"none\"\n\nexport interface PlatePickerProps {\n value: Plate | null\n onChange: (plate: Plate | null) => void\n /** Accessible name for the group, e.g. \"Accent colour\". */\n label: string\n /** Accessible name for the neutral option, e.g. \"Default\". */\n resetLabel: string\n /**\n * Translated name per plate. Falls back to the plate's own key, which is English - fine for a\n * developer tool, wrong for a product, and the reason this is a prop rather than a table in here.\n */\n plateLabels?: Partial<Record<Plate, string>>\n className?: string\n}\n\nexport function PlatePicker({ value, onChange, label, resetLabel, plateLabels, className }: PlatePickerProps) {\n // The selected ring is drawn INSIDE the swatch (a negative outline offset), not around it.\n // An outer ring needs 4px of room beyond the box, and the leftmost swatch of the first row rarely\n // has it: lyra's own `Panel` scrolls its content with `overflow-y-auto` and `pr-1`, and once one\n // axis is not `visible` CSS computes the other as `auto` too - so the left and top of that ring got\n // clipped with nothing to say why. Padding the picker would fix it only for containers that clip\n // exactly at this edge; drawing inside is true wherever it is mounted.\n const swatch =\n \"size-7 shrink-0 rounded-none border outline-2 -outline-offset-[3px] outline-transparent focus-visible:ring-2 focus-visible:ring-ring\"\n\n return (\n <RadioGroup\n aria-label={label}\n value={value ?? NONE}\n onValueChange={v => onChange(isPlate(v) ? v : null)}\n className={cn(\"flex w-auto flex-wrap gap-2\", className)}\n >\n <RadioGroupPrimitive.Item\n value={NONE}\n aria-label={resetLabel}\n title={resetLabel}\n className={cn(swatch, \"bg-muted border-border data-checked:outline-foreground\")}\n />\n {PLATES.map(p => (\n <RadioGroupPrimitive.Item\n key={p}\n value={p}\n aria-label={plateLabels?.[p] ?? p}\n title={plateLabels?.[p] ?? p}\n data-plate={p}\n // `outline-primary-foreground` inside a `data-plate` scope is the one colour measured to\n // clear 4.5:1 against this exact plate, so the ring is legible on every one of them -\n // including the yellows, where a dark ring is needed and a light one would vanish.\n className={cn(swatch, \"bg-primary border-transparent data-checked:outline-primary-foreground\")}\n />\n ))}\n </RadioGroup>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useSyncExternalStore } from \"react\"\n\n/**\n * Preferences that belong to the DEVICE, not the account.\n *\n * Same granularity as the theme, and stored the same way, so a reader who has learned what \"dark\n * mode here but not on my laptop\" means already knows what a plate does. The account-wide version\n * would need a session, which a scorix shell does not have.\n *\n * ABSENT MEANS DEFAULT, in the store as well as in the markup. Turning a preference off removes its\n * key instead of writing \"off\", so there is one representation of \"no plate\" rather than two - the\n * stylesheet already says so (no `data-plate` resolves to lyra's neutral), and a store that\n * disagreed would make `null` and `\"\"` behave differently for no reason a caller could see.\n */\nexport const PLATE_KEY = \"lyra.plate\"\nexport const COMPACT_KEY = \"lyra.compact\"\n\nconst listeners = new Map<string, Set<() => void>>()\n\nfunction read(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n // Private windows and blocked site data throw on access rather than returning null.\n return null\n }\n}\n\n/**\n * Reads go through `useSyncExternalStore`, not `useState` plus an effect.\n *\n * localStorage is an external store in the precise sense React means: another tab can change it\n * underneath us. The `storage` event covers that, but it does NOT fire in the tab that wrote, so a\n * same-tab write needs its own notification or the picker would show the old swatch until something\n * else re-rendered it. One subscribe carries both paths.\n *\n * The server snapshot is `null` so SSR renders the default and the inline script (see\n * `preference-script.tsx`) is what paints the stored value.\n */\nexport function useStoredSetting(key: string): [string | null, (value: string | null) => void] {\n const subscribe = useCallback(\n (onChange: () => void) => {\n const set = listeners.get(key) ?? new Set<() => void>()\n listeners.set(key, set)\n set.add(onChange)\n const onStorage = (e: StorageEvent) => {\n if (e.key === key) onChange()\n }\n window.addEventListener(\"storage\", onStorage)\n return () => {\n set.delete(onChange)\n window.removeEventListener(\"storage\", onStorage)\n }\n },\n [key],\n )\n\n const value = useSyncExternalStore(\n subscribe,\n () => read(key),\n () => null,\n )\n\n const store = useCallback((next: string | null) => {\n try {\n if (next === null) localStorage.removeItem(key)\n else localStorage.setItem(key, next)\n } catch {\n // A refused write means the choice does not take effect at all, not merely that it fails to\n // survive a reload: the next read returns the old value and the swatch snaps back. Measured,\n // not assumed. It is left that way because the theme does exactly the same under the same\n // condition, and a session-only copy here would make the plate outlive a theme set beside it.\n }\n listeners.get(key)?.forEach(l => l())\n }, [key])\n\n return [value, store]\n}\n\n/**\n * Applied to `<html>`, never to a wrapper element.\n *\n * A Radix portal mounts as a child of `body`, so it inherits custom properties from `body` and from\n * `html` but from no div in between. A plate scoped to an app frame therefore leaves every dialog,\n * popover and toast on the neutral default while the page behind them is tinted. chat does exactly\n * that with its space accent.\n */\nexport function useRootAttribute(name: string, value: string | null) {\n useEffect(() => {\n const root = document.documentElement\n if (value === null) root.removeAttribute(name)\n else root.setAttribute(name, value)\n }, [name, value])\n}\n","\"use client\"\n\nimport { PLATE_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\nimport { isPlate, type Plate } from \"./plate.js\"\n\n/**\n * The plate this device is set to, and a way to change it.\n *\n * A stored name that is no longer a plate - a rename, a downgrade to an older lyra - reads as no\n * plate. The alternative is an attribute no rule matches, which looks identical to the neutral\n * default on screen while the picker shows nothing selected at all, so the reader cannot tell that\n * their choice was dropped or get back to a known state.\n */\nexport function usePlate(): [Plate | null, (plate: Plate | null) => void] {\n const [stored, store] = useStoredSetting(PLATE_KEY)\n const plate = stored !== null && isPlate(stored) ? stored : null\n useRootAttribute(\"data-plate\", plate)\n return [plate, store]\n}\n","\"use client\"\n\nimport { useCallback } from \"react\"\nimport { COMPACT_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\n\nexport function useCompact(): [boolean, (compact: boolean) => void] {\n const [stored, store] = useStoredSetting(COMPACT_KEY)\n const compact = stored === \"true\"\n const setCompact = useCallback((next: boolean) => store(next ? \"true\" : null), [store])\n useRootAttribute(\"data-compact\", compact ? \"true\" : null)\n return [compact, setCompact]\n}\n","import { COMPACT_KEY, PLATE_KEY } from \"./device-setting.js\"\n\n/**\n * Paints the stored plate and density BEFORE the first frame.\n *\n * Without it the attributes arrive from an effect, so the first paint is always the neutral default\n * and every reader who chose a colour watches it flip. This is the trick `next-themes` uses for the\n * same reason, and the reason it works is that localStorage is synchronous: a preference held behind\n * an async query cannot be read here at all.\n *\n * The stored name is applied WITHOUT checking it against the plate list. An unknown name matches no\n * rule in the stylesheet, so it paints exactly like the neutral default, and the hook removes it on\n * hydration; carrying the list in here would put a second copy of it in every page's HTML for a\n * case that is already indistinguishable on screen.\n *\n * Mount it as early in the tree as the app allows, and keep it a raw `script`: an inline\n * `next/script` with `beforeInteractive` is emitted after the head closes rather than inside it, so\n * it no longer runs where that flag promises. A Content-Security-Policy without `unsafe-inline` for\n * `script-src` drops it silently, and the only symptom either way is the flip coming back.\n */\nconst SCRIPT =\n `try{var d=document.documentElement,p=localStorage.getItem(\"${PLATE_KEY}\");` +\n `if(p)d.setAttribute(\"data-plate\",p);` +\n `if(localStorage.getItem(\"${COMPACT_KEY}\")===\"true\")d.setAttribute(\"data-compact\",\"true\")}catch(e){}`\n\nexport function PreferenceScript() {\n return <script dangerouslySetInnerHTML={{ __html: SCRIPT }} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/blocks/form.tsx","../../src/blocks/panel.tsx","../../src/blocks/confirm/confirm-dialog.tsx","../../src/blocks/confirm/confirm-provider.tsx","../../src/blocks/confirm/use-confirm.tsx","../../src/blocks/tree/index.tsx","../../src/blocks/tz-picker.tsx","../../src/blocks/option-picker.tsx","../../src/blocks/mcp-settings.tsx","../../src/blocks/llm-settings.tsx","../../src/blocks/plate.ts","../../src/blocks/plate-picker.tsx","../../src/blocks/device-setting.ts","../../src/blocks/use-plate.ts","../../src/blocks/use-compact.ts","../../src/blocks/preference-script.tsx"],"names":["React","jsx","jsxs","createContext","useState","useContext","useId","React2","React3","FALLBACK","React4","messageOf","provider","Fragment","RadioGroupPrimitive","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["\nimport * as React from \"react\"\nimport { type Label as LabelPrimitive, Slot } from \"radix-ui\"\nimport { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues } from \"react-hook-form\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Label } from \"~/ui/primitives/label.js\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext || {}\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"grid gap-2\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return <Label data-slot=\"form-label\" data-error={!!error} className={cn(\"data-[error=true]:text-destructive\", className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p data-slot=\"form-message\" id={formMessageId} className={cn(\"text-destructive text-sm\", className)} {...props}>\n {body}\n </p>\n )\n}\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField }\n","\nimport { type ReactNode, useState } from \"react\"\nimport { type LucideIcon } from \"lucide-react\"\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"~/ui/primitives/card.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype PanelItemType = {\n key: string\n label: string\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n content: ReactNode\n}\n\n/**\n * No URL binding, on purpose.\n *\n * An `enable_url` prop used to mirror the open item into a query param, and that made this file\n * import `next/navigation` at module scope. Since the `blocks` barrel re-exports everything, one\n * import here made the WHOLE barrel require Next, so anything that is not itself a Next app could\n * not import any block at all - which is how nekit broke. The prop had no caller in any of the 26\n * consumers, and `name` existed only to build its query key, so both came out with the router.\n */\nexport function Panel({ items }: { items: PanelItemType[] }) {\n const [active, setActive] = useState(items[0]?.key)\n\n const current = items.find(s => s.key === active) ?? items[0]\n if (!current) return null\n\n return (\n <div className=\"space-y-6 h-full min-h-0 flex flex-col\">\n {/* Mobi */}\n <div className=\"lg:hidden\">\n <div className=\"inline-flex rounded-lg bg-muted p-1\">\n {items?.map(s => (\n <button\n key={s.key}\n onClick={() => setActive(s.key)}\n className={cn(\n \"rounded-md px-3 py-1.5 text-sm transition-all\",\n active === s.key ? \"bg-background text-foreground shadow-sm\" : s.danger ? \"text-destructive\" : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <span className=\"relative flex items-center gap-2\">\n {s.icon && <s.icon className=\"h-4 w-4\" />}\n {s.label}\n {s.hasError && <span className=\"absolute -top-1 -right-2 flex h-2 w-2 rounded-full bg-destructive\" />}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Desktop */}\n <div className=\"grid grid-cols-1 gap-8 lg:grid-cols-[240px_1fr] flex-1 min-h-0\">\n {/* Sidebar */}\n <aside className=\"hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">\n {items?.map(s => (\n <PanelItem key={s.key} active={active === s.key} icon={s.icon} danger={s.danger} hasError={s.hasError} onClick={() => setActive(s.key)}>\n {s.label}\n </PanelItem>\n ))}\n </aside>\n {/* Content */}\n <div className=\"space-y-6 overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">{current.content}</div>\n </div>\n </div>\n )\n}\n\nexport interface PanelItemProps {\n children: ReactNode\n active?: boolean\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n onClick?: () => void\n}\n\nfunction PanelItem({ children, active, icon: Icon, danger, hasError, onClick }: PanelItemProps) {\n return (\n <div\n onClick={onClick}\n className={cn(\n \"cursor-pointer rounded-md px-3 py-2 text-sm transition-colors flex items-center justify-between\",\n active ? \"bg-muted font-medium\" : danger ? \"text-destructive hover:bg-destructive/10\" : \"text-muted-foreground hover:bg-muted\"\n )}\n >\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n {children}\n </span>\n {hasError && <span className=\"h-2 w-2 rounded-full bg-destructive\" />}\n </div>\n )\n}\n\nexport interface PanelCardProps {\n title: string\n description?: string\n hint?: string\n action?: ReactNode\n children?: ReactNode\n}\n\nexport function PanelCard({ title, description, hint, action, children }: PanelCardProps) {\n return (\n <Card className={cn({ \"pb-3\": hint || action })}>\n <CardHeader>\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && <CardDescription className=\"max-w-2xl\">{description}</CardDescription>}\n </CardHeader>\n {children && <CardContent>{children}</CardContent>}\n {(hint || action) && (\n <CardFooter className=\"flex items-center justify-between border-t !pt-3 !pb-0\">\n <p className=\"text-sm text-muted-foreground\">{hint}</p>\n {action}\n </CardFooter>\n )}\n </Card>\n )\n}\n","\nimport { Dialog, DialogContent, DialogDescription, DialogOverlay, DialogTitle } from \"~/ui/primitives/dialog.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype Props = {\n options: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmDialog({ options, onConfirm, onCancel }: Props) {\n return (\n <Dialog open onOpenChange={val => !val && onCancel()}>\n <DialogOverlay className=\"fixed inset-0 bg-white/10\" />\n <DialogContent className={cn(\"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\", \"p-4 w-[400px]\", \"focus:outline-none\")}>\n <DialogTitle className=\"text-sm font-medium\">{options.title}</DialogTitle>\n {options.description != null && (\n <DialogDescription asChild>\n <div className=\"mt-2 text-sm text-muted-foreground\">{options.description}</div>\n </DialogDescription>\n )}\n\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel}>\n {options.cancelText ?? \"Cancel\"}\n </Button>\n <Button size=\"sm\" onClick={onConfirm} className={cn(options.danger && \"bg-red-600 hover:bg-red-700 text-white\")}>\n {options.confirmText ?? \"Confirm\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\nimport { createContext, type ReactNode, useState } from \"react\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { ConfirmDialog } from \"./confirm-dialog.js\"\n\nexport type ConfirmFn = (options: ConfirmOptions) => Promise<boolean>\n\nexport const ConfirmContext = createContext<ConfirmFn | null>(null)\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n options: ConfirmOptions\n resolve: (v: boolean) => void\n } | null>(null)\n\n const confirm: ConfirmFn = options => new Promise<boolean>(resolve => setState({ options, resolve }))\n\n const close = (result: boolean) => {\n state?.resolve(result)\n setState(null)\n }\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n\n {state && <ConfirmDialog options={state.options} onConfirm={() => close(true)} onCancel={() => close(false)} />}\n </ConfirmContext.Provider>\n )\n}\n","\nimport { useContext } from \"react\"\nimport { ConfirmContext } from \"./confirm-provider.js\"\n\nexport const useConfirm = () => {\n const ctx = useContext(ConfirmContext)\n if (!ctx) {\n throw new Error(\"useConfirm must be used inside ConfirmProvider\")\n }\n return ctx\n}\n","\nimport { ChevronRight, File, Folder, FolderOpen } from \"lucide-react\"\nimport { createContext, type HTMLAttributes, type ReactNode, useCallback, useContext, useId, useState } from \"react\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype TreeContextType = {\n expandedIds: Set<string>\n selectedIds: string[]\n toggleExpanded: (nodeId: string) => void\n handleSelection: (nodeId: string, ctrlKey: boolean) => void\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n indent?: number\n animateExpand?: boolean\n}\n\nconst TreeContext = createContext<TreeContextType | undefined>(undefined)\n\nconst useTree = () => {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error(\"Tree components must be used within a TreeProvider\")\n }\n return context\n}\n\ntype TreeNodeContextType = {\n nodeId: string\n level: number\n isLast: boolean\n parentPath: boolean[]\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextType | undefined>(undefined)\n\nconst useTreeNode = () => {\n const context = useContext(TreeNodeContext)\n if (!context) {\n throw new Error(\"TreeNode components must be used within a TreeNode\")\n }\n return context\n}\n\nexport type TreeProviderProps = {\n children: ReactNode\n defaultExpandedIds?: string[]\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n selectedIds?: string[]\n onSelectionChange?: (selectedIds: string[]) => void\n expandedIds?: Set<string>\n onExpandedChange?: (expandedIds: Set<string>) => void\n indent?: number\n animateExpand?: boolean\n className?: string\n}\n\nexport const TreeProvider = ({\n children,\n defaultExpandedIds = [],\n showLines = true,\n showIcons = true,\n selectable = true,\n multiSelect = false,\n selectedIds,\n onSelectionChange,\n indent = 20,\n animateExpand = true,\n className,\n expandedIds,\n onExpandedChange,\n}: TreeProviderProps) => {\n const [internalExpandedIds, setInternalExpandedIds] = useState<Set<string>>(new Set(defaultExpandedIds))\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(selectedIds ?? [])\n\n const isControlledSelected = selectedIds !== undefined && onSelectionChange !== undefined\n const currentSelectedIds = isControlledSelected ? selectedIds : internalSelectedIds\n\n const isControlledExpanded = expandedIds !== undefined && onExpandedChange !== undefined\n const currentExpandedIds = isControlledExpanded ? expandedIds : internalExpandedIds\n\n const toggleExpanded = useCallback(\n (nodeId: string) => {\n const newSet = new Set<string>(currentExpandedIds)\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId)\n } else {\n newSet.add(nodeId)\n }\n\n if (isControlledExpanded) {\n onExpandedChange?.(newSet)\n } else {\n setInternalExpandedIds(newSet)\n }\n },\n [currentExpandedIds, isControlledExpanded, onExpandedChange]\n )\n\n const handleSelection = useCallback(\n (nodeId: string, ctrlKey = false) => {\n if (!selectable) {\n return\n }\n\n let newSelection: string[]\n\n if (multiSelect && ctrlKey) {\n newSelection = currentSelectedIds.includes(nodeId) ? currentSelectedIds.filter(id => id !== nodeId) : [...currentSelectedIds, nodeId]\n } else {\n newSelection = currentSelectedIds.includes(nodeId) ? [] : [nodeId]\n }\n\n if (isControlledSelected) {\n onSelectionChange?.(newSelection)\n } else {\n setInternalSelectedIds(newSelection)\n }\n },\n [selectable, multiSelect, currentSelectedIds, isControlledSelected, onSelectionChange]\n )\n\n return (\n <TreeContext.Provider\n value={{\n expandedIds: currentExpandedIds,\n selectedIds: currentSelectedIds,\n toggleExpanded,\n handleSelection,\n showLines,\n showIcons,\n selectable,\n multiSelect,\n indent,\n animateExpand,\n }}\n >\n <div className={cn(\"w-full\", className)}>{children}</div>\n </TreeContext.Provider>\n )\n}\n\nexport type TreeViewProps = HTMLAttributes<HTMLDivElement>\n\nexport const TreeView = ({ className, children, ...props }: TreeViewProps) => (\n <div className={cn(\"p-2\", className)} {...props}>\n {children}\n </div>\n)\n\nexport type TreeNodeProps = HTMLAttributes<HTMLDivElement> & {\n nodeId?: string\n level?: number\n isLast?: boolean\n parentPath?: boolean[]\n children?: ReactNode\n}\n\nexport const TreeNode = ({ nodeId: providedNodeId, level = 0, isLast = false, parentPath = [], children, className, onClick: _onClick, ...props }: TreeNodeProps) => {\n const generatedId = useId()\n const nodeId = providedNodeId ?? generatedId\n\n // Build the parent path - mark positions where the parent was the last child\n const currentPath = level === 0 ? [] : [...parentPath]\n if (level > 0 && parentPath.length < level - 1) {\n // Fill in missing levels with false (not last)\n while (currentPath.length < level - 1) {\n currentPath.push(false)\n }\n }\n if (level > 0) {\n currentPath[level - 1] = isLast\n }\n\n return (\n <TreeNodeContext.Provider\n value={{\n nodeId,\n level,\n isLast,\n parentPath: currentPath,\n }}\n >\n <div className={cn(\"select-none\", className)} {...props}>\n {children}\n </div>\n </TreeNodeContext.Provider>\n )\n}\n\nexport type TreeNodeTriggerProps = HTMLAttributes<HTMLDivElement> & {\n expandOnClick?: boolean\n}\n\nexport const TreeNodeTrigger = ({ children, className, onClick, expandOnClick = false, ...props }: TreeNodeTriggerProps) => {\n const { selectedIds, handleSelection, toggleExpanded, indent } = useTree()\n const { nodeId, level } = useTreeNode()\n const isSelected = selectedIds.includes(nodeId)\n\n return (\n <div\n className={cn(\n \"group relative mx-1 flex cursor-pointer items-center rounded-md px-3 transition-all duration-200\",\n \"hover:bg-accent/50\",\n isSelected && \"bg-accent/80\",\n className\n )}\n style={{ paddingLeft: level * (indent ?? 0) + 8, paddingTop: \"var(--tree-item-py)\", paddingBottom: \"var(--tree-item-py)\" }}\n onClick={e => {\n handleSelection(nodeId, e.ctrlKey || e.metaKey)\n if (expandOnClick) toggleExpanded(nodeId)\n onClick?.(e)\n }}\n onDoubleClick={e => {\n if (e.ctrlKey || e.metaKey) return\n toggleExpanded(nodeId)\n }}\n {...props}\n >\n <TreeLines />\n {children}\n </div>\n )\n}\n\nexport const TreeLines = () => {\n const { showLines, indent } = useTree()\n const { level, isLast, parentPath } = useTreeNode()\n\n if (!showLines || level === 0) {\n return null\n }\n\n return (\n <div className=\"pointer-events-none absolute top-0 bottom-0 left-0\">\n {/* Render vertical lines for all parent levels */}\n {Array.from({ length: level }, (_, index) => {\n const shouldHideLine = parentPath[index] === true\n if (shouldHideLine && index === level - 1) {\n return null\n }\n\n return (\n <div\n className=\"absolute top-0 bottom-0 border-border/40 border-l\"\n key={index.toString()}\n style={{\n left: index * (indent ?? 0) + 12,\n display: shouldHideLine ? \"none\" : \"block\",\n }}\n />\n )\n })}\n\n {/* Horizontal connector line */}\n <div\n className=\"absolute top-1/2 border-border/40 border-t\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n width: (indent ?? 0) - 4,\n transform: \"translateY(-1px)\",\n }}\n />\n\n {/* Vertical line to midpoint for last items */}\n {isLast && (\n <div\n className=\"absolute top-0 border-border/40 border-l\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n height: \"50%\",\n }}\n />\n )}\n </div>\n )\n}\n\nexport type TreeNodeContentProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeNodeContent = ({ children, hasChildren = false, className, ...props }: TreeNodeContentProps) => {\n const { expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren || !isExpanded) {\n return null\n }\n\n return (\n <div className={className} {...props}>\n {children}\n </div>\n )\n}\n\nexport type TreeExpanderProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeExpander = ({ hasChildren = false, className, onClick, ...props }: TreeExpanderProps) => {\n const { expandedIds, toggleExpanded } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren) {\n return <div className=\"mr-1 h-4 w-4\" />\n }\n\n return (\n <div\n className={cn(\"mr-1 flex h-4 w-4 items-center justify-center transition-transform duration-150\", isExpanded && \"rotate-90\", className)}\n onClick={e => {\n e.stopPropagation()\n toggleExpanded(nodeId)\n onClick?.(e)\n }}\n {...props}\n >\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )\n}\n\nexport type TreeIconProps = HTMLAttributes<HTMLDivElement> & {\n icon?: ReactNode\n hasChildren?: boolean\n}\n\nexport const TreeIcon = ({ icon, hasChildren = false, className, ...props }: TreeIconProps) => {\n const { showIcons, expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!showIcons) {\n return null\n }\n\n const getDefaultIcon = () => (hasChildren ? isExpanded ? <FolderOpen className=\"h-4 w-4\" /> : <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />)\n\n return (\n <div className={cn(\"mr-2 flex h-4 w-4 items-center justify-center text-muted-foreground transition-transform\", className)} {...props}>\n {icon || getDefaultIcon()}\n </div>\n )\n}\n\nexport type TreeLabelProps = HTMLAttributes<HTMLSpanElement>\n\nexport const TreeLabel = ({ className, ...props }: TreeLabelProps) => <span className={cn(\"font flex-1 truncate text-sm\", className)} {...props} />\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick an IANA timezone instead of typing one.\n *\n * A zone is a spelling test with silent failure: `Asia/HoChiMinh`, `GMT+7` and `ICT` all look\n * right and none of them is a zone. Go's `time.LoadLocation` does not reject a wrong one\n * loudly - it fails, logs, and the caller falls back to UTC - so a typo becomes a whole site's\n * timesheet shifted by seven hours, which nobody reads as a spelling mistake.\n *\n * ⚠️ `Asia/Saigon` is NOT one of those typos. `Intl.supportedValuesOf(\"timeZone\")` returns the\n * CLDR canonical names, and CLDR canonical for Vietnam IS `Asia/Saigon` - `Asia/Ho_Chi_Minh`\n * does not appear in that list at all. Same for `Asia/Calcutta` over `Asia/Kolkata` and\n * `Europe/Kiev` over `Europe/Kyiv`; see IANA_PRIMARY below for the measured set.\n *\n * The offered names are RENAMED to their IANA primaries anyway, because the offered name is the\n * STORED name, and the stored name is what every backend, log line and export then carries. Go\n * tzdata, this platform, and the people reading a Vietnamese timesheet all say\n * `Asia/Ho_Chi_Minh`; a control that can only offer `Asia/Saigon` reads as broken to all three,\n * and being technically correct did not stop somebody asking why the city was missing.\n *\n * A value stored under EITHER spelling still renders as itself with a correct offset: `Intl`\n * resolves both, and the entry list appends whatever is stored when the offered list omits it.\n *\n * Lives in lyra rather than nekit even though it carries domain logic, because the rule that\n * decides is not \"UI vs logic\" - it is whether the component knows where its data comes from.\n * `PeoplePicker` next door takes an injected `search` for exactly that reason. This one reads\n * `Intl`, which is in the runtime: no network, no session, nothing an app has to hand it.\n *\n * Every zone is shown WITH its current offset. Four hundred names sorted alphabetically is\n * unusable; \"Asia/Ho_Chi_Minh · GMT+7\" is something a person can confirm at a glance, and that\n * glance is the only check standing between a typo and a wrong month.\n */\n\n/** A curated fallback for a runtime without `Intl.supportedValuesOf` (pre-2022 browsers).\n * Short on purpose - it exists so the control still works, not to be a tz database. */\nconst FALLBACK_ZONES = [\n \"UTC\",\n \"Asia/Ho_Chi_Minh\",\n \"Asia/Bangkok\",\n \"Asia/Singapore\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Asia/Shanghai\",\n \"Asia/Kolkata\",\n \"Europe/London\",\n \"Europe/Berlin\",\n \"America/New_York\",\n \"America/Los_Angeles\",\n]\n\n/**\n * CLDR canonical name -> the IANA primary name, for the zones where they disagree.\n *\n * MEASURED, not recalled: Node 22 / ICU reports 417 zones, and for each pair below the CLDR\n * spelling is present, the IANA spelling is absent, and `Intl` resolves the IANA spelling\n * anyway. That last fact is what makes the rename safe - the offset lookup does not care which\n * name it is handed.\n *\n * ⚠️ Renaming the OFFERED name, not the accepted one. A site already saved as `Asia/Saigon`\n * keeps working and keeps showing `Asia/Saigon`, because the entry list appends a stored value\n * the offered list does not contain. Nothing is rewritten behind anybody.\n *\n * This list changes about once a decade, when IANA renames a zone and CLDR declines to follow.\n * If a pair here ever starts appearing under both spellings, delete that row rather than\n * shadowing a real entry.\n */\nconst IANA_PRIMARY: Record<string, string> = {\n \"America/Buenos_Aires\": \"America/Argentina/Buenos_Aires\",\n \"America/Godthab\": \"America/Nuuk\",\n \"Asia/Calcutta\": \"Asia/Kolkata\",\n \"Asia/Katmandu\": \"Asia/Kathmandu\",\n \"Asia/Rangoon\": \"Asia/Yangon\",\n \"Asia/Saigon\": \"Asia/Ho_Chi_Minh\",\n \"Atlantic/Faeroe\": \"Atlantic/Faroe\",\n \"Europe/Kiev\": \"Europe/Kyiv\",\n \"Pacific/Ponape\": \"Pacific/Pohnpei\",\n \"Pacific/Truk\": \"Pacific/Chuuk\",\n}\n\nexport interface TzPickerLabels {\n /** Shown when the value is empty and `allowInherit`. Default: \"Inherit\". */\n inherit?: string\n /** Placeholder for the search input. Default: \"Search timezone\". */\n search?: string\n /** Shown when the filter matches nothing. Default: \"No match\". */\n noMatch?: string\n // No `suggested`/`all` headings: the list is one flat group now. Declaring labels nothing\n // renders is how a message file ends up with keys three translators maintain for no screen.\n}\n\ninterface Zone {\n name: string\n offset: string\n}\n\n/**\n * Built once per page load, not per render: resolving the offset of ~420 zones means ~420\n * `Intl.DateTimeFormat` constructions, cheap once and visible on every keystroke.\n */\nlet cachedZones: Zone[] | null = null\n\nfunction allZones(): Zone[] {\n if (cachedZones) return cachedZones\n let names: string[]\n try {\n const supported = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n names = supported ? supported(\"timeZone\") : FALLBACK_ZONES\n } catch {\n names = FALLBACK_ZONES\n }\n cachedZones = names.map((name) => {\n const primary = IANA_PRIMARY[name] ?? name\n // The offset is resolved from the name being SHOWN, so a wrong row in the table above\n // surfaces as a wrong offset next to the name rather than as a silently different zone.\n return { name: primary, offset: offsetOf(primary) }\n })\n return cachedZones\n}\n\n/** The zone's offset right now, as ICU spells it: \"GMT+7\", not \"UTC+7\". DST makes it a\n * snapshot, which is what a person recognising their own zone needs - not a promise about\n * January. */\nfunction offsetOf(tz: string): string {\n try {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: tz,\n timeZoneName: \"shortOffset\",\n }).formatToParts(new Date())\n return parts.find((p) => p.type === \"timeZoneName\")?.value ?? \"\"\n } catch {\n return \"\"\n }\n}\n\n/**\n * The viewer\\u2019s own zone, under the SAME spelling the offered list uses.\n *\n * \\u26a0\\ufe0f The mapping is not optional. `resolvedOptions().timeZone` reports the CLDR canonical name\n * even when the machine is set to the IANA one - a laptop on `Asia/Ho_Chi_Minh` answers\n * `Asia/Saigon` - so without this the lookup below misses, and the \"your own zone first\"\n * shortcut silently stops working for exactly the countries IANA_PRIMARY covers. Silently,\n * because the control still renders a perfectly good list; it just no longer helps.\n */\nfunction browserTz(): string {\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\"\n return IANA_PRIMARY[tz] ?? tz\n } catch {\n return \"UTC\"\n }\n}\n\nexport interface TzPickerProps {\n /** IANA zone name, or \"\" for inherit. */\n value: string\n onChange: (tz: string) => void\n /**\n * Whether an empty value is meaningful here. It usually is: a device inherits from its site,\n * a site from its unit, a unit from its parent. Set false where a zone must be chosen.\n */\n allowInherit?: boolean\n labels?: TzPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}\n\n/**\n * Field names are `tz`/`name`, NOT `value`/`label`, on purpose: Base UI treats an item shaped\n * `{ value, label }` as self-describing and renders `label` directly, silently ignoring\n * `itemToStringLabel`. The offset would then vanish from the input - which is the one part of\n * the label that makes a zone recognisable.\n */\ninterface Entry {\n tz: string\n name: string\n offset: string\n}\n\nexport function TzPicker({\n value,\n onChange,\n allowInherit = true,\n labels,\n disabled,\n id,\n className,\n}: TzPickerProps) {\n const l = {\n inherit: labels?.inherit ?? \"Inherit\",\n search: labels?.search ?? \"Search timezone\",\n noMatch: labels?.noMatch ?? \"No match\",\n }\n const own = React.useMemo(() => browserTz(), [])\n\n const entries = React.useMemo<Entry[]>(() => {\n const zones = allZones()\n const out: Entry[] = []\n if (allowInherit) out.push({ tz: \"\", name: l.inherit, offset: \"\" })\n // The person filling this form is almost always near the place they are describing, so\n // their own zone is the likeliest answer - and the one hardest to find by scrolling.\n const ownZone = zones.find((z) => z.name === own)\n if (ownZone) out.push({ tz: own, name: own, offset: ownZone.offset })\n for (const z of zones) {\n if (z.name === own) continue\n out.push({ tz: z.name, name: z.name, offset: z.offset })\n }\n // A stored zone the LIST does not contain - an alias CLDR canonicalises away\n // (`Asia/Ho_Chi_Minh`), or one dropped from a later release. It keeps its own name, so the\n // control never misreports what is saved, and it still gets an offset: `Intl` resolves the\n // alias fine even though `supportedValuesOf` omits it. Only a genuinely invalid zone ends\n // up with an empty offset here.\n if (value !== \"\" && !zones.some((z) => z.name === value)) {\n out.push({ tz: value, name: value, offset: offsetOf(value) })\n }\n return out\n }, [allowInherit, l.inherit, own, value])\n\n const selected = entries.find((e) => e.tz === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(item: Entry | null) => onChange(item?.tz ?? \"\")}\n // Searchable by name AND offset: somebody who knows \"+7\" but not the city can still land\n // on it.\n itemToStringLabel={(e: Entry) => (e.offset ? `${e.name} · ${e.offset}` : e.name)}\n itemToStringValue={(e: Entry) => e.tz}\n isItemEqualToValue={(a: Entry, b: Entry) => a.tz === b.tz}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: a combobox trigger sized to its content renders short\n and clipped inside a form column, which reads as a different kind of field. */}\n <ComboboxInput\n id={id}\n placeholder={l.search}\n className={className ?? \"w-full\"}\n // A clear button only where empty is a legitimate answer. Where a zone is required,\n // clearing would offer a state the form cannot save.\n showClear={allowInherit}\n />\n <ComboboxContent>\n <ComboboxEmpty>{l.noMatch}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.tz || \"__inherit\"} value={entry}>\n <span className=\"flex-1 truncate\">{entry.name}</span>\n <span className=\"text-muted-foreground text-xs\">{entry.offset}</span>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick one id from a known set.\n *\n * The set is INJECTED. That is what lets this live in lyra: it never learns where the\n * options came from, so it works the same for org members, groups, or anything else the app\n * has already loaded - which is exactly how the three copies it replaces differed.\n *\n * Why it exists at all: the screens that use it used to ask for raw uuids typed into a text\n * box. Nobody knows a uuid, so the only way anyone filled those fields was by copying from\n * somewhere else, and a copy can be off by one row. In `people` that attached a personnel\n * record to the wrong account - a wrong-but-valid uid passes every server check and is found\n * by whoever opens someone else's file under their own name.\n *\n * Filtering is client-side, deliberately: every set here is org-scoped and already loaded for\n * the surrounding screen, so matching locally is instant and costs no round trip. A picker\n * paging over every account that exists (admin's platform-wide search) is a different\n * component with a different failure mode - see `PeoplePicker` in `@tradalab/lyra/people`,\n * which takes an async `search` and does not hold a controlled value.\n */\n\n/** One choosable thing: an id plus what a person actually recognises it by. */\nexport interface PickOption {\n id: string\n label: string\n /** Secondary line - an email, a status. Searchable along with the label. */\n hint?: string\n}\n\nexport interface OptionPickerLabels {\n /** Shown when nothing is selected. */\n placeholder?: string\n /** Placeholder inside the search box. */\n search?: string\n /** Shown when the filter matches nothing. */\n empty?: string\n}\n\nconst FALLBACK: Required<OptionPickerLabels> = {\n placeholder: \"Select…\",\n search: \"Search\",\n empty: \"No match\",\n}\n\n/**\n * Field names are `id`/`label`, and `label` is what Base UI renders when an item is shaped\n * `{ value, label }`. This shape uses `id`, so `itemToStringLabel` below is what actually\n * decides the input text - the same trap TzPicker documents.\n */\ninterface Entry extends PickOption {\n /** Present only for the empty selection, so `value` can round-trip \"\" safely. */\n none?: boolean\n}\n\nexport function OptionPicker({\n value,\n onChange,\n options,\n labels,\n disabled,\n id,\n className,\n}: {\n value: string\n onChange: (id: string) => void\n options: PickOption[]\n labels?: OptionPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}) {\n const t = (k: keyof OptionPickerLabels) => labels?.[k] ?? FALLBACK[k]\n const placeholder = labels?.placeholder ?? FALLBACK.placeholder\n\n const entries = React.useMemo<Entry[]>(() => {\n const out: Entry[] = [{ id: \"\", label: placeholder, none: true }, ...options]\n // A stored id that is nobody on the list: the account left the org, or the record was\n // linked before this control existed. Show the raw id rather than an empty box - the\n // field is NOT empty, and rendering it as empty invites overwriting it by accident.\n if (value !== \"\" && !options.some((o) => o.id === value)) {\n out.push({ id: value, label: value })\n }\n return out\n }, [options, value, placeholder])\n\n const selected = entries.find((e) => e.id === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(e: Entry | null) => onChange(e?.id ?? \"\")}\n // The id is part of the searchable text, not only the label: somebody holding a uid\n // from a log must still be able to find the person it belongs to.\n itemToStringLabel={(e: Entry) => (e.none ? e.label : `${e.label} ${e.hint ?? \"\"} ${e.id}`)}\n isItemEqualToValue={(a: Entry, b: Entry) => a.id === b.id}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: sized to content it renders short and clipped inside\n a form column. */}\n <ComboboxInput id={id} placeholder={t(\"search\")} className={className ?? \"w-full\"} />\n <ComboboxContent>\n <ComboboxEmpty>{t(\"empty\")}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.id || \"__none\"} value={entry}>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm\">{entry.label}</span>\n {entry.hint ? (\n <span className=\"text-muted-foreground truncate text-xs\">{entry.hint}</span>\n ) : null}\n </div>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's MCP tools: the user's switch, one switch per tool,\n * the programs allowed in, and the calls as they happen.\n *\n * The api is INJECTED and its types are declared here, shaped like the `scorixMCP` that\n * `scorix generate proto` emits, so an app passes that object as is. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * `copy` is injected too, and without it there is no copy button: `navigator.clipboard` needs\n * a secure context, which only WebView2 grants a scorix app. Reaching for it here would work\n * on Windows and do nothing on macOS and Linux.\n */\n\nexport interface McpTool {\n name: string\n description: string\n destructive: boolean\n enabled: boolean\n}\n\nexport interface McpClient {\n path: string\n name?: string\n approved_at: string\n}\n\nexport interface McpStatus {\n offered: boolean\n enabled: boolean\n running: boolean\n tools: McpTool[]\n clients: McpClient[]\n client: { command: string; args: string[] }\n audit_log: string\n}\n\nexport interface McpCall {\n tool: string\n client: string\n client_path: string\n outcome: \"ok\" | \"error\" | \"denied\"\n error?: string\n ms: number\n}\n\nexport interface McpSettingsApi {\n status(): Promise<McpStatus>\n enable(enabled: boolean): Promise<McpStatus>\n setTool(name: string, enabled: boolean): Promise<McpStatus>\n revokeClient(path: string): Promise<McpStatus>\n onCall?(cb: (call: McpCall) => void): () => void\n}\n\nexport interface McpSettingsLabels {\n enable?: string\n enableHint?: string\n running?: string\n stopped?: string\n notOffered?: string\n connect?: string\n connectHint?: string\n copy?: string\n copied?: string\n copyConfig?: string\n tools?: string\n toolsHint?: string\n asksFirst?: string\n asksFirstHint?: string\n clients?: string\n clientsHint?: string\n clientsEmpty?: string\n revoke?: string\n activity?: string\n activityEmpty?: string\n ok?: string\n error?: string\n denied?: string\n auditLog?: string\n auditLogHint?: string\n retry?: string\n}\n\nconst FALLBACK: Required<McpSettingsLabels> = {\n enable: \"Allow MCP clients\",\n enableHint: \"Let an AI agent such as Claude Desktop or Cursor use the tools this app offers.\",\n running: \"Running\",\n stopped: \"Off\",\n notOffered: \"This build of the app offers no MCP tools.\",\n connect: \"Connect a client\",\n connectHint: \"Add this to the client's MCP configuration, then restart the client.\",\n copy: \"Copy\",\n copied: \"Copied\",\n copyConfig: \"Copy configuration\",\n tools: \"Tools\",\n toolsHint: \"A tool turned off is hidden from every client.\",\n asksFirst: \"Asks first\",\n asksFirstHint: \"You confirm every call in a dialog.\",\n clients: \"Allowed programs\",\n clientsHint: \"A program is added when you allow it, the first time it runs a tool.\",\n clientsEmpty: \"No program allowed yet.\",\n revoke: \"Remove\",\n activity: \"Recent calls\",\n activityEmpty: \"Calls show up here while this screen is open.\",\n ok: \"OK\",\n error: \"Failed\",\n denied: \"Denied\",\n auditLog: \"Audit log\",\n auditLogHint: \"Every call is written here, with credential-like arguments hidden.\",\n retry: \"Retry\",\n}\n\nconst RECENT_CALLS = 20\n\nconst OUTCOME_VARIANT = { ok: \"secondary\", error: \"destructive\", denied: \"outline\" } as const\n\ninterface SeenCall extends McpCall {\n key: number\n at: Date\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction baseName(path: string): string {\n return path.split(/[\\\\/]/).pop() || path\n}\n\nexport function McpSettings({\n api,\n serverName,\n copy,\n labels,\n locale,\n className,\n}: {\n api: McpSettingsApi\n /** The key under `mcpServers` in the configuration snippet: the app's own short name. */\n serverName: string\n copy?: (text: string) => Promise<void>\n labels?: McpSettingsLabels\n locale?: string\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const id = React.useId()\n const [status, setStatus] = React.useState<McpStatus | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n const [calls, setCalls] = React.useState<SeenCall[]>([])\n // Bumped when a change starts and when it ends, so a refresh that raced one is dropped\n // instead of putting back what the change just replaced.\n const changes = React.useRef(0)\n const callKey = React.useRef(0)\n\n const load = React.useCallback(() => {\n setLoadError(null)\n api.status().then(setStatus, (err: unknown) => setLoadError(messageOf(err)))\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onCall) return\n return api.onCall((call) => {\n setCalls((prev) => [{ ...call, key: ++callKey.current, at: new Date() }, ...prev].slice(0, RECENT_CALLS))\n // A program the user just allowed did so in a native dialog, outside this screen; the\n // call it then makes is the only sign that the list of programs changed.\n const started = changes.current\n api.status().then(\n (next) => {\n if (changes.current === started) setStatus(next)\n },\n // A refresh nobody asked for keeps the last answer on screen rather than raising an error.\n () => {},\n )\n })\n }, [api])\n\n React.useEffect(() => {\n if (!copied) return\n const timer = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timer)\n }, [copied])\n\n const change = async (action: () => Promise<McpStatus>) => {\n changes.current++\n setBusy(true)\n setError(null)\n try {\n setStatus(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n changes.current++\n setBusy(false)\n }\n }\n\n if (!status) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!status.offered) {\n return (\n <FieldGroup className={className}>\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.enable}</FieldLegend>\n <FieldDescription>{t.notOffered}</FieldDescription>\n </FieldSet>\n </FieldGroup>\n )\n }\n\n // Serialised, not assembled by hand: a Windows path pasted into JSON needs its backslashes\n // escaped, and a snippet the client cannot parse fails with no hint of why.\n const snippet = JSON.stringify(\n { mcpServers: { [serverName]: { command: status.client.command, args: status.client.args } } },\n null,\n 2,\n )\n const day = (iso: string) => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString(locale)\n }\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long path or\n // config line would widen the whole screen instead of truncating or scrolling.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <Field orientation=\"horizontal\">\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-enable`} className=\"text-sm\">\n {t.enable}\n </FieldLabel>\n <Badge variant=\"outline\">{status.running ? t.running : t.stopped}</Badge>\n </div>\n <FieldDescription>{t.enableHint}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-enable`}\n checked={status.enabled}\n disabled={busy}\n onCheckedChange={(on) => void change(() => api.enable(on))}\n />\n </Field>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.connect}</FieldLegend>\n <FieldDescription>{t.connectHint}</FieldDescription>\n <div className=\"relative\">\n <pre className=\"bg-muted/50 overflow-x-auto border px-3 py-2 font-mono text-xs leading-relaxed\">{snippet}</pre>\n {copy ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"bg-background absolute top-2 right-2\"\n aria-label={t.copyConfig}\n onClick={() =>\n void copy(snippet).then(\n () => setCopied(true),\n (err: unknown) => setError(messageOf(err)),\n )\n }\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n {copied ? t.copied : t.copy}\n </Button>\n ) : null}\n </div>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.tools}</FieldLegend>\n <FieldDescription>{t.toolsHint}</FieldDescription>\n {status.tools.map((tool) => (\n <Field key={tool.name} orientation=\"horizontal\" data-disabled={!status.enabled}>\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-tool-${tool.name}`} className=\"font-mono text-xs\">\n {tool.name}\n </FieldLabel>\n {tool.destructive ? (\n <Badge variant=\"destructive\" title={t.asksFirstHint}>\n {t.asksFirst}\n </Badge>\n ) : null}\n </div>\n <FieldDescription>{tool.description}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-tool-${tool.name}`}\n size=\"sm\"\n checked={tool.enabled}\n disabled={busy || !status.enabled}\n onCheckedChange={(on) => void change(() => api.setTool(tool.name, on))}\n />\n </Field>\n ))}\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.clients}</FieldLegend>\n <FieldDescription>{t.clientsHint}</FieldDescription>\n {status.clients.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.clientsEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {status.clients.map((client) => {\n const who = client.name || baseName(client.path)\n return (\n <li key={client.path} className=\"flex items-center gap-3 px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{who}</div>\n {/* Cut at the start: the end of a path names the program, and the start is the\n same home directory on every row. bdi keeps the path itself left to right. */}\n <div\n className=\"text-muted-foreground truncate text-left font-mono text-xs [direction:rtl]\"\n title={client.path}\n >\n <bdi>{client.path}</bdi>\n </div>\n </div>\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">{day(client.approved_at)}</span>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.revoke} ${who}`}\n disabled={busy}\n onClick={() => void change(() => api.revokeClient(client.path))}\n >\n {t.revoke}\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n </FieldSet>\n\n {api.onCall ? (\n <>\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.activity}</FieldLegend>\n {calls.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.activityEmpty}</p>\n ) : (\n <ul aria-label={t.activity} className=\"divide-y border\">\n {calls.map((call) => (\n <li key={call.key} className=\"flex items-center gap-3 px-3 py-1.5 text-xs\" title={call.error}>\n <span className=\"text-muted-foreground tabular-nums\">{call.at.toLocaleTimeString(locale)}</span>\n <span className=\"min-w-0 flex-1 truncate font-mono\">{call.tool}</span>\n <span className=\"text-muted-foreground max-w-40 truncate\" title={call.client_path}>\n {call.client || baseName(call.client_path)}\n </span>\n <Badge variant={OUTCOME_VARIANT[call.outcome]}>{t[call.outcome]}</Badge>\n <span className=\"text-muted-foreground w-14 text-right tabular-nums\">{call.ms} ms</span>\n </li>\n ))}\n </ul>\n )}\n </FieldSet>\n </>\n ) : null}\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.auditLog}</FieldLegend>\n <FieldDescription>{t.auditLogHint}</FieldDescription>\n <code\n className=\"bg-muted/50 block truncate border px-3 py-2 text-left font-mono text-xs [direction:rtl]\"\n title={status.audit_log}\n >\n <bdi>{status.audit_log}</bdi>\n </code>\n </FieldSet>\n </FieldGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { PlusIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { NativeSelect, NativeSelectOption } from \"~/ui/primitives/native-select.js\"\nimport { Progress } from \"~/ui/primitives/progress.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's language models: which provider and model each of the\n * app's slots uses, the providers the user added with their keys, and downloads with progress.\n *\n * The api is INJECTED and its types are declared here, shaped like the JSON of scorix's\n * `mod:llm:*` commands, so an app maps each method to one `invoke` call. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * Keys never come back from the api: a provider lists which secret fields hold a value, and the\n * form sends only the ones the user typed into or cleared.\n */\n\nexport type LlmCapability = \"chat\" | \"embed\" | \"vision\" | \"audio\" | \"tools\" | \"transcribe\" | (string & {})\n\nexport interface LlmField {\n key: string\n label: string\n kind: \"text\" | \"url\" | \"secret\" | \"bool\"\n required: boolean\n default?: string\n description?: string\n}\n\nexport interface LlmDriver {\n name: string\n fields: LlmField[]\n}\n\nexport interface LlmProvider {\n id: string\n /** Absent for a provider the app runs itself. */\n driver?: string\n values: Record<string, string>\n /** The secret fields that hold a value; never the value. */\n secrets: string[]\n capabilities: LlmCapability[]\n local: boolean\n /** Can download and delete models. */\n manages: boolean\n editable: boolean\n error?: string\n}\n\nexport interface LlmSlot {\n name: string\n label: string\n description?: string\n needs: LlmCapability[]\n local_only: boolean\n provider?: string\n model?: string\n error?: string\n}\n\nexport interface LlmState {\n providers: LlmProvider[]\n slots: LlmSlot[]\n}\n\nexport interface LlmModel {\n id: string\n size?: number\n parameter_size?: string\n quantization?: string\n}\n\nexport interface LlmFound {\n name: string\n driver: string\n base_url: string\n version?: string\n}\n\nexport interface LlmProviderInput {\n id: string\n driver: string\n values: Record<string, string>\n /** Only the secret fields being changed; an empty string removes one. */\n secrets: Record<string, string>\n}\n\nexport interface LlmPullProgress {\n provider: string\n model: string\n status: string\n done: number\n total: number\n}\n\nexport interface LlmSettingsApi {\n state(): Promise<LlmState>\n drivers(): Promise<LlmDriver[]>\n saveProvider(input: LlmProviderInput): Promise<LlmState>\n deleteProvider(id: string): Promise<LlmState>\n bind(slot: string, provider: string, model: string): Promise<LlmState>\n unbind(slot: string): Promise<LlmState>\n models(provider: string): Promise<LlmModel[]>\n /** Without these three there is no download button. */\n pull?(provider: string, model: string): Promise<boolean>\n cancelPull?(provider: string, model: string): Promise<boolean>\n onPull?(cb: (p: LlmPullProgress) => void): () => void\n /** Runtimes already running on this machine, offered as providers to add. */\n detect?(): Promise<LlmFound[]>\n /**\n * An extra line under one slot, for a fact only the app knows - loom warns that N chunks were\n * indexed by a different embedding model than the one now bound. Without a hook for it, adopting\n * this block means silently dropping such a warning, which is what kept loom on its own 687-line\n * copy of this screen.\n */\n slotNote?(slot: string): React.ReactNode\n}\n\nexport interface LlmSettingsLabels {\n slots?: string\n slotsHint?: string\n notSet?: string\n model?: string\n modelHint?: string\n localOnly?: string\n localOnlyHint?: string\n download?: string\n notDownloaded?: string\n cancel?: string\n providers?: string\n providersHint?: string\n providersEmpty?: string\n add?: string\n edit?: string\n remove?: string\n removeConfirm?: string\n keep?: string\n byApp?: string\n thisMachine?: string\n remote?: string\n keySaved?: string\n driver?: string\n id?: string\n idHint?: string\n save?: string\n keyKeep?: string\n keyRemove?: string\n running?: string\n addFound?: string\n retry?: string\n capabilities?: Partial<Record<string, string>>\n}\n\nconst FALLBACK: Required<Omit<LlmSettingsLabels, \"capabilities\">> = {\n slots: \"Models for this app\",\n slotsHint: \"Each feature uses the provider and model chosen here.\",\n notSet: \"Not set\",\n model: \"Model\",\n modelHint: \"Type a name or pick one the provider has.\",\n localOnly: \"This machine only\",\n localOnlyHint: \"What this feature reads never leaves the computer.\",\n download: \"Download\",\n notDownloaded: \"Not on this computer yet\",\n cancel: \"Cancel\",\n providers: \"Providers\",\n providersHint: \"Services and programs that run models.\",\n providersEmpty: \"No provider yet.\",\n add: \"Add provider\",\n edit: \"Edit\",\n remove: \"Remove\",\n removeConfirm: \"Remove\",\n keep: \"Keep\",\n byApp: \"run by the app\",\n thisMachine: \"this machine\",\n remote: \"remote\",\n keySaved: \"key saved\",\n driver: \"Type\",\n id: \"Name\",\n idHint: \"Lowercase letters, digits, dot, dash and underscore.\",\n save: \"Save\",\n keyKeep: \"Saved; leave empty to keep it\",\n keyRemove: \"Remove key\",\n running: \"Running on this computer\",\n addFound: \"Add\",\n retry: \"Retry\",\n}\n\nconst CAPABILITY: Record<string, string> = {\n chat: \"chat\",\n embed: \"embeddings\",\n vision: \"vision\",\n audio: \"audio\",\n tools: \"tools\",\n transcribe: \"speech to text\",\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction hostOf(url: string | undefined): string {\n if (!url) return \"\"\n try {\n const u = new URL(url)\n return u.host + (u.pathname === \"/\" ? \"\" : u.pathname)\n } catch {\n return url\n }\n}\n\n// Ollama reports each layer on its own, and after the weights come a license and a template of a\n// few KB: in whole megabytes they would read \"0 MB / 0 MB\".\nfunction sizeOf(bytes: number): string {\n if (bytes >= 1 << 30) return `${(bytes / (1 << 30)).toFixed(1)} GB`\n if (bytes >= 1 << 20) return `${Math.round(bytes / (1 << 20))} MB`\n return `${Math.ceil(bytes / 1024)} KB`\n}\n\n// The same test the module applies on bind, so the list offers only what it would accept.\nfunction serves(slot: LlmSlot, p: LlmProvider): boolean {\n return slot.needs.every((c) => p.capabilities.includes(c)) && (!slot.local_only || p.local)\n}\n\ninterface Draft {\n /** Set when editing; a new provider has none yet. */\n existing?: LlmProvider\n driver: string\n id: string\n values: Record<string, string>\n secrets: Record<string, string>\n}\n\n// A provider id has no slash, so this cannot join two different pairs into one key.\nconst pullKey = (provider: string, model: string) => `${provider}/${model}`\n\nexport function LlmSettings({\n api,\n labels,\n className,\n}: {\n api: LlmSettingsApi\n labels?: LlmSettingsLabels\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const cap = (c: string) => labels?.capabilities?.[c] ?? CAPABILITY[c] ?? c\n const id = React.useId()\n const [state, setState] = React.useState<LlmState | null>(null)\n const [drivers, setDrivers] = React.useState<LlmDriver[]>([])\n const [found, setFound] = React.useState<LlmFound[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [draft, setDraft] = React.useState<Draft | null>(null)\n const [draftError, setDraftError] = React.useState<string | null>(null)\n const [removing, setRemoving] = React.useState<string | null>(null)\n const [models, setModels] = React.useState<Record<string, LlmModel[]>>({})\n const [typed, setTyped] = React.useState<Record<string, string>>({})\n const [pulls, setPulls] = React.useState<Record<string, LlmPullProgress>>({})\n\n const load = React.useCallback(() => {\n setLoadError(null)\n Promise.all([api.state(), api.drivers()]).then(\n ([s, d]) => {\n setState(s)\n setDrivers(d)\n },\n (err: unknown) => setLoadError(messageOf(err)),\n )\n // Offered, not required: a screen with nothing detected is a normal one.\n api.detect?.().then(setFound, () => {})\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onPull) return\n return api.onPull((p) => setPulls((prev) => ({ ...prev, [pullKey(p.provider, p.model)]: p })))\n }, [api])\n\n const listModels = React.useCallback(\n (provider: string) => {\n api.models(provider).then(\n (ms) => setModels((prev) => ({ ...prev, [provider]: ms })),\n // A provider that cannot list its models still takes a typed name.\n () => setModels((prev) => ({ ...prev, [provider]: [] })),\n )\n },\n [api],\n )\n\n const bound = React.useMemo(() => new Set((state?.slots ?? []).map((s) => s.provider).filter(Boolean) as string[]), [state])\n React.useEffect(() => {\n for (const p of bound) if (!(p in models)) listModels(p)\n }, [bound, models, listModels])\n\n const change = async (action: () => Promise<LlmState>) => {\n setBusy(true)\n setError(null)\n try {\n setState(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n if (!state) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n const provider = (pid: string | undefined) => state.providers.find((p) => p.id === pid)\n\n const saveDraft = async () => {\n if (!draft) return\n const d = drivers.find((x) => x.name === draft.driver)\n const values: Record<string, string> = {}\n const secrets: Record<string, string> = {}\n for (const f of d?.fields ?? []) {\n if (f.kind !== \"secret\") {\n if (draft.values[f.key]) values[f.key] = draft.values[f.key] as string\n } else if (f.key in draft.secrets) {\n secrets[f.key] = draft.secrets[f.key] as string\n }\n }\n setBusy(true)\n setDraftError(null)\n try {\n setState(await api.saveProvider({ id: draft.id, driver: draft.driver, values, secrets }))\n setModels((prev) => {\n const next = { ...prev }\n delete next[draft.id]\n return next\n })\n setDraft(null)\n } catch (err) {\n // Kept next to the form, which stays open with what was typed.\n setDraftError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n const startDraft = (next: Draft) => {\n setDraft(next)\n setDraftError(null)\n setRemoving(null)\n }\n\n const newDraft = (driver: string, values: Record<string, string> = {}, name = driver): Draft => {\n const taken = new Set(state.providers.map((p) => p.id))\n let pid = name\n for (let i = 2; taken.has(pid); i++) pid = `${name}-${i}`\n return { driver, id: pid, values, secrets: {} }\n }\n\n const form = (d: Draft) => {\n const spec = drivers.find((x) => x.name === d.driver)\n const set = (patch: Partial<Draft>) => setDraft({ ...d, ...patch })\n return (\n <div className=\"bg-muted/30 flex flex-col gap-3 border px-3 py-3\" data-testid=\"provider-form\">\n {draftError ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{draftError}</AlertDescription>\n </Alert>\n ) : null}\n {d.existing ? null : (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <Field>\n <FieldLabel htmlFor={`${id}-driver`}>{t.driver}</FieldLabel>\n <NativeSelect id={`${id}-driver`} value={d.driver} onChange={(e) => set(newDraft(e.target.value))}>\n {drivers.map((x) => (\n <NativeSelectOption key={x.name} value={x.name}>\n {x.name}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n </Field>\n <Field>\n <FieldLabel htmlFor={`${id}-id`}>{t.id}</FieldLabel>\n <Input id={`${id}-id`} value={d.id} spellCheck={false} onChange={(e) => set({ id: e.target.value.toLowerCase() })} />\n <FieldDescription>{t.idHint}</FieldDescription>\n </Field>\n </div>\n )}\n {spec?.fields.map((f) => {\n const fid = `${id}-f-${f.key}`\n if (f.kind === \"bool\") {\n const on = (d.values[f.key] ?? f.default ?? \"false\") === \"true\"\n return (\n <Field key={f.key} orientation=\"horizontal\">\n <FieldContent>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </FieldContent>\n <Switch id={fid} size=\"sm\" checked={on} onCheckedChange={(v) => set({ values: { ...d.values, [f.key]: v ? \"true\" : \"false\" } })} />\n </Field>\n )\n }\n if (f.kind === \"secret\") {\n const saved = d.existing?.secrets.includes(f.key) ?? false\n const cleared = d.secrets[f.key] === \"\" && saved\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={fid}\n type=\"password\"\n autoComplete=\"off\"\n placeholder={saved && !cleared ? t.keyKeep : undefined}\n value={d.secrets[f.key] ?? \"\"}\n onChange={(e) => {\n const secrets = { ...d.secrets, [f.key]: e.target.value }\n // Emptied again: back to \"leave it as it is\", not \"remove it\".\n if (e.target.value === \"\" && !cleared) delete secrets[f.key]\n set({ secrets })\n }}\n />\n {saved && !cleared ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => set({ secrets: { ...d.secrets, [f.key]: \"\" } })}>\n {t.keyRemove}\n </Button>\n ) : null}\n </div>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n }\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <Input\n id={fid}\n type={f.kind === \"url\" ? \"url\" : \"text\"}\n spellCheck={false}\n placeholder={f.default}\n required={f.required}\n value={d.values[f.key] ?? \"\"}\n onChange={(e) => set({ values: { ...d.values, [f.key]: e.target.value } })}\n />\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n })}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setDraft(null)}>\n {t.cancel}\n </Button>\n <Button size=\"sm\" disabled={busy || !d.id} onClick={() => void saveDraft()}>\n {t.save}\n </Button>\n </div>\n </div>\n )\n }\n\n const unused = found.filter((f) => !state.providers.some((p) => p.values.base_url === f.base_url))\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long URL\n // would widen the whole screen instead of truncating.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.slots}</FieldLegend>\n <FieldDescription>{t.slotsHint}</FieldDescription>\n <ul className=\"divide-y border\">\n {state.slots.map((slot) => {\n const current = provider(slot.provider)\n const choices = state.providers.filter((p) => p.id === slot.provider || serves(slot, p))\n const known = slot.provider ? models[slot.provider] : undefined\n const draftModel = typed[slot.name] ?? slot.model ?? \"\"\n // Downloads follow the model the slot is bound to, not the text being typed: a\n // button that came and went with every keystroke would offer half a name.\n const chosen = slot.model ?? \"\"\n const pull = current ? pulls[pullKey(current.id, chosen)] : undefined\n const pulling = pull !== undefined\n const missing = known !== undefined && chosen !== \"\" && !known.some((m) => m.id === chosen)\n const commit = () => {\n if (!slot.provider || draftModel === (slot.model ?? \"\")) return\n void change(() => api.bind(slot.name, slot.provider as string, draftModel))\n }\n return (\n <li key={slot.name} className=\"flex flex-col gap-2 px-3 py-3\" data-testid={`slot-${slot.name}`}>\n <div className=\"flex flex-wrap items-start gap-x-6 gap-y-2\">\n <div className=\"min-w-40 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{slot.label}</span>\n {slot.local_only ? (\n <Badge variant=\"outline\" title={t.localOnlyHint}>\n {t.localOnly}\n </Badge>\n ) : null}\n </div>\n {slot.description ? <p className=\"text-muted-foreground text-xs\">{slot.description}</p> : null}\n </div>\n <div className=\"flex w-full gap-2 sm:w-auto\">\n <NativeSelect\n aria-label={`${slot.label}: ${t.providers}`}\n className=\"sm:w-40\"\n value={slot.provider ?? \"\"}\n disabled={busy}\n onChange={(e) => {\n const next = e.target.value\n setTyped((prev) => {\n const rest = { ...prev }\n delete rest[slot.name]\n return rest\n })\n void change(() => (next ? api.bind(slot.name, next, \"\") : api.unbind(slot.name)))\n }}\n >\n <NativeSelectOption value=\"\">{t.notSet}</NativeSelectOption>\n {choices.map((p) => (\n <NativeSelectOption key={p.id} value={p.id}>\n {p.id}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n <Input\n aria-label={`${slot.label}: ${t.model}`}\n title={t.modelHint}\n // Chrome draws the datalist arrow in solid black, louder than anything else here.\n className=\"sm:w-56 [&::-webkit-calendar-picker-indicator]:opacity-30\"\n list={`${id}-models-${slot.name}`}\n spellCheck={false}\n placeholder={t.model}\n disabled={busy || !slot.provider}\n value={draftModel}\n onChange={(e) => setTyped((prev) => ({ ...prev, [slot.name]: e.target.value }))}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit()\n }}\n />\n <datalist id={`${id}-models-${slot.name}`}>\n {known?.map((m) => (\n <option key={m.id} value={m.id}>\n {[m.parameter_size, m.quantization, m.size ? sizeOf(m.size) : \"\"].filter(Boolean).join(\" · \")}\n </option>\n ))}\n </datalist>\n </div>\n </div>\n {slot.error ? <p className=\"text-destructive text-xs\">{slot.error}</p> : null}\n {api.slotNote?.(slot.name)}\n {current?.manages && api.pull && missing && !pulling ? (\n <div className=\"flex items-center justify-end gap-3\">\n <span className=\"text-muted-foreground text-xs\">{t.notDownloaded}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => {\n const key = pullKey(current.id, chosen)\n const end = () =>\n setPulls((prev) => {\n const rest = { ...prev }\n delete rest[key]\n return rest\n })\n setPulls((prev) => ({ ...prev, [key]: { provider: current.id, model: chosen, status: \"\", done: 0, total: 0 } }))\n api.pull?.(current.id, chosen).then(\n (done) => {\n end()\n if (done) listModels(current.id)\n },\n (err: unknown) => {\n end()\n setError(messageOf(err))\n },\n )\n }}\n >\n {t.download} {chosen}\n </Button>\n </div>\n ) : null}\n {pulling && current ? (\n <div className=\"flex items-center gap-3\" data-testid={`pull-${slot.name}`}>\n <Progress className=\"flex-1\" value={pull.total > 0 ? (pull.done / pull.total) * 100 : 0} />\n <span className=\"text-muted-foreground w-28 text-right text-xs tabular-nums\">\n {pull.total > 0 ? `${sizeOf(pull.done)} / ${sizeOf(pull.total)}` : pull.status}\n </span>\n {api.cancelPull ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => void api.cancelPull?.(current.id, pull.model)}>\n {t.cancel}\n </Button>\n ) : null}\n </div>\n ) : null}\n </li>\n )\n })}\n </ul>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <FieldLegend>{t.providers}</FieldLegend>\n <FieldDescription>{t.providersHint}</FieldDescription>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={busy || drivers.length === 0}\n onClick={() => startDraft(newDraft(drivers[0]?.name ?? \"\"))}\n >\n <PlusIcon />\n {t.add}\n </Button>\n </div>\n {draft && !draft.existing ? form(draft) : null}\n {state.providers.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.providersEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {state.providers.map((p) =>\n draft?.existing?.id === p.id ? (\n <li key={p.id} className=\"p-0\">\n {form(draft)}\n </li>\n ) : (\n <li key={p.id} className=\"flex items-center gap-3 px-3 py-2\" data-testid={`provider-${p.id}`}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{p.id}</span>\n {/* A provider named after its driver, as a detected one is, says it once. */}\n {p.driver !== p.id ? <span className=\"text-muted-foreground text-xs\">{p.driver ?? t.byApp}</span> : null}\n </div>\n <div className=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs [&>*:not(:first-child)]:before:mr-2 [&>*:not(:first-child)]:before:content-['·']\">\n {p.values.base_url ? (\n <span className=\"max-w-64 truncate font-mono\" title={p.values.base_url}>\n {hostOf(p.values.base_url)}\n </span>\n ) : null}\n <span>{p.local ? t.thisMachine : t.remote}</span>\n {p.secrets.length > 0 ? <span>{t.keySaved}</span> : null}\n {p.capabilities.length > 0 ? <span>{p.capabilities.map(cap).join(\", \")}</span> : null}\n </div>\n {p.error ? <p className=\"text-destructive text-xs\">{p.error}</p> : null}\n </div>\n {p.editable ? (\n removing === p.id ? (\n <>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setRemoving(null)}>\n {t.keep}\n </Button>\n <Button\n size=\"xs\"\n variant=\"destructive\"\n disabled={busy}\n onClick={() => {\n setRemoving(null)\n void change(() => api.deleteProvider(p.id))\n }}\n >\n {t.removeConfirm} {p.id}\n </Button>\n </>\n ) : (\n <>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.edit} ${p.id}`}\n disabled={busy}\n onClick={() => startDraft({ existing: p, driver: p.driver ?? \"\", id: p.id, values: { ...p.values }, secrets: {} })}\n >\n {t.edit}\n </Button>\n <Button size=\"xs\" variant=\"ghost\" aria-label={`${t.remove} ${p.id}`} disabled={busy} onClick={() => setRemoving(p.id)}>\n {t.remove}\n </Button>\n </>\n )\n ) : null}\n </li>\n ),\n )}\n </ul>\n )}\n {unused.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-muted-foreground text-xs\">{t.running}</p>\n <ul className=\"divide-y border border-dashed\">\n {unused.map((f) => (\n <li key={f.base_url} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-sm\">{f.name}</span>\n {f.version ? <span className=\"text-muted-foreground text-xs\">{f.version}</span> : null}\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate font-mono text-xs\">{f.base_url}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n aria-label={`${t.addFound} ${f.name}`}\n disabled={busy || !drivers.some((d) => d.name === f.driver)}\n onClick={() => startDraft(newDraft(f.driver, { base_url: f.base_url }, f.name))}\n >\n {t.addFound}\n </Button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </FieldSet>\n </FieldGroup>\n )\n}\n","/**\n * Plates: the palette a reader picks, applied by putting `data-plate` on any element.\n *\n * This module holds NAMES and nothing else. The colours live once, in `styles/globals.css`, and a\n * swatch reads them the same way the rest of the UI does - by sitting inside a `data-plate` scope\n * and using `bg-primary`. Copying the values here would be the second table that drifts.\n *\n * Absent `data-plate`, `--primary` is lyra's neutral. That is the default every app ships with, so\n * adopting plates costs an app nothing until a reader chooses.\n */\nexport const PLATES = [\n \"pink\",\n \"rose\",\n \"crimson\",\n \"rust\",\n \"orange\",\n \"ochre\",\n \"amber\",\n \"honey\",\n \"gold\",\n \"olive\",\n \"lime\",\n \"green\",\n \"teal\",\n \"cyan\",\n \"azure\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"magenta\",\n] as const\n\nexport type Plate = (typeof PLATES)[number]\n\n/**\n * The plates certified to be told apart from each other, not merely from the status tokens.\n *\n * Only these may carry MEANING. The distinction is not decorative: a plate a reader picks for\n * pleasure needs no relation to anyone else's, but a plate that says \"which space you are typing\n * into\" stops working the moment two of them look alike - so that use gets the subset measured at\n * dE76 >= 29.7 pairwise, in both themes.\n */\nexport const BEARING_PLATES = [\n \"pink\",\n \"rust\",\n \"amber\",\n \"olive\",\n \"green\",\n \"teal\",\n \"azure\",\n \"blue\",\n \"violet\",\n] as const\n\nexport type BearingPlate = (typeof BEARING_PLATES)[number]\n\nexport function isPlate(s: string): s is Plate {\n return (PLATES as readonly string[]).includes(s)\n}\n\n/**\n * The plate for an id, from the certified subset.\n *\n * Derived, never chosen, and that is the point when the colour is a fence rather than a preference:\n * if two organisations could both pick blue the signal stops working for both of them. Deriving on\n * the CLIENT is deliberate too - the alternative is every server that shows a coloured surface\n * keeping its own copy of the name list, which is the shape chat ended up in (a Go slice, a CSS\n * block and a TS union, with nothing holding them together).\n *\n * FNV-1a rather than a cryptographic hash: this picks a colour, so spreading matters and secrecy\n * does not, and it stays synchronous - SubtleCrypto would make every call site async for nothing.\n */\nexport function derivePlate(id: string): BearingPlate {\n let h = 0x811c9dc5\n for (let i = 0; i < id.length; i++) {\n h ^= id.charCodeAt(i)\n h = Math.imul(h, 0x01000193) >>> 0\n }\n return BEARING_PLATES[h % BEARING_PLATES.length]!\n}\n","\"use client\"\n\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\nimport { RadioGroup } from \"~/ui/primitives/radio-group.js\"\nimport { cn } from \"~/utils/cn.js\"\nimport { PLATES, isPlate, type Plate } from \"./plate.js\"\n\n/**\n * Pick a plate, or none.\n *\n * Presentation only: it takes the current value and hands back the next one. Where the choice is\n * stored is the app's business - a session preference on the web, a config file in a scorix shell -\n * and keeping that out of here is what lets one component serve both, since a desktop shell has no\n * session to read.\n *\n * Built on lyra's own `RadioGroup`, not on a row of buttons. The first version hand-rolled\n * `role=\"radiogroup\"` over twenty tabbable buttons, which CLAIMED radio semantics and delivered\n * something else: twenty tab stops instead of one, and no arrow keys. Radix gives the roving tabindex\n * and the arrow-key navigation, and `RadioGroupItem` is simply a different styling of the same item -\n * a dot - so the swatch uses the primitive item directly.\n *\n * `null` is a real option, not an empty state: the neutral default is what every app ships, so a\n * reader who tried a colour has to be able to get back. It sits first because that is where a reader\n * looks for \"undo\". Radix values are strings, so it travels as a sentinel.\n */\nconst NONE = \"none\"\n\nexport interface PlatePickerProps {\n value: Plate | null\n onChange: (plate: Plate | null) => void\n /** Accessible name for the group, e.g. \"Accent colour\". */\n label: string\n /** Accessible name for the neutral option, e.g. \"Default\". */\n resetLabel: string\n /**\n * Translated name per plate. Falls back to the plate's own key, which is English - fine for a\n * developer tool, wrong for a product, and the reason this is a prop rather than a table in here.\n */\n plateLabels?: Partial<Record<Plate, string>>\n className?: string\n}\n\nexport function PlatePicker({ value, onChange, label, resetLabel, plateLabels, className }: PlatePickerProps) {\n // The selected ring is drawn INSIDE the swatch (a negative outline offset), not around it.\n // An outer ring needs 4px of room beyond the box, and the leftmost swatch of the first row rarely\n // has it: lyra's own `Panel` scrolls its content with `overflow-y-auto` and `pr-1`, and once one\n // axis is not `visible` CSS computes the other as `auto` too - so the left and top of that ring got\n // clipped with nothing to say why. Padding the picker would fix it only for containers that clip\n // exactly at this edge; drawing inside is true wherever it is mounted.\n const swatch =\n \"size-7 shrink-0 rounded-none border outline-2 -outline-offset-[3px] outline-transparent focus-visible:ring-2 focus-visible:ring-ring\"\n\n return (\n <RadioGroup\n aria-label={label}\n value={value ?? NONE}\n onValueChange={v => onChange(isPlate(v) ? v : null)}\n className={cn(\"flex w-auto flex-wrap gap-2\", className)}\n >\n <RadioGroupPrimitive.Item\n value={NONE}\n aria-label={resetLabel}\n title={resetLabel}\n className={cn(swatch, \"bg-muted border-border data-checked:outline-foreground\")}\n />\n {PLATES.map(p => (\n <RadioGroupPrimitive.Item\n key={p}\n value={p}\n aria-label={plateLabels?.[p] ?? p}\n title={plateLabels?.[p] ?? p}\n data-plate={p}\n // `outline-primary-foreground` inside a `data-plate` scope is the one colour measured to\n // clear 4.5:1 against this exact plate, so the ring is legible on every one of them -\n // including the yellows, where a dark ring is needed and a light one would vanish.\n className={cn(swatch, \"bg-primary border-transparent data-checked:outline-primary-foreground\")}\n />\n ))}\n </RadioGroup>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useSyncExternalStore } from \"react\"\n\n/**\n * Preferences that belong to the DEVICE, not the account.\n *\n * Same granularity as the theme, and stored the same way, so a reader who has learned what \"dark\n * mode here but not on my laptop\" means already knows what a plate does. The account-wide version\n * would need a session, which a scorix shell does not have.\n *\n * ABSENT MEANS DEFAULT, in the store as well as in the markup. Turning a preference off removes its\n * key instead of writing \"off\", so there is one representation of \"no plate\" rather than two - the\n * stylesheet already says so (no `data-plate` resolves to lyra's neutral), and a store that\n * disagreed would make `null` and `\"\"` behave differently for no reason a caller could see.\n */\nexport const PLATE_KEY = \"lyra.plate\"\nexport const COMPACT_KEY = \"lyra.compact\"\n\nconst listeners = new Map<string, Set<() => void>>()\n\nfunction read(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n // Private windows and blocked site data throw on access rather than returning null.\n return null\n }\n}\n\n/**\n * Reads go through `useSyncExternalStore`, not `useState` plus an effect.\n *\n * localStorage is an external store in the precise sense React means: another tab can change it\n * underneath us. The `storage` event covers that, but it does NOT fire in the tab that wrote, so a\n * same-tab write needs its own notification or the picker would show the old swatch until something\n * else re-rendered it. One subscribe carries both paths.\n *\n * The server snapshot is `null` so SSR renders the default and the inline script (see\n * `preference-script.tsx`) is what paints the stored value.\n */\nexport function useStoredSetting(key: string): [string | null, (value: string | null) => void] {\n const subscribe = useCallback(\n (onChange: () => void) => {\n const set = listeners.get(key) ?? new Set<() => void>()\n listeners.set(key, set)\n set.add(onChange)\n const onStorage = (e: StorageEvent) => {\n if (e.key === key) onChange()\n }\n window.addEventListener(\"storage\", onStorage)\n return () => {\n set.delete(onChange)\n window.removeEventListener(\"storage\", onStorage)\n }\n },\n [key],\n )\n\n const value = useSyncExternalStore(\n subscribe,\n () => read(key),\n () => null,\n )\n\n const store = useCallback((next: string | null) => {\n try {\n if (next === null) localStorage.removeItem(key)\n else localStorage.setItem(key, next)\n } catch {\n // A refused write means the choice does not take effect at all, not merely that it fails to\n // survive a reload: the next read returns the old value and the swatch snaps back. Measured,\n // not assumed. It is left that way because the theme does exactly the same under the same\n // condition, and a session-only copy here would make the plate outlive a theme set beside it.\n }\n listeners.get(key)?.forEach(l => l())\n }, [key])\n\n return [value, store]\n}\n\n/**\n * Applied to `<html>`, never to a wrapper element.\n *\n * A Radix portal mounts as a child of `body`, so it inherits custom properties from `body` and from\n * `html` but from no div in between. A plate scoped to an app frame therefore leaves every dialog,\n * popover and toast on the neutral default while the page behind them is tinted. chat does exactly\n * that with its space accent.\n */\nexport function useRootAttribute(name: string, value: string | null) {\n useEffect(() => {\n const root = document.documentElement\n if (value === null) root.removeAttribute(name)\n else root.setAttribute(name, value)\n }, [name, value])\n}\n","\"use client\"\n\nimport { PLATE_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\nimport { isPlate, type Plate } from \"./plate.js\"\n\n/**\n * The plate this device is set to, and a way to change it.\n *\n * A stored name that is no longer a plate - a rename, a downgrade to an older lyra - reads as no\n * plate. The alternative is an attribute no rule matches, which looks identical to the neutral\n * default on screen while the picker shows nothing selected at all, so the reader cannot tell that\n * their choice was dropped or get back to a known state.\n */\nexport function usePlate(): [Plate | null, (plate: Plate | null) => void] {\n const [stored, store] = useStoredSetting(PLATE_KEY)\n const plate = stored !== null && isPlate(stored) ? stored : null\n useRootAttribute(\"data-plate\", plate)\n return [plate, store]\n}\n","\"use client\"\n\nimport { useCallback } from \"react\"\nimport { COMPACT_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\n\nexport function useCompact(): [boolean, (compact: boolean) => void] {\n const [stored, store] = useStoredSetting(COMPACT_KEY)\n const compact = stored === \"true\"\n const setCompact = useCallback((next: boolean) => store(next ? \"true\" : null), [store])\n useRootAttribute(\"data-compact\", compact ? \"true\" : null)\n return [compact, setCompact]\n}\n","import { COMPACT_KEY, PLATE_KEY } from \"./device-setting.js\"\n\n/**\n * Paints the stored plate and density BEFORE the first frame.\n *\n * Without it the attributes arrive from an effect, so the first paint is always the neutral default\n * and every reader who chose a colour watches it flip. This is the trick `next-themes` uses for the\n * same reason, and the reason it works is that localStorage is synchronous: a preference held behind\n * an async query cannot be read here at all.\n *\n * The stored name is applied WITHOUT checking it against the plate list. An unknown name matches no\n * rule in the stylesheet, so it paints exactly like the neutral default, and the hook removes it on\n * hydration; carrying the list in here would put a second copy of it in every page's HTML for a\n * case that is already indistinguishable on screen.\n *\n * Mount it as early in the tree as the app allows, and keep it a raw `script`: an inline\n * `next/script` with `beforeInteractive` is emitted after the head closes rather than inside it, so\n * it no longer runs where that flag promises. A Content-Security-Policy without `unsafe-inline` for\n * `script-src` drops it silently, and the only symptom either way is the flip coming back.\n */\nconst SCRIPT =\n `try{var d=document.documentElement,p=localStorage.getItem(\"${PLATE_KEY}\");` +\n `if(p)d.setAttribute(\"data-plate\",p);` +\n `if(localStorage.getItem(\"${COMPACT_KEY}\")===\"true\")d.setAttribute(\"data-compact\",\"true\")}catch(e){}`\n\nexport function PreferenceScript() {\n return <script dangerouslySetInnerHTML={{ __html: SCRIPT }} />\n}\n"]}
|
package/package.json
CHANGED