@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 @@
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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const askCodexTool: UnifiedTool;
3
+ //# sourceMappingURL=ask-codex.tool.d.ts.map
@@ -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"}