claude-mux 0.26.2 → 0.26.4
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/server/ws-handlers.d.ts.map +1 -1
- package/dist/server/ws-handlers.js +37 -6
- package/dist/server/ws-handlers.js.map +1 -1
- package/dist/tmux/pane.d.ts +13 -3
- package/dist/tmux/pane.d.ts.map +1 -1
- package/dist/tmux/pane.js +113 -36
- package/dist/tmux/pane.js.map +1 -1
- package/dist/transcript/context-peek.d.ts +18 -0
- package/dist/transcript/context-peek.d.ts.map +1 -1
- package/dist/transcript/context-peek.js +59 -12
- package/dist/transcript/context-peek.js.map +1 -1
- package/dist/types/ws-messages.d.ts +6 -0
- package/dist/types/ws-messages.d.ts.map +1 -1
- package/dist/types/ws-messages.js +2 -0
- package/dist/types/ws-messages.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/web/client/_app/immutable/assets/0.CiLJk_Xe.css +1 -0
- package/{web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.XJ3XhAQU.css → dist/web/client/_app/immutable/assets/3.DIECCPxi.css} +1 -1
- package/dist/web/client/_app/immutable/chunks/Bjgls5C2.js +2 -0
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/Cotx9uI_.js → dist/web/client/_app/immutable/chunks/C8V5fK-3.js} +1 -1
- package/dist/web/client/_app/immutable/chunks/DnC9WjQh.js +57 -0
- package/dist/web/client/_app/immutable/chunks/MhGpinwS.js +1 -0
- package/dist/web/client/_app/immutable/chunks/cJslalWy.js +1 -0
- package/dist/web/client/_app/immutable/entry/{app.DXHW0aPL.js → app.tijMyuHe.js} +2 -2
- package/dist/web/client/_app/immutable/entry/start.BjUUmuae.js +1 -0
- package/dist/web/client/_app/immutable/nodes/{0.DAnv2asW.js → 0.Dh-WcEW1.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.CU8f4oNB.js → 1.haoM4e9N.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.BYpvCgtu.js → 2.DtC9KdX8.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/3.FZTTKJCk.js +168 -0
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-C-AAPmon.js → 0-Cw5iP0WY.js} +9 -9
- package/dist/web/server/chunks/{0-C-AAPmon.js.map → 0-Cw5iP0WY.js.map} +1 -1
- package/dist/web/server/chunks/{1-T_dogl8W.js → 1-CR_g4jt5.js} +3 -3
- package/dist/web/server/chunks/{1-T_dogl8W.js.map → 1-CR_g4jt5.js.map} +1 -1
- package/dist/web/server/chunks/{2-FlchE_4u.js → 2-Cy0TJi3N.js} +7 -7
- package/dist/web/server/chunks/{2-FlchE_4u.js.map → 2-Cy0TJi3N.js.map} +1 -1
- package/dist/web/server/chunks/{3-U2bTntXU.js → 3-D9Ui86YT.js} +7 -7
- package/dist/web/server/chunks/{3-U2bTntXU.js.map → 3-D9Ui86YT.js.map} +1 -1
- package/dist/web/server/chunks/{_layout.svelte-Ddn9Wu-V.js → _layout.svelte-DZ2sqwz3.js} +4 -4
- package/dist/web/server/chunks/{_layout.svelte-Ddn9Wu-V.js.map → _layout.svelte-DZ2sqwz3.js.map} +1 -1
- package/dist/web/server/chunks/{_page.svelte-_F3qltju.js → _page.svelte--yq9E8Jb.js} +2 -2
- package/dist/web/server/chunks/{_page.svelte-_F3qltju.js.map → _page.svelte--yq9E8Jb.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CNU4yPZZ.js → _server.ts-BCCIAioG.js} +4 -2
- package/dist/web/server/chunks/_server.ts-BCCIAioG.js.map +1 -0
- package/dist/web/server/chunks/{_server.ts-CtsPyICr.js → _server.ts-BMZtxwLP.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CtsPyICr.js.map → _server.ts-BMZtxwLP.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BBrtrcEt.js → _server.ts-CONr9rjv.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-BBrtrcEt.js.map → _server.ts-CONr9rjv.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-fnuGtMqr.js → _server.ts-CSKVHlMn.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-fnuGtMqr.js.map → _server.ts-CSKVHlMn.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Df32fD_Q.js → _server.ts-D1PwUVXn.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-Df32fD_Q.js.map → _server.ts-D1PwUVXn.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-C00ejke7.js → _server.ts-D4xa8gs1.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-C00ejke7.js.map → _server.ts-D4xa8gs1.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-C6MJsvPN.js → _server.ts-DxjUBscT.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-C6MJsvPN.js.map → _server.ts-DxjUBscT.js.map} +1 -1
- package/dist/web/server/chunks/{button-C1GVS_oY.js → button-BxVvCjdl.js} +24 -4
- package/dist/web/server/chunks/{button-C1GVS_oY.js.map → button-BxVvCjdl.js.map} +1 -1
- package/dist/web/server/chunks/{hooks.server-DG_lyHkY.js → hooks.server-B8dJh24b.js} +3 -3
- package/dist/web/server/chunks/{hooks.server-DG_lyHkY.js.map → hooks.server-B8dJh24b.js.map} +1 -1
- package/dist/web/server/chunks/{ws-handlers-BQ2RtlNl.js → ws-handlers-fSFiSfwn.js} +150 -43
- package/dist/web/server/chunks/ws-handlers-fSFiSfwn.js.map +1 -0
- package/dist/web/server/chunks/{ws-managers-DLQiiQnX.js → ws-managers-Cv1gfcBO.js} +2 -2
- package/dist/web/server/chunks/{ws-managers-DLQiiQnX.js.map → ws-managers-Cv1gfcBO.js.map} +1 -1
- package/dist/web/server/index.js +2 -2
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/manifest.js +17 -17
- package/dist/web/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/server/ws-handlers.ts +35 -6
- package/src/tmux/pane.ts +124 -33
- package/src/transcript/context-peek.ts +71 -13
- package/src/types/ws-messages.ts +2 -0
- package/src/utils/version.ts +1 -1
- package/tests/tmux/activity-line.test.ts +47 -0
- package/tests/tmux/prompt-options.test.ts +49 -4
- package/tests/transcript/title-peek.test.ts +54 -0
- package/web/.svelte-kit/adapter-bun/.vite/manifest.json +4 -8
- package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_layout.6tlxP3iE.css +1 -0
- package/{dist/web/client/_app/immutable/assets/3.XJ3XhAQU.css → web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.DIECCPxi.css} +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/button.js +24 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +137 -40
- package/web/.svelte-kit/adapter-bun/chunks/ws-managers.js +1 -1
- package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js +3 -1
- package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_server.ts.js +1 -1
- package/web/.svelte-kit/adapter-bun/entries/endpoints/api/settings/_server.ts.js +1 -1
- package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js +2 -2
- package/web/.svelte-kit/adapter-bun/entries/pages/session/_target_/_page.svelte.js +2 -1
- package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
- package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/0.js +2 -2
- package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/3.js +2 -2
- package/web/.svelte-kit/generated/server/internal.js +1 -1
- package/web/.svelte-kit/output/client/.vite/manifest.json +59 -59
- package/web/.svelte-kit/output/client/_app/immutable/assets/0.CiLJk_Xe.css +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/assets/{3.XJ3XhAQU.css → 3.DIECCPxi.css} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Bjgls5C2.js +2 -0
- package/{dist/web/client/_app/immutable/chunks/Cotx9uI_.js → web/.svelte-kit/output/client/_app/immutable/chunks/C8V5fK-3.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DnC9WjQh.js +57 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/MhGpinwS.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/cJslalWy.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DXHW0aPL.js → app.tijMyuHe.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.BjUUmuae.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.DAnv2asW.js → 0.Dh-WcEW1.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.CU8f4oNB.js → 1.haoM4e9N.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.BYpvCgtu.js → 2.DtC9KdX8.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/3.FZTTKJCk.js +168 -0
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/.vite/manifest.json +4 -8
- package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.6tlxP3iE.css +1 -0
- package/web/.svelte-kit/output/server/_app/immutable/assets/{_page.XJ3XhAQU.css → _page.DIECCPxi.css} +1 -1
- package/web/.svelte-kit/output/server/chunks/button.js +24 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
- package/web/.svelte-kit/output/server/chunks/ws-handlers.js +137 -40
- package/web/.svelte-kit/output/server/chunks/ws-managers.js +1 -1
- package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js +3 -1
- package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_server.ts.js +1 -1
- package/web/.svelte-kit/output/server/entries/endpoints/api/settings/_server.ts.js +1 -1
- package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +2 -2
- package/web/.svelte-kit/output/server/entries/pages/session/_target_/_page.svelte.js +2 -1
- package/web/.svelte-kit/output/server/manifest-full.js +1 -1
- package/web/.svelte-kit/output/server/manifest.js +1 -1
- package/web/.svelte-kit/output/server/nodes/0.js +2 -2
- package/web/.svelte-kit/output/server/nodes/1.js +1 -1
- package/web/.svelte-kit/output/server/nodes/2.js +1 -1
- package/web/.svelte-kit/output/server/nodes/3.js +2 -2
- package/web/src/lib/actions/longPress.ts +52 -6
- package/web/src/lib/components/AllSessionsPanel.svelte +12 -3
- package/web/src/lib/stores/websocket-base.svelte.ts +24 -1
- package/web/src/routes/api/projects/new-session/+server.ts +3 -0
- package/web/src/routes/session/[target]/+page.svelte +60 -12
- package/dist/web/client/_app/immutable/assets/0.DwaaTdPO.css +0 -1
- package/dist/web/client/_app/immutable/chunks/1pIWnoD_.js +0 -1
- package/dist/web/client/_app/immutable/chunks/DfoR1zCV.js +0 -1
- package/dist/web/client/_app/immutable/chunks/DmEI2TOa.js +0 -57
- package/dist/web/client/_app/immutable/chunks/DtVU-s3j.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.CchjowOg.js +0 -1
- package/dist/web/client/_app/immutable/nodes/3.DuMzeRg3.js +0 -168
- package/dist/web/server/chunks/_server.ts-CNU4yPZZ.js.map +0 -1
- package/dist/web/server/chunks/geometry-CUMMOI9q.js +0 -46
- package/dist/web/server/chunks/geometry-CUMMOI9q.js.map +0 -1
- package/dist/web/server/chunks/ws-handlers-BQ2RtlNl.js.map +0 -1
- package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_layout.Bpy37C6o.css +0 -1
- package/web/.svelte-kit/adapter-bun/chunks/geometry.js +0 -32
- package/web/.svelte-kit/output/client/_app/immutable/assets/0.DwaaTdPO.css +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/1pIWnoD_.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DfoR1zCV.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DmEI2TOa.js +0 -57
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DtVU-s3j.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.CchjowOg.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/3.DuMzeRg3.js +0 -168
- package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.Bpy37C6o.css +0 -1
- package/web/.svelte-kit/output/server/chunks/geometry.js +0 -32
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-CNU4yPZZ.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { existsSync, statSync, readFileSync, writeFileSync } from \"fs\";\nimport { execFileSync } from \"child_process\";\nimport { u as upsertSession } from \"../../../../../chunks/sessions-json.js\";\nimport { basename, join } from \"path\";\nimport { homedir } from \"os\";\nimport { p as parseAgent, A as AGENTS } from \"../../../../../chunks/agents.js\";\nimport { s as sizeArgsForNewSession } from \"../../../../../chunks/geometry.js\";\nfunction projectSlug(cwd, fallback) {\n return basename(cwd).replace(/[^A-Za-z0-9_-]/g, \"_\") || fallback;\n}\nfunction ensureWorkspaceTrusted(cwd) {\n const claudeJsonPath = join(homedir(), \".claude.json\");\n try {\n const data = existsSync(claudeJsonPath) ? JSON.parse(readFileSync(claudeJsonPath, \"utf-8\")) : {};\n if (!data.projects) data.projects = {};\n if (!data.projects[cwd]) data.projects[cwd] = {};\n if (!data.projects[cwd].hasTrustDialogAccepted) {\n data.projects[cwd].hasTrustDialogAccepted = true;\n writeFileSync(claudeJsonPath, JSON.stringify(data, null, 2));\n }\n } catch (err) {\n console.error(\"[new-session] Failed to pre-trust workspace:\", err);\n }\n}\nconst POST = async ({ request }) => {\n const { cwd, agent } = await request.json();\n if (!cwd) {\n return json({ error: \"cwd required\" }, { status: 400 });\n }\n const selectedAgent = parseAgent(agent);\n if (!existsSync(cwd)) {\n return json({ error: \"Folder does not exist\" }, { status: 400 });\n }\n const stat = statSync(cwd);\n if (!stat.isDirectory()) {\n return json({ error: \"Path is not a directory\" }, { status: 400 });\n }\n try {\n ensureWorkspaceTrusted(cwd);\n const sessionName = `${projectSlug(cwd, selectedAgent)}-${selectedAgent}-${Date.now()}`;\n const { TMUX: _tmux, TMUX_PANE: _pane, ...tmuxEnv } = process.env;\n execFileSync(\"tmux\", [\n \"new-session\",\n \"-d\",\n \"-s\",\n sessionName,\n \"-c\",\n cwd,\n // Detached, the window would be 80x24; the dashboard reads dialogs\n // off the screen and wants them unwrapped (see tmux/geometry).\n ...sizeArgsForNewSession(),\n \"--\",\n \"env\",\n \"-u\",\n \"CLAUDECODE\",\n ...AGENTS[selectedAgent].argv\n ], {\n stdio: \"ignore\",\n env: tmuxEnv\n });\n const baseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const paneBaseIndex = execFileSync(\"tmux\", [\"show-option\", \"-gv\", \"pane-base-index\"], {\n encoding: \"utf-8\",\n env: tmuxEnv\n }).trim() || \"0\";\n const tmuxTarget = `${sessionName}:${baseIndex}.${paneBaseIndex}`;\n const record = upsertSession({\n id: crypto.randomUUID(),\n pid: 0,\n cwd,\n tmux_target: tmuxTarget,\n state: \"idle\",\n agent: selectedAgent\n });\n return json({ ok: true, session: sessionName, tmuxTarget, agent: selectedAgent, record });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n console.error(\"[new-session] Failed to create session:\", detail);\n return json({ error: \"Failed to create session\", detail }, { status: 500 });\n }\n};\nexport {\n POST\n};\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,KAAK,UAAU;CAClC,OAAO,SAAS,GAAG,CAAC,CAAC,QAAQ,mBAAmB,GAAG,KAAK;AAC1D;AACA,SAAS,uBAAuB,KAAK;CACnC,MAAM,iBAAiB,KAAK,QAAQ,GAAG,cAAc;CACrD,IAAI;EACF,MAAM,OAAO,WAAW,cAAc,IAAI,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC,IAAI,CAAC;EAC/F,IAAI,CAAC,KAAK,UAAU,KAAK,WAAW,CAAC;EACrC,IAAI,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;EAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,wBAAwB;GAC9C,KAAK,SAAS,IAAI,CAAC,yBAAyB;GAC5C,cAAc,gBAAgB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;EAC7D;CACF,SAAS,KAAK;EACZ,QAAQ,MAAM,gDAAgD,GAAG;CACnE;AACF;AACA,MAAM,OAAO,OAAO,EAAE,cAAc;CAClC,MAAM,EAAE,KAAK,UAAU,MAAM,QAAQ,KAAK;CAC1C,IAAI,CAAC,KACH,OAAO,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;CAExD,MAAM,gBAAgB,WAAW,KAAK;CACtC,IAAI,CAAC,WAAW,GAAG,GACjB,OAAO,KAAK,EAAE,OAAO,wBAAwB,GAAG,EAAE,QAAQ,IAAI,CAAC;CAGjE,IAAI,CADS,SAAS,GACd,CAAC,CAAC,YAAY,GACpB,OAAO,KAAK,EAAE,OAAO,0BAA0B,GAAG,EAAE,QAAQ,IAAI,CAAC;CAEnE,IAAI;EACF,uBAAuB,GAAG;EAC1B,MAAM,cAAc,GAAG,YAAY,KAAK,aAAa,EAAE,GAAG,cAAc,GAAG,KAAK,IAAI;EACpF,MAAM,EAAE,MAAM,OAAO,WAAW,OAAO,GAAG,YAAY,QAAQ;EAC9D,aAAa,QAAQ;GACnB;GACA;GACA;GACA;GACA;GACA;GAGA,GAAG,sBAAsB;GACzB;GACA;GACA;GACA;GACA,GAAG,OAAO,cAAc,CAAC;EAC3B,GAAG;GACD,OAAO;GACP,KAAK;EACP,CAAC;EASD,MAAM,aAAa,GAAG,YAAY,GARhB,aAAa,QAAQ;GAAC;GAAe;GAAO;EAAY,GAAG;GAC3E,UAAU;GACV,KAAK;EACP,CAAC,CAAC,CAAC,KAAK,KAAK,IAKkC,GAJzB,aAAa,QAAQ;GAAC;GAAe;GAAO;EAAiB,GAAG;GACpF,UAAU;GACV,KAAK;EACP,CAAC,CAAC,CAAC,KAAK,KAAK;EAEb,MAAM,SAAS,cAAc;GAC3B,IAAI,OAAO,WAAW;GACtB,KAAK;GACL;GACA,aAAa;GACb,OAAO;GACP,OAAO;EACT,CAAC;EACD,OAAO,KAAK;GAAE,IAAI;GAAM,SAAS;GAAa;GAAY,OAAO;GAAe;EAAO,CAAC;CAC1F,SAAS,KAAK;EACZ,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EAC9D,QAAQ,MAAM,2CAA2C,MAAM;EAC/D,OAAO,KAAK;GAAE,OAAO;GAA4B;EAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;CAC5E;AACF"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { execFile } from "child_process";
|
|
2
|
-
import { promisify } from "util";
|
|
3
|
-
//#region .svelte-kit/adapter-bun/chunks/geometry.js
|
|
4
|
-
const execFileAsync = promisify(execFile);
|
|
5
|
-
const STANDARD_PANE_WIDTH = 200;
|
|
6
|
-
const STANDARD_PANE_HEIGHT = 50;
|
|
7
|
-
const MIN_USEFUL_PANE_WIDTH = 160;
|
|
8
|
-
function sizeArgsForNewSession() {
|
|
9
|
-
return [
|
|
10
|
-
"-x",
|
|
11
|
-
String(STANDARD_PANE_WIDTH),
|
|
12
|
-
"-y",
|
|
13
|
-
String(STANDARD_PANE_HEIGHT)
|
|
14
|
-
];
|
|
15
|
-
}
|
|
16
|
-
function wantsWidening(pane) {
|
|
17
|
-
return pane.attached === 0 && pane.width < MIN_USEFUL_PANE_WIDTH;
|
|
18
|
-
}
|
|
19
|
-
async function widenDetachedWindow(target) {
|
|
20
|
-
try {
|
|
21
|
-
await execFileAsync("tmux", [
|
|
22
|
-
"resize-window",
|
|
23
|
-
"-t",
|
|
24
|
-
target,
|
|
25
|
-
"-x",
|
|
26
|
-
String(STANDARD_PANE_WIDTH),
|
|
27
|
-
"-y",
|
|
28
|
-
String(STANDARD_PANE_HEIGHT)
|
|
29
|
-
], { timeout: 1e3 });
|
|
30
|
-
await execFileAsync("tmux", [
|
|
31
|
-
"set-option",
|
|
32
|
-
"-w",
|
|
33
|
-
"-t",
|
|
34
|
-
target,
|
|
35
|
-
"window-size",
|
|
36
|
-
"latest"
|
|
37
|
-
], { timeout: 1e3 });
|
|
38
|
-
return true;
|
|
39
|
-
} catch {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//#endregion
|
|
44
|
-
export { wantsWidening as n, widenDetachedWindow as r, sizeArgsForNewSession as t };
|
|
45
|
-
|
|
46
|
-
//# sourceMappingURL=geometry-CUMMOI9q.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geometry-CUMMOI9q.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/geometry.js"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nconst execFileAsync = promisify(execFile);\nconst STANDARD_PANE_WIDTH = 200;\nconst STANDARD_PANE_HEIGHT = 50;\nconst MIN_USEFUL_PANE_WIDTH = 160;\nfunction sizeArgsForNewSession() {\n return [\"-x\", String(STANDARD_PANE_WIDTH), \"-y\", String(STANDARD_PANE_HEIGHT)];\n}\nfunction wantsWidening(pane) {\n return pane.attached === 0 && pane.width < MIN_USEFUL_PANE_WIDTH;\n}\nasync function widenDetachedWindow(target) {\n try {\n await execFileAsync(\n \"tmux\",\n [\"resize-window\", \"-t\", target, \"-x\", String(STANDARD_PANE_WIDTH), \"-y\", String(STANDARD_PANE_HEIGHT)],\n { timeout: 1e3 }\n );\n await execFileAsync(\"tmux\", [\"set-option\", \"-w\", \"-t\", target, \"window-size\", \"latest\"], {\n timeout: 1e3\n });\n return true;\n } catch {\n return false;\n }\n}\nexport {\n widenDetachedWindow as a,\n sizeArgsForNewSession as s,\n wantsWidening as w\n};\n"],"mappings":";;;AAEA,MAAM,gBAAgB,UAAU,QAAQ;AACxC,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAC9B,SAAS,wBAAwB;CAC/B,OAAO;EAAC;EAAM,OAAO,mBAAmB;EAAG;EAAM,OAAO,oBAAoB;CAAC;AAC/E;AACA,SAAS,cAAc,MAAM;CAC3B,OAAO,KAAK,aAAa,KAAK,KAAK,QAAQ;AAC7C;AACA,eAAe,oBAAoB,QAAQ;CACzC,IAAI;EACF,MAAM,cACJ,QACA;GAAC;GAAiB;GAAM;GAAQ;GAAM,OAAO,mBAAmB;GAAG;GAAM,OAAO,oBAAoB;EAAC,GACrG,EAAE,SAAS,IAAI,CACjB;EACA,MAAM,cAAc,QAAQ;GAAC;GAAc;GAAM;GAAM;GAAQ;GAAe;EAAQ,GAAG,EACvF,SAAS,IACX,CAAC;EACD,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-handlers-BQ2RtlNl.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/context.js","../../../../web/.svelte-kit/adapter-bun/chunks/ws-handlers.js"],"sourcesContent":["import { a as asRecord, b as readNumber, r as readString } from \"./json.js\";\nconst WINDOW_200K = 2e5;\nconst WINDOW_1M = 1e6;\nconst WINDOWS = [\n {\n window: WINDOW_1M,\n models: [\n \"claude-sonnet-5\",\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\"\n ]\n },\n {\n window: WINDOW_200K,\n models: [\n \"claude-3-\",\n \"claude-haiku-4-5\",\n \"claude-sonnet-4-0\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4-6\",\n \"claude-opus-4-0\",\n \"claude-opus-4-1\",\n \"claude-opus-4-5\",\n \"claude-opus-4-6\"\n ]\n }\n];\nfunction contextWindowFor(model) {\n const id = model.toLowerCase();\n if (id.includes(\"[1m]\")) return WINDOW_1M;\n for (const entry of WINDOWS) {\n if (entry.models.some((known) => id.includes(known))) return entry.window;\n }\n return null;\n}\nfunction contextPercent(usage) {\n return usage.window === null ? null : Math.round(usage.tokens / usage.window * 100);\n}\nfunction readContextUsage(message) {\n const usage = asRecord(message.usage);\n if (!usage) return null;\n const tokens = readNumber(usage, \"input_tokens\") + readNumber(usage, \"cache_creation_input_tokens\") + readNumber(usage, \"cache_read_input_tokens\");\n if (tokens === 0) return null;\n const model = readString(message.model) ?? \"\";\n return { model, tokens, window: contextWindowFor(model) };\n}\nexport {\n contextPercent as c,\n readContextUsage as r\n};\n","import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, openSync, fstatSync, readSync, closeSync, readdirSync, statSync } from \"fs\";\nimport { e as getSessionsDir, f as cleanupStaleSessions, g as getSession, h as readLinks, c as updateSession, b as getAllSessions } from \"./sessions-json.js\";\nimport { dirname, join, basename } from \"path\";\nimport { homedir } from \"os\";\nimport { r as readContextUsage, c as contextPercent } from \"./context.js\";\nimport { a as asRecord, r as readString } from \"./json.js\";\nimport { i as isDictated } from \"./dictation-marks.js\";\nimport { execFile, execFileSync } from \"child_process\";\nimport { promisify } from \"util\";\nimport { w as wantsWidening, a as widenDetachedWindow } from \"./geometry.js\";\nimport { S as SESSIONS_DIR } from \"./paths.js\";\nimport { b as getQueueSummary, e as enqueue } from \"./message-queue.js\";\nfunction resolveProjectsPath() {\n return join(dirname(getSessionsDir()), \"projects.json\");\n}\nfunction readFile() {\n const path = resolveProjectsPath();\n if (!existsSync(path)) return { v: 1, projects: [] };\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n const projects = Array.isArray(parsed.projects) ? parsed.projects.filter((p) => typeof p === \"string\" && p.length > 0) : [];\n return { v: 1, projects: [...new Set(projects)] };\n } catch {\n return { v: 1, projects: [] };\n }\n}\nfunction writeFile(file) {\n const path = resolveProjectsPath();\n mkdirSync(dirname(path), { recursive: true });\n const tmp = `${path}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(file, null, 2));\n renameSync(tmp, path);\n}\nfunction getSavedProjects() {\n return readFile().projects;\n}\nfunction isForbiddenRoot(cwd, home = homedir()) {\n const path = cwd.replace(/\\/+$/, \"\") || \"/\";\n if (path === \"/\" || path === home) return true;\n if ([\"/tmp\", \"/home\", \"/Users\", \"/root\", \"/mnt\", \"/media\", \"/opt\", \"/var\", \"/srv\"].includes(path)) return true;\n if (/^\\/(?:mnt|media|Volumes)\\/[^/]+$/.test(path)) return true;\n return false;\n}\nfunction isUnder(child, parent) {\n return child.startsWith(parent.endsWith(\"/\") ? parent : `${parent}/`);\n}\nfunction saveProjects(cwds) {\n const file = readFile();\n let changed = false;\n for (const raw of cwds) {\n const cwd = raw?.replace(/\\/+$/, \"\");\n if (!cwd || isForbiddenRoot(cwd)) continue;\n if (file.projects.some((p) => p === cwd || isUnder(cwd, p))) continue;\n const kept = file.projects.filter((p) => !isUnder(p, cwd));\n if (kept.length !== file.projects.length) changed = true;\n file.projects = [...kept, cwd];\n changed = true;\n }\n if (changed) writeFile(file);\n return changed;\n}\nfunction saveProject(cwd) {\n return saveProjects([cwd]);\n}\nfunction removeProject(cwd) {\n const file = readFile();\n const next = file.projects.filter((p) => p !== cwd);\n if (next.length === file.projects.length) return false;\n writeFile({ ...file, projects: next });\n return true;\n}\nconst DEFAULT_SETTINGS = {\n autoRemoteControl: false\n};\nfunction resolveSettingsPath() {\n return join(dirname(getSessionsDir()), \"settings.json\");\n}\nfunction getSettings() {\n const path = resolveSettingsPath();\n if (!existsSync(path)) return { ...DEFAULT_SETTINGS };\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"));\n return {\n autoRemoteControl: typeof parsed.autoRemoteControl === \"boolean\" ? parsed.autoRemoteControl : DEFAULT_SETTINGS.autoRemoteControl\n };\n } catch {\n return { ...DEFAULT_SETTINGS };\n }\n}\nfunction updateSettings(patch) {\n const next = { ...getSettings() };\n if (typeof patch.autoRemoteControl === \"boolean\") next.autoRemoteControl = patch.autoRemoteControl;\n const path = resolveSettingsPath();\n mkdirSync(dirname(path), { recursive: true });\n const tmp = `${path}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(next, null, 2));\n renameSync(tmp, path);\n return next;\n}\nfunction isClaudeMuxSessionName(name) {\n return /-(?:claude|gemini|copilot)-\\d{10,}$/.test(name);\n}\nconst COMMAND_TAG = /<command-(name|message|args)>([\\s\\S]*?)<\\/command-\\1>/g;\nfunction parseSlashCommand(content) {\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"<command-\")) return null;\n const tags = {};\n for (const match of trimmed.matchAll(COMMAND_TAG)) tags[match[1]] = match[2].trim();\n const name = tags.name;\n if (!name) return null;\n return { name, ...tags.args ? { args: tags.args } : {} };\n}\nconst LOCAL_OUTPUT_TAG = /^<local-command-(stdout|stderr)>([\\s\\S]*?)<\\/local-command-\\1>/;\nconst ANSI_SGR = /\\x1b\\[[0-9;]*m/g;\nconst LOCAL_CAVEAT = /^<local-command-caveat>/;\nfunction parseLocalOutput(content) {\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"<local-command-\")) return null;\n const chunks = [];\n let rest = trimmed;\n for (let m = rest.match(LOCAL_OUTPUT_TAG); m; m = rest.match(LOCAL_OUTPUT_TAG)) {\n const text = m[2].replace(ANSI_SGR, \"\").trim();\n if (text) chunks.push(m[1] === \"stderr\" ? `[stderr]\n${text}` : text);\n rest = rest.slice(m[0].length).trimStart();\n }\n if (chunks.length === 0 && !LOCAL_OUTPUT_TAG.test(trimmed)) return null;\n return chunks.join(\"\\n\");\n}\nfunction parseAskQuestions(input) {\n const raw = input.questions;\n if (!Array.isArray(raw)) return [];\n const questions = [];\n for (const entry of raw) {\n const q = asRecord(entry);\n if (!q) continue;\n const options = Array.isArray(q.options) ? q.options.map((o) => asRecord(o)).filter((o) => o !== null).map((o) => ({\n label: readString(o.label) ?? \"\",\n ...readString(o.description) ? { description: readString(o.description) } : {}\n })).filter((o) => o.label.length > 0) : [];\n questions.push({\n header: readString(q.header) ?? \"\",\n question: readString(q.question) ?? \"\",\n multiSelect: q.multiSelect === true,\n options\n });\n }\n return questions;\n}\nconst PATCH_LINE_LIMIT = 400;\nfunction extractPatch(sidecar) {\n const sc = asRecord(sidecar);\n const raw = sc?.structuredPatch;\n if (!Array.isArray(raw) || raw.length === 0) return void 0;\n const hunks = [];\n let total = 0;\n for (const entry of raw) {\n const hunk = asRecord(entry);\n if (!hunk || !Array.isArray(hunk.lines)) continue;\n const lines = hunk.lines.filter((line) => typeof line === \"string\");\n if (lines.length === 0) continue;\n const kept = lines.slice(0, Math.max(0, PATCH_LINE_LIMIT - total));\n if (kept.length < lines.length) kept.push(`… ${lines.length - kept.length} more lines`);\n total += kept.length;\n hunks.push({\n header: `@@ -${hunk.oldStart ?? \"?\"},${hunk.oldLines ?? \"?\"} +${hunk.newStart ?? \"?\"},${hunk.newLines ?? \"?\"} @@`,\n lines: kept\n });\n if (total >= PATCH_LINE_LIMIT) break;\n }\n if (hunks.length === 0) return void 0;\n return { file: readString(sc?.filePath) ?? \"\", hunks };\n}\nconst INPUT_CHAR_LIMIT = 4e3;\nconst RESULT_CHAR_LIMIT = 8e3;\nconst TEXT_CHAR_LIMIT = 64e3;\nfunction truncate$1(text, limit) {\n if (text.length <= limit) return text;\n return `${text.slice(0, limit)}\n… [truncated, ${text.length - limit} more chars]`;\n}\nfunction parseTimestamp(value) {\n const ts = typeof value === \"string\" ? Date.parse(value) : NaN;\n return Number.isFinite(ts) ? ts : Date.now();\n}\nfunction summarizeToolUse(rawName, input) {\n const name = rawName.replace(/^mcp__[^_]+__/, \"\");\n const key = readString(input.command) ?? readString(input.file_path) ?? readString(input.pattern) ?? readString(input.url) ?? readString(input.query) ?? readString(input.description) ?? readString(input.prompt) ?? readString(input.skill);\n if (!key) return name;\n const flat = key.replace(/\\s+/g, \" \").trim();\n return `${name}: ${flat.length > 120 ? `${flat.slice(0, 117)}...` : flat}`;\n}\nfunction toolResultText(sidecar, blockContent) {\n const sc = asRecord(sidecar);\n if (sc) {\n const stdout = readString(sc.stdout);\n const stderr = readString(sc.stderr);\n if (stdout !== null || stderr !== null) {\n return [stdout, stderr && stderr.length > 0 ? `[stderr]\n${stderr}` : null].filter((part) => part !== null && part.length > 0).join(\"\\n\");\n }\n }\n if (typeof blockContent === \"string\") return blockContent;\n if (Array.isArray(blockContent)) {\n const parts = blockContent.map((part) => {\n const rec = asRecord(part);\n if (rec?.type === \"image\") return readString(sc?.file) ?? \"[image]\";\n return readString(rec?.text) ?? \"\";\n }).filter((text) => text.length > 0);\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (sc) {\n try {\n return JSON.stringify(sc, null, 2);\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\nclass TranscriptBuilder {\n /**\n * @param sidechain true when reading a subagent's own file, where every line\n * is marked `isSidechain` — the main transcript skips those, since subagent\n * work lives in its own file.\n * @param isDictated tells a prompt injected by voice from a typed one. The\n * JSONL carries no origin for this, so the caller re-derives it (by text and\n * time, see dictation-marks) and the builder stamps `dictated` at parse\n * time, where the flag survives re-upserts of the same entry.\n */\n constructor(sidechain = false, isDictated2) {\n this.sidechain = sidechain;\n this.isDictated = isDictated2;\n }\n sidechain;\n isDictated;\n entries = [];\n /**\n * Subagents the harness has reported as finished. Background agents give no\n * other completion signal — their launching tool call returns immediately —\n * so this notification is the authoritative end, keyed by agent id.\n */\n finishedAgents = /* @__PURE__ */ new Set();\n /**\n * Context-window usage of the most recent API response, or null before the\n * first one. Compaction needs no special handling: the response that\n * follows it reports the smaller context on its own.\n */\n context = null;\n /** The model that wrote the latest assistant line, as the API names it. */\n model = null;\n /** The compaction logged last, whose summary is the next user line. */\n lastCompactId = null;\n indexById = /* @__PURE__ */ new Map();\n /** The slash command logged last, which a local command's output belongs to. */\n lastCommandId = null;\n /** Queued prompts awaiting a possible re-delivery as a real user line. */\n pendingQueued = [];\n dictatedFlag(text, ts) {\n return this.isDictated?.(text, ts) ? { dictated: true } : void 0;\n }\n /** Position of an entry in `entries`, or undefined if it is not one. */\n indexOf(id) {\n return this.indexById.get(id);\n }\n feed(line) {\n const trimmed = line.trim();\n if (trimmed.length === 0) return [];\n let record;\n try {\n record = asRecord(JSON.parse(trimmed));\n } catch {\n return [];\n }\n if (!record) return [];\n if (record.isSidechain === true !== this.sidechain) return [];\n switch (record.type) {\n case \"user\":\n return this.feedUser(record);\n case \"assistant\":\n return this.feedAssistant(record);\n case \"attachment\":\n return this.feedAttachment(record);\n case \"system\":\n return this.feedSystem(record);\n default:\n return [];\n }\n }\n /**\n * The most recent user turn, when it is plain text reading exactly `text`\n * and nothing has been said since but the harness's own bookkeeping — the\n * compaction a `/compact` triggers, for one.\n */\n recentPlainUserLine(text) {\n for (let i = this.entries.length - 1, seen = 0; i >= 0 && seen < 4; i--, seen++) {\n const entry = this.entries[i];\n if (entry.kind === \"compact\") continue;\n if (entry.kind !== \"user\") return null;\n return !entry.command && entry.text === text ? entry : null;\n }\n return null;\n }\n /**\n * A system line. The only one with a place in the transcript is the\n * compaction boundary: the reader needs to know where the conversation was\n * folded, or the summary that follows reads as a prompt they never typed.\n */\n feedSystem(record) {\n if (record.subtype !== \"compact_boundary\") return [];\n const uuid = readString(record.uuid) ?? `compact-${this.entries.length}`;\n const meta = asRecord(record.compactMetadata);\n const pre = typeof meta?.preTokens === \"number\" ? meta.preTokens : void 0;\n const post = typeof meta?.postTokens === \"number\" ? meta.postTokens : void 0;\n this.lastCompactId = uuid;\n return [\n this.upsert({\n kind: \"compact\",\n id: uuid,\n ts: parseTimestamp(record.timestamp),\n trigger: readString(meta?.trigger) ?? \"auto\",\n ...pre !== void 0 ? { preTokens: pre } : {},\n ...post !== void 0 ? { postTokens: post } : {}\n })\n ];\n }\n feedAttachment(record) {\n const attachment = asRecord(record.attachment);\n if (!attachment || attachment.type !== \"queued_command\") return [];\n if (asRecord(attachment.origin)?.kind !== \"human\") return [];\n const prompt = readString(attachment.prompt);\n if (!prompt || prompt.trim().length === 0) return [];\n const uuid = readString(record.uuid) ?? `queued-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp ?? attachment.timestamp);\n this.pendingQueued.push({ text: prompt.trim(), id: uuid });\n return [\n this.upsert({\n kind: \"queued\",\n id: uuid,\n ts,\n text: truncate$1(prompt, TEXT_CHAR_LIMIT),\n ...this.dictatedFlag(prompt, ts)\n })\n ];\n }\n /** Record a finished subagent from a harness task-notification. */\n noteAgentFinished(text) {\n const agentId = text.match(/<task-id>([^<]+)<\\/task-id>/)?.[1];\n const status = text.match(/<status>([^<]+)<\\/status>/)?.[1];\n if (agentId && status && status !== \"running\") this.finishedAgents.add(agentId);\n }\n /** Hide queued entries that a real user line re-delivers. The delivered\n * text may embed the queued prompt (harness wrapping), so match on exact\n * equality or prefix, not just identity. */\n deliverQueued(text) {\n const delivered = text.trim();\n const changed = [];\n this.pendingQueued = this.pendingQueued.filter((pending) => {\n if (delivered !== pending.text && !delivered.startsWith(pending.text)) return true;\n const entry = this.getEntry(pending.id);\n if (entry && entry.kind === \"queued\") {\n changed.push(this.upsert({ ...entry, delivered: true }));\n }\n return false;\n });\n return changed;\n }\n upsert(entry) {\n const existing = this.indexById.get(entry.id);\n if (existing !== void 0) {\n this.entries[existing] = entry;\n } else {\n this.indexById.set(entry.id, this.entries.length);\n this.entries.push(entry);\n }\n return entry.id;\n }\n getEntry(id) {\n const index = this.indexById.get(id);\n return index === void 0 ? void 0 : this.entries[index];\n }\n feedUser(record) {\n const message = asRecord(record.message);\n if (!message) return [];\n const uuid = readString(record.uuid) ?? `user-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp);\n const content = message.content;\n const origin = asRecord(record.origin);\n if (origin?.kind === \"peer\") {\n const body = readString(origin.body) ?? (typeof content === \"string\" ? content : null);\n if (!body || body.trim().length === 0) return [];\n const from = readString(origin.name) ?? void 0;\n return [\n this.upsert({\n kind: \"peer\",\n id: uuid,\n ts,\n text: truncate$1(body, TEXT_CHAR_LIMIT),\n ...from ? { from } : {}\n })\n ];\n }\n if (record.isCompactSummary === true && typeof content === \"string\") {\n const owner = this.lastCompactId ? this.getEntry(this.lastCompactId) : void 0;\n if (owner?.kind === \"compact\") {\n return [this.upsert({ ...owner, summary: truncate$1(content, TEXT_CHAR_LIMIT) })];\n }\n return [];\n }\n if (record.isMeta === true) return [];\n if (typeof content === \"string\") {\n if (content.trim().length === 0) return [];\n const originKind = asRecord(record.origin)?.kind;\n if (originKind === \"task-notification\") {\n this.noteAgentFinished(content);\n return [];\n }\n if (originKind !== void 0 && originKind !== \"human\") return [];\n if (originKind === void 0 && /^<(task-notification|system-reminder)/.test(content.trim()))\n return [];\n if (LOCAL_CAVEAT.test(content.trimStart())) return [];\n const output = parseLocalOutput(content);\n if (output !== null) {\n if (output.length === 0) return [];\n const owner = this.lastCommandId ? this.getEntry(this.lastCommandId) : void 0;\n if (owner?.kind === \"user\" && owner.command) {\n return [\n this.upsert({\n ...owner,\n command: { ...owner.command, output: truncate$1(output, TEXT_CHAR_LIMIT) }\n })\n ];\n }\n return [this.upsert({ kind: \"user\", id: uuid, ts, text: truncate$1(output, TEXT_CHAR_LIMIT) })];\n }\n const command = parseSlashCommand(content);\n if (command) {\n const spelled = `${command.name}${command.args ? ` ${command.args}` : \"\"}`;\n const typed = this.recentPlainUserLine(spelled);\n if (typed) {\n this.lastCommandId = typed.id;\n return [this.upsert({ ...typed, command })];\n }\n }\n this.lastCommandId = command ? uuid : null;\n const text = command ? `${command.name}${command.args ? ` ${command.args}` : \"\"}` : content;\n return [\n ...this.deliverQueued(content),\n this.upsert({\n kind: \"user\",\n id: uuid,\n ts,\n text: truncate$1(text, TEXT_CHAR_LIMIT),\n ...command ? { command } : {},\n ...this.dictatedFlag(text, ts)\n })\n ];\n }\n if (!Array.isArray(content)) return [];\n const changed = [];\n const promptTexts = [];\n for (const block of content) {\n const rec = asRecord(block);\n if (!rec) continue;\n if (rec.type === \"tool_result\") {\n const toolUseId = readString(rec.tool_use_id);\n const entry = toolUseId ? this.getEntry(toolUseId) : void 0;\n if (!entry) continue;\n if (entry.kind === \"ask\") {\n const sidecar = asRecord(record.toolUseResult);\n const answersRaw = asRecord(sidecar?.answers);\n if (answersRaw) {\n const answers = {};\n for (const [q, a] of Object.entries(answersRaw)) {\n if (typeof a === \"string\") answers[q] = a;\n }\n changed.push(this.upsert({ ...entry, answers }));\n } else {\n changed.push(this.upsert({ ...entry, rejected: true }));\n }\n continue;\n }\n if (entry.kind !== \"tool\") continue;\n const patch = extractPatch(record.toolUseResult);\n const output = patch && rec.is_error !== true ? \"\" : toolResultText(record.toolUseResult, rec.content);\n changed.push(\n this.upsert({\n ...entry,\n result: { ok: rec.is_error !== true, output: truncate$1(output, RESULT_CHAR_LIMIT) },\n ...patch ? { patch } : {}\n })\n );\n } else if (rec.type === \"text\") {\n const text = readString(rec.text);\n if (text && text.trim().length > 0) promptTexts.push(text);\n }\n }\n if (promptTexts.length > 0) {\n changed.push(\n this.upsert({\n kind: \"user\",\n id: uuid,\n ts,\n text: truncate$1(promptTexts.join(\"\\n\\n\"), TEXT_CHAR_LIMIT),\n ...this.dictatedFlag(promptTexts.join(\"\\n\\n\"), ts)\n })\n );\n }\n return changed;\n }\n feedAssistant(record) {\n const message = asRecord(record.message);\n if (message) this.context = readContextUsage(message) ?? this.context;\n if (message) this.model = readString(message.model) ?? this.model;\n const content = message?.content;\n if (!Array.isArray(content)) return [];\n const uuid = readString(record.uuid) ?? `assistant-${this.entries.length}`;\n const ts = parseTimestamp(record.timestamp);\n const changed = [];\n for (let i = 0; i < content.length; i++) {\n const block = asRecord(content[i]);\n if (!block) continue;\n const blockId = `${uuid}:${i}`;\n switch (block.type) {\n case \"text\": {\n const text = readString(block.text);\n if (text && text.trim().length > 0) {\n changed.push(\n this.upsert({ kind: \"text\", id: blockId, ts, text: truncate$1(text, TEXT_CHAR_LIMIT) })\n );\n }\n break;\n }\n case \"thinking\": {\n const text = readString(block.thinking);\n if (text && text.trim().length > 0) {\n changed.push(\n this.upsert({\n kind: \"thinking\",\n id: blockId,\n ts,\n text: truncate$1(text, TEXT_CHAR_LIMIT)\n })\n );\n }\n break;\n }\n case \"tool_use\": {\n const toolUseId = readString(block.id) ?? blockId;\n const name = readString(block.name) ?? \"tool\";\n const input = asRecord(block.input) ?? {};\n if (name === \"AskUserQuestion\") {\n const questions = parseAskQuestions(input);\n if (questions.length > 0) {\n changed.push(this.upsert({ kind: \"ask\", id: toolUseId, ts, questions }));\n break;\n }\n }\n let inputText;\n try {\n inputText = JSON.stringify(input, null, 2);\n } catch {\n inputText = \"{}\";\n }\n changed.push(\n this.upsert({\n kind: \"tool\",\n id: toolUseId,\n ts,\n name,\n summary: summarizeToolUse(name, input),\n input: truncate$1(inputText, INPUT_CHAR_LIMIT)\n })\n );\n break;\n }\n }\n }\n return changed;\n }\n}\nconst SUBAGENT_ACTIVITY_LIMIT = 120;\nconst SUBAGENT_LIVE_WINDOW_MS = 45e3;\nfunction subagentPayload(agentId, state, finished) {\n const activity = [];\n let report = null;\n for (const entry of state.builder.entries) {\n if (entry.kind === \"tool\") {\n activity.push({\n id: entry.id,\n name: entry.name,\n summary: entry.summary,\n ok: entry.result ? entry.result.ok : null\n });\n } else if (entry.kind === \"text\") {\n report = entry.text;\n }\n }\n const mtime = state.tailer.mtimeMs();\n const running = !finished && mtime !== null && Date.now() - mtime < SUBAGENT_LIVE_WINDOW_MS;\n const trimmed = Math.max(0, activity.length - SUBAGENT_ACTIVITY_LIMIT);\n return {\n agentId,\n toolUseId: state.meta.toolUseId ?? null,\n agentType: state.meta.agentType ?? null,\n description: state.meta.description ?? null,\n model: state.meta.model ?? null,\n // Keep the newest calls — the tail is what \"what is it doing\" needs.\n activity: activity.slice(-SUBAGENT_ACTIVITY_LIMIT),\n trimmed,\n report,\n running\n };\n}\nfunction transcriptPathFor$1(cwd, sessionId) {\n return join(projectDirFor(cwd), `${sessionId}.jsonl`);\n}\nfunction projectsRoot() {\n return join(homedir(), \".claude\", \"projects\");\n}\nfunction projectDirFor(cwd) {\n return join(projectsRoot(), cwd.replace(/\\//g, \"-\"));\n}\nfunction resolveTranscriptPath(session, sessionId) {\n const recorded = session.transcript_path;\n if (recorded && existsSync(recorded)) return recorded;\n const derived = transcriptPathFor$1(session.cwd, sessionId);\n if (existsSync(derived)) return derived;\n return findTranscriptById(sessionId);\n}\nfunction findTranscriptById(sessionId) {\n const root = projectsRoot();\n let dirs;\n try {\n dirs = readdirSync(root);\n } catch {\n return null;\n }\n for (const dir of dirs) {\n const candidate = join(root, dir, `${sessionId}.jsonl`);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\nfunction listSubagents(transcriptPath, known) {\n const dir = join(dirname(transcriptPath), basename(transcriptPath, \".jsonl\"), \"subagents\");\n let names;\n try {\n names = readdirSync(dir);\n } catch {\n return [];\n }\n const files2 = [];\n for (const name of names) {\n const agentId = name.match(/^agent-(.+)\\.jsonl$/)?.[1];\n if (!agentId) continue;\n if (known?.has(agentId)) continue;\n let meta = {};\n try {\n const parsed = JSON.parse(\n readFileSync(join(dir, `agent-${agentId}.meta.json`), \"utf8\")\n );\n if (parsed && typeof parsed === \"object\") meta = parsed;\n } catch {\n }\n files2.push({ agentId, path: join(dir, name), meta });\n }\n return files2;\n}\nclass JsonlTailer {\n constructor(path) {\n this.path = path;\n }\n path;\n offset = 0;\n partial = Buffer.alloc(0);\n lastMtimeMs = null;\n /** Last write seen by the most recent read(), or null before the first one. */\n mtimeMs() {\n return this.lastMtimeMs;\n }\n read() {\n let fd;\n try {\n fd = openSync(this.path, \"r\");\n } catch {\n return { status: \"missing\" };\n }\n try {\n const stat = fstatSync(fd);\n this.lastMtimeMs = stat.mtimeMs;\n const size = stat.size;\n if (size < this.offset) {\n this.offset = 0;\n this.partial = Buffer.alloc(0);\n return { status: \"reset\" };\n }\n if (size === this.offset) return { status: \"unchanged\" };\n const chunk = Buffer.alloc(size - this.offset);\n let read = 0;\n while (read < chunk.length) {\n const n = readSync(fd, chunk, read, chunk.length - read, this.offset + read);\n if (n <= 0) break;\n read += n;\n }\n this.offset += read;\n const buffer = Buffer.concat([this.partial, chunk.subarray(0, read)]);\n const lines = [];\n let start = 0;\n for (let i = 0; i < buffer.length; i++) {\n if (buffer[i] === 10) {\n lines.push(buffer.subarray(start, i).toString(\"utf8\"));\n start = i + 1;\n }\n }\n this.partial = buffer.subarray(start);\n return lines.length > 0 ? { status: \"lines\", lines } : { status: \"unchanged\" };\n } catch {\n return { status: \"missing\" };\n } finally {\n closeSync(fd);\n }\n }\n}\nconst execFileAsync = promisify(execFile);\nfunction hardTimeout(p, ms, fallback) {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(fallback), ms);\n p.then(\n (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n () => {\n clearTimeout(timer);\n resolve(fallback);\n }\n );\n });\n}\nasync function getAllPaneTitles() {\n const result = /* @__PURE__ */ new Map();\n const stdout = await hardTimeout(\n execFileAsync(\"tmux\", [\n \"list-panes\",\n \"-a\",\n \"-F\",\n \"#{session_name}:#{window_index}.#{pane_index}\t#{session_attached}\t#{pane_width}\t#{pane_title}\"\n ], { encoding: \"utf-8\", timeout: 2e3 }).then((r) => r.stdout),\n 2500,\n \"\"\n );\n for (const line of stdout.trim().split(\"\\n\")) {\n if (!line) continue;\n const [target, attached, width, ...rest] = line.split(\"\t\");\n if (!target || rest.length === 0) continue;\n const title = rest.join(\"\t\").trim();\n result.set(target, {\n title: title || null,\n attached: Number(attached) || 0,\n width: Number(width) || 0\n });\n }\n return result;\n}\nasync function sendKeyAsync(target, key) {\n try {\n await execFileAsync(\"tmux\", [\"send-keys\", \"-t\", target, key], { timeout: 1e3 });\n return true;\n } catch {\n return false;\n }\n}\nasync function capturePaneContentAsync(target, withColor = false) {\n const args = withColor ? [\"capture-pane\", \"-p\", \"-e\", \"-t\", target] : [\"capture-pane\", \"-p\", \"-t\", target];\n return hardTimeout(\n execFileAsync(\"tmux\", args, {\n encoding: \"utf-8\",\n timeout: 1e3\n }).then((r) => r.stdout),\n 1500,\n null\n );\n}\nfunction isPaneShowingSpinner(content) {\n if (!content) return false;\n const bottomLines = content.split(\"\\n\").slice(-5).join(\"\");\n return /[\\u2800-\\u28FF]/.test(bottomLines);\n}\nfunction isPaneShowingIdlePrompt(content) {\n if (!content) return false;\n const bottom = content.split(\"\\n\").slice(-12);\n const joined = bottom.join(\"\\n\");\n if (/[⠀-⣿]/.test(joined)) return false;\n if (/esc to interrupt|esc to cancel|ctrl\\+c to interrupt/i.test(joined)) return false;\n if (bottom.some((line) => /^\\s*[^\\w\\s❯│>]\\s+\\S+…/.test(line))) return false;\n if (/Do you want|❯\\s+\\d+\\./.test(joined)) return false;\n return bottom.some((line) => /^❯/.test(line.trim()));\n}\nconst MAX_PROMPT_INPUT_CHARS = 2e3;\nconst PROMPT_HINTS = [/^Press \\w+ to /i, /^Try \"/i, /^\\?\\s/];\nfunction stripAnsi(text) {\n return text.replace(/\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g, \"\").replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, \"\");\n}\nfunction scanCells(line) {\n const cells = [];\n let faint = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === \"\\x1B\" && line[i + 1] === \"]\") {\n const bel = line.indexOf(\"\\x07\", i);\n const st = line.indexOf(\"\\x1B\\\\\", i + 2);\n const end = bel === -1 ? st : st === -1 ? bel : Math.min(bel, st);\n if (end === -1) break;\n i = end + (end === st ? 1 : 0);\n continue;\n }\n if (ch === \"\\x1B\" && line[i + 1] === \"[\") {\n const end = line.indexOf(\"m\", i);\n if (end === -1) break;\n for (const param of line.slice(i + 2, end).split(\";\")) {\n const code = Number(param || \"0\");\n if (code === 2) faint = true;\n else if (code === 0 || code === 22) faint = false;\n }\n i = end;\n continue;\n }\n cells.push({ ch, faint });\n }\n return cells;\n}\nfunction findPromptBox(lines) {\n let bottomSepIdx = -1;\n for (let i = lines.length - 1; i >= 0; i--) {\n if (lines[i].startsWith(\"─────\")) {\n bottomSepIdx = i;\n break;\n }\n }\n if (bottomSepIdx === -1) return null;\n let topSepIdx = -1;\n for (let i = bottomSepIdx - 1; i >= 0; i--) {\n if (lines[i].startsWith(\"─────\")) {\n topSepIdx = i;\n break;\n }\n }\n if (topSepIdx === -1) return null;\n return { topSepIdx, bottomSepIdx };\n}\nfunction readPromptBox(content) {\n if (!content) return null;\n const lines = content.split(\"\\n\");\n const clean = lines.map(stripAnsi);\n const box = findPromptBox(clean);\n if (!box) return null;\n const region = lines.slice(box.topSepIdx + 1, box.bottomSepIdx);\n const cleanRegion = clean.slice(box.topSepIdx + 1, box.bottomSepIdx);\n if (region.length === 0) return null;\n if (cleanRegion.some((line) => /^\\s*❯?\\s*\\d+\\.\\s/.test(line))) return null;\n if (!/^\\s*[❯>]/.test(cleanRegion[0])) return null;\n const cells = [];\n region.forEach((line, i) => {\n const lineCells = scanCells(line);\n if (i === 0) {\n let start = 0;\n while (start < lineCells.length && /\\s/.test(lineCells[start].ch)) start++;\n if (start < lineCells.length && /[❯>]/.test(lineCells[start].ch)) start++;\n if (start < lineCells.length && /[ \\u00a0]/.test(lineCells[start].ch)) start++;\n cells.push(...lineCells.slice(start));\n } else {\n cells.push({ ch: \"\\n\", faint: false });\n cells.push(...lineCells.slice(lineCells.length >= 2 ? 2 : 0));\n }\n });\n const render = (kept) => kept.map((c) => c.ch === \" \" ? \" \" : c.ch).join(\"\").split(\"\\n\").map((line) => line.trimEnd()).join(\"\\n\").trim();\n const typed = render(cells.filter((c) => !c.faint));\n if (typed) return { kind: \"typed\", text: truncate(typed) };\n const ghost = render(cells);\n if (!ghost) return null;\n if (PROMPT_HINTS.some((hint) => hint.test(ghost))) return null;\n return { kind: \"suggestion\", text: truncate(ghost) };\n}\nfunction truncate(text) {\n return text.length > MAX_PROMPT_INPUT_CHARS ? text.slice(0, MAX_PROMPT_INPUT_CHARS) + \"…\" : text;\n}\nconst MAX_QUEUED_CHARS = 300;\nconst MAX_QUEUED_MESSAGES = 10;\nconst QUEUED_ROW_BG = \"48;5;237\";\nfunction readQueuedMessages(content) {\n if (!content) return [];\n const lines = content.split(\"\\n\");\n const clean = lines.map(stripAnsi);\n const box = findPromptBox(clean);\n if (!box) return [];\n const rows = [];\n for (let i = box.topSepIdx - 1; i >= 0; i--) {\n if (!lines[i].includes(QUEUED_ROW_BG)) break;\n const starts = /^ {2}[❯>] /.test(clean[i]);\n if (!starts && !/^ {2,}\\S/.test(clean[i])) break;\n rows.push({ text: clean[i].replace(/^ {2}[❯>] /, \"\").replace(/^ +/, \"\").trimEnd(), starts });\n if (rows.length > MAX_QUEUED_MESSAGES * 4) break;\n }\n rows.reverse();\n const messages = [];\n for (const row of rows) {\n if (row.starts || messages.length === 0) messages.push(row.text);\n else messages[messages.length - 1] += \" \" + row.text;\n }\n return messages.map((m) => m.trim()).filter(Boolean).slice(0, MAX_QUEUED_MESSAGES).map((m) => m.length > MAX_QUEUED_CHARS ? m.slice(0, MAX_QUEUED_CHARS) + \"…\" : m);\n}\nfunction detectRecentInterruption(content) {\n if (!content) return null;\n const lines = content.split(\"\\n\");\n const bottomLines = lines.slice(-5).join(\"\\n\");\n if (bottomLines.includes(\"Esc to cancel\") || bottomLines.includes(\"Esc to interrupt\") || bottomLines.includes(\"ctrl+c to interrupt\")) {\n return null;\n }\n const box = findPromptBox(lines);\n if (!box) return null;\n const { topSepIdx } = box;\n let interactionStartIdx = -1;\n const maxScan = Math.max(0, topSepIdx - 15);\n for (let i = topSepIdx - 1; i >= maxScan; i--) {\n const line = lines[i];\n if (line.startsWith(\"●\") || line.startsWith(\"❯\")) {\n interactionStartIdx = i;\n break;\n }\n }\n if (interactionStartIdx === -1) return null;\n const slice = lines.slice(interactionStartIdx, topSepIdx).join(\"\\n\");\n if (slice.includes(\"Interrupted\")) return \"interrupted\";\n if (slice.includes(\"User declined to answer\")) return \"declined\";\n return null;\n}\nfunction detectRemoteControlUrl(content) {\n if (!content) return null;\n const clean = stripAnsi(content);\n const match = clean.match(/https:\\/\\/claude\\.ai\\/code[^\\s)\\]>]*/);\n return match ? match[0].replace(/[.,;:]+$/, \"\") : null;\n}\nconst MAX_PROMPT_OPTIONS = 10;\nconst MAX_OPTION_CHARS = 120;\nconst OPTION_RUN_WINDOW = 24;\nconst OPTION_RUN_TAIL = 3;\nconst OPTION_ROW = /^(❯|>)?\\s*(\\d+)[.)]\\s+(\\S.*)$/;\nconst OPTION_RULE = /^[─━╌┄┈—–-]+$/;\nconst DIALOG_HINT = /↑\\/↓|Enter to (?:select|confirm)|Esc to cancel/;\nconst TYPING_HINT = /ctrl\\+g to edit/i;\nconst NOTES_LINE = /^Notes:/;\nconst NOTES_CLOSED = /press n to add notes/i;\nconst TAB_STRIP = /^(?:←\\s+)?[☐☒☑✔✓]\\s/;\nconst INLINE_HINT = /^(.*?\\S)\\s{2,}(\\S.*)$/;\nconst PREVIEW_COLUMN = /\\s{2,}[┌┐└┘├┤─━│╭╮╰╯].*$/;\nconst BOX_ROW = /^[┌┐└┘├┤─━│╭╮╰╯]/;\nconst CHECKBOX = /^\\[([ xX✔✓])\\]\\s*/;\nconst HINT_INDENT_SPAN = 8;\nfunction bodyOf(line) {\n const body = (line ?? \"\").replace(/[\\s│┃|╎┆┊]+$/, \"\").replace(/^\\s*[│┃|╎┆┊]+/, \"\");\n const text = body.trimStart();\n return { indent: body.length - text.length, text };\n}\nfunction clampOption(text) {\n return text.length > MAX_OPTION_CHARS ? text.slice(0, MAX_OPTION_CHARS) + \"…\" : text;\n}\nfunction readPromptOptions(content, mode = {}) {\n if (!content) return null;\n const raw = content.split(\"\\n\");\n const seen = /* @__PURE__ */ new Map();\n const at = (i) => {\n let line = seen.get(i);\n if (line === void 0) {\n line = bodyOf(raw[i]);\n seen.set(i, line);\n }\n return line;\n };\n let lastContent = -1;\n for (let i = raw.length - 1; i >= 0; i--) {\n if (at(i).text.length > 0) {\n lastContent = i;\n break;\n }\n }\n if (lastContent === -1) return null;\n const hintLine = at(lastContent).text;\n const declared = DIALOG_HINT.test(hintLine);\n if (mode.declaredOnly && !declared) return null;\n const reach = declared ? OPTION_RUN_WINDOW : OPTION_RUN_TAIL;\n let end = -1;\n for (let i = lastContent; i >= Math.max(0, lastContent - reach); i--) {\n if (OPTION_ROW.test(at(i).text)) {\n end = i;\n break;\n }\n }\n if (end === -1) return null;\n const floor = Math.max(0, lastContent - OPTION_RUN_WINDOW);\n const rows = [];\n let expected = -1;\n for (let i = end; i >= floor; i--) {\n const { indent, text } = at(i);\n const m = text.match(OPTION_ROW);\n if (m) {\n const n = Number(m[2]);\n if (expected !== -1 && n !== expected) break;\n rows.push({ i, n, label: m[3], selected: m[1] === \"❯\", indent: m[1] ? indent + 2 : indent });\n expected = n - 1;\n if (n === 1) break;\n continue;\n }\n if (declared) continue;\n if (text.length === 0 || OPTION_RULE.test(text)) continue;\n const below = rows[rows.length - 1];\n if (below && indent > below.indent) continue;\n break;\n }\n rows.reverse();\n if (rows.length < 2 || rows.length > MAX_PROMPT_OPTIONS) return null;\n if (rows[0].n !== 1) return null;\n let multi = false;\n const notes = [];\n const options = rows.map((row, k) => {\n const preview = PREVIEW_COLUMN.test(row.label);\n let label = row.label.replace(PREVIEW_COLUMN, \"\").trimEnd();\n const box = label.match(CHECKBOX);\n if (box) {\n multi = true;\n label = label.slice(box[0].length);\n }\n const last = k + 1 === rows.length;\n const stop = last ? declared ? lastContent : lastContent + 1 : rows[k + 1].i;\n const noting = last && declared;\n let hint;\n let ruled = false;\n for (let i = row.i + 1; i < stop; i++) {\n const { indent, text } = at(i);\n if (OPTION_RULE.test(text)) {\n if (!noting) break;\n ruled = true;\n continue;\n }\n if (!text || BOX_ROW.test(text)) continue;\n const bare = text.replace(PREVIEW_COLUMN, \"\").trimEnd();\n if (!bare) continue;\n const under = !ruled && indent >= row.indent && indent <= row.indent + HINT_INDENT_SPAN;\n if (!under || hint !== void 0) {\n if (noting && !ruled) notes.push(clampOption(bare));\n continue;\n }\n if (preview) {\n label = `${label} ${bare}`;\n continue;\n }\n hint = clampOption(bare);\n }\n if (hint === void 0 && !preview) {\n const inline = label.match(INLINE_HINT);\n if (inline) {\n label = inline[1];\n hint = clampOption(inline[2]);\n }\n }\n return {\n n: row.n,\n label: clampOption(label),\n hint,\n checked: box ? box[1] !== \" \" : void 0,\n selected: row.selected\n };\n });\n let question = null;\n let top = null;\n for (let i = rows[0].i - 1; i >= 0 && i >= rows[0].i - 4; i--) {\n const { text } = at(i);\n if (/^[─━╌┄┈╭╮╰╯]+$/.test(text) || TAB_STRIP.test(text)) break;\n if (!text) {\n if (top !== null) break;\n continue;\n }\n top = text;\n if (text.endsWith(\"?\")) {\n question = clampOption(text);\n break;\n }\n }\n if (question === null && top !== null) question = clampOption(top);\n const choice = { question, options };\n if (multi) choice.multi = true;\n if (declared) {\n choice.keys = clampOption(hintLine);\n if (TYPING_HINT.test(hintLine)) {\n choice.typing = true;\n if (notes.some((note) => NOTES_LINE.test(note) && !NOTES_CLOSED.test(note))) {\n choice.noting = true;\n }\n }\n if (notes.length > 0) choice.notes = notes;\n }\n return choice;\n}\nconst TAIL_BYTES = 64 * 1024;\nconst RESOLVE_RETRY_POLLS = 20;\nconst paths = /* @__PURE__ */ new Map();\nconst files = /* @__PURE__ */ new Map();\nfunction transcriptPathFor(session) {\n const memo = paths.get(session.id);\n if (memo && (memo.path !== null || memo.age < RESOLVE_RETRY_POLLS)) {\n if (memo.path === null) memo.age++;\n return memo.path;\n }\n const path = resolveTranscriptPath(session, session.id);\n paths.set(session.id, { path, age: 0 });\n return path;\n}\nfunction readLastUsage(path, size) {\n const length = Math.min(size, TAIL_BYTES);\n if (length === 0) return null;\n const buffer = Buffer.alloc(length);\n const fd = openSync(path, \"r\");\n try {\n readSync(fd, buffer, 0, length, size - length);\n } finally {\n closeSync(fd);\n }\n const lines = buffer.toString(\"utf-8\").split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (!line.includes('\"assistant\"')) continue;\n try {\n const record = asRecord(JSON.parse(line));\n if (record?.type !== \"assistant\") continue;\n const message = asRecord(record.message);\n const usage = message ? readContextUsage(message) : null;\n if (usage) return usage;\n } catch {\n }\n }\n return null;\n}\nfunction peekContextUsage(session) {\n const path = transcriptPathFor(session);\n if (!path) return null;\n let stat;\n try {\n stat = statSync(path);\n } catch {\n files.delete(path);\n paths.delete(session.id);\n return null;\n }\n const memo = files.get(path);\n if (memo && memo.mtimeMs === stat.mtimeMs && memo.size === stat.size) return memo.usage;\n const usage = readLastUsage(path, stat.size) ?? memo?.usage ?? null;\n files.set(path, { mtimeMs: stat.mtimeMs, size: stat.size, usage });\n return usage;\n}\nfunction peekContextPercent(session) {\n const usage = peekContextUsage(session);\n return usage ? contextPercent(usage) : null;\n}\nfunction resizeTmuxWindow(target, cols, rows) {\n try {\n const safeCols = Math.max(20, Math.min(500, Math.floor(cols)));\n const safeRows = Math.max(5, Math.min(200, Math.floor(rows)));\n const windowTarget = target.replace(/\\.\\d+$/, \"\");\n execFileSync(\n \"tmux\",\n [\"resize-window\", \"-t\", windowTarget, \"-x\", String(safeCols), \"-y\", String(safeRows)],\n {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 2e3\n }\n );\n } catch {\n }\n}\nconst HISTORY_TAIL = 64;\nconst SEP = \"@@CLAUDE_MUX_SEP@@\";\nfunction run(args) {\n return execFileSync(\"tmux\", args, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 2e3,\n maxBuffer: 16 * 1024 * 1024\n });\n}\nfunction splitLines(s) {\n if (s === \"\") return [];\n const lines = s.split(\"\\n\");\n if (lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\nfunction snapshotPane(target) {\n let out;\n try {\n out = run([\n \"display-message\",\n \"-p\",\n \"-t\",\n target,\n \"#{history_size} #{alternate_on} #{pane_width} #{pane_height}\",\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target,\n \"-S\",\n `-${HISTORY_TAIL}`,\n \"-E\",\n \"-1\",\n \";\",\n \"display-message\",\n \"-p\",\n SEP,\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target\n ]);\n } catch {\n return null;\n }\n const nl = out.indexOf(\"\\n\");\n if (nl === -1) return null;\n const header = out.slice(0, nl).trim().split(/\\s+/);\n if (header.length < 4) return null;\n const historySize = Number(header[0]) || 0;\n const alt = header[1] === \"1\";\n const cols = Number(header[2]) || 0;\n const rows = Number(header[3]) || 0;\n const body = out.slice(nl + 1);\n const sepIdx = body.indexOf(SEP + \"\\n\");\n if (sepIdx === -1) return null;\n const tailRaw = body.slice(0, sepIdx);\n const screenRaw = body.slice(sepIdx + SEP.length + 1);\n let tail = splitLines(tailRaw);\n if (historySize === 0) tail = [];\n else if (tail.length > historySize) tail = tail.slice(tail.length - historySize);\n return { historySize, alt, cols, rows, tail, screen: splitLines(screenRaw) };\n}\nfunction fetchHistoryRange(target, start, end, knownHistorySize) {\n if (end <= start) return { start, lines: [], historySize: knownHistorySize };\n let known = knownHistorySize;\n let last = null;\n for (let attempt = 0; attempt < 4; attempt++) {\n const relStart = start - known;\n const relEnd = end - 1 - known;\n if (relEnd >= 0) {\n return { start, lines: [], historySize: known };\n }\n let out;\n try {\n out = run([\n \"display-message\",\n \"-p\",\n \"-t\",\n target,\n \"#{history_size}\",\n \";\",\n \"capture-pane\",\n \"-p\",\n \"-e\",\n \"-t\",\n target,\n \"-S\",\n String(relStart),\n \"-E\",\n String(relEnd)\n ]);\n } catch {\n return null;\n }\n const nl = out.indexOf(\"\\n\");\n if (nl === -1) return null;\n const historySize = Number(out.slice(0, nl).trim()) || 0;\n const lines = splitLines(out.slice(nl + 1));\n const drift = historySize - known;\n if (drift === 0) return { start, lines, historySize };\n last = { start: Math.max(0, start + drift), lines, historySize };\n known = historySize;\n }\n return last;\n}\nclass SessionWatcher {\n subscribers = /* @__PURE__ */ new Set();\n pollTimer = null;\n lastState = /* @__PURE__ */ new Map();\n // filename -> mtime\n pollInterval = 500;\n start() {\n if (this.pollTimer) return;\n console.log(\"[watcher] Started polling\", SESSIONS_DIR, `(${this.pollInterval}ms)`);\n this.updateState();\n this.pollTimer = setInterval(() => {\n if (this.checkForChanges()) {\n this.notifySubscribers();\n }\n }, this.pollInterval);\n }\n updateState() {\n this.lastState.clear();\n try {\n const files2 = readdirSync(SESSIONS_DIR);\n for (const file of files2) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const stat = statSync(join(SESSIONS_DIR, file));\n this.lastState.set(file, stat.mtimeMs);\n } catch {\n }\n }\n } catch {\n }\n }\n checkForChanges() {\n const newState = /* @__PURE__ */ new Map();\n let changed = false;\n try {\n const files2 = readdirSync(SESSIONS_DIR);\n for (const file of files2) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const stat = statSync(join(SESSIONS_DIR, file));\n newState.set(file, stat.mtimeMs);\n const oldMtime = this.lastState.get(file);\n if (oldMtime === void 0) {\n console.log(\"[watcher] File added:\", file);\n changed = true;\n } else if (oldMtime !== stat.mtimeMs) {\n console.log(\"[watcher] File changed:\", file);\n changed = true;\n }\n } catch {\n }\n }\n for (const file of this.lastState.keys()) {\n if (!newState.has(file)) {\n console.log(\"[watcher] File removed:\", file);\n changed = true;\n }\n }\n } catch {\n }\n this.lastState = newState;\n return changed;\n }\n notifySubscribers() {\n console.log(\"[watcher] Notifying\", this.subscribers.size, \"subscribers\");\n for (const callback of this.subscribers) {\n try {\n callback();\n } catch (error) {\n console.error(\"[watcher] Subscriber error:\", error);\n }\n }\n }\n subscribe(callback) {\n this.subscribers.add(callback);\n if (this.subscribers.size === 1) {\n this.start();\n }\n return () => {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n this.stop();\n }\n };\n }\n stop() {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n this.lastState.clear();\n console.log(\"[watcher] Stopped\");\n }\n}\nconst sessionWatcher = new SessionWatcher();\nconst DEFAULT_CONFIG = {\n maxSessionsClients: 50,\n maxTerminalClientsPerTarget: 10,\n maxTerminalClientsTotal: 100,\n maxQueuedMessages: 100,\n debug: false\n};\nfunction log(entry, config) {\n if (entry.level === \"debug\" && !config.debug) return;\n const prefix = `[ws:${entry.component}]`;\n const msg = entry.data ? `${prefix} ${entry.message} ${JSON.stringify(entry.data)}` : `${prefix} ${entry.message}`;\n switch (entry.level) {\n case \"debug\":\n console.debug(msg);\n break;\n case \"info\":\n console.info(msg);\n break;\n case \"warn\":\n console.warn(msg);\n break;\n case \"error\":\n console.error(msg);\n break;\n }\n}\nconst DEFAULT_HISTORY_DEPTH = 200;\nconst MAX_HISTORY_REQUEST = 1e3;\nfunction deduplicateByTmuxTarget(sessions) {\n const byTarget = /* @__PURE__ */ new Map();\n const noTarget = [];\n for (const session of sessions) {\n if (!session.tmux_target) {\n noTarget.push(session);\n continue;\n }\n const existing = byTarget.get(session.tmux_target);\n if (!existing || session.last_update > existing.last_update) {\n byTarget.set(session.tmux_target, session);\n }\n }\n return [...byTarget.values(), ...noTarget];\n}\nconst idleLookTicks = /* @__PURE__ */ new Map();\nasync function captureAndSyncSessions() {\n const sessions = getAllSessions();\n const captures = /* @__PURE__ */ new Map();\n const rawCaptures = /* @__PURE__ */ new Map();\n const apply = (session, patch) => {\n updateSession(session.id, patch);\n Object.assign(session, patch);\n };\n await Promise.all(\n sessions.map(async (session) => {\n if (!session.tmux_target) return;\n const raw = await capturePaneContentAsync(session.tmux_target, true);\n if (!raw) return;\n const content = stripAnsi(raw);\n captures.set(session.tmux_target, content);\n rawCaptures.set(session.tmux_target, raw);\n if (session.state !== \"idle\" && detectRecentInterruption(content)) {\n apply(session, { state: \"idle\", current_action: null, prompt_text: null });\n } else if (session.state === \"busy\" && isPaneShowingIdlePrompt(content)) {\n const ticks = (idleLookTicks.get(session.id) ?? 0) + 1;\n if (ticks >= 2) {\n idleLookTicks.delete(session.id);\n apply(session, { state: \"idle\", current_action: null, prompt_text: null });\n } else {\n idleLookTicks.set(session.id, ticks);\n }\n } else {\n idleLookTicks.delete(session.id);\n }\n if (session.state === \"idle\" && isPaneShowingSpinner(content)) {\n apply(session, { state: \"busy\", current_action: \"Compacting...\" });\n }\n })\n );\n if (idleLookTicks.size > 0) {\n const live = new Set(sessions.map((s) => s.id));\n for (const id of idleLookTicks.keys()) {\n if (!live.has(id)) idleLookTicks.delete(id);\n }\n }\n return { captures, rawCaptures, sessions };\n}\nconst wideningNow = /* @__PURE__ */ new Set();\nconst rcSeen = /* @__PURE__ */ new Set();\nlet rcPrimed = false;\nasync function getEnrichedSessionsAsync() {\n const [{ captures, rawCaptures, sessions }, paneTitles] = await Promise.all([\n captureAndSyncSessions(),\n getAllPaneTitles()\n ]);\n const links = readLinks();\n for (const s of sessions) {\n const pane = s.tmux_target ? paneTitles.get(s.tmux_target) : void 0;\n if (pane && wantsWidening(pane) && !wideningNow.has(s.tmux_target)) {\n const target = s.tmux_target;\n wideningNow.add(target);\n void widenDetachedWindow(target).finally(() => wideningNow.delete(target));\n }\n }\n const auto = getSettings().autoRemoteControl;\n for (const s of sessions) {\n if (rcSeen.has(s.id)) continue;\n rcSeen.add(s.id);\n if (!rcPrimed || !auto) continue;\n if (s.rc_url || !s.tmux_target || (s.agent ?? \"claude\") !== \"claude\") continue;\n if (!isClaudeMuxSessionName(s.tmux_target.split(\":\")[0])) continue;\n enqueue(s.tmux_target, \"/rc\", \"control\");\n }\n rcPrimed = true;\n for (const s of sessions) {\n if (!s.tmux_target) continue;\n const content = captures.get(s.tmux_target);\n if (!content) continue;\n const rcUrl = detectRemoteControlUrl(content);\n if (rcUrl && rcUrl !== s.rc_url) {\n updateSession(s.id, { rc_url: rcUrl });\n s.rc_url = rcUrl;\n if (/Disconnect this session[\\s\\S]*❯\\s*Continue/.test(content)) {\n void sendKeyAsync(s.tmux_target, \"Enter\");\n }\n } else if (!rcUrl && s.rc_url) {\n updateSession(s.id, { rc_url: null });\n s.rc_url = null;\n }\n }\n const enrichedSessions = sessions.map((s) => {\n const paneTitle = s.tmux_target ? paneTitles.get(s.tmux_target)?.title ?? null : null;\n const raw = s.tmux_target ? rawCaptures.get(s.tmux_target) : void 0;\n const stripped = s.tmux_target ? captures.get(s.tmux_target) : void 0;\n const box = raw ? readPromptBox(raw) : null;\n const enriched = {\n ...s,\n pane_title: paneTitle,\n pane_alive: s.tmux_target ? paneTitles.has(s.tmux_target) : true,\n draft_input: box?.text ?? null,\n draft_kind: box?.kind ?? null,\n // Messages the user typed into the pane while it was busy, waiting\n // their turn in Claude Code's own queue.\n pane_queue: raw ? readQueuedMessages(raw) : [],\n // The dialog's own numbered rows, so the composer can offer them as\n // answers instead of making you drive arrows at a screen you can't see.\n // When the hooks report a dialog, any run at the foot is one. When\n // they don't — a local command's dialog such as `/model` leaves the\n // session idle, and the permission notification can trail the dialog\n // by a tick — only a dialog that names its own keys is believed.\n pane_choice: stripped ? readPromptOptions(stripped, {\n declaredOnly: s.state !== \"waiting\" && s.state !== \"permission\"\n }) : null,\n // One stat per session per tick; the file is only read when it grew.\n context_pct: peekContextPercent(s)\n };\n if (s.tmux_target && links[s.tmux_target]) {\n const mainTarget = links[s.tmux_target];\n const mainSession = sessions.find((m) => m.tmux_target === mainTarget);\n if (mainSession) {\n enriched.linked_to = mainSession.id;\n }\n }\n return enriched;\n });\n return deduplicateByTmuxTarget(enrichedSessions);\n}\nfunction resizePane(target, cols, rows) {\n resizeTmuxWindow(target, cols, rows);\n}\nlet cachedSystemStats = { cpu: 0, ram: 0, swap: 0, ramTotal: 0, swapTotal: 0 };\nlet prevCpuIdle = 0;\nlet prevCpuTotal = 0;\nlet systemStatsTimer = null;\nlet systemStatsRefCount = 0;\nfunction refreshSystemStats() {\n try {\n const stat = readFileSync(\"/proc/stat\", \"utf-8\");\n const meminfo = readFileSync(\"/proc/meminfo\", \"utf-8\");\n const cpuLine = stat.split(\"\\n\")[0];\n const cpuParts = cpuLine.split(/\\s+/).slice(1).map(Number);\n const idle = cpuParts[3] + (cpuParts[4] || 0);\n const total = cpuParts.reduce((a, b) => a + b, 0);\n const diffIdle = idle - prevCpuIdle;\n const diffTotal = total - prevCpuTotal;\n const cpuPercent = diffTotal > 0 ? Math.round((1 - diffIdle / diffTotal) * 100) : 0;\n prevCpuIdle = idle;\n prevCpuTotal = total;\n const mem = {};\n for (const line of meminfo.split(\"\\n\")) {\n const match = line.match(/^(\\w+):\\s+(\\d+)/);\n if (match) mem[match[1]] = parseInt(match[2], 10);\n }\n const memTotal = mem[\"MemTotal\"] || 1;\n const memAvailable = mem[\"MemAvailable\"] || 0;\n const swapTotal = mem[\"SwapTotal\"] || 0;\n const swapFree = mem[\"SwapFree\"] || 0;\n cachedSystemStats = {\n cpu: cpuPercent,\n ram: Math.round((memTotal - memAvailable) / memTotal * 100),\n swap: swapTotal > 0 ? Math.round((swapTotal - swapFree) / swapTotal * 100) : 0,\n ramTotal: Math.round(memTotal / 1024),\n swapTotal: Math.round(swapTotal / 1024)\n };\n } catch {\n }\n}\nfunction startSystemStats() {\n systemStatsRefCount++;\n if (systemStatsRefCount === 1) {\n refreshSystemStats();\n systemStatsTimer = setInterval(refreshSystemStats, 1e4);\n }\n}\nfunction stopSystemStats() {\n systemStatsRefCount--;\n if (systemStatsRefCount <= 0) {\n systemStatsRefCount = 0;\n if (systemStatsTimer) {\n clearInterval(systemStatsTimer);\n systemStatsTimer = null;\n }\n }\n}\nclass SessionsWsManager {\n clients = /* @__PURE__ */ new Set();\n unsubscribe = null;\n interruptCheckTimer = null;\n cleanupTimer = null;\n systemStatsTimer = null;\n lastHash = \"\";\n lastStatsHash = \"\";\n config;\n droppedClients = 0;\n refreshing = false;\n refreshQueued = false;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /** Get current stats */\n getStats() {\n return {\n clients: this.clients.size,\n droppedClients: this.droppedClients\n };\n }\n /**\n * Add a client. Returns false if max clients reached.\n */\n addClient(client) {\n if (this.clients.size >= this.config.maxSessionsClients) {\n log(\n {\n level: \"warn\",\n component: \"sessions\",\n message: \"Max clients reached, rejecting connection\",\n data: { current: this.clients.size, max: this.config.maxSessionsClients }\n },\n this.config\n );\n return false;\n }\n this.clients.add(client);\n log(\n {\n level: \"debug\",\n component: \"sessions\",\n message: \"Client connected\",\n data: { total: this.clients.size }\n },\n this.config\n );\n if (this.clients.size === 1 && !this.unsubscribe) {\n console.log(\"[ws:sessions] First client, subscribing to watcher\");\n this.unsubscribe = sessionWatcher.subscribe(() => this.refreshAndBroadcast());\n this.interruptCheckTimer = setInterval(() => {\n this.refreshAndBroadcast();\n }, 500);\n try {\n cleanupStaleSessions();\n } catch {\n }\n this.cleanupTimer = setInterval(() => {\n try {\n cleanupStaleSessions();\n } catch {\n }\n }, 1e4);\n startSystemStats();\n this.systemStatsTimer = setInterval(() => {\n this.broadcastSystemStats();\n }, 1e4);\n } else {\n console.log(\"[ws:sessions] addClient: clients=\", this.clients.size, \"hasUnsubscribe=\", !!this.unsubscribe);\n }\n this.createSessionsMessageAsync(\"connected\").then((msg) => {\n if (client.isOpen()) {\n this.sendToClient(client, msg);\n this.sendToClient(client, this.createSystemStatsMessage());\n }\n });\n return true;\n }\n removeClient(client) {\n const had = this.clients.delete(client);\n if (had) {\n log(\n {\n level: \"debug\",\n component: \"sessions\",\n message: \"Client disconnected\",\n data: { total: this.clients.size }\n },\n this.config\n );\n }\n if (this.clients.size === 0 && this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n this.lastHash = \"\";\n if (this.interruptCheckTimer) {\n clearInterval(this.interruptCheckTimer);\n this.interruptCheckTimer = null;\n }\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n if (this.systemStatsTimer) {\n clearInterval(this.systemStatsTimer);\n this.systemStatsTimer = null;\n }\n stopSystemStats();\n }\n }\n /**\n * Merge the send queue into each session object: how many messages wait, and\n * what the next one is, so the UI can name it instead of showing a number.\n */\n mergeQueueCounts(sessions) {\n for (const session of sessions) {\n const summary = session.tmux_target ? getQueueSummary(session.tmux_target) : null;\n session.queue_count = summary?.count ?? 0;\n session.queue_head_text = summary?.head.text ?? null;\n session.queue_head_kind = summary?.head.kind ?? null;\n }\n }\n async createSessionsMessageAsync(type) {\n const sessions = await getEnrichedSessionsAsync();\n saveProjects(sessions.map((s) => s.cwd).filter((cwd) => !!cwd));\n return {\n type,\n sessions,\n count: sessions.length,\n projects: getSavedProjects(),\n settings: getSettings(),\n timestamp: Date.now()\n };\n }\n createSystemStatsMessage() {\n return { type: \"systemStats\", ...cachedSystemStats, timestamp: Date.now() };\n }\n /**\n * Public trigger for an immediate fresh broadcast. Used by API mutation\n * endpoints (rename/kill/restart) so the UI updates instantly instead of\n * waiting up to 500ms for the file watcher poll to detect mtime change.\n */\n broadcastNow() {\n this.refreshAndBroadcast();\n }\n refreshAndBroadcast() {\n if (this.refreshing) {\n this.refreshQueued = true;\n return;\n }\n this.refreshing = true;\n this.createSessionsMessageAsync(\"sessions\").then((message) => {\n this.mergeQueueCounts(message.sessions);\n const hash = JSON.stringify(message.sessions);\n if (hash === this.lastHash) {\n return;\n }\n this.lastHash = hash;\n const data = JSON.stringify(message);\n const drops = [];\n for (const client of [...this.clients]) {\n if (!this.sendToClient(client, message, data)) drops.push(client);\n }\n for (const client of drops) {\n this.clients.delete(client);\n this.droppedClients++;\n log(\n {\n level: \"warn\",\n component: \"sessions\",\n message: \"Dropped slow client\",\n data: { total: this.clients.size }\n },\n this.config\n );\n }\n }).catch((err) => {\n log(\n {\n level: \"error\",\n component: \"sessions\",\n message: \"Refresh failed\",\n data: { error: String(err) }\n },\n this.config\n );\n }).finally(() => {\n this.refreshing = false;\n if (this.refreshQueued) {\n this.refreshQueued = false;\n this.refreshAndBroadcast();\n }\n });\n }\n broadcastSystemStats() {\n const message = this.createSystemStatsMessage();\n const hash = JSON.stringify(message);\n if (hash === this.lastStatsHash) return;\n this.lastStatsHash = hash;\n const data = JSON.stringify(message);\n const drops = [];\n for (const client of [...this.clients]) {\n if (!this.sendToClient(client, message, data)) drops.push(client);\n }\n for (const client of drops) {\n this.clients.delete(client);\n this.droppedClients++;\n }\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"sessions\",\n maxBuffered: 64 * 1024,\n data\n }) === \"sent\";\n }\n}\nfunction sendJson(client, message, config, opts) {\n try {\n if (!client.isOpen()) return \"closed\";\n if (client.getBufferedAmount) {\n const buffered = client.getBufferedAmount();\n if (buffered > opts.maxBuffered) {\n log(\n {\n level: \"warn\",\n component: opts.component,\n message: \"Client backpressure detected\",\n data: { buffered }\n },\n config\n );\n return \"backpressure\";\n }\n }\n client.send(opts.data ?? JSON.stringify(message));\n return \"sent\";\n } catch (err) {\n log(\n {\n level: \"error\",\n component: opts.component,\n message: \"Failed to send to client\",\n data: { error: String(err) }\n },\n config\n );\n return \"closed\";\n }\n}\nclass TerminalWsManager {\n clients = /* @__PURE__ */ new Map();\n pollTimers = /* @__PURE__ */ new Map();\n states = /* @__PURE__ */ new Map();\n config;\n totalClients = 0;\n droppedClients = 0;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n /** Get current stats */\n getStats() {\n return {\n totalClients: this.totalClients,\n targets: this.clients.size,\n droppedClients: this.droppedClients\n };\n }\n /**\n * Add a client for a target. Returns false if max clients reached.\n */\n addClient(client, target) {\n if (this.totalClients >= this.config.maxTerminalClientsTotal) {\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Max total clients reached\",\n data: { current: this.totalClients, max: this.config.maxTerminalClientsTotal }\n },\n this.config\n );\n return false;\n }\n const targetClients = this.clients.get(target);\n if (targetClients && targetClients.size >= this.config.maxTerminalClientsPerTarget) {\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Max clients per target reached\",\n data: { target, current: targetClients.size, max: this.config.maxTerminalClientsPerTarget }\n },\n this.config\n );\n return false;\n }\n if (!this.clients.has(target)) {\n this.clients.set(target, /* @__PURE__ */ new Set());\n }\n this.clients.get(target).add(client);\n this.totalClients++;\n log(\n {\n level: \"debug\",\n component: \"terminal\",\n message: \"Client connected\",\n data: { target, targetClients: this.clients.get(target).size, total: this.totalClients }\n },\n this.config\n );\n if (this.clients.get(target).size === 1) {\n this.startPolling(target);\n }\n const snap = snapshotPane(target);\n const now = Date.now();\n if (snap) {\n this.states.set(target, {\n historySize: snap.historySize,\n alt: snap.alt,\n cols: snap.cols,\n rows: snap.rows,\n screenKey: snap.screen.join(\"\\n\")\n });\n this.sendToClient(client, {\n type: \"screen\",\n lines: snap.screen,\n historySize: snap.historySize,\n alt: snap.alt,\n cols: snap.cols,\n rows: snap.rows,\n timestamp: now\n });\n if (!snap.alt && snap.historySize > 0) {\n this.sendHistoryTail(client, target, snap.historySize, DEFAULT_HISTORY_DEPTH);\n }\n } else {\n this.sendToClient(client, {\n type: \"screen\",\n lines: [],\n historySize: 0,\n alt: false,\n cols: 0,\n rows: 0,\n timestamp: now\n });\n }\n return true;\n }\n /**\n * Serve a client's request for `count` history lines before absolute index `before`.\n * Replies only to the requesting client (each viewer scrolls independently).\n */\n requestHistory(client, target, before, count) {\n const state = this.states.get(target);\n if (!state || state.alt) return;\n const n = Math.max(1, Math.min(MAX_HISTORY_REQUEST, Math.floor(count)));\n const end = Math.max(0, Math.min(Math.floor(before), state.historySize));\n if (end === 0) return;\n this.sendHistoryTail(client, target, end, n);\n }\n sendHistoryTail(client, target, end, count) {\n const state = this.states.get(target);\n const known = state?.historySize ?? end;\n const start = Math.max(0, end - count);\n const res = fetchHistoryRange(target, start, end, known);\n if (!res) return;\n this.sendToClient(client, {\n type: \"history\",\n start: res.start,\n lines: res.lines,\n historySize: res.historySize,\n timestamp: Date.now()\n });\n }\n removeClient(client, target) {\n if (target) {\n const targetClients = this.clients.get(target);\n if (targetClients && targetClients.delete(client)) {\n this.totalClients--;\n log(\n {\n level: \"debug\",\n component: \"terminal\",\n message: \"Client disconnected\",\n data: { target, targetClients: targetClients.size, total: this.totalClients }\n },\n this.config\n );\n if (targetClients.size === 0) {\n this.stopPolling(target);\n this.clients.delete(target);\n this.states.delete(target);\n }\n }\n return;\n }\n for (const [t, clients] of this.clients) {\n if (clients.delete(client)) {\n this.totalClients--;\n if (clients.size === 0) {\n this.stopPolling(t);\n this.clients.delete(t);\n this.states.delete(t);\n }\n break;\n }\n }\n }\n startPolling(target) {\n if (this.pollTimers.has(target)) return;\n const timer = setInterval(() => this.pollAndBroadcast(target), 200);\n this.pollTimers.set(target, timer);\n }\n stopPolling(target) {\n const timer = this.pollTimers.get(target);\n if (timer) {\n clearInterval(timer);\n this.pollTimers.delete(target);\n }\n }\n pollAndBroadcast(target) {\n const snap = snapshotPane(target);\n if (!snap) return;\n const prev = this.states.get(target);\n const now = Date.now();\n const messages = [];\n const screenKey = snap.screen.join(\"\\n\");\n if (!prev) {\n this.states.set(target, { historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, screenKey });\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n messages.push({ type: \"screen\", lines: snap.screen, historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n } else {\n const reflowed = snap.alt !== prev.alt || snap.cols !== prev.cols || snap.rows !== prev.rows || snap.historySize < prev.historySize;\n if (reflowed) {\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n } else if (!snap.alt && snap.historySize > prev.historySize) {\n const n = snap.historySize - prev.historySize;\n let lines = null;\n let start = prev.historySize;\n if (n <= snap.tail.length) {\n lines = snap.tail.slice(snap.tail.length - n);\n } else {\n const res = fetchHistoryRange(target, prev.historySize, snap.historySize, snap.historySize);\n if (res) {\n lines = res.lines;\n start = res.start;\n }\n }\n if (lines) {\n messages.push({ type: \"history\", start, lines, historySize: snap.historySize, timestamp: now });\n } else {\n messages.push({ type: \"reset\", historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n }\n }\n if (screenKey !== prev.screenKey || reflowed) {\n messages.push({ type: \"screen\", lines: snap.screen, historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, timestamp: now });\n }\n this.states.set(target, { historySize: snap.historySize, alt: snap.alt, cols: snap.cols, rows: snap.rows, screenKey });\n }\n if (messages.length === 0) return;\n const clients = this.clients.get(target);\n if (!clients) return;\n for (const message of messages) {\n const data = JSON.stringify(message);\n const drops = [];\n for (const client of [...clients]) {\n if (!this.sendToClient(client, message, data)) drops.push(client);\n }\n for (const client of drops) {\n clients.delete(client);\n this.totalClients--;\n this.droppedClients++;\n log(\n {\n level: \"warn\",\n component: \"terminal\",\n message: \"Dropped slow client\",\n data: { target, total: this.totalClients }\n },\n this.config\n );\n }\n if (clients.size === 0) {\n this.stopPolling(target);\n this.clients.delete(target);\n this.states.delete(target);\n return;\n }\n }\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"terminal\",\n maxBuffered: 64 * 1024,\n data\n }) === \"sent\";\n }\n}\nconst TRANSCRIPT_POLL_MS = 500;\nconst SUBAGENT_DISCOVER_TICKS = 4;\nconst RESOLVE_TICKS = 4;\nconst RESOLVE_TICKS_MAX = 60;\nconst SNAPSHOT_ENTRIES = 300;\nconst MAX_HISTORY_ENTRIES = 500;\nclass TranscriptWsManager {\n clients = /* @__PURE__ */ new Map();\n sessions = /* @__PURE__ */ new Map();\n config;\n constructor(config) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n addClient(client, sessionId) {\n const existing = this.clients.get(sessionId);\n if (existing && existing.size >= this.config.maxTerminalClientsPerTarget) {\n log(\n {\n level: \"warn\",\n component: \"transcript\",\n message: \"Max clients per session reached\",\n data: { sessionId, current: existing.size }\n },\n this.config\n );\n return false;\n }\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, /* @__PURE__ */ new Set());\n this.clients.get(sessionId).add(client);\n let state = this.sessions.get(sessionId);\n if (!state) {\n state = this.startSession(sessionId);\n this.sessions.set(sessionId, state);\n }\n state.sentContext = JSON.stringify(state.builder.context);\n this.sendToClient(client, this.snapshot(state));\n return true;\n }\n removeClient(client, sessionId) {\n const drop = (id, clients) => {\n if (!clients.delete(client)) return false;\n if (clients.size === 0) this.stopSession(id);\n return true;\n };\n if (sessionId) {\n const clients = this.clients.get(sessionId);\n if (clients) drop(sessionId, clients);\n return;\n }\n for (const [id, clients] of this.clients) {\n if (drop(id, clients)) break;\n }\n }\n /** A main-transcript builder that stamps voice-injected prompts (see dictation-marks). */\n mainBuilder(sessionId) {\n return new TranscriptBuilder(false, (text, ts) => isDictated(sessionId, text, ts));\n }\n startSession(sessionId) {\n const state = {\n sessionId,\n tailer: null,\n builder: this.mainBuilder(sessionId),\n available: false,\n resolveIn: RESOLVE_TICKS,\n resolveBackoff: RESOLVE_TICKS,\n subagents: /* @__PURE__ */ new Map(),\n discoverIn: 0,\n sentContext: \"\",\n sentModel: null,\n stale: /* @__PURE__ */ new Set(),\n timer: setInterval(() => this.poll(sessionId), TRANSCRIPT_POLL_MS)\n };\n const path = this.locate(sessionId);\n if (path) this.attach(state, path);\n return state;\n }\n /**\n * Point the state at a transcript file and read what is already in it, so\n * the next snapshot carries history rather than starting from empty.\n */\n attach(state, path) {\n state.tailer = new JsonlTailer(path);\n this.consume(state, state.tailer.read());\n this.syncSubagents(state);\n }\n /** Where this session's JSONL lives, or null if it is not on disk yet. */\n locate(sessionId) {\n const session = getSession(sessionId);\n return session ? resolveTranscriptPath(session, sessionId) : null;\n }\n /**\n * Pick up newly spawned subagents and tail the known ones. Returns the\n * payloads that changed since the last call.\n */\n syncSubagents(state) {\n if (!state.tailer) return [];\n if (state.discoverIn <= 0) {\n state.discoverIn = SUBAGENT_DISCOVER_TICKS;\n for (const file of listSubagents(state.tailer.path, new Set(state.subagents.keys()))) {\n state.subagents.set(file.agentId, {\n tailer: new JsonlTailer(file.path),\n builder: new TranscriptBuilder(true),\n meta: file.meta,\n payload: null,\n lastSent: \"\"\n });\n }\n } else {\n state.discoverIn--;\n }\n const changed = [];\n for (const [agentId, sub] of state.subagents) {\n const result = sub.tailer.read();\n if (result.status === \"reset\") {\n sub.builder = new TranscriptBuilder(true);\n } else if (result.status === \"lines\") {\n for (const line of result.lines) sub.builder.feed(line);\n }\n const payload = subagentPayload(agentId, sub, state.builder.finishedAgents.has(agentId));\n sub.payload = payload;\n const encoded = JSON.stringify(payload);\n if (encoded === sub.lastSent) continue;\n sub.lastSent = encoded;\n changed.push(payload);\n }\n return changed;\n }\n /**\n * Send one client the slice of `count` entries that ends just before\n * `before` — the index of the oldest entry it already holds.\n */\n requestHistory(client, sessionId, before, count) {\n const state = this.sessions.get(sessionId);\n if (!state) return;\n const end = Math.max(0, Math.min(Math.floor(before), state.builder.entries.length));\n if (end === 0) return;\n const n = Math.max(1, Math.min(MAX_HISTORY_ENTRIES, Math.floor(count)));\n const start = Math.max(0, end - n);\n this.sendToClient(client, {\n type: \"history\",\n entries: state.builder.entries.slice(start, end),\n firstIndex: start,\n timestamp: Date.now()\n });\n }\n stopSession(sessionId) {\n const state = this.sessions.get(sessionId);\n if (state) clearInterval(state.timer);\n this.sessions.delete(sessionId);\n this.clients.delete(sessionId);\n }\n /** Apply a tail result to the builder; returns changed entry ids. */\n consume(state, result) {\n switch (result.status) {\n case \"lines\": {\n state.available = true;\n const changed = [];\n for (const line of result.lines) changed.push(...state.builder.feed(line));\n return changed;\n }\n case \"reset\":\n state.builder = this.mainBuilder(state.sessionId);\n return [];\n default:\n return [];\n }\n }\n poll(sessionId) {\n const state = this.sessions.get(sessionId);\n const clients = this.clients.get(sessionId);\n if (!state || !clients || clients.size === 0) return;\n if (!state.tailer) {\n if (--state.resolveIn > 0) return;\n const path = this.locate(sessionId);\n if (!path) {\n state.resolveBackoff = Math.min(state.resolveBackoff * 2, RESOLVE_TICKS_MAX);\n state.resolveIn = state.resolveBackoff;\n return;\n }\n this.attach(state, path);\n this.resend(sessionId, state);\n return;\n }\n this.recoverStale(sessionId, state);\n const result = state.tailer.read();\n if (result.status === \"reset\") {\n this.consume(state, result);\n this.consume(state, state.tailer.read());\n this.resend(sessionId, state);\n return;\n }\n const changedIds = this.consume(state, result);\n if (changedIds.length > 0) {\n const seen = /* @__PURE__ */ new Set();\n const entries = [];\n const indices = [];\n for (const id of changedIds) {\n if (seen.has(id)) continue;\n seen.add(id);\n const index = state.builder.indexOf(id);\n if (index !== void 0) {\n entries.push(state.builder.entries[index]);\n indices.push(index);\n }\n }\n this.broadcast(sessionId, { type: \"entries\", entries, indices, timestamp: Date.now() });\n }\n const subagents = this.syncSubagents(state);\n if (subagents.length > 0) {\n this.broadcast(sessionId, { type: \"subagents\", subagents, timestamp: Date.now() });\n }\n const context = state.builder.context;\n const encoded = JSON.stringify(context);\n if (context && encoded !== state.sentContext) {\n state.sentContext = encoded;\n this.broadcast(sessionId, { type: \"context\", context, timestamp: Date.now() });\n }\n const model = state.builder.model;\n if (model && model !== state.sentModel) {\n state.sentModel = model;\n this.broadcast(sessionId, { type: \"model\", model, timestamp: Date.now() });\n }\n }\n /** Re-broadcast the whole transcript, e.g. after a file reset or a re-attach. */\n resend(sessionId, state) {\n state.sentContext = JSON.stringify(state.builder.context);\n this.broadcast(sessionId, this.snapshot(state));\n }\n /**\n * Catch up the clients that missed a delta while their socket was backed\n * up. A snapshot costs the whole transcript tail, so it goes only to the\n * client that missed something, and only once its buffer has drained.\n */\n recoverStale(sessionId, state) {\n if (state.stale.size === 0) return;\n const clients = this.clients.get(sessionId);\n const message = this.snapshot(state);\n const data = JSON.stringify(message);\n for (const client of [...state.stale]) {\n if (!clients?.has(client)) {\n state.stale.delete(client);\n continue;\n }\n const result = this.sendToClient(client, message, data);\n if (result === \"backpressure\") continue;\n state.stale.delete(client);\n if (result === \"closed\") clients.delete(client);\n }\n }\n /**\n * Everything a freshly attached client needs. Context rides along here so\n * the client starts with a gauge instead of waiting for the next response;\n * callers mark it sent with `sentContext`.\n */\n snapshot(state) {\n const all = state.builder.entries;\n const firstIndex = Math.max(0, all.length - SNAPSHOT_ENTRIES);\n return {\n type: \"snapshot\",\n entries: firstIndex > 0 ? all.slice(firstIndex) : all,\n firstIndex,\n subagents: [...state.subagents].map(\n ([id, sub]) => sub.payload ?? subagentPayload(id, sub, state.builder.finishedAgents.has(id))\n ),\n context: state.builder.context,\n model: state.builder.model,\n available: state.available,\n timestamp: Date.now()\n };\n }\n broadcast(sessionId, message) {\n const clients = this.clients.get(sessionId);\n if (!clients) return;\n const state = this.sessions.get(sessionId);\n const data = JSON.stringify(message);\n for (const client of [...clients]) {\n const result = this.sendToClient(client, message, data);\n if (result === \"backpressure\") state?.stale.add(client);\n else if (result === \"closed\") clients.delete(client);\n }\n if (clients.size === 0) this.stopSession(sessionId);\n }\n sendToClient(client, message, data) {\n return sendJson(client, message, this.config, {\n component: \"transcript\",\n // A snapshot of a long session is megabytes; the ceiling is here to\n // catch a socket that has stopped draining, not to size a message.\n maxBuffered: 8 * 1024 * 1024,\n data\n });\n }\n}\nfunction handleWsMessage(msgStr, handlers) {\n if (msgStr === \"ping\") return \"pong\";\n if (!handlers) return null;\n try {\n const msg = JSON.parse(msgStr);\n switch (msg.type) {\n case \"resize\":\n if (handlers.resize && typeof msg.cols === \"number\" && typeof msg.rows === \"number\") {\n handlers.resize(msg.cols, msg.rows);\n }\n break;\n case \"history_request\":\n if (handlers.historyRequest && typeof msg.before === \"number\" && typeof msg.count === \"number\") {\n handlers.historyRequest(msg.before, msg.count);\n }\n break;\n }\n } catch {\n }\n return null;\n}\nfunction parseWsPath(pathname) {\n if (pathname === \"/api/sessions/stream\") {\n return { type: \"sessions\" };\n }\n const transcriptMatch = pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/transcript\\/stream$/);\n if (transcriptMatch) {\n return { type: \"transcript\", target: decodeURIComponent(transcriptMatch[1]) };\n }\n const termMatch = pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/stream$/);\n if (termMatch) {\n return { type: \"terminal\", target: decodeURIComponent(termMatch[1]) };\n }\n return null;\n}\nexport {\n SessionsWsManager as S,\n TerminalWsManager as T,\n removeProject as a,\n getEnrichedSessionsAsync as b,\n getSettings as c,\n TranscriptWsManager as d,\n getSavedProjects as g,\n handleWsMessage as h,\n parseWsPath as p,\n resizePane as r,\n saveProject as s,\n updateSettings as u\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"SF Mono", Monaco, "Cascadia Code", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-400:oklch(74.6% .16 232.661);--color-fuchsia-400:oklch(74% .238 322.16);--color-stone-100:oklch(97% .001 106.424);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-lg:32rem;--container-xl:36rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-xs:.125rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:"SF Mono", Monaco, "Cascadia Code", monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}html{height:100%}body{overscroll-behavior:none;background-color:var(--background);min-height:100%;color:var(--foreground)}}@layer components;@layer utilities{.\@container{container-type:inline-size}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.end-4{inset-inline-end:calc(var(--spacing) * 4)}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.left-\[50\%\]{left:50%}.z-50{z-index:50}.z-\[70\]{z-index:70}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[85dvh\]{height:85dvh}.h-auto{height:auto}.h-full{height:100%}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[85dvh\]{max-height:85dvh}.min-h-0{min-height:0}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-24{min-height:calc(var(--spacing) * 24)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-72{width:calc(var(--spacing) * 72)}.w-\[calc\(100\%-1\.5rem\)\]{width:calc(100% - 1.5rem)}.w-\[calc\(100\%-1rem\)\]{width:calc(100% - 1rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[280px\]{max-width:280px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-14{min-width:calc(var(--spacing) * 14)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\(--bits-popover-content-transform-origin\){transform-origin:var(--bits-popover-content-transform-origin)}.origin-\(--bits-tooltip-content-transform-origin\){transform-origin:var(--bits-tooltip-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%-2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[4px\]{border-radius:4px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#333\]{border-color:#333}.border-\[\#262626\]{border-color:#262626}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.border-s-transparent{border-inline-start-color:#0000}.border-t-transparent{border-top-color:#0000}.bg-\[\#1a1a1a\]{background-color:#1a1a1a}.bg-\[\#2a2a2a\]{background-color:#2a2a2a}.bg-\[\#222\]{background-color:#222}.bg-\[\#161616\]{background-color:#161616}.bg-amber-700{background-color:var(--color-amber-700)}.bg-background{background-color:var(--background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--border)}.bg-destructive{background-color:var(--destructive)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-foreground{background-color:var(--foreground)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-red-900{background-color:var(--color-red-900)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.fill-foreground{fill:var(--foreground)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-px{padding:1px}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:SF Mono,Monaco,Cascadia Code,monospace}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-wrap{text-wrap:wrap}.whitespace-nowrap{white-space:nowrap}.text-\[\#6f6f6f\]{color:#6f6f6f}.text-amber-100{color:var(--color-amber-100)}.text-background{color:var(--background)}.text-current{color:currentColor}.text-emerald-400{color:var(--color-emerald-400)}.text-foreground{color:var(--foreground)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sky-400{color:var(--color-sky-400)}.text-stone-100{color:var(--color-stone-100)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-ring\/10{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.ring-ring\/10{--tw-ring-color:color-mix(in oklab, var(--ring) 10%, transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-ring\/50{outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.outline-ring\/50{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.placeholder\:text-stone-500::placeholder{color:var(--color-stone-500)}@media(hover:hover){.hover\:bg-\[\#222\]:hover{background-color:#222}.hover\:bg-\[\#333\]:hover{background-color:#333}.hover\:bg-\[\#262626\]:hover{background-color:#262626}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-amber-600:hover{background-color:var(--color-amber-600)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-emerald-500:hover{background-color:var(--color-emerald-500)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-stone-100:hover{color:var(--color-stone-100)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-4:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.active\:bg-emerald-700:active{background-color:var(--color-emerald-700)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=kbd\]\:pr-1\.5:has([data-slot=kbd]){padding-right:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-closed\:animate-out[data-closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-closed\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-open\:animate-in[data-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-open\:zoom-in-95[data-open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:-translate-x-1\/2[data-side=bottom]{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:-translate-y-\[calc\(-50\%\+1px\)\][data-side=bottom]{--tw-translate-y: calc((-50% + 1px)*-1) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-y-\[calc\(50\%-3px\)\][data-side=left]{--tw-translate-y: calc((50% - 3px)*-1) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-end-2[data-side=left]:where(:dir(ltr),[dir=ltr]){--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=left\]\:slide-in-from-end-2[data-side=left]:where(:dir(rtl),[dir=rtl]){--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-\[calc\(50\%\+2px\)\][data-side=right]{--tw-translate-x: calc(50% + 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-y-1\/2[data-side=right]{--tw-translate-y: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-start-2[data-side=right]:where(:dir(ltr),[dir=ltr]){--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=right\]\:slide-in-from-start-2[data-side=right]:where(:dir(rtl),[dir=rtl]){--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:translate-x-1\/2[data-side=top]{--tw-translate-x: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:translate-y-\[calc\(-50\%\+2px\)\][data-side=top]{--tw-translate-y: calc(-50% + 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}:is(.\*\*\:data-\[slot\=kbd\]\:relative *)[data-slot=kbd]{position:relative}:is(.\*\*\:data-\[slot\=kbd\]\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.\*\*\:data-\[slot\=kbd\]\:z-50 *)[data-slot=kbd]{z-index:50}:is(.\*\*\:data-\[slot\=kbd\]\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) - 4px)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}@media(min-width:40rem){.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-start{text-align:start}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-destructive\/70:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/70:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 70%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:ring-ring\/20:is(.dark *){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.dark\:ring-ring\/20:is(.dark *){--tw-ring-color:color-mix(in oklab, var(--ring) 20%, transparent)}}.dark\:outline-ring\/40:is(.dark *){outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.dark\:outline-ring\/40:is(.dark *){outline-color:color-mix(in oklab,var(--ring) 40%,transparent)}}@media(hover:hover){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-\[18px\] svg{width:18px;height:18px}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}@media(hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary) 90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.7% .004 49.25);--card:oklch(100% 0 0);--card-foreground:oklch(14.7% .004 49.25);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.7% .004 49.25);--primary:oklch(21.6% .006 56.043);--primary-foreground:oklch(98.5% .001 106.423);--secondary:oklch(97% .001 106.424);--secondary-foreground:oklch(21.6% .006 56.043);--muted:oklch(97% .001 106.424);--muted-foreground:oklch(55.3% .013 58.071);--accent:oklch(97% .001 106.424);--accent-foreground:oklch(21.6% .006 56.043);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.3% .003 48.717);--input:oklch(92.3% .003 48.717);--ring:oklch(70.9% .01 56.259);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% .001 106.423);--sidebar-foreground:oklch(14.7% .004 49.25);--sidebar-primary:oklch(21.6% .006 56.043);--sidebar-primary-foreground:oklch(98.5% .001 106.423);--sidebar-accent:oklch(97% .001 106.424);--sidebar-accent-foreground:oklch(21.6% .006 56.043);--sidebar-border:oklch(92.3% .003 48.717);--sidebar-ring:oklch(70.9% .01 56.259)}.dark{--background:oklch(14.7% .004 49.25);--foreground:oklch(98.5% .001 106.423);--card:oklch(21.6% .006 56.043);--card-foreground:oklch(98.5% .001 106.423);--popover:oklch(21.6% .006 56.043);--popover-foreground:oklch(98.5% .001 106.423);--primary:oklch(92.3% .003 48.717);--primary-foreground:oklch(21.6% .006 56.043);--secondary:oklch(26.8% .007 34.298);--secondary-foreground:oklch(98.5% .001 106.423);--muted:oklch(26.8% .007 34.298);--muted-foreground:oklch(70.9% .01 56.259);--accent:oklch(26.8% .007 34.298);--accent-foreground:oklch(98.5% .001 106.423);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.3% .013 58.071);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(21.6% .006 56.043);--sidebar-foreground:oklch(98.5% .001 106.423);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% .001 106.423);--sidebar-accent:oklch(26.8% .007 34.298);--sidebar-accent-foreground:oklch(98.5% .001 106.423);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.3% .013 58.071)}.pulse-dot{animation:1.4s ease-in-out infinite claude-mux-pulse}@keyframes claude-mux-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.75)}}@media(prefers-reduced-motion:reduce){.pulse-dot{animation:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}[data-scroll-area-viewport]{scrollbar-width:none!important;-ms-overflow-style:none!important;-webkit-overflow-scrolling:touch!important}[data-scroll-area-viewport]::-webkit-scrollbar{display:none!important}:where([data-scroll-area-viewport]){display:flex;flex-direction:column;align-items:stretch}:where([data-scroll-area-content]){flex-grow:1}.accordion.svelte-18mom4e{border-top:1px solid hsl(var(--border) / .5)}.accordion-header.svelte-18mom4e{display:flex;align-items:center;gap:6px;width:100%;padding:5px 10px;border:none;background:hsl(var(--muted) / .3);color:hsl(var(--muted-foreground));font-family:inherit;font-size:11px;font-weight:500;cursor:pointer;text-align:left;text-transform:uppercase;letter-spacing:.03em}.accordion-header.svelte-18mom4e:hover{background:hsl(var(--muted) / .6);color:hsl(var(--foreground))}.accordion.expanded.svelte-18mom4e .accordion-header:where(.svelte-18mom4e){color:hsl(var(--foreground))}.header-icon.svelte-18mom4e{font-size:13px;opacity:.7}.count.svelte-18mom4e{margin-left:auto;font-size:10px;font-weight:600;color:hsl(var(--muted-foreground));min-width:14px;text-align:center}.accordion-title.svelte-18mom4e{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chevron.svelte-18mom4e{font-size:14px;opacity:.5}.accordion-content.svelte-18mom4e{padding:6px 10px 8px 14px;border-left:2px solid hsl(var(--border) / .3);margin-left:10px}.screenshots-grid.svelte-i8iwb7{display:grid;grid-template-columns:repeat(2,1fr);gap:4px}.screenshot-item.svelte-i8iwb7{position:relative;aspect-ratio:16 / 10;border-radius:4px;overflow:hidden;background:hsl(var(--muted))}.thumbnail.svelte-i8iwb7{display:block;width:100%;height:100%;padding:0;border:none;background:transparent;cursor:pointer}.thumbnail.svelte-i8iwb7 img:where(.svelte-i8iwb7){width:100%;height:100%;object-fit:cover}.thumbnail.svelte-i8iwb7:hover{opacity:.9}.screenshot-item.svelte-i8iwb7 .dismiss-btn{position:absolute;top:4px;right:4px;width:24px;height:24px;background:hsl(var(--background) / .8);border-radius:4px;opacity:0;transition:opacity .15s}.screenshot-item.svelte-i8iwb7:hover .dismiss-btn{opacity:1}.screenshot-item.svelte-i8iwb7 .dismiss-btn:hover{background:hsl(var(--destructive));color:hsl(var(--destructive-foreground))}.empty.svelte-i8iwb7{color:hsl(var(--muted-foreground));font-size:11px;margin:0}.modal-overlay.svelte-i8iwb7{position:fixed;inset:0;z-index:1000;background:#000000e6;display:flex;align-items:center;justify-content:center;padding:16px}.modal-content.svelte-i8iwb7{position:relative;max-width:100%;max-height:100%;display:flex;flex-direction:column;align-items:center;gap:16px;transition:transform .1s ease-out}.modal-image.svelte-i8iwb7{max-width:100%;max-height:calc(100vh - 120px);object-fit:contain;border-radius:8px;box-shadow:0 4px 24px #00000080}.modal-actions.svelte-i8iwb7{display:flex;gap:12px}.modal-actions.svelte-i8iwb7 .modal-btn{display:flex;align-items:center;gap:6px}.swipe-hint.svelte-i8iwb7{display:none;align-items:center;gap:6px;color:hsl(var(--muted-foreground));font-size:12px}@media(max-width:768px){.swipe-hint.svelte-i8iwb7{display:flex}}.empty-text.svelte-p8s4ss{color:hsl(var(--muted-foreground));font-size:11px;margin:0}.queue-list.svelte-p8s4ss{display:flex;flex-direction:column;gap:3px}.queue-item.svelte-p8s4ss{display:flex;align-items:flex-start;gap:3px;padding:4px 6px;background:#1a1a1a;border-radius:4px;border:1px solid #2a2a2a}.queue-item-content.svelte-p8s4ss{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.queue-text.svelte-p8s4ss{font-size:11px;color:#ccc;word-break:break-word;line-height:1.3}.queue-time.svelte-p8s4ss{font-size:9px;color:#666}.queue-tag.svelte-p8s4ss{margin-left:4px;padding:0 4px;border-radius:3px;background:#2a2a2a;color:#888}.queue-item-actions.svelte-p8s4ss{display:flex;gap:1px;flex-shrink:0}.queue-btn.svelte-p8s4ss{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;border-radius:3px;background:transparent;color:#888;cursor:pointer;padding:0}.queue-btn.svelte-p8s4ss:hover:not(:disabled){background:#333;color:#ccc}.queue-btn.svelte-p8s4ss:disabled{opacity:.3;cursor:default}.queue-btn-delete.svelte-p8s4ss:hover:not(:disabled){background:#3a1a1a;color:#e74c3c}.clear-all.svelte-p8s4ss{display:block;width:100%;margin-top:4px;padding:3px;border:none;border-radius:3px;background:transparent;color:#888;font-size:10px;cursor:pointer;text-align:center}.clear-all.svelte-p8s4ss:hover{background:#3a1a1a;color:#e74c3c}.sidebar-meters.svelte-uooa92{padding:8px 12px;border-top:1px solid hsl(var(--border));background:hsl(var(--background))}.strip.svelte-uooa92{display:flex;align-items:flex-end;flex-wrap:wrap;gap:6px 10px;text-decoration:none;color:inherit;margin:-4px -6px;padding:4px 6px;border-radius:6px}.strip.svelte-uooa92:hover{background:#ffffff08}.group.svelte-uooa92{display:flex;align-items:flex-end;gap:3px;min-width:0}.spark.svelte-uooa92{flex:1 1 auto;min-width:96px;flex-direction:column;align-items:stretch;gap:3px}.ticks.svelte-uooa92{display:flex;align-items:flex-end;gap:1px;height:26px}.ticks.svelte-uooa92 .track:where(.svelte-uooa92){flex:1 1 0;min-width:2px;background:transparent}.col.svelte-uooa92{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:21px}.val.svelte-uooa92{font-size:9px;line-height:1;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}.val.spend.svelte-uooa92{font-size:11px;color:hsl(var(--foreground))}.line.svelte-uooa92{display:flex;justify-content:space-between;align-items:baseline;gap:8px}.track.svelte-uooa92{position:relative;display:block;width:7px;height:26px;border-radius:2px;background:#ffffff14;overflow:hidden}.fill.svelte-uooa92{position:absolute;left:0;right:0;bottom:0;border-radius:2px;transition:height .6s ease}.tag.svelte-uooa92{font-size:9px;line-height:1;text-transform:uppercase;letter-spacing:.04em;color:#a8a29e;white-space:nowrap}.awake-row.svelte-uooa92{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:11px;color:hsl(var(--muted-foreground));cursor:pointer;user-select:none}.awake-row.svelte-uooa92 input:where(.svelte-uooa92){margin:0;cursor:pointer}.split.svelte-qscfzl{display:grid;height:100%;min-height:0;min-width:0}.pane.svelte-qscfzl{position:relative;min-width:0;min-height:0;overflow:hidden}.pane.hidden.svelte-qscfzl{display:none}iframe.svelte-qscfzl{display:block;width:100%;height:100%;border:0;background:#0a0a0a}.divider.svelte-qscfzl{background:#1f1f21;position:relative;cursor:col-resize;touch-action:none}.divider.hidden.svelte-qscfzl{display:none}.divider.svelte-qscfzl:after{content:"";position:absolute;left:1px;right:1px;top:50%;height:40px;transform:translateY(-50%);border-radius:2px;background:#2a2a2c}.divider.svelte-qscfzl:hover:after,.split.resizing.svelte-qscfzl .divider:where(.svelte-qscfzl):after{background:#f59e0b}.shield.svelte-qscfzl{position:absolute;inset:0}.drop.svelte-qscfzl{position:absolute;inset:10px 10px 110px;display:grid;place-items:center;border:2px dashed #818cf8;border-radius:12px;background:#818cf81a;color:#a5b4fc;font:500 13px system-ui,sans-serif}.unreachable.svelte-qscfzl{height:100%;display:grid;place-content:center;justify-items:center;gap:8px;color:#a8a29e;font:14px system-ui,sans-serif}.unreachable.svelte-qscfzl iconify-icon:where(.svelte-qscfzl){font-size:28px;color:#6b6764}.unreachable.svelte-qscfzl b:where(.svelte-qscfzl){color:#e7e5e4;font-weight:500}.unreachable.svelte-qscfzl button:where(.svelte-qscfzl){height:30px;padding:0 12px;border:1px solid #2a2a2c;border-radius:8px;background:#151516;color:#d6d3d1;cursor:pointer}body{margin:0;min-height:100dvh;background:#111}iconify-icon{font-size:18px}iconify-icon.spin{animation:svelte-12qhfyh-spin 1s linear infinite}@keyframes svelte-12qhfyh-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.app-shell.svelte-12qhfyh{display:flex;height:100dvh;overflow:hidden;box-sizing:border-box;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}.app-shell.resizing-any.svelte-12qhfyh{cursor:col-resize;user-select:none}.sidebar.svelte-12qhfyh{width:var(--sidebar-width, 300px);flex-shrink:0;background:hsl(var(--background));border-right:1px solid hsl(var(--border));overflow:hidden;position:relative;display:flex;flex-direction:column}.sidebar.resizing.svelte-12qhfyh{user-select:none}.sidebar-content.svelte-12qhfyh{display:flex;flex-direction:column;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.sidebar-panel.svelte-12qhfyh{flex-shrink:0}.split-drop.svelte-12qhfyh{position:absolute;top:12px;right:12px;bottom:12px;width:min(38%,420px);display:grid;place-items:center;border:2px dashed #818cf8;border-radius:12px;background:#818cf81a;color:#a5b4fc;font:500 13px system-ui,sans-serif;z-index:30}.sidebar-foot.svelte-12qhfyh{flex-shrink:0;margin:0 10px 10px;background:#151516;border:1px solid #2a2a2c;border-radius:14px;overflow:hidden}.sidebar-foot.svelte-12qhfyh .sidebar-panel:where(.svelte-12qhfyh)+.sidebar-panel:where(.svelte-12qhfyh),.sidebar-foot.svelte-12qhfyh .sidebar-panel:where(.svelte-12qhfyh)+*{border-top:1px solid #1f1f21}.resize-handle.svelte-12qhfyh{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;background:transparent;transition:background .15s}.resize-handle.svelte-12qhfyh:hover,.sidebar.resizing.svelte-12qhfyh .resize-handle:where(.svelte-12qhfyh){background:color-mix(in oklch,var(--primary),transparent 50%)}.content.svelte-12qhfyh{flex:1;overflow:hidden;position:relative}.embed-shell.svelte-12qhfyh{height:100dvh;overflow:hidden;position:relative}.backdrop.svelte-12qhfyh{display:none}@media(max-width:768px){.sidebar.svelte-12qhfyh{position:fixed;left:0;top:0;bottom:0;width:100%!important;box-sizing:border-box;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);z-index:60;transform:translate(-100%);transition:transform .2s ease;background:hsl(var(--background) / .85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.sidebar.svelte-12qhfyh:not(.open){content-visibility:hidden}.sidebar.open.svelte-12qhfyh{transform:translate(0)}.resize-handle.svelte-12qhfyh{display:none}.backdrop.svelte-12qhfyh{display:block;position:fixed;inset:0;background:#0006;z-index:55;border:none;cursor:pointer}}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { execFile } from "child_process";
|
|
2
|
-
import { promisify } from "util";
|
|
3
|
-
const execFileAsync = promisify(execFile);
|
|
4
|
-
const STANDARD_PANE_WIDTH = 200;
|
|
5
|
-
const STANDARD_PANE_HEIGHT = 50;
|
|
6
|
-
const MIN_USEFUL_PANE_WIDTH = 160;
|
|
7
|
-
function sizeArgsForNewSession() {
|
|
8
|
-
return ["-x", String(STANDARD_PANE_WIDTH), "-y", String(STANDARD_PANE_HEIGHT)];
|
|
9
|
-
}
|
|
10
|
-
function wantsWidening(pane) {
|
|
11
|
-
return pane.attached === 0 && pane.width < MIN_USEFUL_PANE_WIDTH;
|
|
12
|
-
}
|
|
13
|
-
async function widenDetachedWindow(target) {
|
|
14
|
-
try {
|
|
15
|
-
await execFileAsync(
|
|
16
|
-
"tmux",
|
|
17
|
-
["resize-window", "-t", target, "-x", String(STANDARD_PANE_WIDTH), "-y", String(STANDARD_PANE_HEIGHT)],
|
|
18
|
-
{ timeout: 1e3 }
|
|
19
|
-
);
|
|
20
|
-
await execFileAsync("tmux", ["set-option", "-w", "-t", target, "window-size", "latest"], {
|
|
21
|
-
timeout: 1e3
|
|
22
|
-
});
|
|
23
|
-
return true;
|
|
24
|
-
} catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export {
|
|
29
|
-
widenDetachedWindow as a,
|
|
30
|
-
sizeArgsForNewSession as s,
|
|
31
|
-
wantsWidening as w
|
|
32
|
-
};
|