sensorium-mcp 3.0.71 → 3.0.75

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.
Files changed (51) hide show
  1. package/dist/config.d.ts +50 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +127 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/dashboard/presets.d.ts.map +1 -1
  6. package/dist/dashboard/presets.js +0 -9
  7. package/dist/dashboard/presets.js.map +1 -1
  8. package/dist/dashboard/routes/claude.d.ts +12 -0
  9. package/dist/dashboard/routes/claude.d.ts.map +1 -0
  10. package/dist/dashboard/routes/claude.js +80 -0
  11. package/dist/dashboard/routes/claude.js.map +1 -0
  12. package/dist/dashboard/routes/copilot.d.ts +17 -0
  13. package/dist/dashboard/routes/copilot.d.ts.map +1 -0
  14. package/dist/dashboard/routes/copilot.js +153 -0
  15. package/dist/dashboard/routes/copilot.js.map +1 -0
  16. package/dist/dashboard/routes/threads.js +1 -1
  17. package/dist/dashboard/routes/threads.js.map +1 -1
  18. package/dist/dashboard/routes.d.ts.map +1 -1
  19. package/dist/dashboard/routes.js +9 -0
  20. package/dist/dashboard/routes.js.map +1 -1
  21. package/dist/dashboard/spa.html +11 -11
  22. package/dist/services/agent-spawn.service.d.ts +13 -27
  23. package/dist/services/agent-spawn.service.d.ts.map +1 -1
  24. package/dist/services/agent-spawn.service.js +32 -396
  25. package/dist/services/agent-spawn.service.js.map +1 -1
  26. package/dist/services/claude-spawn.service.d.ts +9 -0
  27. package/dist/services/claude-spawn.service.d.ts.map +1 -0
  28. package/dist/services/claude-spawn.service.js +113 -0
  29. package/dist/services/claude-spawn.service.js.map +1 -0
  30. package/dist/services/codex-spawn.service.d.ts +9 -0
  31. package/dist/services/codex-spawn.service.d.ts.map +1 -0
  32. package/dist/services/codex-spawn.service.js +106 -0
  33. package/dist/services/codex-spawn.service.js.map +1 -0
  34. package/dist/services/copilot-spawn.service.d.ts +10 -0
  35. package/dist/services/copilot-spawn.service.d.ts.map +1 -0
  36. package/dist/services/copilot-spawn.service.js +89 -0
  37. package/dist/services/copilot-spawn.service.js.map +1 -0
  38. package/dist/services/spawn-common.d.ts +55 -0
  39. package/dist/services/spawn-common.d.ts.map +1 -0
  40. package/dist/services/spawn-common.js +202 -0
  41. package/dist/services/spawn-common.js.map +1 -0
  42. package/dist/tools/defs/session-defs.d.ts.map +1 -1
  43. package/dist/tools/defs/session-defs.js +1 -4
  44. package/dist/tools/defs/session-defs.js.map +1 -1
  45. package/dist/tools/delegate-tool.js +3 -3
  46. package/dist/tools/delegate-tool.js.map +1 -1
  47. package/dist/tools/start-session-tool.js +2 -2
  48. package/dist/tools/start-session-tool.js.map +1 -1
  49. package/package.json +1 -1
  50. package/templates/plan-mode.default.md +7 -4
  51. package/templates/playwright.default.md +72 -0
@@ -1,27 +1,18 @@
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
+ */
1
9
  import { type AgentType } from "../config.js";
2
10
  import { type Database } from "../data/memory/schema.js";
3
11
  import { type ThreadLifecycleService } from "./thread-lifecycle.service.js";
4
- export declare const resolveClaudePath: () => string | null;
5
- export declare const resolveCopilotPath: () => string | null;
6
- export declare const resolveCodexPath: () => string | null;
7
- export declare function spawnAgentProcess(claudePath: string, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, threadType?: "worker" | "branch"): {
8
- pid: number;
9
- logFile: string;
10
- } | {
11
- error: string;
12
- };
13
- export declare function spawnCopilotProcess(copilotPath: string, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, agentType?: string, threadType?: "worker" | "branch"): {
14
- pid: number;
15
- logFile: string;
16
- } | {
17
- error: string;
18
- };
19
- export declare function spawnCodexProcess(codexPath: string, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, threadType?: "worker" | "branch"): {
20
- pid: number;
21
- logFile: string;
22
- } | {
23
- error: string;
24
- };
12
+ import { type SpawnResult } from "./spawn-common.js";
13
+ export { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
14
+ export { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
15
+ export { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
25
16
  /**
26
17
  * Resolve the right spawn function for `agentType` and call it.
27
18
  * Handles CLI path resolution and error reporting internally.
@@ -31,12 +22,7 @@ export declare function spawnCodexProcess(codexPath: string, name: string, threa
31
22
  * success. This implements the explicit state machine for newly registered
32
23
  * threads without affecting existing restart flows (Exited/Active → Active).
33
24
  */
34
- export declare function dispatchSpawn(agentType: AgentType, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, runtimeThreadType?: "worker" | "branch", db?: Database): {
35
- pid: number;
36
- logFile: string;
37
- } | {
38
- error: string;
39
- };
25
+ export declare function dispatchSpawn(agentType: AgentType, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, workingDirectory?: string, memorySourceThreadId?: number, runtimeThreadType?: "worker" | "branch", db?: Database): SpawnResult;
40
26
  export declare function spawnKeepAliveThreads(threadLifecycle: ThreadLifecycleService): {
41
27
  spawned: number;
42
28
  errors: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"agent-spawn.service.d.ts","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5F,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAKvE,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAsEzF,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,IAQ7C,CAAC;AAgBF,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IACyD,CAAC;AACzG,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,IAC4C,CAAC;AAoH1F,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;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAkD/Q;AAED,wBAAgB,mBAAmB,CAAC,WAAW,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,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAqBtS;AAED,wBAAgB,iBAAiB,CAAC,SAAS,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;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA2B9Q;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,sBAAsB,EACvC,gBAAgB,CAAC,EAAE,MAAM,EACzB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,EACvC,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAsCtD;AAED,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,sBAAsB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BpH"}
1
+ {"version":3,"file":"agent-spawn.service.d.ts","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIvE,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKlF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,sBAAsB,EACvC,gBAAgB,CAAC,EAAE,MAAM,EACzB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,EACvC,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CA+Cb;AAED,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,sBAAsB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BpH"}
@@ -1,398 +1,26 @@
1
- import { spawn, spawnSync } from "node:child_process";
2
- import { closeSync, copyFileSync, existsSync, fstatSync, mkdirSync, openSync, readSync, readdirSync, unlinkSync, writeFileSync, readFileSync } from "node:fs";
3
- import { homedir, tmpdir } from "node:os";
4
- import { join } from "node:path";
5
- import { getDefaultThreadModel, getDefaultWorkerModel } from "../config.js";
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";
10
+ import { getAgentType } from "../config.js";
6
11
  import { log } from "../logger.js";
7
12
  import { getAllThreads } from "../data/memory/thread-registry.js";
8
13
  import { initMemoryDb } from "../data/memory/schema.js";
9
14
  import { errorMessage } from "../utils.js";
10
- import { deleteTelegramTopicByBotApi } from "./topic.service.js";
11
- import { PROCESS_BASE_DIR, PROCESS_PIDS_DIR, THREAD_LOGS_DIR, ensureDirs, findAliveThread, isProcessAlive, readPidFiles, spawnedThreads } from "./process.service.js";
15
+ import { ensureDirs, findAliveThread, isProcessAlive, readPidFiles, spawnedThreads } from "./process.service.js";
12
16
  import { ThreadState } from "./thread-lifecycle.service.js";
13
- import { buildClaudeMcpConfig, buildCopilotMcpConfig, buildCodexMcpArgs } from "./mcp-config.service.js";
14
- import { decommissionWorker } from "./worker-cleanup.service.js";
15
- import { writeThreadHeartbeatSync, clearThreadHeartbeat } from "../data/file-storage.js";
16
- const ENV_DENYLIST = new Set(["TELEGRAM_TOKEN", "TELEGRAM_CHAT_ID", "MCP_HTTP_SECRET", "DASHBOARD_TOKEN", "MCP_START_COMMAND", "WATCHER_START_COMMAND", "CLAUDE_CODE_OAUTH_TOKEN"]);
17
- // ── Copilot spawn helpers ───────────────────────────────────────────────────
18
- const COPILOT_HOME_DIR = "copilot-home";
19
- const DEFAULT_COPILOT_MODEL = "claude-opus-4-6";
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.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, 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) } : {}) });
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, 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
- }
17
+ import { setStartupCleanupInProgress } from "./spawn-common.js";
18
+ import { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
19
+ import { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
20
+ import { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
21
+ export { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
22
+ export { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
23
+ export { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
396
24
  /**
397
25
  * Resolve the right spawn function for `agentType` and call it.
398
26
  * Handles CLI path resolution and error reporting internally.
@@ -403,6 +31,14 @@ export function spawnCodexProcess(codexPath, name, threadId, threadLifecycle, wo
403
31
  * threads without affecting existing restart flows (Exited/Active → Active).
404
32
  */
405
33
  export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, db) {
34
+ // Legacy agent types (copilot_claude / copilot_codex) were removed, but threads
35
+ // persisted before the removal may still carry them. Without this, they fall
36
+ // through to the Claude branch below and get relaunched as a different agent on
37
+ // every keeper restart. Map them back to copilot and warn once per spawn.
38
+ if (agentType === "copilot_claude" || agentType === "copilot_codex") {
39
+ log.warn(`[spawn] thread ${threadId} (${name}) has legacy agent type '${agentType}' — spawning as copilot`);
40
+ agentType = "copilot";
41
+ }
406
42
  // Created → Spawning when a pre-registered thread is about to start
407
43
  if (db) {
408
44
  const currentState = threadLifecycle.getThreadState(db, threadId);
@@ -416,10 +52,10 @@ export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workin
416
52
  }
417
53
  }
418
54
  let result;
419
- if (agentType === "copilot" || agentType === "copilot_claude" || agentType === "copilot_codex") {
55
+ if (agentType === "copilot") {
420
56
  const cliPath = resolveCopilotPath();
421
57
  result = cliPath
422
- ? spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, agentType, runtimeThreadType)
58
+ ? spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType)
423
59
  : { error: `Thread ${threadId} (${name}): copilot CLI not found` };
424
60
  }
425
61
  else if (agentType === "codex" || agentType === "openai_codex") {
@@ -450,13 +86,13 @@ export function dispatchSpawn(agentType, name, threadId, threadLifecycle, workin
450
86
  }
451
87
  export function spawnKeepAliveThreads(threadLifecycle) {
452
88
  const result = { spawned: 0, errors: [] };
453
- startupCleanupInProgress = true;
89
+ setStartupCleanupInProgress(true);
454
90
  let db;
455
91
  try {
456
92
  db = initMemoryDb();
457
93
  }
458
94
  catch (err) {
459
- startupCleanupInProgress = false;
95
+ setStartupCleanupInProgress(false);
460
96
  return { spawned: 0, errors: [`Failed to open DB: ${errorMessage(err)}`] };
461
97
  }
462
98
  let threads;
@@ -475,7 +111,7 @@ export function spawnKeepAliveThreads(threadLifecycle) {
475
111
  threads = getAllThreads(db).filter((thread) => thread.keepAlive && (thread.status === "active" || thread.status === "exited"));
476
112
  }
477
113
  finally {
478
- startupCleanupInProgress = false;
114
+ setStartupCleanupInProgress(false);
479
115
  }
480
116
  if (threads.length === 0)
481
117
  return result;
@@ -483,7 +119,7 @@ export function spawnKeepAliveThreads(threadLifecycle) {
483
119
  for (const thread of threads) {
484
120
  if (findAliveThread(thread.threadId))
485
121
  continue;
486
- const client = thread.client ?? "claude";
122
+ const client = thread.client ?? getAgentType();
487
123
  const spawnResult = dispatchSpawn(client, thread.name, thread.threadId, threadLifecycle, thread.workingDirectory ?? undefined);
488
124
  if ("error" in spawnResult) {
489
125
  result.errors.push(spawnResult.error);
@@ -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"}