@openharness/core 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/providers/node.test.d.ts +2 -0
  3. package/dist/__tests__/providers/node.test.d.ts.map +1 -0
  4. package/dist/__tests__/providers/node.test.js +135 -0
  5. package/dist/__tests__/providers/node.test.js.map +1 -0
  6. package/dist/__tests__/tools/create-bash-tool.test.d.ts +2 -0
  7. package/dist/__tests__/tools/create-bash-tool.test.d.ts.map +1 -0
  8. package/dist/__tests__/tools/create-bash-tool.test.js +25 -0
  9. package/dist/__tests__/tools/create-bash-tool.test.js.map +1 -0
  10. package/dist/__tests__/tools/create-fs-tools.test.d.ts +2 -0
  11. package/dist/__tests__/tools/create-fs-tools.test.d.ts.map +1 -0
  12. package/dist/__tests__/tools/create-fs-tools.test.js +200 -0
  13. package/dist/__tests__/tools/create-fs-tools.test.js.map +1 -0
  14. package/dist/index.d.ts +6 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +5 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/providers/index.d.ts +4 -0
  19. package/dist/providers/index.d.ts.map +1 -0
  20. package/dist/providers/index.js +2 -0
  21. package/dist/providers/index.js.map +1 -0
  22. package/dist/providers/node.d.ts +51 -0
  23. package/dist/providers/node.d.ts.map +1 -0
  24. package/dist/providers/node.js +130 -0
  25. package/dist/providers/node.js.map +1 -0
  26. package/dist/providers/types.d.ts +52 -0
  27. package/dist/providers/types.d.ts.map +1 -0
  28. package/dist/providers/types.js +8 -0
  29. package/dist/providers/types.js.map +1 -0
  30. package/dist/tools/create-bash-tool.d.ts +8 -0
  31. package/dist/tools/create-bash-tool.d.ts.map +1 -0
  32. package/dist/tools/create-bash-tool.js +27 -0
  33. package/dist/tools/create-bash-tool.js.map +1 -0
  34. package/dist/tools/create-fs-tools.d.ts +100 -0
  35. package/dist/tools/create-fs-tools.d.ts.map +1 -0
  36. package/dist/tools/create-fs-tools.js +361 -0
  37. package/dist/tools/create-fs-tools.js.map +1 -0
  38. package/dist/tools/create-local-tools.d.ts +97 -0
  39. package/dist/tools/create-local-tools.d.ts.map +1 -0
  40. package/dist/tools/create-local-tools.js +9 -0
  41. package/dist/tools/create-local-tools.js.map +1 -0
  42. package/package.json +5 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Max Gfeller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/providers/node.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.js","sourceRoot":"","sources":["../../../src/__tests__/providers/node.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-bash-tool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bash-tool.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/create-bash-tool.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-fs-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-fs-tools.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/create-fs-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,200 @@
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
@@ -0,0 +1 @@
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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"}
package/dist/index.d.ts CHANGED
@@ -17,6 +17,10 @@ export { withTurnTracking } from "./middleware/turn-tracking.js";
17
17
  export { withPersistence, type PersistenceConfig } from "./middleware/persistence.js";
18
18
  export { withHooks } from "./middleware/hooks.js";
19
19
  export { Conversation, type ConversationOptions } from "./conversation.js";
20
- export { readFile, writeFile, editFile, listFiles, grep, deleteFile, fsTools, } from "./tools/fs.js";
21
- export { bash, bashTools } from "./tools/bash.js";
20
+ export type { FsProvider, FileStat, DirEntry, ShellProvider, ShellResult, Environment, } from "./providers/types.js";
21
+ export { NodeFsProvider, NodeShellProvider, FileTooLargeError, } from "./providers/node.js";
22
+ export type { NodeFsProviderOptions, NodeShellProviderOptions, } from "./providers/node.js";
23
+ export { createFsTools, type CreateFsToolsOptions } from "./tools/create-fs-tools.js";
24
+ export { createBashTool } from "./tools/create-bash-tool.js";
25
+ export { createLocalTools } from "./tools/create-local-tools.js";
22
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,cAAc,EACd,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAG3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EAGvB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIlF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI3E,OAAO,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,UAAU,EACV,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -33,7 +33,9 @@ export { withPersistence } from "./middleware/persistence.js";
33
33
  export { withHooks } from "./middleware/hooks.js";
34
34
  // ── Conversation ───────────────────────────────────────────────────
35
35
  export { Conversation } from "./conversation.js";
36
- // ── Tools ─────────────────────────────────────────────────────────
37
- export { readFile, writeFile, editFile, listFiles, grep, deleteFile, fsTools, } from "./tools/fs.js";
38
- export { bash, bashTools } from "./tools/bash.js";
36
+ export { NodeFsProvider, NodeShellProvider, FileTooLargeError, } from "./providers/node.js";
37
+ // ── Tool Factories ──────────────────────────────────────────────
38
+ export { createFsTools } from "./tools/create-fs-tools.js";
39
+ export { createBashTool } from "./tools/create-bash-tool.js";
40
+ export { createLocalTools } from "./tools/create-local-tools.js";
39
41
  //# 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":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,aAAa,GAMd,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,uEAAuE;AAEvE,OAAO,EAAgC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAElF,uEAAuE;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE1D,uEAAuE;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAyB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAE3E,qEAAqE;AAErE,OAAO,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,UAAU,EACV,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,aAAa,GAMd,MAAM,qBAAqB,CAAC;AAE7B,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,uEAAuE;AAEvE,OAAO,EAAgC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAElF,uEAAuE;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE1D,uEAAuE;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAyB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAA0B,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAa3E,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAO7B,mEAAmE;AAEnE,OAAO,EAAE,aAAa,EAA6B,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,4 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export { NodeFsProvider, NodeShellProvider, FileTooLargeError } from "./node.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,51 @@
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
@@ -0,0 +1 @@
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"}