oroute-cli 0.1.0 → 0.2.1
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/oroute.cjs +2 -0
- package/dist/oroute.cjs +244533 -0
- package/package.json +27 -6
- package/dist/agent.d.ts +0 -11
- package/dist/agent.js +0 -569
- package/dist/agent.js.map +0 -1
- package/dist/commands.d.ts +0 -24
- package/dist/commands.js +0 -173
- package/dist/commands.js.map +0 -1
- package/dist/context.d.ts +0 -13
- package/dist/context.js +0 -110
- package/dist/context.js.map +0 -1
- package/dist/cost.d.ts +0 -18
- package/dist/cost.js +0 -80
- package/dist/cost.js.map +0 -1
- package/dist/history.d.ts +0 -20
- package/dist/history.js +0 -49
- package/dist/history.js.map +0 -1
- package/dist/hooks.d.ts +0 -13
- package/dist/hooks.js +0 -101
- package/dist/hooks.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -475
- package/dist/index.js.map +0 -1
- package/dist/markdown.d.ts +0 -4
- package/dist/markdown.js +0 -126
- package/dist/markdown.js.map +0 -1
- package/dist/memory.d.ts +0 -27
- package/dist/memory.js +0 -208
- package/dist/memory.js.map +0 -1
- package/dist/session.d.ts +0 -43
- package/dist/session.js +0 -166
- package/dist/session.js.map +0 -1
- package/dist/streaming.d.ts +0 -27
- package/dist/streaming.js +0 -201
- package/dist/streaming.js.map +0 -1
- package/dist/tools/editFile.d.ts +0 -34
- package/dist/tools/editFile.js +0 -40
- package/dist/tools/editFile.js.map +0 -1
- package/dist/tools/executeCommand.d.ts +0 -32
- package/dist/tools/executeCommand.js +0 -75
- package/dist/tools/executeCommand.js.map +0 -1
- package/dist/tools/glob.d.ts +0 -24
- package/dist/tools/glob.js +0 -128
- package/dist/tools/glob.js.map +0 -1
- package/dist/tools/index.d.ts +0 -40
- package/dist/tools/index.js +0 -28
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/listDirectory.d.ts +0 -23
- package/dist/tools/listDirectory.js +0 -57
- package/dist/tools/listDirectory.js.map +0 -1
- package/dist/tools/notebook.d.ts +0 -7
- package/dist/tools/notebook.js +0 -76
- package/dist/tools/notebook.js.map +0 -1
- package/dist/tools/readFile.d.ts +0 -28
- package/dist/tools/readFile.js +0 -40
- package/dist/tools/readFile.js.map +0 -1
- package/dist/tools/readImage.d.ts +0 -25
- package/dist/tools/readImage.js +0 -52
- package/dist/tools/readImage.js.map +0 -1
- package/dist/tools/searchFiles.d.ts +0 -33
- package/dist/tools/searchFiles.js +0 -95
- package/dist/tools/searchFiles.js.map +0 -1
- package/dist/tools/writeFile.d.ts +0 -30
- package/dist/tools/writeFile.js +0 -54
- package/dist/tools/writeFile.js.map +0 -1
- package/dist/ui.d.ts +0 -30
- package/dist/ui.js +0 -79
- package/dist/ui.js.map +0 -1
- package/dist/update.d.ts +0 -10
- package/dist/update.js +0 -93
- package/dist/update.js.map +0 -1
package/dist/streaming.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/** Parse an SSE stream from a fetch Response into structured result */
|
|
2
|
-
export async function parseSSEStream(response, onTextDelta) {
|
|
3
|
-
const contentBlocks = [];
|
|
4
|
-
let stopReason = null;
|
|
5
|
-
let usage = { input_tokens: 0, output_tokens: 0 };
|
|
6
|
-
let model = '';
|
|
7
|
-
let routingMetadata;
|
|
8
|
-
let currentBlockIndex = -1;
|
|
9
|
-
const body = response.body;
|
|
10
|
-
if (!body) {
|
|
11
|
-
throw new Error('Response body is null');
|
|
12
|
-
}
|
|
13
|
-
const reader = body.getReader();
|
|
14
|
-
const decoder = new TextDecoder();
|
|
15
|
-
let buffer = '';
|
|
16
|
-
try {
|
|
17
|
-
while (true) {
|
|
18
|
-
const { done, value } = await reader.read();
|
|
19
|
-
if (done)
|
|
20
|
-
break;
|
|
21
|
-
buffer += decoder.decode(value, { stream: true });
|
|
22
|
-
// Parse SSE events from buffer
|
|
23
|
-
const events = extractSSEEvents(buffer);
|
|
24
|
-
buffer = events.remaining;
|
|
25
|
-
for (const evt of events.parsed) {
|
|
26
|
-
processSSEEvent(evt, contentBlocks, onTextDelta, {
|
|
27
|
-
setStopReason: (r) => { stopReason = r; },
|
|
28
|
-
setUsage: (u) => { usage = u; },
|
|
29
|
-
setModel: (m) => { model = m; },
|
|
30
|
-
setRoutingMetadata: (rm) => { routingMetadata = rm; },
|
|
31
|
-
setCurrentBlockIndex: (i) => { currentBlockIndex = i; },
|
|
32
|
-
getCurrentBlockIndex: () => currentBlockIndex,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
reader.releaseLock();
|
|
39
|
-
}
|
|
40
|
-
// Finalize tool_use blocks — parse accumulated JSON
|
|
41
|
-
for (const block of contentBlocks) {
|
|
42
|
-
if (block.type === 'tool_use' && block.inputJson) {
|
|
43
|
-
try {
|
|
44
|
-
block.input = JSON.parse(block.inputJson);
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
block.input = {};
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return { contentBlocks, stopReason, usage, model, routingMetadata };
|
|
52
|
-
}
|
|
53
|
-
function processSSEEvent(evt, contentBlocks, onTextDelta, cb) {
|
|
54
|
-
if (evt.event === 'ping' || !evt.data)
|
|
55
|
-
return;
|
|
56
|
-
let data;
|
|
57
|
-
try {
|
|
58
|
-
data = JSON.parse(evt.data);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
switch (evt.event) {
|
|
64
|
-
case 'message_start': {
|
|
65
|
-
const message = data['message'];
|
|
66
|
-
if (message) {
|
|
67
|
-
if (message['model'])
|
|
68
|
-
cb.setModel(message['model']);
|
|
69
|
-
if (message['usage']) {
|
|
70
|
-
const u = message['usage'];
|
|
71
|
-
cb.setUsage({ input_tokens: u['input_tokens'] ?? 0, output_tokens: u['output_tokens'] ?? 0 });
|
|
72
|
-
}
|
|
73
|
-
if (message['routing_metadata']) {
|
|
74
|
-
cb.setRoutingMetadata(message['routing_metadata']);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
case 'content_block_start': {
|
|
80
|
-
const index = data['index'];
|
|
81
|
-
const contentBlock = data['content_block'];
|
|
82
|
-
cb.setCurrentBlockIndex(index);
|
|
83
|
-
if (contentBlock['type'] === 'text') {
|
|
84
|
-
contentBlocks[index] = { type: 'text', text: '' };
|
|
85
|
-
}
|
|
86
|
-
else if (contentBlock['type'] === 'tool_use') {
|
|
87
|
-
contentBlocks[index] = {
|
|
88
|
-
type: 'tool_use',
|
|
89
|
-
id: contentBlock['id'],
|
|
90
|
-
name: contentBlock['name'],
|
|
91
|
-
inputJson: '',
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
case 'content_block_delta': {
|
|
97
|
-
const index = data['index'];
|
|
98
|
-
const delta = data['delta'];
|
|
99
|
-
const block = contentBlocks[index];
|
|
100
|
-
if (!block)
|
|
101
|
-
break;
|
|
102
|
-
if (delta['type'] === 'text_delta') {
|
|
103
|
-
const text = delta['text'];
|
|
104
|
-
if (block.type === 'text') {
|
|
105
|
-
block.text = (block.text ?? '') + text;
|
|
106
|
-
}
|
|
107
|
-
onTextDelta(text);
|
|
108
|
-
}
|
|
109
|
-
else if (delta['type'] === 'input_json_delta') {
|
|
110
|
-
const partial = delta['partial_json'];
|
|
111
|
-
if (block.type === 'tool_use') {
|
|
112
|
-
block.inputJson = (block.inputJson ?? '') + partial;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
case 'content_block_stop': {
|
|
118
|
-
// Block finalized — nothing extra needed
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
case 'message_delta': {
|
|
122
|
-
const delta = data['delta'];
|
|
123
|
-
if (delta?.['stop_reason']) {
|
|
124
|
-
cb.setStopReason(delta['stop_reason']);
|
|
125
|
-
}
|
|
126
|
-
const msgUsage = data['usage'];
|
|
127
|
-
if (msgUsage) {
|
|
128
|
-
cb.setUsage({
|
|
129
|
-
input_tokens: msgUsage['input_tokens'] ?? 0,
|
|
130
|
-
output_tokens: msgUsage['output_tokens'] ?? 0,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
case 'message_stop': {
|
|
136
|
-
// End of message
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
case 'error': {
|
|
140
|
-
const error = data['error'];
|
|
141
|
-
const msg = error?.['message'] ?? 'Unknown streaming error';
|
|
142
|
-
throw new Error(msg);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/** Extract complete SSE events from buffer, return parsed events + remaining buffer */
|
|
147
|
-
function extractSSEEvents(buffer) {
|
|
148
|
-
const parsed = [];
|
|
149
|
-
const lines = buffer.split('\n');
|
|
150
|
-
let currentEvent = '';
|
|
151
|
-
let currentData = '';
|
|
152
|
-
let i = 0;
|
|
153
|
-
while (i < lines.length) {
|
|
154
|
-
const line = lines[i];
|
|
155
|
-
if (line.startsWith('event: ')) {
|
|
156
|
-
currentEvent = line.slice(7).trim();
|
|
157
|
-
i++;
|
|
158
|
-
}
|
|
159
|
-
else if (line.startsWith('data: ')) {
|
|
160
|
-
currentData = line.slice(6);
|
|
161
|
-
i++;
|
|
162
|
-
}
|
|
163
|
-
else if (line === '') {
|
|
164
|
-
// Empty line = event separator
|
|
165
|
-
if (currentEvent || currentData) {
|
|
166
|
-
parsed.push({ event: currentEvent || 'message', data: currentData });
|
|
167
|
-
currentEvent = '';
|
|
168
|
-
currentData = '';
|
|
169
|
-
}
|
|
170
|
-
i++;
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
// If we're at the last line and it's incomplete, keep it in the buffer
|
|
174
|
-
if (i === lines.length - 1 && !buffer.endsWith('\n')) {
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
i++;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// Remaining unparsed buffer
|
|
181
|
-
let remaining = '';
|
|
182
|
-
if (i < lines.length) {
|
|
183
|
-
remaining = lines.slice(i).join('\n');
|
|
184
|
-
}
|
|
185
|
-
// If we have partial event/data, put it back
|
|
186
|
-
if (currentEvent || currentData) {
|
|
187
|
-
const parts = [];
|
|
188
|
-
if (currentEvent)
|
|
189
|
-
parts.push(`event: ${currentEvent}`);
|
|
190
|
-
if (currentData)
|
|
191
|
-
parts.push(`data: ${currentData}`);
|
|
192
|
-
remaining = parts.join('\n') + (remaining ? '\n' + remaining : '');
|
|
193
|
-
}
|
|
194
|
-
return { parsed, remaining };
|
|
195
|
-
}
|
|
196
|
-
/** Check if a Response is SSE (streaming) */
|
|
197
|
-
export function isSSEResponse(response) {
|
|
198
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
199
|
-
return contentType.includes('text/event-stream');
|
|
200
|
-
}
|
|
201
|
-
//# sourceMappingURL=streaming.js.map
|
package/dist/streaming.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/editFile.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export interface EditFileInput {
|
|
2
|
-
path: string;
|
|
3
|
-
old_str: string;
|
|
4
|
-
new_str: string;
|
|
5
|
-
}
|
|
6
|
-
export interface EditFileOutput {
|
|
7
|
-
success: boolean;
|
|
8
|
-
replacements: number;
|
|
9
|
-
}
|
|
10
|
-
export declare function editFileTool(input: EditFileInput, cwd: string): EditFileOutput;
|
|
11
|
-
/** Generate edit diff for confirmation */
|
|
12
|
-
export declare function generateEditDiff(input: EditFileInput): string;
|
|
13
|
-
export declare const editFileDefinition: {
|
|
14
|
-
name: string;
|
|
15
|
-
description: string;
|
|
16
|
-
input_schema: {
|
|
17
|
-
type: "object";
|
|
18
|
-
properties: {
|
|
19
|
-
path: {
|
|
20
|
-
type: string;
|
|
21
|
-
description: string;
|
|
22
|
-
};
|
|
23
|
-
old_str: {
|
|
24
|
-
type: string;
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
new_str: {
|
|
28
|
-
type: string;
|
|
29
|
-
description: string;
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
required: string[];
|
|
33
|
-
};
|
|
34
|
-
};
|
package/dist/tools/editFile.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
export function editFileTool(input, cwd) {
|
|
4
|
-
const resolved = path.resolve(cwd, input.path);
|
|
5
|
-
if (!fs.existsSync(resolved)) {
|
|
6
|
-
throw new Error(`File not found: ${resolved}`);
|
|
7
|
-
}
|
|
8
|
-
const content = fs.readFileSync(resolved, 'utf-8');
|
|
9
|
-
// Count occurrences
|
|
10
|
-
const occurrences = content.split(input.old_str).length - 1;
|
|
11
|
-
if (occurrences === 0) {
|
|
12
|
-
throw new Error(`String not found in file. Make sure old_str matches exactly.`);
|
|
13
|
-
}
|
|
14
|
-
if (occurrences > 1) {
|
|
15
|
-
throw new Error(`Found ${occurrences} occurrences of old_str. It must be unique (exactly 1 match). Provide more context to make it unique.`);
|
|
16
|
-
}
|
|
17
|
-
const newContent = content.replace(input.old_str, input.new_str);
|
|
18
|
-
fs.writeFileSync(resolved, newContent, 'utf-8');
|
|
19
|
-
return { success: true, replacements: 1 };
|
|
20
|
-
}
|
|
21
|
-
/** Generate edit diff for confirmation */
|
|
22
|
-
export function generateEditDiff(input) {
|
|
23
|
-
const oldLines = input.old_str.split('\n').map(l => `- ${l}`);
|
|
24
|
-
const newLines = input.new_str.split('\n').map(l => `+ ${l}`);
|
|
25
|
-
return [...oldLines, ...newLines].join('\n');
|
|
26
|
-
}
|
|
27
|
-
export const editFileDefinition = {
|
|
28
|
-
name: 'edit_file',
|
|
29
|
-
description: 'Replace a specific string in a file. old_str must appear exactly once in the file. Shows diff before applying.',
|
|
30
|
-
input_schema: {
|
|
31
|
-
type: 'object',
|
|
32
|
-
properties: {
|
|
33
|
-
path: { type: 'string', description: 'File path' },
|
|
34
|
-
old_str: { type: 'string', description: 'Exact string to find (must be unique in file)' },
|
|
35
|
-
new_str: { type: 'string', description: 'Replacement string' },
|
|
36
|
-
},
|
|
37
|
-
required: ['path', 'old_str', 'new_str'],
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=editFile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editFile.js","sourceRoot":"","sources":["../../src/tools/editFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAalC,MAAM,UAAU,YAAY,CAAC,KAAoB,EAAE,GAAW;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,oBAAoB;IACpB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5D,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,SAAS,WAAW,uGAAuG,CAAC,CAAC;IAC/I,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAEhD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,gHAAgH;IAC7H,YAAY,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;YAClD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACzF,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;SAC/D;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;KACzC;CACF,CAAC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export interface ExecuteCommandInput {
|
|
2
|
-
command: string;
|
|
3
|
-
cwd?: string;
|
|
4
|
-
}
|
|
5
|
-
export interface ExecuteCommandOutput {
|
|
6
|
-
stdout: string;
|
|
7
|
-
stderr: string;
|
|
8
|
-
exitCode: number;
|
|
9
|
-
}
|
|
10
|
-
export declare function validateCommand(command: string): {
|
|
11
|
-
valid: boolean;
|
|
12
|
-
reason?: string;
|
|
13
|
-
};
|
|
14
|
-
export declare function executeCommandTool(input: ExecuteCommandInput, cwd: string): ExecuteCommandOutput;
|
|
15
|
-
export declare const executeCommandDefinition: {
|
|
16
|
-
name: string;
|
|
17
|
-
description: string;
|
|
18
|
-
input_schema: {
|
|
19
|
-
type: "object";
|
|
20
|
-
properties: {
|
|
21
|
-
command: {
|
|
22
|
-
type: string;
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
cwd: {
|
|
26
|
-
type: string;
|
|
27
|
-
description: string;
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
required: string[];
|
|
31
|
-
};
|
|
32
|
-
};
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
const WHITELIST_PREFIXES = [
|
|
4
|
-
'npm', 'pnpm', 'npx', 'node', 'python3', 'python',
|
|
5
|
-
'git', 'ls', 'cat', 'echo', 'mkdir', 'cp', 'mv',
|
|
6
|
-
'tsc', 'tsx', 'jest', 'vitest', 'prettier',
|
|
7
|
-
'wc', 'head', 'tail', 'grep', 'find', 'which',
|
|
8
|
-
'date', 'pwd', 'whoami', 'env',
|
|
9
|
-
];
|
|
10
|
-
const BLACKLIST_PATTERNS = [
|
|
11
|
-
/rm\s+-rf/,
|
|
12
|
-
/curl\s+.*\|\s*sh/,
|
|
13
|
-
/wget\s+.*\|\s*sh/,
|
|
14
|
-
/sudo/,
|
|
15
|
-
/chmod\s+777/,
|
|
16
|
-
/>\s*\/dev\//,
|
|
17
|
-
/dd\s+if=/,
|
|
18
|
-
/mkfs/,
|
|
19
|
-
/:(){ :|:& };:/,
|
|
20
|
-
];
|
|
21
|
-
const TIMEOUT_MS = 30_000;
|
|
22
|
-
export function validateCommand(command) {
|
|
23
|
-
const trimmed = command.trim();
|
|
24
|
-
const firstWord = trimmed.split(/\s+/)[0] ?? '';
|
|
25
|
-
// Check blacklist first
|
|
26
|
-
for (const pattern of BLACKLIST_PATTERNS) {
|
|
27
|
-
if (pattern.test(trimmed)) {
|
|
28
|
-
return { valid: false, reason: `Blocked pattern: ${pattern.toString()}` };
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// Check whitelist
|
|
32
|
-
const isAllowed = WHITELIST_PREFIXES.some(prefix => firstWord === prefix);
|
|
33
|
-
if (!isAllowed) {
|
|
34
|
-
return { valid: false, reason: `Command not in whitelist: ${firstWord}. Allowed: ${WHITELIST_PREFIXES.join(', ')}` };
|
|
35
|
-
}
|
|
36
|
-
return { valid: true };
|
|
37
|
-
}
|
|
38
|
-
export function executeCommandTool(input, cwd) {
|
|
39
|
-
const validation = validateCommand(input.command);
|
|
40
|
-
if (!validation.valid) {
|
|
41
|
-
throw new Error(validation.reason);
|
|
42
|
-
}
|
|
43
|
-
const execCwd = input.cwd ? path.resolve(cwd, input.cwd) : cwd;
|
|
44
|
-
try {
|
|
45
|
-
const stdout = execSync(input.command, {
|
|
46
|
-
cwd: execCwd,
|
|
47
|
-
timeout: TIMEOUT_MS,
|
|
48
|
-
encoding: 'utf-8',
|
|
49
|
-
maxBuffer: 1024 * 1024 * 5, // 5MB
|
|
50
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
51
|
-
});
|
|
52
|
-
return { stdout: stdout.slice(0, 10000), stderr: '', exitCode: 0 };
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
const execErr = err;
|
|
56
|
-
return {
|
|
57
|
-
stdout: (execErr.stdout ?? '').slice(0, 5000),
|
|
58
|
-
stderr: (execErr.stderr ?? '').slice(0, 5000),
|
|
59
|
-
exitCode: execErr.status ?? 1,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
export const executeCommandDefinition = {
|
|
64
|
-
name: 'execute_command',
|
|
65
|
-
description: 'Execute a shell command. Only whitelisted commands (npm, pnpm, git, node, etc.) are allowed. Timeout: 30 seconds.',
|
|
66
|
-
input_schema: {
|
|
67
|
-
type: 'object',
|
|
68
|
-
properties: {
|
|
69
|
-
command: { type: 'string', description: 'Shell command to execute' },
|
|
70
|
-
cwd: { type: 'string', description: 'Working directory (relative to current, optional)' },
|
|
71
|
-
},
|
|
72
|
-
required: ['command'],
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
//# sourceMappingURL=executeCommand.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executeCommand.js","sourceRoot":"","sources":["../../src/tools/executeCommand.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/glob.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export interface GlobInput {
|
|
2
|
-
pattern: string;
|
|
3
|
-
path?: string;
|
|
4
|
-
}
|
|
5
|
-
/** Execute glob pattern matching against files in a directory */
|
|
6
|
-
export declare function globTool(input: GlobInput, cwd: string): string[];
|
|
7
|
-
export declare const globDefinition: {
|
|
8
|
-
name: string;
|
|
9
|
-
description: string;
|
|
10
|
-
input_schema: {
|
|
11
|
-
type: "object";
|
|
12
|
-
properties: {
|
|
13
|
-
pattern: {
|
|
14
|
-
type: string;
|
|
15
|
-
description: string;
|
|
16
|
-
};
|
|
17
|
-
path: {
|
|
18
|
-
type: string;
|
|
19
|
-
description: string;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
required: string[];
|
|
23
|
-
};
|
|
24
|
-
};
|
package/dist/tools/glob.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* B2: Glob Tool — find files matching glob patterns.
|
|
3
|
-
* Pure Node.js implementation, no external dependencies.
|
|
4
|
-
*/
|
|
5
|
-
import * as fs from 'node:fs';
|
|
6
|
-
import * as path from 'node:path';
|
|
7
|
-
/** Directories to always exclude from glob traversal */
|
|
8
|
-
const EXCLUDED_DIRS = new Set([
|
|
9
|
-
'node_modules', '.git', '.next', 'dist', 'coverage',
|
|
10
|
-
'.cache', '.turbo', '__pycache__', '.venv', 'venv',
|
|
11
|
-
'build', '.svn', '.hg',
|
|
12
|
-
]);
|
|
13
|
-
const MAX_RESULTS = 100;
|
|
14
|
-
/** Convert a glob pattern to a RegExp */
|
|
15
|
-
function globToRegex(pattern) {
|
|
16
|
-
let regexStr = '';
|
|
17
|
-
let i = 0;
|
|
18
|
-
while (i < pattern.length) {
|
|
19
|
-
const char = pattern[i];
|
|
20
|
-
if (char === '*' && pattern[i + 1] === '*') {
|
|
21
|
-
// ** matches any depth (including zero directories)
|
|
22
|
-
if (pattern[i + 2] === '/') {
|
|
23
|
-
regexStr += '(?:.*/)?';
|
|
24
|
-
i += 3;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
regexStr += '.*';
|
|
28
|
-
i += 2;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else if (char === '*') {
|
|
32
|
-
// * matches any chars except /
|
|
33
|
-
regexStr += '[^/]*';
|
|
34
|
-
i++;
|
|
35
|
-
}
|
|
36
|
-
else if (char === '?') {
|
|
37
|
-
// ? matches single char except /
|
|
38
|
-
regexStr += '[^/]';
|
|
39
|
-
i++;
|
|
40
|
-
}
|
|
41
|
-
else if (char === '.') {
|
|
42
|
-
regexStr += '\\.';
|
|
43
|
-
i++;
|
|
44
|
-
}
|
|
45
|
-
else if (char === '{') {
|
|
46
|
-
regexStr += '(?:';
|
|
47
|
-
i++;
|
|
48
|
-
}
|
|
49
|
-
else if (char === '}') {
|
|
50
|
-
regexStr += ')';
|
|
51
|
-
i++;
|
|
52
|
-
}
|
|
53
|
-
else if (char === ',') {
|
|
54
|
-
regexStr += '|';
|
|
55
|
-
i++;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
regexStr += char;
|
|
59
|
-
i++;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return new RegExp(`^${regexStr}$`);
|
|
63
|
-
}
|
|
64
|
-
/** Recursively walk a directory, collecting relative paths */
|
|
65
|
-
function walkDirectory(baseDir, currentDir, results, maxDepth, depth) {
|
|
66
|
-
if (depth > maxDepth || results.length >= MAX_RESULTS)
|
|
67
|
-
return;
|
|
68
|
-
let entries;
|
|
69
|
-
try {
|
|
70
|
-
entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
for (const entry of entries) {
|
|
76
|
-
if (results.length >= MAX_RESULTS)
|
|
77
|
-
return;
|
|
78
|
-
const entryName = entry.name;
|
|
79
|
-
if (entry.isDirectory()) {
|
|
80
|
-
if (EXCLUDED_DIRS.has(entryName) || entryName.startsWith('.')) {
|
|
81
|
-
// Allow dotfiles for patterns that explicitly target them
|
|
82
|
-
if (EXCLUDED_DIRS.has(entryName))
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
walkDirectory(baseDir, path.join(currentDir, entryName), results, maxDepth, depth + 1);
|
|
86
|
-
}
|
|
87
|
-
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
88
|
-
const relativePath = path.relative(baseDir, path.join(currentDir, entryName));
|
|
89
|
-
results.push(relativePath);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/** Execute glob pattern matching against files in a directory */
|
|
94
|
-
export function globTool(input, cwd) {
|
|
95
|
-
const baseDir = input.path
|
|
96
|
-
? path.resolve(cwd, input.path)
|
|
97
|
-
: cwd;
|
|
98
|
-
if (!fs.existsSync(baseDir)) {
|
|
99
|
-
throw new Error(`Directory not found: ${baseDir}`);
|
|
100
|
-
}
|
|
101
|
-
const stat = fs.statSync(baseDir);
|
|
102
|
-
if (!stat.isDirectory()) {
|
|
103
|
-
throw new Error(`Not a directory: ${baseDir}`);
|
|
104
|
-
}
|
|
105
|
-
// Determine max traversal depth from pattern
|
|
106
|
-
const hasDoublestar = input.pattern.includes('**');
|
|
107
|
-
const maxDepth = hasDoublestar ? 20 : input.pattern.split('/').length + 1;
|
|
108
|
-
// Collect all file paths
|
|
109
|
-
const allPaths = [];
|
|
110
|
-
walkDirectory(baseDir, baseDir, allPaths, maxDepth, 0);
|
|
111
|
-
// Match against glob pattern
|
|
112
|
-
const regex = globToRegex(input.pattern);
|
|
113
|
-
const matched = allPaths.filter(p => regex.test(p));
|
|
114
|
-
return matched.slice(0, MAX_RESULTS);
|
|
115
|
-
}
|
|
116
|
-
export const globDefinition = {
|
|
117
|
-
name: 'glob',
|
|
118
|
-
description: 'Find files matching a glob pattern (e.g. "**/*.tsx", "src/**/*.test.ts"). Excludes node_modules, .git, etc.',
|
|
119
|
-
input_schema: {
|
|
120
|
-
type: 'object',
|
|
121
|
-
properties: {
|
|
122
|
-
pattern: { type: 'string', description: 'Glob pattern to match files' },
|
|
123
|
-
path: { type: 'string', description: 'Base directory (default: cwd)' },
|
|
124
|
-
},
|
|
125
|
-
required: ['pattern'],
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
//# sourceMappingURL=glob.js.map
|
package/dist/tools/glob.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export { readFileTool, readFileDefinition, type ReadFileInput } from './readFile.js';
|
|
2
|
-
export { writeFileTool, writeFileDefinition, generateDiff, type WriteFileInput } from './writeFile.js';
|
|
3
|
-
export { listDirectoryTool, listDirectoryDefinition, type ListDirectoryInput } from './listDirectory.js';
|
|
4
|
-
export { searchFilesTool, searchFilesDefinition, type SearchFilesInput } from './searchFiles.js';
|
|
5
|
-
export { executeCommandTool, executeCommandDefinition, validateCommand, type ExecuteCommandInput } from './executeCommand.js';
|
|
6
|
-
export { editFileTool, editFileDefinition, generateEditDiff, type EditFileInput } from './editFile.js';
|
|
7
|
-
export { globTool, globDefinition, type GlobInput } from './glob.js';
|
|
8
|
-
export { readImageTool, readImageDefinition, type ReadImageInput } from './readImage.js';
|
|
9
|
-
export { parseNotebook, isNotebook } from './notebook.js';
|
|
10
|
-
export declare const ALL_TOOL_DEFINITIONS: ({
|
|
11
|
-
name: string;
|
|
12
|
-
description: string;
|
|
13
|
-
input_schema: {
|
|
14
|
-
type: "object";
|
|
15
|
-
properties: {
|
|
16
|
-
command: {
|
|
17
|
-
type: string;
|
|
18
|
-
description: string;
|
|
19
|
-
};
|
|
20
|
-
cwd: {
|
|
21
|
-
type: string;
|
|
22
|
-
description: string;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
required: string[];
|
|
26
|
-
};
|
|
27
|
-
} | {
|
|
28
|
-
name: string;
|
|
29
|
-
description: string;
|
|
30
|
-
input_schema: {
|
|
31
|
-
type: "object";
|
|
32
|
-
properties: {
|
|
33
|
-
path: {
|
|
34
|
-
type: string;
|
|
35
|
-
description: string;
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
required: string[];
|
|
39
|
-
};
|
|
40
|
-
})[];
|
package/dist/tools/index.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export { readFileTool, readFileDefinition } from './readFile.js';
|
|
2
|
-
export { writeFileTool, writeFileDefinition, generateDiff } from './writeFile.js';
|
|
3
|
-
export { listDirectoryTool, listDirectoryDefinition } from './listDirectory.js';
|
|
4
|
-
export { searchFilesTool, searchFilesDefinition } from './searchFiles.js';
|
|
5
|
-
export { executeCommandTool, executeCommandDefinition, validateCommand } from './executeCommand.js';
|
|
6
|
-
export { editFileTool, editFileDefinition, generateEditDiff } from './editFile.js';
|
|
7
|
-
export { globTool, globDefinition } from './glob.js';
|
|
8
|
-
export { readImageTool, readImageDefinition } from './readImage.js';
|
|
9
|
-
export { parseNotebook, isNotebook } from './notebook.js';
|
|
10
|
-
import { readFileDefinition } from './readFile.js';
|
|
11
|
-
import { writeFileDefinition } from './writeFile.js';
|
|
12
|
-
import { listDirectoryDefinition } from './listDirectory.js';
|
|
13
|
-
import { searchFilesDefinition } from './searchFiles.js';
|
|
14
|
-
import { executeCommandDefinition } from './executeCommand.js';
|
|
15
|
-
import { editFileDefinition } from './editFile.js';
|
|
16
|
-
import { globDefinition } from './glob.js';
|
|
17
|
-
import { readImageDefinition } from './readImage.js';
|
|
18
|
-
export const ALL_TOOL_DEFINITIONS = [
|
|
19
|
-
readFileDefinition,
|
|
20
|
-
writeFileDefinition,
|
|
21
|
-
listDirectoryDefinition,
|
|
22
|
-
searchFilesDefinition,
|
|
23
|
-
executeCommandDefinition,
|
|
24
|
-
editFileDefinition,
|
|
25
|
-
globDefinition,
|
|
26
|
-
readImageDefinition,
|
|
27
|
-
];
|
|
28
|
-
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAA2B,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAyB,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,eAAe,EAA4B,MAAM,qBAAqB,CAAC;AAC9H,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAsB,MAAM,eAAe,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAuB,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;IACxB,kBAAkB;IAClB,cAAc;IACd,mBAAmB;CACpB,CAAC"}
|