@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
@@ -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"}