@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 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,gBAAgB,CAAC;AAGxC,eAAO,MAAM,cAAc;;;;;;;;CASjB,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;CAQlB,CAAC;AAIX,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;CA4BT,CAAC;AAGX,eAAO,MAAM,qBAAqB;;;;;;;;CAQxB,CAAC;AAGX,eAAO,MAAM,iBAAiB;;;;;;;CAOpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAGzF,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAGX,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAGX,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCN,CAAC;AAGX,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE3B,cAAc,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAG3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;CACvF"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Logging
|
|
2
|
+
export const LOG_PREFIX = '[CODEX-MCP]';
|
|
3
|
+
// Error messages
|
|
4
|
+
export const ERROR_MESSAGES = {
|
|
5
|
+
TOOL_NOT_FOUND: 'not found in registry',
|
|
6
|
+
NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions",
|
|
7
|
+
QUOTA_EXCEEDED: 'Rate limit exceeded',
|
|
8
|
+
AUTHENTICATION_FAILED: 'Authentication failed - please check your OpenAI API key or login status',
|
|
9
|
+
CODEX_NOT_FOUND: "Codex CLI not found - please install with 'npm install -g @openai/codex'",
|
|
10
|
+
SANDBOX_VIOLATION: 'Operation blocked by sandbox policy',
|
|
11
|
+
UNSAFE_COMMAND: 'Command requires approval or elevated permissions',
|
|
12
|
+
};
|
|
13
|
+
// Status messages
|
|
14
|
+
export const STATUS_MESSAGES = {
|
|
15
|
+
SANDBOX_EXECUTING: '🔒 Executing CLI command in sandbox/auto mode...',
|
|
16
|
+
CODEX_RESPONSE: 'Codex response:',
|
|
17
|
+
AUTHENTICATION_SUCCESS: '✅ Authentication successful',
|
|
18
|
+
// Timeout prevention messages
|
|
19
|
+
PROCESSING_START: '🔍 Starting analysis (may take 5-15 minutes for large codebases)',
|
|
20
|
+
PROCESSING_CONTINUE: '⏳ Still processing...',
|
|
21
|
+
PROCESSING_COMPLETE: '✅ Analysis completed successfully',
|
|
22
|
+
};
|
|
23
|
+
// Models — kept in sync with https://developers.openai.com/codex/models/
|
|
24
|
+
// and https://developers.openai.com/api/docs/models (March 2026)
|
|
25
|
+
export const MODELS = {
|
|
26
|
+
// GPT-5.x flagship / reasoning
|
|
27
|
+
GPT_5_4: 'gpt-5.4',
|
|
28
|
+
GPT_5_4_PRO: 'gpt-5.4-pro',
|
|
29
|
+
GPT_5_3_CODEX: 'gpt-5.3-codex',
|
|
30
|
+
GPT_5_3_CODEX_SPARK: 'gpt-5.3-codex-spark',
|
|
31
|
+
GPT_5_2_CODEX: 'gpt-5.2-codex',
|
|
32
|
+
GPT_5_2: 'gpt-5.2',
|
|
33
|
+
GPT_5_1_CODEX_MAX: 'gpt-5.1-codex-max',
|
|
34
|
+
GPT_5_1_CODEX: 'gpt-5.1-codex',
|
|
35
|
+
GPT_5_1: 'gpt-5.1',
|
|
36
|
+
GPT_5: 'gpt-5',
|
|
37
|
+
GPT_5_PRO: 'gpt-5-pro',
|
|
38
|
+
GPT_5_CODEX: 'gpt-5-codex',
|
|
39
|
+
GPT_5_CODEX_MINI: 'gpt-5-codex-mini',
|
|
40
|
+
GPT_5_MINI: 'gpt-5-mini',
|
|
41
|
+
GPT_5_NANO: 'gpt-5-nano',
|
|
42
|
+
// O-series reasoning
|
|
43
|
+
O3: 'o3',
|
|
44
|
+
O3_PRO: 'o3-pro',
|
|
45
|
+
O4_MINI: 'o4-mini',
|
|
46
|
+
// GPT-4.1 (non-reasoning, 1M context)
|
|
47
|
+
GPT_4_1: 'gpt-4.1',
|
|
48
|
+
GPT_4_1_MINI: 'gpt-4.1-mini',
|
|
49
|
+
GPT_4_1_NANO: 'gpt-4.1-nano',
|
|
50
|
+
// GPT-4o (legacy multimodal)
|
|
51
|
+
GPT_4O: 'gpt-4o',
|
|
52
|
+
GPT_4O_MINI: 'gpt-4o-mini',
|
|
53
|
+
};
|
|
54
|
+
// Recommended models for different use cases (used in tool descriptions)
|
|
55
|
+
export const MODEL_RECOMMENDATIONS = {
|
|
56
|
+
DEFAULT: 'gpt-5.4',
|
|
57
|
+
CODING: 'gpt-5.3-codex',
|
|
58
|
+
FAST_CODING: 'gpt-5.3-codex-spark',
|
|
59
|
+
DEEP_REASONING: 'o3',
|
|
60
|
+
FAST_REASONING: 'o4-mini',
|
|
61
|
+
COST_EFFECTIVE: 'gpt-5-mini',
|
|
62
|
+
LARGE_CONTEXT: 'gpt-4.1',
|
|
63
|
+
};
|
|
64
|
+
// Reasoning effort levels — per-model support varies
|
|
65
|
+
export const REASONING_EFFORTS = {
|
|
66
|
+
NONE: 'none',
|
|
67
|
+
MINIMAL: 'minimal',
|
|
68
|
+
LOW: 'low',
|
|
69
|
+
MEDIUM: 'medium',
|
|
70
|
+
HIGH: 'high',
|
|
71
|
+
XHIGH: 'xhigh',
|
|
72
|
+
};
|
|
73
|
+
// Sandbox modes
|
|
74
|
+
export const SANDBOX_MODES = {
|
|
75
|
+
READ_ONLY: 'read-only',
|
|
76
|
+
WORKSPACE_WRITE: 'workspace-write',
|
|
77
|
+
DANGER_FULL_ACCESS: 'danger-full-access',
|
|
78
|
+
};
|
|
79
|
+
// Approval policies
|
|
80
|
+
export const APPROVAL_POLICIES = {
|
|
81
|
+
UNTRUSTED: 'untrusted',
|
|
82
|
+
ON_FAILURE: 'on-failure',
|
|
83
|
+
ON_REQUEST: 'on-request',
|
|
84
|
+
NEVER: 'never',
|
|
85
|
+
};
|
|
86
|
+
// MCP Protocol Constants
|
|
87
|
+
export const PROTOCOL = {
|
|
88
|
+
// Message roles
|
|
89
|
+
ROLES: {
|
|
90
|
+
USER: 'user',
|
|
91
|
+
ASSISTANT: 'assistant',
|
|
92
|
+
},
|
|
93
|
+
// Content types
|
|
94
|
+
CONTENT_TYPES: {
|
|
95
|
+
TEXT: 'text',
|
|
96
|
+
},
|
|
97
|
+
// Status codes
|
|
98
|
+
STATUS: {
|
|
99
|
+
SUCCESS: 'success',
|
|
100
|
+
ERROR: 'error',
|
|
101
|
+
FAILED: 'failed',
|
|
102
|
+
REPORT: 'report',
|
|
103
|
+
},
|
|
104
|
+
// Notification methods
|
|
105
|
+
NOTIFICATIONS: {
|
|
106
|
+
PROGRESS: 'notifications/progress',
|
|
107
|
+
},
|
|
108
|
+
// Timeout prevention
|
|
109
|
+
KEEPALIVE_INTERVAL: 25000, // 25 seconds
|
|
110
|
+
};
|
|
111
|
+
// CLI Constants
|
|
112
|
+
export const CLI = {
|
|
113
|
+
// Command names
|
|
114
|
+
COMMANDS: {
|
|
115
|
+
CODEX: 'codex',
|
|
116
|
+
CODEX_EXEC: 'codex exec',
|
|
117
|
+
ECHO: 'echo',
|
|
118
|
+
},
|
|
119
|
+
// Command flags
|
|
120
|
+
FLAGS: {
|
|
121
|
+
MODEL: '-m',
|
|
122
|
+
SANDBOX: '-s', // legacy flag. For Codex prefer FULL_AUTO or SANDBOX/APPROVAL flags.
|
|
123
|
+
FULL_AUTO: '--full-auto',
|
|
124
|
+
ASK_FOR_APPROVAL: '--ask-for-approval',
|
|
125
|
+
SANDBOX_MODE: '--sandbox',
|
|
126
|
+
APPROVAL: '-a',
|
|
127
|
+
YOLO: '--dangerously-bypass-approvals-and-sandbox',
|
|
128
|
+
SKIP_GIT_REPO_CHECK: '--skip-git-repo-check',
|
|
129
|
+
CD: '--cd',
|
|
130
|
+
PROMPT: '-p',
|
|
131
|
+
HELP: '-help',
|
|
132
|
+
IMAGE: '-i',
|
|
133
|
+
PROFILE: '--profile',
|
|
134
|
+
CONFIG: '-c',
|
|
135
|
+
VERSION: '--version',
|
|
136
|
+
WORKING_DIR: '-C',
|
|
137
|
+
OSS: '--oss',
|
|
138
|
+
ENABLE: '--enable',
|
|
139
|
+
DISABLE: '--disable',
|
|
140
|
+
},
|
|
141
|
+
// Default values
|
|
142
|
+
DEFAULTS: {
|
|
143
|
+
MODEL: 'default', // Fallback model used when no specific model is provided
|
|
144
|
+
BOOLEAN_TRUE: 'true',
|
|
145
|
+
BOOLEAN_FALSE: 'false',
|
|
146
|
+
},
|
|
147
|
+
// Environment variables for working directory resolution
|
|
148
|
+
ENV_VARS: {
|
|
149
|
+
CODEX_MCP_CWD: 'CODEX_MCP_CWD', // Primary: Set in MCP client configuration
|
|
150
|
+
PWD: 'PWD', // Secondary: Standard Unix variable
|
|
151
|
+
INIT_CWD: 'INIT_CWD', // Tertiary: Node.js initial directory
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, SetLevelRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { Logger } from './utils/logger.js';
|
|
6
|
+
import { PROTOCOL } from './constants.js';
|
|
7
|
+
import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage, } from './tools/index.js';
|
|
8
|
+
const server = new Server({
|
|
9
|
+
name: 'codex-cli-mcp',
|
|
10
|
+
version: '1.3.0',
|
|
11
|
+
}, {
|
|
12
|
+
capabilities: {
|
|
13
|
+
tools: {},
|
|
14
|
+
prompts: {},
|
|
15
|
+
notifications: {},
|
|
16
|
+
logging: {},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
// Removed global state - using per-request state instead
|
|
20
|
+
/**
|
|
21
|
+
* @param progressToken The progress token provided by the client
|
|
22
|
+
* @param progress The current progress value
|
|
23
|
+
* @param total Optional total value
|
|
24
|
+
* @param message Optional status message
|
|
25
|
+
*/
|
|
26
|
+
async function sendProgressNotification(progressToken, progress, total, message) {
|
|
27
|
+
if (!progressToken)
|
|
28
|
+
return; // Only send if client requested progress
|
|
29
|
+
try {
|
|
30
|
+
const params = {
|
|
31
|
+
progressToken,
|
|
32
|
+
progress,
|
|
33
|
+
};
|
|
34
|
+
if (total !== undefined)
|
|
35
|
+
params.total = total; // future cache progress
|
|
36
|
+
if (message)
|
|
37
|
+
params.message = message;
|
|
38
|
+
await server.notification({
|
|
39
|
+
method: PROTOCOL.NOTIFICATIONS.PROGRESS,
|
|
40
|
+
params,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
Logger.error('Failed to send progress notification:', error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function startProgressUpdates(operationName, progressToken) {
|
|
48
|
+
// Per-request state
|
|
49
|
+
const state = {
|
|
50
|
+
isProcessing: true,
|
|
51
|
+
currentOperationName: operationName,
|
|
52
|
+
latestOutput: '',
|
|
53
|
+
};
|
|
54
|
+
const progressMessages = [
|
|
55
|
+
`🧠 ${operationName} - Codex is analyzing your request...`,
|
|
56
|
+
`📊 ${operationName} - Processing files and generating insights...`,
|
|
57
|
+
`✨ ${operationName} - Creating structured response for your review...`,
|
|
58
|
+
`⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
|
|
59
|
+
`🔍 ${operationName} - Still working... hang tight for quality results...`,
|
|
60
|
+
];
|
|
61
|
+
let messageIndex = 0;
|
|
62
|
+
let progress = 0;
|
|
63
|
+
// Send immediate acknowledgment if progress requested
|
|
64
|
+
if (progressToken) {
|
|
65
|
+
sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
|
|
66
|
+
`🔍 Starting ${operationName}`);
|
|
67
|
+
}
|
|
68
|
+
// Keep client alive with periodic updates
|
|
69
|
+
const progressInterval = setInterval(async () => {
|
|
70
|
+
if (state.isProcessing && progressToken) {
|
|
71
|
+
// Simply increment progress value
|
|
72
|
+
progress += 1;
|
|
73
|
+
// Include latest output if available
|
|
74
|
+
const baseMessage = progressMessages[messageIndex % progressMessages.length];
|
|
75
|
+
const outputPreview = state.latestOutput.slice(-150).trim(); // Last 150 chars
|
|
76
|
+
const message = outputPreview
|
|
77
|
+
? `${baseMessage}\n📝 Output: ...${outputPreview}`
|
|
78
|
+
: baseMessage;
|
|
79
|
+
await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
|
|
80
|
+
message);
|
|
81
|
+
messageIndex++;
|
|
82
|
+
}
|
|
83
|
+
else if (!state.isProcessing) {
|
|
84
|
+
clearInterval(progressInterval);
|
|
85
|
+
}
|
|
86
|
+
}, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
|
|
87
|
+
return { interval: progressInterval, progressToken, state };
|
|
88
|
+
}
|
|
89
|
+
function stopProgressUpdates(progressData, success = true) {
|
|
90
|
+
const operationName = progressData.state?.currentOperationName || ''; // Get from state
|
|
91
|
+
if (progressData.state) {
|
|
92
|
+
progressData.state.isProcessing = false;
|
|
93
|
+
}
|
|
94
|
+
clearInterval(progressData.interval);
|
|
95
|
+
// Send final progress notification if client requested progress
|
|
96
|
+
if (progressData.progressToken) {
|
|
97
|
+
sendProgressNotification(progressData.progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// logging/setLevel
|
|
101
|
+
server.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
102
|
+
Logger.setLevel(request.params.level);
|
|
103
|
+
Logger.debug(`Log level updated to '${request.params.level}' via client request.`);
|
|
104
|
+
return {};
|
|
105
|
+
});
|
|
106
|
+
// tools/list
|
|
107
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
108
|
+
return { tools: getToolDefinitions() };
|
|
109
|
+
});
|
|
110
|
+
// tools/get
|
|
111
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
112
|
+
const toolName = request.params.name;
|
|
113
|
+
if (toolExists(toolName)) {
|
|
114
|
+
// Check if client requested progress updates
|
|
115
|
+
const progressToken = request.params._meta?.progressToken;
|
|
116
|
+
// Start progress updates if client requested them
|
|
117
|
+
const progressData = startProgressUpdates(toolName, progressToken);
|
|
118
|
+
try {
|
|
119
|
+
// Get prompt and other parameters from arguments with proper typing
|
|
120
|
+
const args = request.params.arguments || {};
|
|
121
|
+
Logger.toolInvocation(toolName, request.params.arguments);
|
|
122
|
+
// Execute the tool using the unified registry with progress callback
|
|
123
|
+
const result = await executeTool(toolName, args, newOutput => {
|
|
124
|
+
if (progressData.state) {
|
|
125
|
+
progressData.state.latestOutput = newOutput;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Stop progress updates
|
|
129
|
+
stopProgressUpdates(progressData, true);
|
|
130
|
+
return {
|
|
131
|
+
content: [
|
|
132
|
+
{
|
|
133
|
+
type: 'text',
|
|
134
|
+
text: result,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
isError: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// Stop progress updates on error
|
|
142
|
+
stopProgressUpdates(progressData, false);
|
|
143
|
+
Logger.error(`Error in tool '${toolName}':`, error);
|
|
144
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
145
|
+
return {
|
|
146
|
+
content: [
|
|
147
|
+
{
|
|
148
|
+
type: 'text',
|
|
149
|
+
text: `Error executing ${toolName}: ${errorMessage}`,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
// prompts/list
|
|
161
|
+
server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
|
|
162
|
+
return { prompts: getPromptDefinitions() };
|
|
163
|
+
});
|
|
164
|
+
// prompts/get
|
|
165
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
166
|
+
const promptName = request.params.name;
|
|
167
|
+
const args = request.params.arguments || {};
|
|
168
|
+
const promptMessage = getPromptMessage(promptName, args);
|
|
169
|
+
if (!promptMessage) {
|
|
170
|
+
throw new Error(`Unknown prompt: ${promptName}`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
messages: [
|
|
174
|
+
{
|
|
175
|
+
role: 'user',
|
|
176
|
+
content: {
|
|
177
|
+
type: 'text',
|
|
178
|
+
text: promptMessage,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
// Start the server
|
|
185
|
+
async function main() {
|
|
186
|
+
Logger.debug('init codex-mcp-server');
|
|
187
|
+
const transport = new StdioServerTransport();
|
|
188
|
+
await server.connect(transport);
|
|
189
|
+
Logger.debug('codex-mcp-server listening on stdio');
|
|
190
|
+
}
|
|
191
|
+
main().catch(error => {
|
|
192
|
+
Logger.error('Fatal error:', error);
|
|
193
|
+
process.exit(1);
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-codex.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-codex.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgH5C,eAAO,MAAM,YAAY,EAAE,WA2M1B,CAAC"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCodex } from '../utils/codexExecutor.js';
|
|
3
|
+
import { processChangeModeOutput } from '../utils/changeModeRunner.js';
|
|
4
|
+
import { formatCodexResponseForMCP } from '../utils/outputParser.js';
|
|
5
|
+
import { APPROVAL_POLICIES, ERROR_MESSAGES } from '../constants.js';
|
|
6
|
+
// Model description for AI clients — MUST list exact valid model IDs
|
|
7
|
+
const MODEL_DESCRIPTION = [
|
|
8
|
+
'Model ID to use. IMPORTANT: Use exact IDs listed below, do NOT invent or modify model names.',
|
|
9
|
+
'Flagship: gpt-5.4 (recommended default), gpt-5.4-pro (high reasoning only).',
|
|
10
|
+
'Codex (coding): gpt-5.3-codex (best coding), gpt-5.3-codex-spark (instant, Pro only),',
|
|
11
|
+
' gpt-5.2-codex, gpt-5.1-codex-max, gpt-5.1-codex, gpt-5-codex, gpt-5-codex-mini.',
|
|
12
|
+
'General: gpt-5.2, gpt-5.1, gpt-5, gpt-5-pro, gpt-5-mini, gpt-5-nano.',
|
|
13
|
+
'Reasoning: o3, o3-pro, o4-mini.',
|
|
14
|
+
'Non-reasoning (1M ctx): gpt-4.1, gpt-4.1-mini, gpt-4.1-nano.',
|
|
15
|
+
'Legacy: gpt-4o, gpt-4o-mini.',
|
|
16
|
+
].join(' ');
|
|
17
|
+
const REASONING_DESCRIPTION = [
|
|
18
|
+
'Reasoning effort level. Controls depth of internal reasoning.',
|
|
19
|
+
'Values: none, minimal, low, medium (default), high, xhigh.',
|
|
20
|
+
'Higher = deeper analysis but slower and more expensive.',
|
|
21
|
+
'Not all models support all levels.',
|
|
22
|
+
'gpt-5.4 supports: none/low/medium/high/xhigh.',
|
|
23
|
+
'gpt-5.3-codex supports: low/medium/high/xhigh.',
|
|
24
|
+
'o3/o4-mini support: low/medium/high.',
|
|
25
|
+
].join(' ');
|
|
26
|
+
const askCodexArgsSchema = z.object({
|
|
27
|
+
prompt: z
|
|
28
|
+
.string()
|
|
29
|
+
.min(1)
|
|
30
|
+
.describe("Task or question. Use @ to include files (e.g., '@largefile.ts explain')."),
|
|
31
|
+
model: z.string().optional().describe(MODEL_DESCRIPTION),
|
|
32
|
+
reasoningEffort: z
|
|
33
|
+
.enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
|
|
34
|
+
.optional()
|
|
35
|
+
.describe(REASONING_DESCRIPTION),
|
|
36
|
+
sandbox: z
|
|
37
|
+
.boolean()
|
|
38
|
+
.default(false)
|
|
39
|
+
.describe('Quick automation mode: enables workspace-write + on-failure approval. Alias for fullAuto.'),
|
|
40
|
+
fullAuto: z.boolean().optional().describe('Full automation mode'),
|
|
41
|
+
approvalPolicy: z
|
|
42
|
+
.enum(['never', 'on-request', 'on-failure', 'untrusted'])
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Approval: never, on-request, on-failure, untrusted'),
|
|
45
|
+
approval: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe(`Approval policy: ${Object.values(APPROVAL_POLICIES).join(', ')}`),
|
|
49
|
+
sandboxMode: z
|
|
50
|
+
.enum(['read-only', 'workspace-write', 'danger-full-access'])
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Access: read-only, workspace-write, danger-full-access'),
|
|
53
|
+
yolo: z.boolean().optional().describe('⚠️ Bypass all safety (dangerous)'),
|
|
54
|
+
cd: z.string().optional().describe('Working directory'),
|
|
55
|
+
workingDir: z.string().optional().describe('Working directory for execution'),
|
|
56
|
+
changeMode: z
|
|
57
|
+
.boolean()
|
|
58
|
+
.default(false)
|
|
59
|
+
.describe('Return structured OLD/NEW edits for refactoring'),
|
|
60
|
+
chunkIndex: z
|
|
61
|
+
.preprocess(val => {
|
|
62
|
+
if (typeof val === 'number')
|
|
63
|
+
return val;
|
|
64
|
+
if (typeof val === 'string') {
|
|
65
|
+
const parsed = parseInt(val, 10);
|
|
66
|
+
return isNaN(parsed) ? undefined : parsed;
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}, z.number().min(1).optional())
|
|
70
|
+
.describe('Chunk index (1-based)'),
|
|
71
|
+
chunkCacheKey: z.string().optional().describe('Cache key for continuation'),
|
|
72
|
+
image: z
|
|
73
|
+
.union([z.string(), z.array(z.string())])
|
|
74
|
+
.optional()
|
|
75
|
+
.describe('Optional image file path(s) to include with the prompt'),
|
|
76
|
+
config: z
|
|
77
|
+
.union([z.string(), z.record(z.any())])
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("Configuration overrides as 'key=value' string or object"),
|
|
80
|
+
profile: z.string().optional().describe('Configuration profile to use from ~/.codex/config.toml'),
|
|
81
|
+
timeout: z.number().optional().describe('Maximum execution time in milliseconds (optional)'),
|
|
82
|
+
includeThinking: z
|
|
83
|
+
.boolean()
|
|
84
|
+
.default(true)
|
|
85
|
+
.describe('Include reasoning/thinking section in response'),
|
|
86
|
+
includeMetadata: z.boolean().default(true).describe('Include configuration metadata in response'),
|
|
87
|
+
search: z
|
|
88
|
+
.boolean()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Enable web search by activating web_search_request feature flag. Requires network access - automatically sets sandbox to workspace-write if not specified.'),
|
|
91
|
+
oss: z
|
|
92
|
+
.boolean()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('Use local Ollama server (convenience for -c model_provider=oss). Requires Ollama running locally. Automatically sets sandbox to workspace-write if not specified.'),
|
|
95
|
+
enableFeatures: z
|
|
96
|
+
.array(z.string())
|
|
97
|
+
.optional()
|
|
98
|
+
.describe('Enable feature flags (repeatable). Equivalent to -c features.<name>=true'),
|
|
99
|
+
disableFeatures: z
|
|
100
|
+
.array(z.string())
|
|
101
|
+
.optional()
|
|
102
|
+
.describe('Disable feature flags (repeatable). Equivalent to -c features.<name>=false'),
|
|
103
|
+
});
|
|
104
|
+
export const askCodexTool = {
|
|
105
|
+
name: 'ask-codex',
|
|
106
|
+
description: 'Execute Codex CLI with file analysis (@syntax), model selection, and safety controls. Supports changeMode.',
|
|
107
|
+
zodSchema: askCodexArgsSchema,
|
|
108
|
+
prompt: {
|
|
109
|
+
description: 'Execute Codex CLI with optional changeMode',
|
|
110
|
+
},
|
|
111
|
+
category: 'utility',
|
|
112
|
+
execute: async (args, onProgress) => {
|
|
113
|
+
const { prompt, model, reasoningEffort, sandbox, fullAuto, approvalPolicy, approval, sandboxMode, yolo, cd, workingDir, changeMode, chunkIndex, chunkCacheKey, image, config, profile, timeout, includeThinking, includeMetadata, search, oss, enableFeatures, disableFeatures, } = args;
|
|
114
|
+
if (!prompt?.trim()) {
|
|
115
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
116
|
+
}
|
|
117
|
+
if (changeMode && chunkIndex && chunkCacheKey) {
|
|
118
|
+
return processChangeModeOutput('', {
|
|
119
|
+
chunkIndex: chunkIndex,
|
|
120
|
+
cacheKey: chunkCacheKey,
|
|
121
|
+
prompt: prompt,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
// Use enhanced executeCodex for better feature support
|
|
126
|
+
const result = await executeCodex(prompt, {
|
|
127
|
+
model: model,
|
|
128
|
+
reasoningEffort: reasoningEffort,
|
|
129
|
+
fullAuto: Boolean(fullAuto ?? sandbox),
|
|
130
|
+
approvalPolicy: approvalPolicy,
|
|
131
|
+
approval: approval,
|
|
132
|
+
sandboxMode: sandboxMode,
|
|
133
|
+
yolo: Boolean(yolo),
|
|
134
|
+
cd: cd,
|
|
135
|
+
workingDir: workingDir,
|
|
136
|
+
image,
|
|
137
|
+
config,
|
|
138
|
+
profile: profile,
|
|
139
|
+
timeout: timeout,
|
|
140
|
+
search: search,
|
|
141
|
+
oss: oss,
|
|
142
|
+
enableFeatures: enableFeatures,
|
|
143
|
+
disableFeatures: disableFeatures,
|
|
144
|
+
}, onProgress);
|
|
145
|
+
if (changeMode) {
|
|
146
|
+
return processChangeModeOutput(result, {
|
|
147
|
+
chunkIndex: args.chunkIndex,
|
|
148
|
+
prompt: prompt,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Format response with enhanced output parsing
|
|
152
|
+
return formatCodexResponseForMCP(result, includeThinking, includeMetadata);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
156
|
+
// Enhanced error handling with helpful context
|
|
157
|
+
if (errorMessage.includes('not found') || errorMessage.includes('command not found')) {
|
|
158
|
+
return `❌ **Codex CLI Not Found**: ${ERROR_MESSAGES.CODEX_NOT_FOUND}
|
|
159
|
+
|
|
160
|
+
**Quick Fix:**
|
|
161
|
+
\`\`\`bash
|
|
162
|
+
npm install -g @openai/codex
|
|
163
|
+
\`\`\`
|
|
164
|
+
|
|
165
|
+
**Verification:** Run \`codex --version\` to confirm installation.`;
|
|
166
|
+
}
|
|
167
|
+
if (errorMessage.includes('authentication') || errorMessage.includes('unauthorized')) {
|
|
168
|
+
return `❌ **Authentication Failed**: ${ERROR_MESSAGES.AUTHENTICATION_FAILED}
|
|
169
|
+
|
|
170
|
+
**Setup Options:**
|
|
171
|
+
1. **API Key:** \`export OPENAI_API_KEY=your-key\`
|
|
172
|
+
2. **Login:** \`codex login\` (requires ChatGPT subscription)
|
|
173
|
+
|
|
174
|
+
**Troubleshooting:** Verify key has Codex access in OpenAI dashboard.`;
|
|
175
|
+
}
|
|
176
|
+
if (errorMessage.includes('quota') || errorMessage.includes('rate limit')) {
|
|
177
|
+
return `❌ **Usage Limit Reached**: ${ERROR_MESSAGES.QUOTA_EXCEEDED}
|
|
178
|
+
|
|
179
|
+
**Solutions:**
|
|
180
|
+
1. Wait and retry - rate limits reset periodically
|
|
181
|
+
2. Check quota in OpenAI dashboard`;
|
|
182
|
+
}
|
|
183
|
+
if (errorMessage.includes('timeout')) {
|
|
184
|
+
return `❌ **Request Timeout**: Operation took longer than expected
|
|
185
|
+
|
|
186
|
+
**Solutions:**
|
|
187
|
+
1. Increase timeout: Add \`timeout: 300000\` (5 minutes)
|
|
188
|
+
2. Simplify request: Break complex queries into smaller parts`;
|
|
189
|
+
}
|
|
190
|
+
if (errorMessage.includes('sandbox') || errorMessage.includes('permission')) {
|
|
191
|
+
// Enhanced debugging information
|
|
192
|
+
const debugInfo = [
|
|
193
|
+
`**Current Configuration:**`,
|
|
194
|
+
`- yolo: ${yolo}`,
|
|
195
|
+
`- fullAuto: ${fullAuto}`,
|
|
196
|
+
`- sandbox: ${sandbox}`,
|
|
197
|
+
`- sandboxMode: ${sandboxMode}`,
|
|
198
|
+
`- approvalPolicy: ${approvalPolicy}`,
|
|
199
|
+
`- search: ${search}`,
|
|
200
|
+
`- oss: ${oss}`,
|
|
201
|
+
].join('\n');
|
|
202
|
+
return `❌ **Permission Error**: ${ERROR_MESSAGES.SANDBOX_VIOLATION}
|
|
203
|
+
|
|
204
|
+
${debugInfo}
|
|
205
|
+
|
|
206
|
+
**Root Cause:**
|
|
207
|
+
This error typically occurs when:
|
|
208
|
+
1. \`approvalPolicy\` is set without \`sandboxMode\` (now auto-fixed in v1.2+)
|
|
209
|
+
2. Explicit \`sandboxMode: "read-only"\` blocks file modifications
|
|
210
|
+
3. Codex CLI defaults to restrictive permissions
|
|
211
|
+
4. **YOLO mode not working**: If yolo is true but still blocked, there may be a configuration conflict
|
|
212
|
+
|
|
213
|
+
**Solutions:**
|
|
214
|
+
|
|
215
|
+
**Option A - Explicit Control (Recommended):**
|
|
216
|
+
\`\`\`json
|
|
217
|
+
{
|
|
218
|
+
"approvalPolicy": "on-failure",
|
|
219
|
+
"sandboxMode": "workspace-write",
|
|
220
|
+
"model": "gpt-5.4",
|
|
221
|
+
"prompt": "your task..."
|
|
222
|
+
}
|
|
223
|
+
\`\`\`
|
|
224
|
+
|
|
225
|
+
**Option B - Automated Mode:**
|
|
226
|
+
\`\`\`json
|
|
227
|
+
{
|
|
228
|
+
"sandbox": true, // Enables fullAuto (workspace-write + on-failure)
|
|
229
|
+
"model": "gpt-5.4",
|
|
230
|
+
"prompt": "your task..."
|
|
231
|
+
}
|
|
232
|
+
\`\`\`
|
|
233
|
+
|
|
234
|
+
**Option C - Full Bypass (⚠️ Use with caution):**
|
|
235
|
+
\`\`\`json
|
|
236
|
+
{
|
|
237
|
+
"yolo": true,
|
|
238
|
+
"model": "gpt-5.4",
|
|
239
|
+
"prompt": "your task..."
|
|
240
|
+
}
|
|
241
|
+
\`\`\`
|
|
242
|
+
|
|
243
|
+
**Debug Steps:**
|
|
244
|
+
1. Check if yolo mode is being overridden by other settings
|
|
245
|
+
2. Verify Codex CLI version supports yolo flag
|
|
246
|
+
3. Try using only yolo without other conflicting parameters
|
|
247
|
+
|
|
248
|
+
**Sandbox Modes:**
|
|
249
|
+
- \`read-only\`: Analysis only, no modifications
|
|
250
|
+
- \`workspace-write\`: Can edit files in workspace (safe for most tasks)
|
|
251
|
+
- \`danger-full-access\`: Full system access (use with caution)`;
|
|
252
|
+
}
|
|
253
|
+
// Generic error with context
|
|
254
|
+
return `❌ **Codex Execution Error**: ${errorMessage}
|
|
255
|
+
|
|
256
|
+
**Debug Steps:**
|
|
257
|
+
1. Verify Codex CLI: \`codex --version\`
|
|
258
|
+
2. Check authentication: \`codex login\`
|
|
259
|
+
3. Try simpler query first`;
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=ask-codex.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-codex.tool.js","sourceRoot":"","sources":["../../src/tools/ask-codex.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEpE,qEAAqE;AACrE,MAAM,iBAAiB,GAAG;IACxB,8FAA8F;IAC9F,6EAA6E;IAC7E,uFAAuF;IACvF,mFAAmF;IACnF,sEAAsE;IACtE,iCAAiC;IACjC,8DAA8D;IAC9D,8BAA8B;CAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,qBAAqB,GAAG;IAC5B,+DAA+D;IAC/D,4DAA4D;IAC5D,yDAAyD;IACzD,oCAAoC;IACpC,+CAA+C;IAC/C,gDAAgD;IAChD,sCAAsC;CACvC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,2EAA2E,CAAC;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACxD,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SAC3D,QAAQ,EAAE;SACV,QAAQ,CAAC,qBAAqB,CAAC;IAClC,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,2FAA2F,CAC5F;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACjE,cAAc,EAAE,CAAC;SACd,IAAI,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;SACxD,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oBAAoB,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9E,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;SAC5D,QAAQ,EAAE;SACV,QAAQ,CAAC,wDAAwD,CAAC;IACrE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACzE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC7E,UAAU,EAAE,CAAC;SACV,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,iDAAiD,CAAC;IAC9D,UAAU,EAAE,CAAC;SACV,UAAU,CAAC,GAAG,CAAC,EAAE;QAChB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC/B,QAAQ,CAAC,uBAAuB,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC3E,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACxC,QAAQ,EAAE;SACV,QAAQ,CAAC,wDAAwD,CAAC;IACrE,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SACtC,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACjG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC5F,eAAe,EAAE,CAAC;SACf,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,gDAAgD,CAAC;IAC7D,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACjG,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,4JAA4J,CAC7J;IACH,GAAG,EAAE,CAAC;SACH,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,mKAAmK,CACpK;IACH,cAAc,EAAE,CAAC;SACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,eAAe,EAAE,CAAC;SACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;CAC1F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,4GAA4G;IAC9G,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE;QACN,WAAW,EAAE,4CAA4C;KAC1D;IACD,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,EACJ,MAAM,EACN,KAAK,EACL,eAAe,EACf,OAAO,EACP,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,EAAE,EACF,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,eAAe,EACf,eAAe,EACf,MAAM,EACN,GAAG,EACH,cAAc,EACd,eAAe,GAChB,GAAG,IAAI,CAAC;QAET,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;YAC9C,OAAO,uBAAuB,CAAC,EAAE,EAAE;gBACjC,UAAU,EAAE,UAAoB;gBAChC,QAAQ,EAAE,aAAuB;gBACjC,MAAM,EAAE,MAAgB;aACzB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,MAAgB,EAChB;gBACE,KAAK,EAAE,KAAe;gBACtB,eAAe,EAAE,eAAyB;gBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;gBACtC,cAAc,EAAE,cAAqB;gBACrC,QAAQ,EAAE,QAAkB;gBAC5B,WAAW,EAAE,WAAkB;gBAC/B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,EAAY;gBAChB,UAAU,EAAE,UAAoB;gBAChC,KAAK;gBACL,MAAM;gBACN,OAAO,EAAE,OAAiB;gBAC1B,OAAO,EAAE,OAAiB;gBAC1B,MAAM,EAAE,MAAiB;gBACzB,GAAG,EAAE,GAAc;gBACnB,cAAc,EAAE,cAA0B;gBAC1C,eAAe,EAAE,eAA2B;aAC7C,EACD,UAAU,CACX,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,uBAAuB,CAAC,MAAM,EAAE;oBACrC,UAAU,EAAE,IAAI,CAAC,UAAgC;oBACjD,MAAM,EAAE,MAAgB;iBACzB,CAAC,CAAC;YACL,CAAC;YAED,+CAA+C;YAC/C,OAAO,yBAAyB,CAC9B,MAAM,EACN,eAA0B,EAC1B,eAA0B,CAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5E,+CAA+C;YAC/C,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACrF,OAAO,8BAA8B,cAAc,CAAC,eAAe;;;;;;;mEAOR,CAAC;YAC9D,CAAC;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrF,OAAO,gCAAgC,cAAc,CAAC,qBAAqB;;;;;;sEAMb,CAAC;YACjE,CAAC;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1E,OAAO,8BAA8B,cAAc,CAAC,cAAc;;;;mCAIvC,CAAC;YAC9B,CAAC;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,OAAO;;;;8DAI+C,CAAC;YACzD,CAAC;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC5E,iCAAiC;gBACjC,MAAM,SAAS,GAAG;oBAChB,4BAA4B;oBAC5B,WAAW,IAAI,EAAE;oBACjB,eAAe,QAAQ,EAAE;oBACzB,cAAc,OAAO,EAAE;oBACvB,kBAAkB,WAAW,EAAE;oBAC/B,qBAAqB,cAAc,EAAE;oBACrC,aAAa,MAAM,EAAE;oBACrB,UAAU,GAAG,EAAE;iBAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,OAAO,2BAA2B,cAAc,CAAC,iBAAiB;;EAExE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEA+CqD,CAAC;YAC3D,CAAC;YAED,6BAA6B;YAC7B,OAAO,gCAAgC,YAAY;;;;;2BAK9B,CAAC;QACxB,CAAC;IACH,CAAC;CACF,CAAC"}
|