@ank1015/llm-agents 0.0.2

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 (104) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +117 -0
  4. package/dist/agents/skills/index.d.ts +37 -0
  5. package/dist/agents/skills/index.d.ts.map +1 -0
  6. package/dist/agents/skills/index.js +386 -0
  7. package/dist/agents/skills/index.js.map +1 -0
  8. package/dist/agents/system-prompt.d.ts +7 -0
  9. package/dist/agents/system-prompt.d.ts.map +1 -0
  10. package/dist/agents/system-prompt.js +106 -0
  11. package/dist/agents/system-prompt.js.map +1 -0
  12. package/dist/agents/tools.d.ts +3 -0
  13. package/dist/agents/tools.d.ts.map +1 -0
  14. package/dist/agents/tools.js +3 -0
  15. package/dist/agents/tools.js.map +1 -0
  16. package/dist/helpers/ai-image/ai-image.d.ts +75 -0
  17. package/dist/helpers/ai-image/ai-image.d.ts.map +1 -0
  18. package/dist/helpers/ai-image/ai-image.js +438 -0
  19. package/dist/helpers/ai-image/ai-image.js.map +1 -0
  20. package/dist/helpers/ai-image/index.d.ts +3 -0
  21. package/dist/helpers/ai-image/index.d.ts.map +1 -0
  22. package/dist/helpers/ai-image/index.js +2 -0
  23. package/dist/helpers/ai-image/index.js.map +1 -0
  24. package/dist/helpers/index.d.ts +2 -0
  25. package/dist/helpers/index.d.ts.map +1 -0
  26. package/dist/helpers/index.js +2 -0
  27. package/dist/helpers/index.js.map +1 -0
  28. package/dist/index.d.ts +12 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +12 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/tools/bash.d.ts +55 -0
  33. package/dist/tools/bash.d.ts.map +1 -0
  34. package/dist/tools/bash.js +246 -0
  35. package/dist/tools/bash.js.map +1 -0
  36. package/dist/tools/edit-diff.d.ts +63 -0
  37. package/dist/tools/edit-diff.d.ts.map +1 -0
  38. package/dist/tools/edit-diff.js +246 -0
  39. package/dist/tools/edit-diff.js.map +1 -0
  40. package/dist/tools/edit.d.ts +39 -0
  41. package/dist/tools/edit.d.ts.map +1 -0
  42. package/dist/tools/edit.js +150 -0
  43. package/dist/tools/edit.js.map +1 -0
  44. package/dist/tools/find.d.ts +39 -0
  45. package/dist/tools/find.d.ts.map +1 -0
  46. package/dist/tools/find.js +206 -0
  47. package/dist/tools/find.js.map +1 -0
  48. package/dist/tools/grep.d.ts +45 -0
  49. package/dist/tools/grep.d.ts.map +1 -0
  50. package/dist/tools/grep.js +244 -0
  51. package/dist/tools/grep.js.map +1 -0
  52. package/dist/tools/index.d.ts +73 -0
  53. package/dist/tools/index.d.ts.map +1 -0
  54. package/dist/tools/index.js +66 -0
  55. package/dist/tools/index.js.map +1 -0
  56. package/dist/tools/ls.d.ts +40 -0
  57. package/dist/tools/ls.d.ts.map +1 -0
  58. package/dist/tools/ls.js +121 -0
  59. package/dist/tools/ls.js.map +1 -0
  60. package/dist/tools/path-utils.d.ts +8 -0
  61. package/dist/tools/path-utils.d.ts.map +1 -0
  62. package/dist/tools/path-utils.js +81 -0
  63. package/dist/tools/path-utils.js.map +1 -0
  64. package/dist/tools/read.d.ts +39 -0
  65. package/dist/tools/read.d.ts.map +1 -0
  66. package/dist/tools/read.js +177 -0
  67. package/dist/tools/read.js.map +1 -0
  68. package/dist/tools/truncate.d.ts +70 -0
  69. package/dist/tools/truncate.d.ts.map +1 -0
  70. package/dist/tools/truncate.js +205 -0
  71. package/dist/tools/truncate.js.map +1 -0
  72. package/dist/tools/utils/config.d.ts +16 -0
  73. package/dist/tools/utils/config.d.ts.map +1 -0
  74. package/dist/tools/utils/config.js +40 -0
  75. package/dist/tools/utils/config.js.map +1 -0
  76. package/dist/tools/utils/image-resize.d.ts +36 -0
  77. package/dist/tools/utils/image-resize.d.ts.map +1 -0
  78. package/dist/tools/utils/image-resize.js +183 -0
  79. package/dist/tools/utils/image-resize.js.map +1 -0
  80. package/dist/tools/utils/mime.d.ts +3 -0
  81. package/dist/tools/utils/mime.d.ts.map +1 -0
  82. package/dist/tools/utils/mime.js +41 -0
  83. package/dist/tools/utils/mime.js.map +1 -0
  84. package/dist/tools/utils/photon.d.ts +21 -0
  85. package/dist/tools/utils/photon.d.ts.map +1 -0
  86. package/dist/tools/utils/photon.js +121 -0
  87. package/dist/tools/utils/photon.js.map +1 -0
  88. package/dist/tools/utils/shell.d.ts +26 -0
  89. package/dist/tools/utils/shell.d.ts.map +1 -0
  90. package/dist/tools/utils/shell.js +177 -0
  91. package/dist/tools/utils/shell.js.map +1 -0
  92. package/dist/tools/utils/tools-manager.d.ts +3 -0
  93. package/dist/tools/utils/tools-manager.d.ts.map +1 -0
  94. package/dist/tools/utils/tools-manager.js +209 -0
  95. package/dist/tools/utils/tools-manager.js.map +1 -0
  96. package/dist/tools/write.d.ts +29 -0
  97. package/dist/tools/write.d.ts.map +1 -0
  98. package/dist/tools/write.js +83 -0
  99. package/dist/tools/write.js.map +1 -0
  100. package/package.json +73 -0
  101. package/skills/ai-images/SKILL.md +45 -0
  102. package/skills/ai-images/references/create.md +106 -0
  103. package/skills/ai-images/references/edit.md +107 -0
  104. package/skills/registry.json +10 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Photon image processing wrapper.
3
+ *
4
+ * This module provides a unified interface to @silvia-odwyer/photon-node that works in:
5
+ * 1. Node.js (development, npm run build)
6
+ * 2. Bun compiled binaries (standalone distribution)
7
+ *
8
+ * The challenge: photon-node's CJS entry uses fs.readFileSync(__dirname + '/photon_rs_bg.wasm')
9
+ * which bakes the build machine's absolute path into Bun compiled binaries.
10
+ *
11
+ * Solution:
12
+ * 1. Patch fs.readFileSync to redirect missing photon_rs_bg.wasm reads
13
+ * 2. Copy photon_rs_bg.wasm next to the executable in build:binary
14
+ */
15
+ export type { PhotonImage as PhotonImageType } from '@silvia-odwyer/photon-node';
16
+ /**
17
+ * Load the photon module asynchronously.
18
+ * Returns cached module on subsequent calls.
19
+ */
20
+ export declare function loadPhoton(): Promise<typeof import('@silvia-odwyer/photon-node') | null>;
21
+ //# sourceMappingURL=photon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/photon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAuFjF;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,4BAA4B,CAAC,GAAG,IAAI,CAAC,CAuB9F"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Photon image processing wrapper.
3
+ *
4
+ * This module provides a unified interface to @silvia-odwyer/photon-node that works in:
5
+ * 1. Node.js (development, npm run build)
6
+ * 2. Bun compiled binaries (standalone distribution)
7
+ *
8
+ * The challenge: photon-node's CJS entry uses fs.readFileSync(__dirname + '/photon_rs_bg.wasm')
9
+ * which bakes the build machine's absolute path into Bun compiled binaries.
10
+ *
11
+ * Solution:
12
+ * 1. Patch fs.readFileSync to redirect missing photon_rs_bg.wasm reads
13
+ * 2. Copy photon_rs_bg.wasm next to the executable in build:binary
14
+ */
15
+ import { createRequire } from 'module';
16
+ import * as path from 'path';
17
+ import { fileURLToPath } from 'url';
18
+ const require = createRequire(import.meta.url);
19
+ const fs = require('fs');
20
+ const WASM_FILENAME = 'photon_rs_bg.wasm';
21
+ // Lazy-loaded photon module
22
+ let photonModule = null;
23
+ let loadPromise = null;
24
+ function pathOrNull(file) {
25
+ if (typeof file === 'string') {
26
+ return file;
27
+ }
28
+ if (file instanceof URL) {
29
+ return fileURLToPath(file);
30
+ }
31
+ return null;
32
+ }
33
+ function getFallbackWasmPaths() {
34
+ const execDir = path.dirname(process.execPath);
35
+ return [
36
+ path.join(execDir, WASM_FILENAME),
37
+ path.join(execDir, 'photon', WASM_FILENAME),
38
+ path.join(process.cwd(), WASM_FILENAME),
39
+ ];
40
+ }
41
+ function patchPhotonWasmRead() {
42
+ const originalReadFileSync = fs.readFileSync.bind(fs);
43
+ const fallbackPaths = getFallbackWasmPaths();
44
+ const mutableFs = fs;
45
+ const patchedReadFileSync = ((...args) => {
46
+ const [file, options] = args;
47
+ const resolvedPath = pathOrNull(file);
48
+ if (resolvedPath?.endsWith(WASM_FILENAME)) {
49
+ try {
50
+ return originalReadFileSync(...args);
51
+ }
52
+ catch (error) {
53
+ const err = error;
54
+ if (err?.code && err.code !== 'ENOENT') {
55
+ throw error;
56
+ }
57
+ for (const fallbackPath of fallbackPaths) {
58
+ if (!fs.existsSync(fallbackPath)) {
59
+ continue;
60
+ }
61
+ if (options === undefined) {
62
+ return originalReadFileSync(fallbackPath);
63
+ }
64
+ return originalReadFileSync(fallbackPath, options);
65
+ }
66
+ throw error;
67
+ }
68
+ }
69
+ return originalReadFileSync(...args);
70
+ });
71
+ try {
72
+ mutableFs.readFileSync = patchedReadFileSync;
73
+ }
74
+ catch {
75
+ Object.defineProperty(fs, 'readFileSync', {
76
+ value: patchedReadFileSync,
77
+ writable: true,
78
+ configurable: true,
79
+ });
80
+ }
81
+ return () => {
82
+ try {
83
+ mutableFs.readFileSync = originalReadFileSync;
84
+ }
85
+ catch {
86
+ Object.defineProperty(fs, 'readFileSync', {
87
+ value: originalReadFileSync,
88
+ writable: true,
89
+ configurable: true,
90
+ });
91
+ }
92
+ };
93
+ }
94
+ /**
95
+ * Load the photon module asynchronously.
96
+ * Returns cached module on subsequent calls.
97
+ */
98
+ export async function loadPhoton() {
99
+ if (photonModule) {
100
+ return photonModule;
101
+ }
102
+ if (loadPromise) {
103
+ return loadPromise;
104
+ }
105
+ loadPromise = (async () => {
106
+ const restoreReadFileSync = patchPhotonWasmRead();
107
+ try {
108
+ photonModule = await import('@silvia-odwyer/photon-node');
109
+ return photonModule;
110
+ }
111
+ catch {
112
+ photonModule = null;
113
+ return photonModule;
114
+ }
115
+ finally {
116
+ restoreReadFileSync();
117
+ }
118
+ })();
119
+ return loadPromise;
120
+ }
121
+ //# sourceMappingURL=photon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon.js","sourceRoot":"","sources":["../../../src/tools/utils/photon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Get shell configuration based on platform.
3
+ * Resolution order:
4
+ * 1. User-specified shellPath in settings.json
5
+ * 2. On Windows: Git Bash in known locations, then bash on PATH
6
+ * 3. On Unix: /bin/bash, then bash on PATH, then fallback to sh
7
+ */
8
+ export declare function getShellConfig(): {
9
+ shell: string;
10
+ args: string[];
11
+ };
12
+ export declare function getShellEnv(): NodeJS.ProcessEnv;
13
+ /**
14
+ * Sanitize binary output for display/storage.
15
+ * Removes characters that crash string-width or cause display issues:
16
+ * - Control characters (except tab, newline, carriage return)
17
+ * - Lone surrogates
18
+ * - Unicode Format characters (crash string-width due to a bug)
19
+ * - Characters with undefined code points
20
+ */
21
+ export declare function sanitizeBinaryOutput(str: string): string;
22
+ /**
23
+ * Kill a process and all its children (cross-platform)
24
+ */
25
+ export declare function killProcessTree(pid: number): void;
26
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"AA2CA;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAsDlE;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,UAAU,CAc/C;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8BxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAwBjD"}
@@ -0,0 +1,177 @@
1
+ import { spawn, spawnSync } from 'child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { delimiter } from 'node:path';
4
+ import { getBinDir, getSettingsPath } from './config.js';
5
+ let cachedShellConfig = null;
6
+ /**
7
+ * Find bash executable on PATH (cross-platform)
8
+ */
9
+ function findBashOnPath() {
10
+ if (process.platform === 'win32') {
11
+ // Windows: Use 'where' and verify file exists (where can return non-existent paths)
12
+ try {
13
+ const result = spawnSync('where', ['bash.exe'], { encoding: 'utf-8', timeout: 5000 });
14
+ if (result.status === 0 && result.stdout) {
15
+ const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
16
+ if (firstMatch && existsSync(firstMatch)) {
17
+ return firstMatch;
18
+ }
19
+ }
20
+ }
21
+ catch {
22
+ // Ignore errors
23
+ }
24
+ return null;
25
+ }
26
+ // Unix: Use 'which' and trust its output (handles Termux and special filesystems)
27
+ try {
28
+ const result = spawnSync('which', ['bash'], { encoding: 'utf-8', timeout: 5000 });
29
+ if (result.status === 0 && result.stdout) {
30
+ const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
31
+ if (firstMatch) {
32
+ return firstMatch;
33
+ }
34
+ }
35
+ }
36
+ catch {
37
+ // Ignore errors
38
+ }
39
+ return null;
40
+ }
41
+ /**
42
+ * Get shell configuration based on platform.
43
+ * Resolution order:
44
+ * 1. User-specified shellPath in settings.json
45
+ * 2. On Windows: Git Bash in known locations, then bash on PATH
46
+ * 3. On Unix: /bin/bash, then bash on PATH, then fallback to sh
47
+ */
48
+ export function getShellConfig() {
49
+ if (cachedShellConfig) {
50
+ return cachedShellConfig;
51
+ }
52
+ if (process.platform === 'win32') {
53
+ // 2. Try Git Bash in known locations
54
+ const paths = [];
55
+ const programFiles = process.env.ProgramFiles;
56
+ if (programFiles) {
57
+ paths.push(`${programFiles}\\Git\\bin\\bash.exe`);
58
+ }
59
+ const programFilesX86 = process.env['ProgramFiles(x86)'];
60
+ if (programFilesX86) {
61
+ paths.push(`${programFilesX86}\\Git\\bin\\bash.exe`);
62
+ }
63
+ for (const path of paths) {
64
+ if (existsSync(path)) {
65
+ cachedShellConfig = { shell: path, args: ['-c'] };
66
+ return cachedShellConfig;
67
+ }
68
+ }
69
+ // 3. Fallback: search bash.exe on PATH (Cygwin, MSYS2, WSL, etc.)
70
+ const bashOnPath = findBashOnPath();
71
+ if (bashOnPath) {
72
+ cachedShellConfig = { shell: bashOnPath, args: ['-c'] };
73
+ return cachedShellConfig;
74
+ }
75
+ throw new Error(`No bash shell found. Options:\n` +
76
+ ` 1. Install Git for Windows: https://git-scm.com/download/win\n` +
77
+ ` 2. Add your bash to PATH (Cygwin, MSYS2, etc.)\n` +
78
+ ` 3. Set shellPath in ${getSettingsPath()}\n\n` +
79
+ `Searched Git Bash in:\n${paths.map((p) => ` ${p}`).join('\n')}`);
80
+ }
81
+ // Unix: try /bin/bash, then bash on PATH, then fallback to sh
82
+ if (existsSync('/bin/bash')) {
83
+ cachedShellConfig = { shell: '/bin/bash', args: ['-c'] };
84
+ return cachedShellConfig;
85
+ }
86
+ const bashOnPath = findBashOnPath();
87
+ if (bashOnPath) {
88
+ cachedShellConfig = { shell: bashOnPath, args: ['-c'] };
89
+ return cachedShellConfig;
90
+ }
91
+ cachedShellConfig = { shell: 'sh', args: ['-c'] };
92
+ return cachedShellConfig;
93
+ }
94
+ export function getShellEnv() {
95
+ const binDir = getBinDir();
96
+ const pathKey = Object.keys(process.env).find((key) => key.toLowerCase() === 'path') ?? 'PATH';
97
+ const currentPath = process.env[pathKey] ?? '';
98
+ const pathEntries = currentPath.split(delimiter).filter(Boolean);
99
+ const hasBinDir = pathEntries.includes(binDir);
100
+ const updatedPath = hasBinDir
101
+ ? currentPath
102
+ : [binDir, currentPath].filter(Boolean).join(delimiter);
103
+ return {
104
+ ...process.env,
105
+ [pathKey]: updatedPath,
106
+ };
107
+ }
108
+ /**
109
+ * Sanitize binary output for display/storage.
110
+ * Removes characters that crash string-width or cause display issues:
111
+ * - Control characters (except tab, newline, carriage return)
112
+ * - Lone surrogates
113
+ * - Unicode Format characters (crash string-width due to a bug)
114
+ * - Characters with undefined code points
115
+ */
116
+ export function sanitizeBinaryOutput(str) {
117
+ // Use Array.from to properly iterate over code points (not code units)
118
+ // This handles surrogate pairs correctly and catches edge cases where
119
+ // codePointAt() might return undefined
120
+ return Array.from(str)
121
+ .filter((char) => {
122
+ // Filter out characters that cause string-width to crash
123
+ // This includes:
124
+ // - Unicode format characters
125
+ // - Lone surrogates (already filtered by Array.from)
126
+ // - Control chars except \t \n \r
127
+ // - Characters with undefined code points
128
+ const code = char.codePointAt(0);
129
+ // Skip if code point is undefined (edge case with invalid strings)
130
+ if (code === undefined)
131
+ return false;
132
+ // Allow tab, newline, carriage return
133
+ if (code === 0x09 || code === 0x0a || code === 0x0d)
134
+ return true;
135
+ // Filter out control characters (0x00-0x1F, except 0x09, 0x0a, 0x0x0d)
136
+ if (code <= 0x1f)
137
+ return false;
138
+ // Filter out Unicode format characters
139
+ if (code >= 0xfff9 && code <= 0xfffb)
140
+ return false;
141
+ return true;
142
+ })
143
+ .join('');
144
+ }
145
+ /**
146
+ * Kill a process and all its children (cross-platform)
147
+ */
148
+ export function killProcessTree(pid) {
149
+ if (process.platform === 'win32') {
150
+ // Use taskkill on Windows to kill process tree
151
+ try {
152
+ spawn('taskkill', ['/F', '/T', '/PID', String(pid)], {
153
+ stdio: 'ignore',
154
+ detached: true,
155
+ });
156
+ }
157
+ catch {
158
+ // Ignore errors if taskkill fails
159
+ }
160
+ }
161
+ else {
162
+ // Use SIGKILL on Unix/Linux/Mac
163
+ try {
164
+ process.kill(-pid, 'SIGKILL');
165
+ }
166
+ catch {
167
+ // Fallback to killing just the child if process group kill fails
168
+ try {
169
+ process.kill(pid, 'SIGKILL');
170
+ }
171
+ catch {
172
+ // Process already dead
173
+ }
174
+ }
175
+ }
176
+ }
177
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getToolPath(tool: 'fd' | 'rg'): string | null;
2
+ export declare function ensureTool(tool: 'fd' | 'rg', silent?: boolean): Promise<string | undefined>;
3
+ //# sourceMappingURL=tools-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-manager.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/tools-manager.ts"],"names":[],"mappings":"AA4EA,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAgB5D;AAiHD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsC7B"}
@@ -0,0 +1,209 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { chmodSync, createWriteStream, existsSync, mkdirSync, renameSync, rmSync } from 'fs';
3
+ import { arch, platform } from 'os';
4
+ import { join } from 'path';
5
+ import { Readable } from 'stream';
6
+ import { finished } from 'stream/promises';
7
+ import chalk from 'chalk';
8
+ import { APP_NAME, getBinDir } from './config.js';
9
+ const TOOLS_DIR = getBinDir();
10
+ const TOOLS = {
11
+ fd: {
12
+ name: 'fd',
13
+ repo: 'sharkdp/fd',
14
+ binaryName: 'fd',
15
+ tagPrefix: 'v',
16
+ getAssetName: (version, plat, architecture) => {
17
+ if (plat === 'darwin') {
18
+ const archStr = architecture === 'arm64' ? 'aarch64' : 'x86_64';
19
+ return `fd-v${version}-${archStr}-apple-darwin.tar.gz`;
20
+ }
21
+ else if (plat === 'linux') {
22
+ const archStr = architecture === 'arm64' ? 'aarch64' : 'x86_64';
23
+ return `fd-v${version}-${archStr}-unknown-linux-gnu.tar.gz`;
24
+ }
25
+ else if (plat === 'win32') {
26
+ const archStr = architecture === 'arm64' ? 'aarch64' : 'x86_64';
27
+ return `fd-v${version}-${archStr}-pc-windows-msvc.zip`;
28
+ }
29
+ return null;
30
+ },
31
+ },
32
+ rg: {
33
+ name: 'ripgrep',
34
+ repo: 'BurntSushi/ripgrep',
35
+ binaryName: 'rg',
36
+ tagPrefix: '',
37
+ getAssetName: (version, plat, architecture) => {
38
+ if (plat === 'darwin') {
39
+ const archStr = architecture === 'arm64' ? 'aarch64' : 'x86_64';
40
+ return `ripgrep-${version}-${archStr}-apple-darwin.tar.gz`;
41
+ }
42
+ else if (plat === 'linux') {
43
+ if (architecture === 'arm64') {
44
+ return `ripgrep-${version}-aarch64-unknown-linux-gnu.tar.gz`;
45
+ }
46
+ return `ripgrep-${version}-x86_64-unknown-linux-musl.tar.gz`;
47
+ }
48
+ else if (plat === 'win32') {
49
+ const archStr = architecture === 'arm64' ? 'aarch64' : 'x86_64';
50
+ return `ripgrep-${version}-${archStr}-pc-windows-msvc.zip`;
51
+ }
52
+ return null;
53
+ },
54
+ },
55
+ };
56
+ // Check if a command exists in PATH by trying to run it
57
+ function commandExists(cmd) {
58
+ try {
59
+ const result = spawnSync(cmd, ['--version'], { stdio: 'pipe' });
60
+ // Check for ENOENT error (command not found)
61
+ return result.error === undefined || result.error === null;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ // Get the path to a tool (system-wide or in our tools dir)
68
+ export function getToolPath(tool) {
69
+ const config = TOOLS[tool];
70
+ if (!config)
71
+ return null;
72
+ // Check our tools directory first
73
+ const localPath = join(TOOLS_DIR, config.binaryName + (platform() === 'win32' ? '.exe' : ''));
74
+ if (existsSync(localPath)) {
75
+ return localPath;
76
+ }
77
+ // Check system PATH - if found, just return the command name (it's in PATH)
78
+ if (commandExists(config.binaryName)) {
79
+ return config.binaryName;
80
+ }
81
+ return null;
82
+ }
83
+ // Fetch latest release version from GitHub
84
+ async function getLatestVersion(repo) {
85
+ const response = await fetch(`https://api.github.com/repos/${repo}/releases/latest`, {
86
+ headers: { 'User-Agent': `${APP_NAME}-coding-agent` },
87
+ });
88
+ if (!response.ok) {
89
+ throw new Error(`GitHub API error: ${response.status}`);
90
+ }
91
+ const data = (await response.json());
92
+ return data.tag_name.replace(/^v/, '');
93
+ }
94
+ // Download a file from URL
95
+ async function downloadFile(url, dest) {
96
+ const response = await fetch(url);
97
+ if (!response.ok) {
98
+ throw new Error(`Failed to download: ${response.status}`);
99
+ }
100
+ if (!response.body) {
101
+ throw new Error('No response body');
102
+ }
103
+ const fileStream = createWriteStream(dest);
104
+ await finished(Readable.fromWeb(response.body).pipe(fileStream));
105
+ }
106
+ // Download and install a tool
107
+ async function downloadTool(tool) {
108
+ const config = TOOLS[tool];
109
+ if (!config)
110
+ throw new Error(`Unknown tool: ${tool}`);
111
+ const plat = platform();
112
+ const architecture = arch();
113
+ // Get latest version
114
+ const version = await getLatestVersion(config.repo);
115
+ // Get asset name for this platform
116
+ const assetName = config.getAssetName(version, plat, architecture);
117
+ if (!assetName) {
118
+ throw new Error(`Unsupported platform: ${plat}/${architecture}`);
119
+ }
120
+ // Create tools directory
121
+ mkdirSync(TOOLS_DIR, { recursive: true });
122
+ const downloadUrl = `https://github.com/${config.repo}/releases/download/${config.tagPrefix}${version}/${assetName}`;
123
+ const archivePath = join(TOOLS_DIR, assetName);
124
+ const binaryExt = plat === 'win32' ? '.exe' : '';
125
+ const binaryPath = join(TOOLS_DIR, config.binaryName + binaryExt);
126
+ // Download
127
+ await downloadFile(downloadUrl, archivePath);
128
+ // Extract
129
+ const extractDir = join(TOOLS_DIR, 'extract_tmp');
130
+ mkdirSync(extractDir, { recursive: true });
131
+ try {
132
+ // Use tar for both .tar.gz and .zip extraction. Windows 10+ ships bsdtar
133
+ // which handles both formats, avoiding the need for `unzip` (not available
134
+ // on Windows by default).
135
+ const extractResult = assetName.endsWith('.tar.gz')
136
+ ? spawnSync('tar', ['xzf', archivePath, '-C', extractDir], { stdio: 'pipe' })
137
+ : assetName.endsWith('.zip')
138
+ ? spawnSync('tar', ['xf', archivePath, '-C', extractDir], { stdio: 'pipe' })
139
+ : null;
140
+ if (!extractResult || extractResult.error || extractResult.status !== 0) {
141
+ const errMsg = extractResult?.error?.message ??
142
+ extractResult?.stderr?.toString().trim() ??
143
+ 'unknown error';
144
+ throw new Error(`Failed to extract ${assetName}: ${errMsg}`);
145
+ }
146
+ // Find the binary in extracted files
147
+ const extractedDir = join(extractDir, assetName.replace(/\.(tar\.gz|zip)$/, ''));
148
+ const extractedBinary = join(extractedDir, config.binaryName + binaryExt);
149
+ if (existsSync(extractedBinary)) {
150
+ renameSync(extractedBinary, binaryPath);
151
+ }
152
+ else {
153
+ throw new Error(`Binary not found in archive: ${extractedBinary}`);
154
+ }
155
+ // Make executable (Unix only)
156
+ if (plat !== 'win32') {
157
+ chmodSync(binaryPath, 0o755);
158
+ }
159
+ }
160
+ finally {
161
+ // Cleanup
162
+ rmSync(archivePath, { force: true });
163
+ rmSync(extractDir, { recursive: true, force: true });
164
+ }
165
+ return binaryPath;
166
+ }
167
+ // Termux package names for tools
168
+ const TERMUX_PACKAGES = {
169
+ fd: 'fd',
170
+ rg: 'ripgrep',
171
+ };
172
+ // Ensure a tool is available, downloading if necessary
173
+ // Returns the path to the tool, or null if unavailable
174
+ export async function ensureTool(tool, silent = false) {
175
+ const existingPath = getToolPath(tool);
176
+ if (existingPath) {
177
+ return existingPath;
178
+ }
179
+ const config = TOOLS[tool];
180
+ if (!config)
181
+ return undefined;
182
+ // On Android/Termux, Linux binaries don't work due to Bionic libc incompatibility.
183
+ // Users must install via pkg.
184
+ if (platform() === 'android') {
185
+ const pkgName = TERMUX_PACKAGES[tool] ?? tool;
186
+ if (!silent) {
187
+ console.log(chalk.yellow(`${config.name} not found. Install with: pkg install ${pkgName}`));
188
+ }
189
+ return undefined;
190
+ }
191
+ // Tool not found - download it
192
+ if (!silent) {
193
+ console.log(chalk.dim(`${config.name} not found. Downloading...`));
194
+ }
195
+ try {
196
+ const path = await downloadTool(tool);
197
+ if (!silent) {
198
+ console.log(chalk.dim(`${config.name} installed to ${path}`));
199
+ }
200
+ return path;
201
+ }
202
+ catch (e) {
203
+ if (!silent) {
204
+ console.log(chalk.yellow(`Failed to download ${config.name}: ${e instanceof Error ? e.message : e}`));
205
+ }
206
+ return undefined;
207
+ }
208
+ }
209
+ //# sourceMappingURL=tools-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-manager.js","sourceRoot":"","sources":["../../../src/tools/utils/tools-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type Static } from '@sinclair/typebox';
2
+ import type { AgentTool } from '@ank1015/llm-sdk';
3
+ declare const writeSchema: import("@sinclair/typebox").TObject<{
4
+ path: import("@sinclair/typebox").TString;
5
+ content: import("@sinclair/typebox").TString;
6
+ }>;
7
+ export type WriteToolInput = Static<typeof writeSchema>;
8
+ /**
9
+ * Pluggable operations for the write tool.
10
+ * Override these to delegate file writing to remote systems (e.g., SSH).
11
+ */
12
+ export interface WriteOperations {
13
+ /** Write content to a file */
14
+ writeFile: (absolutePath: string, content: string) => Promise<void>;
15
+ /** Create directory (recursively) */
16
+ mkdir: (dir: string) => Promise<void>;
17
+ }
18
+ export interface WriteToolOptions {
19
+ /** Custom operations for file writing. Default: local filesystem */
20
+ operations?: WriteOperations;
21
+ }
22
+ export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema>;
23
+ /** Default write tool using process.cwd() - for backwards compatibility */
24
+ export declare const writeTool: AgentTool<import("@sinclair/typebox").TObject<{
25
+ path: import("@sinclair/typebox").TString;
26
+ content: import("@sinclair/typebox").TString;
27
+ }>, unknown>;
28
+ export {};
29
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAItD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,qCAAqC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAOD,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACzB,SAAS,CAAC,OAAO,WAAW,CAAC,CAqF/B;AAED,2EAA2E;AAC3E,eAAO,MAAM,SAAS;;;YAAiC,CAAC"}