@polderlabs/bizar 7.0.0 → 7.0.2
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/README.md +125 -47
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js +114 -0
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js.map +1 -0
- package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js +1 -0
- package/bizar-dash/dist/assets/{MobileChat-D7zRhU9K.js.map → MobileChat-DLWdv6tQ.js.map} +1 -1
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js +1 -0
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js.map +1 -0
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js +26 -0
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js.map +1 -0
- package/bizar-dash/dist/assets/main-306CZfn6.js +430 -0
- package/bizar-dash/dist/assets/main-306CZfn6.js.map +1 -0
- package/bizar-dash/dist/assets/main-G3bNDpY3.css +1 -0
- package/bizar-dash/dist/assets/mobile-C_naUN91.js +1 -0
- package/bizar-dash/dist/assets/{mobile-DXYCA0hC.js.map → mobile-C_naUN91.js.map} +1 -1
- package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +1 -0
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js +211 -0
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js.map +1 -0
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js +65 -0
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js.map +1 -0
- package/bizar-dash/dist/index.html +7 -13
- package/bizar-dash/dist/mobile.html +3 -8
- package/bizar-dash/src/server/memory-consolidator.mjs +8 -1
- package/bizar-dash/src/web/mobile/MobileApp.tsx +33 -2
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +2 -2
- package/bizar-dash/src/web/mobile/MobileEval.tsx +4 -4
- package/bizar-dash/src/web/mobile/MobileMemory.tsx +2 -2
- package/bizar-dash/src/web/mobile/MobileSettings.tsx +3 -3
- package/bizar-dash/src/web/mobile/MobileTasks.tsx +2 -2
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +3 -3
- package/bizar-dash/src/web/styles/mobile.css +41 -0
- package/bizar-dash/src/web/styles/tasks-redesign.css +34 -12
- package/bizar-dash/src/web/ui/controls/Textarea.tsx +56 -0
- package/bizar-dash/src/web/ui/controls/controls.css +22 -0
- package/bizar-dash/src/web/ui/controls/index.ts +2 -0
- package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +48 -0
- package/bizar-dash/src/web/ui/layout/index.ts +1 -0
- package/bizar-dash/src/web/ui/layout/layout.css +51 -0
- package/bizar-dash/src/web/ui/styles/tokens.css +13 -0
- package/bizar-dash/src/web/views/Agents.tsx +10 -2
- package/bizar-dash/src/web/views/Overview.tsx +2 -13
- package/bizar-dash/src/web/views/Tasks.tsx +1 -7
- package/bizar-dash/tests/ui/controls/Textarea.test.tsx +56 -0
- package/bizar-dash/tests/ui/layout/ViewHeader.test.tsx +47 -0
- package/cli/provision-claude.mjs +94 -0
- package/package.json +1 -1
- package/bizar-dash/dist/assets/EnvVarsSection-CW6fWKds.js +0 -4
- package/bizar-dash/dist/assets/EnvVarsSection-CW6fWKds.js.map +0 -1
- package/bizar-dash/dist/assets/MobileChat-D7zRhU9K.js +0 -1
- package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js +0 -1
- package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js.map +0 -1
- package/bizar-dash/dist/assets/Toast-WTxc3m2g.js +0 -1
- package/bizar-dash/dist/assets/Toast-WTxc3m2g.js.map +0 -1
- package/bizar-dash/dist/assets/flow-BpU0-gK2.js +0 -1
- package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +0 -1
- package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +0 -1
- package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +0 -1
- package/bizar-dash/dist/assets/icons-B0AKnYI3.js +0 -731
- package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +0 -1
- package/bizar-dash/dist/assets/main-C-Md3DaY.css +0 -1
- package/bizar-dash/dist/assets/main-CO8fIxQK.js +0 -18
- package/bizar-dash/dist/assets/main-CO8fIxQK.js.map +0 -1
- package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +0 -1
- package/bizar-dash/dist/assets/markdown-w2bDDkAH.js.map +0 -1
- package/bizar-dash/dist/assets/mobile-DXYCA0hC.js +0 -1
- package/bizar-dash/dist/assets/mobile-layout-CJnZNLy3.css +0 -1
- package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js +0 -2
- package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js.map +0 -1
- package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +0 -1
- package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +0 -46
- package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +0 -1
- package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js +0 -2
- package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js.map +0 -1
- package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +0 -45
- package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +0 -1
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["Button","forwardRef","variant","size","iconOnly","loading","disabled","className","children","rest","ref","jsxs","cn","Card","interactive","jsx","CardTitle","CardMeta","PACKAGES","UpdatesSection","toast","useToast","status","setStatus","useState","useEffect","ws","Ws","msg","s","m","existing","api","e","check","err","applyUpdate","restart","isBusy","Download","p","cur","lat","_a","isOutdated","pkgStatus","CheckCircle","AlertCircle","AlertTriangle","RefreshCw","useAutosave","initialValue","saveFn","delay","onSaved","onError","value","setValue","timeoutRef","useRef","pendingValueRef","lastSavedValue","hasPendingDebounceRef","save","useCallback","v","setValueAndSave","toSave","clearDebounce","flush","AutosaveField","render","handleBlur","React","Loader","Check","LAYOUTS","GeneralSection","settings","patchUi","patchTop","autoSave","Fragment","LayoutIcon","l","onChange","onBlur","TailscaleSettings","initialStatus","authKey","setAuthKey","setLoading","error","setError","r","loadStatus","handleAuthenticate","handleSetupServe","_b","_c","handleRemoveServe","isInstalled","isAuthenticated","isServeEnabled","serveUrl","Plug","LinkIcon","SystemLlmSection","Sparkles","BACKEND_OPTIONS","HeadroomSettingsCard","onPatch","stats","setStats","loadingStatus","setLoadingStatus","installing","setInstalling","wrapping","setWrapping","unwrapping","setUnwrapping","startingProxy","setStartingProxy","stoppingProxy","setStoppingProxy","st","handleInstall","handleWrap","handleUnwrap","handleStartProxy","handleStopProxy","handleOpenDashboard","spawn","__vitePreload","installed","version","proxyRunning","proxyPort","wrapped","ratio","saved","Activity","XCircle","Zap","Square","Play","ExternalLink","DEFAULT_HEADROOM_SETTINGS","HeadroomSection","setSettings","setDirty","patch","ActivityLogCard","items","setItems","hidden","setHidden","filter","setFilter","showHidden","setShowHidden","refresh","log","hid","keyOf","it","idx","k","h","i","onRestoreAll","onRestoreOne","key","next","filtered","q","Search","Eye","isHidden","AboutCard","about","Info","ActivitySection","EnvVarManager","vars","setVars","saving","setSaving","revealed","setRevealed","editing","setEditing","editValue","setEditValue","showAdd","setShowAdd","newName","setNewName","newValue","setNewValue","showBulk","setShowBulk","bulkText","setBulkText","bulkImporting","setBulkImporting","searchQ","setSearchQ","collapsed","setCollapsed","load","toggleReveal","name","prev","handleAdd","startEdit","handleUpdate","handleDelete","handleBulkImport","handleExport","blob","url","a","useMemo","grouped","groups","prefix","toggleGroup","sortedGroupKeys","known","b","ai","bi","groupMode","Plus","Upload","X","KeyRound","isCollapsed","ChevronRight","ChevronDown","VarRow","isRevealed","onToggleReveal","onStartEdit","onEditValueChange","onHandleUpdate","onCancelEdit","onDelete","isEditing","EyeOff","Pencil","Trash2","EnvVarsSection"],"ignoreList":[],"sources":["../../src/web/components/Button.tsx","../../src/web/components/Card.tsx","../../src/web/views/settings/UpdatesSection.tsx","../../src/web/hooks/useAutosave.ts","../../src/web/components/AutosaveField.tsx","../../src/web/views/settings/GeneralSection.tsx","../../src/web/components/TailscaleSettings.tsx","../../src/web/views/settings/SystemLlmSection.tsx","../../src/web/components/HeadroomSettings.tsx","../../src/web/views/settings/HeadroomSection.tsx","../../src/web/views/settings/ActivitySection.tsx","../../src/web/components/EnvVarManager.tsx","../../src/web/views/settings/EnvVarsSection.tsx"],"sourcesContent":["// src/components/Button.tsx — typed button with variants + sizes.\n\nimport { type ButtonHTMLAttributes, forwardRef } from 'react';\nimport { cn } from '../lib/utils';\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'ghost'\n | 'danger'\n | 'accent'\n | 'success';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: ButtonVariant;\n size?: ButtonSize;\n iconOnly?: boolean;\n loading?: boolean;\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n {\n variant = 'secondary',\n size = 'md',\n iconOnly = false,\n loading = false,\n disabled,\n className,\n children,\n ...rest\n },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type={rest.type ?? 'button'}\n disabled={disabled || loading}\n className={cn(\n 'btn',\n `btn-${variant}`,\n `btn-size-${size}`,\n iconOnly && 'btn-icon',\n loading && 'btn-loading',\n className,\n )}\n {...rest}\n >\n {loading ? <span className=\"btn-spinner\" aria-hidden /> : null}\n {children}\n </button>\n );\n },\n);\n","// src/components/Card.tsx — wrapper card.\n\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\n\nexport type CardProps = HTMLAttributes<HTMLDivElement> & {\n variant?: 'elevated' | 'outlined' | 'filled';\n interactive?: boolean;\n children?: ReactNode;\n};\n\nexport function Card({\n variant = 'elevated',\n interactive = false,\n className,\n children,\n ...rest\n}: CardProps) {\n return (\n <div\n className={cn(\n 'card',\n `card-${variant}`,\n interactive && 'card-interactive',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\nexport function CardTitle({ children, className }: { children: ReactNode; className?: string }) {\n return <h3 className={cn('card-title', className)}>{children}</h3>;\n}\n\nexport function CardMeta({ children, className }: { children: ReactNode; className?: string }) {\n return <div className={cn('card-meta', className)}>{children}</div>;\n}\n","// src/web/views/settings/UpdatesSection.tsx\nimport React, { useEffect, useState } from 'react';\nimport { Download, RefreshCw, CheckCircle, AlertCircle, AlertTriangle } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Button } from '../../components/Button';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\nimport { Ws } from '../../lib/ws';\n\ntype PkgStatus = {\n status: 'idle' | 'starting' | 'installing' | 'done' | 'error';\n error?: string;\n newVersion?: string;\n logs: string[];\n};\n\ntype StatusState = {\n current: Record<string, string | null>;\n latest: Record<string, string | null> | null;\n checking: boolean;\n updating: boolean;\n hasUpdates: boolean;\n requiresRestart: boolean;\n perPackage: Record<string, PkgStatus>;\n error?: string;\n};\n\nconst PACKAGES = [\n { id: 'bizar', name: 'Bizar CLI' },\n { id: 'bizar-dash', name: 'Dashboard' },\n { id: 'bizar-plugin', name: 'Opencode Plugin' },\n];\n\nexport function UpdatesSection() {\n const toast = useToast();\n const [status, setStatus] = useState<StatusState>({\n current: {},\n latest: null,\n checking: false,\n updating: false,\n hasUpdates: false,\n requiresRestart: false,\n perPackage: {},\n });\n\n // WebSocket subscription for live update progress\n useEffect(() => {\n const ws = new Ws();\n ws.on((msg: Record<string, unknown>) => {\n if (msg.type === 'update:progress' || msg.type === 'update:log' || msg.type === 'update:complete') {\n setStatus((s) => {\n if (msg.type === 'update:complete') {\n return {\n ...s,\n updating: false,\n requiresRestart: Boolean((msg as { requiresRestart?: boolean }).requiresRestart),\n };\n }\n if (msg.type === 'update:log') {\n const m = msg as { pkg: string; line: string };\n const existing = s.perPackage[m.pkg] || { logs: [] };\n return {\n ...s,\n perPackage: {\n ...s.perPackage,\n [m.pkg]: {\n ...existing,\n logs: [...(existing.logs || []).slice(-50), m.line],\n },\n },\n };\n }\n // update:progress\n const m = msg as { pkg: string; status: PkgStatus['status']; error?: string; newVersion?: string };\n return {\n ...s,\n perPackage: {\n ...s.perPackage,\n [m.pkg]: {\n ...s.perPackage[m.pkg],\n status: m.status,\n error: m.error,\n newVersion: m.newVersion,\n },\n },\n };\n });\n }\n });\n return () => ws.close();\n }, []);\n\n // Load current versions on mount\n useEffect(() => {\n api.get<{ current: Record<string, string | null> }>('/updates/status')\n .then((r) => setStatus((s) => ({ ...s, current: r.current })))\n .catch((e) => setStatus((s) => ({ ...s, error: e.message })));\n }, []);\n\n const check = async () => {\n setStatus((s) => ({ ...s, checking: true, error: undefined }));\n try {\n const r = await api.get<{\n current: Record<string, string | null>;\n latest: Record<string, string | null>;\n hasUpdates: boolean;\n }>('/updates/check');\n setStatus((s) => ({\n ...s,\n checking: false,\n current: r.current,\n latest: r.latest,\n hasUpdates: r.hasUpdates,\n }));\n } catch (err) {\n setStatus((s) => ({ ...s, checking: false, error: (err as Error).message }));\n }\n };\n\n const applyUpdate = async () => {\n if (!confirm('Update Bizar packages? The dashboard will restart automatically.')) return;\n setStatus((s) => ({\n ...s,\n updating: true,\n requiresRestart: false,\n perPackage: {},\n error: undefined,\n }));\n try {\n await api.post('/updates/apply', { packages: ['bizar', 'bizar-dash', 'bizar-plugin'] });\n } catch (err) {\n setStatus((s) => ({ ...s, updating: false, error: (err as Error).message }));\n }\n };\n\n const restart = async () => {\n if (!confirm('Restart the dashboard? You will be disconnected briefly.')) return;\n try {\n await api.post('/restart');\n toast.info('Restarting…', 3000);\n setTimeout(() => window.location.reload(), 3000);\n } catch {\n toast.error('Restart failed');\n }\n };\n\n const isBusy = status.checking || status.updating;\n\n return (\n <Card id=\"settings-updates\" data-section=\"updates\">\n <CardTitle><Download size={14} /> Updates</CardTitle>\n <CardMeta>Check installed Bizar packages and apply dashboard updates.</CardMeta>\n\n {/* Current versions */}\n <div className=\"updates-current\">\n <h4>Installed versions</h4>\n <ul>\n {PACKAGES.map((p) => (\n <li key={p.id}>\n <span>{p.name}</span>\n <code className=\"mono\">{status.current[p.id] || '—'}</code>\n </li>\n ))}\n </ul>\n </div>\n\n {/* Latest + per-package status */}\n {status.latest && (\n <div className=\"updates-latest\">\n <h4>Latest available</h4>\n <ul>\n {PACKAGES.map((p) => {\n const cur = status.current[p.id];\n const lat = status.latest?.[p.id];\n const isOutdated = cur && lat && cur !== lat;\n return (\n <li key={p.id} className={isOutdated ? 'updates-outdated' : 'updates-current-version'}>\n <span>{p.name}</span>\n <code className=\"mono\">\n {lat || '—'}\n {isOutdated && <span className=\"updates-badge\">update available</span>}\n </code>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n {/* Per-package progress rows */}\n {status.updating && (\n <div className=\"updates-progress-rows\">\n {PACKAGES.map((p) => {\n const pkgStatus = status.perPackage[p.id] || { status: 'idle', logs: [] as string[] };\n return (\n <div key={p.id} className=\"updates-pkg-row\">\n <div className=\"updates-pkg-row-header\">\n <span className=\"updates-pkg-name\">{p.name}</span>\n <div className=\"updates-pkg-status\">\n {pkgStatus.status === 'starting' && <span className=\"btn-spinner\" />}\n {pkgStatus.status === 'installing' && <span className=\"btn-spinner\" />}\n {pkgStatus.status === 'done' && <CheckCircle size={14} className=\"icon-success\" />}\n {pkgStatus.status === 'error' && <AlertCircle size={14} className=\"icon-error\" />}\n <span>{pkgStatus.status}</span>\n {pkgStatus.newVersion && (\n <code className=\"mono\" style={{ fontSize: 11 }}>→ {pkgStatus.newVersion}</code>\n )}\n </div>\n </div>\n {pkgStatus.logs.length > 0 && (\n <details className=\"updates-pkg-logs\">\n <summary>npm output ({pkgStatus.logs.length} lines)</summary>\n <pre>{pkgStatus.logs.join('\\n')}</pre>\n </details>\n )}\n {pkgStatus.status === 'error' && pkgStatus.error && (\n <div className=\"updates-pkg-error\">\n <AlertTriangle size={12} /> {pkgStatus.error}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"updates-actions\">\n <Button onClick={check} disabled={isBusy}>\n {status.checking ? <span className=\"btn-spinner\" /> : <RefreshCw size={14} />}\n Check for updates\n </Button>\n <Button\n variant=\"primary\"\n onClick={applyUpdate}\n disabled={!status.hasUpdates || status.updating}\n >\n {status.updating ? <span className=\"btn-spinner\" /> : <Download size={14} />}\n {status.updating ? 'Updating…' : (status.hasUpdates ? 'Update now' : 'Up to date')}\n </Button>\n {status.requiresRestart && (\n <Button variant=\"danger\" onClick={restart}>\n <RefreshCw size={14} /> Restart Dashboard\n </Button>\n )}\n </div>\n\n {status.error && (\n <div className=\"updates-error\">\n <AlertTriangle size={14} />\n <span>{status.error}</span>\n </div>\n )}\n </Card>\n );\n}\n","// src/web/hooks/useAutosave.ts\n// Debounced autosave hook for settings fields.\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\n\nexport type AutosaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport function useAutosave<T>(\n initialValue: T,\n saveFn: (value: T) => Promise<void>,\n {\n delay = 800,\n onSaved,\n onError,\n }: { delay?: number; onSaved?: () => void; onError?: (e: Error) => void } = {},\n) {\n const [value, setValue] = useState<T>(initialValue);\n const [status, setStatus] = useState<AutosaveStatus>('idle');\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingValueRef = useRef<T | null>(null);\n const lastSavedValue = useRef<T>(initialValue);\n // Tracks whether a debounce timeout is currently pending (set when timeout is scheduled, cleared when it fires)\n const hasPendingDebounceRef = useRef(false);\n\n const save = useCallback(\n async (v: T) => {\n setStatus('saving');\n try {\n await saveFn(v);\n lastSavedValue.current = v;\n pendingValueRef.current = null;\n setStatus('saved');\n onSaved?.();\n setTimeout(() => setStatus('idle'), 2000);\n } catch (err) {\n setStatus('error');\n onError?.(err as Error);\n }\n },\n [saveFn, onSaved, onError],\n );\n\n const setValueAndSave = useCallback(\n (v: T) => {\n setValue(v);\n pendingValueRef.current = v;\n hasPendingDebounceRef.current = true;\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null;\n hasPendingDebounceRef.current = false;\n const toSave = pendingValueRef.current;\n pendingValueRef.current = null;\n if (toSave !== null) save(toSave);\n }, delay);\n },\n [delay, save],\n );\n\n /**\n * Clear any pending debounce without saving.\n * Use this when you want the debounce to handle the save naturally.\n */\n const clearDebounce = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n hasPendingDebounceRef.current = false;\n }\n }, []);\n\n /**\n * Flush any pending save immediately (called on unmount or explicit flush).\n */\n const flush = useCallback(async () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n hasPendingDebounceRef.current = false;\n const toSave = pendingValueRef.current;\n pendingValueRef.current = null;\n if (toSave !== null) await save(toSave);\n }\n }, [save]);\n\n // Cleanup on unmount: fire pending save immediately\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n const toSave = pendingValueRef.current;\n pendingValueRef.current = null;\n // Fire-and-forget: call saveFn directly to persist without awaiting\n if (toSave !== null) {\n setStatus('saving');\n saveFn(toSave)\n .then(() => { lastSavedValue.current = toSave; setStatus('saved'); onSaved?.(); })\n .catch((err: Error) => { setStatus('error'); onError?.(err); })\n .finally(() => { setTimeout(() => setStatus('idle'), 2000); });\n }\n }\n };\n }, [saveFn, onSaved, onError]);\n\n return { value, setValue: setValueAndSave, status, save, flush, clearDebounce, hasPendingDebounceRef, pendingValueRef };\n}\n","// src/web/components/AutosaveField.tsx\n// Generic auto-saving field wrapper with inline save status animation.\n\nimport React from 'react';\nimport { Check, Loader, AlertCircle } from 'lucide-react';\nimport { useAutosave } from '../hooks/useAutosave';\n\nexport type { AutosaveStatus } from '../hooks/useAutosave';\n\nexport function AutosaveField<T = string>({\n initialValue,\n saveFn,\n delay = 800,\n render,\n className,\n}: {\n initialValue: T;\n saveFn: (value: T) => Promise<void>;\n delay?: number;\n render: (props: {\n value: T;\n onChange: (v: T) => void;\n onBlur: () => void;\n }) => React.ReactNode;\n className?: string;\n}) {\n const { value, setValue, status, save, clearDebounce, hasPendingDebounceRef, pendingValueRef } = useAutosave(initialValue, saveFn, { delay });\n\n const handleBlur = React.useCallback(() => {\n // If a debounce is pending (user was actively typing), clear the timeout\n // and save immediately — the user is done typing.\n if (hasPendingDebounceRef.current) {\n clearDebounce();\n // pendingValueRef.current holds the typed value not yet saved by debounce\n if (pendingValueRef.current !== null) save(pendingValueRef.current);\n }\n // If no debounce is pending: do nothing (value was already saved or unchanged).\n }, [clearDebounce, hasPendingDebounceRef, save, pendingValueRef]);\n\n return (\n <div className={`autosave-field ${className || ''} ${status}`}>\n {render({ value, onChange: setValue, onBlur: handleBlur })}\n <span className=\"autosave-status\" role=\"status\" aria-live=\"polite\">\n {status === 'saving' && <Loader className=\"spinning\" size={12} />}\n {status === 'saved' && <Check size={12} />}\n {status === 'error' && <AlertCircle size={12} />}\n </span>\n </div>\n );\n}\n","// src/web/views/settings/GeneralSection.tsx\nimport React from 'react';\nimport { Layout as LayoutIcon } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { AutosaveField } from '../../components/AutosaveField';\nimport { cn } from '../../lib/utils';\nimport type { Settings } from '../../lib/types';\n\ntype Props = {\n settings: Settings;\n patchUi: (patch: Partial<Settings['ui']>) => void;\n patchTop: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n /** Called by AutosaveField after state is patched; the parent debounces the API save */\n autoSave?: (key: keyof Settings, value: Settings[keyof Settings]) => void;\n};\n\nconst LAYOUTS = [\n { id: 'topnav', label: 'Top nav' },\n { id: 'sidebar', label: 'Sidebar' },\n { id: 'both', label: 'Both' },\n] as const;\n\nexport function GeneralSection({ settings, patchUi, patchTop, autoSave }: Props) {\n return (\n <>\n {/* UI Layout */}\n <Card id=\"settings-layout\" data-section=\"layout\">\n <CardTitle><LayoutIcon size={14} /> UI layout</CardTitle>\n <CardMeta>Choose how the dashboard's navigation is presented.</CardMeta>\n <div className=\"layout-row\" data-setting-id=\"ui.layout\">\n {LAYOUTS.map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={cn('layout-card', settings.ui.layout === l.id && 'layout-card-active')}\n onClick={() => patchUi({ layout: l.id })}\n >\n <span className=\"layout-card-label\">{l.label}</span>\n </button>\n ))}\n </div>\n <label className=\"checkbox-row\" data-setting-id=\"ui.showHeader\">\n <input\n type=\"checkbox\"\n checked={settings.ui.showHeader}\n onChange={(e) => patchUi({ showHeader: e.target.checked })}\n />\n <span>Show header</span>\n </label>\n <label className=\"checkbox-row\" data-setting-id=\"ui.showStatusBar\">\n <input\n type=\"checkbox\"\n checked={settings.ui.showStatusBar}\n onChange={(e) => patchUi({ showStatusBar: e.target.checked })}\n />\n <span>Show status bar</span>\n </label>\n <div className=\"field\" data-setting-id=\"ui.defaultTab\">\n <label className=\"field-label\">Default tab</label>\n <select\n className=\"select\"\n value={settings.ui.defaultTab}\n onChange={(e) => patchUi({ defaultTab: e.target.value })}\n >\n <option value=\"overview\">Overview</option>\n <option value=\"chat\">Chat</option>\n <option value=\"agents\">Agents</option>\n <option value=\"artifacts\">Plans</option>\n <option value=\"projects\">Projects</option>\n <option value=\"tasks\">Tasks</option>\n <option value=\"config\">Config</option>\n <option value=\"settings\">Settings</option>\n <option value=\"mods\">Mods</option>\n <option value=\"schedules\">Schedules</option>\n </select>\n </div>\n </Card>\n\n {/* General */}\n <Card id=\"settings-general\" data-section=\"general\">\n <CardTitle>General</CardTitle>\n <CardMeta>Default agent + model override.</CardMeta>\n <div className=\"field\" data-setting-id=\"defaultAgent\">\n <label className=\"field-label\" htmlFor=\"set-default-agent\">Default agent</label>\n <AutosaveField\n initialValue={settings.defaultAgent || ''}\n saveFn={async (v) => {\n patchTop('defaultAgent', v);\n autoSave?.('defaultAgent', v);\n }}\n render={({ value, onChange, onBlur }) => (\n <input\n id=\"set-default-agent\"\n className=\"input\"\n type=\"text\"\n placeholder=\"e.g. odin\"\n value={value}\n onChange={e => onChange(e.target.value)}\n onBlur={onBlur}\n />\n )}\n />\n </div>\n <div className=\"field\" data-setting-id=\"defaultModel\">\n <label className=\"field-label\" htmlFor=\"set-default-model\">Model override</label>\n <AutosaveField\n initialValue={settings.defaultModel || ''}\n saveFn={async (v) => {\n patchTop('defaultModel', v);\n autoSave?.('defaultModel', v);\n }}\n render={({ value, onChange, onBlur }) => (\n <input\n id=\"set-default-model\"\n className=\"input\"\n type=\"text\"\n placeholder=\"(leave empty for provider default)\"\n value={value}\n onChange={e => onChange(e.target.value)}\n onBlur={onBlur}\n />\n )}\n />\n </div>\n </Card>\n </>\n );\n}\n","// src/web/components/TailscaleSettings.tsx\n//\n// v5.2 — Tailscale auth key integration UI.\n//\n// Allows users to authenticate with Tailscale using an auth key and\n// set up tailscale serve for the dashboard without using the CLI.\nimport React, { useEffect, useState } from 'react';\nimport { CheckCircle, Link as LinkIcon, Plug } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from './Card';\nimport { Button } from './Button';\nimport { api } from '../lib/api';\nimport type { TailscaleStatus } from '../lib/types';\n\ntype Props = {\n /** Existing tailscale status from Settings-level fetch. If provided, used as initial value. */\n initialStatus?: TailscaleStatus | null;\n};\n\nexport function TailscaleSettings({ initialStatus }: Props) {\n const [status, setStatus] = useState<TailscaleStatus | null>(initialStatus ?? null);\n const [authKey, setAuthKey] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (status === null) {\n api.get<TailscaleStatus>('/tailscale/status')\n .then((r) => setStatus(r))\n .catch(() => setStatus(null));\n }\n }, []);\n\n const loadStatus = async () => {\n try {\n const r = await api.get<TailscaleStatus>('/tailscale/status');\n setStatus(r);\n } catch {\n setError('Failed to load Tailscale status');\n }\n };\n\n const handleAuthenticate = async () => {\n if (!authKey.trim()) return;\n setLoading(true);\n setError(null);\n try {\n await api.post('/tailscale/setup', { authKey: authKey.trim() });\n await loadStatus();\n setAuthKey('');\n } catch (err) {\n setError((err as Error).message || 'Authentication failed');\n } finally {\n setLoading(false);\n }\n };\n\n const handleSetupServe = async () => {\n if (!status) return;\n setLoading(true);\n setError(null);\n try {\n await api.post('/tailscale/setup', {\n port: status.settings?.port || 4321,\n https: status.settings?.https !== false,\n hostname: status.settings?.hostname || '',\n });\n await loadStatus();\n } catch (err) {\n setError((err as Error).message || 'Setup failed');\n } finally {\n setLoading(false);\n }\n };\n\n const handleRemoveServe = async () => {\n setLoading(true);\n setError(null);\n try {\n await api.post('/tailscale/unserve');\n await loadStatus();\n } catch (err) {\n setError((err as Error).message || 'Remove failed');\n } finally {\n setLoading(false);\n }\n };\n\n const isInstalled = status?.installed ?? false;\n const isAuthenticated = status?.authenticated ?? false;\n const isServeEnabled = status?.settings?.enabled ?? false;\n const serveUrl = isServeEnabled ? `https://${status?.hostname || 'bizar-dash'}` : null;\n\n if (!isInstalled) {\n return (\n <Card id=\"settings-tailscale-auth\" data-section=\"tailscale\">\n <CardTitle><Plug size={14} /> Tailscale Integration</CardTitle>\n <CardMeta>Tailscale is not installed on this machine.</CardMeta>\n <p className=\"muted\">\n Install from{' '}\n <a href=\"https://tailscale.com/download\" target=\"_blank\" rel=\"noreferrer\">\n tailscale.com/download\n </a>\n </p>\n </Card>\n );\n }\n\n return (\n <Card id=\"settings-tailscale-auth\" data-section=\"tailscale\">\n <CardTitle><Plug size={14} /> Tailscale Integration</CardTitle>\n <CardMeta>Expose the dashboard over your Tailscale network using an auth key.</CardMeta>\n\n {error && (\n <p style={{ color: 'var(--color-error, #f85149)', fontSize: '0.85rem' }}>{error}</p>\n )}\n\n {isAuthenticated ? (\n <>\n <div className=\"status-row\" style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.75rem' }}>\n <CheckCircle size={16} style={{ color: 'var(--color-success, #3fb950)' }} />\n <span>Authenticated as <strong>{status?.hostname || 'unknown'}</strong></span>\n </div>\n\n {isServeEnabled && serveUrl ? (\n <>\n <div className=\"status-row\" style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.75rem' }}>\n <LinkIcon size={16} />\n <a href={serveUrl} target=\"_blank\" rel=\"noreferrer\">{serveUrl}</a>\n </div>\n <Button variant=\"secondary\" size=\"sm\" onClick={handleRemoveServe} disabled={loading}>\n Remove serve\n </Button>\n </>\n ) : (\n <Button variant=\"primary\" size=\"sm\" onClick={handleSetupServe} disabled={loading}>\n Set up Tailscale serve\n </Button>\n )}\n </>\n ) : (\n <>\n <p className=\"muted\" style={{ marginBottom: '0.75rem' }}>Not authenticated with Tailscale.</p>\n <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n <input\n type=\"text\"\n className=\"input\"\n placeholder=\"tskey-...\"\n value={authKey}\n onChange={(e) => setAuthKey(e.target.value)}\n style={{ flex: 1, minWidth: '200px' }}\n disabled={loading}\n />\n <Button variant=\"primary\" size=\"sm\" onClick={handleAuthenticate} disabled={loading || !authKey.trim()}>\n Authenticate\n </Button>\n </div>\n </>\n )}\n </Card>\n );\n}\n","// src/web/views/settings/SystemLlmSection.tsx\nimport React from 'react';\nimport { Sparkles } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport type { Settings } from '../../lib/types';\n\ntype Props = {\n settings: Settings;\n patchTop: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n};\n\nexport function SystemLlmSection({ settings, patchTop }: Props) {\n return (\n <Card id=\"settings-system-llm\" data-section=\"system-llm\">\n <CardTitle><Sparkles size={14} /> System LLM API</CardTitle>\n <CardMeta>\n Configures the LLM used for automatic title generation, prompt enhancement,\n summarization, and other system-level calls.\n </CardMeta>\n\n <label className=\"checkbox-row\" data-setting-id=\"systemLlm.enabled\">\n <input\n type=\"checkbox\"\n checked={!!settings.systemLlm?.enabled}\n onChange={(e) => {\n const cur = settings.systemLlm || { enabled: true, provider: 'cline', model: 'cline/deepseek-v4-flash-free' };\n patchTop('systemLlm', { ...cur, enabled: e.target.checked });\n }}\n />\n <span>Enable system LLM calls</span>\n </label>\n\n <div className=\"field\" data-setting-id=\"systemLlm.provider\" style={{ marginTop: 'var(--space-3)' }}>\n <label className=\"field-label\" htmlFor=\"set-system-llm-provider\">Provider</label>\n <select\n id=\"set-system-llm-provider\"\n className=\"select\"\n value={settings.systemLlm?.provider || 'cline'}\n onChange={(e) => {\n const cur = settings.systemLlm || { enabled: true, provider: 'cline', model: 'cline/deepseek-v4-flash-free' };\n patchTop('systemLlm', { ...cur, provider: e.target.value });\n }}\n >\n <option value=\"cline\">Cline</option>\n <option value=\"openrouter\">OpenRouter</option>\n <option value=\"minimax\">MiniMax</option>\n </select>\n </div>\n\n <div className=\"field\" data-setting-id=\"systemLlm.model\">\n <label className=\"field-label\" htmlFor=\"set-system-llm-model\">Model</label>\n <input\n id=\"set-system-llm-model\"\n className=\"input mono\"\n type=\"text\"\n placeholder=\"cline/deepseek-v4-flash-free\"\n value={settings.systemLlm?.model || 'cline/deepseek-v4-flash-free'}\n onChange={(e) => {\n const cur = settings.systemLlm || { enabled: true, provider: 'cline', model: 'cline/deepseek-v4-flash-free' };\n patchTop('systemLlm', { ...cur, model: e.target.value });\n }}\n />\n <p className=\"field-help\">\n The API key is read from <code>auth.json</code> for the selected provider.\n Leave the default model for best results.\n </p>\n </div>\n\n <div style={{ marginTop: 'var(--space-4)' }}>\n <h4 style={{ margin: '0 0 var(--space-2)' }}>Features using this API</h4>\n <ul className=\"settings-feature-list\" style={{ margin: 0, paddingLeft: 'var(--space-4)', lineHeight: 1.8 }}>\n <li>Auto-title generation for new chat sessions</li>\n <li>Auto-title generation for new tasks</li>\n <li>"Enhance prompt" button in the task input</li>\n <li>"Enhance prompt" button in the chat composer</li>\n <li className=\"muted\" style={{ fontSize: 12 }}>Future: summarization, name generation, and more</li>\n </ul>\n </div>\n </Card>\n );\n}\n","// src/web/components/HeadroomSettings.tsx\n//\n// v1.0.0 — Headroom settings card for the Settings view.\n// Displays live status and provides controls for install, wrap, proxy, and configuration.\nimport React, { useEffect, useState, useCallback } from 'react';\nimport {\n Activity,\n CheckCircle,\n XCircle,\n Download,\n Play,\n Square,\n RefreshCw,\n ExternalLink,\n Zap,\n} from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { useToast } from '../components/Toast';\nimport { api } from '../lib/api';\nimport { type HeadroomSettings } from '../lib/types';\n\ntype HeadroomStatus = {\n installed: boolean;\n version: string | null;\n proxyRunning: boolean;\n proxyPort: number | null;\n proxyPid: number | null;\n wrapped: boolean;\n healthy: 'ok' | 'warn' | 'fail';\n messages: string[];\n};\n\ntype HeadroomStats = {\n tokensSaved?: number;\n compressionRatio?: number;\n cacheHits?: number;\n transforms?: number;\n error?: string;\n};\n\nconst BACKEND_OPTIONS = [\n { value: 'anthropic', label: 'Anthropic' },\n { value: 'anyllm', label: 'AnyLLM' },\n { value: 'litellm-anthropic', label: 'LiteLLM (Anthropic)' },\n { value: 'litellm-openai', label: 'LiteLLM (OpenAI)' },\n];\n\ntype Props = {\n settings: HeadroomSettings;\n onPatch: (patch: Partial<HeadroomSettings>) => void;\n};\n\nexport function HeadroomSettingsCard({ settings, onPatch }: Props) {\n const toast = useToast();\n const [status, setStatus] = useState<HeadroomStatus | null>(null);\n const [stats, setStats] = useState<HeadroomStats | null>(null);\n const [loadingStatus, setLoadingStatus] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [wrapping, setWrapping] = useState(false);\n const [unwrapping, setUnwrapping] = useState(false);\n const [startingProxy, setStartingProxy] = useState(false);\n const [stoppingProxy, setStoppingProxy] = useState(false);\n\n const loadStatus = useCallback(async () => {\n setLoadingStatus(true);\n try {\n const [s, st] = await Promise.all([\n api.get<HeadroomStatus>('/headroom/status'),\n api.get<HeadroomStats>('/headroom/stats?hours=24').catch(() => ({ error: 'no stats' })),\n ]);\n setStatus(s);\n if (!st.error) setStats(st);\n } catch (err) {\n toast.error(`Failed to load Headroom status: ${(err as Error).message}`);\n } finally {\n setLoadingStatus(false);\n }\n }, [toast]);\n\n useEffect(() => {\n loadStatus();\n }, [loadStatus]);\n\n const handleInstall = async () => {\n setInstalling(true);\n try {\n const r = await api.post<{ ok: boolean; installed: boolean; method: string }>('/headroom/install', { force: true });\n if (r.installed) {\n toast.success(`Headroom installed via ${r.method}.`);\n await loadStatus();\n } else {\n toast.error('Headroom install failed. Try: pip install \"headroom-ai[all]\"');\n }\n } catch (err) {\n toast.error(`Install failed: ${(err as Error).message}`);\n } finally {\n setInstalling(false);\n }\n };\n\n const handleWrap = async () => {\n setWrapping(true);\n try {\n const r = await api.post<{ ok: boolean }>('/headroom/wrap', { port: settings.port });\n if (r.ok) {\n toast.success('cline wrapped with Headroom.');\n await loadStatus();\n } else {\n toast.error('Wrap failed.');\n }\n } catch (err) {\n toast.error(`Wrap failed: ${(err as Error).message}`);\n } finally {\n setWrapping(false);\n }\n };\n\n const handleUnwrap = async () => {\n setUnwrapping(true);\n try {\n const r = await api.post<{ ok: boolean }>('/headroom/unwrap');\n if (r.ok) {\n toast.success('cline unwrapped from Headroom.');\n await loadStatus();\n } else {\n toast.error('Unwrap failed.');\n }\n } catch (err) {\n toast.error(`Unwrap failed: ${(err as Error).message}`);\n } finally {\n setUnwrapping(false);\n }\n };\n\n const handleStartProxy = async () => {\n setStartingProxy(true);\n try {\n const r = await api.post<{ ok: boolean }>('/headroom/proxy/start', {\n port: settings.port,\n host: settings.host,\n });\n if (r.ok) {\n toast.success(`Headroom proxy started on ${settings.host}:${settings.port}.`);\n await loadStatus();\n } else {\n toast.error('Proxy start failed.');\n }\n } catch (err) {\n toast.error(`Proxy start failed: ${(err as Error).message}`);\n } finally {\n setStartingProxy(false);\n }\n };\n\n const handleStopProxy = async () => {\n setStoppingProxy(true);\n try {\n const r = await api.post<{ ok: boolean }>('/headroom/proxy/stop');\n if (r.ok) {\n toast.success('Headroom proxy stopped.');\n await loadStatus();\n } else {\n toast.error('Proxy stop failed.');\n }\n } catch (err) {\n toast.error(`Proxy stop failed: ${(err as Error).message}`);\n } finally {\n setStoppingProxy(false);\n }\n };\n\n const handleOpenDashboard = async () => {\n try {\n const { spawn } = await import('node:child_process');\n spawn('headroom', ['dashboard'], { detached: true, stdio: 'ignore' });\n } catch {\n toast.error('Could not open Headroom dashboard. Run `headroom dashboard` manually.');\n }\n };\n\n const { installed, version, proxyRunning, proxyPort, wrapped } = status || {};\n const ratio = stats?.compressionRatio ?? 0;\n const saved = stats?.tokensSaved ?? 0;\n\n return (\n <div id=\"settings-headroom\" data-section=\"headroom\">\n <Card>\n <CardTitle>\n <Activity size={14} style={{ color: proxyRunning ? 'var(--success)' : 'var(--text-dim)' }} />\n Headroom\n {installed && version && (\n <span style={{ fontSize: 11, color: 'var(--text-dim)', marginLeft: 6 }}>\n v{version} {proxyRunning ? '✓' : '✗'}\n </span>\n )}\n {!installed && (\n <span style={{ fontSize: 11, color: 'var(--error)', marginLeft: 6 }}>not installed</span>\n )}\n </CardTitle>\n <CardMeta>\n Context compression for token efficiency. Compresses tool outputs, logs, and conversation\n history by 60–95% before they reach the model.\n </CardMeta>\n\n {/* Live status row */}\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap', marginTop: 12, marginBottom: 12 }}>\n <div className=\"headroom-status-item\">\n {installed ? (\n <CheckCircle size={12} style={{ color: 'var(--success)' }} />\n ) : (\n <XCircle size={12} style={{ color: 'var(--error)' }} />\n )}\n <span>{installed ? 'Installed' : 'Not installed'}</span>\n </div>\n <div className=\"headroom-status-item\">\n {proxyRunning ? (\n <CheckCircle size={12} style={{ color: 'var(--success)' }} />\n ) : (\n <XCircle size={12} style={{ color: 'var(--text-dim)' }} />\n )}\n <span>Proxy {proxyRunning ? `${proxyPort} ✓` : 'stopped'}</span>\n </div>\n <div className=\"headroom-status-item\">\n {wrapped ? (\n <CheckCircle size={12} style={{ color: 'var(--success)' }} />\n ) : (\n <XCircle size={12} style={{ color: 'var(--text-dim)' }} />\n )}\n <span>cline {wrapped ? 'wrapped' : 'not wrapped'}</span>\n </div>\n </div>\n\n {/* Stats */}\n {(saved > 0 || ratio > 0) && (\n <div style={{ display: 'flex', gap: 24, marginBottom: 12 }}>\n <div>\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--success)' }}>\n {ratio > 0 ? `${Math.round(ratio * 100)}%` : '—'}\n </div>\n <div className=\"muted\" style={{ fontSize: 11 }}>Compression ratio</div>\n </div>\n <div>\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--accent)' }}>\n {saved > 0 ? saved.toLocaleString() : '—'}\n </div>\n <div className=\"muted\" style={{ fontSize: 11 }}>Tokens saved (24h)</div>\n </div>\n </div>\n )}\n\n {/* Action buttons */}\n <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginBottom: 8 }}>\n {!installed ? (\n <Button variant=\"primary\" size=\"sm\" onClick={handleInstall} disabled={installing}>\n {installing ? <span className=\"btn-spinner\" /> : <Download size={13} />}\n {installing ? 'Installing…' : 'Install Headroom'}\n </Button>\n ) : (\n <>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleWrap}\n disabled={wrapping || wrapped}\n title={wrapped ? 'cline is already wrapped' : 'Wrap cline to route through Headroom proxy'}\n >\n {wrapping ? <span className=\"btn-spinner\" /> : <Zap size={13} />}\n {wrapping ? 'Wrapping…' : wrapped ? 'Wrapped ✓' : 'Wrap cline'}\n </Button>\n {wrapped && (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleUnwrap} disabled={unwrapping}>\n {unwrapping ? <span className=\"btn-spinner\" /> : <RefreshCw size={13} />}\n {unwrapping ? 'Unwrapping…' : 'Unwrap'}\n </Button>\n )}\n </>\n )}\n\n {installed && (\n <>\n {proxyRunning ? (\n <Button variant=\"secondary\" size=\"sm\" onClick={handleStopProxy} disabled={stoppingProxy}>\n {stoppingProxy ? <span className=\"btn-spinner\" /> : <Square size={13} />}\n {stoppingProxy ? 'Stopping…' : 'Stop proxy'}\n </Button>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={handleStartProxy} disabled={startingProxy}>\n {startingProxy ? <span className=\"btn-spinner\" /> : <Play size={13} />}\n {startingProxy ? 'Starting…' : 'Start proxy'}\n </Button>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={handleOpenDashboard}>\n <ExternalLink size={13} />\n Dashboard\n </Button>\n </>\n )}\n\n <Button variant=\"ghost\" size=\"sm\" onClick={loadStatus} disabled={loadingStatus}>\n <RefreshCw size={13} className={loadingStatus ? 'spin' : ''} />\n </Button>\n </div>\n\n {/* Settings */}\n <div style={{ marginTop: 16 }}>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.enabled}\n onChange={(e) => onPatch({ enabled: e.target.checked })}\n />\n <span>Enable Headroom</span>\n </label>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.autoInstall}\n onChange={(e) => onPatch({ autoInstall: e.target.checked })}\n />\n <span>Auto-install if missing on dashboard startup</span>\n </label>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.autoStart}\n onChange={(e) => onPatch({ autoStart: e.target.checked })}\n />\n <span>Auto-start proxy on dashboard startup</span>\n </label>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.autoWrap}\n onChange={(e) => onPatch({ autoWrap: e.target.checked })}\n />\n <span>Auto-wrap cline on dashboard startup</span>\n </label>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.routeAllProviders}\n onChange={(e) => onPatch({ routeAllProviders: e.target.checked })}\n />\n <span>Route all providers through Headroom proxy</span>\n </label>\n\n <div className=\"task-form-row\" style={{ marginTop: 12 }}>\n <div className=\"task-form-field\">\n <label className=\"field-label\">Proxy port</label>\n <input\n type=\"number\"\n className=\"input\"\n value={settings.port}\n min={1}\n max={65535}\n onChange={(e) => onPatch({ port: Math.max(1, Math.min(65535, parseInt(e.target.value, 10) || 8787)) })}\n />\n </div>\n <div className=\"task-form-field\">\n <label className=\"field-label\">Proxy host</label>\n <input\n type=\"text\"\n className=\"input\"\n value={settings.host}\n onChange={(e) => onPatch({ host: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"task-form-row\">\n <div className=\"task-form-field\">\n <label className=\"field-label\">Backend</label>\n <select\n className=\"select\"\n value={settings.backend}\n onChange={(e) => onPatch({ backend: e.target.value })}\n >\n {BACKEND_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n <div className=\"task-form-field\">\n <label className=\"field-label\">Monthly budget (USD)</label>\n <input\n type=\"number\"\n className=\"input\"\n value={settings.budget}\n min={0}\n step={1}\n onChange={(e) => onPatch({ budget: Math.max(0, parseFloat(e.target.value) || 0) })}\n />\n <span className=\"field-help\">0 = unlimited</span>\n </div>\n </div>\n\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.outputShaper}\n onChange={(e) => onPatch({ outputShaper: e.target.checked })}\n />\n <span>Enable output shaper</span>\n </label>\n <label className=\"checkbox-row\">\n <input\n type=\"checkbox\"\n checked={settings.telemetry}\n onChange={(e) => onPatch({ telemetry: e.target.checked })}\n />\n <span>Enable telemetry</span>\n </label>\n </div>\n </Card>\n </div>\n );\n}\n","// src/web/views/settings/HeadroomSection.tsx\nimport React from 'react';\nimport { HeadroomSettingsCard } from '../../components/HeadroomSettings';\nimport { type HeadroomSettings, type Settings } from '../../lib/types';\n\nconst DEFAULT_HEADROOM_SETTINGS: HeadroomSettings = {\n enabled: true,\n autoInstall: true,\n port: 8787,\n host: '127.0.0.1',\n outputShaper: false,\n telemetry: false,\n budget: 0,\n backend: 'anthropic',\n autoStart: true,\n autoWrap: true,\n routeAllProviders: true,\n};\n\ntype Props = {\n settings: Settings;\n setSettings: React.Dispatch<React.SetStateAction<Settings>>;\n setDirty: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport function HeadroomSection({ settings, setSettings, setDirty }: Props) {\n return (\n <HeadroomSettingsCard\n settings={settings.headroom || DEFAULT_HEADROOM_SETTINGS}\n onPatch={(patch) => {\n setSettings((cur) => ({\n ...cur,\n headroom: { ...(cur.headroom || DEFAULT_HEADROOM_SETTINGS), ...patch },\n }));\n setDirty(true);\n }}\n />\n );\n}\n","// src/web/views/settings/ActivitySection.tsx\nimport React, { useEffect, useState, useCallback } from 'react';\nimport { Activity, Search, Eye, RefreshCw, Info } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Button } from '../../components/Button';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\nimport { cn } from '../../lib/utils';\nimport type { Settings } from '../../lib/types';\n\ntype Props = {\n about: Settings['about'];\n};\n\nfunction ActivityLogCard() {\n const toast = useToast();\n const [items, setItems] = useState<Array<{ kind?: string; ts?: string; slug?: string; message?: string }>>([]);\n const [hidden, setHidden] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [filter, setFilter] = useState('');\n const [showHidden, setShowHidden] = useState(true);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n try {\n const [log, hid] = await Promise.all([\n api.get<{ items: Array<{ kind?: string; ts?: string; slug?: string; message?: string }> }>('/activity'),\n api.get<{ hidden: string[] }>('/activity/hidden'),\n ]);\n setItems(Array.isArray(log.items) ? log.items : []);\n setHidden(new Set(hid.hidden || []));\n } catch (err) {\n toast.error(`Load failed: ${(err as Error).message}`);\n } finally {\n setLoading(false);\n }\n }, [toast]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const keyOf = (it: { kind?: string; ts?: string; slug?: string }, idx: number) => {\n const k = `${it.kind || ''}|${it.ts || ''}|${it.slug || ''}|${idx}`;\n let h = 0;\n for (let i = 0; i < k.length; i++) h = ((h << 5) - h + k.charCodeAt(i)) | 0;\n return Math.abs(h).toString(16).padStart(8, '0').slice(0, 16);\n };\n\n const onRestoreAll = async () => {\n try {\n await api.del('/activity/hide');\n setHidden(new Set());\n toast.success('All hidden activity restored.');\n } catch (err) {\n toast.error(`Restore failed: ${(err as Error).message}`);\n }\n };\n\n const onRestoreOne = async (key: string) => {\n try {\n await api.del(`/activity/hide/${encodeURIComponent(key)}`);\n const next = new Set(hidden);\n next.delete(key);\n setHidden(next);\n } catch (err) {\n toast.error(`Restore failed: ${(err as Error).message}`);\n }\n };\n\n const filtered = items.filter((it, idx) => {\n const k = keyOf(it, idx);\n if (!showHidden && hidden.has(k)) return false;\n if (!filter) return true;\n const q = filter.toLowerCase();\n return [it.kind, it.slug, it.message].some((v) => typeof v === 'string' && v.toLowerCase().includes(q));\n });\n\n return (\n <Card id=\"settings-activity-log\" data-section=\"activity-log\">\n <CardTitle>\n <Activity size={14} /> Activity log\n <span className=\"muted\" style={{ fontWeight: 400, marginLeft: 8, fontSize: 12 }}>\n {items.length} total · {hidden.size} hidden\n </span>\n <Button variant=\"ghost\" size=\"sm\" style={{ marginLeft: 'auto' }} onClick={refresh} title=\"Reload\">\n <RefreshCw size={12} />\n </Button>\n </CardTitle>\n <CardMeta>\n Full history from <code>~/.bizar/activity.log</code>. Hiding an item in the Overview only hides it there — the entry stays here.\n </CardMeta>\n\n <div className=\"activity-log-toolbar\">\n <div className=\"activity-log-search\">\n <Search size={12} />\n <input\n type=\"text\"\n className=\"input\"\n placeholder=\"Filter by kind, slug, or message…\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n />\n </div>\n <label className=\"activity-log-toggle\">\n <input\n type=\"checkbox\"\n checked={showHidden}\n onChange={(e) => setShowHidden(e.target.checked)}\n />\n Show hidden\n </label>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={hidden.size === 0}\n onClick={onRestoreAll}\n title=\"Restore all hidden items to the Overview\"\n >\n <Eye size={12} /> Restore all\n </Button>\n </div>\n\n {loading ? (\n <div className=\"muted\" style={{ padding: '12px 0', fontSize: 12 }}>Loading…</div>\n ) : filtered.length === 0 ? (\n <div className=\"muted\" style={{ padding: '12px 0', fontSize: 12 }}>\n {items.length === 0 ? 'No activity yet.' : 'No items match the current filter.'}\n </div>\n ) : (\n <div className=\"activity-log-table-wrap\">\n <table className=\"activity-log-table\">\n <thead>\n <tr>\n <th>Kind</th>\n <th>Detail</th>\n <th>Time</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {filtered.slice(0, 200).map((it, idx) => {\n const k = keyOf(it, idx);\n const isHidden = hidden.has(k);\n return (\n <tr key={`${it.ts}-${idx}`} className={cn(isHidden && 'activity-log-row-hidden')}>\n <td className=\"activity-log-kind\">{it.kind || 'activity'}</td>\n <td className=\"activity-log-detail\">\n {it.message || it.slug || '—'}\n </td>\n <td className=\"activity-log-time mono\">\n {it.ts ? new Date(it.ts).toLocaleString() : '—'}\n </td>\n <td>\n {isHidden ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onRestoreOne(k)} title=\"Restore to Overview\">\n <Eye size={12} />\n </Button>\n ) : (\n <span className=\"activity-log-state-tag\">shown</span>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n {filtered.length > 200 && (\n <div className=\"muted\" style={{ fontSize: 11, padding: '8px 0' }}>\n Showing first 200 of {filtered.length}.\n </div>\n )}\n </div>\n )}\n </Card>\n );\n}\n\nfunction AboutCard({ about }: Props) {\n return (\n <Card id=\"settings-about\" data-section=\"about\">\n <CardTitle><Info size={14} /> About</CardTitle>\n <CardMeta>Build metadata.</CardMeta>\n <dl className=\"about-table\">\n <dt>Version</dt>\n <dd className=\"mono\">{about?.version || '—'}</dd>\n <dt>Homepage</dt>\n <dd>\n <a href={about?.homepage || 'https://github.com/DrB0rk/BizarHarness'} target=\"_blank\" rel=\"noopener noreferrer\">\n {about?.homepage || 'https://github.com/DrB0rk/BizarHarness'}\n </a>\n </dd>\n <dt>License</dt>\n <dd>{about?.license || 'MIT'}</dd>\n </dl>\n </Card>\n );\n}\n\nexport function ActivitySection({ about }: Props) {\n return (\n <>\n <ActivityLogCard />\n <AboutCard about={about} />\n </>\n );\n}\n","// src/web/components/EnvVarManager.tsx — manage BIZAR_* env vars from ~/.config/bizar/env.json\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Plus, Pencil, Trash2, Eye, EyeOff, RefreshCw, KeyRound, CheckCircle, X, Search, Download, Upload, ChevronDown, ChevronRight, AlertCircle } from 'lucide-react';\nimport { Button } from './Button';\nimport { useToast } from './Toast';\nimport { api } from '../lib/api';\nimport { cn } from '../lib/utils';\n\nexport type EnvVarEntry = {\n name: string;\n value: string; // masked on GET, full on edit\n createdAt: string;\n source: string;\n};\n\nexport type EnvVarGrouped = Record<string, EnvVarEntry[]>;\n\ntype Props = {\n onError?: (msg: string) => void;\n};\n\nexport function EnvVarManager({ onError }: Props) {\n const toast = useToast();\n const [vars, setVars] = useState<EnvVarEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n // Which rows have the value revealed (edit mode shows real value)\n const [revealed, setRevealed] = useState<Set<string>>(new Set());\n // Currently editing name (null = none)\n const [editing, setEditing] = useState<string | null>(null);\n const [editValue, setEditValue] = useState('');\n // New var form\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState('');\n const [newValue, setNewValue] = useState('');\n // Bulk operations\n const [showBulk, setShowBulk] = useState(false);\n const [bulkText, setBulkText] = useState('');\n const [bulkImporting, setBulkImporting] = useState(false);\n // Search / filter\n const [searchQ, setSearchQ] = useState('');\n // Group by prefix (collapsed state)\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const r = await api.get<EnvVarEntry[]>('/env-vars');\n setVars(r);\n } catch (err) {\n toast.error(`Load failed: ${(err as Error).message}`);\n onError?.((err as Error).message);\n } finally {\n setLoading(false);\n }\n }, [toast, onError]);\n\n useEffect(() => { load(); }, [load]);\n\n const toggleReveal = (name: string) => {\n setRevealed((prev) => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n };\n\n const handleAdd = async () => {\n const name = newName.trim().toUpperCase();\n const value = newValue.trim();\n if (!name || !/^BIZAR_[A-Z0-9_]+$/.test(name)) {\n toast.warning('Name must match BIZAR_<NAME> (e.g. BIZAR_MINIMAX_KEY)');\n return;\n }\n if (!value) {\n toast.warning('Value is required.');\n return;\n }\n if (vars.some((v) => v.name === name)) {\n toast.warning(`${name} already exists.`);\n return;\n }\n setSaving(true);\n try {\n await api.post('/env-vars', { name, value });\n toast.success(`${name} created.`);\n setShowAdd(false);\n setNewName('');\n setNewValue('');\n await load();\n } catch (err) {\n toast.error(`Create failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const startEdit = (v: EnvVarEntry) => {\n setEditing(v.name);\n setEditValue(v.value === v.value.replace(/\\*/g, '') ? v.value : '');\n setRevealed((prev) => { const next = new Set(prev); next.add(v.name); return next; });\n };\n\n const handleUpdate = async (name: string) => {\n if (!editValue.trim()) {\n toast.warning('Value cannot be empty.');\n return;\n }\n setSaving(true);\n try {\n await api.put(`/env-vars/${encodeURIComponent(name)}`, { value: editValue.trim() });\n toast.success(`${name} updated.`);\n setEditing(null);\n await load();\n } catch (err) {\n toast.error(`Update failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n if (!confirm(`Delete ${name}? This cannot be undone.`)) return;\n try {\n await api.del(`/env-vars/${encodeURIComponent(name)}`);\n toast.success(`${name} deleted.`);\n await load();\n } catch (err) {\n toast.error(`Delete failed: ${(err as Error).message}`);\n }\n };\n\n // ─── Bulk import ───────────────────────────────────────────────────────────\n const handleBulkImport = async () => {\n if (!bulkText.trim()) { toast.warning('Nothing to import.'); return; }\n setBulkImporting(true);\n try {\n const r = await api.post<{ ok: boolean; imported: number; skipped: number; errors: string[] }>('/env-vars/bulk-import', { envContent: bulkText });\n toast.success(`Imported ${r.imported}, skipped ${r.skipped}.`);\n if (r.errors.length > 0) {\n toast.warning(`${r.errors.length} lines had errors: ${r.errors.slice(0, 3).join('; ')}${r.errors.length > 3 ? '…' : ''}`);\n }\n setBulkText('');\n setShowBulk(false);\n await load();\n } catch (err) {\n toast.error(`Bulk import failed: ${(err as Error).message}`);\n } finally {\n setBulkImporting(false);\n }\n };\n\n // ─── Bulk export ───────────────────────────────────────────────────────────\n const handleExport = async () => {\n try {\n const r = await api.get<string>('/env-vars/export');\n // r is the raw text content\n const blob = new Blob([r as unknown as string], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = '.env';\n a.click();\n URL.revokeObjectURL(url);\n toast.success('Exported .env file.');\n } catch (err) {\n toast.error(`Export failed: ${(err as Error).message}`);\n }\n };\n\n // ─── Group by prefix ───────────────────────────────────────────────────────\n const filtered = useMemo(() => {\n if (!searchQ.trim()) return vars;\n const q = searchQ.toLowerCase();\n return vars.filter((v) => v.name.toLowerCase().includes(q));\n }, [vars, searchQ]);\n\n const grouped = useMemo(() => {\n const groups: Record<string, EnvVarEntry[]> = {};\n for (const v of filtered) {\n const prefix = v.name.split('_')[0] + '_';\n (groups[prefix] ??= []).push(v);\n }\n return groups;\n }, [filtered]);\n\n const toggleGroup = (prefix: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(prefix)) next.delete(prefix);\n else next.add(prefix);\n return next;\n });\n };\n\n const sortedGroupKeys = useMemo(() => {\n const known = ['BIZAR_', 'PROVIDER_', 'MODEL_', 'API_'];\n const keys = Object.keys(grouped).sort((a, b) => {\n const ai = known.indexOf(a); const bi = known.indexOf(b);\n if (ai === -1 && bi === -1) return a.localeCompare(b);\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n });\n return keys;\n }, [grouped]);\n\n if (loading) {\n return <div className=\"muted\" style={{ padding: '16px 0', fontSize: 13 }}>Loading env vars…</div>;\n }\n\n const hasGroups = sortedGroupKeys.length > 1;\n const groupMode = hasGroups;\n\n return (\n <div className=\"env-var-manager\">\n <div className=\"env-var-toolbar\">\n <Button variant=\"primary\" size=\"sm\" onClick={() => setShowAdd(true)}>\n <Plus size={12} /> New variable\n </Button>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setShowBulk((v) => !v)} className={showBulk ? 'active' : ''}>\n <Upload size={12} /> Bulk import\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleExport} title=\"Export as .env\">\n <Download size={12} /> Export\n </Button>\n <div className=\"env-var-search-wrap\">\n <Search size={12} className=\"env-var-search-icon\" />\n <input\n className=\"env-var-search input\"\n placeholder=\"Filter…\"\n value={searchQ}\n onChange={(e) => setSearchQ(e.target.value)}\n />\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={load} title=\"Reload\">\n <RefreshCw size={12} />\n </Button>\n </div>\n\n {/* Bulk import panel */}\n {showBulk && (\n <div className=\"env-var-bulk-panel\">\n <div className=\"env-var-bulk-header\">\n <span>Paste <code>KEY=value</code> lines (one per line):</span>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setShowBulk(false)}><X size={12} /></Button>\n </div>\n <textarea\n className=\"input mono env-var-bulk-textarea\"\n placeholder={\"BIZAR_API_KEY=your-key-here\\nPROVIDER_OPENAI_KEY=sk-...\\nMODEL_KEY=gem-...\"}\n value={bulkText}\n onChange={(e) => setBulkText(e.target.value)}\n rows={6}\n />\n <div className=\"env-var-bulk-footer\">\n <Button variant=\"primary\" size=\"sm\" onClick={handleBulkImport} disabled={bulkImporting || !bulkText.trim()}>\n {bulkImporting ? 'Importing…' : 'Import'}\n </Button>\n <span className=\"muted\" style={{ fontSize: 11 }}>\n Existing keys are skipped unless re-created individually. Invalid lines are reported.\n </span>\n </div>\n </div>\n )}\n\n {vars.length === 0 && !showAdd && (\n <div className=\"env-var-empty\">\n <KeyRound size={20} />\n <span>No BIZAR_* env vars yet.</span>\n <span style={{ fontSize: 11 }}>Create one to store API keys securely.</span>\n </div>\n )}\n\n {/* New var form */}\n {showAdd && (\n <div className=\"env-var-add-form\">\n <div className=\"env-var-add-row\">\n <input\n className=\"input mono\"\n style={{ width: 240 }}\n placeholder=\"BIZAR_NAME\"\n value={newName}\n onChange={(e) => setNewName(e.target.value.toUpperCase())}\n onKeyDown={(e) => { if (e.key === 'Enter') handleAdd(); if (e.key === 'Escape') setShowAdd(false); }}\n autoFocus\n />\n <input\n className=\"input mono\"\n type=\"password\"\n placeholder=\"value (API key, token, etc.)\"\n value={newValue}\n onChange={(e) => setNewValue(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') handleAdd(); if (e.key === 'Escape') setShowAdd(false); }}\n />\n <Button variant=\"primary\" size=\"sm\" onClick={handleAdd} disabled={saving}>\n <CheckCircle size={12} /> Create\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setShowAdd(false); setNewName(''); setNewValue(''); }}>\n <X size={12} />\n </Button>\n </div>\n <p style={{ fontSize: 11, color: 'var(--text-dim)', margin: 0 }}>\n Names must match <code>BIZAR_<var>NAME</var></code> (uppercase letters, digits, underscores).\n </p>\n </div>\n )}\n\n {/* Var list — grouped by prefix */}\n {filtered.length > 0 && (\n groupMode ? (\n <div className=\"env-var-groups\">\n {sortedGroupKeys.map((prefix) => {\n const items = grouped[prefix];\n const isCollapsed = collapsed.has(prefix);\n return (\n <div key={prefix} className=\"env-var-group\">\n <button\n type=\"button\"\n className=\"env-var-group-header\"\n onClick={() => toggleGroup(prefix)}\n >\n {isCollapsed ? <ChevronRight size={12} /> : <ChevronDown size={12} />}\n <span className=\"env-var-group-prefix mono\">{prefix}</span>\n <span className=\"env-var-group-count muted\">({items.length})</span>\n </button>\n {!isCollapsed && (\n <div className=\"env-var-list\">\n {items.map((v) => (\n <VarRow key={v.name} v={v} editing={editing} editValue={editValue}\n isRevealed={revealed.has(v.name)}\n onToggleReveal={toggleReveal} onStartEdit={startEdit}\n onEditValueChange={setEditValue} onHandleUpdate={handleUpdate}\n onCancelEdit={() => setEditing(null)} onDelete={handleDelete}\n saving={saving} />\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"env-var-list\">\n {filtered.map((v) => (\n <VarRow key={v.name} v={v} editing={editing} editValue={editValue}\n isRevealed={revealed.has(v.name)}\n onToggleReveal={toggleReveal} onStartEdit={startEdit}\n onEditValueChange={setEditValue} onHandleUpdate={handleUpdate}\n onCancelEdit={() => setEditing(null)} onDelete={handleDelete}\n saving={saving} />\n ))}\n </div>\n )\n )}\n\n {filtered.length === 0 && vars.length > 0 && (\n <div className=\"env-var-empty\">\n <Search size={16} />\n <span>No env vars match \"{searchQ}\"</span>\n </div>\n )}\n </div>\n );\n}\n\n// ─── Individual var row (extracted for reuse in group mode) ───────────────────\ntype VarRowProps = {\n v: EnvVarEntry;\n editing: string | null;\n editValue: string;\n isRevealed: boolean;\n onToggleReveal: (name: string) => void;\n onStartEdit: (v: EnvVarEntry) => void;\n onEditValueChange: (v: string) => void;\n onHandleUpdate: (name: string) => void;\n onCancelEdit: () => void;\n onDelete: (name: string) => void;\n saving: boolean;\n};\n\nfunction VarRow({ v, editing, editValue, isRevealed, onToggleReveal, onStartEdit, onEditValueChange, onHandleUpdate, onCancelEdit, onDelete, saving }: VarRowProps) {\n const isEditing = editing === v.name;\n return (\n <div className={cn('env-var-row', isEditing && 'env-var-row-editing')}>\n <span className=\"env-var-name mono\">{v.name}</span>\n {isEditing ? (\n <input\n className=\"input mono\"\n type=\"password\"\n style={{ flex: 1, minWidth: 200 }}\n value={editValue}\n onChange={(e) => onEditValueChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onHandleUpdate(v.name);\n if (e.key === 'Escape') onCancelEdit();\n }}\n autoFocus\n />\n ) : (\n <span className={cn('env-var-value mono', !isRevealed && 'env-var-value-masked')}>\n {v.value}\n </span>\n )}\n <span className=\"env-var-source muted\">{v.source}</span>\n <div className=\"env-var-actions\">\n {!isEditing && (\n <button type=\"button\" className=\"icon-btn\" title={isRevealed ? 'Hide' : 'Reveal'} onClick={() => onToggleReveal(v.name)}>\n {isRevealed ? <EyeOff size={12} /> : <Eye size={12} />}\n </button>\n )}\n {isEditing ? (\n <>\n <Button variant=\"primary\" size=\"sm\" onClick={() => onHandleUpdate(v.name)} disabled={saving}>Save</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancelEdit}>Cancel</Button>\n </>\n ) : (\n <>\n <button type=\"button\" className=\"icon-btn\" title=\"Edit\" onClick={() => onStartEdit(v)}>\n <Pencil size={12} />\n </button>\n <button type=\"button\" className=\"icon-btn icon-btn-danger\" title=\"Delete\" onClick={() => onDelete(v.name)}>\n <Trash2 size={12} />\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","// src/web/views/settings/EnvVarsSection.tsx\nimport React from 'react';\nimport { KeyRound } from 'lucide-react';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { EnvVarManager } from '../../components/EnvVarManager';\n\nexport function EnvVarsSection() {\n return (\n <Card id=\"settings-env-vars\" data-section=\"env-vars\">\n <CardTitle><KeyRound size={14} /> Environment Variables</CardTitle>\n <CardMeta>Manage BIZAR_* env vars (API keys, secrets). Values are stored in <code>~/.config/bizar/env.json</code> (mode 0600).</CardMeta>\n <EnvVarManager />\n </Card>\n );\n}\n"],"file":"assets/EnvVarsSection-CW6fWKds.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as n,r as o}from"./react-vendor-D3pra6w-.js";import{C as O,u as T,a as k,b as R,c as E}from"./useSlashCommands-3DFLOfpk.js";import{u as F}from"./Toast-WTxc3m2g.js";import"./vendor-Di7Cp-rw.js";import"./flow-BpU0-gK2.js";import"./icons-B0AKnYI3.js";import"./mobile-layout-DSmtNPja.js";import"./markdown-w2bDDkAH.js";function $(t){const{activeSource:a}=t;return n.jsx("div",{className:`chat-composer-wrap chat-composer-source-${a??"none"} legacy`,children:n.jsx("div",{className:"chat-composer-pill",children:n.jsx(O,{...t})})})}function H({snapshot:t,settings:a,setActiveTab:g,initialTaskId:j,onClearTaskId:z}){const c=F(),s=T(t,a,j??"");o.useEffect(()=>{s.setToast({error:e=>c.error(e),success:e=>c.success(e),info:e=>c.info(e),warning:e=>c.warning(e)})},[s,c]);const[r,l]=o.useState(""),[f,x]=o.useState(a.defaultAgent||"odin"),[p,C]=o.useState(a.defaultModel||""),[h,v]=o.useState([]),u=o.useRef(null),{suggestions:y,setQuery:m}=k(t);o.useEffect(()=>{m(r)},[r,m]);const P=()=>{var e;return(e=u.current)==null?void 0:e.click()},w=e=>{const d=e.target.files;if(!d)return;const S=[];for(let i=0;i<d.length;i++)S.push(d[i].name);v(i=>{const M=S.filter(N=>!i.includes(N));return[...i,...M]}),u.current&&(u.current.value="")},I=async()=>{const e=r.trim();if(!e)return;l(""),m(""),(await s.onSend(e,f,p,h)).ok&&s.jumpToLatest()};return n.jsxs("div",{className:"chat-shell",children:[n.jsx(R,{activeProject:t.activeProject,sessionCount:s.sessions.length,sessionsOpen:!1,infoOpen:!1,onToggleSessions:()=>{},onToggleInfo:()=>{},onOpenOverview:()=>g==null?void 0:g("overview")}),n.jsx("div",{className:"chat-body",children:n.jsxs("main",{className:"chat-main",children:[n.jsx(E,{messages:s.activeSource==="cline"?s.clineMessages:s.bizarMessages,loading:s.loading,activeProject:t.activeProject,sessionId:s.activeSource==="cline"?s.activeClineSessionId??s.sessionId:s.sessionId,pinned:s.pinned,activeSource:s.activeSource,onPickSuggestion:e=>l(e),onCopy:e=>s.copyMessage(e),onDelete:()=>{},onTogglePin:s.togglePin,onRegenerate:s.onRegenerate}),n.jsx($,{agent:f,setAgent:x,model:p,setModel:C,text:r,setText:l,sending:s.sending,activeSource:s.activeSource,onSend:I,attachments:h,setAttachments:v,suggestions:y,onPickSuggestion:e=>l(`${e.split(" ")[0]} `),agents:t.agents||[],onAttach:P,sessionsOpen:!1,infoOpen:!1}),n.jsx("input",{ref:u,type:"file",multiple:!0,style:{display:"none"},onChange:w})]})})]})}export{H as MobileChat};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r,j as e}from"./react-vendor-D3pra6w-.js";import{a as y,S as w,c as R}from"./mobile-layout-DSmtNPja.js";import{C as M,a as U,b as B,B as k,G,E as V,S as P,U as $,H as A,T as C,c as H}from"./EnvVarsSection-CW6fWKds.js";import{u as D}from"./Toast-WTxc3m2g.js";import{j as N,aX as I,aQ as T,$ as K,af as F,s as O,aC as J,y as E,R as Q,aE as W,J as X,e as q}from"./icons-B0AKnYI3.js";import"./vendor-Di7Cp-rw.js";import"./flow-BpU0-gK2.js";function Y(){const s=D(),[i,t]=r.useState(!0),[c,a]=r.useState(!1),[o,d]=r.useState(!1),[p,g]=r.useState(""),[u,x]=r.useState(""),[f,h]=r.useState(!1),[j,n]=r.useState(0);r.useEffect(()=>{let l=!1;return(async()=>{var S,L;try{const[z,v]=await Promise.all([y.get("/memory/config/global").catch(()=>null),y.get("/memory/status").catch(()=>null)]);if(l)return;z&&g(((L=(S=z.config)==null?void 0:S.git)==null?void 0:L.remoteUrl)||""),v&&(x(v.vaultRoot||""),h(!!v.initialized))}finally{l||t(!1)}})(),()=>{l=!0}},[j]);const b=async()=>{a(!0);try{await y.put("/memory/config/global",{git:{remoteUrl:p}}),s.success("Memory config saved."),n(l=>l+1)}catch(l){s.error(`Save failed: ${l.message}`)}finally{a(!1)}},m=async()=>{d(!0);try{await y.post("/memory/init",{}),s.success("Vault initialised."),n(l=>l+1)}catch(l){s.error(`Initialise failed: ${l.message}`)}finally{d(!1)}};return e.jsxs(M,{id:"settings-memory","data-section":"memory",children:[e.jsxs(U,{children:[e.jsx(N,{size:14})," Memory vault"]}),e.jsx(B,{children:"The vault lives at a default location on disk. Only the git remote URL needs to be configured to enable sync across machines."}),i?e.jsx("div",{className:"flex-center",style:{padding:24},children:e.jsx(w,{size:"sm"})}):e.jsxs("div",{className:"settings-fields",children:[e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",children:[e.jsx(I,{size:12,style:{display:"inline",marginRight:4}}),"Vault path"]}),e.jsxs("div",{className:"field-readonly mono","data-testid":"settings-memory-vault-path",style:{fontSize:12,padding:"6px 0"},children:[u||e.jsx("span",{className:"muted",children:"not initialised"}),f?null:e.jsxs(k,{variant:"ghost",size:"sm",onClick:m,disabled:o,style:{marginLeft:12},children:[o?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(I,{size:12}),"Initialise"]})]})]}),e.jsxs("div",{className:"field",children:[e.jsxs("label",{className:"field-label",htmlFor:"set-memory-git-remote",children:[e.jsx(K,{size:12,style:{display:"inline",marginRight:4}}),"Git remote URL"]}),e.jsx("input",{id:"set-memory-git-remote",className:"input mono",type:"text",value:p,onChange:l=>g(l.target.value),placeholder:"git@github.com:org/repo.git"}),e.jsx("span",{className:"field-hint",children:"Leave empty to use local-only mode (no git sync)."})]}),e.jsx("div",{style:{marginTop:12},children:e.jsxs(k,{variant:"primary",size:"sm",onClick:b,disabled:c,children:[c?e.jsx(T,{size:12,className:"memory-spin"}):e.jsx(F,{size:12}),"Save memory config"]})})]})]})}function Z({settings:s,onSettingsChange:i,autoSave:t}){const c=(o,d)=>{i==null||i(o,d),t==null||t(o,d)},a=o=>{i==null||i("ui",{...s.ui,...o}),t==null||t("ui",{...s.ui,...o})};return e.jsx(G,{settings:s,patchUi:a,patchTop:c,autoSave:t})}function _({settings:s,onSettingsChange:i,autoSave:t}){return e.jsxs("div",{style:{fontSize:13,color:"var(--text-dim)",padding:"8px 0"},children:[e.jsx("p",{style:{marginBottom:8},children:"Provider management is available on desktop."}),e.jsx("a",{href:"/?desktop=1#settings-providers",className:"mobile-btn mobile-btn-secondary",style:{display:"inline-block",fontSize:12,padding:"6px 12px"},children:"Open desktop to manage providers"})]})}function ee(){return e.jsx(V,{})}function se(){return e.jsx(Y,{})}function ie({settings:s,onSettingsChange:i,autoSave:t}){const c=(a,o)=>{i==null||i(a,o),t==null||t(a,o)};return e.jsx(P,{settings:s,patchTop:c})}function te(){return e.jsx($,{})}function ne({settings:s}){const[i,t]=r.useState(s),[c,a]=r.useState(!1);return e.jsx(A,{settings:i,setSettings:t,setDirty:a})}function ae(){return e.jsx(C,{})}function oe({settings:s}){const i=s.about||{version:"—",homepage:"https://github.com/DrB0rk/BizarHarness",license:"MIT"};return e.jsx(H,{about:i})}function fe({settings:s,onSettingsChange:i,autoSave:t,snapshot:c}){var x,f,h,j;const[a,o]=r.useState(""),[d,p]=r.useState(null),u=[{id:"general",title:"General",icon:O,description:"Theme, accent, layout",component:e.jsx(Z,{settings:s,onSettingsChange:i,autoSave:t})},{id:"providers",title:"AI Providers",icon:N,description:`${((x=c==null?void 0:c.providers)==null?void 0:x.length)??0} configured`,component:e.jsx(_,{settings:s,onSettingsChange:i,autoSave:t})},{id:"env-vars",title:"Environment Variables",icon:J,description:"API keys, secrets",component:e.jsx(ee,{})},{id:"memory",title:"Memory Vault",icon:N,description:"Git remote, LightRAG config",component:e.jsx(se,{})},{id:"system-llm",title:"System LLM",icon:E,description:((f=s.systemLlm)==null?void 0:f.model)||"not set",component:e.jsx(ie,{settings:s,onSettingsChange:i,autoSave:t})},{id:"updates",title:"Updates",icon:Q,description:"Check for updates",component:e.jsx(te,{})},{id:"headroom",title:"Headroom",icon:E,description:(h=s.headroom)!=null&&h.enabled?"Enabled":"Disabled",component:e.jsx(ne,{settings:s})},{id:"tailscale",title:"Tailscale",icon:W,description:"Tailscale serve & auth",component:e.jsx(ae,{})},{id:"about",title:"About",icon:X,description:`Bizar v${((j=s.about)==null?void 0:j.version)||"—"}`,component:e.jsx(oe,{settings:s})}].filter(n=>!a||n.title.toLowerCase().includes(a.toLowerCase())||n.description.toLowerCase().includes(a.toLowerCase()));return e.jsxs("div",{className:"mobile-settings",children:[e.jsxs("div",{className:"mobile-settings-search",children:[e.jsx(le,{}),e.jsx("input",{value:a,onChange:n=>o(n.target.value),placeholder:"Search settings...","aria-label":"Search settings"})]}),e.jsxs("div",{className:"mobile-settings-list",children:[u.map(n=>{const b=n.icon,m=d===n.id;return e.jsxs("div",{className:R("mobile-settings-item",m&&"is-expanded"),children:[e.jsxs("button",{className:"mobile-settings-item-head",onClick:()=>p(m?null:n.id),"aria-expanded":m,"aria-controls":`mobile-settings-body-${n.id}`,children:[e.jsx("div",{className:"mobile-settings-item-icon",children:e.jsx(b,{size:18})}),e.jsxs("div",{className:"mobile-settings-item-text",children:[e.jsx("div",{className:"mobile-settings-item-title",children:n.title}),e.jsx("div",{className:"mobile-settings-item-desc",children:n.description})]}),e.jsx(q,{size:16,className:R("mobile-settings-item-chevron",m&&"is-rotated")})]}),m&&e.jsx("div",{id:`mobile-settings-body-${n.id}`,className:"mobile-settings-item-body",children:n.component})]},n.id)}),u.length===0&&e.jsxs("div",{className:"mobile-settings-empty",children:['No settings match "',a,'"']})]})]})}function le(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("path",{d:"m21 21-4.35-4.35"})]})}export{fe as MobileSettings};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MobileSettings-K-sNsn_r.js","sources":["../../src/web/views/settings/MemorySection.tsx","../../src/web/mobile/MobileSettings.tsx"],"sourcesContent":["// src/web/views/settings/MemorySection.tsx — memory vault + git config for Settings.\n// v6.x — Vault path now loads from /api/memory/status (was hardcoded to '').\n// We also surface a small \"Initialise\" button when the vault does not exist.\nimport React, { useEffect, useState } from 'react';\nimport { Brain, GitBranch, Loader2, Save, FolderInput } from 'lucide-react';\nimport { Button } from '../../components/Button';\nimport { Card, CardTitle, CardMeta } from '../../components/Card';\nimport { Spinner } from '../../components/Spinner';\nimport { useToast } from '../../components/Toast';\nimport { api } from '../../lib/api';\n\ntype GitConfig = {\n remoteUrl?: string;\n};\n\ntype GlobalConfig = {\n git?: GitConfig;\n};\n\ntype MemoryStatus = {\n initialized: boolean;\n vaultRoot?: string | null;\n mode?: string | null;\n};\n\nexport function MemorySection() {\n const toast = useToast();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [initialising, setInitialising] = useState(false);\n const [remoteUrl, setRemoteUrl] = useState('');\n const [vaultPath, setVaultPath] = useState<string>('');\n const [vaultInitialised, setVaultInitialised] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const [cfgRes, statusRes] = await Promise.all([\n api.get<{ config: GlobalConfig; path?: string }>('/memory/config/global').catch(() => null),\n api.get<MemoryStatus>('/memory/status').catch(() => null),\n ]);\n if (cancelled) return;\n if (cfgRes) setRemoteUrl(cfgRes.config?.git?.remoteUrl || '');\n if (statusRes) {\n setVaultPath(statusRes.vaultRoot || '');\n setVaultInitialised(!!statusRes.initialized);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [refreshKey]);\n\n const onSave = async () => {\n setSaving(true);\n try {\n await api.put('/memory/config/global', { git: { remoteUrl } });\n toast.success('Memory config saved.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Save failed: ${(err as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const onInitialise = async () => {\n setInitialising(true);\n try {\n await api.post('/memory/init', {});\n toast.success('Vault initialised.');\n setRefreshKey((k) => k + 1);\n } catch (err) {\n toast.error(`Initialise failed: ${(err as Error).message}`);\n } finally {\n setInitialising(false);\n }\n };\n\n return (\n <Card id=\"settings-memory\" data-section=\"memory\">\n <CardTitle><Brain size={14} /> Memory vault</CardTitle>\n <CardMeta>\n The vault lives at a default location on disk. Only the git remote URL\n needs to be configured to enable sync across machines.\n </CardMeta>\n\n {loading ? (\n <div className=\"flex-center\" style={{ padding: 24 }}>\n <Spinner size=\"sm\" />\n </div>\n ) : (\n <div className=\"settings-fields\">\n <div className=\"field\">\n <label className=\"field-label\">\n <FolderInput size={12} style={{ display: 'inline', marginRight: 4 }} />\n Vault path\n </label>\n <div\n className=\"field-readonly mono\"\n data-testid=\"settings-memory-vault-path\"\n style={{ fontSize: 12, padding: '6px 0' }}\n >\n {vaultPath || <span className=\"muted\">not initialised</span>}\n {vaultInitialised ? null : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onInitialise}\n disabled={initialising}\n style={{ marginLeft: 12 }}\n >\n {initialising ? <Loader2 size={12} className=\"memory-spin\" /> : <FolderInput size={12} />}\n Initialise\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"field\">\n <label className=\"field-label\" htmlFor=\"set-memory-git-remote\">\n <GitBranch size={12} style={{ display: 'inline', marginRight: 4 }} />\n Git remote URL\n </label>\n <input\n id=\"set-memory-git-remote\"\n className=\"input mono\"\n type=\"text\"\n value={remoteUrl}\n onChange={(e) => setRemoteUrl(e.target.value)}\n placeholder=\"git@github.com:org/repo.git\"\n />\n <span className=\"field-hint\">Leave empty to use local-only mode (no git sync).</span>\n </div>\n\n <div style={{ marginTop: 12 }}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving}\n >\n {saving ? <Loader2 size={12} className=\"memory-spin\" /> : <Save size={12} />}\n Save memory config\n </Button>\n </div>\n </div>\n )}\n </Card>\n );\n}\n","// src/web/mobile/MobileSettings.tsx — v5.4 mobile settings with full desktop parity.\n// All 9 sections in an accordion layout with search.\nimport { useState } from 'react';\nimport {\n Settings2, Brain, KeyRound, Cpu, RefreshCw, Globe, Info, ChevronRight,\n} from 'lucide-react';\nimport { cn } from '../lib/utils';\nimport type { Settings, Snapshot } from '../lib/types';\n\n// Sub-section components — each renders its section content inline.\nimport { GeneralSection } from '../views/settings/GeneralSection';\nimport { EnvVarsSection } from '../views/settings/EnvVarsSection';\nimport { MemorySection } from '../views/settings/MemorySection';\nimport { SystemLlmSection } from '../views/settings/SystemLlmSection';\nimport { UpdatesSection } from '../views/settings/UpdatesSection';\nimport { HeadroomSection } from '../views/settings/HeadroomSection';\nimport { TailscaleSettings } from '../components/TailscaleSettings';\nimport { ActivitySection } from '../views/settings/ActivitySection';\n\n// Lazy-load heavy sections that pull in large dependencies.\nimport React from 'react';\n\ntype Props = {\n settings: Settings;\n /** Called when the user changes any top-level setting */\n onSettingsChange?: <K extends keyof Settings>(key: K, value: Settings[K]) => void;\n /** Debounced auto-save to API (key, value) */\n autoSave?: (key: keyof Settings, value: Settings[keyof Settings]) => void;\n /** Optional snapshot for counts / agent list */\n snapshot?: Snapshot | null;\n /** v5.3 compatibility — called after settings are saved (MobileApp.tsx passes refreshSnapshot) */\n onRefresh?: () => Promise<void>;\n};\n\n// ─── Section definitions ─────────────────────────────────────────────────────\n\nfunction GeneralSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n const patchUi = (patch: Partial<Settings['ui']>) => {\n onSettingsChange?.('ui', { ...settings.ui, ...patch });\n autoSave?.('ui', { ...settings.ui, ...patch });\n };\n return (\n <GeneralSection\n settings={settings}\n patchUi={patchUi}\n patchTop={patchTop}\n autoSave={autoSave}\n />\n );\n}\n\nfunction ProvidersSettings({ settings, onSettingsChange, autoSave }: Props) {\n // Providers are managed server-side; show a link to the desktop providers view.\n // Mobile can't add/edit providers without more complex auth flow.\n void settings; void onSettingsChange; void autoSave;\n return (\n <div style={{ fontSize: 13, color: 'var(--text-dim)', padding: '8px 0' }}>\n <p style={{ marginBottom: 8 }}>\n Provider management is available on desktop.\n </p>\n <a href=\"/?desktop=1#settings-providers\" className=\"mobile-btn mobile-btn-secondary\" style={{ display: 'inline-block', fontSize: 12, padding: '6px 12px' }}>\n Open desktop to manage providers\n </a>\n </div>\n );\n}\n\nfunction EnvVarsSettings() {\n return <EnvVarsSection />;\n}\n\nfunction MemorySettings() {\n return <MemorySection />;\n}\n\nfunction SystemLlmSettings({ settings, onSettingsChange, autoSave }: Props) {\n const patchTop = <K extends keyof Settings>(key: K, value: Settings[K]) => {\n onSettingsChange?.(key, value);\n autoSave?.(key, value);\n };\n return <SystemLlmSection settings={settings} patchTop={patchTop} />;\n}\n\nfunction UpdatesSettings() {\n return <UpdatesSection />;\n}\n\nfunction HeadroomSettingsSection({ settings }: { settings: Settings }) {\n const [localSettings, setLocalSettings] = useState(settings);\n const [dirty, setDirty] = useState(false);\n return (\n <HeadroomSection\n settings={localSettings}\n setSettings={setLocalSettings as React.Dispatch<React.SetStateAction<Settings>>}\n setDirty={setDirty}\n />\n );\n}\n\nfunction TailscaleSettingsMobile() {\n return <TailscaleSettings />;\n}\n\nfunction AboutSection({ settings }: { settings: Settings }) {\n const about = settings.about || { version: '—', homepage: 'https://github.com/DrB0rk/BizarHarness', license: 'MIT' };\n return <ActivitySection about={about} />;\n}\n\n// ─── Main component ──────────────────────────────────────────────────────────\n\nexport function MobileSettings({ settings, onSettingsChange, autoSave, snapshot }: Props) {\n const [search, setSearch] = useState('');\n const [expandedSection, setExpandedSection] = useState<string | null>(null);\n\n const sections = [\n {\n id: 'general',\n title: 'General',\n icon: Settings2,\n description: 'Theme, accent, layout',\n component: <GeneralSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'providers',\n title: 'AI Providers',\n icon: Brain,\n description: `${snapshot?.providers?.length ?? 0} configured`,\n component: <ProvidersSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'env-vars',\n title: 'Environment Variables',\n icon: KeyRound,\n description: 'API keys, secrets',\n component: <EnvVarsSettings />,\n },\n {\n id: 'memory',\n title: 'Memory Vault',\n icon: Brain,\n description: 'Git remote, LightRAG config',\n component: <MemorySettings />,\n },\n {\n id: 'system-llm',\n title: 'System LLM',\n icon: Cpu,\n description: settings.systemLlm?.model || 'not set',\n component: <SystemLlmSettings settings={settings} onSettingsChange={onSettingsChange} autoSave={autoSave} />,\n },\n {\n id: 'updates',\n title: 'Updates',\n icon: RefreshCw,\n description: 'Check for updates',\n component: <UpdatesSettings />,\n },\n {\n id: 'headroom',\n title: 'Headroom',\n icon: Cpu,\n description: settings.headroom?.enabled ? 'Enabled' : 'Disabled',\n component: <HeadroomSettingsSection settings={settings} />,\n },\n {\n id: 'tailscale',\n title: 'Tailscale',\n icon: Globe,\n description: 'Tailscale serve & auth',\n component: <TailscaleSettingsMobile />,\n },\n {\n id: 'about',\n title: 'About',\n icon: Info,\n description: `Bizar v${settings.about?.version || '—'}`,\n component: <AboutSection settings={settings} />,\n },\n ];\n\n const filtered = sections.filter(\n (s) =>\n !search ||\n s.title.toLowerCase().includes(search.toLowerCase()) ||\n s.description.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div className=\"mobile-settings\">\n <div className=\"mobile-settings-search\">\n <SearchIcon />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search settings...\"\n aria-label=\"Search settings\"\n />\n </div>\n\n <div className=\"mobile-settings-list\">\n {filtered.map((s) => {\n const Icon = s.icon;\n const isExpanded = expandedSection === s.id;\n return (\n <div key={s.id} className={cn('mobile-settings-item', isExpanded && 'is-expanded')}>\n <button\n className=\"mobile-settings-item-head\"\n onClick={() => setExpandedSection(isExpanded ? null : s.id)}\n aria-expanded={isExpanded}\n aria-controls={`mobile-settings-body-${s.id}`}\n >\n <div className=\"mobile-settings-item-icon\">\n <Icon size={18} />\n </div>\n <div className=\"mobile-settings-item-text\">\n <div className=\"mobile-settings-item-title\">{s.title}</div>\n <div className=\"mobile-settings-item-desc\">{s.description}</div>\n </div>\n <ChevronRight\n size={16}\n className={cn('mobile-settings-item-chevron', isExpanded && 'is-rotated')}\n />\n </button>\n {isExpanded && (\n <div id={`mobile-settings-body-${s.id}`} className=\"mobile-settings-item-body\">\n {s.component}\n </div>\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"mobile-settings-empty\">No settings match \"{search}\"</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" />\n </svg>\n );\n}\n"],"names":["MemorySection","toast","useToast","loading","setLoading","useState","saving","setSaving","initialising","setInitialising","remoteUrl","setRemoteUrl","vaultPath","setVaultPath","vaultInitialised","setVaultInitialised","refreshKey","setRefreshKey","useEffect","cancelled","cfgRes","statusRes","api","_b","_a","onSave","k","err","onInitialise","jsxs","Card","CardTitle","jsx","Brain","CardMeta","Spinner","FolderInput","Button","Loader2","GitBranch","e","Save","GeneralSettings","settings","onSettingsChange","autoSave","patchTop","key","value","patchUi","patch","GeneralSection","ProvidersSettings","EnvVarsSettings","EnvVarsSection","MemorySettings","SystemLlmSettings","SystemLlmSection","UpdatesSettings","UpdatesSection","HeadroomSettingsSection","localSettings","setLocalSettings","dirty","setDirty","HeadroomSection","TailscaleSettingsMobile","TailscaleSettings","AboutSection","about","ActivitySection","MobileSettings","snapshot","search","setSearch","expandedSection","setExpandedSection","filtered","Settings2","KeyRound","Cpu","RefreshCw","_c","Globe","Info","_d","s","SearchIcon","Icon","isExpanded","cn","ChevronRight"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r,j as o}from"./react-vendor-D3pra6w-.js";import{E as C,C as j,I as p,J as T,X as g}from"./icons-B0AKnYI3.js";const d=r.createContext(null);function I(){const t=r.useContext(d);return t||{show:()=>{},info:()=>{},success:()=>{},error:()=>{},warning:()=>{},dismiss:()=>{},toasts:[]}}const h={info:T,success:p,error:j,warning:C};function R({children:t}){const[i,n]=r.useState([]),x=r.useRef(1),c=r.useRef(new Map),u=r.useCallback(s=>{n(m=>m.filter(l=>l.id!==s));const e=c.current.get(s);e&&(clearTimeout(e),c.current.delete(s))},[]),a=r.useCallback((s,e="info",m=4e3)=>{const l=x.current++;if(n(f=>[...f,{id:l,kind:e,message:s}]),m>0){const f=setTimeout(()=>u(l),m);c.current.set(l,f)}},[u]);r.useEffect(()=>()=>{for(const s of c.current.values())clearTimeout(s);c.current.clear()},[]);const v=r.useMemo(()=>({show:a,info:(s,e)=>a(s,"info",e),success:(s,e)=>a(s,"success",e),error:(s,e)=>a(s,"error",e),warning:(s,e)=>a(s,"warning",e),dismiss:u,toasts:i}),[a,u,i]);return o.jsxs(d.Provider,{value:v,children:[t,o.jsx(k,{toasts:i,onDismiss:u})]})}function k({toasts:t,onDismiss:i}){return o.jsx("div",{className:"toast-stack","aria-live":"polite",children:t.map(n=>o.jsx(w,{toast:n,onDismiss:i},n.id))})}function w({toast:t,onDismiss:i}){const n=h[t.kind];return o.jsxs("div",{className:`toast toast-${t.kind}`,role:"alert","aria-live":"assertive","aria-atomic":"true",children:[o.jsx(n,{size:16,className:"toast-icon"}),o.jsx("span",{className:"toast-message",children:t.message}),o.jsx("button",{type:"button",className:"toast-close","aria-label":"Dismiss",onClick:()=>i(t.id),children:o.jsx(g,{size:14})})]})}export{R as T,I as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Toast-WTxc3m2g.js","sources":["../../src/web/components/Toast.tsx"],"sourcesContent":["// src/components/Toast.tsx — toast context, provider hook, container.\n\nimport {\n createContext,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { CheckCircle2, AlertTriangle, AlertCircle, Info, X } from 'lucide-react';\n\nexport type ToastKind = 'info' | 'success' | 'error' | 'warning';\n\nexport type Toast = {\n id: number;\n kind: ToastKind;\n message: string;\n};\n\nexport type ToastApi = {\n show: (message: string, kind?: ToastKind, durationMs?: number) => void;\n info: (message: string, durationMs?: number) => void;\n success: (message: string, durationMs?: number) => void;\n error: (message: string, durationMs?: number) => void;\n warning: (message: string, durationMs?: number) => void;\n dismiss: (id: number) => void;\n toasts: Toast[];\n};\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport function useToast(): ToastApi {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n // Fallback no-op so tests/Storybook don't crash\n return {\n show: () => undefined,\n info: () => undefined,\n success: () => undefined,\n error: () => undefined,\n warning: () => undefined,\n dismiss: () => undefined,\n toasts: [],\n };\n }\n return ctx;\n}\n\nconst ICONS: Record<ToastKind, typeof Info> = {\n info: Info,\n success: CheckCircle2,\n error: AlertCircle,\n warning: AlertTriangle,\n};\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const idRef = useRef(1);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n\n const dismiss = useCallback((id: number) => {\n setToasts((cur) => cur.filter((t) => t.id !== id));\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n }, []);\n\n const show = useCallback<ToastApi['show']>(\n (message, kind = 'info', durationMs = 4000) => {\n const id = idRef.current++;\n setToasts((cur) => [...cur, { id, kind, message }]);\n if (durationMs > 0) {\n const timer = setTimeout(() => dismiss(id), durationMs);\n timersRef.current.set(id, timer);\n }\n },\n [dismiss],\n );\n\n useEffect(() => {\n return () => {\n for (const timer of timersRef.current.values()) clearTimeout(timer);\n timersRef.current.clear();\n };\n }, []);\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n info: (m, d) => show(m, 'info', d),\n success: (m, d) => show(m, 'success', d),\n error: (m, d) => show(m, 'error', d),\n warning: (m, d) => show(m, 'warning', d),\n dismiss,\n toasts,\n }),\n [show, dismiss, toasts],\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n}\n\nexport function ToastContainer({\n toasts,\n onDismiss,\n}: {\n toasts: Toast[];\n onDismiss: (id: number) => void;\n}) {\n return (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction ToastItem({\n toast,\n onDismiss,\n}: {\n toast: Toast;\n onDismiss: (id: number) => void;\n}) {\n const Icon = ICONS[toast.kind];\n return (\n <div className={`toast toast-${toast.kind}`} role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <Icon size={16} className=\"toast-icon\" />\n <span className=\"toast-message\">{toast.message}</span>\n <button\n type=\"button\"\n className=\"toast-close\"\n aria-label=\"Dismiss\"\n onClick={() => onDismiss(toast.id)}\n >\n <X size={14} />\n </button>\n </div>\n );\n}\n"],"names":["ToastContext","createContext","useToast","ctx","useContext","ICONS","Info","CheckCircle2","AlertCircle","AlertTriangle","ToastProvider","children","toasts","setToasts","useState","idRef","useRef","timersRef","dismiss","useCallback","id","cur","t","timer","show","message","kind","durationMs","useEffect","api","useMemo","m","d","jsxs","jsx","ToastContainer","onDismiss","ToastItem","toast","Icon","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{k as Mt,p as se,z as oe,l as re,m as Ce,n as $t,o as Ct,q as Ae}from"./vendor-Di7Cp-rw.js";const pt={error001:(t="react")=>`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:i,targetHandle:s})=>`Couldn't create edge for ${t} handle id: "${t==="source"?i:s}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},ve=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],bn=["Enter"," ","Escape"],Ie={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:i})=>`Moved selected node ${t}. New position, x: ${e}, y: ${i}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var mt;(function(t){t.Strict="strict",t.Loose="loose"})(mt||(mt={}));var dt;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(dt||(dt={}));var Lt;(function(t){t.Partial="partial",t.Full="full"})(Lt||(Lt={}));const En={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Rt;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(Rt||(Rt={}));var Ft;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(Ft||(Ft={}));var z;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(z||(z={}));const Gt={[z.Left]:z.Right,[z.Right]:z.Left,[z.Top]:z.Bottom,[z.Bottom]:z.Top};function Hn(t){return t===null?null:t?"valid":"invalid"}const Ne=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,Tn=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),Bt=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),yt=(t,e=[0,0])=>{const{width:i,height:s}=st(t),n=t.origin??e,r=i*n[0],o=s*n[1];return{x:t.position.x-r,y:t.position.y-o}},$n=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const i=t.reduce((s,n)=>{const r=typeof n=="string";let o=!e.nodeLookup&&!r?n:void 0;e.nodeLookup&&(o=r?e.nodeLookup.get(n):Bt(n)?n:e.nodeLookup.get(n.id));const a=o?wt(o,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return bt(s,a)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Et(i)},ae=(t,e={})=>{let i={x:1/0,y:1/0,x2:-1/0,y2:-1/0},s=!1;return t.forEach(n=>{(e.filter===void 0||e.filter(n))&&(i=bt(i,wt(n)),s=!0)}),s?Et(i):{x:0,y:0,width:0,height:0}},Cn=(t,e,[i,s,n]=[0,0,1],r=!1,o=!1)=>{const a=(e.x-i)/n,c=(e.y-s)/n,l=e.width/n,u=e.height/n,h=[];for(const f of t.values()){const{measured:y,selectable:d=!0,hidden:p=!1}=f;if(o&&!d||p)continue;const b=y.width??f.width??f.initialWidth??0,M=y.height??f.height??f.initialHeight??0,{x:I,y:g}=f.internals.positionAbsolute,T=ue(a,c,l,u,I,g,b,M),X=b*M,C=r&&T>0;(!f.internals.handleBounds||C||T>=X||f.dragging)&&h.push(f)}return h},Pe=(t,e)=>{const i=new Set;return t.forEach(s=>{i.add(s.id)}),e.filter(s=>i.has(s.source)||i.has(s.target))};function Be(t,e){const i=new Map,s=e!=null&&e.nodes?new Set(e.nodes.map(n=>n.id)):null;return t.forEach(n=>{let r;if(e!=null&&e.includeHiddenNodes){const{width:o,height:a}=st(n);r=o>0&&a>0}else r=!!(n.measured.width&&n.measured.height&&!n.hidden);r&&(!s||s.has(n.id))&&i.set(n.id,n)}),i}async function An({nodes:t,width:e,height:i,panZoom:s,minZoom:n,maxZoom:r},o){if(t.size===0)return!0;const a=Be(t,o),c=ae(a),l=Ve(c,e,i,(o==null?void 0:o.minZoom)??n,(o==null?void 0:o.maxZoom)??r,(o==null?void 0:o.padding)??.1);return await s.setViewport(l,{duration:o==null?void 0:o.duration,ease:o==null?void 0:o.ease,interpolate:o==null?void 0:o.interpolate}),!0}function Ye({nodeId:t,nextPosition:e,nodeLookup:i,nodeOrigin:s=[0,0],nodeExtent:n,onError:r}){const o=i.get(t),a=o.parentId?i.get(o.parentId):void 0,{x:c,y:l}=a?a.internals.positionAbsolute:{x:0,y:0},u=o.origin??s;let h=o.extent||n;if(o.extent==="parent"&&!o.expandParent)if(!a)r==null||r("005",pt.error005());else{const y=a.measured.width,d=a.measured.height;y&&d&&(h=[[c,l],[c+y,l+d]])}else a&&at(o.extent)&&(h=[[o.extent[0][0]+c,o.extent[0][1]+l],[o.extent[1][0]+c,o.extent[1][1]+l]]);const f=at(h)?rt(e,h,o.measured):e;return(o.measured.width===void 0||o.measured.height===void 0)&&(r==null||r("015",pt.error015())),{position:{x:f.x-c+(o.measured.width??0)*u[0],y:f.y-l+(o.measured.height??0)*u[1]},positionAbsolute:f}}async function vn({nodesToRemove:t=[],edgesToRemove:e=[],nodes:i,edges:s,onBeforeDelete:n}){const r=new Set(t.map(f=>f.id)),o=[];for(const f of i){if(f.deletable===!1)continue;const y=r.has(f.id),d=!y&&f.parentId&&o.find(p=>p.id===f.parentId);(y||d)&&o.push(f)}const a=new Set(e.map(f=>f.id)),c=s.filter(f=>f.deletable!==!1),u=Pe(o,c);for(const f of c)a.has(f.id)&&!u.find(d=>d.id===f.id)&&u.push(f);if(!n)return{edges:u,nodes:o};const h=await n({nodes:o,edges:u});return typeof h=="boolean"?h?{edges:u,nodes:o}:{edges:[],nodes:[]}:h}const ut=(t,e=0,i=1)=>Math.min(Math.max(t,e),i),rt=(t={x:0,y:0},e,i)=>({x:ut(t.x,e[0][0],e[1][0]-((i==null?void 0:i.width)??0)),y:ut(t.y,e[0][1],e[1][1]-((i==null?void 0:i.height)??0))});function ce(t,e,i){const{width:s,height:n}=st(i),{x:r,y:o}=i.internals.positionAbsolute;return rt(t,[[r,o],[r+s,o+n]],e)}const St=(t,e,i)=>t<e?ut(Math.abs(t-e),1,e)/e:t>i?-ut(Math.abs(t-i),1,e)/e:0,le=(t,e,i=15,s=40)=>{const n=St(t.x,s,e.width-s)*i,r=St(t.y,s,e.height-s)*i;return[n,r]},bt=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),Nt=({x:t,y:e,width:i,height:s})=>({x:t,y:e,x2:t+i,y2:e+s}),Et=({x:t,y:e,x2:i,y2:s})=>({x:t,y:e,width:i-t,height:s-e}),Yt=(t,e=[0,0])=>{var n,r;const{x:i,y:s}=Bt(t)?t.internals.positionAbsolute:yt(t,e);return{x:i,y:s,width:((n=t.measured)==null?void 0:n.width)??t.width??t.initialWidth??0,height:((r=t.measured)==null?void 0:r.height)??t.height??t.initialHeight??0}},wt=(t,e=[0,0])=>{var n,r;const{x:i,y:s}=Bt(t)?t.internals.positionAbsolute:yt(t,e);return{x:i,y:s,x2:i+(((n=t.measured)==null?void 0:n.width)??t.width??t.initialWidth??0),y2:s+(((r=t.measured)==null?void 0:r.height)??t.height??t.initialHeight??0)}},ze=(t,e)=>Et(bt(Nt(t),Nt(e))),ue=(t,e,i,s,n,r,o,a)=>{const c=Math.max(0,Math.min(t+i,n+o)-Math.max(t,n)),l=Math.max(0,Math.min(e+s,r+a)-Math.max(e,r));return Math.ceil(c*l)},fe=(t,e)=>ue(t.x,t.y,t.width,t.height,e.x,e.y,e.width,e.height),In=t=>ot(t.width)&&ot(t.height)&&ot(t.x)&&ot(t.y),ot=t=>!isNaN(t)&&isFinite(t),Nn=(t,e)=>(i,s)=>{},Ht=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),de=({x:t,y:e},[i,s,n],r=!1,o=[1,1])=>{const a={x:(t-i)/n,y:(e-s)/n};return r?Ht(a,o):a},Pt=({x:t,y:e},[i,s,n])=>({x:t*n+i,y:e*n+s});function ct(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(i)}if(typeof t=="string"&&t.endsWith("%")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(e*i*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Xe(t,e,i){if(typeof t=="string"||typeof t=="number"){const s=ct(t,i),n=ct(t,e);return{top:s,right:n,bottom:s,left:n,x:n*2,y:s*2}}if(typeof t=="object"){const s=ct(t.top??t.y??0,i),n=ct(t.bottom??t.y??0,i),r=ct(t.left??t.x??0,e),o=ct(t.right??t.x??0,e);return{top:s,right:o,bottom:n,left:r,x:r+o,y:s+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function De(t,e,i,s,n,r){const{x:o,y:a}=Pt(t,[e,i,s]),{x:c,y:l}=Pt({x:t.x+t.width,y:t.y+t.height},[e,i,s]),u=n-c,h=r-l;return{left:Math.floor(o),top:Math.floor(a),right:Math.floor(u),bottom:Math.floor(h)}}const Ve=(t,e,i,s,n,r)=>{const o=Xe(r,e,i),a=(e-o.x)/t.width,c=(i-o.y)/t.height,l=Math.min(a,c),u=ut(l,s,n),h=t.x+t.width/2,f=t.y+t.height/2,y=e/2-h*u,d=i/2-f*u,p=De(t,y,d,u,e,i),b={left:Math.min(p.left-o.left,0),top:Math.min(p.top-o.top,0),right:Math.min(p.right-o.right,0),bottom:Math.min(p.bottom-o.bottom,0)};return{x:y-b.left+b.right,y:d-b.top+b.bottom,zoom:u}},zt=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function at(t){return t!=null&&t!=="parent"}function st(t){var e,i;return{width:((e=t.measured)==null?void 0:e.width)??t.width??t.initialWidth??0,height:((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight??0}}function Pn(t){var e,i;return(((e=t.measured)==null?void 0:e.width)??t.width??t.initialWidth)!==void 0&&(((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight)!==void 0}function Bn(t,e={width:0,height:0},i,s,n){const r={...t},o=s.get(i);if(o){const a=o.origin||n;r.x+=o.internals.positionAbsolute.x-(e.width??0)*a[0],r.y+=o.internals.positionAbsolute.y-(e.height??0)*a[1]}return r}function Yn(t,e){if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0}function zn(){let t,e;return{promise:new Promise((s,n)=>{t=s,e=n}),resolve:t,reject:e}}function Xn(t){return{...Ie,...t||{}}}function ht(t,{snapGrid:e=[0,0],snapToGrid:i=!1,transform:s,containerBounds:n}){const{x:r,y:o}=tt(t),a=de({x:r-((n==null?void 0:n.left)??0),y:o-((n==null?void 0:n.top)??0)},s),{x:c,y:l}=i?Ht(a,e):a;return{xSnapped:c,ySnapped:l,...a}}const he=t=>({width:t.offsetWidth,height:t.offsetHeight}),Oe=t=>{var e;return((e=t==null?void 0:t.getRootNode)==null?void 0:e.call(t))||(window==null?void 0:window.document)},We=["INPUT","SELECT","TEXTAREA"];function Dn(t){var s,n;const e=((n=(s=t.composedPath)==null?void 0:s.call(t))==null?void 0:n[0])||t.target;return(e==null?void 0:e.nodeType)!==1?!1:We.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const _e=t=>"clientX"in t,tt=(t,e)=>{var r,o;const i=_e(t),s=i?t.clientX:(r=t.touches)==null?void 0:r[0].clientX,n=i?t.clientY:(o=t.touches)==null?void 0:o[0].clientY;return{x:s-((e==null?void 0:e.left)??0),y:n-((e==null?void 0:e.top)??0)}},qt=(t,e,i,s,n)=>{const r=e.querySelectorAll(`.${t}`);return!r||!r.length?null:Array.from(r).map(o=>{const a=o.getBoundingClientRect();return{id:o.getAttribute("data-handleid"),type:t,nodeId:n,position:o.getAttribute("data-handlepos"),x:(a.left-i.left)/s,y:(a.top-i.top)/s,...he(o)}})};function Le({sourceX:t,sourceY:e,targetX:i,targetY:s,sourceControlX:n,sourceControlY:r,targetControlX:o,targetControlY:a}){const c=t*.125+n*.375+o*.375+i*.125,l=e*.125+r*.375+a*.375+s*.125,u=Math.abs(c-t),h=Math.abs(l-e);return[c,l,u,h]}function xt(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function kt({pos:t,x1:e,y1:i,x2:s,y2:n,c:r}){switch(t){case z.Left:return[e-xt(e-s,r),i];case z.Right:return[e+xt(s-e,r),i];case z.Top:return[e,i-xt(i-n,r)];case z.Bottom:return[e,i+xt(n-i,r)]}}function Vn({sourceX:t,sourceY:e,sourcePosition:i=z.Bottom,targetX:s,targetY:n,targetPosition:r=z.Top,curvature:o=.25}){const[a,c]=kt({pos:i,x1:t,y1:e,x2:s,y2:n,c:o}),[l,u]=kt({pos:r,x1:s,y1:n,x2:t,y2:e,c:o}),[h,f,y,d]=Le({sourceX:t,sourceY:e,targetX:s,targetY:n,sourceControlX:a,sourceControlY:c,targetControlX:l,targetControlY:u});return[`M${t},${e} C${a},${c} ${l},${u} ${s},${n}`,h,f,y,d]}function ye({sourceX:t,sourceY:e,targetX:i,targetY:s}){const n=Math.abs(i-t)/2,r=i<t?i+n:i-n,o=Math.abs(s-e)/2,a=s<e?s+o:s-o;return[r,a,n,o]}function On({sourceNode:t,targetNode:e,selected:i=!1,zIndex:s=0,elevateOnSelect:n=!1,zIndexMode:r="basic"}){if(r==="manual")return s;const o=n&&i?s+1e3:s,a=Math.max(t.parentId||n&&t.selected?t.internals.z:0,e.parentId||n&&e.selected?e.internals.z:0);return o+a}function Wn({sourceNode:t,targetNode:e,width:i,height:s,transform:n}){const r=bt(wt(t),wt(e));r.x===r.x2&&(r.x2+=1),r.y===r.y2&&(r.y2+=1);const o={x:-n[0]/n[2],y:-n[1]/n[2],width:i/n[2],height:s/n[2]};return fe(o,Et(r))>0}const Re=({source:t,sourceHandle:e,target:i,targetHandle:s})=>`xy-edge__${t}${e||""}-${i}${s||""}`,Fe=(t,e)=>e.some(i=>i.source===t.source&&i.target===t.target&&(i.sourceHandle===t.sourceHandle||!i.sourceHandle&&!t.sourceHandle)&&(i.targetHandle===t.targetHandle||!i.targetHandle&&!t.targetHandle)),_n=(t,e,i={})=>{var r;if(!t.source||!t.target)return(r=i.onError)==null||r.call(i,"006",pt.error006()),e;const s=i.getEdgeId||Re;let n;return Ne(t)?n={...t}:n={...t,id:s(t)},Fe(n,e)?e:(n.sourceHandle===null&&delete n.sourceHandle,n.targetHandle===null&&delete n.targetHandle,e.concat(n))};function Ln({sourceX:t,sourceY:e,targetX:i,targetY:s}){const[n,r,o,a]=ye({sourceX:t,sourceY:e,targetX:i,targetY:s});return[`M ${t},${e}L ${i},${s}`,n,r,o,a]}const Ut={[z.Left]:{x:-1,y:0},[z.Right]:{x:1,y:0},[z.Top]:{x:0,y:-1},[z.Bottom]:{x:0,y:1}},Ge=({source:t,sourcePosition:e=z.Bottom,target:i})=>e===z.Left||e===z.Right?t.x<i.x?{x:1,y:0}:{x:-1,y:0}:t.y<i.y?{x:0,y:1}:{x:0,y:-1},jt=(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function Se({source:t,sourcePosition:e=z.Bottom,target:i,targetPosition:s=z.Top,center:n,offset:r,stepPosition:o}){const a=Ut[e],c=Ut[s],l={x:t.x+a.x*r,y:t.y+a.y*r},u={x:i.x+c.x*r,y:i.y+c.y*r},h=Ge({source:l,sourcePosition:e,target:u}),f=h.x!==0?"x":"y",y=h[f];let d=[],p,b;const M={x:0,y:0},I={x:0,y:0},[,,g,T]=ye({sourceX:t.x,sourceY:t.y,targetX:i.x,targetY:i.y});if(a[f]*c[f]===-1){f==="x"?(p=n.x??l.x+(u.x-l.x)*o,b=n.y??(l.y+u.y)/2):(p=n.x??(l.x+u.x)/2,b=n.y??l.y+(u.y-l.y)*o);const H=[{x:p,y:l.y},{x:p,y:u.y}],E=[{x:l.x,y:b},{x:u.x,y:b}];a[f]===y?d=f==="x"?H:E:d=f==="x"?E:H}else{const H=[{x:l.x,y:u.y}],E=[{x:u.x,y:l.y}];if(f==="x"?d=a.x===y?E:H:d=a.y===y?H:E,e===s){const x=Math.abs(t[f]-i[f]);if(x<=r){const m=Math.min(r-1,r-x);a[f]===y?M[f]=(l[f]>t[f]?-1:1)*m:I[f]=(u[f]>i[f]?-1:1)*m}}if(e!==s){const x=f==="x"?"y":"x",m=a[f]===c[x],Y=l[x]>u[x],P=l[x]<u[x];(a[f]===1&&(!m&&Y||m&&P)||a[f]!==1&&(!m&&P||m&&Y))&&(d=f==="x"?H:E)}const L={x:l.x+M.x,y:l.y+M.y},D={x:u.x+I.x,y:u.y+I.y},$=Math.max(Math.abs(L.x-d[0].x),Math.abs(D.x-d[0].x)),w=Math.max(Math.abs(L.y-d[0].y),Math.abs(D.y-d[0].y));$>=w?(p=(L.x+D.x)/2,b=d[0].y):(p=d[0].x,b=(L.y+D.y)/2)}const X={x:l.x+M.x,y:l.y+M.y},C={x:u.x+I.x,y:u.y+I.y};return[[t,...X.x!==d[0].x||X.y!==d[0].y?[X]:[],...d,...C.x!==d[d.length-1].x||C.y!==d[d.length-1].y?[C]:[],i],p,b,g,T]}function qe(t,e,i,s){const n=Math.min(jt(t,e)/2,jt(e,i)/2,s),{x:r,y:o}=e;if(t.x===r&&r===i.x||t.y===o&&o===i.y)return`L${r} ${o}`;if(t.y===o){const l=t.x<i.x?-1:1,u=t.y<i.y?1:-1;return`L ${r+n*l},${o}Q ${r},${o} ${r},${o+n*u}`}const a=t.x<i.x?1:-1,c=t.y<i.y?-1:1;return`L ${r},${o+n*c}Q ${r},${o} ${r+n*a},${o}`}function Rn({sourceX:t,sourceY:e,sourcePosition:i=z.Bottom,targetX:s,targetY:n,targetPosition:r=z.Top,borderRadius:o=5,centerX:a,centerY:c,offset:l=20,stepPosition:u=.5}){const[h,f,y,d,p]=Se({source:{x:t,y:e},sourcePosition:i,target:{x:s,y:n},targetPosition:r,center:{x:a,y:c},offset:l,stepPosition:u});let b=`M${h[0].x} ${h[0].y}`;for(let M=1;M<h.length-1;M++)b+=qe(h[M-1],h[M],h[M+1],o);return b+=`L${h[h.length-1].x} ${h[h.length-1].y}`,[b,f,y,d,p]}function Kt(t){var e;return t&&!!(t.internals.handleBounds||(e=t.handles)!=null&&e.length)&&!!(t.measured.width||t.width||t.initialWidth)}function Fn(t){var h;const{sourceNode:e,targetNode:i}=t;if(!Kt(e)||!Kt(i))return null;const s=e.internals.handleBounds||Qt(e.handles),n=i.internals.handleBounds||Qt(i.handles),r=Jt((s==null?void 0:s.source)??[],t.sourceHandle),o=Jt(t.connectionMode===mt.Strict?(n==null?void 0:n.target)??[]:((n==null?void 0:n.target)??[]).concat((n==null?void 0:n.source)??[]),t.targetHandle);if(!r||!o)return(h=t.onError)==null||h.call(t,"008",pt.error008(r?"target":"source",{id:t.id,sourceHandle:t.sourceHandle,targetHandle:t.targetHandle})),null;const a=(r==null?void 0:r.position)||z.Bottom,c=(o==null?void 0:o.position)||z.Top,l=ft(e,r,a),u=ft(i,o,c);return{sourceX:l.x,sourceY:l.y,targetX:u.x,targetY:u.y,sourcePosition:a,targetPosition:c}}function Qt(t){if(!t)return null;const e=[],i=[];for(const s of t)s.width=s.width??1,s.height=s.height??1,s.type==="source"?e.push(s):s.type==="target"&&i.push(s);return{source:e,target:i}}function ft(t,e,i=z.Left,s=!1){const n=((e==null?void 0:e.x)??0)+t.internals.positionAbsolute.x,r=((e==null?void 0:e.y)??0)+t.internals.positionAbsolute.y,{width:o,height:a}=e??st(t);if(s)return{x:n+o/2,y:r+a/2};switch((e==null?void 0:e.position)??i){case z.Top:return{x:n+o/2,y:r};case z.Right:return{x:n+o,y:r+a/2};case z.Bottom:return{x:n+o/2,y:r+a};case z.Left:return{x:n,y:r+a/2}}}function Jt(t,e){return t&&(e?t.find(i=>i.id===e):t[0])||null}function ke(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(s=>`${s}=${t[s]}`).join("&")}`:""}function Gn(t,{id:e,defaultColor:i,defaultMarkerStart:s,defaultMarkerEnd:n}){const r=new Set;return t.reduce((o,a)=>([a.markerStart||s,a.markerEnd||n].forEach(c=>{if(c&&typeof c=="object"){const l=ke(c,e);r.has(l)||(o.push({id:l,color:c.color||i,...c}),r.add(l))}}),o),[]).sort((o,a)=>o.id.localeCompare(a.id))}const xe=1e3,Ue=10,Xt={nodeOrigin:[0,0],nodeExtent:ve,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},je={...Xt,checkEquality:!0};function Dt(t,e){const i={...t};for(const s in e)e[s]!==void 0&&(i[s]=e[s]);return i}function Sn(t,e,i){const s=Dt(Xt,i);for(const n of t.values())if(n.parentId)Ot(n,t,e,s);else{const r=yt(n,s.nodeOrigin),o=at(n.extent)?n.extent:s.nodeExtent,a=rt(r,o,st(n));n.internals.positionAbsolute=a}}function Ke(t,e){if(!t.handles)return t.measured?e==null?void 0:e.internals.handleBounds:void 0;const i=[],s=[];for(const n of t.handles){const r={id:n.id,width:n.width??1,height:n.height??1,nodeId:t.id,x:n.x,y:n.y,position:n.position,type:n.type};n.type==="source"?i.push(r):n.type==="target"&&s.push(r)}return{source:i,target:s}}function Vt(t){return t==="manual"}function qn(t,e,i,s={}){var u,h;const n=Dt(je,s),r={i:0},o=new Map(e),a=n!=null&&n.elevateNodesOnSelect&&!Vt(n.zIndexMode)?xe:0;let c=t.length>0,l=!1;e.clear(),i.clear();for(const f of t){let y=o.get(f.id);if(n.checkEquality&&f===(y==null?void 0:y.internals.userNode))e.set(f.id,y);else{const d=yt(f,n.nodeOrigin),p=at(f.extent)?f.extent:n.nodeExtent,b=rt(d,p,st(f));y={...n.defaults,...f,measured:{width:(u=f.measured)==null?void 0:u.width,height:(h=f.measured)==null?void 0:h.height},internals:{positionAbsolute:b,handleBounds:Ke(f,y),z:ge(f,a,n.zIndexMode),userNode:f}},e.set(f.id,y)}(y.measured===void 0||y.measured.width===void 0||y.measured.height===void 0)&&!y.hidden&&(c=!1),f.parentId&&Ot(y,e,i,s,r),l||(l=f.selected??!1)}return{nodesInitialized:c,hasSelectedNodes:l}}function Qe(t,e){if(!t.parentId)return;const i=e.get(t.parentId);i?i.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function Ot(t,e,i,s,n){const{elevateNodesOnSelect:r,nodeOrigin:o,nodeExtent:a,zIndexMode:c}=Dt(Xt,s),l=t.parentId,u=e.get(l);if(!u){console.warn(`Parent node ${l} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Qe(t,i),n&&!u.parentId&&u.internals.rootParentIndex===void 0&&c==="auto"&&(u.internals.rootParentIndex=++n.i,u.internals.z=u.internals.z+n.i*Ue),n&&u.internals.rootParentIndex!==void 0&&(n.i=u.internals.rootParentIndex);const h=r&&!Vt(c)?xe:0,{x:f,y,z:d}=Je(t,u,o,a,h,c),{positionAbsolute:p}=t.internals,b=f!==p.x||y!==p.y;(b||d!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:b?{x:f,y}:p,z:d}})}function ge(t,e,i){const s=ot(t.zIndex)?t.zIndex:0;return Vt(i)?s:s+(t.selected?e:0)}function Je(t,e,i,s,n,r){const{x:o,y:a}=e.internals.positionAbsolute,c=st(t),l=yt(t,i),u=at(t.extent)?rt(l,t.extent,c):l;let h=rt({x:o+u.x,y:a+u.y},s,c);t.extent==="parent"&&(h=ce(h,c,e));const f=ge(t,n,r),y=e.internals.z??0;return{x:h.x,y:h.y,z:y>=f?y+1:f}}function Ze(t,e,i,s=[0,0]){var o;const n=[],r=new Map;for(const a of t){const c=e.get(a.parentId);if(!c)continue;const l=((o=r.get(a.parentId))==null?void 0:o.expandedRect)??Yt(c),u=ze(l,a.rect);r.set(a.parentId,{expandedRect:u,parent:c})}return r.size>0&&r.forEach(({expandedRect:a,parent:c},l)=>{var g;const u=c.internals.positionAbsolute,h=st(c),f=c.origin??s,y=a.x<u.x?Math.round(Math.abs(u.x-a.x)):0,d=a.y<u.y?Math.round(Math.abs(u.y-a.y)):0,p=Math.max(h.width,Math.round(a.width)),b=Math.max(h.height,Math.round(a.height)),M=(p-h.width)*f[0],I=(b-h.height)*f[1];(y>0||d>0||M||I)&&(n.push({id:l,type:"position",position:{x:c.position.x-y+M,y:c.position.y-d+I}}),(g=i.get(l))==null||g.forEach(T=>{t.some(X=>X.id===T.id)||n.push({id:T.id,type:"position",position:{x:T.position.x+y,y:T.position.y+d}})})),(h.width<a.width||h.height<a.height||y||d)&&n.push({id:l,type:"dimensions",setAttributes:!0,dimensions:{width:p+(y?f[0]*y-M:0),height:b+(d?f[1]*d-I:0)}})}),n}function kn(t,e,i,s,n,r,o){const a=s==null?void 0:s.querySelector(".xyflow__viewport");let c=!1;if(!a)return{changes:[],updatedInternals:c};const l=[],u=window.getComputedStyle(a),{m22:h}=new window.DOMMatrixReadOnly(u.transform),f=[];for(const y of t.values()){const d=e.get(y.id);if(!d)continue;if(d.hidden){e.set(d.id,{...d,internals:{...d.internals,handleBounds:void 0}}),c=!0;continue}const p=he(y.nodeElement),b=d.measured.width!==p.width||d.measured.height!==p.height;if(!!(p.width&&p.height&&(b||!d.internals.handleBounds||y.force))){const I=y.nodeElement.getBoundingClientRect(),g=at(d.extent)?d.extent:r;let{positionAbsolute:T}=d.internals;if(d.parentId&&d.extent==="parent"){const C=e.get(d.parentId);C&&(T=ce(T,p,C))}else g&&(T=rt(T,g,p));const X={...d,measured:p,internals:{...d.internals,positionAbsolute:T,handleBounds:{source:qt("source",y.nodeElement,I,h,d.id),target:qt("target",y.nodeElement,I,h,d.id)}}};e.set(d.id,X),d.parentId&&Ot(X,e,i,{nodeOrigin:n,zIndexMode:o}),c=!0,b&&(l.push({id:d.id,type:"dimensions",dimensions:p}),d.expandParent&&d.parentId&&f.push({id:d.id,parentId:d.parentId,rect:Yt(X,n)}))}}if(f.length>0){const y=Ze(f,e,i,n);l.push(...y)}return{changes:l,updatedInternals:c}}async function Un({delta:t,panZoom:e,transform:i,translateExtent:s,width:n,height:r}){if(!e||!t.x&&!t.y)return!1;const o=await e.setViewportConstrained({x:i[0]+t.x,y:i[1]+t.y,zoom:i[2]},[[0,0],[n,r]],s);return!!o&&(o.x!==i[0]||o.y!==i[1]||o.k!==i[2])}function Zt(t,e,i,s,n,r){let o=n;const a=s.get(o)||new Map;s.set(o,a.set(i,e)),o=`${n}-${t}`;const c=s.get(o)||new Map;if(s.set(o,c.set(i,e)),r){o=`${n}-${t}-${r}`;const l=s.get(o)||new Map;s.set(o,l.set(i,e))}}function jn(t,e,i){t.clear(),e.clear();for(const s of i){const{source:n,target:r,sourceHandle:o=null,targetHandle:a=null}=s,c={edgeId:s.id,source:n,target:r,sourceHandle:o,targetHandle:a},l=`${n}-${o}--${r}-${a}`,u=`${r}-${a}--${n}-${o}`;Zt("source",c,u,t,n,o),Zt("target",c,l,t,r,a),e.set(s.id,s)}}function pe(t,e){if(!t.parentId)return!1;const i=e.get(t.parentId);return i?i.selected?!0:pe(i,e):!1}function te(t,e,i){var n;let s=t;do{if((n=s==null?void 0:s.matches)!=null&&n.call(s,e))return!0;if(s===i)return!1;s=s==null?void 0:s.parentElement}while(s);return!1}function tn(t,e,i,s){const n=new Map;for(const[r,o]of t)if((o.selected||o.id===s)&&(!o.parentId||!pe(o,t))&&(o.draggable||e&&typeof o.draggable>"u")){const a=t.get(r);a&&n.set(r,{id:r,position:a.position||{x:0,y:0},distance:{x:i.x-a.internals.positionAbsolute.x,y:i.y-a.internals.positionAbsolute.y},extent:a.extent,parentId:a.parentId,origin:a.origin,expandParent:a.expandParent,internals:{positionAbsolute:a.internals.positionAbsolute||{x:0,y:0}},measured:{width:a.measured.width??0,height:a.measured.height??0}})}return n}function At({nodeId:t,dragItems:e,nodeLookup:i,dragging:s=!0}){var o,a,c;const n=[];for(const[l,u]of e){const h=(o=i.get(l))==null?void 0:o.internals.userNode;h&&n.push({...h,position:u.position,dragging:s})}if(!t)return[n[0],n];const r=(a=i.get(t))==null?void 0:a.internals.userNode;return[r?{...r,position:((c=e.get(t))==null?void 0:c.position)||r.position,dragging:s}:n[0],n]}function en({dragItems:t,snapGrid:e,x:i,y:s}){const n=t.values().next().value;if(!n)return null;const r={x:i-n.distance.x,y:s-n.distance.y},o=Ht(r,e);return{x:o.x-r.x,y:o.y-r.y}}function Kn({onNodeMouseDown:t,getStoreItems:e,onDragStart:i,onDrag:s,onDragStop:n}){let r={x:null,y:null},o=0,a=new Map,c=!1,l={x:0,y:0},u=null,h=!1,f=null,y=!1,d=!1,p=null;function b({noDragClassName:I,handleSelector:g,domNode:T,isSelectable:X,nodeId:C,nodeClickDistance:A=0}){f=Mt(T);function H({x:$,y:w}){const{nodeLookup:x,nodeExtent:m,snapGrid:Y,snapToGrid:P,nodeOrigin:N,onNodeDrag:v,onSelectionDrag:O,onError:V,updateNodePositions:B}=e();r={x:$,y:w};let F=!1;const R=a.size>1,k=R&&m?Nt(ae(a)):null,j=R&&P?en({dragItems:a,snapGrid:Y,x:$,y:w}):null;for(const[S,W]of a){if(!x.has(S))continue;let q={x:$-W.distance.x,y:w-W.distance.y};P&&(q=j?{x:Math.round(q.x+j.x),y:Math.round(q.y+j.y)}:Ht(q,Y));let U=null;if(R&&m&&!W.extent&&k){const{positionAbsolute:_}=W.internals,Z=_.x-k.x+m[0][0],J=_.x+W.measured.width-k.x2+m[1][0],K=_.y-k.y+m[0][1],et=_.y+W.measured.height-k.y2+m[1][1];U=[[Z,K],[J,et]]}const{position:G,positionAbsolute:Q}=Ye({nodeId:S,nextPosition:q,nodeLookup:x,nodeExtent:U||m,nodeOrigin:N,onError:V});F=F||W.position.x!==G.x||W.position.y!==G.y,W.position=G,W.internals.positionAbsolute=Q}if(d=d||F,!!F&&(B(a,!0),p&&(s||v||!C&&O))){const[S,W]=At({nodeId:C,dragItems:a,nodeLookup:x});s==null||s(p,a,S,W),v==null||v(p,S,W),C||O==null||O(p,W)}}async function E(){if(!u)return;const{transform:$,panBy:w,autoPanSpeed:x,autoPanOnNodeDrag:m}=e();if(!m){c=!1,cancelAnimationFrame(o);return}const[Y,P]=le(l,u,x);(Y!==0||P!==0)&&(r.x=(r.x??0)-Y/$[2],r.y=(r.y??0)-P/$[2],await w({x:Y,y:P})&&H(r)),o=requestAnimationFrame(E)}function L($){var R;const{nodeLookup:w,multiSelectionActive:x,nodesDraggable:m,transform:Y,snapGrid:P,snapToGrid:N,selectNodesOnDrag:v,onNodeDragStart:O,onSelectionDragStart:V,unselectNodesAndEdges:B}=e();h=!0,(!v||!X)&&!x&&C&&((R=w.get(C))!=null&&R.selected||B()),X&&v&&C&&(t==null||t(C));const F=ht($.sourceEvent,{transform:Y,snapGrid:P,snapToGrid:N,containerBounds:u});if(r=F,a=tn(w,m,F,C),a.size>0&&(i||O||!C&&V)){const[k,j]=At({nodeId:C,dragItems:a,nodeLookup:w});i==null||i($.sourceEvent,a,k,j),O==null||O($.sourceEvent,k,j),C||V==null||V($.sourceEvent,j)}}const D=re().clickDistance(A).on("start",$=>{const{domNode:w,nodeDragThreshold:x,transform:m,snapGrid:Y,snapToGrid:P}=e();u=(w==null?void 0:w.getBoundingClientRect())||null,y=!1,d=!1,p=$.sourceEvent,x===0&&L($),r=ht($.sourceEvent,{transform:m,snapGrid:Y,snapToGrid:P,containerBounds:u}),l=tt($.sourceEvent,u)}).on("drag",$=>{const{autoPanOnNodeDrag:w,transform:x,snapGrid:m,snapToGrid:Y,nodeDragThreshold:P,nodeLookup:N}=e(),v=ht($.sourceEvent,{transform:x,snapGrid:m,snapToGrid:Y,containerBounds:u});if(p=$.sourceEvent,($.sourceEvent.type==="touchmove"&&$.sourceEvent.touches.length>1||C&&!N.has(C))&&(y=!0),!y){if(!c&&w&&h&&(c=!0,E()),!h){const O=tt($.sourceEvent,u),V=O.x-l.x,B=O.y-l.y;Math.sqrt(V*V+B*B)>P&&L($)}(r.x!==v.xSnapped||r.y!==v.ySnapped)&&a&&h&&(l=tt($.sourceEvent,u),H(v))}}).on("end",$=>{if(!h||y){y&&a.size>0&&e().updateNodePositions(a,!1);return}if(c=!1,h=!1,cancelAnimationFrame(o),a.size>0){const{nodeLookup:w,updateNodePositions:x,onNodeDragStop:m,onSelectionDragStop:Y}=e();if(d&&(x(a,!1),d=!1),n||m||!C&&Y){const[P,N]=At({nodeId:C,dragItems:a,nodeLookup:w,dragging:!1});n==null||n($.sourceEvent,a,P,N),m==null||m($.sourceEvent,P,N),C||Y==null||Y($.sourceEvent,N)}}}).filter($=>{const w=$.target;return!$.button&&(!I||!te(w,`.${I}`,T))&&(!g||te(w,g,T))});f.call(D)}function M(){f==null||f.on(".drag",null)}return{update:b,destroy:M}}function nn(t,e,i){const s=[],n={x:t.x-i,y:t.y-i,width:i*2,height:i*2};for(const r of e.values())fe(n,Yt(r))>0&&s.push(r);return s}const sn=250;function on(t,e,i,s){var a,c;let n=[],r=1/0;const o=nn(t,i,e+sn);for(const l of o){const u=[...((a=l.internals.handleBounds)==null?void 0:a.source)??[],...((c=l.internals.handleBounds)==null?void 0:c.target)??[]];for(const h of u){if(s.nodeId===h.nodeId&&s.type===h.type&&s.id===h.id)continue;const{x:f,y}=ft(l,h,h.position,!0),d=Math.sqrt(Math.pow(f-t.x,2)+Math.pow(y-t.y,2));d>e||(d<r?(n=[{...h,x:f,y}],r=d):d===r&&n.push({...h,x:f,y}))}}if(!n.length)return null;if(n.length>1){const l=s.type==="source"?"target":"source";return n.find(u=>u.type===l)??n[0]}return n[0]}function me(t,e,i,s,n,r=!1){var l,u,h;const o=s.get(t);if(!o)return null;const a=n==="strict"?(l=o.internals.handleBounds)==null?void 0:l[e]:[...((u=o.internals.handleBounds)==null?void 0:u.source)??[],...((h=o.internals.handleBounds)==null?void 0:h.target)??[]],c=(i?a==null?void 0:a.find(f=>f.id===i):a==null?void 0:a[0])??null;return c&&r?{...c,...ft(o,c,c.position,!0)}:c}function we(t,e){return t||(e!=null&&e.classList.contains("target")?"target":e!=null&&e.classList.contains("source")?"source":null)}function rn(t,e){let i=null;return e?i=!0:t&&!e&&(i=!1),i}const Me=()=>!0;function an(t,{connectionMode:e,connectionRadius:i,handleId:s,nodeId:n,edgeUpdaterType:r,isTarget:o,domNode:a,nodeLookup:c,lib:l,autoPanOnConnect:u,flowId:h,panBy:f,cancelConnection:y,onConnectStart:d,onConnect:p,onConnectEnd:b,isValidConnection:M=Me,onReconnectEnd:I,updateConnection:g,getTransform:T,getFromHandle:X,autoPanSpeed:C,dragThreshold:A=1,handleDomNode:H}){const E=Oe(t.target);let L=0,D;const{x:$,y:w}=tt(t),x=we(r,H),m=a==null?void 0:a.getBoundingClientRect();let Y=!1;if(!m||!x)return;const P=me(n,x,s,c,e);if(!P)return;let N=tt(t,m),v=!1,O=null,V=!1,B=null;function F(){if(!u||!m)return;const[G,Q]=le(N,m,C);f({x:G,y:Q}),L=requestAnimationFrame(F)}const R={...P,nodeId:n,type:x,position:P.position},k=c.get(n);let S={inProgress:!0,isValid:null,from:ft(k,R,z.Left,!0),fromHandle:R,fromPosition:R.position,fromNode:k,to:N,toHandle:null,toPosition:Gt[R.position],toNode:null,pointer:N};function W(){Y=!0,g(S),d==null||d(t,{nodeId:n,handleId:s,handleType:x})}A===0&&W();function q(G){if(!Y){const{x:et,y:$e}=tt(G),Wt=et-$,_t=$e-w;if(!(Wt*Wt+_t*_t>A*A))return;W()}if(!X()||!R){U(G);return}const Q=T();N=tt(G,m),D=on(de(N,Q,!1,[1,1]),i,c,R),v||(F(),v=!0);const _=be(G,{handle:D,connectionMode:e,fromNodeId:n,fromHandleId:s,fromType:o?"target":"source",isValidConnection:M,doc:E,lib:l,flowId:h,nodeLookup:c});B=_.handleDomNode,O=_.connection,V=rn(!!D,_.isValid);const Z=c.get(n),J=Z?ft(Z,R,z.Left,!0):S.from,K={...S,from:J,isValid:V,to:_.toHandle&&V?Pt({x:_.toHandle.x,y:_.toHandle.y},Q):N,toHandle:_.toHandle,toPosition:V&&_.toHandle?_.toHandle.position:Gt[R.position],toNode:_.toHandle?c.get(_.toHandle.nodeId):null,pointer:N};g(K),S=K}function U(G){if(!("touches"in G&&G.touches.length>0)){if(Y){(D||B)&&O&&V&&(p==null||p(O));const{inProgress:Q,..._}=S,Z={..._,toPosition:S.toHandle?S.toPosition:null};b==null||b(G,Z),r&&(I==null||I(G,Z))}y(),cancelAnimationFrame(L),v=!1,V=!1,O=null,B=null,E.removeEventListener("mousemove",q),E.removeEventListener("mouseup",U),E.removeEventListener("touchmove",q),E.removeEventListener("touchend",U)}}E.addEventListener("mousemove",q),E.addEventListener("mouseup",U),E.addEventListener("touchmove",q),E.addEventListener("touchend",U)}function be(t,{handle:e,connectionMode:i,fromNodeId:s,fromHandleId:n,fromType:r,doc:o,lib:a,flowId:c,isValidConnection:l=Me,nodeLookup:u}){const h=r==="target",f=e?o.querySelector(`.${a}-flow__handle[data-id="${c}-${e==null?void 0:e.nodeId}-${e==null?void 0:e.id}-${e==null?void 0:e.type}"]`):null,{x:y,y:d}=tt(t),p=o.elementFromPoint(y,d),b=p!=null&&p.classList.contains(`${a}-flow__handle`)?p:f,M={handleDomNode:b,isValid:!1,connection:null,toHandle:null};if(b){const I=we(void 0,b),g=b.getAttribute("data-nodeid"),T=b.getAttribute("data-handleid"),X=b.classList.contains("connectable"),C=b.classList.contains("connectableend");if(!g||!I)return M;const A={source:h?g:s,sourceHandle:h?T:n,target:h?s:g,targetHandle:h?n:T};M.connection=A;const E=X&&C&&(i===mt.Strict?h&&I==="source"||!h&&I==="target":g!==s||T!==n);M.isValid=E&&l(A),M.toHandle=me(g,I,T,u,i,!0)}return M}const Qn={onPointerDown:an,isValid:be};function Jn({domNode:t,panZoom:e,getTransform:i,getViewScale:s}){const n=Mt(t);function r({translateExtent:a,width:c,height:l,zoomStep:u=1,pannable:h=!0,zoomable:f=!0,inversePan:y=!1}){const d=g=>{if(g.sourceEvent.type!=="wheel"||!e)return;const T=i(),X=g.sourceEvent.ctrlKey&&zt()?10:1,C=-g.sourceEvent.deltaY*(g.sourceEvent.deltaMode===1?.05:g.sourceEvent.deltaMode?1:.002)*u,A=T[2]*Math.pow(2,C*X);e.scaleTo(A)};let p=[0,0];const b=g=>{(g.sourceEvent.type==="mousedown"||g.sourceEvent.type==="touchstart")&&(p=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY])},M=g=>{const T=i();if(g.sourceEvent.type!=="mousemove"&&g.sourceEvent.type!=="touchmove"||!e)return;const X=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY],C=[X[0]-p[0],X[1]-p[1]];p=X;const A=s()*Math.max(T[2],Math.log(T[2]))*(y?-1:1),H={x:T[0]-C[0]*A,y:T[1]-C[1]*A},E=[[0,0],[c,l]];e.setViewportConstrained({x:H.x,y:H.y,zoom:T[2]},E,a)},I=oe().on("start",b).on("zoom",h?M:null).on("zoom.wheel",f?d:null);n.call(I,{})}function o(){n.on("zoom",null)}return{update:r,destroy:o,pointer:se}}const Tt=t=>({x:t.x,y:t.y,zoom:t.k}),vt=({x:t,y:e,zoom:i})=>Ce.translate(t,e).scale(i),lt=(t,e)=>t.target.closest(`.${e}`),Ee=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),cn=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,It=(t,e=0,i=cn,s=()=>{})=>{const n=typeof e=="number"&&e>0;return n||s(),n?t.transition().duration(e).ease(i).on("end",s):t},He=t=>{const e=t.ctrlKey&&zt()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function ln({zoomPanValues:t,noWheelClassName:e,d3Selection:i,d3Zoom:s,panOnScrollMode:n,panOnScrollSpeed:r,zoomOnPinch:o,onPanZoomStart:a,onPanZoom:c,onPanZoomEnd:l}){return u=>{if(lt(u,e))return u.ctrlKey&&u.preventDefault(),!1;u.preventDefault(),u.stopImmediatePropagation();const h=i.property("__zoom").k||1;if(u.ctrlKey&&o){const b=se(u),M=He(u),I=h*Math.pow(2,M);s.scaleTo(i,I,b,u);return}const f=u.deltaMode===1?20:1;let y=n===dt.Vertical?0:u.deltaX*f,d=n===dt.Horizontal?0:u.deltaY*f;!zt()&&u.shiftKey&&n!==dt.Vertical&&(y=u.deltaY*f,d=0),s.translateBy(i,-(y/h)*r,-(d/h)*r,{internal:!0});const p=Tt(i.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?c==null||c(u,p):(t.isPanScrolling=!0,a==null||a(u,p)),t.panScrollTimeout=setTimeout(()=>{l==null||l(u,p),t.isPanScrolling=!1},150)}}function un({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:i}){return function(s,n){const r=s.type==="wheel",o=!e&&r&&!s.ctrlKey,a=lt(s,t);if(s.ctrlKey&&r&&a&&s.preventDefault(),o||a)return null;s.preventDefault(),i.call(this,s,n)}}function fn({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:i}){return s=>{var r,o,a;if((r=s.sourceEvent)!=null&&r.internal)return;const n=Tt(s.transform);t.mouseButton=((o=s.sourceEvent)==null?void 0:o.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=n,((a=s.sourceEvent)==null?void 0:a.type)==="mousedown"&&e(!0),i&&(i==null||i(s.sourceEvent,n))}}function dn({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:i,onTransformChange:s,onPanZoom:n}){return r=>{var o,a;t.usedRightMouseButton=!!(i&&Ee(e,t.mouseButton??0)),(o=r.sourceEvent)!=null&&o.sync||s([r.transform.x,r.transform.y,r.transform.k]),n&&!((a=r.sourceEvent)!=null&&a.internal)&&(n==null||n(r.sourceEvent,Tt(r.transform)))}}function hn({zoomPanValues:t,panOnDrag:e,panOnScroll:i,onDraggingChange:s,onPanZoomEnd:n,onPaneContextMenu:r}){return o=>{var a;if(!((a=o.sourceEvent)!=null&&a.internal)&&(t.isZoomingOrPanning=!1,r&&Ee(e,t.mouseButton??0)&&!t.usedRightMouseButton&&o.sourceEvent&&r(o.sourceEvent),t.usedRightMouseButton=!1,s(!1),n)){const c=Tt(o.transform);t.prevViewport=c,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{n==null||n(o.sourceEvent,c)},i?150:0)}}}function yn({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:i,panOnDrag:s,panOnScroll:n,zoomOnDoubleClick:r,userSelectionActive:o,noWheelClassName:a,noPanClassName:c,lib:l,connectionInProgress:u}){return h=>{var b;const f=t||e,y=i&&h.ctrlKey,d=h.type==="wheel";if(h.button===1&&h.type==="mousedown"&&(lt(h,`${l}-flow__node`)||lt(h,`${l}-flow__edge`)))return!0;if(!s&&!f&&!n&&!r&&!i||o||u&&!d||lt(h,a)&&d||lt(h,c)&&(!d||n&&d&&!t)||!i&&h.ctrlKey&&d)return!1;if(!i&&h.type==="touchstart"&&((b=h.touches)==null?void 0:b.length)>1)return h.preventDefault(),!1;if(!f&&!n&&!y&&d||!s&&(h.type==="mousedown"||h.type==="touchstart")||Array.isArray(s)&&!s.includes(h.button)&&h.type==="mousedown")return!1;const p=Array.isArray(s)&&s.includes(h.button)||!h.button||h.button<=1;return(!h.ctrlKey||d)&&p}}function Zn({domNode:t,minZoom:e,maxZoom:i,translateExtent:s,viewport:n,onPanZoom:r,onPanZoomStart:o,onPanZoomEnd:a,onDraggingChange:c}){const l={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},u=t.getBoundingClientRect();let h=[[0,0],[u.width,u.height]];const f=typeof ResizeObserver<"u"?new ResizeObserver(w=>{const x=w[0];x&&(h=[[0,0],[x.contentRect.width,x.contentRect.height]])}):null;f==null||f.observe(t);const y=oe().extent(()=>h).scaleExtent([e,i]).translateExtent(s),d=Mt(t).call(y);T({x:n.x,y:n.y,zoom:ut(n.zoom,e,i)},[[0,0],[u.width,u.height]],s);const p=d.on("wheel.zoom"),b=d.on("dblclick.zoom");y.wheelDelta(He);async function M(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).transform(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}function I({noWheelClassName:w,noPanClassName:x,onPaneContextMenu:m,userSelectionActive:Y,panOnScroll:P,panOnDrag:N,panOnScrollMode:v,panOnScrollSpeed:O,preventScrolling:V,zoomOnPinch:B,zoomOnScroll:F,zoomOnDoubleClick:R,zoomActivationKeyPressed:k,lib:j,onTransformChange:S,connectionInProgress:W,paneClickDistance:q,selectionOnDrag:U}){Y&&!l.isZoomingOrPanning&&g();const G=P&&!k&&!Y;y.clickDistance(U?1/0:!ot(q)||q<0?0:q);const Q=G?ln({zoomPanValues:l,noWheelClassName:w,d3Selection:d,d3Zoom:y,panOnScrollMode:v,panOnScrollSpeed:O,zoomOnPinch:B,onPanZoomStart:o,onPanZoom:r,onPanZoomEnd:a}):un({noWheelClassName:w,preventScrolling:V,d3ZoomHandler:p});d.on("wheel.zoom",Q,{passive:!1});const _=fn({zoomPanValues:l,onDraggingChange:c,onPanZoomStart:o});y.on("start",_);const Z=dn({zoomPanValues:l,panOnDrag:N,onPaneContextMenu:!!m,onPanZoom:r,onTransformChange:S});y.on("zoom",Z);const J=hn({zoomPanValues:l,panOnDrag:N,panOnScroll:P,onPaneContextMenu:m,onPanZoomEnd:a,onDraggingChange:c});y.on("end",J);const K=yn({zoomActivationKeyPressed:k,panOnDrag:N,zoomOnScroll:F,panOnScroll:P,zoomOnDoubleClick:R,zoomOnPinch:B,userSelectionActive:Y,noPanClassName:x,noWheelClassName:w,lib:j,connectionInProgress:W});y.filter(K),R?d.on("dblclick.zoom",b):d.on("dblclick.zoom",null)}function g(){y.on("zoom",null)}async function T(w,x,m){const Y=vt(w),P=y==null?void 0:y.constrain()(Y,x,m);return P&&await M(P),P}async function X(w,x){const m=vt(w);return await M(m,x),m}function C(w){if(d){const x=vt(w),m=d.property("__zoom");(m.k!==w.zoom||m.x!==w.x||m.y!==w.y)&&(y==null||y.transform(d,x,null,{sync:!0}))}}function A(){const w=d?Ae(d.node()):{x:0,y:0,k:1};return{x:w.x,y:w.y,zoom:w.k}}async function H(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).scaleTo(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}async function E(w,x){return d?new Promise(m=>{y==null||y.interpolate((x==null?void 0:x.interpolate)==="linear"?Ct:$t).scaleBy(It(d,x==null?void 0:x.duration,x==null?void 0:x.ease,()=>m(!0)),w)}):!1}function L(w){y==null||y.scaleExtent(w)}function D(w){y==null||y.translateExtent(w)}function $(w){const x=!ot(w)||w<0?0:w;y==null||y.clickDistance(x)}return{update:I,destroy:g,setViewport:X,setViewportConstrained:T,getViewport:A,scaleTo:H,scaleBy:E,setScaleExtent:L,setTranslateExtent:D,syncViewport:C,setClickDistance:$}}var ee;(function(t){t.Line="line",t.Handle="handle"})(ee||(ee={}));function xn({width:t,prevWidth:e,height:i,prevHeight:s,affectsX:n,affectsY:r}){const o=t-e,a=i-s,c=[o>0?1:o<0?-1:0,a>0?1:a<0?-1:0];return o&&n&&(c[0]=c[0]*-1),a&&r&&(c[1]=c[1]*-1),c}function ne(t){const e=t.includes("right")||t.includes("left"),i=t.includes("bottom")||t.includes("top"),s=t.includes("left"),n=t.includes("top");return{isHorizontal:e,isVertical:i,affectsX:s,affectsY:n}}function nt(t,e){return Math.max(0,e-t)}function it(t,e){return Math.max(0,t-e)}function gt(t,e,i){return Math.max(0,e-t,t-i)}function ie(t,e){return t?!e:e}function gn(t,e,i,s,n,r,o,a){let{affectsX:c,affectsY:l}=e;const{isHorizontal:u,isVertical:h}=e,f=u&&h,{xSnapped:y,ySnapped:d}=i,{minWidth:p,maxWidth:b,minHeight:M,maxHeight:I}=s,{x:g,y:T,width:X,height:C,aspectRatio:A}=t;let H=Math.floor(u?y-t.pointerX:0),E=Math.floor(h?d-t.pointerY:0);const L=X+(c?-H:H),D=C+(l?-E:E),$=-r[0]*X,w=-r[1]*C;let x=gt(L,p,b),m=gt(D,M,I);if(o){let N=0,v=0;c&&H<0?N=nt(g+H+$,o[0][0]):!c&&H>0&&(N=it(g+L+$,o[1][0])),l&&E<0?v=nt(T+E+w,o[0][1]):!l&&E>0&&(v=it(T+D+w,o[1][1])),x=Math.max(x,N),m=Math.max(m,v)}if(a){let N=0,v=0;c&&H>0?N=it(g+H,a[0][0]):!c&&H<0&&(N=nt(g+L,a[1][0])),l&&E>0?v=it(T+E,a[0][1]):!l&&E<0&&(v=nt(T+D,a[1][1])),x=Math.max(x,N),m=Math.max(m,v)}if(n){if(u){const N=gt(L/A,M,I)*A;if(x=Math.max(x,N),o){let v=0;!c&&!l||c&&!l&&f?v=it(T+w+L/A,o[1][1])*A:v=nt(T+w+(c?H:-H)/A,o[0][1])*A,x=Math.max(x,v)}if(a){let v=0;!c&&!l||c&&!l&&f?v=nt(T+L/A,a[1][1])*A:v=it(T+(c?H:-H)/A,a[0][1])*A,x=Math.max(x,v)}}if(h){const N=gt(D*A,p,b)/A;if(m=Math.max(m,N),o){let v=0;!c&&!l||l&&!c&&f?v=it(g+D*A+$,o[1][0])/A:v=nt(g+(l?E:-E)*A+$,o[0][0])/A,m=Math.max(m,v)}if(a){let v=0;!c&&!l||l&&!c&&f?v=nt(g+D*A,a[1][0])/A:v=it(g+(l?E:-E)*A,a[0][0])/A,m=Math.max(m,v)}}}E=E+(E<0?m:-m),H=H+(H<0?x:-x),n&&(f?L>D*A?E=(ie(c,l)?-H:H)/A:H=(ie(c,l)?-E:E)*A:u?(E=H/A,l=c):(H=E*A,c=l));const Y=c?g+H:g,P=l?T+E:T;return{width:X+(c?-H:H),height:C+(l?-E:E),x:r[0]*H*(c?-1:1)+Y,y:r[1]*E*(l?-1:1)+P}}const Te={width:0,height:0,x:0,y:0},pn={...Te,pointerX:0,pointerY:0,aspectRatio:1};function mn(t,e,i){const s=e.position.x+t.position.x,n=e.position.y+t.position.y,r=t.measured.width??0,o=t.measured.height??0,a=i[0]*r,c=i[1]*o;return[[s-a,n-c],[s+r-a,n+o-c]]}function ti({domNode:t,nodeId:e,getStoreItems:i,onChange:s,onEnd:n}){const r=Mt(t);let o={controlDirection:ne("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function a({controlPosition:l,boundaries:u,keepAspectRatio:h,resizeDirection:f,onResizeStart:y,onResize:d,onResizeEnd:p,shouldResize:b}){let M={...Te},I={...pn};o={boundaries:u,resizeDirection:f,keepAspectRatio:h,controlDirection:ne(l)};let g,T=null,X=[],C,A,H,E=!1;const L=re().on("start",D=>{const{nodeLookup:$,transform:w,snapGrid:x,snapToGrid:m,nodeOrigin:Y,paneDomNode:P}=i();if(g=$.get(e),!g)return;T=(P==null?void 0:P.getBoundingClientRect())??null;const{xSnapped:N,ySnapped:v}=ht(D.sourceEvent,{transform:w,snapGrid:x,snapToGrid:m,containerBounds:T});M={width:g.measured.width??0,height:g.measured.height??0,x:g.position.x??0,y:g.position.y??0},I={...M,pointerX:N,pointerY:v,aspectRatio:M.width/M.height},C=void 0,A=at(g.extent)?g.extent:void 0,g.parentId&&(g.extent==="parent"||g.expandParent)&&(C=$.get(g.parentId)),C&&g.extent==="parent"&&(A=[[0,0],[C.measured.width,C.measured.height]]),X=[],H=void 0;for(const[O,V]of $)if(V.parentId===e&&(X.push({id:O,position:{...V.position},extent:V.extent}),V.extent==="parent"||V.expandParent)){const B=mn(V,g,V.origin??Y);H?H=[[Math.min(B[0][0],H[0][0]),Math.min(B[0][1],H[0][1])],[Math.max(B[1][0],H[1][0]),Math.max(B[1][1],H[1][1])]]:H=B}y==null||y(D,{...M})}).on("drag",D=>{const{transform:$,snapGrid:w,snapToGrid:x,nodeOrigin:m}=i(),Y=ht(D.sourceEvent,{transform:$,snapGrid:w,snapToGrid:x,containerBounds:T}),P=[];if(!g)return;const{x:N,y:v,width:O,height:V}=M,B={},F=g.origin??m,{width:R,height:k,x:j,y:S}=gn(I,o.controlDirection,Y,o.boundaries,o.keepAspectRatio,F,A,H),W=R!==O,q=k!==V,U=j!==N&&W,G=S!==v&&q;if(!U&&!G&&!W&&!q)return;if((U||G||F[0]===1||F[1]===1)&&(B.x=U?j:M.x,B.y=G?S:M.y,M.x=B.x,M.y=B.y,X.length>0)){const J=j-N,K=S-v;for(const et of X)et.position={x:et.position.x-J+F[0]*(R-O),y:et.position.y-K+F[1]*(k-V)},P.push(et)}if((W||q)&&(B.width=W&&(!o.resizeDirection||o.resizeDirection==="horizontal")?R:M.width,B.height=q&&(!o.resizeDirection||o.resizeDirection==="vertical")?k:M.height,M.width=B.width,M.height=B.height),C&&g.expandParent){const J=F[0]*(B.width??0);B.x&&B.x<J&&(M.x=J,I.x=I.x-(B.x-J));const K=F[1]*(B.height??0);B.y&&B.y<K&&(M.y=K,I.y=I.y-(B.y-K))}const Q=xn({width:M.width,prevWidth:O,height:M.height,prevHeight:V,affectsX:o.controlDirection.affectsX,affectsY:o.controlDirection.affectsY}),_={...M,direction:Q};(b==null?void 0:b(D,_))!==!1&&(E=!0,d==null||d(D,_),s(B,P))}).on("end",D=>{E&&(p==null||p(D,{...M}),n==null||n({...M}),E=!1)});r.call(L)}function c(){r.on(".drag",null)}return{update:a,destroy:c}}export{he as $,ve as A,dt as B,mt as C,Rt as D,zt as E,ze as F,ae as G,ti as H,Zn as I,Kn as J,Ht as K,Ye as L,Ft as M,Cn as N,Dn as O,z as P,bn as Q,ee as R,Lt as S,ot as T,Ln as U,Wn as V,Hn as W,Jn as X,Xn as Y,tt as Z,Le as _,fe as a,le as a0,Yn as a1,En as a2,Un as a3,qn as a4,ft as a5,Ze as a6,kn as a7,Sn as a8,jn as a9,An as aa,Ie as ab,vn as b,Oe as c,Qn as d,pt as e,_e as f,$n as g,Ve as h,In as i,Bn as j,Tn as k,Ne as l,_n as m,Yt as n,Pn as o,de as p,Nn as q,Pt as r,st as s,Gn as t,Rn as u,Vn as v,zn as w,Fn as x,On as y,ke as z};
|