@dsiloed/silo-link 1.0.5 → 1.1.0
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/README.md +67 -2
- package/dist/cable/action-cable-client.d.ts +5 -0
- package/dist/cable/action-cable-client.d.ts.map +1 -1
- package/dist/cable/action-cable-client.js +25 -1
- package/dist/cable/action-cable-client.js.map +1 -1
- package/dist/cable/subscription-manager.d.ts.map +1 -1
- package/dist/cable/subscription-manager.js +23 -5
- package/dist/cable/subscription-manager.js.map +1 -1
- package/dist/cli/claude-md-block.d.ts +6 -0
- package/dist/cli/claude-md-block.d.ts.map +1 -0
- package/dist/cli/claude-md-block.js +84 -0
- package/dist/cli/claude-md-block.js.map +1 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +80 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-launcher.d.ts +101 -0
- package/dist/core/agent-launcher.d.ts.map +1 -0
- package/dist/core/agent-launcher.js +2 -0
- package/dist/core/agent-launcher.js.map +1 -0
- package/dist/core/bridge.d.ts +1 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +105 -2
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/claude-launcher.d.ts +50 -5
- package/dist/core/claude-launcher.d.ts.map +1 -1
- package/dist/core/claude-launcher.js +251 -22
- package/dist/core/claude-launcher.js.map +1 -1
- package/dist/core/gemini-launcher.d.ts +32 -0
- package/dist/core/gemini-launcher.d.ts.map +1 -0
- package/dist/core/gemini-launcher.js +55 -0
- package/dist/core/gemini-launcher.js.map +1 -0
- package/dist/core/launcher-factory.d.ts +13 -0
- package/dist/core/launcher-factory.d.ts.map +1 -0
- package/dist/core/launcher-factory.js +24 -0
- package/dist/core/launcher-factory.js.map +1 -0
- package/dist/core/message-queue.d.ts +6 -0
- package/dist/core/message-queue.d.ts.map +1 -1
- package/dist/core/message-queue.js +15 -0
- package/dist/core/message-queue.js.map +1 -1
- package/dist/core/openai-launcher.d.ts +36 -0
- package/dist/core/openai-launcher.d.ts.map +1 -0
- package/dist/core/openai-launcher.js +59 -0
- package/dist/core/openai-launcher.js.map +1 -0
- package/dist/core/workspace-manager.d.ts +65 -0
- package/dist/core/workspace-manager.d.ts.map +1 -0
- package/dist/core/workspace-manager.js +299 -0
- package/dist/core/workspace-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/register-tools.d.ts +2 -0
- package/dist/mcp/tools/register-tools.d.ts.map +1 -1
- package/dist/mcp/tools/register-tools.js +251 -2
- package/dist/mcp/tools/register-tools.js.map +1 -1
- package/dist/types/index.d.ts +28 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Claude Code implementation of the AgentLauncher interface.
|
|
4
4
|
*
|
|
5
5
|
* Strategy:
|
|
6
6
|
* - For SiloLink-spawned sessions: nudge via stdin when idle (preserves context)
|
|
@@ -13,8 +13,10 @@ export class ClaudeLauncher {
|
|
|
13
13
|
config;
|
|
14
14
|
sessionManager;
|
|
15
15
|
dsiloedClient;
|
|
16
|
+
workspaceManager;
|
|
16
17
|
childProcess = null;
|
|
17
18
|
tmuxSessions = new Map(); // tmuxName -> conversationId
|
|
19
|
+
tmuxSessionWorkspaces = new Map(); // tmuxName -> sessionId (for worktree cleanup)
|
|
18
20
|
tmuxMonitorTimer = null;
|
|
19
21
|
idleCheckTimer = null;
|
|
20
22
|
launchingConversations = new Set();
|
|
@@ -27,11 +29,14 @@ export class ClaudeLauncher {
|
|
|
27
29
|
lastClaudeSessionId = null;
|
|
28
30
|
// Message that triggered the current launch (included in prompt for context)
|
|
29
31
|
pendingTriggerMessage = null;
|
|
30
|
-
|
|
32
|
+
// Workspace config for the next launch (set by control channel or API)
|
|
33
|
+
pendingWorkspaceConfig = null;
|
|
34
|
+
constructor(config, sessionManager, dsiloedClient, messageQueue, workspaceManager) {
|
|
31
35
|
this.config = config;
|
|
32
36
|
this.sessionManager = sessionManager;
|
|
33
37
|
this.dsiloedClient = dsiloedClient || null;
|
|
34
38
|
this.messageQueue = messageQueue || null;
|
|
39
|
+
this.workspaceManager = workspaceManager || null;
|
|
35
40
|
this.enabled = !!(config.claude_command && config.claude_working_directory);
|
|
36
41
|
}
|
|
37
42
|
isEnabled() {
|
|
@@ -68,8 +73,9 @@ export class ClaudeLauncher {
|
|
|
68
73
|
}
|
|
69
74
|
/**
|
|
70
75
|
* Launch a new Claude Code session. Uses --resume if a previous session ID is available.
|
|
76
|
+
* This is the internal launch method — use launchAgent() for the AgentLauncher interface.
|
|
71
77
|
*/
|
|
72
|
-
async
|
|
78
|
+
async launchInternal(reason = 'manual', conversationId) {
|
|
73
79
|
if (!this.enabled) {
|
|
74
80
|
console.log('[ClaudeLauncher] Not configured — set claude_command and claude_working_directory in config');
|
|
75
81
|
return false;
|
|
@@ -82,14 +88,39 @@ export class ClaudeLauncher {
|
|
|
82
88
|
this.launchingConversations.add(convKey);
|
|
83
89
|
try {
|
|
84
90
|
const command = this.config.claude_command || 'claude';
|
|
85
|
-
|
|
91
|
+
let cwd = this.config.claude_working_directory || process.cwd();
|
|
86
92
|
const args = ['--dangerously-skip-permissions'];
|
|
93
|
+
// Create a worktree if workspace config is provided
|
|
94
|
+
let workspaceSessionId = null;
|
|
95
|
+
let workspaceBranch = null;
|
|
96
|
+
const wsConfig = this.pendingWorkspaceConfig;
|
|
97
|
+
this.pendingWorkspaceConfig = null;
|
|
98
|
+
if (wsConfig && this.workspaceManager) {
|
|
99
|
+
// Use a temporary session ID for the worktree (will be updated when Claude registers)
|
|
100
|
+
workspaceSessionId = `tmux-${Date.now()}`;
|
|
101
|
+
workspaceBranch = wsConfig.branch;
|
|
102
|
+
try {
|
|
103
|
+
const workspace = this.workspaceManager.createWorktree(workspaceSessionId, wsConfig.repoPath, wsConfig.branch, wsConfig.baseBranch || 'development');
|
|
104
|
+
cwd = workspace.worktreePath;
|
|
105
|
+
console.log(`[ClaudeLauncher] Created worktree at ${cwd} (branch: ${wsConfig.branch})`);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error(`[ClaudeLauncher] Failed to create worktree: ${err}`);
|
|
109
|
+
// Fall back to normal cwd
|
|
110
|
+
workspaceSessionId = null;
|
|
111
|
+
workspaceBranch = null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
87
114
|
let prompt;
|
|
115
|
+
// Build workspace context string for inclusion in prompts
|
|
116
|
+
const workspaceContext = workspaceSessionId
|
|
117
|
+
? `\n\nWORKSPACE: You are working in an isolated git worktree at "${cwd}" on branch "${workspaceBranch}". This is separate from the main repo — your changes won't affect other sessions. Use remote_workspace_claim to claim files before editing, and remote_workspace_check to see what other sessions are working on.`
|
|
118
|
+
: '';
|
|
88
119
|
// Try to resume previous session if we have an ID
|
|
89
120
|
if (this.lastClaudeSessionId && (reason === 'process-exit' || reason === 'inbound-message')) {
|
|
90
121
|
args.push('--resume', this.lastClaudeSessionId);
|
|
91
122
|
console.log(`[ClaudeLauncher] Resuming session: ${this.lastClaudeSessionId}`);
|
|
92
|
-
prompt = 'Continue polling SiloLink for messages. Check memory for context if needed.';
|
|
123
|
+
prompt = 'Continue polling SiloLink for messages. Check memory for context if needed.' + workspaceContext;
|
|
93
124
|
}
|
|
94
125
|
else {
|
|
95
126
|
if (reason === 'process-exit' || reason === 'inbound-message') {
|
|
@@ -112,16 +143,19 @@ export class ClaudeLauncher {
|
|
|
112
143
|
'',
|
|
113
144
|
'CRITICAL: The user is NOT watching the terminal. You MUST send a remote_notify progress update after EVERY major step (file edits, commits, merges, deploys, errors). Do not go silent while working.',
|
|
114
145
|
triggerLine,
|
|
146
|
+
workspaceContext,
|
|
115
147
|
].join('\n');
|
|
116
148
|
}
|
|
117
149
|
else {
|
|
118
|
-
prompt = this.config.claude_session_prompt ||
|
|
119
|
-
'Register with SiloLink as "portablemind" and enter the poll loop.';
|
|
150
|
+
prompt = (this.config.claude_session_prompt ||
|
|
151
|
+
'Register with SiloLink as "portablemind" and enter the poll loop.') + workspaceContext;
|
|
120
152
|
}
|
|
121
153
|
}
|
|
122
154
|
console.log(`[ClaudeLauncher] Launching Claude Code via tmux (reason: ${reason})`);
|
|
123
155
|
console.log(` Command: ${command} ${args.join(' ')}`);
|
|
124
156
|
console.log(` Working directory: ${cwd}`);
|
|
157
|
+
if (workspaceBranch)
|
|
158
|
+
console.log(` Workspace branch: ${workspaceBranch}`);
|
|
125
159
|
console.log(` Prompt: ${prompt.substring(0, 100)}...`);
|
|
126
160
|
const tmuxSession = `silolink-claude-${Date.now()}`;
|
|
127
161
|
// Create a new tmux session running Claude Code in a real TTY
|
|
@@ -146,10 +180,17 @@ export class ClaudeLauncher {
|
|
|
146
180
|
});
|
|
147
181
|
if (!sessionExists) {
|
|
148
182
|
console.error(`[ClaudeLauncher] tmux session ${tmuxSession} failed to start`);
|
|
183
|
+
// Clean up worktree if we created one
|
|
184
|
+
if (workspaceSessionId && this.workspaceManager) {
|
|
185
|
+
this.workspaceManager.removeWorktree(workspaceSessionId);
|
|
186
|
+
}
|
|
149
187
|
return false;
|
|
150
188
|
}
|
|
151
189
|
console.log(`[ClaudeLauncher] tmux session "${tmuxSession}" created`);
|
|
152
190
|
this.tmuxSessions.set(tmuxSession, conversationId || 0);
|
|
191
|
+
if (workspaceSessionId) {
|
|
192
|
+
this.tmuxSessionWorkspaces.set(tmuxSession, workspaceSessionId);
|
|
193
|
+
}
|
|
153
194
|
// Send the prompt to Claude via tmux send-keys after MCP servers initialize
|
|
154
195
|
const sessionToPrompt = tmuxSession;
|
|
155
196
|
const promptToSend = prompt;
|
|
@@ -197,6 +238,13 @@ export class ClaudeLauncher {
|
|
|
197
238
|
}
|
|
198
239
|
}
|
|
199
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Set workspace configuration for the next launch.
|
|
243
|
+
* The worktree will be created when launch() is called.
|
|
244
|
+
*/
|
|
245
|
+
setWorkspaceConfig(config) {
|
|
246
|
+
this.pendingWorkspaceConfig = config;
|
|
247
|
+
}
|
|
200
248
|
/**
|
|
201
249
|
* Called when an inbound message arrives and no active session can handle it.
|
|
202
250
|
* @param triggerMessage - Content of the message that triggered the launch (included in prompt)
|
|
@@ -214,7 +262,7 @@ export class ClaudeLauncher {
|
|
|
214
262
|
}
|
|
215
263
|
// Store trigger message so the launch prompt can include it
|
|
216
264
|
this.pendingTriggerMessage = triggerMessage || null;
|
|
217
|
-
return this.
|
|
265
|
+
return this.launchInternal('inbound-message', conversationId);
|
|
218
266
|
}
|
|
219
267
|
/**
|
|
220
268
|
* Check for idle sessions — nudge if process alive, respawn if dead.
|
|
@@ -224,10 +272,16 @@ export class ClaudeLauncher {
|
|
|
224
272
|
async checkIdle() {
|
|
225
273
|
const sessions = this.sessionManager.getAll();
|
|
226
274
|
const idleTimeout = this.config.claude_idle_timeout_ms || 30000;
|
|
227
|
-
const maxNudges =
|
|
275
|
+
const maxNudges = 10; // Kill after 10 failed nudges (~5 min with no response)
|
|
228
276
|
const now = Date.now();
|
|
229
277
|
if (sessions.length === 0)
|
|
230
278
|
return;
|
|
279
|
+
// Don't nudge sessions that were just created — give them time to
|
|
280
|
+
// process the launch prompt and initial messages before intervening.
|
|
281
|
+
const startupGracePeriod = 90000; // 90 seconds
|
|
282
|
+
const allPastStartup = sessions.every(s => now - s.createdAt.getTime() > startupGracePeriod);
|
|
283
|
+
if (!allPastStartup)
|
|
284
|
+
return;
|
|
231
285
|
const allIdle = sessions.every(s => now - s.lastActivity.getTime() > idleTimeout);
|
|
232
286
|
if (!allIdle) {
|
|
233
287
|
// Activity detected — reset nudge counter and update snapshots
|
|
@@ -250,24 +304,53 @@ export class ClaudeLauncher {
|
|
|
250
304
|
for (const s of sessions) {
|
|
251
305
|
this.lastActivitySnapshot.set(s.sessionId, s.lastActivity.getTime());
|
|
252
306
|
}
|
|
253
|
-
// Check if any session has
|
|
254
|
-
|
|
255
|
-
|
|
307
|
+
// Check if any session has messages that haven't been delivered yet.
|
|
308
|
+
// Messages already polled by Claude (pending ack) don't count — Claude is working on them.
|
|
309
|
+
const hasUndelivered = this.messageQueue && sessions.some(s => this.messageQueue.hasUndeliveredMessages(s.sessionId));
|
|
310
|
+
if (this.nudgeCount >= maxNudges && hasUndelivered) {
|
|
256
311
|
// Session is hung with undelivered messages — kill and relaunch
|
|
257
|
-
console.log(`[ClaudeLauncher] Session hung (${this.nudgeCount} nudges with no response, messages
|
|
258
|
-
const hungSessions = sessions.filter(s => this.messageQueue.
|
|
312
|
+
console.log(`[ClaudeLauncher] Session hung (${this.nudgeCount} nudges with no response, undelivered messages) — killing and relaunching`);
|
|
313
|
+
const hungSessions = sessions.filter(s => this.messageQueue.hasUndeliveredMessages(s.sessionId));
|
|
259
314
|
for (const s of hungSessions) {
|
|
260
315
|
this.killByConversation(s.conversationId);
|
|
316
|
+
if (this.messageQueue) {
|
|
317
|
+
this.messageQueue.clearSession(s.sessionId);
|
|
318
|
+
}
|
|
261
319
|
this.sessionManager.unregister(s.sessionId);
|
|
262
|
-
//
|
|
263
|
-
await
|
|
320
|
+
// Wait for tmux kill to complete before relaunching
|
|
321
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
322
|
+
await this.launchInternal('inbound-message', s.conversationId);
|
|
264
323
|
}
|
|
265
324
|
this.nudgeCount = 0;
|
|
266
325
|
return;
|
|
267
326
|
}
|
|
268
|
-
//
|
|
269
|
-
|
|
270
|
-
|
|
327
|
+
// Kill zombie sessions — only if a session hasn't made any MCP tool call in 10 minutes
|
|
328
|
+
// AND has undelivered messages waiting. A session doing non-MCP work (file edits, bash
|
|
329
|
+
// commands, etc.) is not a zombie — it's just not using SiloLink tools.
|
|
330
|
+
const zombieTimeout = 10 * 60 * 1000; // 10 minutes
|
|
331
|
+
const zombieSessions = sessions.filter(s => now - s.lastActivity.getTime() > zombieTimeout &&
|
|
332
|
+
this.messageQueue?.hasUndeliveredMessages(s.sessionId));
|
|
333
|
+
for (const s of zombieSessions) {
|
|
334
|
+
console.log(`[ClaudeLauncher] Zombie session detected (no MCP activity for ${Math.round((now - s.lastActivity.getTime()) / 60000)}min, has undelivered messages) — killing conv=${s.conversationId}`);
|
|
335
|
+
this.killByConversation(s.conversationId);
|
|
336
|
+
// Clear queue before unregister so messages can be re-buffered on relaunch
|
|
337
|
+
if (this.messageQueue) {
|
|
338
|
+
this.messageQueue.clearSession(s.sessionId);
|
|
339
|
+
}
|
|
340
|
+
this.sessionManager.unregister(s.sessionId);
|
|
341
|
+
// Wait for tmux kill to complete before relaunching
|
|
342
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
343
|
+
console.log(`[ClaudeLauncher] Relaunching for conversation ${s.conversationId} after zombie cleanup`);
|
|
344
|
+
this.launchInternal('inbound-message', s.conversationId).catch(err => {
|
|
345
|
+
console.error(`[ClaudeLauncher] Relaunch after zombie kill failed: ${err}`);
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
// Only nudge if there are messages waiting — no point nudging an idle session
|
|
349
|
+
// that's already polling with nothing to do
|
|
350
|
+
if (hasUndelivered) {
|
|
351
|
+
this.nudge();
|
|
352
|
+
this.nudgeCount++;
|
|
353
|
+
}
|
|
271
354
|
return;
|
|
272
355
|
}
|
|
273
356
|
else if (this.launchingConversations.size === 0) {
|
|
@@ -277,7 +360,7 @@ export class ClaudeLauncher {
|
|
|
277
360
|
}
|
|
278
361
|
console.log(`[ClaudeLauncher] Sessions orphaned (process dead), respawning...`);
|
|
279
362
|
this.nudgeCount = 0;
|
|
280
|
-
await this.
|
|
363
|
+
await this.launchInternal('process-exit', lastConvId);
|
|
281
364
|
}
|
|
282
365
|
}
|
|
283
366
|
/**
|
|
@@ -295,6 +378,13 @@ export class ClaudeLauncher {
|
|
|
295
378
|
check.on('exit', (code) => {
|
|
296
379
|
if (code !== 0) {
|
|
297
380
|
console.log(`[ClaudeLauncher] tmux session "${name}" ended`);
|
|
381
|
+
// Clean up worktree if this session had one
|
|
382
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(name);
|
|
383
|
+
if (wsSessionId && this.workspaceManager) {
|
|
384
|
+
console.log(`[ClaudeLauncher] Cleaning up worktree for workspace session ${wsSessionId}`);
|
|
385
|
+
this.workspaceManager.removeWorktree(wsSessionId);
|
|
386
|
+
this.tmuxSessionWorkspaces.delete(name);
|
|
387
|
+
}
|
|
298
388
|
this.tmuxSessions.delete(name);
|
|
299
389
|
if (this.tmuxSessions.size === 0 && this.tmuxMonitorTimer) {
|
|
300
390
|
clearInterval(this.tmuxMonitorTimer);
|
|
@@ -311,16 +401,46 @@ export class ClaudeLauncher {
|
|
|
311
401
|
if (this.tmuxSessions.size === 0)
|
|
312
402
|
return false;
|
|
313
403
|
const now = Date.now();
|
|
314
|
-
|
|
404
|
+
// Exponential backoff: 30s, 60s, 120s, 240s, ... (capped at 5 min)
|
|
405
|
+
const baseInterval = 30000;
|
|
406
|
+
const interval = Math.min(baseInterval * Math.pow(2, this.nudgeCount), 5 * 60 * 1000);
|
|
407
|
+
if (now - this.lastNudgeAt < interval)
|
|
315
408
|
return false;
|
|
316
409
|
this.lastNudgeAt = now;
|
|
317
410
|
const message = 'Continue polling SiloLink for messages. Do not stop the poll loop.';
|
|
318
411
|
for (const [name] of this.tmuxSessions) {
|
|
319
412
|
spawn('tmux', ['send-keys', '-t', name, message, 'Enter'], { stdio: 'ignore' });
|
|
320
413
|
}
|
|
321
|
-
console.log(`[ClaudeLauncher] Nudged ${this.tmuxSessions.size} Claude session(s) via tmux`);
|
|
414
|
+
console.log(`[ClaudeLauncher] Nudged ${this.tmuxSessions.size} Claude session(s) via tmux (attempt ${this.nudgeCount + 1}, next in ${Math.round(interval / 1000)}s)`);
|
|
322
415
|
return true;
|
|
323
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Interrupt the Claude session for a specific conversation.
|
|
419
|
+
* Sends Escape to stop current work, then redirects Claude to check
|
|
420
|
+
* for new messages via remote_poll.
|
|
421
|
+
*/
|
|
422
|
+
async interrupt(conversationId, message) {
|
|
423
|
+
for (const [name, convId] of this.tmuxSessions) {
|
|
424
|
+
if (convId === conversationId) {
|
|
425
|
+
console.log(`[ClaudeLauncher] Interrupting tmux session "${name}" (conversation ${conversationId})`);
|
|
426
|
+
// Send Escape to interrupt current work
|
|
427
|
+
spawn('tmux', ['send-keys', '-t', name, 'Escape'], { stdio: 'ignore' });
|
|
428
|
+
// Wait for Claude to stop
|
|
429
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
430
|
+
// Tell Claude to check for the new message
|
|
431
|
+
const redirect = message
|
|
432
|
+
|| 'The user interrupted you. Check remote_poll for their latest message and follow those instructions instead.';
|
|
433
|
+
const escapedRedirect = redirect.replace(/"/g, '\\"').replace(/\n/g, ' ');
|
|
434
|
+
spawn('tmux', ['send-keys', '-t', name, escapedRedirect], { stdio: 'ignore' });
|
|
435
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
436
|
+
spawn('tmux', ['send-keys', '-t', name, 'Enter'], { stdio: 'ignore' });
|
|
437
|
+
console.log(`[ClaudeLauncher] Interrupt sent to "${name}"`);
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
console.log(`[ClaudeLauncher] No tmux session found for conversation ${conversationId} to interrupt`);
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
324
444
|
/**
|
|
325
445
|
* Kill the Claude session for a specific conversation.
|
|
326
446
|
*/
|
|
@@ -328,6 +448,12 @@ export class ClaudeLauncher {
|
|
|
328
448
|
for (const [name, convId] of this.tmuxSessions) {
|
|
329
449
|
if (convId === conversationId) {
|
|
330
450
|
console.log(`[ClaudeLauncher] Killing tmux session "${name}" (conversation ${conversationId})`);
|
|
451
|
+
// Clean up worktree
|
|
452
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(name);
|
|
453
|
+
if (wsSessionId && this.workspaceManager) {
|
|
454
|
+
this.workspaceManager.removeWorktree(wsSessionId);
|
|
455
|
+
this.tmuxSessionWorkspaces.delete(name);
|
|
456
|
+
}
|
|
331
457
|
spawn('tmux', ['kill-session', '-t', name], { stdio: 'ignore' });
|
|
332
458
|
this.tmuxSessions.delete(name);
|
|
333
459
|
return;
|
|
@@ -341,9 +467,15 @@ export class ClaudeLauncher {
|
|
|
341
467
|
kill() {
|
|
342
468
|
for (const [name] of this.tmuxSessions) {
|
|
343
469
|
console.log(`[ClaudeLauncher] Killing tmux session "${name}"`);
|
|
470
|
+
// Clean up worktree
|
|
471
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(name);
|
|
472
|
+
if (wsSessionId && this.workspaceManager) {
|
|
473
|
+
this.workspaceManager.removeWorktree(wsSessionId);
|
|
474
|
+
}
|
|
344
475
|
spawn('tmux', ['kill-session', '-t', name], { stdio: 'ignore' });
|
|
345
476
|
}
|
|
346
477
|
this.tmuxSessions.clear();
|
|
478
|
+
this.tmuxSessionWorkspaces.clear();
|
|
347
479
|
if (this.tmuxMonitorTimer) {
|
|
348
480
|
clearInterval(this.tmuxMonitorTimer);
|
|
349
481
|
this.tmuxMonitorTimer = null;
|
|
@@ -353,6 +485,103 @@ export class ClaudeLauncher {
|
|
|
353
485
|
this.childProcess = null;
|
|
354
486
|
}
|
|
355
487
|
}
|
|
488
|
+
// ---- AgentLauncher interface methods ----
|
|
489
|
+
/**
|
|
490
|
+
* Launch a new agent process (AgentLauncher interface).
|
|
491
|
+
*/
|
|
492
|
+
async launch(config) {
|
|
493
|
+
if (config.workspace) {
|
|
494
|
+
this.setWorkspaceConfig(config.workspace);
|
|
495
|
+
}
|
|
496
|
+
if (config.triggerMessage) {
|
|
497
|
+
this.pendingTriggerMessage = config.triggerMessage;
|
|
498
|
+
}
|
|
499
|
+
if (config.sessionPrompt) {
|
|
500
|
+
this.config.claude_session_prompt = config.sessionPrompt;
|
|
501
|
+
}
|
|
502
|
+
const success = await this.launchInternal(config.reason, config.conversationId);
|
|
503
|
+
if (!success)
|
|
504
|
+
return null;
|
|
505
|
+
// Find the process we just created (most recent tmux session)
|
|
506
|
+
const entries = Array.from(this.tmuxSessions.entries());
|
|
507
|
+
const latest = entries[entries.length - 1];
|
|
508
|
+
if (!latest)
|
|
509
|
+
return null;
|
|
510
|
+
const [processId, conversationId] = latest;
|
|
511
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(processId);
|
|
512
|
+
return {
|
|
513
|
+
processId,
|
|
514
|
+
conversationId,
|
|
515
|
+
workingDirectory: this.config.claude_working_directory || process.cwd(),
|
|
516
|
+
branch: config.workspace?.branch,
|
|
517
|
+
workspaceSessionId: wsSessionId || undefined,
|
|
518
|
+
startedAt: new Date(),
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Resume a previous session by ID.
|
|
523
|
+
*/
|
|
524
|
+
async resume(resumeId, config) {
|
|
525
|
+
this.setLastResumeId(resumeId);
|
|
526
|
+
return this.launch({ ...config, reason: 'process-exit' });
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Check if a specific process is still alive.
|
|
530
|
+
*/
|
|
531
|
+
async isAlive(process) {
|
|
532
|
+
return new Promise(resolve => {
|
|
533
|
+
const check = spawn('tmux', ['has-session', '-t', process.processId], { stdio: 'ignore' });
|
|
534
|
+
check.on('exit', code => resolve(code === 0));
|
|
535
|
+
check.on('error', () => resolve(false));
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Terminate a specific agent process.
|
|
540
|
+
*/
|
|
541
|
+
terminate(process) {
|
|
542
|
+
this.killByConversation(process.conversationId);
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Terminate all managed agent processes.
|
|
546
|
+
*/
|
|
547
|
+
terminateAll() {
|
|
548
|
+
this.kill();
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Get all currently running agent processes.
|
|
552
|
+
*/
|
|
553
|
+
getProcesses() {
|
|
554
|
+
const processes = [];
|
|
555
|
+
for (const [processId, conversationId] of this.tmuxSessions) {
|
|
556
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(processId);
|
|
557
|
+
processes.push({
|
|
558
|
+
processId,
|
|
559
|
+
conversationId,
|
|
560
|
+
workingDirectory: this.config.claude_working_directory || process.cwd(),
|
|
561
|
+
workspaceSessionId: wsSessionId,
|
|
562
|
+
startedAt: new Date(), // Approximate — we don't track exact start time per tmux session
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
return processes;
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Get the process handling a specific conversation.
|
|
569
|
+
*/
|
|
570
|
+
getByConversation(conversationId) {
|
|
571
|
+
for (const [processId, convId] of this.tmuxSessions) {
|
|
572
|
+
if (convId === conversationId) {
|
|
573
|
+
const wsSessionId = this.tmuxSessionWorkspaces.get(processId);
|
|
574
|
+
return {
|
|
575
|
+
processId,
|
|
576
|
+
conversationId,
|
|
577
|
+
workingDirectory: this.config.claude_working_directory || process.cwd(),
|
|
578
|
+
workspaceSessionId: wsSessionId,
|
|
579
|
+
startedAt: new Date(),
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return undefined;
|
|
584
|
+
}
|
|
356
585
|
destroy() {
|
|
357
586
|
this.stopIdleMonitor();
|
|
358
587
|
this.kill();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-launcher.js","sourceRoot":"","sources":["../../src/core/claude-launcher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude-launcher.js","sourceRoot":"","sources":["../../src/core/claude-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentLauncher, LaunchConfig, AgentProcess } from './agent-launcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Gemini implementation of the AgentLauncher interface.
|
|
4
|
+
*
|
|
5
|
+
* Google Gemini supports MCP natively, so the SiloLink tool layer
|
|
6
|
+
* (remote_register, remote_poll, remote_notify, etc.) should work
|
|
7
|
+
* without modification. The launcher only needs to handle process
|
|
8
|
+
* lifecycle — spawning a Gemini CLI session and managing its state.
|
|
9
|
+
*
|
|
10
|
+
* TODO: Implementation notes:
|
|
11
|
+
* - Gemini CLI: `gemini` command (or Google AI Studio CLI)
|
|
12
|
+
* - MCP support: Native — configure via gemini's MCP config
|
|
13
|
+
* - Session resume: Check if Gemini CLI supports session persistence
|
|
14
|
+
* - Working directory: Same worktree integration as Claude
|
|
15
|
+
* - Prompt injection: Same tmux send-keys approach as Claude,
|
|
16
|
+
* or use Gemini's stdin pipe if supported
|
|
17
|
+
*/
|
|
18
|
+
export declare class GeminiLauncher implements AgentLauncher {
|
|
19
|
+
launch(_config: LaunchConfig): Promise<AgentProcess | null>;
|
|
20
|
+
resume(_resumeId: string, _config: LaunchConfig): Promise<AgentProcess | null>;
|
|
21
|
+
isAlive(_process: AgentProcess): Promise<boolean>;
|
|
22
|
+
terminate(_process: AgentProcess): void;
|
|
23
|
+
terminateAll(): void;
|
|
24
|
+
getProcesses(): AgentProcess[];
|
|
25
|
+
getByConversation(_conversationId: number): AgentProcess | undefined;
|
|
26
|
+
nudge(): boolean;
|
|
27
|
+
isEnabled(): boolean;
|
|
28
|
+
isAutoRespawnEnabled(): boolean;
|
|
29
|
+
startIdleMonitor(): void;
|
|
30
|
+
destroy(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=gemini-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-launcher.d.ts","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,cAAe,YAAW,aAAa;IAC5C,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI3D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI9E,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIvC,YAAY,IAAI,IAAI;IAIpB,YAAY,IAAI,YAAY,EAAE;IAI9B,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIpE,KAAK,IAAI,OAAO;IAIhB,SAAS,IAAI,OAAO;IAIpB,oBAAoB,IAAI,OAAO;IAI/B,gBAAgB,IAAI,IAAI;IAIxB,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini implementation of the AgentLauncher interface.
|
|
3
|
+
*
|
|
4
|
+
* Google Gemini supports MCP natively, so the SiloLink tool layer
|
|
5
|
+
* (remote_register, remote_poll, remote_notify, etc.) should work
|
|
6
|
+
* without modification. The launcher only needs to handle process
|
|
7
|
+
* lifecycle — spawning a Gemini CLI session and managing its state.
|
|
8
|
+
*
|
|
9
|
+
* TODO: Implementation notes:
|
|
10
|
+
* - Gemini CLI: `gemini` command (or Google AI Studio CLI)
|
|
11
|
+
* - MCP support: Native — configure via gemini's MCP config
|
|
12
|
+
* - Session resume: Check if Gemini CLI supports session persistence
|
|
13
|
+
* - Working directory: Same worktree integration as Claude
|
|
14
|
+
* - Prompt injection: Same tmux send-keys approach as Claude,
|
|
15
|
+
* or use Gemini's stdin pipe if supported
|
|
16
|
+
*/
|
|
17
|
+
export class GeminiLauncher {
|
|
18
|
+
async launch(_config) {
|
|
19
|
+
throw new Error('GeminiLauncher not yet implemented');
|
|
20
|
+
}
|
|
21
|
+
async resume(_resumeId, _config) {
|
|
22
|
+
throw new Error('GeminiLauncher not yet implemented');
|
|
23
|
+
}
|
|
24
|
+
async isAlive(_process) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
terminate(_process) {
|
|
28
|
+
// TODO: Kill Gemini process
|
|
29
|
+
}
|
|
30
|
+
terminateAll() {
|
|
31
|
+
// TODO: Kill all Gemini processes
|
|
32
|
+
}
|
|
33
|
+
getProcesses() {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
getByConversation(_conversationId) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
nudge() {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
isEnabled() {
|
|
43
|
+
return false; // Not yet implemented
|
|
44
|
+
}
|
|
45
|
+
isAutoRespawnEnabled() {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
startIdleMonitor() {
|
|
49
|
+
// TODO: Implement idle monitoring for Gemini sessions
|
|
50
|
+
}
|
|
51
|
+
destroy() {
|
|
52
|
+
this.terminateAll();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=gemini-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-launcher.js","sourceRoot":"","sources":["../../src/core/gemini-launcher.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,MAAM,CAAC,OAAqB;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAAqB;QACnD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAsB;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,CAAC,QAAsB;QAC9B,4BAA4B;IAC9B,CAAC;IAED,YAAY;QACV,kCAAkC;IACpC,CAAC;IAED,YAAY;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iBAAiB,CAAC,eAAuB;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS;QACP,OAAO,KAAK,CAAC,CAAC,sBAAsB;IACtC,CAAC;IAED,oBAAoB;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB;QACd,sDAAsD;IACxD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SiloLinkConfig } from '../types/index.js';
|
|
2
|
+
import type { SessionManager } from './session-manager.js';
|
|
3
|
+
import type { MessageQueue } from './message-queue.js';
|
|
4
|
+
import type { DSiloedClient } from '../api/dsiloed-client.js';
|
|
5
|
+
import type { WorkspaceManager } from './workspace-manager.js';
|
|
6
|
+
import type { AgentLauncher } from './agent-launcher.js';
|
|
7
|
+
export type AgentProvider = 'claude' | 'gemini' | 'openai';
|
|
8
|
+
/**
|
|
9
|
+
* Creates the appropriate AgentLauncher based on provider configuration.
|
|
10
|
+
* Falls back to ClaudeLauncher if no provider is specified.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createLauncher(provider: AgentProvider | undefined, config: SiloLinkConfig, sessionManager: SessionManager, dsiloedClient?: DSiloedClient, messageQueue?: MessageQueue, workspaceManager?: WorkspaceManager): AgentLauncher;
|
|
13
|
+
//# sourceMappingURL=launcher-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher-factory.d.ts","sourceRoot":"","sources":["../../src/core/launcher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,aAAa,CAmBf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ClaudeLauncher } from './claude-launcher.js';
|
|
2
|
+
import { GeminiLauncher } from './gemini-launcher.js';
|
|
3
|
+
import { OpenAILauncher } from './openai-launcher.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates the appropriate AgentLauncher based on provider configuration.
|
|
6
|
+
* Falls back to ClaudeLauncher if no provider is specified.
|
|
7
|
+
*/
|
|
8
|
+
export function createLauncher(provider, config, sessionManager, dsiloedClient, messageQueue, workspaceManager) {
|
|
9
|
+
const resolvedProvider = provider || config.agent_provider || 'claude';
|
|
10
|
+
switch (resolvedProvider) {
|
|
11
|
+
case 'claude':
|
|
12
|
+
return new ClaudeLauncher(config, sessionManager, dsiloedClient, messageQueue, workspaceManager);
|
|
13
|
+
case 'gemini':
|
|
14
|
+
console.log('[LauncherFactory] Gemini provider selected (stub — not yet implemented)');
|
|
15
|
+
return new GeminiLauncher();
|
|
16
|
+
case 'openai':
|
|
17
|
+
console.log('[LauncherFactory] OpenAI provider selected (stub — not yet implemented)');
|
|
18
|
+
return new OpenAILauncher();
|
|
19
|
+
default:
|
|
20
|
+
console.warn(`[LauncherFactory] Unknown provider "${resolvedProvider}", falling back to Claude`);
|
|
21
|
+
return new ClaudeLauncher(config, sessionManager, dsiloedClient, messageQueue, workspaceManager);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=launcher-factory.js.map
|