@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.
- package/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agents/skills/index.d.ts +37 -0
- package/dist/agents/skills/index.d.ts.map +1 -0
- package/dist/agents/skills/index.js +386 -0
- package/dist/agents/skills/index.js.map +1 -0
- package/dist/agents/system-prompt.d.ts +7 -0
- package/dist/agents/system-prompt.d.ts.map +1 -0
- package/dist/agents/system-prompt.js +106 -0
- package/dist/agents/system-prompt.js.map +1 -0
- package/dist/agents/tools.d.ts +3 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +3 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/helpers/ai-image/ai-image.d.ts +75 -0
- package/dist/helpers/ai-image/ai-image.d.ts.map +1 -0
- package/dist/helpers/ai-image/ai-image.js +438 -0
- package/dist/helpers/ai-image/ai-image.js.map +1 -0
- package/dist/helpers/ai-image/index.d.ts +3 -0
- package/dist/helpers/ai-image/index.d.ts.map +1 -0
- package/dist/helpers/ai-image/index.js +2 -0
- package/dist/helpers/ai-image/index.js.map +1 -0
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/bash.d.ts +55 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +246 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-diff.d.ts +63 -0
- package/dist/tools/edit-diff.d.ts.map +1 -0
- package/dist/tools/edit-diff.js +246 -0
- package/dist/tools/edit-diff.js.map +1 -0
- package/dist/tools/edit.d.ts +39 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +150 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/find.d.ts +39 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +206 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +45 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +244 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +73 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +66 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +40 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +121 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/path-utils.d.ts +8 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +81 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +39 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +177 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/truncate.d.ts +70 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +205 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/utils/config.d.ts +16 -0
- package/dist/tools/utils/config.d.ts.map +1 -0
- package/dist/tools/utils/config.js +40 -0
- package/dist/tools/utils/config.js.map +1 -0
- package/dist/tools/utils/image-resize.d.ts +36 -0
- package/dist/tools/utils/image-resize.d.ts.map +1 -0
- package/dist/tools/utils/image-resize.js +183 -0
- package/dist/tools/utils/image-resize.js.map +1 -0
- package/dist/tools/utils/mime.d.ts +3 -0
- package/dist/tools/utils/mime.d.ts.map +1 -0
- package/dist/tools/utils/mime.js +41 -0
- package/dist/tools/utils/mime.js.map +1 -0
- package/dist/tools/utils/photon.d.ts +21 -0
- package/dist/tools/utils/photon.d.ts.map +1 -0
- package/dist/tools/utils/photon.js +121 -0
- package/dist/tools/utils/photon.js.map +1 -0
- package/dist/tools/utils/shell.d.ts +26 -0
- package/dist/tools/utils/shell.d.ts.map +1 -0
- package/dist/tools/utils/shell.js +177 -0
- package/dist/tools/utils/shell.js.map +1 -0
- package/dist/tools/utils/tools-manager.d.ts +3 -0
- package/dist/tools/utils/tools-manager.d.ts.map +1 -0
- package/dist/tools/utils/tools-manager.js +209 -0
- package/dist/tools/utils/tools-manager.js.map +1 -0
- package/dist/tools/write.d.ts +29 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +83 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +73 -0
- package/skills/ai-images/SKILL.md +45 -0
- package/skills/ai-images/references/create.md +106 -0
- package/skills/ai-images/references/edit.md +107 -0
- 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 @@
|
|
|
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"}
|