@av-pi-studio/web-client 0.0.35 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/web/assets/{BinaryFallbackViewer-CtNuXHUk.js → BinaryFallbackViewer-nlzTas33.js} +2 -2
- package/dist/web/assets/{BinaryFallbackViewer-CtNuXHUk.js.map → BinaryFallbackViewer-nlzTas33.js.map} +1 -1
- package/dist/web/assets/{ChatPanel-BxmhC02j.css → ChatPanel-CTnpkb2U.css} +1 -1
- package/dist/web/assets/ChatPanel-D1j9P-aU.js +3 -0
- package/dist/web/assets/ChatPanel-D1j9P-aU.js.map +1 -0
- package/dist/web/assets/{CodeView-DBAtguCy.js → CodeView-DyKgdbhF.js} +2 -2
- package/dist/web/assets/{CodeView-DBAtguCy.js.map → CodeView-DyKgdbhF.js.map} +1 -1
- package/dist/web/assets/{FilePanel-BGAxlnTJ.js → FilePanel-BmlpXwsJ.js} +3 -3
- package/dist/web/assets/{FilePanel-BGAxlnTJ.js.map → FilePanel-BmlpXwsJ.js.map} +1 -1
- package/dist/web/assets/{ImageViewer-CLqpRK4l.js → ImageViewer-CoFUhYpw.js} +2 -2
- package/dist/web/assets/{ImageViewer-CLqpRK4l.js.map → ImageViewer-CoFUhYpw.js.map} +1 -1
- package/dist/web/assets/{MarkdownFileViewer-UJPP7vox.js → MarkdownFileViewer-CR-8mwa9.js} +2 -2
- package/dist/web/assets/{MarkdownFileViewer-UJPP7vox.js.map → MarkdownFileViewer-CR-8mwa9.js.map} +1 -1
- package/dist/web/assets/{TerminalPanel-C9bP_u5_.js → TerminalPanel-DV2Ez7aG.js} +2 -2
- package/dist/web/assets/{TerminalPanel-C9bP_u5_.js.map → TerminalPanel-DV2Ez7aG.js.map} +1 -1
- package/dist/web/assets/{TextViewer-DD2_TH2C.js → TextViewer-BgO--OCH.js} +2 -2
- package/dist/web/assets/{TextViewer-DD2_TH2C.js.map → TextViewer-BgO--OCH.js.map} +1 -1
- package/dist/web/assets/{VideoViewer-D6cldFSO.js → VideoViewer-CIeP-3Qh.js} +2 -2
- package/dist/web/assets/{VideoViewer-D6cldFSO.js.map → VideoViewer-CIeP-3Qh.js.map} +1 -1
- package/dist/web/assets/{index-D_2xgUa4.css → index-BXAEsQz1.css} +1 -1
- package/dist/web/assets/index-CXS9Grd7.js +3 -0
- package/dist/web/assets/index-CXS9Grd7.js.map +1 -0
- package/dist/web/assets/{use-file-download-DRdPYoQk.js → use-file-download-DcvIvDgT.js} +2 -2
- package/dist/web/assets/{use-file-download-DRdPYoQk.js.map → use-file-download-DcvIvDgT.js.map} +1 -1
- package/dist/web/assets/{vendor-icons-BouiMPVM.js → vendor-icons-Bk3OssJx.js} +2 -2
- package/dist/web/assets/{vendor-icons-BouiMPVM.js.map → vendor-icons-Bk3OssJx.js.map} +1 -1
- package/dist/web/index.html +3 -3
- package/package.json +3 -3
- package/dist/web/assets/ChatPanel-DgWlIJic.js +0 -3
- package/dist/web/assets/ChatPanel-DgWlIJic.js.map +0 -1
- package/dist/web/assets/index-CwYwO1IN.js +0 -3
- package/dist/web/assets/index-CwYwO1IN.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerminalPanel-C9bP_u5_.js","sources":["../../../../client/src/terminal-stream-router.ts","../../../src/features/terminal/TerminalPanel.tsx"],"sourcesContent":["import { encodeTerminalFrame, type TerminalFrame } from \"@av-pi-studio/protocol\";\n\nimport type { DaemonClient } from \"./daemon-client.js\";\n\n/**\n * Client-side demux of binary terminal frames to per-slot subscribers, plus outbound input/resize\n * encoding (architecture/client-app-runtime.md § Router; features/terminals.md § Binary stream\n * protocol).\n *\n * Inbound `Output`/`Snapshot`/`Restore` frames are dispatched to the subscriber registered for that\n * `slot`. Outbound `Input`/`Resize` are encoded with the right opcode + slot and sent on the data\n * path.\n */\n\nexport interface TerminalSlotSubscriber {\n /** Live terminal output bytes. */\n onOutput?: (data: Uint8Array) => void;\n /** Full-screen snapshot bytes (sent on (re)subscribe). */\n onSnapshot?: (data: Uint8Array) => void;\n /** Restore snapshot bytes (reflowable/mode-gated). */\n onRestore?: (data: Uint8Array) => void;\n}\n\nexport class TerminalStreamRouter {\n private readonly subscribers = new Map<number, TerminalSlotSubscriber>();\n private detach: (() => void) | null = null;\n\n constructor(private readonly daemon: DaemonClient) {}\n\n /** Begin routing inbound terminal frames. Idempotent. */\n start(): void {\n if (this.detach) return;\n this.detach = this.daemon.onTerminalFrame((frame) => this.dispatch(frame));\n }\n\n /** Stop routing inbound frames (subscribers retained). */\n stop(): void {\n this.detach?.();\n this.detach = null;\n }\n\n /** Register (or replace) the subscriber for a slot. Returns an unsubscribe fn. */\n subscribeSlot(slot: number, subscriber: TerminalSlotSubscriber): () => void {\n this.subscribers.set(slot, subscriber);\n return () => {\n if (this.subscribers.get(slot) === subscriber) this.subscribers.delete(slot);\n };\n }\n\n /** True iff a subscriber is registered for the slot. */\n hasSlot(slot: number): boolean {\n return this.subscribers.has(slot);\n }\n\n // ─── Outbound ─────────────────────────────────────────────────────────────\n\n /** Send raw input bytes to a slot's PTY (opcode `Input = 0x02`). */\n sendInput(slot: number, data: Uint8Array): void {\n this.daemon.sendBinary(encodeTerminalFrame({ opcode: \"Input\", slot, data }));\n }\n\n /** Send a resize (opcode `Resize = 0x03`, JSON `{ rows, cols }` payload). */\n sendResize(slot: number, rows: number, cols: number): void {\n this.daemon.sendBinary(encodeTerminalFrame({ opcode: \"Resize\", slot, rows, cols }));\n }\n\n // ─── Inbound dispatch ───────────────────────────────────────────────────────\n\n private dispatch(frame: TerminalFrame): void {\n const subscriber = this.subscribers.get(frame.slot);\n if (!subscriber) return; // no subscriber for this slot — drop\n switch (frame.opcode) {\n case \"Output\":\n subscriber.onOutput?.(frame.data);\n return;\n case \"Snapshot\":\n subscriber.onSnapshot?.(frame.data);\n return;\n case \"Restore\":\n subscriber.onRestore?.(frame.data);\n return;\n default:\n // Input/Resize are outbound-only; ignore if echoed back.\n return;\n }\n }\n}\n","/**\n * TerminalPanel — @xterm/xterm mount + binary-frame streaming via `TerminalStreamRouter`\n * (POC `initTerminalPanel`, POC_TO_APP_PLAN_UI.md §4.6). Strict upgrade over the POC's 800ms\n * `capture_terminal_request` poll: the daemon pushes `Output`/`Snapshot`/`Restore` binary frames\n * directly over the one shared `DaemonClient` connection, demuxed by slot.\n *\n * Slot lifecycle: created once via `create_terminal_request`, then persisted onto the tab's\n * `TerminalTabData.slot` via `useTabStore.getState().updateData` so switching away and back to\n * this tab (kept mounted-but-hidden by `TabPanelHost`) never recreates the terminal. `TabPanelHost`\n * only unmounts a tab's panel when the tab leaves the store's `tabs[]` (i.e. real tab close, never\n * a tab switch) — this component's true-unmount effect below relies on exactly that invariant to\n * send `kill_terminal_request`, terminating the PTY server-side instead of leaking it forever.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Terminal } from \"@xterm/xterm\";\nimport { FitAddon } from \"@xterm/addon-fit\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport type { DaemonClient } from \"@av-pi-studio/client\";\nimport { TerminalStreamRouter } from \"@av-pi-studio/client\";\nimport { useConnectionStore } from \"@pi-studio-ui/lib/connection/connection-store.js\";\nimport { useTabStore } from \"@pi-studio-ui/stores/tab-store.js\";\nimport type { Tab, TerminalTabData } from \"@pi-studio-ui/stores/tab-store.js\";\nimport { Spinner } from \"@pi-studio-ui/components/primitives/Spinner.js\";\nimport styles from \"./TerminalPanel.module.css\";\n\nexport interface TerminalPanelProps {\n tab: Tab;\n}\n\ninterface CreateTerminalResponse {\n terminal: { slot: number };\n}\n\n// One TerminalStreamRouter per daemon connection — multiple terminal tabs share it rather than\n// each opening its own frame demuxer over the same socket.\nconst routerByDaemon = new WeakMap<DaemonClient, TerminalStreamRouter>();\n\nfunction routerFor(daemon: DaemonClient): TerminalStreamRouter {\n let router = routerByDaemon.get(daemon);\n if (!router) {\n router = new TerminalStreamRouter(daemon);\n router.start();\n routerByDaemon.set(daemon, router);\n }\n return router;\n}\n\n/** Dark palette matching the app's github-dark-ish default theme (theme/variants.ts \"dark\"). */\nconst TERMINAL_THEME = {\n background: \"#181b1a\",\n foreground: \"#fafafa\",\n cursor: \"#a2b4d7\",\n cursorAccent: \"#181b1a\",\n selectionBackground: \"rgba(255,255,255,0.18)\",\n black: \"#18181b\",\n red: \"#ef4444\",\n green: \"#22c55e\",\n yellow: \"#f59e0b\",\n blue: \"#3b82f6\",\n magenta: \"#a855f7\",\n cyan: \"#14b8a6\",\n white: \"#d4d4d8\",\n brightBlack: \"#52525b\",\n brightRed: \"#f87171\",\n brightGreen: \"#4ade80\",\n brightYellow: \"#fbbf24\",\n brightBlue: \"#60a5fa\",\n brightMagenta: \"#c084fc\",\n brightCyan: \"#2dd4bf\",\n brightWhite: \"#fafafa\",\n};\n\nexport function TerminalPanel({ tab }: TerminalPanelProps) {\n const data = tab.data as TerminalTabData;\n const client = useConnectionStore((s) => s.client);\n const activeTabId = useTabStore((s) => s.activeTabId);\n const isActive = activeTabId === tab.id;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const terminalRef = useRef<Terminal | null>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const slotRef = useRef<number | null>(data.slot);\n // Mirrors `use-checkout-status.ts`'s convention: kept in sync every render so the unmount-only\n // kill effect below always sends the CURRENT client, never a stale mount-time closure (e.g.\n // after a reconnect swaps in a new `PiStudioClient` instance).\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const [slot, setSlot] = useState<number | null>(data.slot);\n const [error, setError] = useState<string | null>(null);\n\n // ─── Slot lifecycle: create once, persist onto the tab so re-opening reuses it ─────────────\n // React StrictMode double-invokes effects in dev: mount → cleanup → remount, synchronously,\n // on the SAME component instance (refs/state persist across all three phases — this is not\n // three separate mounts). Two things must hold across that: (1) the request fires exactly\n // once, and (2) whether to APPLY the eventual response is decided by whether the component is\n // mounted at RESPONSE time, not by a flag captured at REQUEST time.\n //\n // `requestStartedRef` gives (1): set the instant the request fires and never reset, so the\n // phantom-mount's cleanup-then-remount sees it's already in flight and never fires a second\n // `create_terminal_request` (this is what previously spawned two real PTYs from one Ctrl+T).\n //\n // `isMountedRef` gives (2): flipped true at the START of every effect invocation and false in\n // every cleanup, so it always reflects the LATEST phase. StrictMode's remount happens\n // synchronously, before the request's promise can possibly settle, so by response time\n // `isMountedRef.current` is back to `true` for a StrictMode phantom (correctly applies the\n // slot) — but stays `false` for a genuine fast real close (correctly kills the orphaned PTY\n // instead of leaking it or, as the previous buggy version did, killing a terminal that was\n // never actually torn down).\n const isMountedRef = useRef(false);\n const requestStartedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n if (!client || slotRef.current !== null || requestStartedRef.current) {\n return () => {\n isMountedRef.current = false;\n };\n }\n requestStartedRef.current = true;\n\n const cwd = data.cwd || \"~\";\n\n void client.connection\n .request<CreateTerminalResponse>(\"create_terminal_request\", { workspaceId: \"\", cwd })\n .then((res) => {\n const created = res.terminal.slot;\n if (!isMountedRef.current) {\n // A real close happened with no remount after it — kill the PTY that finished\n // spawning after the tab was already gone, instead of leaking it.\n void client.connection.request(\"kill_terminal_request\", { slot: created }).catch(() => {});\n return;\n }\n slotRef.current = created;\n setSlot(created);\n useTabStore.getState().updateData(tab.id, { slot: created });\n })\n .catch((err: unknown) => {\n if (!isMountedRef.current) return;\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n // Reset only after the promise settles — by then StrictMode's synchronous\n // mount→cleanup→remount window has long passed, so this can never reopen the\n // double-fire race. It DOES allow a legitimate retry (e.g. `client` changed because of\n // a reconnect after the first attempt failed) instead of leaving the tab stuck forever.\n requestStartedRef.current = false;\n });\n\n return () => {\n isMountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, tab.id]);\n\n // ─── True unmount only: kill the PTY server-side ───────────────────────────────────────────\n // Runs its cleanup exactly once, when this component itself unmounts (real tab close, per\n // `TabPanelHost`'s \"hidden but alive\" model — a tab switch never unmounts). An empty deps array\n // means React never re-runs the effect body itself; only the cleanup fires, and only on\n // unmount, so this never races the slot-creation effect above or double-kills on a client\n // change. Without this, every closed terminal tab leaked its PTY process forever.\n //\n // For a REATTACH (this tab opened with a non-null `data.slot` from the very first render —\n // `use-terminal-restore.ts`, or the create-effect above once it has resolved) `slotRef.current`\n // is non-null from the start, so StrictMode's synchronous mount→cleanup→remount phantom cycle\n // would fire this cleanup and kill the PTY immediately on mount — unlike a freshly created\n // terminal, where `slotRef.current` is still `null` during that same phantom window (see the\n // create-effect's own comment) and so never hits this path. Deferred via `setTimeout`, exactly\n // like the create-effect's response handler: by the time it fires, StrictMode's remount has\n // already flipped `isMountedRef` back to `true` if this was a phantom unmount, so the kill is\n // skipped; a genuine close never remounts, so `isMountedRef` stays `false` and the kill proceeds.\n useEffect(() => {\n return () => {\n const currentSlot = slotRef.current;\n if (currentSlot === null) return;\n setTimeout(() => {\n if (isMountedRef.current) return; // StrictMode remounted synchronously — not a real close\n void clientRef.current?.connection\n .request(\"kill_terminal_request\", { slot: currentSlot })\n .catch(() => {});\n }, 0);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ─── xterm mount (once slot + container are ready) ─────────────────────────────────────────\n useEffect(() => {\n if (!client || slot === null || !containerRef.current) return;\n\n const terminal = new Terminal({\n cursorBlink: true,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: 13,\n scrollback: 5000,\n theme: TERMINAL_THEME,\n allowProposedApi: true,\n });\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n terminal.open(containerRef.current);\n fitAddon.fit();\n\n terminalRef.current = terminal;\n fitAddonRef.current = fitAddon;\n\n const router = routerFor(client.connection);\n const unsubscribeSlot = router.subscribeSlot(slot, {\n onOutput: (chunk) => terminal.write(chunk),\n onSnapshot: (chunk) => {\n terminal.clear();\n terminal.write(chunk);\n },\n onRestore: (chunk) => terminal.write(chunk),\n });\n\n void client.connection.request(\"subscribe_terminal_request\", { slot }).catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n\n const dataDisposable = terminal.onData((chunk) => {\n router.sendInput(slot, new TextEncoder().encode(chunk));\n });\n const resizeDisposable = terminal.onResize(({ cols, rows }) => {\n router.sendResize(slot, rows, cols);\n });\n\n const resizeObserver = new ResizeObserver(() => {\n fitAddon.fit();\n });\n resizeObserver.observe(containerRef.current);\n\n return () => {\n resizeObserver.disconnect();\n dataDisposable.dispose();\n resizeDisposable.dispose();\n unsubscribeSlot();\n void client.connection.request(\"unsubscribe_terminal_request\", { slot }).catch(() => {});\n terminal.dispose();\n terminalRef.current = null;\n fitAddonRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, slot]);\n\n // ─── Re-fit whenever this tab becomes the active (visible) one ────────────────────────────\n useEffect(() => {\n if (!isActive) return;\n fitAddonRef.current?.fit();\n }, [isActive]);\n\n if (error) {\n return (\n <div className={styles.wrap}>\n <div className={styles.status}>Terminal error: {error}</div>\n </div>\n );\n }\n\n if (slot === null) {\n return (\n <div className={styles.wrap}>\n <div className={styles.status}>\n <Spinner size=\"sm\" /> Starting terminal…\n </div>\n </div>\n );\n }\n\n return (\n <div className={styles.wrap}>\n <div ref={containerRef} className={styles.terminal} />\n </div>\n );\n}\n"],"names":["TerminalStreamRouter","daemon","__publicField","frame","_a","slot","subscriber","data","encodeTerminalFrame","rows","cols","_b","_c","routerByDaemon","routerFor","router","TERMINAL_THEME","TerminalPanel","tab","client","useConnectionStore","s","isActive","useTabStore","containerRef","useRef","terminalRef","fitAddonRef","slotRef","clientRef","setSlot","useState","error","setError","isMountedRef","requestStartedRef","useEffect","cwd","res","created","err","currentSlot","terminal","Terminal","fitAddon","FitAddon","unsubscribeSlot","chunk","dataDisposable","resizeDisposable","resizeObserver","jsx","styles","jsxs","Spinner"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TerminalPanel-DV2Ez7aG.js","sources":["../../../../client/src/terminal-stream-router.ts","../../../src/features/terminal/TerminalPanel.tsx"],"sourcesContent":["import { encodeTerminalFrame, type TerminalFrame } from \"@av-pi-studio/protocol\";\n\nimport type { DaemonClient } from \"./daemon-client.js\";\n\n/**\n * Client-side demux of binary terminal frames to per-slot subscribers, plus outbound input/resize\n * encoding (architecture/client-app-runtime.md § Router; features/terminals.md § Binary stream\n * protocol).\n *\n * Inbound `Output`/`Snapshot`/`Restore` frames are dispatched to the subscriber registered for that\n * `slot`. Outbound `Input`/`Resize` are encoded with the right opcode + slot and sent on the data\n * path.\n */\n\nexport interface TerminalSlotSubscriber {\n /** Live terminal output bytes. */\n onOutput?: (data: Uint8Array) => void;\n /** Full-screen snapshot bytes (sent on (re)subscribe). */\n onSnapshot?: (data: Uint8Array) => void;\n /** Restore snapshot bytes (reflowable/mode-gated). */\n onRestore?: (data: Uint8Array) => void;\n}\n\nexport class TerminalStreamRouter {\n private readonly subscribers = new Map<number, TerminalSlotSubscriber>();\n private detach: (() => void) | null = null;\n\n constructor(private readonly daemon: DaemonClient) {}\n\n /** Begin routing inbound terminal frames. Idempotent. */\n start(): void {\n if (this.detach) return;\n this.detach = this.daemon.onTerminalFrame((frame) => this.dispatch(frame));\n }\n\n /** Stop routing inbound frames (subscribers retained). */\n stop(): void {\n this.detach?.();\n this.detach = null;\n }\n\n /** Register (or replace) the subscriber for a slot. Returns an unsubscribe fn. */\n subscribeSlot(slot: number, subscriber: TerminalSlotSubscriber): () => void {\n this.subscribers.set(slot, subscriber);\n return () => {\n if (this.subscribers.get(slot) === subscriber) this.subscribers.delete(slot);\n };\n }\n\n /** True iff a subscriber is registered for the slot. */\n hasSlot(slot: number): boolean {\n return this.subscribers.has(slot);\n }\n\n // ─── Outbound ─────────────────────────────────────────────────────────────\n\n /** Send raw input bytes to a slot's PTY (opcode `Input = 0x02`). */\n sendInput(slot: number, data: Uint8Array): void {\n this.daemon.sendBinary(encodeTerminalFrame({ opcode: \"Input\", slot, data }));\n }\n\n /** Send a resize (opcode `Resize = 0x03`, JSON `{ rows, cols }` payload). */\n sendResize(slot: number, rows: number, cols: number): void {\n this.daemon.sendBinary(encodeTerminalFrame({ opcode: \"Resize\", slot, rows, cols }));\n }\n\n // ─── Inbound dispatch ───────────────────────────────────────────────────────\n\n private dispatch(frame: TerminalFrame): void {\n const subscriber = this.subscribers.get(frame.slot);\n if (!subscriber) return; // no subscriber for this slot — drop\n switch (frame.opcode) {\n case \"Output\":\n subscriber.onOutput?.(frame.data);\n return;\n case \"Snapshot\":\n subscriber.onSnapshot?.(frame.data);\n return;\n case \"Restore\":\n subscriber.onRestore?.(frame.data);\n return;\n default:\n // Input/Resize are outbound-only; ignore if echoed back.\n return;\n }\n }\n}\n","/**\n * TerminalPanel — @xterm/xterm mount + binary-frame streaming via `TerminalStreamRouter`\n * (POC `initTerminalPanel`, POC_TO_APP_PLAN_UI.md §4.6). Strict upgrade over the POC's 800ms\n * `capture_terminal_request` poll: the daemon pushes `Output`/`Snapshot`/`Restore` binary frames\n * directly over the one shared `DaemonClient` connection, demuxed by slot.\n *\n * Slot lifecycle: created once via `create_terminal_request`, then persisted onto the tab's\n * `TerminalTabData.slot` via `useTabStore.getState().updateData` so switching away and back to\n * this tab (kept mounted-but-hidden by `TabPanelHost`) never recreates the terminal. `TabPanelHost`\n * only unmounts a tab's panel when the tab leaves the store's `tabs[]` (i.e. real tab close, never\n * a tab switch) — this component's true-unmount effect below relies on exactly that invariant to\n * send `kill_terminal_request`, terminating the PTY server-side instead of leaking it forever.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Terminal } from \"@xterm/xterm\";\nimport { FitAddon } from \"@xterm/addon-fit\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport type { DaemonClient } from \"@av-pi-studio/client\";\nimport { TerminalStreamRouter } from \"@av-pi-studio/client\";\nimport { useConnectionStore } from \"@pi-studio-ui/lib/connection/connection-store.js\";\nimport { useTabStore } from \"@pi-studio-ui/stores/tab-store.js\";\nimport type { Tab, TerminalTabData } from \"@pi-studio-ui/stores/tab-store.js\";\nimport { Spinner } from \"@pi-studio-ui/components/primitives/Spinner.js\";\nimport styles from \"./TerminalPanel.module.css\";\n\nexport interface TerminalPanelProps {\n tab: Tab;\n}\n\ninterface CreateTerminalResponse {\n terminal: { slot: number };\n}\n\n// One TerminalStreamRouter per daemon connection — multiple terminal tabs share it rather than\n// each opening its own frame demuxer over the same socket.\nconst routerByDaemon = new WeakMap<DaemonClient, TerminalStreamRouter>();\n\nfunction routerFor(daemon: DaemonClient): TerminalStreamRouter {\n let router = routerByDaemon.get(daemon);\n if (!router) {\n router = new TerminalStreamRouter(daemon);\n router.start();\n routerByDaemon.set(daemon, router);\n }\n return router;\n}\n\n/** Dark palette matching the app's github-dark-ish default theme (theme/variants.ts \"dark\"). */\nconst TERMINAL_THEME = {\n background: \"#181b1a\",\n foreground: \"#fafafa\",\n cursor: \"#a2b4d7\",\n cursorAccent: \"#181b1a\",\n selectionBackground: \"rgba(255,255,255,0.18)\",\n black: \"#18181b\",\n red: \"#ef4444\",\n green: \"#22c55e\",\n yellow: \"#f59e0b\",\n blue: \"#3b82f6\",\n magenta: \"#a855f7\",\n cyan: \"#14b8a6\",\n white: \"#d4d4d8\",\n brightBlack: \"#52525b\",\n brightRed: \"#f87171\",\n brightGreen: \"#4ade80\",\n brightYellow: \"#fbbf24\",\n brightBlue: \"#60a5fa\",\n brightMagenta: \"#c084fc\",\n brightCyan: \"#2dd4bf\",\n brightWhite: \"#fafafa\",\n};\n\nexport function TerminalPanel({ tab }: TerminalPanelProps) {\n const data = tab.data as TerminalTabData;\n const client = useConnectionStore((s) => s.client);\n const activeTabId = useTabStore((s) => s.activeTabId);\n const isActive = activeTabId === tab.id;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const terminalRef = useRef<Terminal | null>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const slotRef = useRef<number | null>(data.slot);\n // Mirrors `use-checkout-status.ts`'s convention: kept in sync every render so the unmount-only\n // kill effect below always sends the CURRENT client, never a stale mount-time closure (e.g.\n // after a reconnect swaps in a new `PiStudioClient` instance).\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const [slot, setSlot] = useState<number | null>(data.slot);\n const [error, setError] = useState<string | null>(null);\n\n // ─── Slot lifecycle: create once, persist onto the tab so re-opening reuses it ─────────────\n // React StrictMode double-invokes effects in dev: mount → cleanup → remount, synchronously,\n // on the SAME component instance (refs/state persist across all three phases — this is not\n // three separate mounts). Two things must hold across that: (1) the request fires exactly\n // once, and (2) whether to APPLY the eventual response is decided by whether the component is\n // mounted at RESPONSE time, not by a flag captured at REQUEST time.\n //\n // `requestStartedRef` gives (1): set the instant the request fires and never reset, so the\n // phantom-mount's cleanup-then-remount sees it's already in flight and never fires a second\n // `create_terminal_request` (this is what previously spawned two real PTYs from one Ctrl+T).\n //\n // `isMountedRef` gives (2): flipped true at the START of every effect invocation and false in\n // every cleanup, so it always reflects the LATEST phase. StrictMode's remount happens\n // synchronously, before the request's promise can possibly settle, so by response time\n // `isMountedRef.current` is back to `true` for a StrictMode phantom (correctly applies the\n // slot) — but stays `false` for a genuine fast real close (correctly kills the orphaned PTY\n // instead of leaking it or, as the previous buggy version did, killing a terminal that was\n // never actually torn down).\n const isMountedRef = useRef(false);\n const requestStartedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n if (!client || slotRef.current !== null || requestStartedRef.current) {\n return () => {\n isMountedRef.current = false;\n };\n }\n requestStartedRef.current = true;\n\n const cwd = data.cwd || \"~\";\n\n void client.connection\n .request<CreateTerminalResponse>(\"create_terminal_request\", { workspaceId: \"\", cwd })\n .then((res) => {\n const created = res.terminal.slot;\n if (!isMountedRef.current) {\n // A real close happened with no remount after it — kill the PTY that finished\n // spawning after the tab was already gone, instead of leaking it.\n void client.connection.request(\"kill_terminal_request\", { slot: created }).catch(() => {});\n return;\n }\n slotRef.current = created;\n setSlot(created);\n useTabStore.getState().updateData(tab.id, { slot: created });\n })\n .catch((err: unknown) => {\n if (!isMountedRef.current) return;\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n // Reset only after the promise settles — by then StrictMode's synchronous\n // mount→cleanup→remount window has long passed, so this can never reopen the\n // double-fire race. It DOES allow a legitimate retry (e.g. `client` changed because of\n // a reconnect after the first attempt failed) instead of leaving the tab stuck forever.\n requestStartedRef.current = false;\n });\n\n return () => {\n isMountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, tab.id]);\n\n // ─── True unmount only: kill the PTY server-side ───────────────────────────────────────────\n // Runs its cleanup exactly once, when this component itself unmounts (real tab close, per\n // `TabPanelHost`'s \"hidden but alive\" model — a tab switch never unmounts). An empty deps array\n // means React never re-runs the effect body itself; only the cleanup fires, and only on\n // unmount, so this never races the slot-creation effect above or double-kills on a client\n // change. Without this, every closed terminal tab leaked its PTY process forever.\n //\n // For a REATTACH (this tab opened with a non-null `data.slot` from the very first render —\n // `use-terminal-restore.ts`, or the create-effect above once it has resolved) `slotRef.current`\n // is non-null from the start, so StrictMode's synchronous mount→cleanup→remount phantom cycle\n // would fire this cleanup and kill the PTY immediately on mount — unlike a freshly created\n // terminal, where `slotRef.current` is still `null` during that same phantom window (see the\n // create-effect's own comment) and so never hits this path. Deferred via `setTimeout`, exactly\n // like the create-effect's response handler: by the time it fires, StrictMode's remount has\n // already flipped `isMountedRef` back to `true` if this was a phantom unmount, so the kill is\n // skipped; a genuine close never remounts, so `isMountedRef` stays `false` and the kill proceeds.\n useEffect(() => {\n return () => {\n const currentSlot = slotRef.current;\n if (currentSlot === null) return;\n setTimeout(() => {\n if (isMountedRef.current) return; // StrictMode remounted synchronously — not a real close\n void clientRef.current?.connection\n .request(\"kill_terminal_request\", { slot: currentSlot })\n .catch(() => {});\n }, 0);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ─── xterm mount (once slot + container are ready) ─────────────────────────────────────────\n useEffect(() => {\n if (!client || slot === null || !containerRef.current) return;\n\n const terminal = new Terminal({\n cursorBlink: true,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: 13,\n scrollback: 5000,\n theme: TERMINAL_THEME,\n allowProposedApi: true,\n });\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n terminal.open(containerRef.current);\n fitAddon.fit();\n\n terminalRef.current = terminal;\n fitAddonRef.current = fitAddon;\n\n const router = routerFor(client.connection);\n const unsubscribeSlot = router.subscribeSlot(slot, {\n onOutput: (chunk) => terminal.write(chunk),\n onSnapshot: (chunk) => {\n terminal.clear();\n terminal.write(chunk);\n },\n onRestore: (chunk) => terminal.write(chunk),\n });\n\n void client.connection.request(\"subscribe_terminal_request\", { slot }).catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n\n const dataDisposable = terminal.onData((chunk) => {\n router.sendInput(slot, new TextEncoder().encode(chunk));\n });\n const resizeDisposable = terminal.onResize(({ cols, rows }) => {\n router.sendResize(slot, rows, cols);\n });\n\n const resizeObserver = new ResizeObserver(() => {\n fitAddon.fit();\n });\n resizeObserver.observe(containerRef.current);\n\n return () => {\n resizeObserver.disconnect();\n dataDisposable.dispose();\n resizeDisposable.dispose();\n unsubscribeSlot();\n void client.connection.request(\"unsubscribe_terminal_request\", { slot }).catch(() => {});\n terminal.dispose();\n terminalRef.current = null;\n fitAddonRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, slot]);\n\n // ─── Re-fit whenever this tab becomes the active (visible) one ────────────────────────────\n useEffect(() => {\n if (!isActive) return;\n fitAddonRef.current?.fit();\n }, [isActive]);\n\n if (error) {\n return (\n <div className={styles.wrap}>\n <div className={styles.status}>Terminal error: {error}</div>\n </div>\n );\n }\n\n if (slot === null) {\n return (\n <div className={styles.wrap}>\n <div className={styles.status}>\n <Spinner size=\"sm\" /> Starting terminal…\n </div>\n </div>\n );\n }\n\n return (\n <div className={styles.wrap}>\n <div ref={containerRef} className={styles.terminal} />\n </div>\n );\n}\n"],"names":["TerminalStreamRouter","daemon","__publicField","frame","_a","slot","subscriber","data","encodeTerminalFrame","rows","cols","_b","_c","routerByDaemon","routerFor","router","TERMINAL_THEME","TerminalPanel","tab","client","useConnectionStore","s","isActive","useTabStore","containerRef","useRef","terminalRef","fitAddonRef","slotRef","clientRef","setSlot","useState","error","setError","isMountedRef","requestStartedRef","useEffect","cwd","res","created","err","currentSlot","terminal","Terminal","fitAddon","FitAddon","unsubscribeSlot","chunk","dataDisposable","resizeDisposable","resizeObserver","jsx","styles","jsxs","Spinner"],"mappings":"ukBAuBO,MAAMA,CAAqB,CAIhC,YAA6BC,EAAsB,CAHlCC,EAAA,uBAAkB,KAC3BA,EAAA,cAA8B,MAET,KAAA,OAAAD,CAAuB,CAGpD,OAAc,CACR,KAAK,SACT,KAAK,OAAS,KAAK,OAAO,gBAAiBE,GAAU,KAAK,SAASA,CAAK,CAAC,EAC3E,CAGA,MAAa,QACXC,EAAA,KAAK,SAAL,MAAAA,EAAA,WACA,KAAK,OAAS,IAChB,CAGA,cAAcC,EAAcC,EAAgD,CAC1E,YAAK,YAAY,IAAID,EAAMC,CAAU,EAC9B,IAAM,CACP,KAAK,YAAY,IAAID,CAAI,IAAMC,GAAY,KAAK,YAAY,OAAOD,CAAI,CAC7E,CACF,CAGA,QAAQA,EAAuB,CAC7B,OAAO,KAAK,YAAY,IAAIA,CAAI,CAClC,CAKA,UAAUA,EAAcE,EAAwB,CAC9C,KAAK,OAAO,WAAWC,EAAoB,CAAE,OAAQ,QAAS,KAAAH,EAAM,KAAAE,CAAA,CAAM,CAAC,CAC7E,CAGA,WAAWF,EAAcI,EAAcC,EAAoB,CACzD,KAAK,OAAO,WAAWF,EAAoB,CAAE,OAAQ,SAAU,KAAAH,EAAM,KAAAI,EAAM,KAAAC,CAAA,CAAM,CAAC,CACpF,CAIQ,SAASP,EAA4B,WAC3C,MAAMG,EAAa,KAAK,YAAY,IAAIH,EAAM,IAAI,EAClD,GAAKG,EACL,OAAQH,EAAM,OAAA,CACZ,IAAK,UACHC,EAAAE,EAAW,WAAX,MAAAF,EAAA,KAAAE,EAAsBH,EAAM,MAC5B,OACF,IAAK,YACHQ,EAAAL,EAAW,aAAX,MAAAK,EAAA,KAAAL,EAAwBH,EAAM,MAC9B,OACF,IAAK,WACHS,EAAAN,EAAW,YAAX,MAAAM,EAAA,KAAAN,EAAuBH,EAAM,MAC7B,OACF,QAEE,MAAA,CAEN,CACF,oGClDMU,MAAqB,QAE3B,SAASC,EAAUb,EAA4C,CAC7D,IAAIc,EAASF,EAAe,IAAIZ,CAAM,EACtC,OAAKc,IACHA,EAAS,IAAIf,EAAqBC,CAAM,EACxCc,EAAO,MAAA,EACPF,EAAe,IAAIZ,EAAQc,CAAM,GAE5BA,CACT,CAGA,MAAMC,EAAiB,CACrB,WAAY,UACZ,WAAY,UACZ,OAAQ,UACR,aAAc,UACd,oBAAqB,yBACrB,MAAO,UACP,IAAK,UACL,MAAO,UACP,OAAQ,UACR,KAAM,UACN,QAAS,UACT,KAAM,UACN,MAAO,UACP,YAAa,UACb,UAAW,UACX,YAAa,UACb,aAAc,UACd,WAAY,UACZ,cAAe,UACf,WAAY,UACZ,YAAa,SACf,EAEO,SAASC,GAAc,CAAE,IAAAC,GAA2B,CACzD,MAAMX,EAAOW,EAAI,KACXC,EAASC,EAAoBC,GAAMA,EAAE,MAAM,EAE3CC,EADcC,EAAaF,GAAMA,EAAE,WAAW,IACnBH,EAAI,GAE/BM,EAAeC,EAAAA,OAA8B,IAAI,EACjDC,EAAcD,EAAAA,OAAwB,IAAI,EAC1CE,EAAcF,EAAAA,OAAwB,IAAI,EAC1CG,EAAUH,EAAAA,OAAsBlB,EAAK,IAAI,EAIzCsB,EAAYJ,EAAAA,OAAON,CAAM,EAC/BU,EAAU,QAAUV,EAEpB,KAAM,CAACd,EAAMyB,CAAO,EAAIC,EAAAA,SAAwBxB,EAAK,IAAI,EACnD,CAACyB,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAoBhDG,EAAeT,EAAAA,OAAO,EAAK,EAC3BU,EAAoBV,EAAAA,OAAO,EAAK,EA2ItC,OA1IAW,EAAAA,UAAU,IAAM,CAEd,GADAF,EAAa,QAAU,GACnB,CAACf,GAAUS,EAAQ,UAAY,MAAQO,EAAkB,QAC3D,MAAO,IAAM,CACXD,EAAa,QAAU,EACzB,EAEFC,EAAkB,QAAU,GAE5B,MAAME,EAAM9B,EAAK,KAAO,IAExB,OAAKY,EAAO,WACT,QAAgC,0BAA2B,CAAE,YAAa,GAAI,IAAAkB,CAAA,CAAK,EACnF,KAAMC,GAAQ,CACb,MAAMC,EAAUD,EAAI,SAAS,KAC7B,GAAI,CAACJ,EAAa,QAAS,CAGpBf,EAAO,WAAW,QAAQ,wBAAyB,CAAE,KAAMoB,CAAA,CAAS,EAAE,MAAM,IAAM,CAAC,CAAC,EACzF,MACF,CACAX,EAAQ,QAAUW,EAClBT,EAAQS,CAAO,EACfhB,EAAY,SAAA,EAAW,WAAWL,EAAI,GAAI,CAAE,KAAMqB,EAAS,CAC7D,CAAC,EACA,MAAOC,GAAiB,CAClBN,EAAa,SAClBD,EAASO,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAC,CAC3D,CAAC,EACA,QAAQ,IAAM,CAKbL,EAAkB,QAAU,EAC9B,CAAC,EAEI,IAAM,CACXD,EAAa,QAAU,EACzB,CAEF,EAAG,CAACf,EAAQD,EAAI,EAAE,CAAC,EAkBnBkB,EAAAA,UAAU,IACD,IAAM,CACX,MAAMK,EAAcb,EAAQ,QACxBa,IAAgB,MACpB,WAAW,IAAM,OACXP,EAAa,UACZ9B,EAAAyB,EAAU,UAAV,MAAAzB,EAAmB,WACrB,QAAQ,wBAAyB,CAAE,KAAMqC,CAAA,GACzC,MAAM,IAAM,CAAC,EAClB,EAAG,CAAC,CACN,EAEC,CAAA,CAAE,EAGLL,EAAAA,UAAU,IAAM,CACd,GAAI,CAACjB,GAAUd,IAAS,MAAQ,CAACmB,EAAa,QAAS,OAEvD,MAAMkB,EAAW,IAAIC,WAAS,CAC5B,YAAa,GACb,WAAY,mEACZ,SAAU,GACV,WAAY,IACZ,MAAO3B,EACP,iBAAkB,EAAA,CACnB,EACK4B,EAAW,IAAIC,WACrBH,EAAS,UAAUE,CAAQ,EAC3BF,EAAS,KAAKlB,EAAa,OAAO,EAClCoB,EAAS,IAAA,EAETlB,EAAY,QAAUgB,EACtBf,EAAY,QAAUiB,EAEtB,MAAM7B,EAASD,EAAUK,EAAO,UAAU,EACpC2B,EAAkB/B,EAAO,cAAcV,EAAM,CACjD,SAAW0C,GAAUL,EAAS,MAAMK,CAAK,EACzC,WAAaA,GAAU,CACrBL,EAAS,MAAA,EACTA,EAAS,MAAMK,CAAK,CACtB,EACA,UAAYA,GAAUL,EAAS,MAAMK,CAAK,CAAA,CAC3C,EAEI5B,EAAO,WAAW,QAAQ,6BAA8B,CAAE,KAAAd,EAAM,EAAE,MAAOmC,GAAiB,CAC7FP,EAASO,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAC,CAC3D,CAAC,EAED,MAAMQ,EAAiBN,EAAS,OAAQK,GAAU,CAChDhC,EAAO,UAAUV,EAAM,IAAI,cAAc,OAAO0C,CAAK,CAAC,CACxD,CAAC,EACKE,EAAmBP,EAAS,SAAS,CAAC,CAAE,KAAAhC,EAAM,KAAAD,KAAW,CAC7DM,EAAO,WAAWV,EAAMI,EAAMC,CAAI,CACpC,CAAC,EAEKwC,EAAiB,IAAI,eAAe,IAAM,CAC9CN,EAAS,IAAA,CACX,CAAC,EACD,OAAAM,EAAe,QAAQ1B,EAAa,OAAO,EAEpC,IAAM,CACX0B,EAAe,WAAA,EACfF,EAAe,QAAA,EACfC,EAAiB,QAAA,EACjBH,EAAA,EACK3B,EAAO,WAAW,QAAQ,+BAAgC,CAAE,KAAAd,CAAA,CAAM,EAAE,MAAM,IAAM,CAAC,CAAC,EACvFqC,EAAS,QAAA,EACThB,EAAY,QAAU,KACtBC,EAAY,QAAU,IACxB,CAEF,EAAG,CAACR,EAAQd,CAAI,CAAC,EAGjB+B,EAAAA,UAAU,IAAM,OACTd,KACLlB,EAAAuB,EAAY,UAAZ,MAAAvB,EAAqB,MACvB,EAAG,CAACkB,CAAQ,CAAC,EAETU,EAEAmB,EAAAA,IAAC,OAAI,UAAWC,EAAO,KACrB,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAWD,EAAO,OAAQ,SAAA,CAAA,mBAAiBpB,CAAA,CAAA,CAAM,CAAA,CACxD,EAIA3B,IAAS,KAET8C,EAAAA,IAAC,OAAI,UAAWC,EAAO,KACrB,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAWD,EAAO,OACrB,SAAA,CAAAD,EAAAA,IAACG,EAAA,CAAQ,KAAK,IAAA,CAAK,EAAE,qBAAA,CAAA,CACvB,CAAA,CACF,EAKFH,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAO,KACrB,SAAAD,EAAAA,IAAC,MAAA,CAAI,IAAK3B,EAAc,UAAW4B,EAAO,QAAA,CAAU,EACtD,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./vendor-react-BoIQBqDW.js";import{S as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=TextViewer-
|
|
1
|
+
import{j as e}from"./vendor-react-BoIQBqDW.js";import{S as i}from"./index-CXS9Grd7.js";import{u as s,C as n}from"./CodeView-DyKgdbhF.js";import{p as o}from"./FilePanel-BmlpXwsJ.js";import"./vendor-query-AtKBh_Yt.js";import"./vendor--os7hw7d.js";import"./vendor-markdown-B8HSIhaA.js";import"./vendor-highlight-DCzuSv8g.js";import"./vendor-icons-Bk3OssJx.js";import"./vendor-overlays-UwLNGk04.js";import"./vendor-dnd-D9kA7FgH.js";import"./DiffView-DlVCPvLc.js";function E({path:t}){const r=s(t);return r.isLoading?e.jsxs("div",{className:o.emptyState,children:[e.jsx(i,{size:"sm"})," Loading..."]}):r.isError?e.jsxs("div",{className:o.emptyState,children:["Error: ",r.error instanceof Error?r.error.message:"unknown error"]}):r.data?e.jsx(n,{path:t,content:r.data.content}):null}export{E as TextViewer};
|
|
2
|
+
//# sourceMappingURL=TextViewer-BgO--OCH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextViewer-
|
|
1
|
+
{"version":3,"file":"TextViewer-BgO--OCH.js","sources":["../../../src/features/files/TextViewer.tsx"],"sourcesContent":["/**\n * TextViewer — the default viewer for source/text files: fetches the UTF-8 preview via\n * `useFileRead` and renders it through `CodeView` (line gutter + Shiki highlighting). Registered\n * in `viewer-registry.ts` as the fallback for any file not claimed by a more specific viewer.\n */\n\nimport { Spinner } from \"@pi-studio-ui/components/primitives/Spinner.js\";\nimport { useFileRead } from \"@pi-studio-ui/hooks/use-file-read.js\";\nimport { CodeView } from \"./CodeView.js\";\nimport type { ViewerProps } from \"./viewer-registry.js\";\nimport styles from \"./FilePanel.module.css\";\n\nexport function TextViewer({ path }: ViewerProps) {\n const query = useFileRead(path);\n\n if (query.isLoading) {\n return (\n <div className={styles.emptyState}>\n <Spinner size=\"sm\" /> Loading...\n </div>\n );\n }\n if (query.isError) {\n return (\n <div className={styles.emptyState}>\n Error: {query.error instanceof Error ? query.error.message : \"unknown error\"}\n </div>\n );\n }\n if (!query.data) return null;\n return <CodeView path={path} content={query.data.content} />;\n}\n"],"names":["TextViewer","path","query","useFileRead","jsxs","styles","jsx","Spinner","CodeView"],"mappings":"2cAYO,SAASA,EAAW,CAAE,KAAAC,GAAqB,CAChD,MAAMC,EAAQC,EAAYF,CAAI,EAE9B,OAAIC,EAAM,UAENE,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,WACrB,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAQ,KAAK,IAAA,CAAK,EAAE,aAAA,EACvB,EAGAL,EAAM,QAENE,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,WAAY,SAAA,CAAA,UACzBH,EAAM,iBAAiB,MAAQA,EAAM,MAAM,QAAU,eAAA,EAC/D,EAGCA,EAAM,WACHM,EAAA,CAAS,KAAAP,EAAY,QAASC,EAAM,KAAK,QAAS,EADlC,IAE1B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as o}from"./vendor-react-BoIQBqDW.js";import{S as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=VideoViewer-
|
|
1
|
+
import{j as o}from"./vendor-react-BoIQBqDW.js";import{S as t}from"./index-CXS9Grd7.js";import{u as a}from"./use-file-download-DcvIvDgT.js";import{p as e}from"./FilePanel-BmlpXwsJ.js";import"./vendor-query-AtKBh_Yt.js";import"./vendor--os7hw7d.js";import"./vendor-markdown-B8HSIhaA.js";import"./vendor-highlight-DCzuSv8g.js";import"./vendor-icons-Bk3OssJx.js";import"./vendor-overlays-UwLNGk04.js";import"./vendor-dnd-D9kA7FgH.js";import"./DiffView-DlVCPvLc.js";const n="_wrap_1c9y4_1",m="_video_1c9y4_10",i={wrap:n,video:m};function S({path:s}){const r=a(s);return r.isLoading?o.jsxs("div",{className:e.emptyState,children:[o.jsx(t,{size:"sm"})," Loading video..."]}):r.isError?o.jsxs("div",{className:e.emptyState,children:["Error: ",r.error instanceof Error?r.error.message:"unknown error"]}):r.data?o.jsx("div",{className:i.wrap,children:o.jsx("video",{className:i.video,src:r.data.objectUrl,controls:!0})}):null}export{S as VideoViewer};
|
|
2
|
+
//# sourceMappingURL=VideoViewer-CIeP-3Qh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoViewer-
|
|
1
|
+
{"version":3,"file":"VideoViewer-CIeP-3Qh.js","sources":["../../../src/features/files/VideoViewer.tsx"],"sourcesContent":["/**\n * VideoViewer — renders a binary video file via the file-transfer binary download\n * (`useFileDownload`) into a native `<video>` element (POC_TO_APP_PLAN_UI.md §4.5 follow-up:\n * modular file preview).\n */\n\nimport { Spinner } from \"@pi-studio-ui/components/primitives/Spinner.js\";\nimport { useFileDownload } from \"@pi-studio-ui/hooks/use-file-download.js\";\nimport type { ViewerProps } from \"./viewer-registry.js\";\nimport panelStyles from \"./FilePanel.module.css\";\nimport styles from \"./VideoViewer.module.css\";\n\nexport function VideoViewer({ path }: ViewerProps) {\n const query = useFileDownload(path);\n\n if (query.isLoading) {\n return (\n <div className={panelStyles.emptyState}>\n <Spinner size=\"sm\" /> Loading video...\n </div>\n );\n }\n if (query.isError) {\n return (\n <div className={panelStyles.emptyState}>\n Error: {query.error instanceof Error ? query.error.message : \"unknown error\"}\n </div>\n );\n }\n if (!query.data) return null;\n\n return (\n <div className={styles.wrap}>\n {/* eslint-disable-next-line jsx-a11y/media-has-caption -- arbitrary local file, no caption track available */}\n <video className={styles.video} src={query.data.objectUrl} controls />\n </div>\n );\n}\n"],"names":["VideoViewer","path","query","useFileDownload","jsxs","panelStyles","jsx","Spinner","styles"],"mappings":"4gBAYO,SAASA,EAAY,CAAE,KAAAC,GAAqB,CACjD,MAAMC,EAAQC,EAAgBF,CAAI,EAElC,OAAIC,EAAM,UAENE,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAY,WAC1B,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAQ,KAAK,IAAA,CAAK,EAAE,mBAAA,EACvB,EAGAL,EAAM,QAENE,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAY,WAAY,SAAA,CAAA,UAC9BH,EAAM,iBAAiB,MAAQA,EAAM,MAAM,QAAU,eAAA,EAC/D,EAGCA,EAAM,WAGR,MAAA,CAAI,UAAWM,EAAO,KAErB,eAAC,QAAA,CAAM,UAAWA,EAAO,MAAO,IAAKN,EAAM,KAAK,UAAW,SAAQ,GAAC,EACtE,EANsB,IAQ1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
html,body{margin:0;padding:0}body{min-height:100vh;overflow:hidden;background:var(--pi-color-background, #0a0a0a);color:var(--pi-color-foreground, #fafafa);font-family:var(--pi-font-ui, system-ui, sans-serif)}#root{display:flex;flex-direction:column;min-height:100vh}*,*:before,*:after{box-sizing:border-box}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--pi-color-border, #353b46);border-radius:3px}._btn_1chbg_4{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:var(--pi-radius-lg, 8px);border:1px solid transparent;font-family:var(--pi-font-ui, system-ui, sans-serif);font-weight:500;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;text-decoration:none;outline:none;transition:opacity .12s ease,background-color .12s ease,border-color .12s ease;box-sizing:border-box}._btn_1chbg_4:focus-visible{outline:2px solid var(--pi-color-accent, #2e5cb8);outline-offset:2px}._btn_1chbg_4:disabled,._btn_1chbg_4[aria-disabled=true]{cursor:not-allowed;pointer-events:none}._default_1chbg_35{background-color:var(--pi-color-accent, #2e5cb8);color:var(--pi-color-accentForeground, #ffffff);border-color:var(--pi-color-accent, #2e5cb8)}._default_1chbg_35:hover:not(:disabled){filter:brightness(1.08)}._secondary_1chbg_44{background-color:var(--pi-color-surface3, #3f3f46);color:var(--pi-color-foreground, #fafafa);border-color:var(--pi-color-border, #3f3f46)}._secondary_1chbg_44:hover:not(:disabled){background-color:var(--pi-color-surface2, #27272a)}._outline_1chbg_53{background-color:transparent;color:var(--pi-color-accentBright, #a2b4d7);border-color:var(--pi-color-accent, #2e5cb8)}._outline_1chbg_53:hover:not(:disabled){background-color:var(--pi-color-surface1, #18181b)}._ghost_1chbg_62{background-color:transparent;color:var(--pi-color-foregroundMuted, #a1a1aa);border-color:transparent}._ghost_1chbg_62:hover:not(:disabled){color:var(--pi-color-foreground, #fafafa);background-color:var(--pi-color-surface1, #18181b)}._destructive_1chbg_72{background-color:var(--pi-color-destructive, #991b1b);color:var(--pi-color-destructiveForeground, #fef2f2);border-color:var(--pi-color-destructive, #991b1b)}._destructive_1chbg_72:hover:not(:disabled){filter:brightness(1.1)}._iconOnly_1chbg_82{padding-left:0!important;padding-right:0!important;aspect-ratio:1}._loadingSpinner_1chbg_89{animation:_piSpin_1chbg_1 .75s linear infinite;flex-shrink:0}@keyframes _piSpin_1chbg_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._input_a7qyq_3{width:100%;padding:8px 12px;border-radius:var(--pi-radius-md, 6px);border:1px solid var(--pi-color-border, #3f3f46);background-color:var(--pi-color-surface2, #27272a);color:var(--pi-color-foreground, #fafafa);font-size:var(--pi-font-size-base, 16px);font-family:var(--pi-font-ui, system-ui, sans-serif);outline:none;transition:border-color .12s ease;box-sizing:border-box}._input_a7qyq_3::placeholder{color:var(--pi-color-foregroundMuted, #a1a1aa)}._input_a7qyq_3:focus{border-color:var(--pi-color-accent, #2e5cb8);outline:2px solid var(--pi-color-accent, #2e5cb8);outline-offset:-1px}._input_a7qyq_3:disabled{opacity:.5;cursor:not-allowed}._textarea_a7qyq_32{resize:vertical;min-height:80px}._wrap_emmus_1{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--pi-color-foregroundMuted, #9aa0a6)}._dot_emmus_8{width:8px;height:8px;border-radius:50%;background:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._dot_emmus_8._open_emmus_15{background:var(--pi-color-statusSuccess, #3ecf8e)}._dot_emmus_8._connecting_emmus_18{background:var(--pi-color-statusWarning, #e0a030)}._dot_emmus_8._closed_emmus_21,._dot_emmus_8._idle_emmus_22,._dot_emmus_8._closing_emmus_23{background:var(--pi-color-statusDanger, #e5484d)}._toolbar_i9hmh_1{display:flex;align-items:center;gap:10px;padding:6px 10px;border-bottom:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #16181a);flex-shrink:0}._brand_i9hmh_10{font-weight:600;font-size:13px;letter-spacing:.02em;white-space:nowrap}._version_i9hmh_16{font-size:11px;color:var(--pi-color-foregroundMuted, #7a8394);white-space:nowrap;margin-left:-4px}._sep_i9hmh_22{width:1px;height:18px;background:var(--pi-color-border, #353b46);flex-shrink:0}._host_i9hmh_28{width:190px}._password_i9hmh_31{width:100px}._sidebarToggles_i9hmh_34{display:flex;align-items:center;gap:4px;margin-left:auto}._dot_202py_3{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0}._wrap_sqws5_1{display:flex;flex-direction:column;min-height:0;height:100%}._header_sqws5_7{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._header_sqws5_7 h3{margin:0;font-size:12px;font-weight:600;color:var(--pi-color-foregroundMuted, #9aa0a6);text-transform:uppercase;letter-spacing:.04em}._list_sqws5_23{flex:1 1 auto;overflow-y:auto;min-height:0}._item_sqws5_28{position:relative;padding:8px 10px;cursor:pointer;border-bottom:1px solid transparent}._item_sqws5_28:hover{background:var(--pi-color-surfaceHover, #1e2124)}._item_sqws5_28._active_sqws5_37{background:var(--pi-color-surfaceSunken, #111)}._title_sqws5_40{display:flex;align-items:center;gap:6px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._meta_sqws5_49{margin-top:2px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._menuBtn_sqws5_57{position:absolute;top:6px;right:6px;opacity:0;padding:2px 4px;background:none;border:none;border-radius:4px;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6)}._item_sqws5_28:hover ._menuBtn_sqws5_57{opacity:1}._menuBtn_sqws5_57:hover{background:var(--pi-color-surfaceHover, #1e2124)}._workspaceGroup_sqws5_75{border-bottom:1px solid var(--pi-color-border, #353b46)}._workspaceHeader_sqws5_78{display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:pointer;font-size:12px;font-weight:600;color:var(--pi-color-foreground, #e6e6e6)}._workspaceHeader_sqws5_78:hover{background:var(--pi-color-surfaceHover, #1e2124)}._workspaceChevron_sqws5_91{display:flex;align-items:center;justify-content:center;padding:0;background:none;border:none;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._workspaceIcon_sqws5_102{color:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._workspaceLabel_sqws5_106{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._workspaceCount_sqws5_112{font-size:11px;font-weight:400;color:var(--pi-color-foregroundMuted, #9aa0a6)}._newSessionBtn_sqws5_117{flex-shrink:0;opacity:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._workspaceHeader_sqws5_78:hover ._newSessionBtn_sqws5_117{opacity:1}._newSessionBtn_sqws5_117:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #e6e6e6)}._workspaceSessions_sqws5_129{padding-left:12px}._trigger_16o4s_1{position:fixed;width:1px;height:1px;pointer-events:none}._content_16o4s_7{min-width:160px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_16o4s_16{display:flex;align-items:center;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_16o4s_16:hover,._item_16o4s_16[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._item_16o4s_16[data-disabled]{opacity:.4;cursor:default}._danger_16o4s_33{color:var(--pi-color-statusDanger, #e5484d)}._sep_16o4s_36{height:1px;margin:4px 0;background:var(--pi-color-border, #353b46)}._strip_8jveh_1{display:flex;align-items:center;gap:2px;padding:4px 6px 0;overflow-x:auto;flex-shrink:0;border-bottom:1px solid var(--pi-color-border, #353b46)}._tab_8jveh_10{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--pi-borderRadius-md, 6px) var(--pi-borderRadius-md, 6px) 0 0;font-size:12px;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6);white-space:nowrap;flex-shrink:0;-webkit-user-select:none;user-select:none}._tab_8jveh_10:hover{background:var(--pi-color-surfaceHover, #1e2124)}._active_8jveh_26{background:var(--pi-color-surfaceSunken, #111);color:var(--pi-color-foreground, #fafafa)}._icon_8jveh_30{display:flex;align-items:center;flex-shrink:0}._label_8jveh_35{max-width:160px;overflow:hidden;text-overflow:ellipsis}._close_8jveh_40{display:flex;align-items:center;border-radius:3px;padding:1px;flex-shrink:0}._close_8jveh_40:hover{background:var(--pi-color-surfaceHover, #1e2124)}._newTab_8jveh_50{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 4px;width:20px;height:20px;border-radius:var(--pi-borderRadius-sm, 4px);color:var(--pi-color-foregroundMuted, #9aa0a6);background:transparent;border:none;cursor:pointer}._newTab_8jveh_50:hover:not(:disabled){background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._newTab_8jveh_50:disabled{opacity:.4;cursor:default}._content_8jveh_73{min-width:160px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_8jveh_82{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_8jveh_82:hover,._item_8jveh_82[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._itemIcon_8jveh_96{flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._spinner_1tgzp_3{display:inline-block;border-radius:9999px;border-style:solid;border-color:currentColor transparent transparent transparent;animation:_piSpinnerRotate_1tgzp_1 .7s linear infinite;flex-shrink:0}@keyframes _piSpinnerRotate_1tgzp_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._area_1vzxd_1{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}._panel_1vzxd_7{position:absolute;top:0;right:0;bottom:0;left:0;display:none;flex-direction:column;min-height:0}._active_1vzxd_14{display:flex}._empty_1vzxd_17{display:flex;align-items:center;justify-content:center;height:100%;color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:13px}._container_yg965_1{position:relative;height:100%;display:flex;flex-direction:column}._header_yg965_7{display:flex;align-items:center;padding:6px 8px;border-bottom:1px solid var(--pi-color-border, #353b46)}._uploadButton_yg965_13{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:3px 8px;border-radius:4px;border:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #1e2124);color:var(--pi-color-foreground, #e4e6eb);cursor:pointer}._uploadButton_yg965_13:hover:not(:disabled){background:var(--pi-color-surfaceHover, #2a2e33)}._uploadButton_yg965_13:disabled{opacity:.5;cursor:default}._hiddenInput_yg965_32{display:none}._status_yg965_35,._statusError_yg965_36{font-size:11px;padding:4px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._status_yg965_35{color:var(--pi-color-foregroundMuted, #9aa0a6)}._statusError_yg965_36{color:var(--pi-color-danger, #e5534b)}._rowAction_yg965_49{margin-left:auto;display:none;align-items:center;padding:2px;border:none;background:transparent;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;border-radius:3px}._rowAction_yg965_49:hover{color:var(--pi-color-foreground, #e4e6eb);background:var(--pi-color-surface, #1e2124)}._item_yg965_64:hover ._rowAction_yg965_49{display:inline-flex}._dropOverlay_yg965_67{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--pi-color-accentBright, #a2b4d7);background:color-mix(in srgb,var(--pi-color-surface, #1e2124) 80%,transparent);border:2px dashed var(--pi-color-accentBright, #a2b4d7);border-radius:6px;pointer-events:none;z-index:2}._list_yg965_82{padding:4px 0;flex:1;overflow-y:auto;position:relative}._item_yg965_64{height:24px;padding-right:8px;font-size:12px;border-radius:3px;cursor:pointer;display:flex;align-items:center;gap:6px}._item_yg965_64:hover{background:var(--pi-color-surfaceHover, #1e2124)}._chevronSlot_yg965_101{display:flex;align-items:center;justify-content:center;width:12px;flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._chevron_yg965_101{transition:transform .1s ease}._chevronOpen_yg965_112{transform:rotate(90deg)}._icon_yg965_115{display:flex;align-items:center;width:16px;flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._name_yg965_122{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._dirName_yg965_127{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--pi-color-accentBright, #a2b4d7)}._statusRow_yg965_133{height:24px;display:flex;align-items:center;padding-right:8px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._statusRowError_yg965_144{color:var(--pi-color-danger, #e5534b)}._emptyState_yg965_147{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._trigger_g81d7_1{position:fixed;width:1px;height:1px;pointer-events:none}._content_g81d7_7{min-width:140px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_g81d7_16{display:flex;align-items:center;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_g81d7_16:hover,._item_g81d7_16[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._danger_g81d7_29{color:var(--pi-color-statusDanger, #e5484d)}._sep_g81d7_32{height:1px;margin:4px 0;background:var(--pi-color-border, #353b46)}._list_1pgby_1{padding:4px 0}._summary_1pgby_4{padding:4px 8px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);border-bottom:1px solid var(--pi-color-border, #353b46);margin-bottom:4px}._item_1pgby_11{padding:4px 8px;font-size:12px;border-radius:3px;cursor:pointer;display:flex;align-items:center;gap:6px}._item_1pgby_11:hover{background:var(--pi-color-surfaceHover, #1e2124)}._badge_1pgby_23{font-size:10px;padding:0 4px;border-radius:3px;font-weight:600;flex-shrink:0}._added_1pgby_30{background:color-mix(in srgb,var(--pi-color-statusSuccess, #4ade80) 20%,transparent);color:var(--pi-color-statusSuccess, #4ade80)}._modified_1pgby_34{background:color-mix(in srgb,var(--pi-color-statusWarning, #facc15) 20%,transparent);color:var(--pi-color-statusWarning, #facc15)}._deleted_1pgby_38{background:color-mix(in srgb,var(--pi-color-statusDanger, #ff8a80) 20%,transparent);color:var(--pi-color-statusDanger, #ff8a80)}._name_1pgby_42{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._emptyState_1pgby_47{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._wrap_r37ok_1{display:flex;flex-direction:column;height:100%;min-height:0}._tabBar_r37ok_7{display:flex;align-items:center;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._tabBtn_r37ok_13{font:inherit;font-size:12px;padding:8px 12px;background:none;border:none;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;border-bottom:2px solid transparent}._tabBtn_r37ok_13:hover{color:var(--pi-color-foreground, #fafafa)}._active_r37ok_26{color:var(--pi-color-foreground, #fafafa);border-bottom-color:var(--pi-color-accent, #2e5cb8)}._refreshBtn_r37ok_30{margin-left:auto;margin-right:6px}._content_r37ok_34{flex:1;overflow-y:auto;padding:8px;min-height:0}._statusBar_gvk7q_1{height:35px;width:100%;flex-shrink:0;display:flex;align-items:center;gap:2px;padding:0 12px;overflow-x:auto;border-top:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #16181a);font-size:12px;color:var(--pi-color-foreground, #e4e6eb);white-space:nowrap}._segmentGroup_gvk7q_16{display:flex;align-items:center}._chevron_gvk7q_20{color:var(--pi-color-border, #353b46);margin:0 4px;flex-shrink:0}._segment_gvk7q_16{display:flex;align-items:center;gap:6px;padding:2px 8px;border-radius:4px;background:var(--pi-color-surfaceRaised, #1c1f22)}._icon_gvk7q_33{display:flex;align-items:center;color:var(--pi-color-foregroundMuted, #7a8394);flex-shrink:0}._text_gvk7q_39{overflow:hidden;text-overflow:ellipsis;max-width:320px}._wrapper_131x2_3{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa)}._wrapper_131x2_3[data-disabled=true]{opacity:.5;pointer-events:none}._box_131x2_18{width:16px;height:16px;border-radius:var(--pi-radius-sm, 3px);border:1.5px solid var(--pi-color-border, #3f3f46);background-color:transparent;display:flex;align-items:center;justify-content:center;transition:background-color .1s,border-color .1s;flex-shrink:0}._box_131x2_18[data-checked=true]{background-color:var(--pi-color-accent, #2e5cb8);border-color:var(--pi-color-accent, #2e5cb8)}._checkmark_131x2_36{color:var(--pi-color-accentForeground, #ffffff)}._nativeInput_131x2_41{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}._select_vj45v_3{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);padding:8px 32px 8px 10px;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa);width:100%;outline:none;transition:border-color .1s;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23a1a1aa' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}._select_vj45v_3:focus{border-color:var(--pi-color-accent, #2e5cb8)}._select_vj45v_3:disabled{opacity:.5;cursor:not-allowed}._comboboxWrapper_vj45v_31{position:relative;width:100%}._comboboxInput_vj45v_36{width:100%;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);padding:8px 10px;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa);outline:none;box-sizing:border-box}._comboboxInput_vj45v_36:focus{border-color:var(--pi-color-accent, #2e5cb8)}._comboboxList_vj45v_53{position:absolute;top:100%;left:0;right:0;z-index:80;max-height:200px;overflow-y:auto;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);margin-top:4px;padding:4px;box-shadow:var(--pi-shadow-md, 0 4px 12px rgba(0,0,0,.4))}._comboboxOption_vj45v_69{padding:6px 8px;border-radius:var(--pi-radius-sm, 3px);font-size:var(--pi-font-size-sm, 14px);font-family:var(--pi-font-ui, system-ui);color:var(--pi-color-foreground, #fafafa);cursor:pointer;background:none;border:none;width:100%;text-align:left}._comboboxOption_vj45v_69:hover,._comboboxOptionHighlighted_vj45v_82{background-color:var(--pi-color-surface2, #27272a)}._overlay_1yaef_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100}._contentWrapper_1yaef_7{position:fixed;top:0;right:0;bottom:0;left:0;z-index:101;display:flex;align-items:center;justify-content:center;pointer-events:none}._dialog_1yaef_16{pointer-events:auto;width:500px;max-width:90vw;max-height:70vh;background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);border-radius:var(--pi-radius-lg, 8px);display:flex;flex-direction:column;box-shadow:0 8px 32px #00000080}._header_1yaef_28{padding:12px 14px;border-bottom:1px solid var(--pi-color-border, #353b46);display:flex;align-items:center;gap:8px;flex-shrink:0}._title_1yaef_36{font-size:13px;margin:0;flex:1;color:var(--pi-color-foreground, #fafafa);font-weight:600}._closeBtn_1yaef_43{display:flex;align-items:center;background:none;border:none;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;padding:4px;border-radius:4px}._closeBtn_1yaef_43:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._body_1yaef_57{flex:1;display:flex;flex-direction:column;min-height:0}._footer_1yaef_63{padding:10px 14px;border-top:1px solid var(--pi-color-border, #353b46);display:flex;align-items:center;gap:8px;justify-content:flex-end;flex-shrink:0}._bare_1yaef_72{border:none;background:transparent;box-shadow:none;position:relative}._bareBody_1yaef_78{border-radius:var(--pi-radius-lg, 8px);overflow:hidden}._bareCloseBtn_1yaef_82{position:absolute;top:-12px;right:-12px;display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);border-radius:50%;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer}._bareCloseBtn_1yaef_82:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._visuallyHidden_1yaef_101{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}._handle_1ocv1_1{position:absolute;top:0;bottom:0;width:5px;cursor:col-resize;z-index:5;background:transparent;transition:background .12s ease}._handle_1ocv1_1:hover,._handle_1ocv1_1:active{background:var(--pi-color-accent, #2e5cb8)}._pathRow_9xphl_1{padding:8px 14px;display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._pathInput_9xphl_9{flex:1;font-size:12px}._list_9xphl_13{flex:1;overflow-y:auto;padding:4px 0;min-height:200px;max-height:400px}._item_9xphl_20{padding:6px 14px;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--pi-color-foreground, #fafafa)}._item_9xphl_20:hover{background:var(--pi-color-surfaceHover, #1e2124)}._name_9xphl_32{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._emptyState_9xphl_37{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._shell_1m1nv_1{display:flex;flex-direction:column;height:100vh;min-height:0}._main_1m1nv_7{display:flex;flex:1 1 auto;min-height:0;overflow:hidden}._sidebarLeft_1m1nv_13{position:relative;flex-shrink:0;border-right:1px solid var(--pi-color-border, #353b46);display:flex;flex-direction:column;min-width:0}._leftHandle_1m1nv_21{right:-3px}._center_1m1nv_24{flex:1 1 auto;display:flex;flex-direction:column;min-width:0;min-height:0}._sidebarRight_1m1nv_31{position:relative;flex-shrink:0;border-left:1px solid var(--pi-color-border, #353b46);display:flex;flex-direction:column;min-width:0}._rightHandle_1m1nv_39{left:-3px}
|
|
1
|
+
html,body{margin:0;padding:0}body{min-height:100vh;overflow:hidden;background:var(--pi-color-background, #0a0a0a);color:var(--pi-color-foreground, #fafafa);font-family:var(--pi-font-ui, system-ui, sans-serif)}#root{display:flex;flex-direction:column;min-height:100vh}*,*:before,*:after{box-sizing:border-box}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--pi-color-border, #353b46);border-radius:3px}._btn_1chbg_4{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:var(--pi-radius-lg, 8px);border:1px solid transparent;font-family:var(--pi-font-ui, system-ui, sans-serif);font-weight:500;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;text-decoration:none;outline:none;transition:opacity .12s ease,background-color .12s ease,border-color .12s ease;box-sizing:border-box}._btn_1chbg_4:focus-visible{outline:2px solid var(--pi-color-accent, #2e5cb8);outline-offset:2px}._btn_1chbg_4:disabled,._btn_1chbg_4[aria-disabled=true]{cursor:not-allowed;pointer-events:none}._default_1chbg_35{background-color:var(--pi-color-accent, #2e5cb8);color:var(--pi-color-accentForeground, #ffffff);border-color:var(--pi-color-accent, #2e5cb8)}._default_1chbg_35:hover:not(:disabled){filter:brightness(1.08)}._secondary_1chbg_44{background-color:var(--pi-color-surface3, #3f3f46);color:var(--pi-color-foreground, #fafafa);border-color:var(--pi-color-border, #3f3f46)}._secondary_1chbg_44:hover:not(:disabled){background-color:var(--pi-color-surface2, #27272a)}._outline_1chbg_53{background-color:transparent;color:var(--pi-color-accentBright, #a2b4d7);border-color:var(--pi-color-accent, #2e5cb8)}._outline_1chbg_53:hover:not(:disabled){background-color:var(--pi-color-surface1, #18181b)}._ghost_1chbg_62{background-color:transparent;color:var(--pi-color-foregroundMuted, #a1a1aa);border-color:transparent}._ghost_1chbg_62:hover:not(:disabled){color:var(--pi-color-foreground, #fafafa);background-color:var(--pi-color-surface1, #18181b)}._destructive_1chbg_72{background-color:var(--pi-color-destructive, #991b1b);color:var(--pi-color-destructiveForeground, #fef2f2);border-color:var(--pi-color-destructive, #991b1b)}._destructive_1chbg_72:hover:not(:disabled){filter:brightness(1.1)}._iconOnly_1chbg_82{padding-left:0!important;padding-right:0!important;aspect-ratio:1}._loadingSpinner_1chbg_89{animation:_piSpin_1chbg_1 .75s linear infinite;flex-shrink:0}@keyframes _piSpin_1chbg_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._input_a7qyq_3{width:100%;padding:8px 12px;border-radius:var(--pi-radius-md, 6px);border:1px solid var(--pi-color-border, #3f3f46);background-color:var(--pi-color-surface2, #27272a);color:var(--pi-color-foreground, #fafafa);font-size:var(--pi-font-size-base, 16px);font-family:var(--pi-font-ui, system-ui, sans-serif);outline:none;transition:border-color .12s ease;box-sizing:border-box}._input_a7qyq_3::placeholder{color:var(--pi-color-foregroundMuted, #a1a1aa)}._input_a7qyq_3:focus{border-color:var(--pi-color-accent, #2e5cb8);outline:2px solid var(--pi-color-accent, #2e5cb8);outline-offset:-1px}._input_a7qyq_3:disabled{opacity:.5;cursor:not-allowed}._textarea_a7qyq_32{resize:vertical;min-height:80px}._wrap_emmus_1{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--pi-color-foregroundMuted, #9aa0a6)}._dot_emmus_8{width:8px;height:8px;border-radius:50%;background:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._dot_emmus_8._open_emmus_15{background:var(--pi-color-statusSuccess, #3ecf8e)}._dot_emmus_8._connecting_emmus_18{background:var(--pi-color-statusWarning, #e0a030)}._dot_emmus_8._closed_emmus_21,._dot_emmus_8._idle_emmus_22,._dot_emmus_8._closing_emmus_23{background:var(--pi-color-statusDanger, #e5484d)}._toolbar_i9hmh_1{display:flex;align-items:center;gap:10px;padding:6px 10px;border-bottom:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #16181a);flex-shrink:0}._brand_i9hmh_10{font-weight:600;font-size:13px;letter-spacing:.02em;white-space:nowrap}._version_i9hmh_16{font-size:11px;color:var(--pi-color-foregroundMuted, #7a8394);white-space:nowrap;margin-left:-4px}._sep_i9hmh_22{width:1px;height:18px;background:var(--pi-color-border, #353b46);flex-shrink:0}._host_i9hmh_28{width:190px}._password_i9hmh_31{width:100px}._sidebarToggles_i9hmh_34{display:flex;align-items:center;gap:4px;margin-left:auto}._dot_202py_3{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0}._wrap_sqws5_1{display:flex;flex-direction:column;min-height:0;height:100%}._header_sqws5_7{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._header_sqws5_7 h3{margin:0;font-size:12px;font-weight:600;color:var(--pi-color-foregroundMuted, #9aa0a6);text-transform:uppercase;letter-spacing:.04em}._list_sqws5_23{flex:1 1 auto;overflow-y:auto;min-height:0}._item_sqws5_28{position:relative;padding:8px 10px;cursor:pointer;border-bottom:1px solid transparent}._item_sqws5_28:hover{background:var(--pi-color-surfaceHover, #1e2124)}._item_sqws5_28._active_sqws5_37{background:var(--pi-color-surfaceSunken, #111)}._title_sqws5_40{display:flex;align-items:center;gap:6px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._meta_sqws5_49{margin-top:2px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._menuBtn_sqws5_57{position:absolute;top:6px;right:6px;opacity:0;padding:2px 4px;background:none;border:none;border-radius:4px;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6)}._item_sqws5_28:hover ._menuBtn_sqws5_57{opacity:1}._menuBtn_sqws5_57:hover{background:var(--pi-color-surfaceHover, #1e2124)}._workspaceGroup_sqws5_75{border-bottom:1px solid var(--pi-color-border, #353b46)}._workspaceHeader_sqws5_78{display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:pointer;font-size:12px;font-weight:600;color:var(--pi-color-foreground, #e6e6e6)}._workspaceHeader_sqws5_78:hover{background:var(--pi-color-surfaceHover, #1e2124)}._workspaceChevron_sqws5_91{display:flex;align-items:center;justify-content:center;padding:0;background:none;border:none;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._workspaceIcon_sqws5_102{color:var(--pi-color-foregroundMuted, #9aa0a6);flex-shrink:0}._workspaceLabel_sqws5_106{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._workspaceCount_sqws5_112{font-size:11px;font-weight:400;color:var(--pi-color-foregroundMuted, #9aa0a6)}._newSessionBtn_sqws5_117{flex-shrink:0;opacity:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._workspaceHeader_sqws5_78:hover ._newSessionBtn_sqws5_117{opacity:1}._newSessionBtn_sqws5_117:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #e6e6e6)}._workspaceSessions_sqws5_129{padding-left:12px}._trigger_16o4s_1{position:fixed;width:1px;height:1px;pointer-events:none}._content_16o4s_7{min-width:160px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_16o4s_16{display:flex;align-items:center;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_16o4s_16:hover,._item_16o4s_16[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._item_16o4s_16[data-disabled]{opacity:.4;cursor:default}._danger_16o4s_33{color:var(--pi-color-statusDanger, #e5484d)}._sep_16o4s_36{height:1px;margin:4px 0;background:var(--pi-color-border, #353b46)}._strip_8jveh_1{display:flex;align-items:center;gap:2px;padding:4px 6px 0;overflow-x:auto;flex-shrink:0;border-bottom:1px solid var(--pi-color-border, #353b46)}._tab_8jveh_10{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--pi-borderRadius-md, 6px) var(--pi-borderRadius-md, 6px) 0 0;font-size:12px;cursor:pointer;color:var(--pi-color-foregroundMuted, #9aa0a6);white-space:nowrap;flex-shrink:0;-webkit-user-select:none;user-select:none}._tab_8jveh_10:hover{background:var(--pi-color-surfaceHover, #1e2124)}._active_8jveh_26{background:var(--pi-color-surfaceSunken, #111);color:var(--pi-color-foreground, #fafafa)}._icon_8jveh_30{display:flex;align-items:center;flex-shrink:0}._label_8jveh_35{max-width:160px;overflow:hidden;text-overflow:ellipsis}._close_8jveh_40{display:flex;align-items:center;border-radius:3px;padding:1px;flex-shrink:0}._close_8jveh_40:hover{background:var(--pi-color-surfaceHover, #1e2124)}._newTab_8jveh_50{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 4px;width:20px;height:20px;border-radius:var(--pi-borderRadius-sm, 4px);color:var(--pi-color-foregroundMuted, #9aa0a6);background:transparent;border:none;cursor:pointer}._newTab_8jveh_50:hover:not(:disabled){background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._newTab_8jveh_50:disabled{opacity:.4;cursor:default}._content_8jveh_73{min-width:160px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_8jveh_82{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_8jveh_82:hover,._item_8jveh_82[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._itemIcon_8jveh_96{flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._spinner_1tgzp_3{display:inline-block;border-radius:9999px;border-style:solid;border-color:currentColor transparent transparent transparent;animation:_piSpinnerRotate_1tgzp_1 .7s linear infinite;flex-shrink:0}@keyframes _piSpinnerRotate_1tgzp_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._area_1vzxd_1{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}._panel_1vzxd_7{position:absolute;top:0;right:0;bottom:0;left:0;display:none;flex-direction:column;min-height:0}._active_1vzxd_14{display:flex}._empty_1vzxd_17{display:flex;align-items:center;justify-content:center;height:100%;color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:13px}._container_yg965_1{position:relative;height:100%;display:flex;flex-direction:column}._header_yg965_7{display:flex;align-items:center;padding:6px 8px;border-bottom:1px solid var(--pi-color-border, #353b46)}._uploadButton_yg965_13{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:3px 8px;border-radius:4px;border:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #1e2124);color:var(--pi-color-foreground, #e4e6eb);cursor:pointer}._uploadButton_yg965_13:hover:not(:disabled){background:var(--pi-color-surfaceHover, #2a2e33)}._uploadButton_yg965_13:disabled{opacity:.5;cursor:default}._hiddenInput_yg965_32{display:none}._status_yg965_35,._statusError_yg965_36{font-size:11px;padding:4px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._status_yg965_35{color:var(--pi-color-foregroundMuted, #9aa0a6)}._statusError_yg965_36{color:var(--pi-color-danger, #e5534b)}._rowAction_yg965_49{margin-left:auto;display:none;align-items:center;padding:2px;border:none;background:transparent;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;border-radius:3px}._rowAction_yg965_49:hover{color:var(--pi-color-foreground, #e4e6eb);background:var(--pi-color-surface, #1e2124)}._item_yg965_64:hover ._rowAction_yg965_49{display:inline-flex}._dropOverlay_yg965_67{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--pi-color-accentBright, #a2b4d7);background:color-mix(in srgb,var(--pi-color-surface, #1e2124) 80%,transparent);border:2px dashed var(--pi-color-accentBright, #a2b4d7);border-radius:6px;pointer-events:none;z-index:2}._list_yg965_82{padding:4px 0;flex:1;overflow-y:auto;position:relative}._item_yg965_64{height:24px;padding-right:8px;font-size:12px;border-radius:3px;cursor:pointer;display:flex;align-items:center;gap:6px}._item_yg965_64:hover{background:var(--pi-color-surfaceHover, #1e2124)}._chevronSlot_yg965_101{display:flex;align-items:center;justify-content:center;width:12px;flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._chevron_yg965_101{transition:transform .1s ease}._chevronOpen_yg965_112{transform:rotate(90deg)}._icon_yg965_115{display:flex;align-items:center;width:16px;flex-shrink:0;color:var(--pi-color-foregroundMuted, #9aa0a6)}._name_yg965_122{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._dirName_yg965_127{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--pi-color-accentBright, #a2b4d7)}._statusRow_yg965_133{height:24px;display:flex;align-items:center;padding-right:8px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._statusRowError_yg965_144{color:var(--pi-color-danger, #e5534b)}._emptyState_yg965_147{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._trigger_g81d7_1{position:fixed;width:1px;height:1px;pointer-events:none}._content_g81d7_7{min-width:140px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000}._item_g81d7_16{display:flex;align-items:center;padding:6px 10px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_g81d7_16:hover,._item_g81d7_16[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._danger_g81d7_29{color:var(--pi-color-statusDanger, #e5484d)}._sep_g81d7_32{height:1px;margin:4px 0;background:var(--pi-color-border, #353b46)}._list_1pgby_1{padding:4px 0}._summary_1pgby_4{padding:4px 8px;font-size:11px;color:var(--pi-color-foregroundMuted, #9aa0a6);border-bottom:1px solid var(--pi-color-border, #353b46);margin-bottom:4px}._item_1pgby_11{padding:4px 8px;font-size:12px;border-radius:3px;cursor:pointer;display:flex;align-items:center;gap:6px}._item_1pgby_11:hover{background:var(--pi-color-surfaceHover, #1e2124)}._badge_1pgby_23{font-size:10px;padding:0 4px;border-radius:3px;font-weight:600;flex-shrink:0}._added_1pgby_30{background:color-mix(in srgb,var(--pi-color-statusSuccess, #4ade80) 20%,transparent);color:var(--pi-color-statusSuccess, #4ade80)}._modified_1pgby_34{background:color-mix(in srgb,var(--pi-color-statusWarning, #facc15) 20%,transparent);color:var(--pi-color-statusWarning, #facc15)}._deleted_1pgby_38{background:color-mix(in srgb,var(--pi-color-statusDanger, #ff8a80) 20%,transparent);color:var(--pi-color-statusDanger, #ff8a80)}._name_1pgby_42{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._emptyState_1pgby_47{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._wrap_r37ok_1{display:flex;flex-direction:column;height:100%;min-height:0}._tabBar_r37ok_7{display:flex;align-items:center;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._tabBtn_r37ok_13{font:inherit;font-size:12px;padding:8px 12px;background:none;border:none;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;border-bottom:2px solid transparent}._tabBtn_r37ok_13:hover{color:var(--pi-color-foreground, #fafafa)}._active_r37ok_26{color:var(--pi-color-foreground, #fafafa);border-bottom-color:var(--pi-color-accent, #2e5cb8)}._refreshBtn_r37ok_30{margin-left:auto;margin-right:6px}._content_r37ok_34{flex:1;overflow-y:auto;padding:8px;min-height:0}._content_17y31_4{min-width:240px;padding:4px;border-radius:var(--pi-borderRadius-md, 6px);background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);box-shadow:0 8px 24px #0006;z-index:1000;display:flex;flex-direction:column;gap:4px}._search_17y31_17{width:100%;box-sizing:border-box;padding:6px 8px;border-radius:var(--pi-radius-md, 6px);border:1px solid var(--pi-color-border, #3f3f46);background:var(--pi-color-surface2, #27272a);color:var(--pi-color-foreground, #fafafa);font-size:12px;outline:none}._search_17y31_17::placeholder{color:var(--pi-color-foregroundMuted, #9aa0a6)}._search_17y31_17:focus{border-color:var(--pi-color-accent, #2e5cb8)}._list_17y31_35{max-height:320px;overflow-y:auto}._item_17y31_40{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:4px;font-size:13px;cursor:pointer;outline:none}._item_17y31_40:hover,._item_17y31_40[data-highlighted]{background:var(--pi-color-surfaceHover, #1e2124)}._checkSlot_17y31_55{width:16px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;color:var(--pi-color-foreground, #fafafa)}._label_17y31_64{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._modelId_17y31_70{color:var(--pi-color-foregroundMuted, #9aa0a6);margin-left:4px;font-size:12px;white-space:nowrap}._state_17y31_77{display:flex;align-items:center;justify-content:center;padding:12px;color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px}._stateError_17y31_86{padding:8px;color:var(--pi-color-danger, #e5534b);font-size:12px}._statusBar_tm1j6_1{height:35px;width:100%;flex-shrink:0;display:flex;align-items:center;gap:2px;padding:0 12px;overflow-x:auto;border-top:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surface, #16181a);font-size:12px;color:var(--pi-color-foreground, #e4e6eb);white-space:nowrap}._segmentGroup_tm1j6_16{display:flex;align-items:center}._chevron_tm1j6_20{color:var(--pi-color-border, #353b46);margin:0 4px;flex-shrink:0}._segment_tm1j6_16{display:flex;align-items:center;gap:6px;padding:2px 8px;border-radius:4px;background:var(--pi-color-surfaceRaised, #1c1f22)}._icon_tm1j6_33{display:flex;align-items:center;color:var(--pi-color-foregroundMuted, #7a8394);flex-shrink:0}._modelSegment_tm1j6_39{display:flex;align-items:center;gap:5px;padding:2px 6px 2px 8px;border-radius:4px;border:1px solid var(--pi-color-border, #353b46);background:var(--pi-color-surfaceRaised, #1c1f22);color:inherit;font:inherit;cursor:pointer}._modelSegment_tm1j6_39:hover:not(:disabled){background:var(--pi-color-surfaceHover, #23262b);border-color:var(--pi-color-foregroundMuted, #7a8394)}._modelSegment_tm1j6_39[data-state=open]{background:var(--pi-color-surfaceHover, #23262b);border-color:var(--pi-color-accent, #2e5cb8)}._modelSegment_tm1j6_39:disabled{cursor:default;opacity:.6}._modelChevron_tm1j6_63{color:var(--pi-color-foregroundMuted, #7a8394);flex-shrink:0;transition:transform .15s ease;transform:rotate(180deg)}._modelSegment_tm1j6_39[data-state=open] ._modelChevron_tm1j6_63{transform:rotate(0)}._text_tm1j6_74{overflow:hidden;text-overflow:ellipsis;max-width:320px}._wrapper_131x2_3{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa)}._wrapper_131x2_3[data-disabled=true]{opacity:.5;pointer-events:none}._box_131x2_18{width:16px;height:16px;border-radius:var(--pi-radius-sm, 3px);border:1.5px solid var(--pi-color-border, #3f3f46);background-color:transparent;display:flex;align-items:center;justify-content:center;transition:background-color .1s,border-color .1s;flex-shrink:0}._box_131x2_18[data-checked=true]{background-color:var(--pi-color-accent, #2e5cb8);border-color:var(--pi-color-accent, #2e5cb8)}._checkmark_131x2_36{color:var(--pi-color-accentForeground, #ffffff)}._nativeInput_131x2_41{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}._select_vj45v_3{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);padding:8px 32px 8px 10px;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa);width:100%;outline:none;transition:border-color .1s;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23a1a1aa' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}._select_vj45v_3:focus{border-color:var(--pi-color-accent, #2e5cb8)}._select_vj45v_3:disabled{opacity:.5;cursor:not-allowed}._comboboxWrapper_vj45v_31{position:relative;width:100%}._comboboxInput_vj45v_36{width:100%;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);padding:8px 10px;font-family:var(--pi-font-ui, system-ui);font-size:var(--pi-font-size-sm, 14px);color:var(--pi-color-foreground, #fafafa);outline:none;box-sizing:border-box}._comboboxInput_vj45v_36:focus{border-color:var(--pi-color-accent, #2e5cb8)}._comboboxList_vj45v_53{position:absolute;top:100%;left:0;right:0;z-index:80;max-height:200px;overflow-y:auto;background-color:var(--pi-color-surface1, #18181b);border:1px solid var(--pi-color-border, #3f3f46);border-radius:var(--pi-radius-base, 4px);margin-top:4px;padding:4px;box-shadow:var(--pi-shadow-md, 0 4px 12px rgba(0,0,0,.4))}._comboboxOption_vj45v_69{padding:6px 8px;border-radius:var(--pi-radius-sm, 3px);font-size:var(--pi-font-size-sm, 14px);font-family:var(--pi-font-ui, system-ui);color:var(--pi-color-foreground, #fafafa);cursor:pointer;background:none;border:none;width:100%;text-align:left}._comboboxOption_vj45v_69:hover,._comboboxOptionHighlighted_vj45v_82{background-color:var(--pi-color-surface2, #27272a)}._overlay_1yaef_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:100}._contentWrapper_1yaef_7{position:fixed;top:0;right:0;bottom:0;left:0;z-index:101;display:flex;align-items:center;justify-content:center;pointer-events:none}._dialog_1yaef_16{pointer-events:auto;width:500px;max-width:90vw;max-height:70vh;background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);border-radius:var(--pi-radius-lg, 8px);display:flex;flex-direction:column;box-shadow:0 8px 32px #00000080}._header_1yaef_28{padding:12px 14px;border-bottom:1px solid var(--pi-color-border, #353b46);display:flex;align-items:center;gap:8px;flex-shrink:0}._title_1yaef_36{font-size:13px;margin:0;flex:1;color:var(--pi-color-foreground, #fafafa);font-weight:600}._closeBtn_1yaef_43{display:flex;align-items:center;background:none;border:none;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer;padding:4px;border-radius:4px}._closeBtn_1yaef_43:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._body_1yaef_57{flex:1;display:flex;flex-direction:column;min-height:0}._footer_1yaef_63{padding:10px 14px;border-top:1px solid var(--pi-color-border, #353b46);display:flex;align-items:center;gap:8px;justify-content:flex-end;flex-shrink:0}._bare_1yaef_72{border:none;background:transparent;box-shadow:none;position:relative}._bareBody_1yaef_78{border-radius:var(--pi-radius-lg, 8px);overflow:hidden}._bareCloseBtn_1yaef_82{position:absolute;top:-12px;right:-12px;display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:var(--pi-color-surface, #16181a);border:1px solid var(--pi-color-border, #353b46);border-radius:50%;color:var(--pi-color-foregroundMuted, #9aa0a6);cursor:pointer}._bareCloseBtn_1yaef_82:hover{background:var(--pi-color-surfaceHover, #1e2124);color:var(--pi-color-foreground, #fafafa)}._visuallyHidden_1yaef_101{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}._handle_1ocv1_1{position:absolute;top:0;bottom:0;width:5px;cursor:col-resize;z-index:5;background:transparent;transition:background .12s ease}._handle_1ocv1_1:hover,._handle_1ocv1_1:active{background:var(--pi-color-accent, #2e5cb8)}._pathRow_9xphl_1{padding:8px 14px;display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--pi-color-border, #353b46);flex-shrink:0}._pathInput_9xphl_9{flex:1;font-size:12px}._list_9xphl_13{flex:1;overflow-y:auto;padding:4px 0;min-height:200px;max-height:400px}._item_9xphl_20{padding:6px 14px;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--pi-color-foreground, #fafafa)}._item_9xphl_20:hover{background:var(--pi-color-surfaceHover, #1e2124)}._name_9xphl_32{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._emptyState_9xphl_37{color:var(--pi-color-foregroundMuted, #9aa0a6);font-size:12px;text-align:center;padding:20px}._shell_1m1nv_1{display:flex;flex-direction:column;height:100vh;min-height:0}._main_1m1nv_7{display:flex;flex:1 1 auto;min-height:0;overflow:hidden}._sidebarLeft_1m1nv_13{position:relative;flex-shrink:0;border-right:1px solid var(--pi-color-border, #353b46);display:flex;flex-direction:column;min-width:0}._leftHandle_1m1nv_21{right:-3px}._center_1m1nv_24{flex:1 1 auto;display:flex;flex-direction:column;min-width:0;min-height:0}._sidebarRight_1m1nv_31{position:relative;flex-shrink:0;border-left:1px solid var(--pi-color-border, #353b46);display:flex;flex-direction:column;min-width:0}._rightHandle_1m1nv_39{left:-3px}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatPanel-D1j9P-aU.js","assets/vendor-react-BoIQBqDW.js","assets/vendor-query-AtKBh_Yt.js","assets/vendor-icons-Bk3OssJx.js","assets/markdown-D9FuaV1m.js","assets/vendor-highlight-DCzuSv8g.js","assets/vendor-markdown-B8HSIhaA.js","assets/vendor--os7hw7d.js","assets/markdown-BQwXm0MF.css","assets/DiffView-DlVCPvLc.js","assets/DiffView-CRbeRztO.css","assets/vendor-overlays-UwLNGk04.js","assets/vendor-dnd-D9kA7FgH.js","assets/ChatPanel-CTnpkb2U.css","assets/FilePanel-BmlpXwsJ.js","assets/FilePanel-DIInFr3h.css","assets/TerminalPanel-DV2Ez7aG.js","assets/vendor-terminal-BhzX2_ts.js","assets/vendor-terminal-DYP7pi_n.css","assets/TerminalPanel-BQj62G6N.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
var _n=Object.defineProperty;var yn=(t,e,n)=>e in t?_n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var C=(t,e,n)=>yn(t,typeof e!="symbol"?e+"":e,n);import{r as S,j as i,d as bn}from"./vendor-react-BoIQBqDW.js";import{Q as wn,a as Sn,u as Et,b as xn,c as Ze,d as vn}from"./vendor-query-AtKBh_Yt.js";import{A as c,B as p,C as A,D as Nt,E,F as xe,G as X,H as q,I as _,J as O,K as P,L as Re,M as ue,N as ae}from"./vendor--os7hw7d.js";import{L as kn,P as In,a as Cn,b as jn,c as Tn,E as Rt,C as et,d as qt,F as En,e as Mt,f as Nn,S as Bt,G as Rn,g as qn,M as $t,X as Ue,h as tt,i as Mn,U as Bn,R as $n,j as At,k as An,l as Dn,m as On,D as Pn,n as Fn,A as zn}from"./vendor-icons-Bk3OssJx.js";import{R as qe,T as Me,P as Be,C as $e,I as Y,S as Dt,D as Hn,a as Wn,b as Ln,c as Un,d as dt,e as Ke}from"./vendor-overlays-UwLNGk04.js";import{u as Kn,a as Gn,D as Vn,c as Jn,S as Yn,h as Xn,P as Qn,b as Zn,C as es}from"./vendor-dnd-D9kA7FgH.js";import{_ as nt}from"./vendor-highlight-DCzuSv8g.js";import"./vendor-markdown-B8HSIhaA.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();const ts=new wn;function Ot(t){const e=t.trim().replace(/^#/,""),n=e.length===3?e.split("").map(s=>s+s).join(""):e;if(n.length!==6||/[^0-9a-fA-F]/.test(n))throw new Error(`Invalid hex color: ${t}`);return{r:parseInt(n.slice(0,2),16),g:parseInt(n.slice(2,4),16),b:parseInt(n.slice(4,6),16)}}function ns(t){return Math.max(0,Math.min(255,Math.round(t)))}function ss({r:t,g:e,b:n}){const s=o=>ns(o).toString(16).padStart(2,"0");return`#${s(t)}${s(e)}${s(n)}`}function os(t){const{r:e,g:n,b:s}=Ot(t),o=r=>{const a=r/255;return a<=.03928?a/12.92:((a+.055)/1.055)**2.4};return .2126*o(e)+.7152*o(n)+.0722*o(s)}function st(t,e="#18181b",n="#ffffff"){return os(t)>.45?e:n}function rs(t,e){const{r:n,g:s,b:o}=Ot(t),r=Math.max(0,Math.min(1,e));return ss({r:n+(255-n)*r,g:s+(255-s)*r,b:o+(255-o)*r})}function ke(t){const e=t.trim().replace(/^#/,"");return(e.length===3||e.length===6)&&!/[^0-9a-fA-F]/.test(e)}const H=(t,e,n,s,o,r,a,l,d,u,h)=>({50:t,100:e,200:n,300:s,400:o,500:r,600:a,700:l,800:d,900:u,950:h}),b={zinc:H("#fafafa","#f4f4f5","#e4e4e7","#d4d4d8","#a1a1aa","#71717a","#52525b","#3f3f46","#27272a","#18181b","#09090b"),gray:H("#f9fafb","#f3f4f6","#e5e7eb","#d1d5db","#9ca3af","#6b7280","#4b5563","#374151","#1f2937","#111827","#030712"),slate:H("#f8fafc","#f1f5f9","#e2e8f0","#cbd5e1","#94a3b8","#64748b","#475569","#334155","#1e293b","#0f172a","#020617"),blue:H("#eff6ff","#dbeafe","#bfdbfe","#93c5fd","#60a5fa","#3b82f6","#2563eb","#1d4ed8","#1e40af","#1e3a8a","#172554"),green:H("#f0fdf4","#dcfce7","#bbf7d0","#86efac","#4ade80","#22c55e","#16a34a","#15803d","#166534","#14532d","#052e16"),red:H("#fef2f2","#fee2e2","#fecaca","#fca5a5","#f87171","#ef4444","#dc2626","#b91c1c","#991b1b","#7f1d1d","#450a0a"),teal:H("#f0fdfa","#ccfbf1","#99f6e4","#5eead4","#2dd4bf","#14b8a6","#0d9488","#0f766e","#115e59","#134e4a","#042f2e"),amber:H("#fffbeb","#fef3c7","#fde68a","#fcd34d","#fbbf24","#f59e0b","#d97706","#b45309","#92400e","#78350f","#451a03"),yellow:H("#fefce8","#fef9c3","#fef08a","#fde047","#facc15","#eab308","#ca8a04","#a16207","#854d0e","#713f12","#422006"),purple:H("#faf5ff","#f3e8ff","#e9d5ff","#d8b4fe","#c084fc","#a855f7","#9333ea","#7e22ce","#6b21a8","#581c87","#3b0764"),orange:H("#fff7ed","#ffedd5","#fed7aa","#fdba74","#fb923c","#f97316","#ea580c","#c2410c","#9a3412","#7c2d12","#431407"),white:"#ffffff",black:"#000000"},as={statusSuccess:"#16a34a",statusDanger:"#dc2626",statusWarning:"#f59e0b",statusMerged:"#9333ea"},is={statusSuccess:"#15803d",statusDanger:"#b91c1c",statusWarning:"#d97706",statusMerged:"#7c3aed"};function cs(){return{keyword:b.purple[300],string:b.green[300],number:b.orange[300],boolean:b.orange[300],comment:b.zinc[500],function:b.blue[300],variable:b.zinc[200],type:b.teal[300],class:b.amber[300],constant:b.orange[300],operator:b.zinc[400],punctuation:b.zinc[400],tag:b.red[300],attribute:b.amber[300],property:b.blue[200],regexp:b.teal[300],escape:b.orange[200],heading:b.blue[300],link:b.blue[400],deleted:b.red[400],inserted:b.green[400]}}function ls(){return{keyword:b.purple[700],string:b.green[700],number:b.orange[700],boolean:b.orange[700],comment:b.zinc[500],function:b.blue[700],variable:b.zinc[800],type:b.teal[700],class:b.amber[700],constant:b.orange[700],operator:b.zinc[600],punctuation:b.zinc[600],tag:b.red[700],attribute:b.amber[700],property:b.blue[700],regexp:b.teal[700],escape:b.orange[700],heading:b.blue[700],link:b.blue[600],deleted:b.red[700],inserted:b.green[700]}}function Pt(t,e,n){return{background:t,foreground:e,cursor:n,cursorAccent:t,selectionBackground:"rgba(255,255,255,0.18)",black:b.zinc[900],red:b.red[500],green:b.green[500],yellow:b.amber[500],blue:b.blue[500],magenta:b.purple[500],cyan:b.teal[500],white:b.zinc[300],brightBlack:b.zinc[600],brightRed:b.red[400],brightGreen:b.green[400],brightYellow:b.amber[400],brightBlue:b.blue[400],brightMagenta:b.purple[400],brightCyan:b.teal[400],brightWhite:b.zinc[50]}}function fe(t){const e=b.zinc[50],n=st(t.accent);return{surface0:t.surface0,surface1:t.surface1,surface2:t.surface2,surface3:t.surface3,surface4:t.surface4,surfaceDiffEmpty:t.surfaceDiffEmpty,surfaceSidebar:t.surfaceSidebar,surfaceSidebarHover:t.surfaceSidebarHover,surfaceWorkspace:t.surface1,foreground:e,foregroundMuted:t.mutedForeground,accent:t.accent,accentBright:t.accentBright,accentForeground:n,destructive:t.destructive,destructiveForeground:b.white,success:t.accent,successForeground:b.white,border:t.border,borderAccent:t.borderAccent,...as,diffAddition:b.green[400],diffDeletion:b.red[500],scrollbarHandle:t.scrollbarHandle,background:t.surface0,popover:t.surface2,popoverForeground:e,primary:t.accent,secondary:t.surface2,muted:t.surface2,mutedForeground:t.mutedForeground,input:t.surface2,ring:t.accent,palette:b,syntax:cs(),terminal:Pt(t.surface0,e,t.accent)}}function ds(){const t="#1a1a1e",e="#253e6f";return{surface0:"#ffffff",surface1:"#fafafa",surface2:"#f4f4f5",surface3:"#e4e4e7",surface4:"#d4d4d8",surfaceDiffEmpty:"#f6f6f6",surfaceSidebar:"#f4f4f5",surfaceSidebarHover:"#e9e9ec",surfaceWorkspace:"#ffffff",foreground:t,foregroundMuted:"#71717a",accent:e,accentBright:"#2f4f8e",accentForeground:st(e),destructive:"#b04138",destructiveForeground:"#ffffff",success:e,successForeground:"#ffffff",border:"#e4e4e7",borderAccent:"#ececf1",...is,diffAddition:"#15803d",diffDeletion:"#b91c1c",scrollbarHandle:"#3f3f46",background:"#ffffff",popover:"#ffffff",popoverForeground:t,primary:e,secondary:"#f4f4f5",muted:"#f4f4f5",mutedForeground:"#71717a",input:"#f4f4f5",ring:e,palette:b,syntax:ls(),terminal:{...Pt("#ffffff",t,e),selectionBackground:"rgba(0,0,0,0.15)",white:"#ffffff",brightWhite:"#fafafa"}}}const us={light:"#ffffff",dark:"#3b62b0",zinc:"#808080",midnight:"#4A6BA8",claude:"#D97757",ghostty:"#8caaee"},Ft=["light","dark","zinc","midnight","claude","ghostty"];function ps(t){if(t==="light")return ds();switch(t){case"dark":return fe({surface0:"#181B1A",surface1:"#1E2120",surface2:"#272A29",surface3:"#434645",surface4:"#595B5B",surfaceDiffEmpty:"#252827",surfaceSidebar:"#141716",surfaceSidebarHover:"#1c1f1e",mutedForeground:"#A1A5A4",scrollbarHandle:"#717574",border:"#252B2A",borderAccent:"#2f3135",accent:"#2e5cb8",accentBright:"#a2b4d7",destructive:"#c64f43"});case"zinc":return fe({surface0:"#18181b",surface1:"#1f1f22",surface2:"#27272a",surface3:"#3f3f46",surface4:"#52525b",surfaceDiffEmpty:"#242427",surfaceSidebar:"#131316",surfaceSidebarHover:"#1b1b1e",mutedForeground:"#a1a1aa",scrollbarHandle:"#71717a",border:"#27272a",borderAccent:"#303036",accent:"#e4e4e7",accentBright:"#fafafa",destructive:"#c44a4a"});case"midnight":return fe({surface0:"#161820",surface1:"#1c1e27",surface2:"#252731",surface3:"#3c3e4c",surface4:"#535564",surfaceDiffEmpty:"#222430",surfaceSidebar:"#121420",surfaceSidebarHover:"#1a1c28",mutedForeground:"#9a9db0",scrollbarHandle:"#6b6e82",border:"#242636",borderAccent:"#2e3040",accent:"#3b6fcf",accentBright:"#7eaaeb",destructive:"#c44a52"});case"claude":return fe({surface0:"#1f1f1e",surface1:"#262523",surface2:"#2f2d2b",surface3:"#4a4745",surface4:"#605d5b",surfaceDiffEmpty:"#2a2826",surfaceSidebar:"#1a1918",surfaceSidebarHover:"#222120",mutedForeground:"#ada9a5",scrollbarHandle:"#78746f",border:"#2c2a27",borderAccent:"#36332f",accent:"#d97757",accentBright:"#e89a7f",destructive:"#cf513e"});case"ghostty":return fe({surface0:"#282c34",surface1:"#2f333d",surface2:"#383c48",surface3:"#4a4f5e",surface4:"#5b6175",surfaceDiffEmpty:"#323643",surfaceSidebar:"#21252d",surfaceSidebarHover:"#292d36",mutedForeground:"#c8ccd8",scrollbarHandle:"#a0a4b2",border:"#353a47",borderAccent:"#3f4454",accent:"#89b4fa",accentBright:"#b4d0fc",destructive:"#c44a55"})}}const zt={};for(const t of Ft){const e=t==="light"?"light":"dark";zt[t]={name:t,colorScheme:e,colors:ps(t),swatch:us[t]}}const fs=zt,hs={0:0,1:4,"1.5":6,2:8,3:12,4:16,6:24,8:32,12:48,16:64,20:80,24:96,32:128},Ht={xs:12,code:12,sm:14,base:16,lg:18,xl:20,"2xl":22,"3xl":26,"4xl":34},ms={normal:"400",medium:"500",semibold:"600",bold:"700"},gs={none:0,sm:2,base:4,md:6,lg:8,xl:12,"2xl":16,full:9999},_s={0:0,1:1,2:2},ys={0:0,50:.5,100:1},bs={xs:12,sm:14,md:16,lg:20},ws={diff:22},Wt='system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',Lt='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';function Ss(t){const e=t==="dark"?"rgba(0,0,0,0.55)":"rgba(24,24,27,0.12)";return{sm:{color:e,offsetX:0,offsetY:1,radius:2,elevation:1},md:{color:e,offsetX:0,offsetY:3,radius:8,elevation:4},lg:{color:e,offsetX:0,offsetY:10,radius:24,elevation:12}}}function Ut(t){const e=fs[t];return{name:t,colorScheme:e.colorScheme,colors:e.colors,spacing:hs,fontSize:{...Ht},fontFamily:{ui:Wt,mono:Lt},lineHeight:{...ws},iconSize:bs,fontWeight:ms,borderRadius:gs,borderWidth:_s,opacity:ys,shadow:Ss(e.colorScheme),swatch:e.swatch}}const xs=16,vs=10,ks=24;function Is(t,e){const n=e.themeName??t.name,s=Ut(n),o=e.uiFont&&e.uiFont.trim()!==""?e.uiFont:Wt,r=e.monoFont&&e.monoFont.trim()!==""?e.monoFont:Lt;let a={...s.fontSize};if(e.fontSize!=null){const d=Math.max(vs,Math.min(ks,e.fontSize))/xs,u=["xs","code","sm","base","lg","xl","2xl","3xl","4xl"];for(const h of u){const m=Ht[h];a[h]=Math.round(m*d)}}return{...s,fontSize:a,fontFamily:{ui:o,mono:r}}}function Cs(t){return Ut(t)}const js="dark";function Ts(t){const e={};Es(t.colors,e);for(const[n,s]of Object.entries(t.spacing))e[`--pi-spacing-${n}`]=`${s}px`;for(const[n,s]of Object.entries(t.fontSize))e[`--pi-font-size-${n}`]=`${s}px`;e["--pi-font-ui"]=t.fontFamily.ui,e["--pi-font-mono"]=t.fontFamily.mono,e["--pi-line-height-diff"]=`${t.lineHeight.diff}px`;for(const[n,s]of Object.entries(t.iconSize))e[`--pi-icon-size-${n}`]=`${s}px`;for(const[n,s]of Object.entries(t.fontWeight))e[`--pi-font-weight-${n}`]=String(s);for(const[n,s]of Object.entries(t.borderRadius))e[`--pi-radius-${n}`]=s===9999?"9999px":`${s}px`;for(const[n,s]of Object.entries(t.borderWidth))e[`--pi-border-width-${n}`]=`${s}px`;for(const[n,s]of Object.entries(t.opacity))e[`--pi-opacity-${n}`]=String(s);for(const[n,s]of Object.entries(t.shadow))if(typeof s=="string")e[`--pi-shadow-${n}`]=s;else if(s&&typeof s=="object"){const o=s;e[`--pi-shadow-${n}`]=`${o.offsetX}px ${o.offsetY}px ${o.radius}px ${o.color}`}return e["--pi-color-scheme"]=t.colorScheme,e}function Es(t,e){const{palette:n,syntax:s,terminal:o,...r}=t;for(const[a,l]of Object.entries(r))typeof l=="string"&&(e[`--pi-color-${a}`]=l);s&&Ns(s,e),o&&(e["--pi-terminal-bg"]=o.background,e["--pi-terminal-fg"]=o.foreground)}function Ns(t,e){for(const[n,s]of Object.entries(t))typeof s=="string"&&(e[`--syntax-${Rs(n)}`]=s)}function Rs(t){return t.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function qs(t){if(typeof document>"u")return;const e=document.documentElement.style;for(const[s,o]of Object.entries(t))e.setProperty(s,o);const n=t["--pi-color-scheme"];n&&document.documentElement.style.setProperty("color-scheme",n)}function Ms(t){const e=Ts(t);qs(e)}const he=c().min(1,"Asset path must not be empty"),Bs=p({accent:c().refine(ke,{message:"accent must be a valid #rrggbb hex color"}),accentBright:c().refine(ke,{message:"accentBright must be a valid #rrggbb hex color"}).optional(),accentForeground:c().refine(ke,{message:"accentForeground must be a valid #rrggbb hex color"}).optional(),swatch:c().refine(ke,{message:"swatch must be a valid #rrggbb hex color"}).optional()}),$s=p({logoLight:he,logoDark:he,logoMark:he.optional(),icon:he,splash:he.optional()}),As=p({docs:c().url().optional(),support:c().url().optional(),issues:c().url().optional(),website:c().url().optional()}).optional(),Ds=p({copyright:c().optional(),companyName:c().optional()}).optional();p({productName:c().min(1,"productName is required"),shortName:c().optional(),tagline:c().optional(),colors:Bs,assets:$s,links:As,legal:Ds});function Os(t){const e=t.accent,n=t.accentBright??rs(e,.35),s=t.accentForeground??st(e),o=t.swatch??e;return{accent:e,accentBright:n,accentForeground:s,swatch:o}}function Ps(t,e){return{...t,colors:{...t.colors,accent:e.accent,accentBright:e.accentBright,accentForeground:e.accentForeground,primary:e.accent,ring:e.accent},swatch:e.swatch}}const ut="pi-studio-appearance";function Fs(t,e){let n=l(t),s=null;function o(h){return h==="system"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":h}function r(h,m){const f=o(h),y=Cs(f);let x=Is(y,{...m,themeName:f});if(e!=null&&e.colors){const w=Os(e.colors);x=Ps(x,w)}return x}function a(){const h=JSON.stringify({mode:n.mode,settings:n.settings});t.set(ut,h)}function l(h){const m=h.get(ut);let f=js,y={};if(m)try{const w=JSON.parse(m);w.mode&&(Ft.includes(w.mode)||w.mode==="system")&&(f=w.mode),w.settings&&typeof w.settings=="object"&&(y=w.settings)}catch{}const x=r(f,y);return{mode:f,settings:y,resolvedTheme:x}}function d(){n={...n,resolvedTheme:r(n.mode,n.settings)},a()}const u={getState(){return n},setMode(h){n={...n,mode:h},d(),u.apply()},updateSettings(h){n={...n,settings:{...n.settings,...h}},d(),u.apply()},apply(){Ms(n.resolvedTheme)},listen(){if(typeof window>"u")return()=>{};const h=window.matchMedia("(prefers-color-scheme: dark)"),m=()=>{n.mode==="system"&&(d(),u.apply())};return h.addEventListener("change",m),s=()=>h.removeEventListener("change",m),s}};return u}function zs({store:t,brandConfig:e,children:n}){const s=S.useRef(null);return s.current||(s.current=Fs(t,e),s.current.apply()),S.useEffect(()=>s.current.listen(),[]),i.jsx(i.Fragment,{children:n})}const Hs={get(t){var e;try{return((e=globalThis.localStorage)==null?void 0:e.getItem(t))??null}catch{return null}},set(t,e){var n;try{(n=globalThis.localStorage)==null||n.setItem(t,e)}catch{}}};function Ws({children:t}){return i.jsx(zs,{store:Hs,children:i.jsx(Sn,{client:ts,children:t})})}const Ls="_btn_1chbg_4",Us="_secondary_1chbg_44",Ks="_outline_1chbg_53",Gs="_ghost_1chbg_62",Vs="_destructive_1chbg_72",Js="_iconOnly_1chbg_82",Ys="_loadingSpinner_1chbg_89",Xs="_piSpin_1chbg_1",Ie={btn:Ls,default:"_default_1chbg_35",secondary:Us,outline:Ks,ghost:Gs,destructive:Vs,iconOnly:Js,loadingSpinner:Ys,piSpin:Xs},pt={xs:28,sm:32,md:36,lg:40},Qs={xs:12,sm:14,md:16,lg:20},ft={xs:8,sm:10,md:12,lg:16},Zs={xs:12,sm:13,md:14,lg:15};function eo(t){const{disabled:e,loading:n}=t;return e||n?{opacity:.5,isGhostHover:!1}:{opacity:1,isGhostHover:!1}}function L({variant:t="default",size:e="md",loading:n=!1,disabled:s=!1,leftIcon:o,trailing:r,iconOnly:a=!1,children:l,style:d,className:u,...h}){const{opacity:m}=eo({disabled:s??!1,loading:n}),f=s||n,y=Qs[e];return i.jsxs("button",{className:A(Ie.btn,Ie[t],a&&Ie.iconOnly,u),disabled:f,"aria-busy":n||void 0,style:{minHeight:pt[e],paddingLeft:a?void 0:ft[e],paddingRight:a?void 0:ft[e],fontSize:Zs[e],opacity:m,...a?{width:pt[e]}:{},...d},...h,children:[n?i.jsx(kn,{className:Ie.loadingSpinner,size:y,"aria-hidden":!0}):o?i.jsx("span",{"aria-hidden":!0,style:{display:"flex",alignItems:"center",flexShrink:0},children:o}):null,l,r&&!n&&i.jsx("span",{"aria-hidden":!0,style:{display:"flex",alignItems:"center",flexShrink:0},children:r})]})}const to="_input_a7qyq_3",no="_textarea_a7qyq_32",Ge={input:to,textarea:no},Ve=S.forwardRef(function({className:e,...n},s){return i.jsx("input",{ref:s,className:A(Ge.input,e),...n})}),Sd=S.forwardRef(function({className:e,...n},s){return i.jsx("textarea",{ref:s,className:A(Ge.input,Ge.textarea,e),...n})}),Kt=c().datetime({offset:!0});c().uuid();c().regex(/^[A-Za-z0-9_-]+$/,"expected base64url");const Se=Nt([E(),Kt]),so=xe(["mobile","browser","cli","mcp"]),oo=p({type:_("hello"),clientId:c(),clientType:so,protocolVersion:E(),appVersion:c().optional(),capabilities:X(c(),q()).optional()}),ro=p({status:_("server_info"),serverId:c(),hostname:c().optional(),version:c().optional(),capabilities:X(c(),O()),features:X(c(),O())}),ao=p({type:_("status"),payload:ro}),io=p({type:_("ping"),requestId:c(),clientSentAt:Se.optional()}),co=p({type:_("pong"),requestId:c(),clientSentAt:Se.optional(),serverReceivedAt:Se,serverSentAt:Se}),Gt=xe(["initializing","idle","running","error","closed"]),Ae=p({mimeType:c().optional(),data:c().optional()}).passthrough(),lo=p({prs:P(O()).optional(),issues:P(O()).optional()}).passthrough(),uo=p({provider:c(),cwd:c(),modeId:c().optional(),model:c().optional(),modelProvider:c().optional(),thinkingOptionId:c().optional(),featureValues:X(c(),O()).optional(),title:c().nullable().optional(),approvalPolicy:c().optional(),sandboxMode:c().optional(),networkAccess:q().optional(),webSearch:q().optional(),extra:p({pi:O().optional()}).passthrough().optional(),systemPrompt:c().optional(),mcpServers:X(c(),O()).optional()}),po=p({type:_("create_agent_request"),requestId:c(),config:uo,env:X(c(),c()).optional(),workspaceId:c().optional(),worktreeName:c().optional(),initialPrompt:c().optional(),clientMessageId:c().optional(),outputSchema:X(c(),O()).optional(),images:P(Ae).optional(),attachments:lo.optional(),git:O().optional(),worktree:O().optional(),autoArchive:q().optional(),labels:X(c(),c()).default({})}),fo=p({type:_("create_agent_response"),requestId:c(),payload:p({agentId:c()}).passthrough()}),ho=p({type:_("agent_update"),agentId:c(),status:Gt.optional(),title:c().nullable().optional(),labels:X(c(),c()).optional()}),mo=p({type:_("agent_status"),agentId:c(),status:Gt}),go=p({type:_("agent_list"),agents:P(p({id:c()}).passthrough())}),_o=p({type:_("agent_deleted"),agentId:c()}),yo=p({type:_("agent_archived"),agentId:c(),archivedAt:Kt.optional()}),Vt=Re("kind",[p({kind:_("shell"),command:c().optional(),output:c().optional()}),p({kind:_("read"),path:c().optional(),output:c().optional()}),p({kind:_("edit"),path:c().optional(),diff:c().optional(),output:c().optional()}),p({kind:_("write"),path:c().optional(),output:c().optional()}),p({kind:_("search"),query:c().optional(),output:c().optional()}),p({kind:_("fetch"),url:c().optional(),output:c().optional()}),p({kind:_("task"),description:c().optional(),output:c().optional()})]),bo=Re("kind",[p({kind:_("user_message"),messageId:c().optional(),text:c().optional(),images:P(Ae).optional()}),p({kind:_("assistant_message"),messageId:c().optional(),text:c().optional()}),p({kind:_("reasoning"),text:c().optional()}),p({kind:_("tool_call"),callId:c().optional(),tool:Vt,status:c().optional()}),p({kind:_("turn_started"),turnId:c().optional()}),p({kind:_("turn_completed"),turnId:c().optional()}),p({kind:_("turn_failed"),turnId:c().optional(),error:c().optional()}),p({kind:_("turn_canceled"),turnId:c().optional()}),p({kind:_("error"),message:c().optional()}),p({kind:_("queue_update"),steering:P(c()).optional(),followUp:P(c()).optional()})]),wo=p({type:_("agent_stream"),agentId:c(),seq:E().optional(),timestamp:Se.optional(),event:bo}),So=xe(["before","after"]),xo=p({start:E(),end:E()}),vo=p({type:_("fetch_agent_timeline_request"),requestId:c(),agentId:c(),cursor:c().nullable().optional(),direction:So,limit:E().optional()}),ko=p({type:_("fetch_agent_timeline_response"),requestId:c(),agentId:c().optional(),items:P(O()),seqStart:E(),seqEnd:E(),sourceSeqRanges:P(xo),collapsed:q(),hasNewer:q(),startCursor:c().nullable().optional(),endCursor:c().nullable().optional()}),Io=p({type:_("agent_permission_request"),requestId:c(),agentId:c(),toolName:c().optional(),tool:Vt.optional(),action:O().optional(),responses:P(c()).optional()}),Co=p({type:_("agent_permission_resolved"),requestId:c(),agentId:c(),decision:c().optional()}),jo=p({type:_("agent.permission.respond.request"),requestId:c(),permissionRequestId:c(),response:O()}),To=p({type:_("agent.permission.respond.response"),requestId:c(),payload:p({resolved:q()}).passthrough()}),Eo=p({type:_("respond_to_permission"),requestId:c(),permissionRequestId:c(),response:O()}),Jt=xe(["conversation","files","both"]),No=p({type:_("agent.rewind.request"),requestId:c(),agentId:c(),messageId:c(),mode:Jt}).passthrough(),Ro=p({type:_("agent.rewind.response"),requestId:c(),payload:p({agentId:c(),messageId:c(),mode:Jt,truncatedAt:c().optional()}).passthrough()}).passthrough(),qo=p({input:E().optional(),output:E().optional(),cacheRead:E().optional(),cacheWrite:E().optional(),total:E().optional()}).passthrough(),Mo=p({tokens:E().nullable().optional(),contextWindow:E().optional(),percent:E().nullable().optional()}).passthrough(),Bo=p({type:_("agent_session_stats_request"),requestId:c(),agentId:c()}).passthrough(),$o=p({type:_("agent_session_stats_response"),requestId:c(),payload:p({sessionId:c().optional(),sessionFile:c().optional(),userMessages:E().optional(),assistantMessages:E().optional(),toolCalls:E().optional(),toolResults:E().optional(),totalMessages:E().optional(),tokens:qo.optional(),cost:E().optional(),contextUsage:Mo.optional(),model:c().optional()}).passthrough()}).passthrough(),Ao=p({type:_("agent_compact_request"),requestId:c(),agentId:c(),customInstructions:c().optional()}).passthrough(),Do=p({type:_("agent_compact_response"),requestId:c(),payload:p({summary:c().optional(),firstKeptEntryId:c().optional(),tokensBefore:E().optional(),details:O().optional()}).passthrough()}).passthrough(),Oo=p({type:_("agent_new_session_request"),requestId:c(),agentId:c()}).passthrough(),Po=p({type:_("agent_new_session_response"),requestId:c(),payload:p({cancelled:q()}).passthrough()}).passthrough(),Fo=p({type:_("agent_switch_session_request"),requestId:c(),agentId:c(),sessionPath:c()}).passthrough(),zo=p({type:_("agent_switch_session_response"),requestId:c(),payload:p({cancelled:q()}).passthrough()}).passthrough(),Ho=p({type:_("agent_fork_request"),requestId:c(),agentId:c(),entryId:c()}).passthrough(),Wo=p({type:_("agent_fork_response"),requestId:c(),payload:p({text:c(),cancelled:q()}).passthrough()}).passthrough(),Lo=p({type:_("agent_fork_messages_request"),requestId:c(),agentId:c()}).passthrough(),Uo=p({type:_("agent_fork_messages_response"),requestId:c(),payload:p({messages:P(p({entryId:c(),text:c()}).passthrough())}).passthrough()}).passthrough(),Ko=p({type:_("agent_clone_request"),requestId:c(),agentId:c()}).passthrough(),Go=p({type:_("agent_clone_response"),requestId:c(),payload:p({cancelled:q()}).passthrough()}).passthrough(),Vo=p({type:_("agent_set_session_name_request"),requestId:c(),agentId:c(),name:c()}).passthrough(),Jo=p({type:_("agent_set_session_name_response"),requestId:c(),payload:p({}).passthrough().optional()}).passthrough(),Yo=p({type:_("agent_export_html_request"),requestId:c(),agentId:c(),outputPath:c().optional()}).passthrough(),Xo=p({type:_("agent_export_html_response"),requestId:c(),payload:p({path:c()}).passthrough()}).passthrough(),Qo=p({type:_("agent_set_model_request"),requestId:c(),agentId:c(),provider:c(),modelId:c()}).passthrough(),Zo=p({type:_("agent_set_model_response"),requestId:c(),payload:p({}).passthrough()}).passthrough(),er=p({type:_("agent_cycle_model_request"),requestId:c(),agentId:c()}).passthrough(),tr=p({type:_("agent_cycle_model_response"),requestId:c(),payload:p({model:O().nullable().optional(),thinkingLevel:c().optional(),isScoped:q().optional()}).passthrough()}).passthrough(),nr=p({type:_("agent_last_assistant_text_request"),requestId:c(),agentId:c()}).passthrough(),sr=p({type:_("agent_last_assistant_text_response"),requestId:c(),payload:p({text:c().nullable()}).passthrough()}).passthrough(),or=p({type:_("steer_agent_request"),requestId:c(),agentId:c(),message:c(),images:P(Ae).optional(),clientMessageId:c().optional()}).passthrough(),rr=p({type:_("steer_agent_response"),requestId:c(),agentId:c(),ok:q()}).passthrough(),ar=p({type:_("follow_up_agent_request"),requestId:c(),agentId:c(),message:c(),images:P(Ae).optional(),clientMessageId:c().optional()}).passthrough(),ir=p({type:_("follow_up_agent_response"),requestId:c(),agentId:c(),ok:q()}).passthrough(),cr=p({type:_("rpc_error"),requestId:c(),code:c().optional(),message:c().optional(),error:c().optional()}),lr=Re("type",[po,fo,ho,mo,go,_o,yo,wo,vo,ko,Io,Co,jo,To,Eo,No,Ro,Bo,$o,Ao,Do,Oo,Po,Fo,zo,Ho,Wo,Lo,Uo,Ko,Go,Vo,Jo,Yo,Xo,Qo,Zo,er,tr,nr,sr,or,rr,ar,ir,cr]),dr=p({type:c()}).passthrough(),ur=p({type:_("session"),message:Nt([lr,dr])});Re("type",[oo,ao,io,co,ur]);const ce={Output:1,Input:2,Resize:3,Snapshot:4,Restore:5},pr=Object.fromEntries(Object.entries(ce).map(([t,e])=>[e,t])),Yt=p({rows:E().int().nonnegative(),cols:E().int().nonnegative()});class ye extends Error{constructor(e){super(e),this.name="TerminalFrameError"}}const fr=new TextEncoder,hr=new TextDecoder;function mr(t){if(!Number.isInteger(t)||t<0||t>255)throw new ye(`slot must be an integer 0–255, got ${t}`)}function me(t,e,n){const s=new Uint8Array(2+n.length);return s[0]=t,s[1]=e,s.set(n,2),s}function xd(t){switch(mr(t.slot),t.opcode){case"Output":return me(ce.Output,t.slot,t.data);case"Input":return me(ce.Input,t.slot,t.data);case"Snapshot":return me(ce.Snapshot,t.slot,t.data);case"Restore":return me(ce.Restore,t.slot,t.data);case"Resize":{const e=JSON.stringify(Yt.parse({rows:t.rows,cols:t.cols}));return me(ce.Resize,t.slot,fr.encode(e))}}}function gr(t){if(t.length<2)throw new ye(`frame too short: ${t.length} bytes (need ≥ 2)`);const e=t[0],n=t[1],s=pr[e];if(!s)throw new ye(`unknown terminal opcode 0x${e.toString(16)}`);const o=t.subarray(2);if(s==="Resize"){let r;try{r=JSON.parse(hr.decode(o))}catch{throw new ye("resize payload is not valid JSON")}const a=Yt.safeParse(r);if(!a.success)throw new ye("resize payload is not { rows, cols }");return{opcode:"Resize",slot:n,rows:a.data.rows,cols:a.data.cols}}return{opcode:s,slot:n,data:o.slice()}}const de={Begin:16,Chunk:17,End:18,Error:19},_r=Object.fromEntries(Object.entries(de).map(([t,e])=>[e,t])),Xt=p({transferId:c(),fileName:c().optional(),mimeType:c().optional(),totalBytes:E().int().nonnegative().optional()});class be extends Error{constructor(e){super(e),this.name="FileTransferFrameError"}}const ht=new TextEncoder,mt=new TextDecoder;function yr(t){if(!Number.isInteger(t)||t<0||t>255)throw new be(`stream must be an integer 0–255, got ${t}`)}function Ce(t,e,n){const s=new Uint8Array(2+n.length);return s[0]=t,s[1]=e,s.set(n,2),s}function Fe(t){switch(yr(t.stream),t.opcode){case"Begin":return Ce(de.Begin,t.stream,ht.encode(JSON.stringify(Xt.parse(t.meta))));case"Chunk":return Ce(de.Chunk,t.stream,t.data);case"End":return Ce(de.End,t.stream,new Uint8Array([t.ok?1:0]));case"Error":return Ce(de.Error,t.stream,ht.encode(t.message))}}function br(t){if(t.length<2)throw new be(`frame too short: ${t.length} bytes (need ≥ 2)`);const e=t[0],n=t[1],s=_r[e];if(!s)throw new be(`unknown file-transfer opcode 0x${e.toString(16)}`);const o=t.subarray(2);switch(s){case"Begin":{let r;try{r=JSON.parse(mt.decode(o))}catch{throw new be("begin payload is not valid JSON")}const a=Xt.safeParse(r);if(!a.success)throw new be("begin payload is not a valid transfer header");return{opcode:"Begin",stream:n,meta:a.data}}case"Chunk":return{opcode:"Chunk",stream:n,data:o.slice()};case"End":return{opcode:"End",stream:n,ok:(o[0]??1)!==0};case"Error":return{opcode:"Error",stream:n,message:mt.decode(o)}}}function wr(t){try{return br(t)}catch{return null}}const Sr=c().regex(/^[a-z][a-z0-9-]*$/,"invalid provider id"),xr=xe(["safe","moderate","dangerous","planning"]),vr=p({supportsStreaming:q(),supportsSessionPersistence:q(),supportsDynamicModes:q(),supportsMcpServers:q(),supportsReasoningStream:q(),supportsToolInvocations:q(),supportsRewindConversation:q().optional(),supportsRewindFiles:q().optional(),supportsRewindBoth:q().optional(),supportsSteering:q().optional()}).passthrough(),kr=p({id:c(),label:c().optional(),description:c().optional(),icon:c().optional(),colorTier:xr});p({id:Sr,label:c(),description:c().optional(),extends:c().optional(),modes:P(kr),capabilities:vr});function Je(t){return typeof t=="string"?t:t instanceof Uint8Array||Buffer.isBuffer(t)?t.toString("utf8"):String(t??"")}function Qt(t){let e=null;const n={onMessage:null,onClose:null,onError:null,get isOpen(){return e!==null&&e.readyState===1},connect(s){return new Promise((o,r)=>{const a=t??(()=>new WebSocket(s));try{e=t?a(s):new WebSocket(s)}catch(l){r(l);return}e.onopen=()=>o(),e.onerror=l=>{var d;(e==null?void 0:e.readyState)!==1&&r(l),(d=n.onError)==null||d.call(n,l)},e.onclose=l=>{var d;(d=n.onClose)==null||d.call(n,l.code,Je(l.reason))},e.onmessage=l=>{var u,h,m,f;const{data:d}=l;d instanceof ArrayBuffer||d instanceof Uint8Array?(u=n.onMessage)==null||u.call(n,d):typeof d=="string"?(h=n.onMessage)==null||h.call(n,d):typeof Blob<"u"&&d instanceof Blob?(m=n.onMessage)==null||m.call(n,d):Buffer.isBuffer(d)&&((f=n.onMessage)==null||f.call(n,d.buffer.slice(d.byteOffset,d.byteOffset+d.byteLength)))}})},sendText(s){e==null||e.send(s)},sendBinary(s){e==null||e.send(s)},close(s=1e3,o=""){e==null||e.close(s,o),e=null}};return n}const we="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function Zt(t){let e="";for(let n=0;n<t.length;n+=3){const s=t[n],o=n+1<t.length,r=n+2<t.length,a=o?t[n+1]:0,l=r?t[n+2]:0;e+=we[s>>2],e+=we[(s&3)<<4|a>>4],e+=o?we[(a&15)<<2|l>>6]:"=",e+=r?we[l&63]:"="}return e}function en(t){const e=t.replace(/=+$/,""),n=[];let s=0,o=0;for(const r of e){const a=we.indexOf(r);if(a===-1)throw new Error(`invalid base64 character: ${JSON.stringify(r)}`);s=s<<6|a,o+=6,o>=8&&(o-=8,n.push(s>>o&255))}return new Uint8Array(n)}function Ir(t){try{const e=JSON.parse(t);return!e||typeof e.type!="string"?null:e}catch{return null}}const Ne=24;function tn(t,e){const n=ue.randomBytes(Ne),s=ue.box.after(t,n,e),o=new Uint8Array(n.length+s.length);return o.set(n,0),o.set(s,n.length),Zt(o)}function nn(t,e){let n;try{n=en(t)}catch{return null}if(n.length<Ne)return null;const s=n.slice(0,Ne),o=n.slice(Ne);return ue.box.open.after(o,s,e)}function Cr(t,e){return tn(new TextEncoder().encode(t),e)}function jr(t,e){const n=nn(t,e);return n?new TextDecoder().decode(n):null}function Tr(t,e,n,s,o,r){let a=!1;return n.onClose(l=>{var d;a=!0,(d=s.onClose)==null||d.call(s,l)}),{handleAppFrame(l){var h,m;if(a)return;const d=o();if(!r()||!d)return;const u=jr(l.frame,d);if(u===null){(h=s.onAuthError)==null||h.call(s,new Error(`relay ${t} channel: message failed authentication`));return}(m=s.onMessage)==null||m.call(s,u)},handleBinaryFrame(l){var h,m;if(a)return;const d=o();if(!r()||!d)return;const u=nn(l.frame,d);if(u===null){(h=s.onAuthError)==null||h.call(s,new Error(`relay ${t} channel: binary message failed authentication`));return}(m=s.onBinaryMessage)==null||m.call(s,u)},send(l){if(a)throw new Error(`relay ${t} channel: cannot send after close()`);const d=o();if(!r()||!d)throw new Error(`relay ${t} channel: cannot send before the E2EE handshake completes`);n.send(JSON.stringify({type:"e2ee_app",frame:Cr(l,d)}))},sendBinary(l){if(a)throw new Error(`relay ${t} channel: cannot send after close()`);const d=o();if(!r()||!d)throw new Error(`relay ${t} channel: cannot send before the E2EE handshake completes`);n.send(JSON.stringify({type:"e2ee_bin",frame:tn(l,d)}))},close(){a||(a=!0,n.close())}}}function Er(t){const{transport:e,attachment:n,daemonPublicKey:s}=t,o=t.events??{},r=ue.box.keyPair(),a=ue.box.before(s,r.secretKey);let l=!1;const d=Tr("client",n,e,o,()=>a,()=>l);return e.onMessage(u=>{var m;const h=Ir(u);if(h){if(h.type==="e2ee_ready"){if(l)return;l=!0,(m=o.onReady)==null||m.call(o);return}if(h.type==="e2ee_app"){d.handleAppFrame(h);return}h.type==="e2ee_bin"&&d.handleBinaryFrame(h)}}),e.send(JSON.stringify({type:"e2ee_hello",ephemeralPublicKey:Zt(r.publicKey)})),{role:"client",attachment:n,get ready(){return l},send:d.send,sendBinary:d.sendBinary,close:d.close}}const Nr=16;function Rr(t){const e=ue.hash(t);let n="";for(let s=0;s<Nr;s++)n+=e[s].toString(16).padStart(2,"0");return n}function qr(t){const e=t.useTls?"wss":"ws",n=t.endpoint.replace(/^(?:https?|wss?):\/\//,"").replace(/\/+$/,"");return`${e}://${n}`}function Mr(t){let e=null,n=null;const s=t.sessionId??Rr(t.daemonPublicKey),o={onMessage:null,onClose:null,onError:null,get isOpen(){return e!==null&&e.readyState===1&&n!==null&&n.ready},connect(r){return new Promise((a,l)=>{const d=t.factory??(()=>new WebSocket(r));try{e=t.factory?d(r):new WebSocket(r)}catch(f){l(f);return}const u=e,h=[],m=[];u.onopen=()=>{u.send(JSON.stringify({type:"relay_register",sessionId:s})),n=Er({transport:{send:f=>u.send(f),onMessage:f=>h.push(f),onClose:f=>m.push(f),close:()=>u.close()},attachment:{sessionId:s},daemonPublicKey:t.daemonPublicKey,events:{onReady:()=>a(),onMessage:f=>{var y;return(y=o.onMessage)==null?void 0:y.call(o,f)},onBinaryMessage:f=>{var y;return(y=o.onMessage)==null?void 0:y.call(o,f.slice().buffer)},onAuthError:f=>{var y;return(y=o.onError)==null?void 0:y.call(o,f)}}})},u.onerror=f=>{var y;u.readyState!==1&&l(f),(y=o.onError)==null||y.call(o,f)},u.onclose=f=>{var y;for(const x of m)x(Je(f.reason));(y=o.onClose)==null||y.call(o,f.code,Je(f.reason))},u.onmessage=f=>{const{data:y}=f;if(typeof y=="string")for(const x of h)x(y)}})},sendText(r){if(!n||!n.ready)throw new Error("relay transport: cannot send before the E2EE handshake completes");n.send(r)},sendBinary(r){if(!n||!n.ready)throw new Error("relay transport: cannot send before the E2EE handshake completes");n.sendBinary(r)},close(r=1e3,a=""){n==null||n.close(),n=null,e==null||e.close(r,a),e=null}};return o}function Br(t){const e=t.indexOf("#"),n=e===-1?t:t.slice(e+1),s=new URLSearchParams(n),o=s.get("offer");if(!o)return null;let r;try{r=en(o)}catch{return null}const a=s.get("relay");if(a){const d={endpoint:a,useTls:s.get("relayTls")==="1"};return{publicKeyB64:o,publicKey:r,relay:d}}const l=s.get("host")??void 0;return{publicKeyB64:o,publicKey:r,...l?{host:l}:{}}}const $r=1;function Ye(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`id-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}class Ar extends Error{constructor(e,n,s){super(e),this.requestId=n,this.code=s,this.name="RpcError"}}class gt extends Error{constructor(e){super(`RPC ${e} timed out`),this.requestId=e,this.name="RpcTimeoutError"}}class Dr{constructor(e){C(this,"transport");C(this,"rpcTimeoutMs");C(this,"now");C(this,"_state","idle");C(this,"_serverId",null);C(this,"_features",{});C(this,"_serverCapabilities",{});C(this,"pending",new Map);C(this,"sessionHandlers",new Set);C(this,"terminalHandlers",new Set);C(this,"fileTransferHandlers",new Set);C(this,"stateHandlers",new Set);C(this,"helloResolve",null);C(this,"helloReject",null);this.options=e,this.transport=e.transport??Qt(),this.rpcTimeoutMs=e.rpcTimeoutMs??3e4,this.now=e.now??(()=>Date.now()),this.transport.onMessage=n=>this.handleIncoming(n),this.transport.onClose=(n,s)=>this.handleClose(n,s),this.transport.onError=()=>{}}get state(){return this._state}get serverId(){return this._serverId}get features(){return this._features}get serverCapabilities(){return this._serverCapabilities}hasFeature(e){return!!this._features[e]}async connect(){this.setState("connecting"),await this.transport.connect(this.options.url);const e=new Promise((s,o)=>{this.helloResolve=s,this.helloReject=o});this.transport.sendText(JSON.stringify({type:"hello",clientId:this.options.clientId,clientType:this.options.clientType,protocolVersion:this.options.protocolVersion??$r,appVersion:this.options.appVersion,capabilities:this.options.capabilities}));const n=await e;return this._serverId=n.serverId,this._features=n.features,this._serverCapabilities=n.capabilities,this.setState("open"),n}close(e=1e3,n=""){this.setState("closing"),this.transport.close(e,n)}request(e,n={},s){const o=n.requestId??Ye();return new Promise((r,a)=>{const l=s??this.rpcTimeoutMs,d=l>0?setTimeout(()=>{this.pending.delete(o),a(new gt(o))},l):null;this.pending.set(o,{resolve:u=>r(u),reject:a,timer:d}),this.sendSession({type:e,...n,requestId:o})})}sendSession(e){this.transport.sendText(JSON.stringify({type:"session",message:e}))}sendBinary(e){this.transport.sendBinary(e)}ping(e=1e4){const n=Ye();return new Promise((s,o)=>{const r=e>0?setTimeout(()=>{this.pending.delete(n),o(new gt(n))},e):null;this.pending.set(n,{resolve:()=>s(),reject:o,timer:r}),this.transport.sendText(JSON.stringify({type:"ping",requestId:n,clientSentAt:this.now()}))})}onSessionMessage(e){return this.sessionHandlers.add(e),()=>this.sessionHandlers.delete(e)}onTerminalFrame(e){return this.terminalHandlers.add(e),()=>this.terminalHandlers.delete(e)}onFileTransferFrame(e){return this.fileTransferHandlers.add(e),()=>this.fileTransferHandlers.delete(e)}onStateChange(e){return this.stateHandlers.add(e),()=>this.stateHandlers.delete(e)}setState(e){if(this._state!==e){this._state=e;for(const n of this.stateHandlers)n(e)}}handleClose(e,n){this.helloReject&&(this.helloReject(new Error(`socket closed during handshake: ${n}`)),this.helloResolve=null,this.helloReject=null);for(const[,s]of this.pending)s.timer&&clearTimeout(s.timer),s.reject(new Error(`socket closed: ${n}`));this.pending.clear(),this.setState("closed")}handleIncoming(e){if(typeof e=="string"){this.handleTextFrame(e);return}if(e instanceof ArrayBuffer){this.handleBinaryFrame(new Uint8Array(e));return}typeof e.arrayBuffer=="function"&&e.arrayBuffer().then(n=>this.handleBinaryFrame(new Uint8Array(n)))}handleBinaryFrame(e){const n=e[0];if(n!==void 0&&Object.values(de).includes(n)){const r=wr(e);if(!r)return;for(const a of this.fileTransferHandlers)a(r);return}const o=gr(e);for(const r of this.terminalHandlers)r(o)}handleTextFrame(e){let n;try{n=JSON.parse(e)}catch{return}const s=n;switch(s.type){case"status":this.handleStatus(s);return;case"pong":this.resolvePending(s.requestId,void 0);return;case"ping":this.transport.sendText(JSON.stringify({type:"pong",requestId:s.requestId,serverReceivedAt:this.now(),serverSentAt:this.now()}));return;case"session":this.handleSession(s.message);return;default:return}}handleStatus(e){const n=e.payload;(n==null?void 0:n.status)==="server_info"&&this.helloResolve&&(this.helloResolve(n),this.helloResolve=null,this.helloReject=null)}handleSession(e){if(!e||typeof e!="object")return;const n=e;if(n.type==="rpc_error"&&typeof n.requestId=="string"){const s=this.pending.get(n.requestId);s&&(s.timer&&clearTimeout(s.timer),this.pending.delete(n.requestId),s.reject(new Ar(n.message??n.error??"RPC failed",n.requestId,n.code)));return}if(typeof n.requestId=="string"&&this.pending.has(n.requestId)){const s="payload"in n?n.payload:n;this.resolvePending(n.requestId,s)}for(const s of this.sessionHandlers)s(e)}resolvePending(e,n){const s=this.pending.get(e);s&&(s.timer&&clearTimeout(s.timer),this.pending.delete(e),s.resolve(n))}}class Or{constructor(e){this.daemon=e}get connection(){return this.daemon}async createAgent(e){return await this.daemon.request("create_agent_request",{...e})}agent(e){return new Fr(this.daemon,e)}workspace(e){return new zr(this.daemon,e)}get providers(){return new Hr(this.daemon)}onAgentUpdate(e){return this.daemon.onSessionMessage(n=>{n.type==="agent_update"&&e(n)})}onWorkspaceUpdate(e){return this.daemon.onSessionMessage(n=>{n.type==="workspace_update"&&e(n)})}}class Pr{constructor(e,n){this.daemon=e,this.agentId=n}fetch(e={}){return this.daemon.request("fetch_agent_timeline_request",{agentId:this.agentId,cursor:e.cursor,direction:e.direction,limit:e.limit})}subscribe(e){return this.daemon.onSessionMessage(n=>{const s=n;s.type==="agent_stream"&&s.agentId===this.agentId&&s.event&&e(s.event)})}}class Fr{constructor(e,n){C(this,"timeline");this.daemon=e,this.agentId=n,this.timeline=new Pr(e,n)}send(e,n={}){return this.daemon.request("send_agent_prompt",{agentId:this.agentId,prompt:e,clientMessageId:n.clientMessageId,images:n.images})}run(e,n){return this.send(e,n)}interrupt(){return this.daemon.request("interrupt_agent",{agentId:this.agentId})}steer(e,n={}){return this.daemon.request("steer_agent_request",{agentId:this.agentId,message:e,clientMessageId:n.clientMessageId,images:n.images})}followUp(e,n={}){return this.daemon.request("follow_up_agent_request",{agentId:this.agentId,message:e,clientMessageId:n.clientMessageId,images:n.images})}update(e){return this.daemon.request("update_agent",{agentId:this.agentId,...e})}resume(){return this.daemon.request("resume_agent",{agentId:this.agentId})}archive(){return this.daemon.request("archive_agent",{agentId:this.agentId})}delete(){return this.daemon.request("delete_agent",{agentId:this.agentId})}onUpdate(e){return this.daemon.onSessionMessage(n=>{const s=n;s.type==="agent_update"&&s.agentId===this.agentId&&e(s)})}sessionStats(){return this.daemon.request("agent_session_stats_request",{agentId:this.agentId})}compact(e){return this.daemon.request("agent_compact_request",{agentId:this.agentId,customInstructions:e})}newSession(){return this.daemon.request("agent_new_session_request",{agentId:this.agentId})}switchSession(e){return this.daemon.request("agent_switch_session_request",{agentId:this.agentId,sessionPath:e})}fork(e){return this.daemon.request("agent_fork_request",{agentId:this.agentId,entryId:e})}forkMessages(){return this.daemon.request("agent_fork_messages_request",{agentId:this.agentId})}clone(){return this.daemon.request("agent_clone_request",{agentId:this.agentId})}setSessionName(e){return this.daemon.request("agent_set_session_name_request",{agentId:this.agentId,name:e})}exportHtml(e){return this.daemon.request("agent_export_html_request",{agentId:this.agentId,outputPath:e})}setModel(e,n){return this.daemon.request("agent_set_model_request",{agentId:this.agentId,provider:e,modelId:n})}cycleModel(){return this.daemon.request("agent_cycle_model_request",{agentId:this.agentId})}lastAssistantText(){return this.daemon.request("agent_last_assistant_text_request",{agentId:this.agentId})}}class zr{constructor(e,n){this.daemon=e,this.workspaceId=n}onUpdate(e){return this.daemon.onSessionMessage(n=>{const s=n;s.type==="workspace_update"&&s.workspaceId===this.workspaceId&&e(s)})}}class Hr{constructor(e){this.daemon=e}listProviders(){return this.daemon.request("list_providers",{})}listModels(e){return this.daemon.request("list_provider_models",{provider:e})}listModes(e){return this.daemon.request("list_provider_modes",{provider:e})}resolveDefaultModel(e,n){return this.daemon.request("resolve_default_model",{provider:e,...n?{cwd:n}:{}})}refreshSnapshot(){return this.daemon.request("providers.snapshot.refresh.request",{})}}const _t=32*1024;function Wr(t){const e=t.reduce((o,r)=>o+r.length,0),n=new Uint8Array(e);let s=0;for(const o of t)n.set(o,s),s+=o.length;return n}class Lr{constructor(e){C(this,"pending",new Map);C(this,"nextStream",1);C(this,"detach",null);this.daemon=e}start(){this.detach||(this.detach=this.daemon.onFileTransferFrame(e=>this.dispatch(e)))}stop(){var e;(e=this.detach)==null||e.call(this),this.detach=null;for(const[n,s]of this.pending)s.reject(new Error("file transfer router stopped")),this.pending.delete(n)}async download(e){const n=await this.daemon.request("file_download_token_request",{path:e});if(!n.ok||!n.token)throw new Error(n.error??"failed to issue download token");const s=this.nextStream++,o=new Promise((a,l)=>{this.pending.set(s,{chunks:[],meta:{},resolve:a,reject:l})}),r=await this.daemon.request("file_download_request",{token:n.token,stream:s});if(!r.ok)throw this.pending.delete(s),new Error(r.error??"download request failed");return o}async upload(e,n){const s=Ye(),o=await this.daemon.request("file_upload_request",{path:e,transferId:s});if(!o.ok||o.stream===void 0)throw new Error(o.error??"upload request failed");const r=o.stream;this.daemon.sendBinary(Fe({opcode:"Begin",stream:r,meta:{transferId:s}}));for(let a=0;a<n.length;a+=_t){const l=n.subarray(a,a+_t);this.daemon.sendBinary(Fe({opcode:"Chunk",stream:r,data:l}))}this.daemon.sendBinary(Fe({opcode:"End",stream:r,ok:!0}))}dispatch(e){const n=this.pending.get(e.stream);if(n)switch(e.opcode){case"Begin":n.meta.fileName=e.meta.fileName,n.meta.mimeType=e.meta.mimeType;return;case"Chunk":n.chunks.push(e.data);return;case"End":this.pending.delete(e.stream),e.ok?n.resolve({bytes:Wr(n.chunks),...n.meta}):n.reject(new Error("download failed"));return;case"Error":this.pending.delete(e.stream),n.reject(new Error(e.message));return}}}class Ur{constructor(e,n={}){C(this,"initialDelayMs");C(this,"maxDelayMs");C(this,"factor");C(this,"jitter");C(this,"maxAttempts");C(this,"setTimer");C(this,"clearTimer");C(this,"random");C(this,"attempt",0);C(this,"timer",null);C(this,"active",!1);C(this,"detachState",null);C(this,"reconnectedHandlers",new Set);C(this,"failedHandlers",new Set);this.daemon=e,this.initialDelayMs=n.initialDelayMs??500,this.maxDelayMs=n.maxDelayMs??3e4,this.factor=n.factor??2,this.jitter=n.jitter??.2,this.maxAttempts=n.maxAttempts??Number.POSITIVE_INFINITY,this.setTimer=n.setTimer??((s,o)=>setTimeout(s,o)),this.clearTimer=n.clearTimer??(s=>clearTimeout(s)),this.random=n.random??Math.random}delayForAttempt(e){const n=Math.min(this.maxDelayMs,this.initialDelayMs*this.factor**(e-1)),s=n*this.jitter*(this.random()*2-1);return Math.max(0,Math.round(n+s))}onReconnected(e){return this.reconnectedHandlers.add(e),()=>this.reconnectedHandlers.delete(e)}onReconnectFailed(e){return this.failedHandlers.add(e),()=>this.failedHandlers.delete(e)}start(){this.active||(this.active=!0,this.detachState=this.daemon.onStateChange(e=>{e==="closed"&&this.active&&this.scheduleReconnect(),e==="open"&&(this.attempt=0)}))}stop(){var e;this.active=!1,this.timer&&this.clearTimer(this.timer),this.timer=null,(e=this.detachState)==null||e.call(this),this.detachState=null}get attemptCount(){return this.attempt}scheduleReconnect(){if(!this.active||this.attempt>=this.maxAttempts)return;this.attempt+=1;const e=this.delayForAttempt(this.attempt);this.timer=this.setTimer(()=>{this.timer=null,this.tryReconnect()},e)}async tryReconnect(){if(!this.active)return;const e=this.attempt;try{await this.daemon.connect();for(const n of this.reconnectedHandlers)n({attempt:e,serverId:this.daemon.serverId})}catch(n){for(const s of this.failedHandlers)s(n,e);this.scheduleReconnect()}}}function yt(t){const e=t.trim();if(e==="")return e;const n=e.match(/^([a-z][a-z0-9+.-]*):\/\//i);if(!n)return`ws://${e.replace(/\/+$/,"")}`;const s=n[1].toLowerCase(),o=e.slice(n[0].length).replace(/\/+$/,"");switch(s){case"http":return`ws://${o}`;case"https":return`wss://${o}`;case"ws":case"wss":return`${s}://${o}`;default:return e}}function Kr(t){const e=Br(t);return e!=null&&e.relay?{mode:"relay",url:qr(e.relay),daemonPublicKey:e.publicKey}:e!=null&&e.host?{mode:"direct",url:yt(e.host)}:{mode:"direct",url:yt(t)}}function Gr(){return"web-"+Math.random().toString(36).slice(2,10)}const T=ae()((t,e)=>({status:"idle",serverInfo:null,error:null,daemon:null,client:null,reconnection:null,async connect(n){e().disconnect();const s=Kr(n.url);let o;s.mode==="relay"?o=Mr({daemonPublicKey:s.daemonPublicKey}):n.password&&(o=Qt(d=>new WebSocket(d,[`pi-studio.bearer.${n.password}`])));const r=new Dr({url:s.url,clientId:n.clientId??Gr(),clientType:"browser",capabilities:{},transport:o,rpcTimeoutMs:1800*1e3}),a=new Or(r),l=new Ur(r);r.onStateChange(d=>t({status:d})),l.onReconnected(()=>t({error:null})),l.onReconnectFailed(d=>{t({error:d instanceof Error?d.message:String(d)})}),t({daemon:r,client:a,reconnection:l,error:null,status:"connecting"});try{const d=await r.connect();t({serverInfo:d}),l.start()}catch(d){throw t({error:d instanceof Error?d.message:String(d)}),d}},disconnect(){const{daemon:n,reconnection:s}=e();s==null||s.stop(),n==null||n.close(),t({status:"idle",serverInfo:null,daemon:null,client:null,reconnection:null})}})),Vr=100,Jr=480,Yr=220,Xr=280;function je(t){return Math.min(Jr,Math.max(Vr,t))}const I=ae()(t=>({host:"ws://127.0.0.1:6767",password:"",cwd:"~",cwdPickerOpen:!1,sessionMenu:null,fileMenu:null,rightSidebarTab:"files",collapsedWorkspaces:new Set,leftSidebarCollapsed:!1,rightSidebarCollapsed:!1,leftSidebarWidth:Yr,rightSidebarWidth:Xr,setHost:e=>t({host:e}),setPassword:e=>t({password:e}),setCwd:e=>t({cwd:e}),openCwdPicker:()=>t({cwdPickerOpen:!0}),closeCwdPicker:()=>t({cwdPickerOpen:!1}),openSessionMenu:(e,n,s)=>t({sessionMenu:{sessionId:e,x:n,y:s}}),closeSessionMenu:()=>t({sessionMenu:null}),openFileMenu:(e,n,s,o)=>t({fileMenu:{path:e,isDirectory:n,x:s,y:o}}),closeFileMenu:()=>t({fileMenu:null}),setRightSidebarTab:e=>t({rightSidebarTab:e}),toggleWorkspaceCollapsed:e=>t(n=>{const s=new Set(n.collapsedWorkspaces);return s.has(e)?s.delete(e):s.add(e),{collapsedWorkspaces:s}}),toggleLeftSidebar:()=>t(e=>({leftSidebarCollapsed:!e.leftSidebarCollapsed})),toggleRightSidebar:()=>t(e=>({rightSidebarCollapsed:!e.rightSidebarCollapsed})),setLeftSidebarWidth:e=>t({leftSidebarWidth:je(e)}),setRightSidebarWidth:e=>t({rightSidebarWidth:je(e)}),resizeLeftSidebar:e=>t(n=>({leftSidebarWidth:je(n.leftSidebarWidth+e)})),resizeRightSidebar:e=>t(n=>({rightSidebarWidth:je(n.rightSidebarWidth+e)}))})),Qr="_wrap_emmus_1",Zr="_dot_emmus_8",ea="_open_emmus_15",ta="_connecting_emmus_18",na="_closed_emmus_21",sa="_idle_emmus_22",oa="_closing_emmus_23",ze={wrap:Qr,dot:Zr,open:ea,connecting:ta,closed:na,idle:sa,closing:oa},ra={idle:"disconnected",connecting:"connecting…",open:"connected",closing:"disconnecting…",closed:"disconnected"};function aa(){const t=T(n=>n.status),e=T(n=>n.error);return i.jsxs("span",{className:ze.wrap,title:e??void 0,children:[i.jsx("span",{className:A(ze.dot,ze[t])}),ra[t]??t]})}const ia="_toolbar_i9hmh_1",ca="_brand_i9hmh_10",la="_version_i9hmh_16",da="_sep_i9hmh_22",ua="_host_i9hmh_28",pa="_password_i9hmh_31",fa="_sidebarToggles_i9hmh_34",ne={toolbar:ia,brand:ca,version:la,sep:da,host:ua,password:pa,sidebarToggles:fa};function ha(){const t=T(f=>f.status),e=T(f=>f.connect),n=T(f=>f.disconnect),s=I(f=>f.host),o=I(f=>f.setHost),r=I(f=>f.password),a=I(f=>f.setPassword),l=I(f=>f.leftSidebarCollapsed),d=I(f=>f.toggleLeftSidebar),u=I(f=>f.rightSidebarCollapsed),h=I(f=>f.toggleRightSidebar),m=t==="open"||t==="connecting";return i.jsxs("div",{className:ne.toolbar,children:[i.jsx("span",{className:ne.brand,children:"Pi-Studio"}),i.jsxs("span",{className:ne.version,children:["v","0.0.37"]}),i.jsx(aa,{}),i.jsx("div",{className:ne.sep}),i.jsx(Ve,{className:ne.host,value:s,onChange:f=>o(f.target.value),placeholder:"host:port, ws://…/http://…, or a pasted pairing link",disabled:m}),i.jsx(Ve,{className:ne.password,type:"password",value:r,onChange:f=>a(f.target.value),placeholder:"password",disabled:m}),t==="open"||t==="connecting"||t==="closing"?i.jsx(L,{size:"sm",onClick:()=>n(),children:"Disconnect"}):i.jsx(L,{size:"sm",variant:"default",onClick:()=>void e({url:s,password:r||void 0}),children:"Connect"}),i.jsxs("div",{className:ne.sidebarToggles,children:[i.jsx(L,{size:"sm",variant:"ghost",iconOnly:!0,title:l?"Show sessions sidebar":"Hide sessions sidebar",onClick:()=>d(),children:l?i.jsx(In,{size:16}):i.jsx(Cn,{size:16})}),i.jsx(L,{size:"sm",variant:"ghost",iconOnly:!0,title:u?"Show files/changes sidebar":"Hide files/changes sidebar",onClick:()=>h(),children:u?i.jsx(jn,{size:16}):i.jsx(Tn,{size:16})})]})]})}const Xe={rows:[],streamingAssistantIndex:null,streamingReasoningIndex:null,toolIndexByCallId:{}};let bt=0;function ee(){return bt+=1,`row-${bt}`}function ma(t){switch(t.kind){case"shell":return t.command??"";case"read":case"write":return t.path??"";case"edit":return t.path??"";case"search":return t.query??"";case"fetch":return t.url??"";case"task":return t.description??"";default:return""}}function ga(t,e){return t??`${e.kind}:${ma(e)}`}function _a(t){return{...t,streamingAssistantIndex:null,streamingReasoningIndex:null}}function ya(t,e){var r;const n=t.rows.slice();let s=t.streamingAssistantIndex;if(s===null||((r=n[s])==null?void 0:r.kind)!=="assistant"){const a={kind:"assistant",id:ee(),text:"",streaming:!0};n.push(a),s=n.length-1}const o=n[s];return!o||o.kind!=="assistant"?t:(n[s]={...o,text:o.text+e},{...t,rows:n,streamingAssistantIndex:s,streamingReasoningIndex:null})}function ba(t,e){var r;const n=t.rows.slice();let s=t.streamingReasoningIndex;if(s===null||((r=n[s])==null?void 0:r.kind)!=="reasoning"){const a={kind:"reasoning",id:ee(),text:"",streaming:!0};n.push(a),s=n.length-1}const o=n[s];return!o||o.kind!=="reasoning"?t:(n[s]={...o,text:o.text+e},{...t,rows:n,streamingReasoningIndex:s,streamingAssistantIndex:null})}function wa(t,e){if(t.kind!==e.kind)return e;const n={...t};for(const[s,o]of Object.entries(e))o!==void 0&&o!==""&&(n[s]=o);return n}function Sa(t,e){var l;const n=ga(e.callId,e.tool),s=e.status==="completed"||e.status==="error"?e.status:"running",o=t.toolIndexByCallId[n],r=t.rows.slice();if(o!==void 0&&((l=r[o])==null?void 0:l.kind)==="tool"){const d=r[o];return d.kind!=="tool"?t:(r[o]={...d,tool:wa(d.tool,e.tool),status:s},{...t,rows:r,streamingAssistantIndex:null,streamingReasoningIndex:null})}const a={kind:"tool",id:ee(),callId:n,tool:e.tool,status:s};return r.push(a),{...t,rows:r,toolIndexByCallId:{...t.toolIndexByCallId,[n]:r.length-1},streamingAssistantIndex:null,streamingReasoningIndex:null}}function ot(t){const e=t.rows.slice();if(t.streamingAssistantIndex!==null){const n=e[t.streamingAssistantIndex];(n==null?void 0:n.kind)==="assistant"&&(e[t.streamingAssistantIndex]={...n,streaming:!1})}if(t.streamingReasoningIndex!==null){const n=e[t.streamingReasoningIndex];(n==null?void 0:n.kind)==="reasoning"&&(e[t.streamingReasoningIndex]={...n,streaming:!1})}return{...t,rows:e,streamingAssistantIndex:null,streamingReasoningIndex:null}}function xa(t,e){const n=ot(t),s={kind:"error",id:ee(),text:e||"turn failed"};return{...n,rows:[...n.rows,s]}}function va(t){const e=ot(t),n={kind:"system",id:ee(),text:"(canceled)"};return{...e,rows:[...e.rows,n]}}function ka(t,e){const n={kind:"error",id:ee(),text:e||"error"};return{...t,rows:[...t.rows,n]}}function Ia(t,e,n,s){if(s!==void 0){const r=t.rows.findIndex(a=>a.kind==="user"&&a.pending&&a.clientMessageId===s);if(r!==-1){const a=t.rows.slice(),l=a[r];if((l==null?void 0:l.kind)==="user")return a[r]={...l,text:e,images:n,pending:!1},{...t,rows:a}}}const o={kind:"user",id:ee(),text:e,images:n,clientMessageId:s};return{...t,rows:[...t.rows,o]}}function Ca(t,e){let n=!1;const s=t.rows.map(o=>o.kind!=="user"||!o.queued||e.includes(o.text)?o:(n=!0,{...o,queued:!1}));return n?{...t,rows:s}:t}function sn(t,e){switch(e.kind){case"turn_started":return _a(t);case"user_message":return Ia(t,e.text??"",e.images,e.messageId);case"assistant_message":return ya(t,e.text??"");case"reasoning":return ba(t,e.text??"");case"tool_call":return Sa(t,e);case"turn_completed":return ot(t);case"turn_failed":return xa(t,e.error);case"turn_canceled":return va(t);case"error":return ka(t,e.message);case"queue_update":return Ca(t,e.steering??[]);default:return t}}function ja(t,e,n,s,o){const r={kind:"user",id:ee(),text:n,images:s,clientMessageId:e,pending:!0,queued:o};return{...t,rows:[...t.rows,r]}}function Ta(t,e){const n=t.rows.findIndex(r=>r.kind==="user"&&r.pending&&r.clientMessageId===e);if(n===-1)return t;const s=t.rows.slice(),o=s[n];return(o==null?void 0:o.kind)!=="user"?t:(s[n]={...o,pending:!1,failed:!0},{...t,rows:s})}let wt=0;function Ea(){return wt+=1,`s-${Date.now().toString(36)}-${wt}`}const M=ae()((t,e)=>({sessions:{},order:[],activeSessionId:null,createSession(n){const s=Ea(),o={id:s,agentId:null,title:"New chat",status:"idle",cwd:n,timeline:Xe,userMessageCount:0};return t(r=>({sessions:{...r.sessions,[s]:o},order:[s,...r.order],activeSessionId:s})),s},hydrate(n){t(s=>s.sessions[n.id]?s:{sessions:{...s.sessions,[n.id]:n},order:[...s.order,n.id]})},bindAgent(n,s){t(o=>{const r=o.sessions[n];return r?{sessions:{...o.sessions,[n]:{...r,agentId:s}}}:o})},setStatus(n,s){t(o=>{const r=o.sessions[n];return r?{sessions:{...o.sessions,[n]:{...r,status:s}}}:o})},setStatusByAgentId(n,s){const o=e().findByAgentId(n);o&&e().setStatus(o.id,s)},setModel(n,s,o){t(r=>{const a=r.sessions[n];return a?{sessions:{...r.sessions,[n]:{...a,model:s,modelProvider:o}}}:r})},setModelByAgentId(n,s,o){const r=e().findByAgentId(n);r&&e().setModel(r.id,s,o)},setTitle(n,s){t(o=>{const r=o.sessions[n];return r?{sessions:{...o.sessions,[n]:{...r,title:s}}}:o})},setCwd(n,s){t(o=>{const r=o.sessions[n];return r?{sessions:{...o.sessions,[n]:{...r,cwd:s}}}:o})},applyStreamEvent(n,s){t(o=>{const r=o.sessions[n];if(!r)return o;const a=sn(r.timeline,s);let l=r.title;if(s.kind==="turn_completed"&&l==="New chat"){const d=a.rows.slice().reverse().find(u=>u.kind==="assistant");d&&d.kind==="assistant"&&d.text&&(l=d.text.slice(0,40)+(d.text.length>40?"…":""))}return{sessions:{...o.sessions,[n]:{...r,timeline:a,title:l}}}})},addOptimisticUserMessage(n,s,o,r,a){t(l=>{const d=l.sessions[n];if(!d)return l;const u=ja(d.timeline,s,o,r,a);return{sessions:{...l.sessions,[n]:{...d,timeline:u,userMessageCount:d.userMessageCount+1}}}})},markUserMessageFailed(n,s){t(o=>{const r=o.sessions[n];if(!r)return o;const a=Ta(r.timeline,s);return{sessions:{...o.sessions,[n]:{...r,timeline:a}}}})},activate(n){t({activeSessionId:n})},remove(n){t(s=>{const{[n]:o,...r}=s.sessions,a=s.order.filter(d=>d!==n),l=s.activeSessionId===n?a[0]??null:s.activeSessionId;return{sessions:r,order:a,activeSessionId:l}})},findByAgentId(n){return Object.values(e().sessions).find(s=>s.agentId===n)}})),St=new WeakMap;function Na(t,e="pi"){const n=St.get(t);if(n)return n;const s=t.providers.resolveDefaultModel(e).then(o=>({model:o.model,modelProvider:o.modelProvider})).catch(()=>({}));return St.set(t,s),s}const He=new Map;function Ra(t,e){const n=M.getState().sessions[e];if(!n)return Promise.reject(new Error(`unknown session: ${e}`));if(n.agentId)return Promise.resolve(n.agentId);const s=He.get(e);if(s)return s;const o=(async()=>{const r={provider:"pi",cwd:n.cwd||"~"};n.model&&(r.model=n.model),n.modelProvider&&(r.modelProvider=n.modelProvider);const a=await t.createAgent({config:r,labels:{}});return M.getState().bindAgent(e,a.agentId),a.agentId})();return He.set(e,o),o.finally(()=>He.delete(e)),o}function We(t,e){return t.filter(n=>n.workspaceCwd===e)}const N=ae()((t,e)=>({tabs:[],activeTabId:null,activeWorkspaceCwd:null,lastActiveTabByWorkspace:{},open(n){const s=e().tabs.find(o=>o.id===n.id);if(s){e().activate(s.id);return}t(o=>({tabs:[...o.tabs,n],activeTabId:n.id,activeWorkspaceCwd:n.workspaceCwd,lastActiveTabByWorkspace:{...o.lastActiveTabByWorkspace,[n.workspaceCwd]:n.id}}))},close(n){t(s=>{const o=s.tabs.find(u=>u.id===n);if(!o)return s;const r=s.tabs.findIndex(u=>u.id===n),a=s.tabs.filter(u=>u.id!==n);let l=s.activeTabId;const d={...s.lastActiveTabByWorkspace};if(l===n){const u=We(a,o.workspaceCwd),h=Math.min(r,u.length-1),m=u[h];l=(m==null?void 0:m.id)??null}if(d[o.workspaceCwd]===n){const u=We(a,o.workspaceCwd)[0];u?d[o.workspaceCwd]=u.id:delete d[o.workspaceCwd]}return{tabs:a,activeTabId:l,lastActiveTabByWorkspace:d}})},activate(n){t(s=>{const o=s.tabs.find(r=>r.id===n);return o?{activeTabId:n,activeWorkspaceCwd:o.workspaceCwd,lastActiveTabByWorkspace:{...s.lastActiveTabByWorkspace,[o.workspaceCwd]:n}}:s})},switchWorkspace(n){t(s=>{var d;const o=We(s.tabs,n),r=s.lastActiveTabByWorkspace[n],l=r&&o.some(u=>u.id===r)?r:((d=o[0])==null?void 0:d.id)??null;return{activeWorkspaceCwd:n,activeTabId:l,lastActiveTabByWorkspace:l?{...s.lastActiveTabByWorkspace,[n]:l}:s.lastActiveTabByWorkspace}})},reorder(n,s){t(o=>{const r=o.tabs.findIndex(u=>u.id===n),a=o.tabs.findIndex(u=>u.id===s);if(r===-1||a===-1||r===a)return o;const l=o.tabs.slice(),[d]=l.splice(r,1);return d?(l.splice(a,0,d),{tabs:l}):o})},updateLabel(n,s){t(o=>({tabs:o.tabs.map(r=>r.id===n?{...r,label:s}:r)}))},updateData(n,s){t(o=>({tabs:o.tabs.map(r=>r.id===n?{...r,data:{...r.data,...s}}:r)}))}})),V={chat:t=>`chat-${t}`,file:t=>`file-${t}`,diff:(t,e)=>`diff-${t}${e?"-staged":""}`,terminal:t=>`term-${t}`};let Le=0;function on(t){Le+=1,N.getState().open({id:V.terminal(`new-${Le}`),kind:"terminal",label:`Terminal ${Le}`,closable:!0,data:{slot:null,cwd:t},workspaceCwd:t})}function De(t){const e=M.getState().createSession(t);N.getState().open({id:V.chat(e),kind:"chat",label:"New chat",closable:!0,data:{sessionId:e},workspaceCwd:t});const n=T.getState().client;n&&Na(n).then(({model:s,modelProvider:o})=>{s&&M.getState().setModel(e,s,o)})}const Te=ae()(t=>({rootPath:"",expanded:new Set,expandedByRoot:new Map,setRoot:e=>t(n=>{const s=new Map(n.expandedByRoot);n.rootPath&&s.set(n.rootPath,n.expanded);const o=s.get(e),r=new Set(o);return r.add(e),{rootPath:e,expanded:r,expandedByRoot:s}}),toggle:e=>t(n=>{if(e===n.rootPath)return n;const s=new Set(n.expanded);s.has(e)?s.delete(e):s.add(e);const o=new Map(n.expandedByRoot);return o.set(n.rootPath,s),{expanded:s,expandedByRoot:o}})}));let le=null;const Qe=new Set;function qa(t){return Qe.add(t),()=>Qe.delete(t)}async function Oe(t){var e;if(le)return le;try{const n=await t.connection.request("file_explorer_request",{path:"/home"}),o=(((e=n.result)==null?void 0:e.entries)??n.entries??[]).find(r=>r.kind==="directory"||r.type==="directory");le="/home/"+((o==null?void 0:o.name)||"user")}catch{return"/tmp"}for(const n of Qe)n(le);return le}function Ma(){return le}async function Ba(t,e){return e==="~"||e.startsWith("~/")?await Oe(t)+e.slice(1):e}function rt(){const t=T(o=>o.client),e=T(o=>o.status),[n,s]=S.useState(Ma());return S.useEffect(()=>qa(s),[]),S.useEffect(()=>{!t||e!=="open"||n||Oe(t)},[t,e,n]),n}const $a="_dot_202py_3",Aa={dot:$a};function Da(t){const{status:e,requiresAttention:n,attentionReason:s,showInactive:o}=t;if(!e)return null;if(n)switch(s){case"permission":return"statusWarning";case"error":return"statusDanger";case"finished":default:return"statusSuccess"}switch(e){case"running":case"queued":return"accent";case"waiting":return"statusWarning";case"finished":return"statusSuccess";case"error":return"statusDanger";case"idle":case"archived":return o?"foregroundMuted":null}}const xt=8,Oa={accent:"var(--pi-color-accent)",statusSuccess:"var(--pi-color-statusSuccess)",statusDanger:"var(--pi-color-statusDanger)",statusWarning:"var(--pi-color-statusWarning)",foregroundMuted:"var(--pi-color-foregroundMuted)"};function Pa({className:t,...e}){const n=Da(e);return n?i.jsx("span",{className:`${Aa.dot}${t?` ${t}`:""}`,style:{width:xt,height:xt,backgroundColor:Oa[n]??"currentColor"},role:"presentation"}):null}const Fa={initializing:"queued",idle:"idle",running:"running",error:"error",closed:"finished"};function za(t){return Fa[t]??"idle"}const Ha="_wrap_sqws5_1",Wa="_header_sqws5_7",La="_list_sqws5_23",Ua="_item_sqws5_28",Ka="_active_sqws5_37",Ga="_title_sqws5_40",Va="_meta_sqws5_49",Ja="_menuBtn_sqws5_57",Ya="_workspaceGroup_sqws5_75",Xa="_workspaceHeader_sqws5_78",Qa="_workspaceChevron_sqws5_91",Za="_workspaceIcon_sqws5_102",ei="_workspaceLabel_sqws5_106",ti="_workspaceCount_sqws5_112",ni="_newSessionBtn_sqws5_117",si="_workspaceSessions_sqws5_129",D={wrap:Ha,header:Wa,list:La,item:Ua,active:Ka,title:Ga,meta:Va,menuBtn:Ja,workspaceGroup:Ya,workspaceHeader:Xa,workspaceChevron:Qa,workspaceIcon:Za,workspaceLabel:ei,workspaceCount:ti,newSessionBtn:ni,workspaceSessions:si};function oi({session:t,active:e,onSelect:n,onOpenMenu:s}){return i.jsxs("div",{className:A(D.item,e&&D.active),onClick:n,onContextMenu:o=>{o.preventDefault(),s(o.clientX,o.clientY)},children:[i.jsxs("div",{className:D.title,children:[i.jsx(Pa,{status:za(t.status),showInactive:!0}),i.jsx("span",{children:t.title})]}),i.jsxs("div",{className:D.meta,children:[t.cwd||"~"," · ",t.agentId?t.agentId.slice(0,8):"new"," ·"," ",t.userMessageCount," msgs"]}),i.jsx("button",{type:"button",className:D.menuBtn,title:"Actions",onClick:o=>{o.stopPropagation();const r=o.currentTarget.getBoundingClientRect();s(r.left,r.bottom)},children:i.jsx(Rt,{size:14})})]})}const ri="_trigger_16o4s_1",ai="_content_16o4s_7",ii="_item_16o4s_16",ci="_danger_16o4s_33",li="_sep_16o4s_36",J={trigger:ri,content:ai,item:ii,danger:ci,sep:li};function di(){const t=I(x=>x.sessionMenu),e=I(x=>x.closeSessionMenu),n=T(x=>x.client),s=S.useRef(null),[o,r]=S.useState(!1);S.useEffect(()=>{r(t!==null)},[t]);const a=M(x=>t?x.sessions[t.sessionId]:void 0);if(!t)return null;const l=!!(a!=null&&a.agentId)&&(a==null?void 0:a.status)==="running";function d(x){r(x),x||e()}function u(){if(!a)return;const x=window.prompt("Rename:",a.title);if(x!=null&&x.trim()){const w=x.trim();M.getState().setTitle(a.id,w),N.getState().updateLabel(V.chat(a.id),w),a.agentId&&(n==null||n.agent(a.agentId).update({title:w}).catch(()=>{}))}e()}function h(){a!=null&&a.agentId&&(n==null||n.agent(a.agentId).interrupt().catch(()=>{})),e()}function m(x){M.getState().remove(x),N.getState().close(V.chat(x))}async function f(){if(a){if(!window.confirm("Archive this agent? It can be resumed later."))return e();if(e(),!a.agentId){m(a.id);return}if(!n){window.alert("Not connected — cannot archive remotely.");return}try{await n.agent(a.agentId).archive(),m(a.id)}catch(x){window.alert(`Failed to archive: ${x instanceof Error?x.message:String(x)}`)}}}async function y(){if(a){if(!window.confirm("Permanently delete this agent? This cannot be undone."))return e();if(e(),!a.agentId){m(a.id);return}if(!n){window.alert("Not connected — cannot delete remotely.");return}try{await n.agent(a.agentId).delete(),m(a.id)}catch(x){window.alert(`Failed to delete: ${x instanceof Error?x.message:String(x)}`)}}}return i.jsxs(qe,{open:o,onOpenChange:d,modal:!1,children:[i.jsx(Me,{asChild:!0,children:i.jsx("button",{ref:s,type:"button",className:J.trigger,style:{left:t.x,top:t.y},"aria-hidden":!0,tabIndex:-1})}),i.jsx(Be,{children:i.jsxs($e,{className:J.content,align:"start",sideOffset:2,children:[i.jsx(Y,{className:J.item,onSelect:u,children:"Rename"}),i.jsx(Y,{className:J.item,disabled:!l,onSelect:h,children:"Stop agent"}),i.jsx(Dt,{className:J.sep}),i.jsx(Y,{className:`${J.item} ${J.danger}`,onSelect:f,children:"Archive"}),i.jsx(Y,{className:`${J.item} ${J.danger}`,onSelect:y,children:"Delete permanently"})]})})]})}function ui({label:t,cwd:e,sessionCount:n,collapsed:s,onToggleCollapsed:o,onNewSession:r}){return i.jsxs("div",{className:D.workspaceHeader,onClick:o,title:e,children:[i.jsx("button",{type:"button",className:D.workspaceChevron,"aria-label":s?"Expand workspace":"Collapse workspace",onClick:a=>{a.stopPropagation(),o()},children:s?i.jsx(et,{size:13}):i.jsx(qt,{size:13})}),i.jsx(En,{size:13,className:A(D.workspaceIcon)}),i.jsx("span",{className:D.workspaceLabel,children:t}),i.jsx("span",{className:D.workspaceCount,children:n}),i.jsx(L,{size:"xs",variant:"ghost",iconOnly:!0,title:"New conversation",className:D.newSessionBtn,onClick:a=>{a.stopPropagation(),r()},children:i.jsx(Mt,{size:13})})]})}function re(t,e){return e&&(t==="~"||t.startsWith("~/"))?e+t.slice(1):t}function rn(t,e,n){const s=new Map;for(const o of t){const r=e[o];if(!r)continue;const a=re(r.cwd||"~",n),l=s.get(a);l?l.push(r):s.set(a,[r])}return Array.from(s,([o,r])=>({cwd:o,sessions:r}))}function pi(t){return!t||t==="~"?"~":t.split("/").filter(Boolean).pop()||t}function fi(){const t=M(w=>w.order),e=M(w=>w.sessions),n=M(w=>w.activeSessionId),s=M(w=>w.activate),o=N(w=>w.open),r=T(w=>w.status),a=I(w=>w.openSessionMenu),l=I(w=>w.setCwd),d=I(w=>w.openCwdPicker),u=I(w=>w.collapsedWorkspaces),h=I(w=>w.toggleWorkspaceCollapsed),m=rt();function f(w){const g=re(w||"~",m);De(g)}function y(w){s(w);const g=e[w],R=re((g==null?void 0:g.cwd)||"~",m);g!=null&&g.cwd&&l(g.cwd),o({id:V.chat(w),kind:"chat",label:(g==null?void 0:g.title)??"Chat",closable:!0,data:{sessionId:w},workspaceCwd:R})}const x=rn(t,e,m);return i.jsxs("div",{className:D.wrap,children:[i.jsxs("div",{className:D.header,children:[i.jsx("h3",{children:"Workspaces"}),i.jsx(L,{size:"xs",variant:"ghost",iconOnly:!0,title:r!=="open"?"Connect to open a workspace":"Open a workspace folder",disabled:r!=="open",onClick:()=>d(),children:i.jsx(Nn,{size:14})})]}),i.jsx("div",{className:D.list,children:x.map(w=>{const g=u.has(w.cwd);return i.jsxs("div",{className:D.workspaceGroup,children:[i.jsx(ui,{label:pi(w.cwd),cwd:w.cwd,sessionCount:w.sessions.length,collapsed:g,onToggleCollapsed:()=>h(w.cwd),onNewSession:()=>f(w.cwd)}),!g&&i.jsx("div",{className:D.workspaceSessions,children:w.sessions.map(R=>i.jsx(oi,{session:R,active:R.id===n,onSelect:()=>y(R.id),onOpenMenu:(k,j)=>a(R.id,k,j)},R.id))})]},w.cwd)})}),i.jsx(di,{})]})}const hi="_strip_8jveh_1",mi="_tab_8jveh_10",gi="_active_8jveh_26",_i="_icon_8jveh_30",yi="_label_8jveh_35",bi="_close_8jveh_40",wi="_newTab_8jveh_50",Si="_content_8jveh_73",xi="_item_8jveh_82",vi="_itemIcon_8jveh_96",z={strip:hi,tab:mi,active:gi,icon:_i,label:yi,close:bi,newTab:wi,content:Si,item:xi,itemIcon:vi},ki={chat:$t,file:qn,diff:Rn,terminal:Bt};function Ii({tab:t}){const e=N(m=>m.activeTabId),n=N(m=>m.activate),s=N(m=>m.close),o=ki[t.kind],{attributes:r,listeners:a,setNodeRef:l,transform:d,transition:u,isDragging:h}=Zn({id:t.id});return i.jsxs("div",{ref:l,className:A(z.tab,t.id===e&&z.active),style:{transform:es.Transform.toString(d),transition:u,opacity:h?.5:1},onClick:()=>n(t.id),onAuxClick:m=>{m.button===1&&t.closable&&s(t.id)},title:t.label,...r,...a,children:[i.jsx("span",{className:z.icon,children:i.jsx(o,{size:13})}),i.jsx("span",{className:z.label,children:t.label}),t.closable&&i.jsx("span",{className:z.close,onClick:m=>{m.stopPropagation(),s(t.id)},children:i.jsx(Ue,{size:12})})]})}function Ci({workspaceCwd:t}){const e=t??"~";return i.jsxs(qe,{children:[i.jsx(Me,{asChild:!0,children:i.jsx("button",{type:"button",className:z.newTab,title:"New tab",disabled:!t,children:i.jsx(Mt,{size:14})})}),i.jsx(Be,{children:i.jsxs($e,{className:z.content,align:"start",sideOffset:4,children:[i.jsxs(Y,{className:z.item,onSelect:()=>De(e),children:[i.jsx($t,{size:13,className:z.itemIcon}),"New chat"]}),i.jsxs(Y,{className:z.item,onSelect:()=>on(e),children:[i.jsx(Bt,{size:13,className:z.itemIcon}),"New terminal"]})]})})]})}function ji(){const t=N(a=>a.tabs),e=N(a=>a.activeWorkspaceCwd),n=N(a=>a.reorder),s=t.filter(a=>a.workspaceCwd===e),o=Kn(Gn(Qn,{activationConstraint:{distance:4}}));function r(a){const{active:l,over:d}=a;!d||l.id===d.id||n(String(l.id),String(d.id))}return i.jsxs("div",{className:z.strip,children:[i.jsx(Vn,{sensors:o,collisionDetection:Jn,onDragEnd:r,children:i.jsx(Yn,{items:s.map(a=>a.id),strategy:Xn,children:s.map(a=>i.jsx(Ii,{tab:a},a.id))})}),i.jsx(Ci,{workspaceCwd:e})]})}const Ti="_spinner_1tgzp_3",Ei={spinner:Ti},Ni={xs:12,sm:16,md:20,lg:24},Ri={xs:1,sm:2,md:2,lg:3};function an({size:t="md",color:e="currentColor",className:n,"aria-label":s="Loading"}){const o=typeof t=="number"?t:Ni[t],r=typeof t=="number"?2:Ri[t];return i.jsx("span",{className:`${Ei.spinner}${n?` ${n}`:""}`,role:"status","aria-label":s,style:{width:o,height:o,borderWidth:r,color:e}})}const qi=S.lazy(()=>nt(()=>import("./ChatPanel-D1j9P-aU.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])).then(t=>({default:t.ChatPanel}))),vt=S.lazy(()=>nt(()=>import("./FilePanel-BmlpXwsJ.js").then(t=>t.F),__vite__mapDeps([14,1,7,6,5,2,9,10,15])).then(t=>({default:t.FilePanel}))),Mi=S.lazy(()=>nt(()=>import("./TerminalPanel-DV2Ez7aG.js"),__vite__mapDeps([16,1,17,18,7,6,5,2,3,11,12,19])).then(t=>({default:t.TerminalPanel}))),Bi={chat:qi,file:vt,diff:vt,terminal:Mi},$i="_area_1vzxd_1",Ai="_panel_1vzxd_7",Di="_active_1vzxd_14",Oi="_empty_1vzxd_17",ge={area:$i,panel:Ai,active:Di,empty:Oi};function Pi(){const t=N(o=>o.tabs),e=N(o=>o.activeTabId),n=N(o=>o.activeWorkspaceCwd);return t.some(o=>o.workspaceCwd===n)?i.jsx("div",{className:ge.area,children:t.map(o=>{const r=Bi[o.kind];return i.jsx("div",{className:A(ge.panel,o.id===e&&ge.active),children:i.jsx(S.Suspense,{fallback:i.jsx(an,{size:"md"}),children:i.jsx(r,{tab:o})})},o.id)})}):i.jsx("div",{className:ge.area,children:i.jsx("div",{className:ge.empty,children:"No open tabs in this workspace"})})}const at={fileRead:t=>["file","read",t],fileDownload:t=>["file","download",t],fileDiff:(t,e,n)=>["file","diff",t,e,n],explorer:t=>["explorer",t],agentList:()=>["agents","list"],providerModels:t=>["providers","models",t],agentTimeline:t=>["agents","timeline",t]};function Fi(t){const e=t.kind==="directory"||t.type==="directory"?"directory":"file";return{name:t.name??"",kind:e,size:t.size,mtimeMs:t.mtimeMs}}function zi(t){return t.slice().sort((e,n)=>e.kind!==n.kind?e.kind==="directory"?-1:1:e.name.localeCompare(n.name))}async function cn(t,e){const s=(await t.connection.request("file_explorer_request",{path:e})).result;if(!s||s.ok===!1)throw new Error(s&&"error"in s?s.error:"explorer request failed");const o="entries"in s?s.entries??[]:[];return{path:s.resolvedPath??e,entries:zi(o.map(Fi))}}function Hi(t,e=!0){const n=T(s=>s.client);return Et({queryKey:at.explorer(t),queryFn:()=>{if(!n)throw new Error("not connected");return cn(n,t)},enabled:!!n&&!!t&&e})}function Wi(t){const e=T(o=>o.client),n=S.useMemo(()=>Array.from(t),[t]),s=xn({queries:n.map(o=>({queryKey:at.explorer(o),queryFn:()=>{if(!e)throw new Error("not connected");return cn(e,o)},enabled:!!e&&!!o}))});return S.useMemo(()=>{const o=new Map;return n.forEach((r,a)=>{const l=s[a];o.set(r,{listing:l==null?void 0:l.data,isLoading:!!(l!=null&&l.isLoading),isError:!!(l!=null&&l.isError),error:l==null?void 0:l.error})}),o},[n,s])}const kt=new WeakMap;function It(t){let e=kt.get(t);return e||(e=new Lr(t),e.start(),kt.set(t,e)),e}function Li(t,e,n){const s=new Blob([Uint8Array.from(t)],{type:n||"application/octet-stream"}),o=URL.createObjectURL(s),r=document.createElement("a");r.href=o,r.download=e,r.rel="noopener",document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(o),0)}function ln(){const t=T(o=>o.daemon),e=Ze(),n=S.useCallback(async(o,r)=>{if(!t)throw new Error("not connected");const a=o?`${o}/${r.name}`:r.name,l=new Uint8Array(await r.arrayBuffer());await It(t).upload(a,l),await e.invalidateQueries({queryKey:["explorer"]})},[t,e]),s=S.useCallback(async o=>{if(!t)throw new Error("not connected");const r=await It(t).download(o);Li(r.bytes,r.fileName||o.split("/").pop()||"download",r.mimeType)},[t]);return{upload:n,saveToDisk:s}}function Ui(t,e){return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}function dn(t,e,n,s,o){var a;const r=o.get(e);if(!r||r.isLoading){t.push({kind:"loading",path:e,depth:n});return}if(r.isError){const l=r.error instanceof Error?r.error.message:"failed to load";t.push({kind:"error",path:e,depth:n,message:l});return}for(const l of((a=r.listing)==null?void 0:a.entries)??[])Ki(t,e,l,n,s,o)}function Ki(t,e,n,s,o,r){const a=Ui(e,n.name);if(n.kind!=="directory"){t.push({kind:"file",path:a,name:n.name,depth:s});return}const l=o.has(a);t.push({kind:"directory",path:a,name:n.name,depth:s,expanded:l}),l&&dn(t,a,s+1,o,r)}function Gi(t,e,n){if(!t)return[];const s=[];return dn(s,t,0,e,n),s}const Vi="_container_yg965_1",Ji="_header_yg965_7",Yi="_uploadButton_yg965_13",Xi="_hiddenInput_yg965_32",Qi="_status_yg965_35",Zi="_statusError_yg965_36",ec="_rowAction_yg965_49",tc="_item_yg965_64",nc="_dropOverlay_yg965_67",sc="_list_yg965_82",oc="_chevronSlot_yg965_101",rc="_chevron_yg965_101",ac="_chevronOpen_yg965_112",ic="_icon_yg965_115",cc="_name_yg965_122",lc="_dirName_yg965_127",dc="_statusRow_yg965_133",uc="_statusRowError_yg965_144",pc="_emptyState_yg965_147",B={container:Vi,header:Ji,uploadButton:Yi,hiddenInput:Xi,status:Qi,statusError:Zi,rowAction:ec,item:tc,dropOverlay:nc,list:sc,chevronSlot:oc,chevron:rc,chevronOpen:ac,icon:ic,name:cc,dirName:lc,statusRow:dc,statusRowError:uc,emptyState:pc},fc=14;function hc({row:t,onToggle:e,onOpenFile:n,onContextMenu:s}){const o={paddingLeft:8+t.depth*fc};if(t.kind==="loading")return i.jsx("div",{className:B.statusRow,style:o,children:"Loading…"});if(t.kind==="error")return i.jsx("div",{className:A(B.statusRow,B.statusRowError),style:o,children:t.message??"failed to load"});const r=t.kind==="directory";return i.jsxs("div",{className:B.item,style:o,onClick:()=>r?e(t.path):n(t.path),onContextMenu:a=>{a.preventDefault(),s(t.path,r,a.clientX,a.clientY)},children:[i.jsx("span",{className:B.chevronSlot,children:r&&i.jsx(et,{size:12,className:A(B.chevron,t.expanded&&B.chevronOpen)})}),i.jsx("span",{className:B.icon,children:r?i.jsx(tt,{size:14}):i.jsx(Mn,{size:14})}),i.jsx("span",{className:r?B.dirName:B.name,children:t.name}),i.jsx("button",{type:"button",className:B.rowAction,title:"Actions",onClick:a=>{a.stopPropagation();const l=a.currentTarget.getBoundingClientRect();s(t.path,r,l.left,l.bottom)},children:i.jsx(Rt,{size:12})})]})}const mc="_trigger_g81d7_1",gc="_content_g81d7_7",_c="_item_g81d7_16",yc="_danger_g81d7_29",bc="_sep_g81d7_32",ie={trigger:mc,content:gc,item:_c,danger:yc,sep:bc};function wc(){const t=I(f=>f.fileMenu),e=I(f=>f.closeFileMenu),n=T(f=>f.client),{saveToDisk:s}=ln(),o=Ze(),r=S.useRef(null),[a,l]=S.useState(!1);if(S.useEffect(()=>{l(t!==null)},[t]),!t)return null;const d=t.path.split("/").pop()||t.path;function u(f){l(f),f||e()}async function h(){if(t){e();try{await s(t.path)}catch(f){window.alert(`Failed to download: ${f instanceof Error?f.message:String(f)}`)}}}async function m(){if(!t)return;const f=t.isDirectory?"folder (and everything inside it)":"file";if(!window.confirm(`Permanently delete this ${f}? "${d}" — this cannot be undone.`))return e();if(e(),!n){window.alert("Not connected — cannot delete remotely.");return}try{const y=await n.connection.request("file_delete_request",{path:t.path});if(!y.ok)throw new Error(y.error??"delete failed");await o.invalidateQueries({queryKey:["explorer"]})}catch(y){window.alert(`Failed to delete: ${y instanceof Error?y.message:String(y)}`)}}return i.jsxs(qe,{open:a,onOpenChange:u,modal:!1,children:[i.jsx(Me,{asChild:!0,children:i.jsx("button",{ref:r,type:"button",className:ie.trigger,style:{left:t.x,top:t.y},"aria-hidden":!0,tabIndex:-1})}),i.jsx(Be,{children:i.jsxs($e,{className:ie.content,align:"start",sideOffset:2,children:[!t.isDirectory&&i.jsx(Y,{className:ie.item,onSelect:h,children:"Download"}),i.jsx(Dt,{className:ie.sep}),i.jsx(Y,{className:`${ie.item} ${ie.danger}`,onSelect:m,children:"Delete"})]})})]})}const Sc=24;function xc(){const t=T(v=>v.client),e=Te(v=>v.rootPath),n=Te(v=>v.expanded),s=Te(v=>v.setRoot),o=Te(v=>v.toggle),r=N(v=>v.activeWorkspaceCwd),a=N(v=>v.open),{upload:l}=ln(),d=I(v=>v.openFileMenu),[u,h]=S.useState(null),[m,f]=S.useState(!1),[y,x]=S.useState(null),w=S.useRef(null),g=S.useRef(null),R=S.useRef(null);S.useEffect(()=>{if(!t)return;const v=r||"~";R.current!==v&&(R.current=v,Ba(t,v).then($=>s($)))},[t,r,s]);const k=Wi(n),j=S.useMemo(()=>Gi(e,n,k),[e,n,k]),ct=vn({count:j.length,getScrollElement:()=>g.current,estimateSize:()=>Sc,overscan:12,getItemKey:v=>{var $;return(($=j[v])==null?void 0:$.path)??v}});function fn(v){a({id:V.file(v),kind:"file",label:v.split("/").pop()||v,closable:!0,data:{path:v},workspaceCwd:r||"~"})}async function lt(v,$){var ve;if(!$.length||!v)return;const te=(ve=k.get(v))==null?void 0:ve.listing,Pe=new Set((te==null?void 0:te.entries.map(U=>U.name))??[]),pe=$.filter(U=>Pe.has(U.name));if(pe.length>0){const U=pe.map(gn=>gn.name).join(", ");if(!window.confirm(`Overwrite ${pe.length>1?"these files":"this file"}? ${U}`))return}h({text:`Uploading ${$.length} file${$.length>1?"s":""}…`,error:!1});try{for(const U of $)await l(v,U);h({text:`Uploaded ${$.length} file${$.length>1?"s":""}`,error:!1})}catch(U){h({text:`Upload failed: ${U instanceof Error?U.message:"unknown"}`,error:!0})}}function hn(v){v.preventDefault(),f(!1);const $=y??e;x(null);const te=Array.from(v.dataTransfer.files);lt($,te)}function mn(v){v.dataTransfer.types.includes("Files")&&(v.preventDefault(),f(!0))}return t?i.jsxs("div",{className:B.container,onDragOver:mn,onDragLeave:()=>f(!1),onDrop:hn,children:[i.jsxs("div",{className:B.header,children:[i.jsxs("button",{type:"button",className:B.uploadButton,onClick:()=>{var v;return(v=w.current)==null?void 0:v.click()},disabled:!e,title:"Upload files to the workspace root",children:[i.jsx(Bn,{size:12}),i.jsx("span",{children:"Upload"})]}),i.jsx("input",{ref:w,type:"file",multiple:!0,className:B.hiddenInput,onChange:v=>{lt(e,Array.from(v.target.files??[])),v.target.value=""}})]}),u&&i.jsx("div",{className:u.error?B.statusError:B.status,children:u.text}),i.jsxs("div",{className:B.list,ref:g,children:[j.length===0&&i.jsx("div",{className:B.emptyState,children:"No files loaded"}),i.jsx("div",{style:{position:"relative",height:ct.getTotalSize()},children:ct.getVirtualItems().map(v=>{const $=j[v.index];return $?i.jsx("div",{"data-index":v.index,style:{position:"absolute",top:0,left:0,width:"100%",height:v.size,transform:`translateY(${v.start}px)`},onDragEnter:()=>{$.kind==="directory"&&x($.path)},children:i.jsx(hc,{row:$,onToggle:o,onOpenFile:fn,onContextMenu:(te,Pe,pe,ve)=>d(te,Pe,pe,ve)})},v.key):null})})]}),m&&i.jsx("div",{className:B.dropOverlay,children:"Drop to upload"}),i.jsx(wc,{})]}):i.jsx("div",{className:B.emptyState,children:"Connect to browse files"})}const Ct={available:!1,branch:null,upstream:null,ahead:0,behind:0,detached:!1,conflictCount:0},G=ae()(t=>({subscribedCwd:null,changes:[],...Ct,setSubscribedCwd:e=>t({subscribedCwd:e}),applyProjection:e=>{if(!e||!e.available){t({changes:[],...Ct});return}const n=[];for(const s of e.staged)n.push({path:s.path,status:s.indexStatus==="A"?"added":s.indexStatus==="D"?"deleted":"modified",staged:!0});for(const s of e.unstaged)n.push({path:s.path,status:s.worktreeStatus==="D"?"deleted":"modified",staged:!1});for(const s of e.untracked)n.push({path:s,status:"added",staged:!1});t({changes:n,available:!0,branch:e.branch,upstream:e.upstream,ahead:e.ahead,behind:e.behind,detached:e.detached,conflictCount:e.conflicted.length})}})),vc="_list_1pgby_1",kc="_summary_1pgby_4",Ic="_item_1pgby_11",Cc="_badge_1pgby_23",jc="_added_1pgby_30",Tc="_modified_1pgby_34",Ec="_deleted_1pgby_38",Nc="_name_1pgby_42",Rc="_emptyState_1pgby_47",se={list:vc,summary:kc,item:Ic,badge:Cc,added:jc,modified:Tc,deleted:Ec,name:Nc,emptyState:Rc},qc={added:"A",modified:"M",deleted:"D"};function Mc(){const e=N(r=>r.activeWorkspaceCwd)||"~",n=G(r=>r.changes),s=N(r=>r.open);function o(r,a){s({id:V.diff(r,a),kind:"diff",label:r.split("/").pop()||r,closable:!0,data:{path:r,staged:a},workspaceCwd:e})}return n.length===0?i.jsx("div",{className:se.emptyState,children:"No changes detected"}):i.jsxs("div",{className:se.list,children:[i.jsxs("div",{className:se.summary,children:[n.length," changed file",n.length===1?"":"s"]}),n.map((r,a)=>i.jsxs("div",{className:se.item,onClick:()=>o(r.path,r.staged),children:[i.jsx("span",{className:A(se.badge,se[r.status]),children:qc[r.status]}),i.jsx("span",{className:se.name,children:r.path})]},`${r.path}-${r.staged}-${a}`))]})}const Bc="_wrap_r37ok_1",$c="_tabBar_r37ok_7",Ac="_tabBtn_r37ok_13",Dc="_active_r37ok_26",Oc="_refreshBtn_r37ok_30",Pc="_content_r37ok_34",Q={wrap:Bc,tabBar:$c,tabBtn:Ac,active:Dc,refreshBtn:Oc,content:Pc};function Fc(){const t=I(l=>l.rightSidebarTab),e=I(l=>l.setRightSidebarTab),s=N(l=>l.activeWorkspaceCwd)||"~",o=T(l=>l.client),r=Ze();function a(){r.invalidateQueries({queryKey:["explorer"]}),o&&s&&o.connection.request("checkout_refresh_request",{cwd:s}).catch(()=>{})}return i.jsxs("div",{className:Q.wrap,children:[i.jsxs("div",{className:Q.tabBar,children:[i.jsx("button",{type:"button",className:A(Q.tabBtn,t==="files"&&Q.active),onClick:()=>e("files"),children:"Files"}),i.jsx("button",{type:"button",className:A(Q.tabBtn,t==="changes"&&Q.active),onClick:()=>e("changes"),children:"Changes"}),i.jsx(L,{size:"xs",variant:"ghost",iconOnly:!0,title:"Refresh",className:Q.refreshBtn,onClick:a,children:i.jsx($n,{size:13})})]}),i.jsx("div",{className:Q.content,children:t==="files"?i.jsx(xc,{}):i.jsx(Mc,{})})]})}const un=ae()(t=>({bySession:{},setStats(e,n){t(s=>({bySession:{...s.bySession,[e]:{...s.bySession[e],...n}}}))},clear(e){t(n=>{const{[e]:s,...o}=n.bySession;return{bySession:o}})}})),zc=12e3;function Hc(t,e){return t==="running"&&e!=="running"}function jt(t,e){var s,o,r,a,l,d;const n={};((s=e.contextUsage)==null?void 0:s.tokens)!=null&&(n.contextTokens=e.contextUsage.tokens),((o=e.contextUsage)==null?void 0:o.contextWindow)!==void 0&&(n.contextWindow=e.contextUsage.contextWindow),((r=e.contextUsage)==null?void 0:r.percent)!=null&&(n.contextPercent=e.contextUsage.percent),((a=e.tokens)==null?void 0:a.total)!==void 0&&(n.totalTokens=e.tokens.total),((l=e.tokens)==null?void 0:l.input)!==void 0&&(n.inputTokens=e.tokens.input),((d=e.tokens)==null?void 0:d.output)!==void 0&&(n.outputTokens=e.tokens.output),e.cost!==void 0&&(n.cost=e.cost),e.model!==void 0&&(n.model=e.model,M.getState().setModel(t,e.model)),un.getState().setStats(t,n)}function Wc(t){const e=T(l=>l.client),n=T(l=>l.status),s=M(l=>{var d;return t?((d=l.sessions[t])==null?void 0:d.agentId)??null:null}),o=M(l=>{var d;return t?(d=l.sessions[t])==null?void 0:d.status:void 0}),r=S.useRef(!1),a=S.useRef(void 0);S.useEffect(()=>{if(n!=="open"||!e||!t||!s)return;let l=!1;const d=async()=>{if(!r.current){r.current=!0;try{const h=await e.agent(s).sessionStats();l||jt(t,h)}catch{}finally{r.current=!1}}};d();const u=setInterval(()=>void d(),zc);return()=>{l=!0,clearInterval(u)}},[n,e,t,s]),S.useEffect(()=>{const l=a.current;a.current=o,Hc(l,o)&&(n!=="open"||!e||!t||!s||(r.current=!1,e.agent(s).sessionStats().then(d=>jt(t,d)).catch(()=>{})))},[o,n,e,t,s])}function Lc(t){return typeof t=="object"&&t!==null&&"type"in t&&t.type==="checkout_status_update"&&"cwd"in t&&typeof t.cwd=="string"&&"projection"in t&&typeof t.projection=="object"&&t.projection!==null}function Uc(t){const e=T(r=>r.client),n=G(r=>r.applyProjection),s=G(r=>r.setSubscribedCwd),o=S.useRef(e);return o.current=e,S.useEffect(()=>{if(!e||!t)return;let r=!1;e.connection.request("checkout_status_subscribe",{cwd:t}).catch(()=>{}),s(t);const a=e.connection.onSessionMessage(l=>{if(r)return;const d=l;Lc(d)&&d.cwd===t&&n(d.projection)});return e.connection.request("checkout_refresh_request",{cwd:t}).catch(()=>{}),()=>{r=!0,a(),e.connection.request("checkout_status_unsubscribe",{cwd:t}).catch(()=>{}),s(null)}},[e,t,n,s]),{refresh(){const r=o.current;!r||!t||r.connection.request("checkout_refresh_request",{cwd:t}).catch(()=>{})}}}const it="--";function _e(t){return t===void 0?it:t<1e3?String(t):t<1e6?`${(t/1e3).toFixed(1)}k`:`${(t/1e6).toFixed(1)}M`}function Kc(t){if(t==null)return it;const e=t<=1?t*100:t;return`${Math.round(e)}%`}function Gc(t){if(t===void 0)return it;const e=t<1?4:2;return`$${t.toFixed(e)}`}function Vc(t,e){return e?t===e?"~":t.startsWith(`${e}/`)?`~${t.slice(e.length)}`:t:t}function Jc(t,e){const n=[];return t>0&&n.push(`↑${t}`),e>0&&n.push(`↓${e}`),n.join(" ")}function Yc(t,e=!0){const n=T(s=>s.client);return Et({queryKey:at.providerModels(t),queryFn:async()=>{if(!n)throw new Error("not connected");return(await n.providers.listModels(t)).models},enabled:!!n&&!!t&&e})}function Xc(t,e){if(e.trim()==="")return t;const n=e.toLowerCase();return t.filter(s=>s.label.toLowerCase().includes(n)||s.description!==void 0&&s.description.toLowerCase().includes(n))}function Qc(t,e){if(!e)return t;const n=t.find(s=>s.id===e);return n?[n,...t.filter(s=>s.id!==e)]:t}function Zc(t){const e=new Set;return t.filter(n=>e.has(n.id)?!1:(e.add(n.id),!0))}const el="_content_17y31_4",tl="_search_17y31_17",nl="_list_17y31_35",sl="_item_17y31_40",ol="_checkSlot_17y31_55",rl="_label_17y31_64",al="_modelId_17y31_70",il="_state_17y31_77",cl="_stateError_17y31_86",K={content:el,search:tl,list:nl,item:sl,checkSlot:ol,label:rl,modelId:al,state:il,stateError:cl};function ll({currentModel:t,provider:e,onSelect:n,renderTrigger:s}){const[o,r]=S.useState(!1),[a,l]=S.useState(""),d=S.useRef(null),{data:u=[],isLoading:h,isError:m,error:f}=Yc(e,o),y=Zc(Qc(u,t));S.useEffect(()=>{var j;o&&(l(""),(j=d.current)==null||j.focus())},[o]);const x=new Map(y.map(j=>[j.id,j.provider])),w=y.map(j=>({value:j.id,label:j.label??j.id,description:j.id})),g=Xc(w,a),R=f instanceof Error?f.message:"Failed to load models";function k(j){j.stopPropagation(),j.key==="Escape"&&r(!1)}return i.jsxs(qe,{open:o,onOpenChange:r,modal:!1,children:[i.jsx(Me,{asChild:!0,children:s(t)}),i.jsx(Be,{children:i.jsxs($e,{className:K.content,align:"start",sideOffset:4,children:[i.jsx("input",{ref:d,className:K.search,placeholder:"Search models…",value:a,onChange:j=>l(j.target.value),onKeyDown:k}),h&&i.jsx("div",{className:K.state,children:i.jsx(an,{size:"sm"})}),!h&&m&&i.jsx("div",{className:K.stateError,children:R}),!h&&!m&&g.length===0&&i.jsx("div",{className:K.state,children:"No models found"}),!h&&!m&&g.length>0&&i.jsx("div",{className:K.list,children:g.map(j=>i.jsxs(Y,{className:K.item,onSelect:()=>n(j.value,x.get(j.value)),children:[i.jsx("span",{className:K.checkSlot,"aria-hidden":!0,children:j.value===t&&i.jsx(At,{size:14})}),i.jsx("span",{className:K.label,children:j.label}),i.jsxs("span",{className:K.modelId,children:["(",j.value,")"]})]},j.value))})]})})]})}const dl="_statusBar_tm1j6_1",ul="_segmentGroup_tm1j6_16",pl="_chevron_tm1j6_20",fl="_segment_tm1j6_16",hl="_icon_tm1j6_33",ml="_modelSegment_tm1j6_39",gl="_modelChevron_tm1j6_63",_l="_text_tm1j6_74",W={statusBar:dl,segmentGroup:ul,chevron:pl,segment:fl,icon:hl,modelSegment:ml,modelChevron:gl,text:_l};function yl(){const t=M(g=>g.activeSessionId),e=M(g=>t?g.sessions[t]:void 0),n=T(g=>g.client),s=M(g=>g.setModel),o=rt(),r=N(g=>g.activeWorkspaceCwd);Uc(r||"");const a=G(g=>g.available),l=G(g=>g.branch),d=G(g=>g.ahead),u=G(g=>g.behind),h=G(g=>g.detached),m=G(g=>g.conflictCount),f=G(g=>g.changes.length),y=un(g=>t?g.bySession[t]:void 0);Wc(t);const x=[];if(e){const g=Vc(e.cwd,o);x.push({key:"cwd",icon:i.jsx(tt,{size:13}),text:g,title:e.cwd})}if(a){const g=Jc(d,u),R=[h?"(detached)":l??"?"];g&&R.push(g),f>0&&R.push(`●${f}`),m>0&&R.push(`⚠${m}`),x.push({key:"branch",icon:i.jsx(An,{size:13}),text:R.join(" ")})}if(e){const g=`${Kc(y==null?void 0:y.contextPercent)} (${_e(y==null?void 0:y.contextTokens)}/${_e(y==null?void 0:y.contextWindow)})`;x.push({key:"context",icon:i.jsx(Dn,{size:13}),text:g}),x.push({key:"tokens",icon:i.jsx(On,{size:13}),text:_e(y==null?void 0:y.totalTokens),title:`in ${_e(y==null?void 0:y.inputTokens)} / out ${_e(y==null?void 0:y.outputTokens)}`}),x.push({key:"cost",icon:i.jsx(Pn,{size:13}),text:Gc(y==null?void 0:y.cost)})}function w(g,R){if(t&&(s(t,g,R),!!n)){if(!(e!=null&&e.agentId)){Ra(n,t).catch(()=>{});return}R&&n.agent(e.agentId).setModel(R,g).catch(()=>{})}}return i.jsxs("div",{className:W.statusBar,children:[e&&i.jsx("span",{className:W.segmentGroup,children:i.jsx(ll,{currentModel:e.model,provider:"pi",onSelect:w,renderTrigger:g=>i.jsxs("button",{type:"button",className:W.modelSegment,disabled:!n,title:g?`Model: ${g}`:"Select model",children:[i.jsx("span",{className:W.icon,children:i.jsx(Fn,{size:13})}),i.jsx("span",{className:W.text,children:g??"Model"}),i.jsx(qt,{size:12,className:W.modelChevron,"aria-hidden":"true"})]})})}),x.map((g,R)=>i.jsxs("span",{className:W.segmentGroup,children:[(!!e||R>0)&&i.jsx(et,{size:12,className:W.chevron,"aria-hidden":"true"}),i.jsxs("span",{className:W.segment,title:g.title,children:[i.jsx("span",{className:W.icon,children:g.icon}),i.jsx("span",{className:W.text,children:g.text})]})]},g.key))]})}const bl="_wrapper_131x2_3",wl="_box_131x2_18",Sl="_checkmark_131x2_36",xl="_nativeInput_131x2_41",Ee={wrapper:bl,box:wl,checkmark:Sl,nativeInput:xl};S.forwardRef(function({label:e,checked:n=!1,disabled:s,className:o,onChange:r,...a},l){return i.jsxs("label",{className:Ee.wrapper,"data-disabled":s||void 0,children:[i.jsx("input",{ref:l,type:"checkbox",className:Ee.nativeInput,checked:n,disabled:s,onChange:r,...a}),i.jsx("span",{className:Ee.box,"data-checked":n,"aria-hidden":!0,children:n&&i.jsx(At,{size:12,className:Ee.checkmark})}),e&&i.jsx("span",{children:e})]})});const vl="_select_vj45v_3",kl={select:vl};S.forwardRef(function({options:e,placeholder:n,className:s,...o},r){return i.jsxs("select",{ref:r,className:A(kl.select,s),...o,children:[n&&i.jsx("option",{value:"",disabled:!0,children:n}),e.map(a=>i.jsx("option",{value:a.value,children:a.label},a.value))]})});const Il="_overlay_1yaef_1",Cl="_contentWrapper_1yaef_7",jl="_dialog_1yaef_16",Tl="_header_1yaef_28",El="_title_1yaef_36",Nl="_closeBtn_1yaef_43",Rl="_body_1yaef_57",ql="_footer_1yaef_63",Ml="_bare_1yaef_72",Bl="_bareBody_1yaef_78",$l="_bareCloseBtn_1yaef_82",Al="_visuallyHidden_1yaef_101",F={overlay:Il,contentWrapper:Cl,dialog:jl,header:Tl,title:El,closeBtn:Nl,body:Rl,footer:ql,bare:Ml,bareBody:Bl,bareCloseBtn:$l,visuallyHidden:Al},Dl=Ke;function Ol({open:t,onOpenChange:e,title:n,children:s,footer:o,width:r,className:a,bare:l=!1}){return i.jsx(Hn,{open:t,onOpenChange:e,children:i.jsxs(Wn,{children:[i.jsx(Ln,{className:F.overlay}),i.jsx("div",{className:F.contentWrapper,children:i.jsxs(Un,{className:A(F.dialog,l&&F.bare,a),style:r!==void 0?{width:r}:void 0,children:[l?i.jsx(dt,{className:F.visuallyHidden,children:n}):i.jsxs("div",{className:F.header,children:[i.jsx(dt,{className:F.title,children:n}),i.jsx(Ke,{asChild:!0,children:i.jsx("button",{type:"button",className:F.closeBtn,"aria-label":"Close",children:i.jsx(Ue,{size:16})})})]}),i.jsx("div",{className:A(F.body,l&&F.bareBody),children:s}),l&&i.jsx(Ke,{asChild:!0,children:i.jsx("button",{type:"button",className:F.bareCloseBtn,"aria-label":"Close",children:i.jsx(Ue,{size:16})})}),o&&i.jsx("div",{className:F.footer,children:o})]})})]})})}const Pl="_handle_1ocv1_1",Fl={handle:Pl};function Tt({side:t,onResize:e,className:n}){const s=S.useRef(0),o=S.useCallback(l=>{const d=l.clientX-s.current;s.current=l.clientX,e(t==="left"?d:-d)},[e,t]),r=S.useCallback(l=>{var d,u;window.removeEventListener("pointermove",o),window.removeEventListener("pointerup",r),document.body.style.cursor="",document.body.style.userSelect="",(u=(d=l.target)==null?void 0:d.releasePointerCapture)==null||u.call(d,l.pointerId)},[o]);function a(l){l.preventDefault(),s.current=l.clientX,document.body.style.cursor="col-resize",document.body.style.userSelect="none",window.addEventListener("pointermove",o),window.addEventListener("pointerup",r)}return i.jsx("div",{className:A(Fl.handle,n),onPointerDown:a,role:"separator","aria-orientation":"vertical"})}function zl(t,e){const{order:n,sessions:s}=M.getState(),r=rn(n,s,e).find(a=>a.cwd===t);if(r!=null&&r.sessions[0]){const a=r.sessions[0].id;M.getState().activate(a);const l=M.getState().sessions[a];N.getState().open({id:V.chat(a),kind:"chat",label:(l==null?void 0:l.title)??"New chat",closable:!0,data:{sessionId:a},workspaceCwd:t})}else De(t);I.getState().setCwd(t)}const Hl="_pathRow_9xphl_1",Wl="_pathInput_9xphl_9",Ll="_list_9xphl_13",Ul="_item_9xphl_20",Kl="_name_9xphl_32",Gl="_emptyState_9xphl_37",Z={pathRow:Hl,pathInput:Wl,list:Ll,item:Ul,name:Kl,emptyState:Gl};function Vl(){const t=I(k=>k.cwdPickerOpen),e=I(k=>k.closeCwdPicker),n=N(k=>k.activeWorkspaceCwd),s=T(k=>k.client),o=rt(),[r,a]=S.useState("/"),[l,d]=S.useState("/");S.useEffect(()=>{if(!t)return;const k=re(n||"~",o);a(k),d(k)},[t,s,n]);const{data:u,isLoading:h,isError:m,error:f}=Hi(r,t&&!!s),y=((u==null?void 0:u.entries)??[]).filter(k=>k.kind==="directory");function x(k){a(k),d(k)}function w(){x(r.split("/").slice(0,-1).join("/")||"/")}function g(){x(l.trim())}function R(){zl(r,o),e()}return i.jsxs(Ol,{open:t,onOpenChange:k=>!k&&e(),title:"Open Workspace",footer:i.jsxs(i.Fragment,{children:[i.jsx(Dl,{asChild:!0,children:i.jsx(L,{size:"sm",variant:"secondary",children:"Cancel"})}),i.jsx(L,{size:"sm",onClick:R,children:"Open this folder"})]}),children:[i.jsxs("div",{className:Z.pathRow,children:[i.jsx(L,{size:"xs",variant:"ghost",iconOnly:!0,title:"Up",onClick:w,children:i.jsx(zn,{size:13})}),i.jsx(Ve,{className:Z.pathInput,value:l,onChange:k=>d(k.target.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),g())}}),i.jsx(L,{size:"xs",onClick:g,children:"Go"})]}),i.jsx("div",{className:Z.list,children:h?i.jsx("div",{className:Z.emptyState,children:"Loading..."}):m?i.jsxs("div",{className:Z.emptyState,children:["Error: ",f instanceof Error?f.message:"unknown error"]}):y.length===0?i.jsx("div",{className:Z.emptyState,children:"No subdirectories"}):y.map(k=>i.jsxs("div",{className:Z.item,onClick:()=>x(r==="/"?`/${k.name}`:`${r}/${k.name}`),children:[i.jsx(tt,{size:14}),i.jsx("span",{className:Z.name,children:k.name})]},k.name))})]})}const Jl="_shell_1m1nv_1",Yl="_main_1m1nv_7",Xl="_sidebarLeft_1m1nv_13",Ql="_leftHandle_1m1nv_21",Zl="_center_1m1nv_24",ed="_sidebarRight_1m1nv_31",td="_rightHandle_1m1nv_39",oe={shell:Jl,main:Yl,sidebarLeft:Xl,leftHandle:Ql,center:Zl,sidebarRight:ed,rightHandle:td};function nd(){const t=I(a=>a.leftSidebarCollapsed),e=I(a=>a.rightSidebarCollapsed),n=I(a=>a.leftSidebarWidth),s=I(a=>a.rightSidebarWidth),o=I(a=>a.resizeLeftSidebar),r=I(a=>a.resizeRightSidebar);return i.jsxs("div",{className:oe.shell,children:[i.jsx(ha,{}),i.jsxs("div",{className:oe.main,children:[!t&&i.jsxs("aside",{className:oe.sidebarLeft,style:{width:n},children:[i.jsx(fi,{}),i.jsx(Tt,{side:"left",className:oe.leftHandle,onResize:o})]}),i.jsxs("div",{className:oe.center,children:[i.jsx(ji,{}),i.jsx(Pi,{})]}),!e&&i.jsxs("aside",{className:oe.sidebarRight,style:{width:s},children:[i.jsx(Tt,{side:"right",className:oe.rightHandle,onResize:r}),i.jsx(Fc,{})]})]}),i.jsx(yl,{}),i.jsx(Vl,{})]})}function sd(){const t=S.useRef(!1);S.useEffect(()=>{if(t.current)return;if(t.current=!0,window.location.hash.includes("offer=")){const d=window.location.href;I.getState().setHost(d),T.getState().connect({url:d});return}const e=new URLSearchParams(window.location.search),n=e.get("host"),s=e.get("pair"),o=e.get("password"),r=e.get("cwd"),a=e.get("connect")==="1",l=I.getState();if(s?l.setHost(s):n&&l.setHost(n),o&&l.setPassword(o),r&&l.setCwd(r),s)T.getState().connect({url:s});else if(a){const{host:d,password:u}=I.getState();T.getState().connect({url:d,password:u||void 0})}},[])}function od(t){return typeof t=="object"&&t!==null&&"kind"in t}function rd(t){const e=[];for(const n of t)if(od(n))if(n.kind==="other")n.event&&e.push(n.event);else for(const s of n.events??[])e.push(s);return e}function ad(t){return typeof t.model=="string"}function id(){const t=T(s=>s.client),e=T(s=>s.status),n=S.useRef(!1);S.useEffect(()=>{e!=="open"||!t||n.current||(n.current=!0,(async()=>{var d;let s=[];try{s=(await t.connection.request("list_agents_request",{all:!1})).agents??[]}catch{s=[]}s.sort((u,h)=>(h.lastActivity??0)-(u.lastActivity??0));const o=M.getState();for(const u of s){if(o.findByAgentId(u.agentId))continue;let h=Xe;try{const m=await t.agent(u.agentId).timeline.fetch({direction:"after",limit:200});h=rd(m.items).reduce(sn,Xe)}catch{}o.hydrate({id:`s-${u.agentId.slice(0,12)}`,agentId:u.agentId,title:u.title||((d=u.cwd)==null?void 0:d.split("/").pop())||"Restored",status:u.status??"idle",cwd:u.cwd||"~",timeline:h,userMessageCount:h.rows.filter(m=>m.kind==="user").length,model:u.model,modelProvider:u.modelProvider})}const r=await Oe(t).catch(()=>null),{order:a,sessions:l}=M.getState();if(a.length>0){const u=l[a[0]??""];if(u){const h=re(u.cwd||"~",r);M.getState().activate(u.id),I.getState().setCwd(u.cwd),N.getState().open({id:V.chat(u.id),kind:"chat",label:u.title,closable:!0,data:{sessionId:u.id},workspaceCwd:h})}}else{const u=I.getState().cwd||"~",h=re(u,r);De(h)}})())},[e,t]),S.useEffect(()=>{if(!(e!=="open"||!t))return t.onAgentUpdate(s=>{if(ad(s)){const o=typeof s.modelProvider=="string"?s.modelProvider:void 0;M.getState().setModelByAgentId(s.agentId,s.model,o)}})},[e,t])}function cd(){const t=T(s=>s.client),e=T(s=>s.status),n=S.useRef(!1);S.useEffect(()=>{e!=="open"||!t||n.current||(n.current=!0,(async()=>{let s=[];try{s=(await t.connection.request("list_terminals_request",{})).terminals??[]}catch{s=[]}if(s.length===0)return;const o=await Oe(t).catch(()=>null),r=N.getState().open;for(const a of s){if(a.closed)continue;const l=re(a.cwd||"~",o);r({id:V.terminal(a.slot),kind:"terminal",label:a.name,closable:!0,data:{slot:a.slot,cwd:l},workspaceCwd:l})}})())},[e,t])}function ld(){S.useEffect(()=>{function t(e){const n=I.getState();if(e.key==="Escape"){n.closeCwdPicker(),n.closeSessionMenu();return}const s=e.ctrlKey||e.metaKey;if(s&&e.key.toLowerCase()==="t"){e.preventDefault(),on(N.getState().activeWorkspaceCwd||"~");return}if(s&&e.key.toLowerCase()==="w"){const{activeTabId:o,tabs:r,close:a}=N.getState();if(!o)return;const l=r.find(d=>d.id===o);(l==null?void 0:l.closable)!==!1&&(e.preventDefault(),a(o))}}return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[])}function dd(){return sd(),id(),cd(),ld(),null}function ud(){return i.jsxs(Ws,{children:[i.jsx(dd,{}),i.jsx(nd,{})]})}const pn=document.getElementById("root");if(!pn)throw new Error("Missing #root element");bn.createRoot(pn).render(i.jsx(S.StrictMode,{children:i.jsx(ud,{})}));export{L as B,Ol as D,an as S,Sd as T,T as a,xd as b,N as c,It as d,Ra as e,at as r,ma as t,M as u};
|
|
3
|
+
//# sourceMappingURL=index-CXS9Grd7.js.map
|