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
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createMcpServer } from "./mcp.js";
|
|
2
|
+
export class RelayMcpSession {
|
|
3
|
+
pending = new Map();
|
|
4
|
+
transport = new RelayMcpTransport(this.pending);
|
|
5
|
+
constructor() { }
|
|
6
|
+
static async create(workspace) {
|
|
7
|
+
const session = new RelayMcpSession();
|
|
8
|
+
const server = await createMcpServer(workspace);
|
|
9
|
+
await server.connect(session.transport);
|
|
10
|
+
return session;
|
|
11
|
+
}
|
|
12
|
+
async execute(payload) {
|
|
13
|
+
const message = parseJsonRpcMessage(payload);
|
|
14
|
+
const id = requestId(message);
|
|
15
|
+
if (id === undefined) {
|
|
16
|
+
this.transport.deliver(message);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (this.pending.has(id))
|
|
20
|
+
throw new Error("Duplicate MCP request id.");
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
this.pending.set(id, { resolve, reject });
|
|
23
|
+
try {
|
|
24
|
+
this.transport.deliver(message);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
this.pending.delete(id);
|
|
28
|
+
reject(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
cancel(payload) {
|
|
33
|
+
const message = parseJsonRpcMessage(payload);
|
|
34
|
+
const id = requestId(message);
|
|
35
|
+
if (id === undefined)
|
|
36
|
+
return;
|
|
37
|
+
const pending = this.pending.get(id);
|
|
38
|
+
if (!pending)
|
|
39
|
+
return;
|
|
40
|
+
this.pending.delete(id);
|
|
41
|
+
pending.reject(new Error("MCP request cancelled by Relay."));
|
|
42
|
+
}
|
|
43
|
+
async close() {
|
|
44
|
+
await this.transport.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
class RelayMcpTransport {
|
|
48
|
+
pending;
|
|
49
|
+
onclose;
|
|
50
|
+
onerror;
|
|
51
|
+
onmessage;
|
|
52
|
+
started = false;
|
|
53
|
+
constructor(pending) {
|
|
54
|
+
this.pending = pending;
|
|
55
|
+
}
|
|
56
|
+
async start() {
|
|
57
|
+
if (this.started)
|
|
58
|
+
throw new Error("Relay MCP transport already started.");
|
|
59
|
+
this.started = true;
|
|
60
|
+
}
|
|
61
|
+
async send(message) {
|
|
62
|
+
const id = requestId(message);
|
|
63
|
+
if (id === undefined)
|
|
64
|
+
return;
|
|
65
|
+
const pending = this.pending.get(id);
|
|
66
|
+
if (!pending)
|
|
67
|
+
return;
|
|
68
|
+
this.pending.delete(id);
|
|
69
|
+
pending.resolve(message);
|
|
70
|
+
}
|
|
71
|
+
deliver(message) {
|
|
72
|
+
if (!this.started)
|
|
73
|
+
throw new Error("Relay MCP transport is not started.");
|
|
74
|
+
this.onmessage?.(message);
|
|
75
|
+
}
|
|
76
|
+
async close() {
|
|
77
|
+
if (!this.started)
|
|
78
|
+
return;
|
|
79
|
+
this.started = false;
|
|
80
|
+
for (const pending of this.pending.values())
|
|
81
|
+
pending.reject(new Error("Relay MCP transport closed."));
|
|
82
|
+
this.pending.clear();
|
|
83
|
+
this.onclose?.();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function parseJsonRpcMessage(value) {
|
|
87
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
88
|
+
throw new Error("Invalid MCP JSON-RPC payload.");
|
|
89
|
+
const record = value;
|
|
90
|
+
if (record.jsonrpc !== "2.0")
|
|
91
|
+
throw new Error("Invalid MCP JSON-RPC version.");
|
|
92
|
+
if ("id" in record && typeof record.id !== "string" && typeof record.id !== "number")
|
|
93
|
+
throw new Error("Invalid MCP JSON-RPC request id.");
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
function requestId(message) {
|
|
97
|
+
const record = message;
|
|
98
|
+
const id = record.id;
|
|
99
|
+
return typeof id === "string" || typeof id === "number" ? id : undefined;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=relay-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-mcp.js","sourceRoot":"","sources":["../../src/runtime/relay-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class FairRwScheduler {
|
|
2
|
+
private readonly maxReaders;
|
|
3
|
+
private activeReaders;
|
|
4
|
+
private writer;
|
|
5
|
+
private readonly queue;
|
|
6
|
+
constructor(maxReaders?: number);
|
|
7
|
+
read<T>(work: () => Promise<T>): Promise<T>;
|
|
8
|
+
write<T>(work: () => Promise<T>): Promise<T>;
|
|
9
|
+
private enqueue;
|
|
10
|
+
private drain;
|
|
11
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class FairRwScheduler {
|
|
2
|
+
maxReaders;
|
|
3
|
+
activeReaders = 0;
|
|
4
|
+
writer = false;
|
|
5
|
+
queue = [];
|
|
6
|
+
constructor(maxReaders = 4) {
|
|
7
|
+
this.maxReaders = maxReaders;
|
|
8
|
+
if (!Number.isSafeInteger(maxReaders) || maxReaders < 1 || maxReaders > 64) {
|
|
9
|
+
throw new Error("maxReaders must be an integer between 1 and 64.");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
read(work) {
|
|
13
|
+
return this.enqueue("read", work);
|
|
14
|
+
}
|
|
15
|
+
write(work) {
|
|
16
|
+
return this.enqueue("write", work);
|
|
17
|
+
}
|
|
18
|
+
enqueue(mode, work) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
this.queue.push({ mode, work, resolve: resolve, reject });
|
|
21
|
+
this.drain();
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
drain() {
|
|
25
|
+
if (this.writer)
|
|
26
|
+
return;
|
|
27
|
+
const first = this.queue[0];
|
|
28
|
+
if (!first)
|
|
29
|
+
return;
|
|
30
|
+
if (first.mode === "write") {
|
|
31
|
+
if (this.activeReaders > 0)
|
|
32
|
+
return;
|
|
33
|
+
this.writer = true;
|
|
34
|
+
this.queue.shift();
|
|
35
|
+
void first.work().then(first.resolve, first.reject).finally(() => {
|
|
36
|
+
this.writer = false;
|
|
37
|
+
this.drain();
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
while (!this.writer && this.activeReaders < this.maxReaders && this.queue[0]?.mode === "read") {
|
|
42
|
+
const job = this.queue.shift();
|
|
43
|
+
this.activeReaders += 1;
|
|
44
|
+
void job.work().then(job.resolve, job.reject).finally(() => {
|
|
45
|
+
this.activeReaders -= 1;
|
|
46
|
+
this.drain();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/runtime/scheduler.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IAKG;IAJrB,aAAa,GAAG,CAAC,CAAC;IAClB,MAAM,GAAG,KAAK,CAAC;IACN,KAAK,GAAmB,EAAE,CAAC;IAE5C,YAA6B,aAAa,CAAC;QAAd,eAAU,GAAV,UAAU,CAAI;QACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,CAAI,IAAsB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAI,IAAsB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,OAAO,CAAI,IAAU,EAAE,IAAsB;QACnD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAmC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC;gBAAE,OAAO;YACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC/D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YAChC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;YACxB,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzD,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const MAX_FILE_BYTES: number;
|
|
2
|
+
export declare const MAX_OUTPUT_BYTES: number;
|
|
3
|
+
export declare class Workspace {
|
|
4
|
+
readonly root: string;
|
|
5
|
+
private constructor();
|
|
6
|
+
static open(input: string): Promise<Workspace>;
|
|
7
|
+
info(): {
|
|
8
|
+
root: string;
|
|
9
|
+
};
|
|
10
|
+
listDirectory(input?: string): Promise<{
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
}[]>;
|
|
14
|
+
statPath(input: string): Promise<{
|
|
15
|
+
path: string;
|
|
16
|
+
type: string;
|
|
17
|
+
size: number;
|
|
18
|
+
mode: number;
|
|
19
|
+
modifiedAt: string;
|
|
20
|
+
}>;
|
|
21
|
+
findFiles(input: string, pattern: string, maxResults: number): Promise<string[]>;
|
|
22
|
+
searchFiles(input: string, query: string, options: {
|
|
23
|
+
regex: boolean;
|
|
24
|
+
caseSensitive: boolean;
|
|
25
|
+
maxResults: number;
|
|
26
|
+
contextLines: number;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
path: string;
|
|
29
|
+
line: number;
|
|
30
|
+
text: string;
|
|
31
|
+
before: string[];
|
|
32
|
+
after: string[];
|
|
33
|
+
}[]>;
|
|
34
|
+
readFile(input: string): Promise<string>;
|
|
35
|
+
readFileLines(input: string, startLine: number, endLine?: number): Promise<{
|
|
36
|
+
path: string;
|
|
37
|
+
startLine: number;
|
|
38
|
+
endLine: number;
|
|
39
|
+
totalLines: number;
|
|
40
|
+
content: string;
|
|
41
|
+
}>;
|
|
42
|
+
writeFile(input: string, content: string, overwrite: boolean): Promise<{
|
|
43
|
+
path: string;
|
|
44
|
+
bytes: number;
|
|
45
|
+
}>;
|
|
46
|
+
applyPatch(input: string, edits: unknown[], expectedSha256?: string): Promise<{
|
|
47
|
+
path: string;
|
|
48
|
+
bytes: number;
|
|
49
|
+
}>;
|
|
50
|
+
createDirectory(input: string): Promise<{
|
|
51
|
+
path: string;
|
|
52
|
+
}>;
|
|
53
|
+
deletePath(input: string, recursive: boolean): Promise<{
|
|
54
|
+
path: string;
|
|
55
|
+
deleted: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
movePath(fromInput: string, toInput: string, overwrite: boolean): Promise<{
|
|
58
|
+
from: string;
|
|
59
|
+
to: string;
|
|
60
|
+
}>;
|
|
61
|
+
runCommand(command: string, cwdInput: string, timeoutMs: number): Promise<{
|
|
62
|
+
stdout: string;
|
|
63
|
+
stderr: string;
|
|
64
|
+
}>;
|
|
65
|
+
processCwd(cwdInput: string): Promise<string>;
|
|
66
|
+
private walkFiles;
|
|
67
|
+
private existingPath;
|
|
68
|
+
private createPath;
|
|
69
|
+
private lexicalPath;
|
|
70
|
+
private assertCanonicalInside;
|
|
71
|
+
}
|
|
72
|
+
export declare function safeEnv(): NodeJS.ProcessEnv;
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { exec as execCallback } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { chmod, lstat, mkdir, open, readdir, readFile, realpath, rename, rm } from "node:fs/promises";
|
|
5
|
+
import { basename, dirname, relative, resolve, sep } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
const exec = promisify(execCallback);
|
|
8
|
+
export const MAX_FILE_BYTES = 1024 * 1024;
|
|
9
|
+
export const MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
10
|
+
export class Workspace {
|
|
11
|
+
root;
|
|
12
|
+
constructor(root) {
|
|
13
|
+
this.root = root;
|
|
14
|
+
}
|
|
15
|
+
static async open(input) {
|
|
16
|
+
const root = await realpath(resolve(input));
|
|
17
|
+
const stat = await lstat(root);
|
|
18
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
19
|
+
throw new Error("Workspace must be a real directory.");
|
|
20
|
+
return new Workspace(root);
|
|
21
|
+
}
|
|
22
|
+
info() {
|
|
23
|
+
return { root: this.root };
|
|
24
|
+
}
|
|
25
|
+
async listDirectory(input = ".") {
|
|
26
|
+
const path = await this.existingPath(input, "directory");
|
|
27
|
+
const entries = await readdir(path, { withFileTypes: true });
|
|
28
|
+
return entries.slice(0, 500).map((entry) => ({
|
|
29
|
+
name: entry.name,
|
|
30
|
+
type: entry.isDirectory() ? "directory" : entry.isFile() ? "file" : entry.isSymbolicLink() ? "symlink" : "other",
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async statPath(input) {
|
|
34
|
+
const path = await this.existingPath(input);
|
|
35
|
+
const stat = await lstat(path);
|
|
36
|
+
return {
|
|
37
|
+
path: relative(this.root, path) || ".",
|
|
38
|
+
type: stat.isDirectory() ? "directory" : stat.isFile() ? "file" : "other",
|
|
39
|
+
size: stat.size,
|
|
40
|
+
mode: stat.mode & 0o777,
|
|
41
|
+
modifiedAt: stat.mtime.toISOString(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async findFiles(input, pattern, maxResults) {
|
|
45
|
+
const base = await this.existingPath(input || ".", "directory");
|
|
46
|
+
if (!pattern)
|
|
47
|
+
throw new Error("pattern is required.");
|
|
48
|
+
const matcher = globMatcher(pattern);
|
|
49
|
+
const results = [];
|
|
50
|
+
await this.walkFiles(base, async (full) => {
|
|
51
|
+
const rel = relative(base, full);
|
|
52
|
+
const candidate = pattern.includes("/") || pattern.includes("\\") ? rel.split(sep).join("/") : basename(full);
|
|
53
|
+
if (matcher.test(candidate))
|
|
54
|
+
results.push(relative(this.root, full));
|
|
55
|
+
return results.length < maxResults;
|
|
56
|
+
});
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
async searchFiles(input, query, options) {
|
|
60
|
+
const base = await this.existingPath(input || ".", "directory");
|
|
61
|
+
if (!query)
|
|
62
|
+
throw new Error("query is required.");
|
|
63
|
+
const matcher = options.regex ? new RegExp(query, options.caseSensitive ? "u" : "iu") : null;
|
|
64
|
+
const needle = options.caseSensitive ? query : query.toLocaleLowerCase();
|
|
65
|
+
const results = [];
|
|
66
|
+
await this.walkFiles(base, async (full) => {
|
|
67
|
+
const stat = await lstat(full);
|
|
68
|
+
if (stat.size > MAX_FILE_BYTES)
|
|
69
|
+
return true;
|
|
70
|
+
const content = await readFile(full, "utf8").catch(() => null);
|
|
71
|
+
if (content === null || content.includes("\0"))
|
|
72
|
+
return true;
|
|
73
|
+
const lines = content.split(/\r?\n/u);
|
|
74
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
75
|
+
const line = lines[index];
|
|
76
|
+
const haystack = options.caseSensitive ? line : line.toLocaleLowerCase();
|
|
77
|
+
if (!(matcher ? matcher.test(line) : haystack.includes(needle)))
|
|
78
|
+
continue;
|
|
79
|
+
results.push({
|
|
80
|
+
path: relative(this.root, full),
|
|
81
|
+
line: index + 1,
|
|
82
|
+
text: line,
|
|
83
|
+
before: lines.slice(Math.max(0, index - options.contextLines), index),
|
|
84
|
+
after: lines.slice(index + 1, index + 1 + options.contextLines),
|
|
85
|
+
});
|
|
86
|
+
if (results.length >= options.maxResults)
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
});
|
|
91
|
+
return results;
|
|
92
|
+
}
|
|
93
|
+
async readFile(input) {
|
|
94
|
+
const path = await this.existingPath(input, "file");
|
|
95
|
+
const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
96
|
+
try {
|
|
97
|
+
const stat = await handle.stat();
|
|
98
|
+
if (!stat.isFile())
|
|
99
|
+
throw new Error("Only regular files are readable.");
|
|
100
|
+
if (stat.size > MAX_FILE_BYTES)
|
|
101
|
+
throw new Error("File exceeds 1 MiB limit.");
|
|
102
|
+
return await handle.readFile({ encoding: "utf8" });
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
await handle.close();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async readFileLines(input, startLine, endLine) {
|
|
109
|
+
const content = await this.readFile(input);
|
|
110
|
+
const lines = content.split(/\r?\n/u);
|
|
111
|
+
const resolvedEnd = endLine ?? Math.min(lines.length, startLine + 199);
|
|
112
|
+
if (!Number.isSafeInteger(startLine) || startLine < 1 || !Number.isSafeInteger(resolvedEnd) || resolvedEnd < startLine) {
|
|
113
|
+
throw new Error("Invalid line range.");
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
path: input,
|
|
117
|
+
startLine,
|
|
118
|
+
endLine: Math.min(resolvedEnd, lines.length),
|
|
119
|
+
totalLines: lines.length,
|
|
120
|
+
content: lines.slice(startLine - 1, resolvedEnd).join("\n"),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async writeFile(input, content, overwrite) {
|
|
124
|
+
if (Buffer.byteLength(content) > MAX_FILE_BYTES)
|
|
125
|
+
throw new Error("Content exceeds 1 MiB limit.");
|
|
126
|
+
const path = await this.createPath(input);
|
|
127
|
+
const existing = await lstat(path).catch(() => null);
|
|
128
|
+
if (existing?.isSymbolicLink())
|
|
129
|
+
throw new Error("Refusing to replace a symbolic link.");
|
|
130
|
+
if (existing?.isDirectory())
|
|
131
|
+
throw new Error("Refusing to replace a directory.");
|
|
132
|
+
if (existing && existing.nlink > 1)
|
|
133
|
+
throw new Error("Refusing to replace a file with multiple hard links.");
|
|
134
|
+
if (existing && !overwrite)
|
|
135
|
+
throw new Error("File exists; set overwrite=true.");
|
|
136
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
137
|
+
await this.assertCanonicalInside(await realpath(dirname(path)));
|
|
138
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
139
|
+
const handle = await open(tmp, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
|
|
140
|
+
try {
|
|
141
|
+
await handle.writeFile(content, "utf8");
|
|
142
|
+
await handle.sync();
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await handle.close();
|
|
146
|
+
}
|
|
147
|
+
await rename(tmp, path).catch(async (error) => {
|
|
148
|
+
await rm(tmp, { force: true });
|
|
149
|
+
throw error;
|
|
150
|
+
});
|
|
151
|
+
await chmod(path, 0o600).catch(() => undefined);
|
|
152
|
+
return { path: relative(this.root, path), bytes: Buffer.byteLength(content) };
|
|
153
|
+
}
|
|
154
|
+
async applyPatch(input, edits, expectedSha256) {
|
|
155
|
+
const content = await this.readFile(input);
|
|
156
|
+
if (expectedSha256 && sha256(content) !== expectedSha256)
|
|
157
|
+
throw new Error("File changed since it was inspected.");
|
|
158
|
+
const lines = content.split("\n");
|
|
159
|
+
const parsed = edits.map((value) => {
|
|
160
|
+
if (!value || typeof value !== "object")
|
|
161
|
+
throw new Error("Invalid edit.");
|
|
162
|
+
const item = value;
|
|
163
|
+
const startLine = Number(item.startLine);
|
|
164
|
+
const endLine = Number(item.endLine);
|
|
165
|
+
if (!Number.isSafeInteger(startLine) || !Number.isSafeInteger(endLine) || startLine < 1 || endLine < startLine || endLine > lines.length) {
|
|
166
|
+
throw new Error("Invalid edit range.");
|
|
167
|
+
}
|
|
168
|
+
if (typeof item.replacement !== "string")
|
|
169
|
+
throw new Error("replacement must be a string.");
|
|
170
|
+
return { startLine, endLine, replacement: item.replacement };
|
|
171
|
+
}).sort((a, b) => b.startLine - a.startLine);
|
|
172
|
+
for (let index = 1; index < parsed.length; index += 1) {
|
|
173
|
+
const previous = parsed[index - 1];
|
|
174
|
+
const current = parsed[index];
|
|
175
|
+
if (current.endLine >= previous.startLine)
|
|
176
|
+
throw new Error("Patch edits overlap.");
|
|
177
|
+
}
|
|
178
|
+
for (const edit of parsed) {
|
|
179
|
+
lines.splice(edit.startLine - 1, edit.endLine - edit.startLine + 1, ...edit.replacement.split("\n"));
|
|
180
|
+
}
|
|
181
|
+
return this.writeFile(input, lines.join("\n"), true);
|
|
182
|
+
}
|
|
183
|
+
async createDirectory(input) {
|
|
184
|
+
const path = await this.createPath(input);
|
|
185
|
+
if (path === this.root)
|
|
186
|
+
return { path: "." };
|
|
187
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
188
|
+
await this.assertCanonicalInside(await realpath(path));
|
|
189
|
+
return { path: relative(this.root, path) };
|
|
190
|
+
}
|
|
191
|
+
async deletePath(input, recursive) {
|
|
192
|
+
const path = await this.existingPath(input);
|
|
193
|
+
if (path === this.root)
|
|
194
|
+
throw new Error("Workspace root cannot be deleted.");
|
|
195
|
+
const stat = await lstat(path);
|
|
196
|
+
if (stat.isDirectory() && !recursive && (await readdir(path)).length > 0) {
|
|
197
|
+
throw new Error("Directory is not empty; set recursive=true.");
|
|
198
|
+
}
|
|
199
|
+
await rm(path, { recursive, force: false });
|
|
200
|
+
return { path: relative(this.root, path), deleted: true };
|
|
201
|
+
}
|
|
202
|
+
async movePath(fromInput, toInput, overwrite) {
|
|
203
|
+
const from = await this.existingPath(fromInput);
|
|
204
|
+
if (from === this.root)
|
|
205
|
+
throw new Error("Workspace root cannot be moved.");
|
|
206
|
+
const to = await this.createPath(toInput);
|
|
207
|
+
const target = await lstat(to).catch(() => null);
|
|
208
|
+
if (target?.isSymbolicLink())
|
|
209
|
+
throw new Error("Refusing to replace a symbolic link.");
|
|
210
|
+
if (target && !overwrite)
|
|
211
|
+
throw new Error("Destination exists; set overwrite=true.");
|
|
212
|
+
await mkdir(dirname(to), { recursive: true, mode: 0o700 });
|
|
213
|
+
await this.assertCanonicalInside(await realpath(dirname(to)));
|
|
214
|
+
if (target)
|
|
215
|
+
await rm(to, { recursive: true, force: false });
|
|
216
|
+
await rename(from, to);
|
|
217
|
+
return { from: relative(this.root, from), to: relative(this.root, to) };
|
|
218
|
+
}
|
|
219
|
+
async runCommand(command, cwdInput, timeoutMs) {
|
|
220
|
+
if (!command.trim())
|
|
221
|
+
throw new Error("command is required.");
|
|
222
|
+
const cwd = await this.existingPath(cwdInput || ".", "directory");
|
|
223
|
+
const { stdout, stderr } = await exec(command, { cwd, timeout: timeoutMs, maxBuffer: MAX_OUTPUT_BYTES, env: safeEnv() });
|
|
224
|
+
return { stdout: truncate(stdout), stderr: truncate(stderr) };
|
|
225
|
+
}
|
|
226
|
+
async processCwd(cwdInput) {
|
|
227
|
+
return this.existingPath(cwdInput || ".", "directory");
|
|
228
|
+
}
|
|
229
|
+
async walkFiles(base, visitor) {
|
|
230
|
+
const stack = [base];
|
|
231
|
+
while (stack.length > 0) {
|
|
232
|
+
const dir = stack.pop();
|
|
233
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
234
|
+
if (entry.name === ".git" || entry.name === "node_modules")
|
|
235
|
+
continue;
|
|
236
|
+
const full = resolve(dir, entry.name);
|
|
237
|
+
if (entry.isSymbolicLink())
|
|
238
|
+
continue;
|
|
239
|
+
if (entry.isDirectory())
|
|
240
|
+
stack.push(full);
|
|
241
|
+
else if (entry.isFile() && !(await visitor(full)))
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async existingPath(input, expected) {
|
|
247
|
+
const target = this.lexicalPath(input);
|
|
248
|
+
const stat = await lstat(target);
|
|
249
|
+
if (stat.isSymbolicLink())
|
|
250
|
+
throw new Error("Symbolic links are not allowed.");
|
|
251
|
+
await this.assertCanonicalInside(await realpath(target));
|
|
252
|
+
if (expected === "file" && !stat.isFile())
|
|
253
|
+
throw new Error("Expected a regular file.");
|
|
254
|
+
if (expected === "directory" && !stat.isDirectory())
|
|
255
|
+
throw new Error("Expected a directory.");
|
|
256
|
+
return target;
|
|
257
|
+
}
|
|
258
|
+
async createPath(input) {
|
|
259
|
+
const target = this.lexicalPath(input);
|
|
260
|
+
let cursor = dirname(target);
|
|
261
|
+
while (true) {
|
|
262
|
+
const canonical = await realpath(cursor).catch(() => null);
|
|
263
|
+
if (canonical) {
|
|
264
|
+
await this.assertCanonicalInside(canonical);
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
const parent = dirname(cursor);
|
|
268
|
+
if (parent === cursor)
|
|
269
|
+
throw new Error("Write parent is unavailable.");
|
|
270
|
+
cursor = parent;
|
|
271
|
+
}
|
|
272
|
+
return target;
|
|
273
|
+
}
|
|
274
|
+
lexicalPath(input) {
|
|
275
|
+
if (!input || input.includes("\0"))
|
|
276
|
+
throw new Error("Invalid path.");
|
|
277
|
+
const target = resolve(this.root, input);
|
|
278
|
+
const rel = relative(this.root, target);
|
|
279
|
+
if (rel === ".." || rel.startsWith(`..${sep}`))
|
|
280
|
+
throw new Error("Path escapes workspace.");
|
|
281
|
+
return target;
|
|
282
|
+
}
|
|
283
|
+
async assertCanonicalInside(target) {
|
|
284
|
+
const rel = relative(this.root, target);
|
|
285
|
+
if (rel === ".." || rel.startsWith(`..${sep}`))
|
|
286
|
+
throw new Error("Path escapes workspace.");
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
export function safeEnv() {
|
|
290
|
+
const keys = ["PATH", "HOME", "USER", "LOGNAME", "TMPDIR", "LANG", "LC_ALL", "SHELL", "SystemRoot"];
|
|
291
|
+
return Object.fromEntries(keys.flatMap((key) => process.env[key] === undefined ? [] : [[key, process.env[key]]]));
|
|
292
|
+
}
|
|
293
|
+
function truncate(value) {
|
|
294
|
+
return Buffer.byteLength(value) <= MAX_OUTPUT_BYTES ? value : `${value.slice(0, MAX_OUTPUT_BYTES)}\n[truncated]`;
|
|
295
|
+
}
|
|
296
|
+
function sha256(value) {
|
|
297
|
+
return createHash("sha256").update(value).digest("hex");
|
|
298
|
+
}
|
|
299
|
+
function globMatcher(pattern) {
|
|
300
|
+
let source = "^";
|
|
301
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
302
|
+
const char = pattern[index];
|
|
303
|
+
if (char === "*") {
|
|
304
|
+
if (pattern[index + 1] === "*") {
|
|
305
|
+
source += ".*";
|
|
306
|
+
index += 1;
|
|
307
|
+
}
|
|
308
|
+
else
|
|
309
|
+
source += "[^/]*";
|
|
310
|
+
}
|
|
311
|
+
else if (char === "?")
|
|
312
|
+
source += "[^/]";
|
|
313
|
+
else
|
|
314
|
+
source += char.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
315
|
+
}
|
|
316
|
+
return new RegExp(`${source}$`, "u");
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/runtime/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface McpServiceInfo {
|
|
2
|
+
installed: boolean;
|
|
3
|
+
active: boolean;
|
|
4
|
+
platform: string;
|
|
5
|
+
workspace?: string;
|
|
6
|
+
definitionPath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function installMcpService(workspaceInput: string): Promise<McpServiceInfo>;
|
|
9
|
+
export declare function startMcpService(): Promise<McpServiceInfo>;
|
|
10
|
+
export declare function stopMcpService(): Promise<McpServiceInfo>;
|
|
11
|
+
export declare function uninstallMcpService(): Promise<void>;
|
|
12
|
+
export declare function serviceStatus(): Promise<McpServiceInfo>;
|