bash-tool 1.3.2 → 1.3.5
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/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 +89 -25
- package/dist/tool.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
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"}
|
|
@@ -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,7 +159,7 @@ 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,
|
|
@@ -105,8 +169,8 @@ export async function createBashTool(options = {}) {
|
|
|
105
169
|
});
|
|
106
170
|
const tools = {
|
|
107
171
|
bash,
|
|
108
|
-
readFile: createReadFileTool({ sandbox, cwd:
|
|
109
|
-
writeFile: createWriteFileTool({ sandbox, cwd:
|
|
172
|
+
readFile: createReadFileTool({ sandbox, cwd: workingDir }),
|
|
173
|
+
writeFile: createWriteFileTool({ sandbox, cwd: workingDir }),
|
|
110
174
|
};
|
|
111
175
|
return { bash, tools, sandbox };
|
|
112
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/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
|
/**
|
|
@@ -129,6 +129,13 @@ export interface CreateBashToolOptions {
|
|
|
129
129
|
* @default 30000
|
|
130
130
|
*/
|
|
131
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;
|
|
132
139
|
}
|
|
133
140
|
import type { createBashExecuteTool } from "./tools/bash.js";
|
|
134
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.5",
|
|
7
7
|
"description": "Generic bash tool for AI agents, compatible with AI SDK",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"main": "dist/index.js",
|
|
@@ -51,7 +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.
|
|
54
|
+
"just-bash": "^2.5.0",
|
|
55
55
|
"knip": "^5.80.0",
|
|
56
56
|
"typescript": "^5.7.0",
|
|
57
57
|
"vitest": "^2.1.0"
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"@vercel/sandbox": "*",
|
|
61
61
|
"ai": "^6.0.0",
|
|
62
|
-
"just-bash": "^2.
|
|
62
|
+
"just-bash": "^2.5.0"
|
|
63
63
|
},
|
|
64
64
|
"peerDependenciesMeta": {
|
|
65
65
|
"just-bash": {
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"typecheck": "tsc --noEmit",
|
|
76
76
|
"test": "vitest --exclude 'src/tool.vercel.integration.test.ts'",
|
|
77
77
|
"test:run": "vitest run --exclude 'src/tool.vercel.integration.test.ts'",
|
|
78
|
-
"test:vercel": "vitest run
|
|
78
|
+
"test:vercel": "vitest run src/tool.vercel.integration.test.ts --sequence.concurrent",
|
|
79
79
|
"lint": "biome check .",
|
|
80
80
|
"lint:fix": "biome check --write .",
|
|
81
81
|
"format": "biome format --write .",
|