agent-relay-server 0.36.2 → 0.37.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/docs/openapi.json +1 -1
- package/package.json +1 -1
- package/public/assets/{activity-C3mkM6AU.js → activity-BgkmA1lh.js} +2 -2
- package/public/assets/{activity-C3mkM6AU.js.map → activity-BgkmA1lh.js.map} +1 -1
- package/public/assets/{agents-CAhQO7JH.js → agents-B7HnuAXx.js} +2 -2
- package/public/assets/{agents-CAhQO7JH.js.map → agents-B7HnuAXx.js.map} +1 -1
- package/public/assets/{analytics-BwihhhNn.js → analytics-0-akxJCJ.js} +2 -2
- package/public/assets/{analytics-BwihhhNn.js.map → analytics-0-akxJCJ.js.map} +1 -1
- package/public/assets/{automation-BLXToUiU.js → automation-CaE1z_-M.js} +2 -2
- package/public/assets/{automation-BLXToUiU.js.map → automation-CaE1z_-M.js.map} +1 -1
- package/public/assets/{chat-8iIPyww9.js → chat-BANKUW05.js} +2 -2
- package/public/assets/{chat-8iIPyww9.js.map → chat-BANKUW05.js.map} +1 -1
- package/public/assets/{formatted-body-impl-BHH0wzY7.js → formatted-body-impl-DExNPNsL.js} +2 -2
- package/public/assets/{formatted-body-impl-BHH0wzY7.js.map → formatted-body-impl-DExNPNsL.js.map} +1 -1
- package/public/assets/{index-CaauKXl9.js → index-DEZdON6c.js} +5 -5
- package/public/assets/{index-CaauKXl9.js.map → index-DEZdON6c.js.map} +1 -1
- package/public/assets/{maintenance-9n_rJCHT.js → maintenance-DpTdJxQp.js} +2 -2
- package/public/assets/{maintenance-9n_rJCHT.js.map → maintenance-DpTdJxQp.js.map} +1 -1
- package/public/assets/{managed-agents-Rp2-xpBx.js → managed-agents-B3df2xfk.js} +2 -2
- package/public/assets/{managed-agents-Rp2-xpBx.js.map → managed-agents-B3df2xfk.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-YfJsGh6I.js → markdown-preview-impl-D0Zj7c3T.js} +2 -2
- package/public/assets/{markdown-preview-impl-YfJsGh6I.js.map → markdown-preview-impl-D0Zj7c3T.js.map} +1 -1
- package/public/assets/{memory-BQONtGQS.js → memory-TATN2vZf.js} +2 -2
- package/public/assets/{memory-BQONtGQS.js.map → memory-TATN2vZf.js.map} +1 -1
- package/public/assets/{messages-DGqpkH72.js → messages-3rS1lxIf.js} +2 -2
- package/public/assets/{messages-DGqpkH72.js.map → messages-3rS1lxIf.js.map} +1 -1
- package/public/assets/{orchestrators-b8k9QoGv.js → orchestrators-CRIV0g5y.js} +2 -2
- package/public/assets/{orchestrators-b8k9QoGv.js.map → orchestrators-CRIV0g5y.js.map} +1 -1
- package/public/assets/{overview-DSU_CggA.js → overview-CmHC_5oM.js} +2 -2
- package/public/assets/{overview-DSU_CggA.js.map → overview-CmHC_5oM.js.map} +1 -1
- package/public/assets/{pairs-DGocNC1U.js → pairs-DBPAhXTI.js} +2 -2
- package/public/assets/{pairs-DGocNC1U.js.map → pairs-DBPAhXTI.js.map} +1 -1
- package/public/assets/{security-BSh0QxOl.js → security-572X5MNX.js} +2 -2
- package/public/assets/{security-BSh0QxOl.js.map → security-572X5MNX.js.map} +1 -1
- package/public/assets/{settings-C03CAJgO.js → settings-vTBu8w3O.js} +2 -2
- package/public/assets/{settings-C03CAJgO.js.map → settings-vTBu8w3O.js.map} +1 -1
- package/public/assets/{tasks-rKbuUPOk.js → tasks-C0bPrDgN.js} +2 -2
- package/public/assets/{tasks-rKbuUPOk.js.map → tasks-C0bPrDgN.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-CA8u4jh3.js → terminal-viewer-impl-rVPA6Fsx.js} +2 -2
- package/public/assets/{terminal-viewer-impl-CA8u4jh3.js.map → terminal-viewer-impl-rVPA6Fsx.js.map} +1 -1
- package/public/assets/{work-queue-DOsA9s4M.js → work-queue-BxkpTt_A.js} +2 -2
- package/public/assets/{work-queue-DOsA9s4M.js.map → work-queue-BxkpTt_A.js.map} +1 -1
- package/public/index.html +1 -1
- package/runner/src/adapter.ts +7 -0
- package/scripts/orchestrator-spawn-smoke.ts +65 -33
- package/src/agent-ref.ts +28 -1
- package/src/bus.ts +52 -41
- package/src/compaction-watch.ts +7 -0
- package/src/index.ts +23 -6
- package/src/lifecycle-manager.ts +33 -71
- package/src/mcp.ts +100 -308
- package/src/routes/agent-sessions.ts +38 -3
- package/src/routes/agents-spawn.ts +43 -174
- package/src/routes/commands.ts +7 -19
- package/src/routes/messages.ts +24 -87
- package/src/security.ts +7 -0
- package/src/services/auth-context.ts +109 -0
- package/src/services/dispatch-command.ts +60 -0
- package/src/services/errors.ts +26 -0
- package/src/services/managed-running.ts +130 -0
- package/src/services/parity-harness.ts +135 -0
- package/src/services/register-agent.ts +74 -0
- package/src/services/send-message.ts +159 -0
- package/src/services/shutdown-agent.ts +234 -0
- package/src/services/spawn-agent.ts +278 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-BSh0QxOl.js","names":[],"sources":["../../dashboard/src/components/views/security.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { KeyRound, Plus, Save, Shield, Trash2, RotateCcw } from 'lucide-react'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport type { TokenConstraints, TokenProfile, TokenRecord } from '@/types'\n\nconst scopeOptions = [\n 'admin:*',\n 'token:read',\n 'token:write',\n 'agent:read',\n 'agent:write',\n 'message:read',\n 'message:send',\n 'task:read',\n 'task:write',\n 'command:read',\n 'command:write',\n 'memory:read',\n 'memory:write',\n 'memory:admin',\n 'mcp:use',\n 'terminal:attach',\n 'logs:read',\n 'integration:read',\n 'integration:write',\n 'channel:read',\n 'channel:write',\n 'stats:read',\n 'health:read',\n 'events:read',\n]\n\ninterface ProfileForm {\n id: string\n name: string\n description: string\n role: string\n scope: string[]\n ttlSeconds: string\n constraints: ConstraintForm\n}\n\ninterface ConstraintForm {\n agents: string\n policies: string\n targets: string\n channels: string\n orchestrators: string\n cwdPrefixes: string\n memoryScopes: string\n spawnRequestIds: string\n terminalAttach: boolean\n logsRead: boolean\n}\n\nconst emptyConstraints: ConstraintForm = {\n agents: '',\n policies: '',\n targets: '',\n channels: '',\n orchestrators: '',\n cwdPrefixes: '',\n memoryScopes: '',\n spawnRequestIds: '',\n terminalAttach: false,\n logsRead: false,\n}\n\nconst emptyProfile: ProfileForm = {\n id: '',\n name: '',\n description: '',\n role: 'provider',\n scope: ['agent:read', 'message:read', 'message:send'],\n ttlSeconds: '86400',\n constraints: { ...emptyConstraints },\n}\n\nexport function SecurityView() {\n const [profiles, setProfiles] = useState<TokenProfile[]>([])\n const [tokens, setTokens] = useState<TokenRecord[]>([])\n const [selectedId, setSelectedId] = useState('')\n const [form, setForm] = useState<ProfileForm>(emptyProfile)\n const [issueProfileId, setIssueProfileId] = useState('')\n const [issueSub, setIssueSub] = useState('')\n const [issueConstraints, setIssueConstraints] = useState<ConstraintForm>({ ...emptyConstraints })\n const [issuedToken, setIssuedToken] = useState('')\n const [status, setStatus] = useState('')\n const [tab, setTab] = useState<'profiles' | 'tokens'>('profiles')\n\n const selected = useMemo(() => profiles.find((profile) => profile.id === selectedId), [profiles, selectedId])\n\n useEffect(() => { void refresh() }, [])\n\n async function refresh() {\n const [nextProfiles, nextTokens] = await Promise.all([\n api<TokenProfile[]>('GET', '/token-profiles'),\n api<TokenRecord[]>('GET', '/tokens'),\n ])\n setProfiles(nextProfiles)\n setTokens(nextTokens)\n if (!selectedId && nextProfiles[0]) {\n setSelectedId(nextProfiles[0].id)\n setForm(profileToForm(nextProfiles[0]))\n setIssueProfileId(nextProfiles[0].id)\n }\n }\n\n function selectProfile(profile: TokenProfile) {\n setSelectedId(profile.id)\n setForm(profileToForm(profile))\n setIssuedToken('')\n }\n\n function newProfile() {\n setSelectedId('')\n setForm({ ...emptyProfile, constraints: { ...emptyConstraints } })\n setStatus('')\n }\n\n async function saveProfile() {\n const body = formToProfileBody(form)\n const saved = selectedId\n ? await api<TokenProfile>('PATCH', `/token-profiles/${encodeURIComponent(selectedId)}`, body)\n : await api<TokenProfile>('POST', '/token-profiles', body)\n await refresh()\n setSelectedId(saved.id)\n setForm(profileToForm(saved))\n setIssueProfileId(saved.id)\n setStatus(`${saved.name} saved`)\n }\n\n async function deleteProfile(profile: TokenProfile) {\n await api('DELETE', `/token-profiles/${encodeURIComponent(profile.id)}`)\n newProfile()\n await refresh()\n }\n\n async function issueToken() {\n const profile = profiles.find((item) => item.id === issueProfileId)\n const result = await api<{ token: string; record: TokenRecord }>('POST', '/tokens', {\n profileId: issueProfileId,\n sub: issueSub || profile?.role || 'component',\n constraints: constraintsFromForm(issueConstraints),\n createdBy: 'dashboard',\n })\n setIssuedToken(result.token)\n setIssueSub('')\n setIssueConstraints({ ...emptyConstraints })\n await refresh()\n }\n\n async function revokeToken(token: TokenRecord) {\n await api('POST', `/tokens/${encodeURIComponent(token.jti)}/revoke`)\n await refresh()\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold\">Security</h1>\n <p className=\"text-sm text-muted-foreground\">Token profiles and scoped component tokens</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-md border border-border overflow-hidden\">\n <button type=\"button\" onClick={() => setTab('profiles')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${tab === 'profiles' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <Shield className=\"h-3.5 w-3.5\" />Profiles\n </button>\n <button type=\"button\" onClick={() => setTab('tokens')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${tab === 'tokens' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <KeyRound className=\"h-3.5 w-3.5\" />Tokens\n </button>\n </div>\n <Button variant=\"outline\" onClick={() => void refresh()}><RotateCcw className=\"h-4 w-4\" />Refresh</Button>\n {tab === 'profiles' && <Button onClick={newProfile}><Plus className=\"h-4 w-4\" />New profile</Button>}\n </div>\n </div>\n\n {tab === 'profiles' && (\n <div className=\"grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><Shield className=\"h-4 w-4\" />Profiles</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {profiles.map((profile) => (\n <button\n key={profile.id}\n type=\"button\"\n onClick={() => selectProfile(profile)}\n className={`w-full rounded-md border px-3 py-2 text-left transition-colors ${profile.id === selectedId ? 'border-primary bg-primary/10' : 'border-border hover:bg-accent'}`}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{profile.name}</span>\n {profile.builtIn && <Badge variant=\"secondary\" className=\"text-[10px]\">built-in</Badge>}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{profile.role}</span>\n <span>{profile.scope.length} scopes</span>\n {profile.ttlSeconds && <span>{formatTtl(profile.ttlSeconds)}</span>}\n </div>\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">{selected ? selected.name : 'New profile'}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Profile id\"><Input disabled={Boolean(selectedId)} value={form.id} onChange={(e) => setForm({ ...form, id: e.target.value })} /></Field>\n <Field label=\"Name\"><Input value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} /></Field>\n <Field label=\"Role\"><Input value={form.role} onChange={(e) => setForm({ ...form, role: e.target.value })} /></Field>\n <Field label=\"TTL seconds\"><Input inputMode=\"numeric\" value={form.ttlSeconds} onChange={(e) => setForm({ ...form, ttlSeconds: e.target.value })} /></Field>\n </div>\n <Field label=\"Description\"><Textarea rows={2} value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} /></Field>\n\n <div className=\"space-y-2\">\n <div className=\"text-sm text-muted-foreground\">Scopes</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {scopeOptions.map((scope) => {\n const active = form.scope.includes(scope)\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => setForm({ ...form, scope: toggle(form.scope, scope) })}\n className={`rounded border px-2 py-1 text-xs ${active ? 'border-primary/50 bg-primary/15 text-primary' : 'border-border text-muted-foreground hover:bg-accent'}`}\n >\n {scope}\n </button>\n )\n })}\n </div>\n </div>\n\n <ConstraintEditor value={form.constraints} onChange={(constraints) => setForm({ ...form, constraints })} />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button disabled={selected?.builtIn} onClick={() => void saveProfile()}><Save className=\"h-4 w-4\" />Save</Button>\n {selected && !selected.builtIn && (\n <Button variant=\"destructive\" onClick={() => void deleteProfile(selected)}><Trash2 className=\"h-4 w-4\" />Delete</Button>\n )}\n {selected?.builtIn && <span className=\"text-xs text-muted-foreground\">Built-in profiles are managed by Relay.</span>}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {tab === 'tokens' && (\n <div className=\"grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><KeyRound className=\"h-4 w-4\" />Issue token</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Field label=\"Profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={issueProfileId} onChange={(e) => setIssueProfileId(e.target.value)}>\n {profiles.map((profile) => <option key={profile.id} value={profile.id}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Subject\"><Input value={issueSub} onChange={(e) => setIssueSub(e.target.value)} placeholder=\"component id\" /></Field>\n <ConstraintEditor compact value={issueConstraints} onChange={setIssueConstraints} />\n <Button className=\"w-full\" disabled={!issueProfileId} onClick={() => void issueToken()}><KeyRound className=\"h-4 w-4\" />Issue</Button>\n {issuedToken && (\n <div className=\"rounded-md border border-border bg-muted/30 p-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"text-xs text-muted-foreground\">New token</span>\n <CopyButton value={issuedToken} label=\"Copy token\" size=\"sm\" variant=\"ghost\" onCopied={() => setStatus('Copied')} />\n </div>\n <code className=\"block max-h-24 overflow-auto break-all text-xs\">{issuedToken}</code>\n </div>\n )}\n {status && <p className=\"text-xs text-muted-foreground\">{status}</p>}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Issued tokens</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {tokens.length === 0 && <p className=\"text-xs text-muted-foreground\">No tokens issued yet</p>}\n {tokens.slice(0, 20).map((token) => (\n <div key={token.jti} className=\"rounded-md border border-border p-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{token.sub}</div>\n <div className=\"text-xs text-muted-foreground\">{token.role} {token.profileId ? `· ${token.profileId}` : ''}</div>\n </div>\n {token.revokedAt ? <Badge variant=\"destructive\">revoked</Badge> : <Button variant=\"ghost\" size=\"sm\" onClick={() => void revokeToken(token)}><Trash2 className=\"h-3.5 w-3.5\" /></Button>}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {token.scope.slice(0, 4).map((scope) => <Badge key={scope} variant=\"outline\" className=\"text-[10px]\">{scope}</Badge>)}\n {token.scope.length > 4 && <Badge variant=\"secondary\" className=\"text-[10px]\">+{token.scope.length - 4}</Badge>}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction ConstraintEditor({ value, onChange, compact = false }: { value: ConstraintForm; onChange: (value: ConstraintForm) => void; compact?: boolean }) {\n const fields: Array<[keyof ConstraintForm, string]> = [\n ['agents', 'Agents'],\n ['policies', 'Policies'],\n ['targets', 'Targets'],\n ['channels', 'Channels'],\n ['orchestrators', 'Orchestrators'],\n ['cwdPrefixes', 'CWD prefixes'],\n ['memoryScopes', 'Memory scopes'],\n ['spawnRequestIds', 'Spawn requests'],\n ]\n return (\n <div className=\"space-y-3\">\n {!compact && <div className=\"text-sm text-muted-foreground\">Constraints</div>}\n <div className={`grid gap-3 ${compact ? '' : 'md:grid-cols-2'}`}>\n {fields.map(([key, label]) => (\n <Field key={key} label={label}>\n <Textarea\n rows={compact ? 2 : 3}\n value={String(value[key] || '')}\n onChange={(e) => onChange({ ...value, [key]: e.target.value })}\n placeholder=\"one per line\"\n />\n </Field>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.terminalAttach} onChange={(e) => onChange({ ...value, terminalAttach: e.target.checked })} />\n Terminal attach\n </label>\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.logsRead} onChange={(e) => onChange({ ...value, logsRead: e.target.checked })} />\n Log read\n </label>\n </div>\n </div>\n )\n}\n\nfunction profileToForm(profile: TokenProfile): ProfileForm {\n return {\n id: profile.id,\n name: profile.name,\n description: profile.description || '',\n role: profile.role,\n scope: profile.scope,\n ttlSeconds: profile.ttlSeconds ? String(profile.ttlSeconds) : '',\n constraints: formFromConstraints(profile.constraints),\n }\n}\n\nfunction formToProfileBody(form: ProfileForm) {\n return {\n id: form.id || undefined,\n name: form.name,\n description: form.description || undefined,\n role: form.role,\n scope: form.scope,\n ttlSeconds: form.ttlSeconds ? Number(form.ttlSeconds) : undefined,\n constraints: constraintsFromForm(form.constraints),\n }\n}\n\nfunction formFromConstraints(constraints: TokenConstraints | undefined): ConstraintForm {\n return {\n agents: linesText(constraints?.agents),\n policies: linesText(constraints?.policies),\n targets: linesText(constraints?.targets),\n channels: linesText(constraints?.channels),\n orchestrators: linesText(constraints?.orchestrators),\n cwdPrefixes: linesText(constraints?.cwdPrefixes),\n memoryScopes: linesText(constraints?.memoryScopes),\n spawnRequestIds: linesText(constraints?.spawnRequestIds),\n terminalAttach: constraints?.terminalAttach === true,\n logsRead: constraints?.logsRead === true,\n }\n}\n\nfunction constraintsFromForm(form: ConstraintForm): TokenConstraints | undefined {\n const constraints: TokenConstraints = {}\n const arrayFields: Array<keyof ConstraintForm> = ['agents', 'policies', 'targets', 'channels', 'orchestrators', 'cwdPrefixes', 'memoryScopes', 'spawnRequestIds']\n for (const field of arrayFields) {\n const values = lines(String(form[field] || ''))\n if (values.length) Object.assign(constraints, { [field]: values })\n }\n if (form.terminalAttach) constraints.terminalAttach = true\n if (form.logsRead) constraints.logsRead = true\n return Object.keys(constraints).length ? constraints : undefined\n}\n\nfunction lines(value: string): string[] {\n return value.split(/\\r?\\n|,/).map((line) => line.trim()).filter(Boolean)\n}\n\nfunction linesText(value: string[] | undefined): string {\n return (value ?? []).join('\\n')\n}\n\nfunction toggle(values: string[], item: string): string[] {\n return values.includes(item) ? values.filter((value) => value !== item) : [...values, item]\n}\n\nfunction formatTtl(seconds: number): string {\n if (seconds % 86400 === 0) return `${seconds / 86400}d`\n if (seconds % 3600 === 0) return `${seconds / 3600}h`\n return `${seconds}s`\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"security-572X5MNX.js","names":[],"sources":["../../dashboard/src/components/views/security.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { KeyRound, Plus, Save, Shield, Trash2, RotateCcw } from 'lucide-react'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport type { TokenConstraints, TokenProfile, TokenRecord } from '@/types'\n\nconst scopeOptions = [\n 'admin:*',\n 'token:read',\n 'token:write',\n 'agent:read',\n 'agent:write',\n 'message:read',\n 'message:send',\n 'task:read',\n 'task:write',\n 'command:read',\n 'command:write',\n 'memory:read',\n 'memory:write',\n 'memory:admin',\n 'mcp:use',\n 'terminal:attach',\n 'logs:read',\n 'integration:read',\n 'integration:write',\n 'channel:read',\n 'channel:write',\n 'stats:read',\n 'health:read',\n 'events:read',\n]\n\ninterface ProfileForm {\n id: string\n name: string\n description: string\n role: string\n scope: string[]\n ttlSeconds: string\n constraints: ConstraintForm\n}\n\ninterface ConstraintForm {\n agents: string\n policies: string\n targets: string\n channels: string\n orchestrators: string\n cwdPrefixes: string\n memoryScopes: string\n spawnRequestIds: string\n terminalAttach: boolean\n logsRead: boolean\n}\n\nconst emptyConstraints: ConstraintForm = {\n agents: '',\n policies: '',\n targets: '',\n channels: '',\n orchestrators: '',\n cwdPrefixes: '',\n memoryScopes: '',\n spawnRequestIds: '',\n terminalAttach: false,\n logsRead: false,\n}\n\nconst emptyProfile: ProfileForm = {\n id: '',\n name: '',\n description: '',\n role: 'provider',\n scope: ['agent:read', 'message:read', 'message:send'],\n ttlSeconds: '86400',\n constraints: { ...emptyConstraints },\n}\n\nexport function SecurityView() {\n const [profiles, setProfiles] = useState<TokenProfile[]>([])\n const [tokens, setTokens] = useState<TokenRecord[]>([])\n const [selectedId, setSelectedId] = useState('')\n const [form, setForm] = useState<ProfileForm>(emptyProfile)\n const [issueProfileId, setIssueProfileId] = useState('')\n const [issueSub, setIssueSub] = useState('')\n const [issueConstraints, setIssueConstraints] = useState<ConstraintForm>({ ...emptyConstraints })\n const [issuedToken, setIssuedToken] = useState('')\n const [status, setStatus] = useState('')\n const [tab, setTab] = useState<'profiles' | 'tokens'>('profiles')\n\n const selected = useMemo(() => profiles.find((profile) => profile.id === selectedId), [profiles, selectedId])\n\n useEffect(() => { void refresh() }, [])\n\n async function refresh() {\n const [nextProfiles, nextTokens] = await Promise.all([\n api<TokenProfile[]>('GET', '/token-profiles'),\n api<TokenRecord[]>('GET', '/tokens'),\n ])\n setProfiles(nextProfiles)\n setTokens(nextTokens)\n if (!selectedId && nextProfiles[0]) {\n setSelectedId(nextProfiles[0].id)\n setForm(profileToForm(nextProfiles[0]))\n setIssueProfileId(nextProfiles[0].id)\n }\n }\n\n function selectProfile(profile: TokenProfile) {\n setSelectedId(profile.id)\n setForm(profileToForm(profile))\n setIssuedToken('')\n }\n\n function newProfile() {\n setSelectedId('')\n setForm({ ...emptyProfile, constraints: { ...emptyConstraints } })\n setStatus('')\n }\n\n async function saveProfile() {\n const body = formToProfileBody(form)\n const saved = selectedId\n ? await api<TokenProfile>('PATCH', `/token-profiles/${encodeURIComponent(selectedId)}`, body)\n : await api<TokenProfile>('POST', '/token-profiles', body)\n await refresh()\n setSelectedId(saved.id)\n setForm(profileToForm(saved))\n setIssueProfileId(saved.id)\n setStatus(`${saved.name} saved`)\n }\n\n async function deleteProfile(profile: TokenProfile) {\n await api('DELETE', `/token-profiles/${encodeURIComponent(profile.id)}`)\n newProfile()\n await refresh()\n }\n\n async function issueToken() {\n const profile = profiles.find((item) => item.id === issueProfileId)\n const result = await api<{ token: string; record: TokenRecord }>('POST', '/tokens', {\n profileId: issueProfileId,\n sub: issueSub || profile?.role || 'component',\n constraints: constraintsFromForm(issueConstraints),\n createdBy: 'dashboard',\n })\n setIssuedToken(result.token)\n setIssueSub('')\n setIssueConstraints({ ...emptyConstraints })\n await refresh()\n }\n\n async function revokeToken(token: TokenRecord) {\n await api('POST', `/tokens/${encodeURIComponent(token.jti)}/revoke`)\n await refresh()\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold\">Security</h1>\n <p className=\"text-sm text-muted-foreground\">Token profiles and scoped component tokens</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-md border border-border overflow-hidden\">\n <button type=\"button\" onClick={() => setTab('profiles')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm transition-colors ${tab === 'profiles' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <Shield className=\"h-3.5 w-3.5\" />Profiles\n </button>\n <button type=\"button\" onClick={() => setTab('tokens')} className={`flex items-center gap-1.5 px-3 py-1.5 text-sm border-l border-border transition-colors ${tab === 'tokens' ? 'bg-primary/15 text-primary' : 'text-muted-foreground hover:bg-accent'}`}>\n <KeyRound className=\"h-3.5 w-3.5\" />Tokens\n </button>\n </div>\n <Button variant=\"outline\" onClick={() => void refresh()}><RotateCcw className=\"h-4 w-4\" />Refresh</Button>\n {tab === 'profiles' && <Button onClick={newProfile}><Plus className=\"h-4 w-4\" />New profile</Button>}\n </div>\n </div>\n\n {tab === 'profiles' && (\n <div className=\"grid gap-4 xl:grid-cols-[340px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><Shield className=\"h-4 w-4\" />Profiles</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {profiles.map((profile) => (\n <button\n key={profile.id}\n type=\"button\"\n onClick={() => selectProfile(profile)}\n className={`w-full rounded-md border px-3 py-2 text-left transition-colors ${profile.id === selectedId ? 'border-primary bg-primary/10' : 'border-border hover:bg-accent'}`}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{profile.name}</span>\n {profile.builtIn && <Badge variant=\"secondary\" className=\"text-[10px]\">built-in</Badge>}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{profile.role}</span>\n <span>{profile.scope.length} scopes</span>\n {profile.ttlSeconds && <span>{formatTtl(profile.ttlSeconds)}</span>}\n </div>\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">{selected ? selected.name : 'New profile'}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Profile id\"><Input disabled={Boolean(selectedId)} value={form.id} onChange={(e) => setForm({ ...form, id: e.target.value })} /></Field>\n <Field label=\"Name\"><Input value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} /></Field>\n <Field label=\"Role\"><Input value={form.role} onChange={(e) => setForm({ ...form, role: e.target.value })} /></Field>\n <Field label=\"TTL seconds\"><Input inputMode=\"numeric\" value={form.ttlSeconds} onChange={(e) => setForm({ ...form, ttlSeconds: e.target.value })} /></Field>\n </div>\n <Field label=\"Description\"><Textarea rows={2} value={form.description} onChange={(e) => setForm({ ...form, description: e.target.value })} /></Field>\n\n <div className=\"space-y-2\">\n <div className=\"text-sm text-muted-foreground\">Scopes</div>\n <div className=\"flex flex-wrap gap-1.5\">\n {scopeOptions.map((scope) => {\n const active = form.scope.includes(scope)\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => setForm({ ...form, scope: toggle(form.scope, scope) })}\n className={`rounded border px-2 py-1 text-xs ${active ? 'border-primary/50 bg-primary/15 text-primary' : 'border-border text-muted-foreground hover:bg-accent'}`}\n >\n {scope}\n </button>\n )\n })}\n </div>\n </div>\n\n <ConstraintEditor value={form.constraints} onChange={(constraints) => setForm({ ...form, constraints })} />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button disabled={selected?.builtIn} onClick={() => void saveProfile()}><Save className=\"h-4 w-4\" />Save</Button>\n {selected && !selected.builtIn && (\n <Button variant=\"destructive\" onClick={() => void deleteProfile(selected)}><Trash2 className=\"h-4 w-4\" />Delete</Button>\n )}\n {selected?.builtIn && <span className=\"text-xs text-muted-foreground\">Built-in profiles are managed by Relay.</span>}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {tab === 'tokens' && (\n <div className=\"grid gap-4 xl:grid-cols-[380px_minmax(0,1fr)]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-sm\"><KeyRound className=\"h-4 w-4\" />Issue token</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Field label=\"Profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={issueProfileId} onChange={(e) => setIssueProfileId(e.target.value)}>\n {profiles.map((profile) => <option key={profile.id} value={profile.id}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Subject\"><Input value={issueSub} onChange={(e) => setIssueSub(e.target.value)} placeholder=\"component id\" /></Field>\n <ConstraintEditor compact value={issueConstraints} onChange={setIssueConstraints} />\n <Button className=\"w-full\" disabled={!issueProfileId} onClick={() => void issueToken()}><KeyRound className=\"h-4 w-4\" />Issue</Button>\n {issuedToken && (\n <div className=\"rounded-md border border-border bg-muted/30 p-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"text-xs text-muted-foreground\">New token</span>\n <CopyButton value={issuedToken} label=\"Copy token\" size=\"sm\" variant=\"ghost\" onCopied={() => setStatus('Copied')} />\n </div>\n <code className=\"block max-h-24 overflow-auto break-all text-xs\">{issuedToken}</code>\n </div>\n )}\n {status && <p className=\"text-xs text-muted-foreground\">{status}</p>}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Issued tokens</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {tokens.length === 0 && <p className=\"text-xs text-muted-foreground\">No tokens issued yet</p>}\n {tokens.slice(0, 20).map((token) => (\n <div key={token.jti} className=\"rounded-md border border-border p-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{token.sub}</div>\n <div className=\"text-xs text-muted-foreground\">{token.role} {token.profileId ? `· ${token.profileId}` : ''}</div>\n </div>\n {token.revokedAt ? <Badge variant=\"destructive\">revoked</Badge> : <Button variant=\"ghost\" size=\"sm\" onClick={() => void revokeToken(token)}><Trash2 className=\"h-3.5 w-3.5\" /></Button>}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {token.scope.slice(0, 4).map((scope) => <Badge key={scope} variant=\"outline\" className=\"text-[10px]\">{scope}</Badge>)}\n {token.scope.length > 4 && <Badge variant=\"secondary\" className=\"text-[10px]\">+{token.scope.length - 4}</Badge>}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction ConstraintEditor({ value, onChange, compact = false }: { value: ConstraintForm; onChange: (value: ConstraintForm) => void; compact?: boolean }) {\n const fields: Array<[keyof ConstraintForm, string]> = [\n ['agents', 'Agents'],\n ['policies', 'Policies'],\n ['targets', 'Targets'],\n ['channels', 'Channels'],\n ['orchestrators', 'Orchestrators'],\n ['cwdPrefixes', 'CWD prefixes'],\n ['memoryScopes', 'Memory scopes'],\n ['spawnRequestIds', 'Spawn requests'],\n ]\n return (\n <div className=\"space-y-3\">\n {!compact && <div className=\"text-sm text-muted-foreground\">Constraints</div>}\n <div className={`grid gap-3 ${compact ? '' : 'md:grid-cols-2'}`}>\n {fields.map(([key, label]) => (\n <Field key={key} label={label}>\n <Textarea\n rows={compact ? 2 : 3}\n value={String(value[key] || '')}\n onChange={(e) => onChange({ ...value, [key]: e.target.value })}\n placeholder=\"one per line\"\n />\n </Field>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.terminalAttach} onChange={(e) => onChange({ ...value, terminalAttach: e.target.checked })} />\n Terminal attach\n </label>\n <label className=\"flex items-center gap-2 rounded border border-border px-2 py-1 text-xs\">\n <input type=\"checkbox\" checked={value.logsRead} onChange={(e) => onChange({ ...value, logsRead: e.target.checked })} />\n Log read\n </label>\n </div>\n </div>\n )\n}\n\nfunction profileToForm(profile: TokenProfile): ProfileForm {\n return {\n id: profile.id,\n name: profile.name,\n description: profile.description || '',\n role: profile.role,\n scope: profile.scope,\n ttlSeconds: profile.ttlSeconds ? String(profile.ttlSeconds) : '',\n constraints: formFromConstraints(profile.constraints),\n }\n}\n\nfunction formToProfileBody(form: ProfileForm) {\n return {\n id: form.id || undefined,\n name: form.name,\n description: form.description || undefined,\n role: form.role,\n scope: form.scope,\n ttlSeconds: form.ttlSeconds ? Number(form.ttlSeconds) : undefined,\n constraints: constraintsFromForm(form.constraints),\n }\n}\n\nfunction formFromConstraints(constraints: TokenConstraints | undefined): ConstraintForm {\n return {\n agents: linesText(constraints?.agents),\n policies: linesText(constraints?.policies),\n targets: linesText(constraints?.targets),\n channels: linesText(constraints?.channels),\n orchestrators: linesText(constraints?.orchestrators),\n cwdPrefixes: linesText(constraints?.cwdPrefixes),\n memoryScopes: linesText(constraints?.memoryScopes),\n spawnRequestIds: linesText(constraints?.spawnRequestIds),\n terminalAttach: constraints?.terminalAttach === true,\n logsRead: constraints?.logsRead === true,\n }\n}\n\nfunction constraintsFromForm(form: ConstraintForm): TokenConstraints | undefined {\n const constraints: TokenConstraints = {}\n const arrayFields: Array<keyof ConstraintForm> = ['agents', 'policies', 'targets', 'channels', 'orchestrators', 'cwdPrefixes', 'memoryScopes', 'spawnRequestIds']\n for (const field of arrayFields) {\n const values = lines(String(form[field] || ''))\n if (values.length) Object.assign(constraints, { [field]: values })\n }\n if (form.terminalAttach) constraints.terminalAttach = true\n if (form.logsRead) constraints.logsRead = true\n return Object.keys(constraints).length ? constraints : undefined\n}\n\nfunction lines(value: string): string[] {\n return value.split(/\\r?\\n|,/).map((line) => line.trim()).filter(Boolean)\n}\n\nfunction linesText(value: string[] | undefined): string {\n return (value ?? []).join('\\n')\n}\n\nfunction toggle(values: string[], item: string): string[] {\n return values.includes(item) ? values.filter((value) => value !== item) : [...values, item]\n}\n\nfunction formatTtl(seconds: number): string {\n if (seconds % 86400 === 0) return `${seconds / 86400}d`\n if (seconds % 3600 === 0) return `${seconds / 3600}h`\n return `${seconds}s`\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Hn as n,O as r,On as i,c as a,dn as o,en as s,g as c,h as l,in as u,jn as d,rn as f,vt as p,wt as m}from"./lucide-react-DLQFnqNm.js";import{t as h}from"./react-dom-CzfKBOnw.js";import{c as g,o as _,t as v}from"./store-DKVWC6Uh.js";import{o as y,r as b}from"./dist-BQ52MnS1.js";import{t as x}from"./dist-DRlgXPi_.js";import{i as S,n as C,t as w}from"./dist-SqFV12iO.js";import{a as T,i as E,n as D,o as O,r as ee,t as k}from"./dist-CrBurS6i.js";import{t as A}from"./dist-BgfF2Rlm.js";import{a as te,i as ne,n as re,o as ie,r as ae,s as j,t as oe}from"./es2015-iucXYTIE.js";import{t as se}from"./dist-CnJzBTp1.js";import{t as ce}from"./dist-D6iXJzms.js";import{r as M,t as N}from"./switch-W2_mhdrR.js";import{t as le}from"./dist-CVTST7Gc.js";import{t as P}from"./button-BsMqBNJb.js";import{t as F}from"./input-dPzf0luy.js";import{r as I,z as ue}from"./index-CaauKXl9.js";var L=e(n(),1),de=e(h(),1),R=t(),fe=[` `,`Enter`,`ArrowUp`,`ArrowDown`],pe=[` `,`Enter`],z=`Select`,[me,B,he]=O(z),[V,ge]=S(z,[he,T]),_e=T(),[ve,H]=V(z),[ye,be]=V(z),xe=e=>{let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:l,name:u,autoComplete:d,disabled:f,required:p,form:m}=e,h=_e(t),[g,_]=L.useState(null),[v,y]=L.useState(null),[b,x]=L.useState(!1),S=se(l),[C,w]=A({prop:r,defaultProp:i??!1,onChange:a,caller:z}),[T,D]=A({prop:o,defaultProp:s,onChange:c,caller:z}),O=L.useRef(null),ee=g?m||!!g.closest(`form`):!0,[k,te]=L.useState(new Set),ne=Array.from(k).map(e=>e.props.value).join(`;`);return(0,R.jsx)(E,{...h,children:(0,R.jsxs)(ve,{required:p,scope:t,trigger:g,onTriggerChange:_,valueNode:v,onValueNodeChange:y,valueNodeHasChildren:b,onValueNodeHasChildrenChange:x,contentId:j(),value:T,onValueChange:D,open:C,onOpenChange:w,dir:S,triggerPointerDownPosRef:O,disabled:f,children:[(0,R.jsx)(me.Provider,{scope:t,children:(0,R.jsx)(ye,{scope:e.__scopeSelect,onNativeOptionAdd:L.useCallback(e=>{te(t=>new Set(t).add(e))},[]),onNativeOptionRemove:L.useCallback(e=>{te(t=>{let n=new Set(t);return n.delete(e),n})},[]),children:n})}),ee?(0,R.jsxs)(ft,{"aria-hidden":!0,required:p,tabIndex:-1,name:u,autoComplete:d,value:T,onChange:e=>D(e.target.value),disabled:f,form:m,children:[T===void 0?(0,R.jsx)(`option`,{value:``}):null,Array.from(k)]},ne):null]})})};xe.displayName=z;var Se=`SelectTrigger`,Ce=L.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,a=_e(n),o=H(Se,n),s=o.disabled||r,c=y(t,o.onTriggerChange),l=B(n),u=L.useRef(`touch`),[d,f,p]=mt(e=>{let t=l().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.value===o.value));n!==void 0&&o.onValueChange(n.value)}),m=e=>{s||(o.onOpenChange(!0),p()),e&&(o.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,R.jsx)(k,{asChild:!0,...a,children:(0,R.jsx)(x.button,{type:`button`,role:`combobox`,"aria-controls":o.contentId,"aria-expanded":o.open,"aria-required":o.required,"aria-autocomplete":`none`,dir:o.dir,"data-state":o.open?`open`:`closed`,disabled:s,"data-disabled":s?``:void 0,"data-placeholder":pt(o.value)?``:void 0,...i,ref:c,onClick:C(i.onClick,e=>{e.currentTarget.focus(),u.current!==`mouse`&&m(e)}),onPointerDown:C(i.onPointerDown,e=>{u.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(m(e),e.preventDefault())}),onKeyDown:C(i.onKeyDown,e=>{let t=d.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&f(e.key),!(t&&e.key===` `)&&fe.includes(e.key)&&(m(),e.preventDefault())})})})});Ce.displayName=Se;var we=`SelectValue`,Te=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:a,placeholder:o=``,...s}=e,c=H(we,n),{onValueNodeHasChildrenChange:l}=c,u=a!==void 0,d=y(t,c.onValueNodeChange);return w(()=>{l(u)},[l,u]),(0,R.jsx)(x.span,{...s,ref:d,style:{pointerEvents:`none`},children:pt(c.value)?(0,R.jsx)(R.Fragment,{children:o}):a})});Te.displayName=we;var Ee=`SelectIcon`,De=L.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,R.jsx)(x.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});De.displayName=Ee;var Oe=`SelectPortal`,ke=e=>(0,R.jsx)(ne,{asChild:!0,...e});ke.displayName=Oe;var U=`SelectContent`,Ae=L.forwardRef((e,t)=>{let n=H(U,e.__scopeSelect),[r,i]=L.useState();if(w(()=>{i(new DocumentFragment)},[]),!n.open){let t=r;return t?de.createPortal((0,R.jsx)(je,{scope:e.__scopeSelect,children:(0,R.jsx)(me.Slot,{scope:e.__scopeSelect,children:(0,R.jsx)(`div`,{children:e.children})})}),t):null}return(0,R.jsx)(Pe,{...e,ref:t})});Ae.displayName=U;var W=10,[je,G]=V(U),Me=`SelectContentImpl`,Ne=b(`SelectContent.RemoveScroll`),Pe=L.forwardRef((e,t)=>{let{__scopeSelect:n,position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:a,onPointerDownOutside:o,side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g,..._}=e,v=H(U,n),[b,x]=L.useState(null),[S,w]=L.useState(null),T=y(t,e=>x(e)),[E,D]=L.useState(null),[O,ee]=L.useState(null),k=B(n),[A,ne]=L.useState(!1),j=L.useRef(!1);L.useEffect(()=>{if(b)return oe(b)},[b]),ae();let se=L.useCallback(e=>{let[t,...n]=k().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&S&&(S.scrollTop=0),n===r&&S&&(S.scrollTop=S.scrollHeight),n?.focus(),document.activeElement!==i))return},[k,S]),ce=L.useCallback(()=>se([E,b]),[se,E,b]);L.useEffect(()=>{A&&ce()},[A,ce]);let{onOpenChange:M,triggerPointerDownPosRef:N}=v;L.useEffect(()=>{if(b){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(N.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(N.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():b.contains(n.target)||M(!1),document.removeEventListener(`pointermove`,t),N.current=null};return N.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[b,M,N]),L.useEffect(()=>{let e=()=>M(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[M]);let[le,P]=mt(e=>{let t=k().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current.focus())}),F=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&(D(e),r&&(j.current=!0))},[v.value]),I=L.useCallback(()=>b?.focus(),[b]),ue=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&ee(e)},[v.value]),de=r===`popper`?Re:Ie,fe=de===Re?{side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g}:{};return(0,R.jsx)(je,{scope:n,content:b,viewport:S,onViewportChange:w,itemRefCallback:F,selectedItem:E,onItemLeave:I,itemTextRefCallback:ue,focusSelectedItem:ce,selectedItemText:O,position:r,isPositioned:A,searchRef:le,children:(0,R.jsx)(re,{as:Ne,allowPinchZoom:!0,children:(0,R.jsx)(te,{asChild:!0,trapped:v.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:C(i,e=>{v.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,R.jsx)(ie,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>v.onOpenChange(!1),children:(0,R.jsx)(de,{role:`listbox`,id:v.contentId,"data-state":v.open?`open`:`closed`,dir:v.dir,onContextMenu:e=>e.preventDefault(),..._,...fe,onPlaced:()=>ne(!0),ref:T,style:{display:`flex`,flexDirection:`column`,outline:`none`,..._.style},onKeyDown:C(_.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&P(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=k().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>se(t)),e.preventDefault()}})})})})})})});Pe.displayName=Me;var Fe=`SelectItemAlignedPosition`,Ie=L.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,a=H(U,n),o=G(U,n),[s,c]=L.useState(null),[l,u]=L.useState(null),d=y(t,e=>u(e)),f=B(n),p=L.useRef(!1),m=L.useRef(!0),{viewport:h,selectedItem:g,selectedItemText:_,focusSelectedItem:v}=o,b=L.useCallback(()=>{if(a.trigger&&a.valueNode&&s&&l&&h&&g&&_){let e=a.trigger.getBoundingClientRect(),t=l.getBoundingClientRect(),n=a.valueNode.getBoundingClientRect(),i=_.getBoundingClientRect();if(a.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.right=d+`px`}let o=f(),c=window.innerHeight-W*2,u=h.scrollHeight,d=window.getComputedStyle(l),m=parseInt(d.borderTopWidth,10),v=parseInt(d.paddingTop,10),y=parseInt(d.borderBottomWidth,10),b=parseInt(d.paddingBottom,10),x=m+v+u+b+y,S=Math.min(g.offsetHeight*5,x),C=window.getComputedStyle(h),w=parseInt(C.paddingTop,10),T=parseInt(C.paddingBottom,10),E=e.top+e.height/2-W,D=c-E,O=g.offsetHeight/2,ee=g.offsetTop+O,k=m+v+ee,A=x-k;if(k<=E){let e=o.length>0&&g===o[o.length-1].ref.current;s.style.bottom=`0px`;let t=l.clientHeight-h.offsetTop-h.offsetHeight,n=k+Math.max(D,O+(e?T:0)+t+y);s.style.height=n+`px`}else{let e=o.length>0&&g===o[0].ref.current;s.style.top=`0px`;let t=Math.max(E,m+h.offsetTop+(e?w:0)+O)+A;s.style.height=t+`px`,h.scrollTop=k-E+h.offsetTop}s.style.margin=`${W}px 0`,s.style.minHeight=S+`px`,s.style.maxHeight=c+`px`,r?.(),requestAnimationFrame(()=>p.current=!0)}},[f,a.trigger,a.valueNode,s,l,h,g,_,a.dir,r]);w(()=>b(),[b]);let[S,C]=L.useState();return w(()=>{l&&C(window.getComputedStyle(l).zIndex)},[l]),(0,R.jsx)(ze,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:p,onScrollButtonChange:L.useCallback(e=>{e&&m.current===!0&&(b(),v?.(),m.current=!1)},[b,v]),children:(0,R.jsx)(`div`,{ref:c,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:S},children:(0,R.jsx)(x.div,{...i,ref:d,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ie.displayName=Fe;var Le=`SelectPopperPosition`,Re=L.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=W,...a}=e,o=_e(n);return(0,R.jsx)(ee,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Re.displayName=Le;var[ze,Be]=V(U,{}),Ve=`SelectViewport`,He=L.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,a=G(Ve,n),o=Be(Ve,n),s=y(t,a.onViewportChange),c=L.useRef(0);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,R.jsx)(me.Slot,{scope:n,children:(0,R.jsx)(x.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:s,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:C(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=o;if(r?.current&&n){let e=Math.abs(c.current-t.scrollTop);if(e>0){let r=window.innerHeight-W*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}c.current=t.scrollTop})})})]})});He.displayName=Ve;var Ue=`SelectGroup`,[We,Ge]=V(Ue),Ke=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=j();return(0,R.jsx)(We,{scope:n,id:i,children:(0,R.jsx)(x.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ke.displayName=Ue;var qe=`SelectLabel`,Je=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Ge(qe,n);return(0,R.jsx)(x.div,{id:i.id,...r,ref:t})});Je.displayName=qe;var Ye=`SelectItem`,[Xe,Ze]=V(Ye),Qe=L.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:a,...o}=e,s=H(Ye,n),c=G(Ye,n),l=s.value===r,[u,d]=L.useState(a??``),[f,p]=L.useState(!1),m=y(t,e=>c.itemRefCallback?.(e,r,i)),h=j(),g=L.useRef(`touch`),_=()=>{i||(s.onValueChange(r),s.onOpenChange(!1))};if(r===``)throw Error(`A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.`);return(0,R.jsx)(Xe,{scope:n,value:r,disabled:i,textId:h,isSelected:l,onItemTextChange:L.useCallback(e=>{d(t=>t||(e?.textContent??``).trim())},[]),children:(0,R.jsx)(me.ItemSlot,{scope:n,value:r,disabled:i,textValue:u,children:(0,R.jsx)(x.div,{role:`option`,"aria-labelledby":h,"data-highlighted":f?``:void 0,"aria-selected":l&&f,"data-state":l?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...o,ref:m,onFocus:C(o.onFocus,()=>p(!0)),onBlur:C(o.onBlur,()=>p(!1)),onClick:C(o.onClick,()=>{g.current!==`mouse`&&_()}),onPointerUp:C(o.onPointerUp,()=>{g.current===`mouse`&&_()}),onPointerDown:C(o.onPointerDown,e=>{g.current=e.pointerType}),onPointerMove:C(o.onPointerMove,e=>{g.current=e.pointerType,i?c.onItemLeave?.():g.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:C(o.onPointerLeave,e=>{e.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:C(o.onKeyDown,e=>{c.searchRef?.current!==``&&e.key===` `||(pe.includes(e.key)&&_(),e.key===` `&&e.preventDefault())})})})})});Qe.displayName=Ye;var K=`SelectItemText`,$e=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...a}=e,o=H(K,n),s=G(K,n),c=Ze(K,n),l=be(K,n),[u,d]=L.useState(null),f=y(t,e=>d(e),c.onItemTextChange,e=>s.itemTextRefCallback?.(e,c.value,c.disabled)),p=u?.textContent,m=L.useMemo(()=>(0,R.jsx)(`option`,{value:c.value,disabled:c.disabled,children:p},c.value),[c.disabled,c.value,p]),{onNativeOptionAdd:h,onNativeOptionRemove:g}=l;return w(()=>(h(m),()=>g(m)),[h,g,m]),(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(x.span,{id:c.textId,...a,ref:f}),c.isSelected&&o.valueNode&&!o.valueNodeHasChildren?de.createPortal(a.children,o.valueNode):null]})});$e.displayName=K;var et=`SelectItemIndicator`,tt=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Ze(et,n).isSelected?(0,R.jsx)(x.span,{"aria-hidden":!0,...r,ref:t}):null});tt.displayName=et;var nt=`SelectScrollUpButton`,rt=L.forwardRef((e,t)=>{let n=G(nt,e.__scopeSelect),r=Be(nt,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){a(t.scrollTop>0)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});rt.displayName=nt;var it=`SelectScrollDownButton`,at=L.forwardRef((e,t)=>{let n=G(it,e.__scopeSelect),r=Be(it,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight;a(Math.ceil(t.scrollTop)<e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});at.displayName=it;var ot=L.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=G(`SelectScrollButton`,n),o=L.useRef(null),s=B(n),c=L.useCallback(()=>{o.current!==null&&(window.clearInterval(o.current),o.current=null)},[]);return L.useEffect(()=>()=>c(),[c]),w(()=>{s().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[s]),(0,R.jsx)(x.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:C(i.onPointerDown,()=>{o.current===null&&(o.current=window.setInterval(r,50))}),onPointerMove:C(i.onPointerMove,()=>{a.onItemLeave?.(),o.current===null&&(o.current=window.setInterval(r,50))}),onPointerLeave:C(i.onPointerLeave,()=>{c()})})}),st=`SelectSeparator`,ct=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,R.jsx)(x.div,{"aria-hidden":!0,...r,ref:t})});ct.displayName=st;var lt=`SelectArrow`,ut=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=_e(n),a=H(lt,n),o=G(lt,n);return a.open&&o.position===`popper`?(0,R.jsx)(D,{...i,...r,ref:t}):null});ut.displayName=lt;var dt=`SelectBubbleInput`,ft=L.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{let i=L.useRef(null),a=y(r,i),o=M(t);return L.useEffect(()=>{let e=i.current;if(!e)return;let n=window.HTMLSelectElement.prototype,r=Object.getOwnPropertyDescriptor(n,`value`).set;if(o!==t&&r){let n=new Event(`change`,{bubbles:!0});r.call(e,t),e.dispatchEvent(n)}},[o,t]),(0,R.jsx)(x.select,{...n,style:{...ue,...n.style},ref:a,defaultValue:t})});ft.displayName=dt;function pt(e){return e===``||e===void 0}function mt(e){let t=ce(e),n=L.useRef(``),r=L.useRef(0),i=L.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=L.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return L.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function ht(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=gt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function gt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var _t=xe,vt=Ce,yt=Te,bt=De,xt=ke,St=Ae,Ct=He,wt=Qe,Tt=$e,Et=tt,Dt=rt,Ot=at;function q({...e}){return(0,R.jsx)(_t,{"data-slot":`select`,...e})}function J({...e}){return(0,R.jsx)(yt,{"data-slot":`select-value`,...e})}function Y({className:e,size:t=`default`,children:n,...r}){return(0,R.jsxs)(vt,{"data-slot":`select-trigger`,"data-size":t,className:i(`flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,e),...r,children:[n,(0,R.jsx)(bt,{asChild:!0,children:(0,R.jsx)(f,{className:`pointer-events-none size-4 text-muted-foreground`})})]})}function X({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...a}){return(0,R.jsx)(xt,{children:(0,R.jsxs)(St,{"data-slot":`select-content`,"data-align-trigger":n===`item-aligned`,className:i(`relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...a,children:[(0,R.jsx)(kt,{}),(0,R.jsx)(Ct,{"data-position":n,className:i(`data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)`,n===`popper`&&``),children:t}),(0,R.jsx)(At,{})]})})}function Z({className:e,children:t,...n}){return(0,R.jsxs)(wt,{"data-slot":`select-item`,className:i(`relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,R.jsx)(`span`,{className:`pointer-events-none absolute right-2 flex size-4 items-center justify-center`,children:(0,R.jsx)(Et,{children:(0,R.jsx)(u,{className:`pointer-events-none`})})}),(0,R.jsx)(Tt,{children:t})]})}function kt({className:e,...t}){return(0,R.jsx)(Dt,{"data-slot":`select-scroll-up-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(s,{})})}function At({className:e,...t}){return(0,R.jsx)(Ot,{"data-slot":`select-scroll-down-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(f,{})})}var jt=[`claude`,`codex`];function Mt(){let[e,t]=(0,L.useState)({}),[n,i]=(0,L.useState)(`claude`),[a,o]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/providers/config`).then(t).catch(e=>o(e.message))},[]);let s=e[n],u=r=>{s&&t({...e,[n]:{...s,...r}})};async function f(){if(!s)return;let r=await d(`PUT`,`/providers/${n}/config`,s);t({...e,[n]:r}),o(`${n} saved`)}async function p(){let e=await d(`POST`,`/providers/${n}/config/test`);o(e.ok?`${n} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,R.jsx)(`div`,{className:`flex gap-2`,children:jt.map(e=>(0,R.jsxs)(P,{variant:n===e?`default`:`outline`,onClick:()=>i(e),children:[(0,R.jsx)(c,{className:`w-4 h-4`}),e]},e))})]}),s&&(0,R.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Command`,children:(0,R.jsx)(F,{value:s.command,onChange:e=>u({command:e.target.value})})}),(0,R.jsx)(Q,{label:`Default arguments`,children:(0,R.jsx)(I,{rows:3,value:s.defaultArgs.join(`
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Hn as n,O as r,On as i,c as a,dn as o,en as s,g as c,h as l,in as u,jn as d,rn as f,vt as p,wt as m}from"./lucide-react-DLQFnqNm.js";import{t as h}from"./react-dom-CzfKBOnw.js";import{c as g,o as _,t as v}from"./store-DKVWC6Uh.js";import{o as y,r as b}from"./dist-BQ52MnS1.js";import{t as x}from"./dist-DRlgXPi_.js";import{i as S,n as C,t as w}from"./dist-SqFV12iO.js";import{a as T,i as E,n as D,o as O,r as ee,t as k}from"./dist-CrBurS6i.js";import{t as A}from"./dist-BgfF2Rlm.js";import{a as te,i as ne,n as re,o as ie,r as ae,s as j,t as oe}from"./es2015-iucXYTIE.js";import{t as se}from"./dist-CnJzBTp1.js";import{t as ce}from"./dist-D6iXJzms.js";import{r as M,t as N}from"./switch-W2_mhdrR.js";import{t as le}from"./dist-CVTST7Gc.js";import{t as P}from"./button-BsMqBNJb.js";import{t as F}from"./input-dPzf0luy.js";import{r as I,z as ue}from"./index-DEZdON6c.js";var L=e(n(),1),de=e(h(),1),R=t(),fe=[` `,`Enter`,`ArrowUp`,`ArrowDown`],pe=[` `,`Enter`],z=`Select`,[me,B,he]=O(z),[V,ge]=S(z,[he,T]),_e=T(),[ve,H]=V(z),[ye,be]=V(z),xe=e=>{let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:l,name:u,autoComplete:d,disabled:f,required:p,form:m}=e,h=_e(t),[g,_]=L.useState(null),[v,y]=L.useState(null),[b,x]=L.useState(!1),S=se(l),[C,w]=A({prop:r,defaultProp:i??!1,onChange:a,caller:z}),[T,D]=A({prop:o,defaultProp:s,onChange:c,caller:z}),O=L.useRef(null),ee=g?m||!!g.closest(`form`):!0,[k,te]=L.useState(new Set),ne=Array.from(k).map(e=>e.props.value).join(`;`);return(0,R.jsx)(E,{...h,children:(0,R.jsxs)(ve,{required:p,scope:t,trigger:g,onTriggerChange:_,valueNode:v,onValueNodeChange:y,valueNodeHasChildren:b,onValueNodeHasChildrenChange:x,contentId:j(),value:T,onValueChange:D,open:C,onOpenChange:w,dir:S,triggerPointerDownPosRef:O,disabled:f,children:[(0,R.jsx)(me.Provider,{scope:t,children:(0,R.jsx)(ye,{scope:e.__scopeSelect,onNativeOptionAdd:L.useCallback(e=>{te(t=>new Set(t).add(e))},[]),onNativeOptionRemove:L.useCallback(e=>{te(t=>{let n=new Set(t);return n.delete(e),n})},[]),children:n})}),ee?(0,R.jsxs)(ft,{"aria-hidden":!0,required:p,tabIndex:-1,name:u,autoComplete:d,value:T,onChange:e=>D(e.target.value),disabled:f,form:m,children:[T===void 0?(0,R.jsx)(`option`,{value:``}):null,Array.from(k)]},ne):null]})})};xe.displayName=z;var Se=`SelectTrigger`,Ce=L.forwardRef((e,t)=>{let{__scopeSelect:n,disabled:r=!1,...i}=e,a=_e(n),o=H(Se,n),s=o.disabled||r,c=y(t,o.onTriggerChange),l=B(n),u=L.useRef(`touch`),[d,f,p]=mt(e=>{let t=l().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.value===o.value));n!==void 0&&o.onValueChange(n.value)}),m=e=>{s||(o.onOpenChange(!0),p()),e&&(o.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})};return(0,R.jsx)(k,{asChild:!0,...a,children:(0,R.jsx)(x.button,{type:`button`,role:`combobox`,"aria-controls":o.contentId,"aria-expanded":o.open,"aria-required":o.required,"aria-autocomplete":`none`,dir:o.dir,"data-state":o.open?`open`:`closed`,disabled:s,"data-disabled":s?``:void 0,"data-placeholder":pt(o.value)?``:void 0,...i,ref:c,onClick:C(i.onClick,e=>{e.currentTarget.focus(),u.current!==`mouse`&&m(e)}),onPointerDown:C(i.onPointerDown,e=>{u.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(m(e),e.preventDefault())}),onKeyDown:C(i.onKeyDown,e=>{let t=d.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&f(e.key),!(t&&e.key===` `)&&fe.includes(e.key)&&(m(),e.preventDefault())})})})});Ce.displayName=Se;var we=`SelectValue`,Te=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,children:a,placeholder:o=``,...s}=e,c=H(we,n),{onValueNodeHasChildrenChange:l}=c,u=a!==void 0,d=y(t,c.onValueNodeChange);return w(()=>{l(u)},[l,u]),(0,R.jsx)(x.span,{...s,ref:d,style:{pointerEvents:`none`},children:pt(c.value)?(0,R.jsx)(R.Fragment,{children:o}):a})});Te.displayName=we;var Ee=`SelectIcon`,De=L.forwardRef((e,t)=>{let{__scopeSelect:n,children:r,...i}=e;return(0,R.jsx)(x.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})});De.displayName=Ee;var Oe=`SelectPortal`,ke=e=>(0,R.jsx)(ne,{asChild:!0,...e});ke.displayName=Oe;var U=`SelectContent`,Ae=L.forwardRef((e,t)=>{let n=H(U,e.__scopeSelect),[r,i]=L.useState();if(w(()=>{i(new DocumentFragment)},[]),!n.open){let t=r;return t?de.createPortal((0,R.jsx)(je,{scope:e.__scopeSelect,children:(0,R.jsx)(me.Slot,{scope:e.__scopeSelect,children:(0,R.jsx)(`div`,{children:e.children})})}),t):null}return(0,R.jsx)(Pe,{...e,ref:t})});Ae.displayName=U;var W=10,[je,G]=V(U),Me=`SelectContentImpl`,Ne=b(`SelectContent.RemoveScroll`),Pe=L.forwardRef((e,t)=>{let{__scopeSelect:n,position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:a,onPointerDownOutside:o,side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g,..._}=e,v=H(U,n),[b,x]=L.useState(null),[S,w]=L.useState(null),T=y(t,e=>x(e)),[E,D]=L.useState(null),[O,ee]=L.useState(null),k=B(n),[A,ne]=L.useState(!1),j=L.useRef(!1);L.useEffect(()=>{if(b)return oe(b)},[b]),ae();let se=L.useCallback(e=>{let[t,...n]=k().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&S&&(S.scrollTop=0),n===r&&S&&(S.scrollTop=S.scrollHeight),n?.focus(),document.activeElement!==i))return},[k,S]),ce=L.useCallback(()=>se([E,b]),[se,E,b]);L.useEffect(()=>{A&&ce()},[A,ce]);let{onOpenChange:M,triggerPointerDownPosRef:N}=v;L.useEffect(()=>{if(b){let e={x:0,y:0},t=t=>{e={x:Math.abs(Math.round(t.pageX)-(N.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(N.current?.y??0))}},n=n=>{e.x<=10&&e.y<=10?n.preventDefault():b.contains(n.target)||M(!1),document.removeEventListener(`pointermove`,t),N.current=null};return N.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[b,M,N]),L.useEffect(()=>{let e=()=>M(!1);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[M]);let[le,P]=mt(e=>{let t=k().filter(e=>!e.disabled),n=ht(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current.focus())}),F=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&(D(e),r&&(j.current=!0))},[v.value]),I=L.useCallback(()=>b?.focus(),[b]),ue=L.useCallback((e,t,n)=>{let r=!j.current&&!n;(v.value!==void 0&&v.value===t||r)&&ee(e)},[v.value]),de=r===`popper`?Re:Ie,fe=de===Re?{side:s,sideOffset:c,align:l,alignOffset:u,arrowPadding:d,collisionBoundary:f,collisionPadding:p,sticky:m,hideWhenDetached:h,avoidCollisions:g}:{};return(0,R.jsx)(je,{scope:n,content:b,viewport:S,onViewportChange:w,itemRefCallback:F,selectedItem:E,onItemLeave:I,itemTextRefCallback:ue,focusSelectedItem:ce,selectedItemText:O,position:r,isPositioned:A,searchRef:le,children:(0,R.jsx)(re,{as:Ne,allowPinchZoom:!0,children:(0,R.jsx)(te,{asChild:!0,trapped:v.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:C(i,e=>{v.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,R.jsx)(ie,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>v.onOpenChange(!1),children:(0,R.jsx)(de,{role:`listbox`,id:v.contentId,"data-state":v.open?`open`:`closed`,dir:v.dir,onContextMenu:e=>e.preventDefault(),..._,...fe,onPlaced:()=>ne(!0),ref:T,style:{display:`flex`,flexDirection:`column`,outline:`none`,..._.style},onKeyDown:C(_.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&P(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=k().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>se(t)),e.preventDefault()}})})})})})})});Pe.displayName=Me;var Fe=`SelectItemAlignedPosition`,Ie=L.forwardRef((e,t)=>{let{__scopeSelect:n,onPlaced:r,...i}=e,a=H(U,n),o=G(U,n),[s,c]=L.useState(null),[l,u]=L.useState(null),d=y(t,e=>u(e)),f=B(n),p=L.useRef(!1),m=L.useRef(!0),{viewport:h,selectedItem:g,selectedItemText:_,focusSelectedItem:v}=o,b=L.useCallback(()=>{if(a.trigger&&a.valueNode&&s&&l&&h&&g&&_){let e=a.trigger.getBoundingClientRect(),t=l.getBoundingClientRect(),n=a.valueNode.getBoundingClientRect(),i=_.getBoundingClientRect();if(a.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,c=e.width+o,l=Math.max(c,t.width),u=window.innerWidth-W,d=le(a,[W,Math.max(W,u-l)]);s.style.minWidth=c+`px`,s.style.right=d+`px`}let o=f(),c=window.innerHeight-W*2,u=h.scrollHeight,d=window.getComputedStyle(l),m=parseInt(d.borderTopWidth,10),v=parseInt(d.paddingTop,10),y=parseInt(d.borderBottomWidth,10),b=parseInt(d.paddingBottom,10),x=m+v+u+b+y,S=Math.min(g.offsetHeight*5,x),C=window.getComputedStyle(h),w=parseInt(C.paddingTop,10),T=parseInt(C.paddingBottom,10),E=e.top+e.height/2-W,D=c-E,O=g.offsetHeight/2,ee=g.offsetTop+O,k=m+v+ee,A=x-k;if(k<=E){let e=o.length>0&&g===o[o.length-1].ref.current;s.style.bottom=`0px`;let t=l.clientHeight-h.offsetTop-h.offsetHeight,n=k+Math.max(D,O+(e?T:0)+t+y);s.style.height=n+`px`}else{let e=o.length>0&&g===o[0].ref.current;s.style.top=`0px`;let t=Math.max(E,m+h.offsetTop+(e?w:0)+O)+A;s.style.height=t+`px`,h.scrollTop=k-E+h.offsetTop}s.style.margin=`${W}px 0`,s.style.minHeight=S+`px`,s.style.maxHeight=c+`px`,r?.(),requestAnimationFrame(()=>p.current=!0)}},[f,a.trigger,a.valueNode,s,l,h,g,_,a.dir,r]);w(()=>b(),[b]);let[S,C]=L.useState();return w(()=>{l&&C(window.getComputedStyle(l).zIndex)},[l]),(0,R.jsx)(ze,{scope:n,contentWrapper:s,shouldExpandOnScrollRef:p,onScrollButtonChange:L.useCallback(e=>{e&&m.current===!0&&(b(),v?.(),m.current=!1)},[b,v]),children:(0,R.jsx)(`div`,{ref:c,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:S},children:(0,R.jsx)(x.div,{...i,ref:d,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})});Ie.displayName=Fe;var Le=`SelectPopperPosition`,Re=L.forwardRef((e,t)=>{let{__scopeSelect:n,align:r=`start`,collisionPadding:i=W,...a}=e,o=_e(n);return(0,R.jsx)(ee,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})});Re.displayName=Le;var[ze,Be]=V(U,{}),Ve=`SelectViewport`,He=L.forwardRef((e,t)=>{let{__scopeSelect:n,nonce:r,...i}=e,a=G(Ve,n),o=Be(Ve,n),s=y(t,a.onViewportChange),c=L.useRef(0);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,R.jsx)(me.Slot,{scope:n,children:(0,R.jsx)(x.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:s,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:C(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=o;if(r?.current&&n){let e=Math.abs(c.current-t.scrollTop);if(e>0){let r=window.innerHeight-W*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}c.current=t.scrollTop})})})]})});He.displayName=Ve;var Ue=`SelectGroup`,[We,Ge]=V(Ue),Ke=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=j();return(0,R.jsx)(We,{scope:n,id:i,children:(0,R.jsx)(x.div,{role:`group`,"aria-labelledby":i,...r,ref:t})})});Ke.displayName=Ue;var qe=`SelectLabel`,Je=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=Ge(qe,n);return(0,R.jsx)(x.div,{id:i.id,...r,ref:t})});Je.displayName=qe;var Ye=`SelectItem`,[Xe,Ze]=V(Ye),Qe=L.forwardRef((e,t)=>{let{__scopeSelect:n,value:r,disabled:i=!1,textValue:a,...o}=e,s=H(Ye,n),c=G(Ye,n),l=s.value===r,[u,d]=L.useState(a??``),[f,p]=L.useState(!1),m=y(t,e=>c.itemRefCallback?.(e,r,i)),h=j(),g=L.useRef(`touch`),_=()=>{i||(s.onValueChange(r),s.onOpenChange(!1))};if(r===``)throw Error(`A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.`);return(0,R.jsx)(Xe,{scope:n,value:r,disabled:i,textId:h,isSelected:l,onItemTextChange:L.useCallback(e=>{d(t=>t||(e?.textContent??``).trim())},[]),children:(0,R.jsx)(me.ItemSlot,{scope:n,value:r,disabled:i,textValue:u,children:(0,R.jsx)(x.div,{role:`option`,"aria-labelledby":h,"data-highlighted":f?``:void 0,"aria-selected":l&&f,"data-state":l?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...o,ref:m,onFocus:C(o.onFocus,()=>p(!0)),onBlur:C(o.onBlur,()=>p(!1)),onClick:C(o.onClick,()=>{g.current!==`mouse`&&_()}),onPointerUp:C(o.onPointerUp,()=>{g.current===`mouse`&&_()}),onPointerDown:C(o.onPointerDown,e=>{g.current=e.pointerType}),onPointerMove:C(o.onPointerMove,e=>{g.current=e.pointerType,i?c.onItemLeave?.():g.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:C(o.onPointerLeave,e=>{e.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:C(o.onKeyDown,e=>{c.searchRef?.current!==``&&e.key===` `||(pe.includes(e.key)&&_(),e.key===` `&&e.preventDefault())})})})})});Qe.displayName=Ye;var K=`SelectItemText`,$e=L.forwardRef((e,t)=>{let{__scopeSelect:n,className:r,style:i,...a}=e,o=H(K,n),s=G(K,n),c=Ze(K,n),l=be(K,n),[u,d]=L.useState(null),f=y(t,e=>d(e),c.onItemTextChange,e=>s.itemTextRefCallback?.(e,c.value,c.disabled)),p=u?.textContent,m=L.useMemo(()=>(0,R.jsx)(`option`,{value:c.value,disabled:c.disabled,children:p},c.value),[c.disabled,c.value,p]),{onNativeOptionAdd:h,onNativeOptionRemove:g}=l;return w(()=>(h(m),()=>g(m)),[h,g,m]),(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(x.span,{id:c.textId,...a,ref:f}),c.isSelected&&o.valueNode&&!o.valueNodeHasChildren?de.createPortal(a.children,o.valueNode):null]})});$e.displayName=K;var et=`SelectItemIndicator`,tt=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return Ze(et,n).isSelected?(0,R.jsx)(x.span,{"aria-hidden":!0,...r,ref:t}):null});tt.displayName=et;var nt=`SelectScrollUpButton`,rt=L.forwardRef((e,t)=>{let n=G(nt,e.__scopeSelect),r=Be(nt,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){a(t.scrollTop>0)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null});rt.displayName=nt;var it=`SelectScrollDownButton`,at=L.forwardRef((e,t)=>{let n=G(it,e.__scopeSelect),r=Be(it,e.__scopeSelect),[i,a]=L.useState(!1),o=y(t,r.onScrollButtonChange);return w(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight;a(Math.ceil(t.scrollTop)<e)},t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,R.jsx)(ot,{...e,ref:o,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null});at.displayName=it;var ot=L.forwardRef((e,t)=>{let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=G(`SelectScrollButton`,n),o=L.useRef(null),s=B(n),c=L.useCallback(()=>{o.current!==null&&(window.clearInterval(o.current),o.current=null)},[]);return L.useEffect(()=>()=>c(),[c]),w(()=>{s().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[s]),(0,R.jsx)(x.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:C(i.onPointerDown,()=>{o.current===null&&(o.current=window.setInterval(r,50))}),onPointerMove:C(i.onPointerMove,()=>{a.onItemLeave?.(),o.current===null&&(o.current=window.setInterval(r,50))}),onPointerLeave:C(i.onPointerLeave,()=>{c()})})}),st=`SelectSeparator`,ct=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e;return(0,R.jsx)(x.div,{"aria-hidden":!0,...r,ref:t})});ct.displayName=st;var lt=`SelectArrow`,ut=L.forwardRef((e,t)=>{let{__scopeSelect:n,...r}=e,i=_e(n),a=H(lt,n),o=G(lt,n);return a.open&&o.position===`popper`?(0,R.jsx)(D,{...i,...r,ref:t}):null});ut.displayName=lt;var dt=`SelectBubbleInput`,ft=L.forwardRef(({__scopeSelect:e,value:t,...n},r)=>{let i=L.useRef(null),a=y(r,i),o=M(t);return L.useEffect(()=>{let e=i.current;if(!e)return;let n=window.HTMLSelectElement.prototype,r=Object.getOwnPropertyDescriptor(n,`value`).set;if(o!==t&&r){let n=new Event(`change`,{bubbles:!0});r.call(e,t),e.dispatchEvent(n)}},[o,t]),(0,R.jsx)(x.select,{...n,style:{...ue,...n.style},ref:a,defaultValue:t})});ft.displayName=dt;function pt(e){return e===``||e===void 0}function mt(e){let t=ce(e),n=L.useRef(``),r=L.useRef(0),i=L.useCallback(e=>{let i=n.current+e;t(i),(function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))})(i)},[t]),a=L.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return L.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}function ht(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=gt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function gt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var _t=xe,vt=Ce,yt=Te,bt=De,xt=ke,St=Ae,Ct=He,wt=Qe,Tt=$e,Et=tt,Dt=rt,Ot=at;function q({...e}){return(0,R.jsx)(_t,{"data-slot":`select`,...e})}function J({...e}){return(0,R.jsx)(yt,{"data-slot":`select-value`,...e})}function Y({className:e,size:t=`default`,children:n,...r}){return(0,R.jsxs)(vt,{"data-slot":`select-trigger`,"data-size":t,className:i(`flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,e),...r,children:[n,(0,R.jsx)(bt,{asChild:!0,children:(0,R.jsx)(f,{className:`pointer-events-none size-4 text-muted-foreground`})})]})}function X({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...a}){return(0,R.jsx)(xt,{children:(0,R.jsxs)(St,{"data-slot":`select-content`,"data-align-trigger":n===`item-aligned`,className:i(`relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...a,children:[(0,R.jsx)(kt,{}),(0,R.jsx)(Ct,{"data-position":n,className:i(`data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)`,n===`popper`&&``),children:t}),(0,R.jsx)(At,{})]})})}function Z({className:e,children:t,...n}){return(0,R.jsxs)(wt,{"data-slot":`select-item`,className:i(`relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,R.jsx)(`span`,{className:`pointer-events-none absolute right-2 flex size-4 items-center justify-center`,children:(0,R.jsx)(Et,{children:(0,R.jsx)(u,{className:`pointer-events-none`})})}),(0,R.jsx)(Tt,{children:t})]})}function kt({className:e,...t}){return(0,R.jsx)(Dt,{"data-slot":`select-scroll-up-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(s,{})})}function At({className:e,...t}){return(0,R.jsx)(Ot,{"data-slot":`select-scroll-down-button`,className:i(`z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4`,e),...t,children:(0,R.jsx)(f,{})})}var jt=[`claude`,`codex`];function Mt(){let[e,t]=(0,L.useState)({}),[n,i]=(0,L.useState)(`claude`),[a,o]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/providers/config`).then(t).catch(e=>o(e.message))},[]);let s=e[n],u=r=>{s&&t({...e,[n]:{...s,...r}})};async function f(){if(!s)return;let r=await d(`PUT`,`/providers/${n}/config`,s);t({...e,[n]:r}),o(`${n} saved`)}async function p(){let e=await d(`POST`,`/providers/${n}/config/test`);o(e.ok?`${n} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,R.jsx)(`div`,{className:`flex gap-2`,children:jt.map(e=>(0,R.jsxs)(P,{variant:n===e?`default`:`outline`,onClick:()=>i(e),children:[(0,R.jsx)(c,{className:`w-4 h-4`}),e]},e))})]}),s&&(0,R.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Command`,children:(0,R.jsx)(F,{value:s.command,onChange:e=>u({command:e.target.value})})}),(0,R.jsx)(Q,{label:`Default arguments`,children:(0,R.jsx)(I,{rows:3,value:s.defaultArgs.join(`
|
|
2
2
|
`),onChange:e=>u({defaultArgs:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Plugin directories`,children:(0,R.jsx)(I,{rows:3,value:s.pluginDirs.join(`
|
|
3
3
|
`),onChange:e=>u({pluginDirs:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Environment`,children:(0,R.jsx)(I,{rows:5,value:Bt(s.env),onChange:e=>u({env:Vt(e.target.value)})})})]}),(0,R.jsxs)(`section`,{className:`space-y-3`,children:[(0,R.jsx)(Q,{label:`Capabilities`,children:(0,R.jsx)(I,{rows:3,value:s.defaultCapabilities.join(`
|
|
4
4
|
`),onChange:e=>u({defaultCapabilities:$(e.target.value)})})}),(0,R.jsx)(Q,{label:`Tags`,children:(0,R.jsx)(I,{rows:3,value:s.defaultTags.join(`
|
|
@@ -7,4 +7,4 @@ import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Hn as n,O as r,On as i,c
|
|
|
7
7
|
`),onChange:n=>t({...e,symlinkPaths:$(n.target.value)})})}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,R.jsxs)(P,{onClick:a,children:[(0,R.jsx)(r,{className:`w-4 h-4`}),`Save`]}),n&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function Ft(){let e=v(e=>e.showReasoning),t=v(e=>e.set);return(0,R.jsx)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(o,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Show reasoning details`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Show the agent's internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.`})]})]}),(0,R.jsx)(N,{checked:e,onCheckedChange:e=>t({showReasoning:e})})]})})}function It(){let e=v(e=>e.voiceTtsEnabled),t=v(e=>e.setVoiceTtsEnabled),n=v(e=>e.voiceTtsMode),r=v(e=>e.setVoiceTtsMode),i=v(e=>e.voiceTtsKokoroVoice),o=v(e=>e.setVoiceTtsKokoroVoice),s=v(e=>e.voiceTtsBrowserVoice),c=v(e=>e.setVoiceTtsBrowserVoice),l=v(e=>e.voiceInputMode),u=v(e=>e.setVoiceInputMode),[d,f]=(0,L.useState)(()=>g());(0,L.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>f(g());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let p=_.some(e=>e.id===i)?_:[..._,{id:i,label:i}];return(0,R.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(a,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Voice`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Speak agent responses aloud in the active chat, and how push-to-talk behaves.`})]})]}),(0,R.jsx)(N,{checked:e,onCheckedChange:t})]}),(0,R.jsx)(Q,{label:`Speech engine`,children:(0,R.jsxs)(q,{value:n,onValueChange:e=>r(e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`kokoro`,children:`Kokoro (server, natural — falls back to browser)`}),(0,R.jsx)(Z,{value:`browser`,children:`Browser (Web Speech API)`})]})]})}),(0,R.jsx)(Q,{label:`Kokoro voice`,children:(0,R.jsxs)(q,{value:i,onValueChange:o,children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsx)(X,{children:p.map(e=>(0,R.jsx)(Z,{value:e.id,children:e.label},e.id))})]})}),(0,R.jsx)(Q,{label:`Browser voice`,children:(0,R.jsxs)(q,{value:s||`__default__`,onValueChange:e=>c(e===`__default__`?``:e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`__default__`,children:`System default`}),d.map(e=>(0,R.jsx)(Z,{value:e.uri,children:e.label},e.uri))]})]})}),(0,R.jsx)(Q,{label:`Push-to-talk input`,children:(0,R.jsxs)(q,{value:l,onValueChange:e=>u(e),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`compose`,children:`Fill the message box (review, then Enter)`}),(0,R.jsx)(Z,{value:`autosend`,children:`Send immediately (speak-and-send)`})]})]})})]})}var Lt=[`low`,`medium`,`high`,`xhigh`,`max`],Rt={enabled:!1,provider:`claude`,permissionMode:`open`,keepaliveSeconds:300};function zt(){let[e,t]=(0,L.useState)(Rt),[n,i]=(0,L.useState)(``);(0,L.useEffect)(()=>{d(`GET`,`/steward-config`).then(e=>t({...Rt,...e.value})).catch(e=>i(e.message))},[]);let a=e=>t(t=>({...t,...e}));async function o(){try{let n=await d(`PUT`,`/steward-config`,e);t({...Rt,...n.value}),i(`Steward config saved`)}catch(e){i(e.message)}}return(0,R.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(p,{className:`w-4 h-4`}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Stewards`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Auto-resolve merge conflicts & diverged branches across all repos. Provider-independent — applies to every repo's steward.`})]})]}),(0,R.jsx)(N,{checked:e.enabled,onCheckedChange:e=>a({enabled:e})})]}),(0,R.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,R.jsx)(Q,{label:`Provider`,children:(0,R.jsxs)(q,{value:e.provider,onValueChange:e=>a({provider:e}),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsx)(X,{children:jt.map(e=>(0,R.jsx)(Z,{value:e,children:e},e))})]})}),(0,R.jsx)(Q,{label:`Model (optional)`,children:(0,R.jsx)(F,{value:e.model??``,placeholder:`e.g. gpt-5.5`,onChange:e=>a({model:e.target.value.trim()||void 0})})}),(0,R.jsx)(Q,{label:`Effort`,children:(0,R.jsxs)(q,{value:e.effort??`default`,onValueChange:e=>a({effort:e===`default`?void 0:e}),children:[(0,R.jsx)(Y,{children:(0,R.jsx)(J,{})}),(0,R.jsxs)(X,{children:[(0,R.jsx)(Z,{value:`default`,children:`Provider default`}),Lt.map(e=>(0,R.jsx)(Z,{value:e,children:e},e))]})]})}),(0,R.jsx)(Q,{label:`Idle timeout (seconds)`,children:(0,R.jsx)(F,{type:`number`,value:e.keepaliveSeconds,onChange:e=>a({keepaliveSeconds:Number(e.target.value)||300})})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,R.jsxs)(P,{onClick:o,children:[(0,R.jsx)(r,{className:`w-4 h-4`}),`Save`]}),n&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function Q({label:e,children:t}){return(0,R.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function $(e){return e.split(`
|
|
8
8
|
`).map(e=>e.trim()).filter(Boolean)}function Bt(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
|
|
9
9
|
`)}function Vt(e){return Object.fromEntries($(e).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}export{Mt as SettingsView};
|
|
10
|
-
//# sourceMappingURL=settings-
|
|
10
|
+
//# sourceMappingURL=settings-vTBu8w3O.js.map
|