@trishchuk/codex-mcp-tool 1.0.6 → 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/README.md +92 -16
- package/dist/constants.d.ts +64 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +85 -31
- package/dist/constants.js.map +1 -1
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/apply-diff.tool.d.ts +3 -0
- package/dist/tools/apply-diff.tool.d.ts.map +1 -0
- package/dist/tools/apply-diff.tool.js +52 -0
- package/dist/tools/apply-diff.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -1
- package/dist/tools/ask-codex.tool.js +171 -33
- package/dist/tools/ask-codex.tool.js.map +1 -1
- 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 +134 -0
- package/dist/tools/batch-codex.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -1
- package/dist/tools/brainstorm.tool.js +62 -29
- package/dist/tools/brainstorm.tool.js.map +1 -1
- package/dist/tools/exec-codex.tool.d.ts +3 -0
- package/dist/tools/exec-codex.tool.d.ts.map +1 -0
- package/dist/tools/exec-codex.tool.js +46 -0
- package/dist/tools/exec-codex.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -1
- package/dist/tools/fetch-chunk.tool.js +12 -8
- package/dist/tools/fetch-chunk.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +3 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +9 -5
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/review-codex.tool.d.ts +3 -0
- package/dist/tools/review-codex.tool.d.ts.map +1 -0
- package/dist/tools/review-codex.tool.js +91 -0
- package/dist/tools/review-codex.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +1 -0
- package/dist/tools/simple-tools.d.ts.map +1 -1
- package/dist/tools/simple-tools.js +42 -11
- package/dist/tools/simple-tools.js.map +1 -1
- package/dist/tools/test-tool.example.d.ts.map +1 -1
- package/dist/tools/test-tool.example.js +12 -10
- package/dist/tools/test-tool.example.js.map +1 -1
- package/dist/tools/timeout-test.tool.js +5 -5
- package/dist/tools/timeout-test.tool.js.map +1 -1
- package/dist/utils/changeModeChunker.d.ts.map +1 -1
- package/dist/utils/changeModeChunker.js +10 -6
- package/dist/utils/changeModeChunker.js.map +1 -1
- package/dist/utils/changeModeParser.d.ts.map +1 -1
- package/dist/utils/changeModeParser.js.map +1 -1
- package/dist/utils/changeModeRunner.d.ts.map +1 -1
- package/dist/utils/changeModeRunner.js +17 -11
- package/dist/utils/changeModeRunner.js.map +1 -1
- package/dist/utils/changeModeTranslator.d.ts.map +1 -1
- package/dist/utils/changeModeTranslator.js +5 -2
- package/dist/utils/changeModeTranslator.js.map +1 -1
- package/dist/utils/chunkCache.d.ts.map +1 -1
- package/dist/utils/chunkCache.js +6 -4
- package/dist/utils/chunkCache.js.map +1 -1
- package/dist/utils/codexCommandBuilder.d.ts +80 -0
- package/dist/utils/codexCommandBuilder.d.ts.map +1 -0
- package/dist/utils/codexCommandBuilder.js +259 -0
- package/dist/utils/codexCommandBuilder.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +19 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -1
- package/dist/utils/codexExecutor.js +49 -57
- package/dist/utils/codexExecutor.js.map +1 -1
- package/dist/utils/commandExecutor.d.ts.map +1 -1
- package/dist/utils/commandExecutor.js +25 -17
- package/dist/utils/commandExecutor.js.map +1 -1
- package/dist/utils/fibonacci.d.ts +2 -0
- package/dist/utils/fibonacci.d.ts.map +1 -0
- package/dist/utils/fibonacci.js +17 -0
- package/dist/utils/fibonacci.js.map +1 -0
- package/dist/utils/gitHelper.d.ts +20 -0
- package/dist/utils/gitHelper.d.ts.map +1 -0
- package/dist/utils/gitHelper.js +66 -0
- package/dist/utils/gitHelper.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +21 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/modelDetection.d.ts +45 -0
- package/dist/utils/modelDetection.d.ts.map +1 -0
- package/dist/utils/modelDetection.js +148 -0
- package/dist/utils/modelDetection.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/versionDetection.d.ts +108 -0
- package/dist/utils/versionDetection.d.ts.map +1 -0
- package/dist/utils/versionDetection.js +160 -0
- package/dist/utils/versionDetection.js.map +1 -0
- package/dist/utils/workingDirResolver.d.ts +52 -0
- package/dist/utils/workingDirResolver.d.ts.map +1 -0
- package/dist/utils/workingDirResolver.js +217 -0
- package/dist/utils/workingDirResolver.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function fibonacci(n) {
|
|
2
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
3
|
+
throw new Error('fibonacci expects a non-negative integer');
|
|
4
|
+
}
|
|
5
|
+
if (n <= 1) {
|
|
6
|
+
return n;
|
|
7
|
+
}
|
|
8
|
+
let prev = 0;
|
|
9
|
+
let curr = 1;
|
|
10
|
+
for (let i = 2; i <= n; i += 1) {
|
|
11
|
+
const next = prev + curr;
|
|
12
|
+
prev = curr;
|
|
13
|
+
curr = next;
|
|
14
|
+
}
|
|
15
|
+
return curr;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fibonacci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fibonacci.js","sourceRoot":"","sources":["../../src/utils/fibonacci.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface GitChanges {
|
|
2
|
+
diff: string;
|
|
3
|
+
stagedDiff: string;
|
|
4
|
+
untrackedFiles: string[];
|
|
5
|
+
modifiedFiles: string[];
|
|
6
|
+
hasChanges: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get comprehensive git changes for review
|
|
10
|
+
*/
|
|
11
|
+
export declare function getGitChanges(): Promise<GitChanges>;
|
|
12
|
+
/**
|
|
13
|
+
* Format git changes for review prompt
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatChangesForReview(changes: GitChanges): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get git status summary
|
|
18
|
+
*/
|
|
19
|
+
export declare function getGitStatus(): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=gitHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitHelper.d.ts","sourceRoot":"","sources":["../../src/utils/gitHelper.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CA+BzD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAoBlE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAQpD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get comprehensive git changes for review
|
|
5
|
+
*/
|
|
6
|
+
export async function getGitChanges() {
|
|
7
|
+
try {
|
|
8
|
+
// Get unstaged changes
|
|
9
|
+
const diffResult = await executeCommand('git', ['diff', 'HEAD']);
|
|
10
|
+
const diff = diffResult.trim();
|
|
11
|
+
// Get staged changes
|
|
12
|
+
const stagedResult = await executeCommand('git', ['diff', '--cached']);
|
|
13
|
+
const stagedDiff = stagedResult.trim();
|
|
14
|
+
// Get list of modified files
|
|
15
|
+
const modifiedResult = await executeCommand('git', ['diff', '--name-only', 'HEAD']);
|
|
16
|
+
const modifiedFiles = modifiedResult.trim().split('\n').filter(Boolean);
|
|
17
|
+
// Get list of untracked files
|
|
18
|
+
const untrackedResult = await executeCommand('git', ['ls-files', '--others', '--exclude-standard']);
|
|
19
|
+
const untrackedFiles = untrackedResult.trim().split('\n').filter(Boolean);
|
|
20
|
+
const hasChanges = diff.length > 0 || stagedDiff.length > 0 || untrackedFiles.length > 0;
|
|
21
|
+
return {
|
|
22
|
+
diff,
|
|
23
|
+
stagedDiff,
|
|
24
|
+
untrackedFiles,
|
|
25
|
+
modifiedFiles,
|
|
26
|
+
hasChanges
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
Logger.error('Failed to get git changes:', error);
|
|
31
|
+
throw new Error(`Failed to get git changes: ${error}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Format git changes for review prompt
|
|
36
|
+
*/
|
|
37
|
+
export function formatChangesForReview(changes) {
|
|
38
|
+
const sections = [];
|
|
39
|
+
if (changes.diff) {
|
|
40
|
+
sections.push('## Unstaged Changes\n```diff\n' + changes.diff + '\n```');
|
|
41
|
+
}
|
|
42
|
+
if (changes.stagedDiff) {
|
|
43
|
+
sections.push('## Staged Changes\n```diff\n' + changes.stagedDiff + '\n```');
|
|
44
|
+
}
|
|
45
|
+
if (changes.untrackedFiles.length > 0) {
|
|
46
|
+
sections.push('## Untracked Files\n' + changes.untrackedFiles.map(f => `- ${f}`).join('\n'));
|
|
47
|
+
}
|
|
48
|
+
if (sections.length === 0) {
|
|
49
|
+
return 'No changes detected in the repository.';
|
|
50
|
+
}
|
|
51
|
+
return sections.join('\n\n');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get git status summary
|
|
55
|
+
*/
|
|
56
|
+
export async function getGitStatus() {
|
|
57
|
+
try {
|
|
58
|
+
const result = await executeCommand('git', ['status', '--short']);
|
|
59
|
+
return result.trim();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
Logger.error('Failed to get git status:', error);
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=gitHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitHelper.js","sourceRoot":"","sources":["../../src/utils/gitHelper.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LoggingLevel } from
|
|
1
|
+
import type { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
export declare class Logger {
|
|
3
3
|
private static currentLevel;
|
|
4
4
|
static setLevel(level: LoggingLevel): void;
|
|
@@ -15,5 +15,6 @@ export declare class Logger {
|
|
|
15
15
|
static commandExecution(command: string, args: string[], startTime: number): void;
|
|
16
16
|
private static _commandStartTimes;
|
|
17
17
|
static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
|
|
18
|
+
static codexResponse(response: string, tokensUsed?: number): void;
|
|
18
19
|
}
|
|
19
20
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LOG_PREFIX } from
|
|
1
|
+
import { LOG_PREFIX } from '../constants.js';
|
|
2
2
|
const LEVEL_ORDER = {
|
|
3
3
|
debug: 0,
|
|
4
4
|
info: 1,
|
|
@@ -10,17 +10,17 @@ const LEVEL_ORDER = {
|
|
|
10
10
|
emergency: 7,
|
|
11
11
|
};
|
|
12
12
|
const LEVEL_CONSOLE_METHOD = {
|
|
13
|
-
debug:
|
|
14
|
-
info:
|
|
15
|
-
notice:
|
|
16
|
-
warning:
|
|
17
|
-
error:
|
|
18
|
-
critical:
|
|
19
|
-
alert:
|
|
20
|
-
emergency:
|
|
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
21
|
};
|
|
22
22
|
export class Logger {
|
|
23
|
-
static currentLevel =
|
|
23
|
+
static currentLevel = 'warning';
|
|
24
24
|
static setLevel(level) {
|
|
25
25
|
this.currentLevel = level;
|
|
26
26
|
}
|
|
@@ -40,16 +40,16 @@ export class Logger {
|
|
|
40
40
|
console[consoleMethod](this.formatMessage(level, message), ...args);
|
|
41
41
|
}
|
|
42
42
|
static log(message, ...args) {
|
|
43
|
-
this.emit(
|
|
43
|
+
this.emit('info', message, ...args);
|
|
44
44
|
}
|
|
45
45
|
static warn(message, ...args) {
|
|
46
|
-
this.emit(
|
|
46
|
+
this.emit('warning', message, ...args);
|
|
47
47
|
}
|
|
48
48
|
static error(message, ...args) {
|
|
49
|
-
this.emit(
|
|
49
|
+
this.emit('error', message, ...args);
|
|
50
50
|
}
|
|
51
51
|
static debug(message, ...args) {
|
|
52
|
-
this.emit(
|
|
52
|
+
this.emit('debug', message, ...args);
|
|
53
53
|
}
|
|
54
54
|
static toolInvocation(toolName, args) {
|
|
55
55
|
this.debug(`Raw args for tool '${toolName}':`, JSON.stringify(args, null, 2));
|
|
@@ -58,7 +58,7 @@ export class Logger {
|
|
|
58
58
|
this.debug(`Parsed prompt: "${prompt}"\nchangeMode: ${changeMode || false}`);
|
|
59
59
|
}
|
|
60
60
|
static commandExecution(command, args, startTime) {
|
|
61
|
-
this.warn(`[${startTime}] Starting: ${command} ${args.map(
|
|
61
|
+
this.warn(`[${startTime}] Starting: ${command} ${args.map(arg => `"${arg}"`).join(' ')}`);
|
|
62
62
|
// Store command execution start for timing analysis
|
|
63
63
|
this._commandStartTimes.set(startTime, { command, args, startTime });
|
|
64
64
|
}
|
|
@@ -73,5 +73,11 @@ export class Logger {
|
|
|
73
73
|
// Clean up command tracking
|
|
74
74
|
this._commandStartTimes.delete(startTime);
|
|
75
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
|
+
}
|
|
76
82
|
}
|
|
77
83
|
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model availability detection and fallback chain
|
|
3
|
+
* Ensures compatibility with different Codex CLI versions and user access levels
|
|
4
|
+
*/
|
|
5
|
+
export interface ModelInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
available: boolean;
|
|
8
|
+
isDefault: boolean;
|
|
9
|
+
priority: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a specific model is available via Codex CLI
|
|
13
|
+
*
|
|
14
|
+
* This function performs a real availability check by attempting to execute
|
|
15
|
+
* a minimal test prompt with the specified model. Results are cached for 5 minutes
|
|
16
|
+
* to reduce unnecessary CLI calls.
|
|
17
|
+
*
|
|
18
|
+
* @param modelName Model identifier to check (e.g., 'gpt-5.1-codex-max')
|
|
19
|
+
* @param bypassCache If true, ignores cache and forces fresh check
|
|
20
|
+
* @returns Promise<boolean> True if model is available and working
|
|
21
|
+
*/
|
|
22
|
+
export declare function isModelAvailable(modelName: string, bypassCache?: boolean): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Get the best available default model using fallback chain
|
|
25
|
+
* @returns Promise<string> The best available model name
|
|
26
|
+
*/
|
|
27
|
+
export declare function getDefaultModel(): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate if a user-specified model name is valid
|
|
30
|
+
* @param modelName User-provided model name
|
|
31
|
+
* @returns boolean True if model name exists in MODELS constant
|
|
32
|
+
*/
|
|
33
|
+
export declare function isValidModel(modelName: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get model name with fallback to default
|
|
36
|
+
* @param requestedModel User-requested model (optional)
|
|
37
|
+
* @returns Promise<string> Model name to use
|
|
38
|
+
*/
|
|
39
|
+
export declare function getModelWithFallback(requestedModel?: string): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Get all available models (for future use in model listing)
|
|
42
|
+
* @returns Promise<string[]> Array of available model names
|
|
43
|
+
*/
|
|
44
|
+
export declare function getAvailableModels(): Promise<string[]>;
|
|
45
|
+
//# sourceMappingURL=modelDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelDetection.d.ts","sourceRoot":"","sources":["../../src/utils/modelDetection.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsBD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,OAAO,CAAC,CAwDlB;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBvD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBnF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB5D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { MODELS } from '../constants.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { executeCommand } from './commandExecutor.js';
|
|
4
|
+
const modelAvailabilityCache = new Map();
|
|
5
|
+
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
6
|
+
/**
|
|
7
|
+
* Priority-ordered fallback chain for default model selection
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_MODEL_FALLBACK = [
|
|
10
|
+
MODELS.GPT5_1_CODEX_MAX, // Highest priority: Latest frontier model
|
|
11
|
+
MODELS.GPT5_CODEX, // Fallback: Previous default
|
|
12
|
+
MODELS.GPT5, // Ultimate fallback: Base GPT-5
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Check if a specific model is available via Codex CLI
|
|
16
|
+
*
|
|
17
|
+
* This function performs a real availability check by attempting to execute
|
|
18
|
+
* a minimal test prompt with the specified model. Results are cached for 5 minutes
|
|
19
|
+
* to reduce unnecessary CLI calls.
|
|
20
|
+
*
|
|
21
|
+
* @param modelName Model identifier to check (e.g., 'gpt-5.1-codex-max')
|
|
22
|
+
* @param bypassCache If true, ignores cache and forces fresh check
|
|
23
|
+
* @returns Promise<boolean> True if model is available and working
|
|
24
|
+
*/
|
|
25
|
+
export async function isModelAvailable(modelName, bypassCache = false) {
|
|
26
|
+
// Check cache first (unless bypassed)
|
|
27
|
+
if (!bypassCache) {
|
|
28
|
+
const cached = modelAvailabilityCache.get(modelName);
|
|
29
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
|
|
30
|
+
Logger.debug(`Using cached availability for model ${modelName}: ${cached.available}`);
|
|
31
|
+
return cached.available;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Strategy 1: Try to execute a minimal test prompt with the model
|
|
36
|
+
// This is the most reliable way to check if model is truly available
|
|
37
|
+
Logger.debug(`Testing model availability: ${modelName}`);
|
|
38
|
+
try {
|
|
39
|
+
// Attempt a very quick test with the model (5 second timeout)
|
|
40
|
+
await executeCommand('codex', ['exec', '-m', modelName, 'echo test'], undefined, 5000);
|
|
41
|
+
Logger.debug(`Model ${modelName} is available (test execution succeeded)`);
|
|
42
|
+
// Cache positive result
|
|
43
|
+
modelAvailabilityCache.set(modelName, {
|
|
44
|
+
available: true,
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
});
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (testError) {
|
|
50
|
+
// If test execution failed, check if Codex CLI itself is working
|
|
51
|
+
Logger.debug(`Model test failed for ${modelName}, checking Codex CLI availability`);
|
|
52
|
+
// Strategy 2: Fallback - check if Codex CLI is installed at all
|
|
53
|
+
await executeCommand('codex', ['--version'], undefined, 3000);
|
|
54
|
+
// If we reach here, Codex CLI works but model might not be available
|
|
55
|
+
// This could mean: model doesn't exist, user doesn't have access, or model name is wrong
|
|
56
|
+
Logger.warn(`Model ${modelName} test execution failed but Codex CLI is working. Model may not be available or accessible.`);
|
|
57
|
+
// Cache negative result (shorter TTL for potentially transient failures)
|
|
58
|
+
modelAvailabilityCache.set(modelName, {
|
|
59
|
+
available: false,
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
});
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Complete failure - Codex CLI is not working at all
|
|
67
|
+
Logger.warn(`Codex CLI availability check failed for ${modelName}:`, error);
|
|
68
|
+
// Don't cache complete CLI failures as they might be transient
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the best available default model using fallback chain
|
|
74
|
+
* @returns Promise<string> The best available model name
|
|
75
|
+
*/
|
|
76
|
+
export async function getDefaultModel() {
|
|
77
|
+
Logger.log('Detecting best available default model...');
|
|
78
|
+
// Try each model in priority order
|
|
79
|
+
for (const modelName of DEFAULT_MODEL_FALLBACK) {
|
|
80
|
+
try {
|
|
81
|
+
const available = await isModelAvailable(modelName);
|
|
82
|
+
if (available) {
|
|
83
|
+
Logger.log(`Selected default model: ${modelName}`);
|
|
84
|
+
return modelName;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
Logger.warn(`Failed to check model ${modelName}:`, error);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Ultimate fallback if all checks fail
|
|
93
|
+
Logger.warn(`All default models unavailable, falling back to ${MODELS.GPT5_CODEX}`);
|
|
94
|
+
return MODELS.GPT5_CODEX;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Validate if a user-specified model name is valid
|
|
98
|
+
* @param modelName User-provided model name
|
|
99
|
+
* @returns boolean True if model name exists in MODELS constant
|
|
100
|
+
*/
|
|
101
|
+
export function isValidModel(modelName) {
|
|
102
|
+
const validModels = Object.values(MODELS);
|
|
103
|
+
return validModels.includes(modelName);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get model name with fallback to default
|
|
107
|
+
* @param requestedModel User-requested model (optional)
|
|
108
|
+
* @returns Promise<string> Model name to use
|
|
109
|
+
*/
|
|
110
|
+
export async function getModelWithFallback(requestedModel) {
|
|
111
|
+
// If no model requested, use default
|
|
112
|
+
if (!requestedModel) {
|
|
113
|
+
return await getDefaultModel();
|
|
114
|
+
}
|
|
115
|
+
// Validate requested model
|
|
116
|
+
if (!isValidModel(requestedModel)) {
|
|
117
|
+
Logger.warn(`Invalid model "${requestedModel}", falling back to default`);
|
|
118
|
+
return await getDefaultModel();
|
|
119
|
+
}
|
|
120
|
+
// Check if requested model is available
|
|
121
|
+
const available = await isModelAvailable(requestedModel);
|
|
122
|
+
if (!available) {
|
|
123
|
+
Logger.warn(`Model "${requestedModel}" not available, falling back to default`);
|
|
124
|
+
return await getDefaultModel();
|
|
125
|
+
}
|
|
126
|
+
return requestedModel;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get all available models (for future use in model listing)
|
|
130
|
+
* @returns Promise<string[]> Array of available model names
|
|
131
|
+
*/
|
|
132
|
+
export async function getAvailableModels() {
|
|
133
|
+
const availableModels = [];
|
|
134
|
+
for (const modelName of Object.values(MODELS)) {
|
|
135
|
+
try {
|
|
136
|
+
const available = await isModelAvailable(modelName);
|
|
137
|
+
if (available) {
|
|
138
|
+
availableModels.push(modelName);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
// Skip unavailable models
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return availableModels;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=modelDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelDetection.js","sourceRoot":"","sources":["../../src/utils/modelDetection.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
|