@dsiloed/silo-link 1.0.6 → 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 +14 -0
- 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 +238 -13
- 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/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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgentLauncher, LaunchConfig, AgentProcess } from './agent-launcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI implementation of the AgentLauncher interface.
|
|
4
|
+
*
|
|
5
|
+
* Unlike Claude and Gemini, OpenAI does not natively support MCP.
|
|
6
|
+
* To use SiloLink tools, an MCP-to-function-calling adapter is needed:
|
|
7
|
+
*
|
|
8
|
+
* TODO: Implementation approach:
|
|
9
|
+
* - Option A: Use the OpenAI Agents SDK which has MCP client support
|
|
10
|
+
* (https://openai.github.io/openai-agents-python/mcp/)
|
|
11
|
+
* The SDK can connect to SiloLink's MCP server directly.
|
|
12
|
+
* - Option B: Use Codex CLI (OpenAI's coding agent) if it supports MCP
|
|
13
|
+
* - Option C: Build a thin adapter that translates SiloLink MCP tools
|
|
14
|
+
* into OpenAI function definitions, proxies calls back to SiloLink
|
|
15
|
+
*
|
|
16
|
+
* Process lifecycle:
|
|
17
|
+
* - Spawn via tmux (same as Claude) or as a Python subprocess
|
|
18
|
+
* - Session resume: Not natively supported — use conversation history replay
|
|
19
|
+
* - Working directory: Same worktree integration as Claude
|
|
20
|
+
* - Prompt injection: Send via stdin or API calls depending on approach
|
|
21
|
+
*/
|
|
22
|
+
export declare class OpenAILauncher implements AgentLauncher {
|
|
23
|
+
launch(_config: LaunchConfig): Promise<AgentProcess | null>;
|
|
24
|
+
resume(_resumeId: string, _config: LaunchConfig): Promise<AgentProcess | null>;
|
|
25
|
+
isAlive(_process: AgentProcess): Promise<boolean>;
|
|
26
|
+
terminate(_process: AgentProcess): void;
|
|
27
|
+
terminateAll(): void;
|
|
28
|
+
getProcesses(): AgentProcess[];
|
|
29
|
+
getByConversation(_conversationId: number): AgentProcess | undefined;
|
|
30
|
+
nudge(): boolean;
|
|
31
|
+
isEnabled(): boolean;
|
|
32
|
+
isAutoRespawnEnabled(): boolean;
|
|
33
|
+
startIdleMonitor(): void;
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=openai-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-launcher.d.ts","sourceRoot":"","sources":["../../src/core/openai-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAErF;;;;;;;;;;;;;;;;;;;GAmBG;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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI implementation of the AgentLauncher interface.
|
|
3
|
+
*
|
|
4
|
+
* Unlike Claude and Gemini, OpenAI does not natively support MCP.
|
|
5
|
+
* To use SiloLink tools, an MCP-to-function-calling adapter is needed:
|
|
6
|
+
*
|
|
7
|
+
* TODO: Implementation approach:
|
|
8
|
+
* - Option A: Use the OpenAI Agents SDK which has MCP client support
|
|
9
|
+
* (https://openai.github.io/openai-agents-python/mcp/)
|
|
10
|
+
* The SDK can connect to SiloLink's MCP server directly.
|
|
11
|
+
* - Option B: Use Codex CLI (OpenAI's coding agent) if it supports MCP
|
|
12
|
+
* - Option C: Build a thin adapter that translates SiloLink MCP tools
|
|
13
|
+
* into OpenAI function definitions, proxies calls back to SiloLink
|
|
14
|
+
*
|
|
15
|
+
* Process lifecycle:
|
|
16
|
+
* - Spawn via tmux (same as Claude) or as a Python subprocess
|
|
17
|
+
* - Session resume: Not natively supported — use conversation history replay
|
|
18
|
+
* - Working directory: Same worktree integration as Claude
|
|
19
|
+
* - Prompt injection: Send via stdin or API calls depending on approach
|
|
20
|
+
*/
|
|
21
|
+
export class OpenAILauncher {
|
|
22
|
+
async launch(_config) {
|
|
23
|
+
throw new Error('OpenAILauncher not yet implemented');
|
|
24
|
+
}
|
|
25
|
+
async resume(_resumeId, _config) {
|
|
26
|
+
throw new Error('OpenAILauncher not yet implemented');
|
|
27
|
+
}
|
|
28
|
+
async isAlive(_process) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
terminate(_process) {
|
|
32
|
+
// TODO: Kill OpenAI process
|
|
33
|
+
}
|
|
34
|
+
terminateAll() {
|
|
35
|
+
// TODO: Kill all OpenAI processes
|
|
36
|
+
}
|
|
37
|
+
getProcesses() {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
getByConversation(_conversationId) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
nudge() {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
isEnabled() {
|
|
47
|
+
return false; // Not yet implemented
|
|
48
|
+
}
|
|
49
|
+
isAutoRespawnEnabled() {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
startIdleMonitor() {
|
|
53
|
+
// TODO: Implement idle monitoring for OpenAI sessions
|
|
54
|
+
}
|
|
55
|
+
destroy() {
|
|
56
|
+
this.terminateAll();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=openai-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-launcher.js","sourceRoot":"","sources":["../../src/core/openai-launcher.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;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,65 @@
|
|
|
1
|
+
import type { Workspace, ConflictReport, MergeResult } from '../types/index.js';
|
|
2
|
+
export declare class WorkspaceManager {
|
|
3
|
+
private workspaces;
|
|
4
|
+
constructor();
|
|
5
|
+
/**
|
|
6
|
+
* Create a git worktree for a session.
|
|
7
|
+
* Creates a new branch from baseBranch and checks it out in an isolated directory.
|
|
8
|
+
*/
|
|
9
|
+
createWorktree(sessionId: string, repoPath: string, branch: string, baseBranch?: string): Workspace;
|
|
10
|
+
/**
|
|
11
|
+
* Remove a worktree and clean up for a session.
|
|
12
|
+
*/
|
|
13
|
+
removeWorktree(sessionId: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Check if any of the given files are claimed by other sessions.
|
|
16
|
+
*/
|
|
17
|
+
checkConflicts(sessionId: string, files?: string[]): {
|
|
18
|
+
conflicts: ConflictReport[];
|
|
19
|
+
allClaims: {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
files: string[];
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Claim files for a session (advisory soft-lock).
|
|
26
|
+
* Returns which files were claimed and any conflicts with other sessions.
|
|
27
|
+
*/
|
|
28
|
+
claimFiles(sessionId: string, files: string[]): {
|
|
29
|
+
claimed: string[];
|
|
30
|
+
conflicts: ConflictReport[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Release file claims for a session.
|
|
34
|
+
*/
|
|
35
|
+
releaseFiles(sessionId: string, files: string[]): void;
|
|
36
|
+
/**
|
|
37
|
+
* Merge the worktree branch back to baseBranch and clean up.
|
|
38
|
+
*/
|
|
39
|
+
mergeAndCleanup(sessionId: string, deleteBranch?: boolean): MergeResult;
|
|
40
|
+
/**
|
|
41
|
+
* List all active workspaces.
|
|
42
|
+
*/
|
|
43
|
+
listWorkspaces(): Workspace[];
|
|
44
|
+
/**
|
|
45
|
+
* Get the workspace for a specific session.
|
|
46
|
+
*/
|
|
47
|
+
getWorkspace(sessionId: string): Workspace | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Get workspace by session and repo path.
|
|
50
|
+
*/
|
|
51
|
+
private getBySessionAndRepo;
|
|
52
|
+
/**
|
|
53
|
+
* Persist workspace state to disk.
|
|
54
|
+
*/
|
|
55
|
+
private saveState;
|
|
56
|
+
/**
|
|
57
|
+
* Load persisted workspace state from disk.
|
|
58
|
+
*/
|
|
59
|
+
private loadState;
|
|
60
|
+
/**
|
|
61
|
+
* Clean up stale worktrees on startup (worktree dir no longer exists).
|
|
62
|
+
*/
|
|
63
|
+
private cleanupStale;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=workspace-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manager.d.ts","sourceRoot":"","sources":["../../src/core/workspace-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAehF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAqC;;IAOvD;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAgB,GAAG,SAAS;IA4D1G;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+BvC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG;QAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QAAC,SAAS,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAA;KAAE;IAyBzI;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,cAAc,EAAE,CAAA;KAAE;IAwBlG;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAQtD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,WAAW;IA8DpE;;OAEG;IACH,cAAc,IAAI,SAAS,EAAE;IAI7B;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAyBjB;;OAEG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
const STATE_DIR = join(homedir(), '.silolink');
|
|
6
|
+
const STATE_FILE = join(STATE_DIR, 'workspaces.json');
|
|
7
|
+
export class WorkspaceManager {
|
|
8
|
+
workspaces = new Map();
|
|
9
|
+
constructor() {
|
|
10
|
+
this.loadState();
|
|
11
|
+
this.cleanupStale();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a git worktree for a session.
|
|
15
|
+
* Creates a new branch from baseBranch and checks it out in an isolated directory.
|
|
16
|
+
*/
|
|
17
|
+
createWorktree(sessionId, repoPath, branch, baseBranch = 'development') {
|
|
18
|
+
// Check if session already has a workspace for this repo
|
|
19
|
+
const existing = this.getBySessionAndRepo(sessionId, repoPath);
|
|
20
|
+
if (existing) {
|
|
21
|
+
throw new Error(`Session ${sessionId} already has a workspace for ${repoPath} on branch ${existing.branch}`);
|
|
22
|
+
}
|
|
23
|
+
// Resolve absolute repo path
|
|
24
|
+
const absRepoPath = repoPath.startsWith('/') ? repoPath : join(process.cwd(), repoPath);
|
|
25
|
+
// Worktree path: ~/.silolink/worktrees/<repo-name>/<branch>
|
|
26
|
+
const repoName = absRepoPath.split('/').pop() || 'repo';
|
|
27
|
+
const worktreePath = join(STATE_DIR, 'worktrees', repoName, branch);
|
|
28
|
+
// Ensure the parent directory exists
|
|
29
|
+
mkdirSync(join(STATE_DIR, 'worktrees', repoName), { recursive: true });
|
|
30
|
+
// Fetch latest from remote
|
|
31
|
+
try {
|
|
32
|
+
execSync(`git -C "${absRepoPath}" fetch origin ${baseBranch}`, { stdio: 'pipe' });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Non-fatal: might be offline or baseBranch might be local-only
|
|
36
|
+
console.warn(`[WorkspaceManager] Could not fetch origin/${baseBranch} (non-fatal)`);
|
|
37
|
+
}
|
|
38
|
+
// Create the worktree with a new branch from baseBranch
|
|
39
|
+
try {
|
|
40
|
+
execSync(`git -C "${absRepoPath}" worktree add -b "${branch}" "${worktreePath}" "${baseBranch}"`, { stdio: 'pipe' });
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
// Branch might already exist — try checking it out instead
|
|
44
|
+
try {
|
|
45
|
+
execSync(`git -C "${absRepoPath}" worktree add "${worktreePath}" "${branch}"`, { stdio: 'pipe' });
|
|
46
|
+
}
|
|
47
|
+
catch (innerErr) {
|
|
48
|
+
throw new Error(`Failed to create worktree: ${innerErr}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const workspace = {
|
|
52
|
+
sessionId,
|
|
53
|
+
repoPath: absRepoPath,
|
|
54
|
+
worktreePath,
|
|
55
|
+
branch,
|
|
56
|
+
baseBranch,
|
|
57
|
+
claimedFiles: [],
|
|
58
|
+
createdAt: new Date(),
|
|
59
|
+
};
|
|
60
|
+
this.workspaces.set(sessionId, workspace);
|
|
61
|
+
this.saveState();
|
|
62
|
+
console.log(`[WorkspaceManager] Created worktree: ${worktreePath} (branch: ${branch}, base: ${baseBranch})`);
|
|
63
|
+
return workspace;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Remove a worktree and clean up for a session.
|
|
67
|
+
*/
|
|
68
|
+
removeWorktree(sessionId) {
|
|
69
|
+
const workspace = this.workspaces.get(sessionId);
|
|
70
|
+
if (!workspace)
|
|
71
|
+
return;
|
|
72
|
+
// Check for uncommitted changes
|
|
73
|
+
try {
|
|
74
|
+
const status = execSync(`git -C "${workspace.worktreePath}" status --porcelain`, { encoding: 'utf-8' }).trim();
|
|
75
|
+
if (status) {
|
|
76
|
+
console.warn(`[WorkspaceManager] Worktree ${workspace.worktreePath} has uncommitted changes — skipping removal`);
|
|
77
|
+
console.warn(` Uncommitted files:\n ${status.split('\n').join('\n ')}`);
|
|
78
|
+
// Still remove from tracking so it doesn't block future sessions
|
|
79
|
+
this.workspaces.delete(sessionId);
|
|
80
|
+
this.saveState();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Worktree directory might already be gone
|
|
86
|
+
}
|
|
87
|
+
// Remove the git worktree
|
|
88
|
+
try {
|
|
89
|
+
execSync(`git -C "${workspace.repoPath}" worktree remove "${workspace.worktreePath}" --force`, { stdio: 'pipe' });
|
|
90
|
+
console.log(`[WorkspaceManager] Removed worktree: ${workspace.worktreePath}`);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.warn(`[WorkspaceManager] Could not remove worktree ${workspace.worktreePath}: ${err}`);
|
|
94
|
+
}
|
|
95
|
+
this.workspaces.delete(sessionId);
|
|
96
|
+
this.saveState();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if any of the given files are claimed by other sessions.
|
|
100
|
+
*/
|
|
101
|
+
checkConflicts(sessionId, files) {
|
|
102
|
+
const conflicts = [];
|
|
103
|
+
const allClaims = [];
|
|
104
|
+
for (const [wsSessionId, workspace] of this.workspaces) {
|
|
105
|
+
if (workspace.claimedFiles.length > 0) {
|
|
106
|
+
allClaims.push({ sessionId: wsSessionId, files: [...workspace.claimedFiles] });
|
|
107
|
+
}
|
|
108
|
+
if (wsSessionId === sessionId || !files)
|
|
109
|
+
continue;
|
|
110
|
+
for (const file of files) {
|
|
111
|
+
if (workspace.claimedFiles.includes(file)) {
|
|
112
|
+
conflicts.push({
|
|
113
|
+
file,
|
|
114
|
+
claimedBy: wsSessionId,
|
|
115
|
+
claimedAt: workspace.createdAt,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { conflicts, allClaims };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Claim files for a session (advisory soft-lock).
|
|
124
|
+
* Returns which files were claimed and any conflicts with other sessions.
|
|
125
|
+
*/
|
|
126
|
+
claimFiles(sessionId, files) {
|
|
127
|
+
const workspace = this.workspaces.get(sessionId);
|
|
128
|
+
if (!workspace) {
|
|
129
|
+
throw new Error(`No workspace found for session ${sessionId}`);
|
|
130
|
+
}
|
|
131
|
+
const { conflicts } = this.checkConflicts(sessionId, files);
|
|
132
|
+
// Add files to claims (advisory — we claim even if there are conflicts, but report them)
|
|
133
|
+
const newClaims = [];
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
if (!workspace.claimedFiles.includes(file)) {
|
|
136
|
+
workspace.claimedFiles.push(file);
|
|
137
|
+
newClaims.push(file);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (newClaims.length > 0) {
|
|
141
|
+
this.saveState();
|
|
142
|
+
}
|
|
143
|
+
return { claimed: newClaims, conflicts };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Release file claims for a session.
|
|
147
|
+
*/
|
|
148
|
+
releaseFiles(sessionId, files) {
|
|
149
|
+
const workspace = this.workspaces.get(sessionId);
|
|
150
|
+
if (!workspace)
|
|
151
|
+
return;
|
|
152
|
+
workspace.claimedFiles = workspace.claimedFiles.filter(f => !files.includes(f));
|
|
153
|
+
this.saveState();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Merge the worktree branch back to baseBranch and clean up.
|
|
157
|
+
*/
|
|
158
|
+
mergeAndCleanup(sessionId, deleteBranch = true) {
|
|
159
|
+
const workspace = this.workspaces.get(sessionId);
|
|
160
|
+
if (!workspace) {
|
|
161
|
+
throw new Error(`No workspace found for session ${sessionId}`);
|
|
162
|
+
}
|
|
163
|
+
const result = {
|
|
164
|
+
success: false,
|
|
165
|
+
mergedBranch: workspace.branch,
|
|
166
|
+
baseBranch: workspace.baseBranch,
|
|
167
|
+
conflicts: [],
|
|
168
|
+
};
|
|
169
|
+
// Ensure all changes in worktree are committed
|
|
170
|
+
try {
|
|
171
|
+
const status = execSync(`git -C "${workspace.worktreePath}" status --porcelain`, { encoding: 'utf-8' }).trim();
|
|
172
|
+
if (status) {
|
|
173
|
+
result.conflicts = ['UNCOMMITTED_CHANGES'];
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
result.conflicts = ['WORKTREE_INACCESSIBLE'];
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
// Switch to the main repo and merge
|
|
182
|
+
try {
|
|
183
|
+
// Checkout baseBranch in main repo
|
|
184
|
+
execSync(`git -C "${workspace.repoPath}" checkout "${workspace.baseBranch}"`, { stdio: 'pipe' });
|
|
185
|
+
// Merge the worktree branch
|
|
186
|
+
try {
|
|
187
|
+
execSync(`git -C "${workspace.repoPath}" merge "${workspace.branch}" --no-ff -m "Merge ${workspace.branch} into ${workspace.baseBranch}"`, { stdio: 'pipe' });
|
|
188
|
+
result.success = true;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// 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();
|
|
193
|
+
result.conflicts = conflictOutput ? conflictOutput.split('\n') : ['UNKNOWN_MERGE_CONFLICT'];
|
|
194
|
+
// Abort the merge so we don't leave repo in a dirty state
|
|
195
|
+
try {
|
|
196
|
+
execSync(`git -C "${workspace.repoPath}" merge --abort`, { stdio: 'pipe' });
|
|
197
|
+
}
|
|
198
|
+
catch { /* already clean */ }
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
// Clean up: remove worktree and optionally delete branch
|
|
202
|
+
this.removeWorktree(sessionId);
|
|
203
|
+
if (deleteBranch) {
|
|
204
|
+
try {
|
|
205
|
+
execSync(`git -C "${workspace.repoPath}" branch -d "${workspace.branch}"`, { stdio: 'pipe' });
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
console.warn(`[WorkspaceManager] Could not delete branch ${workspace.branch} (may have been already removed with worktree)`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
result.conflicts = [`MERGE_ERROR: ${err}`];
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* List all active workspaces.
|
|
219
|
+
*/
|
|
220
|
+
listWorkspaces() {
|
|
221
|
+
return Array.from(this.workspaces.values());
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the workspace for a specific session.
|
|
225
|
+
*/
|
|
226
|
+
getWorkspace(sessionId) {
|
|
227
|
+
return this.workspaces.get(sessionId);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get workspace by session and repo path.
|
|
231
|
+
*/
|
|
232
|
+
getBySessionAndRepo(sessionId, repoPath) {
|
|
233
|
+
const workspace = this.workspaces.get(sessionId);
|
|
234
|
+
if (workspace && workspace.repoPath === repoPath)
|
|
235
|
+
return workspace;
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Persist workspace state to disk.
|
|
240
|
+
*/
|
|
241
|
+
saveState() {
|
|
242
|
+
mkdirSync(STATE_DIR, { recursive: true });
|
|
243
|
+
const data = Array.from(this.workspaces.values()).map(ws => ({
|
|
244
|
+
sessionId: ws.sessionId,
|
|
245
|
+
repoPath: ws.repoPath,
|
|
246
|
+
worktreePath: ws.worktreePath,
|
|
247
|
+
branch: ws.branch,
|
|
248
|
+
baseBranch: ws.baseBranch,
|
|
249
|
+
claimedFiles: ws.claimedFiles,
|
|
250
|
+
createdAt: ws.createdAt.toISOString(),
|
|
251
|
+
}));
|
|
252
|
+
writeFileSync(STATE_FILE, JSON.stringify(data, null, 2));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Load persisted workspace state from disk.
|
|
256
|
+
*/
|
|
257
|
+
loadState() {
|
|
258
|
+
if (!existsSync(STATE_FILE))
|
|
259
|
+
return;
|
|
260
|
+
try {
|
|
261
|
+
const raw = readFileSync(STATE_FILE, 'utf-8');
|
|
262
|
+
const data = JSON.parse(raw);
|
|
263
|
+
for (const ws of data) {
|
|
264
|
+
this.workspaces.set(ws.sessionId, {
|
|
265
|
+
sessionId: ws.sessionId,
|
|
266
|
+
repoPath: ws.repoPath,
|
|
267
|
+
worktreePath: ws.worktreePath,
|
|
268
|
+
branch: ws.branch,
|
|
269
|
+
baseBranch: ws.baseBranch,
|
|
270
|
+
claimedFiles: ws.claimedFiles,
|
|
271
|
+
createdAt: new Date(ws.createdAt),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
console.log(`[WorkspaceManager] Loaded ${data.length} workspace(s) from disk`);
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
console.warn(`[WorkspaceManager] Failed to load workspace state: ${err}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Clean up stale worktrees on startup (worktree dir no longer exists).
|
|
282
|
+
*/
|
|
283
|
+
cleanupStale() {
|
|
284
|
+
const stale = [];
|
|
285
|
+
for (const [sessionId, workspace] of this.workspaces) {
|
|
286
|
+
if (!existsSync(workspace.worktreePath)) {
|
|
287
|
+
stale.push(sessionId);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (stale.length > 0) {
|
|
291
|
+
for (const sessionId of stale) {
|
|
292
|
+
console.log(`[WorkspaceManager] Cleaning up stale workspace for session ${sessionId}`);
|
|
293
|
+
this.workspaces.delete(sessionId);
|
|
294
|
+
}
|
|
295
|
+
this.saveState();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=workspace-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manager.js","sourceRoot":"","sources":["../../src/core/workspace-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { DSiloedClient } from '../api/dsiloed-client.js';
|
|
|
4
4
|
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
|
+
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
7
8
|
interface McpServerDeps {
|
|
8
9
|
config: SiloLinkConfig;
|
|
9
10
|
sessionManager: SessionManager;
|
|
@@ -11,6 +12,7 @@ interface McpServerDeps {
|
|
|
11
12
|
dsiloedClient: DSiloedClient;
|
|
12
13
|
subscriptionManager: SubscriptionManager;
|
|
13
14
|
cableClient: ActionCableClient;
|
|
15
|
+
workspaceManager?: WorkspaceManager;
|
|
14
16
|
}
|
|
15
17
|
export declare class SiloLinkMcpServer {
|
|
16
18
|
private app;
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import type { DSiloedClient } from '../../api/dsiloed-client.js';
|
|
|
6
6
|
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
|
+
import type { WorkspaceManager } from '../../core/workspace-manager.js';
|
|
9
10
|
interface ToolDeps {
|
|
10
11
|
config: SiloLinkConfig;
|
|
11
12
|
sessionManager: SessionManager;
|
|
@@ -13,6 +14,7 @@ interface ToolDeps {
|
|
|
13
14
|
dsiloedClient: DSiloedClient;
|
|
14
15
|
subscriptionManager: SubscriptionManager;
|
|
15
16
|
cableClient: ActionCableClient;
|
|
17
|
+
workspaceManager?: WorkspaceManager;
|
|
16
18
|
}
|
|
17
19
|
export declare function registerTools(server: McpServer, transport: StreamableHTTPServerTransport, deps: ToolDeps): void;
|
|
18
20
|
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;
|
|
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,CAuvBN"}
|