@etheaven/codex-mcp-server 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +26 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +450 -0
- package/dist/constants.d.ts +165 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +154 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +263 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/batch-codex.tool.d.ts +3 -0
- package/dist/tools/batch-codex.tool.d.ts.map +1 -0
- package/dist/tools/batch-codex.tool.js +140 -0
- package/dist/tools/batch-codex.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +171 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +66 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +84 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +5 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +64 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +34 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +93 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeRunner.d.ts +11 -0
- package/dist/utils/changeModeRunner.d.ts.map +1 -0
- package/dist/utils/changeModeRunner.js +133 -0
- package/dist/utils/changeModeRunner.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +69 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +163 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +47 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +296 -0
- package/dist/utils/codexExecutor.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +29 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +158 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +83 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/outputParser.d.ts +26 -0
- package/dist/utils/outputParser.d.ts.map +1 -0
- package/dist/utils/outputParser.js +174 -0
- package/dist/utils/outputParser.js.map +1 -0
- package/dist/utils/reviewParser.d.ts +28 -0
- package/dist/utils/reviewParser.d.ts.map +1 -0
- package/dist/utils/reviewParser.js +87 -0
- package/dist/utils/reviewParser.js.map +1 -0
- package/dist/utils/workingDirResolver.d.ts +47 -0
- package/dist/utils/workingDirResolver.d.ts.map +1 -0
- package/dist/utils/workingDirResolver.js +199 -0
- package/dist/utils/workingDirResolver.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import spawn from 'cross-spawn';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Execute a command with streaming output and structured error handling
|
|
5
|
+
*/
|
|
6
|
+
export async function executeCommandDetailed(command, args, options = {}) {
|
|
7
|
+
const { onProgress, timeoutMs = 600000, maxOutputBytes = 50 * 1024 * 1024, // 50MB default
|
|
8
|
+
retry, } = options;
|
|
9
|
+
let attempt = 0;
|
|
10
|
+
const maxAttempts = retry?.attempts || 1;
|
|
11
|
+
while (attempt < maxAttempts) {
|
|
12
|
+
attempt++;
|
|
13
|
+
const result = await executeOnce(command, args, {
|
|
14
|
+
onProgress,
|
|
15
|
+
timeoutMs,
|
|
16
|
+
maxOutputBytes,
|
|
17
|
+
});
|
|
18
|
+
if (result.ok) {
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
const shouldRetry = retry &&
|
|
22
|
+
((result.timedOut && retry.retryOn.includes('timeout')) ||
|
|
23
|
+
(result.code !== 0 && result.code !== null && retry.retryOn.includes('exit_nonzero')) ||
|
|
24
|
+
(result.code === null && !result.signal && retry.retryOn.includes('spawn_error')));
|
|
25
|
+
if (!shouldRetry || attempt >= maxAttempts) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
// Exponential backoff
|
|
29
|
+
const delay = retry.backoffMs * Math.pow(2, attempt - 1);
|
|
30
|
+
Logger.warn(`Retrying command after ${delay}ms (attempt ${attempt + 1}/${maxAttempts})`);
|
|
31
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
32
|
+
}
|
|
33
|
+
// This should never be reached
|
|
34
|
+
throw new Error('Unexpected retry loop exit');
|
|
35
|
+
}
|
|
36
|
+
async function executeOnce(command, args, { onProgress, timeoutMs, maxOutputBytes }) {
|
|
37
|
+
return new Promise(resolve => {
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
Logger.commandExecution(command, args, startTime);
|
|
40
|
+
const childProcess = spawn(command, args, {
|
|
41
|
+
env: process.env,
|
|
42
|
+
// cross-spawn automatically handles shell mode and .cmd extensions on Windows
|
|
43
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
44
|
+
});
|
|
45
|
+
const stdoutChunks = [];
|
|
46
|
+
const stderrChunks = [];
|
|
47
|
+
let totalStdoutBytes = 0;
|
|
48
|
+
let isResolved = false;
|
|
49
|
+
let outputExceeded = false;
|
|
50
|
+
// Set up timeout with SIGKILL fallback
|
|
51
|
+
const timeoutId = setTimeout(() => {
|
|
52
|
+
if (!isResolved) {
|
|
53
|
+
childProcess.kill('SIGTERM');
|
|
54
|
+
Logger.warn(`Process timeout after ${timeoutMs}ms, sending SIGTERM`);
|
|
55
|
+
// Give process 5 seconds to terminate gracefully
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
if (!isResolved) {
|
|
58
|
+
childProcess.kill('SIGKILL');
|
|
59
|
+
Logger.error(`Process did not terminate, sending SIGKILL`);
|
|
60
|
+
}
|
|
61
|
+
}, 5000);
|
|
62
|
+
}
|
|
63
|
+
}, timeoutMs || 600000);
|
|
64
|
+
childProcess.stdout?.on('data', (data) => {
|
|
65
|
+
// Check output size limit
|
|
66
|
+
if (maxOutputBytes && totalStdoutBytes + data.length > maxOutputBytes) {
|
|
67
|
+
if (!outputExceeded) {
|
|
68
|
+
outputExceeded = true;
|
|
69
|
+
Logger.warn(`Output exceeded ${maxOutputBytes} bytes, stopping collection`);
|
|
70
|
+
childProcess.kill('SIGTERM');
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
stdoutChunks.push(data);
|
|
75
|
+
totalStdoutBytes += data.length;
|
|
76
|
+
// Stream progress without buffering
|
|
77
|
+
if (onProgress) {
|
|
78
|
+
onProgress(data.toString('utf8'));
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
// Capture stderr for error reporting
|
|
82
|
+
childProcess.stderr?.on('data', (data) => {
|
|
83
|
+
stderrChunks.push(data);
|
|
84
|
+
});
|
|
85
|
+
childProcess.on('error', error => {
|
|
86
|
+
if (!isResolved) {
|
|
87
|
+
isResolved = true;
|
|
88
|
+
clearTimeout(timeoutId);
|
|
89
|
+
Logger.error(`Process error:`, error);
|
|
90
|
+
// Check for common errors
|
|
91
|
+
const errorMessage = error.message;
|
|
92
|
+
if (error.code === 'ENOENT') {
|
|
93
|
+
// Enhanced Windows diagnostics
|
|
94
|
+
const isWindows = process.platform === 'win32';
|
|
95
|
+
const diagMessage = isWindows
|
|
96
|
+
? `Command '${command}' not found. Windows troubleshooting:\n` +
|
|
97
|
+
`1. Verify installation: Run 'npm list -g ${command}' in cmd\n` +
|
|
98
|
+
`2. Check PATH: Ensure npm global bin is in PATH (typically C:\\Users\\[username]\\AppData\\Roaming\\npm)\n` +
|
|
99
|
+
`3. Restart terminal after installing global packages\n` +
|
|
100
|
+
`4. Try running as Administrator if permission issues occur`
|
|
101
|
+
: `Command '${command}' not found. Is it installed and in PATH?`;
|
|
102
|
+
resolve({
|
|
103
|
+
ok: false,
|
|
104
|
+
code: null,
|
|
105
|
+
stdout: '',
|
|
106
|
+
stderr: diagMessage,
|
|
107
|
+
timedOut: false,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
resolve({
|
|
112
|
+
ok: false,
|
|
113
|
+
code: null,
|
|
114
|
+
stdout: Buffer.concat(stdoutChunks).toString('utf8'),
|
|
115
|
+
stderr: errorMessage,
|
|
116
|
+
timedOut: false,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
childProcess.on('close', (code, signal) => {
|
|
122
|
+
if (!isResolved) {
|
|
123
|
+
isResolved = true;
|
|
124
|
+
clearTimeout(timeoutId);
|
|
125
|
+
const stdout = Buffer.concat(stdoutChunks).toString('utf8');
|
|
126
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8');
|
|
127
|
+
const timedOut = signal === 'SIGTERM' || signal === 'SIGKILL';
|
|
128
|
+
Logger.commandComplete(startTime, code, stdout.length);
|
|
129
|
+
resolve({
|
|
130
|
+
ok: code === 0 && !outputExceeded,
|
|
131
|
+
code,
|
|
132
|
+
signal: signal || undefined,
|
|
133
|
+
stdout: stdout.trim(),
|
|
134
|
+
stderr: stderr.trim(),
|
|
135
|
+
timedOut,
|
|
136
|
+
partialStdout: outputExceeded ? stdout : undefined,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Backward compatible wrapper that returns stdout string
|
|
144
|
+
*/
|
|
145
|
+
export async function executeCommand(command, args, onProgress, timeoutMs = 600000) {
|
|
146
|
+
const result = await executeCommandDetailed(command, args, {
|
|
147
|
+
onProgress,
|
|
148
|
+
timeoutMs,
|
|
149
|
+
});
|
|
150
|
+
if (!result.ok) {
|
|
151
|
+
const errorMessage = result.stderr || 'Unknown error';
|
|
152
|
+
throw new Error(result.timedOut
|
|
153
|
+
? `Command timed out after ${timeoutMs}ms`
|
|
154
|
+
: `Command failed with exit code ${result.code}: ${errorMessage}`);
|
|
155
|
+
}
|
|
156
|
+
return result.stdout;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=commandExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandExecutor.js","sourceRoot":"","sources":["../../src/utils/commandExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export declare class Logger {
|
|
3
|
+
private static currentLevel;
|
|
4
|
+
static setLevel(level: LoggingLevel): void;
|
|
5
|
+
static getLevel(): LoggingLevel;
|
|
6
|
+
private static shouldLog;
|
|
7
|
+
private static formatMessage;
|
|
8
|
+
private static emit;
|
|
9
|
+
static log(message: string, ...args: any[]): void;
|
|
10
|
+
static warn(message: string, ...args: any[]): void;
|
|
11
|
+
static error(message: string, ...args: any[]): void;
|
|
12
|
+
static debug(message: string, ...args: any[]): void;
|
|
13
|
+
static toolInvocation(toolName: string, args: any): void;
|
|
14
|
+
static toolParsedArgs(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean): void;
|
|
15
|
+
static commandExecution(command: string, args: string[], startTime: number): void;
|
|
16
|
+
private static _commandStartTimes;
|
|
17
|
+
static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
|
|
18
|
+
static codexResponse(response: string, tokensUsed?: number): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAyBvE,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,YAAY,CAA2B;IAEtD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAI1C,MAAM,CAAC,QAAQ,IAAI,YAAY;IAI/B,OAAO,CAAC,MAAM,CAAC,SAAS;IAIxB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,OAAO,CAAC,MAAM,CAAC,IAAI;IAOnB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CACnB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,OAAO,GACnB,IAAI;IAIP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAQjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAG7B;IAEJ,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAW/F,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;CAMlE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { LOG_PREFIX } from '../constants.js';
|
|
2
|
+
const LEVEL_ORDER = {
|
|
3
|
+
debug: 0,
|
|
4
|
+
info: 1,
|
|
5
|
+
notice: 2,
|
|
6
|
+
warning: 3,
|
|
7
|
+
error: 4,
|
|
8
|
+
critical: 5,
|
|
9
|
+
alert: 6,
|
|
10
|
+
emergency: 7,
|
|
11
|
+
};
|
|
12
|
+
const LEVEL_CONSOLE_METHOD = {
|
|
13
|
+
debug: 'log',
|
|
14
|
+
info: 'log',
|
|
15
|
+
notice: 'log',
|
|
16
|
+
warning: 'warn',
|
|
17
|
+
error: 'error',
|
|
18
|
+
critical: 'error',
|
|
19
|
+
alert: 'error',
|
|
20
|
+
emergency: 'error',
|
|
21
|
+
};
|
|
22
|
+
export class Logger {
|
|
23
|
+
static currentLevel = 'warning';
|
|
24
|
+
static setLevel(level) {
|
|
25
|
+
this.currentLevel = level;
|
|
26
|
+
}
|
|
27
|
+
static getLevel() {
|
|
28
|
+
return this.currentLevel;
|
|
29
|
+
}
|
|
30
|
+
static shouldLog(level) {
|
|
31
|
+
return LEVEL_ORDER[level] >= LEVEL_ORDER[this.currentLevel];
|
|
32
|
+
}
|
|
33
|
+
static formatMessage(level, message) {
|
|
34
|
+
return `${LOG_PREFIX} [${level.toUpperCase()}] ${message}`;
|
|
35
|
+
}
|
|
36
|
+
static emit(level, message, ...args) {
|
|
37
|
+
if (!this.shouldLog(level))
|
|
38
|
+
return;
|
|
39
|
+
const consoleMethod = LEVEL_CONSOLE_METHOD[level];
|
|
40
|
+
console[consoleMethod](this.formatMessage(level, message), ...args);
|
|
41
|
+
}
|
|
42
|
+
static log(message, ...args) {
|
|
43
|
+
this.emit('info', message, ...args);
|
|
44
|
+
}
|
|
45
|
+
static warn(message, ...args) {
|
|
46
|
+
this.emit('warning', message, ...args);
|
|
47
|
+
}
|
|
48
|
+
static error(message, ...args) {
|
|
49
|
+
this.emit('error', message, ...args);
|
|
50
|
+
}
|
|
51
|
+
static debug(message, ...args) {
|
|
52
|
+
this.emit('debug', message, ...args);
|
|
53
|
+
}
|
|
54
|
+
static toolInvocation(toolName, args) {
|
|
55
|
+
this.debug(`Raw args for tool '${toolName}':`, JSON.stringify(args, null, 2));
|
|
56
|
+
}
|
|
57
|
+
static toolParsedArgs(prompt, model, sandbox, changeMode) {
|
|
58
|
+
this.debug(`Parsed prompt: "${prompt}"\nchangeMode: ${changeMode || false}`);
|
|
59
|
+
}
|
|
60
|
+
static commandExecution(command, args, startTime) {
|
|
61
|
+
this.warn(`[${startTime}] Starting: ${command} ${args.map(arg => `"${arg}"`).join(' ')}`);
|
|
62
|
+
// Store command execution start for timing analysis
|
|
63
|
+
this._commandStartTimes.set(startTime, { command, args, startTime });
|
|
64
|
+
}
|
|
65
|
+
// Track command start times for duration calculation
|
|
66
|
+
static _commandStartTimes = new Map();
|
|
67
|
+
static commandComplete(startTime, exitCode, outputLength) {
|
|
68
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
69
|
+
this.warn(`[${elapsed}s] Process finished with exit code: ${exitCode}`);
|
|
70
|
+
if (outputLength !== undefined) {
|
|
71
|
+
this.warn(`Response: ${outputLength} chars`);
|
|
72
|
+
}
|
|
73
|
+
// Clean up command tracking
|
|
74
|
+
this._commandStartTimes.delete(startTime);
|
|
75
|
+
}
|
|
76
|
+
static codexResponse(response, tokensUsed) {
|
|
77
|
+
this.debug(`Codex response: ${response.substring(0, 200)}...`);
|
|
78
|
+
if (tokensUsed) {
|
|
79
|
+
this.debug(`Tokens used: ${tokensUsed}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface CodexOutput {
|
|
2
|
+
metadata: {
|
|
3
|
+
version?: string;
|
|
4
|
+
workdir?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
provider?: string;
|
|
7
|
+
approval?: string;
|
|
8
|
+
sandbox?: string;
|
|
9
|
+
reasoning_effort?: string;
|
|
10
|
+
reasoning_summaries?: string;
|
|
11
|
+
[key: string]: string | undefined;
|
|
12
|
+
};
|
|
13
|
+
userInstructions: string;
|
|
14
|
+
thinking?: string;
|
|
15
|
+
response: string;
|
|
16
|
+
tokensUsed?: number;
|
|
17
|
+
timestamps: string[];
|
|
18
|
+
rawOutput: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseCodexOutput(rawOutput: string): CodexOutput;
|
|
21
|
+
export declare function formatCodexResponse(output: CodexOutput, includeThinking?: boolean, includeMetadata?: boolean): string;
|
|
22
|
+
export declare function formatCodexResponseForMCP(result: string, includeThinking?: boolean, includeMetadata?: boolean): string;
|
|
23
|
+
export declare function extractCodeBlocks(text: string): string[];
|
|
24
|
+
export declare function extractDiffBlocks(text: string): string[];
|
|
25
|
+
export declare function isErrorResponse(output: CodexOutput | string): boolean;
|
|
26
|
+
//# sourceMappingURL=outputParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputParser.d.ts","sourceRoot":"","sources":["../../src/utils/outputParser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAqG/D;AAiBD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,eAAe,GAAE,OAAc,EAC/B,eAAe,GAAE,OAAc,GAC9B,MAAM,CA8BR;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,OAAc,EAC/B,eAAe,GAAE,OAAc,GAC9B,MAAM,CASR;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,CAgBrE"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
export function parseCodexOutput(rawOutput) {
|
|
3
|
+
const lines = rawOutput.split('\n');
|
|
4
|
+
const timestamps = [];
|
|
5
|
+
let metadata = {};
|
|
6
|
+
let userInstructions = '';
|
|
7
|
+
let thinking = '';
|
|
8
|
+
let response = '';
|
|
9
|
+
let tokensUsed;
|
|
10
|
+
let currentSection = 'header';
|
|
11
|
+
let metadataLines = [];
|
|
12
|
+
let thinkingLines = [];
|
|
13
|
+
let responseLines = [];
|
|
14
|
+
for (let i = 0; i < lines.length; i++) {
|
|
15
|
+
const line = lines[i];
|
|
16
|
+
// Extract timestamps
|
|
17
|
+
const timestampMatch = line.match(/^\[([^\]]+)\]/);
|
|
18
|
+
if (timestampMatch) {
|
|
19
|
+
timestamps.push(timestampMatch[1]);
|
|
20
|
+
}
|
|
21
|
+
// Extract tokens used
|
|
22
|
+
const tokensMatch = line.match(/tokens used:\s*(\d+)/);
|
|
23
|
+
if (tokensMatch) {
|
|
24
|
+
tokensUsed = parseInt(tokensMatch[1], 10);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Identify sections
|
|
28
|
+
if (line.includes('OpenAI Codex') || line.includes('Codex CLI')) {
|
|
29
|
+
currentSection = 'header';
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
else if (line.startsWith('--------')) {
|
|
33
|
+
if (currentSection === 'header') {
|
|
34
|
+
currentSection = 'metadata';
|
|
35
|
+
}
|
|
36
|
+
else if (currentSection === 'metadata') {
|
|
37
|
+
currentSection = 'content';
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
else if (line.includes('User instructions:')) {
|
|
42
|
+
currentSection = 'userInstructions';
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
else if (line.includes('thinking')) {
|
|
46
|
+
currentSection = 'thinking';
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
else if (line.includes('codex') || line.includes('assistant')) {
|
|
50
|
+
currentSection = 'response';
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Parse based on current section
|
|
54
|
+
switch (currentSection) {
|
|
55
|
+
case 'metadata':
|
|
56
|
+
if (line.trim()) {
|
|
57
|
+
metadataLines.push(line.trim());
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case 'userInstructions':
|
|
61
|
+
if (line.trim() && !line.includes('User instructions:')) {
|
|
62
|
+
userInstructions += line + '\n';
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 'thinking':
|
|
66
|
+
if (line.trim() && !line.includes('thinking')) {
|
|
67
|
+
thinkingLines.push(line);
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
case 'response':
|
|
71
|
+
case 'content':
|
|
72
|
+
if (line.trim() &&
|
|
73
|
+
!line.includes('codex') &&
|
|
74
|
+
!line.includes('assistant') &&
|
|
75
|
+
!line.includes('tokens used:')) {
|
|
76
|
+
responseLines.push(line);
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Parse metadata
|
|
82
|
+
metadata = parseMetadata(metadataLines);
|
|
83
|
+
thinking = thinkingLines.join('\n').trim();
|
|
84
|
+
response = responseLines.join('\n').trim() || rawOutput; // Fallback to raw output if no response found
|
|
85
|
+
userInstructions = userInstructions.trim();
|
|
86
|
+
const output = {
|
|
87
|
+
metadata,
|
|
88
|
+
userInstructions,
|
|
89
|
+
thinking: thinking || undefined,
|
|
90
|
+
response,
|
|
91
|
+
tokensUsed,
|
|
92
|
+
timestamps,
|
|
93
|
+
rawOutput,
|
|
94
|
+
};
|
|
95
|
+
Logger.codexResponse(response, tokensUsed);
|
|
96
|
+
return output;
|
|
97
|
+
}
|
|
98
|
+
function parseMetadata(metadataLines) {
|
|
99
|
+
const metadata = {};
|
|
100
|
+
for (const line of metadataLines) {
|
|
101
|
+
const colonIndex = line.indexOf(':');
|
|
102
|
+
if (colonIndex > 0) {
|
|
103
|
+
const key = line.substring(0, colonIndex).trim().toLowerCase().replace(/\s+/g, '_');
|
|
104
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
105
|
+
metadata[key] = value;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return metadata;
|
|
109
|
+
}
|
|
110
|
+
export function formatCodexResponse(output, includeThinking = true, includeMetadata = true) {
|
|
111
|
+
let formatted = '';
|
|
112
|
+
// Add metadata summary if requested
|
|
113
|
+
if (includeMetadata && (output.metadata.model || output.metadata.sandbox)) {
|
|
114
|
+
formatted += `**Codex Configuration:**\n`;
|
|
115
|
+
if (output.metadata.model)
|
|
116
|
+
formatted += `- Model: ${output.metadata.model}\n`;
|
|
117
|
+
if (output.metadata.sandbox)
|
|
118
|
+
formatted += `- Sandbox: ${output.metadata.sandbox}\n`;
|
|
119
|
+
if (output.metadata.approval)
|
|
120
|
+
formatted += `- Approval: ${output.metadata.approval}\n`;
|
|
121
|
+
formatted += '\n';
|
|
122
|
+
}
|
|
123
|
+
// Add thinking section if requested and available
|
|
124
|
+
if (includeThinking && output.thinking) {
|
|
125
|
+
formatted += `**Reasoning:**\n`;
|
|
126
|
+
formatted += output.thinking + '\n\n';
|
|
127
|
+
}
|
|
128
|
+
// Add main response
|
|
129
|
+
if (includeMetadata || includeThinking) {
|
|
130
|
+
formatted += `**Response:**\n`;
|
|
131
|
+
}
|
|
132
|
+
formatted += output.response;
|
|
133
|
+
// Add token usage if available
|
|
134
|
+
if (output.tokensUsed) {
|
|
135
|
+
formatted += `\n\n*Tokens used: ${output.tokensUsed}*`;
|
|
136
|
+
}
|
|
137
|
+
return formatted;
|
|
138
|
+
}
|
|
139
|
+
export function formatCodexResponseForMCP(result, includeThinking = true, includeMetadata = true) {
|
|
140
|
+
// Try to parse the output first
|
|
141
|
+
try {
|
|
142
|
+
const parsed = parseCodexOutput(result);
|
|
143
|
+
return formatCodexResponse(parsed, includeThinking, includeMetadata);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// If parsing fails, return the raw output
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function extractCodeBlocks(text) {
|
|
151
|
+
const codeBlockRegex = /```[\s\S]*?```/g;
|
|
152
|
+
const matches = text.match(codeBlockRegex);
|
|
153
|
+
return matches || [];
|
|
154
|
+
}
|
|
155
|
+
export function extractDiffBlocks(text) {
|
|
156
|
+
const diffRegex = /```diff[\s\S]*?```/g;
|
|
157
|
+
const matches = text.match(diffRegex);
|
|
158
|
+
return matches || [];
|
|
159
|
+
}
|
|
160
|
+
export function isErrorResponse(output) {
|
|
161
|
+
const errorKeywords = [
|
|
162
|
+
'error',
|
|
163
|
+
'failed',
|
|
164
|
+
'unable',
|
|
165
|
+
'cannot',
|
|
166
|
+
'authentication',
|
|
167
|
+
'permission denied',
|
|
168
|
+
'rate limit',
|
|
169
|
+
'quota exceeded',
|
|
170
|
+
];
|
|
171
|
+
const responseText = typeof output === 'string' ? output.toLowerCase() : output.response.toLowerCase();
|
|
172
|
+
return errorKeywords.some(keyword => responseText.includes(keyword));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=outputParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputParser.js","sourceRoot":"","sources":["../../src/utils/outputParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ReviewFinding {
|
|
2
|
+
title: string;
|
|
3
|
+
body: string;
|
|
4
|
+
confidence_score: number;
|
|
5
|
+
priority?: number;
|
|
6
|
+
code_location?: {
|
|
7
|
+
absolute_file_path: string;
|
|
8
|
+
line_range: {
|
|
9
|
+
start: number;
|
|
10
|
+
end: number;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface ReviewOutput {
|
|
15
|
+
findings: ReviewFinding[];
|
|
16
|
+
overall_correctness: 'patch is correct' | 'patch is incorrect';
|
|
17
|
+
overall_explanation: string;
|
|
18
|
+
overall_confidence_score: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse review output from Codex response
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseReviewOutput(response: string): ReviewOutput | null;
|
|
24
|
+
/**
|
|
25
|
+
* Format review findings for display
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatReviewFindings(review: ReviewOutput): string;
|
|
28
|
+
//# sourceMappingURL=reviewParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewParser.d.ts","sourceRoot":"","sources":["../../src/utils/reviewParser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE;QACd,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE;YACV,KAAK,EAAE,MAAM,CAAC;YACd,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,mBAAmB,EAAE,kBAAkB,GAAG,oBAAoB,CAAC;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAwBvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA6CjE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse review output from Codex response
|
|
4
|
+
*/
|
|
5
|
+
export function parseReviewOutput(response) {
|
|
6
|
+
try {
|
|
7
|
+
// Try to extract JSON from the response
|
|
8
|
+
// Look for JSON object pattern
|
|
9
|
+
const jsonMatch = response.match(/\{[\s\S]*"findings"[\s\S]*\}/);
|
|
10
|
+
if (!jsonMatch) {
|
|
11
|
+
Logger.warn('No JSON review output found in response');
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const reviewData = JSON.parse(jsonMatch[0]);
|
|
15
|
+
// Validate structure
|
|
16
|
+
if (!Array.isArray(reviewData.findings)) {
|
|
17
|
+
Logger.warn('Invalid review output structure: missing findings array');
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return reviewData;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
Logger.error('Failed to parse review output:', error);
|
|
24
|
+
Logger.debug('Raw response:', response.substring(0, 500));
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Format review findings for display
|
|
30
|
+
*/
|
|
31
|
+
export function formatReviewFindings(review) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
// Overall verdict
|
|
34
|
+
const verdict = review.overall_correctness === 'patch is correct' ? '✅' : '❌';
|
|
35
|
+
lines.push(`## Review Result: ${verdict} ${review.overall_correctness.toUpperCase()}`);
|
|
36
|
+
lines.push('');
|
|
37
|
+
lines.push(`**Overall Assessment:** ${review.overall_explanation}`);
|
|
38
|
+
lines.push(`**Confidence:** ${(review.overall_confidence_score * 100).toFixed(0)}%`);
|
|
39
|
+
lines.push('');
|
|
40
|
+
// Findings
|
|
41
|
+
if (review.findings.length === 0) {
|
|
42
|
+
lines.push('### No Issues Found');
|
|
43
|
+
lines.push('The code changes look good with no issues detected.');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
lines.push(`### Issues Found (${review.findings.length})`);
|
|
47
|
+
lines.push('');
|
|
48
|
+
// Sort findings by priority
|
|
49
|
+
const sortedFindings = [...review.findings].sort((a, b) => {
|
|
50
|
+
const priorityA = a.priority ?? 999;
|
|
51
|
+
const priorityB = b.priority ?? 999;
|
|
52
|
+
return priorityA - priorityB;
|
|
53
|
+
});
|
|
54
|
+
sortedFindings.forEach((finding, index) => {
|
|
55
|
+
const priorityTag = getPriorityTag(finding.priority);
|
|
56
|
+
const confidence = `(${(finding.confidence_score * 100).toFixed(0)}% confidence)`;
|
|
57
|
+
lines.push(`#### ${index + 1}. ${priorityTag} ${finding.title} ${confidence}`);
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(finding.body);
|
|
60
|
+
if (finding.code_location) {
|
|
61
|
+
const location = `📍 \`${finding.code_location.absolute_file_path}:${finding.code_location.line_range.start}-${finding.code_location.line_range.end}\``;
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push(location);
|
|
64
|
+
}
|
|
65
|
+
lines.push('');
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return lines.join('\n');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get priority tag for display
|
|
72
|
+
*/
|
|
73
|
+
function getPriorityTag(priority) {
|
|
74
|
+
switch (priority) {
|
|
75
|
+
case 0:
|
|
76
|
+
return '[P0 🔴]'; // Blocking
|
|
77
|
+
case 1:
|
|
78
|
+
return '[P1 🟠]'; // Urgent
|
|
79
|
+
case 2:
|
|
80
|
+
return '[P2 🟡]'; // Normal
|
|
81
|
+
case 3:
|
|
82
|
+
return '[P3 🔵]'; // Low
|
|
83
|
+
default:
|
|
84
|
+
return '';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=reviewParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewParser.js","sourceRoot":"","sources":["../../src/utils/reviewParser.ts"],"names":[],"mappings":"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"}
|