@dsiloed/silo-link 1.3.0 → 1.4.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/dist/api/dsiloed-client.d.ts +30 -0
- package/dist/api/dsiloed-client.d.ts.map +1 -1
- package/dist/api/dsiloed-client.js +66 -0
- package/dist/api/dsiloed-client.js.map +1 -1
- package/dist/cable/subscription-manager.d.ts +7 -3
- package/dist/cable/subscription-manager.d.ts.map +1 -1
- package/dist/cable/subscription-manager.js +36 -11
- package/dist/cable/subscription-manager.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +112 -24
- package/dist/cli/commands.js.map +1 -1
- package/dist/config/config-manager.d.ts +4 -4
- package/dist/config/config-manager.d.ts.map +1 -1
- package/dist/config/config-manager.js +28 -14
- package/dist/config/config-manager.js.map +1 -1
- package/dist/core/agent-launcher.d.ts +30 -1
- package/dist/core/agent-launcher.d.ts.map +1 -1
- package/dist/core/base-tmux-launcher.d.ts +102 -0
- package/dist/core/base-tmux-launcher.d.ts.map +1 -0
- package/dist/core/base-tmux-launcher.js +491 -0
- package/dist/core/base-tmux-launcher.js.map +1 -0
- package/dist/core/bridge.d.ts +14 -2
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +129 -35
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/claude-launcher.d.ts +24 -100
- package/dist/core/claude-launcher.d.ts.map +1 -1
- package/dist/core/claude-launcher.js +130 -489
- package/dist/core/claude-launcher.js.map +1 -1
- package/dist/core/gemini-launcher.d.ts +37 -27
- package/dist/core/gemini-launcher.d.ts.map +1 -1
- package/dist/core/gemini-launcher.js +126 -38
- package/dist/core/gemini-launcher.js.map +1 -1
- package/dist/core/launcher-factory.d.ts.map +1 -1
- package/dist/core/launcher-factory.js +1 -2
- package/dist/core/launcher-factory.js.map +1 -1
- package/dist/core/openai-launcher.d.ts +14 -17
- package/dist/core/openai-launcher.d.ts.map +1 -1
- package/dist/core/openai-launcher.js +23 -44
- package/dist/core/openai-launcher.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +11 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/workspace-manager.d.ts.map +1 -1
- package/dist/core/workspace-manager.js +53 -16
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +19 -2
- 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 +174 -16
- package/dist/mcp/tools/register-tools.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SiloLinkConfig } from '../types/index.js';
|
|
2
2
|
export declare function getConfigDir(): string;
|
|
3
|
-
export declare function loadConfig(): SiloLinkConfig;
|
|
4
|
-
export declare function saveConfig(config: SiloLinkConfig): void;
|
|
5
|
-
export declare function configExists(): boolean;
|
|
6
|
-
export declare function interactiveConfig(): Promise<void>;
|
|
3
|
+
export declare function loadConfig(env?: string): SiloLinkConfig;
|
|
4
|
+
export declare function saveConfig(config: SiloLinkConfig, env?: string): void;
|
|
5
|
+
export declare function configExists(env?: string): boolean;
|
|
6
|
+
export declare function interactiveConfig(env?: string): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA6BxD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAWvD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAGrE;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CnE"}
|
|
@@ -3,7 +3,10 @@ import path from 'node:path';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import readline from 'node:readline';
|
|
5
5
|
const CONFIG_DIR = path.join(os.homedir(), '.silolink');
|
|
6
|
-
|
|
6
|
+
function getConfigPath(env) {
|
|
7
|
+
const filename = env ? `config.${env}.json` : 'config.json';
|
|
8
|
+
return path.join(CONFIG_DIR, filename);
|
|
9
|
+
}
|
|
7
10
|
const DEFAULT_CONFIG = {
|
|
8
11
|
host: 'https://www.dsiloed.com',
|
|
9
12
|
tenant_id: 'harmoniq',
|
|
@@ -17,26 +20,35 @@ const DEFAULT_CONFIG = {
|
|
|
17
20
|
claude_auto_respawn: false,
|
|
18
21
|
claude_idle_timeout_ms: 30000,
|
|
19
22
|
claude_session_prompt: 'Register with SiloLink as "portablemind" and enter the poll loop.',
|
|
23
|
+
gemini_command: 'gemini',
|
|
24
|
+
gemini_working_directory: '',
|
|
25
|
+
gemini_auto_respawn: false,
|
|
26
|
+
gemini_idle_timeout_ms: 30000,
|
|
27
|
+
gemini_session_prompt: 'Register with SiloLink as "portablemind" and enter the poll loop.',
|
|
20
28
|
};
|
|
21
29
|
export function getConfigDir() {
|
|
22
30
|
return CONFIG_DIR;
|
|
23
31
|
}
|
|
24
|
-
export function loadConfig() {
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
export function loadConfig(env) {
|
|
33
|
+
const configPath = getConfigPath(env);
|
|
34
|
+
if (!fs.existsSync(configPath)) {
|
|
35
|
+
const hint = env
|
|
36
|
+
? `Config not found at ${configPath}. Run "silolink config --env ${env}" to set up.`
|
|
37
|
+
: `Config not found at ${configPath}. Run "silolink config" to set up.`;
|
|
38
|
+
throw new Error(hint);
|
|
27
39
|
}
|
|
28
|
-
const raw = fs.readFileSync(
|
|
40
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
29
41
|
const parsed = JSON.parse(raw);
|
|
30
42
|
return { ...DEFAULT_CONFIG, ...parsed };
|
|
31
43
|
}
|
|
32
|
-
export function saveConfig(config) {
|
|
44
|
+
export function saveConfig(config, env) {
|
|
33
45
|
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
34
|
-
fs.writeFileSync(
|
|
46
|
+
fs.writeFileSync(getConfigPath(env), JSON.stringify(config, null, 2) + '\n');
|
|
35
47
|
}
|
|
36
|
-
export function configExists() {
|
|
37
|
-
return fs.existsSync(
|
|
48
|
+
export function configExists(env) {
|
|
49
|
+
return fs.existsSync(getConfigPath(env));
|
|
38
50
|
}
|
|
39
|
-
export async function interactiveConfig() {
|
|
51
|
+
export async function interactiveConfig(env) {
|
|
40
52
|
const rl = readline.createInterface({
|
|
41
53
|
input: process.stdin,
|
|
42
54
|
output: process.stdout,
|
|
@@ -49,12 +61,13 @@ export async function interactiveConfig() {
|
|
|
49
61
|
});
|
|
50
62
|
let existing = DEFAULT_CONFIG;
|
|
51
63
|
try {
|
|
52
|
-
existing = loadConfig();
|
|
64
|
+
existing = loadConfig(env);
|
|
53
65
|
}
|
|
54
66
|
catch {
|
|
55
67
|
// use defaults
|
|
56
68
|
}
|
|
57
|
-
|
|
69
|
+
const envLabel = env ? ` (${env})` : '';
|
|
70
|
+
console.log(`\nSiloLink Configuration${envLabel}\n`);
|
|
58
71
|
const host = await ask('DSiloed host', existing.host);
|
|
59
72
|
const tenant_id = await ask('Tenant ID', existing.tenant_id);
|
|
60
73
|
const shared_key = await ask('Shared key', existing.shared_key || undefined);
|
|
@@ -69,8 +82,9 @@ export async function interactiveConfig() {
|
|
|
69
82
|
user_sub,
|
|
70
83
|
mcp_port,
|
|
71
84
|
};
|
|
72
|
-
saveConfig(config);
|
|
73
|
-
|
|
85
|
+
saveConfig(config, env);
|
|
86
|
+
const configPath = getConfigPath(env);
|
|
87
|
+
console.log(`\nConfig saved to ${configPath}\n`);
|
|
74
88
|
rl.close();
|
|
75
89
|
}
|
|
76
90
|
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,eAAe,CAAC;AAGrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WorkspaceLaunchConfig } from '../types/index.js';
|
|
2
|
+
import type { AgentProvider } from './launcher-factory.js';
|
|
2
3
|
/**
|
|
3
4
|
* Configuration for launching an agent process.
|
|
4
5
|
*/
|
|
@@ -15,6 +16,10 @@ export interface LaunchConfig {
|
|
|
15
16
|
workspace?: WorkspaceLaunchConfig;
|
|
16
17
|
/** Previous session ID for resuming context */
|
|
17
18
|
resumeId?: string;
|
|
19
|
+
/** LlmAgent ID for SDLC agent orchestration */
|
|
20
|
+
llmAgentId?: number;
|
|
21
|
+
/** Override coding agent provider for this specific session */
|
|
22
|
+
codingAgent?: AgentProvider;
|
|
18
23
|
}
|
|
19
24
|
/**
|
|
20
25
|
* Represents a running agent process managed by the launcher.
|
|
@@ -35,7 +40,7 @@ export interface AgentProcess {
|
|
|
35
40
|
}
|
|
36
41
|
/**
|
|
37
42
|
* Provider-agnostic interface for launching and managing AI agent processes.
|
|
38
|
-
* Implementations exist for Claude Code, with
|
|
43
|
+
* Implementations exist for Claude Code and Gemini CLI, with a stub for OpenAI.
|
|
39
44
|
*
|
|
40
45
|
* All providers share the same MCP tool layer (SiloLink tools work identically
|
|
41
46
|
* regardless of which AI is calling them). The launcher handles the
|
|
@@ -97,5 +102,29 @@ export interface AgentLauncher {
|
|
|
97
102
|
* Stop monitoring and clean up all resources.
|
|
98
103
|
*/
|
|
99
104
|
destroy(): void;
|
|
105
|
+
/** Set workspace config for next launch (creates git worktree) */
|
|
106
|
+
setWorkspaceConfig(config: WorkspaceLaunchConfig | null): void;
|
|
107
|
+
/** Set repo path as CWD for next launch without creating a worktree */
|
|
108
|
+
setRepoCwd(repoPath: string): void;
|
|
109
|
+
/** Set LlmAgent ID for next launch */
|
|
110
|
+
setLlmAgentId(agentId: number | null): void;
|
|
111
|
+
/** Set MCP tool allowlist for next launch */
|
|
112
|
+
setMcpToolAllowlist(tools: string[] | null): void;
|
|
113
|
+
/** Store the last resume/session ID for future resume */
|
|
114
|
+
setLastResumeId(resumeId: string): void;
|
|
115
|
+
/** Launch a session triggered by an inbound message */
|
|
116
|
+
launchOnMessage(conversationId?: number, triggerMessage?: string, llmAgentId?: number): Promise<boolean>;
|
|
117
|
+
/** Internal launch — called by Bridge control channel handler */
|
|
118
|
+
launchInternal(reason: string, conversationId?: number): Promise<boolean>;
|
|
119
|
+
/** Kill the session associated with a specific conversation */
|
|
120
|
+
killByConversation(conversationId: number): void;
|
|
121
|
+
/** Kill all sessions */
|
|
122
|
+
kill(): void;
|
|
123
|
+
/** Send an interrupt to a session */
|
|
124
|
+
interrupt(conversationId: number, message?: string): Promise<boolean>;
|
|
125
|
+
/** Get the tmux session name for a conversation (for orchestration monitor) */
|
|
126
|
+
getTmuxSessionForConversation(conversationId: number): string | null;
|
|
127
|
+
/** Check if any process is alive */
|
|
128
|
+
hasLiveProcess(): boolean;
|
|
100
129
|
}
|
|
101
130
|
//# sourceMappingURL=agent-launcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-launcher.d.ts","sourceRoot":"","sources":["../../src/core/agent-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-launcher.d.ts","sourceRoot":"","sources":["../../src/core/agent-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { SiloLinkConfig, WorkspaceLaunchConfig } 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, LaunchConfig, AgentProcess } from './agent-launcher.js';
|
|
7
|
+
interface TmuxSessionInfo {
|
|
8
|
+
conversationId: number;
|
|
9
|
+
startedAt: Date;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for tmux-based agent launchers.
|
|
13
|
+
* Implements all shared lifecycle, monitoring, and session management logic.
|
|
14
|
+
* Subclasses only override agent-specific behavior (command, prompt format, MCP config, ready indicator).
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class BaseTmuxLauncher implements AgentLauncher {
|
|
17
|
+
protected config: SiloLinkConfig;
|
|
18
|
+
protected sessionManager: SessionManager;
|
|
19
|
+
protected dsiloedClient: DSiloedClient | null;
|
|
20
|
+
protected workspaceManager: WorkspaceManager | null;
|
|
21
|
+
protected messageQueue: MessageQueue | null;
|
|
22
|
+
protected tmuxSessions: Map<string, TmuxSessionInfo>;
|
|
23
|
+
protected tmuxSessionWorkspaces: Map<string, string>;
|
|
24
|
+
protected tmuxMonitorTimer: ReturnType<typeof setInterval> | null;
|
|
25
|
+
protected idleCheckTimer: ReturnType<typeof setInterval> | null;
|
|
26
|
+
protected launchingConversations: Set<number>;
|
|
27
|
+
protected enabled: boolean;
|
|
28
|
+
protected lastNudgeAt: number;
|
|
29
|
+
protected nudgeCount: number;
|
|
30
|
+
protected lastActivitySnapshot: Map<string, number>;
|
|
31
|
+
protected lastSessionId: string | null;
|
|
32
|
+
protected pendingTriggerMessage: string | null;
|
|
33
|
+
protected pendingWorkspaceConfig: WorkspaceLaunchConfig | null;
|
|
34
|
+
protected pendingWorkspaceCwd: string | null;
|
|
35
|
+
protected pendingLlmAgentId: number | null;
|
|
36
|
+
protected pendingMcpToolAllowlist: string[] | null;
|
|
37
|
+
constructor(config: SiloLinkConfig, sessionManager: SessionManager, dsiloedClient?: DSiloedClient, messageQueue?: MessageQueue, workspaceManager?: WorkspaceManager);
|
|
38
|
+
/** Return the CLI command to run (e.g., 'claude', 'gemini') */
|
|
39
|
+
protected abstract getCommand(): string;
|
|
40
|
+
/** Return the default CLI arguments */
|
|
41
|
+
protected abstract getArgs(): string[];
|
|
42
|
+
/** Return string(s) to look for in tmux output to know the agent is ready for input */
|
|
43
|
+
protected abstract getReadyIndicator(): string[];
|
|
44
|
+
/** Format the prompt text for this specific agent */
|
|
45
|
+
protected abstract formatPrompt(prompt: string): string;
|
|
46
|
+
/** Set up MCP config files in the working directory for this agent */
|
|
47
|
+
protected abstract setupMcpConfig(cwd: string, toolAllowlist?: string[] | null): Promise<void>;
|
|
48
|
+
/** Check whether this launcher is properly configured */
|
|
49
|
+
protected abstract checkEnabled(): boolean;
|
|
50
|
+
/** Return the working directory from config */
|
|
51
|
+
protected abstract getWorkingDirectory(): string;
|
|
52
|
+
/** Return the auto-respawn config flag */
|
|
53
|
+
protected abstract isAutoRespawnConfigured(): boolean;
|
|
54
|
+
/** Return the idle timeout from config */
|
|
55
|
+
protected abstract getIdleTimeoutMs(): number;
|
|
56
|
+
/** Return the session prompt from config */
|
|
57
|
+
protected abstract getSessionPrompt(): string | undefined;
|
|
58
|
+
/** Return agent-specific environment variables for the tmux session */
|
|
59
|
+
protected abstract getAgentEnv(): Record<string, string>;
|
|
60
|
+
/** Return prefix for tmux session names (e.g., 'silolink-claude', 'silolink-gemini') */
|
|
61
|
+
protected abstract getTmuxPrefix(): string;
|
|
62
|
+
/** Return the log tag for this launcher (e.g., '[ClaudeLauncher]') */
|
|
63
|
+
protected abstract getLogTag(): string;
|
|
64
|
+
/** Return cost metadata key name */
|
|
65
|
+
protected abstract getCostMetadataKey(): string;
|
|
66
|
+
/** Build the full prompt for agent launch, given context parts */
|
|
67
|
+
protected abstract buildLaunchPrompt(reason: string, conversationId: number | undefined, agentContext: string, workspaceContext: string): {
|
|
68
|
+
prompt: string;
|
|
69
|
+
extraArgs: string[];
|
|
70
|
+
};
|
|
71
|
+
launch(config: LaunchConfig): Promise<AgentProcess | null>;
|
|
72
|
+
resume(resumeId: string, config: LaunchConfig): Promise<AgentProcess | null>;
|
|
73
|
+
isAlive(process: AgentProcess): Promise<boolean>;
|
|
74
|
+
terminate(process: AgentProcess): void;
|
|
75
|
+
terminateAll(): void;
|
|
76
|
+
getProcesses(): AgentProcess[];
|
|
77
|
+
getByConversation(conversationId: number): AgentProcess | undefined;
|
|
78
|
+
nudge(): boolean;
|
|
79
|
+
isEnabled(): boolean;
|
|
80
|
+
isAutoRespawnEnabled(): boolean;
|
|
81
|
+
hasLiveProcess(): boolean;
|
|
82
|
+
startIdleMonitor(): void;
|
|
83
|
+
destroy(): void;
|
|
84
|
+
setWorkspaceConfig(config: WorkspaceLaunchConfig | null): void;
|
|
85
|
+
setRepoCwd(repoPath: string): void;
|
|
86
|
+
setLlmAgentId(agentId: number | null): void;
|
|
87
|
+
setMcpToolAllowlist(tools: string[] | null): void;
|
|
88
|
+
setLastResumeId(resumeId: string): void;
|
|
89
|
+
launchOnMessage(conversationId?: number, triggerMessage?: string, llmAgentId?: number): Promise<boolean>;
|
|
90
|
+
killByConversation(conversationId: number): void;
|
|
91
|
+
kill(): void;
|
|
92
|
+
interrupt(conversationId: number, message?: string): Promise<boolean>;
|
|
93
|
+
getTmuxSessionForConversation(conversationId: number): string | null;
|
|
94
|
+
launchInternal(reason?: string, conversationId?: number): Promise<boolean>;
|
|
95
|
+
protected monitorTmuxSession(_sessionName: string): void;
|
|
96
|
+
protected checkTmuxSessions(): void;
|
|
97
|
+
protected captureCostFromPane(tmuxSession: string, conversationId: number): void;
|
|
98
|
+
protected checkIdle(): Promise<void>;
|
|
99
|
+
protected copyMcpJson(sourcePath: string, targetDir: string): void;
|
|
100
|
+
}
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=base-tmux-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-tmux-launcher.d.ts","sourceRoot":"","sources":["../../src/core/base-tmux-launcher.ts"],"names":[],"mappings":"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"}
|