@dsiloed/silo-link 1.3.0 → 1.5.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.
Files changed (58) hide show
  1. package/dist/api/dsiloed-client.d.ts +30 -0
  2. package/dist/api/dsiloed-client.d.ts.map +1 -1
  3. package/dist/api/dsiloed-client.js +66 -0
  4. package/dist/api/dsiloed-client.js.map +1 -1
  5. package/dist/cable/subscription-manager.d.ts +7 -3
  6. package/dist/cable/subscription-manager.d.ts.map +1 -1
  7. package/dist/cable/subscription-manager.js +36 -11
  8. package/dist/cable/subscription-manager.js.map +1 -1
  9. package/dist/cli/commands.d.ts.map +1 -1
  10. package/dist/cli/commands.js +118 -27
  11. package/dist/cli/commands.js.map +1 -1
  12. package/dist/config/config-manager.d.ts +4 -4
  13. package/dist/config/config-manager.d.ts.map +1 -1
  14. package/dist/config/config-manager.js +30 -15
  15. package/dist/config/config-manager.js.map +1 -1
  16. package/dist/core/agent-launcher.d.ts +30 -1
  17. package/dist/core/agent-launcher.d.ts.map +1 -1
  18. package/dist/core/base-tmux-launcher.d.ts +106 -0
  19. package/dist/core/base-tmux-launcher.d.ts.map +1 -0
  20. package/dist/core/base-tmux-launcher.js +506 -0
  21. package/dist/core/base-tmux-launcher.js.map +1 -0
  22. package/dist/core/bridge.d.ts +19 -2
  23. package/dist/core/bridge.d.ts.map +1 -1
  24. package/dist/core/bridge.js +155 -37
  25. package/dist/core/bridge.js.map +1 -1
  26. package/dist/core/claude-launcher.d.ts +28 -100
  27. package/dist/core/claude-launcher.d.ts.map +1 -1
  28. package/dist/core/claude-launcher.js +164 -487
  29. package/dist/core/claude-launcher.js.map +1 -1
  30. package/dist/core/gemini-launcher.d.ts +37 -27
  31. package/dist/core/gemini-launcher.d.ts.map +1 -1
  32. package/dist/core/gemini-launcher.js +135 -38
  33. package/dist/core/gemini-launcher.js.map +1 -1
  34. package/dist/core/launcher-factory.d.ts.map +1 -1
  35. package/dist/core/launcher-factory.js +1 -2
  36. package/dist/core/launcher-factory.js.map +1 -1
  37. package/dist/core/openai-launcher.d.ts +14 -17
  38. package/dist/core/openai-launcher.d.ts.map +1 -1
  39. package/dist/core/openai-launcher.js +23 -44
  40. package/dist/core/openai-launcher.js.map +1 -1
  41. package/dist/core/session-manager.d.ts +3 -0
  42. package/dist/core/session-manager.d.ts.map +1 -1
  43. package/dist/core/session-manager.js +11 -0
  44. package/dist/core/session-manager.js.map +1 -1
  45. package/dist/core/workspace-manager.d.ts.map +1 -1
  46. package/dist/core/workspace-manager.js +53 -16
  47. package/dist/core/workspace-manager.js.map +1 -1
  48. package/dist/mcp/server.d.ts +3 -0
  49. package/dist/mcp/server.d.ts.map +1 -1
  50. package/dist/mcp/server.js +19 -2
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/mcp/tools/register-tools.d.ts +2 -0
  53. package/dist/mcp/tools/register-tools.d.ts.map +1 -1
  54. package/dist/mcp/tools/register-tools.js +174 -16
  55. package/dist/mcp/tools/register-tools.js.map +1 -1
  56. package/dist/types/index.d.ts +11 -1
  57. package/dist/types/index.d.ts.map +1 -1
  58. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { execSync } from 'node:child_process';
2
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { homedir } from 'node:os';
5
5
  const STATE_DIR = join(homedir(), '.silolink');
@@ -27,22 +27,38 @@ export class WorkspaceManager {
27
27
  const worktreePath = join(STATE_DIR, 'worktrees', repoName, branch);
28
28
  // Ensure the parent directory exists
29
29
  mkdirSync(join(STATE_DIR, 'worktrees', repoName), { recursive: true });
30
- // Fetch latest from remote
30
+ // Validate baseBranch exists; fall back to current HEAD if not
31
+ let effectiveBaseBranch = baseBranch;
31
32
  try {
32
- execSync(`git -C "${absRepoPath}" fetch origin ${baseBranch}`, { stdio: 'pipe' });
33
+ execFileSync('git', ['-C', absRepoPath, 'rev-parse', '--verify', baseBranch], { stdio: 'pipe' });
33
34
  }
34
35
  catch {
35
- // Non-fatal: might be offline or baseBranch might be local-only
36
- console.warn(`[WorkspaceManager] Could not fetch origin/${baseBranch} (non-fatal)`);
36
+ // baseBranch doesn't exist locally try fetching it
37
+ try {
38
+ execFileSync('git', ['-C', absRepoPath, 'fetch', 'origin', baseBranch], { stdio: 'pipe' });
39
+ effectiveBaseBranch = `origin/${baseBranch}`;
40
+ }
41
+ catch {
42
+ // baseBranch doesn't exist at all — fall back to current branch
43
+ effectiveBaseBranch = execFileSync('git', ['-C', absRepoPath, 'rev-parse', '--abbrev-ref', 'HEAD'], { stdio: 'pipe' }).toString().trim();
44
+ console.warn(`[WorkspaceManager] Base branch "${baseBranch}" not found, using "${effectiveBaseBranch}"`);
45
+ }
46
+ }
47
+ // Fetch latest from remote (non-fatal)
48
+ try {
49
+ execFileSync('git', ['-C', absRepoPath, 'fetch', 'origin', effectiveBaseBranch.replace('origin/', '')], { stdio: 'pipe' });
50
+ }
51
+ catch {
52
+ // Non-fatal: might be offline or branch might be local-only
37
53
  }
38
54
  // Create the worktree with a new branch from baseBranch
39
55
  try {
40
- execSync(`git -C "${absRepoPath}" worktree add -b "${branch}" "${worktreePath}" "${baseBranch}"`, { stdio: 'pipe' });
56
+ execFileSync('git', ['-C', absRepoPath, 'worktree', 'add', '-b', branch, worktreePath, effectiveBaseBranch], { stdio: 'pipe' });
41
57
  }
42
58
  catch (err) {
43
59
  // Branch might already exist — try checking it out instead
44
60
  try {
45
- execSync(`git -C "${absRepoPath}" worktree add "${worktreePath}" "${branch}"`, { stdio: 'pipe' });
61
+ execFileSync('git', ['-C', absRepoPath, 'worktree', 'add', worktreePath, branch], { stdio: 'pipe' });
46
62
  }
47
63
  catch (innerErr) {
48
64
  throw new Error(`Failed to create worktree: ${innerErr}`);
@@ -59,6 +75,18 @@ export class WorkspaceManager {
59
75
  };
60
76
  this.workspaces.set(sessionId, workspace);
61
77
  this.saveState();
78
+ // Copy .mcp.json into the worktree so Claude Code sessions have MCP tools
79
+ const mcpSource = join(absRepoPath, '.mcp.json');
80
+ const mcpTarget = join(worktreePath, '.mcp.json');
81
+ try {
82
+ if (existsSync(mcpSource) && !existsSync(mcpTarget)) {
83
+ copyFileSync(mcpSource, mcpTarget);
84
+ console.log(`[WorkspaceManager] Copied .mcp.json into worktree: ${mcpTarget}`);
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.warn(`[WorkspaceManager] Failed to copy .mcp.json to worktree: ${err}`);
89
+ }
62
90
  console.log(`[WorkspaceManager] Created worktree: ${worktreePath} (branch: ${branch}, base: ${baseBranch})`);
63
91
  return workspace;
64
92
  }
@@ -71,7 +99,7 @@ export class WorkspaceManager {
71
99
  return;
72
100
  // Check for uncommitted changes
73
101
  try {
74
- const status = execSync(`git -C "${workspace.worktreePath}" status --porcelain`, { encoding: 'utf-8' }).trim();
102
+ const status = execFileSync('git', ['-C', workspace.worktreePath, 'status', '--porcelain'], { encoding: 'utf-8' }).trim();
75
103
  if (status) {
76
104
  console.warn(`[WorkspaceManager] Worktree ${workspace.worktreePath} has uncommitted changes — skipping removal`);
77
105
  console.warn(` Uncommitted files:\n ${status.split('\n').join('\n ')}`);
@@ -86,7 +114,7 @@ export class WorkspaceManager {
86
114
  }
87
115
  // Remove the git worktree
88
116
  try {
89
- execSync(`git -C "${workspace.repoPath}" worktree remove "${workspace.worktreePath}" --force`, { stdio: 'pipe' });
117
+ execFileSync('git', ['-C', workspace.repoPath, 'worktree', 'remove', workspace.worktreePath, '--force'], { stdio: 'pipe' });
90
118
  console.log(`[WorkspaceManager] Removed worktree: ${workspace.worktreePath}`);
91
119
  }
92
120
  catch (err) {
@@ -168,7 +196,7 @@ export class WorkspaceManager {
168
196
  };
169
197
  // Ensure all changes in worktree are committed
170
198
  try {
171
- const status = execSync(`git -C "${workspace.worktreePath}" status --porcelain`, { encoding: 'utf-8' }).trim();
199
+ const status = execFileSync('git', ['-C', workspace.worktreePath, 'status', '--porcelain'], { encoding: 'utf-8' }).trim();
172
200
  if (status) {
173
201
  result.conflicts = ['UNCOMMITTED_CHANGES'];
174
202
  return result;
@@ -181,19 +209,28 @@ export class WorkspaceManager {
181
209
  // Switch to the main repo and merge
182
210
  try {
183
211
  // Checkout baseBranch in main repo
184
- execSync(`git -C "${workspace.repoPath}" checkout "${workspace.baseBranch}"`, { stdio: 'pipe' });
212
+ execFileSync('git', ['-C', workspace.repoPath, 'checkout', workspace.baseBranch], { stdio: 'pipe' });
185
213
  // Merge the worktree branch
186
214
  try {
187
- execSync(`git -C "${workspace.repoPath}" merge "${workspace.branch}" --no-ff -m "Merge ${workspace.branch} into ${workspace.baseBranch}"`, { stdio: 'pipe' });
215
+ execFileSync('git', ['-C', workspace.repoPath, 'merge', workspace.branch, '--no-ff', '-m', `Merge ${workspace.branch} into ${workspace.baseBranch}`], { stdio: 'pipe' });
188
216
  result.success = true;
217
+ // Capture merge details
218
+ try {
219
+ result.mergeCommit = execFileSync('git', ['-C', workspace.repoPath, 'rev-parse', 'HEAD'], { encoding: 'utf-8' }).trim();
220
+ const diffStat = execFileSync('git', ['-C', workspace.repoPath, 'diff', '--stat', 'HEAD~1', '--numstat'], { encoding: 'utf-8' }).trim();
221
+ result.filesChanged = diffStat ? diffStat.split('\n').length : 0;
222
+ }
223
+ catch {
224
+ // Non-fatal — merge succeeded even if stats fail
225
+ }
189
226
  }
190
227
  catch {
191
228
  // Merge conflict — get the list of conflicting files
192
- const conflictOutput = execSync(`git -C "${workspace.repoPath}" diff --name-only --diff-filter=U`, { encoding: 'utf-8' }).trim();
229
+ const conflictOutput = execFileSync('git', ['-C', workspace.repoPath, 'diff', '--name-only', '--diff-filter=U'], { encoding: 'utf-8' }).trim();
193
230
  result.conflicts = conflictOutput ? conflictOutput.split('\n') : ['UNKNOWN_MERGE_CONFLICT'];
194
231
  // Abort the merge so we don't leave repo in a dirty state
195
232
  try {
196
- execSync(`git -C "${workspace.repoPath}" merge --abort`, { stdio: 'pipe' });
233
+ execFileSync('git', ['-C', workspace.repoPath, 'merge', '--abort'], { stdio: 'pipe' });
197
234
  }
198
235
  catch { /* already clean */ }
199
236
  return result;
@@ -202,7 +239,7 @@ export class WorkspaceManager {
202
239
  this.removeWorktree(sessionId);
203
240
  if (deleteBranch) {
204
241
  try {
205
- execSync(`git -C "${workspace.repoPath}" branch -d "${workspace.branch}"`, { stdio: 'pipe' });
242
+ execFileSync('git', ['-C', workspace.repoPath, 'branch', '-d', workspace.branch], { stdio: 'pipe' });
206
243
  }
207
244
  catch {
208
245
  console.warn(`[WorkspaceManager] Could not delete branch ${workspace.branch} (may have been already removed with worktree)`);
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-manager.js","sourceRoot":"","sources":["../../src/core/workspace-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-manager.js","sourceRoot":"","sources":["../../src/core/workspace-manager.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import type { SubscriptionManager } from '../cable/subscription-manager.js';
5
5
  import type { ActionCableClient } from '../cable/action-cable-client.js';
6
6
  import type { SiloLinkConfig } from '../types/index.js';
7
7
  import type { WorkspaceManager } from '../core/workspace-manager.js';
8
+ import type { AgentLauncher } from '../core/agent-launcher.js';
8
9
  interface McpServerDeps {
9
10
  config: SiloLinkConfig;
10
11
  sessionManager: SessionManager;
@@ -13,6 +14,8 @@ interface McpServerDeps {
13
14
  subscriptionManager: SubscriptionManager;
14
15
  cableClient: ActionCableClient;
15
16
  workspaceManager?: WorkspaceManager;
17
+ launcher?: AgentLauncher;
18
+ startedAt?: () => Date | null;
16
19
  }
17
20
  export declare class SiloLinkMcpServer {
18
21
  private app;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,UAAU,aAAa;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,IAAI,CAAgB;gBAEhB,IAAI,EAAE,aAAa;IAO/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,WAAW;IAoEnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAe5B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,UAAU,aAAa;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC/B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,IAAI,CAAgB;gBAEhB,IAAI,EAAE,aAAa;IAO/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,WAAW;IAqFnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAe5B"}
@@ -73,11 +73,28 @@ export class SiloLinkMcpServer {
73
73
  }
74
74
  await this.transports.get(sessionId).handleRequest(req, res);
75
75
  });
76
- // Health check
76
+ /**
77
+ * GET /health — Server health check endpoint.
78
+ *
79
+ * Returns operational status, uptime, session count, and ActionCable state.
80
+ * Requires no authentication — suitable for load balancers and monitoring.
81
+ *
82
+ * @returns {object} Health status
83
+ * @returns {string} .status - Always "ok" when the server is running
84
+ * @returns {number|null} .uptime_seconds - Seconds since bridge startup, null if not yet started
85
+ * @returns {number} .active_sessions - Count of currently registered Claude Code sessions
86
+ * @returns {string} .cable - ActionCable WebSocket state:
87
+ * "connected" | "disconnected" | "connecting" | "reconnecting"
88
+ */
77
89
  this.app.get('/health', (_req, res) => {
90
+ const startedAt = this.deps.startedAt?.();
91
+ const uptimeSeconds = startedAt
92
+ ? Math.floor((Date.now() - startedAt.getTime()) / 1000)
93
+ : null;
78
94
  res.json({
79
95
  status: 'ok',
80
- sessions: this.deps.sessionManager.getAll().length,
96
+ uptime_seconds: uptimeSeconds,
97
+ active_sessions: this.deps.sessionManager.getAll().length,
81
98
  cable: this.deps.cableClient.getState(),
82
99
  });
83
100
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import type { SubscriptionManager } from '../../cable/subscription-manager.js';
7
7
  import type { ActionCableClient } from '../../cable/action-cable-client.js';
8
8
  import type { SiloLinkConfig } from '../../types/index.js';
9
9
  import type { WorkspaceManager } from '../../core/workspace-manager.js';
10
+ import type { AgentLauncher } from '../../core/agent-launcher.js';
10
11
  interface ToolDeps {
11
12
  config: SiloLinkConfig;
12
13
  sessionManager: SessionManager;
@@ -15,6 +16,7 @@ interface ToolDeps {
15
16
  subscriptionManager: SubscriptionManager;
16
17
  cableClient: ActionCableClient;
17
18
  workspaceManager?: WorkspaceManager;
19
+ launcher?: AgentLauncher;
18
20
  }
19
21
  export declare function registerTools(server: McpServer, transport: StreamableHTTPServerTransport, deps: ToolDeps): void;
20
22
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIxE,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAqBD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,6BAA6B,EACxC,IAAI,EAAE,QAAQ,GACb,IAAI,CAszBN"}
1
+ {"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgCD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,6BAA6B,EACxC,IAAI,EAAE,QAAQ,GACb,IAAI,CAg/BN"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { randomUUID } from 'node:crypto';
3
- import { execSync } from 'node:child_process';
3
+ import { execFileSync } from 'node:child_process';
4
4
  function getSessionForTransport(transport, sessionManager) {
5
5
  const mcpSessionId = transport.sessionId;
6
6
  if (!mcpSessionId)
@@ -11,6 +11,16 @@ function getSessionForTransport(transport, sessionManager) {
11
11
  * Update agent session status only if it has actually changed.
12
12
  * Avoids redundant API calls (e.g. poll loop firing every 3s).
13
13
  */
14
+ /**
15
+ * Get the display prefix for messages based on the session's coding agent.
16
+ */
17
+ function getAgentPrefix(session) {
18
+ switch (session.agentProvider) {
19
+ case 'gemini': return '**[Gemini]**';
20
+ case 'openai': return '**[OpenAI]**';
21
+ default: return '**[Claude Code]**';
22
+ }
23
+ }
14
24
  function setAgentStatus(session, status, dsiloedClient) {
15
25
  if (!session.agentSessionId || session.lastAgentStatus === status)
16
26
  return;
@@ -23,7 +33,8 @@ export function registerTools(server, transport, deps) {
23
33
  server.tool('remote_register', 'Register session. Creates or attaches to a conversation.', {
24
34
  session_name: z.string().optional().describe('Human-readable name for this session'),
25
35
  conversation_id: z.number().optional().describe('Existing conversation ID to attach to (skips conversation creation)'),
26
- }, async ({ session_name, conversation_id }) => {
36
+ llm_agent_id: z.number().optional().describe('LlmAgent ID if this session belongs to an SDLC agent'),
37
+ }, async ({ session_name, conversation_id, llm_agent_id }) => {
27
38
  const mcpSessionId = transport.sessionId;
28
39
  if (!mcpSessionId) {
29
40
  return { content: [{ type: 'text', text: JSON.stringify({ success: false, reason: 'No MCP session' }) }] };
@@ -98,16 +109,31 @@ export function registerTools(server, transport, deps) {
98
109
  mcpSessionId,
99
110
  createdAt: new Date(),
100
111
  lastActivity: new Date(),
112
+ llmAgentId: llm_agent_id ?? conversation.accessor_record_id,
101
113
  };
102
114
  sessionManager.register(session);
103
115
  subscriptionManager.subscribe(conversation.id);
104
116
  // Drain any messages that arrived before this session registered
105
117
  subscriptionManager.drainPendingMessages(conversation.id, sessionId);
106
- // Create agent session for Mission Control dashboard
107
- const agentSession = await dsiloedClient.createAgentSession({
118
+ // Link to active LlmAgentRun if this session belongs to an agent
119
+ let llmAgentRunId;
120
+ if (session.llmAgentId) {
121
+ const activeRun = await dsiloedClient.getActiveAgentRun(session.llmAgentId);
122
+ if (activeRun) {
123
+ llmAgentRunId = activeRun.id;
124
+ console.log(`[SiloLink] Linked to LlmAgentRun ${llmAgentRunId} for agent ${session.llmAgentId}`);
125
+ }
126
+ }
127
+ // Find existing agent session for this conversation (created by SilolinkLaunchService)
128
+ // or create a new one for Mission Control dashboard
129
+ const existingSessions = await dsiloedClient.getAgentSessionsForConversation(conversation.id);
130
+ const existingActive = existingSessions.find(s => !s.ended_at);
131
+ const agentSession = existingActive || await dsiloedClient.createAgentSession({
108
132
  session_type: 'silolink',
109
133
  session_name: name,
110
134
  llm_conversation_id: conversation.id,
135
+ llm_agent_id: session.llmAgentId,
136
+ metadata: llmAgentRunId ? { llm_agent_run_id: llmAgentRunId } : undefined,
111
137
  });
112
138
  if (agentSession) {
113
139
  session.agentSessionId = agentSession.id;
@@ -233,7 +259,8 @@ export function registerTools(server, transport, deps) {
233
259
  return { content: [{ type: 'text', text: JSON.stringify({ success: false, reason: 'WebSocket disconnected' }) }] };
234
260
  }
235
261
  try {
236
- const prefixed = message.startsWith('**[Claude Code]**') ? message : `**[Claude Code]** ${message}`;
262
+ const prefix = getAgentPrefix(session);
263
+ const prefixed = message.startsWith(prefix) ? message : `${prefix} ${message}`;
237
264
  const result = await dsiloedClient.postMessage(session.conversationId, prefixed);
238
265
  if (result.id) {
239
266
  subscriptionManager.trackOutboundMessageId(result.id);
@@ -250,6 +277,35 @@ export function registerTools(server, transport, deps) {
250
277
  return { content: [{ type: 'text', text: JSON.stringify({ success: false, reason: msg }) }] };
251
278
  }
252
279
  });
280
+ // remote_post
281
+ server.tool('remote_post', 'Post a message to ANY conversation by ID. Use this to report findings, status updates, or results to a conversation other than your own SiloLink session. The message is posted via the DSiloed API that SiloLink is connected to.', {
282
+ conversation_id: z.number().describe('ID of the conversation to post to'),
283
+ message: z.string().describe('Message content to post'),
284
+ }, async ({ conversation_id, message }) => {
285
+ const session = getSessionForTransport(transport, sessionManager);
286
+ if (!session) {
287
+ return { content: [{ type: 'text', text: JSON.stringify({ success: false, reason: 'Not registered. Call remote_register first.' }) }] };
288
+ }
289
+ sessionManager.touchActivity(session.sessionId);
290
+ // Cross-posting observability: log when an agent posts to a conversation it doesn't own.
291
+ // Server-side auth (Service::Security.apply_scope on the chat endpoint) enforces that the
292
+ // JWT user has access to the target conversation — SiloLink doesn't need to duplicate that.
293
+ // This log is for debugging pipeline communication patterns.
294
+ if (conversation_id !== session.conversationId) {
295
+ const knownConversations = new Set(sessionManager.getAll().map(s => s.conversationId));
296
+ if (!knownConversations.has(conversation_id)) {
297
+ console.warn(`[SiloLink] remote_post: session ${session.sessionId} posting to conversation ${conversation_id} outside known sessions (own: ${session.conversationId})`);
298
+ }
299
+ }
300
+ try {
301
+ const result = await dsiloedClient.postMessage(conversation_id, message);
302
+ return { content: [{ type: 'text', text: JSON.stringify({ success: true, conversation_id, message_id: result.id }) }] };
303
+ }
304
+ catch (err) {
305
+ const msg = err instanceof Error ? err.message : String(err);
306
+ return { content: [{ type: 'text', text: JSON.stringify({ success: false, conversation_id, reason: msg }) }] };
307
+ }
308
+ });
253
309
  // remote_ask
254
310
  server.tool('remote_ask', 'Post a question and block until a reply arrives (or timeout).', {
255
311
  question: z.string().describe('Question to ask'),
@@ -262,7 +318,8 @@ export function registerTools(server, transport, deps) {
262
318
  sessionManager.touchActivity(session.sessionId);
263
319
  const timeoutMs = (timeout ?? 300) * 1000;
264
320
  try {
265
- const prefixed = question.startsWith('**[Claude Code]**') ? question : `**[Claude Code]** ${question}`;
321
+ const prefix = getAgentPrefix(session);
322
+ const prefixed = question.startsWith(prefix) ? question : `${prefix} ${question}`;
266
323
  const result = await dsiloedClient.postMessage(session.conversationId, prefixed);
267
324
  if (result.id) {
268
325
  subscriptionManager.trackOutboundMessageId(result.id);
@@ -427,32 +484,73 @@ export function registerTools(server, transport, deps) {
427
484
  }],
428
485
  };
429
486
  });
430
- // remote_peek — see what Claude is doing in tmux
431
- server.tool('remote_peek', 'Capture last N lines of terminal output from Claude tmux sessions.', {
487
+ // remote_peek — see what Claude is doing in tmux (enhanced for Dev Manager observation)
488
+ server.tool('remote_peek', 'Capture last N lines of terminal output from Claude tmux sessions. Supports filtering by conversation or project.', {
432
489
  lines: z.number().optional().describe('Number of lines to capture (default: 50, max: 200)'),
433
- session_name: z.string().optional().describe('Specific tmux session name (default: auto-detect silolink-claude-* sessions)'),
434
- }, async ({ lines, session_name }) => {
490
+ session_name: z.string().optional().describe('Specific tmux session name (default: auto-detect silolink-* sessions)'),
491
+ target: z.union([z.literal('all'), z.number()]).optional().describe('"all" to peek all sessions, or a specific conversation_id'),
492
+ }, async ({ lines, session_name, target }) => {
435
493
  const lineCount = Math.min(lines ?? 50, 200);
436
494
  try {
437
- // Find silolink-claude tmux sessions
495
+ // Resolve which tmux sessions to peek
438
496
  let sessions;
439
497
  if (session_name) {
440
498
  sessions = [session_name];
441
499
  }
500
+ else if (typeof target === 'number') {
501
+ // Specific conversation_id — find its tmux session via AgentLauncher
502
+ const proc = deps.launcher?.getByConversation(target);
503
+ sessions = proc ? [proc.processId] : [];
504
+ }
442
505
  else {
443
- const listOutput = execSync('tmux list-sessions -F "#{session_name}" 2>/dev/null', { encoding: 'utf-8' }).trim();
444
- sessions = listOutput.split('\n').filter(s => s.startsWith('silolink-claude-'));
506
+ const listOutput = execFileSync('tmux', ['list-sessions', '-F', '#{session_name}'], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
507
+ sessions = listOutput.split('\n').filter(s => s.startsWith('silolink-claude-') || s.startsWith('silolink-gemini-'));
445
508
  }
446
509
  if (sessions.length === 0) {
447
510
  return { content: [{ type: 'text', text: JSON.stringify({ success: true, sessions: [], message: 'No active Claude tmux sessions found' }) }] };
448
511
  }
512
+ // Build a lookup of conversation_id → agent info from registered sessions
513
+ const allSessions = sessionManager.getAll();
514
+ const sessionLookup = new Map();
515
+ // Map tmux process IDs to session info via AgentLauncher
516
+ if (deps.launcher) {
517
+ for (const proc of deps.launcher.getProcesses()) {
518
+ const regSession = allSessions.find(s => s.conversationId === proc.conversationId);
519
+ sessionLookup.set(proc.processId, {
520
+ conversationId: proc.conversationId,
521
+ agentName: regSession?.sessionName,
522
+ llmAgentId: regSession?.llmAgentId,
523
+ });
524
+ }
525
+ }
449
526
  const results = sessions.map(name => {
527
+ const info = sessionLookup.get(name);
528
+ // Validate session name to prevent injection (only alphanumeric, dash, underscore, dot)
529
+ if (!/^[a-zA-Z0-9_.-]+$/.test(name)) {
530
+ return {
531
+ session: name,
532
+ conversation_id: info?.conversationId,
533
+ agent_name: info?.agentName,
534
+ output: '(invalid session name)',
535
+ };
536
+ }
450
537
  try {
451
- const output = execSync(`tmux capture-pane -t ${name} -p -S -${lineCount} 2>/dev/null`, { encoding: 'utf-8' });
452
- return { session: name, output: output.trimEnd() };
538
+ const output = execFileSync('tmux', ['capture-pane', '-t', name, '-p', '-S', `-${lineCount}`], { encoding: 'utf-8' });
539
+ return {
540
+ session: name,
541
+ conversation_id: info?.conversationId,
542
+ agent_name: info?.agentName,
543
+ llm_agent_id: info?.llmAgentId,
544
+ output: output.trimEnd(),
545
+ };
453
546
  }
454
547
  catch {
455
- return { session: name, output: '(failed to capture — session may have ended)' };
548
+ return {
549
+ session: name,
550
+ conversation_id: info?.conversationId,
551
+ agent_name: info?.agentName,
552
+ output: '(failed to capture — session may have ended)',
553
+ };
456
554
  }
457
555
  });
458
556
  return {
@@ -466,6 +564,28 @@ export function registerTools(server, transport, deps) {
466
564
  return { content: [{ type: 'text', text: JSON.stringify({ success: true, sessions: [], message: 'No tmux server running or no sessions found' }) }] };
467
565
  }
468
566
  });
567
+ // remote_interrupt — human/UI use only, not for agent-to-agent communication
568
+ if (deps.launcher) {
569
+ const launcher = deps.launcher;
570
+ server.tool('remote_interrupt', 'Interrupt a Claude session and redirect it. Human/UI use only — agents communicate via @mention.', {
571
+ conversation_id: z.number().describe('Conversation ID of the session to interrupt'),
572
+ message: z.string().optional().describe('Optional redirect instruction'),
573
+ }, async ({ conversation_id, message }) => {
574
+ try {
575
+ const interrupted = await launcher.interrupt(conversation_id, message);
576
+ return {
577
+ content: [{
578
+ type: 'text',
579
+ text: JSON.stringify({ success: interrupted, conversation_id }),
580
+ }],
581
+ };
582
+ }
583
+ catch (err) {
584
+ const msg = err instanceof Error ? err.message : String(err);
585
+ return { content: [{ type: 'text', text: JSON.stringify({ success: false, reason: msg }) }] };
586
+ }
587
+ });
588
+ }
469
589
  // remote_unregister
470
590
  server.tool('remote_unregister', 'Unregister session and clean up.', {}, async () => {
471
591
  const session = getSessionForTransport(transport, sessionManager);
@@ -658,6 +778,8 @@ export function registerTools(server, transport, deps) {
658
778
  merged_branch: result.mergedBranch,
659
779
  base_branch: result.baseBranch,
660
780
  merge_conflicts: result.conflicts,
781
+ files_changed: result.filesChanged,
782
+ merge_commit: result.mergeCommit,
661
783
  }),
662
784
  }],
663
785
  };
@@ -689,5 +811,41 @@ export function registerTools(server, transport, deps) {
689
811
  }],
690
812
  };
691
813
  });
814
+ // remote_orchestration_stage_complete
815
+ server.tool('remote_orchestration_stage_complete', 'Complete a orchestration stage execution. Call this when you have finished the work assigned to your orchestration stage. Reports results back to the workflow orchestration engine.', {
816
+ orchestration_stage_execution_id: z.number().describe('The ID of the WorkflowStageExecution to complete'),
817
+ success: z.boolean().describe('Whether the stage completed successfully'),
818
+ output: z.string().describe('Summary of what was accomplished'),
819
+ artifacts: z.array(z.object({
820
+ key: z.string().describe('Artifact key (e.g., "spec", "design", "test_results")'),
821
+ artifact_type: z.string().describe('Type: llm_file, project, task_set, json_data'),
822
+ llm_file_id: z.number().optional().describe('LlmFile ID if artifact is a document'),
823
+ project_id: z.number().optional().describe('Project ID if artifact is a project'),
824
+ description: z.string().optional().describe('Human-readable description'),
825
+ data: z.record(z.string(), z.unknown()).optional().describe('Inline data for json_data artifacts'),
826
+ })).optional().default([]).describe('Artifacts produced by this stage'),
827
+ }, async (params) => {
828
+ const result = await dsiloedClient.completeOrchestrationStage(params.orchestration_stage_execution_id, params.success, params.output, params.artifacts);
829
+ return {
830
+ content: [{
831
+ type: 'text',
832
+ text: JSON.stringify(result),
833
+ }],
834
+ };
835
+ });
836
+ // remote_orchestration_review_complete
837
+ server.tool('remote_orchestration_review_complete', 'Signal that you have finished reviewing a completed child task. Call this after reviewing the work and performing any integration actions (e.g., merging, compiling, combining).', {
838
+ orchestration_stage_execution_id: z.number().describe('The child stage execution ID that was reviewed'),
839
+ success: z.boolean().describe('Whether the review and merge succeeded'),
840
+ output: z.string().describe('Summary of review findings and merge result'),
841
+ }, async (params) => {
842
+ const result = await dsiloedClient.reviewCompleteOrchestrationStage(params.orchestration_stage_execution_id, params.success, params.output);
843
+ return {
844
+ content: [{
845
+ type: 'text',
846
+ text: JSON.stringify(result),
847
+ }],
848
+ };
849
+ });
692
850
  }
693
851
  //# sourceMappingURL=register-tools.js.map