@openharness/core 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { Agent, ToolDeniedError, type AgentEvent, type TokenUsage, type ToolCallInfo, type ApproveFn, type SubagentEventFn, } from "./agent.js";
2
+ export { connectMCPServers, closeMCPClients, type MCPServerConfig, type MCPConnection, type StdioMCPServer, type HttpMCPServer, type SseMCPServer, } from "./mcp.js";
3
+ export { findInstructions, loadInstructions } from "./instructions.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // ── Agent ────────────────────────────────────────────────────────────
2
+ export { Agent, ToolDeniedError, } from "./agent.js";
3
+ // ── MCP ─────────────────────────────────────────────────────────────
4
+ export { connectMCPServers, closeMCPClients, } from "./mcp.js";
5
+ // ── Instructions ────────────────────────────────────────────────────
6
+ export { findInstructions, loadInstructions } from "./instructions.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Walk from `startDir` up to the filesystem root, returning the first
3
+ * AGENTS.md or CLAUDE.md found. AGENTS.md takes precedence in each directory.
4
+ */
5
+ export declare function findInstructions(startDir?: string): Promise<string | undefined>;
6
+ /**
7
+ * Build the instruction block that gets prepended to the system prompt.
8
+ */
9
+ export declare function loadInstructions(startDir?: string): Promise<string | undefined>;
10
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqBrF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAarF"}
@@ -0,0 +1,46 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ const FILENAMES = ["AGENTS.md", "CLAUDE.md"];
4
+ /**
5
+ * Walk from `startDir` up to the filesystem root, returning the first
6
+ * AGENTS.md or CLAUDE.md found. AGENTS.md takes precedence in each directory.
7
+ */
8
+ export async function findInstructions(startDir) {
9
+ let dir = path.resolve(startDir ?? process.cwd());
10
+ while (true) {
11
+ for (const name of FILENAMES) {
12
+ const candidate = path.join(dir, name);
13
+ try {
14
+ await fs.access(candidate);
15
+ const content = await fs.readFile(candidate, "utf-8");
16
+ return content.trim() || undefined;
17
+ }
18
+ catch {
19
+ // not found, try next
20
+ }
21
+ }
22
+ const parent = path.dirname(dir);
23
+ if (parent === dir)
24
+ break; // reached root
25
+ dir = parent;
26
+ }
27
+ return undefined;
28
+ }
29
+ /**
30
+ * Build the instruction block that gets prepended to the system prompt.
31
+ */
32
+ export async function loadInstructions(startDir) {
33
+ const content = await findInstructions(startDir);
34
+ if (!content)
35
+ return undefined;
36
+ return [
37
+ "The following instructions come from the project's AGENTS.md file.",
38
+ "They were written by the project maintainers and describe project-specific",
39
+ "conventions, preferences, and rules you must follow.",
40
+ "",
41
+ "<agents-md>",
42
+ content,
43
+ "</agents-md>",
44
+ ].join("\n");
45
+ }
46
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAiB;IACtD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAElD,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,CAAC,eAAe;QAC1C,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAiB;IACtD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,OAAO;QACL,oEAAoE;QACpE,4EAA4E;QAC5E,sDAAsD;QACtD,EAAE;QACF,aAAa;QACb,OAAO;QACP,cAAc;KACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { type MCPClient } from "@ai-sdk/mcp";
2
+ import type { ToolSet } from "ai";
3
+ export interface StdioMCPServer {
4
+ type: "stdio";
5
+ command: string;
6
+ args?: string[];
7
+ env?: Record<string, string>;
8
+ cwd?: string;
9
+ }
10
+ export interface HttpMCPServer {
11
+ type: "http";
12
+ url: string;
13
+ headers?: Record<string, string>;
14
+ }
15
+ export interface SseMCPServer {
16
+ type: "sse";
17
+ url: string;
18
+ headers?: Record<string, string>;
19
+ }
20
+ export type MCPServerConfig = StdioMCPServer | HttpMCPServer | SseMCPServer;
21
+ export interface MCPConnection {
22
+ clients: MCPClient[];
23
+ tools: ToolSet;
24
+ }
25
+ /**
26
+ * Connect to one or more MCP servers and return a merged toolset.
27
+ * Tools are namespaced as `serverName_toolName` to avoid collisions.
28
+ *
29
+ * Call `close()` on each client when done.
30
+ */
31
+ export declare function connectMCPServers(servers: Record<string, MCPServerConfig>): Promise<MCPConnection>;
32
+ /**
33
+ * Close all MCP clients gracefully.
34
+ */
35
+ export declare function closeMCPClients(clients: MCPClient[]): Promise<void>;
36
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAIlC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAI5E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACvC,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE"}
package/dist/mcp.js ADDED
@@ -0,0 +1,52 @@
1
+ import { createMCPClient } from "@ai-sdk/mcp";
2
+ /**
3
+ * Connect to one or more MCP servers and return a merged toolset.
4
+ * Tools are namespaced as `serverName_toolName` to avoid collisions.
5
+ *
6
+ * Call `close()` on each client when done.
7
+ */
8
+ export async function connectMCPServers(servers) {
9
+ const clients = [];
10
+ const tools = {};
11
+ const entries = Object.entries(servers);
12
+ const results = await Promise.all(entries.map(async ([name, config]) => {
13
+ const transport = await buildTransport(config);
14
+ const client = await createMCPClient({ transport, name });
15
+ const serverTools = await client.tools();
16
+ return { name, client, serverTools };
17
+ }));
18
+ for (const { name, client, serverTools } of results) {
19
+ clients.push(client);
20
+ for (const [toolName, tool] of Object.entries(serverTools)) {
21
+ const key = entries.length === 1 ? toolName : `${name}_${toolName}`;
22
+ tools[key] = tool;
23
+ }
24
+ }
25
+ return { clients, tools };
26
+ }
27
+ /**
28
+ * Close all MCP clients gracefully.
29
+ */
30
+ export async function closeMCPClients(clients) {
31
+ await Promise.all(clients.map((c) => c.close().catch(() => { })));
32
+ }
33
+ // ── Transport builder ───────────────────────────────────────────────
34
+ async function buildTransport(config) {
35
+ switch (config.type) {
36
+ case "stdio": {
37
+ // Dynamic import — only available in Node.js
38
+ const { Experimental_StdioMCPTransport } = await import("@ai-sdk/mcp/mcp-stdio");
39
+ return new Experimental_StdioMCPTransport({
40
+ command: config.command,
41
+ args: config.args,
42
+ env: config.env,
43
+ cwd: config.cwd,
44
+ });
45
+ }
46
+ case "http":
47
+ return { type: "http", url: config.url, headers: config.headers };
48
+ case "sse":
49
+ return { type: "sse", url: config.url, headers: config.headers };
50
+ }
51
+ }
52
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAkC9D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwC;IAExC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAY,EAAE,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC,CAAC,CACH,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;YACpE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAoB;IACxD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,uEAAuE;AAEvE,KAAK,UAAU,cAAc,CAAC,MAAuB;IACnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,6CAA6C;YAC7C,MAAM,EAAE,8BAA8B,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACjF,OAAO,IAAI,8BAA8B,CAAC;gBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7E,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,KAAc,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const bash: import("ai").Tool<{
2
+ command: string;
3
+ timeout: number;
4
+ }, {
5
+ stdout: string;
6
+ stderr: string;
7
+ exitCode: number;
8
+ }>;
9
+ export declare const bashTools: {
10
+ bash: import("ai").Tool<{
11
+ command: string;
12
+ timeout: number;
13
+ }, {
14
+ stdout: string;
15
+ stderr: string;
16
+ exitCode: number;
17
+ }>;
18
+ };
19
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI;;;;YAmBgB,MAAM;YAAU,MAAM;cAAY,MAAM;EAevE,CAAC;AAOH,eAAO,MAAM,SAAS;;;;;gBAtBW,MAAM;gBAAU,MAAM;kBAAY,MAAM;;CAsBxC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod";
3
+ import { execFile } from "node:child_process";
4
+ export 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 new Promise((resolve) => {
23
+ const child = execFile("bash", ["-c", command], { timeout, maxBuffer: 1024 * 1024, cwd: process.cwd() }, (error, stdout, stderr) => {
24
+ resolve({
25
+ stdout: truncate(stdout, 50000),
26
+ stderr: truncate(stderr, 10000),
27
+ exitCode: child.exitCode ?? (error ? 1 : 0),
28
+ });
29
+ });
30
+ });
31
+ },
32
+ });
33
+ function truncate(text, max) {
34
+ if (text.length <= max)
35
+ return text;
36
+ return text.slice(0, max) + `\n... (truncated, ${text.length - max} chars omitted)`;
37
+ }
38
+ export const bashTools = { bash };
39
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EACT,4CAA4C;QAC5C,mEAAmE;QACnE,gDAAgD;QAChD,mDAAmD;QACnD,+FAA+F;IACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,IAAI,CAAC;aACT,GAAG,CAAC,MAAM,CAAC;aACX,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,OAAO,IAAI,OAAO,CAAuD,CAAC,OAAO,EAAE,EAAE;YACnF,MAAM,KAAK,GAAG,QAAQ,CACpB,MAAM,EACN,CAAC,IAAI,EAAE,OAAO,CAAC,EACf,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EACvD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,OAAO,CAAC;oBACN,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;oBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;oBAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5C,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,qBAAqB,IAAI,CAAC,MAAM,GAAG,GAAG,iBAAiB,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,143 @@
1
+ export declare const readFile: import("ai").Tool<{
2
+ filePath: string;
3
+ offset?: number | undefined;
4
+ limit?: number | undefined;
5
+ }, {
6
+ filePath: string;
7
+ totalLines: number;
8
+ fromLine: number;
9
+ toLine: number;
10
+ content: string;
11
+ }>;
12
+ export declare const writeFile: import("ai").Tool<{
13
+ filePath: string;
14
+ content: string;
15
+ }, {
16
+ filePath: string;
17
+ bytesWritten: number;
18
+ }>;
19
+ export declare const editFile: import("ai").Tool<{
20
+ filePath: string;
21
+ oldString: string;
22
+ newString: string;
23
+ replaceAll: boolean;
24
+ }, {
25
+ error: string;
26
+ filePath: string;
27
+ replacements?: undefined;
28
+ } | {
29
+ filePath: string;
30
+ replacements: number;
31
+ error?: undefined;
32
+ }>;
33
+ export declare const listFiles: import("ai").Tool<{
34
+ dirPath: string;
35
+ recursive: boolean;
36
+ }, {
37
+ dirPath: string;
38
+ count: number;
39
+ entries: {
40
+ name: string;
41
+ type: "file" | "directory";
42
+ }[];
43
+ }>;
44
+ export declare const grep: import("ai").Tool<{
45
+ pattern: string;
46
+ dirPath: string;
47
+ ignoreCase: boolean;
48
+ glob?: string | undefined;
49
+ }, {
50
+ dirPath: string;
51
+ pattern: string;
52
+ matchCount: number;
53
+ matches: {
54
+ file: string;
55
+ line: number;
56
+ content: string;
57
+ }[];
58
+ }>;
59
+ export declare const deleteFile: import("ai").Tool<{
60
+ filePath: string;
61
+ recursive: boolean;
62
+ }, {
63
+ error: string;
64
+ filePath: string;
65
+ deleted?: undefined;
66
+ } | {
67
+ deleted: string;
68
+ error?: undefined;
69
+ filePath?: undefined;
70
+ }>;
71
+ export declare const fsTools: {
72
+ readFile: import("ai").Tool<{
73
+ filePath: string;
74
+ offset?: number | undefined;
75
+ limit?: number | undefined;
76
+ }, {
77
+ filePath: string;
78
+ totalLines: number;
79
+ fromLine: number;
80
+ toLine: number;
81
+ content: string;
82
+ }>;
83
+ writeFile: import("ai").Tool<{
84
+ filePath: string;
85
+ content: string;
86
+ }, {
87
+ filePath: string;
88
+ bytesWritten: number;
89
+ }>;
90
+ editFile: import("ai").Tool<{
91
+ filePath: string;
92
+ oldString: string;
93
+ newString: string;
94
+ replaceAll: boolean;
95
+ }, {
96
+ error: string;
97
+ filePath: string;
98
+ replacements?: undefined;
99
+ } | {
100
+ filePath: string;
101
+ replacements: number;
102
+ error?: undefined;
103
+ }>;
104
+ listFiles: import("ai").Tool<{
105
+ dirPath: string;
106
+ recursive: boolean;
107
+ }, {
108
+ dirPath: string;
109
+ count: number;
110
+ entries: {
111
+ name: string;
112
+ type: "file" | "directory";
113
+ }[];
114
+ }>;
115
+ grep: import("ai").Tool<{
116
+ pattern: string;
117
+ dirPath: string;
118
+ ignoreCase: boolean;
119
+ glob?: string | undefined;
120
+ }, {
121
+ dirPath: string;
122
+ pattern: string;
123
+ matchCount: number;
124
+ matches: {
125
+ file: string;
126
+ line: number;
127
+ content: string;
128
+ }[];
129
+ }>;
130
+ deleteFile: import("ai").Tool<{
131
+ filePath: string;
132
+ recursive: boolean;
133
+ }, {
134
+ error: string;
135
+ filePath: string;
136
+ deleted?: undefined;
137
+ } | {
138
+ deleted: string;
139
+ error?: undefined;
140
+ filePath?: undefined;
141
+ }>;
142
+ };
143
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ;;;;;;;;;;EA+BnB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;EAcpB,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;EAiCnB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;EAgCpB,CAAC;AAiBH,eAAO,MAAM,IAAI;;;;;;;;;;cA0BL,MAAM;cACN,MAAM;iBACH,MAAM;;EAyBnB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;EA4BrB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA3DR,MAAM;kBACN,MAAM;qBACH,MAAM;;;;;;;;;;;;;;;CAgEpB,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { readdir } from "node:fs/promises";
6
+ export const readFile = tool({
7
+ description: "Read the contents of a file. Returns the full text content. " +
8
+ "Optionally read a specific line range with offset and limit.",
9
+ inputSchema: z.object({
10
+ filePath: z.string().describe("Absolute or relative path to the file"),
11
+ offset: z
12
+ .number()
13
+ .int()
14
+ .min(0)
15
+ .optional()
16
+ .describe("0-based line offset to start reading from"),
17
+ limit: z.number().int().min(1).optional().describe("Maximum number of lines to return"),
18
+ }),
19
+ execute: async ({ filePath, offset, limit }) => {
20
+ const resolved = path.resolve(filePath);
21
+ const content = await fs.readFile(resolved, "utf-8");
22
+ const lines = content.split("\n");
23
+ const start = offset ?? 0;
24
+ const end = limit !== undefined ? start + limit : lines.length;
25
+ const slice = lines.slice(start, end);
26
+ return {
27
+ filePath: resolved,
28
+ totalLines: lines.length,
29
+ fromLine: start,
30
+ toLine: Math.min(end, lines.length),
31
+ content: slice.join("\n"),
32
+ };
33
+ },
34
+ });
35
+ export const writeFile = tool({
36
+ description: "Write content to a file. Creates the file (and parent directories) " +
37
+ "if they don't exist, or overwrites the existing file.",
38
+ inputSchema: z.object({
39
+ filePath: z.string().describe("Absolute or relative path to the file"),
40
+ content: z.string().describe("The full content to write"),
41
+ }),
42
+ execute: async ({ filePath, content }) => {
43
+ const resolved = path.resolve(filePath);
44
+ await fs.mkdir(path.dirname(resolved), { recursive: true });
45
+ await fs.writeFile(resolved, content, "utf-8");
46
+ return { filePath: resolved, bytesWritten: Buffer.byteLength(content) };
47
+ },
48
+ });
49
+ export const editFile = tool({
50
+ description: "Edit a file by replacing exact string matches. The oldString must " +
51
+ "appear in the file. Set replaceAll to true to replace every occurrence.",
52
+ inputSchema: z.object({
53
+ filePath: z.string().describe("Absolute or relative path to the file"),
54
+ oldString: z.string().describe("The exact text to find"),
55
+ newString: z.string().describe("The replacement text"),
56
+ replaceAll: z
57
+ .boolean()
58
+ .optional()
59
+ .default(false)
60
+ .describe("Replace all occurrences instead of just the first"),
61
+ }),
62
+ execute: async ({ filePath, oldString, newString, replaceAll }) => {
63
+ const resolved = path.resolve(filePath);
64
+ const content = await fs.readFile(resolved, "utf-8");
65
+ if (!content.includes(oldString)) {
66
+ return { error: "oldString not found in file", filePath: resolved };
67
+ }
68
+ const updated = replaceAll
69
+ ? content.replaceAll(oldString, newString)
70
+ : content.replace(oldString, newString);
71
+ await fs.writeFile(resolved, updated, "utf-8");
72
+ const occurrences = content.split(oldString).length - 1;
73
+ const replacements = replaceAll ? occurrences : 1;
74
+ return { filePath: resolved, replacements };
75
+ },
76
+ });
77
+ export const listFiles = tool({
78
+ description: "List files and directories at the given path. " +
79
+ "Set recursive to true to walk subdirectories.",
80
+ inputSchema: z.object({
81
+ dirPath: z
82
+ .string()
83
+ .optional()
84
+ .default(".")
85
+ .describe("Directory path to list (defaults to cwd)"),
86
+ recursive: z.boolean().optional().default(false).describe("Recursively list all entries"),
87
+ }),
88
+ execute: async ({ dirPath, recursive }) => {
89
+ const resolved = path.resolve(dirPath);
90
+ const entries = await readdir(resolved, {
91
+ withFileTypes: true,
92
+ recursive,
93
+ });
94
+ const items = entries.map((e) => ({
95
+ name: recursive ? path.join(e.parentPath ?? "", e.name) : e.name,
96
+ type: e.isDirectory() ? "directory" : "file",
97
+ }));
98
+ // Make paths relative to the listed directory
99
+ const result = items.map((item) => ({
100
+ ...item,
101
+ name: path.relative(resolved, path.resolve(resolved, item.name)),
102
+ }));
103
+ return { dirPath: resolved, count: result.length, entries: result };
104
+ },
105
+ });
106
+ async function walkFiles(dir) {
107
+ const files = [];
108
+ const entries = await readdir(dir, { withFileTypes: true });
109
+ for (const entry of entries) {
110
+ const full = path.join(dir, entry.name);
111
+ if (entry.isDirectory()) {
112
+ if (entry.name === "node_modules" || entry.name === ".git")
113
+ continue;
114
+ files.push(...(await walkFiles(full)));
115
+ }
116
+ else {
117
+ files.push(full);
118
+ }
119
+ }
120
+ return files;
121
+ }
122
+ export const grep = tool({
123
+ description: "Search file contents with a regex pattern. Searches recursively " +
124
+ "from the given directory, skipping node_modules and .git. " +
125
+ "Returns matching lines with file paths and line numbers.",
126
+ inputSchema: z.object({
127
+ pattern: z.string().describe("Regex pattern to search for"),
128
+ dirPath: z
129
+ .string()
130
+ .optional()
131
+ .default(".")
132
+ .describe("Root directory to search from (defaults to cwd)"),
133
+ glob: z
134
+ .string()
135
+ .optional()
136
+ .describe("Only search files matching this glob suffix (e.g. '.ts')"),
137
+ ignoreCase: z.boolean().optional().default(false).describe("Case-insensitive matching"),
138
+ }),
139
+ execute: async ({ pattern, dirPath, glob: fileSuffix, ignoreCase }) => {
140
+ const resolved = path.resolve(dirPath);
141
+ const regex = new RegExp(pattern, ignoreCase ? "i" : undefined);
142
+ const allFiles = await walkFiles(resolved);
143
+ const files = fileSuffix ? allFiles.filter((f) => f.endsWith(fileSuffix)) : allFiles;
144
+ const matches = [];
145
+ for (const file of files) {
146
+ let content;
147
+ try {
148
+ content = await fs.readFile(file, "utf-8");
149
+ }
150
+ catch {
151
+ continue; // skip binary / unreadable files
152
+ }
153
+ const lines = content.split("\n");
154
+ for (let i = 0; i < lines.length; i++) {
155
+ if (regex.test(lines[i])) {
156
+ matches.push({
157
+ file: path.relative(resolved, file),
158
+ line: i + 1,
159
+ content: lines[i],
160
+ });
161
+ }
162
+ }
163
+ }
164
+ return { dirPath: resolved, pattern, matchCount: matches.length, matches };
165
+ },
166
+ });
167
+ export const deleteFile = tool({
168
+ description: "Delete a file or directory. For directories, set recursive to true.",
169
+ inputSchema: z.object({
170
+ filePath: z.string().describe("Path to the file or directory to delete"),
171
+ recursive: z
172
+ .boolean()
173
+ .optional()
174
+ .default(false)
175
+ .describe("Recursively delete directory contents"),
176
+ }),
177
+ execute: async ({ filePath, recursive }) => {
178
+ const resolved = path.resolve(filePath);
179
+ const stat = await fs.stat(resolved);
180
+ if (stat.isDirectory()) {
181
+ if (!recursive) {
182
+ return {
183
+ error: "Path is a directory. Set recursive to true to delete it.",
184
+ filePath: resolved,
185
+ };
186
+ }
187
+ await fs.rm(resolved, { recursive: true });
188
+ }
189
+ else {
190
+ await fs.unlink(resolved);
191
+ }
192
+ return { deleted: resolved };
193
+ },
194
+ });
195
+ export const fsTools = {
196
+ readFile,
197
+ writeFile,
198
+ editFile,
199
+ listFiles,
200
+ grep,
201
+ deleteFile,
202
+ };
203
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"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"}