@probelabs/probe 0.6.0-rc232 → 0.6.0-rc234
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/bin/binaries/probe-v0.6.0-rc234-aarch64-apple-darwin.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc234-aarch64-unknown-linux-musl.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc234-x86_64-apple-darwin.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc234-x86_64-pc-windows-msvc.zip +0 -0
- package/bin/binaries/probe-v0.6.0-rc234-x86_64-unknown-linux-musl.tar.gz +0 -0
- package/build/agent/ProbeAgent.d.ts +2 -0
- package/build/agent/ProbeAgent.js +66 -7
- package/build/agent/dsl/agent-test.mjs +341 -0
- package/build/agent/dsl/analyze-test.mjs +237 -0
- package/build/agent/dsl/diag-test.mjs +78 -0
- package/build/agent/dsl/environment.js +387 -0
- package/build/agent/dsl/manual-test.mjs +662 -0
- package/build/agent/dsl/output-buffer-test.mjs +124 -0
- package/build/agent/dsl/pipeline-direct-test.mjs +147 -0
- package/build/agent/dsl/pipeline-test.mjs +223 -0
- package/build/agent/dsl/runtime.js +206 -0
- package/build/agent/dsl/sandbox-experiment.mjs +309 -0
- package/build/agent/dsl/transformer.js +156 -0
- package/build/agent/dsl/trigger-test.mjs +159 -0
- package/build/agent/dsl/validator.js +183 -0
- package/build/agent/index.js +18179 -7664
- package/build/agent/probeTool.js +9 -0
- package/build/agent/schemaUtils.js +74 -1
- package/build/agent/tasks/taskTool.js +6 -1
- package/build/agent/tools.js +9 -1
- package/build/index.js +5 -0
- package/build/tools/common.js +7 -0
- package/build/tools/executePlan.js +761 -0
- package/build/tools/index.js +4 -0
- package/cjs/agent/ProbeAgent.cjs +12146 -1638
- package/cjs/index.cjs +11800 -1283
- package/package.json +5 -1
- package/src/agent/ProbeAgent.d.ts +2 -0
- package/src/agent/ProbeAgent.js +66 -7
- package/src/agent/dsl/agent-test.mjs +341 -0
- package/src/agent/dsl/analyze-test.mjs +237 -0
- package/src/agent/dsl/diag-test.mjs +78 -0
- package/src/agent/dsl/environment.js +387 -0
- package/src/agent/dsl/manual-test.mjs +662 -0
- package/src/agent/dsl/output-buffer-test.mjs +124 -0
- package/src/agent/dsl/pipeline-direct-test.mjs +147 -0
- package/src/agent/dsl/pipeline-test.mjs +223 -0
- package/src/agent/dsl/runtime.js +206 -0
- package/src/agent/dsl/sandbox-experiment.mjs +309 -0
- package/src/agent/dsl/transformer.js +156 -0
- package/src/agent/dsl/trigger-test.mjs +159 -0
- package/src/agent/dsl/validator.js +183 -0
- package/src/agent/index.js +8 -0
- package/src/agent/probeTool.js +9 -0
- package/src/agent/schemaUtils.js +74 -1
- package/src/agent/tasks/taskTool.js +6 -1
- package/src/agent/tools.js +9 -1
- package/src/index.js +5 -0
- package/src/tools/common.js +7 -0
- package/src/tools/executePlan.js +761 -0
- package/src/tools/index.js +4 -0
- package/bin/binaries/probe-v0.6.0-rc232-aarch64-apple-darwin.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc232-aarch64-unknown-linux-musl.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc232-x86_64-apple-darwin.tar.gz +0 -0
- package/bin/binaries/probe-v0.6.0-rc232-x86_64-pc-windows-msvc.zip +0 -0
- package/bin/binaries/probe-v0.6.0-rc232-x86_64-unknown-linux-musl.tar.gz +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSL Validator - AST whitelist validation for LLM-generated code.
|
|
3
|
+
*
|
|
4
|
+
* Parses code with Acorn and walks the AST, rejecting any node type
|
|
5
|
+
* not in the whitelist. This is an allow-list approach — unknown syntax
|
|
6
|
+
* is rejected by default.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as acorn from 'acorn';
|
|
10
|
+
import * as walk from 'acorn-walk';
|
|
11
|
+
|
|
12
|
+
// Node types the LLM is allowed to generate
|
|
13
|
+
const ALLOWED_NODE_TYPES = new Set([
|
|
14
|
+
'Program',
|
|
15
|
+
'ExpressionStatement',
|
|
16
|
+
'BlockStatement',
|
|
17
|
+
'VariableDeclaration',
|
|
18
|
+
'VariableDeclarator',
|
|
19
|
+
'ArrowFunctionExpression',
|
|
20
|
+
'FunctionExpression',
|
|
21
|
+
'CallExpression',
|
|
22
|
+
'MemberExpression',
|
|
23
|
+
'Identifier',
|
|
24
|
+
'Literal',
|
|
25
|
+
'TemplateLiteral',
|
|
26
|
+
'TemplateElement',
|
|
27
|
+
'ArrayExpression',
|
|
28
|
+
'ObjectExpression',
|
|
29
|
+
'SpreadElement',
|
|
30
|
+
'IfStatement',
|
|
31
|
+
'ConditionalExpression',
|
|
32
|
+
'ForOfStatement',
|
|
33
|
+
'ForInStatement',
|
|
34
|
+
'ForStatement',
|
|
35
|
+
'WhileStatement',
|
|
36
|
+
'TryStatement',
|
|
37
|
+
'CatchClause',
|
|
38
|
+
'ThrowStatement',
|
|
39
|
+
'ReturnStatement',
|
|
40
|
+
'BreakStatement',
|
|
41
|
+
'ContinueStatement',
|
|
42
|
+
'AssignmentExpression',
|
|
43
|
+
'UpdateExpression',
|
|
44
|
+
'BinaryExpression',
|
|
45
|
+
'LogicalExpression',
|
|
46
|
+
'UnaryExpression',
|
|
47
|
+
'Property',
|
|
48
|
+
'SequenceExpression',
|
|
49
|
+
'ChainExpression',
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
// Identifiers that are never allowed
|
|
53
|
+
const BLOCKED_IDENTIFIERS = new Set([
|
|
54
|
+
'eval',
|
|
55
|
+
'Function',
|
|
56
|
+
'require',
|
|
57
|
+
'process',
|
|
58
|
+
'globalThis',
|
|
59
|
+
'__proto__',
|
|
60
|
+
'constructor',
|
|
61
|
+
'prototype',
|
|
62
|
+
'import',
|
|
63
|
+
'exports',
|
|
64
|
+
'setTimeout',
|
|
65
|
+
'setInterval',
|
|
66
|
+
'setImmediate',
|
|
67
|
+
'queueMicrotask',
|
|
68
|
+
'Proxy',
|
|
69
|
+
'Reflect',
|
|
70
|
+
'Symbol',
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
// Property names that are never allowed on member expressions
|
|
74
|
+
const BLOCKED_PROPERTIES = new Set([
|
|
75
|
+
'__proto__',
|
|
76
|
+
'constructor',
|
|
77
|
+
'prototype',
|
|
78
|
+
'__defineGetter__',
|
|
79
|
+
'__defineSetter__',
|
|
80
|
+
'__lookupGetter__',
|
|
81
|
+
'__lookupSetter__',
|
|
82
|
+
]);
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Validate DSL code against the whitelist.
|
|
86
|
+
*
|
|
87
|
+
* @param {string} code - The LLM-generated code to validate
|
|
88
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
89
|
+
*/
|
|
90
|
+
export function validateDSL(code) {
|
|
91
|
+
const errors = [];
|
|
92
|
+
|
|
93
|
+
// Step 1: Parse with Acorn
|
|
94
|
+
let ast;
|
|
95
|
+
try {
|
|
96
|
+
ast = acorn.parse(code, {
|
|
97
|
+
ecmaVersion: 2022,
|
|
98
|
+
sourceType: 'script',
|
|
99
|
+
allowReturnOutsideFunction: true,
|
|
100
|
+
});
|
|
101
|
+
} catch (e) {
|
|
102
|
+
return { valid: false, errors: [`Syntax error: ${e.message}`] };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Step 2: Walk every node and validate
|
|
106
|
+
walk.full(ast, (node) => {
|
|
107
|
+
// Check node type against whitelist
|
|
108
|
+
if (!ALLOWED_NODE_TYPES.has(node.type)) {
|
|
109
|
+
errors.push(`Blocked node type: ${node.type} at position ${node.start}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Block async functions (LLM should not write async/await)
|
|
114
|
+
if (
|
|
115
|
+
(node.type === 'ArrowFunctionExpression' ||
|
|
116
|
+
node.type === 'FunctionExpression') &&
|
|
117
|
+
node.async
|
|
118
|
+
) {
|
|
119
|
+
errors.push(`Async functions are not allowed at position ${node.start}. Write synchronous code — the runtime handles async.`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Block generator functions
|
|
123
|
+
if (
|
|
124
|
+
(node.type === 'FunctionExpression') &&
|
|
125
|
+
node.generator
|
|
126
|
+
) {
|
|
127
|
+
errors.push(`Generator functions are not allowed at position ${node.start}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Block regex literals — SandboxJS doesn't support them
|
|
131
|
+
if (node.type === 'Literal' && node.regex) {
|
|
132
|
+
errors.push(`Regex literals are not supported at position ${node.start}. Use String methods like indexOf(), includes(), startsWith() instead.`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Check identifiers against blocklist
|
|
136
|
+
if (node.type === 'Identifier' && BLOCKED_IDENTIFIERS.has(node.name)) {
|
|
137
|
+
errors.push(`Blocked identifier: '${node.name}' at position ${node.start}`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Check member expressions for blocked properties
|
|
141
|
+
if (node.type === 'MemberExpression' && !node.computed) {
|
|
142
|
+
if (node.property.type === 'Identifier' && BLOCKED_PROPERTIES.has(node.property.name)) {
|
|
143
|
+
errors.push(`Blocked property access: '.${node.property.name}' at position ${node.property.start}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Block computed member expressions with blocked string literals
|
|
148
|
+
if (node.type === 'MemberExpression' && node.computed) {
|
|
149
|
+
if (node.property.type === 'Literal' && typeof node.property.value === 'string') {
|
|
150
|
+
if (BLOCKED_PROPERTIES.has(node.property.value) || BLOCKED_IDENTIFIERS.has(node.property.value)) {
|
|
151
|
+
errors.push(`Blocked computed property access: '["${node.property.value}"]' at position ${node.property.start}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Block variable declarations named with blocked identifiers
|
|
157
|
+
if (node.type === 'VariableDeclarator' && node.id.type === 'Identifier') {
|
|
158
|
+
if (BLOCKED_IDENTIFIERS.has(node.id.name)) {
|
|
159
|
+
errors.push(`Cannot declare variable with blocked name: '${node.id.name}' at position ${node.id.start}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
valid: errors.length === 0,
|
|
166
|
+
errors,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Parse DSL code into an AST.
|
|
172
|
+
* Exported for use by the transformer.
|
|
173
|
+
*
|
|
174
|
+
* @param {string} code
|
|
175
|
+
* @returns {import('acorn').Node}
|
|
176
|
+
*/
|
|
177
|
+
export function parseDSL(code) {
|
|
178
|
+
return acorn.parse(code, {
|
|
179
|
+
ecmaVersion: 2022,
|
|
180
|
+
sourceType: 'script',
|
|
181
|
+
allowReturnOutsideFunction: true,
|
|
182
|
+
});
|
|
183
|
+
}
|
package/src/agent/index.js
CHANGED
|
@@ -142,6 +142,8 @@ function parseArgs() {
|
|
|
142
142
|
skillDirs: null, // Comma-separated list of repo-relative skill directories
|
|
143
143
|
// Task management
|
|
144
144
|
enableTasks: false, // Enable task tracking for progress management
|
|
145
|
+
// Execute plan DSL tool
|
|
146
|
+
enableExecutePlan: false,
|
|
145
147
|
// Bash tool configuration
|
|
146
148
|
enableBash: false,
|
|
147
149
|
bashAllow: null,
|
|
@@ -218,6 +220,8 @@ function parseArgs() {
|
|
|
218
220
|
config.skillDirs = args[++i].split(',').map(dir => dir.trim()).filter(Boolean);
|
|
219
221
|
} else if (arg === '--allow-tasks') {
|
|
220
222
|
config.enableTasks = true;
|
|
223
|
+
} else if (arg === '--enable-execute-plan') {
|
|
224
|
+
config.enableExecutePlan = true;
|
|
221
225
|
} else if (arg === '--enable-bash') {
|
|
222
226
|
config.enableBash = true;
|
|
223
227
|
} else if (arg === '--bash-allow' && i + 1 < args.length) {
|
|
@@ -295,6 +299,9 @@ Options:
|
|
|
295
299
|
--no-mermaid-validation Disable automatic mermaid diagram validation and fixing
|
|
296
300
|
--help, -h Show this help message
|
|
297
301
|
|
|
302
|
+
DSL Orchestration:
|
|
303
|
+
--enable-execute-plan Enable execute_plan DSL tool for programmatic orchestration
|
|
304
|
+
|
|
298
305
|
Bash Tool Options:
|
|
299
306
|
--enable-bash Enable bash command execution for system exploration
|
|
300
307
|
--bash-allow <patterns> Additional bash command patterns to allow (comma-separated)
|
|
@@ -843,6 +850,7 @@ async function main() {
|
|
|
843
850
|
disableTools: config.disableTools,
|
|
844
851
|
allowSkills: config.allowSkills,
|
|
845
852
|
skillDirs: config.skillDirs,
|
|
853
|
+
enableExecutePlan: config.enableExecutePlan,
|
|
846
854
|
enableBash: config.enableBash,
|
|
847
855
|
bashConfig: bashConfig,
|
|
848
856
|
enableTasks: config.enableTasks
|
package/src/agent/probeTool.js
CHANGED
|
@@ -211,6 +211,15 @@ export function createWrappedTools(baseTools) {
|
|
|
211
211
|
);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
// Wrap execute_plan tool
|
|
215
|
+
if (baseTools.executePlanTool) {
|
|
216
|
+
wrappedTools.executePlanToolInstance = wrapToolWithEmitter(
|
|
217
|
+
baseTools.executePlanTool,
|
|
218
|
+
'execute_plan',
|
|
219
|
+
baseTools.executePlanTool.execute
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
|
|
214
223
|
// Wrap bash tool
|
|
215
224
|
if (baseTools.bashTool) {
|
|
216
225
|
wrappedTools.bashToolInstance = wrapToolWithEmitter(
|
package/src/agent/schemaUtils.js
CHANGED
|
@@ -771,6 +771,78 @@ export function isJsonSchemaDefinition(jsonString, options = {}) {
|
|
|
771
771
|
}
|
|
772
772
|
}
|
|
773
773
|
|
|
774
|
+
/**
|
|
775
|
+
* Check if schema is a simple text wrapper (e.g., {text: string} or {response: string})
|
|
776
|
+
* These schemas can be auto-wrapped without re-invoking the AI
|
|
777
|
+
* @param {string} schema - The schema string
|
|
778
|
+
* @returns {Object|null} - Object with field name if simple wrapper, null otherwise
|
|
779
|
+
*/
|
|
780
|
+
export function isSimpleTextWrapperSchema(schema) {
|
|
781
|
+
if (!schema || typeof schema !== 'string') {
|
|
782
|
+
return null;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
const trimmed = schema.trim();
|
|
786
|
+
|
|
787
|
+
// Match patterns like: {text: string}, {"text": "string"}, {response: string}, etc.
|
|
788
|
+
// These are simple wrappers that just need a single text field
|
|
789
|
+
const simplePatterns = [
|
|
790
|
+
/^\{\s*["']?(\w+)["']?\s*:\s*["']?string["']?\s*\}$/i,
|
|
791
|
+
/^\{\s*["']?type["']?\s*:\s*["']?object["']?\s*,\s*["']?properties["']?\s*:\s*\{\s*["']?(\w+)["']?\s*:\s*\{\s*["']?type["']?\s*:\s*["']?string["']?\s*\}\s*\}\s*\}$/i
|
|
792
|
+
];
|
|
793
|
+
|
|
794
|
+
for (const pattern of simplePatterns) {
|
|
795
|
+
const match = trimmed.match(pattern);
|
|
796
|
+
if (match) {
|
|
797
|
+
return { fieldName: match[1] };
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Try to auto-wrap plain text for simple wrapper schemas
|
|
806
|
+
* Returns wrapped JSON if successful, null if not applicable
|
|
807
|
+
* @param {string} response - The response to wrap
|
|
808
|
+
* @param {string} schema - The schema string
|
|
809
|
+
* @param {Object} options - Options
|
|
810
|
+
* @param {boolean} [options.debug=false] - Enable debug logging
|
|
811
|
+
* @returns {string|null} - Wrapped JSON string or null
|
|
812
|
+
*/
|
|
813
|
+
export function tryAutoWrapForSimpleSchema(response, schema, options = {}) {
|
|
814
|
+
const { debug = false } = options;
|
|
815
|
+
|
|
816
|
+
const wrapperInfo = isSimpleTextWrapperSchema(schema);
|
|
817
|
+
if (!wrapperInfo) {
|
|
818
|
+
if (debug) {
|
|
819
|
+
console.log(`[DEBUG] Auto-wrap: Schema is not a simple text wrapper`);
|
|
820
|
+
}
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// Check if response is already valid JSON
|
|
825
|
+
try {
|
|
826
|
+
JSON.parse(response);
|
|
827
|
+
// Already valid JSON, don't wrap
|
|
828
|
+
if (debug) {
|
|
829
|
+
console.log(`[DEBUG] Auto-wrap: Response is already valid JSON, skipping`);
|
|
830
|
+
}
|
|
831
|
+
return null;
|
|
832
|
+
} catch {
|
|
833
|
+
// Not valid JSON, proceed with wrapping
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Wrap the plain text in the schema structure
|
|
837
|
+
const wrapped = JSON.stringify({ [wrapperInfo.fieldName]: response });
|
|
838
|
+
|
|
839
|
+
if (debug) {
|
|
840
|
+
console.log(`[DEBUG] Auto-wrap: Wrapped plain text in {"${wrapperInfo.fieldName}": ...} (${response.length} chars)`);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
return wrapped;
|
|
844
|
+
}
|
|
845
|
+
|
|
774
846
|
/**
|
|
775
847
|
* Create a correction prompt for invalid JSON
|
|
776
848
|
* @param {string} invalidResponse - The invalid JSON response
|
|
@@ -817,9 +889,10 @@ export function createJsonCorrectionPrompt(invalidResponse, schema, errorOrValid
|
|
|
817
889
|
const level = Math.min(retryCount, strengthLevels.length - 1);
|
|
818
890
|
const currentLevel = strengthLevels[level];
|
|
819
891
|
|
|
892
|
+
// Include full response - truncating loses context the AI needs to fix the issue
|
|
820
893
|
let prompt = `${currentLevel.prefix} Your previous response is not valid JSON and cannot be parsed. Here's what you returned:
|
|
821
894
|
|
|
822
|
-
${invalidResponse
|
|
895
|
+
${invalidResponse}
|
|
823
896
|
|
|
824
897
|
Error: ${enhancedError}
|
|
825
898
|
|
|
@@ -42,7 +42,7 @@ Manage tasks for tracking progress during code exploration and problem-solving.
|
|
|
42
42
|
|
|
43
43
|
Parameters:
|
|
44
44
|
- action: (required) The action to perform: create, update, complete, delete, list
|
|
45
|
-
- tasks: (optional)
|
|
45
|
+
- tasks: (optional) Array of task objects for batch operations. Place raw JSON array directly between tags.
|
|
46
46
|
- id: (optional) Task ID for single operations (e.g., "task-1")
|
|
47
47
|
- title: (optional) Task title for create/update
|
|
48
48
|
- description: (optional) Task description for create/update
|
|
@@ -51,6 +51,11 @@ Parameters:
|
|
|
51
51
|
- dependencies: (optional) JSON array of task IDs that must be completed first
|
|
52
52
|
- after: (optional) Task ID to insert the new task after (for ordering). By default, new tasks are appended to the end
|
|
53
53
|
|
|
54
|
+
IMPORTANT - JSON Format:
|
|
55
|
+
Place raw JSON arrays directly between tags without quotes or escaping:
|
|
56
|
+
CORRECT: <tasks>[{"title": "Do X"}]</tasks>
|
|
57
|
+
INCORRECT: <tasks>"[{\"title\": \"Do X\"}]"</tasks>
|
|
58
|
+
|
|
54
59
|
Usage Examples:
|
|
55
60
|
|
|
56
61
|
Creating a single task:
|
package/src/agent/tools.js
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
extractTool,
|
|
6
6
|
delegateTool,
|
|
7
7
|
analyzeAllTool,
|
|
8
|
+
createExecutePlanTool,
|
|
8
9
|
bashTool,
|
|
9
10
|
editTool,
|
|
10
11
|
createTool,
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
extractSchema,
|
|
17
18
|
delegateSchema,
|
|
18
19
|
analyzeAllSchema,
|
|
20
|
+
executePlanSchema,
|
|
19
21
|
bashSchema,
|
|
20
22
|
editSchema,
|
|
21
23
|
createSchema,
|
|
@@ -24,6 +26,7 @@ import {
|
|
|
24
26
|
extractToolDefinition,
|
|
25
27
|
delegateToolDefinition,
|
|
26
28
|
analyzeAllToolDefinition,
|
|
29
|
+
getExecutePlanToolDefinition,
|
|
27
30
|
bashToolDefinition,
|
|
28
31
|
editToolDefinition,
|
|
29
32
|
createToolDefinition,
|
|
@@ -58,7 +61,10 @@ export function createTools(configOptions) {
|
|
|
58
61
|
if (configOptions.enableDelegate && isToolAllowed('delegate')) {
|
|
59
62
|
tools.delegateTool = delegateTool(configOptions);
|
|
60
63
|
}
|
|
61
|
-
if (isToolAllowed('
|
|
64
|
+
if (configOptions.enableExecutePlan && isToolAllowed('execute_plan')) {
|
|
65
|
+
tools.executePlanTool = createExecutePlanTool(configOptions);
|
|
66
|
+
} else if (isToolAllowed('analyze_all')) {
|
|
67
|
+
// analyze_all is fallback when execute_plan is not enabled
|
|
62
68
|
tools.analyzeAllTool = analyzeAllTool(configOptions);
|
|
63
69
|
}
|
|
64
70
|
|
|
@@ -97,6 +103,7 @@ export {
|
|
|
97
103
|
extractSchema,
|
|
98
104
|
delegateSchema,
|
|
99
105
|
analyzeAllSchema,
|
|
106
|
+
executePlanSchema,
|
|
100
107
|
bashSchema,
|
|
101
108
|
editSchema,
|
|
102
109
|
createSchema,
|
|
@@ -106,6 +113,7 @@ export {
|
|
|
106
113
|
extractToolDefinition,
|
|
107
114
|
delegateToolDefinition,
|
|
108
115
|
analyzeAllToolDefinition,
|
|
116
|
+
getExecutePlanToolDefinition,
|
|
109
117
|
bashToolDefinition,
|
|
110
118
|
editToolDefinition,
|
|
111
119
|
createToolDefinition,
|
package/src/index.js
CHANGED
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
extractSchema,
|
|
27
27
|
delegateSchema,
|
|
28
28
|
analyzeAllSchema,
|
|
29
|
+
executePlanSchema,
|
|
29
30
|
attemptCompletionSchema,
|
|
30
31
|
bashSchema,
|
|
31
32
|
searchToolDefinition,
|
|
@@ -46,6 +47,7 @@ import {
|
|
|
46
47
|
createToolDefinition
|
|
47
48
|
} from './tools/edit.js';
|
|
48
49
|
import { searchTool, queryTool, extractTool, delegateTool, analyzeAllTool } from './tools/vercel.js';
|
|
50
|
+
import { createExecutePlanTool, getExecutePlanToolDefinition } from './tools/executePlan.js';
|
|
49
51
|
import { bashTool } from './tools/bash.js';
|
|
50
52
|
import { editTool, createTool } from './tools/edit.js';
|
|
51
53
|
import { ProbeAgent } from './agent/ProbeAgent.js';
|
|
@@ -90,6 +92,7 @@ export {
|
|
|
90
92
|
extractTool,
|
|
91
93
|
delegateTool,
|
|
92
94
|
analyzeAllTool,
|
|
95
|
+
createExecutePlanTool,
|
|
93
96
|
bashTool,
|
|
94
97
|
editTool,
|
|
95
98
|
createTool,
|
|
@@ -102,6 +105,7 @@ export {
|
|
|
102
105
|
extractSchema,
|
|
103
106
|
delegateSchema,
|
|
104
107
|
analyzeAllSchema,
|
|
108
|
+
executePlanSchema,
|
|
105
109
|
attemptCompletionSchema,
|
|
106
110
|
bashSchema,
|
|
107
111
|
editSchema,
|
|
@@ -112,6 +116,7 @@ export {
|
|
|
112
116
|
extractToolDefinition,
|
|
113
117
|
delegateToolDefinition,
|
|
114
118
|
analyzeAllToolDefinition,
|
|
119
|
+
getExecutePlanToolDefinition,
|
|
115
120
|
attemptCompletionToolDefinition,
|
|
116
121
|
bashToolDefinition,
|
|
117
122
|
editToolDefinition,
|
package/src/tools/common.js
CHANGED
|
@@ -54,6 +54,11 @@ export const analyzeAllSchema = z.object({
|
|
|
54
54
|
path: z.string().optional().default('.').describe('Directory path to search in')
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
+
export const executePlanSchema = z.object({
|
|
58
|
+
code: z.string().min(1).describe('JavaScript DSL code to execute. All function calls look synchronous — do NOT use async/await. Use map(items, fn) for batch operations. Use LLM(instruction, data) for AI processing.'),
|
|
59
|
+
description: z.string().optional().describe('Human-readable description of what this plan does, for logging.')
|
|
60
|
+
});
|
|
61
|
+
|
|
57
62
|
// Schema for the attempt_completion tool - flexible validation for direct XML response
|
|
58
63
|
export const attemptCompletionSchema = {
|
|
59
64
|
// Custom validation that requires result parameter but allows direct XML response
|
|
@@ -425,6 +430,7 @@ export const DEFAULT_VALID_TOOLS = [
|
|
|
425
430
|
'extract',
|
|
426
431
|
'delegate',
|
|
427
432
|
'analyze_all',
|
|
433
|
+
'execute_plan',
|
|
428
434
|
'listSkills',
|
|
429
435
|
'useSkill',
|
|
430
436
|
'listFiles',
|
|
@@ -463,6 +469,7 @@ function getValidParamsForTool(toolName) {
|
|
|
463
469
|
extract: extractSchema,
|
|
464
470
|
delegate: delegateSchema,
|
|
465
471
|
analyze_all: analyzeAllSchema,
|
|
472
|
+
execute_plan: executePlanSchema,
|
|
466
473
|
listSkills: listSkillsSchema,
|
|
467
474
|
useSkill: useSkillSchema,
|
|
468
475
|
bash: bashSchema,
|