claude-mux 0.26.2 → 0.26.3
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 +7 -4
- package/dist/server/ws-handlers.js.map +1 -1
- package/dist/tmux/pane.d.ts +7 -3
- package/dist/tmux/pane.d.ts.map +1 -1
- package/dist/tmux/pane.js +35 -13
- package/dist/tmux/pane.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/dist/web/client/_app/immutable/chunks/{DmEI2TOa.js → BPG41LQc.js} +13 -13
- package/dist/web/client/_app/immutable/chunks/BxK27rIF.js +1 -0
- package/dist/web/client/_app/immutable/chunks/DvtCSRbx.js +1 -0
- package/dist/web/client/_app/immutable/chunks/Iym5fv6V.js +2 -0
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/Cotx9uI_.js → dist/web/client/_app/immutable/chunks/ZzVAGtsj.js} +1 -1
- package/dist/web/client/_app/immutable/entry/{app.DXHW0aPL.js → app.BrdmX1nT.js} +2 -2
- package/dist/web/client/_app/immutable/entry/start.z3GFCeFl.js +1 -0
- package/dist/web/client/_app/immutable/nodes/{0.DAnv2asW.js → 0.DX7LpCH-.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.CU8f4oNB.js → 1.LA4NLAbZ.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.BYpvCgtu.js → 2.CC3GVyR0.js} +1 -1
- package/dist/web/client/_app/immutable/nodes/{3.DuMzeRg3.js → 3.s97PqS3X.js} +1 -1
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-C-AAPmon.js → 0-D-tZOQ7R.js} +9 -9
- package/dist/web/server/chunks/{0-C-AAPmon.js.map → 0-D-tZOQ7R.js.map} +1 -1
- package/dist/web/server/chunks/{1-T_dogl8W.js → 1-CG5NsrbP.js} +3 -3
- package/dist/web/server/chunks/{1-T_dogl8W.js.map → 1-CG5NsrbP.js.map} +1 -1
- package/dist/web/server/chunks/{2-FlchE_4u.js → 2-yV51EcS-.js} +7 -7
- package/dist/web/server/chunks/{2-FlchE_4u.js.map → 2-yV51EcS-.js.map} +1 -1
- package/dist/web/server/chunks/{3-U2bTntXU.js → 3-D75yomeT.js} +6 -6
- package/dist/web/server/chunks/{3-U2bTntXU.js.map → 3-D75yomeT.js.map} +1 -1
- package/dist/web/server/chunks/{_layout.svelte-Ddn9Wu-V.js → _layout.svelte-B22DMQF4.js} +4 -4
- package/dist/web/server/chunks/{_layout.svelte-Ddn9Wu-V.js.map → _layout.svelte-B22DMQF4.js.map} +1 -1
- package/dist/web/server/chunks/{_page.svelte-_F3qltju.js → _page.svelte-DkZsH6VV.js} +2 -2
- package/dist/web/server/chunks/{_page.svelte-_F3qltju.js.map → _page.svelte-DkZsH6VV.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-C6MJsvPN.js → _server.ts-BLpwF6cO.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-C6MJsvPN.js.map → _server.ts-BLpwF6cO.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-fnuGtMqr.js → _server.ts-BceRCUNN.js} +3 -3
- package/dist/web/server/chunks/{_server.ts-fnuGtMqr.js.map → _server.ts-BceRCUNN.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-Df32fD_Q.js → _server.ts-DLwZHSdd.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-Df32fD_Q.js.map → _server.ts-DLwZHSdd.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-CNU4yPZZ.js → _server.ts-IZp35sUH.js} +4 -2
- package/dist/web/server/chunks/_server.ts-IZp35sUH.js.map +1 -0
- package/dist/web/server/chunks/{_server.ts-CtsPyICr.js → _server.ts-ilTVJ4A9.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-CtsPyICr.js.map → _server.ts-ilTVJ4A9.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-C00ejke7.js → _server.ts-pihD3w10.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-C00ejke7.js.map → _server.ts-pihD3w10.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-BBrtrcEt.js → _server.ts-xXEIfBqh.js} +2 -2
- package/dist/web/server/chunks/{_server.ts-BBrtrcEt.js.map → _server.ts-xXEIfBqh.js.map} +1 -1
- package/dist/web/server/chunks/{button-C1GVS_oY.js → button-svhFQKMs.js} +21 -3
- package/dist/web/server/chunks/{button-C1GVS_oY.js.map → button-svhFQKMs.js.map} +1 -1
- package/dist/web/server/chunks/{hooks.server-DG_lyHkY.js → hooks.server-BschOmH0.js} +3 -3
- package/dist/web/server/chunks/{hooks.server-DG_lyHkY.js.map → hooks.server-BschOmH0.js.map} +1 -1
- package/dist/web/server/chunks/{ws-handlers-BQ2RtlNl.js → ws-handlers-DmdbIqkc.js} +61 -16
- package/dist/web/server/chunks/ws-handlers-DmdbIqkc.js.map +1 -0
- package/dist/web/server/chunks/{ws-managers-DLQiiQnX.js → ws-managers-Cw_QNOpo.js} +2 -2
- package/dist/web/server/chunks/{ws-managers-DLQiiQnX.js.map → ws-managers-Cw_QNOpo.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 +6 -4
- package/src/tmux/pane.ts +35 -11
- package/src/utils/version.ts +1 -1
- package/tests/tmux/activity-line.test.ts +47 -0
- package/web/.svelte-kit/adapter-bun/.vite/manifest.json +3 -7
- package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_layout.6tlxP3iE.css +1 -0
- package/web/.svelte-kit/adapter-bun/chunks/button.js +21 -0
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +45 -15
- 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/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 +1 -1
- package/web/.svelte-kit/generated/server/internal.js +1 -1
- package/web/.svelte-kit/output/client/.vite/manifest.json +60 -60
- package/web/.svelte-kit/output/client/_app/immutable/assets/0.CiLJk_Xe.css +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DmEI2TOa.js → BPG41LQc.js} +13 -13
- package/web/.svelte-kit/output/client/_app/immutable/chunks/BxK27rIF.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DvtCSRbx.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Iym5fv6V.js +2 -0
- package/{dist/web/client/_app/immutable/chunks/Cotx9uI_.js → web/.svelte-kit/output/client/_app/immutable/chunks/ZzVAGtsj.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DXHW0aPL.js → app.BrdmX1nT.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.z3GFCeFl.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.DAnv2asW.js → 0.DX7LpCH-.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.CU8f4oNB.js → 1.LA4NLAbZ.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.BYpvCgtu.js → 2.CC3GVyR0.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.DuMzeRg3.js → 3.s97PqS3X.js} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/.vite/manifest.json +3 -7
- package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.6tlxP3iE.css +1 -0
- package/web/.svelte-kit/output/server/chunks/button.js +21 -0
- package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
- package/web/.svelte-kit/output/server/chunks/ws-handlers.js +45 -15
- 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/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 +1 -1
- 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/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/DtVU-s3j.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.CchjowOg.js +0 -1
- 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/DtVU-s3j.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.CchjowOg.js +0 -1
- 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,6 +1,6 @@
|
|
|
1
1
|
import "./exports-piA4c_uA.js";
|
|
2
|
-
import { c as parseWsPath, s as handleWsMessage, u as resizePane } from "./ws-handlers-
|
|
3
|
-
import { i as transcriptWsManager, n as sessionsWsManager, r as terminalWsManager } from "./ws-managers-
|
|
2
|
+
import { c as parseWsPath, s as handleWsMessage, u as resizePane } from "./ws-handlers-DmdbIqkc.js";
|
|
3
|
+
import { i as transcriptWsManager, n as sessionsWsManager, r as terminalWsManager } from "./ws-managers-Cw_QNOpo.js";
|
|
4
4
|
//#region .svelte-kit/adapter-bun/entries/hooks.server.js
|
|
5
5
|
const wsDataMap = /* @__PURE__ */ new WeakMap();
|
|
6
6
|
const CORS_ORIGIN = /^https?:\/\/(?:[a-z0-9-]+\.)*[a-z0-9-]+\.ts\.net(?::\d+)?$|^https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d+)?$/i;
|
|
@@ -98,4 +98,4 @@ const websocket = {
|
|
|
98
98
|
//#endregion
|
|
99
99
|
export { handle, websocket };
|
|
100
100
|
|
|
101
|
-
//# sourceMappingURL=hooks.server-
|
|
101
|
+
//# sourceMappingURL=hooks.server-BschOmH0.js.map
|
package/dist/web/server/chunks/{hooks.server-DG_lyHkY.js.map → hooks.server-BschOmH0.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.server-
|
|
1
|
+
{"version":3,"file":"hooks.server-BschOmH0.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/entries/hooks.server.js"],"sourcesContent":["import \"@sveltejs/kit\";\nimport { p as parseWsPath, h as handleWsMessage, r as resizePane } from \"../chunks/ws-handlers.js\";\nimport { s as sessionsWsManager, t as terminalWsManager, a as transcriptWsManager } from \"../chunks/ws-managers.js\";\nconst wsDataMap = /* @__PURE__ */ new WeakMap();\nconst CORS_ORIGIN = /^https?:\\/\\/(?:[a-z0-9-]+\\.)*[a-z0-9-]+\\.ts\\.net(?::\\d+)?$|^https?:\\/\\/(?:localhost|127\\.0\\.0\\.1)(?::\\d+)?$/i;\nfunction corsHeaders(origin) {\n return {\n \"Access-Control-Allow-Origin\": origin,\n \"Access-Control-Allow-Methods\": \"GET, POST, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n \"Access-Control-Max-Age\": \"600\",\n Vary: \"Origin\"\n };\n}\nconst handle = async ({ event, resolve }) => {\n const origin = event.request.headers.get(\"origin\");\n const crossSite = !!origin && origin !== event.url.origin && CORS_ORIGIN.test(origin);\n if (crossSite && event.request.method === \"OPTIONS\" && event.url.pathname.startsWith(\"/api/\")) {\n return new Response(null, { status: 204, headers: corsHeaders(origin) });\n }\n const connectionHeader = event.request.headers.get(\"connection\");\n const upgradeHeader = event.request.headers.get(\"upgrade\");\n if (connectionHeader?.toLowerCase().includes(\"upgrade\") && upgradeHeader?.toLowerCase() === \"websocket\") {\n const url = new URL(event.request.url);\n const parsed = parseWsPath(url.pathname);\n if (parsed) {\n await event.platform.server.upgrade(event.platform.request, {\n data: parsed\n });\n return new Response(null, { status: 101 });\n }\n }\n const response = await resolve(event);\n if (crossSite && event.url.pathname.startsWith(\"/api/\")) {\n for (const [name, value] of Object.entries(corsHeaders(origin))) response.headers.set(name, value);\n }\n return response;\n};\nconst websocket = {\n /**\n * Transcript snapshots are hundreds of kilobytes of JSON, and the phone\n * reading them is usually on the far side of a tailnet. The payloads are\n * highly repetitive, so deflate takes them down by roughly an order of\n * magnitude; the terminal's small frames pay a negligible amount of CPU.\n */\n perMessageDeflate: true,\n open(ws) {\n const data = ws.data;\n if (!data) return;\n const client = {\n send: (msg) => ws.send(msg),\n isOpen: () => ws.readyState === WebSocket.OPEN,\n close: () => ws.close(),\n getBufferedAmount: () => ws.bufferedAmount\n };\n wsDataMap.set(ws, { ...data, client });\n let accepted = false;\n if (data.type === \"sessions\") {\n accepted = sessionsWsManager.addClient(client);\n } else if (data.type === \"terminal\" && data.target) {\n accepted = terminalWsManager.addClient(client, data.target);\n } else if (data.type === \"transcript\" && data.target) {\n accepted = transcriptWsManager.addClient(client, data.target);\n }\n if (!accepted) {\n ws.close(1013, \"Max clients reached\");\n }\n },\n message(ws, message) {\n const msgStr = message.toString();\n const data = wsDataMap.get(ws);\n const target = data?.target;\n let handlers;\n if (target && data?.type === \"terminal\") {\n handlers = {\n resize: (cols, rows) => resizePane(target, cols, rows),\n historyRequest: (before, count) => terminalWsManager.requestHistory(data.client, target, before, count)\n };\n } else if (target && data?.type === \"transcript\") {\n handlers = {\n historyRequest: (before, count) => transcriptWsManager.requestHistory(data.client, target, before, count)\n };\n }\n const response = handleWsMessage(msgStr, handlers);\n if (response === \"pong\") {\n ws.send(\"pong\");\n }\n },\n close(ws) {\n const data = wsDataMap.get(ws);\n if (!data) return;\n if (data.type === \"sessions\") {\n sessionsWsManager.removeClient(data.client);\n } else if (data.type === \"terminal\") {\n terminalWsManager.removeClient(data.client, data.target);\n } else if (data.type === \"transcript\") {\n transcriptWsManager.removeClient(data.client, data.target);\n }\n wsDataMap.delete(ws);\n },\n error(ws, error) {\n const data = wsDataMap.get(ws);\n console.log(`[ws:${data?.type ?? \"unknown\"}] WebSocket error`, {\n code: error.code,\n message: error.message\n });\n if (data) {\n if (data.type === \"sessions\") {\n sessionsWsManager.removeClient(data.client);\n } else if (data.type === \"terminal\") {\n terminalWsManager.removeClient(data.client, data.target);\n } else if (data.type === \"transcript\") {\n transcriptWsManager.removeClient(data.client, data.target);\n }\n wsDataMap.delete(ws);\n }\n }\n};\nexport {\n handle,\n websocket\n};\n"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import { c as readLinks, d as updateSession, i as getSession, o as getSessionsDi
|
|
|
2
2
|
import { n as readNumber, r as readString, t as asRecord } from "./json-4v86y-Ft.js";
|
|
3
3
|
import { r as SESSIONS_DIR } from "./paths-6nWNmeI4.js";
|
|
4
4
|
import { t as isDictated } from "./dictation-marks-CgHF_2Qw.js";
|
|
5
|
-
import { n as wantsWidening, r as widenDetachedWindow } from "./geometry-CUMMOI9q.js";
|
|
6
5
|
import { i as getQueueSummary, n as enqueue } from "./message-queue-D4vYsMyd.js";
|
|
7
6
|
import { homedir } from "os";
|
|
8
7
|
import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, renameSync, statSync, writeFileSync } from "fs";
|
|
@@ -782,7 +781,7 @@ var JsonlTailer = class {
|
|
|
782
781
|
}
|
|
783
782
|
}
|
|
784
783
|
};
|
|
785
|
-
const execFileAsync = promisify(execFile);
|
|
784
|
+
const execFileAsync$1 = promisify(execFile);
|
|
786
785
|
function hardTimeout(p, ms, fallback) {
|
|
787
786
|
return new Promise((resolve) => {
|
|
788
787
|
const timer = setTimeout(() => resolve(fallback), ms);
|
|
@@ -797,7 +796,7 @@ function hardTimeout(p, ms, fallback) {
|
|
|
797
796
|
}
|
|
798
797
|
async function getAllPaneTitles() {
|
|
799
798
|
const result = /* @__PURE__ */ new Map();
|
|
800
|
-
const stdout = await hardTimeout(execFileAsync("tmux", [
|
|
799
|
+
const stdout = await hardTimeout(execFileAsync$1("tmux", [
|
|
801
800
|
"list-panes",
|
|
802
801
|
"-a",
|
|
803
802
|
"-F",
|
|
@@ -821,7 +820,7 @@ async function getAllPaneTitles() {
|
|
|
821
820
|
}
|
|
822
821
|
async function sendKeyAsync(target, key) {
|
|
823
822
|
try {
|
|
824
|
-
await execFileAsync("tmux", [
|
|
823
|
+
await execFileAsync$1("tmux", [
|
|
825
824
|
"send-keys",
|
|
826
825
|
"-t",
|
|
827
826
|
target,
|
|
@@ -833,7 +832,7 @@ async function sendKeyAsync(target, key) {
|
|
|
833
832
|
}
|
|
834
833
|
}
|
|
835
834
|
async function capturePaneContentAsync(target, withColor = false) {
|
|
836
|
-
return hardTimeout(execFileAsync("tmux", withColor ? [
|
|
835
|
+
return hardTimeout(execFileAsync$1("tmux", withColor ? [
|
|
837
836
|
"capture-pane",
|
|
838
837
|
"-p",
|
|
839
838
|
"-e",
|
|
@@ -849,16 +848,20 @@ async function capturePaneContentAsync(target, withColor = false) {
|
|
|
849
848
|
timeout: 1e3
|
|
850
849
|
}).then((r) => r.stdout), 1500, null);
|
|
851
850
|
}
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
851
|
+
const ACTIVITY_LINE = /^\s*[⠀-⣿✻✢✳✶✽·]\s+(\S[^…]*…)/;
|
|
852
|
+
function readActivityLine(content) {
|
|
853
|
+
if (!content) return null;
|
|
854
|
+
for (const line of content.split("\n").slice(-12)) {
|
|
855
|
+
const m = ACTIVITY_LINE.exec(line);
|
|
856
|
+
if (m) return m[1].trim();
|
|
857
|
+
}
|
|
858
|
+
return null;
|
|
856
859
|
}
|
|
857
860
|
function isPaneShowingIdlePrompt(content) {
|
|
858
861
|
if (!content) return false;
|
|
859
862
|
const bottom = content.split("\n").slice(-12);
|
|
860
863
|
const joined = bottom.join("\n");
|
|
861
|
-
if (
|
|
864
|
+
if (readActivityLine(content) !== null) return false;
|
|
862
865
|
if (/esc to interrupt|esc to cancel|ctrl\+c to interrupt/i.test(joined)) return false;
|
|
863
866
|
if (bottom.some((line) => /^\s*[^\w\s❯│>]\s+\S+…/.test(line))) return false;
|
|
864
867
|
if (/Do you want|❯\s+\d+\./.test(joined)) return false;
|
|
@@ -1186,6 +1189,45 @@ function readPromptOptions(content, mode = {}) {
|
|
|
1186
1189
|
}
|
|
1187
1190
|
return choice;
|
|
1188
1191
|
}
|
|
1192
|
+
const execFileAsync = promisify(execFile);
|
|
1193
|
+
const STANDARD_PANE_WIDTH = 200;
|
|
1194
|
+
const STANDARD_PANE_HEIGHT = 50;
|
|
1195
|
+
const MIN_USEFUL_PANE_WIDTH = 160;
|
|
1196
|
+
function sizeArgsForNewSession() {
|
|
1197
|
+
return [
|
|
1198
|
+
"-x",
|
|
1199
|
+
String(STANDARD_PANE_WIDTH),
|
|
1200
|
+
"-y",
|
|
1201
|
+
String(STANDARD_PANE_HEIGHT)
|
|
1202
|
+
];
|
|
1203
|
+
}
|
|
1204
|
+
function wantsWidening(pane) {
|
|
1205
|
+
return pane.attached === 0 && pane.width < MIN_USEFUL_PANE_WIDTH;
|
|
1206
|
+
}
|
|
1207
|
+
async function widenDetachedWindow(target) {
|
|
1208
|
+
try {
|
|
1209
|
+
await execFileAsync("tmux", [
|
|
1210
|
+
"resize-window",
|
|
1211
|
+
"-t",
|
|
1212
|
+
target,
|
|
1213
|
+
"-x",
|
|
1214
|
+
String(STANDARD_PANE_WIDTH),
|
|
1215
|
+
"-y",
|
|
1216
|
+
String(STANDARD_PANE_HEIGHT)
|
|
1217
|
+
], { timeout: 1e3 });
|
|
1218
|
+
await execFileAsync("tmux", [
|
|
1219
|
+
"set-option",
|
|
1220
|
+
"-w",
|
|
1221
|
+
"-t",
|
|
1222
|
+
target,
|
|
1223
|
+
"window-size",
|
|
1224
|
+
"latest"
|
|
1225
|
+
], { timeout: 1e3 });
|
|
1226
|
+
return true;
|
|
1227
|
+
} catch {
|
|
1228
|
+
return false;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1189
1231
|
const TAIL_BYTES = 65536;
|
|
1190
1232
|
const RESOLVE_RETRY_POLLS = 20;
|
|
1191
1233
|
const paths = /* @__PURE__ */ new Map();
|
|
@@ -1561,10 +1603,13 @@ async function captureAndSyncSessions() {
|
|
|
1561
1603
|
});
|
|
1562
1604
|
} else idleLookTicks.set(session.id, ticks);
|
|
1563
1605
|
} else idleLookTicks.delete(session.id);
|
|
1564
|
-
if (session.state === "idle"
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1606
|
+
if (session.state === "idle") {
|
|
1607
|
+
const activity = readActivityLine(content);
|
|
1608
|
+
if (activity) apply(session, {
|
|
1609
|
+
state: "busy",
|
|
1610
|
+
current_action: activity
|
|
1611
|
+
});
|
|
1612
|
+
}
|
|
1568
1613
|
}));
|
|
1569
1614
|
if (idleLookTicks.size > 0) {
|
|
1570
1615
|
const live = new Set(sessions.map((s) => s.id));
|
|
@@ -2538,6 +2583,6 @@ function parseWsPath(pathname) {
|
|
|
2538
2583
|
return null;
|
|
2539
2584
|
}
|
|
2540
2585
|
//#endregion
|
|
2541
|
-
export { getSavedProjects as a, parseWsPath as c, saveProject as d,
|
|
2586
|
+
export { getSavedProjects as a, parseWsPath as c, saveProject as d, sizeArgsForNewSession as f, getEnrichedSessionsAsync as i, removeProject as l, TerminalWsManager as n, getSettings as o, updateSettings as p, TranscriptWsManager as r, handleWsMessage as s, SessionsWsManager as t, resizePane as u };
|
|
2542
2587
|
|
|
2543
|
-
//# sourceMappingURL=ws-handlers-
|
|
2588
|
+
//# sourceMappingURL=ws-handlers-DmdbIqkc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-handlers-DmdbIqkc.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 { 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$1 = 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$1(\"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$1(\"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$1(\"tmux\", args, {\n encoding: \"utf-8\",\n timeout: 1e3\n }).then((r) => r.stdout),\n 1500,\n null\n );\n}\nconst ACTIVITY_LINE = /^\\s*[⠀-⣿✻✢✳✶✽·]\\s+(\\S[^…]*…)/;\nfunction readActivityLine(content) {\n if (!content) return null;\n for (const line of content.split(\"\\n\").slice(-12)) {\n const m = ACTIVITY_LINE.exec(line);\n if (m) return m[1].trim();\n }\n return null;\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 (readActivityLine(content) !== null) 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 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}\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\") {\n const activity = readActivityLine(content);\n if (activity) apply(session, { state: \"busy\", current_action: activity });\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 sizeArgsForNewSession as b,\n getEnrichedSessionsAsync as c,\n getSettings as d,\n TranscriptWsManager as e,\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,4 +1,4 @@
|
|
|
1
|
-
import { n as TerminalWsManager, r as TranscriptWsManager, t as SessionsWsManager } from "./ws-handlers-
|
|
1
|
+
import { n as TerminalWsManager, r as TranscriptWsManager, t as SessionsWsManager } from "./ws-handlers-DmdbIqkc.js";
|
|
2
2
|
//#region .svelte-kit/adapter-bun/chunks/ws-managers.js
|
|
3
3
|
const g = globalThis;
|
|
4
4
|
const sessionsWsManager = g.__claudeMuxSessionsWsManager ?? (g.__claudeMuxSessionsWsManager = new SessionsWsManager({ debug: true }));
|
|
@@ -10,4 +10,4 @@ function broadcastSessions() {
|
|
|
10
10
|
//#endregion
|
|
11
11
|
export { transcriptWsManager as i, sessionsWsManager as n, terminalWsManager as r, broadcastSessions as t };
|
|
12
12
|
|
|
13
|
-
//# sourceMappingURL=ws-managers-
|
|
13
|
+
//# sourceMappingURL=ws-managers-Cw_QNOpo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-managers-
|
|
1
|
+
{"version":3,"file":"ws-managers-Cw_QNOpo.js","names":[],"sources":["../../../../web/.svelte-kit/adapter-bun/chunks/ws-managers.js"],"sourcesContent":["import { S as SessionsWsManager, T as TerminalWsManager, e as TranscriptWsManager } from \"./ws-handlers.js\";\nconst g = globalThis;\nconst sessionsWsManager = g.__claudeMuxSessionsWsManager ?? (g.__claudeMuxSessionsWsManager = new SessionsWsManager({ debug: true }));\nconst terminalWsManager = g.__claudeMuxTerminalWsManager ?? (g.__claudeMuxTerminalWsManager = new TerminalWsManager({ debug: true }));\nconst transcriptWsManager = g.__claudeMuxTranscriptWsManager ?? (g.__claudeMuxTranscriptWsManager = new TranscriptWsManager({ debug: true }));\nfunction broadcastSessions() {\n sessionsWsManager.broadcastNow();\n}\nexport {\n transcriptWsManager as a,\n broadcastSessions as b,\n sessionsWsManager as s,\n terminalWsManager as t\n};\n"],"mappings":";;AACA,MAAM,IAAI;AACV,MAAM,oBAAoB,EAAE,iCAAiC,EAAE,+BAA+B,IAAI,kBAAkB,EAAE,OAAO,KAAK,CAAC;AACnI,MAAM,oBAAoB,EAAE,iCAAiC,EAAE,+BAA+B,IAAI,kBAAkB,EAAE,OAAO,KAAK,CAAC;AACnI,MAAM,sBAAsB,EAAE,mCAAmC,EAAE,iCAAiC,IAAI,oBAAoB,EAAE,OAAO,KAAK,CAAC;AAC3I,SAAS,oBAAoB;CAC3B,kBAAkB,aAAa;AACjC"}
|
package/dist/web/server/index.js
CHANGED
|
@@ -1235,7 +1235,7 @@ const options = {
|
|
|
1235
1235
|
app: ({ head, body, assets, nonce, env }) => "<!doctype html>\n<html lang=\"en\" class=\"dark\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\" />\n <meta name=\"theme-color\" content=\"#111111\" />\n <!-- PWA / iOS home-screen: open fullscreen (standalone) instead of inside the browser chrome -->\n <link rel=\"manifest\" href=\"/manifest.webmanifest\" />\n <meta name=\"mobile-web-app-capable\" content=\"yes\" />\n <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n <meta name=\"apple-mobile-web-app-title\" content=\"claude-mux\" />\n <link rel=\"apple-touch-icon\" href=\"/apple-touch-icon.png\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
|
|
1236
1236
|
error
|
|
1237
1237
|
},
|
|
1238
|
-
version_hash: "
|
|
1238
|
+
version_hash: "1g6cmxc"
|
|
1239
1239
|
};
|
|
1240
1240
|
async function get_hooks() {let websocket;
|
|
1241
1241
|
let handle;
|
|
@@ -1243,7 +1243,7 @@ async function get_hooks() {let websocket;
|
|
|
1243
1243
|
let handleError;
|
|
1244
1244
|
let handleValidationError;
|
|
1245
1245
|
let init;
|
|
1246
|
-
({handle,websocket, handleFetch, handleError, handleValidationError, init} = await import("./chunks/hooks.server-
|
|
1246
|
+
({handle,websocket, handleFetch, handleError, handleValidationError, init} = await import("./chunks/hooks.server-BschOmH0.js"));
|
|
1247
1247
|
let reroute;
|
|
1248
1248
|
let transport;
|
|
1249
1249
|
return {websocket,
|