oroute-cli 0.1.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 (70) hide show
  1. package/dist/agent.d.ts +11 -0
  2. package/dist/agent.js +569 -0
  3. package/dist/agent.js.map +1 -0
  4. package/dist/commands.d.ts +24 -0
  5. package/dist/commands.js +173 -0
  6. package/dist/commands.js.map +1 -0
  7. package/dist/context.d.ts +13 -0
  8. package/dist/context.js +110 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/cost.d.ts +18 -0
  11. package/dist/cost.js +80 -0
  12. package/dist/cost.js.map +1 -0
  13. package/dist/history.d.ts +20 -0
  14. package/dist/history.js +49 -0
  15. package/dist/history.js.map +1 -0
  16. package/dist/hooks.d.ts +13 -0
  17. package/dist/hooks.js +101 -0
  18. package/dist/hooks.js.map +1 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +475 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/markdown.d.ts +4 -0
  23. package/dist/markdown.js +126 -0
  24. package/dist/markdown.js.map +1 -0
  25. package/dist/memory.d.ts +27 -0
  26. package/dist/memory.js +208 -0
  27. package/dist/memory.js.map +1 -0
  28. package/dist/session.d.ts +43 -0
  29. package/dist/session.js +166 -0
  30. package/dist/session.js.map +1 -0
  31. package/dist/streaming.d.ts +27 -0
  32. package/dist/streaming.js +201 -0
  33. package/dist/streaming.js.map +1 -0
  34. package/dist/tools/editFile.d.ts +34 -0
  35. package/dist/tools/editFile.js +40 -0
  36. package/dist/tools/editFile.js.map +1 -0
  37. package/dist/tools/executeCommand.d.ts +32 -0
  38. package/dist/tools/executeCommand.js +75 -0
  39. package/dist/tools/executeCommand.js.map +1 -0
  40. package/dist/tools/glob.d.ts +24 -0
  41. package/dist/tools/glob.js +128 -0
  42. package/dist/tools/glob.js.map +1 -0
  43. package/dist/tools/index.d.ts +40 -0
  44. package/dist/tools/index.js +28 -0
  45. package/dist/tools/index.js.map +1 -0
  46. package/dist/tools/listDirectory.d.ts +23 -0
  47. package/dist/tools/listDirectory.js +57 -0
  48. package/dist/tools/listDirectory.js.map +1 -0
  49. package/dist/tools/notebook.d.ts +7 -0
  50. package/dist/tools/notebook.js +76 -0
  51. package/dist/tools/notebook.js.map +1 -0
  52. package/dist/tools/readFile.d.ts +28 -0
  53. package/dist/tools/readFile.js +40 -0
  54. package/dist/tools/readFile.js.map +1 -0
  55. package/dist/tools/readImage.d.ts +25 -0
  56. package/dist/tools/readImage.js +52 -0
  57. package/dist/tools/readImage.js.map +1 -0
  58. package/dist/tools/searchFiles.d.ts +33 -0
  59. package/dist/tools/searchFiles.js +95 -0
  60. package/dist/tools/searchFiles.js.map +1 -0
  61. package/dist/tools/writeFile.d.ts +30 -0
  62. package/dist/tools/writeFile.js +54 -0
  63. package/dist/tools/writeFile.js.map +1 -0
  64. package/dist/ui.d.ts +30 -0
  65. package/dist/ui.js +79 -0
  66. package/dist/ui.js.map +1 -0
  67. package/dist/update.d.ts +10 -0
  68. package/dist/update.js +93 -0
  69. package/dist/update.js.map +1 -0
  70. package/package.json +33 -0
@@ -0,0 +1,23 @@
1
+ export interface ListDirectoryInput {
2
+ path: string;
3
+ depth?: number;
4
+ }
5
+ export declare function listDirectoryTool(input: ListDirectoryInput, cwd: string): string;
6
+ export declare const listDirectoryDefinition: {
7
+ name: string;
8
+ description: string;
9
+ input_schema: {
10
+ type: "object";
11
+ properties: {
12
+ path: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ depth: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ };
21
+ required: string[];
22
+ };
23
+ };
@@ -0,0 +1,57 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const EXCLUDED = new Set([
4
+ 'node_modules', '.git', '.next', 'dist', '.cache',
5
+ '.turbo', 'coverage', '__pycache__', '.DS_Store',
6
+ ]);
7
+ export function listDirectoryTool(input, cwd) {
8
+ const resolved = path.resolve(cwd, input.path);
9
+ const maxDepth = input.depth ?? 2;
10
+ if (!fs.existsSync(resolved)) {
11
+ throw new Error(`Directory not found: ${resolved}`);
12
+ }
13
+ const stat = fs.statSync(resolved);
14
+ if (!stat.isDirectory()) {
15
+ throw new Error(`Not a directory: ${resolved}`);
16
+ }
17
+ const lines = [path.basename(resolved) + '/'];
18
+ buildTree(resolved, '', 0, maxDepth, lines);
19
+ return lines.join('\n');
20
+ }
21
+ function buildTree(dir, prefix, depth, maxDepth, lines) {
22
+ if (depth >= maxDepth)
23
+ return;
24
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
25
+ .filter(e => !EXCLUDED.has(e.name) && !e.name.startsWith('.'))
26
+ .sort((a, b) => {
27
+ if (a.isDirectory() && !b.isDirectory())
28
+ return -1;
29
+ if (!a.isDirectory() && b.isDirectory())
30
+ return 1;
31
+ return a.name.localeCompare(b.name);
32
+ });
33
+ for (let i = 0; i < entries.length; i++) {
34
+ const entry = entries[i];
35
+ const isLast = i === entries.length - 1;
36
+ const connector = isLast ? '└── ' : '├── ';
37
+ const childPrefix = isLast ? ' ' : '│ ';
38
+ const suffix = entry.isDirectory() ? '/' : '';
39
+ lines.push(`${prefix}${connector}${entry.name}${suffix}`);
40
+ if (entry.isDirectory()) {
41
+ buildTree(path.join(dir, entry.name), prefix + childPrefix, depth + 1, maxDepth, lines);
42
+ }
43
+ }
44
+ }
45
+ export const listDirectoryDefinition = {
46
+ name: 'list_directory',
47
+ description: 'List directory contents as a tree structure. Excludes node_modules, .git, .next, dist.',
48
+ input_schema: {
49
+ type: 'object',
50
+ properties: {
51
+ path: { type: 'string', description: 'Directory path (relative to cwd or absolute)' },
52
+ depth: { type: 'number', description: 'Max depth to traverse (default: 2)' },
53
+ },
54
+ required: ['path'],
55
+ },
56
+ };
57
+ //# sourceMappingURL=listDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDirectory.js","sourceRoot":"","sources":["../../src/tools/listDirectory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * B3: Notebook Support — parse .ipynb Jupyter notebooks into readable text.
3
+ */
4
+ /** Parse a .ipynb notebook JSON into human-readable text */
5
+ export declare function parseNotebook(jsonContent: string): string;
6
+ /** Check if a file path is a Jupyter notebook */
7
+ export declare function isNotebook(filePath: string): boolean;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * B3: Notebook Support — parse .ipynb Jupyter notebooks into readable text.
3
+ */
4
+ /** Format a notebook cell's outputs into readable text */
5
+ function formatOutputs(outputs) {
6
+ const parts = [];
7
+ for (const output of outputs) {
8
+ switch (output.output_type) {
9
+ case 'stream':
10
+ case 'execute_result': {
11
+ const text = output.text?.join('') ?? output.data?.['text/plain']?.join('') ?? '';
12
+ if (text)
13
+ parts.push(text.trimEnd());
14
+ break;
15
+ }
16
+ case 'error': {
17
+ const errorMsg = output.traceback?.join('\n') ?? `${output.ename}: ${output.evalue}`;
18
+ parts.push(`[Error] ${errorMsg}`);
19
+ break;
20
+ }
21
+ case 'display_data': {
22
+ const displayText = output.data?.['text/plain']?.join('') ?? '';
23
+ if (displayText)
24
+ parts.push(displayText.trimEnd());
25
+ if (output.data?.['image/png'])
26
+ parts.push('[Image output: base64 PNG]');
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ return parts.join('\n');
32
+ }
33
+ /** Parse a .ipynb notebook JSON into human-readable text */
34
+ export function parseNotebook(jsonContent) {
35
+ const notebook = JSON.parse(jsonContent);
36
+ const parts = [];
37
+ // Header with metadata
38
+ const lang = notebook.metadata?.kernelspec?.display_name
39
+ ?? notebook.metadata?.language_info?.name
40
+ ?? 'unknown';
41
+ parts.push(`[Jupyter Notebook — ${lang}]`);
42
+ parts.push(`[${notebook.cells.length} cells]`);
43
+ parts.push('');
44
+ for (let i = 0; i < notebook.cells.length; i++) {
45
+ const cell = notebook.cells[i];
46
+ const cellNum = i + 1;
47
+ const source = cell.source.join('');
48
+ if (cell.cell_type === 'code') {
49
+ const execCount = cell.execution_count != null ? ` In[${cell.execution_count}]` : '';
50
+ parts.push(`[Cell ${cellNum} - code${execCount}]`);
51
+ parts.push(source);
52
+ if (cell.outputs && cell.outputs.length > 0) {
53
+ const outputText = formatOutputs(cell.outputs);
54
+ if (outputText) {
55
+ parts.push(`[Output]`);
56
+ parts.push(outputText);
57
+ }
58
+ }
59
+ }
60
+ else if (cell.cell_type === 'markdown') {
61
+ parts.push(`[Cell ${cellNum} - markdown]`);
62
+ parts.push(source);
63
+ }
64
+ else if (cell.cell_type === 'raw') {
65
+ parts.push(`[Cell ${cellNum} - raw]`);
66
+ parts.push(source);
67
+ }
68
+ parts.push('');
69
+ }
70
+ return parts.join('\n');
71
+ }
72
+ /** Check if a file path is a Jupyter notebook */
73
+ export function isNotebook(filePath) {
74
+ return filePath.endsWith('.ipynb');
75
+ }
76
+ //# sourceMappingURL=notebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/tools/notebook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface ReadFileInput {
2
+ path: string;
3
+ encoding?: string;
4
+ }
5
+ export interface ReadFileOutput {
6
+ content: string;
7
+ lines: number;
8
+ size: number;
9
+ }
10
+ export declare function readFileTool(input: ReadFileInput, cwd: string): ReadFileOutput;
11
+ export declare const readFileDefinition: {
12
+ name: string;
13
+ description: string;
14
+ input_schema: {
15
+ type: "object";
16
+ properties: {
17
+ path: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ encoding: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ };
@@ -0,0 +1,40 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { isNotebook, parseNotebook } from './notebook.js';
4
+ const MAX_SIZE = 1_000_000; // 1MB
5
+ export function readFileTool(input, cwd) {
6
+ const resolved = path.resolve(cwd, input.path);
7
+ if (!fs.existsSync(resolved)) {
8
+ throw new Error(`File not found: ${resolved}`);
9
+ }
10
+ const stat = fs.statSync(resolved);
11
+ if (stat.isDirectory()) {
12
+ throw new Error(`Path is a directory, not a file: ${resolved}`);
13
+ }
14
+ if (stat.size > MAX_SIZE) {
15
+ throw new Error(`File too large (${(stat.size / 1024).toFixed(0)}KB). Max: 1MB`);
16
+ }
17
+ const encoding = (input.encoding ?? 'utf-8');
18
+ const rawContent = fs.readFileSync(resolved, encoding);
19
+ // B3: Notebook support — parse .ipynb files into readable text
20
+ if (isNotebook(resolved)) {
21
+ const content = parseNotebook(rawContent);
22
+ const lines = content.split('\n').length;
23
+ return { content, lines, size: stat.size };
24
+ }
25
+ const lines = rawContent.split('\n').length;
26
+ return { content: rawContent, lines, size: stat.size };
27
+ }
28
+ export const readFileDefinition = {
29
+ name: 'read_file',
30
+ description: 'Read the contents of a file. Returns the text content, line count, and file size.',
31
+ input_schema: {
32
+ type: 'object',
33
+ properties: {
34
+ path: { type: 'string', description: 'File path (relative to cwd or absolute)' },
35
+ encoding: { type: 'string', description: 'File encoding (default: utf-8)' },
36
+ },
37
+ required: ['path'],
38
+ },
39
+ };
40
+ //# sourceMappingURL=readFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readFile.js","sourceRoot":"","sources":["../../src/tools/readFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAa1D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,MAAM;AAElC,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,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAmB,CAAC;IAC/D,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEvD,+DAA+D;IAC/D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,mFAAmF;IAChG,YAAY,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;YAChF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;SAC5E;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface ReadImageInput {
2
+ path: string;
3
+ }
4
+ export interface ReadImageOutput {
5
+ type: 'image';
6
+ media_type: string;
7
+ data: string;
8
+ size: number;
9
+ }
10
+ /** Read an image file and return base64-encoded content */
11
+ export declare function readImageTool(input: ReadImageInput, cwd: string): ReadImageOutput;
12
+ export declare const readImageDefinition: {
13
+ name: string;
14
+ description: string;
15
+ input_schema: {
16
+ type: "object";
17
+ properties: {
18
+ path: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ };
23
+ required: string[];
24
+ };
25
+ };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * B4: Image Reading — read image files as base64 for multimodal analysis.
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ const MAX_IMAGE_SIZE = 5 * 1024 * 1024; // 5MB
7
+ const MIME_TYPES = {
8
+ '.png': 'image/png',
9
+ '.jpg': 'image/jpeg',
10
+ '.jpeg': 'image/jpeg',
11
+ '.gif': 'image/gif',
12
+ '.webp': 'image/webp',
13
+ };
14
+ /** Read an image file and return base64-encoded content */
15
+ export function readImageTool(input, cwd) {
16
+ const resolved = path.resolve(cwd, input.path);
17
+ if (!fs.existsSync(resolved)) {
18
+ throw new Error(`Image file not found: ${resolved}`);
19
+ }
20
+ const stat = fs.statSync(resolved);
21
+ if (stat.isDirectory()) {
22
+ throw new Error(`Path is a directory, not a file: ${resolved}`);
23
+ }
24
+ if (stat.size > MAX_IMAGE_SIZE) {
25
+ throw new Error(`Image too large (${(stat.size / 1024 / 1024).toFixed(1)}MB). Max: 5MB`);
26
+ }
27
+ const ext = path.extname(resolved).toLowerCase();
28
+ const mediaType = MIME_TYPES[ext];
29
+ if (!mediaType) {
30
+ throw new Error(`Unsupported image format: ${ext}. Supported: ${Object.keys(MIME_TYPES).join(', ')}`);
31
+ }
32
+ const buffer = fs.readFileSync(resolved);
33
+ const base64 = buffer.toString('base64');
34
+ return {
35
+ type: 'image',
36
+ media_type: mediaType,
37
+ data: base64,
38
+ size: stat.size,
39
+ };
40
+ }
41
+ export const readImageDefinition = {
42
+ name: 'read_image',
43
+ description: 'Read an image file and return its base64 content for visual analysis.',
44
+ input_schema: {
45
+ type: 'object',
46
+ properties: {
47
+ path: { type: 'string', description: 'Path to the image file (PNG, JPG, GIF, WebP)' },
48
+ },
49
+ required: ['path'],
50
+ },
51
+ };
52
+ //# sourceMappingURL=readImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readImage.js","sourceRoot":"","sources":["../../src/tools/readImage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAalC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAE9C,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,KAAqB,EAAE,GAAW;IAC9D,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,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,gBAAgB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,uEAAuE;IACpF,YAAY,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;SACtF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface SearchFilesInput {
2
+ pattern: string;
3
+ path: string;
4
+ recursive?: boolean;
5
+ }
6
+ export interface SearchResult {
7
+ file: string;
8
+ line: number;
9
+ content: string;
10
+ }
11
+ export declare function searchFilesTool(input: SearchFilesInput, cwd: string): SearchResult[];
12
+ export declare const searchFilesDefinition: {
13
+ name: string;
14
+ description: string;
15
+ input_schema: {
16
+ type: "object";
17
+ properties: {
18
+ pattern: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ path: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ recursive: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: string[];
32
+ };
33
+ };
@@ -0,0 +1,95 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const EXCLUDED = new Set([
4
+ 'node_modules', '.git', '.next', 'dist', '.cache',
5
+ '.turbo', 'coverage', '__pycache__',
6
+ ]);
7
+ const BINARY_EXTENSIONS = new Set([
8
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2',
9
+ '.ttf', '.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz',
10
+ ]);
11
+ const MAX_RESULTS = 50;
12
+ export function searchFilesTool(input, cwd) {
13
+ const resolved = path.resolve(cwd, input.path);
14
+ const recursive = input.recursive ?? true;
15
+ const results = [];
16
+ if (!fs.existsSync(resolved)) {
17
+ throw new Error(`Path not found: ${resolved}`);
18
+ }
19
+ const regex = new RegExp(input.pattern, 'gi');
20
+ function searchDir(dir) {
21
+ if (results.length >= MAX_RESULTS)
22
+ return;
23
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
24
+ for (const entry of entries) {
25
+ if (results.length >= MAX_RESULTS)
26
+ return;
27
+ if (EXCLUDED.has(entry.name) || entry.name.startsWith('.'))
28
+ continue;
29
+ const full = path.join(dir, entry.name);
30
+ if (entry.isDirectory() && recursive) {
31
+ searchDir(full);
32
+ }
33
+ else if (entry.isFile()) {
34
+ const ext = path.extname(entry.name).toLowerCase();
35
+ if (BINARY_EXTENSIONS.has(ext))
36
+ continue;
37
+ try {
38
+ const stat = fs.statSync(full);
39
+ if (stat.size > 500_000)
40
+ continue; // Skip files > 500KB
41
+ const content = fs.readFileSync(full, 'utf-8');
42
+ const lines = content.split('\n');
43
+ for (let i = 0; i < lines.length; i++) {
44
+ if (results.length >= MAX_RESULTS)
45
+ return;
46
+ if (regex.test(lines[i])) {
47
+ results.push({
48
+ file: path.relative(cwd, full),
49
+ line: i + 1,
50
+ content: lines[i].trim().slice(0, 200),
51
+ });
52
+ }
53
+ regex.lastIndex = 0;
54
+ }
55
+ }
56
+ catch {
57
+ // Skip unreadable files
58
+ }
59
+ }
60
+ }
61
+ }
62
+ const stat = fs.statSync(resolved);
63
+ if (stat.isFile()) {
64
+ const content = fs.readFileSync(resolved, 'utf-8');
65
+ const lines = content.split('\n');
66
+ for (let i = 0; i < lines.length; i++) {
67
+ if (regex.test(lines[i])) {
68
+ results.push({
69
+ file: path.relative(cwd, resolved),
70
+ line: i + 1,
71
+ content: lines[i].trim().slice(0, 200),
72
+ });
73
+ }
74
+ regex.lastIndex = 0;
75
+ }
76
+ }
77
+ else {
78
+ searchDir(resolved);
79
+ }
80
+ return results;
81
+ }
82
+ export const searchFilesDefinition = {
83
+ name: 'search_files',
84
+ description: 'Search for a text pattern in files (like grep). Returns matching file paths, line numbers, and content.',
85
+ input_schema: {
86
+ type: 'object',
87
+ properties: {
88
+ pattern: { type: 'string', description: 'Search pattern (regex)' },
89
+ path: { type: 'string', description: 'Directory or file to search in' },
90
+ recursive: { type: 'boolean', description: 'Search subdirectories (default: true)' },
91
+ },
92
+ required: ['pattern', 'path'],
93
+ },
94
+ };
95
+ //# sourceMappingURL=searchFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchFiles.js","sourceRoot":"","sources":["../../src/tools/searchFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface WriteFileInput {
2
+ path: string;
3
+ content: string;
4
+ }
5
+ export interface WriteFileOutput {
6
+ success: boolean;
7
+ bytesWritten: number;
8
+ isNew: boolean;
9
+ }
10
+ export declare function writeFileTool(input: WriteFileInput, cwd: string): WriteFileOutput;
11
+ /** Generate a simple diff preview for confirmation */
12
+ export declare function generateDiff(filePath: string, newContent: string, cwd: string): string;
13
+ export declare const writeFileDefinition: {
14
+ name: string;
15
+ description: string;
16
+ input_schema: {
17
+ type: "object";
18
+ properties: {
19
+ path: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ content: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ };
28
+ required: string[];
29
+ };
30
+ };
@@ -0,0 +1,54 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ export function writeFileTool(input, cwd) {
4
+ const resolved = path.resolve(cwd, input.path);
5
+ const isNew = !fs.existsSync(resolved);
6
+ // Ensure parent directory exists
7
+ const dir = path.dirname(resolved);
8
+ if (!fs.existsSync(dir)) {
9
+ fs.mkdirSync(dir, { recursive: true });
10
+ }
11
+ fs.writeFileSync(resolved, input.content, 'utf-8');
12
+ const stat = fs.statSync(resolved);
13
+ return { success: true, bytesWritten: stat.size, isNew };
14
+ }
15
+ /** Generate a simple diff preview for confirmation */
16
+ export function generateDiff(filePath, newContent, cwd) {
17
+ const resolved = path.resolve(cwd, filePath);
18
+ if (!fs.existsSync(resolved)) {
19
+ const lines = newContent.split('\n').length;
20
+ return `[NEW FILE] ${resolved} (${lines} lines)`;
21
+ }
22
+ const oldContent = fs.readFileSync(resolved, 'utf-8');
23
+ const oldLines = oldContent.split('\n');
24
+ const newLines = newContent.split('\n');
25
+ const changes = [];
26
+ const maxLines = Math.max(oldLines.length, newLines.length);
27
+ for (let i = 0; i < maxLines; i++) {
28
+ if (oldLines[i] !== newLines[i]) {
29
+ if (oldLines[i] !== undefined)
30
+ changes.push(`- ${oldLines[i]}`);
31
+ if (newLines[i] !== undefined)
32
+ changes.push(`+ ${newLines[i]}`);
33
+ }
34
+ }
35
+ if (changes.length === 0)
36
+ return '[NO CHANGES]';
37
+ if (changes.length > 40) {
38
+ return changes.slice(0, 40).join('\n') + `\n... (+${changes.length - 40} more lines)`;
39
+ }
40
+ return changes.join('\n');
41
+ }
42
+ export const writeFileDefinition = {
43
+ name: 'write_file',
44
+ description: 'Create or overwrite a file with the given content. Shows diff preview before writing.',
45
+ input_schema: {
46
+ type: 'object',
47
+ properties: {
48
+ path: { type: 'string', description: 'File path (relative to cwd or absolute)' },
49
+ content: { type: 'string', description: 'Content to write to the file' },
50
+ },
51
+ required: ['path', 'content'],
52
+ },
53
+ };
54
+ //# sourceMappingURL=writeFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeFile.js","sourceRoot":"","sources":["../../src/tools/writeFile.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ export declare const GREEN = "\u001B[32m";
2
+ export declare const GRAY = "\u001B[90m";
3
+ export declare const BOLD = "\u001B[1m";
4
+ export declare const DIM = "\u001B[2m";
5
+ export declare const RESET = "\u001B[0m";
6
+ export declare const CYAN = "\u001B[36m";
7
+ export declare const YELLOW = "\u001B[33m";
8
+ export declare const WHITE = "\u001B[37m";
9
+ export declare const RED = "\u001B[31m";
10
+ export declare const MAGENTA = "\u001B[35m";
11
+ export declare const BLUE = "\u001B[34m";
12
+ export declare const BG_YELLOW = "\u001B[43m";
13
+ export declare const BLACK = "\u001B[30m";
14
+ export declare const TOOL_COLORS: Record<string, string>;
15
+ /** Print tool execution header */
16
+ export declare function printToolUse(toolName: string, summary: string): void;
17
+ /** Print tool result */
18
+ export declare function printToolResult(content: string, truncate?: number): void;
19
+ /** Print error */
20
+ export declare function printError(message: string): void;
21
+ /** Print success */
22
+ export declare function printSuccess(message: string): void;
23
+ /** Ask for user confirmation (y/n) */
24
+ export declare function confirm(message: string): Promise<boolean>;
25
+ /** Simple spinner */
26
+ export declare function createSpinner(text: string): {
27
+ stop(finalText?: string): void;
28
+ };
29
+ /** Print streaming text character by character */
30
+ export declare function writeStream(text: string): void;