@trishchuk/codex-mcp-tool 1.0.5 → 1.2.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 +10 -11
- package/dist/constants.d.ts +55 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +74 -31
- package/dist/constants.js.map +1 -1
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/apply-diff.tool.d.ts +3 -0
- package/dist/tools/apply-diff.tool.d.ts.map +1 -0
- package/dist/tools/apply-diff.tool.js +52 -0
- package/dist/tools/apply-diff.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -1
- package/dist/tools/ask-codex.tool.js +158 -33
- package/dist/tools/ask-codex.tool.js.map +1 -1
- 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 +134 -0
- package/dist/tools/batch-codex.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -1
- package/dist/tools/brainstorm.tool.js +62 -29
- package/dist/tools/brainstorm.tool.js.map +1 -1
- package/dist/tools/exec-codex.tool.d.ts +3 -0
- package/dist/tools/exec-codex.tool.d.ts.map +1 -0
- package/dist/tools/exec-codex.tool.js +46 -0
- package/dist/tools/exec-codex.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -1
- package/dist/tools/fetch-chunk.tool.js +12 -8
- package/dist/tools/fetch-chunk.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +3 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +9 -5
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/review-codex.tool.d.ts +3 -0
- package/dist/tools/review-codex.tool.d.ts.map +1 -0
- package/dist/tools/review-codex.tool.js +91 -0
- package/dist/tools/review-codex.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +1 -0
- package/dist/tools/simple-tools.d.ts.map +1 -1
- package/dist/tools/simple-tools.js +42 -11
- package/dist/tools/simple-tools.js.map +1 -1
- package/dist/tools/test-tool.example.d.ts.map +1 -1
- package/dist/tools/test-tool.example.js +12 -10
- package/dist/tools/test-tool.example.js.map +1 -1
- package/dist/tools/timeout-test.tool.js +5 -5
- package/dist/tools/timeout-test.tool.js.map +1 -1
- package/dist/utils/changeModeChunker.d.ts.map +1 -1
- package/dist/utils/changeModeChunker.js +10 -6
- package/dist/utils/changeModeChunker.js.map +1 -1
- package/dist/utils/changeModeParser.d.ts.map +1 -1
- package/dist/utils/changeModeParser.js.map +1 -1
- package/dist/utils/changeModeRunner.d.ts.map +1 -1
- package/dist/utils/changeModeRunner.js +17 -11
- package/dist/utils/changeModeRunner.js.map +1 -1
- package/dist/utils/changeModeTranslator.d.ts.map +1 -1
- package/dist/utils/changeModeTranslator.js +5 -2
- package/dist/utils/changeModeTranslator.js.map +1 -1
- package/dist/utils/chunkCache.d.ts.map +1 -1
- package/dist/utils/chunkCache.js +6 -4
- package/dist/utils/chunkCache.js.map +1 -1
- package/dist/utils/codexExecutor.d.ts +17 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -1
- package/dist/utils/codexExecutor.js +163 -4
- package/dist/utils/codexExecutor.js.map +1 -1
- package/dist/utils/commandExecutor.d.ts.map +1 -1
- package/dist/utils/commandExecutor.js +25 -17
- package/dist/utils/commandExecutor.js.map +1 -1
- package/dist/utils/fibonacci.d.ts +2 -0
- package/dist/utils/fibonacci.d.ts.map +1 -0
- package/dist/utils/fibonacci.js +17 -0
- package/dist/utils/fibonacci.js.map +1 -0
- package/dist/utils/gitHelper.d.ts +20 -0
- package/dist/utils/gitHelper.d.ts.map +1 -0
- package/dist/utils/gitHelper.js +66 -0
- package/dist/utils/gitHelper.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +21 -15
- package/dist/utils/logger.js.map +1 -1
- 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 +6 -3
|
@@ -1,18 +1,43 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { executeCodex } from '../utils/codexExecutor.js';
|
|
3
3
|
import { processChangeModeOutput } from '../utils/changeModeRunner.js';
|
|
4
|
-
import {
|
|
4
|
+
import { formatCodexResponseForMCP } from '../utils/outputParser.js';
|
|
5
|
+
import { MODELS, APPROVAL_POLICIES, ERROR_MESSAGES } from '../constants.js';
|
|
5
6
|
const askCodexArgsSchema = z.object({
|
|
6
|
-
prompt: z
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
prompt: z
|
|
8
|
+
.string()
|
|
9
|
+
.min(1)
|
|
10
|
+
.describe("Task or question. Use @ to include files (e.g., '@largefile.ts explain')."),
|
|
11
|
+
model: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe(`Model: ${Object.values(MODELS).join(', ')}. Default: gpt-5-codex`),
|
|
15
|
+
sandbox: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.default(false)
|
|
18
|
+
.describe('Quick automation mode: enables workspace-write + on-failure approval. Alias for fullAuto.'),
|
|
19
|
+
fullAuto: z.boolean().optional().describe('Full automation mode'),
|
|
20
|
+
approvalPolicy: z
|
|
21
|
+
.enum(['never', 'on-request', 'on-failure', 'untrusted'])
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Approval: never, on-request, on-failure, untrusted'),
|
|
24
|
+
approval: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe(`Approval policy: ${Object.values(APPROVAL_POLICIES).join(', ')}`),
|
|
28
|
+
sandboxMode: z
|
|
29
|
+
.enum(['read-only', 'workspace-write', 'danger-full-access'])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Access: read-only, workspace-write, danger-full-access'),
|
|
32
|
+
yolo: z.boolean().optional().describe('⚠️ Bypass all safety (dangerous)'),
|
|
33
|
+
cd: z.string().optional().describe('Working directory'),
|
|
34
|
+
workingDir: z.string().optional().describe('Working directory for execution'),
|
|
35
|
+
changeMode: z
|
|
36
|
+
.boolean()
|
|
37
|
+
.default(false)
|
|
38
|
+
.describe('Return structured OLD/NEW edits for refactoring'),
|
|
39
|
+
chunkIndex: z
|
|
40
|
+
.preprocess(val => {
|
|
16
41
|
if (typeof val === 'number')
|
|
17
42
|
return val;
|
|
18
43
|
if (typeof val === 'string') {
|
|
@@ -20,41 +45,141 @@ const askCodexArgsSchema = z.object({
|
|
|
20
45
|
return isNaN(parsed) ? undefined : parsed;
|
|
21
46
|
}
|
|
22
47
|
return undefined;
|
|
23
|
-
}, z.number().min(1).optional())
|
|
24
|
-
|
|
48
|
+
}, z.number().min(1).optional())
|
|
49
|
+
.describe('Chunk index (1-based)'),
|
|
50
|
+
chunkCacheKey: z.string().optional().describe('Cache key for continuation'),
|
|
51
|
+
image: z
|
|
52
|
+
.union([z.string(), z.array(z.string())])
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('Optional image file path(s) to include with the prompt'),
|
|
55
|
+
config: z
|
|
56
|
+
.union([z.string(), z.record(z.any())])
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Configuration overrides as 'key=value' string or object"),
|
|
59
|
+
profile: z.string().optional().describe('Configuration profile to use from ~/.codex/config.toml'),
|
|
60
|
+
timeout: z.number().optional().describe('Maximum execution time in milliseconds (optional)'),
|
|
61
|
+
includeThinking: z
|
|
62
|
+
.boolean()
|
|
63
|
+
.default(true)
|
|
64
|
+
.describe('Include reasoning/thinking section in response'),
|
|
65
|
+
includeMetadata: z.boolean().default(true).describe('Include configuration metadata in response'),
|
|
66
|
+
search: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('Enable web search by activating web_search_request feature flag. Requires network access - automatically sets sandbox to workspace-write if not specified.'),
|
|
70
|
+
oss: z
|
|
71
|
+
.boolean()
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Use local Ollama server (convenience for -c model_provider=oss). Requires Ollama running locally. Automatically sets sandbox to workspace-write if not specified.'),
|
|
74
|
+
enableFeatures: z
|
|
75
|
+
.array(z.string())
|
|
76
|
+
.optional()
|
|
77
|
+
.describe('Enable feature flags (repeatable). Equivalent to -c features.<name>=true'),
|
|
78
|
+
disableFeatures: z
|
|
79
|
+
.array(z.string())
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Disable feature flags (repeatable). Equivalent to -c features.<name>=false'),
|
|
25
82
|
});
|
|
26
83
|
export const askCodexTool = {
|
|
27
84
|
name: 'ask-codex',
|
|
28
|
-
description:
|
|
85
|
+
description: 'Execute Codex CLI with file analysis (@syntax), model selection, and safety controls. Supports changeMode.',
|
|
29
86
|
zodSchema: askCodexArgsSchema,
|
|
30
87
|
prompt: {
|
|
31
|
-
description:
|
|
88
|
+
description: 'Execute Codex CLI with optional changeMode',
|
|
32
89
|
},
|
|
33
90
|
category: 'utility',
|
|
34
91
|
execute: async (args, onProgress) => {
|
|
35
|
-
const { prompt, model, sandbox, fullAuto, approvalPolicy, sandboxMode, yolo, cd, changeMode, chunkIndex, chunkCacheKey } = args;
|
|
92
|
+
const { prompt, model, sandbox, fullAuto, approvalPolicy, approval, sandboxMode, yolo, cd, workingDir, changeMode, chunkIndex, chunkCacheKey, image, config, profile, timeout, includeThinking, includeMetadata, search, oss, enableFeatures, disableFeatures, } = args;
|
|
93
|
+
if (!prompt?.trim()) {
|
|
94
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
95
|
+
}
|
|
36
96
|
if (changeMode && chunkIndex && chunkCacheKey) {
|
|
37
97
|
return processChangeModeOutput('', {
|
|
38
98
|
chunkIndex: chunkIndex,
|
|
39
99
|
cacheKey: chunkCacheKey,
|
|
40
|
-
prompt: prompt
|
|
100
|
+
prompt: prompt,
|
|
41
101
|
});
|
|
42
102
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
103
|
+
try {
|
|
104
|
+
// Use enhanced executeCodex for better feature support
|
|
105
|
+
const result = await executeCodex(prompt, {
|
|
106
|
+
model: model,
|
|
107
|
+
fullAuto: Boolean(fullAuto ?? sandbox),
|
|
108
|
+
approvalPolicy: approvalPolicy,
|
|
109
|
+
approval: approval,
|
|
110
|
+
sandboxMode: sandboxMode,
|
|
111
|
+
yolo: Boolean(yolo),
|
|
112
|
+
cd: cd,
|
|
113
|
+
workingDir: workingDir,
|
|
114
|
+
image,
|
|
115
|
+
config,
|
|
116
|
+
profile: profile,
|
|
117
|
+
timeout: timeout,
|
|
118
|
+
search: search,
|
|
119
|
+
oss: oss,
|
|
120
|
+
enableFeatures: enableFeatures,
|
|
121
|
+
disableFeatures: disableFeatures,
|
|
122
|
+
}, onProgress);
|
|
123
|
+
if (changeMode) {
|
|
124
|
+
return processChangeModeOutput(result, {
|
|
125
|
+
chunkIndex: args.chunkIndex,
|
|
126
|
+
prompt: prompt,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Format response with enhanced output parsing
|
|
130
|
+
return formatCodexResponseForMCP(result, includeThinking, includeMetadata);
|
|
56
131
|
}
|
|
57
|
-
|
|
58
|
-
|
|
132
|
+
catch (error) {
|
|
133
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
134
|
+
// Enhanced error handling with helpful context
|
|
135
|
+
if (errorMessage.includes('not found') || errorMessage.includes('command not found')) {
|
|
136
|
+
return `❌ **Codex CLI Not Found**: ${ERROR_MESSAGES.CODEX_NOT_FOUND}
|
|
137
|
+
|
|
138
|
+
**Quick Fix:**
|
|
139
|
+
\`\`\`bash
|
|
140
|
+
npm install -g @openai/codex
|
|
141
|
+
\`\`\`
|
|
142
|
+
|
|
143
|
+
**Verification:** Run \`codex --version\` to confirm installation.`;
|
|
144
|
+
}
|
|
145
|
+
if (errorMessage.includes('authentication') || errorMessage.includes('unauthorized')) {
|
|
146
|
+
return `❌ **Authentication Failed**: ${ERROR_MESSAGES.AUTHENTICATION_FAILED}
|
|
147
|
+
|
|
148
|
+
**Setup Options:**
|
|
149
|
+
1. **API Key:** \`export OPENAI_API_KEY=your-key\`
|
|
150
|
+
2. **Login:** \`codex login\` (requires ChatGPT subscription)
|
|
151
|
+
|
|
152
|
+
**Troubleshooting:** Verify key has Codex access in OpenAI dashboard.`;
|
|
153
|
+
}
|
|
154
|
+
if (errorMessage.includes('quota') || errorMessage.includes('rate limit')) {
|
|
155
|
+
return `❌ **Usage Limit Reached**: ${ERROR_MESSAGES.QUOTA_EXCEEDED}
|
|
156
|
+
|
|
157
|
+
**Solutions:**
|
|
158
|
+
1. Wait and retry - rate limits reset periodically
|
|
159
|
+
2. Check quota in OpenAI dashboard`;
|
|
160
|
+
}
|
|
161
|
+
if (errorMessage.includes('timeout')) {
|
|
162
|
+
return `❌ **Request Timeout**: Operation took longer than expected
|
|
163
|
+
|
|
164
|
+
**Solutions:**
|
|
165
|
+
1. Increase timeout: Add \`timeout: 300000\` (5 minutes)
|
|
166
|
+
2. Simplify request: Break complex queries into smaller parts`;
|
|
167
|
+
}
|
|
168
|
+
if (errorMessage.includes('sandbox') || errorMessage.includes('permission')) {
|
|
169
|
+
return `❌ **Permission Error**: ${ERROR_MESSAGES.SANDBOX_VIOLATION}
|
|
170
|
+
|
|
171
|
+
**Solutions:**
|
|
172
|
+
1. Relax sandbox: Use \`sandboxMode: "workspace-write"\`
|
|
173
|
+
2. Adjust approval: Try \`approval: "on-request"\``;
|
|
174
|
+
}
|
|
175
|
+
// Generic error with context
|
|
176
|
+
return `❌ **Codex Execution Error**: ${errorMessage}
|
|
177
|
+
|
|
178
|
+
**Debug Steps:**
|
|
179
|
+
1. Verify Codex CLI: \`codex --version\`
|
|
180
|
+
2. Check authentication: \`codex login\`
|
|
181
|
+
3. Try simpler query first`;
|
|
182
|
+
}
|
|
183
|
+
},
|
|
59
184
|
};
|
|
60
185
|
//# sourceMappingURL=ask-codex.tool.js.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"ask-codex.tool.js","sourceRoot":"","sources":["../../src/tools/ask-codex.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-codex.tool.d.ts","sourceRoot":"","sources":["../../src/tools/batch-codex.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkC5C,eAAO,MAAM,cAAc,EAAE,WA6I5B,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCodex } from '../utils/codexExecutor.js';
|
|
3
|
+
import { MODELS, SANDBOX_MODES } from '../constants.js';
|
|
4
|
+
// Define task type for batch operations
|
|
5
|
+
const batchTaskSchema = z.object({
|
|
6
|
+
task: z.string().describe('Atomic task description'),
|
|
7
|
+
target: z.string().optional().describe('Target files/directories (use @ syntax)'),
|
|
8
|
+
priority: z.enum(['high', 'normal', 'low']).default('normal').describe('Task priority'),
|
|
9
|
+
});
|
|
10
|
+
const batchCodexArgsSchema = z.object({
|
|
11
|
+
tasks: z.array(batchTaskSchema).min(1).describe('Array of atomic tasks to delegate to Codex'),
|
|
12
|
+
model: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe(`Model to use: ${Object.values(MODELS).join(', ')}`),
|
|
16
|
+
sandbox: z
|
|
17
|
+
.string()
|
|
18
|
+
.default(SANDBOX_MODES.WORKSPACE_WRITE)
|
|
19
|
+
.describe(`Sandbox mode: ${Object.values(SANDBOX_MODES).join(', ')}`),
|
|
20
|
+
parallel: z.boolean().default(false).describe('Execute tasks in parallel (experimental)'),
|
|
21
|
+
stopOnError: z.boolean().default(true).describe('Stop execution if any task fails'),
|
|
22
|
+
timeout: z.number().optional().describe('Maximum execution time per task in milliseconds'),
|
|
23
|
+
workingDir: z.string().optional().describe('Working directory for execution'),
|
|
24
|
+
search: z
|
|
25
|
+
.boolean()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Enable web search for all tasks (activates web_search_request feature)'),
|
|
28
|
+
oss: z.boolean().optional().describe('Use local Ollama server'),
|
|
29
|
+
enableFeatures: z.array(z.string()).optional().describe('Enable feature flags'),
|
|
30
|
+
disableFeatures: z.array(z.string()).optional().describe('Disable feature flags'),
|
|
31
|
+
});
|
|
32
|
+
export const batchCodexTool = {
|
|
33
|
+
name: 'batch-codex',
|
|
34
|
+
description: 'Delegate multiple atomic tasks to Codex for batch processing. Ideal for repetitive operations, mass refactoring, and automated code transformations',
|
|
35
|
+
zodSchema: batchCodexArgsSchema,
|
|
36
|
+
prompt: {
|
|
37
|
+
description: 'Execute multiple atomic Codex tasks in batch mode for efficient automation',
|
|
38
|
+
},
|
|
39
|
+
category: 'codex',
|
|
40
|
+
execute: async (args, onProgress) => {
|
|
41
|
+
const { tasks, model, sandbox, parallel, stopOnError, timeout, workingDir, search, oss, enableFeatures, disableFeatures, } = args;
|
|
42
|
+
const taskList = tasks;
|
|
43
|
+
if (!taskList || taskList.length === 0) {
|
|
44
|
+
throw new Error('No tasks provided for batch execution');
|
|
45
|
+
}
|
|
46
|
+
const results = [];
|
|
47
|
+
let failedCount = 0;
|
|
48
|
+
let successCount = 0;
|
|
49
|
+
// Sort tasks by priority
|
|
50
|
+
const sortedTasks = [...taskList].sort((a, b) => {
|
|
51
|
+
const priorityOrder = { high: 0, normal: 1, low: 2 };
|
|
52
|
+
return (priorityOrder[a.priority] -
|
|
53
|
+
priorityOrder[b.priority]);
|
|
54
|
+
});
|
|
55
|
+
if (onProgress) {
|
|
56
|
+
onProgress(`🚀 Starting batch execution of ${sortedTasks.length} tasks...`);
|
|
57
|
+
}
|
|
58
|
+
// Execute tasks sequentially
|
|
59
|
+
// TODO: Implement parallel execution when parallel flag is true
|
|
60
|
+
for (let i = 0; i < sortedTasks.length; i++) {
|
|
61
|
+
const task = sortedTasks[i];
|
|
62
|
+
const taskPrompt = task.target ? `${task.task} in ${task.target}` : task.task;
|
|
63
|
+
if (onProgress) {
|
|
64
|
+
onProgress(`\n[${i + 1}/${sortedTasks.length}] Executing: ${taskPrompt}`);
|
|
65
|
+
}
|
|
66
|
+
// Skip remaining tasks if stopOnError is true and we have failures
|
|
67
|
+
if (stopOnError && failedCount > 0) {
|
|
68
|
+
results.push({
|
|
69
|
+
task: taskPrompt,
|
|
70
|
+
status: 'skipped',
|
|
71
|
+
error: 'Skipped due to previous failure',
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const result = await executeCodex(taskPrompt, {
|
|
77
|
+
model: model,
|
|
78
|
+
sandboxMode: sandbox,
|
|
79
|
+
timeout: timeout,
|
|
80
|
+
workingDir: workingDir,
|
|
81
|
+
search: search,
|
|
82
|
+
oss: oss,
|
|
83
|
+
enableFeatures: enableFeatures,
|
|
84
|
+
disableFeatures: disableFeatures,
|
|
85
|
+
}, undefined // No progress for individual tasks to keep output clean
|
|
86
|
+
);
|
|
87
|
+
results.push({
|
|
88
|
+
task: taskPrompt,
|
|
89
|
+
status: 'success',
|
|
90
|
+
output: result.substring(0, 500), // Truncate for summary
|
|
91
|
+
});
|
|
92
|
+
successCount++;
|
|
93
|
+
if (onProgress) {
|
|
94
|
+
onProgress(`✅ Completed: ${task.task}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
99
|
+
results.push({
|
|
100
|
+
task: taskPrompt,
|
|
101
|
+
status: 'failed',
|
|
102
|
+
error: errorMessage,
|
|
103
|
+
});
|
|
104
|
+
failedCount++;
|
|
105
|
+
if (onProgress) {
|
|
106
|
+
onProgress(`❌ Failed: ${task.task} - ${errorMessage}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Generate summary report
|
|
111
|
+
let report = `\n📊 **Batch Execution Summary**\n`;
|
|
112
|
+
report += `\n- Total tasks: ${sortedTasks.length}`;
|
|
113
|
+
report += `\n- Successful: ${successCount} ✅`;
|
|
114
|
+
report += `\n- Failed: ${failedCount} ❌`;
|
|
115
|
+
report += `\n- Skipped: ${sortedTasks.length - successCount - failedCount} ⏭️`;
|
|
116
|
+
report += `\n\n**Task Results:**\n`;
|
|
117
|
+
for (const result of results) {
|
|
118
|
+
const icon = result.status === 'success' ? '✅' : result.status === 'failed' ? '❌' : '⏭️';
|
|
119
|
+
report += `\n${icon} **${result.task}**`;
|
|
120
|
+
if (result.status === 'success' && result.output) {
|
|
121
|
+
report += `\n Output: ${result.output.substring(0, 100)}...`;
|
|
122
|
+
}
|
|
123
|
+
else if (result.error) {
|
|
124
|
+
report += `\n Error: ${result.error}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// If all tasks failed, throw an error
|
|
128
|
+
if (failedCount === sortedTasks.length) {
|
|
129
|
+
throw new Error(`All ${failedCount} tasks failed. See report above for details.`);
|
|
130
|
+
}
|
|
131
|
+
return report;
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=batch-codex.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-codex.tool.js","sourceRoot":"","sources":["../../src/tools/batch-codex.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainstorm.tool.d.ts","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"brainstorm.tool.d.ts","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsJ5C,eAAO,MAAM,cAAc,EAAE,WAqE5B,CAAC"}
|
|
@@ -20,8 +20,10 @@ ${existingContext ? `Background: ${existingContext}` : ''}
|
|
|
20
20
|
## Requirements
|
|
21
21
|
Generate ${ideaCount} actionable ideas. Keep descriptions concise (2-3 sentences max).
|
|
22
22
|
|
|
23
|
-
${includeAnalysis
|
|
24
|
-
|
|
23
|
+
${includeAnalysis
|
|
24
|
+
? `## Analysis
|
|
25
|
+
Rate each: Feasibility (1-5), Impact (1-5), Innovation (1-5)`
|
|
26
|
+
: ''}
|
|
25
27
|
|
|
26
28
|
## Format
|
|
27
29
|
### Idea [N]: [Name]
|
|
@@ -36,19 +38,19 @@ Begin:`;
|
|
|
36
38
|
*/
|
|
37
39
|
function getMethodologyInstructions(methodology, domain) {
|
|
38
40
|
const methodologies = {
|
|
39
|
-
|
|
41
|
+
divergent: `**Divergent Thinking Approach:**
|
|
40
42
|
- Generate maximum quantity of ideas without self-censoring
|
|
41
43
|
- Build on wild or seemingly impractical ideas
|
|
42
44
|
- Combine unrelated concepts for unexpected solutions
|
|
43
45
|
- Use "Yes, and..." thinking to expand each concept
|
|
44
46
|
- Postpone evaluation until all ideas are generated`,
|
|
45
|
-
|
|
47
|
+
convergent: `**Convergent Thinking Approach:**
|
|
46
48
|
- Focus on refining and improving existing concepts
|
|
47
49
|
- Synthesize related ideas into stronger solutions
|
|
48
50
|
- Apply critical evaluation criteria
|
|
49
51
|
- Prioritize based on feasibility and impact
|
|
50
52
|
- Develop implementation pathways for top ideas`,
|
|
51
|
-
|
|
53
|
+
scamper: `**SCAMPER Creative Triggers:**
|
|
52
54
|
- **Substitute:** What can be substituted or replaced?
|
|
53
55
|
- **Combine:** What can be combined or merged?
|
|
54
56
|
- **Adapt:** What can be adapted from other domains?
|
|
@@ -62,47 +64,74 @@ function getMethodologyInstructions(methodology, domain) {
|
|
|
62
64
|
- **Ideate:** Generate user-focused solutions
|
|
63
65
|
- **Consider Journey:** Think through complete user experience
|
|
64
66
|
- **Prototype Mindset:** Focus on testable, iterative concepts`,
|
|
65
|
-
|
|
67
|
+
lateral: `**Lateral Thinking Approach:**
|
|
66
68
|
- Make unexpected connections between unrelated fields
|
|
67
69
|
- Challenge fundamental assumptions
|
|
68
70
|
- Use random word association to trigger new directions
|
|
69
71
|
- Apply metaphors and analogies from other domains
|
|
70
72
|
- Reverse conventional thinking patterns`,
|
|
71
|
-
|
|
72
|
-
${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` :
|
|
73
|
+
auto: `**AI-Optimized Approach:**
|
|
74
|
+
${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` : "I'll intelligently combine multiple methodologies:"}
|
|
73
75
|
- Divergent exploration with domain-specific knowledge
|
|
74
76
|
- SCAMPER triggers and lateral thinking
|
|
75
|
-
- Human-centered perspective for practical value
|
|
77
|
+
- Human-centered perspective for practical value`,
|
|
76
78
|
};
|
|
77
79
|
return methodologies[methodology] || methodologies['auto'];
|
|
78
80
|
}
|
|
79
81
|
const brainstormArgsSchema = z.object({
|
|
80
|
-
prompt: z.string().min(1).describe(
|
|
81
|
-
model: z
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
82
|
+
prompt: z.string().min(1).describe('Brainstorming challenge or question'),
|
|
83
|
+
model: z
|
|
84
|
+
.string()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('Model: gpt-5-codex (default), gpt-5, o3, o4-mini, codex-1, codex-mini-latest, gpt-4.1'),
|
|
87
|
+
approvalPolicy: z
|
|
88
|
+
.enum(['never', 'on-request', 'on-failure', 'untrusted'])
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Approval: never, on-request, on-failure, untrusted'),
|
|
91
|
+
sandboxMode: z
|
|
92
|
+
.enum(['read-only', 'workspace-write', 'danger-full-access'])
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('Access: read-only, workspace-write, danger-full-access'),
|
|
95
|
+
fullAuto: z.boolean().optional().describe('Full automation mode'),
|
|
96
|
+
yolo: z.boolean().optional().describe('⚠️ Bypass all safety (dangerous)'),
|
|
97
|
+
cd: z.string().optional().describe('Working directory'),
|
|
98
|
+
methodology: z
|
|
99
|
+
.enum(['divergent', 'convergent', 'scamper', 'design-thinking', 'lateral', 'auto'])
|
|
100
|
+
.default('auto')
|
|
101
|
+
.describe('Framework: divergent, convergent, scamper, design-thinking, lateral, auto (default)'),
|
|
102
|
+
domain: z
|
|
103
|
+
.string()
|
|
104
|
+
.optional()
|
|
105
|
+
.describe('Domain: software, business, creative, research, product, marketing, etc.'),
|
|
106
|
+
constraints: z.string().optional().describe('Limitations: budget, time, technical, legal, etc.'),
|
|
107
|
+
existingContext: z.string().optional().describe('Background info or previous attempts'),
|
|
108
|
+
ideaCount: z
|
|
109
|
+
.number()
|
|
110
|
+
.int()
|
|
111
|
+
.positive()
|
|
112
|
+
.default(12)
|
|
113
|
+
.describe('Number of ideas (default: 12, range: 5-30)'),
|
|
114
|
+
includeAnalysis: z.boolean().default(true).describe('Include feasibility/impact analysis'),
|
|
115
|
+
search: z
|
|
116
|
+
.boolean()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe('Enable web search for research (activates web_search_request feature)'),
|
|
119
|
+
oss: z.boolean().optional().describe('Use local Ollama server'),
|
|
120
|
+
enableFeatures: z.array(z.string()).optional().describe('Enable feature flags'),
|
|
121
|
+
disableFeatures: z.array(z.string()).optional().describe('Disable feature flags'),
|
|
93
122
|
});
|
|
94
123
|
export const brainstormTool = {
|
|
95
|
-
name:
|
|
96
|
-
description:
|
|
124
|
+
name: 'brainstorm',
|
|
125
|
+
description: 'Generate creative ideas using structured frameworks with domain context and feasibility analysis.',
|
|
97
126
|
zodSchema: brainstormArgsSchema,
|
|
98
127
|
prompt: {
|
|
99
|
-
description:
|
|
128
|
+
description: 'Create structured brainstorming with chosen methodology and analysis',
|
|
100
129
|
},
|
|
101
130
|
category: 'utility',
|
|
102
131
|
execute: async (args, onProgress) => {
|
|
103
|
-
const { prompt, model, approvalPolicy, sandboxMode, fullAuto, yolo, cd, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true } = args;
|
|
132
|
+
const { prompt, model, approvalPolicy, sandboxMode, fullAuto, yolo, cd, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true, search, oss, enableFeatures, disableFeatures, } = args;
|
|
104
133
|
if (!prompt?.trim()) {
|
|
105
|
-
throw new Error(
|
|
134
|
+
throw new Error('You must provide a valid brainstorming challenge or question to explore');
|
|
106
135
|
}
|
|
107
136
|
let enhancedPrompt = buildBrainstormPrompt({
|
|
108
137
|
prompt: prompt.trim(),
|
|
@@ -111,7 +140,7 @@ export const brainstormTool = {
|
|
|
111
140
|
constraints: constraints,
|
|
112
141
|
existingContext: existingContext,
|
|
113
142
|
ideaCount: ideaCount,
|
|
114
|
-
includeAnalysis: includeAnalysis
|
|
143
|
+
includeAnalysis: includeAnalysis,
|
|
115
144
|
});
|
|
116
145
|
Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
|
|
117
146
|
// Report progress to user
|
|
@@ -124,7 +153,11 @@ export const brainstormTool = {
|
|
|
124
153
|
sandboxMode: sandboxMode,
|
|
125
154
|
yolo: Boolean(yolo),
|
|
126
155
|
cd: cd,
|
|
156
|
+
search: search,
|
|
157
|
+
oss: oss,
|
|
158
|
+
enableFeatures: enableFeatures,
|
|
159
|
+
disableFeatures: disableFeatures,
|
|
127
160
|
}, onProgress);
|
|
128
|
-
}
|
|
161
|
+
},
|
|
129
162
|
};
|
|
130
163
|
//# sourceMappingURL=brainstorm.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainstorm.tool.js","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,SAAS,qBAAqB,CAAC,MAQ9B;IACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"brainstorm.tool.js","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-codex.tool.d.ts","sourceRoot":"","sources":["../../src/tools/exec-codex.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB5C,eAAO,MAAM,aAAa,EAAE,WAwC3B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCodex } from '../utils/codexExecutor.js';
|
|
3
|
+
import { formatCodexResponseForMCP } from '../utils/outputParser.js';
|
|
4
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES, MODELS, SANDBOX_MODES } from '../constants.js';
|
|
5
|
+
const execCodexArgsSchema = z.object({
|
|
6
|
+
prompt: z.string().min(1).describe("Command or instruction for non-interactive Codex execution"),
|
|
7
|
+
model: z.string().optional().describe(`Model to use: ${Object.values(MODELS).join(', ')}`),
|
|
8
|
+
sandbox: z.string().optional().describe(`Sandbox mode: ${Object.values(SANDBOX_MODES).join(', ')}`),
|
|
9
|
+
timeout: z.number().optional().describe("Maximum execution time in milliseconds (optional)"),
|
|
10
|
+
workingDir: z.string().optional().describe("Working directory for execution"),
|
|
11
|
+
});
|
|
12
|
+
export const execCodexTool = {
|
|
13
|
+
name: "exec-codex",
|
|
14
|
+
description: "Non-interactive Codex execution for automation and scripting",
|
|
15
|
+
zodSchema: execCodexArgsSchema,
|
|
16
|
+
prompt: {
|
|
17
|
+
description: "Execute Codex commands non-interactively for automation workflows",
|
|
18
|
+
},
|
|
19
|
+
category: 'codex',
|
|
20
|
+
execute: async (args, onProgress) => {
|
|
21
|
+
const { prompt, model, sandbox, timeout, workingDir } = args;
|
|
22
|
+
if (!prompt?.trim()) {
|
|
23
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
if (onProgress) {
|
|
27
|
+
onProgress(`${STATUS_MESSAGES.PROCESSING_START} (non-interactive mode)`);
|
|
28
|
+
}
|
|
29
|
+
const result = await executeCodex(prompt, {
|
|
30
|
+
model: model,
|
|
31
|
+
sandboxMode: sandbox, // Allow string to SandboxMode conversion
|
|
32
|
+
timeout: timeout,
|
|
33
|
+
workingDir: workingDir,
|
|
34
|
+
cd: workingDir,
|
|
35
|
+
useExec: true
|
|
36
|
+
}, onProgress);
|
|
37
|
+
// Format for non-interactive use (more concise)
|
|
38
|
+
return formatCodexResponseForMCP(result, false, false);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
42
|
+
throw new Error(`Exec-Codex failed: ${errorMessage}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=exec-codex.tool.js.map
|