@etheaven/codex-mcp-server 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +26 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +450 -0
- package/dist/constants.d.ts +165 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +154 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +263 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/batch-codex.tool.d.ts +3 -0
- package/dist/tools/batch-codex.tool.d.ts.map +1 -0
- package/dist/tools/batch-codex.tool.js +140 -0
- package/dist/tools/batch-codex.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +171 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +66 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +84 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +5 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +64 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +34 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +93 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeRunner.d.ts +11 -0
- package/dist/utils/changeModeRunner.d.ts.map +1 -0
- package/dist/utils/changeModeRunner.js +133 -0
- package/dist/utils/changeModeRunner.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +69 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +163 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +47 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +296 -0
- package/dist/utils/codexExecutor.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +29 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +158 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +83 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/outputParser.d.ts +26 -0
- package/dist/utils/outputParser.d.ts.map +1 -0
- package/dist/utils/outputParser.js +174 -0
- package/dist/utils/outputParser.js.map +1 -0
- package/dist/utils/reviewParser.d.ts +28 -0
- package/dist/utils/reviewParser.d.ts.map +1 -0
- package/dist/utils/reviewParser.js +87 -0
- package/dist/utils/reviewParser.js.map +1 -0
- package/dist/utils/workingDirResolver.d.ts +47 -0
- package/dist/utils/workingDirResolver.d.ts.map +1 -0
- package/dist/utils/workingDirResolver.js +199 -0
- package/dist/utils/workingDirResolver.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EditChunk } from './changeModeChunker.js';
|
|
2
|
+
/**
|
|
3
|
+
* Caches chunks from a changeMode response
|
|
4
|
+
* @param prompt The original prompt (used for hash generation)
|
|
5
|
+
* @param chunks The parsed and chunked edits
|
|
6
|
+
* @returns A short cache key for retrieval
|
|
7
|
+
*/
|
|
8
|
+
export declare function cacheChunks(prompt: string, chunks: EditChunk[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Retrieves cached chunks if they exist and haven't expired
|
|
11
|
+
* @param cacheKey The cache key returned from cacheChunks
|
|
12
|
+
* @returns The cached chunks or null if expired/not found
|
|
13
|
+
*/
|
|
14
|
+
export declare function getChunks(cacheKey: string): EditChunk[] | null;
|
|
15
|
+
export declare function getCacheStats(): {
|
|
16
|
+
size: number;
|
|
17
|
+
ttl: number;
|
|
18
|
+
maxSize: number;
|
|
19
|
+
cacheDir: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function clearCache(): void;
|
|
22
|
+
//# sourceMappingURL=chunkCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkCache.d.ts","sourceRoot":"","sources":["../../src/utils/chunkCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAsBnD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAwBvE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,CA0B9D;AA+DD,wBAAgB,aAAa,IAAI;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAeA;AAED,wBAAgB,UAAU,IAAI,IAAI,CAgBjC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { Logger } from './logger.js';
|
|
6
|
+
const CACHE_DIR = path.join(os.tmpdir(), 'codex-mcp-chunks');
|
|
7
|
+
const CACHE_TTL = 10 * 60 * 1000;
|
|
8
|
+
const MAX_CACHE_FILES = 50;
|
|
9
|
+
function ensureCacheDir() {
|
|
10
|
+
if (!fs.existsSync(CACHE_DIR)) {
|
|
11
|
+
fs.mkdirSync(CACHE_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Caches chunks from a changeMode response
|
|
16
|
+
* @param prompt The original prompt (used for hash generation)
|
|
17
|
+
* @param chunks The parsed and chunked edits
|
|
18
|
+
* @returns A short cache key for retrieval
|
|
19
|
+
*/
|
|
20
|
+
export function cacheChunks(prompt, chunks) {
|
|
21
|
+
ensureCacheDir();
|
|
22
|
+
cleanExpiredFiles(); // Cleanup on each write
|
|
23
|
+
// Generate deterministic cache key from prompt
|
|
24
|
+
const promptHash = createHash('sha256').update(prompt).digest('hex');
|
|
25
|
+
const cacheKey = promptHash.slice(0, 8);
|
|
26
|
+
const filePath = path.join(CACHE_DIR, `${cacheKey}.json`);
|
|
27
|
+
// Store with metadata
|
|
28
|
+
const cacheData = {
|
|
29
|
+
chunks,
|
|
30
|
+
timestamp: Date.now(),
|
|
31
|
+
promptHash,
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
fs.writeFileSync(filePath, JSON.stringify(cacheData));
|
|
35
|
+
Logger.debug(`Cached ${chunks.length} chunks to file: ${cacheKey}.json`);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
Logger.error(`Failed to cache chunks: ${error}`);
|
|
39
|
+
}
|
|
40
|
+
enforceFileLimits();
|
|
41
|
+
return cacheKey;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Retrieves cached chunks if they exist and haven't expired
|
|
45
|
+
* @param cacheKey The cache key returned from cacheChunks
|
|
46
|
+
* @returns The cached chunks or null if expired/not found
|
|
47
|
+
*/
|
|
48
|
+
export function getChunks(cacheKey) {
|
|
49
|
+
const filePath = path.join(CACHE_DIR, `${cacheKey}.json`);
|
|
50
|
+
try {
|
|
51
|
+
if (!fs.existsSync(filePath)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
55
|
+
const data = JSON.parse(fileContent);
|
|
56
|
+
if (Date.now() - data.timestamp > CACHE_TTL) {
|
|
57
|
+
fs.unlinkSync(filePath);
|
|
58
|
+
Logger.debug(`Cache expired for ${cacheKey}, deleted file`);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
Logger.debug(`Cache hit for ${cacheKey}, returning ${data.chunks.length} chunks`);
|
|
62
|
+
return data.chunks;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
Logger.debug(`Cache read error for ${cacheKey}: ${error}`);
|
|
66
|
+
try {
|
|
67
|
+
fs.unlinkSync(filePath); // Clean up bad file
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function cleanExpiredFiles() {
|
|
74
|
+
try {
|
|
75
|
+
ensureCacheDir();
|
|
76
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
let cleaned = 0;
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
if (!file.endsWith('.json'))
|
|
81
|
+
continue;
|
|
82
|
+
const filePath = path.join(CACHE_DIR, file);
|
|
83
|
+
try {
|
|
84
|
+
const stats = fs.statSync(filePath);
|
|
85
|
+
if (now - stats.mtimeMs > CACHE_TTL) {
|
|
86
|
+
fs.unlinkSync(filePath);
|
|
87
|
+
cleaned++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Individual file error - continue with others
|
|
92
|
+
Logger.debug(`Error checking file ${file}: ${error}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (cleaned > 0) {
|
|
96
|
+
Logger.debug(`Cleaned ${cleaned} expired cache files`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
// Non-critical, just log
|
|
101
|
+
Logger.debug(`Cache cleanup error: ${error}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// maximum file count limit (FIFO) --> LRU?
|
|
105
|
+
function enforceFileLimits() {
|
|
106
|
+
try {
|
|
107
|
+
const files = fs
|
|
108
|
+
.readdirSync(CACHE_DIR)
|
|
109
|
+
.filter(f => f.endsWith('.json'))
|
|
110
|
+
.map(f => ({
|
|
111
|
+
name: f,
|
|
112
|
+
path: path.join(CACHE_DIR, f),
|
|
113
|
+
mtime: fs.statSync(path.join(CACHE_DIR, f)).mtimeMs,
|
|
114
|
+
}))
|
|
115
|
+
.sort((a, b) => a.mtime - b.mtime); // Oldest first
|
|
116
|
+
// Remove oldest files if over limit
|
|
117
|
+
if (files.length > MAX_CACHE_FILES) {
|
|
118
|
+
const toRemove = files.slice(0, files.length - MAX_CACHE_FILES);
|
|
119
|
+
for (const file of toRemove) {
|
|
120
|
+
try {
|
|
121
|
+
fs.unlinkSync(file.path);
|
|
122
|
+
}
|
|
123
|
+
catch { }
|
|
124
|
+
}
|
|
125
|
+
Logger.debug(`Removed ${toRemove.length} old cache files to enforce limit`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
Logger.debug(`Error enforcing file limits: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function getCacheStats() {
|
|
133
|
+
ensureCacheDir();
|
|
134
|
+
let size = 0;
|
|
135
|
+
try {
|
|
136
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
137
|
+
size = files.filter(f => f.endsWith('.json')).length;
|
|
138
|
+
}
|
|
139
|
+
catch { }
|
|
140
|
+
return {
|
|
141
|
+
size,
|
|
142
|
+
ttl: CACHE_TTL,
|
|
143
|
+
maxSize: MAX_CACHE_FILES,
|
|
144
|
+
cacheDir: CACHE_DIR,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export function clearCache() {
|
|
148
|
+
// !
|
|
149
|
+
try {
|
|
150
|
+
ensureCacheDir();
|
|
151
|
+
const files = fs.readdirSync(CACHE_DIR);
|
|
152
|
+
for (const file of files) {
|
|
153
|
+
if (file.endsWith('.json')) {
|
|
154
|
+
fs.unlinkSync(path.join(CACHE_DIR, file));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
Logger.debug('Cache emptied');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
Logger.error(`Failed to empty cache: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=chunkCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkCache.js","sourceRoot":"","sources":["../../src/utils/chunkCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { RetryOptions } from './commandExecutor.js';
|
|
2
|
+
export declare enum ApprovalPolicy {
|
|
3
|
+
Never = "never",
|
|
4
|
+
OnRequest = "on-request",
|
|
5
|
+
OnFailure = "on-failure",
|
|
6
|
+
Untrusted = "untrusted"
|
|
7
|
+
}
|
|
8
|
+
export declare enum SandboxMode {
|
|
9
|
+
ReadOnly = "read-only",
|
|
10
|
+
WorkspaceWrite = "workspace-write",
|
|
11
|
+
DangerFullAccess = "danger-full-access"
|
|
12
|
+
}
|
|
13
|
+
export interface CodexExecOptions {
|
|
14
|
+
readonly model?: string;
|
|
15
|
+
readonly reasoningEffort?: string;
|
|
16
|
+
readonly fullAuto?: boolean;
|
|
17
|
+
readonly approvalPolicy?: ApprovalPolicy;
|
|
18
|
+
readonly sandboxMode?: SandboxMode;
|
|
19
|
+
readonly approval?: string;
|
|
20
|
+
readonly yolo?: boolean;
|
|
21
|
+
readonly cd?: string;
|
|
22
|
+
readonly workingDir?: string;
|
|
23
|
+
readonly timeoutMs?: number;
|
|
24
|
+
readonly timeout?: number;
|
|
25
|
+
readonly maxOutputBytes?: number;
|
|
26
|
+
readonly retry?: RetryOptions;
|
|
27
|
+
readonly useStdinForLongPrompts?: boolean;
|
|
28
|
+
readonly image?: string | string[];
|
|
29
|
+
readonly config?: string | Record<string, any>;
|
|
30
|
+
readonly profile?: string;
|
|
31
|
+
readonly useExec?: boolean;
|
|
32
|
+
readonly search?: boolean;
|
|
33
|
+
readonly oss?: boolean;
|
|
34
|
+
readonly enableFeatures?: string[];
|
|
35
|
+
readonly disableFeatures?: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute Codex CLI with enhanced error handling and memory efficiency
|
|
39
|
+
*/
|
|
40
|
+
export declare function executeCodexCLI(prompt: string, options?: CodexExecOptions, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
41
|
+
/**
|
|
42
|
+
* High-level executeCodex function with comprehensive options support
|
|
43
|
+
*/
|
|
44
|
+
export declare function executeCodex(prompt: string, options?: CodexExecOptions & {
|
|
45
|
+
[key: string]: any;
|
|
46
|
+
}, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
47
|
+
//# sourceMappingURL=codexExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAU5F,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,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,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;CACrC;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,CAqJjB;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,CA8JjB"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { executeCommandDetailed } from './commandExecutor.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { CLI } from '../constants.js';
|
|
4
|
+
import { writeFileSync, unlinkSync } from 'fs';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { randomBytes } from 'crypto';
|
|
8
|
+
import { resolveWorkingDirectory } from './workingDirResolver.js';
|
|
9
|
+
// Type-safe enums
|
|
10
|
+
export var ApprovalPolicy;
|
|
11
|
+
(function (ApprovalPolicy) {
|
|
12
|
+
ApprovalPolicy["Never"] = "never";
|
|
13
|
+
ApprovalPolicy["OnRequest"] = "on-request";
|
|
14
|
+
ApprovalPolicy["OnFailure"] = "on-failure";
|
|
15
|
+
ApprovalPolicy["Untrusted"] = "untrusted";
|
|
16
|
+
})(ApprovalPolicy || (ApprovalPolicy = {}));
|
|
17
|
+
export var SandboxMode;
|
|
18
|
+
(function (SandboxMode) {
|
|
19
|
+
SandboxMode["ReadOnly"] = "read-only";
|
|
20
|
+
SandboxMode["WorkspaceWrite"] = "workspace-write";
|
|
21
|
+
SandboxMode["DangerFullAccess"] = "danger-full-access";
|
|
22
|
+
})(SandboxMode || (SandboxMode = {}));
|
|
23
|
+
/**
|
|
24
|
+
* Execute Codex CLI with enhanced error handling and memory efficiency
|
|
25
|
+
*/
|
|
26
|
+
export async function executeCodexCLI(prompt, options, onProgress) {
|
|
27
|
+
const args = [];
|
|
28
|
+
// Validate options
|
|
29
|
+
if (options?.approvalPolicy && options?.yolo) {
|
|
30
|
+
throw new Error('Cannot use both yolo and approvalPolicy');
|
|
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
|
+
else if (options?.approvalPolicy) {
|
|
57
|
+
// Smart default: if approvalPolicy is set but no sandboxMode specified,
|
|
58
|
+
// auto-enable workspace-write to prevent read-only permission errors
|
|
59
|
+
Logger.debug('Approval policy set without sandbox mode: auto-setting sandbox to workspace-write');
|
|
60
|
+
args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (options?.model) {
|
|
64
|
+
args.push(CLI.FLAGS.MODEL, options.model);
|
|
65
|
+
}
|
|
66
|
+
// Reasoning effort (passed as config override)
|
|
67
|
+
if (options?.reasoningEffort) {
|
|
68
|
+
args.push(CLI.FLAGS.CONFIG, `model_reasoning_effort="${options.reasoningEffort}"`);
|
|
69
|
+
Logger.debug(`Setting reasoning effort: ${options.reasoningEffort}`);
|
|
70
|
+
}
|
|
71
|
+
// Resolve working directory using intelligent fallback chain
|
|
72
|
+
const resolvedWorkingDir = resolveWorkingDirectory({
|
|
73
|
+
workingDir: options?.cd,
|
|
74
|
+
prompt: prompt,
|
|
75
|
+
});
|
|
76
|
+
if (resolvedWorkingDir) {
|
|
77
|
+
args.push(CLI.FLAGS.CD, resolvedWorkingDir);
|
|
78
|
+
Logger.debug(`Resolved working directory: ${resolvedWorkingDir}`);
|
|
79
|
+
}
|
|
80
|
+
// OSS (Ollama) mode
|
|
81
|
+
if (options?.oss) {
|
|
82
|
+
args.push(CLI.FLAGS.OSS);
|
|
83
|
+
}
|
|
84
|
+
// Enable features (including web search)
|
|
85
|
+
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
86
|
+
// Add web_search_request feature if search is requested
|
|
87
|
+
if (options?.search && !enableFeatures.includes('web_search_request')) {
|
|
88
|
+
enableFeatures.push('web_search_request');
|
|
89
|
+
}
|
|
90
|
+
// Add all features to args
|
|
91
|
+
for (const feature of enableFeatures) {
|
|
92
|
+
args.push(CLI.FLAGS.ENABLE, feature);
|
|
93
|
+
}
|
|
94
|
+
// Disable features
|
|
95
|
+
if (options?.disableFeatures && Array.isArray(options.disableFeatures)) {
|
|
96
|
+
for (const feature of options.disableFeatures) {
|
|
97
|
+
args.push(CLI.FLAGS.DISABLE, feature);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Non-interactive run
|
|
101
|
+
args.push('exec');
|
|
102
|
+
// Skip git repo check (not all environments are git repos)
|
|
103
|
+
args.push(CLI.FLAGS.SKIP_GIT_REPO_CHECK);
|
|
104
|
+
// Add conciseness instruction
|
|
105
|
+
const concisePrompt = `Please provide a focused, concise response without unnecessary elaboration. ${prompt}`;
|
|
106
|
+
// Check if prompt is too long for command line (OS dependent, ~100KB is safe)
|
|
107
|
+
const promptSizeBytes = Buffer.byteLength(concisePrompt, 'utf8');
|
|
108
|
+
const useStdin = options?.useStdinForLongPrompts !== false && promptSizeBytes > 100 * 1024;
|
|
109
|
+
let tempFile;
|
|
110
|
+
try {
|
|
111
|
+
if (useStdin) {
|
|
112
|
+
// Write prompt to temp file and pass via stdin redirect
|
|
113
|
+
tempFile = join(tmpdir(), `codex-prompt-${randomBytes(8).toString('hex')}.txt`);
|
|
114
|
+
writeFileSync(tempFile, concisePrompt, 'utf8');
|
|
115
|
+
args.push(`< ${tempFile}`);
|
|
116
|
+
Logger.debug(`Using temp file for large prompt (${promptSizeBytes} bytes)`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
args.push(concisePrompt);
|
|
120
|
+
}
|
|
121
|
+
// Use detailed execution for better error handling
|
|
122
|
+
const result = await executeCommandDetailed(CLI.COMMANDS.CODEX, args, {
|
|
123
|
+
onProgress,
|
|
124
|
+
timeoutMs: options?.timeoutMs,
|
|
125
|
+
maxOutputBytes: options?.maxOutputBytes,
|
|
126
|
+
retry: options?.retry,
|
|
127
|
+
});
|
|
128
|
+
if (!result.ok) {
|
|
129
|
+
// Try to salvage partial output if available
|
|
130
|
+
if (result.partialStdout && result.partialStdout.length > 1000) {
|
|
131
|
+
Logger.warn('Command failed but partial output available, attempting to use it');
|
|
132
|
+
return result.partialStdout;
|
|
133
|
+
}
|
|
134
|
+
const errorMessage = result.stderr || 'Unknown error';
|
|
135
|
+
throw new Error(result.timedOut
|
|
136
|
+
? `Codex CLI timed out after ${options?.timeoutMs || 600000}ms`
|
|
137
|
+
: `Codex CLI failed with exit code ${result.code}: ${errorMessage}`);
|
|
138
|
+
}
|
|
139
|
+
return result.stdout;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
Logger.error('Codex CLI execution failed:', error);
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
// Clean up temp file
|
|
147
|
+
if (tempFile) {
|
|
148
|
+
try {
|
|
149
|
+
unlinkSync(tempFile);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
Logger.debug('Failed to delete temp file:', e);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* High-level executeCodex function with comprehensive options support
|
|
159
|
+
*/
|
|
160
|
+
export async function executeCodex(prompt, options, onProgress) {
|
|
161
|
+
const args = [];
|
|
162
|
+
// Model selection
|
|
163
|
+
if (options?.model) {
|
|
164
|
+
args.push(CLI.FLAGS.MODEL, options.model);
|
|
165
|
+
}
|
|
166
|
+
// Reasoning effort (passed as config override to Codex CLI)
|
|
167
|
+
if (options?.reasoningEffort) {
|
|
168
|
+
args.push(CLI.FLAGS.CONFIG, `model_reasoning_effort="${options.reasoningEffort}"`);
|
|
169
|
+
Logger.debug(`Setting reasoning effort: ${options.reasoningEffort}`);
|
|
170
|
+
}
|
|
171
|
+
// Safety controls
|
|
172
|
+
if (options?.yolo) {
|
|
173
|
+
args.push(CLI.FLAGS.YOLO);
|
|
174
|
+
}
|
|
175
|
+
else if (options?.fullAuto) {
|
|
176
|
+
args.push(CLI.FLAGS.FULL_AUTO);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Approval policy
|
|
180
|
+
if (options?.approval || options?.approvalPolicy) {
|
|
181
|
+
const approvalValue = options.approval || options.approvalPolicy;
|
|
182
|
+
if (approvalValue) {
|
|
183
|
+
args.push(CLI.FLAGS.ASK_FOR_APPROVAL, approvalValue);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Sandbox mode
|
|
187
|
+
if (options?.sandboxMode) {
|
|
188
|
+
args.push(CLI.FLAGS.SANDBOX_MODE, options.sandboxMode);
|
|
189
|
+
}
|
|
190
|
+
else if (options?.search || options?.oss) {
|
|
191
|
+
// Auto-enable workspace-write for search/oss if no sandbox specified
|
|
192
|
+
Logger.debug('Search/OSS enabled: auto-setting sandbox to workspace-write for network access');
|
|
193
|
+
args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
194
|
+
}
|
|
195
|
+
else if (options?.approval || options?.approvalPolicy) {
|
|
196
|
+
// Smart default: if approval is set but no sandboxMode specified,
|
|
197
|
+
// auto-enable workspace-write to prevent read-only permission errors
|
|
198
|
+
Logger.debug('Approval set without sandbox mode: auto-setting sandbox to workspace-write');
|
|
199
|
+
args.push(CLI.FLAGS.SANDBOX_MODE, 'workspace-write');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Resolve working directory using intelligent fallback chain
|
|
203
|
+
const resolvedWorkingDir = resolveWorkingDirectory({
|
|
204
|
+
workingDir: options?.workingDir || options?.cd,
|
|
205
|
+
prompt: prompt,
|
|
206
|
+
});
|
|
207
|
+
if (resolvedWorkingDir) {
|
|
208
|
+
args.push(CLI.FLAGS.WORKING_DIR, resolvedWorkingDir);
|
|
209
|
+
Logger.debug(`Resolved working directory for executeCodex: ${resolvedWorkingDir}`);
|
|
210
|
+
}
|
|
211
|
+
// Configuration
|
|
212
|
+
if (options?.config) {
|
|
213
|
+
if (typeof options.config === 'string') {
|
|
214
|
+
args.push(CLI.FLAGS.CONFIG, options.config);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
// Convert object to key=value pairs
|
|
218
|
+
const configStr = Object.entries(options.config)
|
|
219
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
220
|
+
.join(',');
|
|
221
|
+
args.push(CLI.FLAGS.CONFIG, configStr);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Profile
|
|
225
|
+
if (options?.profile) {
|
|
226
|
+
args.push(CLI.FLAGS.PROFILE, options.profile);
|
|
227
|
+
}
|
|
228
|
+
// Images
|
|
229
|
+
if (options?.image) {
|
|
230
|
+
const images = Array.isArray(options.image) ? options.image : [options.image];
|
|
231
|
+
for (const img of images) {
|
|
232
|
+
args.push(CLI.FLAGS.IMAGE, img);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// OSS (Ollama) mode
|
|
236
|
+
if (options?.oss) {
|
|
237
|
+
args.push(CLI.FLAGS.OSS);
|
|
238
|
+
}
|
|
239
|
+
// Enable features (including web search)
|
|
240
|
+
const enableFeatures = [...(options?.enableFeatures || [])];
|
|
241
|
+
// Add web_search_request feature if search is requested
|
|
242
|
+
if (options?.search && !enableFeatures.includes('web_search_request')) {
|
|
243
|
+
enableFeatures.push('web_search_request');
|
|
244
|
+
}
|
|
245
|
+
// Add all features to args
|
|
246
|
+
for (const feature of enableFeatures) {
|
|
247
|
+
args.push(CLI.FLAGS.ENABLE, feature);
|
|
248
|
+
}
|
|
249
|
+
// Disable features
|
|
250
|
+
if (options?.disableFeatures && Array.isArray(options.disableFeatures)) {
|
|
251
|
+
for (const feature of options.disableFeatures) {
|
|
252
|
+
args.push(CLI.FLAGS.DISABLE, feature);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Use exec mode for non-interactive execution
|
|
256
|
+
if (options?.useExec !== false) {
|
|
257
|
+
// Default to true for non-interactive execution
|
|
258
|
+
args.push('exec');
|
|
259
|
+
}
|
|
260
|
+
// Skip git repo check (not all environments are git repos)
|
|
261
|
+
args.push(CLI.FLAGS.SKIP_GIT_REPO_CHECK);
|
|
262
|
+
// Add the prompt
|
|
263
|
+
args.push(prompt);
|
|
264
|
+
try {
|
|
265
|
+
const timeoutMs = options?.timeout || options?.timeoutMs || 600000; // 10 minutes default
|
|
266
|
+
const result = await executeCommandDetailed(CLI.COMMANDS.CODEX, args, {
|
|
267
|
+
onProgress,
|
|
268
|
+
timeoutMs,
|
|
269
|
+
maxOutputBytes: options?.maxOutputBytes,
|
|
270
|
+
retry: options?.retry,
|
|
271
|
+
});
|
|
272
|
+
if (!result.ok) {
|
|
273
|
+
// Enhanced error handling with specific messages
|
|
274
|
+
const errorMessage = result.stderr || 'Unknown error';
|
|
275
|
+
if (errorMessage.includes('command not found') || errorMessage.includes('not found')) {
|
|
276
|
+
throw new Error('Codex CLI not found. Install with: npm install -g @openai/codex');
|
|
277
|
+
}
|
|
278
|
+
if (errorMessage.includes('authentication') || errorMessage.includes('unauthorized')) {
|
|
279
|
+
throw new Error('Authentication failed. Run "codex login" or set OPENAI_API_KEY');
|
|
280
|
+
}
|
|
281
|
+
if (errorMessage.includes('quota') || errorMessage.includes('rate limit')) {
|
|
282
|
+
throw new Error('Rate limit exceeded. Please wait and try again');
|
|
283
|
+
}
|
|
284
|
+
if (errorMessage.includes('permission') || errorMessage.includes('sandbox')) {
|
|
285
|
+
throw new Error(`Permission denied. Try adjusting sandbox mode or approval policy: ${errorMessage}`);
|
|
286
|
+
}
|
|
287
|
+
throw new Error(`Codex CLI failed: ${errorMessage}`);
|
|
288
|
+
}
|
|
289
|
+
return result.stdout;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
Logger.error('Codex execution failed:', error);
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=codexExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexExecutor.js","sourceRoot":"","sources":["../../src/utils/codexExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface CommandResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
code: number | null;
|
|
4
|
+
signal?: NodeJS.Signals;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
timedOut: boolean;
|
|
8
|
+
partialStdout?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RetryOptions {
|
|
11
|
+
attempts: number;
|
|
12
|
+
backoffMs: number;
|
|
13
|
+
retryOn: ('timeout' | 'exit_nonzero' | 'spawn_error')[];
|
|
14
|
+
}
|
|
15
|
+
export interface ExecuteOptions {
|
|
16
|
+
onProgress?: (newOutput: string) => void;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
maxOutputBytes?: number;
|
|
19
|
+
retry?: RetryOptions;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute a command with streaming output and structured error handling
|
|
23
|
+
*/
|
|
24
|
+
export declare function executeCommandDetailed(command: string, args: string[], options?: ExecuteOptions): Promise<CommandResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Backward compatible wrapper that returns stdout string
|
|
27
|
+
*/
|
|
28
|
+
export declare function executeCommand(command: string, args: string[], onProgress?: (newOutput: string) => void, timeoutMs?: number): Promise<string>;
|
|
29
|
+
//# sourceMappingURL=commandExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/commandExecutor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAyCxB;AA6HD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EACxC,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|