bash-tool 1.3.1 → 1.3.4
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/dist/files/loader.d.ts +12 -3
- package/dist/files/loader.d.ts.map +1 -1
- package/dist/files/loader.js +44 -14
- package/dist/files/loader.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/sandbox/just-bash.d.ts +12 -1
- package/dist/sandbox/just-bash.d.ts.map +1 -1
- package/dist/sandbox/just-bash.js +32 -6
- package/dist/sandbox/just-bash.js.map +1 -1
- package/dist/sandbox/vercel.d.ts.map +1 -1
- package/dist/sandbox/vercel.js +4 -1
- package/dist/sandbox/vercel.js.map +1 -1
- package/dist/tool.d.ts.map +1 -1
- package/dist/tool.js +90 -25
- package/dist/tool.js.map +1 -1
- package/dist/tools/bash.d.ts +8 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +19 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/files/loader.d.ts
CHANGED
|
@@ -5,10 +5,19 @@ export interface LoadFilesOptions {
|
|
|
5
5
|
include?: string;
|
|
6
6
|
};
|
|
7
7
|
}
|
|
8
|
+
export interface FileEntry {
|
|
9
|
+
path: string;
|
|
10
|
+
content: Buffer;
|
|
11
|
+
}
|
|
8
12
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
13
|
+
* Stream files from inline definitions and/or a directory on disk.
|
|
14
|
+
* Yields files one at a time to avoid loading everything into memory.
|
|
11
15
|
* If both are provided, inline files take precedence (override directory files).
|
|
12
16
|
*/
|
|
13
|
-
export declare function
|
|
17
|
+
export declare function streamFiles(options: LoadFilesOptions): AsyncGenerator<FileEntry>;
|
|
18
|
+
/**
|
|
19
|
+
* Get file paths from options without loading content.
|
|
20
|
+
* Useful for tool prompts and OverlayFs.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getFilePaths(options: LoadFilesOptions): Promise<string[]>;
|
|
14
23
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/files/loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,CAAC,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/files/loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,CAAC,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAuB,WAAW,CAChC,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAAC,SAAS,CAAC,CAgC3B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB"}
|
package/dist/files/loader.js
CHANGED
|
@@ -2,34 +2,64 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import fg from "fast-glob";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Stream files from inline definitions and/or a directory on disk.
|
|
6
|
+
* Yields files one at a time to avoid loading everything into memory.
|
|
7
7
|
* If both are provided, inline files take precedence (override directory files).
|
|
8
8
|
*/
|
|
9
|
-
export async function
|
|
10
|
-
const
|
|
11
|
-
//
|
|
9
|
+
export async function* streamFiles(options) {
|
|
10
|
+
const yieldedPaths = new Set();
|
|
11
|
+
// Yield inline files first (they take precedence)
|
|
12
|
+
if (options.files) {
|
|
13
|
+
for (const [relativePath, content] of Object.entries(options.files)) {
|
|
14
|
+
yieldedPaths.add(relativePath);
|
|
15
|
+
yield { path: relativePath, content: Buffer.from(content) };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Stream from directory (skip files already yielded from inline)
|
|
12
19
|
if (options.uploadDirectory) {
|
|
13
20
|
const { source, include = "**/*" } = options.uploadDirectory;
|
|
14
21
|
const absoluteSource = path.resolve(source);
|
|
15
|
-
const
|
|
22
|
+
const foundPaths = await fg(include, {
|
|
16
23
|
cwd: absoluteSource,
|
|
17
24
|
dot: true,
|
|
18
25
|
onlyFiles: true,
|
|
19
26
|
ignore: ["**/node_modules/**", "**/.git/**"],
|
|
20
27
|
});
|
|
21
|
-
|
|
28
|
+
for (const relativePath of foundPaths) {
|
|
29
|
+
if (yieldedPaths.has(relativePath)) {
|
|
30
|
+
continue; // Skip - inline file takes precedence
|
|
31
|
+
}
|
|
22
32
|
const absolutePath = path.join(absoluteSource, relativePath);
|
|
23
|
-
const content = await fs.readFile(absolutePath
|
|
24
|
-
|
|
25
|
-
}
|
|
33
|
+
const content = await fs.readFile(absolutePath);
|
|
34
|
+
yield { path: relativePath, content };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get file paths from options without loading content.
|
|
40
|
+
* Useful for tool prompts and OverlayFs.
|
|
41
|
+
*/
|
|
42
|
+
export async function getFilePaths(options) {
|
|
43
|
+
const paths = [];
|
|
44
|
+
if (options.uploadDirectory) {
|
|
45
|
+
const { source, include = "**/*" } = options.uploadDirectory;
|
|
46
|
+
const absoluteSource = path.resolve(source);
|
|
47
|
+
const foundPaths = await fg(include, {
|
|
48
|
+
cwd: absoluteSource,
|
|
49
|
+
dot: true,
|
|
50
|
+
onlyFiles: true,
|
|
51
|
+
ignore: ["**/node_modules/**", "**/.git/**"],
|
|
52
|
+
});
|
|
53
|
+
paths.push(...foundPaths);
|
|
26
54
|
}
|
|
27
|
-
//
|
|
55
|
+
// Add inline file paths (may override some from directory)
|
|
28
56
|
if (options.files) {
|
|
29
|
-
for (const
|
|
30
|
-
|
|
57
|
+
for (const relativePath of Object.keys(options.files)) {
|
|
58
|
+
if (!paths.includes(relativePath)) {
|
|
59
|
+
paths.push(relativePath);
|
|
60
|
+
}
|
|
31
61
|
}
|
|
32
62
|
}
|
|
33
|
-
return
|
|
63
|
+
return paths;
|
|
34
64
|
}
|
|
35
65
|
//# sourceMappingURL=loader.js.map
|
package/dist/files/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/files/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/files/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;AAe3B;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAChC,OAAyB;IAEzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,kDAAkD;IAClD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC/B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;QAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;YACnC,GAAG,EAAE,cAAc;YACnB,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;SAC7C,CAAC,CAAC;QAEH,KAAK,MAAM,YAAY,IAAI,UAAU,EAAE,CAAC;YACtC,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,SAAS,CAAC,sCAAsC;YAClD,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;QAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;YACnC,GAAG,EAAE,cAAc;YACnB,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;SAC7C,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,2DAA2D;IAC3D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { JustBashLike } from "./sandbox/just-bash.js";
|
|
2
2
|
export { createBashTool } from "./tool.js";
|
|
3
|
+
export { DEFAULT_MAX_OUTPUT_LENGTH } from "./tools/bash.js";
|
|
3
4
|
export type { BashToolCategory, BashToolInfo, FileFormat, ToolPromptOptions, } from "./tools-prompt.js";
|
|
4
5
|
export { bashTools, createToolPrompt, detectFormat, discoverAvailableTools, getToolsByCategory, getToolsForFormat, toolsByFormat, } from "./tools-prompt.js";
|
|
5
6
|
export type { BashToolkit, CommandResult, CreateBashToolOptions, PromptOptions, Sandbox, VercelSandboxInstance, } from "./types.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,OAAO,EACP,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,OAAO,EACP,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { createBashTool } from "./tool.js";
|
|
2
|
+
export { DEFAULT_MAX_OUTPUT_LENGTH } from "./tools/bash.js";
|
|
2
3
|
export { bashTools, createToolPrompt, detectFormat, discoverAvailableTools, getToolsByCategory, getToolsForFormat, toolsByFormat, } from "./tools-prompt.js";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAO5D,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|
|
@@ -22,12 +22,23 @@ export interface JustBashSandboxOptions {
|
|
|
22
22
|
files?: Record<string, string>;
|
|
23
23
|
/** Working directory */
|
|
24
24
|
cwd?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Use OverlayFs with this directory as root.
|
|
27
|
+
* Reads come from disk, writes stay in memory.
|
|
28
|
+
* When provided, `files` is ignored.
|
|
29
|
+
*/
|
|
30
|
+
overlayRoot?: string;
|
|
25
31
|
}
|
|
26
32
|
/**
|
|
27
33
|
* Creates a Sandbox implementation using just-bash (virtual bash environment).
|
|
28
34
|
* Dynamically imports just-bash to keep it as an optional peer dependency.
|
|
35
|
+
*
|
|
36
|
+
* When `overlayRoot` is provided, uses OverlayFs for copy-on-write over a real directory.
|
|
37
|
+
* This avoids loading all files into memory - reads come from disk, writes stay in memory.
|
|
29
38
|
*/
|
|
30
|
-
export declare function createJustBashSandbox(options?: JustBashSandboxOptions): Promise<Sandbox
|
|
39
|
+
export declare function createJustBashSandbox(options?: JustBashSandboxOptions): Promise<Sandbox & {
|
|
40
|
+
mountPoint?: string;
|
|
41
|
+
}>;
|
|
31
42
|
/**
|
|
32
43
|
* Check if an object is a just-bash Bash instance using duck-typing.
|
|
33
44
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"just-bash.d.ts","sourceRoot":"","sources":["../../src/sandbox/just-bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,EAAE,EAAE;QACF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"just-bash.d.ts","sourceRoot":"","sources":["../../src/sandbox/just-bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,EAAE,EAAE;QACF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY,CAK5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CA2BhE"}
|
|
@@ -1,22 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Creates a Sandbox implementation using just-bash (virtual bash environment).
|
|
3
3
|
* Dynamically imports just-bash to keep it as an optional peer dependency.
|
|
4
|
+
*
|
|
5
|
+
* When `overlayRoot` is provided, uses OverlayFs for copy-on-write over a real directory.
|
|
6
|
+
* This avoids loading all files into memory - reads come from disk, writes stay in memory.
|
|
4
7
|
*/
|
|
5
8
|
export async function createJustBashSandbox(options = {}) {
|
|
6
9
|
// Dynamic import to handle optional peer dependency
|
|
7
10
|
let Bash;
|
|
11
|
+
let OverlayFs;
|
|
8
12
|
try {
|
|
9
13
|
const module = await import("just-bash");
|
|
10
14
|
Bash = module.Bash;
|
|
15
|
+
OverlayFs = module.OverlayFs;
|
|
11
16
|
}
|
|
12
17
|
catch {
|
|
13
18
|
throw new Error('just-bash is not installed. Either install it with "npm install just-bash" or provide your own sandbox via the sandbox option.');
|
|
14
19
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
let bashEnv;
|
|
21
|
+
let mountPoint;
|
|
22
|
+
if (options.overlayRoot && OverlayFs) {
|
|
23
|
+
// Use OverlayFs for copy-on-write over a real directory
|
|
24
|
+
const overlay = new OverlayFs({ root: options.overlayRoot });
|
|
25
|
+
mountPoint = overlay.getMountPoint();
|
|
26
|
+
bashEnv = new Bash({
|
|
27
|
+
fs: overlay,
|
|
28
|
+
cwd: options.cwd ?? mountPoint,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Use in-memory filesystem with provided files
|
|
33
|
+
bashEnv = new Bash({
|
|
34
|
+
files: options.files,
|
|
35
|
+
cwd: options.cwd,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
19
38
|
return {
|
|
39
|
+
mountPoint,
|
|
20
40
|
async executeCommand(command) {
|
|
21
41
|
const result = await bashEnv.exec(command);
|
|
22
42
|
return {
|
|
@@ -30,7 +50,10 @@ export async function createJustBashSandbox(options = {}) {
|
|
|
30
50
|
},
|
|
31
51
|
async writeFiles(files) {
|
|
32
52
|
for (const file of files) {
|
|
33
|
-
|
|
53
|
+
const content = typeof file.content === "string"
|
|
54
|
+
? file.content
|
|
55
|
+
: file.content.toString("utf-8");
|
|
56
|
+
await bashEnv.fs.writeFile(file.path, content);
|
|
34
57
|
}
|
|
35
58
|
},
|
|
36
59
|
};
|
|
@@ -63,7 +86,10 @@ export function wrapJustBash(bashInstance) {
|
|
|
63
86
|
},
|
|
64
87
|
async writeFiles(files) {
|
|
65
88
|
for (const file of files) {
|
|
66
|
-
|
|
89
|
+
const content = typeof file.content === "string"
|
|
90
|
+
? file.content
|
|
91
|
+
: file.content.toString("utf-8");
|
|
92
|
+
await bashInstance.fs.writeFile(file.path, content);
|
|
67
93
|
}
|
|
68
94
|
},
|
|
69
95
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"just-bash.js","sourceRoot":"","sources":["../../src/sandbox/just-bash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"just-bash.js","sourceRoot":"","sources":["../../src/sandbox/just-bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../src/sandbox/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,KACZ,OAAO,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KAC9D,CAAC,CAAC;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAUtE;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../src/sandbox/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,KACZ,OAAO,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KAC9D,CAAC,CAAC;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAUtE;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAqC3E"}
|
package/dist/sandbox/vercel.js
CHANGED
|
@@ -46,9 +46,12 @@ export function wrapVercelSandbox(vercelSandbox) {
|
|
|
46
46
|
return streamToString(stream);
|
|
47
47
|
},
|
|
48
48
|
async writeFiles(files) {
|
|
49
|
+
// Convert all content to Buffer (binary) and write
|
|
49
50
|
await vercelSandbox.writeFiles(files.map((f) => ({
|
|
50
51
|
path: f.path,
|
|
51
|
-
content: Buffer.
|
|
52
|
+
content: Buffer.isBuffer(f.content)
|
|
53
|
+
? f.content
|
|
54
|
+
: Buffer.from(f.content),
|
|
52
55
|
})));
|
|
53
56
|
},
|
|
54
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/sandbox/vercel.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,GAA8B,CAAC;IACjD,oEAAoE;IACpE,OAAO,CACL,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU;QAC1C,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU;QACxC,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,MAA6B;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAgC;IAChE,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,OAAe;YAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,MAAM,CAAC,MAAM,EAAE;gBACf,MAAM,CAAC,MAAM,EAAE;aAChB,CAAC,CAAC;YACH,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;YAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,UAAU,CACd,
|
|
1
|
+
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/sandbox/vercel.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,GAA8B,CAAC;IACjD,oEAAoE;IACpE,OAAO,CACL,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU;QAC1C,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU;QACxC,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,MAA6B;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAgC;IAChE,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,OAAe;YAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,MAAM,CAAC,MAAM,EAAE;gBACf,MAAM,CAAC,MAAM,EAAE;aAChB,CAAC,CAAC;YACH,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;YAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,UAAU,CACd,KAAwD;YAExD,mDAAmD;YACnD,MAAM,aAAa,CAAC,UAAU,CAC5B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;oBACjC,CAAC,CAAC,CAAC,CAAC,OAAO;oBACX,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;aAC3B,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAW,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAW,MAAM,YAAY,CAAC;AAO9E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,cAAc,CAClC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,WAAW,CAAC,CAkKtB"}
|
package/dist/tool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { getFilePaths, streamFiles } from "./files/loader.js";
|
|
3
3
|
import { createJustBashSandbox, isJustBash, wrapJustBash, } from "./sandbox/just-bash.js";
|
|
4
4
|
import { isVercelSandbox, wrapVercelSandbox } from "./sandbox/vercel.js";
|
|
5
5
|
import { createBashExecuteTool } from "./tools/bash.js";
|
|
@@ -8,6 +8,8 @@ import { createWriteFileTool } from "./tools/write-file.js";
|
|
|
8
8
|
import { createToolPrompt } from "./tools-prompt.js";
|
|
9
9
|
const DEFAULT_DESTINATION = "/workspace";
|
|
10
10
|
const VERCEL_SANDBOX_DESTINATION = "/vercel/sandbox/workspace";
|
|
11
|
+
const WRITE_BATCH_SIZE = 20;
|
|
12
|
+
const DEFAULT_MAX_FILES = 1000;
|
|
11
13
|
/**
|
|
12
14
|
* Creates a bash tool with tools for AI agents.
|
|
13
15
|
*
|
|
@@ -40,22 +42,15 @@ export async function createBashTool(options = {}) {
|
|
|
40
42
|
? VERCEL_SANDBOX_DESTINATION
|
|
41
43
|
: DEFAULT_DESTINATION;
|
|
42
44
|
const destination = options.destination ?? defaultDestination;
|
|
43
|
-
// 1. Load files from disk and/or inline
|
|
44
|
-
const loadedFiles = await loadFiles({
|
|
45
|
-
files: options.files,
|
|
46
|
-
uploadDirectory: options.uploadDirectory,
|
|
47
|
-
});
|
|
48
|
-
// 2. Prefix all file paths with destination
|
|
49
|
-
const filesWithDestination = {};
|
|
50
|
-
for (const [relativePath, content] of Object.entries(loadedFiles)) {
|
|
51
|
-
const absolutePath = path.posix.join(destination, relativePath);
|
|
52
|
-
filesWithDestination[absolutePath] = content;
|
|
53
|
-
}
|
|
54
45
|
// 3. Create or wrap sandbox
|
|
55
46
|
let sandbox;
|
|
56
47
|
let usingJustBash = false;
|
|
48
|
+
let fileList = [];
|
|
49
|
+
let workingDir = destination;
|
|
50
|
+
const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;
|
|
57
51
|
let fileWrittenPromise;
|
|
58
52
|
if (options.sandbox) {
|
|
53
|
+
// External sandbox provided - stream files and write in batches
|
|
59
54
|
// Check @vercel/sandbox first (more specific check)
|
|
60
55
|
if (isVercelSandbox(options.sandbox)) {
|
|
61
56
|
sandbox = wrapVercelSandbox(options.sandbox);
|
|
@@ -67,22 +62,91 @@ export async function createBashTool(options = {}) {
|
|
|
67
62
|
else {
|
|
68
63
|
sandbox = options.sandbox;
|
|
69
64
|
}
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
// Get file paths for tool prompt (without loading content)
|
|
66
|
+
fileList = await getFilePaths({
|
|
67
|
+
files: options.files,
|
|
68
|
+
uploadDirectory: options.uploadDirectory,
|
|
69
|
+
});
|
|
70
|
+
// Check file limit
|
|
71
|
+
if (maxFiles > 0 && fileList.length > maxFiles) {
|
|
72
|
+
throw new Error(`Too many files to upload: ${fileList.length} files exceeds the limit of ${maxFiles}. ` +
|
|
73
|
+
`Either increase maxFiles, use a more restrictive include pattern in uploadDirectory, ` +
|
|
74
|
+
`or write files to the sandbox yourself before calling createBashTool.`);
|
|
74
75
|
}
|
|
76
|
+
// Stream files and write in batches to avoid memory issues
|
|
77
|
+
fileWrittenPromise = (async () => {
|
|
78
|
+
let batch = [];
|
|
79
|
+
for await (const file of streamFiles({
|
|
80
|
+
files: options.files,
|
|
81
|
+
uploadDirectory: options.uploadDirectory,
|
|
82
|
+
})) {
|
|
83
|
+
batch.push({
|
|
84
|
+
path: path.posix.join(destination, file.path),
|
|
85
|
+
content: file.content,
|
|
86
|
+
});
|
|
87
|
+
if (batch.length >= WRITE_BATCH_SIZE) {
|
|
88
|
+
await sandbox.writeFiles(batch);
|
|
89
|
+
batch = [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Write remaining files
|
|
93
|
+
if (batch.length > 0) {
|
|
94
|
+
await sandbox.writeFiles(batch);
|
|
95
|
+
}
|
|
96
|
+
})();
|
|
75
97
|
}
|
|
76
98
|
else {
|
|
77
|
-
//
|
|
78
|
-
sandbox = await createJustBashSandbox({
|
|
79
|
-
files: filesWithDestination,
|
|
80
|
-
cwd: destination,
|
|
81
|
-
});
|
|
99
|
+
// No external sandbox - use just-bash
|
|
82
100
|
usingJustBash = true;
|
|
101
|
+
if (options.uploadDirectory && !options.files) {
|
|
102
|
+
// Use OverlayFs for uploadDirectory (avoids loading all files into memory)
|
|
103
|
+
const overlayRoot = path.resolve(options.uploadDirectory.source);
|
|
104
|
+
const result = await createJustBashSandbox({
|
|
105
|
+
overlayRoot,
|
|
106
|
+
});
|
|
107
|
+
sandbox = result;
|
|
108
|
+
// Get file paths without loading content (for tool prompt)
|
|
109
|
+
fileList = await getFilePaths({
|
|
110
|
+
uploadDirectory: options.uploadDirectory,
|
|
111
|
+
});
|
|
112
|
+
// Check file limit (even for OverlayFs, we list files for the tool prompt)
|
|
113
|
+
if (maxFiles > 0 && fileList.length > maxFiles) {
|
|
114
|
+
throw new Error(`Too many files: ${fileList.length} files exceeds the limit of ${maxFiles}. ` +
|
|
115
|
+
`Either increase maxFiles or use a more restrictive include pattern in uploadDirectory.`);
|
|
116
|
+
}
|
|
117
|
+
// Use the OverlayFs mount point as working directory
|
|
118
|
+
if (result.mountPoint) {
|
|
119
|
+
workingDir = result.mountPoint;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Load files into memory for in-memory filesystem
|
|
124
|
+
// For just-bash we need all files upfront, but stream to avoid peak memory
|
|
125
|
+
const filesWithDestination = {};
|
|
126
|
+
for await (const file of streamFiles({
|
|
127
|
+
files: options.files,
|
|
128
|
+
uploadDirectory: options.uploadDirectory,
|
|
129
|
+
})) {
|
|
130
|
+
const absolutePath = path.posix.join(destination, file.path);
|
|
131
|
+
filesWithDestination[absolutePath] = file.content.toString("utf-8");
|
|
132
|
+
}
|
|
133
|
+
fileList = await getFilePaths({
|
|
134
|
+
files: options.files,
|
|
135
|
+
uploadDirectory: options.uploadDirectory,
|
|
136
|
+
});
|
|
137
|
+
// Check file limit
|
|
138
|
+
if (maxFiles > 0 && fileList.length > maxFiles) {
|
|
139
|
+
throw new Error(`Too many files to load: ${fileList.length} files exceeds the limit of ${maxFiles}. ` +
|
|
140
|
+
`Either increase maxFiles, use a more restrictive include pattern in uploadDirectory, ` +
|
|
141
|
+
`or provide your own sandbox with files already written.`);
|
|
142
|
+
}
|
|
143
|
+
sandbox = await createJustBashSandbox({
|
|
144
|
+
files: filesWithDestination,
|
|
145
|
+
cwd: destination,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
83
148
|
}
|
|
84
149
|
// 4. Discover available tools and generate prompt
|
|
85
|
-
const fileList = Object.keys(loadedFiles);
|
|
86
150
|
const [toolPrompt, _] = await Promise.all([
|
|
87
151
|
createToolPrompt({
|
|
88
152
|
sandbox,
|
|
@@ -95,17 +159,18 @@ export async function createBashTool(options = {}) {
|
|
|
95
159
|
// 5. Create tools
|
|
96
160
|
const bash = createBashExecuteTool({
|
|
97
161
|
sandbox,
|
|
98
|
-
cwd:
|
|
162
|
+
cwd: workingDir,
|
|
99
163
|
files: fileList,
|
|
100
164
|
toolPrompt,
|
|
101
165
|
extraInstructions: options.extraInstructions,
|
|
102
166
|
onBeforeBashCall: options.onBeforeBashCall,
|
|
103
167
|
onAfterBashCall: options.onAfterBashCall,
|
|
168
|
+
maxOutputLength: options.maxOutputLength,
|
|
104
169
|
});
|
|
105
170
|
const tools = {
|
|
106
171
|
bash,
|
|
107
|
-
readFile: createReadFileTool({ sandbox, cwd:
|
|
108
|
-
writeFile: createWriteFileTool({ sandbox, cwd:
|
|
172
|
+
readFile: createReadFileTool({ sandbox, cwd: workingDir }),
|
|
173
|
+
writeFile: createWriteFileTool({ sandbox, cwd: workingDir }),
|
|
109
174
|
};
|
|
110
175
|
return { bash, tools, sandbox };
|
|
111
176
|
}
|
package/dist/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/bash.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { AfterBashCallInput, AfterBashCallOutput, BeforeBashCallInput, BeforeBashCallOutput, Sandbox } from "../types.js";
|
|
2
|
+
/** Default maximum length for stdout/stderr output (30KB) */
|
|
3
|
+
export declare const DEFAULT_MAX_OUTPUT_LENGTH = 30000;
|
|
2
4
|
export interface CreateBashToolOptions {
|
|
3
5
|
sandbox: Sandbox;
|
|
4
6
|
/** Working directory for command execution */
|
|
@@ -12,6 +14,12 @@ export interface CreateBashToolOptions {
|
|
|
12
14
|
onBeforeBashCall?: (input: BeforeBashCallInput) => BeforeBashCallOutput | undefined;
|
|
13
15
|
/** Callback after command execution, can modify the result */
|
|
14
16
|
onAfterBashCall?: (input: AfterBashCallInput) => AfterBashCallOutput | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum length (in characters) for stdout and stderr output.
|
|
19
|
+
* If output exceeds this limit, it will be truncated with a message.
|
|
20
|
+
* @default 30000
|
|
21
|
+
*/
|
|
22
|
+
maxOutputLength?: number;
|
|
15
23
|
}
|
|
16
24
|
export declare function createBashExecuteTool(options: CreateBashToolOptions): import("ai").Tool<{
|
|
17
25
|
command: string;
|
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACR,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,mBAAmB,KACvB,oBAAoB,GAAG,SAAS,CAAC;IACtC,8DAA8D;IAC9D,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,kBAAkB,KACtB,mBAAmB,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACR,MAAM,aAAa,CAAC;AAMrB,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,mBAAmB,KACvB,oBAAoB,GAAG,SAAS,CAAC;IACtC,8DAA8D;IAC9D,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,kBAAkB,KACtB,mBAAmB,GAAG,SAAS,CAAC;IACrC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA+DD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB;;wCA8CnE"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -3,6 +3,18 @@ import { z } from "zod";
|
|
|
3
3
|
const bashSchema = z.object({
|
|
4
4
|
command: z.string().describe("The bash command to execute"),
|
|
5
5
|
});
|
|
6
|
+
/** Default maximum length for stdout/stderr output (30KB) */
|
|
7
|
+
export const DEFAULT_MAX_OUTPUT_LENGTH = 30_000;
|
|
8
|
+
/**
|
|
9
|
+
* Truncates a string if it exceeds the maximum length, appending a truncation notice.
|
|
10
|
+
*/
|
|
11
|
+
function truncateOutput(output, maxLength, streamName) {
|
|
12
|
+
if (output.length <= maxLength) {
|
|
13
|
+
return output;
|
|
14
|
+
}
|
|
15
|
+
const truncatedLength = output.length - maxLength;
|
|
16
|
+
return `${output.slice(0, maxLength)}\n\n[${streamName} truncated: ${truncatedLength} characters removed]`;
|
|
17
|
+
}
|
|
6
18
|
function generateDescription(options) {
|
|
7
19
|
const { cwd, files, extraInstructions, toolPrompt } = options;
|
|
8
20
|
const lines = [
|
|
@@ -42,7 +54,7 @@ function generateDescription(options) {
|
|
|
42
54
|
return lines.join("\n").trim();
|
|
43
55
|
}
|
|
44
56
|
export function createBashExecuteTool(options) {
|
|
45
|
-
const { sandbox, cwd, onBeforeBashCall, onAfterBashCall } = options;
|
|
57
|
+
const { sandbox, cwd, onBeforeBashCall, onAfterBashCall, maxOutputLength = DEFAULT_MAX_OUTPUT_LENGTH, } = options;
|
|
46
58
|
return tool({
|
|
47
59
|
description: generateDescription(options),
|
|
48
60
|
inputSchema: bashSchema,
|
|
@@ -59,6 +71,12 @@ export function createBashExecuteTool(options) {
|
|
|
59
71
|
const fullCommand = `cd "${cwd}" && ${command}`;
|
|
60
72
|
// Execute the command
|
|
61
73
|
let result = await sandbox.executeCommand(fullCommand);
|
|
74
|
+
// Truncate output if needed
|
|
75
|
+
result = {
|
|
76
|
+
...result,
|
|
77
|
+
stdout: truncateOutput(result.stdout, maxOutputLength, "stdout"),
|
|
78
|
+
stderr: truncateOutput(result.stderr, maxOutputLength, "stderr"),
|
|
79
|
+
};
|
|
62
80
|
// Allow modification of result after execution
|
|
63
81
|
if (onAfterBashCall) {
|
|
64
82
|
const afterResult = onAfterBashCall({ command, result });
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC5D,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface Sandbox {
|
|
|
10
10
|
readFile(path: string): Promise<string>;
|
|
11
11
|
writeFiles(files: Array<{
|
|
12
12
|
path: string;
|
|
13
|
-
content: string;
|
|
13
|
+
content: string | Buffer;
|
|
14
14
|
}>): Promise<void>;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
@@ -123,6 +123,19 @@ export interface CreateBashToolOptions {
|
|
|
123
123
|
* ```
|
|
124
124
|
*/
|
|
125
125
|
onAfterBashCall?: (input: AfterBashCallInput) => AfterBashCallOutput | undefined;
|
|
126
|
+
/**
|
|
127
|
+
* Maximum length (in characters) for stdout and stderr output.
|
|
128
|
+
* If output exceeds this limit, it will be truncated with a message.
|
|
129
|
+
* @default 30000
|
|
130
|
+
*/
|
|
131
|
+
maxOutputLength?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Maximum number of files to upload to the sandbox.
|
|
134
|
+
* If exceeded, an error is thrown guiding you to handle the upload yourself.
|
|
135
|
+
* Set to 0 to disable the limit.
|
|
136
|
+
* @default 1000
|
|
137
|
+
*/
|
|
138
|
+
maxFiles?: number;
|
|
126
139
|
}
|
|
127
140
|
import type { createBashExecuteTool } from "./tools/bash.js";
|
|
128
141
|
import type { createReadFileTool } from "./tools/read-file.js";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,UAAU,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.3.
|
|
6
|
+
"version": "1.3.4",
|
|
7
7
|
"description": "Generic bash tool for AI agents, compatible with AI SDK",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"main": "dist/index.js",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"@types/node": "^22.10.0",
|
|
52
52
|
"@vercel/sandbox": "^1.1.6",
|
|
53
53
|
"ai": "^6.0.13",
|
|
54
|
+
"just-bash": "^2.4.1",
|
|
54
55
|
"knip": "^5.80.0",
|
|
55
56
|
"typescript": "^5.7.0",
|
|
56
57
|
"vitest": "^2.1.0"
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"peerDependencies": {
|
|
59
60
|
"@vercel/sandbox": "*",
|
|
60
61
|
"ai": "^6.0.0",
|
|
61
|
-
"just-bash": "
|
|
62
|
+
"just-bash": "^2.4.1"
|
|
62
63
|
},
|
|
63
64
|
"peerDependenciesMeta": {
|
|
64
65
|
"just-bash": {
|