@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.
Files changed (94) hide show
  1. package/.claude-plugin/marketplace.json +26 -0
  2. package/.claude-plugin/plugin.json +13 -0
  3. package/.mcp.json +8 -0
  4. package/LICENSE +21 -0
  5. package/README.md +450 -0
  6. package/dist/constants.d.ts +165 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +154 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +195 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/ask-codex.tool.d.ts +3 -0
  15. package/dist/tools/ask-codex.tool.d.ts.map +1 -0
  16. package/dist/tools/ask-codex.tool.js +263 -0
  17. package/dist/tools/ask-codex.tool.js.map +1 -0
  18. package/dist/tools/batch-codex.tool.d.ts +3 -0
  19. package/dist/tools/batch-codex.tool.d.ts.map +1 -0
  20. package/dist/tools/batch-codex.tool.js +140 -0
  21. package/dist/tools/batch-codex.tool.js.map +1 -0
  22. package/dist/tools/brainstorm.tool.d.ts +3 -0
  23. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  24. package/dist/tools/brainstorm.tool.js +171 -0
  25. package/dist/tools/brainstorm.tool.js.map +1 -0
  26. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  27. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  28. package/dist/tools/fetch-chunk.tool.js +66 -0
  29. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  30. package/dist/tools/index.d.ts +2 -0
  31. package/dist/tools/index.d.ts.map +1 -0
  32. package/dist/tools/index.js +14 -0
  33. package/dist/tools/index.js.map +1 -0
  34. package/dist/tools/registry.d.ts +25 -0
  35. package/dist/tools/registry.d.ts.map +1 -0
  36. package/dist/tools/registry.js +84 -0
  37. package/dist/tools/registry.js.map +1 -0
  38. package/dist/tools/simple-tools.d.ts +5 -0
  39. package/dist/tools/simple-tools.d.ts.map +1 -0
  40. package/dist/tools/simple-tools.js +64 -0
  41. package/dist/tools/simple-tools.js.map +1 -0
  42. package/dist/tools/test-tool.example.d.ts +13 -0
  43. package/dist/tools/test-tool.example.d.ts.map +1 -0
  44. package/dist/tools/test-tool.example.js +34 -0
  45. package/dist/tools/test-tool.example.js.map +1 -0
  46. package/dist/tools/timeout-test.tool.d.ts +3 -0
  47. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  48. package/dist/tools/timeout-test.tool.js +32 -0
  49. package/dist/tools/timeout-test.tool.js.map +1 -0
  50. package/dist/utils/changeModeChunker.d.ts +11 -0
  51. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  52. package/dist/utils/changeModeChunker.js +93 -0
  53. package/dist/utils/changeModeChunker.js.map +1 -0
  54. package/dist/utils/changeModeParser.d.ts +15 -0
  55. package/dist/utils/changeModeParser.d.ts.map +1 -0
  56. package/dist/utils/changeModeParser.js +67 -0
  57. package/dist/utils/changeModeParser.js.map +1 -0
  58. package/dist/utils/changeModeRunner.d.ts +11 -0
  59. package/dist/utils/changeModeRunner.d.ts.map +1 -0
  60. package/dist/utils/changeModeRunner.js +133 -0
  61. package/dist/utils/changeModeRunner.js.map +1 -0
  62. package/dist/utils/changeModeTranslator.d.ts +8 -0
  63. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  64. package/dist/utils/changeModeTranslator.js +69 -0
  65. package/dist/utils/changeModeTranslator.js.map +1 -0
  66. package/dist/utils/chunkCache.d.ts +22 -0
  67. package/dist/utils/chunkCache.d.ts.map +1 -0
  68. package/dist/utils/chunkCache.js +163 -0
  69. package/dist/utils/chunkCache.js.map +1 -0
  70. package/dist/utils/codexExecutor.d.ts +47 -0
  71. package/dist/utils/codexExecutor.d.ts.map +1 -0
  72. package/dist/utils/codexExecutor.js +296 -0
  73. package/dist/utils/codexExecutor.js.map +1 -0
  74. package/dist/utils/commandExecutor.d.ts +29 -0
  75. package/dist/utils/commandExecutor.d.ts.map +1 -0
  76. package/dist/utils/commandExecutor.js +158 -0
  77. package/dist/utils/commandExecutor.js.map +1 -0
  78. package/dist/utils/logger.d.ts +20 -0
  79. package/dist/utils/logger.d.ts.map +1 -0
  80. package/dist/utils/logger.js +83 -0
  81. package/dist/utils/logger.js.map +1 -0
  82. package/dist/utils/outputParser.d.ts +26 -0
  83. package/dist/utils/outputParser.d.ts.map +1 -0
  84. package/dist/utils/outputParser.js +174 -0
  85. package/dist/utils/outputParser.js.map +1 -0
  86. package/dist/utils/reviewParser.d.ts +28 -0
  87. package/dist/utils/reviewParser.d.ts.map +1 -0
  88. package/dist/utils/reviewParser.js +87 -0
  89. package/dist/utils/reviewParser.js.map +1 -0
  90. package/dist/utils/workingDirResolver.d.ts +47 -0
  91. package/dist/utils/workingDirResolver.d.ts.map +1 -0
  92. package/dist/utils/workingDirResolver.js +199 -0
  93. package/dist/utils/workingDirResolver.js.map +1 -0
  94. 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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"}