@av-pi-studio/web-client 0.0.9 → 0.0.11
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-BVnOJSh_.js → BinaryFallbackViewer-B5XuuZJX.js} +2 -2
- package/dist/web/assets/{BinaryFallbackViewer-BVnOJSh_.js.map → BinaryFallbackViewer-B5XuuZJX.js.map} +1 -1
- package/dist/web/assets/{ChatPanel-BOR3MYdN.js → ChatPanel-6y4_CIof.js} +2 -2
- package/dist/web/assets/{ChatPanel-BOR3MYdN.js.map → ChatPanel-6y4_CIof.js.map} +1 -1
- package/dist/web/assets/{CodeView-BJb8T6q4.js → CodeView-Cs8mamsP.js} +2 -2
- package/dist/web/assets/{CodeView-BJb8T6q4.js.map → CodeView-Cs8mamsP.js.map} +1 -1
- package/dist/web/assets/{FilePanel-lERDJldp.js → FilePanel-DZQ3Ebt0.js} +3 -3
- package/dist/web/assets/{FilePanel-lERDJldp.js.map → FilePanel-DZQ3Ebt0.js.map} +1 -1
- package/dist/web/assets/{ImageViewer-Cnr0mhRu.js → ImageViewer-4r7WUMsE.js} +2 -2
- package/dist/web/assets/{ImageViewer-Cnr0mhRu.js.map → ImageViewer-4r7WUMsE.js.map} +1 -1
- package/dist/web/assets/{MarkdownFileViewer-CDHJBxdH.js → MarkdownFileViewer-nYG7CqrM.js} +2 -2
- package/dist/web/assets/{MarkdownFileViewer-CDHJBxdH.js.map → MarkdownFileViewer-nYG7CqrM.js.map} +1 -1
- package/dist/web/assets/{TerminalPanel-cnkK_YF5.js → TerminalPanel-zbfBqrQA.js} +2 -2
- package/dist/web/assets/{TerminalPanel-cnkK_YF5.js.map → TerminalPanel-zbfBqrQA.js.map} +1 -1
- package/dist/web/assets/{TextViewer-DWYO-J8z.js → TextViewer-Ck0ZpcxT.js} +2 -2
- package/dist/web/assets/{TextViewer-DWYO-J8z.js.map → TextViewer-Ck0ZpcxT.js.map} +1 -1
- package/dist/web/assets/{VideoViewer-D2ZnEQoA.js → VideoViewer-Bel4eeXC.js} +2 -2
- package/dist/web/assets/{VideoViewer-D2ZnEQoA.js.map → VideoViewer-Bel4eeXC.js.map} +1 -1
- package/dist/web/assets/index-DgUa1nu2.js +3 -0
- package/dist/web/assets/index-DgUa1nu2.js.map +1 -0
- package/dist/web/assets/{use-file-download-BpyWNVxA.js → use-file-download-BdS-AJjX.js} +2 -2
- package/dist/web/assets/{use-file-download-BpyWNVxA.js.map → use-file-download-BdS-AJjX.js.map} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +3 -3
- package/dist/web/assets/index-DnTTpAX5.js +0 -3
- package/dist/web/assets/index-DnTTpAX5.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var m=Object.defineProperty;var p=(n,e,t)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var l=(n,e,t)=>p(n,typeof e!="symbol"?e+"":e,t);import{r as u}from"./vendor-react-BoIQBqDW.js";import{u as h}from"./vendor-query-CAh-Aqig.js";import{a as d,r as w}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-file-download-
|
|
1
|
+
var m=Object.defineProperty;var p=(n,e,t)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var l=(n,e,t)=>p(n,typeof e!="symbol"?e+"":e,t);import{r as u}from"./vendor-react-BoIQBqDW.js";import{u as h}from"./vendor-query-CAh-Aqig.js";import{a as d,r as w}from"./index-DgUa1nu2.js";import"./vendor-BFXtRv5b.js";function y(n){const e=n.reduce((i,s)=>i+s.length,0),t=new Uint8Array(e);let o=0;for(const i of n)t.set(i,o),o+=i.length;return t}class g{constructor(e){l(this,"pending",new Map);l(this,"nextStream",1);l(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[t,o]of this.pending)o.reject(new Error("file transfer router stopped")),this.pending.delete(t)}async download(e){const t=await this.daemon.request("file_download_token_request",{path:e});if(!t.ok||!t.token)throw new Error(t.error??"failed to issue download token");const o=this.nextStream++,i=new Promise((a,r)=>{this.pending.set(o,{chunks:[],meta:{},resolve:a,reject:r})}),s=await this.daemon.request("file_download_request",{token:t.token,stream:o});if(!s.ok)throw this.pending.delete(o),new Error(s.error??"download request failed");return i}dispatch(e){const t=this.pending.get(e.stream);if(t)switch(e.opcode){case"Begin":t.meta.fileName=e.meta.fileName,t.meta.mimeType=e.meta.mimeType;return;case"Chunk":t.chunks.push(e.data);return;case"End":this.pending.delete(e.stream),e.ok?t.resolve({bytes:y(t.chunks),...t.meta}):t.reject(new Error("download failed"));return;case"Error":this.pending.delete(e.stream),t.reject(new Error(e.message));return}}}const f=new WeakMap;function k(n){let e=f.get(n);return e||(e=new g(n),e.start(),f.set(n,e)),e}function q(n,e=!0){var a;const t=d(r=>r.client),o=d(r=>r.daemon),i=h({queryKey:w.fileDownload(n),queryFn:async()=>{if(!t||!o)throw new Error("not connected");const r=await k(o).download(n),c=new Blob([Uint8Array.from(r.bytes)],{type:r.mimeType||"application/octet-stream"});return{objectUrl:URL.createObjectURL(c),mimeType:r.mimeType,fileName:r.fileName}},enabled:!!t&&!!o&&!!n&&e,staleTime:1/0,gcTime:0}),s=u.useRef(null);return u.useEffect(()=>{var c;const r=((c=i.data)==null?void 0:c.objectUrl)??null;r&&s.current&&s.current!==r&&URL.revokeObjectURL(s.current),s.current=r},[(a=i.data)==null?void 0:a.objectUrl]),u.useEffect(()=>()=>{s.current&&URL.revokeObjectURL(s.current)},[]),i}export{q as u};
|
|
2
|
+
//# sourceMappingURL=use-file-download-BdS-AJjX.js.map
|
package/dist/web/assets/{use-file-download-BpyWNVxA.js.map → use-file-download-BdS-AJjX.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-file-download-BpyWNVxA.js","sources":["../../../../client/src/file-transfer-client.ts","../../../src/hooks/use-file-download.ts"],"sourcesContent":["import { type FileTransferFrame } from \"@av-pi-studio/protocol\";\n\nimport type { DaemonClient } from \"./daemon-client.js\";\n\n/**\n * Client-side demux + assembly for binary file downloads (features/file-explorer-transfer.md\n * § Binary transfer frames). Mirrors `TerminalStreamRouter`'s inbound-frame-routing shape, but a\n * download is a one-shot request/response rather than a persistent per-slot subscription: request\n * a token, request the download, await the assembled bytes.\n */\n\nexport interface DownloadedFile {\n bytes: Uint8Array;\n fileName?: string;\n mimeType?: string;\n}\n\ninterface PendingDownload {\n chunks: Uint8Array[];\n meta: { fileName?: string; mimeType?: string };\n resolve: (file: DownloadedFile) => void;\n reject: (error: Error) => void;\n}\n\ninterface TokenResponse {\n ok: boolean;\n token?: string;\n error?: string;\n}\n\ninterface DownloadRequestResponse {\n ok: boolean;\n error?: string;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class FileTransferClient {\n private readonly pending = new Map<number, PendingDownload>();\n private nextStream = 1;\n private detach: (() => void) | null = null;\n\n constructor(private readonly daemon: DaemonClient) {}\n\n /** Begin routing inbound file-transfer frames. Idempotent. */\n start(): void {\n if (this.detach) return;\n this.detach = this.daemon.onFileTransferFrame((frame) => this.dispatch(frame));\n }\n\n /** Stop routing inbound frames. Any downloads still pending are rejected. */\n stop(): void {\n this.detach?.();\n this.detach = null;\n for (const [stream, pending] of this.pending) {\n pending.reject(new Error(\"file transfer router stopped\"));\n this.pending.delete(stream);\n }\n }\n\n /**\n * Download the file at `path`: requests a single-use token, then requests the chunked\n * transfer, assembling `Begin → Chunk* → End` frames into one buffer.\n */\n async download(path: string): Promise<DownloadedFile> {\n const tokenResponse = await this.daemon.request<TokenResponse>(\n \"file_download_token_request\",\n { path },\n );\n if (!tokenResponse.ok || !tokenResponse.token) {\n throw new Error(tokenResponse.error ?? \"failed to issue download token\");\n }\n\n const stream = this.nextStream++;\n const result = new Promise<DownloadedFile>((resolve, reject) => {\n this.pending.set(stream, { chunks: [], meta: {}, resolve, reject });\n });\n\n const requestResponse = await this.daemon.request<DownloadRequestResponse>(\n \"file_download_request\",\n { token: tokenResponse.token, stream },\n );\n if (!requestResponse.ok) {\n this.pending.delete(stream);\n throw new Error(requestResponse.error ?? \"download request failed\");\n }\n\n return result;\n }\n\n private dispatch(frame: FileTransferFrame): void {\n const pending = this.pending.get(frame.stream);\n if (!pending) return; // not a download stream we're tracking (e.g. an upload) — ignore\n switch (frame.opcode) {\n case \"Begin\":\n pending.meta.fileName = frame.meta.fileName;\n pending.meta.mimeType = frame.meta.mimeType;\n return;\n case \"Chunk\":\n pending.chunks.push(frame.data);\n return;\n case \"End\":\n this.pending.delete(frame.stream);\n if (frame.ok) {\n pending.resolve({ bytes: concat(pending.chunks), ...pending.meta });\n } else {\n pending.reject(new Error(\"download failed\"));\n }\n return;\n case \"Error\":\n this.pending.delete(frame.stream);\n pending.reject(new Error(frame.message));\n return;\n }\n }\n}\n","/**\n * `use-file-download` — TanStack Query wrapper over the binary file-transfer download path\n * (`file_download_token_request` → `file_download_request` → chunked `Begin`/`Chunk`/`End`\n * binary frames), for viewers that need raw bytes rather than the UTF-8 preview\n * `file_read_request` returns (images, video — POC_TO_APP_PLAN_UI.md §4.5 follow-up: modular\n * file preview). Resolves to an object URL, revoked once superseded by a new one or once this\n * consumer unmounts.\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { DaemonClient } from \"@av-pi-studio/client\";\nimport { FileTransferClient } from \"@av-pi-studio/client\";\nimport { useConnectionStore } from \"@pi-studio-ui/lib/connection/connection-store.js\";\nimport { rpcKeys } from \"@pi-studio-ui/lib/connection/rpc-keys.js\";\n\n// One FileTransferClient per daemon connection — mirrors `TerminalPanel.tsx`'s `routerFor`\n// (multiple viewers share the one frame demuxer over the shared socket).\nconst transferByDaemon = new WeakMap<DaemonClient, FileTransferClient>();\n\nfunction transferFor(daemon: DaemonClient): FileTransferClient {\n let transfer = transferByDaemon.get(daemon);\n if (!transfer) {\n transfer = new FileTransferClient(daemon);\n transfer.start();\n transferByDaemon.set(daemon, transfer);\n }\n return transfer;\n}\n\nexport interface FileDownload {\n objectUrl: string;\n mimeType?: string;\n fileName?: string;\n}\n\nexport function useFileDownload(path: string, enabled = true) {\n const client = useConnectionStore((s) => s.client);\n const daemon = useConnectionStore((s) => s.daemon);\n\n const query = useQuery({\n queryKey: rpcKeys.fileDownload(path),\n queryFn: async (): Promise<FileDownload> => {\n if (!client || !daemon) throw new Error(\"not connected\");\n const file = await transferFor(daemon).download(path);\n // `Blob`'s DOM typings require an `ArrayBuffer`-backed view; the assembled `Uint8Array`'s\n // `ArrayBufferLike` backing (a decode-time implementation detail) doesn't satisfy that on\n // its own, so copy into a plain `ArrayBuffer`-backed `Uint8Array` first.\n const blob = new Blob([Uint8Array.from(file.bytes)], {\n type: file.mimeType || \"application/octet-stream\",\n });\n return { objectUrl: URL.createObjectURL(blob), mimeType: file.mimeType, fileName: file.fileName };\n },\n enabled: Boolean(client) && Boolean(daemon) && Boolean(path) && enabled,\n // Object URLs are process-local, non-serializable browser resources — never persist them or\n // silently refetch behind this hook's back (that would leak the previous blob's URL).\n staleTime: Infinity,\n gcTime: 0,\n });\n\n // Revoke the previous object URL once a new one supersedes it, and the current one on unmount\n // — TanStack Query's cache has no notion that this value owns a browser resource to release.\n const urlRef = useRef<string | null>(null);\n useEffect(() => {\n const nextUrl = query.data?.objectUrl ?? null;\n if (nextUrl && urlRef.current && urlRef.current !== nextUrl) {\n URL.revokeObjectURL(urlRef.current);\n }\n urlRef.current = nextUrl;\n }, [query.data?.objectUrl]);\n\n useEffect(() => {\n return () => {\n if (urlRef.current) URL.revokeObjectURL(urlRef.current);\n };\n }, []);\n\n return query;\n}\n"],"names":["concat","chunks","total","sum","c","out","offset","chunk","FileTransferClient","daemon","__publicField","frame","_a","stream","pending","path","tokenResponse","result","resolve","reject","requestResponse","transferByDaemon","transferFor","transfer","useFileDownload","enabled","client","useConnectionStore","s","query","useQuery","rpcKeys","file","blob","urlRef","useRef","useEffect","nextUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-file-download-BdS-AJjX.js","sources":["../../../../client/src/file-transfer-client.ts","../../../src/hooks/use-file-download.ts"],"sourcesContent":["import { type FileTransferFrame } from \"@av-pi-studio/protocol\";\n\nimport type { DaemonClient } from \"./daemon-client.js\";\n\n/**\n * Client-side demux + assembly for binary file downloads (features/file-explorer-transfer.md\n * § Binary transfer frames). Mirrors `TerminalStreamRouter`'s inbound-frame-routing shape, but a\n * download is a one-shot request/response rather than a persistent per-slot subscription: request\n * a token, request the download, await the assembled bytes.\n */\n\nexport interface DownloadedFile {\n bytes: Uint8Array;\n fileName?: string;\n mimeType?: string;\n}\n\ninterface PendingDownload {\n chunks: Uint8Array[];\n meta: { fileName?: string; mimeType?: string };\n resolve: (file: DownloadedFile) => void;\n reject: (error: Error) => void;\n}\n\ninterface TokenResponse {\n ok: boolean;\n token?: string;\n error?: string;\n}\n\ninterface DownloadRequestResponse {\n ok: boolean;\n error?: string;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class FileTransferClient {\n private readonly pending = new Map<number, PendingDownload>();\n private nextStream = 1;\n private detach: (() => void) | null = null;\n\n constructor(private readonly daemon: DaemonClient) {}\n\n /** Begin routing inbound file-transfer frames. Idempotent. */\n start(): void {\n if (this.detach) return;\n this.detach = this.daemon.onFileTransferFrame((frame) => this.dispatch(frame));\n }\n\n /** Stop routing inbound frames. Any downloads still pending are rejected. */\n stop(): void {\n this.detach?.();\n this.detach = null;\n for (const [stream, pending] of this.pending) {\n pending.reject(new Error(\"file transfer router stopped\"));\n this.pending.delete(stream);\n }\n }\n\n /**\n * Download the file at `path`: requests a single-use token, then requests the chunked\n * transfer, assembling `Begin → Chunk* → End` frames into one buffer.\n */\n async download(path: string): Promise<DownloadedFile> {\n const tokenResponse = await this.daemon.request<TokenResponse>(\n \"file_download_token_request\",\n { path },\n );\n if (!tokenResponse.ok || !tokenResponse.token) {\n throw new Error(tokenResponse.error ?? \"failed to issue download token\");\n }\n\n const stream = this.nextStream++;\n const result = new Promise<DownloadedFile>((resolve, reject) => {\n this.pending.set(stream, { chunks: [], meta: {}, resolve, reject });\n });\n\n const requestResponse = await this.daemon.request<DownloadRequestResponse>(\n \"file_download_request\",\n { token: tokenResponse.token, stream },\n );\n if (!requestResponse.ok) {\n this.pending.delete(stream);\n throw new Error(requestResponse.error ?? \"download request failed\");\n }\n\n return result;\n }\n\n private dispatch(frame: FileTransferFrame): void {\n const pending = this.pending.get(frame.stream);\n if (!pending) return; // not a download stream we're tracking (e.g. an upload) — ignore\n switch (frame.opcode) {\n case \"Begin\":\n pending.meta.fileName = frame.meta.fileName;\n pending.meta.mimeType = frame.meta.mimeType;\n return;\n case \"Chunk\":\n pending.chunks.push(frame.data);\n return;\n case \"End\":\n this.pending.delete(frame.stream);\n if (frame.ok) {\n pending.resolve({ bytes: concat(pending.chunks), ...pending.meta });\n } else {\n pending.reject(new Error(\"download failed\"));\n }\n return;\n case \"Error\":\n this.pending.delete(frame.stream);\n pending.reject(new Error(frame.message));\n return;\n }\n }\n}\n","/**\n * `use-file-download` — TanStack Query wrapper over the binary file-transfer download path\n * (`file_download_token_request` → `file_download_request` → chunked `Begin`/`Chunk`/`End`\n * binary frames), for viewers that need raw bytes rather than the UTF-8 preview\n * `file_read_request` returns (images, video — POC_TO_APP_PLAN_UI.md §4.5 follow-up: modular\n * file preview). Resolves to an object URL, revoked once superseded by a new one or once this\n * consumer unmounts.\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { DaemonClient } from \"@av-pi-studio/client\";\nimport { FileTransferClient } from \"@av-pi-studio/client\";\nimport { useConnectionStore } from \"@pi-studio-ui/lib/connection/connection-store.js\";\nimport { rpcKeys } from \"@pi-studio-ui/lib/connection/rpc-keys.js\";\n\n// One FileTransferClient per daemon connection — mirrors `TerminalPanel.tsx`'s `routerFor`\n// (multiple viewers share the one frame demuxer over the shared socket).\nconst transferByDaemon = new WeakMap<DaemonClient, FileTransferClient>();\n\nfunction transferFor(daemon: DaemonClient): FileTransferClient {\n let transfer = transferByDaemon.get(daemon);\n if (!transfer) {\n transfer = new FileTransferClient(daemon);\n transfer.start();\n transferByDaemon.set(daemon, transfer);\n }\n return transfer;\n}\n\nexport interface FileDownload {\n objectUrl: string;\n mimeType?: string;\n fileName?: string;\n}\n\nexport function useFileDownload(path: string, enabled = true) {\n const client = useConnectionStore((s) => s.client);\n const daemon = useConnectionStore((s) => s.daemon);\n\n const query = useQuery({\n queryKey: rpcKeys.fileDownload(path),\n queryFn: async (): Promise<FileDownload> => {\n if (!client || !daemon) throw new Error(\"not connected\");\n const file = await transferFor(daemon).download(path);\n // `Blob`'s DOM typings require an `ArrayBuffer`-backed view; the assembled `Uint8Array`'s\n // `ArrayBufferLike` backing (a decode-time implementation detail) doesn't satisfy that on\n // its own, so copy into a plain `ArrayBuffer`-backed `Uint8Array` first.\n const blob = new Blob([Uint8Array.from(file.bytes)], {\n type: file.mimeType || \"application/octet-stream\",\n });\n return { objectUrl: URL.createObjectURL(blob), mimeType: file.mimeType, fileName: file.fileName };\n },\n enabled: Boolean(client) && Boolean(daemon) && Boolean(path) && enabled,\n // Object URLs are process-local, non-serializable browser resources — never persist them or\n // silently refetch behind this hook's back (that would leak the previous blob's URL).\n staleTime: Infinity,\n gcTime: 0,\n });\n\n // Revoke the previous object URL once a new one supersedes it, and the current one on unmount\n // — TanStack Query's cache has no notion that this value owns a browser resource to release.\n const urlRef = useRef<string | null>(null);\n useEffect(() => {\n const nextUrl = query.data?.objectUrl ?? null;\n if (nextUrl && urlRef.current && urlRef.current !== nextUrl) {\n URL.revokeObjectURL(urlRef.current);\n }\n urlRef.current = nextUrl;\n }, [query.data?.objectUrl]);\n\n useEffect(() => {\n return () => {\n if (urlRef.current) URL.revokeObjectURL(urlRef.current);\n };\n }, []);\n\n return query;\n}\n"],"names":["concat","chunks","total","sum","c","out","offset","chunk","FileTransferClient","daemon","__publicField","frame","_a","stream","pending","path","tokenResponse","result","resolve","reject","requestResponse","transferByDaemon","transferFor","transfer","useFileDownload","enabled","client","useConnectionStore","s","query","useQuery","rpcKeys","file","blob","urlRef","useRef","useEffect","nextUrl"],"mappings":"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"}
|
package/dist/web/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Pi-Studio</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DgUa1nu2.js"></script>
|
|
8
8
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-BoIQBqDW.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/vendor-query-CAh-Aqig.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/vendor-markdown-CpaoCv-a.js">
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@av-pi-studio/web-client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"clean": "rm -rf dist *.tsbuildinfo"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@av-pi-studio/client": "^0.0.
|
|
18
|
-
"@av-pi-studio/protocol": "^0.0.
|
|
17
|
+
"@av-pi-studio/client": "^0.0.11",
|
|
18
|
+
"@av-pi-studio/protocol": "^0.0.11",
|
|
19
19
|
"@codemirror/language": "^6.12.4",
|
|
20
20
|
"@codemirror/language-data": "^6.5.2",
|
|
21
21
|
"@codemirror/state": "^6.7.1",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatPanel-BOR3MYdN.js","assets/vendor-react-BoIQBqDW.js","assets/vendor-query-CAh-Aqig.js","assets/vendor-icons-DUloQbkI.js","assets/markdown-Biwdm3dP.js","assets/vendor-highlight-DaTzDdJW.js","assets/vendor-markdown-CpaoCv-a.js","assets/vendor-BFXtRv5b.js","assets/markdown-BQwXm0MF.css","assets/DiffView-B4H-yHuX.js","assets/DiffView-CRbeRztO.css","assets/vendor-overlays-Bo99M0pM.js","assets/vendor-dnd-D9kA7FgH.js","assets/ChatPanel-DW5U4HRf.css","assets/FilePanel-lERDJldp.js","assets/FilePanel-DIInFr3h.css","assets/TerminalPanel-cnkK_YF5.js","assets/vendor-terminal-BhzX2_ts.js","assets/vendor-terminal-DYP7pi_n.css","assets/TerminalPanel-BQj62G6N.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
var bt=Object.defineProperty;var _t=(t,e,n)=>e in t?bt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var k=(t,e,n)=>_t(t,typeof e!="symbol"?e+"":e,n);import{r as v,j as a,d as wt}from"./vendor-react-BoIQBqDW.js";import{Q as yt,a as St,u as vt,b as xt}from"./vendor-query-CAh-Aqig.js";import{A as c,B as m,C as E,D as We,E as q,F as ce,G as H,H as N,I as y,J as B,K as L,L as ge,M as K}from"./vendor-BFXtRv5b.js";import{L as kt,P as It,a as Ct,b as Tt,c as jt,E as Nt,C as Rt,d as Et,F as At,e as He,f as Bt,S as $t,G as Mt,g as Dt,M as Pt,X as me,A as Le,h as Ue,i as qt,T as zt,R as Ot,j as Ft}from"./vendor-icons-DUloQbkI.js";import{R as Wt,T as Ht,P as Lt,C as Ut,I as le,S as Vt,D as Gt,a as Kt,b as Xt,c as Jt,d as Re,e as ye}from"./vendor-overlays-Bo99M0pM.js";import{u as Yt,a as Zt,D as Qt,c as en,S as tn,h as nn,P as sn,b as on,C as rn}from"./vendor-dnd-D9kA7FgH.js";import{_ as Ce}from"./vendor-highlight-DaTzDdJW.js";import"./vendor-markdown-CpaoCv-a.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 i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).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 an=new yt;function Ve(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 cn(t){return Math.max(0,Math.min(255,Math.round(t)))}function ln({r:t,g:e,b:n}){const s=o=>cn(o).toString(16).padStart(2,"0");return`#${s(t)}${s(e)}${s(n)}`}function dn(t){const{r:e,g:n,b:s}=Ve(t),o=r=>{const i=r/255;return i<=.03928?i/12.92:((i+.055)/1.055)**2.4};return .2126*o(e)+.7152*o(n)+.0722*o(s)}function Te(t,e="#18181b",n="#ffffff"){return dn(t)>.45?e:n}function un(t,e){const{r:n,g:s,b:o}=Ve(t),r=Math.max(0,Math.min(1,e));return ln({r:n+(255-n)*r,g:s+(255-s)*r,b:o+(255-o)*r})}function de(t){const e=t.trim().replace(/^#/,"");return(e.length===3||e.length===6)&&!/[^0-9a-fA-F]/.test(e)}const P=(t,e,n,s,o,r,i,l,d,u,g)=>({50:t,100:e,200:n,300:s,400:o,500:r,600:i,700:l,800:d,900:u,950:g}),f={zinc:P("#fafafa","#f4f4f5","#e4e4e7","#d4d4d8","#a1a1aa","#71717a","#52525b","#3f3f46","#27272a","#18181b","#09090b"),gray:P("#f9fafb","#f3f4f6","#e5e7eb","#d1d5db","#9ca3af","#6b7280","#4b5563","#374151","#1f2937","#111827","#030712"),slate:P("#f8fafc","#f1f5f9","#e2e8f0","#cbd5e1","#94a3b8","#64748b","#475569","#334155","#1e293b","#0f172a","#020617"),blue:P("#eff6ff","#dbeafe","#bfdbfe","#93c5fd","#60a5fa","#3b82f6","#2563eb","#1d4ed8","#1e40af","#1e3a8a","#172554"),green:P("#f0fdf4","#dcfce7","#bbf7d0","#86efac","#4ade80","#22c55e","#16a34a","#15803d","#166534","#14532d","#052e16"),red:P("#fef2f2","#fee2e2","#fecaca","#fca5a5","#f87171","#ef4444","#dc2626","#b91c1c","#991b1b","#7f1d1d","#450a0a"),teal:P("#f0fdfa","#ccfbf1","#99f6e4","#5eead4","#2dd4bf","#14b8a6","#0d9488","#0f766e","#115e59","#134e4a","#042f2e"),amber:P("#fffbeb","#fef3c7","#fde68a","#fcd34d","#fbbf24","#f59e0b","#d97706","#b45309","#92400e","#78350f","#451a03"),yellow:P("#fefce8","#fef9c3","#fef08a","#fde047","#facc15","#eab308","#ca8a04","#a16207","#854d0e","#713f12","#422006"),purple:P("#faf5ff","#f3e8ff","#e9d5ff","#d8b4fe","#c084fc","#a855f7","#9333ea","#7e22ce","#6b21a8","#581c87","#3b0764"),orange:P("#fff7ed","#ffedd5","#fed7aa","#fdba74","#fb923c","#f97316","#ea580c","#c2410c","#9a3412","#7c2d12","#431407"),white:"#ffffff",black:"#000000"},pn={statusSuccess:"#16a34a",statusDanger:"#dc2626",statusWarning:"#f59e0b",statusMerged:"#9333ea"},fn={statusSuccess:"#15803d",statusDanger:"#b91c1c",statusWarning:"#d97706",statusMerged:"#7c3aed"};function hn(){return{keyword:f.purple[300],string:f.green[300],number:f.orange[300],boolean:f.orange[300],comment:f.zinc[500],function:f.blue[300],variable:f.zinc[200],type:f.teal[300],class:f.amber[300],constant:f.orange[300],operator:f.zinc[400],punctuation:f.zinc[400],tag:f.red[300],attribute:f.amber[300],property:f.blue[200],regexp:f.teal[300],escape:f.orange[200],heading:f.blue[300],link:f.blue[400],deleted:f.red[400],inserted:f.green[400]}}function mn(){return{keyword:f.purple[700],string:f.green[700],number:f.orange[700],boolean:f.orange[700],comment:f.zinc[500],function:f.blue[700],variable:f.zinc[800],type:f.teal[700],class:f.amber[700],constant:f.orange[700],operator:f.zinc[600],punctuation:f.zinc[600],tag:f.red[700],attribute:f.amber[700],property:f.blue[700],regexp:f.teal[700],escape:f.orange[700],heading:f.blue[700],link:f.blue[600],deleted:f.red[700],inserted:f.green[700]}}function Ge(t,e,n){return{background:t,foreground:e,cursor:n,cursorAccent:t,selectionBackground:"rgba(255,255,255,0.18)",black:f.zinc[900],red:f.red[500],green:f.green[500],yellow:f.amber[500],blue:f.blue[500],magenta:f.purple[500],cyan:f.teal[500],white:f.zinc[300],brightBlack:f.zinc[600],brightRed:f.red[400],brightGreen:f.green[400],brightYellow:f.amber[400],brightBlue:f.blue[400],brightMagenta:f.purple[400],brightCyan:f.teal[400],brightWhite:f.zinc[50]}}function ne(t){const e=f.zinc[50],n=Te(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:f.white,success:t.accent,successForeground:f.white,border:t.border,borderAccent:t.borderAccent,...pn,diffAddition:f.green[400],diffDeletion:f.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:f,syntax:hn(),terminal:Ge(t.surface0,e,t.accent)}}function gn(){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:Te(e),destructive:"#b04138",destructiveForeground:"#ffffff",success:e,successForeground:"#ffffff",border:"#e4e4e7",borderAccent:"#ececf1",...fn,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:f,syntax:mn(),terminal:{...Ge("#ffffff",t,e),selectionBackground:"rgba(0,0,0,0.15)",white:"#ffffff",brightWhite:"#fafafa"}}}const bn={light:"#ffffff",dark:"#3b62b0",zinc:"#808080",midnight:"#4A6BA8",claude:"#D97757",ghostty:"#8caaee"},Ke=["light","dark","zinc","midnight","claude","ghostty"];function _n(t){if(t==="light")return gn();switch(t){case"dark":return ne({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 ne({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 ne({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 ne({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 ne({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 Xe={};for(const t of Ke){const e=t==="light"?"light":"dark";Xe[t]={name:t,colorScheme:e,colors:_n(t),swatch:bn[t]}}const wn=Xe,yn={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},Je={xs:12,code:12,sm:14,base:16,lg:18,xl:20,"2xl":22,"3xl":26,"4xl":34},Sn={normal:"400",medium:"500",semibold:"600",bold:"700"},vn={none:0,sm:2,base:4,md:6,lg:8,xl:12,"2xl":16,full:9999},xn={0:0,1:1,2:2},kn={0:0,50:.5,100:1},In={xs:12,sm:14,md:16,lg:20},Cn={diff:22},Ye='system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',Ze='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';function Tn(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 Qe(t){const e=wn[t];return{name:t,colorScheme:e.colorScheme,colors:e.colors,spacing:yn,fontSize:{...Je},fontFamily:{ui:Ye,mono:Ze},lineHeight:{...Cn},iconSize:In,fontWeight:Sn,borderRadius:vn,borderWidth:xn,opacity:kn,shadow:Tn(e.colorScheme),swatch:e.swatch}}const jn=16,Nn=10,Rn=24;function En(t,e){const n=e.themeName??t.name,s=Qe(n),o=e.uiFont&&e.uiFont.trim()!==""?e.uiFont:Ye,r=e.monoFont&&e.monoFont.trim()!==""?e.monoFont:Ze;let i={...s.fontSize};if(e.fontSize!=null){const d=Math.max(Nn,Math.min(Rn,e.fontSize))/jn,u=["xs","code","sm","base","lg","xl","2xl","3xl","4xl"];for(const g of u){const p=Je[g];i[g]=Math.round(p*d)}}return{...s,fontSize:i,fontFamily:{ui:o,mono:r}}}function An(t){return Qe(t)}const Bn="dark";function $n(t){const e={};Mn(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 Mn(t,e){const{palette:n,syntax:s,terminal:o,...r}=t;for(const[i,l]of Object.entries(r))typeof l=="string"&&(e[`--pi-color-${i}`]=l);s&&Dn(s,e),o&&(e["--pi-terminal-bg"]=o.background,e["--pi-terminal-fg"]=o.foreground)}function Dn(t,e){for(const[n,s]of Object.entries(t))typeof s=="string"&&(e[`--syntax-${Pn(n)}`]=s)}function Pn(t){return t.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function qn(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 zn(t){const e=$n(t);qn(e)}const se=c().min(1,"Asset path must not be empty"),On=m({accent:c().refine(de,{message:"accent must be a valid #rrggbb hex color"}),accentBright:c().refine(de,{message:"accentBright must be a valid #rrggbb hex color"}).optional(),accentForeground:c().refine(de,{message:"accentForeground must be a valid #rrggbb hex color"}).optional(),swatch:c().refine(de,{message:"swatch must be a valid #rrggbb hex color"}).optional()}),Fn=m({logoLight:se,logoDark:se,logoMark:se.optional(),icon:se,splash:se.optional()}),Wn=m({docs:c().url().optional(),support:c().url().optional(),issues:c().url().optional(),website:c().url().optional()}).optional(),Hn=m({copyright:c().optional(),companyName:c().optional()}).optional();m({productName:c().min(1,"productName is required"),shortName:c().optional(),tagline:c().optional(),colors:On,assets:Fn,links:Wn,legal:Hn});function Ln(t){const e=t.accent,n=t.accentBright??un(e,.35),s=t.accentForeground??Te(e),o=t.swatch??e;return{accent:e,accentBright:n,accentForeground:s,swatch:o}}function Un(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 Ee="pi-studio-appearance";function Vn(t,e){let n=l(t),s=null;function o(g){return g==="system"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":g}function r(g,p){const h=o(g),T=An(h);let w=En(T,{...p,themeName:h});if(e!=null&&e.colors){const b=Ln(e.colors);w=Un(w,b)}return w}function i(){const g=JSON.stringify({mode:n.mode,settings:n.settings});t.set(Ee,g)}function l(g){const p=g.get(Ee);let h=Bn,T={};if(p)try{const b=JSON.parse(p);b.mode&&(Ke.includes(b.mode)||b.mode==="system")&&(h=b.mode),b.settings&&typeof b.settings=="object"&&(T=b.settings)}catch{}const w=r(h,T);return{mode:h,settings:T,resolvedTheme:w}}function d(){n={...n,resolvedTheme:r(n.mode,n.settings)},i()}const u={getState(){return n},setMode(g){n={...n,mode:g},d(),u.apply()},updateSettings(g){n={...n,settings:{...n.settings,...g}},d(),u.apply()},apply(){zn(n.resolvedTheme)},listen(){if(typeof window>"u")return()=>{};const g=window.matchMedia("(prefers-color-scheme: dark)"),p=()=>{n.mode==="system"&&(d(),u.apply())};return g.addEventListener("change",p),s=()=>g.removeEventListener("change",p),s}};return u}function Gn({store:t,brandConfig:e,children:n}){const s=v.useRef(null);return s.current||(s.current=Vn(t,e),s.current.apply()),v.useEffect(()=>s.current.listen(),[]),a.jsx(a.Fragment,{children:n})}const Kn={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 Xn({children:t}){return a.jsx(Gn,{store:Kn,children:a.jsx(St,{client:an,children:t})})}const Jn="_btn_1chbg_4",Yn="_secondary_1chbg_44",Zn="_outline_1chbg_53",Qn="_ghost_1chbg_62",es="_destructive_1chbg_72",ts="_iconOnly_1chbg_82",ns="_loadingSpinner_1chbg_89",ss="_piSpin_1chbg_1",ue={btn:Jn,default:"_default_1chbg_35",secondary:Yn,outline:Zn,ghost:Qn,destructive:es,iconOnly:ts,loadingSpinner:ns,piSpin:ss},Ae={xs:28,sm:32,md:36,lg:40},os={xs:12,sm:14,md:16,lg:20},Be={xs:8,sm:10,md:12,lg:16},rs={xs:12,sm:13,md:14,lg:15};function as(t){const{disabled:e,loading:n}=t;return e||n?{opacity:.5,isGhostHover:!1}:{opacity:1,isGhostHover:!1}}function D({variant:t="default",size:e="md",loading:n=!1,disabled:s=!1,leftIcon:o,trailing:r,iconOnly:i=!1,children:l,style:d,className:u,...g}){const{opacity:p}=as({disabled:s??!1,loading:n}),h=s||n,T=os[e];return a.jsxs("button",{className:E(ue.btn,ue[t],i&&ue.iconOnly,u),disabled:h,"aria-busy":n||void 0,style:{minHeight:Ae[e],paddingLeft:i?void 0:Be[e],paddingRight:i?void 0:Be[e],fontSize:rs[e],opacity:p,...i?{width:Ae[e]}:{},...d},...g,children:[n?a.jsx(kt,{className:ue.loadingSpinner,size:T,"aria-hidden":!0}):o?a.jsx("span",{"aria-hidden":!0,style:{display:"flex",alignItems:"center",flexShrink:0},children:o}):null,l,r&&!n&&a.jsx("span",{"aria-hidden":!0,style:{display:"flex",alignItems:"center",flexShrink:0},children:r})]})}const is="_input_a7qyq_3",cs="_textarea_a7qyq_32",Se={input:is,textarea:cs},ve=v.forwardRef(function({className:e,...n},s){return a.jsx("input",{ref:s,className:E(Se.input,e),...n})}),zi=v.forwardRef(function({className:e,...n},s){return a.jsx("textarea",{ref:s,className:E(Se.input,Se.textarea,e),...n})}),et=c().datetime({offset:!0});c().uuid();c().regex(/^[A-Za-z0-9_-]+$/,"expected base64url");const ie=We([q(),et]),ls=ce(["mobile","browser","cli","mcp"]),ds=m({type:y("hello"),clientId:c(),clientType:ls,protocolVersion:q(),appVersion:c().optional(),capabilities:H(c(),N()).optional()}),us=m({status:y("server_info"),serverId:c(),hostname:c().optional(),version:c().optional(),capabilities:H(c(),B()),features:H(c(),B())}),ps=m({type:y("status"),payload:us}),fs=m({type:y("ping"),requestId:c(),clientSentAt:ie.optional()}),hs=m({type:y("pong"),requestId:c(),clientSentAt:ie.optional(),serverReceivedAt:ie,serverSentAt:ie}),tt=ce(["initializing","idle","running","error","closed"]),nt=m({mimeType:c().optional(),data:c().optional()}).passthrough(),ms=m({prs:L(B()).optional(),issues:L(B()).optional()}).passthrough(),gs=m({provider:c(),cwd:c(),modeId:c().optional(),model:c().optional(),thinkingOptionId:c().optional(),featureValues:H(c(),B()).optional(),title:c().nullable().optional(),approvalPolicy:c().optional(),sandboxMode:c().optional(),networkAccess:N().optional(),webSearch:N().optional(),extra:m({pi:B().optional()}).passthrough().optional(),systemPrompt:c().optional(),mcpServers:H(c(),B()).optional()}),bs=m({type:y("create_agent_request"),requestId:c(),config:gs,env:H(c(),c()).optional(),workspaceId:c().optional(),worktreeName:c().optional(),initialPrompt:c().optional(),clientMessageId:c().optional(),outputSchema:H(c(),B()).optional(),images:L(nt).optional(),attachments:ms.optional(),git:B().optional(),worktree:B().optional(),autoArchive:N().optional(),labels:H(c(),c()).default({})}),_s=m({type:y("create_agent_response"),requestId:c(),payload:m({agentId:c()}).passthrough()}),ws=m({type:y("agent_update"),agentId:c(),status:tt.optional(),title:c().nullable().optional(),labels:H(c(),c()).optional()}),ys=m({type:y("agent_status"),agentId:c(),status:tt}),Ss=m({type:y("agent_list"),agents:L(m({id:c()}).passthrough())}),vs=m({type:y("agent_deleted"),agentId:c()}),xs=m({type:y("agent_archived"),agentId:c(),archivedAt:et.optional()}),st=ge("kind",[m({kind:y("shell"),command:c().optional(),output:c().optional()}),m({kind:y("read"),path:c().optional(),output:c().optional()}),m({kind:y("edit"),path:c().optional(),diff:c().optional(),output:c().optional()}),m({kind:y("write"),path:c().optional(),output:c().optional()}),m({kind:y("search"),query:c().optional(),output:c().optional()}),m({kind:y("fetch"),url:c().optional(),output:c().optional()}),m({kind:y("task"),description:c().optional(),output:c().optional()})]),ks=ge("kind",[m({kind:y("user_message"),messageId:c().optional(),text:c().optional(),images:L(nt).optional()}),m({kind:y("assistant_message"),messageId:c().optional(),text:c().optional()}),m({kind:y("reasoning"),text:c().optional()}),m({kind:y("tool_call"),callId:c().optional(),tool:st,status:c().optional()}),m({kind:y("turn_started"),turnId:c().optional()}),m({kind:y("turn_completed"),turnId:c().optional()}),m({kind:y("turn_failed"),turnId:c().optional(),error:c().optional()}),m({kind:y("turn_canceled"),turnId:c().optional()}),m({kind:y("error"),message:c().optional()})]),Is=m({type:y("agent_stream"),agentId:c(),seq:q().optional(),timestamp:ie.optional(),event:ks}),Cs=ce(["before","after"]),Ts=m({start:q(),end:q()}),js=m({type:y("fetch_agent_timeline_request"),requestId:c(),agentId:c(),cursor:c().nullable().optional(),direction:Cs,limit:q().optional()}),Ns=m({type:y("fetch_agent_timeline_response"),requestId:c(),agentId:c().optional(),items:L(B()),seqStart:q(),seqEnd:q(),sourceSeqRanges:L(Ts),collapsed:N(),hasNewer:N(),startCursor:c().nullable().optional(),endCursor:c().nullable().optional()}),Rs=m({type:y("agent_permission_request"),requestId:c(),agentId:c(),toolName:c().optional(),tool:st.optional(),action:B().optional(),responses:L(c()).optional()}),Es=m({type:y("agent_permission_resolved"),requestId:c(),agentId:c(),decision:c().optional()}),As=m({type:y("agent.permission.respond.request"),requestId:c(),permissionRequestId:c(),response:B()}),Bs=m({type:y("agent.permission.respond.response"),requestId:c(),payload:m({resolved:N()}).passthrough()}),$s=m({type:y("respond_to_permission"),requestId:c(),permissionRequestId:c(),response:B()}),ot=ce(["conversation","files","both"]),Ms=m({type:y("agent.rewind.request"),requestId:c(),agentId:c(),messageId:c(),mode:ot}).passthrough(),Ds=m({type:y("agent.rewind.response"),requestId:c(),payload:m({agentId:c(),messageId:c(),mode:ot,truncatedAt:c().optional()}).passthrough()}).passthrough(),Ps=m({type:y("rpc_error"),requestId:c(),code:c().optional(),message:c().optional(),error:c().optional()}),qs=ge("type",[bs,_s,ws,ys,Ss,vs,xs,Is,js,Ns,Rs,Es,As,Bs,$s,Ms,Ds,Ps]),zs=m({type:c()}).passthrough(),Os=m({type:y("session"),message:We([qs,zs])});ge("type",[ds,ps,fs,hs,Os]);const Y={Output:1,Input:2,Resize:3,Snapshot:4,Restore:5},Fs=Object.fromEntries(Object.entries(Y).map(([t,e])=>[e,t])),rt=m({rows:q().int().nonnegative(),cols:q().int().nonnegative()});class ae extends Error{constructor(e){super(e),this.name="TerminalFrameError"}}const Ws=new TextEncoder,Hs=new TextDecoder;function Ls(t){if(!Number.isInteger(t)||t<0||t>255)throw new ae(`slot must be an integer 0–255, got ${t}`)}function oe(t,e,n){const s=new Uint8Array(2+n.length);return s[0]=t,s[1]=e,s.set(n,2),s}function Oi(t){switch(Ls(t.slot),t.opcode){case"Output":return oe(Y.Output,t.slot,t.data);case"Input":return oe(Y.Input,t.slot,t.data);case"Snapshot":return oe(Y.Snapshot,t.slot,t.data);case"Restore":return oe(Y.Restore,t.slot,t.data);case"Resize":{const e=JSON.stringify(rt.parse({rows:t.rows,cols:t.cols}));return oe(Y.Resize,t.slot,Ws.encode(e))}}}function Us(t){if(t.length<2)throw new ae(`frame too short: ${t.length} bytes (need ≥ 2)`);const e=t[0],n=t[1],s=Fs[e];if(!s)throw new ae(`unknown terminal opcode 0x${e.toString(16)}`);const o=t.subarray(2);if(s==="Resize"){let r;try{r=JSON.parse(Hs.decode(o))}catch{throw new ae("resize payload is not valid JSON")}const i=rt.safeParse(r);if(!i.success)throw new ae("resize payload is not { rows, cols }");return{opcode:"Resize",slot:n,rows:i.data.rows,cols:i.data.cols}}return{opcode:s,slot:n,data:o.slice()}}const at={Begin:16,Chunk:17,End:18,Error:19},Vs=Object.fromEntries(Object.entries(at).map(([t,e])=>[e,t])),Gs=m({transferId:c(),fileName:c().optional(),mimeType:c().optional(),totalBytes:q().int().nonnegative().optional()});class pe extends Error{constructor(e){super(e),this.name="FileTransferFrameError"}}new TextEncoder;const $e=new TextDecoder;function Ks(t){if(t.length<2)throw new pe(`frame too short: ${t.length} bytes (need ≥ 2)`);const e=t[0],n=t[1],s=Vs[e];if(!s)throw new pe(`unknown file-transfer opcode 0x${e.toString(16)}`);const o=t.subarray(2);switch(s){case"Begin":{let r;try{r=JSON.parse($e.decode(o))}catch{throw new pe("begin payload is not valid JSON")}const i=Gs.safeParse(r);if(!i.success)throw new pe("begin payload is not a valid transfer header");return{opcode:"Begin",stream:n,meta:i.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:$e.decode(o)}}}function Xs(t){try{return Ks(t)}catch{return null}}const Js=c().regex(/^[a-z][a-z0-9-]*$/,"invalid provider id"),Ys=ce(["safe","moderate","dangerous","planning"]),Zs=m({supportsStreaming:N(),supportsSessionPersistence:N(),supportsDynamicModes:N(),supportsMcpServers:N(),supportsReasoningStream:N(),supportsToolInvocations:N(),supportsRewindConversation:N().optional(),supportsRewindFiles:N().optional(),supportsRewindBoth:N().optional()}).passthrough(),Qs=m({id:c(),label:c().optional(),description:c().optional(),icon:c().optional(),colorTier:Ys});m({id:Js,label:c(),description:c().optional(),extends:c().optional(),modes:L(Qs),capabilities:Zs});function eo(t){return typeof t=="string"?t:t instanceof Uint8Array||Buffer.isBuffer(t)?t.toString("utf8"):String(t??"")}function it(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 i=t??(()=>new WebSocket(s));try{e=t?i(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,eo(l.reason))},e.onmessage=l=>{var u,g,p,h;const{data:d}=l;d instanceof ArrayBuffer||d instanceof Uint8Array?(u=n.onMessage)==null||u.call(n,d):typeof d=="string"?(g=n.onMessage)==null||g.call(n,d):typeof Blob<"u"&&d instanceof Blob?(p=n.onMessage)==null||p.call(n,d):Buffer.isBuffer(d)&&((h=n.onMessage)==null||h.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 to=1;function Me(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`req-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}class no extends Error{constructor(e,n,s){super(e),this.requestId=n,this.code=s,this.name="RpcError"}}class De extends Error{constructor(e){super(`RPC ${e} timed out`),this.requestId=e,this.name="RpcTimeoutError"}}class so{constructor(e){k(this,"transport");k(this,"rpcTimeoutMs");k(this,"now");k(this,"_state","idle");k(this,"_serverId",null);k(this,"_features",{});k(this,"_serverCapabilities",{});k(this,"pending",new Map);k(this,"sessionHandlers",new Set);k(this,"terminalHandlers",new Set);k(this,"fileTransferHandlers",new Set);k(this,"stateHandlers",new Set);k(this,"helloResolve",null);k(this,"helloReject",null);this.options=e,this.transport=e.transport??it(),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??to,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??Me();return new Promise((r,i)=>{const l=s??this.rpcTimeoutMs,d=l>0?setTimeout(()=>{this.pending.delete(o),i(new De(o))},l):null;this.pending.set(o,{resolve:u=>r(u),reject:i,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=Me();return new Promise((s,o)=>{const r=e>0?setTimeout(()=>{this.pending.delete(n),o(new De(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(at).includes(n)){const r=Xs(e);if(!r)return;for(const i of this.fileTransferHandlers)i(r);return}const o=Us(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 no(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 oo{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 ao(this.daemon,e)}workspace(e){return new io(this.daemon,e)}get providers(){return new co(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 ro{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 ao{constructor(e,n){k(this,"timeline");this.daemon=e,this.agentId=n,this.timeline=new ro(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})}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)})}}class io{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 co{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})}refreshSnapshot(){return this.daemon.request("providers.snapshot.refresh.request",{})}}class lo{constructor(e,n={}){k(this,"initialDelayMs");k(this,"maxDelayMs");k(this,"factor");k(this,"jitter");k(this,"maxAttempts");k(this,"setTimer");k(this,"clearTimer");k(this,"random");k(this,"attempt",0);k(this,"timer",null);k(this,"active",!1);k(this,"detachState",null);k(this,"reconnectedHandlers",new Set);k(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 uo(){return"web-"+Math.random().toString(36).slice(2,10)}const C=K()((t,e)=>({status:"idle",serverInfo:null,error:null,daemon:null,client:null,reconnection:null,async connect(n){e().disconnect();const s=n.password?it(l=>new WebSocket(l,[`pi-studio.bearer.${n.password}`])):void 0,o=new so({url:n.url,clientId:n.clientId??uo(),clientType:"browser",capabilities:{},transport:s,rpcTimeoutMs:1800*1e3}),r=new oo(o),i=new lo(o);o.onStateChange(l=>t({status:l})),i.onReconnected(()=>t({error:null})),i.onReconnectFailed(l=>{t({error:l instanceof Error?l.message:String(l)})}),t({daemon:o,client:r,reconnection:i,error:null,status:"connecting"});try{const l=await o.connect();t({serverInfo:l}),i.start()}catch(l){throw t({error:l instanceof Error?l.message:String(l)}),l}},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})}})),po=100,fo=480,ho=220,mo=280;function fe(t){return Math.min(fo,Math.max(po,t))}const x=K()(t=>({host:"ws://127.0.0.1:6767",password:"",cwd:"~",cwdPickerOpen:!1,sessionMenu:null,rightSidebarTab:"files",collapsedWorkspaces:new Set,leftSidebarCollapsed:!1,rightSidebarCollapsed:!1,leftSidebarWidth:ho,rightSidebarWidth:mo,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}),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:fe(e)}),setRightSidebarWidth:e=>t({rightSidebarWidth:fe(e)}),resizeLeftSidebar:e=>t(n=>({leftSidebarWidth:fe(n.leftSidebarWidth+e)})),resizeRightSidebar:e=>t(n=>({rightSidebarWidth:fe(n.rightSidebarWidth+e)}))})),go="_wrap_emmus_1",bo="_dot_emmus_8",_o="_open_emmus_15",wo="_connecting_emmus_18",yo="_closed_emmus_21",So="_idle_emmus_22",vo="_closing_emmus_23",be={wrap:go,dot:bo,open:_o,connecting:wo,closed:yo,idle:So,closing:vo},xo={idle:"disconnected",connecting:"connecting…",open:"connected",closing:"disconnecting…",closed:"disconnected"};function ko(){const t=C(n=>n.status),e=C(n=>n.error);return a.jsxs("span",{className:be.wrap,title:e??void 0,children:[a.jsx("span",{className:E(be.dot,be[t])}),xo[t]??t]})}const Io="_toolbar_12zzc_1",Co="_brand_12zzc_10",To="_sep_12zzc_16",jo="_host_12zzc_22",No="_password_12zzc_25",Ro="_sidebarToggles_12zzc_28",J={toolbar:Io,brand:Co,sep:To,host:jo,password:No,sidebarToggles:Ro};function Eo(){const t=C(h=>h.status),e=C(h=>h.connect),n=C(h=>h.disconnect),s=x(h=>h.host),o=x(h=>h.setHost),r=x(h=>h.password),i=x(h=>h.setPassword),l=x(h=>h.leftSidebarCollapsed),d=x(h=>h.toggleLeftSidebar),u=x(h=>h.rightSidebarCollapsed),g=x(h=>h.toggleRightSidebar),p=t==="open"||t==="connecting";return a.jsxs("div",{className:J.toolbar,children:[a.jsx("span",{className:J.brand,children:"Pi-Studio"}),a.jsx(ko,{}),a.jsx("div",{className:J.sep}),a.jsx(ve,{className:J.host,value:s,onChange:h=>o(h.target.value),placeholder:"ws://host:port",disabled:p}),a.jsx(ve,{className:J.password,type:"password",value:r,onChange:h=>i(h.target.value),placeholder:"password",disabled:p}),t==="open"||t==="connecting"||t==="closing"?a.jsx(D,{size:"sm",onClick:()=>n(),children:"Disconnect"}):a.jsx(D,{size:"sm",variant:"default",onClick:()=>void e({url:s,password:r||void 0}),children:"Connect"}),a.jsxs("div",{className:J.sidebarToggles,children:[a.jsx(D,{size:"sm",variant:"ghost",iconOnly:!0,title:l?"Show sessions sidebar":"Hide sessions sidebar",onClick:()=>d(),children:l?a.jsx(It,{size:16}):a.jsx(Ct,{size:16})}),a.jsx(D,{size:"sm",variant:"ghost",iconOnly:!0,title:u?"Show files/changes sidebar":"Hide files/changes sidebar",onClick:()=>g(),children:u?a.jsx(Tt,{size:16}):a.jsx(jt,{size:16})})]})]})}const xe={rows:[],streamingAssistantIndex:null,streamingReasoningIndex:null,toolIndexByCallId:{}};let Pe=0;function X(){return Pe+=1,`row-${Pe}`}function Ao(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 Bo(t,e){return t??`${e.kind}:${Ao(e)}`}function $o(t){return{...t,streamingAssistantIndex:null,streamingReasoningIndex:null}}function Mo(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 i={kind:"assistant",id:X(),text:"",streaming:!0};n.push(i),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 Do(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 i={kind:"reasoning",id:X(),text:"",streaming:!0};n.push(i),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 Po(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 qo(t,e){var l;const n=Bo(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:Po(d.tool,e.tool),status:s},{...t,rows:r,streamingAssistantIndex:null,streamingReasoningIndex:null})}const i={kind:"tool",id:X(),callId:n,tool:e.tool,status:s};return r.push(i),{...t,rows:r,toolIndexByCallId:{...t.toolIndexByCallId,[n]:r.length-1},streamingAssistantIndex:null,streamingReasoningIndex:null}}function je(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 zo(t,e){const n=je(t),s={kind:"error",id:X(),text:e||"turn failed"};return{...n,rows:[...n.rows,s]}}function Oo(t){const e=je(t),n={kind:"system",id:X(),text:"(canceled)"};return{...e,rows:[...e.rows,n]}}function Fo(t,e){const n={kind:"error",id:X(),text:e||"error"};return{...t,rows:[...t.rows,n]}}function Wo(t,e,n){const s={kind:"user",id:X(),text:e,images:n};return{...t,rows:[...t.rows,s]}}function ct(t,e){switch(e.kind){case"turn_started":return $o(t);case"user_message":return Wo(t,e.text??"",e.images);case"assistant_message":return Mo(t,e.text??"");case"reasoning":return Do(t,e.text??"");case"tool_call":return qo(t,e);case"turn_completed":return je(t);case"turn_failed":return zo(t,e.error);case"turn_canceled":return Oo(t);case"error":return Fo(t,e.message);default:return t}}let qe=0;function Ho(){return qe+=1,`s-${Date.now().toString(36)}-${qe}`}const A=K()((t,e)=>({sessions:{},order:[],activeSessionId:null,createSession(n){const s=Ho(),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)},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 i=ct(r.timeline,s);let l=r.title;if(s.kind==="turn_completed"&&l==="New chat"){const d=i.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:i,title:l}}}})},addUserMessage(n){t(s=>{const o=s.sessions[n];return o?{sessions:{...s.sessions,[n]:{...o,userMessageCount:o.userMessageCount+1}}}:s})},activate(n){t({activeSessionId:n})},remove(n){t(s=>{const{[n]:o,...r}=s.sessions,i=s.order.filter(d=>d!==n),l=s.activeSessionId===n?i[0]??null:s.activeSessionId;return{sessions:r,order:i,activeSessionId:l}})},findByAgentId(n){return Object.values(e().sessions).find(s=>s.agentId===n)}}));function _e(t,e){return t.filter(n=>n.workspaceCwd===e)}const I=K()((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),i=s.tabs.filter(u=>u.id!==n);let l=s.activeTabId;const d={...s.lastActiveTabByWorkspace};if(l===n){const u=_e(i,o.workspaceCwd),g=Math.min(r,u.length-1),p=u[g];l=(p==null?void 0:p.id)??null}if(d[o.workspaceCwd]===n){const u=_e(i,o.workspaceCwd)[0];u?d[o.workspaceCwd]=u.id:delete d[o.workspaceCwd]}return{tabs:i,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=_e(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),i=o.tabs.findIndex(u=>u.id===s);if(r===-1||i===-1||r===i)return o;const l=o.tabs.slice(),[d]=l.splice(r,1);return d?(l.splice(i,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)}))}})),z={chat:t=>`chat-${t}`,file:t=>`file-${t}`,diff:(t,e)=>`diff-${t}${e?"-staged":""}`,terminal:t=>`term-${t}`};let we=0;function lt(t){we+=1,I.getState().open({id:z.terminal(`new-${we}`),kind:"terminal",label:`Terminal ${we}`,closable:!0,data:{slot:null,cwd:t},workspaceCwd:t})}const Z=K()((t,e)=>({currentPath:"",rootPath:"",setRoot:n=>t({rootPath:n,currentPath:n}),setPath:n=>t({currentPath:n}),goUp:()=>{const{currentPath:n,rootPath:s}=e();if(!s||n===s)return;const o=n.split("/").slice(0,-1).join("/")||"/",r=o.length<s.length||!o.startsWith(s)?s:o;t({currentPath:r})}}));let Q=null;const ke=new Set;function Lo(t){return ke.add(t),()=>ke.delete(t)}async function Ne(t){var e;if(Q)return Q;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");Q="/home/"+((o==null?void 0:o.name)||"user")}catch{return"/tmp"}for(const n of ke)n(Q);return Q}function Uo(){return Q}async function Vo(t,e){return e==="~"||e.startsWith("~/")?await Ne(t)+e.slice(1):e}function dt(){const t=C(o=>o.client),e=C(o=>o.status),[n,s]=v.useState(Uo());return v.useEffect(()=>Lo(s),[]),v.useEffect(()=>{!t||e!=="open"||n||Ne(t)},[t,e,n]),n}const Go="_dot_202py_3",Ko={dot:Go};function Xo(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 ze=8,Jo={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 Yo({className:t,...e}){const n=Xo(e);return n?a.jsx("span",{className:`${Ko.dot}${t?` ${t}`:""}`,style:{width:ze,height:ze,backgroundColor:Jo[n]??"currentColor"},role:"presentation"}):null}const Zo={initializing:"queued",idle:"idle",running:"running",error:"error",closed:"finished"};function Qo(t){return Zo[t]??"idle"}const er="_wrap_sqws5_1",tr="_header_sqws5_7",nr="_list_sqws5_23",sr="_item_sqws5_28",or="_active_sqws5_37",rr="_title_sqws5_40",ar="_meta_sqws5_49",ir="_menuBtn_sqws5_57",cr="_workspaceGroup_sqws5_75",lr="_workspaceHeader_sqws5_78",dr="_workspaceChevron_sqws5_91",ur="_workspaceIcon_sqws5_102",pr="_workspaceLabel_sqws5_106",fr="_workspaceCount_sqws5_112",hr="_newSessionBtn_sqws5_117",mr="_workspaceSessions_sqws5_129",R={wrap:er,header:tr,list:nr,item:sr,active:or,title:rr,meta:ar,menuBtn:ir,workspaceGroup:cr,workspaceHeader:lr,workspaceChevron:dr,workspaceIcon:ur,workspaceLabel:pr,workspaceCount:fr,newSessionBtn:hr,workspaceSessions:mr};function gr({session:t,active:e,onSelect:n,onOpenMenu:s}){return a.jsxs("div",{className:E(R.item,e&&R.active),onClick:n,onContextMenu:o=>{o.preventDefault(),s(o.clientX,o.clientY)},children:[a.jsxs("div",{className:R.title,children:[a.jsx(Yo,{status:Qo(t.status),showInactive:!0}),a.jsx("span",{children:t.title})]}),a.jsxs("div",{className:R.meta,children:[t.cwd||"~"," · ",t.agentId?t.agentId.slice(0,8):"new"," ·"," ",t.userMessageCount," msgs"]}),a.jsx("button",{type:"button",className:R.menuBtn,title:"Actions",onClick:o=>{o.stopPropagation();const r=o.currentTarget.getBoundingClientRect();s(r.left,r.bottom)},children:a.jsx(Nt,{size:14})})]})}const br="_trigger_16o4s_1",_r="_content_16o4s_7",wr="_item_16o4s_16",yr="_danger_16o4s_33",Sr="_sep_16o4s_36",W={trigger:br,content:_r,item:wr,danger:yr,sep:Sr};function vr(){const t=x(w=>w.sessionMenu),e=x(w=>w.closeSessionMenu),n=C(w=>w.client),s=v.useRef(null),[o,r]=v.useState(!1);v.useEffect(()=>{r(t!==null)},[t]);const i=A(w=>t?w.sessions[t.sessionId]:void 0);if(!t)return null;const l=!!(i!=null&&i.agentId)&&(i==null?void 0:i.status)==="running";function d(w){r(w),w||e()}function u(){if(!i)return;const w=window.prompt("Rename:",i.title);if(w!=null&&w.trim()){const b=w.trim();A.getState().setTitle(i.id,b),I.getState().updateLabel(z.chat(i.id),b),i.agentId&&(n==null||n.agent(i.agentId).update({title:b}).catch(()=>{}))}e()}function g(){i!=null&&i.agentId&&(n==null||n.agent(i.agentId).interrupt().catch(()=>{})),e()}function p(w){A.getState().remove(w),I.getState().close(z.chat(w))}async function h(){if(i){if(!window.confirm("Archive this agent? It can be resumed later."))return e();if(e(),!i.agentId){p(i.id);return}if(!n){window.alert("Not connected — cannot archive remotely.");return}try{await n.agent(i.agentId).archive(),p(i.id)}catch(w){window.alert(`Failed to archive: ${w instanceof Error?w.message:String(w)}`)}}}async function T(){if(i){if(!window.confirm("Permanently delete this agent? This cannot be undone."))return e();if(e(),!i.agentId){p(i.id);return}if(!n){window.alert("Not connected — cannot delete remotely.");return}try{await n.agent(i.agentId).delete(),p(i.id)}catch(w){window.alert(`Failed to delete: ${w instanceof Error?w.message:String(w)}`)}}}return a.jsxs(Wt,{open:o,onOpenChange:d,modal:!1,children:[a.jsx(Ht,{asChild:!0,children:a.jsx("button",{ref:s,type:"button",className:W.trigger,style:{left:t.x,top:t.y},"aria-hidden":!0,tabIndex:-1})}),a.jsx(Lt,{children:a.jsxs(Ut,{className:W.content,align:"start",sideOffset:2,children:[a.jsx(le,{className:W.item,onSelect:u,children:"Rename"}),a.jsx(le,{className:W.item,disabled:!l,onSelect:g,children:"Stop agent"}),a.jsx(Vt,{className:W.sep}),a.jsx(le,{className:`${W.item} ${W.danger}`,onSelect:h,children:"Archive"}),a.jsx(le,{className:`${W.item} ${W.danger}`,onSelect:T,children:"Delete permanently"})]})})]})}function xr({label:t,cwd:e,sessionCount:n,collapsed:s,onToggleCollapsed:o,onNewSession:r}){return a.jsxs("div",{className:R.workspaceHeader,onClick:o,title:e,children:[a.jsx("button",{type:"button",className:R.workspaceChevron,"aria-label":s?"Expand workspace":"Collapse workspace",onClick:i=>{i.stopPropagation(),o()},children:s?a.jsx(Rt,{size:13}):a.jsx(Et,{size:13})}),a.jsx(At,{size:13,className:E(R.workspaceIcon)}),a.jsx("span",{className:R.workspaceLabel,children:t}),a.jsx("span",{className:R.workspaceCount,children:n}),a.jsx(D,{size:"xs",variant:"ghost",iconOnly:!0,title:"New conversation",className:R.newSessionBtn,onClick:i=>{i.stopPropagation(),r()},children:a.jsx(He,{size:13})})]})}function te(t,e){return e&&(t==="~"||t.startsWith("~/"))?e+t.slice(1):t}function ut(t,e,n){const s=new Map;for(const o of t){const r=e[o];if(!r)continue;const i=te(r.cwd||"~",n),l=s.get(i);l?l.push(r):s.set(i,[r])}return Array.from(s,([o,r])=>({cwd:o,sessions:r}))}function kr(t){return!t||t==="~"?"~":t.split("/").filter(Boolean).pop()||t}function Ir(){const t=A(_=>_.order),e=A(_=>_.sessions),n=A(_=>_.activeSessionId),s=A(_=>_.activate),o=A(_=>_.createSession),r=I(_=>_.open),i=C(_=>_.status),l=x(_=>_.openSessionMenu),d=x(_=>_.setCwd),u=x(_=>_.openCwdPicker),g=x(_=>_.collapsedWorkspaces),p=x(_=>_.toggleWorkspaceCollapsed),h=dt();function T(_){const j=te(_||"~",h),S=o(j);r({id:z.chat(S),kind:"chat",label:"New chat",closable:!0,data:{sessionId:S},workspaceCwd:j})}function w(_){s(_);const j=e[_],S=te((j==null?void 0:j.cwd)||"~",h);j!=null&&j.cwd&&d(j.cwd),r({id:z.chat(_),kind:"chat",label:(j==null?void 0:j.title)??"Chat",closable:!0,data:{sessionId:_},workspaceCwd:S})}const b=ut(t,e,h);return a.jsxs("div",{className:R.wrap,children:[a.jsxs("div",{className:R.header,children:[a.jsx("h3",{children:"Workspaces"}),a.jsx(D,{size:"xs",variant:"ghost",iconOnly:!0,title:i!=="open"?"Connect to open a workspace":"Open a workspace folder",disabled:i!=="open",onClick:()=>u(),children:a.jsx(Bt,{size:14})})]}),a.jsx("div",{className:R.list,children:b.map(_=>{const j=g.has(_.cwd);return a.jsxs("div",{className:R.workspaceGroup,children:[a.jsx(xr,{label:kr(_.cwd),cwd:_.cwd,sessionCount:_.sessions.length,collapsed:j,onToggleCollapsed:()=>p(_.cwd),onNewSession:()=>T(_.cwd)}),!j&&a.jsx("div",{className:R.workspaceSessions,children:_.sessions.map(S=>a.jsx(gr,{session:S,active:S.id===n,onSelect:()=>w(S.id),onOpenMenu:(mt,gt)=>l(S.id,mt,gt)},S.id))})]},_.cwd)})}),a.jsx(vr,{})]})}const Cr="_strip_cnwks_1",Tr="_tab_cnwks_10",jr="_active_cnwks_26",Nr="_icon_cnwks_30",Rr="_label_cnwks_35",Er="_close_cnwks_40",ee={strip:Cr,tab:Tr,active:jr,icon:Nr,label:Rr,close:Er},Ar={chat:Pt,file:Dt,diff:Mt,terminal:$t};function Br({tab:t}){const e=I(p=>p.activeTabId),n=I(p=>p.activate),s=I(p=>p.close),o=Ar[t.kind],{attributes:r,listeners:i,setNodeRef:l,transform:d,transition:u,isDragging:g}=on({id:t.id});return a.jsxs("div",{ref:l,className:E(ee.tab,t.id===e&&ee.active),style:{transform:rn.Transform.toString(d),transition:u,opacity:g?.5:1},onClick:()=>n(t.id),onAuxClick:p=>{p.button===1&&t.closable&&s(t.id)},title:t.label,...r,...i,children:[a.jsx("span",{className:ee.icon,children:a.jsx(o,{size:13})}),a.jsx("span",{className:ee.label,children:t.label}),t.closable&&a.jsx("span",{className:ee.close,onClick:p=>{p.stopPropagation(),s(t.id)},children:a.jsx(me,{size:12})})]})}function $r(){const t=I(i=>i.tabs),e=I(i=>i.activeWorkspaceCwd),n=I(i=>i.reorder),s=t.filter(i=>i.workspaceCwd===e),o=Yt(Zt(sn,{activationConstraint:{distance:4}}));function r(i){const{active:l,over:d}=i;!d||l.id===d.id||n(String(l.id),String(d.id))}return a.jsx(Qt,{sensors:o,collisionDetection:en,onDragEnd:r,children:a.jsx(tn,{items:s.map(i=>i.id),strategy:nn,children:a.jsx("div",{className:ee.strip,children:s.map(i=>a.jsx(Br,{tab:i},i.id))})})})}const Mr="_spinner_1tgzp_3",Dr={spinner:Mr},Pr={xs:12,sm:16,md:20,lg:24},qr={xs:1,sm:2,md:2,lg:3};function zr({size:t="md",color:e="currentColor",className:n,"aria-label":s="Loading"}){const o=typeof t=="number"?t:Pr[t],r=typeof t=="number"?2:qr[t];return a.jsx("span",{className:`${Dr.spinner}${n?` ${n}`:""}`,role:"status","aria-label":s,style:{width:o,height:o,borderWidth:r,color:e}})}const Or=v.lazy(()=>Ce(()=>import("./ChatPanel-BOR3MYdN.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])).then(t=>({default:t.ChatPanel}))),Oe=v.lazy(()=>Ce(()=>import("./FilePanel-lERDJldp.js").then(t=>t.F),__vite__mapDeps([14,1,7,6,5,2,9,10,15])).then(t=>({default:t.FilePanel}))),Fr=v.lazy(()=>Ce(()=>import("./TerminalPanel-cnkK_YF5.js"),__vite__mapDeps([16,1,17,18,7,6,5,2,3,11,12,19])).then(t=>({default:t.TerminalPanel}))),Wr={chat:Or,file:Oe,diff:Oe,terminal:Fr},Hr="_area_1vzxd_1",Lr="_panel_1vzxd_7",Ur="_active_1vzxd_14",Vr="_empty_1vzxd_17",re={area:Hr,panel:Lr,active:Ur,empty:Vr};function Gr(){const t=I(o=>o.tabs),e=I(o=>o.activeTabId),n=I(o=>o.activeWorkspaceCwd);return t.some(o=>o.workspaceCwd===n)?a.jsx("div",{className:re.area,children:t.map(o=>{const r=Wr[o.kind];return a.jsx("div",{className:E(re.panel,o.id===e&&re.active),children:a.jsx(v.Suspense,{fallback:a.jsx(zr,{size:"md"}),children:a.jsx(r,{tab:o})})},o.id)})}):a.jsx("div",{className:re.area,children:a.jsx("div",{className:re.empty,children:"No open tabs in this workspace"})})}const Kr={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"],agentTimeline:t=>["agents","timeline",t]};function Xr(t){const e=t.kind==="directory"||t.type==="directory"?"directory":"file";return{name:t.name??"",kind:e,size:t.size,mtimeMs:t.mtimeMs}}function Jr(t){return t.slice().sort((e,n)=>e.kind!==n.kind?e.kind==="directory"?-1:1:e.name.localeCompare(n.name))}function pt(t,e=!0){const n=C(s=>s.client);return vt({queryKey:Kr.explorer(t),queryFn:async()=>{if(!n)throw new Error("not connected");const o=(await n.connection.request("file_explorer_request",{path:t})).result;if(!o||o.ok===!1)throw new Error(o&&"error"in o?o.error:"explorer request failed");const r="entries"in o?o.entries??[]:[];return{path:o.resolvedPath??t,entries:Jr(r.map(Xr))}},enabled:!!n&&!!t&&e})}const Yr="_list_1o67b_1",Zr="_upRow_1o67b_4",Qr="_item_1o67b_24",ea="_icon_1o67b_36",ta="_name_1o67b_43",na="_dirName_1o67b_48",sa="_emptyState_1o67b_54",O={list:Yr,upRow:Zr,item:Qr,icon:ea,name:ta,dirName:na,emptyState:sa};function oa(){const t=C(b=>b.client),e=Z(b=>b.currentPath),n=Z(b=>b.rootPath),s=Z(b=>b.setPath),o=Z(b=>b.setRoot),r=Z(b=>b.goUp),i=I(b=>b.activeWorkspaceCwd),l=I(b=>b.open),d=v.useRef(null);v.useEffect(()=>{if(!t)return;const b=i||"~";d.current!==b&&(d.current=b,Vo(t,b).then(_=>o(_)))},[t,i,o]);const{data:u,isLoading:g,isError:p,error:h}=pt(e,!!t);function T(b){s(e?`${e}/${b}`:b)}function w(b){const _=e?`${e}/${b}`:b;l({id:z.file(_),kind:"file",label:_.split("/").pop()||_,closable:!0,data:{path:_},workspaceCwd:i||"~"})}return t?g?a.jsx("div",{className:O.emptyState,children:"Loading..."}):p?a.jsxs("div",{className:O.emptyState,children:["Error: ",h instanceof Error?h.message:"unknown error"]}):!u||u.entries.length===0?a.jsx("div",{className:O.emptyState,children:"No files loaded"}):a.jsxs("div",{className:O.list,children:[e&&e!==n&&a.jsxs("div",{className:O.upRow,onClick:()=>r(),children:[a.jsx(Le,{size:12}),a.jsx("span",{children:e})]}),u.entries.map(b=>a.jsxs("div",{className:O.item,onClick:()=>b.kind==="directory"?T(b.name):w(b.name),children:[a.jsx("span",{className:O.icon,children:b.kind==="directory"?a.jsx(Ue,{size:14}):a.jsx(qt,{size:14})}),a.jsx("span",{className:b.kind==="directory"?O.dirName:O.name,children:b.name})]},b.name))]}):a.jsx("div",{className:O.emptyState,children:"Connect to browse files"})}const Ie=K()(t=>({subscribedCwd:null,changes:[],setSubscribedCwd:e=>t({subscribedCwd:e}),applyProjection:e=>{if(!e||!e.available){t({changes:[]});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})}}));function ra(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 aa(t){const e=C(r=>r.client),n=Ie(r=>r.applyProjection),s=Ie(r=>r.setSubscribedCwd),o=v.useRef(e);return o.current=e,v.useEffect(()=>{if(!e||!t)return;let r=!1;e.connection.request("checkout_status_subscribe",{cwd:t}).catch(()=>{}),s(t);const i=e.connection.onSessionMessage(l=>{if(r)return;const d=l;ra(d)&&d.cwd===t&&n(d.projection)});return e.connection.request("checkout_refresh_request",{cwd:t}).catch(()=>{}),()=>{r=!0,i(),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 ia="_list_1pgby_1",ca="_summary_1pgby_4",la="_item_1pgby_11",da="_badge_1pgby_23",ua="_added_1pgby_30",pa="_modified_1pgby_34",fa="_deleted_1pgby_38",ha="_name_1pgby_42",ma="_emptyState_1pgby_47",V={list:ia,summary:ca,item:la,badge:da,added:ua,modified:pa,deleted:fa,name:ha,emptyState:ma},ga={added:"A",modified:"M",deleted:"D"};function ba(){const e=I(r=>r.activeWorkspaceCwd)||"~";aa(e);const n=Ie(r=>r.changes),s=I(r=>r.open);function o(r,i){s({id:z.diff(r,i),kind:"diff",label:r.split("/").pop()||r,closable:!0,data:{path:r,staged:i},workspaceCwd:e})}return n.length===0?a.jsx("div",{className:V.emptyState,children:"No changes detected"}):a.jsxs("div",{className:V.list,children:[a.jsxs("div",{className:V.summary,children:[n.length," changed file",n.length===1?"":"s"]}),n.map((r,i)=>a.jsxs("div",{className:V.item,onClick:()=>o(r.path,r.staged),children:[a.jsx("span",{className:E(V.badge,V[r.status]),children:ga[r.status]}),a.jsx("span",{className:V.name,children:r.path})]},`${r.path}-${r.staged}-${i}`))]})}const ft=K()(t=>({terminals:[],setTerminals:e=>t({terminals:e})}));function _a(t){return typeof t=="object"&&t!==null&&"type"in t&&t.type==="terminals_update"&&"terminals"in t&&Array.isArray(t.terminals)}function wa(){const t=C(n=>n.client),e=ft(n=>n.setTerminals);v.useEffect(()=>{if(!t){e([]);return}let n=!1;t.connection.request("subscribe_terminals_request",{}).then(o=>{n||e(o.terminals??[])}).catch(()=>{});const s=t.connection.onSessionMessage(o=>{if(n)return;const r=o;_a(r)&&e(r.terminals)});return()=>{n=!0,s(),t.connection.request("unsubscribe_terminals_request",{}).catch(()=>{})}},[t,e])}const ya="_wrap_sx7p7_1",Sa="_newTerminal_sx7p7_5",va="_list_sx7p7_10",xa="_summary_sx7p7_13",ka="_item_sx7p7_20",Ia="_reattach_sx7p7_30",Ca="_icon_sx7p7_45",Ta="_name_sx7p7_49",ja="_openBadge_sx7p7_54",Na="_kill_sx7p7_62",Ra="_emptyState_sx7p7_80",$={wrap:ya,newTerminal:Sa,list:va,summary:xa,item:ka,reattach:Ia,icon:Ca,name:Ta,openBadge:ja,kill:Na,emptyState:Ra};function Ea(){wa();const t=C(p=>p.client),e=ft(p=>p.terminals),n=I(p=>p.tabs),s=I(p=>p.activeWorkspaceCwd),o=I(p=>p.open),r=I(p=>p.activate),i=I(p=>p.close);function l(p){return n.find(h=>h.kind==="terminal"&&h.data.slot===p)}function d(p,h,T){const w=l(p);if(w){r(w.id);return}const b=T||"~";o({id:z.terminal(p),kind:"terminal",label:h,closable:!0,data:{slot:p,cwd:b},workspaceCwd:b})}function u(p){const h=l(p);if(h){i(h.id);return}t&&t.connection.request("kill_terminal_request",{slot:p}).catch(()=>{})}const g=a.jsx(D,{variant:"secondary",size:"sm",leftIcon:a.jsx(He,{size:14}),className:$.newTerminal,onClick:()=>lt(s||"~"),children:"New terminal"});return e.length===0?a.jsxs("div",{className:$.wrap,children:[g,a.jsx("div",{className:$.emptyState,children:"No terminals running"})]}):a.jsxs("div",{className:$.wrap,children:[g,a.jsxs("div",{className:$.list,children:[a.jsxs("div",{className:$.summary,children:[e.length," terminal",e.length===1?"":"s"," running"]}),e.map(p=>{const h=l(p.slot)!==void 0;return a.jsxs("div",{className:$.item,children:[a.jsxs("button",{type:"button",className:$.reattach,onClick:()=>d(p.slot,p.name,p.cwd),title:p.cwd,children:[a.jsx(zt,{size:13,className:$.icon}),a.jsx("span",{className:$.name,children:p.name}),h&&a.jsx("span",{className:$.openBadge,children:"open"})]}),a.jsx("button",{type:"button",className:$.kill,onClick:()=>u(p.slot),title:"Kill terminal",children:a.jsx(me,{size:13})})]},p.slot)})]})]})}const Aa="_wrap_r37ok_1",Ba="_tabBar_r37ok_7",$a="_tabBtn_r37ok_13",Ma="_active_r37ok_26",Da="_refreshBtn_r37ok_30",Pa="_content_r37ok_34",F={wrap:Aa,tabBar:Ba,tabBtn:$a,active:Ma,refreshBtn:Da,content:Pa};function qa(){const t=x(d=>d.rightSidebarTab),e=x(d=>d.setRightSidebarTab),n=Z(d=>d.currentPath),o=I(d=>d.activeWorkspaceCwd)||"~",r=C(d=>d.client),i=xt();function l(){i.invalidateQueries({queryKey:["explorer",n]}),r&&o&&r.connection.request("checkout_refresh_request",{cwd:o}).catch(()=>{})}return a.jsxs("div",{className:F.wrap,children:[a.jsxs("div",{className:F.tabBar,children:[a.jsx("button",{type:"button",className:E(F.tabBtn,t==="files"&&F.active),onClick:()=>e("files"),children:"Files"}),a.jsx("button",{type:"button",className:E(F.tabBtn,t==="changes"&&F.active),onClick:()=>e("changes"),children:"Changes"}),a.jsx("button",{type:"button",className:E(F.tabBtn,t==="terminals"&&F.active),onClick:()=>e("terminals"),children:"Terminals"}),t!=="terminals"&&a.jsx(D,{size:"xs",variant:"ghost",iconOnly:!0,title:"Refresh",className:F.refreshBtn,onClick:l,children:a.jsx(Ot,{size:13})})]}),a.jsx("div",{className:F.content,children:t==="files"?a.jsx(oa,{}):t==="changes"?a.jsx(ba,{}):a.jsx(Ea,{})})]})}const za="_wrapper_131x2_3",Oa="_box_131x2_18",Fa="_checkmark_131x2_36",Wa="_nativeInput_131x2_41",he={wrapper:za,box:Oa,checkmark:Fa,nativeInput:Wa};v.forwardRef(function({label:e,checked:n=!1,disabled:s,className:o,onChange:r,...i},l){return a.jsxs("label",{className:he.wrapper,"data-disabled":s||void 0,children:[a.jsx("input",{ref:l,type:"checkbox",className:he.nativeInput,checked:n,disabled:s,onChange:r,...i}),a.jsx("span",{className:he.box,"data-checked":n,"aria-hidden":!0,children:n&&a.jsx(Ft,{size:12,className:he.checkmark})}),e&&a.jsx("span",{children:e})]})});const Ha="_select_vj45v_3",La={select:Ha};v.forwardRef(function({options:e,placeholder:n,className:s,...o},r){return a.jsxs("select",{ref:r,className:E(La.select,s),...o,children:[n&&a.jsx("option",{value:"",disabled:!0,children:n}),e.map(i=>a.jsx("option",{value:i.value,children:i.label},i.value))]})});const Ua="_overlay_1yaef_1",Va="_contentWrapper_1yaef_7",Ga="_dialog_1yaef_16",Ka="_header_1yaef_28",Xa="_title_1yaef_36",Ja="_closeBtn_1yaef_43",Ya="_body_1yaef_57",Za="_footer_1yaef_63",Qa="_bare_1yaef_72",ei="_bareBody_1yaef_78",ti="_bareCloseBtn_1yaef_82",ni="_visuallyHidden_1yaef_101",M={overlay:Ua,contentWrapper:Va,dialog:Ga,header:Ka,title:Xa,closeBtn:Ja,body:Ya,footer:Za,bare:Qa,bareBody:ei,bareCloseBtn:ti,visuallyHidden:ni},si=ye;function oi({open:t,onOpenChange:e,title:n,children:s,footer:o,width:r,className:i,bare:l=!1}){return a.jsx(Gt,{open:t,onOpenChange:e,children:a.jsxs(Kt,{children:[a.jsx(Xt,{className:M.overlay}),a.jsx("div",{className:M.contentWrapper,children:a.jsxs(Jt,{className:E(M.dialog,l&&M.bare,i),style:r!==void 0?{width:r}:void 0,children:[l?a.jsx(Re,{className:M.visuallyHidden,children:n}):a.jsxs("div",{className:M.header,children:[a.jsx(Re,{className:M.title,children:n}),a.jsx(ye,{asChild:!0,children:a.jsx("button",{type:"button",className:M.closeBtn,"aria-label":"Close",children:a.jsx(me,{size:16})})})]}),a.jsx("div",{className:E(M.body,l&&M.bareBody),children:s}),l&&a.jsx(ye,{asChild:!0,children:a.jsx("button",{type:"button",className:M.bareCloseBtn,"aria-label":"Close",children:a.jsx(me,{size:16})})}),o&&a.jsx("div",{className:M.footer,children:o})]})})]})})}const ri="_handle_1ocv1_1",ai={handle:ri};function Fe({side:t,onResize:e,className:n}){const s=v.useRef(0),o=v.useCallback(l=>{const d=l.clientX-s.current;s.current=l.clientX,e(t==="left"?d:-d)},[e,t]),r=v.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 i(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 a.jsx("div",{className:E(ai.handle,n),onPointerDown:i,role:"separator","aria-orientation":"vertical"})}function ii(t,e){var g;const{order:n,sessions:s,createSession:o,activate:r}=A.getState(),l=ut(n,s,e).find(p=>p.cwd===t),d=((g=l==null?void 0:l.sessions[0])==null?void 0:g.id)??o(t);r(d);const u=A.getState().sessions[d];I.getState().open({id:z.chat(d),kind:"chat",label:(u==null?void 0:u.title)??"New chat",closable:!0,data:{sessionId:d},workspaceCwd:t}),x.getState().setCwd(t)}const ci="_pathRow_9xphl_1",li="_pathInput_9xphl_9",di="_list_9xphl_13",ui="_item_9xphl_20",pi="_name_9xphl_32",fi="_emptyState_9xphl_37",U={pathRow:ci,pathInput:li,list:di,item:ui,name:pi,emptyState:fi};function hi(){const t=x(S=>S.cwdPickerOpen),e=x(S=>S.closeCwdPicker),n=I(S=>S.activeWorkspaceCwd),s=C(S=>S.client),o=dt(),[r,i]=v.useState("/"),[l,d]=v.useState("/");v.useEffect(()=>{if(!t)return;const S=te(n||"~",o);i(S),d(S)},[t,s,n]);const{data:u,isLoading:g,isError:p,error:h}=pt(r,t&&!!s),T=((u==null?void 0:u.entries)??[]).filter(S=>S.kind==="directory");function w(S){i(S),d(S)}function b(){w(r.split("/").slice(0,-1).join("/")||"/")}function _(){w(l.trim())}function j(){ii(r,o),e()}return a.jsxs(oi,{open:t,onOpenChange:S=>!S&&e(),title:"Open Workspace",footer:a.jsxs(a.Fragment,{children:[a.jsx(si,{asChild:!0,children:a.jsx(D,{size:"sm",variant:"secondary",children:"Cancel"})}),a.jsx(D,{size:"sm",onClick:j,children:"Open this folder"})]}),children:[a.jsxs("div",{className:U.pathRow,children:[a.jsx(D,{size:"xs",variant:"ghost",iconOnly:!0,title:"Up",onClick:b,children:a.jsx(Le,{size:13})}),a.jsx(ve,{className:U.pathInput,value:l,onChange:S=>d(S.target.value),onKeyDown:S=>{S.key==="Enter"&&(S.preventDefault(),_())}}),a.jsx(D,{size:"xs",onClick:_,children:"Go"})]}),a.jsx("div",{className:U.list,children:g?a.jsx("div",{className:U.emptyState,children:"Loading..."}):p?a.jsxs("div",{className:U.emptyState,children:["Error: ",h instanceof Error?h.message:"unknown error"]}):T.length===0?a.jsx("div",{className:U.emptyState,children:"No subdirectories"}):T.map(S=>a.jsxs("div",{className:U.item,onClick:()=>w(r==="/"?`/${S.name}`:`${r}/${S.name}`),children:[a.jsx(Ue,{size:14}),a.jsx("span",{className:U.name,children:S.name})]},S.name))})]})}const mi="_shell_1m1nv_1",gi="_main_1m1nv_7",bi="_sidebarLeft_1m1nv_13",_i="_leftHandle_1m1nv_21",wi="_center_1m1nv_24",yi="_sidebarRight_1m1nv_31",Si="_rightHandle_1m1nv_39",G={shell:mi,main:gi,sidebarLeft:bi,leftHandle:_i,center:wi,sidebarRight:yi,rightHandle:Si};function vi(){const t=x(i=>i.leftSidebarCollapsed),e=x(i=>i.rightSidebarCollapsed),n=x(i=>i.leftSidebarWidth),s=x(i=>i.rightSidebarWidth),o=x(i=>i.resizeLeftSidebar),r=x(i=>i.resizeRightSidebar);return a.jsxs("div",{className:G.shell,children:[a.jsx(Eo,{}),a.jsxs("div",{className:G.main,children:[!t&&a.jsxs("aside",{className:G.sidebarLeft,style:{width:n},children:[a.jsx(Ir,{}),a.jsx(Fe,{side:"left",className:G.leftHandle,onResize:o})]}),a.jsxs("div",{className:G.center,children:[a.jsx($r,{}),a.jsx(Gr,{})]}),!e&&a.jsxs("aside",{className:G.sidebarRight,style:{width:s},children:[a.jsx(Fe,{side:"right",className:G.rightHandle,onResize:r}),a.jsx(qa,{})]})]}),a.jsx(hi,{})]})}function xi(){const t=v.useRef(!1);v.useEffect(()=>{if(t.current)return;t.current=!0;const e=new URLSearchParams(window.location.search),n=e.get("host"),s=e.get("password"),o=e.get("cwd"),r=e.get("connect")==="1",i=x.getState();if(n&&i.setHost(n),s&&i.setPassword(s),o&&i.setCwd(o),r){const{host:l,password:d}=x.getState();C.getState().connect({url:l,password:d||void 0})}},[])}function ki(t){return typeof t=="object"&&t!==null&&"kind"in t}function Ii(t){const e=[];for(const n of t)if(ki(n))if(n.kind==="other")n.event&&e.push(n.event);else for(const s of n.events??[])e.push(s);return e}function Ci(){const t=C(s=>s.client),e=C(s=>s.status),n=v.useRef(!1);v.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,g)=>(g.lastActivity??0)-(u.lastActivity??0));const o=A.getState();for(const u of s){if(o.findByAgentId(u.agentId))continue;let g=xe;try{const p=await t.agent(u.agentId).timeline.fetch({direction:"after",limit:200});g=Ii(p.items).reduce(ct,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:g,userMessageCount:g.rows.filter(p=>p.kind==="user").length})}const r=await Ne(t).catch(()=>null),{order:i,sessions:l}=A.getState();if(i.length>0){const u=l[i[0]??""];if(u){const g=te(u.cwd||"~",r);A.getState().activate(u.id),x.getState().setCwd(u.cwd),I.getState().open({id:z.chat(u.id),kind:"chat",label:u.title,closable:!0,data:{sessionId:u.id},workspaceCwd:g})}}else{const u=x.getState().cwd||"~",g=te(u,r),p=A.getState().createSession(u);I.getState().open({id:z.chat(p),kind:"chat",label:"New chat",closable:!0,data:{sessionId:p},workspaceCwd:g})}})())},[e,t])}function Ti(){v.useEffect(()=>{function t(e){const n=x.getState();if(e.key==="Escape"){n.closeCwdPicker(),n.closeSessionMenu();return}const s=e.ctrlKey||e.metaKey;if(s&&e.key.toLowerCase()==="t"){e.preventDefault(),lt(I.getState().activeWorkspaceCwd||"~");return}if(s&&e.key.toLowerCase()==="w"){const{activeTabId:o,tabs:r,close:i}=I.getState();if(!o)return;const l=r.find(d=>d.id===o);(l==null?void 0:l.closable)!==!1&&(e.preventDefault(),i(o))}}return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[])}function ji(){return xi(),Ci(),Ti(),null}function Ni(){return a.jsxs(Xn,{children:[a.jsx(ji,{}),a.jsx(vi,{})]})}const ht=document.getElementById("root");if(!ht)throw new Error("Missing #root element");wt.createRoot(ht).render(a.jsx(v.StrictMode,{children:a.jsx(Ni,{})}));export{D as B,oi as D,zr as S,zi as T,C as a,I as b,Oi as e,Kr as r,Ao as t,A as u};
|
|
3
|
-
//# sourceMappingURL=index-DnTTpAX5.js.map
|