@elasto/nyx-cli 0.1.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 +136 -0
- package/bin/nyx.js +3 -0
- package/dist/agent/index.d.ts +29 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +362 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt.d.ts +16 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +487 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/templates/index.d.ts +2 -0
- package/dist/agent/templates/index.d.ts.map +1 -0
- package/dist/agent/templates/index.js +44 -0
- package/dist/agent/templates/index.js.map +1 -0
- package/dist/auth/index.d.ts +23 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +161 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +32 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +13 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +29 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/root.d.ts +3 -0
- package/dist/commands/root.d.ts.map +1 -0
- package/dist/commands/root.js +27 -0
- package/dist/commands/root.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +74 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +61 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/config/index.d.ts +22 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +110 -0
- package/dist/config/index.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +72 -0
- package/dist/db/index.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +45 -0
- package/dist/events/index.js.map +1 -0
- package/dist/filetracker/index.d.ts +8 -0
- package/dist/filetracker/index.d.ts.map +1 -0
- package/dist/filetracker/index.js +21 -0
- package/dist/filetracker/index.js.map +1 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +42 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +140 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +16 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +76 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/lsp/index.d.ts +10 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +130 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +102 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/permissions/index.d.ts +13 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +96 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/session/index.d.ts +25 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +100 -0
- package/dist/session/index.js.map +1 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +29 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +53 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tools/bash.d.ts +35 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +44 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/diagnostics.d.ts +19 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +45 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/edit.d.ts +31 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +72 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +23 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +40 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +31 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +72 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +78 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/job_output.d.ts +49 -0
- package/dist/tools/job_output.d.ts.map +1 -0
- package/dist/tools/job_output.js +57 -0
- package/dist/tools/job_output.js.map +1 -0
- package/dist/tools/ls.d.ts +19 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +55 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/todos.d.ts +41 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +54 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/view.d.ts +27 -0
- package/dist/tools/view.d.ts.map +1 -0
- package/dist/tools/view.js +59 -0
- package/dist/tools/view.js.map +1 -0
- package/dist/tools/web_fetch.d.ts +24 -0
- package/dist/tools/web_fetch.d.ts.map +1 -0
- package/dist/tools/web_fetch.js +43 -0
- package/dist/tools/web_fetch.js.map +1 -0
- package/dist/tools/web_search.d.ts +23 -0
- package/dist/tools/web_search.d.ts.map +1 -0
- package/dist/tools/web_search.js +41 -0
- package/dist/tools/web_search.js.map +1 -0
- package/dist/tools/write.d.ts +23 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +39 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types/index.d.ts +136 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +318 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/util/diff.d.ts +17 -0
- package/dist/util/diff.d.ts.map +1 -0
- package/dist/util/diff.js +74 -0
- package/dist/util/diff.js.map +1 -0
- package/dist/util/index.d.ts +6 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +33 -0
- package/dist/util/index.js.map +1 -0
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +133 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LSPManager = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const readline_1 = require("readline");
|
|
6
|
+
const index_js_1 = require("../logging/index.js");
|
|
7
|
+
class LSPManager {
|
|
8
|
+
clients = new Map();
|
|
9
|
+
async start(language, config) {
|
|
10
|
+
if (this.clients.has(language))
|
|
11
|
+
return;
|
|
12
|
+
if (config.enabled === false)
|
|
13
|
+
return;
|
|
14
|
+
index_js_1.logger.info(`Starting LSP: ${language} -> ${config.command}`);
|
|
15
|
+
const proc = (0, child_process_1.spawn)(config.command, config.args || [], {
|
|
16
|
+
env: { ...process.env, ...config.env },
|
|
17
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
18
|
+
windowsHide: true,
|
|
19
|
+
});
|
|
20
|
+
proc.on('error', (err) => index_js_1.logger.warn(`LSP ${language} error:`, err.message));
|
|
21
|
+
proc.on('exit', (code) => {
|
|
22
|
+
index_js_1.logger.info(`LSP ${language} exited: ${code}`);
|
|
23
|
+
this.clients.delete(language);
|
|
24
|
+
});
|
|
25
|
+
const client = { config, process: proc, capabilities: {} };
|
|
26
|
+
this.clients.set(language, client);
|
|
27
|
+
// Initialize LSP
|
|
28
|
+
await this.sendRequest(language, {
|
|
29
|
+
jsonrpc: '2.0',
|
|
30
|
+
id: 1,
|
|
31
|
+
method: 'initialize',
|
|
32
|
+
params: {
|
|
33
|
+
processId: process.pid,
|
|
34
|
+
rootUri: null,
|
|
35
|
+
capabilities: {},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
await this.sendNotification(language, {
|
|
39
|
+
jsonrpc: '2.0',
|
|
40
|
+
method: 'initialized',
|
|
41
|
+
params: {},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async getDiagnostics(language, filePath, content) {
|
|
45
|
+
const client = this.clients.get(language);
|
|
46
|
+
if (!client)
|
|
47
|
+
return [];
|
|
48
|
+
await this.sendNotification(language, {
|
|
49
|
+
jsonrpc: '2.0',
|
|
50
|
+
method: 'textDocument/didOpen',
|
|
51
|
+
params: {
|
|
52
|
+
textDocument: {
|
|
53
|
+
uri: `file://${filePath}`,
|
|
54
|
+
languageId: language,
|
|
55
|
+
version: 1,
|
|
56
|
+
text: content,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
// Read diagnostics from the response
|
|
61
|
+
const rl = (0, readline_1.createInterface)({ input: client.process.stdout, crlfDelay: Infinity });
|
|
62
|
+
const diagnostics = [];
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
const timeout = setTimeout(() => resolve(diagnostics), 2000);
|
|
65
|
+
rl.on('line', (line) => {
|
|
66
|
+
try {
|
|
67
|
+
const msg = JSON.parse(line);
|
|
68
|
+
if (msg.method === 'textDocument/publishDiagnostics') {
|
|
69
|
+
diagnostics.push(...msg.params.diagnostics);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
});
|
|
74
|
+
// Request diagnostics
|
|
75
|
+
this.sendRequest(language, {
|
|
76
|
+
jsonrpc: '2.0',
|
|
77
|
+
id: 2,
|
|
78
|
+
method: 'textDocument/codeAction',
|
|
79
|
+
params: {
|
|
80
|
+
textDocument: { uri: `file://${filePath}` },
|
|
81
|
+
range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },
|
|
82
|
+
context: { diagnostics: [] },
|
|
83
|
+
},
|
|
84
|
+
}).then(() => {
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
clearTimeout(timeout);
|
|
87
|
+
rl.close();
|
|
88
|
+
resolve(diagnostics);
|
|
89
|
+
}, 1000);
|
|
90
|
+
});
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
rl.close();
|
|
94
|
+
resolve(diagnostics);
|
|
95
|
+
}, 3000);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async sendRequest(language, msg) {
|
|
99
|
+
const client = this.clients.get(language);
|
|
100
|
+
if (!client)
|
|
101
|
+
return null;
|
|
102
|
+
const json = JSON.stringify(msg);
|
|
103
|
+
const header = `Content-Length: ${Buffer.byteLength(json, 'utf-8')}\r\n\r\n`;
|
|
104
|
+
client.process.stdin.write(header + json);
|
|
105
|
+
}
|
|
106
|
+
async sendNotification(language, msg) {
|
|
107
|
+
const client = this.clients.get(language);
|
|
108
|
+
if (!client)
|
|
109
|
+
return;
|
|
110
|
+
const json = JSON.stringify(msg);
|
|
111
|
+
const header = `Content-Length: ${Buffer.byteLength(json, 'utf-8')}\r\n\r\n`;
|
|
112
|
+
client.process.stdin.write(header + json);
|
|
113
|
+
}
|
|
114
|
+
stopAll() {
|
|
115
|
+
for (const [lang, client] of this.clients) {
|
|
116
|
+
try {
|
|
117
|
+
this.sendNotification(lang, {
|
|
118
|
+
jsonrpc: '2.0',
|
|
119
|
+
method: 'shutdown',
|
|
120
|
+
params: {},
|
|
121
|
+
});
|
|
122
|
+
client.process.kill();
|
|
123
|
+
}
|
|
124
|
+
catch { }
|
|
125
|
+
}
|
|
126
|
+
this.clients.clear();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.LSPManager = LSPManager;
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MCPConfig } from '../types/index.js';
|
|
2
|
+
export declare class MCPManager {
|
|
3
|
+
private servers;
|
|
4
|
+
start(name: string, config: MCPConfig): Promise<void>;
|
|
5
|
+
private startStdio;
|
|
6
|
+
getTools(name: string): any[];
|
|
7
|
+
getAllTools(): any[];
|
|
8
|
+
getConnectedServers(): string[];
|
|
9
|
+
stopAll(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAUlD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA+B;IAExC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB7C,UAAU;IAsDxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE;IAI7B,WAAW,IAAI,GAAG,EAAE;IAQpB,mBAAmB,IAAI,MAAM,EAAE;IAM/B,OAAO;CAMR"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCPManager = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const readline_1 = require("readline");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const index_js_1 = require("../logging/index.js");
|
|
8
|
+
class MCPManager {
|
|
9
|
+
servers = new Map();
|
|
10
|
+
async start(name, config) {
|
|
11
|
+
if (config.disabled || this.servers.has(name))
|
|
12
|
+
return;
|
|
13
|
+
index_js_1.logger.info(`Starting MCP: ${name} (${config.type})`);
|
|
14
|
+
const server = { config, connected: false, tools: [] };
|
|
15
|
+
switch (config.type) {
|
|
16
|
+
case 'stdio':
|
|
17
|
+
await this.startStdio(name, server);
|
|
18
|
+
break;
|
|
19
|
+
case 'http':
|
|
20
|
+
case 'sse':
|
|
21
|
+
index_js_1.logger.warn(`MCP type ${config.type} not yet implemented for ${name}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this.servers.set(name, server);
|
|
25
|
+
}
|
|
26
|
+
async startStdio(name, server) {
|
|
27
|
+
if (!server.config.command)
|
|
28
|
+
return;
|
|
29
|
+
const proc = (0, child_process_1.spawn)(server.config.command, server.config.args || [], {
|
|
30
|
+
env: { ...process.env, ...server.config.env },
|
|
31
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
32
|
+
shell: (0, os_1.platform)() === 'win32',
|
|
33
|
+
windowsHide: true,
|
|
34
|
+
});
|
|
35
|
+
server.process = proc;
|
|
36
|
+
const rl = (0, readline_1.createInterface)({ input: proc.stdout, crlfDelay: Infinity });
|
|
37
|
+
proc.on('error', (err) => index_js_1.logger.warn(`MCP ${name} error:`, err.message));
|
|
38
|
+
proc.on('exit', (code) => {
|
|
39
|
+
index_js_1.logger.info(`MCP ${name} exited: ${code}`);
|
|
40
|
+
server.connected = false;
|
|
41
|
+
});
|
|
42
|
+
// Send initialize request
|
|
43
|
+
const initMsg = {
|
|
44
|
+
jsonrpc: '2.0',
|
|
45
|
+
id: 1,
|
|
46
|
+
method: 'initialize',
|
|
47
|
+
params: {
|
|
48
|
+
protocolVersion: '2024-11-05',
|
|
49
|
+
capabilities: {},
|
|
50
|
+
clientInfo: { name: 'nyx-cli', version: '0.1.0' },
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
proc.stdin.write(JSON.stringify(initMsg) + '\n');
|
|
54
|
+
// Wait for response
|
|
55
|
+
server.connected = true;
|
|
56
|
+
await new Promise((resolve) => {
|
|
57
|
+
rl.on('line', (line) => {
|
|
58
|
+
try {
|
|
59
|
+
const msg = JSON.parse(line);
|
|
60
|
+
if (msg.id === 1) {
|
|
61
|
+
server.connected = true;
|
|
62
|
+
// Send initialized notification
|
|
63
|
+
proc.stdin.write(JSON.stringify({
|
|
64
|
+
jsonrpc: '2.0',
|
|
65
|
+
method: 'notifications/initialized',
|
|
66
|
+
params: {},
|
|
67
|
+
}) + '\n');
|
|
68
|
+
resolve();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
});
|
|
73
|
+
setTimeout(() => resolve(), 3000);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
getTools(name) {
|
|
77
|
+
return this.servers.get(name)?.tools || [];
|
|
78
|
+
}
|
|
79
|
+
getAllTools() {
|
|
80
|
+
const all = [];
|
|
81
|
+
for (const [, server] of this.servers) {
|
|
82
|
+
all.push(...server.tools);
|
|
83
|
+
}
|
|
84
|
+
return all;
|
|
85
|
+
}
|
|
86
|
+
getConnectedServers() {
|
|
87
|
+
return Array.from(this.servers.entries())
|
|
88
|
+
.filter(([, s]) => s.connected)
|
|
89
|
+
.map(([name]) => name);
|
|
90
|
+
}
|
|
91
|
+
stopAll() {
|
|
92
|
+
for (const [, server] of this.servers) {
|
|
93
|
+
try {
|
|
94
|
+
server.process?.kill();
|
|
95
|
+
}
|
|
96
|
+
catch { }
|
|
97
|
+
}
|
|
98
|
+
this.servers.clear();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.MCPManager = MCPManager;
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NyxConfig } from '../types/index.js';
|
|
2
|
+
export declare function setTuiReadline(rl: {
|
|
3
|
+
question: (query: string) => Promise<string>;
|
|
4
|
+
} | null): void;
|
|
5
|
+
export declare function resetAllowedTools(): void;
|
|
6
|
+
export declare class PermissionManager {
|
|
7
|
+
private allowedTools;
|
|
8
|
+
private yolo;
|
|
9
|
+
constructor(config: NyxConfig, yolo?: boolean);
|
|
10
|
+
isAllowed(tool: string): boolean;
|
|
11
|
+
requestPermission(tool: string, args: Record<string, any>): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAKlD,wBAAgB,cAAc,CAAC,EAAE,EAAE;IAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,QAEzF;AAID,wBAAgB,iBAAiB,SAEhC;AAYD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,EAAE,SAAS,EAAE,IAAI,GAAE,OAAe;IAQpD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAM1B,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAsBnF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PermissionManager = void 0;
|
|
7
|
+
exports.setTuiReadline = setTuiReadline;
|
|
8
|
+
exports.resetAllowedTools = resetAllowedTools;
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
let tuiReadline = null;
|
|
11
|
+
function setTuiReadline(rl) {
|
|
12
|
+
tuiReadline = rl;
|
|
13
|
+
}
|
|
14
|
+
const persistentAllowedTools = new Set();
|
|
15
|
+
function resetAllowedTools() {
|
|
16
|
+
persistentAllowedTools.clear();
|
|
17
|
+
}
|
|
18
|
+
function toolColor(tool) {
|
|
19
|
+
if (['view', 'ls', 'glob', 'grep', 'search'].includes(tool))
|
|
20
|
+
return chalk_1.default.green;
|
|
21
|
+
if (['write', 'create'].includes(tool))
|
|
22
|
+
return chalk_1.default.cyan;
|
|
23
|
+
if (['edit', 'apply_patch'].includes(tool))
|
|
24
|
+
return chalk_1.default.yellow;
|
|
25
|
+
if (['delete', 'remove', 'kill'].includes(tool))
|
|
26
|
+
return chalk_1.default.red;
|
|
27
|
+
if (['bash', 'run_command'].includes(tool))
|
|
28
|
+
return chalk_1.default.magenta;
|
|
29
|
+
if (['web_fetch', 'fetch', 'web_search'].includes(tool))
|
|
30
|
+
return chalk_1.default.blue;
|
|
31
|
+
return chalk_1.default.white;
|
|
32
|
+
}
|
|
33
|
+
class PermissionManager {
|
|
34
|
+
allowedTools;
|
|
35
|
+
yolo;
|
|
36
|
+
constructor(config, yolo = false) {
|
|
37
|
+
this.allowedTools = persistentAllowedTools;
|
|
38
|
+
for (const t of config.permissions?.allowed_tools || []) {
|
|
39
|
+
this.allowedTools.add(t);
|
|
40
|
+
}
|
|
41
|
+
this.yolo = yolo;
|
|
42
|
+
}
|
|
43
|
+
isAllowed(tool) {
|
|
44
|
+
if (this.yolo)
|
|
45
|
+
return true;
|
|
46
|
+
if (this.allowedTools.has(tool))
|
|
47
|
+
return true;
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
async requestPermission(tool, args) {
|
|
51
|
+
if (this.yolo)
|
|
52
|
+
return true;
|
|
53
|
+
if (this.allowedTools.has(tool))
|
|
54
|
+
return true;
|
|
55
|
+
const shortArgs = {};
|
|
56
|
+
if (args.file_path)
|
|
57
|
+
shortArgs.file = args.file_path;
|
|
58
|
+
else if (args.command)
|
|
59
|
+
shortArgs.cmd = args.command?.substring(0, 60);
|
|
60
|
+
else if (args.pattern)
|
|
61
|
+
shortArgs.pattern = args.pattern;
|
|
62
|
+
else if (args.query)
|
|
63
|
+
shortArgs.query = args.query;
|
|
64
|
+
else if (args.path)
|
|
65
|
+
shortArgs.path = args.path;
|
|
66
|
+
const c = toolColor(tool);
|
|
67
|
+
const answer = await askQuestion(c(` \u276F ${tool} `) + chalk_1.default.dim(JSON.stringify(shortArgs)) + ' (y/N/a): ');
|
|
68
|
+
const trimmed = answer.trim().toLowerCase();
|
|
69
|
+
if (trimmed === 'a' || trimmed === 'always') {
|
|
70
|
+
this.allowedTools.add(tool);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return trimmed === 'y' || trimmed === 'yes';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.PermissionManager = PermissionManager;
|
|
77
|
+
function askQuestion(query) {
|
|
78
|
+
if (tuiReadline) {
|
|
79
|
+
return tuiReadline.question(query);
|
|
80
|
+
}
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
process.stderr.write(query);
|
|
83
|
+
const onData = (data) => {
|
|
84
|
+
process.stdin.removeListener('data', onData);
|
|
85
|
+
const input = data.toString().replace(/[\r\n]/g, '').trim();
|
|
86
|
+
try {
|
|
87
|
+
while (process.stdin.read() !== null) { }
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
resolve(input);
|
|
91
|
+
};
|
|
92
|
+
process.stdin.resume();
|
|
93
|
+
process.stdin.on('data', onData);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":";;;;;;AAKA,wCAEC;AAID,8CAEC;AAZD,kDAAyB;AAEzB,IAAI,WAAW,GAA4D,IAAI,CAAA;AAE/E,SAAgB,cAAc,CAAC,EAA2D;IACxF,WAAW,GAAG,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAA;AAEhD,SAAgB,iBAAiB;IAC/B,sBAAsB,CAAC,KAAK,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,KAAK,CAAA;IAC/E,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,IAAI,CAAA;IACzD,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,MAAM,CAAA;IAC/D,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,GAAG,CAAA;IACjE,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,OAAO,CAAA;IAChE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAK,CAAC,IAAI,CAAA;IAC1E,OAAO,eAAK,CAAC,KAAK,CAAA;AACpB,CAAC;AAED,MAAa,iBAAiB;IACpB,YAAY,CAAa;IACzB,IAAI,CAAS;IAErB,YAAY,MAAiB,EAAE,OAAgB,KAAK;QAClD,IAAI,CAAC,YAAY,GAAG,sBAAsB,CAAA;QAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,IAAyB;QAC7D,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAE5C,MAAM,SAAS,GAAwB,EAAE,CAAA;QACzC,IAAI,IAAI,CAAC,SAAS;YAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAA;aAC9C,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;aAChE,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;aAClD,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;aAC5C,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAE9C,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,GAAG,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,aAAa,CAC/E,CAAA;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC3C,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,CAAA;IAC7C,CAAC;CACF;AAxCD,8CAwCC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YAC3D,IAAI,CAAC;gBAAC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAA;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;QACtB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ChatMessage } from '../types/index.js';
|
|
2
|
+
export interface SessionRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
updatedAt: string;
|
|
7
|
+
promptTokens: number;
|
|
8
|
+
completionTokens: number;
|
|
9
|
+
cost: number;
|
|
10
|
+
summaryMessageId?: string;
|
|
11
|
+
todos: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class SessionService {
|
|
14
|
+
create(title?: string): SessionRecord;
|
|
15
|
+
get(id: string): SessionRecord | null;
|
|
16
|
+
list(limit?: number): SessionRecord[];
|
|
17
|
+
update(id: string, data: Partial<SessionRecord>): void;
|
|
18
|
+
rename(id: string, title: string): void;
|
|
19
|
+
delete(id: string): void;
|
|
20
|
+
getMessages(sessionId: string): ChatMessage[];
|
|
21
|
+
addMessage(sessionId: string, msg: ChatMessage): void;
|
|
22
|
+
updateTokens(sessionId: string, prompt: number, completion: number): void;
|
|
23
|
+
private mapRow;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,qBAAa,cAAc;IACzB,MAAM,CAAC,KAAK,GAAE,MAA2B,GAAG,aAAa;IASzD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOrC,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,aAAa,EAAE;IAQzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC;IAe/C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIhC,MAAM,CAAC,EAAE,EAAE,MAAM;IAMjB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAa7C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW;IAgB9C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAOlE,OAAO,CAAC,MAAM;CAaf"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionService = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const index_js_1 = require("../db/index.js");
|
|
6
|
+
class SessionService {
|
|
7
|
+
create(title = 'Untitled Session') {
|
|
8
|
+
const id = (0, crypto_1.randomUUID)();
|
|
9
|
+
const db = (0, index_js_1.getDb)();
|
|
10
|
+
db.prepare('INSERT INTO sessions (id, title) VALUES (?, ?)').run(id, title);
|
|
11
|
+
return this.get(id);
|
|
12
|
+
}
|
|
13
|
+
get(id) {
|
|
14
|
+
const db = (0, index_js_1.getDb)();
|
|
15
|
+
const row = db.prepare('SELECT * FROM sessions WHERE id = ?').get(id);
|
|
16
|
+
if (!row)
|
|
17
|
+
return null;
|
|
18
|
+
return this.mapRow(row);
|
|
19
|
+
}
|
|
20
|
+
list(limit = 50) {
|
|
21
|
+
const db = (0, index_js_1.getDb)();
|
|
22
|
+
const rows = db.prepare('SELECT * FROM sessions ORDER BY updated_at DESC LIMIT ?').all(limit);
|
|
23
|
+
return rows.map((r) => this.mapRow(r));
|
|
24
|
+
}
|
|
25
|
+
update(id, data) {
|
|
26
|
+
const db = (0, index_js_1.getDb)();
|
|
27
|
+
const fields = [];
|
|
28
|
+
const values = [];
|
|
29
|
+
if (data.title !== undefined) {
|
|
30
|
+
fields.push('title = ?');
|
|
31
|
+
values.push(data.title);
|
|
32
|
+
}
|
|
33
|
+
if (data.promptTokens !== undefined) {
|
|
34
|
+
fields.push('prompt_tokens = ?');
|
|
35
|
+
values.push(data.promptTokens);
|
|
36
|
+
}
|
|
37
|
+
if (data.completionTokens !== undefined) {
|
|
38
|
+
fields.push('completion_tokens = ?');
|
|
39
|
+
values.push(data.completionTokens);
|
|
40
|
+
}
|
|
41
|
+
if (data.cost !== undefined) {
|
|
42
|
+
fields.push('cost = ?');
|
|
43
|
+
values.push(data.cost);
|
|
44
|
+
}
|
|
45
|
+
if (data.summaryMessageId !== undefined) {
|
|
46
|
+
fields.push('summary_message_id = ?');
|
|
47
|
+
values.push(data.summaryMessageId);
|
|
48
|
+
}
|
|
49
|
+
if (data.todos !== undefined) {
|
|
50
|
+
fields.push('todos = ?');
|
|
51
|
+
values.push(data.todos);
|
|
52
|
+
}
|
|
53
|
+
fields.push("updated_at = datetime('now')");
|
|
54
|
+
values.push(id);
|
|
55
|
+
db.prepare(`UPDATE sessions SET ${fields.join(', ')} WHERE id = ?`).run(...values);
|
|
56
|
+
}
|
|
57
|
+
rename(id, title) {
|
|
58
|
+
this.update(id, { title });
|
|
59
|
+
}
|
|
60
|
+
delete(id) {
|
|
61
|
+
const db = (0, index_js_1.getDb)();
|
|
62
|
+
db.prepare('DELETE FROM messages WHERE session_id = ?').run(id);
|
|
63
|
+
db.prepare('DELETE FROM sessions WHERE id = ?').run(id);
|
|
64
|
+
}
|
|
65
|
+
getMessages(sessionId) {
|
|
66
|
+
const db = (0, index_js_1.getDb)();
|
|
67
|
+
const rows = db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC').all(sessionId);
|
|
68
|
+
return rows.map((r) => ({
|
|
69
|
+
role: r.role,
|
|
70
|
+
content: r.content || '',
|
|
71
|
+
tool_calls: r.tool_calls ? JSON.parse(r.tool_calls) : undefined,
|
|
72
|
+
tool_call_id: r.tool_call_id || undefined,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
addMessage(sessionId, msg) {
|
|
76
|
+
const db = (0, index_js_1.getDb)();
|
|
77
|
+
db.prepare(`INSERT INTO messages (id, session_id, role, content, tool_calls, tool_call_id)
|
|
78
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run((0, crypto_1.randomUUID)(), sessionId, msg.role, msg.content || '', msg.tool_calls ? JSON.stringify(msg.tool_calls) : '[]', msg.tool_call_id || null);
|
|
79
|
+
db.prepare("UPDATE sessions SET updated_at = datetime('now') WHERE id = ?").run(sessionId);
|
|
80
|
+
}
|
|
81
|
+
updateTokens(sessionId, prompt, completion) {
|
|
82
|
+
const db = (0, index_js_1.getDb)();
|
|
83
|
+
db.prepare('UPDATE sessions SET prompt_tokens = prompt_tokens + ?, completion_tokens = completion_tokens + ?, updated_at = datetime(\'now\') WHERE id = ?').run(prompt, completion, sessionId);
|
|
84
|
+
}
|
|
85
|
+
mapRow(row) {
|
|
86
|
+
return {
|
|
87
|
+
id: row.id,
|
|
88
|
+
title: row.title,
|
|
89
|
+
createdAt: row.created_at,
|
|
90
|
+
updatedAt: row.updated_at,
|
|
91
|
+
promptTokens: row.prompt_tokens,
|
|
92
|
+
completionTokens: row.completion_tokens,
|
|
93
|
+
cost: row.cost,
|
|
94
|
+
summaryMessageId: row.summary_message_id,
|
|
95
|
+
todos: row.todos,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.SessionService = SessionService;
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,WAAW,CAqB9F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCommand = runCommand;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
function runCommand(command, cwd, timeout = 30000) {
|
|
7
|
+
const shell = (0, os_1.platform)() === 'win32' ? 'cmd.exe' : '/bin/bash';
|
|
8
|
+
const opts = {
|
|
9
|
+
cwd,
|
|
10
|
+
encoding: 'utf-8',
|
|
11
|
+
shell,
|
|
12
|
+
timeout,
|
|
13
|
+
maxBuffer: 1024 * 1024,
|
|
14
|
+
windowsHide: true,
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
const stdout = (0, child_process_1.execSync)(command, opts);
|
|
18
|
+
return { success: true, stdout: stdout || '(done)', stderr: '', exitCode: 0 };
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
stdout: err.stdout || '',
|
|
24
|
+
stderr: err.stderr || err.message,
|
|
25
|
+
exitCode: err.status || 1,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":";;AAUA,gCAqBC;AA/BD,iDAAwC;AACxC,2BAA6B;AAS7B,SAAgB,UAAU,CAAC,OAAe,EAAE,GAAY,EAAE,UAAkB,KAAK;IAC/E,MAAM,KAAK,GAAG,IAAA,aAAQ,GAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAA;IAC9D,MAAM,IAAI,GAAQ;QAChB,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,KAAK;QACL,OAAO;QACP,SAAS,EAAE,IAAI,GAAG,IAAI;QACtB,WAAW,EAAE,IAAI;KAClB,CAAA;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE,IAAI,CAAW,CAAA;QAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IAC/E,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO;YACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;SAC1B,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Skill {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
description: string;
|
|
5
|
+
instructions: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function discoverSkills(projectPath: string, extraPaths?: string[]): Skill[];
|
|
8
|
+
export declare function loadSkillInstructions(skills: Skill[]): string;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,KAAK,EAAE,CAyCtF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAI7D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discoverSkills = discoverSkills;
|
|
4
|
+
exports.loadSkillInstructions = loadSkillInstructions;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const index_js_1 = require("../logging/index.js");
|
|
8
|
+
function discoverSkills(projectPath, extraPaths = []) {
|
|
9
|
+
const skills = [];
|
|
10
|
+
const searchPaths = new Set();
|
|
11
|
+
// Project-level paths
|
|
12
|
+
for (const dir of ['.agents', '.nyx', '.claude', '.cursor']) {
|
|
13
|
+
searchPaths.add((0, path_1.resolve)(projectPath, dir, 'skills'));
|
|
14
|
+
}
|
|
15
|
+
// Extra configured paths
|
|
16
|
+
for (const p of extraPaths) {
|
|
17
|
+
searchPaths.add((0, path_1.resolve)(p));
|
|
18
|
+
}
|
|
19
|
+
for (const dir of searchPaths) {
|
|
20
|
+
if (!(0, fs_1.existsSync)(dir))
|
|
21
|
+
continue;
|
|
22
|
+
try {
|
|
23
|
+
const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry.isDirectory()) {
|
|
26
|
+
const skillPath = (0, path_1.join)(dir, entry.name);
|
|
27
|
+
const skillMd = (0, path_1.join)(skillPath, 'SKILL.md');
|
|
28
|
+
if ((0, fs_1.existsSync)(skillMd)) {
|
|
29
|
+
const content = (0, fs_1.readFileSync)(skillMd, 'utf-8');
|
|
30
|
+
const firstLine = content.split('\n')[0] || entry.name;
|
|
31
|
+
const description = firstLine.replace(/^#\s*/, '').trim();
|
|
32
|
+
skills.push({
|
|
33
|
+
name: entry.name,
|
|
34
|
+
path: skillPath,
|
|
35
|
+
description,
|
|
36
|
+
instructions: content,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
index_js_1.logger.warn('Failed to discover skills in', dir, err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return skills;
|
|
47
|
+
}
|
|
48
|
+
function loadSkillInstructions(skills) {
|
|
49
|
+
return skills.map((s) => {
|
|
50
|
+
return `## Skill: ${s.name}\n${s.instructions}\n`;
|
|
51
|
+
}).join('\n\n');
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":";;AAWA,wCAyCC;AAED,sDAIC;AA1DD,2BAAoE;AACpE,+BAAoC;AACpC,kDAA4C;AAS5C,SAAgB,cAAc,CAAC,WAAmB,EAAE,aAAuB,EAAE;IAC3E,MAAM,MAAM,GAAY,EAAE,CAAA;IAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IAErC,sBAAsB;IACtB,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QAC5D,WAAW,CAAC,GAAG,CAAC,IAAA,cAAO,EAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,WAAW,CAAC,GAAG,CAAC,IAAA,cAAO,EAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAA,eAAU,EAAC,GAAG,CAAC;YAAE,SAAQ;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;oBACvC,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,UAAU,CAAC,CAAA;oBAC3C,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;wBACxB,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAA;wBAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAA;wBACtD,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;wBACzD,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,IAAI,EAAE,SAAS;4BACf,WAAW;4BACX,YAAY,EAAE,OAAO;yBACtB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,iBAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAe;IACnD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,OAAO,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,IAAI,CAAA;IACnD,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC"}
|