@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.
- package/dist/agent/session-manager.js.map +1 -1
- package/dist/daemon/codex-watcher.d.ts +8 -35
- package/dist/daemon/codex-watcher.d.ts.map +1 -1
- package/dist/daemon/codex-watcher.js +161 -378
- package/dist/daemon/codex-watcher.js.map +1 -1
- package/dist/daemon/gemini-watcher.d.ts +15 -35
- package/dist/daemon/gemini-watcher.d.ts.map +1 -1
- package/dist/daemon/gemini-watcher.js +105 -305
- package/dist/daemon/gemini-watcher.js.map +1 -1
- package/dist/daemon/subsession-manager.d.ts +1 -12
- package/dist/daemon/subsession-manager.d.ts.map +1 -1
- package/dist/daemon/subsession-manager.js +53 -180
- package/dist/daemon/subsession-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
117
|
-
stopWatching(sessionName);
|
|
118
|
-
|
|
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 {
|
|
129
|
-
const { startWatching: startGeminiWatching,
|
|
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((
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
|
250
|
-
const
|
|
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
|
-
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codedeck/codedeck",
|
|
3
|
-
"version": "2026.3.
|
|
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": {
|