@openharness/core 0.4.4 → 0.5.0

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 (61) hide show
  1. package/dist/__tests__/conversation.test.js +81 -0
  2. package/dist/__tests__/conversation.test.js.map +1 -1
  3. package/dist/__tests__/middleware/compaction.test.js +105 -0
  4. package/dist/__tests__/middleware/compaction.test.js.map +1 -1
  5. package/dist/__tests__/middleware/hooks.test.js +68 -0
  6. package/dist/__tests__/middleware/hooks.test.js.map +1 -1
  7. package/dist/__tests__/middleware/persistence.test.js +19 -0
  8. package/dist/__tests__/middleware/persistence.test.js.map +1 -1
  9. package/dist/__tests__/middleware/retry.test.js +67 -0
  10. package/dist/__tests__/middleware/retry.test.js.map +1 -1
  11. package/dist/__tests__/middleware/turn-tracking.test.js +23 -0
  12. package/dist/__tests__/middleware/turn-tracking.test.js.map +1 -1
  13. package/dist/__tests__/providers/node.test.d.ts +2 -0
  14. package/dist/__tests__/providers/node.test.d.ts.map +1 -0
  15. package/dist/__tests__/providers/node.test.js +135 -0
  16. package/dist/__tests__/providers/node.test.js.map +1 -0
  17. package/dist/__tests__/runner.test.js +37 -0
  18. package/dist/__tests__/runner.test.js.map +1 -1
  19. package/dist/__tests__/stream.test.js +46 -0
  20. package/dist/__tests__/stream.test.js.map +1 -1
  21. package/dist/__tests__/tools/create-bash-tool.test.d.ts +2 -0
  22. package/dist/__tests__/tools/create-bash-tool.test.d.ts.map +1 -0
  23. package/dist/__tests__/tools/create-bash-tool.test.js +25 -0
  24. package/dist/__tests__/tools/create-bash-tool.test.js.map +1 -0
  25. package/dist/__tests__/tools/create-fs-tools.test.d.ts +2 -0
  26. package/dist/__tests__/tools/create-fs-tools.test.d.ts.map +1 -0
  27. package/dist/__tests__/tools/create-fs-tools.test.js +200 -0
  28. package/dist/__tests__/tools/create-fs-tools.test.js.map +1 -0
  29. package/dist/__tests__/utils.test.d.ts +2 -0
  30. package/dist/__tests__/utils.test.d.ts.map +1 -0
  31. package/dist/__tests__/utils.test.js +149 -0
  32. package/dist/__tests__/utils.test.js.map +1 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +5 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/providers/index.d.ts +4 -0
  38. package/dist/providers/index.d.ts.map +1 -0
  39. package/dist/providers/index.js +2 -0
  40. package/dist/providers/index.js.map +1 -0
  41. package/dist/providers/node.d.ts +51 -0
  42. package/dist/providers/node.d.ts.map +1 -0
  43. package/dist/providers/node.js +130 -0
  44. package/dist/providers/node.js.map +1 -0
  45. package/dist/providers/types.d.ts +52 -0
  46. package/dist/providers/types.d.ts.map +1 -0
  47. package/dist/providers/types.js +8 -0
  48. package/dist/providers/types.js.map +1 -0
  49. package/dist/tools/create-bash-tool.d.ts +8 -0
  50. package/dist/tools/create-bash-tool.d.ts.map +1 -0
  51. package/dist/tools/create-bash-tool.js +27 -0
  52. package/dist/tools/create-bash-tool.js.map +1 -0
  53. package/dist/tools/create-fs-tools.d.ts +100 -0
  54. package/dist/tools/create-fs-tools.d.ts.map +1 -0
  55. package/dist/tools/create-fs-tools.js +361 -0
  56. package/dist/tools/create-fs-tools.js.map +1 -0
  57. package/dist/tools/create-local-tools.d.ts +97 -0
  58. package/dist/tools/create-local-tools.d.ts.map +1 -0
  59. package/dist/tools/create-local-tools.js +9 -0
  60. package/dist/tools/create-local-tools.js.map +1 -0
  61. package/package.json +4 -8
@@ -0,0 +1,149 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { isRetryableError, getRetryDelay, sleep, addUsage, defaultEstimateTokens, } from "../utils.js";
3
+ // ── isRetryableError ────────────────────────────────────────────────
4
+ describe("isRetryableError", () => {
5
+ it.each([
6
+ "429 Too Many Requests",
7
+ "500 Internal Server Error",
8
+ "502 Bad Gateway",
9
+ "503 Service Unavailable",
10
+ "504 Gateway Timeout",
11
+ "529 overloaded",
12
+ ])("returns true for status code error: %s", (msg) => {
13
+ expect(isRetryableError(new Error(msg))).toBe(true);
14
+ });
15
+ it.each([
16
+ "rate limit exceeded",
17
+ "Rate Limit Exceeded",
18
+ "RATE LIMIT hit",
19
+ ])("returns true for rate limit variants: %s", (msg) => {
20
+ expect(isRetryableError(new Error(msg))).toBe(true);
21
+ });
22
+ it.each(["timeout", "TIMEOUT", "connection timeout"])("returns true for timeout: %s", (msg) => {
23
+ expect(isRetryableError(new Error(msg))).toBe(true);
24
+ });
25
+ it("returns true for econnreset", () => {
26
+ expect(isRetryableError(new Error("ECONNRESET"))).toBe(true);
27
+ });
28
+ it("returns true for overloaded", () => {
29
+ expect(isRetryableError(new Error("server overloaded"))).toBe(true);
30
+ });
31
+ it.each([
32
+ "invalid input",
33
+ "authentication failed",
34
+ "404 Not Found",
35
+ "",
36
+ ])("returns false for non-retryable error: %s", (msg) => {
37
+ expect(isRetryableError(new Error(msg))).toBe(false);
38
+ });
39
+ });
40
+ // ── getRetryDelay ───────────────────────────────────────────────────
41
+ describe("getRetryDelay", () => {
42
+ const config = {
43
+ maxRetries: 3,
44
+ initialDelayMs: 1000,
45
+ maxDelayMs: 30_000,
46
+ backoffMultiplier: 2,
47
+ };
48
+ it("returns exponential backoff delay", () => {
49
+ const delay = getRetryDelay(0, config, new Error("429"));
50
+ // base = 1000 * 2^0 = 1000, jitter up to 300
51
+ expect(delay).toBeGreaterThanOrEqual(1000);
52
+ expect(delay).toBeLessThanOrEqual(1300);
53
+ });
54
+ it("increases delay with attempt number", () => {
55
+ // We need to control jitter for this test, so just check the base increases
56
+ const delay0 = getRetryDelay(0, config, new Error("429"));
57
+ // Attempt 2: base = 1000 * 2^2 = 4000
58
+ const delay2 = getRetryDelay(2, config, new Error("429"));
59
+ // delay2's minimum (4000) should be higher than delay0's max (1300)
60
+ expect(delay2).toBeGreaterThanOrEqual(4000);
61
+ });
62
+ it("caps at maxDelayMs", () => {
63
+ const delay = getRetryDelay(10, config, new Error("429"));
64
+ expect(delay).toBeLessThanOrEqual(config.maxDelayMs);
65
+ });
66
+ it("uses Retry-After header when present", () => {
67
+ const error = new Error("429");
68
+ error.headers = { "retry-after": "5" };
69
+ const delay = getRetryDelay(0, config, error);
70
+ expect(delay).toBe(5000);
71
+ });
72
+ it("caps Retry-After at maxDelayMs", () => {
73
+ const error = new Error("429");
74
+ error.headers = { "retry-after": "60" };
75
+ const delay = getRetryDelay(0, config, error);
76
+ expect(delay).toBe(config.maxDelayMs);
77
+ });
78
+ });
79
+ // ── sleep ───────────────────────────────────────────────────────────
80
+ describe("sleep", () => {
81
+ it("resolves after the specified delay", async () => {
82
+ const start = Date.now();
83
+ await sleep(50);
84
+ expect(Date.now() - start).toBeGreaterThanOrEqual(40);
85
+ });
86
+ it("rejects immediately if signal is already aborted", async () => {
87
+ const controller = new AbortController();
88
+ controller.abort("cancelled");
89
+ await expect(sleep(1000, controller.signal)).rejects.toBe("cancelled");
90
+ });
91
+ it("rejects when signal is aborted during sleep", async () => {
92
+ const controller = new AbortController();
93
+ const promise = sleep(5000, controller.signal);
94
+ setTimeout(() => controller.abort("stopped"), 10);
95
+ await expect(promise).rejects.toBe("stopped");
96
+ });
97
+ it("works without a signal", async () => {
98
+ await sleep(1); // should not throw
99
+ });
100
+ });
101
+ // ── addUsage ────────────────────────────────────────────────────────
102
+ describe("addUsage", () => {
103
+ it("adds two usages together", () => {
104
+ const result = addUsage({ inputTokens: 10, outputTokens: 5, totalTokens: 15 }, { inputTokens: 20, outputTokens: 10, totalTokens: 30 });
105
+ expect(result).toEqual({
106
+ inputTokens: 30,
107
+ outputTokens: 15,
108
+ totalTokens: 45,
109
+ });
110
+ });
111
+ it("treats undefined as 0", () => {
112
+ const result = addUsage({ inputTokens: undefined, outputTokens: undefined, totalTokens: undefined }, { inputTokens: 10, outputTokens: 5, totalTokens: 15 });
113
+ expect(result).toEqual({
114
+ inputTokens: 10,
115
+ outputTokens: 5,
116
+ totalTokens: 15,
117
+ });
118
+ });
119
+ it("handles both sides undefined", () => {
120
+ const result = addUsage({ inputTokens: undefined, outputTokens: undefined, totalTokens: undefined }, { inputTokens: undefined, outputTokens: undefined, totalTokens: undefined });
121
+ expect(result).toEqual({
122
+ inputTokens: 0,
123
+ outputTokens: 0,
124
+ totalTokens: 0,
125
+ });
126
+ });
127
+ });
128
+ // ── defaultEstimateTokens ───────────────────────────────────────────
129
+ describe("defaultEstimateTokens", () => {
130
+ it("estimates based on JSON length / 4", () => {
131
+ const messages = [{ role: "user", content: "hello" }];
132
+ const json = JSON.stringify(messages);
133
+ expect(defaultEstimateTokens(messages)).toBe(Math.ceil(json.length / 4));
134
+ });
135
+ it("returns 0 for empty array", () => {
136
+ // JSON.stringify([]) = "[]" = 2 chars => ceil(2/4) = 1
137
+ expect(defaultEstimateTokens([])).toBe(1);
138
+ });
139
+ it("handles complex nested messages", () => {
140
+ const messages = [
141
+ { role: "user", content: [{ type: "text", text: "hello" }] },
142
+ { role: "assistant", content: "world" },
143
+ ];
144
+ const result = defaultEstimateTokens(messages);
145
+ expect(result).toBeGreaterThan(0);
146
+ expect(result).toBe(Math.ceil(JSON.stringify(messages).length / 4));
147
+ });
148
+ });
149
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -17,4 +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 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";
20
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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -33,4 +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
+ 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";
36
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"}
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"}
@@ -0,0 +1,130 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/providers/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface FileStat {
2
+ isFile: boolean;
3
+ isDirectory: boolean;
4
+ size: number;
5
+ }
6
+ export interface DirEntry {
7
+ name: string;
8
+ isFile: boolean;
9
+ isDirectory: boolean;
10
+ }
11
+ export interface FsProvider {
12
+ /** Read a file's full text content. Should throw if the file exceeds a reasonable size limit. */
13
+ readFile(path: string): Promise<string>;
14
+ /** Write text content to a file, creating parent directories as needed. */
15
+ writeFile(path: string, content: string): Promise<void>;
16
+ /** Check whether a path exists. */
17
+ exists(path: string): Promise<boolean>;
18
+ /** Get file/directory metadata. */
19
+ stat(path: string): Promise<FileStat>;
20
+ /** List entries in a single directory (non-recursive). */
21
+ readdir(path: string): Promise<DirEntry[]>;
22
+ /** Create a directory. When recursive is true, create parent directories as needed. */
23
+ mkdir(path: string, options?: {
24
+ recursive?: boolean;
25
+ }): Promise<void>;
26
+ /** Remove a file or directory. When recursive is true, remove directory contents. */
27
+ remove(path: string, options?: {
28
+ recursive?: boolean;
29
+ }): Promise<void>;
30
+ /** Rename or move a file/directory. */
31
+ rename(oldPath: string, newPath: string): Promise<void>;
32
+ /** Resolve a relative path to an absolute path within this provider's context. */
33
+ resolvePath(path: string): string;
34
+ }
35
+ export interface ShellResult {
36
+ stdout: string;
37
+ stderr: string;
38
+ exitCode: number;
39
+ }
40
+ export interface ShellProvider {
41
+ /** Execute a shell command and return its output. */
42
+ exec(command: string, options?: {
43
+ timeout?: number;
44
+ cwd?: string;
45
+ env?: Record<string, string>;
46
+ }): Promise<ShellResult>;
47
+ }
48
+ export interface Environment {
49
+ fs: FsProvider;
50
+ shell: ShellProvider;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExC,2EAA2E;IAC3E,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,mCAAmC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvC,mCAAmC;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,0DAA0D;IAC1D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE3C,uFAAuF;IACvF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE,qFAAqF;IACrF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,uCAAuC;IACvC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,kFAAkF;IAClF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAID,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,CACF,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,GACA,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB;AAID,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;CACtB"}
@@ -0,0 +1,8 @@
1
+ // ── Provider Interfaces ─────────────────────────────────────────────
2
+ //
3
+ // These interfaces define the contract for environment providers.
4
+ // Providers supply filesystem and shell access that tools consume.
5
+ // Implementations exist for Node.js (built-in), and can be created
6
+ // for VFS, E2B, Cloudflare Sandboxes, Daytona, etc.
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,mEAAmE;AACnE,oDAAoD"}
@@ -0,0 +1,8 @@
1
+ import type { ShellProvider } from "../providers/types.js";
2
+ export declare function createBashTool(shell: ShellProvider): {
3
+ bash: import("ai").Tool<{
4
+ command: string;
5
+ timeout: number;
6
+ }, import("../providers/types.js").ShellResult>;
7
+ };
8
+ //# sourceMappingURL=create-bash-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bash-tool.d.ts","sourceRoot":"","sources":["../../src/tools/create-bash-tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa;;;;;EAyBlD"}
@@ -0,0 +1,27 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod";
3
+ export function createBashTool(shell) {
4
+ const bash = tool({
5
+ description: "Run a bash command and return its output. " +
6
+ "Use this for git operations, running tests, installing packages, " +
7
+ "building projects, and any other shell tasks. " +
8
+ "Commands run in the project's working directory. " +
9
+ "Prefer dedicated file tools (readFile, writeFile, etc.) over shell equivalents (cat, echo >).",
10
+ inputSchema: z.object({
11
+ command: z.string().describe("The bash command to execute"),
12
+ timeout: z
13
+ .number()
14
+ .int()
15
+ .min(1000)
16
+ .max(300000)
17
+ .optional()
18
+ .default(30000)
19
+ .describe("Timeout in milliseconds (default 30s, max 5min)"),
20
+ }),
21
+ execute: async ({ command, timeout }) => {
22
+ return shell.exec(command, { timeout });
23
+ },
24
+ });
25
+ return { bash };
26
+ }
27
+ //# sourceMappingURL=create-bash-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bash-tool.js","sourceRoot":"","sources":["../../src/tools/create-bash-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC;QAChB,WAAW,EACT,4CAA4C;YAC5C,mEAAmE;YACnE,gDAAgD;YAChD,mDAAmD;YACnD,+FAA+F;QACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC3D,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,IAAI,CAAC;iBACT,GAAG,CAAC,MAAM,CAAC;iBACX,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,iDAAiD,CAAC;SAC/D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YACtC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,100 @@
1
+ import type { FsProvider } from "../providers/types.js";
2
+ export interface CreateFsToolsOptions {
3
+ /** Maximum output size in bytes. Defaults to 50 KB. */
4
+ maxOutputBytes?: number;
5
+ /** Maximum number of lines returned by readFile. Defaults to 2000. */
6
+ maxLines?: number;
7
+ /** Maximum characters per line before truncation. Defaults to 2000. */
8
+ maxLineLength?: number;
9
+ }
10
+ export declare function createFsTools(fs: FsProvider, options?: CreateFsToolsOptions): {
11
+ readFile: import("ai").Tool<{
12
+ filePath: string;
13
+ offset?: number | undefined;
14
+ limit?: number | undefined;
15
+ }, {
16
+ error: string;
17
+ filePath?: undefined;
18
+ totalLines?: undefined;
19
+ fromLine?: undefined;
20
+ toLine?: undefined;
21
+ status?: undefined;
22
+ content?: undefined;
23
+ } | {
24
+ error: string;
25
+ filePath: string;
26
+ totalLines?: undefined;
27
+ fromLine?: undefined;
28
+ toLine?: undefined;
29
+ status?: undefined;
30
+ content?: undefined;
31
+ } | {
32
+ filePath: string;
33
+ totalLines: number;
34
+ fromLine: number;
35
+ toLine: number;
36
+ status: string;
37
+ content: string;
38
+ error?: undefined;
39
+ }>;
40
+ writeFile: import("ai").Tool<{
41
+ filePath: string;
42
+ content: string;
43
+ }, {
44
+ filePath: string;
45
+ bytesWritten: number;
46
+ }>;
47
+ editFile: import("ai").Tool<{
48
+ filePath: string;
49
+ oldString: string;
50
+ newString: string;
51
+ replaceAll: boolean;
52
+ }, {
53
+ error: string;
54
+ filePath: string;
55
+ replacements?: undefined;
56
+ } | {
57
+ filePath: string;
58
+ replacements: number;
59
+ error?: undefined;
60
+ }>;
61
+ listFiles: import("ai").Tool<{
62
+ dirPath: string;
63
+ recursive: boolean;
64
+ }, {
65
+ dirPath: string;
66
+ count: number;
67
+ entries: {
68
+ name: string;
69
+ type: "file" | "directory";
70
+ }[];
71
+ }>;
72
+ grep: import("ai").Tool<{
73
+ pattern: string;
74
+ dirPath: string;
75
+ ignoreCase: boolean;
76
+ glob?: string | undefined;
77
+ }, {
78
+ dirPath: string;
79
+ pattern: string;
80
+ matchCount: number;
81
+ matches: {
82
+ file: string;
83
+ line: number;
84
+ content: string;
85
+ }[];
86
+ }>;
87
+ deleteFile: import("ai").Tool<{
88
+ filePath: string;
89
+ recursive: boolean;
90
+ }, {
91
+ error: string;
92
+ filePath: string;
93
+ deleted?: undefined;
94
+ } | {
95
+ deleted: string;
96
+ error?: undefined;
97
+ filePath?: undefined;
98
+ }>;
99
+ };
100
+ //# sourceMappingURL=create-fs-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-fs-tools.d.ts","sourceRoot":"","sources":["../../src/tools/create-fs-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,uBAAuB,CAAC;AA+DlE,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8KnD,MAAM;kBAAQ,MAAM,GAAG,WAAW;;;;;;;;;;;;;kBA+C9B,MAAM;kBAAQ,MAAM;qBAAW,MAAM;;;;;;;;;;;;;;;EAuDjE"}