@trishchuk/codex-mcp-tool 1.2.0 → 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 +83 -6
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tools/ask-codex.tool.d.ts.map +1 -1
- package/dist/tools/ask-codex.tool.js +16 -3
- package/dist/tools/ask-codex.tool.js.map +1 -1
- package/dist/tools/index.js +2 -4
- package/dist/tools/index.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 +2 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -1
- package/dist/utils/codexExecutor.js +12 -179
- package/dist/utils/codexExecutor.js.map +1 -1
- package/dist/utils/commandExecutor.js +3 -3
- package/dist/utils/commandExecutor.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/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 +13 -8
- package/dist/utils/workingDirResolver.d.ts.map +1 -1
- package/dist/utils/workingDirResolver.js +44 -26
- package/dist/utils/workingDirResolver.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { CLI } from '../constants.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { resolveWorkingDirectory } from './workingDirResolver.js';
|
|
4
|
+
import { getModelWithFallback } from './modelDetection.js';
|
|
5
|
+
import { supportsNativeSearch, supportsAddDir, supportsToolTokenLimit, } from './versionDetection.js';
|
|
6
|
+
import { writeFileSync, unlinkSync } from 'fs';
|
|
7
|
+
import { tmpdir } from 'os';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { randomBytes } from 'crypto';
|
|
10
|
+
/**
|
|
11
|
+
* Builder class for constructing Codex CLI commands
|
|
12
|
+
* Eliminates code duplication between executeCodexCLI and executeCodex
|
|
13
|
+
*/
|
|
14
|
+
export class CodexCommandBuilder {
|
|
15
|
+
args = [];
|
|
16
|
+
/**
|
|
17
|
+
* Build a complete Codex CLI command with all options
|
|
18
|
+
* @param prompt User prompt
|
|
19
|
+
* @param options Command options
|
|
20
|
+
* @returns Build result with args, temp file, and final prompt
|
|
21
|
+
*/
|
|
22
|
+
async build(prompt, options) {
|
|
23
|
+
this.args = []; // Reset args for fresh build
|
|
24
|
+
// 1. Validation
|
|
25
|
+
this.validateOptions(options);
|
|
26
|
+
// 2. Model selection with fallback
|
|
27
|
+
await this.addModelArg(options?.model);
|
|
28
|
+
// 3. Safety controls (yolo, fullAuto, approval, sandbox)
|
|
29
|
+
this.addSafetyArgs(options);
|
|
30
|
+
// 4. Working directory
|
|
31
|
+
this.addWorkingDir(options, prompt);
|
|
32
|
+
// 5. OSS mode
|
|
33
|
+
if (options?.oss) {
|
|
34
|
+
this.args.push(CLI.FLAGS.OSS);
|
|
35
|
+
}
|
|
36
|
+
// 6. Search + Feature flags (shared 69-line logic)
|
|
37
|
+
await this.addSearchAndFeatures(options);
|
|
38
|
+
// 7. Disable features
|
|
39
|
+
if (options?.disableFeatures && Array.isArray(options.disableFeatures)) {
|
|
40
|
+
for (const feature of options.disableFeatures) {
|
|
41
|
+
this.args.push(CLI.FLAGS.DISABLE, feature);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 8. Advanced features (addDirs + tokenLimit)
|
|
45
|
+
await this.addAdvancedFeatures(options);
|
|
46
|
+
// 9. Configuration
|
|
47
|
+
if (options?.config) {
|
|
48
|
+
if (typeof options.config === 'string') {
|
|
49
|
+
this.args.push(CLI.FLAGS.CONFIG, options.config);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const configStr = Object.entries(options.config)
|
|
53
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
54
|
+
.join(',');
|
|
55
|
+
this.args.push(CLI.FLAGS.CONFIG, configStr);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// 10. Profile
|
|
59
|
+
if (options?.profile) {
|
|
60
|
+
this.args.push(CLI.FLAGS.PROFILE, options.profile);
|
|
61
|
+
}
|
|
62
|
+
// 11. Images
|
|
63
|
+
if (options?.image) {
|
|
64
|
+
const images = Array.isArray(options.image) ? options.image : [options.image];
|
|
65
|
+
for (const img of images) {
|
|
66
|
+
this.args.push(CLI.FLAGS.IMAGE, img);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 12. Exec mode
|
|
70
|
+
if (options?.useExec !== false) {
|
|
71
|
+
this.args.push('exec');
|
|
72
|
+
}
|
|
73
|
+
// 13. Handle prompt (concise mode, stdin for large prompts)
|
|
74
|
+
return this.handlePrompt(prompt, options);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate options for conflicts
|
|
78
|
+
*/
|
|
79
|
+
validateOptions(options) {
|
|
80
|
+
if (options?.approvalPolicy && options?.yolo) {
|
|
81
|
+
throw new Error('Cannot use both yolo and approvalPolicy');
|
|
82
|
+
}
|
|
83
|
+
if (options?.sandboxMode && options?.yolo) {
|
|
84
|
+
throw new Error('Cannot use both yolo and sandboxMode');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Add model argument with fallback chain
|
|
89
|
+
*/
|
|
90
|
+
async addModelArg(model) {
|
|
91
|
+
const selectedModel = await getModelWithFallback(model);
|
|
92
|
+
this.args.push(CLI.FLAGS.MODEL, selectedModel);
|
|
93
|
+
if (model && model !== selectedModel) {
|
|
94
|
+
Logger.warn(`Requested model '${model}' not available, using fallback: '${selectedModel}'`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
Logger.debug(`Using model: ${selectedModel}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Add safety control arguments (yolo, fullAuto, approval, sandbox)
|
|
102
|
+
*/
|
|
103
|
+
addSafetyArgs(options) {
|
|
104
|
+
if (options?.yolo) {
|
|
105
|
+
this.args.push(CLI.FLAGS.YOLO);
|
|
106
|
+
}
|
|
107
|
+
else if (options?.fullAuto) {
|
|
108
|
+
this.args.push(CLI.FLAGS.FULL_AUTO);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Approval policy
|
|
112
|
+
if (options?.approvalPolicy) {
|
|
113
|
+
this.args.push(CLI.FLAGS.ASK_FOR_APPROVAL, options.approvalPolicy);
|
|
114
|
+
}
|
|
115
|
+
else if (options?.approval) {
|
|
116
|
+
this.args.push(CLI.FLAGS.APPROVAL, options.approval);
|
|
117
|
+
}
|
|
118
|
+
// Sandbox mode
|
|
119
|
+
if (options?.sandboxMode) {
|
|
120
|
+
this.args.push(CLI.FLAGS.SANDBOX_MODE, options.sandboxMode);
|
|
121
|
+
}
|
|
122
|
+
else if (options?.search || options?.oss) {
|
|
123
|
+
// Auto-enable workspace-write for search/oss if no sandbox specified
|
|
124
|
+
Logger.debug('Search/OSS enabled: auto-setting sandbox to workspace-write for network access');
|
|
125
|
+
this.args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Add working directory argument
|
|
131
|
+
*/
|
|
132
|
+
addWorkingDir(options, prompt) {
|
|
133
|
+
const resolvedWorkingDir = resolveWorkingDirectory({
|
|
134
|
+
workingDir: options?.workingDir || options?.cd,
|
|
135
|
+
prompt: prompt,
|
|
136
|
+
});
|
|
137
|
+
if (resolvedWorkingDir) {
|
|
138
|
+
// Use appropriate flag based on mode
|
|
139
|
+
const flag = options?.cd !== undefined ? CLI.FLAGS.CD : CLI.FLAGS.WORKING_DIR;
|
|
140
|
+
this.args.push(flag, resolvedWorkingDir);
|
|
141
|
+
Logger.debug(`Resolved working directory: ${resolvedWorkingDir}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Add search and feature flags (shared 69-line logic from both functions)
|
|
146
|
+
*/
|
|
147
|
+
async addSearchAndFeatures(options) {
|
|
148
|
+
// Web Search - Dual-flag approach for backward compatibility (v1.3.0+)
|
|
149
|
+
if (options?.search) {
|
|
150
|
+
// Check if native --search flag is supported (Codex CLI v0.52.0+)
|
|
151
|
+
const hasNativeSearch = await supportsNativeSearch();
|
|
152
|
+
if (hasNativeSearch) {
|
|
153
|
+
// Use native --search flag for newer versions
|
|
154
|
+
this.args.push(CLI.FLAGS.SEARCH);
|
|
155
|
+
Logger.debug('Using native --search flag (Codex CLI v0.52.0+)');
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
Logger.debug('Native --search flag not supported, falling back to web_search_request feature flag');
|
|
159
|
+
}
|
|
160
|
+
// Always add feature flag for backward compatibility
|
|
161
|
+
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
162
|
+
if (!enableFeatures.includes('web_search_request')) {
|
|
163
|
+
enableFeatures.push('web_search_request');
|
|
164
|
+
}
|
|
165
|
+
// Add all features to args
|
|
166
|
+
for (const feature of enableFeatures) {
|
|
167
|
+
this.args.push(CLI.FLAGS.ENABLE, feature);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Normal feature flag handling when search is not enabled
|
|
172
|
+
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
173
|
+
for (const feature of enableFeatures) {
|
|
174
|
+
this.args.push(CLI.FLAGS.ENABLE, feature);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Add advanced features (addDirs, toolOutputTokenLimit)
|
|
180
|
+
*/
|
|
181
|
+
async addAdvancedFeatures(options) {
|
|
182
|
+
// Additional writable directories (v1.3.0+, requires Codex CLI v0.59.0+)
|
|
183
|
+
if (options?.addDirs && Array.isArray(options.addDirs)) {
|
|
184
|
+
const hasAddDir = await supportsAddDir();
|
|
185
|
+
if (hasAddDir) {
|
|
186
|
+
for (const dir of options.addDirs) {
|
|
187
|
+
this.args.push(CLI.FLAGS.ADD_DIR, dir);
|
|
188
|
+
}
|
|
189
|
+
Logger.debug('Using --add-dir flag (Codex CLI v0.59.0+)');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
Logger.warn('Additional directories specified but --add-dir flag not supported (requires Codex CLI v0.59.0+). Ignoring addDirs parameter.');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Tool output token limit (v1.3.0+, requires Codex CLI v0.59.0+)
|
|
196
|
+
if (options?.toolOutputTokenLimit) {
|
|
197
|
+
const hasTokenLimit = await supportsToolTokenLimit();
|
|
198
|
+
if (hasTokenLimit) {
|
|
199
|
+
this.args.push(CLI.FLAGS.CONFIG, `tool_output_token_limit=${options.toolOutputTokenLimit}`);
|
|
200
|
+
Logger.debug('Using tool_output_token_limit config (Codex CLI v0.59.0+)');
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
Logger.warn('Tool output token limit specified but not supported (requires Codex CLI v0.59.0+). Ignoring toolOutputTokenLimit parameter.');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Handle prompt with concise mode and stdin for large prompts
|
|
209
|
+
*/
|
|
210
|
+
handlePrompt(prompt, options) {
|
|
211
|
+
let finalPrompt = prompt;
|
|
212
|
+
let tempFile;
|
|
213
|
+
// Add conciseness instruction if requested
|
|
214
|
+
if (options?.concisePrompt) {
|
|
215
|
+
finalPrompt = `Please provide a focused, concise response without unnecessary elaboration. ${prompt}`;
|
|
216
|
+
}
|
|
217
|
+
// Check if prompt is too long for command line (OS dependent, ~100KB is safe)
|
|
218
|
+
const MAX_COMMAND_LINE_LENGTH = 100000;
|
|
219
|
+
const useStdin = options?.useStdinForLongPrompts !== false && finalPrompt.length > MAX_COMMAND_LINE_LENGTH;
|
|
220
|
+
if (useStdin) {
|
|
221
|
+
// Create temporary file for large prompts
|
|
222
|
+
const tempFileName = `codex-prompt-${randomBytes(8).toString('hex')}.txt`;
|
|
223
|
+
const tempFilePath = join(tmpdir(), tempFileName);
|
|
224
|
+
try {
|
|
225
|
+
writeFileSync(tempFilePath, finalPrompt, 'utf8');
|
|
226
|
+
Logger.debug(`Prompt too long (${finalPrompt.length} chars), using temp file: ${tempFilePath}`);
|
|
227
|
+
// Use stdin redirection via special prompt format
|
|
228
|
+
this.args.push(`@${tempFilePath}`);
|
|
229
|
+
tempFile = tempFilePath;
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
Logger.warn(`Failed to create temp file for large prompt: ${error}. Proceeding with direct prompt.`);
|
|
233
|
+
this.args.push(finalPrompt);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// Normal prompt handling
|
|
238
|
+
this.args.push(finalPrompt);
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
args: this.args,
|
|
242
|
+
tempFile,
|
|
243
|
+
finalPrompt,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Cleanup temporary file if created
|
|
248
|
+
*/
|
|
249
|
+
static cleanupTempFile(tempFile) {
|
|
250
|
+
try {
|
|
251
|
+
unlinkSync(tempFile);
|
|
252
|
+
Logger.debug(`Cleaned up temp file: ${tempFile}`);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
Logger.warn(`Failed to cleanup temp file ${tempFile}:`, error);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=codexCommandBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexCommandBuilder.js","sourceRoot":"","sources":["../../src/utils/codexCommandBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,8 @@ export interface CodexExecOptions {
|
|
|
32
32
|
readonly oss?: boolean;
|
|
33
33
|
readonly enableFeatures?: string[];
|
|
34
34
|
readonly disableFeatures?: string[];
|
|
35
|
+
readonly addDirs?: string[];
|
|
36
|
+
readonly toolOutputTokenLimit?: number;
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
39
|
* Execute Codex CLI with enhanced error handling and memory efficiency
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"codexExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAM5E,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,SAAS,eAAe;IACxB,SAAS,eAAe;IACxB,SAAS,cAAc;CACxB;AAED,oBAAY,WAAW;IACrB,QAAQ,cAAc;IACtB,cAAc,oBAAoB;IAClC,gBAAgB,uBAAuB;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,EAC1B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EACnD,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAgDjB"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { executeCommandDetailed } from './commandExecutor.js';
|
|
2
2
|
import { Logger } from './logger.js';
|
|
3
3
|
import { CLI } from '../constants.js';
|
|
4
|
-
import {
|
|
5
|
-
import { tmpdir } from 'os';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
import { randomBytes } from 'crypto';
|
|
8
|
-
import { resolveWorkingDirectory } from './workingDirResolver.js';
|
|
4
|
+
import { CodexCommandBuilder } from './codexCommandBuilder.js';
|
|
9
5
|
// Type-safe enums
|
|
10
6
|
export var ApprovalPolicy;
|
|
11
7
|
(function (ApprovalPolicy) {
|
|
@@ -24,87 +20,13 @@ export var SandboxMode;
|
|
|
24
20
|
* Execute Codex CLI with enhanced error handling and memory efficiency
|
|
25
21
|
*/
|
|
26
22
|
export async function executeCodexCLI(prompt, options, onProgress) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (options?.sandboxMode && options?.yolo) {
|
|
33
|
-
throw new Error('Cannot use both yolo and sandboxMode');
|
|
34
|
-
}
|
|
35
|
-
// Build command arguments
|
|
36
|
-
if (options?.yolo) {
|
|
37
|
-
args.push(CLI.FLAGS.YOLO);
|
|
38
|
-
}
|
|
39
|
-
else if (options?.fullAuto) {
|
|
40
|
-
args.push(CLI.FLAGS.FULL_AUTO);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
if (options?.approvalPolicy) {
|
|
44
|
-
args.push(CLI.FLAGS.ASK_FOR_APPROVAL, options.approvalPolicy);
|
|
45
|
-
}
|
|
46
|
-
// Note: --search requires network access, so if search is enabled and no explicit sandbox mode
|
|
47
|
-
// is set, we need to ensure network is not blocked
|
|
48
|
-
if (options?.sandboxMode) {
|
|
49
|
-
args.push(CLI.FLAGS.SANDBOX_MODE, options.sandboxMode);
|
|
50
|
-
}
|
|
51
|
-
else if (options?.search || options?.oss) {
|
|
52
|
-
// Auto-enable workspace-write for search/oss if no sandbox specified
|
|
53
|
-
Logger.debug('Search/OSS enabled: auto-setting sandbox to workspace-write for network access');
|
|
54
|
-
args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (options?.model) {
|
|
58
|
-
args.push(CLI.FLAGS.MODEL, options.model);
|
|
59
|
-
}
|
|
60
|
-
// Resolve working directory using intelligent fallback chain
|
|
61
|
-
const resolvedWorkingDir = resolveWorkingDirectory({
|
|
62
|
-
workingDir: options?.cd,
|
|
63
|
-
prompt: prompt,
|
|
23
|
+
const builder = new CodexCommandBuilder();
|
|
24
|
+
const { args, tempFile } = await builder.build(prompt, {
|
|
25
|
+
...options,
|
|
26
|
+
concisePrompt: true,
|
|
27
|
+
useStdinForLongPrompts: options?.useStdinForLongPrompts !== false,
|
|
64
28
|
});
|
|
65
|
-
if (resolvedWorkingDir) {
|
|
66
|
-
args.push(CLI.FLAGS.CD, resolvedWorkingDir);
|
|
67
|
-
Logger.debug(`Resolved working directory: ${resolvedWorkingDir}`);
|
|
68
|
-
}
|
|
69
|
-
// OSS (Ollama) mode
|
|
70
|
-
if (options?.oss) {
|
|
71
|
-
args.push(CLI.FLAGS.OSS);
|
|
72
|
-
}
|
|
73
|
-
// Enable features (including web search)
|
|
74
|
-
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
75
|
-
// Add web_search_request feature if search is requested
|
|
76
|
-
if (options?.search && !enableFeatures.includes('web_search_request')) {
|
|
77
|
-
enableFeatures.push('web_search_request');
|
|
78
|
-
}
|
|
79
|
-
// Add all features to args
|
|
80
|
-
for (const feature of enableFeatures) {
|
|
81
|
-
args.push(CLI.FLAGS.ENABLE, feature);
|
|
82
|
-
}
|
|
83
|
-
// Disable features
|
|
84
|
-
if (options?.disableFeatures && Array.isArray(options.disableFeatures)) {
|
|
85
|
-
for (const feature of options.disableFeatures) {
|
|
86
|
-
args.push(CLI.FLAGS.DISABLE, feature);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// Non-interactive run
|
|
90
|
-
args.push('exec');
|
|
91
|
-
// Add conciseness instruction
|
|
92
|
-
const concisePrompt = `Please provide a focused, concise response without unnecessary elaboration. ${prompt}`;
|
|
93
|
-
// Check if prompt is too long for command line (OS dependent, ~100KB is safe)
|
|
94
|
-
const promptSizeBytes = Buffer.byteLength(concisePrompt, 'utf8');
|
|
95
|
-
const useStdin = options?.useStdinForLongPrompts !== false && promptSizeBytes > 100 * 1024;
|
|
96
|
-
let tempFile;
|
|
97
29
|
try {
|
|
98
|
-
if (useStdin) {
|
|
99
|
-
// Write prompt to temp file and pass via stdin redirect
|
|
100
|
-
tempFile = join(tmpdir(), `codex-prompt-${randomBytes(8).toString('hex')}.txt`);
|
|
101
|
-
writeFileSync(tempFile, concisePrompt, 'utf8');
|
|
102
|
-
args.push(`< ${tempFile}`);
|
|
103
|
-
Logger.debug(`Using temp file for large prompt (${promptSizeBytes} bytes)`);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
args.push(concisePrompt);
|
|
107
|
-
}
|
|
108
30
|
// Use detailed execution for better error handling
|
|
109
31
|
const result = await executeCommandDetailed(CLI.COMMANDS.CODEX, args, {
|
|
110
32
|
onProgress,
|
|
@@ -132,12 +54,7 @@ export async function executeCodexCLI(prompt, options, onProgress) {
|
|
|
132
54
|
finally {
|
|
133
55
|
// Clean up temp file
|
|
134
56
|
if (tempFile) {
|
|
135
|
-
|
|
136
|
-
unlinkSync(tempFile);
|
|
137
|
-
}
|
|
138
|
-
catch (e) {
|
|
139
|
-
Logger.debug('Failed to delete temp file:', e);
|
|
140
|
-
}
|
|
57
|
+
CodexCommandBuilder.cleanupTempFile(tempFile);
|
|
141
58
|
}
|
|
142
59
|
}
|
|
143
60
|
}
|
|
@@ -145,96 +62,12 @@ export async function executeCodexCLI(prompt, options, onProgress) {
|
|
|
145
62
|
* High-level executeCodex function with comprehensive options support
|
|
146
63
|
*/
|
|
147
64
|
export async function executeCodex(prompt, options, onProgress) {
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// Safety controls
|
|
154
|
-
if (options?.yolo) {
|
|
155
|
-
args.push(CLI.FLAGS.YOLO);
|
|
156
|
-
}
|
|
157
|
-
else if (options?.fullAuto) {
|
|
158
|
-
args.push(CLI.FLAGS.FULL_AUTO);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
// Approval policy
|
|
162
|
-
if (options?.approval || options?.approvalPolicy) {
|
|
163
|
-
const approvalValue = options.approval || options.approvalPolicy;
|
|
164
|
-
if (approvalValue) {
|
|
165
|
-
args.push(CLI.FLAGS.APPROVAL, approvalValue);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
// Sandbox mode
|
|
169
|
-
if (options?.sandboxMode) {
|
|
170
|
-
args.push(CLI.FLAGS.SANDBOX_MODE, options.sandboxMode);
|
|
171
|
-
}
|
|
172
|
-
else if (options?.search || options?.oss) {
|
|
173
|
-
// Auto-enable workspace-write for search/oss if no sandbox specified
|
|
174
|
-
Logger.debug('Search/OSS enabled: auto-setting sandbox to workspace-write for network access');
|
|
175
|
-
args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
// Resolve working directory using intelligent fallback chain
|
|
179
|
-
const resolvedWorkingDir = resolveWorkingDirectory({
|
|
180
|
-
workingDir: options?.workingDir || options?.cd,
|
|
181
|
-
prompt: prompt,
|
|
65
|
+
const builder = new CodexCommandBuilder();
|
|
66
|
+
const { args } = await builder.build(prompt, {
|
|
67
|
+
...options,
|
|
68
|
+
concisePrompt: false,
|
|
69
|
+
useStdinForLongPrompts: false,
|
|
182
70
|
});
|
|
183
|
-
if (resolvedWorkingDir) {
|
|
184
|
-
args.push(CLI.FLAGS.WORKING_DIR, resolvedWorkingDir);
|
|
185
|
-
Logger.debug(`Resolved working directory for executeCodex: ${resolvedWorkingDir}`);
|
|
186
|
-
}
|
|
187
|
-
// Configuration
|
|
188
|
-
if (options?.config) {
|
|
189
|
-
if (typeof options.config === 'string') {
|
|
190
|
-
args.push(CLI.FLAGS.CONFIG, options.config);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
// Convert object to key=value pairs
|
|
194
|
-
const configStr = Object.entries(options.config)
|
|
195
|
-
.map(([k, v]) => `${k}=${v}`)
|
|
196
|
-
.join(',');
|
|
197
|
-
args.push(CLI.FLAGS.CONFIG, configStr);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// Profile
|
|
201
|
-
if (options?.profile) {
|
|
202
|
-
args.push(CLI.FLAGS.PROFILE, options.profile);
|
|
203
|
-
}
|
|
204
|
-
// Images
|
|
205
|
-
if (options?.image) {
|
|
206
|
-
const images = Array.isArray(options.image) ? options.image : [options.image];
|
|
207
|
-
for (const img of images) {
|
|
208
|
-
args.push(CLI.FLAGS.IMAGE, img);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// OSS (Ollama) mode
|
|
212
|
-
if (options?.oss) {
|
|
213
|
-
args.push(CLI.FLAGS.OSS);
|
|
214
|
-
}
|
|
215
|
-
// Enable features (including web search)
|
|
216
|
-
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
217
|
-
// Add web_search_request feature if search is requested
|
|
218
|
-
if (options?.search && !enableFeatures.includes('web_search_request')) {
|
|
219
|
-
enableFeatures.push('web_search_request');
|
|
220
|
-
}
|
|
221
|
-
// Add all features to args
|
|
222
|
-
for (const feature of enableFeatures) {
|
|
223
|
-
args.push(CLI.FLAGS.ENABLE, feature);
|
|
224
|
-
}
|
|
225
|
-
// Disable features
|
|
226
|
-
if (options?.disableFeatures && Array.isArray(options.disableFeatures)) {
|
|
227
|
-
for (const feature of options.disableFeatures) {
|
|
228
|
-
args.push(CLI.FLAGS.DISABLE, feature);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// Use exec mode for non-interactive execution
|
|
232
|
-
if (options?.useExec !== false) {
|
|
233
|
-
// Default to true for non-interactive execution
|
|
234
|
-
args.push('exec');
|
|
235
|
-
}
|
|
236
|
-
// Add the prompt
|
|
237
|
-
args.push(prompt);
|
|
238
71
|
try {
|
|
239
72
|
const timeoutMs = options?.timeout || options?.timeoutMs || 600000; // 10 minutes default
|
|
240
73
|
const result = await executeCommandDetailed(CLI.COMMANDS.CODEX, args, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexExecutor.js","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"codexExecutor.js","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import spawn from 'cross-spawn';
|
|
2
2
|
import { Logger } from './logger.js';
|
|
3
3
|
/**
|
|
4
4
|
* Execute a command with streaming output and structured error handling
|
|
@@ -61,7 +61,7 @@ async function executeOnce(command, args, { onProgress, timeoutMs, maxOutputByte
|
|
|
61
61
|
}, 5000);
|
|
62
62
|
}
|
|
63
63
|
}, timeoutMs || 600000);
|
|
64
|
-
childProcess.stdout
|
|
64
|
+
childProcess.stdout?.on('data', (data) => {
|
|
65
65
|
// Check output size limit
|
|
66
66
|
if (maxOutputBytes && totalStdoutBytes + data.length > maxOutputBytes) {
|
|
67
67
|
if (!outputExceeded) {
|
|
@@ -79,7 +79,7 @@ async function executeOnce(command, args, { onProgress, timeoutMs, maxOutputByte
|
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
81
|
// Capture stderr for error reporting
|
|
82
|
-
childProcess.stderr
|
|
82
|
+
childProcess.stderr?.on('data', (data) => {
|
|
83
83
|
stderrChunks.push(data);
|
|
84
84
|
});
|
|
85
85
|
childProcess.on('error', error => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandExecutor.js","sourceRoot":"","sources":["../../src/utils/commandExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"commandExecutor.js","sourceRoot":"","sources":["../../src/utils/commandExecutor.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"}
|