sensorium-mcp 3.0.70 → 3.0.72
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/config.d.ts +48 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +123 -21
- package/dist/config.js.map +1 -1
- package/dist/dashboard/presets.d.ts.map +1 -1
- package/dist/dashboard/presets.js +0 -6
- package/dist/dashboard/presets.js.map +1 -1
- package/dist/dashboard/routes/claude.d.ts +12 -0
- package/dist/dashboard/routes/claude.d.ts.map +1 -0
- package/dist/dashboard/routes/claude.js +80 -0
- package/dist/dashboard/routes/claude.js.map +1 -0
- package/dist/dashboard/routes/copilot.d.ts +17 -0
- package/dist/dashboard/routes/copilot.d.ts.map +1 -0
- package/dist/dashboard/routes/copilot.js +153 -0
- package/dist/dashboard/routes/copilot.js.map +1 -0
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +1 -2
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +9 -0
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/spa.html +11 -11
- package/dist/data/memory/bootstrap.js +3 -3
- package/dist/data/memory/bootstrap.js.map +1 -1
- package/dist/data/memory/narrative.d.ts.map +1 -1
- package/dist/data/memory/narrative.js +3 -4
- package/dist/data/memory/narrative.js.map +1 -1
- package/dist/data/memory/reflection.d.ts.map +1 -1
- package/dist/data/memory/reflection.js +2 -3
- package/dist/data/memory/reflection.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +7 -2
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/services/agent-spawn.service.d.ts +13 -27
- package/dist/services/agent-spawn.service.d.ts.map +1 -1
- package/dist/services/agent-spawn.service.js +32 -397
- package/dist/services/agent-spawn.service.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts +9 -0
- package/dist/services/claude-spawn.service.d.ts.map +1 -0
- package/dist/services/claude-spawn.service.js +113 -0
- package/dist/services/claude-spawn.service.js.map +1 -0
- package/dist/services/codex-spawn.service.d.ts +9 -0
- package/dist/services/codex-spawn.service.d.ts.map +1 -0
- package/dist/services/codex-spawn.service.js +106 -0
- package/dist/services/codex-spawn.service.js.map +1 -0
- package/dist/services/consolidation.service.d.ts.map +1 -1
- package/dist/services/consolidation.service.js +1 -2
- package/dist/services/consolidation.service.js.map +1 -1
- package/dist/services/copilot-spawn.service.d.ts +10 -0
- package/dist/services/copilot-spawn.service.d.ts.map +1 -0
- package/dist/services/copilot-spawn.service.js +89 -0
- package/dist/services/copilot-spawn.service.js.map +1 -0
- package/dist/services/process.service.d.ts +0 -1
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts +55 -0
- package/dist/services/spawn-common.d.ts.map +1 -0
- package/dist/services/spawn-common.js +202 -0
- package/dist/services/spawn-common.js.map +1 -0
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +2 -5
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +2 -16
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +4 -5
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/wait/message-delivery.js +5 -5
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/package.json +1 -1
- package/templates/plan-mode.default.md +2 -2
|
@@ -1,398 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Agent-spawn facade: routes a thread's agent type to the right per-agent spawn
|
|
3
|
+
* module (claude-spawn / copilot-spawn / codex-spawn) and owns the cross-agent
|
|
4
|
+
* orchestration (state-machine transitions, keep-alive reconciliation at boot).
|
|
5
|
+
*
|
|
6
|
+
* The per-agent CLI resolvers and spawn functions are re-exported so existing
|
|
7
|
+
* importers keep a single entry point.
|
|
8
|
+
*/
|
|
9
|
+
import { unlinkSync } from "node:fs";
|
|
6
10
|
import { log } from "../logger.js";
|
|
7
11
|
import { getAllThreads } from "../data/memory/thread-registry.js";
|
|
8
12
|
import { initMemoryDb } from "../data/memory/schema.js";
|
|
9
13
|
import { errorMessage } from "../utils.js";
|
|
10
|
-
import {
|
|
11
|
-
import { PROCESS_BASE_DIR, PROCESS_PIDS_DIR, THREAD_LOGS_DIR, ensureDirs, findAliveThread, isProcessAlive, readPidFiles, spawnedThreads } from "./process.service.js";
|
|
14
|
+
import { ensureDirs, findAliveThread, isProcessAlive, readPidFiles, spawnedThreads } from "./process.service.js";
|
|
12
15
|
import { ThreadState } from "./thread-lifecycle.service.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function writeCopilotInstructions(copilotHome) {
|
|
21
|
-
mkdirSync(copilotHome, { recursive: true });
|
|
22
|
-
writeFileSync(join(copilotHome, "copilot-instructions.md"), "You are a remote Copilot agent. Start remote session with sensorium. Pass agentType='copilot' to start_session.", "utf-8");
|
|
23
|
-
}
|
|
24
|
-
function ensureCopilotWorkspace(baseDir) {
|
|
25
|
-
const wsDir = join(baseDir, "copilot-workspace");
|
|
26
|
-
mkdirSync(wsDir, { recursive: true });
|
|
27
|
-
const ignoreFile = join(wsDir, ".copilotignore");
|
|
28
|
-
if (!existsSync(ignoreFile))
|
|
29
|
-
writeFileSync(ignoreFile, "*\n", "utf-8");
|
|
30
|
-
return wsDir;
|
|
31
|
-
}
|
|
32
|
-
// ── Codex spawn helpers ─────────────────────────────────────────────────────
|
|
33
|
-
const CODEX_HOME_DIR = join(PROCESS_BASE_DIR, "codex-home");
|
|
34
|
-
const DEFAULT_CODEX_MODEL = "";
|
|
35
|
-
/** Parse MCP transport from env. Returns null if port is not set or invalid. */
|
|
36
|
-
function parseSensoriumTransport() {
|
|
37
|
-
const raw = process.env.MCP_HTTP_PORT;
|
|
38
|
-
const httpPort = raw && /^\d+$/.test(raw.trim()) ? parseInt(raw.trim(), 10) : 0;
|
|
39
|
-
return httpPort > 0 ? { httpPort, secret: process.env.MCP_HTTP_SECRET || null } : null;
|
|
40
|
-
}
|
|
41
|
-
const MAX_CONCURRENT_THREADS = 20;
|
|
42
|
-
let startupCleanupInProgress = false;
|
|
43
|
-
const sanitizeSpawnEnv = (extra) => {
|
|
44
|
-
const env = {};
|
|
45
|
-
for (const [k, v] of Object.entries(process.env))
|
|
46
|
-
if (!ENV_DENYLIST.has(k))
|
|
47
|
-
env[k] = v;
|
|
48
|
-
if (extra)
|
|
49
|
-
Object.assign(env, extra);
|
|
50
|
-
return env;
|
|
51
|
-
};
|
|
52
|
-
const resolveCliPath = (name, prefer) => {
|
|
53
|
-
const envCmd = process.env[`${name.toUpperCase()}_CLI_CMD`];
|
|
54
|
-
if (envCmd)
|
|
55
|
-
return envCmd;
|
|
56
|
-
try {
|
|
57
|
-
const result = spawnSync(process.platform === "win32" ? "where" : "which", [name], { timeout: 5000, encoding: "utf-8", windowsHide: true });
|
|
58
|
-
if (result.status !== 0 || !result.stdout)
|
|
59
|
-
return null;
|
|
60
|
-
const candidates = result.stdout.trim().split(/\r?\n/).map((s) => s.trim()).filter(Boolean);
|
|
61
|
-
return prefer ? candidates.find((p) => prefer.test(p)) ?? candidates[0] : candidates[0];
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
log.debug(`[spawn] CLI resolution for ${name} failed: ${err instanceof Error ? err.message : err}`);
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
export const resolveClaudePath = () => {
|
|
69
|
-
const envCmd = process.env.CLAUDE_CLI_CMD;
|
|
70
|
-
if (envCmd)
|
|
71
|
-
return envCmd;
|
|
72
|
-
if (process.platform !== "win32")
|
|
73
|
-
return resolveCliPath("claude");
|
|
74
|
-
// On Windows `where claude` returns extensionless shim first, then .cmd, then .exe.
|
|
75
|
-
// The extensionless file cannot be spawned directly (ENOENT). Prefer .exe (real binary),
|
|
76
|
-
// fall back to .cmd (Volta/npm shim that needs shell:true), never use extensionless.
|
|
77
|
-
return resolveWindowsCliPath("claude");
|
|
78
|
-
};
|
|
79
|
-
/** On Windows: prefer .exe, fall back to .cmd, refuse extensionless shims (e.g. Volta). */
|
|
80
|
-
function resolveWindowsCliPath(name) {
|
|
81
|
-
const envCmd = process.env[`${name.toUpperCase()}_CLI_CMD`];
|
|
82
|
-
if (envCmd)
|
|
83
|
-
return envCmd;
|
|
84
|
-
try {
|
|
85
|
-
const result = spawnSync("where", [name], { timeout: 5000, encoding: "utf-8", windowsHide: true });
|
|
86
|
-
if (result.status !== 0 || !result.stdout)
|
|
87
|
-
return null;
|
|
88
|
-
const candidates = result.stdout.trim().split(/\r?\n/).map(s => s.trim()).filter(Boolean);
|
|
89
|
-
return candidates.find(p => /\.exe$/i.test(p))
|
|
90
|
-
?? candidates.find(p => /\.cmd$/i.test(p))
|
|
91
|
-
?? null;
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
log.debug(`[spawn] Windows CLI resolution for ${name} failed: ${err instanceof Error ? err.message : err}`);
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
export const resolveCopilotPath = () => process.platform === "win32" ? resolveWindowsCliPath("copilot") : resolveCliPath("copilot", /\.exe$/i);
|
|
99
|
-
export const resolveCodexPath = () => process.platform === "win32" ? resolveWindowsCliPath("codex") : resolveCliPath("codex");
|
|
100
|
-
const resolveCodexNodeExe = () => {
|
|
101
|
-
if (process.platform !== "win32")
|
|
102
|
-
return null;
|
|
103
|
-
try {
|
|
104
|
-
const localAppData = process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local");
|
|
105
|
-
const voltaImage = join(localAppData, "Volta", "tools", "image");
|
|
106
|
-
const codexJs = join(voltaImage, "packages", "@openai", "codex", "node_modules", "@openai", "codex", "bin", "codex.js");
|
|
107
|
-
if (!existsSync(codexJs))
|
|
108
|
-
return null;
|
|
109
|
-
const voltaCmd = join(localAppData, "Volta", "bin", "volta.exe");
|
|
110
|
-
const nodePathResult = spawnSync(voltaCmd, ["run", "node", "-e", "process.stdout.write(process.execPath)"], { encoding: "utf-8", timeout: 5000, windowsHide: true });
|
|
111
|
-
if (nodePathResult.status === 0 && nodePathResult.stdout?.trim())
|
|
112
|
-
return { nodeExe: nodePathResult.stdout.trim(), codexJs };
|
|
113
|
-
const nodeDir = join(voltaImage, "node");
|
|
114
|
-
if (!existsSync(nodeDir))
|
|
115
|
-
return null;
|
|
116
|
-
const versions = readdirSync(nodeDir).filter((v) => /^\d+\.\d+\.\d+$/.test(v)).sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
|
|
117
|
-
for (const version of versions) {
|
|
118
|
-
const nodeExe = join(nodeDir, version, "node.exe");
|
|
119
|
-
if (existsSync(nodeExe))
|
|
120
|
-
return { nodeExe, codexJs };
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
log.debug(`[spawn] Codex Node.exe resolution failed: ${err instanceof Error ? err.message : err}`);
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
};
|
|
128
|
-
const resolveCodexExe = () => {
|
|
129
|
-
if (process.platform !== "win32")
|
|
130
|
-
return null;
|
|
131
|
-
if (process.env.CODEX_EXE)
|
|
132
|
-
return process.env.CODEX_EXE;
|
|
133
|
-
try {
|
|
134
|
-
const localAppData = process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local");
|
|
135
|
-
const nativeExe = join(localAppData, "Volta", "tools", "image", "packages", "@openai", "codex", "node_modules", "@openai", "codex", "node_modules", "@openai", "codex-win32-x64", "vendor", "x86_64-pc-windows-msvc", "codex", "codex.exe");
|
|
136
|
-
return existsSync(nativeExe) ? nativeExe : null;
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
log.debug(`[spawn] Codex native exe resolution failed: ${err instanceof Error ? err.message : err}`);
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
async function handleProcessExit(code, threadId, pid, pidFilePath, entry, processLabel, threadLifecycle) {
|
|
144
|
-
const idx = spawnedThreads.indexOf(entry);
|
|
145
|
-
if (idx !== -1)
|
|
146
|
-
spawnedThreads.splice(idx, 1);
|
|
147
|
-
// Only delete PID file if it still belongs to this process — a replacement
|
|
148
|
-
// process may have already overwritten the file with its own PID.
|
|
149
|
-
let stillOwnedPidFile = false;
|
|
150
|
-
try {
|
|
151
|
-
const raw = readFileSync(pidFilePath, "utf-8");
|
|
152
|
-
const parsed = JSON.parse(raw);
|
|
153
|
-
if (parsed.pid === pid) {
|
|
154
|
-
unlinkSync(pidFilePath);
|
|
155
|
-
stillOwnedPidFile = true;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
catch { /* file missing or unparseable — already cleaned up */ }
|
|
159
|
-
// Clear the heartbeat so a stale (spawn-time / last-activity) timestamp can't
|
|
160
|
-
// make this now-dead thread look alive and block the keeper's restart. Only do
|
|
161
|
-
// this if no replacement has taken over the PID file — otherwise the live
|
|
162
|
-
// replacement owns the heartbeat and we must not delete it.
|
|
163
|
-
if (stillOwnedPidFile)
|
|
164
|
-
clearThreadHeartbeat(threadId);
|
|
165
|
-
let db;
|
|
166
|
-
try {
|
|
167
|
-
db = initMemoryDb();
|
|
168
|
-
const currentState = threadLifecycle.getThreadState(db, threadId);
|
|
169
|
-
const isTerminal = currentState === ThreadState.Archived || currentState === ThreadState.Expired;
|
|
170
|
-
if (!isTerminal) {
|
|
171
|
-
if (entry.threadType === "worker") {
|
|
172
|
-
// Worker: fully decommission (delete topic, archive notes & DB entry, remove from registry)
|
|
173
|
-
const token = process.env.TELEGRAM_TOKEN || "";
|
|
174
|
-
const chatId = process.env.TELEGRAM_CHAT_ID || "";
|
|
175
|
-
const telegramAdapter = {
|
|
176
|
-
deleteForumTopic: async (cId, topicId) => {
|
|
177
|
-
if (token && cId)
|
|
178
|
-
await deleteTelegramTopicByBotApi(token, cId, topicId);
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
await decommissionWorker(entry, { db, telegram: telegramAdapter, chatId, threadLifecycle });
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
// Non-worker (e.g., keepAlive thread): mark exited so KeeperService can restart
|
|
185
|
-
threadLifecycle.markExited(db, threadId);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
log.warn(`[start_thread] Failed to update DB on exit for thread ${threadId}: ${errorMessage(err)}`);
|
|
191
|
-
}
|
|
192
|
-
const uptimeSec = Math.round((Date.now() - entry.startedAt) / 1000);
|
|
193
|
-
const exitDesc = code === 3221226505 ? "ACCESS_VIOLATION (0xC0000005)" : code === 1 ? "error (1)" : `code ${code}`;
|
|
194
|
-
log.info(`[start_thread] ${processLabel} PID=${pid} thread ${threadId} exited: ${exitDesc} — uptime ${uptimeSec}s`);
|
|
195
|
-
if (code === 3221226505) {
|
|
196
|
-
// Detect batch crashes — count how many other threads died in the last 30s
|
|
197
|
-
const recentCrashes = spawnedThreads.length === 0 ? "all threads down" : `${spawnedThreads.length} still alive`;
|
|
198
|
-
log.warn(`[start_thread] SEGFAULT thread ${threadId} — ${recentCrashes}, uptime was ${uptimeSec}s (${Math.round(uptimeSec / 3600)}h)`);
|
|
199
|
-
// Tail the thread log to see what the agent was doing when it crashed
|
|
200
|
-
try {
|
|
201
|
-
const fd = openSync(entry.logFile, "r");
|
|
202
|
-
const stat = fstatSync(fd);
|
|
203
|
-
const readSize = Math.min(2048, stat.size);
|
|
204
|
-
const buf = Buffer.alloc(readSize);
|
|
205
|
-
readSync(fd, buf, 0, readSize, stat.size - readSize);
|
|
206
|
-
closeSync(fd);
|
|
207
|
-
const tail = buf.toString("utf-8").split("\n").filter(Boolean).slice(-3).join(" | ");
|
|
208
|
-
log.warn(`[start_thread] SEGFAULT context (last log): ${tail.substring(0, 300)}`);
|
|
209
|
-
}
|
|
210
|
-
catch { /* log file may be gone */ }
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
function registerSpawnedProcess(opts, threadLifecycle) {
|
|
214
|
-
const pid = opts.child.pid;
|
|
215
|
-
if (pid === undefined)
|
|
216
|
-
return { error: `${opts.agentLabel} process spawned but PID is undefined - spawn may have failed.` };
|
|
217
|
-
const pidFilePath = join(PROCESS_PIDS_DIR, `${opts.threadId}.pid`);
|
|
218
|
-
try {
|
|
219
|
-
writeFileSync(pidFilePath, JSON.stringify({ pid, name: opts.name, configPath: opts.configPath, startedAt: Date.now(), ...(opts.threadType ? { threadType: opts.threadType } : {}) }), "utf-8");
|
|
220
|
-
}
|
|
221
|
-
catch (err) {
|
|
222
|
-
log.debug(`[start_thread] Failed to write PID file: ${errorMessage(err)}`);
|
|
223
|
-
}
|
|
224
|
-
// Reset heartbeat so keeper doesn't treat a freshly spawned thread as stuck
|
|
225
|
-
writeThreadHeartbeatSync(opts.threadId);
|
|
226
|
-
const entry = { pid, threadId: opts.threadId, name: opts.name, startedAt: Date.now(), createdAt: Date.now(), logFile: opts.logFilePath, ...(opts.memorySourceThreadId !== undefined ? { memorySourceThreadId: opts.memorySourceThreadId } : {}), ...(opts.memoryTargetThreadId !== undefined ? { memoryTargetThreadId: opts.memoryTargetThreadId } : {}), ...(opts.threadType ? { threadType: opts.threadType } : {}) };
|
|
227
|
-
spawnedThreads.push(entry);
|
|
228
|
-
opts.child.on("exit", (code) => { handleProcessExit(code, opts.threadId, pid, pidFilePath, entry, opts.agentLabel, threadLifecycle).catch((err) => log.warn(`[exit] cleanup failed: ${err}`)); });
|
|
229
|
-
opts.child.unref();
|
|
230
|
-
log.info(`[start_thread] Spawned ${opts.agentLabel} process PID=${pid} for thread ${opts.threadId} ("${opts.name}")`);
|
|
231
|
-
return { pid, logFile: opts.logFilePath };
|
|
232
|
-
}
|
|
233
|
-
const normalizeWorkingDirectory = (workingDirectory) => {
|
|
234
|
-
if (!workingDirectory || existsSync(workingDirectory))
|
|
235
|
-
return workingDirectory;
|
|
236
|
-
const fallback = tmpdir();
|
|
237
|
-
log.warn(`workingDirectory "${workingDirectory}" does not exist, falling back to "${fallback}"`);
|
|
238
|
-
return fallback;
|
|
239
|
-
};
|
|
240
|
-
export function spawnAgentProcess(claudePath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, memoryTargetThreadId, threadType) {
|
|
241
|
-
if (startupCleanupInProgress)
|
|
242
|
-
return { error: "Server startup cleanup in progress - try again in a few seconds" };
|
|
243
|
-
if (spawnedThreads.length >= MAX_CONCURRENT_THREADS)
|
|
244
|
-
return { error: `Concurrent thread limit reached (${MAX_CONCURRENT_THREADS}). Wait for existing threads to finish.` };
|
|
245
|
-
const transport = parseSensoriumTransport();
|
|
246
|
-
if (!transport)
|
|
247
|
-
return { error: `MCP_HTTP_PORT env var is not set or invalid (got: '${process.env.MCP_HTTP_PORT ?? ''}'). Claude threads require HTTP transport.` };
|
|
248
|
-
workingDirectory = normalizeWorkingDirectory(workingDirectory);
|
|
249
|
-
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
250
|
-
const logFilePath = join(THREAD_LOGS_DIR, `${safeName}_${threadId}_${new Date().toISOString().slice(0, 10)}.json`);
|
|
251
|
-
const effectiveConfigPath = buildClaudeMcpConfig(transport, threadId);
|
|
252
|
-
const claudeConfigDir = join(PROCESS_BASE_DIR, "claude-configs", String(threadId));
|
|
253
|
-
mkdirSync(claudeConfigDir, { recursive: true });
|
|
254
|
-
// When CLAUDE_CODE_OAUTH_TOKEN is set, skip credentials copy — the env var
|
|
255
|
-
// provides a long-lived setup-token that bypasses the broken OAuth refresh flow.
|
|
256
|
-
// Only copy settings.json (for preferences). Without this, expired credentials
|
|
257
|
-
// get copied on every restart, causing an infinite 401 → restart death loop.
|
|
258
|
-
const oauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
259
|
-
const mainClaudeDir = join(homedir(), ".claude");
|
|
260
|
-
const sharedFiles = [...(oauthToken ? ["settings.json"] : [".credentials.json", "settings.json"]), "CLAUDE.md"];
|
|
261
|
-
// Remove stale credentials from previous runs so Claude doesn't try to use them
|
|
262
|
-
if (oauthToken) {
|
|
263
|
-
try {
|
|
264
|
-
const stale = join(claudeConfigDir, ".credentials.json");
|
|
265
|
-
if (existsSync(stale))
|
|
266
|
-
unlinkSync(stale);
|
|
267
|
-
}
|
|
268
|
-
catch { }
|
|
269
|
-
}
|
|
270
|
-
for (const shared of sharedFiles) {
|
|
271
|
-
const src = join(mainClaudeDir, shared);
|
|
272
|
-
const dst = join(claudeConfigDir, shared);
|
|
273
|
-
try {
|
|
274
|
-
if (existsSync(src))
|
|
275
|
-
copyFileSync(src, dst);
|
|
276
|
-
}
|
|
277
|
-
catch (err) {
|
|
278
|
-
log.debug(`[spawn] Failed to copy ${shared} for thread ${threadId}: ${errorMessage(err)}`);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// CLAUDE_CODE_OAUTH_TOKEN is on ENV_DENYLIST to avoid leaking to Copilot/Codex — pass explicitly only to Claude spawns
|
|
282
|
-
const spawnEnv = sanitizeSpawnEnv({ CLAUDE_CONFIG_DIR: claudeConfigDir, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1", ...(oauthToken ? { CLAUDE_CODE_OAUTH_TOKEN: oauthToken } : {}), ...(memorySourceThreadId !== undefined ? { MEMORY_SOURCE_THREAD_ID: String(memorySourceThreadId) } : {}), ...(memoryTargetThreadId !== undefined ? { MEMORY_TARGET_THREAD_ID: String(memoryTargetThreadId) } : {}) });
|
|
283
|
-
if (process.platform === "win32" && !spawnEnv.CLAUDE_CODE_GIT_BASH_PATH)
|
|
284
|
-
for (const candidate of [join(homedir(), "AppData", "Local", "Programs", "Git", "bin", "bash.exe"), "C:\\Program Files\\Git\\bin\\bash.exe", "C:\\Program Files (x86)\\Git\\bin\\bash.exe"])
|
|
285
|
-
if (existsSync(candidate)) {
|
|
286
|
-
spawnEnv.CLAUDE_CODE_GIT_BASH_PATH = candidate;
|
|
287
|
-
break;
|
|
288
|
-
}
|
|
289
|
-
try {
|
|
290
|
-
const claudeModel = threadType === "worker"
|
|
291
|
-
? (process.env.CLAUDE_WORKER_MODEL || getDefaultWorkerModel())
|
|
292
|
-
: (process.env.CLAUDE_MODEL || getDefaultThreadModel());
|
|
293
|
-
const sessionPrompt = `Start remote session with sensorium. Thread name = '${name}'. Use threadId=${threadId} when calling start_session.`;
|
|
294
|
-
// Send the child's stdout/stderr to a file descriptor the CHILD owns, not a
|
|
295
|
-
// pipe drained by this (ephemeral) server process. A pipe's only reader is
|
|
296
|
-
// this node process; when it dies on a self-update/restart the orphaned,
|
|
297
|
-
// detached child keeps writing, the ~64KB OS pipe buffer fills, and the next
|
|
298
|
-
// write() blocks the child's event loop forever — killing MCP polling, the
|
|
299
|
-
// API stream and any reconnect (the exact zombie we saw on thread 20869).
|
|
300
|
-
// A file fd is duplicated into the child at spawn and drained by the OS, so
|
|
301
|
-
// it survives our restarts. (64KB blocking is a PIPE phenomenon, not a file.)
|
|
302
|
-
const outFd = openSync(logFilePath, "a");
|
|
303
|
-
try {
|
|
304
|
-
const child = spawn(claudePath, ["--verbose", "--dangerously-skip-permissions", "--mcp-config", effectiveConfigPath, "--model", claudeModel, "-p", sessionPrompt, "--output-format", "stream-json"], { stdio: ["ignore", outFd, outFd], shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(claudePath), detached: true, windowsHide: false, env: spawnEnv, cwd: workingDirectory || undefined });
|
|
305
|
-
return registerSpawnedProcess({ child, threadId, name, logFilePath, configPath: effectiveConfigPath, agentLabel: "Claude", memorySourceThreadId, memoryTargetThreadId, threadType }, threadLifecycle);
|
|
306
|
-
}
|
|
307
|
-
finally {
|
|
308
|
-
// Parent no longer needs the fd — the child holds its own duplicated handle.
|
|
309
|
-
try {
|
|
310
|
-
closeSync(outFd);
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
log.debug(`[spawn] closeSync log fd failed for thread ${threadId}: ${errorMessage(err)}`);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
catch (err) {
|
|
318
|
-
return { error: `Failed to spawn Claude process: ${errorMessage(err)}` };
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
export function spawnCopilotProcess(copilotPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, agentType, threadType) {
|
|
322
|
-
const transport = parseSensoriumTransport();
|
|
323
|
-
if (!transport)
|
|
324
|
-
return { error: `MCP_HTTP_PORT env var is not set or invalid (got: '${process.env.MCP_HTTP_PORT ?? ''}'). Copilot threads require HTTP transport.` };
|
|
325
|
-
workingDirectory = normalizeWorkingDirectory(workingDirectory) || ensureCopilotWorkspace(PROCESS_BASE_DIR);
|
|
326
|
-
const copilotHomeDir = join(PROCESS_BASE_DIR, COPILOT_HOME_DIR);
|
|
327
|
-
buildCopilotMcpConfig(transport, copilotHomeDir);
|
|
328
|
-
writeCopilotInstructions(copilotHomeDir);
|
|
329
|
-
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
330
|
-
const logFilePath = join(THREAD_LOGS_DIR, `${safeName}_${threadId}_${new Date().toISOString().slice(0, 10)}.json`);
|
|
331
|
-
try {
|
|
332
|
-
const sessionPrompt = `Start remote session with sensorium. Thread name = '${name}'. Use threadId=${threadId} when calling start_session.`;
|
|
333
|
-
// File fd owned by the child (see Claude spawn above) — survives this
|
|
334
|
-
// server's self-update/restart without deadlocking the orphaned child.
|
|
335
|
-
const outFd = openSync(logFilePath, "a");
|
|
336
|
-
try {
|
|
337
|
-
const child = spawn(copilotPath, ["-p", sessionPrompt, "--allow-all-tools", "--model", agentType === "copilot_codex" ? "gpt-5.3-codex" : (process.env.COPILOT_MODEL || DEFAULT_COPILOT_MODEL), "--autopilot"], { stdio: ["ignore", outFd, outFd], shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(copilotPath), detached: true, windowsHide: false, env: sanitizeSpawnEnv({ COPILOT_HOME: copilotHomeDir, ...(memorySourceThreadId !== undefined ? { MEMORY_SOURCE_THREAD_ID: String(memorySourceThreadId) } : {}) }), cwd: workingDirectory || undefined });
|
|
338
|
-
return registerSpawnedProcess({ child, threadId, name, logFilePath, configPath: copilotHomeDir, agentLabel: "Copilot", memorySourceThreadId, threadType }, threadLifecycle);
|
|
339
|
-
}
|
|
340
|
-
finally {
|
|
341
|
-
try {
|
|
342
|
-
closeSync(outFd);
|
|
343
|
-
}
|
|
344
|
-
catch (err) {
|
|
345
|
-
log.debug(`[spawn] closeSync log fd failed for thread ${threadId}: ${errorMessage(err)}`);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
catch (err) {
|
|
350
|
-
return { error: `Failed to spawn Copilot process: ${errorMessage(err)}` };
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
export function spawnCodexProcess(codexPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, threadType) {
|
|
354
|
-
const transport = parseSensoriumTransport();
|
|
355
|
-
if (!transport)
|
|
356
|
-
return { error: `MCP_HTTP_PORT env var is not set or invalid (got: '${process.env.MCP_HTTP_PORT ?? ''}'). Codex threads require HTTP transport.` };
|
|
357
|
-
workingDirectory = normalizeWorkingDirectory(workingDirectory);
|
|
358
|
-
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
359
|
-
const logFilePath = join(THREAD_LOGS_DIR, `${safeName}_${threadId}_${new Date().toISOString().slice(0, 10)}.jsonl`);
|
|
360
|
-
const prompt = `You are an AUTONOMOUS AGENT running an INFINITE polling loop. You MUST NEVER STOP.\n\nStep 1: Call start_session(name='${name}', threadId=${threadId}, agentType='codex'). Use threadId=${threadId} for all subsequent calls.\nStep 2: Call remote_copilot_wait_for_instructions(threadId=${threadId}).\nStep 3: Read the response:\n - If it says "MANDATORY ACTION" or "No new instructions" - call remote_copilot_wait_for_instructions AGAIN immediately.\n - If you receive a task - complete it using your tools, then call remote_copilot_wait_for_instructions again.\nStep 4: GOTO Step 2. This loop NEVER ends. You are NEVER done.\n\nCRITICAL: "No new instructions" is NOT a signal to stop. It means "keep waiting". Always call the tool again.`;
|
|
361
|
-
const model = process.env.CODEX_MODEL || DEFAULT_CODEX_MODEL;
|
|
362
|
-
const mcpArgs = buildCodexMcpArgs(transport);
|
|
363
|
-
const cliArgs = ["exec", "--dangerously-bypass-approvals-and-sandbox", "--skip-git-repo-check", ...(model ? ["-m", model] : []), "--json", ...mcpArgs, "-"];
|
|
364
|
-
if (workingDirectory)
|
|
365
|
-
cliArgs.splice(1, 0, "-C", workingDirectory);
|
|
366
|
-
const spawnEnv = sanitizeSpawnEnv({ ...(memorySourceThreadId !== undefined ? { MEMORY_SOURCE_THREAD_ID: String(memorySourceThreadId) } : {}), ...(transport.secret ? { SENSORIUM_MCP_SECRET: transport.secret } : {}) });
|
|
367
|
-
try {
|
|
368
|
-
const nativeExe = resolveCodexExe();
|
|
369
|
-
const nodeExeResult = !nativeExe && process.platform === "win32" && /\.(cmd|bat)$/i.test(codexPath) ? resolveCodexNodeExe() : null;
|
|
370
|
-
// stdin stays a pipe (we write the prompt below); stdout/stderr go to a
|
|
371
|
-
// child-owned file fd so a server self-update/restart can't orphan the pipe
|
|
372
|
-
// and deadlock the detached child (see Claude spawn above for the full why).
|
|
373
|
-
const outFd = openSync(logFilePath, "a");
|
|
374
|
-
try {
|
|
375
|
-
const child = nativeExe ? spawn(nativeExe, cliArgs, { stdio: ["pipe", outFd, outFd], shell: false, detached: true, windowsHide: false, env: spawnEnv, cwd: workingDirectory || undefined }) : nodeExeResult ? spawn(nodeExeResult.nodeExe, [nodeExeResult.codexJs, ...cliArgs], { stdio: ["pipe", outFd, outFd], shell: false, detached: true, windowsHide: false, env: spawnEnv, cwd: workingDirectory || undefined }) : spawn(codexPath, cliArgs, { stdio: ["pipe", outFd, outFd], shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(codexPath), detached: true, windowsHide: false, env: spawnEnv, cwd: workingDirectory || undefined });
|
|
376
|
-
try {
|
|
377
|
-
child.stdin?.write(prompt + "\n");
|
|
378
|
-
child.stdin?.end();
|
|
379
|
-
}
|
|
380
|
-
catch { }
|
|
381
|
-
return registerSpawnedProcess({ child, threadId, name, logFilePath, configPath: CODEX_HOME_DIR, agentLabel: "Codex", memorySourceThreadId, threadType }, threadLifecycle);
|
|
382
|
-
}
|
|
383
|
-
finally {
|
|
384
|
-
try {
|
|
385
|
-
closeSync(outFd);
|
|
386
|
-
}
|
|
387
|
-
catch (err) {
|
|
388
|
-
log.debug(`[spawn] closeSync log fd failed for thread ${threadId}: ${errorMessage(err)}`);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
catch (err) {
|
|
393
|
-
return { error: `Failed to spawn Codex process: ${errorMessage(err)}` };
|
|
394
|
-
}
|
|
395
|
-
}
|
|
16
|
+
import { setStartupCleanupInProgress } from "./spawn-common.js";
|
|
17
|
+
import { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
|
|
18
|
+
import { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
|
|
19
|
+
import { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
|
|
20
|
+
export { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
|
|
21
|
+
export { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
|
|
22
|
+
export { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
|
|
396
23
|
/**
|
|
397
24
|
* Resolve the right spawn function for `agentType` and call it.
|
|
398
25
|
* Handles CLI path resolution and error reporting internally.
|
|
@@ -402,7 +29,15 @@ export function spawnCodexProcess(codexPath, name, threadId, threadLifecycle, wo
|
|
|
402
29
|
* success. This implements the explicit state machine for newly registered
|
|
403
30
|
* threads without affecting existing restart flows (Exited/Active → Active).
|
|
404
31
|
*/
|
|
405
|
-
export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId,
|
|
32
|
+
export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, db) {
|
|
33
|
+
// Legacy agent types (copilot_claude / copilot_codex) were removed, but threads
|
|
34
|
+
// persisted before the removal may still carry them. Without this, they fall
|
|
35
|
+
// through to the Claude branch below and get relaunched as a different agent on
|
|
36
|
+
// every keeper restart. Map them back to copilot and warn once per spawn.
|
|
37
|
+
if (agentType === "copilot_claude" || agentType === "copilot_codex") {
|
|
38
|
+
log.warn(`[spawn] thread ${threadId} (${name}) has legacy agent type '${agentType}' — spawning as copilot`);
|
|
39
|
+
agentType = "copilot";
|
|
40
|
+
}
|
|
406
41
|
// Created → Spawning when a pre-registered thread is about to start
|
|
407
42
|
if (db) {
|
|
408
43
|
const currentState = threadLifecycle.getThreadState(db, threadId);
|
|
@@ -416,10 +51,10 @@ export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workin
|
|
|
416
51
|
}
|
|
417
52
|
}
|
|
418
53
|
let result;
|
|
419
|
-
if (agentType === "copilot"
|
|
54
|
+
if (agentType === "copilot") {
|
|
420
55
|
const cliPath = resolveCopilotPath();
|
|
421
56
|
result = cliPath
|
|
422
|
-
? spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId,
|
|
57
|
+
? spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType)
|
|
423
58
|
: { error: `Thread ${threadId} (${name}): copilot CLI not found` };
|
|
424
59
|
}
|
|
425
60
|
else if (agentType === "codex" || agentType === "openai_codex") {
|
|
@@ -431,7 +66,7 @@ export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workin
|
|
|
431
66
|
else {
|
|
432
67
|
const cliPath = resolveClaudePath();
|
|
433
68
|
result = cliPath
|
|
434
|
-
? spawnAgentProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId,
|
|
69
|
+
? spawnAgentProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType)
|
|
435
70
|
: { error: `Thread ${threadId} (${name}): claude CLI not found` };
|
|
436
71
|
}
|
|
437
72
|
// Spawning → Active on successful process start
|
|
@@ -450,13 +85,13 @@ export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workin
|
|
|
450
85
|
}
|
|
451
86
|
export function spawnKeepAliveThreads(threadLifecycle) {
|
|
452
87
|
const result = { spawned: 0, errors: [] };
|
|
453
|
-
|
|
88
|
+
setStartupCleanupInProgress(true);
|
|
454
89
|
let db;
|
|
455
90
|
try {
|
|
456
91
|
db = initMemoryDb();
|
|
457
92
|
}
|
|
458
93
|
catch (err) {
|
|
459
|
-
|
|
94
|
+
setStartupCleanupInProgress(false);
|
|
460
95
|
return { spawned: 0, errors: [`Failed to open DB: ${errorMessage(err)}`] };
|
|
461
96
|
}
|
|
462
97
|
let threads;
|
|
@@ -475,7 +110,7 @@ export function spawnKeepAliveThreads(threadLifecycle) {
|
|
|
475
110
|
threads = getAllThreads(db).filter((thread) => thread.keepAlive && (thread.status === "active" || thread.status === "exited"));
|
|
476
111
|
}
|
|
477
112
|
finally {
|
|
478
|
-
|
|
113
|
+
setStartupCleanupInProgress(false);
|
|
479
114
|
}
|
|
480
115
|
if (threads.length === 0)
|
|
481
116
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-spawn.service.js","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-spawn.service.js","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude-specific spawn logic: CLI-path resolution and the Claude Code process
|
|
3
|
+
* launch (per-thread config dir, OAuth-token handling, git-bash discovery).
|
|
4
|
+
*/
|
|
5
|
+
import type { ThreadLifecycleService } from "./thread-lifecycle.service.js";
|
|
6
|
+
import { type SpawnResult } from "./spawn-common.js";
|
|
7
|
+
export declare const resolveClaudePath: () => string | null;
|
|
8
|
+
export declare function spawnAgentProcess(claudePath: string, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, threadType?: "worker" | "branch"): SpawnResult;
|
|
9
|
+
//# sourceMappingURL=claude-spawn.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-spawn.service.d.ts","sourceRoot":"","sources":["../../src/services/claude-spawn.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EASL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,IAQ7C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAuDtO"}
|