hackwriter 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/AgentExecutor.d.ts.map +1 -1
- package/dist/agent/AgentExecutor.js +19 -4
- package/dist/agent/AgentExecutor.js.map +1 -1
- package/dist/cli.js +87 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +4 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/config/ConfigSchema.d.ts +6 -4
- package/dist/config/ConfigSchema.d.ts.map +1 -1
- package/dist/config/ConfigSchema.js +3 -2
- package/dist/config/ConfigSchema.js.map +1 -1
- package/dist/config/Configuration.d.ts +2 -1
- package/dist/config/Configuration.d.ts.map +1 -1
- package/dist/config/ConfigurationLoader.d.ts.map +1 -1
- package/dist/config/ConfigurationLoader.js +27 -14
- package/dist/config/ConfigurationLoader.js.map +1 -1
- package/dist/config/ProviderRegistry.d.ts.map +1 -1
- package/dist/config/ProviderRegistry.js +1 -11
- package/dist/config/ProviderRegistry.js.map +1 -1
- package/dist/config/constants.d.ts +22 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +30 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/mcp/MCPClient.d.ts +56 -0
- package/dist/mcp/MCPClient.d.ts.map +1 -0
- package/dist/mcp/MCPClient.js +134 -0
- package/dist/mcp/MCPClient.js.map +1 -0
- package/dist/mcp/MCPToolAdapter.d.ts +28 -0
- package/dist/mcp/MCPToolAdapter.d.ts.map +1 -0
- package/dist/mcp/MCPToolAdapter.js +91 -0
- package/dist/mcp/MCPToolAdapter.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/session/SessionManager.d.ts.map +1 -1
- package/dist/session/SessionManager.js +2 -1
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/tools/base/ToolRegistry.d.ts +13 -4
- package/dist/tools/base/ToolRegistry.d.ts.map +1 -1
- package/dist/tools/base/ToolRegistry.js.map +1 -1
- package/dist/tools/file/ListFilesTool.d.ts.map +1 -1
- package/dist/tools/file/ListFilesTool.js +19 -3
- package/dist/tools/file/ListFilesTool.js.map +1 -1
- package/dist/tools/file/ReadFileTool.d.ts.map +1 -1
- package/dist/tools/file/ReadFileTool.js +20 -0
- package/dist/tools/file/ReadFileTool.js.map +1 -1
- package/dist/tools/file/WriteFileTool.d.ts.map +1 -1
- package/dist/tools/file/WriteFileTool.js +15 -0
- package/dist/tools/file/WriteFileTool.js.map +1 -1
- package/dist/tools/hackmd/CreateNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/CreateNoteTool.js +22 -3
- package/dist/tools/hackmd/CreateNoteTool.js.map +1 -1
- package/dist/tools/hackmd/DeleteNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/DeleteNoteTool.js +16 -6
- package/dist/tools/hackmd/DeleteNoteTool.js.map +1 -1
- package/dist/tools/hackmd/UpdateNoteTool.d.ts.map +1 -1
- package/dist/tools/hackmd/UpdateNoteTool.js +29 -10
- package/dist/tools/hackmd/UpdateNoteTool.js.map +1 -1
- package/dist/tools/hackmd/index.d.ts.map +1 -1
- package/dist/tools/hackmd/index.js +0 -13
- package/dist/tools/hackmd/index.js.map +1 -1
- package/dist/ui/shell/CommandRegistry.d.ts +1 -0
- package/dist/ui/shell/CommandRegistry.d.ts.map +1 -1
- package/dist/ui/shell/CommandRegistry.js +97 -0
- package/dist/ui/shell/CommandRegistry.js.map +1 -1
- package/dist/ui/shell/InteractiveShell.d.ts +9 -0
- package/dist/ui/shell/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/shell/InteractiveShell.js +33 -0
- package/dist/ui/shell/InteractiveShell.js.map +1 -1
- package/dist/utils/RateLimiter.d.ts +36 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +62 -0
- package/dist/utils/RateLimiter.js.map +1 -0
- package/dist/utils/retry.d.ts +55 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +97 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-wide constants
|
|
3
|
+
* Centralizes magic strings and configuration values
|
|
4
|
+
*/
|
|
5
|
+
export declare const CONFIG_DIR = ".hackwriter";
|
|
6
|
+
export declare const CONFIG_FILE = "config.json";
|
|
7
|
+
export declare const SESSIONS_DIR = "sessions";
|
|
8
|
+
export declare const MAX_FILE_SIZE: number;
|
|
9
|
+
export declare const MAX_HACKMD_CONTENT_SIZE: number;
|
|
10
|
+
export declare const MAX_FILE_DISPLAY_SIZE: number;
|
|
11
|
+
export declare const MAX_FILES_DISPLAY = 100;
|
|
12
|
+
export declare const DEFAULT_RATE_LIMIT_REQUESTS = 10;
|
|
13
|
+
export declare const DEFAULT_RATE_LIMIT_WINDOW_MS = 60000;
|
|
14
|
+
export declare const DEFAULT_MAX_RETRIES = 3;
|
|
15
|
+
export declare const DEFAULT_RETRY_DELAY_MS = 1000;
|
|
16
|
+
export declare const DEFAULT_MAX_RETRY_DELAY_MS = 30000;
|
|
17
|
+
export declare const DEFAULT_HACKMD_API_URL = "https://api.hackmd.io/v1";
|
|
18
|
+
export declare const DEFAULT_HACKMD_MCP_URL = "https://mcp.hackmd.io/v1";
|
|
19
|
+
export declare const DEFAULT_MODEL = "anthropic-claude-3-5-haiku-latest";
|
|
20
|
+
export declare const DEFAULT_MAX_STEPS_PER_RUN = 100;
|
|
21
|
+
export declare const DEFAULT_MAX_RETRIES_PER_STEP = 3;
|
|
22
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,YAAY,aAAa,CAAC;AAGvC,eAAO,MAAM,aAAa,QAAmB,CAAC;AAC9C,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AACvD,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAGjD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAGrC,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAGlD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAGhD,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AACjE,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AAGjE,eAAO,MAAM,aAAa,sCAAsC,CAAC;AAGjE,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,4BAA4B,IAAI,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-wide constants
|
|
3
|
+
* Centralizes magic strings and configuration values
|
|
4
|
+
*/
|
|
5
|
+
// Directory and file paths
|
|
6
|
+
export const CONFIG_DIR = '.hackwriter';
|
|
7
|
+
export const CONFIG_FILE = 'config.json';
|
|
8
|
+
export const SESSIONS_DIR = 'sessions';
|
|
9
|
+
// File size limits
|
|
10
|
+
export const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB for local files
|
|
11
|
+
export const MAX_HACKMD_CONTENT_SIZE = 5 * 1024 * 1024; // 5MB for HackMD API
|
|
12
|
+
export const MAX_FILE_DISPLAY_SIZE = 1024 * 1024; // 1MB display limit
|
|
13
|
+
// Display limits
|
|
14
|
+
export const MAX_FILES_DISPLAY = 100; // Maximum files to display in list
|
|
15
|
+
// Rate limiting defaults
|
|
16
|
+
export const DEFAULT_RATE_LIMIT_REQUESTS = 10; // requests per window
|
|
17
|
+
export const DEFAULT_RATE_LIMIT_WINDOW_MS = 60000; // 1 minute
|
|
18
|
+
// Retry defaults
|
|
19
|
+
export const DEFAULT_MAX_RETRIES = 3;
|
|
20
|
+
export const DEFAULT_RETRY_DELAY_MS = 1000;
|
|
21
|
+
export const DEFAULT_MAX_RETRY_DELAY_MS = 30000;
|
|
22
|
+
// HackMD API defaults
|
|
23
|
+
export const DEFAULT_HACKMD_API_URL = 'https://api.hackmd.io/v1';
|
|
24
|
+
export const DEFAULT_HACKMD_MCP_URL = 'https://mcp.hackmd.io/v1';
|
|
25
|
+
// Model defaults
|
|
26
|
+
export const DEFAULT_MODEL = 'anthropic-claude-3-5-haiku-latest';
|
|
27
|
+
// Loop control defaults
|
|
28
|
+
export const DEFAULT_MAX_STEPS_PER_RUN = 100;
|
|
29
|
+
export const DEFAULT_MAX_RETRIES_PER_STEP = 3;
|
|
30
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2BAA2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC,mBAAmB;AACnB,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,uBAAuB;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,qBAAqB;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,oBAAoB;AAEtE,iBAAiB;AACjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,mCAAmC;AAEzE,yBAAyB;AACzB,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC,CAAC,sBAAsB;AACrE,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC,CAAC,WAAW;AAE9D,iBAAiB;AACjB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEhD,sBAAsB;AACtB,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAEjE,iBAAiB;AACjB,MAAM,CAAC,MAAM,aAAa,GAAG,mCAAmC,CAAC;AAEjE,wBAAwB;AACxB,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export interface MCPClientConfig {
|
|
2
|
+
serverUrl: string;
|
|
3
|
+
apiToken: string;
|
|
4
|
+
}
|
|
5
|
+
export interface MCPToolDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
inputSchema?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface MCPToolCallResult {
|
|
11
|
+
content: {
|
|
12
|
+
type: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
}[];
|
|
15
|
+
isError?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class MCPClient {
|
|
18
|
+
private client;
|
|
19
|
+
private transport;
|
|
20
|
+
private config;
|
|
21
|
+
private connected;
|
|
22
|
+
constructor(config: MCPClientConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Connect to MCP server
|
|
25
|
+
*/
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Disconnect from MCP server
|
|
29
|
+
*/
|
|
30
|
+
disconnect(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if connected
|
|
33
|
+
*/
|
|
34
|
+
isConnected(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* List available tools from MCP server
|
|
37
|
+
*/
|
|
38
|
+
listTools(): Promise<MCPToolDefinition[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Call a tool on the MCP server
|
|
41
|
+
*/
|
|
42
|
+
callTool(name: string, args?: Record<string, unknown>): Promise<MCPToolCallResult>;
|
|
43
|
+
/**
|
|
44
|
+
* List available resources from MCP server
|
|
45
|
+
*/
|
|
46
|
+
listResources(): Promise<{
|
|
47
|
+
uri: string;
|
|
48
|
+
name?: string;
|
|
49
|
+
mimeType?: string;
|
|
50
|
+
}[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Read a resource from MCP server
|
|
53
|
+
*/
|
|
54
|
+
readResource(uri: string): Promise<string>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=MCPClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPClient.d.ts","sourceRoot":"","sources":["../../src/mcp/MCPClient.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe;IAInC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAa/C;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB5F;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAanF;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
3
|
+
import { Logger } from "../utils/Logger.js";
|
|
4
|
+
import { readFileSync } from "fs";
|
|
5
|
+
import { dirname, join } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf-8"));
|
|
10
|
+
export class MCPClient {
|
|
11
|
+
client = null;
|
|
12
|
+
transport = null;
|
|
13
|
+
config;
|
|
14
|
+
connected = false;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Connect to MCP server
|
|
20
|
+
*/
|
|
21
|
+
async connect() {
|
|
22
|
+
if (this.connected) {
|
|
23
|
+
Logger.debug("MCPClient", "Already connected");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
Logger.debug("MCPClient", `Connecting to ${this.config.serverUrl}`);
|
|
27
|
+
this.transport = new StreamableHTTPClientTransport(new URL(this.config.serverUrl), {
|
|
28
|
+
requestInit: {
|
|
29
|
+
headers: {
|
|
30
|
+
Authorization: `Bearer ${this.config.apiToken}`,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
this.client = new Client({
|
|
35
|
+
name: "hackwriter-cli",
|
|
36
|
+
version: packageJson.version,
|
|
37
|
+
}, {
|
|
38
|
+
capabilities: {},
|
|
39
|
+
});
|
|
40
|
+
await this.client.connect(this.transport);
|
|
41
|
+
this.connected = true;
|
|
42
|
+
Logger.info("MCPClient", "Connected to MCP server");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Disconnect from MCP server
|
|
46
|
+
*/
|
|
47
|
+
async disconnect() {
|
|
48
|
+
if (!this.connected)
|
|
49
|
+
return;
|
|
50
|
+
try {
|
|
51
|
+
if (this.client) {
|
|
52
|
+
await this.client.close();
|
|
53
|
+
this.client = null;
|
|
54
|
+
}
|
|
55
|
+
if (this.transport) {
|
|
56
|
+
await this.transport.close();
|
|
57
|
+
this.transport = null;
|
|
58
|
+
}
|
|
59
|
+
this.connected = false;
|
|
60
|
+
Logger.debug("MCPClient", "Disconnected from MCP server");
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
64
|
+
Logger.warn("MCPClient", `Error during disconnect: ${msg}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if connected
|
|
69
|
+
*/
|
|
70
|
+
isConnected() {
|
|
71
|
+
return this.connected;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List available tools from MCP server
|
|
75
|
+
*/
|
|
76
|
+
async listTools() {
|
|
77
|
+
if (!this.client) {
|
|
78
|
+
throw new Error("Not connected to MCP server");
|
|
79
|
+
}
|
|
80
|
+
const response = await this.client.listTools();
|
|
81
|
+
return (response.tools || []).map((tool) => ({
|
|
82
|
+
name: tool.name,
|
|
83
|
+
description: tool.description,
|
|
84
|
+
inputSchema: tool.inputSchema,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Call a tool on the MCP server
|
|
89
|
+
*/
|
|
90
|
+
async callTool(name, args = {}) {
|
|
91
|
+
if (!this.client) {
|
|
92
|
+
throw new Error("Not connected to MCP server");
|
|
93
|
+
}
|
|
94
|
+
Logger.debug("MCPClient", `Calling tool: ${name}`);
|
|
95
|
+
const response = await this.client.callTool({
|
|
96
|
+
name,
|
|
97
|
+
arguments: args,
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
content: response.content,
|
|
101
|
+
isError: response.isError === true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* List available resources from MCP server
|
|
106
|
+
*/
|
|
107
|
+
async listResources() {
|
|
108
|
+
if (!this.client) {
|
|
109
|
+
throw new Error("Not connected to MCP server");
|
|
110
|
+
}
|
|
111
|
+
const response = await this.client.listResources();
|
|
112
|
+
return (response.resources || []).map((r) => ({
|
|
113
|
+
uri: r.uri,
|
|
114
|
+
name: r.name,
|
|
115
|
+
mimeType: r.mimeType,
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Read a resource from MCP server
|
|
120
|
+
*/
|
|
121
|
+
async readResource(uri) {
|
|
122
|
+
if (!this.client) {
|
|
123
|
+
throw new Error("Not connected to MCP server");
|
|
124
|
+
}
|
|
125
|
+
Logger.debug("MCPClient", `Reading resource: ${uri}`);
|
|
126
|
+
const response = await this.client.readResource({ uri });
|
|
127
|
+
const textContents = response.contents
|
|
128
|
+
.filter((c) => "text" in c)
|
|
129
|
+
.map((c) => c.text)
|
|
130
|
+
.join("\n");
|
|
131
|
+
return textContents;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=MCPClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPClient.js","sourceRoot":"","sources":["../../src/mcp/MCPClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ToolResult, ToolSchema } from "../tools/base/Tool.js";
|
|
2
|
+
import type { MCPClient, MCPToolDefinition } from "./MCPClient.js";
|
|
3
|
+
/**
|
|
4
|
+
* Interface matching Tool abstract class for compatibility
|
|
5
|
+
*/
|
|
6
|
+
export interface ToolLike {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
inputSchema: ToolSchema;
|
|
10
|
+
call(params: Record<string, unknown>): Promise<ToolResult>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Adapter that wraps MCP remote tools to match our local Tool interface
|
|
14
|
+
*/
|
|
15
|
+
export declare class MCPToolAdapter implements ToolLike {
|
|
16
|
+
private mcpClient;
|
|
17
|
+
private toolDef;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly description: string;
|
|
20
|
+
readonly inputSchema: ToolSchema;
|
|
21
|
+
constructor(mcpClient: MCPClient, toolDef: MCPToolDefinition);
|
|
22
|
+
call(params: Record<string, unknown>): Promise<ToolResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Extract a meaningful brief from the response content
|
|
25
|
+
*/
|
|
26
|
+
private extractBrief;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=MCPToolAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPToolAdapter.d.ts","sourceRoot":"","sources":["../../src/mcp/MCPToolAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnE;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAM3C,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IANjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;gBAGvB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,iBAAiB;IAU9B,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA0ChE;;OAEG;IACH,OAAO,CAAC,YAAY;CAyBrB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Logger } from "../utils/Logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter that wraps MCP remote tools to match our local Tool interface
|
|
4
|
+
*/
|
|
5
|
+
export class MCPToolAdapter {
|
|
6
|
+
mcpClient;
|
|
7
|
+
toolDef;
|
|
8
|
+
name;
|
|
9
|
+
description;
|
|
10
|
+
inputSchema;
|
|
11
|
+
constructor(mcpClient, toolDef) {
|
|
12
|
+
this.mcpClient = mcpClient;
|
|
13
|
+
this.toolDef = toolDef;
|
|
14
|
+
this.name = toolDef.name;
|
|
15
|
+
this.description = toolDef.description ?? "";
|
|
16
|
+
this.inputSchema = toolDef.inputSchema ?? {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async call(params) {
|
|
22
|
+
try {
|
|
23
|
+
Logger.debug("MCPToolAdapter", `Calling remote tool: ${this.name}`);
|
|
24
|
+
const response = await this.mcpClient.callTool(this.name, params);
|
|
25
|
+
// Extract text content from MCP response
|
|
26
|
+
const textContent = response.content
|
|
27
|
+
.filter((c) => c.type === "text" && c.text)
|
|
28
|
+
.map((c) => c.text)
|
|
29
|
+
.join("\n");
|
|
30
|
+
if (response.isError) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
output: textContent || "Unknown error",
|
|
34
|
+
message: textContent || "Tool call failed",
|
|
35
|
+
brief: "Error",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Extract a meaningful brief from the response
|
|
39
|
+
const brief = this.extractBrief(textContent);
|
|
40
|
+
return {
|
|
41
|
+
ok: true,
|
|
42
|
+
output: textContent,
|
|
43
|
+
message: "Success",
|
|
44
|
+
brief,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
49
|
+
Logger.error("MCPToolAdapter", `Failed to call ${this.name}: ${message}`);
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
output: message,
|
|
53
|
+
message,
|
|
54
|
+
brief: "Error",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract a meaningful brief from the response content
|
|
60
|
+
*/
|
|
61
|
+
extractBrief(content) {
|
|
62
|
+
// Try to parse as JSON and extract a meaningful field
|
|
63
|
+
try {
|
|
64
|
+
const json = JSON.parse(content);
|
|
65
|
+
// Common fields that make good briefs
|
|
66
|
+
if (json.name)
|
|
67
|
+
return json.name;
|
|
68
|
+
if (json.title)
|
|
69
|
+
return json.title;
|
|
70
|
+
if (json.email)
|
|
71
|
+
return json.email;
|
|
72
|
+
if (json.id)
|
|
73
|
+
return `ID: ${json.id}`;
|
|
74
|
+
if (Array.isArray(json))
|
|
75
|
+
return `${json.length} items`;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Not JSON, try to find first meaningful line
|
|
79
|
+
}
|
|
80
|
+
// Find first non-empty, non-bracket line
|
|
81
|
+
const lines = content.split("\n");
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (trimmed && !["[", "]", "{", "}"].includes(trimmed)) {
|
|
85
|
+
return trimmed.slice(0, 50);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return "Done";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=MCPToolAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPToolAdapter.js","sourceRoot":"","sources":["../../src/mcp/MCPToolAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgD,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,WAAW,CAIxB;WAEW,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAqBzC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;CAuChE"}
|
|
@@ -3,8 +3,9 @@ import * as path from 'path';
|
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import * as crypto from 'crypto';
|
|
5
5
|
import { Logger } from '../utils/Logger.js';
|
|
6
|
+
import { CONFIG_DIR, SESSIONS_DIR } from '../config/constants.js';
|
|
6
7
|
export class SessionManager {
|
|
7
|
-
static sessionsDir = path.join(os.homedir(),
|
|
8
|
+
static sessionsDir = path.join(os.homedir(), CONFIG_DIR, SESSIONS_DIR);
|
|
8
9
|
static async create(workDir) {
|
|
9
10
|
const sessionId = crypto.randomUUID();
|
|
10
11
|
const workDirHash = crypto
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ToolResult, ToolSchema } from './Tool.js';
|
|
2
|
+
/**
|
|
3
|
+
* Interface for tool-like objects (compatible with both Tool class and MCPToolAdapter)
|
|
4
|
+
*/
|
|
5
|
+
export interface ToolLike {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
inputSchema: ToolSchema;
|
|
9
|
+
call(params: Record<string, unknown>): Promise<ToolResult>;
|
|
10
|
+
}
|
|
2
11
|
export declare class ToolRegistry {
|
|
3
12
|
private tools;
|
|
4
|
-
register(tool:
|
|
5
|
-
get(name: string):
|
|
6
|
-
getAll():
|
|
13
|
+
register(tool: ToolLike): void;
|
|
14
|
+
get(name: string): ToolLike | undefined;
|
|
15
|
+
getAll(): ToolLike[];
|
|
7
16
|
getSchemas(): {
|
|
8
17
|
name: string;
|
|
9
18
|
description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolRegistry.d.ts","sourceRoot":"","sources":["../../../src/tools/base/ToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolRegistry.d.ts","sourceRoot":"","sources":["../../../src/tools/base/ToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5D;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA+B;IAE5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvC,MAAM,IAAI,QAAQ,EAAE;IAIpB,UAAU,IAAI;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,OAAO,CAAC;KACvB,EAAE;IAQH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../../src/tools/base/ToolRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../../src/tools/base/ToolRegistry.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE5C,QAAQ,CAAC,IAAc;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,UAAU;QAKR,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListFilesTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ListFilesTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGzE,UAAU,eAAe;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,IAAI,CAAC,eAAe,CAAC;IACtD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,qCAAqC;IACzD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAiB9B;IAEI,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;YAoE1C,SAAS;IAmCvB,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { join, relative } from 'node:path';
|
|
2
|
+
import { join, relative, dirname } from 'node:path';
|
|
3
3
|
import { Tool } from '../base/Tool.js';
|
|
4
|
+
import { MAX_FILES_DISPLAY } from '../../config/constants.js';
|
|
4
5
|
export class ListFilesTool extends Tool {
|
|
5
6
|
name = 'list_files';
|
|
6
7
|
description = 'List files in a local directory';
|
|
@@ -23,12 +24,24 @@ export class ListFilesTool extends Tool {
|
|
|
23
24
|
required: ['directoryPath'],
|
|
24
25
|
};
|
|
25
26
|
async call(params) {
|
|
27
|
+
// Validate directory path
|
|
28
|
+
if (!params.directoryPath || params.directoryPath.trim() === '') {
|
|
29
|
+
return this.error('Directory path cannot be empty', 'Directory path is required', 'Invalid path');
|
|
30
|
+
}
|
|
31
|
+
// Prevent path traversal attacks
|
|
32
|
+
const normalizedPath = dirname(params.directoryPath);
|
|
33
|
+
if (normalizedPath.includes('..')) {
|
|
34
|
+
return this.error('Path traversal is not allowed for security reasons', 'Security violation: path traversal detected', 'Security error');
|
|
35
|
+
}
|
|
26
36
|
try {
|
|
27
37
|
const files = await this.listFiles(params.directoryPath, params.recursive ?? false, params.pattern);
|
|
28
38
|
if (files.length === 0) {
|
|
29
39
|
return this.ok('No files found', 'No files found', 'Empty');
|
|
30
40
|
}
|
|
31
|
-
|
|
41
|
+
// Limit output for very large directories
|
|
42
|
+
const displayFiles = files.slice(0, MAX_FILES_DISPLAY);
|
|
43
|
+
const hasMore = files.length > MAX_FILES_DISPLAY;
|
|
44
|
+
const output = displayFiles
|
|
32
45
|
.map((file, index) => {
|
|
33
46
|
const stats = file.stats;
|
|
34
47
|
const type = stats.isDirectory() ? '📁' : '📄';
|
|
@@ -37,7 +50,10 @@ export class ListFilesTool extends Tool {
|
|
|
37
50
|
` Modified: ${stats.mtime.toLocaleString()}`;
|
|
38
51
|
})
|
|
39
52
|
.join('\n\n');
|
|
40
|
-
|
|
53
|
+
const finalOutput = hasMore
|
|
54
|
+
? `${output}\n\n... and ${files.length - MAX_FILES_DISPLAY} more items (truncated for display)`
|
|
55
|
+
: output;
|
|
56
|
+
return this.ok(finalOutput, `Found ${files.length} items in ${params.directoryPath}`, `${files.length} items`);
|
|
41
57
|
}
|
|
42
58
|
catch (error) {
|
|
43
59
|
const errorMsg = `Failed to list files: ${this.formatError(error)}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListFilesTool.js","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAc,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ListFilesTool.js","sourceRoot":"","sources":["../../../src/tools/file/ListFilesTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ReadFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKzE,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,IAAI,CAAC,cAAc,CAAC;IACpD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,sCAAsC;IAC1D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAS9B;IAEI,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CA0DxD"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Tool } from '../base/Tool.js';
|
|
2
2
|
import { promises as fs } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { MAX_FILE_DISPLAY_SIZE } from '../../config/constants.js';
|
|
3
5
|
export class ReadFileTool extends Tool {
|
|
4
6
|
name = 'read_file';
|
|
5
7
|
description = 'Read the content of a local file';
|
|
@@ -14,9 +16,27 @@ export class ReadFileTool extends Tool {
|
|
|
14
16
|
required: ['filePath'],
|
|
15
17
|
};
|
|
16
18
|
async call(params) {
|
|
19
|
+
// Validate file path
|
|
20
|
+
if (!params.filePath || params.filePath.trim() === '') {
|
|
21
|
+
return this.error('File path cannot be empty', 'File path is required', 'Invalid path');
|
|
22
|
+
}
|
|
23
|
+
// Prevent path traversal attacks
|
|
24
|
+
const normalizedPath = dirname(params.filePath);
|
|
25
|
+
if (normalizedPath.includes('..')) {
|
|
26
|
+
return this.error('Path traversal is not allowed for security reasons', 'Security violation: path traversal detected', 'Security error');
|
|
27
|
+
}
|
|
17
28
|
try {
|
|
18
29
|
const content = await fs.readFile(params.filePath, 'utf-8');
|
|
19
30
|
const stats = await fs.stat(params.filePath);
|
|
31
|
+
// Warn if file is very large
|
|
32
|
+
if (stats.size > MAX_FILE_DISPLAY_SIZE) {
|
|
33
|
+
const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
|
|
34
|
+
return this.ok(`⚠️ File is very large (${sizeMB}MB)\n\n` +
|
|
35
|
+
`**File:** ${params.filePath}\n` +
|
|
36
|
+
`**Size:** ${stats.size} bytes\n` +
|
|
37
|
+
`**Modified:** ${stats.mtime.toLocaleString()}\n\n` +
|
|
38
|
+
`**Content (truncated to 1MB):**\n\`\`\`\n${content.slice(0, MAX_FILE_DISPLAY_SIZE)}\n...\n[truncated]\n\`\`\``, `Read file (truncated): ${params.filePath}`, 'Read (truncated)');
|
|
39
|
+
}
|
|
20
40
|
const output = `**File:** ${params.filePath}\n` +
|
|
21
41
|
`**Size:** ${stats.size} bytes\n` +
|
|
22
42
|
`**Modified:** ${stats.mtime.toLocaleString()}\n\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ReadFileTool.js","sourceRoot":"","sources":["../../../src/tools/file/ReadFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAOlE,MAAM,OAAO,YAAa,SAAQ,IAAoB;IAC3C,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,kCAAkC,CAAC;IACjD,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0BAA0B;aACxC;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,qBAAqB;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,CACf,2BAA2B,EAC3B,uBAAuB,EACvB,cAAc,CACf,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,KAAK,CACf,oDAAoD,EACpD,6CAA6C,EAC7C,gBAAgB,CACjB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE7C,6BAA6B;YAC7B,IAAI,KAAK,CAAC,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC,EAAE,CACZ,0BAA0B,MAAM,SAAS;oBACzC,aAAa,MAAM,CAAC,QAAQ,IAAI;oBAChC,aAAa,KAAK,CAAC,IAAI,UAAU;oBACjC,iBAAiB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM;oBACnD,4CAA4C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,4BAA4B,EAC/G,0BAA0B,MAAM,CAAC,QAAQ,EAAE,EAC3C,kBAAkB,CACnB,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GACV,aAAa,MAAM,CAAC,QAAQ,IAAI;gBAChC,aAAa,KAAK,CAAC,IAAI,UAAU;gBACjC,iBAAiB,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM;gBACnD,yBAAyB,OAAO,UAAU,CAAC;YAE7C,OAAO,IAAI,CAAC,EAAE,CACZ,MAAM,EACN,2BAA2B,MAAM,CAAC,QAAQ,EAAE,EAC5C,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,wBAAwB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,KAAK,CACf,QAAQ,EACR,QAAQ,EACR,aAAa,CACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"WriteFileTool.d.ts","sourceRoot":"","sources":["../../../src/tools/file/WriteFileTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKtE,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,IAAI,CAAC,eAAe,CAAC;IAsB1C,OAAO,CAAC,eAAe;IArBnC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAiB9B;gBAEkB,eAAe,EAAE,eAAe;IAI9C,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;CA0EzD"}
|