neo-mcp 1.1.11
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 +221 -0
- package/bin/neo-mcp-daemon +13 -0
- package/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +32 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +19 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +276 -0
- package/dist/daemon.js.map +1 -0
- package/dist/executor.d.ts +42 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +394 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +23 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +316 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/neo-client.d.ts +11 -0
- package/dist/neo-client.d.ts.map +1 -0
- package/dist/neo-client.js +93 -0
- package/dist/neo-client.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +17 -0
- package/dist/paths.js.map +1 -0
- package/package.json +43 -0
- package/scripts/postinstall.js +3 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action handlers — mirrors Python daemon's DaemonActionHandlers exactly.
|
|
3
|
+
* Supported actions: create_session, write_code, get_file, run_subprocess,
|
|
4
|
+
* get_job_status, terminate_job, list_files
|
|
5
|
+
*/
|
|
6
|
+
export interface Command {
|
|
7
|
+
action: string;
|
|
8
|
+
request_id: string;
|
|
9
|
+
thread_id?: string;
|
|
10
|
+
response_queue_name?: string;
|
|
11
|
+
session_id?: string;
|
|
12
|
+
payload?: Record<string, unknown>;
|
|
13
|
+
filename?: string;
|
|
14
|
+
code?: string;
|
|
15
|
+
workdir?: string;
|
|
16
|
+
file_path?: string;
|
|
17
|
+
command?: string;
|
|
18
|
+
job_id?: string;
|
|
19
|
+
directory?: string;
|
|
20
|
+
max_depth?: number;
|
|
21
|
+
include_hidden?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ActionResult {
|
|
24
|
+
request_id: string;
|
|
25
|
+
status: string;
|
|
26
|
+
data?: Record<string, unknown>;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve symlinks in a path, handling non-existent tails gracefully.
|
|
31
|
+
*
|
|
32
|
+
* realpathSync() throws if any component doesn't exist yet (e.g. a new file
|
|
33
|
+
* about to be written). We walk up the path to find the longest existing
|
|
34
|
+
* prefix, resolve symlinks there, then re-append the non-existent tail.
|
|
35
|
+
*
|
|
36
|
+
* This ensures symlinks inside the workspace (e.g. outside-link → /etc) are
|
|
37
|
+
* followed before the safety check, matching Python's Path.resolve() semantics.
|
|
38
|
+
*/
|
|
39
|
+
export declare function realResolve(p: string): string;
|
|
40
|
+
export declare function safeResolve(workspace: string, pathStr: string): string | null;
|
|
41
|
+
export declare function dispatch(cmd: Command, workspace: string): Promise<ActionResult>;
|
|
42
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB7C;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB7E;AA6SD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBrF"}
|
package/dist/executor.js
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Action handlers — mirrors Python daemon's DaemonActionHandlers exactly.
|
|
4
|
+
* Supported actions: create_session, write_code, get_file, run_subprocess,
|
|
5
|
+
* get_job_status, terminate_job, list_files
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.realResolve = realResolve;
|
|
9
|
+
exports.safeResolve = safeResolve;
|
|
10
|
+
exports.dispatch = dispatch;
|
|
11
|
+
const crypto_1 = require("crypto");
|
|
12
|
+
const child_process_1 = require("child_process");
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const os_1 = require("os");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
// Directories skipped during file listing — matches Python/TS daemon
|
|
17
|
+
const SKIP_DIRS = new Set([
|
|
18
|
+
'venv', 'node_modules', 'env', '.venv', '__pycache__', '.git',
|
|
19
|
+
'.tox', 'dist', 'build',
|
|
20
|
+
]);
|
|
21
|
+
const _jobs = new Map();
|
|
22
|
+
const _JOB_TTL_MS = 24 * 60 * 60 * 1_000; // 24 hours
|
|
23
|
+
let _cleanupCounter = 0;
|
|
24
|
+
function cleanupOldJobs() {
|
|
25
|
+
const cutoff = Date.now() - _JOB_TTL_MS;
|
|
26
|
+
for (const [id, job] of _jobs.entries()) {
|
|
27
|
+
if (job.exitCode !== null && job.startedAt < cutoff) {
|
|
28
|
+
_jobs.delete(id);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Path safety — mirrors Python _safe_resolve()
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Resolve symlinks in a path, handling non-existent tails gracefully.
|
|
37
|
+
*
|
|
38
|
+
* realpathSync() throws if any component doesn't exist yet (e.g. a new file
|
|
39
|
+
* about to be written). We walk up the path to find the longest existing
|
|
40
|
+
* prefix, resolve symlinks there, then re-append the non-existent tail.
|
|
41
|
+
*
|
|
42
|
+
* This ensures symlinks inside the workspace (e.g. outside-link → /etc) are
|
|
43
|
+
* followed before the safety check, matching Python's Path.resolve() semantics.
|
|
44
|
+
*/
|
|
45
|
+
function realResolve(p) {
|
|
46
|
+
const normalized = (0, path_1.resolve)(p);
|
|
47
|
+
try {
|
|
48
|
+
return (0, fs_1.realpathSync)(normalized);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Walk up path components until we find an existing prefix to resolve.
|
|
52
|
+
const parts = normalized.split('/').filter(Boolean);
|
|
53
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
54
|
+
const prefix = '/' + parts.slice(0, i + 1).join('/');
|
|
55
|
+
try {
|
|
56
|
+
const real = (0, fs_1.realpathSync)(prefix);
|
|
57
|
+
const rest = parts.slice(i + 1).join('/');
|
|
58
|
+
return rest ? (0, path_1.join)(real, rest) : real;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return normalized;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function safeResolve(workspace, pathStr) {
|
|
68
|
+
const home = (0, os_1.homedir)();
|
|
69
|
+
const tmp = (0, os_1.tmpdir)();
|
|
70
|
+
// On macOS, /tmp is a symlink to /private/tmp — include both so resolve() never surprises us.
|
|
71
|
+
// Use realResolve so the allowed-roots list also has symlinks followed.
|
|
72
|
+
const allowed = [workspace, home, tmp, (0, path_1.resolve)(tmp)].filter(Boolean).map(p => realResolve((0, path_1.resolve)(p)));
|
|
73
|
+
function isWithin(root, target) {
|
|
74
|
+
const rel = (0, path_1.relative)(root, target);
|
|
75
|
+
return rel === '' || (!rel.startsWith('..') && !(0, path_1.isAbsolute)(rel));
|
|
76
|
+
}
|
|
77
|
+
if ((0, path_1.isAbsolute)(pathStr)) {
|
|
78
|
+
// Follow symlinks before checking containment — prevents symlink escape.
|
|
79
|
+
const r = realResolve(pathStr);
|
|
80
|
+
return allowed.some(a => isWithin(a, r)) ? r : null;
|
|
81
|
+
}
|
|
82
|
+
const w = realResolve((0, path_1.resolve)(workspace));
|
|
83
|
+
// Follow symlinks in the joined path — catches symlinks inside the workspace.
|
|
84
|
+
const r = realResolve((0, path_1.resolve)((0, path_1.join)(w, pathStr)));
|
|
85
|
+
return isWithin(w, r) ? r : null;
|
|
86
|
+
}
|
|
87
|
+
function fieldString(cmd, key) {
|
|
88
|
+
const direct = cmd[key];
|
|
89
|
+
if (typeof direct === 'string' && direct.length > 0)
|
|
90
|
+
return direct;
|
|
91
|
+
const nested = cmd.payload?.[key];
|
|
92
|
+
if (typeof nested === 'string' && nested.length > 0)
|
|
93
|
+
return nested;
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
function fieldBoolean(cmd, key, fallback) {
|
|
97
|
+
const direct = cmd[key];
|
|
98
|
+
if (typeof direct === 'boolean')
|
|
99
|
+
return direct;
|
|
100
|
+
const nested = cmd.payload?.[key];
|
|
101
|
+
if (typeof nested === 'boolean')
|
|
102
|
+
return nested;
|
|
103
|
+
return fallback;
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Action handlers
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
function hCreateSession(cmd) {
|
|
109
|
+
const sid = cmd.session_id ??
|
|
110
|
+
cmd.payload?.['session_id'] ??
|
|
111
|
+
(0, crypto_1.randomUUID)();
|
|
112
|
+
return {
|
|
113
|
+
request_id: cmd.request_id,
|
|
114
|
+
status: 'success',
|
|
115
|
+
data: { coding_session_id: sid },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function remapToWorkspace(absPath, workspace, workdir) {
|
|
119
|
+
let relative = null;
|
|
120
|
+
// Try workdir as the container root (e.g. workdir=/app/project, path=/app/project/src/main.py)
|
|
121
|
+
if (workdir && (0, path_1.isAbsolute)(workdir)) {
|
|
122
|
+
const wd = (0, path_1.resolve)(workdir);
|
|
123
|
+
if (absPath.startsWith(wd + '/'))
|
|
124
|
+
relative = absPath.slice(wd.length + 1);
|
|
125
|
+
}
|
|
126
|
+
// Try known backend container roots
|
|
127
|
+
if (relative === null) {
|
|
128
|
+
for (const root of ['/app/project', '/app', '/workspace', '/project']) {
|
|
129
|
+
if (absPath === root) {
|
|
130
|
+
relative = '';
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
if (absPath.startsWith(root + '/')) {
|
|
134
|
+
relative = absPath.slice(root.length + 1);
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Last resort: preserve just the filename
|
|
140
|
+
if (relative === null)
|
|
141
|
+
return (0, path_1.join)(workspace, absPath.split('/').pop() ?? absPath);
|
|
142
|
+
// Deduplicate: if workspace ends with the first path segment of relative,
|
|
143
|
+
// the user's workspace IS that directory — don't nest it again.
|
|
144
|
+
// e.g. workspace=/project/test_2, relative=test_2/file.py → file.py
|
|
145
|
+
const wsBase = workspace.endsWith('/') ? workspace.slice(0, -1) : workspace;
|
|
146
|
+
const slashIdx = relative.indexOf('/');
|
|
147
|
+
const firstSeg = slashIdx >= 0 ? relative.slice(0, slashIdx) : relative;
|
|
148
|
+
if (firstSeg && wsBase.endsWith('/' + firstSeg)) {
|
|
149
|
+
relative = slashIdx >= 0 ? relative.slice(slashIdx + 1) : '';
|
|
150
|
+
}
|
|
151
|
+
return relative ? (0, path_1.join)(workspace, relative) : workspace;
|
|
152
|
+
}
|
|
153
|
+
function hWriteCode(cmd, workspace) {
|
|
154
|
+
const filename = fieldString(cmd, 'filename');
|
|
155
|
+
const code = fieldString(cmd, 'code') ?? (typeof cmd.code === 'string' ? cmd.code : undefined);
|
|
156
|
+
if (!filename || code === undefined) {
|
|
157
|
+
return { request_id: cmd.request_id, status: 'error', error: 'filename and code are required' };
|
|
158
|
+
}
|
|
159
|
+
const workdir = fieldString(cmd, 'workdir') ?? '';
|
|
160
|
+
let full;
|
|
161
|
+
if ((0, path_1.isAbsolute)(filename)) {
|
|
162
|
+
const resolved = (0, path_1.resolve)(filename);
|
|
163
|
+
// If the path is already inside the local workspace or /tmp, use it as-is.
|
|
164
|
+
// Otherwise it's a backend container path (e.g. /app/project/src/main.py) — remap.
|
|
165
|
+
const direct = safeResolve(workspace, filename);
|
|
166
|
+
full = direct ?? remapToWorkspace(resolved, workspace, workdir);
|
|
167
|
+
console.log(`[write_code] remapped ${filename} → ${full}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// Relative filename: if workdir is absolute (backend container path like /app/project/test_2/demo),
|
|
171
|
+
// remap it to the local workspace to preserve subdirectory structure.
|
|
172
|
+
// e.g. workdir=/app/project/test_2/demo → base=<workspace>/test_2/demo
|
|
173
|
+
const base = workdir
|
|
174
|
+
? (0, path_1.isAbsolute)(workdir)
|
|
175
|
+
? remapToWorkspace((0, path_1.resolve)(workdir), workspace, '')
|
|
176
|
+
: (0, path_1.join)(workspace, workdir)
|
|
177
|
+
: workspace;
|
|
178
|
+
const candidate = safeResolve(base, filename) ?? safeResolve(workspace, filename);
|
|
179
|
+
if (!candidate) {
|
|
180
|
+
console.warn(`[write_code] BLOCKED path=${filename} (outside workspace/tmp)`);
|
|
181
|
+
return { request_id: cmd.request_id, status: 'error', error: `Path escapes allowed directories: ${filename}` };
|
|
182
|
+
}
|
|
183
|
+
full = candidate;
|
|
184
|
+
}
|
|
185
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(full), { recursive: true });
|
|
186
|
+
(0, fs_1.writeFileSync)(full, code, 'utf8');
|
|
187
|
+
console.log(`[write_code] wrote ${full}`);
|
|
188
|
+
return {
|
|
189
|
+
request_id: cmd.request_id,
|
|
190
|
+
status: 'success',
|
|
191
|
+
data: { file_path: full, workdir: workdir || workspace },
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function hGetFile(cmd, workspace) {
|
|
195
|
+
const fp = fieldString(cmd, 'file_path');
|
|
196
|
+
if (!fp) {
|
|
197
|
+
return { request_id: cmd.request_id, status: 'error', error: 'file_path is required' };
|
|
198
|
+
}
|
|
199
|
+
// Try direct resolution first; if outside workspace (backend container path), remap it.
|
|
200
|
+
let full = safeResolve(workspace, fp);
|
|
201
|
+
if (!full && (0, path_1.isAbsolute)(fp)) {
|
|
202
|
+
full = remapToWorkspace((0, path_1.resolve)(fp), workspace, '');
|
|
203
|
+
console.log(`[get_file] remapped ${fp} → ${full}`);
|
|
204
|
+
}
|
|
205
|
+
if (!full || !(0, fs_1.existsSync)(full) || !(0, fs_1.statSync)(full).isFile()) {
|
|
206
|
+
return { request_id: cmd.request_id, status: 'error', error: `File not found: ${fp}` };
|
|
207
|
+
}
|
|
208
|
+
const content = (0, fs_1.readFileSync)(full, 'utf8');
|
|
209
|
+
return {
|
|
210
|
+
request_id: cmd.request_id,
|
|
211
|
+
status: 'success',
|
|
212
|
+
data: { file_content: content, file_path: full },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async function hRunSubprocess(cmd, workspace) {
|
|
216
|
+
const command = fieldString(cmd, 'command');
|
|
217
|
+
if (!command) {
|
|
218
|
+
return { request_id: cmd.request_id, status: 'error', error: 'command is required' };
|
|
219
|
+
}
|
|
220
|
+
const detach = fieldBoolean(cmd, 'detach', true);
|
|
221
|
+
const cmdWorkdir = fieldString(cmd, 'workdir');
|
|
222
|
+
// Ignore absolute workdir from backend container — always run in local workspace.
|
|
223
|
+
const cwd = cmdWorkdir && !(0, path_1.isAbsolute)(cmdWorkdir) ? (0, path_1.join)(workspace, cmdWorkdir) : workspace;
|
|
224
|
+
const safeCwd = safeResolve(workspace, cwd) ?? workspace;
|
|
225
|
+
// Ensure workspace exists before spawning — cwd must exist or spawn throws ENOENT
|
|
226
|
+
(0, fs_1.mkdirSync)(safeCwd, { recursive: true });
|
|
227
|
+
console.log(`[run_subprocess] cwd=${safeCwd} cmd=${command.slice(0, 120)} detach=${detach}`);
|
|
228
|
+
if (!detach) {
|
|
229
|
+
const proc = (0, child_process_1.spawn)(command, { shell: true, cwd: safeCwd });
|
|
230
|
+
let stdout = '';
|
|
231
|
+
let stderr = '';
|
|
232
|
+
proc.stdout?.on('data', (chunk) => { stdout += chunk.toString(); });
|
|
233
|
+
proc.stdout?.on('error', () => { });
|
|
234
|
+
proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
235
|
+
proc.stderr?.on('error', () => { });
|
|
236
|
+
const exitCode = await new Promise((resolveExit) => {
|
|
237
|
+
proc.on('close', (code) => resolveExit(code ?? -1));
|
|
238
|
+
proc.on('error', () => resolveExit(-1));
|
|
239
|
+
});
|
|
240
|
+
return {
|
|
241
|
+
request_id: cmd.request_id,
|
|
242
|
+
status: exitCode === 0 ? 'completed' : 'error',
|
|
243
|
+
data: {
|
|
244
|
+
detached: false,
|
|
245
|
+
completed: true,
|
|
246
|
+
exit_code: exitCode,
|
|
247
|
+
stdout,
|
|
248
|
+
stderr,
|
|
249
|
+
},
|
|
250
|
+
...(exitCode === 0 ? {} : { error: `Command failed with exit code ${exitCode}` }),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const jobId = (0, crypto_1.randomUUID)();
|
|
254
|
+
const proc = (0, child_process_1.spawn)(command, { shell: true, cwd: safeCwd });
|
|
255
|
+
const job = { proc, stdout: '', stderr: '', exitCode: null, startedAt: Date.now() };
|
|
256
|
+
_jobs.set(jobId, job);
|
|
257
|
+
proc.stdout?.on('data', (chunk) => { job.stdout += chunk.toString(); });
|
|
258
|
+
proc.stdout?.on('error', () => { });
|
|
259
|
+
proc.stderr?.on('data', (chunk) => { job.stderr += chunk.toString(); });
|
|
260
|
+
proc.stderr?.on('error', () => { });
|
|
261
|
+
proc.on('close', (code) => { job.exitCode = code ?? -1; });
|
|
262
|
+
// Periodic cleanup every 200 jobs to prevent unbounded memory growth
|
|
263
|
+
if (++_cleanupCounter % 200 === 0)
|
|
264
|
+
cleanupOldJobs();
|
|
265
|
+
return {
|
|
266
|
+
request_id: cmd.request_id,
|
|
267
|
+
status: 'success',
|
|
268
|
+
data: { job_id: jobId, detached: true, message: 'Job started in background' },
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function hGetJobStatus(cmd) {
|
|
272
|
+
const job_id = fieldString(cmd, 'job_id');
|
|
273
|
+
const job = job_id ? _jobs.get(job_id) : undefined;
|
|
274
|
+
if (!job) {
|
|
275
|
+
return { request_id: cmd.request_id, status: 'error', error: `Job not found: ${job_id ?? ''}` };
|
|
276
|
+
}
|
|
277
|
+
const done = job.exitCode !== null;
|
|
278
|
+
return {
|
|
279
|
+
request_id: cmd.request_id,
|
|
280
|
+
status: done ? 'completed' : 'pending',
|
|
281
|
+
data: {
|
|
282
|
+
job_id,
|
|
283
|
+
stdout: job.stdout,
|
|
284
|
+
stderr: job.stderr,
|
|
285
|
+
exit_code: job.exitCode,
|
|
286
|
+
completed: done,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function hTerminateJob(cmd) {
|
|
291
|
+
const job_id = fieldString(cmd, 'job_id');
|
|
292
|
+
const job = job_id ? _jobs.get(job_id) : undefined;
|
|
293
|
+
if (!job) {
|
|
294
|
+
return { request_id: cmd.request_id, status: 'error', error: `Job not found: ${job_id ?? ''}` };
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
job.proc.kill('SIGTERM');
|
|
298
|
+
}
|
|
299
|
+
catch { /* already exited */ }
|
|
300
|
+
job.exitCode = -15; // SIGTERM
|
|
301
|
+
job.stderr += '\n[terminated by daemon]';
|
|
302
|
+
return {
|
|
303
|
+
request_id: cmd.request_id,
|
|
304
|
+
status: 'success',
|
|
305
|
+
data: { job_id, terminated: true },
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
function hListFiles(cmd, workspace) {
|
|
309
|
+
const payload = cmd.payload ?? {};
|
|
310
|
+
const directory = fieldString(cmd, 'directory') ?? payload['directory'] ?? workspace;
|
|
311
|
+
const maxDepth = Number(cmd.max_depth ?? payload['max_depth'] ?? 10);
|
|
312
|
+
const includeHidden = Boolean(cmd.include_hidden ?? payload['include_hidden'] ?? false);
|
|
313
|
+
let target;
|
|
314
|
+
if ((0, path_1.isAbsolute)(directory)) {
|
|
315
|
+
// If outside workspace (backend container path like /app/project), remap to local workspace.
|
|
316
|
+
const direct = safeResolve(workspace, directory);
|
|
317
|
+
if (direct) {
|
|
318
|
+
target = direct;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
target = remapToWorkspace((0, path_1.resolve)(directory), workspace, '');
|
|
322
|
+
console.log(`[list_files] remapped ${directory} → ${target}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
target = safeResolve(workspace, directory) ?? workspace;
|
|
327
|
+
}
|
|
328
|
+
if (!(0, fs_1.existsSync)(target) || !(0, fs_1.statSync)(target).isDirectory()) {
|
|
329
|
+
return { request_id: cmd.request_id, status: 'error', error: `Directory not found: ${directory}` };
|
|
330
|
+
}
|
|
331
|
+
// Target directory itself is NOT included — matches VS Code extension and Python daemon.
|
|
332
|
+
const lines = [];
|
|
333
|
+
function walk(dir, depth) {
|
|
334
|
+
if (depth > maxDepth)
|
|
335
|
+
return;
|
|
336
|
+
let entries;
|
|
337
|
+
try {
|
|
338
|
+
entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
// Dirs first, then files — each group sorted alphabetically.
|
|
344
|
+
// Mirrors VS Code DaemonActionHandlers and Python action_handlers.
|
|
345
|
+
const dirs = entries.filter(e => e.isDirectory() && (includeHidden || !e.name.startsWith('.'))).sort((a, b) => a.name.localeCompare(b.name));
|
|
346
|
+
const files = entries.filter(e => e.isFile() && (includeHidden || !e.name.startsWith('.'))).sort((a, b) => a.name.localeCompare(b.name));
|
|
347
|
+
for (const entry of [...dirs, ...files]) {
|
|
348
|
+
const fullPath = (0, path_1.join)(dir, entry.name);
|
|
349
|
+
if (entry.isDirectory()) {
|
|
350
|
+
lines.push(`${fullPath}|d|0`);
|
|
351
|
+
if (!SKIP_DIRS.has(entry.name))
|
|
352
|
+
walk(fullPath, depth + 1);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
let size = 0;
|
|
356
|
+
try {
|
|
357
|
+
size = (0, fs_1.statSync)(fullPath).size;
|
|
358
|
+
}
|
|
359
|
+
catch { /* ignore */ }
|
|
360
|
+
lines.push(`${fullPath}|f|${size}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
walk(target, 1);
|
|
365
|
+
return {
|
|
366
|
+
request_id: cmd.request_id,
|
|
367
|
+
status: 'success',
|
|
368
|
+
data: { stdout: lines.join('\n'), file_count: lines.length, directory: target },
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
// ---------------------------------------------------------------------------
|
|
372
|
+
// Dispatch
|
|
373
|
+
// ---------------------------------------------------------------------------
|
|
374
|
+
async function dispatch(cmd, workspace) {
|
|
375
|
+
console.log(`[dispatch] action=${cmd.action} request_id=${cmd.request_id}`);
|
|
376
|
+
try {
|
|
377
|
+
switch (cmd.action) {
|
|
378
|
+
case 'create_session': return hCreateSession(cmd);
|
|
379
|
+
case 'write_code': return hWriteCode(cmd, workspace);
|
|
380
|
+
case 'get_file': return hGetFile(cmd, workspace);
|
|
381
|
+
case 'run_subprocess': return await hRunSubprocess(cmd, workspace);
|
|
382
|
+
case 'get_job_status': return hGetJobStatus(cmd);
|
|
383
|
+
case 'terminate_job': return hTerminateJob(cmd);
|
|
384
|
+
case 'list_files': return hListFiles(cmd, workspace);
|
|
385
|
+
default:
|
|
386
|
+
return { request_id: cmd.request_id, status: 'error', error: `Unknown action: ${cmd.action}` };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
console.error(`[dispatch] error in ${cmd.action}:`, err);
|
|
391
|
+
return { request_id: cmd.request_id, status: 'error', error: String(err) };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAsFH,kCAmBC;AAED,kCAqBC;AA6SD,4BAkBC;AA7bD,mCAAoC;AACpC,iDAAoD;AACpD,2BAA6G;AAC7G,2BAAqC;AACrC,+BAAoE;AAEpE,qEAAqE;AACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM;IAC7D,MAAM,EAAE,MAAM,EAAE,OAAO;CACxB,CAAC,CAAC;AA+CH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;AAC7C,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW;AACrD,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,SAAS,cAAc;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IACxC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;YACpD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,CAAS;IACnC,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAA,iBAAY,EAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,SAAiB,EAAE,OAAe;IAC5D,MAAM,IAAI,GAAG,IAAA,YAAO,GAAE,CAAC;IACvB,MAAM,GAAG,GAAG,IAAA,WAAM,GAAE,CAAC;IACrB,8FAA8F;IAC9F,wEAAwE;IACxE,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAA,cAAO,EAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAA,cAAO,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvG,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAc;QAC5C,MAAM,GAAG,GAAG,IAAA,eAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAA,iBAAU,EAAC,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,IAAA,iBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACxB,yEAAyE;QACzE,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,8EAA8E;IAC9E,MAAM,CAAC,GAAG,WAAW,CAAC,IAAA,cAAO,EAAC,IAAA,WAAI,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,GAAY,EAAE,GAAW;IAC5C,MAAM,MAAM,GAAI,GAA0C,CAAC,GAAG,CAAC,CAAC;IAChE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,GAAY,EAAE,GAAW,EAAE,QAAiB;IAChE,MAAM,MAAM,GAAI,GAA0C,CAAC,GAAG,CAAC,CAAC;IAChE,IAAI,OAAO,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,GAAY;IAClC,MAAM,GAAG,GACP,GAAG,CAAC,UAAU;QACb,GAAG,CAAC,OAAO,EAAE,CAAC,YAAY,CAAwB;QACnD,IAAA,mBAAU,GAAE,CAAC;IACf,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,SAAiB,EAAE,OAAe;IAC3E,IAAI,QAAQ,GAAkB,IAAI,CAAC;IAEnC,+FAA+F;IAC/F,IAAI,OAAO,IAAI,IAAA,iBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC;YAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,oCAAoC;IACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;YACtE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAAC,QAAQ,GAAG,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,CAAC;IAEnF,0EAA0E;IAC1E,gEAAgE;IAChE,oEAAoE;IACpE,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxE,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC;QAChD,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,SAAiB;IACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAClG,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IAElD,IAAI,IAAY,CAAC;IAEjB,IAAI,IAAA,iBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC;QACnC,2EAA2E;QAC3E,mFAAmF;QACnF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,GAAG,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,oGAAoG;QACpG,sEAAsE;QACtE,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO;YAClB,CAAC,CAAC,IAAA,iBAAU,EAAC,OAAO,CAAC;gBACnB,CAAC,CAAC,gBAAgB,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;gBACnD,CAAC,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,OAAO,CAAC;YAC5B,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,0BAA0B,CAAC,CAAC;YAC9E,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,qCAAqC,QAAQ,EAAE,EAAE,CAAC;QACjH,CAAC;QACD,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;IAED,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAA,kBAAa,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;IAC1C,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE;KACzD,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY,EAAE,SAAiB;IAC/C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACzF,CAAC;IACD,wFAAwF;IACxF,IAAI,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAU,EAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,IAAI,GAAG,gBAAgB,CAAC,IAAA,cAAO,EAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,CAAC,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAY,EAAE,SAAiB;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/C,kFAAkF;IAClF,MAAM,GAAG,GAAG,UAAU,IAAI,CAAC,IAAA,iBAAU,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,WAAI,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;IAEzD,kFAAkF;IAClF,IAAA,cAAS,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IAE7F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,WAAW,EAAE,EAAE;YACzD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;YAC9C,IAAI,EAAE;gBACJ,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,QAAQ;gBACnB,MAAM;gBACN,MAAM;aACP;YACD,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,iCAAiC,QAAQ,EAAE,EAAE,CAAC;SAClF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACjG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEtB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,qEAAqE;IACrE,IAAI,EAAE,eAAe,GAAG,GAAG,KAAK,CAAC;QAAE,cAAc,EAAE,CAAC;IAEpD,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;IAClG,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC;IACnC,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QACtC,IAAI,EAAE;YACJ,MAAM;YACN,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,CAAC;QAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAChE,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU;IAC9B,GAAG,CAAC,MAAM,IAAI,0BAA0B,CAAC;IACzC,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,SAAiB;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAK,OAAO,CAAC,WAAW,CAAwB,IAAI,SAAS,CAAC;IAC7G,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,CAAC;IAExF,IAAI,MAAc,CAAC;IACnB,IAAI,IAAA,iBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,6FAA6F;QAC7F,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,gBAAgB,CAAC,IAAA,cAAO,EAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,IAAI,CAAC,IAAA,aAAQ,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,SAAS,EAAE,EAAE,CAAC;IACrG,CAAC;IAED,yFAAyF;IACzF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,GAAW,EAAE,KAAa;QACtC,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO;QAC7B,IAAI,OAA8B,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,gBAAW,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,6DAA6D;QAC7D,mEAAmE;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7I,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzI,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChB,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;KAChF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAEvE,KAAK,UAAU,QAAQ,CAAC,GAAY,EAAE,SAAiB;IAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,gBAAgB,CAAC,CAAE,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;YACnD,KAAK,YAAY,CAAC,CAAM,OAAO,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC1D,KAAK,UAAU,CAAC,CAAQ,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACxD,KAAK,gBAAgB,CAAC,CAAE,OAAO,MAAM,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACpE,KAAK,gBAAgB,CAAC,CAAE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;YAClD,KAAK,eAAe,CAAC,CAAG,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;YAClD,KAAK,YAAY,CAAC,CAAM,OAAO,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC1D;gBACE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACnG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* neo-mcp-daemon — entry point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx neo-mcp-daemon [/path/to/workspace] [--deployment-id UUID]
|
|
7
|
+
*
|
|
8
|
+
* Environment:
|
|
9
|
+
* NEO_SECRET_KEY — API key (sk-v1-...) — primary auth
|
|
10
|
+
* NEO_DEPLOYMENT_ID — optional UUID override
|
|
11
|
+
* NEO_API_URL — optional, defaults to https://master.heyneo.so
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* neo-mcp-daemon — entry point
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx neo-mcp-daemon [/path/to/workspace] [--deployment-id UUID]
|
|
8
|
+
*
|
|
9
|
+
* Environment:
|
|
10
|
+
* NEO_SECRET_KEY — API key (sk-v1-...) — primary auth
|
|
11
|
+
* NEO_DEPLOYMENT_ID — optional UUID override
|
|
12
|
+
* NEO_API_URL — optional, defaults to https://master.heyneo.so
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const daemon_js_1 = require("./daemon.js");
|
|
17
|
+
const mcp_server_js_1 = require("./mcp-server.js");
|
|
18
|
+
function parseArgs() {
|
|
19
|
+
const args = process.argv.slice(2);
|
|
20
|
+
let workspace;
|
|
21
|
+
let deploymentId;
|
|
22
|
+
let mcp = false;
|
|
23
|
+
for (let i = 0; i < args.length; i++) {
|
|
24
|
+
if (args[i] === '--deployment-id' && args[i + 1]) {
|
|
25
|
+
deploymentId = args[++i];
|
|
26
|
+
}
|
|
27
|
+
else if (args[i] === '--mcp') {
|
|
28
|
+
mcp = true;
|
|
29
|
+
}
|
|
30
|
+
else if (args[i] && !args[i].startsWith('-')) {
|
|
31
|
+
workspace = args[i];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { workspace, deploymentId, mcp };
|
|
35
|
+
}
|
|
36
|
+
const { workspace, deploymentId, mcp } = parseArgs();
|
|
37
|
+
if (mcp) {
|
|
38
|
+
// MCP server mode: expose Neo tools to Claude Code and run daemon in background.
|
|
39
|
+
// Usage: claude mcp add --scope user neo -e NEO_SECRET_KEY=sk-v1-... -- npx neo-mcp-daemon --mcp
|
|
40
|
+
(0, mcp_server_js_1.runMcpServer)({ workspace: (0, path_1.resolve)(workspace ?? process.cwd()), deploymentId }).catch((e) => {
|
|
41
|
+
process.stderr.write(`Fatal MCP server error: ${e}\n`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Daemon-only mode (default): poll Neo backend and execute tasks locally.
|
|
47
|
+
(0, daemon_js_1.runDaemon)({ workspace, deploymentId }).catch((e) => {
|
|
48
|
+
console.error('Fatal daemon error:', e);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;GAUG;;AAEH,+BAA+B;AAC/B,2CAAwC;AACxC,mDAA+C;AAE/C,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,SAA6B,CAAC;IAClC,IAAI,YAAgC,CAAC;IACrC,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;YAC/B,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AAErD,IAAI,GAAG,EAAE,CAAC;IACR,iFAAiF;IACjF,iGAAiG;IACjG,IAAA,4BAAY,EAAC,EAAE,SAAS,EAAE,IAAA,cAAO,EAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QAClG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,0EAA0E;IAC1E,IAAA,qBAAS,EAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QAC1D,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* neo-mcp MCP server — stdio transport.
|
|
3
|
+
*
|
|
4
|
+
* Exposes 7 tools identical to the Python neo-mcp package:
|
|
5
|
+
* neo_submit_task, neo_task_status, neo_get_messages,
|
|
6
|
+
* neo_send_feedback, neo_pause_task, neo_resume_task, neo_stop_task
|
|
7
|
+
*
|
|
8
|
+
* Also starts the Neo daemon polling loop in the background so tasks
|
|
9
|
+
* actually execute locally — mirrors the Python server's BackendPoller.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* NEO_SECRET_KEY=sk-v1-... npx neo-mcp-daemon --mcp [/path/to/workspace]
|
|
13
|
+
*
|
|
14
|
+
* Register with Claude Code:
|
|
15
|
+
* claude mcp add --scope user neo \
|
|
16
|
+
* -e NEO_SECRET_KEY=sk-v1-... \
|
|
17
|
+
* -- npx neo-mcp-daemon --mcp
|
|
18
|
+
*/
|
|
19
|
+
export declare function runMcpServer(opts: {
|
|
20
|
+
workspace: string;
|
|
21
|
+
deploymentId?: string;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAyBH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgVhB"}
|