@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.
Files changed (106) hide show
  1. package/README.md +92 -16
  2. package/dist/constants.d.ts +64 -2
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +85 -31
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.js +28 -26
  7. package/dist/index.js.map +1 -1
  8. package/dist/tools/apply-diff.tool.d.ts +3 -0
  9. package/dist/tools/apply-diff.tool.d.ts.map +1 -0
  10. package/dist/tools/apply-diff.tool.js +52 -0
  11. package/dist/tools/apply-diff.tool.js.map +1 -0
  12. package/dist/tools/ask-codex.tool.d.ts.map +1 -1
  13. package/dist/tools/ask-codex.tool.js +171 -33
  14. package/dist/tools/ask-codex.tool.js.map +1 -1
  15. package/dist/tools/batch-codex.tool.d.ts +3 -0
  16. package/dist/tools/batch-codex.tool.d.ts.map +1 -0
  17. package/dist/tools/batch-codex.tool.js +134 -0
  18. package/dist/tools/batch-codex.tool.js.map +1 -0
  19. package/dist/tools/brainstorm.tool.d.ts.map +1 -1
  20. package/dist/tools/brainstorm.tool.js +62 -29
  21. package/dist/tools/brainstorm.tool.js.map +1 -1
  22. package/dist/tools/exec-codex.tool.d.ts +3 -0
  23. package/dist/tools/exec-codex.tool.d.ts.map +1 -0
  24. package/dist/tools/exec-codex.tool.js +46 -0
  25. package/dist/tools/exec-codex.tool.js.map +1 -0
  26. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -1
  27. package/dist/tools/fetch-chunk.tool.js +12 -8
  28. package/dist/tools/fetch-chunk.tool.js.map +1 -1
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +4 -2
  31. package/dist/tools/index.js.map +1 -1
  32. package/dist/tools/registry.d.ts +3 -3
  33. package/dist/tools/registry.d.ts.map +1 -1
  34. package/dist/tools/registry.js +9 -5
  35. package/dist/tools/registry.js.map +1 -1
  36. package/dist/tools/review-codex.tool.d.ts +3 -0
  37. package/dist/tools/review-codex.tool.d.ts.map +1 -0
  38. package/dist/tools/review-codex.tool.js +91 -0
  39. package/dist/tools/review-codex.tool.js.map +1 -0
  40. package/dist/tools/simple-tools.d.ts +1 -0
  41. package/dist/tools/simple-tools.d.ts.map +1 -1
  42. package/dist/tools/simple-tools.js +42 -11
  43. package/dist/tools/simple-tools.js.map +1 -1
  44. package/dist/tools/test-tool.example.d.ts.map +1 -1
  45. package/dist/tools/test-tool.example.js +12 -10
  46. package/dist/tools/test-tool.example.js.map +1 -1
  47. package/dist/tools/timeout-test.tool.js +5 -5
  48. package/dist/tools/timeout-test.tool.js.map +1 -1
  49. package/dist/utils/changeModeChunker.d.ts.map +1 -1
  50. package/dist/utils/changeModeChunker.js +10 -6
  51. package/dist/utils/changeModeChunker.js.map +1 -1
  52. package/dist/utils/changeModeParser.d.ts.map +1 -1
  53. package/dist/utils/changeModeParser.js.map +1 -1
  54. package/dist/utils/changeModeRunner.d.ts.map +1 -1
  55. package/dist/utils/changeModeRunner.js +17 -11
  56. package/dist/utils/changeModeRunner.js.map +1 -1
  57. package/dist/utils/changeModeTranslator.d.ts.map +1 -1
  58. package/dist/utils/changeModeTranslator.js +5 -2
  59. package/dist/utils/changeModeTranslator.js.map +1 -1
  60. package/dist/utils/chunkCache.d.ts.map +1 -1
  61. package/dist/utils/chunkCache.js +6 -4
  62. package/dist/utils/chunkCache.js.map +1 -1
  63. package/dist/utils/codexCommandBuilder.d.ts +80 -0
  64. package/dist/utils/codexCommandBuilder.d.ts.map +1 -0
  65. package/dist/utils/codexCommandBuilder.js +259 -0
  66. package/dist/utils/codexCommandBuilder.js.map +1 -0
  67. package/dist/utils/codexExecutor.d.ts +19 -0
  68. package/dist/utils/codexExecutor.d.ts.map +1 -1
  69. package/dist/utils/codexExecutor.js +49 -57
  70. package/dist/utils/codexExecutor.js.map +1 -1
  71. package/dist/utils/commandExecutor.d.ts.map +1 -1
  72. package/dist/utils/commandExecutor.js +25 -17
  73. package/dist/utils/commandExecutor.js.map +1 -1
  74. package/dist/utils/fibonacci.d.ts +2 -0
  75. package/dist/utils/fibonacci.d.ts.map +1 -0
  76. package/dist/utils/fibonacci.js +17 -0
  77. package/dist/utils/fibonacci.js.map +1 -0
  78. package/dist/utils/gitHelper.d.ts +20 -0
  79. package/dist/utils/gitHelper.d.ts.map +1 -0
  80. package/dist/utils/gitHelper.js +66 -0
  81. package/dist/utils/gitHelper.js.map +1 -0
  82. package/dist/utils/logger.d.ts +2 -1
  83. package/dist/utils/logger.d.ts.map +1 -1
  84. package/dist/utils/logger.js +21 -15
  85. package/dist/utils/logger.js.map +1 -1
  86. package/dist/utils/modelDetection.d.ts +45 -0
  87. package/dist/utils/modelDetection.d.ts.map +1 -0
  88. package/dist/utils/modelDetection.js +148 -0
  89. package/dist/utils/modelDetection.js.map +1 -0
  90. package/dist/utils/outputParser.d.ts +26 -0
  91. package/dist/utils/outputParser.d.ts.map +1 -0
  92. package/dist/utils/outputParser.js +174 -0
  93. package/dist/utils/outputParser.js.map +1 -0
  94. package/dist/utils/reviewParser.d.ts +28 -0
  95. package/dist/utils/reviewParser.d.ts.map +1 -0
  96. package/dist/utils/reviewParser.js +87 -0
  97. package/dist/utils/reviewParser.js.map +1 -0
  98. package/dist/utils/versionDetection.d.ts +108 -0
  99. package/dist/utils/versionDetection.d.ts.map +1 -0
  100. package/dist/utils/versionDetection.js +160 -0
  101. package/dist/utils/versionDetection.js.map +1 -0
  102. package/dist/utils/workingDirResolver.d.ts +52 -0
  103. package/dist/utils/workingDirResolver.d.ts.map +1 -0
  104. package/dist/utils/workingDirResolver.js +217 -0
  105. package/dist/utils/workingDirResolver.js.map +1 -0
  106. 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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"}
@@ -1,4 +1,4 @@
1
- import type { LoggingLevel } from "@modelcontextprotocol/sdk/types.js";
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,EAAC,YAAY,EAAC,MAAM,oCAAoC,CAAC;AAyBrE,qBAAa,MAAM;IACf,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,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAUjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6E;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAUlG"}
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"}
@@ -1,4 +1,4 @@
1
- import { LOG_PREFIX } from "../constants.js";
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: "log",
14
- info: "log",
15
- notice: "log",
16
- warning: "warn",
17
- error: "error",
18
- critical: "error",
19
- alert: "error",
20
- emergency: "error",
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 = "warning";
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("info", message, ...args);
43
+ this.emit('info', message, ...args);
44
44
  }
45
45
  static warn(message, ...args) {
46
- this.emit("warning", message, ...args);
46
+ this.emit('warning', message, ...args);
47
47
  }
48
48
  static error(message, ...args) {
49
- this.emit("error", message, ...args);
49
+ this.emit('error', message, ...args);
50
50
  }
51
51
  static debug(message, ...args) {
52
- this.emit("debug", message, ...args);
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((arg) => `"${arg}"`).join(" ")}`);
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
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
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