@openharness/core 0.5.0 → 0.5.1
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/__tests__/conversation.test.js +48 -0
- package/dist/__tests__/conversation.test.js.map +1 -1
- package/dist/__tests__/session-abort.test.d.ts +2 -0
- package/dist/__tests__/session-abort.test.d.ts.map +1 -0
- package/dist/__tests__/session-abort.test.js +84 -0
- package/dist/__tests__/session-abort.test.js.map +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +47 -0
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/ui-stream.d.ts.map +1 -1
- package/dist/ui-stream.js +17 -2
- package/dist/ui-stream.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/providers/node.test.d.ts +0 -2
- package/dist/__tests__/providers/node.test.d.ts.map +0 -1
- package/dist/__tests__/providers/node.test.js +0 -135
- package/dist/__tests__/providers/node.test.js.map +0 -1
- package/dist/__tests__/tools/create-bash-tool.test.d.ts +0 -2
- package/dist/__tests__/tools/create-bash-tool.test.d.ts.map +0 -1
- package/dist/__tests__/tools/create-bash-tool.test.js +0 -25
- package/dist/__tests__/tools/create-bash-tool.test.js.map +0 -1
- package/dist/__tests__/tools/create-fs-tools.test.d.ts +0 -2
- package/dist/__tests__/tools/create-fs-tools.test.d.ts.map +0 -1
- package/dist/__tests__/tools/create-fs-tools.test.js +0 -200
- package/dist/__tests__/tools/create-fs-tools.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -4
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -2
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/node.d.ts +0 -51
- package/dist/providers/node.d.ts.map +0 -1
- package/dist/providers/node.js +0 -130
- package/dist/providers/node.js.map +0 -1
- package/dist/providers/types.d.ts +0 -52
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -8
- package/dist/providers/types.js.map +0 -1
- package/dist/tools/create-bash-tool.d.ts +0 -8
- package/dist/tools/create-bash-tool.d.ts.map +0 -1
- package/dist/tools/create-bash-tool.js +0 -27
- package/dist/tools/create-bash-tool.js.map +0 -1
- package/dist/tools/create-fs-tools.d.ts +0 -100
- package/dist/tools/create-fs-tools.d.ts.map +0 -1
- package/dist/tools/create-fs-tools.js +0 -361
- package/dist/tools/create-fs-tools.js.map +0 -1
- package/dist/tools/create-local-tools.d.ts +0 -97
- package/dist/tools/create-local-tools.d.ts.map +0 -1
- package/dist/tools/create-local-tools.js +0 -9
- package/dist/tools/create-local-tools.js.map +0 -1
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import { NodeFsProvider, NodeShellProvider, FileTooLargeError } from "../../providers/node.js";
|
|
6
|
-
// ── Helpers ─────────────────────────────────────────────────────────
|
|
7
|
-
let tmpDir;
|
|
8
|
-
beforeEach(async () => {
|
|
9
|
-
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "oh-node-provider-"));
|
|
10
|
-
});
|
|
11
|
-
afterEach(async () => {
|
|
12
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
13
|
-
});
|
|
14
|
-
// ── NodeFsProvider ──────────────────────────────────────────────────
|
|
15
|
-
describe("NodeFsProvider", () => {
|
|
16
|
-
it("resolves paths relative to cwd option", () => {
|
|
17
|
-
const provider = new NodeFsProvider({ cwd: "/some/dir" });
|
|
18
|
-
expect(provider.resolvePath("foo.txt")).toBe("/some/dir/foo.txt");
|
|
19
|
-
expect(provider.resolvePath("/absolute/path.txt")).toBe("/absolute/path.txt");
|
|
20
|
-
});
|
|
21
|
-
it("reads and writes files", async () => {
|
|
22
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
23
|
-
await provider.writeFile("test.txt", "hello world");
|
|
24
|
-
const content = await provider.readFile("test.txt");
|
|
25
|
-
expect(content).toBe("hello world");
|
|
26
|
-
});
|
|
27
|
-
it("creates parent directories on write", async () => {
|
|
28
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
29
|
-
await provider.writeFile("a/b/c.txt", "nested");
|
|
30
|
-
const content = await provider.readFile("a/b/c.txt");
|
|
31
|
-
expect(content).toBe("nested");
|
|
32
|
-
});
|
|
33
|
-
it("throws FileTooLargeError for oversized files", async () => {
|
|
34
|
-
const provider = new NodeFsProvider({ cwd: tmpDir, maxFileSize: 10 });
|
|
35
|
-
await fs.writeFile(path.join(tmpDir, "big.txt"), "a".repeat(100));
|
|
36
|
-
await expect(provider.readFile("big.txt")).rejects.toThrow(FileTooLargeError);
|
|
37
|
-
await expect(provider.readFile("big.txt")).rejects.toThrow(/File too large/);
|
|
38
|
-
});
|
|
39
|
-
it("checks file existence", async () => {
|
|
40
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
41
|
-
expect(await provider.exists("nope.txt")).toBe(false);
|
|
42
|
-
await provider.writeFile("yep.txt", "hi");
|
|
43
|
-
expect(await provider.exists("yep.txt")).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
it("returns stat information", async () => {
|
|
46
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
47
|
-
await provider.writeFile("file.txt", "content");
|
|
48
|
-
await provider.mkdir("dir");
|
|
49
|
-
const fileStat = await provider.stat("file.txt");
|
|
50
|
-
expect(fileStat.isFile).toBe(true);
|
|
51
|
-
expect(fileStat.isDirectory).toBe(false);
|
|
52
|
-
expect(fileStat.size).toBe(7);
|
|
53
|
-
const dirStat = await provider.stat("dir");
|
|
54
|
-
expect(dirStat.isFile).toBe(false);
|
|
55
|
-
expect(dirStat.isDirectory).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
it("lists directory entries", async () => {
|
|
58
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
59
|
-
await provider.writeFile("a.txt", "a");
|
|
60
|
-
await provider.writeFile("b.txt", "b");
|
|
61
|
-
await provider.mkdir("subdir");
|
|
62
|
-
const entries = await provider.readdir(".");
|
|
63
|
-
const names = entries.map((e) => e.name).sort();
|
|
64
|
-
expect(names).toContain("a.txt");
|
|
65
|
-
expect(names).toContain("b.txt");
|
|
66
|
-
expect(names).toContain("subdir");
|
|
67
|
-
const subdir = entries.find((e) => e.name === "subdir");
|
|
68
|
-
expect(subdir.isDirectory).toBe(true);
|
|
69
|
-
expect(subdir.isFile).toBe(false);
|
|
70
|
-
});
|
|
71
|
-
it("creates directories recursively", async () => {
|
|
72
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
73
|
-
await provider.mkdir("a/b/c", { recursive: true });
|
|
74
|
-
const stat = await provider.stat("a/b/c");
|
|
75
|
-
expect(stat.isDirectory).toBe(true);
|
|
76
|
-
});
|
|
77
|
-
it("removes files", async () => {
|
|
78
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
79
|
-
await provider.writeFile("delete-me.txt", "bye");
|
|
80
|
-
expect(await provider.exists("delete-me.txt")).toBe(true);
|
|
81
|
-
await provider.remove("delete-me.txt");
|
|
82
|
-
expect(await provider.exists("delete-me.txt")).toBe(false);
|
|
83
|
-
});
|
|
84
|
-
it("removes directories recursively", async () => {
|
|
85
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
86
|
-
await provider.writeFile("dir/a.txt", "a");
|
|
87
|
-
await provider.writeFile("dir/b.txt", "b");
|
|
88
|
-
await provider.remove("dir", { recursive: true });
|
|
89
|
-
expect(await provider.exists("dir")).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
it("throws when removing directory without recursive", async () => {
|
|
92
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
93
|
-
await provider.mkdir("dir");
|
|
94
|
-
await expect(provider.remove("dir")).rejects.toThrow(/directory/i);
|
|
95
|
-
});
|
|
96
|
-
it("renames files", async () => {
|
|
97
|
-
const provider = new NodeFsProvider({ cwd: tmpDir });
|
|
98
|
-
await provider.writeFile("old.txt", "content");
|
|
99
|
-
await provider.rename("old.txt", "new.txt");
|
|
100
|
-
expect(await provider.exists("old.txt")).toBe(false);
|
|
101
|
-
expect(await provider.readFile("new.txt")).toBe("content");
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
// ── NodeShellProvider ───────────────────────────────────────────────
|
|
105
|
-
describe("NodeShellProvider", () => {
|
|
106
|
-
it("executes commands and returns output", async () => {
|
|
107
|
-
const provider = new NodeShellProvider();
|
|
108
|
-
const result = await provider.exec("echo hello");
|
|
109
|
-
expect(result.stdout.trim()).toBe("hello");
|
|
110
|
-
expect(result.exitCode).toBe(0);
|
|
111
|
-
});
|
|
112
|
-
it("captures stderr", async () => {
|
|
113
|
-
const provider = new NodeShellProvider();
|
|
114
|
-
const result = await provider.exec("echo error >&2");
|
|
115
|
-
expect(result.stderr.trim()).toBe("error");
|
|
116
|
-
});
|
|
117
|
-
it("returns non-zero exit codes", async () => {
|
|
118
|
-
const provider = new NodeShellProvider();
|
|
119
|
-
const result = await provider.exec("exit 42");
|
|
120
|
-
expect(result.exitCode).toBe(42);
|
|
121
|
-
});
|
|
122
|
-
it("respects cwd option", async () => {
|
|
123
|
-
const provider = new NodeShellProvider({ cwd: tmpDir });
|
|
124
|
-
await fs.writeFile(path.join(tmpDir, "marker.txt"), "found");
|
|
125
|
-
const result = await provider.exec("cat marker.txt");
|
|
126
|
-
expect(result.stdout.trim()).toBe("found");
|
|
127
|
-
});
|
|
128
|
-
it("truncates long output", async () => {
|
|
129
|
-
const provider = new NodeShellProvider({ maxStdout: 20 });
|
|
130
|
-
const result = await provider.exec("echo " + "a".repeat(100));
|
|
131
|
-
expect(result.stdout.length).toBeLessThan(100);
|
|
132
|
-
expect(result.stdout).toContain("truncated");
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
//# sourceMappingURL=node.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.test.js","sourceRoot":"","sources":["../../../src/__tests__/providers/node.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-bash-tool.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/create-bash-tool.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { NodeShellProvider } from "../../providers/node.js";
|
|
3
|
-
import { createBashTool } from "../../tools/create-bash-tool.js";
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- test helper to bypass AI SDK's union return type
|
|
5
|
-
async function exec(tool, input) {
|
|
6
|
-
return tool.execute(input, { toolCallId: "test", messages: [] });
|
|
7
|
-
}
|
|
8
|
-
describe("createBashTool", () => {
|
|
9
|
-
it("executes commands via the shell provider", async () => {
|
|
10
|
-
const provider = new NodeShellProvider();
|
|
11
|
-
const { bash } = createBashTool(provider);
|
|
12
|
-
const result = await exec(bash, { command: "echo hello", timeout: 30000 });
|
|
13
|
-
expect(result.stdout.trim()).toBe("hello");
|
|
14
|
-
expect(result.exitCode).toBe(0);
|
|
15
|
-
});
|
|
16
|
-
it("works with a custom shell provider", async () => {
|
|
17
|
-
const mockShell = {
|
|
18
|
-
exec: async () => ({ stdout: "mocked", stderr: "", exitCode: 0 }),
|
|
19
|
-
};
|
|
20
|
-
const { bash } = createBashTool(mockShell);
|
|
21
|
-
const result = await exec(bash, { command: "anything", timeout: 30000 });
|
|
22
|
-
expect(result.stdout).toBe("mocked");
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
//# sourceMappingURL=create-bash-tool.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-bash-tool.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/create-bash-tool.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,kHAAkH;AAClH,KAAK,UAAU,IAAI,CAAC,IAAS,EAAE,KAAU;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACzC,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;SAClE,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-fs-tools.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/create-fs-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import { NodeFsProvider } from "../../providers/node.js";
|
|
6
|
-
import { createFsTools } from "../../tools/create-fs-tools.js";
|
|
7
|
-
// ── Helpers ─────────────────────────────────────────────────────────
|
|
8
|
-
let tmpDir;
|
|
9
|
-
let provider;
|
|
10
|
-
let tools;
|
|
11
|
-
beforeEach(async () => {
|
|
12
|
-
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "oh-fs-tools-"));
|
|
13
|
-
provider = new NodeFsProvider({ cwd: tmpDir });
|
|
14
|
-
tools = createFsTools(provider);
|
|
15
|
-
});
|
|
16
|
-
afterEach(async () => {
|
|
17
|
-
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
18
|
-
});
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- test helper to bypass AI SDK's union return type
|
|
20
|
-
async function exec(tool, input) {
|
|
21
|
-
return tool.execute(input, { toolCallId: "test", messages: [] });
|
|
22
|
-
}
|
|
23
|
-
async function writeTestFile(name, content) {
|
|
24
|
-
const full = path.join(tmpDir, name);
|
|
25
|
-
await fs.mkdir(path.dirname(full), { recursive: true });
|
|
26
|
-
await fs.writeFile(full, content, "utf-8");
|
|
27
|
-
}
|
|
28
|
-
// ── readFile ────────────────────────────────────────────────────────
|
|
29
|
-
describe("readFile", () => {
|
|
30
|
-
it("reads a file with line numbers", async () => {
|
|
31
|
-
await writeTestFile("hello.txt", "line one\nline two\nline three");
|
|
32
|
-
const result = await exec(tools.readFile, { filePath: "hello.txt" });
|
|
33
|
-
expect(result.content).toContain("1: line one");
|
|
34
|
-
expect(result.content).toContain("2: line two");
|
|
35
|
-
expect(result.content).toContain("3: line three");
|
|
36
|
-
expect(result.totalLines).toBe(3);
|
|
37
|
-
});
|
|
38
|
-
it("supports 1-based offset", async () => {
|
|
39
|
-
const lines = Array.from({ length: 10 }, (_, i) => `line ${i + 1}`).join("\n");
|
|
40
|
-
await writeTestFile("lines.txt", lines);
|
|
41
|
-
const result = await exec(tools.readFile, { filePath: "lines.txt", offset: 5, limit: 3 });
|
|
42
|
-
expect(result.content).toContain("5: line 5");
|
|
43
|
-
expect(result.content).toContain("6: line 6");
|
|
44
|
-
expect(result.content).toContain("7: line 7");
|
|
45
|
-
expect(result.fromLine).toBe(5);
|
|
46
|
-
expect(result.toLine).toBe(7);
|
|
47
|
-
});
|
|
48
|
-
it("returns pagination hint when file is truncated by line limit", async () => {
|
|
49
|
-
const lines = Array.from({ length: 100 }, (_, i) => `line ${i + 1}`).join("\n");
|
|
50
|
-
await writeTestFile("big.txt", lines);
|
|
51
|
-
const smallTools = createFsTools(provider, { maxLines: 10 });
|
|
52
|
-
const result = await exec(smallTools.readFile, { filePath: "big.txt" });
|
|
53
|
-
expect(result.toLine).toBe(10);
|
|
54
|
-
expect(result.totalLines).toBe(100);
|
|
55
|
-
expect(result.status).toContain("offset=11");
|
|
56
|
-
});
|
|
57
|
-
it("truncates output at maxOutputBytes", async () => {
|
|
58
|
-
const lines = Array.from({ length: 1000 }, (_, i) => `line ${i + 1}: ${"x".repeat(100)}`).join("\n");
|
|
59
|
-
await writeTestFile("huge.txt", lines);
|
|
60
|
-
const smallTools = createFsTools(provider, { maxOutputBytes: 500 });
|
|
61
|
-
const result = await exec(smallTools.readFile, { filePath: "huge.txt" });
|
|
62
|
-
expect(result.status).toContain("capped");
|
|
63
|
-
expect(result.status).toContain("offset=");
|
|
64
|
-
});
|
|
65
|
-
it("truncates long lines", async () => {
|
|
66
|
-
const longLine = "x".repeat(5000);
|
|
67
|
-
await writeTestFile("long-line.txt", longLine);
|
|
68
|
-
const result = await exec(tools.readFile, { filePath: "long-line.txt" });
|
|
69
|
-
expect(result.content).toContain("line truncated");
|
|
70
|
-
expect(result.content.length).toBeLessThan(5000);
|
|
71
|
-
});
|
|
72
|
-
it("rejects binary files by extension", async () => {
|
|
73
|
-
await writeTestFile("image.png", "fake png");
|
|
74
|
-
const result = await exec(tools.readFile, { filePath: "image.png" });
|
|
75
|
-
expect(result.error).toContain("binary");
|
|
76
|
-
});
|
|
77
|
-
it("returns error for out-of-range offset", async () => {
|
|
78
|
-
await writeTestFile("small.txt", "one\ntwo");
|
|
79
|
-
const result = await exec(tools.readFile, { filePath: "small.txt", offset: 100 });
|
|
80
|
-
expect(result.error).toContain("out of range");
|
|
81
|
-
});
|
|
82
|
-
it("returns error when file is too large for provider", async () => {
|
|
83
|
-
const tinyProvider = new NodeFsProvider({ cwd: tmpDir, maxFileSize: 10 });
|
|
84
|
-
const tinyTools = createFsTools(tinyProvider);
|
|
85
|
-
await writeTestFile("toobig.txt", "a".repeat(100));
|
|
86
|
-
const result = await exec(tinyTools.readFile, { filePath: "toobig.txt" });
|
|
87
|
-
expect(result.error).toContain("too large");
|
|
88
|
-
});
|
|
89
|
-
it("shows end-of-file status when reading entire file", async () => {
|
|
90
|
-
await writeTestFile("short.txt", "hello");
|
|
91
|
-
const result = await exec(tools.readFile, { filePath: "short.txt" });
|
|
92
|
-
expect(result.status).toContain("End of file");
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
// ── writeFile ───────────────────────────────────────────────────────
|
|
96
|
-
describe("writeFile", () => {
|
|
97
|
-
it("creates a new file", async () => {
|
|
98
|
-
const result = await exec(tools.writeFile, { filePath: "new.txt", content: "hello" });
|
|
99
|
-
expect(result.bytesWritten).toBe(5);
|
|
100
|
-
const content = await fs.readFile(path.join(tmpDir, "new.txt"), "utf-8");
|
|
101
|
-
expect(content).toBe("hello");
|
|
102
|
-
});
|
|
103
|
-
it("creates parent directories", async () => {
|
|
104
|
-
await exec(tools.writeFile, { filePath: "a/b/c.txt", content: "nested" });
|
|
105
|
-
const content = await fs.readFile(path.join(tmpDir, "a/b/c.txt"), "utf-8");
|
|
106
|
-
expect(content).toBe("nested");
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
// ── editFile ────────────────────────────────────────────────────────
|
|
110
|
-
describe("editFile", () => {
|
|
111
|
-
it("replaces first occurrence", async () => {
|
|
112
|
-
await writeTestFile("edit.txt", "foo bar foo baz");
|
|
113
|
-
const result = await exec(tools.editFile, {
|
|
114
|
-
filePath: "edit.txt", oldString: "foo", newString: "qux", replaceAll: false,
|
|
115
|
-
});
|
|
116
|
-
expect(result.replacements).toBe(1);
|
|
117
|
-
const content = await fs.readFile(path.join(tmpDir, "edit.txt"), "utf-8");
|
|
118
|
-
expect(content).toBe("qux bar foo baz");
|
|
119
|
-
});
|
|
120
|
-
it("replaces all occurrences", async () => {
|
|
121
|
-
await writeTestFile("edit.txt", "foo bar foo baz");
|
|
122
|
-
const result = await exec(tools.editFile, {
|
|
123
|
-
filePath: "edit.txt", oldString: "foo", newString: "qux", replaceAll: true,
|
|
124
|
-
});
|
|
125
|
-
expect(result.replacements).toBe(2);
|
|
126
|
-
const content = await fs.readFile(path.join(tmpDir, "edit.txt"), "utf-8");
|
|
127
|
-
expect(content).toBe("qux bar qux baz");
|
|
128
|
-
});
|
|
129
|
-
it("returns error when oldString not found", async () => {
|
|
130
|
-
await writeTestFile("edit.txt", "hello");
|
|
131
|
-
const result = await exec(tools.editFile, {
|
|
132
|
-
filePath: "edit.txt", oldString: "missing", newString: "x", replaceAll: false,
|
|
133
|
-
});
|
|
134
|
-
expect(result.error).toContain("not found");
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
// ── listFiles ───────────────────────────────────────────────────────
|
|
138
|
-
describe("listFiles", () => {
|
|
139
|
-
it("lists directory contents", async () => {
|
|
140
|
-
await writeTestFile("a.txt", "a");
|
|
141
|
-
await writeTestFile("b.txt", "b");
|
|
142
|
-
await fs.mkdir(path.join(tmpDir, "subdir"));
|
|
143
|
-
const result = await exec(tools.listFiles, { dirPath: ".", recursive: false });
|
|
144
|
-
const names = result.entries.map((e) => e.name).sort();
|
|
145
|
-
expect(names).toContain("a.txt");
|
|
146
|
-
expect(names).toContain("b.txt");
|
|
147
|
-
expect(names).toContain("subdir");
|
|
148
|
-
});
|
|
149
|
-
it("lists recursively", async () => {
|
|
150
|
-
await writeTestFile("top.txt", "a");
|
|
151
|
-
await writeTestFile("sub/nested.txt", "b");
|
|
152
|
-
const result = await exec(tools.listFiles, { dirPath: ".", recursive: true });
|
|
153
|
-
const names = result.entries.map((e) => e.name);
|
|
154
|
-
expect(names).toContain("top.txt");
|
|
155
|
-
expect(names.some((n) => n.includes("nested.txt"))).toBe(true);
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
// ── grep ────────────────────────────────────────────────────────────
|
|
159
|
-
describe("grep", () => {
|
|
160
|
-
it("finds matching lines", async () => {
|
|
161
|
-
await writeTestFile("src/a.ts", 'const x = "hello";\nconst y = "world";');
|
|
162
|
-
await writeTestFile("src/b.ts", "// no match here");
|
|
163
|
-
const result = await exec(tools.grep, { pattern: "hello", dirPath: "." });
|
|
164
|
-
expect(result.matchCount).toBe(1);
|
|
165
|
-
expect(result.matches[0].content).toContain("hello");
|
|
166
|
-
});
|
|
167
|
-
it("supports case-insensitive search", async () => {
|
|
168
|
-
await writeTestFile("file.txt", "Hello World");
|
|
169
|
-
const result = await exec(tools.grep, { pattern: "hello", dirPath: ".", ignoreCase: true });
|
|
170
|
-
expect(result.matchCount).toBe(1);
|
|
171
|
-
});
|
|
172
|
-
it("filters by glob suffix", async () => {
|
|
173
|
-
await writeTestFile("code.ts", "match");
|
|
174
|
-
await writeTestFile("code.js", "match");
|
|
175
|
-
const result = await exec(tools.grep, { pattern: "match", dirPath: ".", glob: ".ts" });
|
|
176
|
-
expect(result.matchCount).toBe(1);
|
|
177
|
-
expect(result.matches[0].file).toContain(".ts");
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
// ── deleteFile ──────────────────────────────────────────────────────
|
|
181
|
-
describe("deleteFile", () => {
|
|
182
|
-
it("deletes a file", async () => {
|
|
183
|
-
await writeTestFile("bye.txt", "content");
|
|
184
|
-
const result = await exec(tools.deleteFile, { filePath: "bye.txt", recursive: false });
|
|
185
|
-
expect(result.deleted).toBeTruthy();
|
|
186
|
-
const exists = await fs.access(path.join(tmpDir, "bye.txt")).then(() => true, () => false);
|
|
187
|
-
expect(exists).toBe(false);
|
|
188
|
-
});
|
|
189
|
-
it("returns error for directory without recursive flag", async () => {
|
|
190
|
-
await fs.mkdir(path.join(tmpDir, "dir"));
|
|
191
|
-
const result = await exec(tools.deleteFile, { filePath: "dir", recursive: false });
|
|
192
|
-
expect(result.error).toContain("directory");
|
|
193
|
-
});
|
|
194
|
-
it("deletes directory recursively", async () => {
|
|
195
|
-
await writeTestFile("dir/file.txt", "x");
|
|
196
|
-
const result = await exec(tools.deleteFile, { filePath: "dir", recursive: true });
|
|
197
|
-
expect(result.deleted).toBeTruthy();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
//# sourceMappingURL=create-fs-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-fs-tools.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/create-fs-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export type { FsProvider, FileStat, DirEntry, ShellProvider, ShellResult, Environment } from "./types.js";
|
|
2
|
-
export { NodeFsProvider, NodeShellProvider, FileTooLargeError } from "./node.js";
|
|
3
|
-
export type { NodeFsProviderOptions, NodeShellProviderOptions } from "./node.js";
|
|
4
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjF,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/providers/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/providers/node.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { FsProvider, FileStat, DirEntry, ShellProvider, ShellResult } from "./types.js";
|
|
2
|
-
export interface NodeFsProviderOptions {
|
|
3
|
-
/** Working directory for resolving relative paths. Defaults to process.cwd(). */
|
|
4
|
-
cwd?: string;
|
|
5
|
-
/** Maximum file size in bytes that readFile will load. Defaults to 10 MB. */
|
|
6
|
-
maxFileSize?: number;
|
|
7
|
-
}
|
|
8
|
-
export declare class NodeFsProvider implements FsProvider {
|
|
9
|
-
private cwd;
|
|
10
|
-
private maxFileSize;
|
|
11
|
-
constructor(options?: NodeFsProviderOptions);
|
|
12
|
-
resolvePath(filePath: string): string;
|
|
13
|
-
readFile(filePath: string): Promise<string>;
|
|
14
|
-
writeFile(filePath: string, content: string): Promise<void>;
|
|
15
|
-
exists(filePath: string): Promise<boolean>;
|
|
16
|
-
stat(filePath: string): Promise<FileStat>;
|
|
17
|
-
readdir(dirPath: string): Promise<DirEntry[]>;
|
|
18
|
-
mkdir(dirPath: string, options?: {
|
|
19
|
-
recursive?: boolean;
|
|
20
|
-
}): Promise<void>;
|
|
21
|
-
remove(filePath: string, options?: {
|
|
22
|
-
recursive?: boolean;
|
|
23
|
-
}): Promise<void>;
|
|
24
|
-
rename(oldPath: string, newPath: string): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
export interface NodeShellProviderOptions {
|
|
27
|
-
/** Default working directory for commands. Defaults to process.cwd(). */
|
|
28
|
-
cwd?: string;
|
|
29
|
-
/** Maximum stdout size in characters before truncation. Defaults to 50,000. */
|
|
30
|
-
maxStdout?: number;
|
|
31
|
-
/** Maximum stderr size in characters before truncation. Defaults to 10,000. */
|
|
32
|
-
maxStderr?: number;
|
|
33
|
-
}
|
|
34
|
-
export declare class NodeShellProvider implements ShellProvider {
|
|
35
|
-
private cwd;
|
|
36
|
-
private maxStdout;
|
|
37
|
-
private maxStderr;
|
|
38
|
-
constructor(options?: NodeShellProviderOptions);
|
|
39
|
-
exec(command: string, options?: {
|
|
40
|
-
timeout?: number;
|
|
41
|
-
cwd?: string;
|
|
42
|
-
env?: Record<string, string>;
|
|
43
|
-
}): Promise<ShellResult>;
|
|
44
|
-
}
|
|
45
|
-
export declare class FileTooLargeError extends Error {
|
|
46
|
-
readonly filePath: string;
|
|
47
|
-
readonly fileSize: number;
|
|
48
|
-
readonly maxSize: number;
|
|
49
|
-
constructor(filePath: string, fileSize: number, maxSize: number);
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/providers/node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM7F,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE,qBAAqB;IAK3C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IASzC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAS7C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D;AAOD,MAAM,WAAW,wBAAwB;IACvC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,CAAC,EAAE,wBAAwB;IAM9C,IAAI,CACF,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACzE,OAAO,CAAC,WAAW,CAAC;CAqBxB;AAID,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,QAAQ,EAAE,MAAM;aAChB,QAAQ,EAAE,MAAM;aAChB,OAAO,EAAE,MAAM;gBAFf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM;CAQlC"}
|
package/dist/providers/node.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { execFile } from "node:child_process";
|
|
4
|
-
// ── NodeFsProvider ──────────────────────────────────────────────────
|
|
5
|
-
const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
|
|
6
|
-
export class NodeFsProvider {
|
|
7
|
-
cwd;
|
|
8
|
-
maxFileSize;
|
|
9
|
-
constructor(options) {
|
|
10
|
-
this.cwd = options?.cwd ?? process.cwd();
|
|
11
|
-
this.maxFileSize = options?.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
|
|
12
|
-
}
|
|
13
|
-
resolvePath(filePath) {
|
|
14
|
-
return path.resolve(this.cwd, filePath);
|
|
15
|
-
}
|
|
16
|
-
async readFile(filePath) {
|
|
17
|
-
const resolved = this.resolvePath(filePath);
|
|
18
|
-
const stat = await fs.stat(resolved);
|
|
19
|
-
if (stat.size > this.maxFileSize) {
|
|
20
|
-
throw new FileTooLargeError(resolved, stat.size, this.maxFileSize);
|
|
21
|
-
}
|
|
22
|
-
return fs.readFile(resolved, "utf-8");
|
|
23
|
-
}
|
|
24
|
-
async writeFile(filePath, content) {
|
|
25
|
-
const resolved = this.resolvePath(filePath);
|
|
26
|
-
await fs.mkdir(path.dirname(resolved), { recursive: true });
|
|
27
|
-
await fs.writeFile(resolved, content, "utf-8");
|
|
28
|
-
}
|
|
29
|
-
async exists(filePath) {
|
|
30
|
-
try {
|
|
31
|
-
await fs.access(this.resolvePath(filePath));
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async stat(filePath) {
|
|
39
|
-
const stat = await fs.stat(this.resolvePath(filePath));
|
|
40
|
-
return {
|
|
41
|
-
isFile: stat.isFile(),
|
|
42
|
-
isDirectory: stat.isDirectory(),
|
|
43
|
-
size: stat.size,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
async readdir(dirPath) {
|
|
47
|
-
const entries = await fs.readdir(this.resolvePath(dirPath), { withFileTypes: true });
|
|
48
|
-
return entries.map((e) => ({
|
|
49
|
-
name: e.name,
|
|
50
|
-
isFile: e.isFile(),
|
|
51
|
-
isDirectory: e.isDirectory(),
|
|
52
|
-
}));
|
|
53
|
-
}
|
|
54
|
-
async mkdir(dirPath, options) {
|
|
55
|
-
await fs.mkdir(this.resolvePath(dirPath), { recursive: options?.recursive });
|
|
56
|
-
}
|
|
57
|
-
async remove(filePath, options) {
|
|
58
|
-
const resolved = this.resolvePath(filePath);
|
|
59
|
-
const stat = await fs.stat(resolved);
|
|
60
|
-
if (stat.isDirectory()) {
|
|
61
|
-
if (!options?.recursive) {
|
|
62
|
-
throw new Error(`Path is a directory. Set recursive to true to delete it: ${resolved}`);
|
|
63
|
-
}
|
|
64
|
-
await fs.rm(resolved, { recursive: true });
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
await fs.unlink(resolved);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async rename(oldPath, newPath) {
|
|
71
|
-
await fs.rename(this.resolvePath(oldPath), this.resolvePath(newPath));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// ── NodeShellProvider ───────────────────────────────────────────────
|
|
75
|
-
const MAX_STDOUT = 50_000;
|
|
76
|
-
const MAX_STDERR = 10_000;
|
|
77
|
-
export class NodeShellProvider {
|
|
78
|
-
cwd;
|
|
79
|
-
maxStdout;
|
|
80
|
-
maxStderr;
|
|
81
|
-
constructor(options) {
|
|
82
|
-
this.cwd = options?.cwd ?? process.cwd();
|
|
83
|
-
this.maxStdout = options?.maxStdout ?? MAX_STDOUT;
|
|
84
|
-
this.maxStderr = options?.maxStderr ?? MAX_STDERR;
|
|
85
|
-
}
|
|
86
|
-
exec(command, options) {
|
|
87
|
-
return new Promise((resolve) => {
|
|
88
|
-
const child = execFile("bash", ["-c", command], {
|
|
89
|
-
timeout: options?.timeout ?? 30_000,
|
|
90
|
-
maxBuffer: 1024 * 1024,
|
|
91
|
-
cwd: options?.cwd ?? this.cwd,
|
|
92
|
-
env: options?.env ? { ...process.env, ...options.env } : undefined,
|
|
93
|
-
}, (error, stdout, stderr) => {
|
|
94
|
-
resolve({
|
|
95
|
-
stdout: truncateOutput(stdout, this.maxStdout),
|
|
96
|
-
stderr: truncateOutput(stderr, this.maxStderr),
|
|
97
|
-
exitCode: child.exitCode ?? (error ? 1 : 0),
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// ── Errors ──────────────────────────────────────────────────────────
|
|
104
|
-
export class FileTooLargeError extends Error {
|
|
105
|
-
filePath;
|
|
106
|
-
fileSize;
|
|
107
|
-
maxSize;
|
|
108
|
-
constructor(filePath, fileSize, maxSize) {
|
|
109
|
-
super(`File too large: ${filePath} is ${formatBytes(fileSize)} (limit: ${formatBytes(maxSize)}). ` +
|
|
110
|
-
`Use offset and limit parameters to read a portion of the file, or use grep to search it.`);
|
|
111
|
-
this.filePath = filePath;
|
|
112
|
-
this.fileSize = fileSize;
|
|
113
|
-
this.maxSize = maxSize;
|
|
114
|
-
this.name = "FileTooLargeError";
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// ── Helpers ─────────────────────────────────────────────────────────
|
|
118
|
-
function truncateOutput(text, max) {
|
|
119
|
-
if (text.length <= max)
|
|
120
|
-
return text;
|
|
121
|
-
return text.slice(0, max) + `\n... (truncated, ${text.length - max} chars omitted)`;
|
|
122
|
-
}
|
|
123
|
-
function formatBytes(bytes) {
|
|
124
|
-
if (bytes < 1024)
|
|
125
|
-
return `${bytes} B`;
|
|
126
|
-
if (bytes < 1024 * 1024)
|
|
127
|
-
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
128
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=node.js.map
|