frely-cli 0.3.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 +157 -0
- package/dist/auth.d.ts +27 -0
- package/dist/auth.js +208 -0
- package/dist/auth.js.map +1 -0
- package/dist/device/control.d.ts +10 -0
- package/dist/device/control.js +164 -0
- package/dist/device/control.js.map +1 -0
- package/dist/device/identity.d.ts +16 -0
- package/dist/device/identity.js +49 -0
- package/dist/device/identity.js.map +1 -0
- package/dist/device/protocol.d.ts +34 -0
- package/dist/device/protocol.js +76 -0
- package/dist/device/protocol.js.map +1 -0
- package/dist/device/relay-client.d.ts +6 -0
- package/dist/device/relay-client.js +159 -0
- package/dist/device/relay-client.js.map +1 -0
- package/dist/device/state.d.ts +14 -0
- package/dist/device/state.js +34 -0
- package/dist/device/state.js.map +1 -0
- package/dist/diagnostics.d.ts +25 -0
- package/dist/diagnostics.js +64 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/mcp.d.ts +3 -0
- package/dist/runtime/mcp.js +117 -0
- package/dist/runtime/mcp.js.map +1 -0
- package/dist/runtime/process-manager.d.ts +29 -0
- package/dist/runtime/process-manager.js +118 -0
- package/dist/runtime/process-manager.js.map +1 -0
- package/dist/runtime/relay-mcp.d.ts +9 -0
- package/dist/runtime/relay-mcp.js +101 -0
- package/dist/runtime/relay-mcp.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +11 -0
- package/dist/runtime/scheduler.js +51 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/workspace.d.ts +72 -0
- package/dist/runtime/workspace.js +318 -0
- package/dist/runtime/workspace.js.map +1 -0
- package/dist/service.d.ts +12 -0
- package/dist/service.js +142 -0
- package/dist/service.js.map +1 -0
- package/package.json +47 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { stdin, stdout } from "node:process";
|
|
4
|
+
import { login, logout, requireLogin, whoami } from "./auth.js";
|
|
5
|
+
import { doctor, statusSnapshot } from "./diagnostics.js";
|
|
6
|
+
import { currentDevice, ensureDevice, revokeDevice } from "./device/control.js";
|
|
7
|
+
import { serveDeviceRelay } from "./device/relay-client.js";
|
|
8
|
+
import { startStdioMcp } from "./runtime/mcp.js";
|
|
9
|
+
import { installMcpService, serviceStatus, startMcpService, stopMcpService, uninstallMcpService } from "./service.js";
|
|
10
|
+
const VERSION = "0.3.0";
|
|
11
|
+
async function main() {
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
const command = args[0];
|
|
14
|
+
if (command === "--version" || command === "-v" || command === "version") {
|
|
15
|
+
stdout.write(`${VERSION}\n`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!command || command === "help" || command === "--help" || command === "-h")
|
|
19
|
+
return usage();
|
|
20
|
+
if (command === "login") {
|
|
21
|
+
if (!stdin.isTTY || !stdout.isTTY)
|
|
22
|
+
throw new Error("`frely login` requires an interactive TTY.");
|
|
23
|
+
const relay = option(args, "--relay");
|
|
24
|
+
const email = await promptLine("Email: ");
|
|
25
|
+
const password = await promptSecret("Password: ");
|
|
26
|
+
const user = await login(email.trim(), password, relay);
|
|
27
|
+
const service = await serviceStatus().catch(() => null);
|
|
28
|
+
if (service?.installed && !service.active)
|
|
29
|
+
await startMcpService().catch(() => undefined);
|
|
30
|
+
stdout.write(`Logged in as ${user.email}.\n`);
|
|
31
|
+
stdout.write("Run `frely mcp setup --workspace <path>` to provision this machine and get the ChatGPT MCP address.\n");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (command === "logout") {
|
|
35
|
+
await stopMcpService().catch(() => undefined);
|
|
36
|
+
await logout();
|
|
37
|
+
stdout.write("Frely login removed and MCP background service stopped.\n");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (command === "whoami") {
|
|
41
|
+
const user = await whoami();
|
|
42
|
+
stdout.write(`${user.email} (${user.id})\n`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (command === "status") {
|
|
46
|
+
const value = await statusSnapshot();
|
|
47
|
+
if (args.includes("--json"))
|
|
48
|
+
stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
49
|
+
else {
|
|
50
|
+
stdout.write(`Frely CLI ${VERSION}\n`);
|
|
51
|
+
stdout.write(`Relay: ${value.auth.relayUrl ?? "not configured"}\n`);
|
|
52
|
+
stdout.write(`Account: ${value.auth.user?.email ?? "not logged in"}\n`);
|
|
53
|
+
stdout.write(`Credential: ${value.auth.credentialStored ? "stored" : "missing"}\n`);
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (command === "doctor") {
|
|
58
|
+
const value = await doctor();
|
|
59
|
+
if (args.includes("--json"))
|
|
60
|
+
stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
61
|
+
else
|
|
62
|
+
for (const check of value.checks)
|
|
63
|
+
stdout.write(`${check.ok ? "PASS" : "FAIL"} ${check.name}: ${check.detail}\n`);
|
|
64
|
+
if (!value.ok)
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (command === "mcp" && args[1] === "setup") {
|
|
69
|
+
await requireLogin();
|
|
70
|
+
const workspace = resolve(option(args, "--workspace") || process.cwd());
|
|
71
|
+
const device = await ensureDevice();
|
|
72
|
+
const service = await installMcpService(workspace);
|
|
73
|
+
stdout.write(`MCP URL: ${device.mcpUrl}\n`);
|
|
74
|
+
stdout.write(`Background service: ${service.active ? "running" : "installed"}\n`);
|
|
75
|
+
stdout.write(`Workspace: ${service.workspace ?? workspace}\n`);
|
|
76
|
+
stdout.write("Add the MCP URL to ChatGPT with Authentication set to None. Keep the URL private.\n");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (command === "mcp" && args[1] === "url") {
|
|
80
|
+
const device = await ensureDevice();
|
|
81
|
+
if (args.includes("--json"))
|
|
82
|
+
stdout.write(`${JSON.stringify({ deviceId: device.deviceId, mcpUrl: device.mcpUrl }, null, 2)}\n`);
|
|
83
|
+
else
|
|
84
|
+
stdout.write(`${device.mcpUrl}\n`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (command === "mcp" && args[1] === "status") {
|
|
88
|
+
await requireLogin();
|
|
89
|
+
const device = await currentDevice();
|
|
90
|
+
const safeDevice = device ? { deviceId: device.deviceId, keyThumbprint: device.keyThumbprint, provisioned: true } : null;
|
|
91
|
+
if (args.includes("--json"))
|
|
92
|
+
stdout.write(`${JSON.stringify({ provisioned: Boolean(device), device: safeDevice }, null, 2)}\n`);
|
|
93
|
+
else if (!device)
|
|
94
|
+
stdout.write("MCP device is not provisioned. Run `frely mcp url`.\n");
|
|
95
|
+
else {
|
|
96
|
+
stdout.write(`Device: ${device.deviceId}\n`);
|
|
97
|
+
stdout.write("MCP URL: private; run `frely mcp url` to reveal it.\n");
|
|
98
|
+
stdout.write(`Key: ${device.keyThumbprint}\n`);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (command === "mcp" && args[1] === "chatgpt") {
|
|
103
|
+
const device = await ensureDevice();
|
|
104
|
+
const service = await serviceStatus().catch(() => null);
|
|
105
|
+
stdout.write("Frely MCP for ChatGPT\n\n");
|
|
106
|
+
stdout.write(`MCP URL: ${device.mcpUrl}\n`);
|
|
107
|
+
stdout.write(`Background service: ${service?.active ? "running" : "not running"}\n\n`);
|
|
108
|
+
if (!service?.active)
|
|
109
|
+
stdout.write("Run `frely mcp setup --workspace <path>` before adding the server to ChatGPT.\n\n");
|
|
110
|
+
stdout.write("1. Add the MCP URL above as a custom MCP server in ChatGPT.\n");
|
|
111
|
+
stdout.write("2. Set MCP Authentication to None.\n");
|
|
112
|
+
stdout.write("3. Treat the full MCP URL as a private bearer credential and do not share it.\n");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (command === "mcp" && args[1] === "serve") {
|
|
116
|
+
await requireLogin();
|
|
117
|
+
const workspace = resolve(option(args, "--workspace") || process.cwd());
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const stop = () => controller.abort();
|
|
120
|
+
process.once("SIGINT", stop);
|
|
121
|
+
process.once("SIGTERM", stop);
|
|
122
|
+
try {
|
|
123
|
+
await serveDeviceRelay({ workspace, signal: controller.signal, log: (message) => process.stderr.write(`${message}\n`) });
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
process.off("SIGINT", stop);
|
|
127
|
+
process.off("SIGTERM", stop);
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (command === "mcp" && args[1] === "service") {
|
|
132
|
+
const action = args[2] ?? "status";
|
|
133
|
+
if (action === "status") {
|
|
134
|
+
const service = await serviceStatus();
|
|
135
|
+
if (args.includes("--json"))
|
|
136
|
+
stdout.write(`${JSON.stringify(service, null, 2)}\n`);
|
|
137
|
+
else {
|
|
138
|
+
stdout.write(`Installed: ${service.installed ? "yes" : "no"}\n`);
|
|
139
|
+
stdout.write(`Active: ${service.active ? "yes" : "no"}\n`);
|
|
140
|
+
if (service.workspace)
|
|
141
|
+
stdout.write(`Workspace: ${service.workspace}\n`);
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (action === "start") {
|
|
146
|
+
const service = await startMcpService();
|
|
147
|
+
stdout.write(`Frely MCP service ${service.active ? "started" : "not active"}.\n`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (action === "stop") {
|
|
151
|
+
const service = await stopMcpService();
|
|
152
|
+
stdout.write(`Frely MCP service ${service.active ? "still active" : "stopped"}.\n`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (action === "uninstall") {
|
|
156
|
+
await uninstallMcpService();
|
|
157
|
+
stdout.write("Frely MCP background service removed.\n");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
throw new Error("Unknown MCP service action. Use status, start, stop, or uninstall.");
|
|
161
|
+
}
|
|
162
|
+
if (command === "mcp" && args[1] === "revoke") {
|
|
163
|
+
await uninstallMcpService().catch(() => undefined);
|
|
164
|
+
await revokeDevice();
|
|
165
|
+
stdout.write("Frely MCP device revoked, local device key removed, and background service uninstalled.\n");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (command === "mcp" && args[1] === "stdio") {
|
|
169
|
+
await requireLogin();
|
|
170
|
+
const workspace = resolve(option(args, "--workspace") || process.cwd());
|
|
171
|
+
await startStdioMcp(workspace);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
usage();
|
|
175
|
+
process.exitCode = 2;
|
|
176
|
+
}
|
|
177
|
+
function option(args, name) {
|
|
178
|
+
const index = args.indexOf(name);
|
|
179
|
+
if (index < 0)
|
|
180
|
+
return undefined;
|
|
181
|
+
const value = args[index + 1];
|
|
182
|
+
if (!value || value.startsWith("--"))
|
|
183
|
+
throw new Error(`${name} requires a value.`);
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
function usage() {
|
|
187
|
+
stdout.write("Usage:\n" +
|
|
188
|
+
" frely login [--relay <url>]\n" +
|
|
189
|
+
" frely logout\n" +
|
|
190
|
+
" frely whoami\n" +
|
|
191
|
+
" frely status [--json]\n" +
|
|
192
|
+
" frely doctor [--json]\n" +
|
|
193
|
+
" frely mcp setup [--workspace <path>]\n" +
|
|
194
|
+
" frely mcp url [--json]\n" +
|
|
195
|
+
" frely mcp status [--json]\n" +
|
|
196
|
+
" frely mcp chatgpt\n" +
|
|
197
|
+
" frely mcp serve [--workspace <path>]\n" +
|
|
198
|
+
" frely mcp service status|start|stop|uninstall [--json]\n" +
|
|
199
|
+
" frely mcp revoke\n" +
|
|
200
|
+
" frely mcp stdio [--workspace <path>]\n");
|
|
201
|
+
}
|
|
202
|
+
async function promptLine(label) {
|
|
203
|
+
const { createInterface } = await import("node:readline/promises");
|
|
204
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
205
|
+
try {
|
|
206
|
+
return await rl.question(label);
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
rl.close();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async function promptSecret(label) {
|
|
213
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== "function")
|
|
214
|
+
throw new Error("A TTY is required for password input.");
|
|
215
|
+
stdout.write(label);
|
|
216
|
+
stdin.setRawMode(true);
|
|
217
|
+
stdin.resume();
|
|
218
|
+
stdin.setEncoding("utf8");
|
|
219
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
220
|
+
let value = "";
|
|
221
|
+
let settled = false;
|
|
222
|
+
const cleanup = () => {
|
|
223
|
+
if (settled)
|
|
224
|
+
return;
|
|
225
|
+
settled = true;
|
|
226
|
+
stdin.off("data", onData);
|
|
227
|
+
stdin.setRawMode(false);
|
|
228
|
+
stdin.pause();
|
|
229
|
+
stdout.write("\n");
|
|
230
|
+
};
|
|
231
|
+
const onData = (chunk) => {
|
|
232
|
+
for (const char of String(chunk)) {
|
|
233
|
+
if (char === "\u0003") {
|
|
234
|
+
cleanup();
|
|
235
|
+
rejectPromise(new Error("Login cancelled."));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (char === "\r" || char === "\n") {
|
|
239
|
+
cleanup();
|
|
240
|
+
resolvePromise(value);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (char === "\u007f" || char === "\b") {
|
|
244
|
+
value = value.slice(0, -1);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (char >= " ")
|
|
248
|
+
value += char;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
stdin.on("data", onData);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
main().catch((error) => {
|
|
255
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
256
|
+
process.exitCode = 1;
|
|
257
|
+
});
|
|
258
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { ProcessManager } from "./process-manager.js";
|
|
5
|
+
import { FairRwScheduler } from "./scheduler.js";
|
|
6
|
+
import { safeEnv, Workspace } from "./workspace.js";
|
|
7
|
+
export async function createMcpServer(workspaceInput) {
|
|
8
|
+
const workspace = await Workspace.open(workspaceInput);
|
|
9
|
+
const scheduler = new FairRwScheduler(4);
|
|
10
|
+
const processes = new ProcessManager();
|
|
11
|
+
const server = new Server({ name: "frely-cli", version: "0.3.0" }, { capabilities: { tools: {} } });
|
|
12
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [
|
|
13
|
+
tool("workspace_info", "Return the active workspace root.", {}, { readOnly: true }),
|
|
14
|
+
tool("list_directory", "List one workspace directory.", { path: stringSchema("Relative directory path", ".") }, { readOnly: true }),
|
|
15
|
+
tool("stat_path", "Inspect one workspace file or directory.", { path: stringSchema("Relative path") }, { readOnly: true }),
|
|
16
|
+
tool("find_files", "Find workspace files using *, ** and ? wildcards.", { path: stringSchema("Relative directory path", "."), pattern: stringSchema("Wildcard pattern"), maxResults: intSchema(100, 1, 1000) }, { readOnly: true }),
|
|
17
|
+
tool("search_files", "Search UTF-8 workspace files.", { path: stringSchema("Relative directory path", "."), query: stringSchema("Search text or regex"), regex: boolSchema(false), caseSensitive: boolSchema(false), maxResults: intSchema(100, 1, 500), contextLines: intSchema(0, 0, 10) }, { readOnly: true }),
|
|
18
|
+
tool("read_file", "Read a UTF-8 workspace file up to 1 MiB.", { path: stringSchema("Relative file path") }, { readOnly: true }),
|
|
19
|
+
tool("read_file_lines", "Read a line range from a UTF-8 workspace file.", { path: stringSchema("Relative file path"), startLine: intSchema(1, 1, Number.MAX_SAFE_INTEGER), endLine: { type: "integer", minimum: 1 } }, { readOnly: true }),
|
|
20
|
+
tool("write_file", "Atomically write a UTF-8 workspace file.", { path: stringSchema("Relative file path"), content: stringSchema("Complete file content"), overwrite: boolSchema(false) }, { readOnly: false, idempotent: false }),
|
|
21
|
+
tool("apply_patch", "Apply non-overlapping line replacements to a UTF-8 workspace file.", { path: stringSchema("Relative file path"), expectedSha256: { type: "string", pattern: "^[a-f0-9]{64}$" }, edits: { type: "array", minItems: 1, maxItems: 100, items: { type: "object", additionalProperties: false, required: ["startLine", "endLine", "replacement"], properties: { startLine: { type: "integer", minimum: 1 }, endLine: { type: "integer", minimum: 1 }, replacement: { type: "string" } } } } }, { readOnly: false, idempotent: false }),
|
|
22
|
+
tool("create_directory", "Create a workspace directory.", { path: stringSchema("Relative directory path") }, { readOnly: false, idempotent: true }),
|
|
23
|
+
tool("delete_path", "Delete a workspace path. Recursive directory deletion requires recursive=true.", { path: stringSchema("Relative path"), recursive: boolSchema(false) }, { readOnly: false, destructive: true, idempotent: false }),
|
|
24
|
+
tool("move_path", "Move or rename a workspace path.", { from: stringSchema("Source path"), to: stringSchema("Destination path"), overwrite: boolSchema(false) }, { readOnly: false, destructive: true, idempotent: false }),
|
|
25
|
+
tool("run_command", "Run a shell command as the current OS user. Workspace only constrains cwd; this is not a sandbox.", { command: stringSchema("Shell command"), cwd: stringSchema("Relative working directory", "."), timeoutMs: intSchema(30000, 100, 120000) }, { readOnly: false, destructive: true, idempotent: false }),
|
|
26
|
+
tool("start_process", "Start a persistent shell process as the current OS user.", { command: stringSchema("Shell command"), cwd: stringSchema("Relative working directory", ".") }, { readOnly: false, destructive: true, idempotent: false }),
|
|
27
|
+
tool("list_processes", "List processes started by this MCP session.", {}, { readOnly: true }),
|
|
28
|
+
tool("read_process", "Read process output using absolute cursors.", { processId: stringSchema("Process id"), stdoutCursor: intSchema(0, 0, Number.MAX_SAFE_INTEGER), stderrCursor: intSchema(0, 0, Number.MAX_SAFE_INTEGER) }, { readOnly: true }),
|
|
29
|
+
tool("write_process", "Write stdin to a running process.", { processId: stringSchema("Process id"), input: stringSchema("Input text") }, { readOnly: false, destructive: true, idempotent: false }),
|
|
30
|
+
tool("stop_process", "Stop a process started by this MCP session.", { processId: stringSchema("Process id") }, { readOnly: false, destructive: true, idempotent: true }),
|
|
31
|
+
] }));
|
|
32
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
33
|
+
const name = request.params.name;
|
|
34
|
+
const args = (request.params.arguments ?? {});
|
|
35
|
+
try {
|
|
36
|
+
const result = await dispatch(name, args, workspace, processes, scheduler);
|
|
37
|
+
return { content: [{ type: "text", text: typeof result === "string" ? result : JSON.stringify(result) }] };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return { isError: true, content: [{ type: "text", text: error instanceof Error ? error.message : "Local tool failed." }] };
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return server;
|
|
44
|
+
}
|
|
45
|
+
export async function startStdioMcp(workspaceInput) {
|
|
46
|
+
const server = await createMcpServer(workspaceInput);
|
|
47
|
+
await server.connect(new StdioServerTransport());
|
|
48
|
+
}
|
|
49
|
+
async function dispatch(name, args, workspace, processes, scheduler) {
|
|
50
|
+
if (name === "workspace_info")
|
|
51
|
+
return scheduler.read(async () => workspace.info());
|
|
52
|
+
if (name === "list_directory")
|
|
53
|
+
return scheduler.read(() => workspace.listDirectory(textArg(args, "path", ".")));
|
|
54
|
+
if (name === "stat_path")
|
|
55
|
+
return scheduler.read(() => workspace.statPath(textArg(args, "path")));
|
|
56
|
+
if (name === "find_files")
|
|
57
|
+
return scheduler.read(() => workspace.findFiles(textArg(args, "path", "."), textArg(args, "pattern"), intArg(args, "maxResults", 100, 1, 1000)));
|
|
58
|
+
if (name === "search_files")
|
|
59
|
+
return scheduler.read(() => workspace.searchFiles(textArg(args, "path", "."), textArg(args, "query"), { regex: boolArg(args, "regex", false), caseSensitive: boolArg(args, "caseSensitive", false), maxResults: intArg(args, "maxResults", 100, 1, 500), contextLines: intArg(args, "contextLines", 0, 0, 10) }));
|
|
60
|
+
if (name === "read_file")
|
|
61
|
+
return scheduler.read(() => workspace.readFile(textArg(args, "path")));
|
|
62
|
+
if (name === "read_file_lines")
|
|
63
|
+
return scheduler.read(() => workspace.readFileLines(textArg(args, "path"), intArg(args, "startLine", 1, 1, Number.MAX_SAFE_INTEGER), optionalIntArg(args, "endLine", 1, Number.MAX_SAFE_INTEGER)));
|
|
64
|
+
if (name === "write_file")
|
|
65
|
+
return scheduler.write(() => workspace.writeFile(textArg(args, "path"), textArg(args, "content"), boolArg(args, "overwrite", false)));
|
|
66
|
+
if (name === "apply_patch")
|
|
67
|
+
return scheduler.write(() => workspace.applyPatch(textArg(args, "path"), arrayArg(args, "edits", 1, 100), optionalTextArg(args, "expectedSha256")));
|
|
68
|
+
if (name === "create_directory")
|
|
69
|
+
return scheduler.write(() => workspace.createDirectory(textArg(args, "path")));
|
|
70
|
+
if (name === "delete_path")
|
|
71
|
+
return scheduler.write(() => workspace.deletePath(textArg(args, "path"), boolArg(args, "recursive", false)));
|
|
72
|
+
if (name === "move_path")
|
|
73
|
+
return scheduler.write(() => workspace.movePath(textArg(args, "from"), textArg(args, "to"), boolArg(args, "overwrite", false)));
|
|
74
|
+
if (name === "run_command")
|
|
75
|
+
return scheduler.write(() => workspace.runCommand(textArg(args, "command"), textArg(args, "cwd", "."), intArg(args, "timeoutMs", 30000, 100, 120000)));
|
|
76
|
+
if (name === "start_process")
|
|
77
|
+
return scheduler.write(async () => processes.start(textArg(args, "command"), await workspace.processCwd(textArg(args, "cwd", ".")), safeEnv()));
|
|
78
|
+
if (name === "list_processes")
|
|
79
|
+
return scheduler.read(async () => processes.list());
|
|
80
|
+
if (name === "read_process")
|
|
81
|
+
return scheduler.read(async () => processes.read(textArg(args, "processId"), intArg(args, "stdoutCursor", 0, 0, Number.MAX_SAFE_INTEGER), intArg(args, "stderrCursor", 0, 0, Number.MAX_SAFE_INTEGER)));
|
|
82
|
+
if (name === "write_process")
|
|
83
|
+
return scheduler.write(async () => processes.write(textArg(args, "processId"), textArg(args, "input")));
|
|
84
|
+
if (name === "stop_process")
|
|
85
|
+
return scheduler.write(() => processes.stop(textArg(args, "processId")));
|
|
86
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
87
|
+
}
|
|
88
|
+
function tool(name, description, properties, flags) {
|
|
89
|
+
return {
|
|
90
|
+
name,
|
|
91
|
+
description,
|
|
92
|
+
inputSchema: { type: "object", additionalProperties: false, properties },
|
|
93
|
+
annotations: {
|
|
94
|
+
readOnlyHint: flags.readOnly,
|
|
95
|
+
destructiveHint: flags.destructive ?? false,
|
|
96
|
+
idempotentHint: flags.idempotent ?? flags.readOnly,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function stringSchema(description, defaultValue) { return { type: "string", description, ...(defaultValue === undefined ? {} : { default: defaultValue }) }; }
|
|
101
|
+
function intSchema(defaultValue, minimum, maximum) { return { type: "integer", minimum, maximum, default: defaultValue }; }
|
|
102
|
+
function boolSchema(defaultValue) { return { type: "boolean", default: defaultValue }; }
|
|
103
|
+
function textArg(args, name, fallback) { const value = args[name] ?? fallback; if (typeof value !== "string")
|
|
104
|
+
throw new Error(`${name} must be a string.`); return value; }
|
|
105
|
+
function optionalTextArg(args, name) { const value = args[name]; if (value === undefined)
|
|
106
|
+
return undefined; if (typeof value !== "string")
|
|
107
|
+
throw new Error(`${name} must be a string.`); return value; }
|
|
108
|
+
function intArg(args, name, fallback, min, max) { const value = args[name] ?? fallback; if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max)
|
|
109
|
+
throw new Error(`${name} is invalid.`); return Number(value); }
|
|
110
|
+
function optionalIntArg(args, name, min, max) { const value = args[name]; if (value === undefined)
|
|
111
|
+
return undefined; if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max)
|
|
112
|
+
throw new Error(`${name} is invalid.`); return Number(value); }
|
|
113
|
+
function boolArg(args, name, fallback) { const value = args[name] ?? fallback; if (typeof value !== "boolean")
|
|
114
|
+
throw new Error(`${name} must be a boolean.`); return value; }
|
|
115
|
+
function arrayArg(args, name, min, max) { const value = args[name]; if (!Array.isArray(value) || value.length < min || value.length > max)
|
|
116
|
+
throw new Error(`${name} must contain ${min}-${max} entries.`); return value; }
|
|
117
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/runtime/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ProcessSnapshot {
|
|
2
|
+
id: string;
|
|
3
|
+
command: string;
|
|
4
|
+
cwd: string;
|
|
5
|
+
startedAt: string;
|
|
6
|
+
exitedAt: string | null;
|
|
7
|
+
exitCode: number | null;
|
|
8
|
+
signal: NodeJS.Signals | null;
|
|
9
|
+
running: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ProcessReadResult extends ProcessSnapshot {
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
stdoutCursor: number;
|
|
15
|
+
stderrCursor: number;
|
|
16
|
+
stdoutTruncated: boolean;
|
|
17
|
+
stderrTruncated: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class ProcessManager {
|
|
20
|
+
private readonly processes;
|
|
21
|
+
start(command: string, cwd: string, env: NodeJS.ProcessEnv): ProcessSnapshot;
|
|
22
|
+
list(): ProcessSnapshot[];
|
|
23
|
+
read(id: string, stdoutCursor?: number, stderrCursor?: number): ProcessReadResult;
|
|
24
|
+
write(id: string, input: string): ProcessSnapshot;
|
|
25
|
+
stop(id: string): Promise<ProcessSnapshot>;
|
|
26
|
+
private require;
|
|
27
|
+
private pruneExited;
|
|
28
|
+
private append;
|
|
29
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
const MAX_STREAM_CHARS = 1024 * 1024;
|
|
4
|
+
const MAX_PROCESSES = 64;
|
|
5
|
+
export class ProcessManager {
|
|
6
|
+
processes = new Map();
|
|
7
|
+
start(command, cwd, env) {
|
|
8
|
+
if (!command.trim())
|
|
9
|
+
throw new Error("command is required.");
|
|
10
|
+
this.pruneExited();
|
|
11
|
+
if (this.processes.size >= MAX_PROCESSES)
|
|
12
|
+
throw new Error(`At most ${MAX_PROCESSES} managed processes may exist in one MCP session.`);
|
|
13
|
+
const id = randomUUID();
|
|
14
|
+
const child = spawn(command, { cwd, env, shell: true, stdio: "pipe" });
|
|
15
|
+
child.stdout.setEncoding("utf8");
|
|
16
|
+
child.stderr.setEncoding("utf8");
|
|
17
|
+
const managed = {
|
|
18
|
+
id,
|
|
19
|
+
command,
|
|
20
|
+
cwd,
|
|
21
|
+
child,
|
|
22
|
+
startedAt: new Date().toISOString(),
|
|
23
|
+
stdout: "",
|
|
24
|
+
stderr: "",
|
|
25
|
+
stdoutBase: 0,
|
|
26
|
+
stderrBase: 0,
|
|
27
|
+
exitedAt: null,
|
|
28
|
+
exitCode: null,
|
|
29
|
+
signal: null,
|
|
30
|
+
};
|
|
31
|
+
child.stdout.on("data", (chunk) => this.append(managed, "stdout", chunk));
|
|
32
|
+
child.stderr.on("data", (chunk) => this.append(managed, "stderr", chunk));
|
|
33
|
+
child.once("exit", (code, signal) => {
|
|
34
|
+
managed.exitedAt = new Date().toISOString();
|
|
35
|
+
managed.exitCode = code;
|
|
36
|
+
managed.signal = signal;
|
|
37
|
+
});
|
|
38
|
+
this.processes.set(id, managed);
|
|
39
|
+
return snapshot(managed);
|
|
40
|
+
}
|
|
41
|
+
list() {
|
|
42
|
+
return [...this.processes.values()].map(snapshot);
|
|
43
|
+
}
|
|
44
|
+
read(id, stdoutCursor = 0, stderrCursor = 0) {
|
|
45
|
+
const managed = this.require(id);
|
|
46
|
+
const stdoutStart = Math.max(stdoutCursor, managed.stdoutBase);
|
|
47
|
+
const stderrStart = Math.max(stderrCursor, managed.stderrBase);
|
|
48
|
+
return {
|
|
49
|
+
...snapshot(managed),
|
|
50
|
+
stdout: managed.stdout.slice(stdoutStart - managed.stdoutBase),
|
|
51
|
+
stderr: managed.stderr.slice(stderrStart - managed.stderrBase),
|
|
52
|
+
stdoutCursor: managed.stdoutBase + managed.stdout.length,
|
|
53
|
+
stderrCursor: managed.stderrBase + managed.stderr.length,
|
|
54
|
+
stdoutTruncated: stdoutCursor < managed.stdoutBase,
|
|
55
|
+
stderrTruncated: stderrCursor < managed.stderrBase,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
write(id, input) {
|
|
59
|
+
const managed = this.require(id);
|
|
60
|
+
if (managed.exitedAt || !managed.child.stdin.writable)
|
|
61
|
+
throw new Error("Process is not accepting input.");
|
|
62
|
+
managed.child.stdin.write(input);
|
|
63
|
+
return snapshot(managed);
|
|
64
|
+
}
|
|
65
|
+
async stop(id) {
|
|
66
|
+
const managed = this.require(id);
|
|
67
|
+
if (managed.exitedAt)
|
|
68
|
+
return snapshot(managed);
|
|
69
|
+
managed.child.kill("SIGTERM");
|
|
70
|
+
await Promise.race([
|
|
71
|
+
new Promise((resolve) => managed.child.once("exit", () => resolve())),
|
|
72
|
+
new Promise((resolve) => setTimeout(resolve, 1500)),
|
|
73
|
+
]);
|
|
74
|
+
if (!managed.exitedAt)
|
|
75
|
+
managed.child.kill("SIGKILL");
|
|
76
|
+
return snapshot(managed);
|
|
77
|
+
}
|
|
78
|
+
require(id) {
|
|
79
|
+
const managed = this.processes.get(id);
|
|
80
|
+
if (!managed)
|
|
81
|
+
throw new Error("Unknown process id.");
|
|
82
|
+
return managed;
|
|
83
|
+
}
|
|
84
|
+
pruneExited() {
|
|
85
|
+
if (this.processes.size < MAX_PROCESSES)
|
|
86
|
+
return;
|
|
87
|
+
const exited = [...this.processes.values()]
|
|
88
|
+
.filter((managed) => managed.exitedAt !== null)
|
|
89
|
+
.sort((left, right) => left.startedAt.localeCompare(right.startedAt));
|
|
90
|
+
for (const managed of exited) {
|
|
91
|
+
if (this.processes.size < MAX_PROCESSES)
|
|
92
|
+
break;
|
|
93
|
+
this.processes.delete(managed.id);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
append(managed, stream, chunk) {
|
|
97
|
+
const baseKey = stream === "stdout" ? "stdoutBase" : "stderrBase";
|
|
98
|
+
managed[stream] += chunk;
|
|
99
|
+
if (managed[stream].length > MAX_STREAM_CHARS) {
|
|
100
|
+
const removed = managed[stream].length - MAX_STREAM_CHARS;
|
|
101
|
+
managed[stream] = managed[stream].slice(removed);
|
|
102
|
+
managed[baseKey] += removed;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function snapshot(managed) {
|
|
107
|
+
return {
|
|
108
|
+
id: managed.id,
|
|
109
|
+
command: managed.command,
|
|
110
|
+
cwd: managed.cwd,
|
|
111
|
+
startedAt: managed.startedAt,
|
|
112
|
+
exitedAt: managed.exitedAt,
|
|
113
|
+
exitCode: managed.exitCode,
|
|
114
|
+
signal: managed.signal,
|
|
115
|
+
running: managed.exitedAt === null,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/runtime/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class RelayMcpSession {
|
|
2
|
+
private readonly pending;
|
|
3
|
+
private readonly transport;
|
|
4
|
+
private constructor();
|
|
5
|
+
static create(workspace: string): Promise<RelayMcpSession>;
|
|
6
|
+
execute(payload: unknown): Promise<unknown>;
|
|
7
|
+
cancel(payload: unknown): void;
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
}
|