@gencode/console 0.0.1

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.
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AIMax CLI 调试控制台</title>
7
+ <script type="module" crossorigin src="/assets/main-BC36yw7y.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/main-ACHOM3RY.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,56 @@
1
+ /**
2
+ * HTTP callback server for receiving progress events from CLI subprocesses.
3
+ *
4
+ * The CLI sends POST requests to this server with AgentProgressEvent payloads.
5
+ * This server then forwards those events to the appropriate WebSocket connections.
6
+ */
7
+ import type { S2CMessage } from '../shared/protocol.js';
8
+ export type CallbackHandler = (sessionId: string, message: S2CMessage) => void;
9
+ /**
10
+ * Callback server that receives HTTP POST requests from CLI and forwards
11
+ * events to WebSocket clients.
12
+ */
13
+ export declare class CallbackServer {
14
+ private port;
15
+ private server;
16
+ private handler;
17
+ private toolCallCounter;
18
+ private toolCallIdStack;
19
+ constructor(port: number);
20
+ /**
21
+ * Set the handler function that will be called when events are received.
22
+ */
23
+ setHandler(handler: CallbackHandler): void;
24
+ /**
25
+ * Start the callback server.
26
+ */
27
+ start(): Promise<void>;
28
+ /**
29
+ * Stop the callback server.
30
+ */
31
+ stop(): Promise<void>;
32
+ /**
33
+ * Get the callback URL for a session.
34
+ */
35
+ getCallbackUrl(): string;
36
+ /**
37
+ * Handle incoming HTTP requests.
38
+ */
39
+ private handleRequest;
40
+ /**
41
+ * Read the request body as a string.
42
+ */
43
+ private readBody;
44
+ /**
45
+ * Convert CLI callback payload to S2C messages.
46
+ *
47
+ * This handles the mapping from AgentProgressEvent to WebSocket messages,
48
+ * including generating toolCallIds for tool_start/tool_end events.
49
+ */
50
+ private convertPayloadToMessages;
51
+ /**
52
+ * Clean up session-specific state (call when session completes).
53
+ */
54
+ cleanupSession(sessionId: string): void;
55
+ }
56
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/server/callback-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAsB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;AAE/E;;;GAGG;AACH,qBAAa,cAAc;IAMb,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,eAAe,CAA+B;gBAElC,IAAI,EAAE,MAAM;IAMhC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;YACW,aAAa;IAqC3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAwLhC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAIxC"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * HTTP callback server for receiving progress events from CLI subprocesses.
3
+ *
4
+ * The CLI sends POST requests to this server with AgentProgressEvent payloads.
5
+ * This server then forwards those events to the appropriate WebSocket connections.
6
+ */
7
+ import http from 'node:http';
8
+ /**
9
+ * Callback server that receives HTTP POST requests from CLI and forwards
10
+ * events to WebSocket clients.
11
+ */
12
+ export class CallbackServer {
13
+ port;
14
+ server;
15
+ handler = null;
16
+ toolCallCounter = new Map();
17
+ toolCallIdStack = new Map();
18
+ constructor(port) {
19
+ this.port = port;
20
+ this.server = http.createServer((req, res) => {
21
+ this.handleRequest(req, res);
22
+ });
23
+ }
24
+ /**
25
+ * Set the handler function that will be called when events are received.
26
+ */
27
+ setHandler(handler) {
28
+ this.handler = handler;
29
+ }
30
+ /**
31
+ * Start the callback server.
32
+ */
33
+ async start() {
34
+ return new Promise((resolve, reject) => {
35
+ this.server.once('error', reject);
36
+ this.server.listen(this.port, () => {
37
+ this.server.off('error', reject);
38
+ resolve();
39
+ });
40
+ });
41
+ }
42
+ /**
43
+ * Stop the callback server.
44
+ */
45
+ async stop() {
46
+ return new Promise((resolve, reject) => {
47
+ this.server.close((err) => {
48
+ if (err)
49
+ reject(err);
50
+ else
51
+ resolve();
52
+ });
53
+ });
54
+ }
55
+ /**
56
+ * Get the callback URL for a session.
57
+ */
58
+ getCallbackUrl() {
59
+ return `http://localhost:${this.port}/callback`;
60
+ }
61
+ /**
62
+ * Handle incoming HTTP requests.
63
+ */
64
+ async handleRequest(req, res) {
65
+ // Only accept POST requests to /callback
66
+ if (req.method !== 'POST' || req.url !== '/callback') {
67
+ res.writeHead(404, { 'Content-Type': 'application/json' });
68
+ res.end(JSON.stringify({ error: 'Not found' }));
69
+ return;
70
+ }
71
+ try {
72
+ const body = await this.readBody(req);
73
+ const payload = JSON.parse(body);
74
+ if (!this.handler) {
75
+ res.writeHead(500, { 'Content-Type': 'application/json' });
76
+ res.end(JSON.stringify({ error: 'No handler registered' }));
77
+ return;
78
+ }
79
+ // Convert CLI callback payload to S2C messages
80
+ const messages = this.convertPayloadToMessages(payload);
81
+ // Forward each message to the handler
82
+ for (const message of messages) {
83
+ this.handler(payload.sessionId, message);
84
+ }
85
+ res.writeHead(200, { 'Content-Type': 'application/json' });
86
+ res.end(JSON.stringify({ success: true }));
87
+ }
88
+ catch (err) {
89
+ res.writeHead(400, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify({ error: err.message }));
91
+ }
92
+ }
93
+ /**
94
+ * Read the request body as a string.
95
+ */
96
+ readBody(req) {
97
+ return new Promise((resolve, reject) => {
98
+ let body = '';
99
+ req.on('data', (chunk) => {
100
+ body += chunk.toString();
101
+ });
102
+ req.on('end', () => resolve(body));
103
+ req.on('error', reject);
104
+ });
105
+ }
106
+ /**
107
+ * Convert CLI callback payload to S2C messages.
108
+ *
109
+ * This handles the mapping from AgentProgressEvent to WebSocket messages,
110
+ * including generating toolCallIds for tool_start/tool_end events.
111
+ */
112
+ convertPayloadToMessages(payload) {
113
+ const { sessionId } = payload;
114
+ const messageId = payload.messageId ?? (payload.type === 'progress' ? payload.event.messageId : undefined);
115
+ if (payload.type === 'start') {
116
+ return [
117
+ {
118
+ type: 'agent.start',
119
+ sessionId,
120
+ messageId,
121
+ message: payload.message,
122
+ },
123
+ ];
124
+ }
125
+ if (payload.type === 'done') {
126
+ return [
127
+ {
128
+ type: 'agent.done',
129
+ sessionId,
130
+ messageId,
131
+ result: payload.result,
132
+ },
133
+ ];
134
+ }
135
+ if (payload.type === 'error') {
136
+ return [
137
+ {
138
+ type: 'agent.error',
139
+ sessionId,
140
+ messageId,
141
+ message: payload.message,
142
+ },
143
+ ];
144
+ }
145
+ if (payload.type === 'session_reset') {
146
+ return [
147
+ {
148
+ type: 'session.reset',
149
+ sessionId,
150
+ messageId,
151
+ action: payload.action,
152
+ previousSessionId: payload.previousSessionId,
153
+ message: payload.message,
154
+ },
155
+ ];
156
+ }
157
+ // Handle progress events
158
+ const { event } = payload;
159
+ switch (event.type) {
160
+ case 'text':
161
+ return [
162
+ {
163
+ type: 'agent.text',
164
+ sessionId,
165
+ messageId,
166
+ delta: event.text,
167
+ },
168
+ ];
169
+ case 'bootstrap':
170
+ return [
171
+ {
172
+ type: 'agent.bootstrap',
173
+ sessionId,
174
+ messageId,
175
+ phase: event.phase,
176
+ dataDir: event.dataDir,
177
+ },
178
+ ];
179
+ case 'tool_start': {
180
+ // Generate a unique toolCallId for this session
181
+ const counter = this.toolCallCounter.get(sessionId) ?? 0;
182
+ const newCounter = counter + 1;
183
+ this.toolCallCounter.set(sessionId, newCounter);
184
+ const toolCallId = `tool-${newCounter}`;
185
+ // Push to stack for matching with tool_end
186
+ if (!this.toolCallIdStack.has(sessionId)) {
187
+ this.toolCallIdStack.set(sessionId, []);
188
+ }
189
+ this.toolCallIdStack.get(sessionId).push(toolCallId);
190
+ return [
191
+ {
192
+ type: 'agent.tool_start',
193
+ sessionId,
194
+ messageId,
195
+ toolCallId,
196
+ name: event.name,
197
+ input: event.input,
198
+ },
199
+ ];
200
+ }
201
+ case 'tool_end': {
202
+ // Pop from stack to get matching toolCallId
203
+ const stack = this.toolCallIdStack.get(sessionId);
204
+ const toolCallId = stack?.pop() ?? `tool-${this.toolCallCounter.get(sessionId) ?? 0}`;
205
+ return [
206
+ {
207
+ type: 'agent.tool_end',
208
+ sessionId,
209
+ messageId,
210
+ toolCallId,
211
+ name: event.name,
212
+ output: event.output,
213
+ isError: event.isError,
214
+ },
215
+ ];
216
+ }
217
+ case 'compaction':
218
+ return [
219
+ {
220
+ type: 'agent.compaction',
221
+ sessionId,
222
+ messageId,
223
+ reason: event.reason,
224
+ },
225
+ ];
226
+ case 'memory_changed':
227
+ return [
228
+ {
229
+ type: 'agent.memory_changed',
230
+ sessionId,
231
+ messageId,
232
+ reason: event.reason,
233
+ files: event.files,
234
+ source: event.source,
235
+ providerId: event.providerId,
236
+ timestamp: event.timestamp,
237
+ },
238
+ ];
239
+ case 'error':
240
+ return [
241
+ {
242
+ type: 'agent.error',
243
+ sessionId,
244
+ messageId,
245
+ message: event.message,
246
+ },
247
+ ];
248
+ case 'subagent_spawn':
249
+ return [
250
+ {
251
+ type: 'agent.subagent_spawn',
252
+ sessionId,
253
+ messageId,
254
+ childSessionId: event.childSessionId,
255
+ task: event.task,
256
+ label: event.label,
257
+ },
258
+ ];
259
+ case 'subagent_complete':
260
+ return [
261
+ {
262
+ type: 'agent.subagent_complete',
263
+ sessionId,
264
+ messageId,
265
+ childSessionId: event.childSessionId,
266
+ task: event.task,
267
+ status: event.status,
268
+ },
269
+ ];
270
+ default:
271
+ // Exhaustive check
272
+ const _exhaustive = event;
273
+ return [];
274
+ }
275
+ }
276
+ /**
277
+ * Clean up session-specific state (call when session completes).
278
+ */
279
+ cleanupSession(sessionId) {
280
+ this.toolCallCounter.delete(sessionId);
281
+ this.toolCallIdStack.delete(sessionId);
282
+ }
283
+ }
284
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../src/server/callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * CLI subprocess runner.
3
+ *
4
+ * Spawns the aimax CLI as a child process and manages its lifecycle.
5
+ */
6
+ import type { ServerConfig } from './config.js';
7
+ export type CliRunOptions = {
8
+ dataDir: string;
9
+ message: string;
10
+ sessionId?: string;
11
+ messageId?: string;
12
+ callbackUrl: string;
13
+ config: ServerConfig;
14
+ };
15
+ export type CliRunResult = {
16
+ sessionId: string;
17
+ exitCode: number;
18
+ stdout: string;
19
+ stderr: string;
20
+ };
21
+ export type CliCommandsResult = {
22
+ exitCode: number;
23
+ stdout: string;
24
+ stderr: string;
25
+ };
26
+ /**
27
+ * Manages a CLI subprocess execution.
28
+ */
29
+ export declare class CliRunner {
30
+ private options;
31
+ private process;
32
+ private stdout;
33
+ private stderr;
34
+ private aborted;
35
+ constructor(options: CliRunOptions);
36
+ /**
37
+ * Start the CLI subprocess.
38
+ *
39
+ * @returns Promise that resolves when the CLI process exits
40
+ */
41
+ run(): Promise<CliRunResult>;
42
+ /**
43
+ * Abort the running CLI process.
44
+ */
45
+ abort(): void;
46
+ /**
47
+ * Check if the process is still running.
48
+ */
49
+ isRunning(): boolean;
50
+ }
51
+ export declare function runCommandsList(params: {
52
+ dataDir: string;
53
+ config: ServerConfig;
54
+ }): Promise<CliCommandsResult>;
55
+ //# sourceMappingURL=cli-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../src/server/cli-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;IAMR,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEJ,OAAO,EAAE,aAAa;IAE1C;;;;OAIG;IACG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IAgHlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoD7B"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * CLI subprocess runner.
3
+ *
4
+ * Spawns the aimax CLI as a child process and manages its lifecycle.
5
+ */
6
+ import { spawn } from 'node:child_process';
7
+ import path from 'node:path';
8
+ /**
9
+ * Manages a CLI subprocess execution.
10
+ */
11
+ export class CliRunner {
12
+ options;
13
+ process = null;
14
+ stdout = '';
15
+ stderr = '';
16
+ aborted = false;
17
+ constructor(options) {
18
+ this.options = options;
19
+ }
20
+ /**
21
+ * Start the CLI subprocess.
22
+ *
23
+ * @returns Promise that resolves when the CLI process exits
24
+ */
25
+ async run() {
26
+ const { config, dataDir, message, sessionId, messageId, callbackUrl } = this.options;
27
+ // Debug log
28
+ console.log('[CliRunner] Starting CLI with sessionId:', sessionId || 'NONE (new session)');
29
+ const baseArgs = [
30
+ 'run',
31
+ '--data-dir', dataDir,
32
+ '--message', message,
33
+ '--channel', 'WEB',
34
+ '--base-url', config.llm.baseUrl,
35
+ ];
36
+ if (config.llm.authToken) {
37
+ baseArgs.push('--auth-token', config.llm.authToken);
38
+ }
39
+ else if (config.llm.apiKey) {
40
+ baseArgs.push('--api-key', config.llm.apiKey);
41
+ }
42
+ baseArgs.push('--model', config.llm.model, '--callback-url', callbackUrl, '--output', 'json');
43
+ const useNode = isNodeBinary(config.cliBin);
44
+ const command = useNode ? config.nodeBinPath : config.cliBin;
45
+ const args = useNode ? [config.cliScriptPath, ...baseArgs] : baseArgs;
46
+ if (sessionId) {
47
+ args.push('--session-id', sessionId);
48
+ console.log('[CliRunner] Added --session-id argument:', sessionId);
49
+ }
50
+ else {
51
+ console.log('[CliRunner] No sessionId provided, will create new session');
52
+ }
53
+ if (messageId) {
54
+ args.push('--message-id', messageId);
55
+ console.log('[CliRunner] Added --message-id argument:', messageId);
56
+ }
57
+ if (config.llm.contextWindow !== undefined) {
58
+ args.push('--context-window', config.llm.contextWindow.toString());
59
+ }
60
+ return new Promise((resolve, reject) => {
61
+ this.process = spawn(command, args, {
62
+ stdio: ['ignore', 'pipe', 'pipe'],
63
+ env: {
64
+ ...process.env,
65
+ // Pass through environment variables
66
+ AIMAX_DATA_DIR: dataDir,
67
+ AIMAX_BASE_URL: config.llm.baseUrl,
68
+ ...(config.llm.apiKey ? { AIMAX_API_KEY: config.llm.apiKey } : {}),
69
+ ...(config.llm.authToken ? { AIMAX_AUTH_TOKEN: config.llm.authToken } : {}),
70
+ AIMAX_MODEL: config.llm.model,
71
+ },
72
+ });
73
+ // Capture stdout
74
+ this.process.stdout?.on('data', (chunk) => {
75
+ this.stdout += chunk.toString();
76
+ });
77
+ // Capture stderr
78
+ this.process.stderr?.on('data', (chunk) => {
79
+ this.stderr += chunk.toString();
80
+ });
81
+ // Handle process exit
82
+ this.process.on('exit', (code) => {
83
+ const exitCode = code ?? (this.aborted ? 143 : 1);
84
+ // Try to extract sessionId from stdout (JSON output)
85
+ let extractedSessionId = sessionId;
86
+ try {
87
+ const lines = this.stdout.trim().split('\n');
88
+ const lastLine = lines[lines.length - 1];
89
+ if (lastLine) {
90
+ const result = JSON.parse(lastLine);
91
+ if (result.sessionId) {
92
+ extractedSessionId = result.sessionId;
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ // Ignore parse errors
98
+ }
99
+ resolve({
100
+ sessionId: extractedSessionId ?? 'unknown',
101
+ exitCode,
102
+ stdout: this.stdout,
103
+ stderr: this.stderr,
104
+ });
105
+ });
106
+ // Handle process errors
107
+ this.process.on('error', (err) => {
108
+ if (isCommandNotFound(err) && !useNode) {
109
+ reject(new Error('aimax command not found. Install @gencode/cli or set ' +
110
+ 'AIMAX_CLI_BIN=node and AIMAX_CLI_SCRIPT=/path/to/cli/dist/bin.js ' +
111
+ 'to run via Node.js.'));
112
+ return;
113
+ }
114
+ reject(new Error(`Failed to spawn CLI: ${err.message}`));
115
+ });
116
+ });
117
+ }
118
+ /**
119
+ * Abort the running CLI process.
120
+ */
121
+ abort() {
122
+ if (this.process && !this.process.killed) {
123
+ this.aborted = true;
124
+ this.process.kill('SIGTERM');
125
+ // Force kill after 5 seconds if still running
126
+ setTimeout(() => {
127
+ if (this.process && !this.process.killed) {
128
+ this.process.kill('SIGKILL');
129
+ }
130
+ }, 5000);
131
+ }
132
+ }
133
+ /**
134
+ * Check if the process is still running.
135
+ */
136
+ isRunning() {
137
+ return this.process !== null && !this.process.killed;
138
+ }
139
+ }
140
+ export async function runCommandsList(params) {
141
+ const { config, dataDir } = params;
142
+ const baseArgs = [
143
+ 'commands',
144
+ '--data-dir', dataDir,
145
+ '--output', 'json',
146
+ ];
147
+ const useNode = isNodeBinary(config.cliBin);
148
+ const command = useNode ? config.nodeBinPath : config.cliBin;
149
+ const args = useNode ? [config.cliScriptPath, ...baseArgs] : baseArgs;
150
+ return new Promise((resolve, reject) => {
151
+ const child = spawn(command, args, {
152
+ stdio: ['ignore', 'pipe', 'pipe'],
153
+ env: {
154
+ ...process.env,
155
+ AIMAX_DATA_DIR: dataDir,
156
+ },
157
+ });
158
+ let stdout = '';
159
+ let stderr = '';
160
+ child.stdout?.on('data', (chunk) => {
161
+ stdout += chunk.toString();
162
+ });
163
+ child.stderr?.on('data', (chunk) => {
164
+ stderr += chunk.toString();
165
+ });
166
+ child.on('exit', (code) => {
167
+ resolve({
168
+ exitCode: code ?? 1,
169
+ stdout,
170
+ stderr,
171
+ });
172
+ });
173
+ child.on('error', (err) => {
174
+ if (isCommandNotFound(err) && !useNode) {
175
+ reject(new Error('aimax command not found. Install @gencode/cli or set ' +
176
+ 'AIMAX_CLI_BIN=node and AIMAX_CLI_SCRIPT=/path/to/cli/dist/bin.js ' +
177
+ 'to run via Node.js.'));
178
+ return;
179
+ }
180
+ reject(new Error(`Failed to spawn CLI: ${err.message}`));
181
+ });
182
+ });
183
+ }
184
+ function isNodeBinary(bin) {
185
+ const base = path.basename(bin).toLowerCase();
186
+ return base === 'node' || base === 'node.exe';
187
+ }
188
+ function isCommandNotFound(err) {
189
+ return Boolean(err?.code === 'ENOENT');
190
+ }
191
+ //# sourceMappingURL=cli-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-runner.js","sourceRoot":"","sources":["../../src/server/cli-runner.ts"],"names":[],"mappings":"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"}