@codedeck/codedeck 2026.3.38 → 2026.3.40

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.
@@ -1,6 +1,5 @@
1
1
  /**
2
2
  * Sub-session manager — creates/stops/rebuilds tmux sessions for sub-sessions.
3
- * Sub-sessions are named deck_sub_{id} and can run claude-code, codex, opencode, or shell.
4
3
  */
5
4
  export interface SubSessionRecord {
6
5
  id: string;
@@ -8,28 +7,18 @@ export interface SubSessionRecord {
8
7
  shellBin?: string | null;
9
8
  cwd?: string | null;
10
9
  ccSessionId?: string | null;
10
+ codexSessionId?: string | null;
11
11
  codexModel?: string | null;
12
12
  geminiSessionId?: string | null;
13
13
  fresh?: boolean;
14
- /** Pre-launch file snapshot for snapshot-diff based file discovery (internal) */
15
14
  _fileSnapshot?: Set<string>;
16
- /** Callback when Gemini session ID is discovered from new file (internal) */
17
15
  _onGeminiDiscovered?: (sessionId: string) => void;
18
16
  }
19
17
  export declare function subSessionName(id: string): string;
20
- /** Launch a sub-session tmux session. */
21
18
  export declare function startSubSession(sub: SubSessionRecord): Promise<void>;
22
- /** Kill a sub-session tmux session. */
23
19
  export declare function stopSubSession(sessionName: string): Promise<void>;
24
- /** Rebuild all active sub-sessions that are not currently running.
25
- * For already-running CC/Codex sub-sessions, ensure the JSONL watcher is active. */
26
20
  export declare function rebuildSubSessions(subSessions: SubSessionRecord[]): Promise<void>;
27
- /** Detect available shell binaries. */
28
21
  export declare function detectShells(): Promise<string[]>;
29
- /**
30
- * Read the last response from a sub-session after idle.
31
- * Returns { status: 'working' } if not idle, or { status: 'idle', response: string } if idle.
32
- */
33
22
  export declare function readSubSessionResponse(sessionName: string): Promise<{
34
23
  status: 'working' | 'idle';
35
24
  response?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"subsession-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,yCAAyC;AACzC,wBAAsB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG1E;AAED,uCAAuC;AACvC,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE;AAED;qFACqF;AACrF,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDvF;AAoDD,uCAAuC;AACvC,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBtD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B5D"}
1
+ {"version":3,"file":"subsession-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAA6B;AAE/E,wBAAsB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C1E;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvF;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAatD;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc5H"}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Sub-session manager — creates/stops/rebuilds tmux sessions for sub-sessions.
4
- * Sub-sessions are named deck_sub_{id} and can run claude-code, codex, opencode, or shell.
5
4
  */
6
5
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
6
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -19,246 +18,120 @@ const timeline_store_js_1 = require("./timeline-store.js");
19
18
  const session_store_js_1 = require("../store/session-store.js");
20
19
  const node_fs_1 = require("node:fs");
21
20
  const node_path_1 = __importDefault(require("node:path"));
22
- const logger_js_1 = __importDefault(require("../util/logger.js"));
23
- function subSessionName(id) {
24
- return `deck_sub_${id}`;
25
- }
26
- /** Launch a sub-session tmux session. */
21
+ function subSessionName(id) { return `deck_sub_${id}`; }
27
22
  async function startSubSession(sub) {
28
23
  const sessionName = subSessionName(sub.id);
29
24
  const agentType = sub.type;
30
25
  const driver = (0, session_manager_js_1.getDriver)(agentType);
31
- const exists = await (0, tmux_js_1.sessionExists)(sessionName);
32
- if (exists) {
33
- logger_js_1.default.info({ sessionName }, 'Sub-session already running');
26
+ if (await (0, tmux_js_1.sessionExists)(sessionName))
34
27
  return;
28
+ // For Codex: generate explicit UUID before launch to ensure perfect isolation
29
+ let codexSessionId = sub.codexModel ? undefined : undefined; // placeholder for logic
30
+ if (agentType === 'codex') {
31
+ const { randomUUID } = await import('node:crypto');
32
+ sub.codexSessionId = sub.codexSessionId ?? randomUUID();
35
33
  }
36
34
  const launchCmd = driver.buildLaunchCommand(sessionName, {
37
35
  cwd: sub.cwd ?? undefined,
38
36
  ...(sub.shellBin ? { shellBin: sub.shellBin } : {}),
39
37
  ...(sub.ccSessionId ? { ccSessionId: sub.ccSessionId } : {}),
40
38
  ...(sub.codexModel ? { codexModel: sub.codexModel } : {}),
39
+ ...(sub.codexSessionId ? { codexSessionId: sub.codexSessionId ?? undefined } : {}),
41
40
  ...(sub.geminiSessionId ? { geminiSessionId: sub.geminiSessionId } : {}),
42
41
  ...(sub.fresh ? { fresh: true } : {}),
43
42
  });
44
43
  await (0, tmux_js_1.newSession)(sessionName, launchCmd, { cwd: sub.cwd ?? undefined });
45
- // Register in session-store so command-handler can look up agentType (e.g. for Codex delayed-Enter)
46
- // ccSessionId is stored so that restoreFromStore can use startWatchingFile (not directory scan) if needed.
47
- (0, session_store_js_1.upsertSession)({ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running', projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined, restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now() });
48
- logger_js_1.default.info({ sessionName, type: sub.type }, 'Sub-session started');
49
- // Kick off pipe-pane for any browsers that subscribed before the tmux session existed
50
- const { terminalStreamer } = await import('./terminal-streamer.js');
51
- terminalStreamer.retryPipeIfSubscribers(sessionName);
52
- // Start JSONL watcher for CC sub-sessions pointing at specific file
44
+ (0, session_store_js_1.upsertSession)({
45
+ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running',
46
+ projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined,
47
+ codexSessionId: sub.codexSessionId ?? undefined,
48
+ restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now()
49
+ });
50
+ // Start Watchers
53
51
  if (agentType === 'claude-code' && sub.ccSessionId && sub.cwd) {
54
52
  const { startWatchingFile, claudeProjectDir } = await import('./jsonl-watcher.js');
55
- const projectDir = claudeProjectDir(sub.cwd);
56
- const jsonlPath = node_path_1.default.join(projectDir, `${sub.ccSessionId}.jsonl`);
57
- startWatchingFile(sessionName, jsonlPath).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'jsonl-watcher startWatchingFile failed'));
53
+ startWatchingFile(sessionName, node_path_1.default.join(claudeProjectDir(sub.cwd), `${sub.ccSessionId}.jsonl`));
58
54
  }
59
- // Start gemini watcher for gemini sub-sessions
60
- if (agentType === 'gemini') {
61
- if (sub.geminiSessionId) {
62
- const { startWatching } = await import('./gemini-watcher.js');
63
- startWatching(sessionName, sub.geminiSessionId).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatching failed'));
64
- }
65
- else if (sub._fileSnapshot) {
66
- // resolveSessionId failed — use snapshot diff to find the new file
67
- const { startWatchingNew } = await import('./gemini-watcher.js');
68
- startWatchingNew(sessionName, sub._fileSnapshot, (sessionId, _filePath) => {
69
- logger_js_1.default.info({ sessionName, sessionId }, 'Discovered Gemini session ID from new file');
70
- // Persist via onGeminiDiscovered callback if provided
71
- sub._onGeminiDiscovered?.(sessionId);
72
- }).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatchingNew failed'));
73
- }
74
- else {
75
- const { startWatchingLatest } = await import('./gemini-watcher.js');
76
- startWatchingLatest(sessionName).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatchingLatest failed'));
77
- }
55
+ else if (agentType === 'codex' && sub.codexSessionId) {
56
+ const { startWatchingById } = await import('./codex-watcher.js');
57
+ void startWatchingById(sessionName, sub.codexSessionId, sub.codexModel ?? undefined);
78
58
  }
79
- // Start codex JSONL watcher for codex sub-sessions.
80
- // Start dir-scan watcher immediately (for history), then async-capture the UUID
81
- // of the specific rollout file Codex creates for this launch and switch to it,
82
- // so that multiple sub-sessions with the same cwd don't permanently share the same file.
83
- if (agentType === 'codex' && sub.cwd) {
84
- const cwd = sub.cwd;
85
- const model = sub.codexModel ?? undefined;
86
- const launchTime = Date.now();
87
- const { startWatching: startCodexWatching } = await import('./codex-watcher.js');
88
- startCodexWatching(sessionName, cwd, model).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'codex-watcher startWatching failed'));
89
- // Async: wait for the specific rollout file and switch to it
90
- void (async () => {
91
- try {
92
- const { extractNewRolloutUuid, findRolloutPathByUuid, startWatchingSpecificFile, stopWatching } = await import('./codex-watcher.js');
93
- const uuid = await extractNewRolloutUuid(cwd, launchTime);
94
- if (!uuid)
95
- return; // timed out — keep dir-scan watcher
96
- const rolloutPath = await findRolloutPathByUuid(uuid);
97
- if (!rolloutPath)
98
- return;
99
- stopWatching(sessionName);
100
- await startWatchingSpecificFile(sessionName, rolloutPath, model);
101
- logger_js_1.default.info({ sessionName, uuid, rolloutPath }, 'Codex sub-session switched to specific rollout file');
102
- }
103
- catch (e) {
104
- logger_js_1.default.warn({ err: e, sessionName }, 'Codex sub-session UUID capture failed');
105
- }
106
- })();
107
- }
108
- if (driver.postLaunch) {
109
- const { capturePane, sendKey } = await import('../agent/tmux.js');
110
- driver.postLaunch(() => capturePane(sessionName), (key) => sendKey(sessionName, key)).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session postLaunch failed'));
59
+ else if (agentType === 'gemini' && sub.geminiSessionId) {
60
+ const { startWatching } = await import('./gemini-watcher.js');
61
+ startWatching(sessionName, sub.geminiSessionId);
111
62
  }
112
63
  }
113
- /** Kill a sub-session tmux session. */
114
64
  async function stopSubSession(sessionName) {
115
65
  await (0, tmux_js_1.killSession)(sessionName).catch(() => { });
116
- const { stopWatching } = await import('./jsonl-watcher.js');
117
- stopWatching(sessionName);
118
- const { stopWatching: stopCodexWatching } = await import('./codex-watcher.js');
119
- stopCodexWatching(sessionName);
120
- const { stopWatching: stopGeminiWatching } = await import('./gemini-watcher.js');
121
- stopGeminiWatching(sessionName);
122
- logger_js_1.default.info({ sessionName }, 'Sub-session stopped');
66
+ (await import('./jsonl-watcher.js')).stopWatching(sessionName);
67
+ (await import('./codex-watcher.js')).stopWatching(sessionName);
68
+ (await import('./gemini-watcher.js')).stopWatching(sessionName);
123
69
  }
124
- /** Rebuild all active sub-sessions that are not currently running.
125
- * For already-running CC/Codex sub-sessions, ensure the JSONL watcher is active. */
126
70
  async function rebuildSubSessions(subSessions) {
127
71
  const { startWatchingFile, claudeProjectDir, isWatching } = await import('./jsonl-watcher.js');
128
- const { startWatching: startCodexWatching, isWatching: isCodexWatching } = await import('./codex-watcher.js');
129
- const { startWatching: startGeminiWatching, startWatchingLatest: startGeminiWatchingLatest, isWatching: isGeminiWatching } = await import('./gemini-watcher.js');
72
+ const { startWatchingById, isWatching: isCodexWatching, isFileClaimedByOther } = await import('./codex-watcher.js');
73
+ const { startWatching: startGeminiWatching, isWatching: isGeminiWatching } = await import('./gemini-watcher.js');
130
74
  for (const sub of subSessions) {
131
75
  const sessionName = subSessionName(sub.id);
132
76
  const exists = await (0, tmux_js_1.sessionExists)(sessionName);
133
77
  if (!exists) {
134
- await startSubSession(sub).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session rebuild failed'));
135
- }
136
- else if (sub.type === 'claude-code' && sub.ccSessionId && sub.cwd && !isWatching(sessionName)) {
137
- // Already running — restore the JSONL watcher (lost on daemon restart)
138
- const projectDir = claudeProjectDir(sub.cwd);
139
- const jsonlPath = node_path_1.default.join(projectDir, `${sub.ccSessionId}.jsonl`);
140
- startWatchingFile(sessionName, jsonlPath).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session watcher restore failed'));
141
- logger_js_1.default.info({ sessionName, jsonlPath }, 'Restored JSONL watcher for running sub-session');
78
+ await startSubSession(sub).catch(() => { });
142
79
  }
143
- else if (sub.type === 'codex' && sub.cwd && !isCodexWatching(sessionName)) {
144
- // Already running — restore the codex JSONL watcher (lost on daemon restart)
145
- startCodexWatching(sessionName, sub.cwd, sub.codexModel ?? undefined).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Codex watcher restore failed'));
146
- logger_js_1.default.info({ sessionName }, 'Restored codex JSONL watcher for running sub-session');
147
- }
148
- else if (sub.type === 'gemini' && !isGeminiWatching(sessionName)) {
149
- // Already running — restore the gemini watcher (lost on daemon restart)
150
- // Try stored UUID first, then extract from process args, then fall back to latest
151
- let uuid = sub.geminiSessionId ?? null;
152
- if (!uuid) {
153
- uuid = await extractGeminiUuidFromProcess(sessionName);
154
- if (uuid) {
155
- logger_js_1.default.info({ sessionName, geminiSessionId: uuid }, 'Extracted Gemini UUID from process args');
156
- }
157
- }
158
- if (uuid) {
159
- startGeminiWatching(sessionName, uuid).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Gemini watcher restore failed'));
80
+ else {
81
+ const stored = (0, session_store_js_1.getSession)(sessionName);
82
+ if (sub.type === 'claude-code' && sub.ccSessionId && sub.cwd && !isWatching(sessionName)) {
83
+ startWatchingFile(sessionName, node_path_1.default.join(claudeProjectDir(sub.cwd), `${sub.ccSessionId}.jsonl`));
160
84
  }
161
- else {
162
- startGeminiWatchingLatest(sessionName).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Gemini watcher restore failed'));
85
+ else if (sub.type === 'codex' && !isCodexWatching(sessionName)) {
86
+ const uuid = stored?.codexSessionId;
87
+ if (uuid && !isFileClaimedByOther(sessionName, uuid)) {
88
+ startWatchingById(sessionName, uuid, sub.codexModel ?? undefined);
89
+ }
163
90
  }
164
- logger_js_1.default.info({ sessionName, geminiSessionId: uuid }, 'Restored gemini watcher for running sub-session');
165
- }
166
- // Ensure agentType is in session-store for all running sub-sessions (needed by command-handler)
167
- if (exists) {
168
- (0, session_store_js_1.upsertSession)({ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running', projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined, restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now() });
169
- }
170
- }
171
- }
172
- /**
173
- * Extract the Gemini --resume UUID from a running tmux session's process tree.
174
- * Returns the UUID string, or null if not found or if it's 'latest'.
175
- */
176
- async function extractGeminiUuidFromProcess(sessionName) {
177
- try {
178
- const { execFile: execFileCb } = await import('node:child_process');
179
- const { promisify } = await import('node:util');
180
- const execFileAsync = promisify(execFileCb);
181
- // Get pane PID from tmux
182
- const { stdout: panePid } = await execFileAsync('tmux', ['display', '-t', sessionName, '-p', '#{pane_pid}']);
183
- const pid = panePid.trim();
184
- if (!pid)
185
- return null;
186
- // Find gemini process in the process tree (child or grandchild)
187
- // Use ps to get all descendants and their command lines
188
- const { stdout: psOut } = await execFileAsync('ps', ['--ppid', pid, '-o', 'pid=,args=', '--no-headers']).catch(() => ({ stdout: '' }));
189
- const checkLine = (line) => {
190
- if (!line.includes('gemini'))
191
- return null;
192
- const match = line.match(/--resume\s+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);
193
- return match ? match[1] : null;
194
- };
195
- for (const line of psOut.split('\n')) {
196
- const uuid = checkLine(line);
197
- if (uuid)
198
- return uuid;
199
- // Check grandchildren
200
- const childPid = line.trim().split(/\s+/)[0];
201
- if (!childPid)
202
- continue;
203
- const { stdout: grandPs } = await execFileAsync('ps', ['--ppid', childPid, '-o', 'pid=,args=', '--no-headers']).catch(() => ({ stdout: '' }));
204
- for (const gline of grandPs.split('\n')) {
205
- const guuid = checkLine(gline);
206
- if (guuid)
207
- return guuid;
91
+ else if (sub.type === 'gemini' && !isGeminiWatching(sessionName)) {
92
+ if (sub.geminiSessionId)
93
+ startGeminiWatching(sessionName, sub.geminiSessionId);
208
94
  }
95
+ (0, session_store_js_1.upsertSession)({
96
+ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running',
97
+ projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined,
98
+ codexSessionId: stored?.codexSessionId,
99
+ restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now()
100
+ });
209
101
  }
210
102
  }
211
- catch {
212
- // best-effort
213
- }
214
- return null;
215
103
  }
216
- /** Detect available shell binaries. */
217
104
  async function detectShells() {
218
105
  const CANDIDATES = ['fish', 'zsh', 'bash', 'sh'];
219
106
  const SEARCH_PATHS = ['/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin'];
220
107
  const shells = [];
221
- // Include process.env.SHELL first if it exists
222
108
  const envShell = process.env.SHELL;
223
- if (envShell && (0, node_fs_1.existsSync)(envShell) && !shells.includes(envShell)) {
109
+ if (envShell && (0, node_fs_1.existsSync)(envShell))
224
110
  shells.push(envShell);
225
- }
226
111
  for (const dir of SEARCH_PATHS) {
227
112
  for (const candidate of CANDIDATES) {
228
113
  const full = `${dir}/${candidate}`;
229
- if ((0, node_fs_1.existsSync)(full) && !shells.includes(full)) {
114
+ if ((0, node_fs_1.existsSync)(full) && !shells.includes(full))
230
115
  shells.push(full);
231
- }
232
116
  }
233
117
  }
234
118
  return shells;
235
119
  }
236
- /**
237
- * Read the last response from a sub-session after idle.
238
- * Returns { status: 'working' } if not idle, or { status: 'idle', response: string } if idle.
239
- */
240
120
  async function readSubSessionResponse(sessionName) {
241
121
  const { capturePane } = await import('../agent/tmux.js');
242
122
  const { detectStatus } = await import('../agent/detect.js');
243
123
  const lines = await capturePane(sessionName).catch(() => []);
244
- const exists = await (0, tmux_js_1.sessionExists)(sessionName);
245
- if (!exists)
124
+ if (!(await (0, tmux_js_1.sessionExists)(sessionName)))
246
125
  return { status: 'idle', response: '' };
247
- // Look up actual agent type from session store (set by startSubSession/rebuildSubSessions)
248
126
  const { getSession } = await import('../store/session-store.js');
249
- const sessionRecord = getSession(sessionName);
250
- const agentType = (sessionRecord?.agentType ?? 'shell');
251
- const status = detectStatus(lines, agentType);
127
+ const record = getSession(sessionName);
128
+ const status = detectStatus(lines, (record?.agentType ?? 'shell'));
252
129
  if (status !== 'idle')
253
130
  return { status: 'working' };
254
- // Read from timeline store: find events after last user.message
255
131
  const events = timeline_store_js_1.timelineStore.read(sessionName);
256
132
  const lastUserMsgIdx = events.map((e) => e.type).lastIndexOf('user.message');
257
133
  const responseEvents = lastUserMsgIdx >= 0 ? events.slice(lastUserMsgIdx + 1) : events;
258
- const textParts = responseEvents
259
- .filter((e) => e.type === 'assistant.text')
260
- .map((e) => String(e.payload.text ?? ''));
261
- const response = textParts.length > 0 ? textParts.join('\n') : lines.join('\n');
262
- return { status: 'idle', response };
134
+ const textParts = responseEvents.filter((e) => e.type === 'assistant.text').map((e) => String(e.payload.text ?? ''));
135
+ return { status: 'idle', response: textParts.length > 0 ? textParts.join('\n') : lines.join('\n') };
263
136
  }
264
137
  //# sourceMappingURL=subsession-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subsession-manager.js","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subsession-manager.js","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAyBH,wCAA+E;AAE/E,0CA4CC;AAED,wCAKC;AAED,gDA8BC;AAED,oCAaC;AAED,wDAcC;AA3ID,8CAA0E;AAC1E,oEAAwD;AAExD,2DAAoD;AACpD,gEAAsE;AACtE,qCAAqC;AACrC,0DAA6B;AAiB7B,SAAgB,cAAc,CAAC,EAAU,IAAY,OAAO,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;AAExE,KAAK,UAAU,eAAe,CAAC,GAAqB;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAiB,CAAC;IACxC,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,MAAM,IAAA,uBAAa,EAAC,WAAW,CAAC;QAAE,OAAO;IAE7C,8EAA8E;IAC9E,IAAI,cAAc,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,wBAAwB;IACrF,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,UAAU,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACvD,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,SAAS;QACzB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEV,MAAM,IAAA,oBAAU,EAAC,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;IAExE,IAAA,gCAAa,EAAC;QACZ,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS;QAC9F,UAAU,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACpE,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC/C,QAAQ,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACjF,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,SAAS,KAAK,aAAa,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QAC9D,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACnF,iBAAiB,CAAC,WAAW,EAAE,mBAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,WAAW,QAAQ,CAAC,CAAC,CAAC;IACnG,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjE,KAAK,iBAAiB,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;IACvF,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACzD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC9D,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;AAClE,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,WAA+B;IACtE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC/F,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpH,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjH,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAA,6BAAU,EAAC,WAAW,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzF,iBAAiB,CAAC,WAAW,EAAE,mBAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,WAAW,QAAQ,CAAC,CAAC,CAAC;YACnG,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,MAAM,EAAE,cAAc,CAAC;gBACpC,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;oBACrD,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,IAAI,GAAG,CAAC,eAAe;oBAAE,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YACjF,CAAC;YACD,IAAA,gCAAa,EAAC;gBACZ,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS;gBAC9F,UAAU,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;gBACpE,cAAc,EAAE,MAAM,EAAE,cAAc;gBACtC,QAAQ,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACjF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACjF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC,IAAI,QAAQ,IAAI,IAAA,oBAAU,EAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;YACnC,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IAC9D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC,MAAM,IAAA,uBAAa,EAAC,WAAW,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACjF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,IAAI,OAAO,CAAQ,CAAC,CAAC;IAC1E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,iCAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvF,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACrH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codedeck/codedeck",
3
- "version": "2026.3.38",
3
+ "version": "2026.3.40",
4
4
  "description": "Open-source remote command center for AI coding agents — control Claude Code, Codex, Gemini CLI, OpenCode from browser and mobile",
5
5
  "license": "MIT",
6
6
  "repository": {