@etheaven/codex-mcp-server 1.3.0

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