@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,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,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI version detection and feature compatibility checks
|
|
3
|
+
* Ensures correct CLI flags are used based on installed version
|
|
4
|
+
*/
|
|
5
|
+
export interface CodexVersion {
|
|
6
|
+
major: number;
|
|
7
|
+
minor: number;
|
|
8
|
+
patch: number;
|
|
9
|
+
raw: string;
|
|
10
|
+
isValid: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Feature availability by version
|
|
14
|
+
*/
|
|
15
|
+
export declare const FEATURE_VERSIONS: {
|
|
16
|
+
readonly NATIVE_SEARCH: {
|
|
17
|
+
readonly major: 0;
|
|
18
|
+
readonly minor: 52;
|
|
19
|
+
readonly patch: 0;
|
|
20
|
+
};
|
|
21
|
+
readonly TOOL_TOKEN_LIMIT: {
|
|
22
|
+
readonly major: 0;
|
|
23
|
+
readonly minor: 59;
|
|
24
|
+
readonly patch: 0;
|
|
25
|
+
};
|
|
26
|
+
readonly ADD_DIR: {
|
|
27
|
+
readonly major: 0;
|
|
28
|
+
readonly minor: 59;
|
|
29
|
+
readonly patch: 0;
|
|
30
|
+
};
|
|
31
|
+
readonly WINDOWS_AGENT: {
|
|
32
|
+
readonly major: 0;
|
|
33
|
+
readonly minor: 59;
|
|
34
|
+
readonly patch: 0;
|
|
35
|
+
};
|
|
36
|
+
readonly GPT5_1_MODELS: {
|
|
37
|
+
readonly major: 0;
|
|
38
|
+
readonly minor: 56;
|
|
39
|
+
readonly patch: 0;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Parse version string into structured format
|
|
44
|
+
* @param versionString Raw version string (e.g., "0.59.0", "v0.52.1")
|
|
45
|
+
* @returns CodexVersion object
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseVersion(versionString: string): CodexVersion;
|
|
48
|
+
/**
|
|
49
|
+
* Compare two versions
|
|
50
|
+
* @returns number Negative if v1 < v2, 0 if equal, positive if v1 > v2
|
|
51
|
+
*/
|
|
52
|
+
export declare function compareVersions(v1: CodexVersion, v2: {
|
|
53
|
+
major: number;
|
|
54
|
+
minor: number;
|
|
55
|
+
patch: number;
|
|
56
|
+
}): number;
|
|
57
|
+
/**
|
|
58
|
+
* Check if version meets minimum requirement
|
|
59
|
+
* @param version Current version
|
|
60
|
+
* @param minVersion Minimum required version
|
|
61
|
+
* @returns boolean True if version >= minVersion
|
|
62
|
+
*/
|
|
63
|
+
export declare function meetsMinVersion(version: CodexVersion, minVersion: {
|
|
64
|
+
major: number;
|
|
65
|
+
minor: number;
|
|
66
|
+
patch: number;
|
|
67
|
+
}): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get installed Codex CLI version
|
|
70
|
+
* @returns Promise<CodexVersion> Version information
|
|
71
|
+
*/
|
|
72
|
+
export declare function getCodexVersion(): Promise<CodexVersion>;
|
|
73
|
+
/**
|
|
74
|
+
* Check if specific feature is available in installed version
|
|
75
|
+
* @param featureName Name of feature from FEATURE_VERSIONS
|
|
76
|
+
* @returns Promise<boolean> True if feature is available
|
|
77
|
+
*/
|
|
78
|
+
export declare function isFeatureAvailable(featureName: keyof typeof FEATURE_VERSIONS): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* Check if native --search flag is available
|
|
81
|
+
* @returns Promise<boolean> True if --search flag is supported
|
|
82
|
+
*/
|
|
83
|
+
export declare function supportsNativeSearch(): Promise<boolean>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if --add-dir flag is available
|
|
86
|
+
* @returns Promise<boolean> True if --add-dir flag is supported
|
|
87
|
+
*/
|
|
88
|
+
export declare function supportsAddDir(): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Check if tool_output_token_limit config is available
|
|
91
|
+
* @returns Promise<boolean> True if token limit config is supported
|
|
92
|
+
*/
|
|
93
|
+
export declare function supportsToolTokenLimit(): Promise<boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* Check if GPT-5.1 models are available
|
|
96
|
+
* @returns Promise<boolean> True if GPT-5.1 models are supported
|
|
97
|
+
*/
|
|
98
|
+
export declare function supportsGPT51Models(): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Get all supported features for current version
|
|
101
|
+
* @returns Promise<Record<string, boolean>> Map of feature names to availability
|
|
102
|
+
*/
|
|
103
|
+
export declare function getSupportedFeatures(): Promise<Record<string, boolean>>;
|
|
104
|
+
/**
|
|
105
|
+
* Log version and feature support information
|
|
106
|
+
*/
|
|
107
|
+
export declare function logVersionInfo(): Promise<void>;
|
|
108
|
+
//# sourceMappingURL=versionDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versionDetection.d.ts","sourceRoot":"","sources":["../../src/utils/versionDetection.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;CAMnB,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAwBhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAgC7D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,OAAO,gBAAgB,GACzC,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7D;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE5D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAS7E;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
import { executeCommand } from './commandExecutor.js';
|
|
3
|
+
/**
|
|
4
|
+
* Feature availability by version
|
|
5
|
+
*/
|
|
6
|
+
export const FEATURE_VERSIONS = {
|
|
7
|
+
NATIVE_SEARCH: { major: 0, minor: 52, patch: 0 }, // --search flag
|
|
8
|
+
TOOL_TOKEN_LIMIT: { major: 0, minor: 59, patch: 0 }, // tool_output_token_limit
|
|
9
|
+
ADD_DIR: { major: 0, minor: 59, patch: 0 }, // --add-dir flag
|
|
10
|
+
WINDOWS_AGENT: { major: 0, minor: 59, patch: 0 }, // Windows agent mode
|
|
11
|
+
GPT5_1_MODELS: { major: 0, minor: 56, patch: 0 }, // GPT-5.1 model family
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Parse version string into structured format
|
|
15
|
+
* @param versionString Raw version string (e.g., "0.59.0", "v0.52.1")
|
|
16
|
+
* @returns CodexVersion object
|
|
17
|
+
*/
|
|
18
|
+
export function parseVersion(versionString) {
|
|
19
|
+
// Remove 'v' prefix if present
|
|
20
|
+
const cleanVersion = versionString.replace(/^v/, '').trim();
|
|
21
|
+
// Match semantic version pattern
|
|
22
|
+
const match = cleanVersion.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
23
|
+
if (!match) {
|
|
24
|
+
return {
|
|
25
|
+
major: 0,
|
|
26
|
+
minor: 0,
|
|
27
|
+
patch: 0,
|
|
28
|
+
raw: versionString,
|
|
29
|
+
isValid: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
major: parseInt(match[1], 10),
|
|
34
|
+
minor: parseInt(match[2], 10),
|
|
35
|
+
patch: parseInt(match[3], 10),
|
|
36
|
+
raw: versionString,
|
|
37
|
+
isValid: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compare two versions
|
|
42
|
+
* @returns number Negative if v1 < v2, 0 if equal, positive if v1 > v2
|
|
43
|
+
*/
|
|
44
|
+
export function compareVersions(v1, v2) {
|
|
45
|
+
if (v1.major !== v2.major)
|
|
46
|
+
return v1.major - v2.major;
|
|
47
|
+
if (v1.minor !== v2.minor)
|
|
48
|
+
return v1.minor - v2.minor;
|
|
49
|
+
return v1.patch - v2.patch;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if version meets minimum requirement
|
|
53
|
+
* @param version Current version
|
|
54
|
+
* @param minVersion Minimum required version
|
|
55
|
+
* @returns boolean True if version >= minVersion
|
|
56
|
+
*/
|
|
57
|
+
export function meetsMinVersion(version, minVersion) {
|
|
58
|
+
if (!version.isValid) {
|
|
59
|
+
Logger.warn('Invalid version format, assuming feature not available');
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return compareVersions(version, minVersion) >= 0;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get installed Codex CLI version
|
|
66
|
+
* @returns Promise<CodexVersion> Version information
|
|
67
|
+
*/
|
|
68
|
+
export async function getCodexVersion() {
|
|
69
|
+
try {
|
|
70
|
+
const versionOutput = await executeCommand('codex', ['--version'], undefined, 5000);
|
|
71
|
+
// Parse version from output (format: "codex 0.59.0" or just "0.59.0")
|
|
72
|
+
const versionMatch = versionOutput.match(/codex\s+v?(\d+\.\d+\.\d+)/) || versionOutput.match(/v?(\d+\.\d+\.\d+)/);
|
|
73
|
+
if (!versionMatch) {
|
|
74
|
+
Logger.warn('Could not parse Codex version from output:', versionOutput);
|
|
75
|
+
return {
|
|
76
|
+
major: 0,
|
|
77
|
+
minor: 0,
|
|
78
|
+
patch: 0,
|
|
79
|
+
raw: versionOutput,
|
|
80
|
+
isValid: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const version = parseVersion(versionMatch[1]);
|
|
84
|
+
Logger.log(`Detected Codex CLI version: ${version.major}.${version.minor}.${version.patch}`);
|
|
85
|
+
return version;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
Logger.error('Failed to get Codex CLI version:', error);
|
|
89
|
+
return {
|
|
90
|
+
major: 0,
|
|
91
|
+
minor: 0,
|
|
92
|
+
patch: 0,
|
|
93
|
+
raw: 'unknown',
|
|
94
|
+
isValid: false,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if specific feature is available in installed version
|
|
100
|
+
* @param featureName Name of feature from FEATURE_VERSIONS
|
|
101
|
+
* @returns Promise<boolean> True if feature is available
|
|
102
|
+
*/
|
|
103
|
+
export async function isFeatureAvailable(featureName) {
|
|
104
|
+
const version = await getCodexVersion();
|
|
105
|
+
const minVersion = FEATURE_VERSIONS[featureName];
|
|
106
|
+
return meetsMinVersion(version, minVersion);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if native --search flag is available
|
|
110
|
+
* @returns Promise<boolean> True if --search flag is supported
|
|
111
|
+
*/
|
|
112
|
+
export async function supportsNativeSearch() {
|
|
113
|
+
return await isFeatureAvailable('NATIVE_SEARCH');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if --add-dir flag is available
|
|
117
|
+
* @returns Promise<boolean> True if --add-dir flag is supported
|
|
118
|
+
*/
|
|
119
|
+
export async function supportsAddDir() {
|
|
120
|
+
return await isFeatureAvailable('ADD_DIR');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if tool_output_token_limit config is available
|
|
124
|
+
* @returns Promise<boolean> True if token limit config is supported
|
|
125
|
+
*/
|
|
126
|
+
export async function supportsToolTokenLimit() {
|
|
127
|
+
return await isFeatureAvailable('TOOL_TOKEN_LIMIT');
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if GPT-5.1 models are available
|
|
131
|
+
* @returns Promise<boolean> True if GPT-5.1 models are supported
|
|
132
|
+
*/
|
|
133
|
+
export async function supportsGPT51Models() {
|
|
134
|
+
return await isFeatureAvailable('GPT5_1_MODELS');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all supported features for current version
|
|
138
|
+
* @returns Promise<Record<string, boolean>> Map of feature names to availability
|
|
139
|
+
*/
|
|
140
|
+
export async function getSupportedFeatures() {
|
|
141
|
+
const version = await getCodexVersion();
|
|
142
|
+
const features = {};
|
|
143
|
+
for (const [featureName, minVersion] of Object.entries(FEATURE_VERSIONS)) {
|
|
144
|
+
features[featureName] = meetsMinVersion(version, minVersion);
|
|
145
|
+
}
|
|
146
|
+
return features;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Log version and feature support information
|
|
150
|
+
*/
|
|
151
|
+
export async function logVersionInfo() {
|
|
152
|
+
const version = await getCodexVersion();
|
|
153
|
+
const features = await getSupportedFeatures();
|
|
154
|
+
Logger.log(`Codex CLI Version: ${version.raw}`);
|
|
155
|
+
Logger.log('Supported Features:');
|
|
156
|
+
for (const [feature, supported] of Object.entries(features)) {
|
|
157
|
+
Logger.log(` ${feature}: ${supported ? '✓' : '✗'}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=versionDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versionDetection.js","sourceRoot":"","sources":["../../src/utils/versionDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,24 +10,29 @@ export declare function findProjectRoot(startPath: string): string;
|
|
|
10
10
|
* Ensures that the provided path points to a directory.
|
|
11
11
|
* If the path is a file, returns its parent directory.
|
|
12
12
|
* If the path doesn't exist or is invalid, returns undefined.
|
|
13
|
+
* Supports both absolute and relative paths.
|
|
13
14
|
*
|
|
14
|
-
* @param path - The file or directory path
|
|
15
|
+
* @param path - The file or directory path (absolute or relative)
|
|
16
|
+
* @param baseDir - Base directory for resolving relative paths (default: process.cwd())
|
|
15
17
|
* @returns The directory path, or undefined if invalid
|
|
16
18
|
*/
|
|
17
|
-
export declare function ensureDirectory(path?: string): string | undefined;
|
|
19
|
+
export declare function ensureDirectory(path?: string, baseDir?: string): string | undefined;
|
|
18
20
|
/**
|
|
19
|
-
* Extract
|
|
20
|
-
* Supports both quoted and unquoted paths.
|
|
21
|
+
* Extract file paths from @path syntax in the prompt.
|
|
22
|
+
* Supports both quoted and unquoted paths, absolute and relative.
|
|
21
23
|
*
|
|
22
24
|
* Examples:
|
|
23
|
-
* - @/absolute/path/to/file.ts
|
|
24
|
-
* -
|
|
25
|
-
* - @
|
|
25
|
+
* - @/absolute/path/to/file.ts (absolute)
|
|
26
|
+
* - @./relative/path/to/file.ts (relative)
|
|
27
|
+
* - @src/file.ts (relative)
|
|
28
|
+
* - @"path with spaces/file.ts" (quoted, can be absolute or relative)
|
|
29
|
+
* - @'path with spaces/file.ts' (quoted, can be absolute or relative)
|
|
26
30
|
*
|
|
27
31
|
* @param prompt - The user prompt that may contain @path references
|
|
32
|
+
* @param baseDir - Base directory for resolving relative paths (default: process.cwd())
|
|
28
33
|
* @returns Array of absolute paths found in the prompt
|
|
29
34
|
*/
|
|
30
|
-
export declare function extractPathFromAtSyntax(prompt: string): string[];
|
|
35
|
+
export declare function extractPathFromAtSyntax(prompt: string, baseDir?: string): string[];
|
|
31
36
|
/**
|
|
32
37
|
* Resolve the working directory using a fallback chain with multiple strategies.
|
|
33
38
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workingDirResolver.d.ts","sourceRoot":"","sources":["../../src/utils/workingDirResolver.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2CzD;AAED
|
|
1
|
+
{"version":3,"file":"workingDirResolver.d.ts","sourceRoot":"","sources":["../../src/utils/workingDirResolver.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2CzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,MAAsB,GAC9B,MAAM,GAAG,SAAS,CAsCpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,EAAE,CAoCjG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,SAAS,CAqDrB"}
|
|
@@ -68,34 +68,39 @@ export function findProjectRoot(startPath) {
|
|
|
68
68
|
* Ensures that the provided path points to a directory.
|
|
69
69
|
* If the path is a file, returns its parent directory.
|
|
70
70
|
* If the path doesn't exist or is invalid, returns undefined.
|
|
71
|
+
* Supports both absolute and relative paths.
|
|
71
72
|
*
|
|
72
|
-
* @param path - The file or directory path
|
|
73
|
+
* @param path - The file or directory path (absolute or relative)
|
|
74
|
+
* @param baseDir - Base directory for resolving relative paths (default: process.cwd())
|
|
73
75
|
* @returns The directory path, or undefined if invalid
|
|
74
76
|
*/
|
|
75
|
-
export function ensureDirectory(path) {
|
|
77
|
+
export function ensureDirectory(path, baseDir = process.cwd()) {
|
|
76
78
|
if (!path) {
|
|
77
79
|
return undefined;
|
|
78
80
|
}
|
|
79
81
|
try {
|
|
82
|
+
// Resolve to absolute path if relative
|
|
83
|
+
const absolutePath = isAbsolute(path) ? path : resolve(baseDir, path);
|
|
84
|
+
Logger.debug(`Resolving path: ${path} -> ${absolutePath} (base: ${baseDir})`);
|
|
80
85
|
// Check if path exists
|
|
81
|
-
if (!existsSync(
|
|
82
|
-
Logger.debug(`Path does not exist: ${
|
|
86
|
+
if (!existsSync(absolutePath)) {
|
|
87
|
+
Logger.debug(`Path does not exist: ${absolutePath}`);
|
|
83
88
|
return undefined;
|
|
84
89
|
}
|
|
85
90
|
// Get file stats
|
|
86
|
-
const stats = statSync(
|
|
91
|
+
const stats = statSync(absolutePath);
|
|
87
92
|
// If it's a directory, return as-is
|
|
88
93
|
if (stats.isDirectory()) {
|
|
89
|
-
return
|
|
94
|
+
return absolutePath;
|
|
90
95
|
}
|
|
91
96
|
// If it's a file, return its parent directory
|
|
92
97
|
if (stats.isFile()) {
|
|
93
|
-
const parentDir = dirname(
|
|
98
|
+
const parentDir = dirname(absolutePath);
|
|
94
99
|
Logger.debug(`Path is a file, using parent directory: ${parentDir}`);
|
|
95
100
|
return parentDir;
|
|
96
101
|
}
|
|
97
102
|
// If it's neither file nor directory (symlink, etc.), try to resolve
|
|
98
|
-
Logger.debug(`Path is neither file nor directory: ${
|
|
103
|
+
Logger.debug(`Path is neither file nor directory: ${absolutePath}`);
|
|
99
104
|
return undefined;
|
|
100
105
|
}
|
|
101
106
|
catch (error) {
|
|
@@ -104,35 +109,46 @@ export function ensureDirectory(path) {
|
|
|
104
109
|
}
|
|
105
110
|
}
|
|
106
111
|
/**
|
|
107
|
-
* Extract
|
|
108
|
-
* Supports both quoted and unquoted paths.
|
|
112
|
+
* Extract file paths from @path syntax in the prompt.
|
|
113
|
+
* Supports both quoted and unquoted paths, absolute and relative.
|
|
109
114
|
*
|
|
110
115
|
* Examples:
|
|
111
|
-
* - @/absolute/path/to/file.ts
|
|
112
|
-
* -
|
|
113
|
-
* - @
|
|
116
|
+
* - @/absolute/path/to/file.ts (absolute)
|
|
117
|
+
* - @./relative/path/to/file.ts (relative)
|
|
118
|
+
* - @src/file.ts (relative)
|
|
119
|
+
* - @"path with spaces/file.ts" (quoted, can be absolute or relative)
|
|
120
|
+
* - @'path with spaces/file.ts' (quoted, can be absolute or relative)
|
|
114
121
|
*
|
|
115
122
|
* @param prompt - The user prompt that may contain @path references
|
|
123
|
+
* @param baseDir - Base directory for resolving relative paths (default: process.cwd())
|
|
116
124
|
* @returns Array of absolute paths found in the prompt
|
|
117
125
|
*/
|
|
118
|
-
export function extractPathFromAtSyntax(prompt) {
|
|
126
|
+
export function extractPathFromAtSyntax(prompt, baseDir = process.cwd()) {
|
|
119
127
|
const paths = [];
|
|
120
128
|
// Pattern 1: Quoted paths with @ prefix: @"path" or @'path'
|
|
121
129
|
const quotedPathRegex = /@["']([^"']+)["']/g;
|
|
122
130
|
let match;
|
|
123
131
|
while ((match = quotedPathRegex.exec(prompt)) !== null) {
|
|
124
132
|
const path = match[1];
|
|
125
|
-
if
|
|
126
|
-
|
|
127
|
-
|
|
133
|
+
// Convert to absolute if relative
|
|
134
|
+
const absolutePath = isAbsolute(path) ? path : resolve(baseDir, path);
|
|
135
|
+
paths.push(absolutePath);
|
|
136
|
+
Logger.debug(`Extracted quoted @path: ${path} -> ${absolutePath}`);
|
|
128
137
|
}
|
|
129
|
-
// Pattern 2: Unquoted paths
|
|
130
|
-
const
|
|
131
|
-
while ((match =
|
|
138
|
+
// Pattern 2: Unquoted absolute paths: @/path
|
|
139
|
+
const absolutePathRegex = /@(\/[^\s"']+)/g;
|
|
140
|
+
while ((match = absolutePathRegex.exec(prompt)) !== null) {
|
|
132
141
|
const path = match[1];
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
142
|
+
paths.push(path);
|
|
143
|
+
Logger.debug(`Extracted absolute @path: ${path}`);
|
|
144
|
+
}
|
|
145
|
+
// Pattern 3: Unquoted relative paths: @./path or @../path or @word/path
|
|
146
|
+
const relativePathRegex = /@(\.{1,2}\/[^\s"']+|[a-zA-Z0-9_-]+\/[^\s"']+)/g;
|
|
147
|
+
while ((match = relativePathRegex.exec(prompt)) !== null) {
|
|
148
|
+
const path = match[1];
|
|
149
|
+
const absolutePath = resolve(baseDir, path);
|
|
150
|
+
paths.push(absolutePath);
|
|
151
|
+
Logger.debug(`Extracted relative @path: ${path} -> ${absolutePath}`);
|
|
136
152
|
}
|
|
137
153
|
Logger.debug(`Extracted ${paths.length} paths from @syntax: ${paths.join(', ')}`);
|
|
138
154
|
return paths;
|
|
@@ -151,9 +167,11 @@ export function extractPathFromAtSyntax(prompt) {
|
|
|
151
167
|
*/
|
|
152
168
|
export function resolveWorkingDirectory(options) {
|
|
153
169
|
const { workingDir, prompt } = options || {};
|
|
170
|
+
// Get a base directory for resolving relative paths
|
|
171
|
+
const baseDir = process.env['CODEX_MCP_CWD'] || process.env['PWD'] || process.env['INIT_CWD'] || process.cwd();
|
|
154
172
|
// Priority 1: Explicit workingDir parameter
|
|
155
173
|
if (workingDir) {
|
|
156
|
-
const validDir = ensureDirectory(workingDir);
|
|
174
|
+
const validDir = ensureDirectory(workingDir, baseDir);
|
|
157
175
|
if (validDir) {
|
|
158
176
|
Logger.debug(`Using explicit working directory: ${validDir}`);
|
|
159
177
|
return validDir;
|
|
@@ -167,7 +185,7 @@ export function resolveWorkingDirectory(options) {
|
|
|
167
185
|
for (const envVar of envVars) {
|
|
168
186
|
const envValue = process.env[envVar];
|
|
169
187
|
if (envValue) {
|
|
170
|
-
const validDir = ensureDirectory(envValue);
|
|
188
|
+
const validDir = ensureDirectory(envValue, process.cwd());
|
|
171
189
|
if (validDir) {
|
|
172
190
|
Logger.debug(`Using environment variable ${envVar}: ${validDir}`);
|
|
173
191
|
return validDir;
|
|
@@ -179,7 +197,7 @@ export function resolveWorkingDirectory(options) {
|
|
|
179
197
|
}
|
|
180
198
|
// Priority 3: Automatic inference from @path syntax
|
|
181
199
|
if (prompt) {
|
|
182
|
-
const paths = extractPathFromAtSyntax(prompt);
|
|
200
|
+
const paths = extractPathFromAtSyntax(prompt, baseDir);
|
|
183
201
|
for (const path of paths) {
|
|
184
202
|
if (existsSync(path)) {
|
|
185
203
|
// Find the project root for this path
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workingDirResolver.js","sourceRoot":"","sources":["../../src/utils/workingDirResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,cAAc,EAAE,qBAAqB;IACrC,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,SAAS;IAC3B,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,eAAe;IAC1B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,MAAM;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,+CAA+C;QAC/C,IAAI,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;YAClE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,yDAAyD;QACzD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,OAAO,YAAY,GAAG,kBAAkB,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;YAE/D,0DAA0D;YAC1D,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3B,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,aAAa,MAAM,GAAG,CAAC,CAAC;oBACzE,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YAEtC,2CAA2C;YAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,CAAC;YAED,UAAU,GAAG,SAAS,CAAC;YACvB,YAAY,EAAE,CAAC;QACjB,CAAC;QAED,qDAAqD;QACrD,MAAM,CAAC,KAAK,CAAC,oDAAoD,UAAU,EAAE,CAAC,CAAC;QAC/E,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"workingDirResolver.js","sourceRoot":"","sources":["../../src/utils/workingDirResolver.ts"],"names":[],"mappings":"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"}
|