@luckydraw/cumulus 0.26.7 → 0.27.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/gateway/device-mcp.d.ts +21 -0
- package/dist/gateway/device-mcp.d.ts.map +1 -0
- package/dist/gateway/device-mcp.js +158 -0
- package/dist/gateway/device-mcp.js.map +1 -0
- package/dist/gateway/server.d.ts +5 -0
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +117 -3
- package/dist/gateway/server.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +57 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/executor.d.ts +168 -0
- package/dist/lib/executor.d.ts.map +1 -0
- package/dist/lib/executor.js +284 -0
- package/dist/lib/executor.js.map +1 -0
- package/dist/lib/gateway.d.ts +13 -1
- package/dist/lib/gateway.d.ts.map +1 -1
- package/dist/lib/gateway.js +217 -88
- package/dist/lib/gateway.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -38,6 +38,8 @@ export { executeRevert } from './lib/revert.js';
|
|
|
38
38
|
export { sendMessage, getOrCreateThread, clearThreadCache, resolveClaudeCli, resolveNode, truncateToTokens, formatRecentContext, generateSystemPrompt, generateMcpConfig, cleanupMcpConfig, parseStreamSegments, extractTextFromStreamLine, computeAvgRelevance, SYSTEM_PROMPT_TEMPLATE, FILE_READ_REMINDER, RECENT_CONTEXT_COUNT, RECENT_MSG_MAX_TOKENS, RECENT_CONTEXT_BUDGET, } from './lib/gateway.js';
|
|
39
39
|
// Gateway Server — HTTP/SSE API for remote access
|
|
40
40
|
export { startGatewayServer } from './gateway/server.js';
|
|
41
|
+
// Executor dispatch — remote Claude execution
|
|
42
|
+
export { ExecutorRegistry } from './lib/executor.js';
|
|
41
43
|
export { loadGatewayConfig, getConfigPath as getGatewayConfigPath } from './gateway/config.js';
|
|
42
44
|
export { authenticate as authenticateRequest } from './gateway/auth.js';
|
|
43
45
|
export { createLogger, getDefaultLogPath } from './gateway/logger.js';
|
|
@@ -66,4 +68,8 @@ export function getMcpServerPath() {
|
|
|
66
68
|
export function getGatewayAgentsMcpPath() {
|
|
67
69
|
return join(__mcp_dirname, 'gateway', 'gateway-agents-mcp.js');
|
|
68
70
|
}
|
|
71
|
+
/** Absolute path to the device MCP stdio server (for cross-machine tool access) */
|
|
72
|
+
export function getDeviceMcpPath() {
|
|
73
|
+
return join(__mcp_dirname, 'gateway', 'device-mcp.js');
|
|
74
|
+
}
|
|
69
75
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,4BAA4B;AAE5B,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjE,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAYtD,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAGnC,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxE,0BAA0B;AAC1B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAQ1C,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAQ7B,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGzE,WAAW;AACX,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,oBAAoB;AACpB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,aAAa,IAAI,oBAAoB,EACrC,aAAa,IAAI,oBAAoB,EACrC,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAG/E,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAQnC,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAWzB,cAAc;AACd,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGlF,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjF,aAAa;AACb,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,0DAA0D;AAC1D,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAW1B,kDAAkD;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -15,6 +15,14 @@ export interface CumulusConfig {
|
|
|
15
15
|
template?: string;
|
|
16
16
|
/** RAG budget preset — overrides adaptive budget when set to small/medium/large */
|
|
17
17
|
ragBudgetPreset?: RagBudgetPreset;
|
|
18
|
+
/** Executor that runs Claude for this thread (default: "thundercat" = local on gateway) */
|
|
19
|
+
executor?: string;
|
|
20
|
+
/** Per-executor project directories: { "thundercat": "/home/karl/projects/foo", "mac-karl": "/Users/karl/..." } */
|
|
21
|
+
executorPaths?: Record<string, string>;
|
|
22
|
+
/** Inject device MCP tools from these executors (for cross-machine access, e.g. Jarvis) */
|
|
23
|
+
devices?: string[];
|
|
24
|
+
/** Git remote URL for auto-clone when switching executors */
|
|
25
|
+
gitRemoteUrl?: string;
|
|
18
26
|
}
|
|
19
27
|
/**
|
|
20
28
|
* Resolve the RAG budget based on config preset and adaptive fallback.
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAUxF,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,eAAe,CAAC,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -107,6 +107,42 @@ async function loadConfigFile(configPath) {
|
|
|
107
107
|
delete config.ragBudgetPreset;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
+
// Validate executor if present
|
|
111
|
+
if (config.executor !== undefined) {
|
|
112
|
+
if (typeof config.executor !== 'string') {
|
|
113
|
+
console.warn(`[Config] executor must be a string in ${configPath}`);
|
|
114
|
+
delete config.executor;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Validate executorPaths if present
|
|
118
|
+
if (config.executorPaths !== undefined) {
|
|
119
|
+
if (typeof config.executorPaths !== 'object' || config.executorPaths === null || Array.isArray(config.executorPaths)) {
|
|
120
|
+
console.warn(`[Config] executorPaths must be an object in ${configPath}`);
|
|
121
|
+
delete config.executorPaths;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
for (const [key, val] of Object.entries(config.executorPaths)) {
|
|
125
|
+
if (typeof val !== 'string') {
|
|
126
|
+
console.warn(`[Config] executorPaths.${key} must be a string in ${configPath}`);
|
|
127
|
+
delete config.executorPaths[key];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Validate devices if present
|
|
133
|
+
if (config.devices !== undefined) {
|
|
134
|
+
if (!Array.isArray(config.devices) || !config.devices.every((d) => typeof d === 'string')) {
|
|
135
|
+
console.warn(`[Config] devices must be an array of strings in ${configPath}`);
|
|
136
|
+
delete config.devices;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Validate gitRemoteUrl if present
|
|
140
|
+
if (config.gitRemoteUrl !== undefined) {
|
|
141
|
+
if (typeof config.gitRemoteUrl !== 'string') {
|
|
142
|
+
console.warn(`[Config] gitRemoteUrl must be a string in ${configPath}`);
|
|
143
|
+
delete config.gitRemoteUrl;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
110
146
|
return config;
|
|
111
147
|
}
|
|
112
148
|
catch (err) {
|
|
@@ -149,6 +185,27 @@ export function mergeConfigs(global, thread) {
|
|
|
149
185
|
if (ragBudgetPreset) {
|
|
150
186
|
merged.ragBudgetPreset = ragBudgetPreset;
|
|
151
187
|
}
|
|
188
|
+
// executor: thread overrides global
|
|
189
|
+
const executor = thread.executor ?? global.executor;
|
|
190
|
+
if (executor) {
|
|
191
|
+
merged.executor = executor;
|
|
192
|
+
}
|
|
193
|
+
// executorPaths: deep merge (thread overrides per-key)
|
|
194
|
+
const globalPaths = global.executorPaths ?? {};
|
|
195
|
+
const threadPaths = thread.executorPaths ?? {};
|
|
196
|
+
if (Object.keys(globalPaths).length > 0 || Object.keys(threadPaths).length > 0) {
|
|
197
|
+
merged.executorPaths = { ...globalPaths, ...threadPaths };
|
|
198
|
+
}
|
|
199
|
+
// devices: thread overrides global (not merged — it's a complete list)
|
|
200
|
+
const devices = thread.devices ?? global.devices;
|
|
201
|
+
if (devices && devices.length > 0) {
|
|
202
|
+
merged.devices = devices;
|
|
203
|
+
}
|
|
204
|
+
// gitRemoteUrl: thread overrides global
|
|
205
|
+
const gitRemoteUrl = thread.gitRemoteUrl ?? global.gitRemoteUrl;
|
|
206
|
+
if (gitRemoteUrl) {
|
|
207
|
+
merged.gitRemoteUrl = gitRemoteUrl;
|
|
208
|
+
}
|
|
152
209
|
return merged;
|
|
153
210
|
}
|
|
154
211
|
/**
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor registry and dispatch — manages remote machines that can run Claude.
|
|
3
|
+
*
|
|
4
|
+
* The gateway always owns conversation state (history, RAG, prompt assembly).
|
|
5
|
+
* Executors are registered machines (thundercat, mac-karl, etc.) that run Claude
|
|
6
|
+
* subprocesses. The gateway dispatches assembled prompts to executors and
|
|
7
|
+
* streams tokens back.
|
|
8
|
+
*/
|
|
9
|
+
import type { WebSocket } from 'ws';
|
|
10
|
+
/** Payload sent from gateway to executor to run Claude */
|
|
11
|
+
export interface ExecutePayload {
|
|
12
|
+
type: 'execute';
|
|
13
|
+
requestId: string;
|
|
14
|
+
threadName: string;
|
|
15
|
+
/** Fully assembled system prompt (identity + RAG + always-include + recent context) */
|
|
16
|
+
systemPrompt: string;
|
|
17
|
+
/** User message with FILE_READ_REMINDER prepended */
|
|
18
|
+
userMessage: string;
|
|
19
|
+
/** Base64-encoded images */
|
|
20
|
+
imageBlocks?: Array<{
|
|
21
|
+
type: string;
|
|
22
|
+
source: {
|
|
23
|
+
type: string;
|
|
24
|
+
media_type: string;
|
|
25
|
+
data: string;
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
/** MCP server configs — gateway-proxy entries are resolved locally by executor */
|
|
29
|
+
mcpServers: Record<string, McpServerDispatchConfig>;
|
|
30
|
+
/** Working directory on the executor machine */
|
|
31
|
+
cwd: string;
|
|
32
|
+
/** Claude CLI args (--print, --verbose, etc.) */
|
|
33
|
+
claudeArgs: string[];
|
|
34
|
+
}
|
|
35
|
+
/** MCP server config in dispatch payload */
|
|
36
|
+
export type McpServerDispatchConfig = {
|
|
37
|
+
/** Run locally on the executor — command + args provided */
|
|
38
|
+
type: 'local';
|
|
39
|
+
command: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
env: Record<string, string>;
|
|
42
|
+
} | {
|
|
43
|
+
/** Proxy back to gateway's shared MCP server */
|
|
44
|
+
type: 'gateway-proxy';
|
|
45
|
+
sharedUrl: string;
|
|
46
|
+
threadName: string;
|
|
47
|
+
} | {
|
|
48
|
+
/** Proxy back to gateway's agents MCP */
|
|
49
|
+
type: 'gateway-agents-proxy';
|
|
50
|
+
apiUrl: string;
|
|
51
|
+
apiKey: string;
|
|
52
|
+
agentName: string;
|
|
53
|
+
};
|
|
54
|
+
/** Abort message sent from gateway to executor */
|
|
55
|
+
export interface ExecuteAbortPayload {
|
|
56
|
+
type: 'execute_abort';
|
|
57
|
+
requestId: string;
|
|
58
|
+
}
|
|
59
|
+
/** Token streamed from executor to gateway */
|
|
60
|
+
export interface ExecuteTokenMessage {
|
|
61
|
+
type: 'execute_token';
|
|
62
|
+
requestId: string;
|
|
63
|
+
/** Raw stream-json line from Claude stdout */
|
|
64
|
+
line: string;
|
|
65
|
+
}
|
|
66
|
+
/** Execution completed */
|
|
67
|
+
export interface ExecuteDoneMessage {
|
|
68
|
+
type: 'execute_done';
|
|
69
|
+
requestId: string;
|
|
70
|
+
exitCode: number;
|
|
71
|
+
}
|
|
72
|
+
/** Execution error */
|
|
73
|
+
export interface ExecuteErrorMessage {
|
|
74
|
+
type: 'execute_error';
|
|
75
|
+
requestId: string;
|
|
76
|
+
error: string;
|
|
77
|
+
}
|
|
78
|
+
/** Device MCP tool call routed to a remote device */
|
|
79
|
+
export interface DeviceToolCallMessage {
|
|
80
|
+
type: 'device_tool_call';
|
|
81
|
+
callId: string;
|
|
82
|
+
executorId: string;
|
|
83
|
+
tool: string;
|
|
84
|
+
args: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
/** Device MCP tool result */
|
|
87
|
+
export interface DeviceToolResultMessage {
|
|
88
|
+
type: 'device_tool_result';
|
|
89
|
+
callId: string;
|
|
90
|
+
result: unknown;
|
|
91
|
+
isError?: boolean;
|
|
92
|
+
}
|
|
93
|
+
/** Registration message from executor to gateway */
|
|
94
|
+
export interface ExecutorRegisterMessage {
|
|
95
|
+
type: 'executor_register';
|
|
96
|
+
executorId: string;
|
|
97
|
+
hostname: string;
|
|
98
|
+
projectRoot: string;
|
|
99
|
+
}
|
|
100
|
+
/** Registration confirmation from gateway to executor */
|
|
101
|
+
export interface ExecutorRegisteredMessage {
|
|
102
|
+
type: 'executor_registered';
|
|
103
|
+
executorId: string;
|
|
104
|
+
}
|
|
105
|
+
/** All messages that can be sent over the executor WebSocket */
|
|
106
|
+
export type ExecutorMessage = ExecutorRegisterMessage | ExecutorRegisteredMessage | ExecutePayload | ExecuteAbortPayload | ExecuteTokenMessage | ExecuteDoneMessage | ExecuteErrorMessage | DeviceToolCallMessage | DeviceToolResultMessage | {
|
|
107
|
+
type: 'ping';
|
|
108
|
+
} | {
|
|
109
|
+
type: 'pong';
|
|
110
|
+
};
|
|
111
|
+
export interface ExecutionResult {
|
|
112
|
+
requestId: string;
|
|
113
|
+
exitCode: number;
|
|
114
|
+
lines: string[];
|
|
115
|
+
}
|
|
116
|
+
export declare class ExecutorRegistry {
|
|
117
|
+
private executors;
|
|
118
|
+
private pendingExecutions;
|
|
119
|
+
private pendingDeviceCalls;
|
|
120
|
+
private pingIntervals;
|
|
121
|
+
private deviceCallCounter;
|
|
122
|
+
/** Register a new executor from an incoming WebSocket connection */
|
|
123
|
+
register(msg: ExecutorRegisterMessage, ws: WebSocket): void;
|
|
124
|
+
/** Unregister an executor */
|
|
125
|
+
unregister(executorId: string): void;
|
|
126
|
+
/** Check if an executor is online */
|
|
127
|
+
isOnline(executorId: string): boolean;
|
|
128
|
+
/** Get executor info */
|
|
129
|
+
getExecutor(executorId: string): {
|
|
130
|
+
hostname: string;
|
|
131
|
+
projectRoot: string;
|
|
132
|
+
} | null;
|
|
133
|
+
/** List all registered executors with online status */
|
|
134
|
+
listExecutors(): Array<{
|
|
135
|
+
executorId: string;
|
|
136
|
+
hostname: string;
|
|
137
|
+
projectRoot: string;
|
|
138
|
+
online: boolean;
|
|
139
|
+
connectedAt: number;
|
|
140
|
+
activeRequests: number;
|
|
141
|
+
}>;
|
|
142
|
+
/**
|
|
143
|
+
* Dispatch an execution request to a remote executor.
|
|
144
|
+
* Returns a promise that resolves when the executor completes.
|
|
145
|
+
*/
|
|
146
|
+
dispatch(executorId: string, payload: ExecutePayload, callbacks?: {
|
|
147
|
+
onLine?: (line: string) => void;
|
|
148
|
+
onError?: (error: string) => void;
|
|
149
|
+
}): Promise<ExecutionResult>;
|
|
150
|
+
/** Abort an in-flight execution */
|
|
151
|
+
abort(requestId: string): void;
|
|
152
|
+
/**
|
|
153
|
+
* Route a device tool call to a remote executor.
|
|
154
|
+
* Returns a promise that resolves with the tool result.
|
|
155
|
+
* Timeout: 60s (for long-running commands like builds).
|
|
156
|
+
*/
|
|
157
|
+
deviceToolCall(executorId: string, tool: string, args: Record<string, unknown>): Promise<{
|
|
158
|
+
result: unknown;
|
|
159
|
+
isError?: boolean;
|
|
160
|
+
}>;
|
|
161
|
+
/** Shut down all connections */
|
|
162
|
+
shutdown(): void;
|
|
163
|
+
private handleExecutorMessage;
|
|
164
|
+
private handleDisconnect;
|
|
165
|
+
private cleanupExecutor;
|
|
166
|
+
private send;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/lib/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor registry and dispatch — manages remote machines that can run Claude.
|
|
3
|
+
*
|
|
4
|
+
* The gateway always owns conversation state (history, RAG, prompt assembly).
|
|
5
|
+
* Executors are registered machines (thundercat, mac-karl, etc.) that run Claude
|
|
6
|
+
* subprocesses. The gateway dispatches assembled prompts to executors and
|
|
7
|
+
* streams tokens back.
|
|
8
|
+
*/
|
|
9
|
+
export class ExecutorRegistry {
|
|
10
|
+
executors = new Map();
|
|
11
|
+
pendingExecutions = new Map();
|
|
12
|
+
pendingDeviceCalls = new Map();
|
|
13
|
+
pingIntervals = new Map();
|
|
14
|
+
deviceCallCounter = 0;
|
|
15
|
+
/** Register a new executor from an incoming WebSocket connection */
|
|
16
|
+
register(msg, ws) {
|
|
17
|
+
const existing = this.executors.get(msg.executorId);
|
|
18
|
+
if (existing) {
|
|
19
|
+
// Close old connection if still open
|
|
20
|
+
try {
|
|
21
|
+
existing.ws.close();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore
|
|
25
|
+
}
|
|
26
|
+
this.cleanupExecutor(msg.executorId);
|
|
27
|
+
}
|
|
28
|
+
const executor = {
|
|
29
|
+
executorId: msg.executorId,
|
|
30
|
+
hostname: msg.hostname,
|
|
31
|
+
projectRoot: msg.projectRoot,
|
|
32
|
+
ws,
|
|
33
|
+
connectedAt: Date.now(),
|
|
34
|
+
activeRequests: new Set(),
|
|
35
|
+
};
|
|
36
|
+
this.executors.set(msg.executorId, executor);
|
|
37
|
+
// Set up ping/pong keepalive
|
|
38
|
+
const interval = setInterval(() => {
|
|
39
|
+
if (ws.readyState === ws.OPEN) {
|
|
40
|
+
this.send(ws, { type: 'ping' });
|
|
41
|
+
}
|
|
42
|
+
}, 30_000);
|
|
43
|
+
this.pingIntervals.set(msg.executorId, interval);
|
|
44
|
+
// Handle disconnect
|
|
45
|
+
ws.on('close', () => this.handleDisconnect(msg.executorId));
|
|
46
|
+
ws.on('error', () => this.handleDisconnect(msg.executorId));
|
|
47
|
+
// Handle incoming messages from executor
|
|
48
|
+
ws.on('message', (raw) => {
|
|
49
|
+
try {
|
|
50
|
+
const data = JSON.parse(raw.toString());
|
|
51
|
+
this.handleExecutorMessage(msg.executorId, data);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// ignore malformed messages
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Confirm registration
|
|
58
|
+
this.send(ws, { type: 'executor_registered', executorId: msg.executorId });
|
|
59
|
+
console.log(`[ExecutorRegistry] Registered executor "${msg.executorId}" (${msg.hostname}), projectRoot: ${msg.projectRoot}`);
|
|
60
|
+
}
|
|
61
|
+
/** Unregister an executor */
|
|
62
|
+
unregister(executorId) {
|
|
63
|
+
const executor = this.executors.get(executorId);
|
|
64
|
+
if (executor) {
|
|
65
|
+
try {
|
|
66
|
+
executor.ws.close();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// ignore
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
this.cleanupExecutor(executorId);
|
|
73
|
+
}
|
|
74
|
+
/** Check if an executor is online */
|
|
75
|
+
isOnline(executorId) {
|
|
76
|
+
if (executorId === 'thundercat')
|
|
77
|
+
return true; // local executor is always online
|
|
78
|
+
const executor = this.executors.get(executorId);
|
|
79
|
+
return !!executor && executor.ws.readyState === executor.ws.OPEN;
|
|
80
|
+
}
|
|
81
|
+
/** Get executor info */
|
|
82
|
+
getExecutor(executorId) {
|
|
83
|
+
const executor = this.executors.get(executorId);
|
|
84
|
+
if (!executor)
|
|
85
|
+
return null;
|
|
86
|
+
return { hostname: executor.hostname, projectRoot: executor.projectRoot };
|
|
87
|
+
}
|
|
88
|
+
/** List all registered executors with online status */
|
|
89
|
+
listExecutors() {
|
|
90
|
+
const result = [];
|
|
91
|
+
// Always include thundercat as local
|
|
92
|
+
result.push({
|
|
93
|
+
executorId: 'thundercat',
|
|
94
|
+
hostname: 'thundercat',
|
|
95
|
+
projectRoot: '', // resolved at runtime
|
|
96
|
+
online: true,
|
|
97
|
+
connectedAt: 0,
|
|
98
|
+
activeRequests: 0,
|
|
99
|
+
});
|
|
100
|
+
for (const [, executor] of this.executors) {
|
|
101
|
+
result.push({
|
|
102
|
+
executorId: executor.executorId,
|
|
103
|
+
hostname: executor.hostname,
|
|
104
|
+
projectRoot: executor.projectRoot,
|
|
105
|
+
online: executor.ws.readyState === executor.ws.OPEN,
|
|
106
|
+
connectedAt: executor.connectedAt,
|
|
107
|
+
activeRequests: executor.activeRequests.size,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Dispatch an execution request to a remote executor.
|
|
114
|
+
* Returns a promise that resolves when the executor completes.
|
|
115
|
+
*/
|
|
116
|
+
dispatch(executorId, payload, callbacks) {
|
|
117
|
+
const executor = this.executors.get(executorId);
|
|
118
|
+
if (!executor) {
|
|
119
|
+
return Promise.reject(new Error(`Executor "${executorId}" is not registered`));
|
|
120
|
+
}
|
|
121
|
+
if (executor.ws.readyState !== executor.ws.OPEN) {
|
|
122
|
+
return Promise.reject(new Error(`Executor "${executorId}" is offline`));
|
|
123
|
+
}
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const pending = {
|
|
126
|
+
requestId: payload.requestId,
|
|
127
|
+
threadName: payload.threadName,
|
|
128
|
+
executorId,
|
|
129
|
+
resolve,
|
|
130
|
+
reject,
|
|
131
|
+
lines: [],
|
|
132
|
+
onLine: callbacks?.onLine,
|
|
133
|
+
onError: callbacks?.onError,
|
|
134
|
+
};
|
|
135
|
+
this.pendingExecutions.set(payload.requestId, pending);
|
|
136
|
+
executor.activeRequests.add(payload.requestId);
|
|
137
|
+
this.send(executor.ws, payload);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Abort an in-flight execution */
|
|
141
|
+
abort(requestId) {
|
|
142
|
+
const pending = this.pendingExecutions.get(requestId);
|
|
143
|
+
if (!pending)
|
|
144
|
+
return;
|
|
145
|
+
const executor = this.executors.get(pending.executorId);
|
|
146
|
+
if (executor && executor.ws.readyState === executor.ws.OPEN) {
|
|
147
|
+
this.send(executor.ws, { type: 'execute_abort', requestId });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Route a device tool call to a remote executor.
|
|
152
|
+
* Returns a promise that resolves with the tool result.
|
|
153
|
+
* Timeout: 60s (for long-running commands like builds).
|
|
154
|
+
*/
|
|
155
|
+
deviceToolCall(executorId, tool, args) {
|
|
156
|
+
const executor = this.executors.get(executorId);
|
|
157
|
+
if (!executor) {
|
|
158
|
+
return Promise.reject(new Error(`Device "${executorId}" is not registered`));
|
|
159
|
+
}
|
|
160
|
+
if (executor.ws.readyState !== executor.ws.OPEN) {
|
|
161
|
+
return Promise.reject(new Error(`Device "${executorId}" is offline`));
|
|
162
|
+
}
|
|
163
|
+
const callId = `dtc-${++this.deviceCallCounter}-${Date.now()}`;
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
165
|
+
const timeout = setTimeout(() => {
|
|
166
|
+
this.pendingDeviceCalls.delete(callId);
|
|
167
|
+
reject(new Error(`Device tool call timed out after 60s: ${tool}`));
|
|
168
|
+
}, 60_000);
|
|
169
|
+
const pending = {
|
|
170
|
+
callId,
|
|
171
|
+
executorId,
|
|
172
|
+
resolve: (result) => {
|
|
173
|
+
clearTimeout(timeout);
|
|
174
|
+
resolve(result);
|
|
175
|
+
},
|
|
176
|
+
reject: (err) => {
|
|
177
|
+
clearTimeout(timeout);
|
|
178
|
+
reject(err);
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
this.pendingDeviceCalls.set(callId, pending);
|
|
182
|
+
this.send(executor.ws, {
|
|
183
|
+
type: 'device_tool_call',
|
|
184
|
+
callId,
|
|
185
|
+
executorId,
|
|
186
|
+
tool,
|
|
187
|
+
args,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Shut down all connections */
|
|
192
|
+
shutdown() {
|
|
193
|
+
for (const [id] of this.executors) {
|
|
194
|
+
this.unregister(id);
|
|
195
|
+
}
|
|
196
|
+
for (const [, interval] of this.pingIntervals) {
|
|
197
|
+
clearInterval(interval);
|
|
198
|
+
}
|
|
199
|
+
this.pingIntervals.clear();
|
|
200
|
+
}
|
|
201
|
+
// ─── Internal ──────────────────────────────────────────────────────────────
|
|
202
|
+
handleExecutorMessage(executorId, msg) {
|
|
203
|
+
switch (msg.type) {
|
|
204
|
+
case 'execute_token': {
|
|
205
|
+
const pending = this.pendingExecutions.get(msg.requestId);
|
|
206
|
+
if (pending) {
|
|
207
|
+
pending.lines.push(msg.line);
|
|
208
|
+
pending.onLine?.(msg.line);
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case 'execute_done': {
|
|
213
|
+
const pending = this.pendingExecutions.get(msg.requestId);
|
|
214
|
+
if (pending) {
|
|
215
|
+
this.pendingExecutions.delete(msg.requestId);
|
|
216
|
+
const executor = this.executors.get(executorId);
|
|
217
|
+
executor?.activeRequests.delete(msg.requestId);
|
|
218
|
+
pending.resolve({
|
|
219
|
+
requestId: msg.requestId,
|
|
220
|
+
exitCode: msg.exitCode,
|
|
221
|
+
lines: pending.lines,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case 'execute_error': {
|
|
227
|
+
const pending = this.pendingExecutions.get(msg.requestId);
|
|
228
|
+
if (pending) {
|
|
229
|
+
this.pendingExecutions.delete(msg.requestId);
|
|
230
|
+
const executor = this.executors.get(executorId);
|
|
231
|
+
executor?.activeRequests.delete(msg.requestId);
|
|
232
|
+
pending.onError?.(msg.error);
|
|
233
|
+
pending.reject(new Error(msg.error));
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case 'pong':
|
|
238
|
+
// keepalive response, nothing to do
|
|
239
|
+
break;
|
|
240
|
+
case 'device_tool_result': {
|
|
241
|
+
const pendingCall = this.pendingDeviceCalls.get(msg.callId);
|
|
242
|
+
if (pendingCall) {
|
|
243
|
+
this.pendingDeviceCalls.delete(msg.callId);
|
|
244
|
+
pendingCall.resolve({ result: msg.result, isError: msg.isError });
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
default:
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
handleDisconnect(executorId) {
|
|
253
|
+
console.log(`[ExecutorRegistry] Executor "${executorId}" disconnected`);
|
|
254
|
+
// Fail all pending executions for this executor
|
|
255
|
+
for (const [requestId, pending] of this.pendingExecutions) {
|
|
256
|
+
if (pending.executorId === executorId) {
|
|
257
|
+
this.pendingExecutions.delete(requestId);
|
|
258
|
+
pending.reject(new Error(`Executor "${executorId}" disconnected during execution`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Fail all pending device tool calls for this executor
|
|
262
|
+
for (const [callId, pending] of this.pendingDeviceCalls) {
|
|
263
|
+
if (pending.executorId === executorId) {
|
|
264
|
+
this.pendingDeviceCalls.delete(callId);
|
|
265
|
+
pending.reject(new Error(`Device "${executorId}" disconnected during tool call`));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
this.cleanupExecutor(executorId);
|
|
269
|
+
}
|
|
270
|
+
cleanupExecutor(executorId) {
|
|
271
|
+
this.executors.delete(executorId);
|
|
272
|
+
const interval = this.pingIntervals.get(executorId);
|
|
273
|
+
if (interval) {
|
|
274
|
+
clearInterval(interval);
|
|
275
|
+
this.pingIntervals.delete(executorId);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
send(ws, msg) {
|
|
279
|
+
if (ws.readyState === ws.OPEN) {
|
|
280
|
+
ws.send(JSON.stringify(msg));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=executor.js.map
|