psadk 1.1.0 → 1.1.1
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/README.md +6 -0
- package/build/main/index.d.ts +5 -0
- package/build/main/index.js +7 -1
- package/build/main/lib/PSAI.d.ts +1 -1
- package/build/main/lib/PSAgent.d.ts +11 -0
- package/build/main/lib/PSAgent.js +59 -30
- package/build/main/lib/PSAgentConfig.d.ts +1 -1
- package/build/main/lib/PSAgentLogger.d.ts +7 -0
- package/build/main/lib/PSAgentLogger.js +19 -4
- package/build/main/lib/jwt.js +3 -1
- package/build/main/lib/tools/BraveWebSearchTool.d.ts +11 -0
- package/build/main/lib/tools/BraveWebSearchTool.js +89 -0
- package/build/main/lib/tools/PSCommandLineTool.d.ts +10 -0
- package/build/main/lib/tools/PSCommandLineTool.js +74 -0
- package/build/main/lib/tools/PSReadFileTool.d.ts +10 -0
- package/build/main/lib/tools/PSReadFileTool.js +68 -0
- package/build/main/lib/tools/PSSubAgentTool.js +141 -14
- package/build/main/lib/tools/PSWriteFileTool.d.ts +10 -0
- package/build/main/lib/tools/PSWriteFileTool.js +74 -0
- package/build/main/lib/tools/ReadFileTool.d.ts +10 -0
- package/build/main/lib/tools/ReadFileTool.js +68 -0
- package/build/main/lib/tools/TodoTool.d.ts +57 -0
- package/build/main/lib/tools/TodoTool.js +220 -0
- package/build/main/lib/tools/WebSearchTool.d.ts +9 -0
- package/build/main/lib/tools/WebSearchTool.js +92 -0
- package/build/main/lib/tools/WriteFileTool.d.ts +10 -0
- package/build/main/lib/tools/WriteFileTool.js +74 -0
- package/build/main/lib/utils/helpers.d.ts +4 -0
- package/build/main/lib/utils/helpers.js +41 -0
- package/build/module/index.d.ts +5 -0
- package/build/module/index.js +29 -7
- package/build/module/lib/PSAI.d.ts +4 -0
- package/build/module/lib/PSAI.js +101 -24
- package/build/module/lib/PSAgent.d.ts +21 -10
- package/build/module/lib/PSAgent.js +126 -85
- package/build/module/lib/PSAgentConfig.d.ts +23 -0
- package/build/module/lib/PSAgentConfig.js +3 -0
- package/build/module/lib/PSAgentLogger.d.ts +20 -0
- package/build/module/lib/PSAgentLogger.js +51 -0
- package/build/module/lib/PSAgentTask.d.ts +12 -0
- package/build/module/lib/PSAgentTask.js +33 -0
- package/build/module/lib/PSAgentTool.d.ts +56 -0
- package/build/module/lib/PSAgentTool.js +91 -0
- package/build/module/lib/jwt.d.ts +41 -0
- package/build/module/lib/jwt.js +75 -0
- package/build/module/lib/tools/BraveWebSearchTool.d.ts +11 -0
- package/build/module/lib/tools/BraveWebSearchTool.js +90 -0
- package/build/module/lib/tools/PSArtifactTool.d.ts +7 -0
- package/build/module/lib/tools/PSArtifactTool.js +79 -0
- package/build/module/lib/tools/PSCommandLineTool.d.ts +10 -0
- package/build/module/lib/tools/PSCommandLineTool.js +75 -0
- package/build/module/lib/tools/PSReadFileTool.d.ts +10 -0
- package/build/module/lib/tools/PSReadFileTool.js +68 -0
- package/build/module/lib/tools/PSSubAgentTool.d.ts +20 -0
- package/build/module/lib/tools/PSSubAgentTool.js +289 -0
- package/build/module/lib/tools/PSWriteFileTool.d.ts +10 -0
- package/build/module/lib/tools/PSWriteFileTool.js +74 -0
- package/build/module/lib/tools/TodoTool.d.ts +57 -0
- package/build/module/lib/tools/TodoTool.js +224 -0
- package/build/module/lib/utils/helpers.d.ts +4 -0
- package/build/module/lib/utils/helpers.js +41 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PSCommandLineTool = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const v4_1 = require("zod/v4");
|
|
7
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
8
|
+
const helpers_1 = require("../utils/helpers");
|
|
9
|
+
class PSCommandLineTool extends PSAgentTool_1.PSAgentTool {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super({
|
|
12
|
+
name: PSCommandLineTool.toolName,
|
|
13
|
+
description: "executes a shell command in the command shell like bash.",
|
|
14
|
+
type: "API",
|
|
15
|
+
local_execution: true,
|
|
16
|
+
hitl: true,
|
|
17
|
+
inputschema: {
|
|
18
|
+
url: "http://localhost/run_commandline",
|
|
19
|
+
method: "POST",
|
|
20
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
21
|
+
command: v4_1.z.string().meta({
|
|
22
|
+
title: "command",
|
|
23
|
+
description: "The command to run in the bash command shell."
|
|
24
|
+
}),
|
|
25
|
+
}).meta({
|
|
26
|
+
title: "run_commandline_request_body",
|
|
27
|
+
description: "The request body parameters for the run_commandline tool.",
|
|
28
|
+
}), { "io": "input" }),
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
this.cwd = options.cwd || process.cwd();
|
|
32
|
+
}
|
|
33
|
+
run(input, log) {
|
|
34
|
+
if (!input.command || typeof input.command !== "string") {
|
|
35
|
+
throw new Error("Invalid command provided.");
|
|
36
|
+
}
|
|
37
|
+
const logger = log || console;
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const command = (0, helpers_1.unEscapeHTML)(input.command);
|
|
40
|
+
try {
|
|
41
|
+
logger.info(`🛠️ Running command: \`${command}\``);
|
|
42
|
+
const output = (0, child_process_1.execSync)(command, { cwd: this.cwd, encoding: 'utf-8' });
|
|
43
|
+
logger.info("```bash\n"
|
|
44
|
+
+ `> ${command}\n`
|
|
45
|
+
+ `${output}\n`
|
|
46
|
+
+ "```\n\n");
|
|
47
|
+
return resolve({
|
|
48
|
+
status: 'success',
|
|
49
|
+
output: output || "Command executed successfully with no output.",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(error);
|
|
54
|
+
const sperr = error;
|
|
55
|
+
if (error instanceof Error) {
|
|
56
|
+
reject(new Error(`Failed to execute command: ${command}. Error: ${error.message}`));
|
|
57
|
+
}
|
|
58
|
+
else if (sperr) {
|
|
59
|
+
if (sperr.stderr !== '' && sperr.stderr !== undefined && sperr.stdout !== undefined) {
|
|
60
|
+
reject(new Error(`${sperr.stderr}\n${sperr.stdout}\nexit code: ${sperr.status}`));
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
reject(new Error(`Failed to execute command: ${command}. Exit code: ${sperr.status}, Error: ${sperr.stderr}`));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
reject(new Error(`Failed to execute command: ${command}. Unknown error.`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.PSCommandLineTool = PSCommandLineTool;
|
|
73
|
+
PSCommandLineTool.toolName = "run_commandline";
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNDb21tYW5kTGluZVRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTQ29tbWFuZExpbmVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUN2RCxpREFBMEQ7QUFFMUQsK0JBQTJCO0FBRzNCLGdEQUE2QztBQUM3Qyw4Q0FBZ0Q7QUFHaEQsTUFBYSxpQkFBa0IsU0FBUSx5QkFBVztJQUdqRCxZQUFZLE9BRVg7UUFDQSxLQUFLLENBQUM7WUFDTCxJQUFJLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtZQUNoQyxXQUFXLEVBQUUsMERBQTBEO1lBQ3ZFLElBQUksRUFBRSxLQUFLO1lBQ1gsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUU7Z0JBQ1osR0FBRyxFQUFFLGtDQUFrQztnQkFDdkMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsV0FBVyxFQUFFLE1BQUMsQ0FBQyxZQUFZLENBQUMsTUFBQyxDQUFDLE1BQU0sQ0FBQztvQkFDcEMsT0FBTyxFQUFFLE1BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLEtBQUssRUFBRSxTQUFTO3dCQUNoQixXQUFXLEVBQUUsK0NBQStDO3FCQUM1RCxDQUFDO2lCQUNGLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsS0FBSyxFQUFFLDhCQUE4QjtvQkFDckMsV0FBVyxFQUFFLDJEQUEyRDtpQkFDeEUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQ3RCO1NBQ0QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ00sR0FBRyxDQUFDLEtBQTBCLEVBQUUsR0FBbUI7UUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVEsRUFBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXO3NCQUNyQixLQUFLLE9BQU8sSUFBSTtzQkFDWixHQUFHLE1BQU0sSUFBSTtzQkFDYixTQUFTLENBQUMsQ0FBQztnQkFFakIsT0FBTyxPQUFPLENBQUM7b0JBQ2QsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLE1BQU0sRUFBRSxNQUFNLElBQUksK0NBQStDO2lCQUNqRSxDQUFDLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxLQUFpQyxDQUFDO2dCQUNwRCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixPQUFPLFlBQVksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckYsQ0FBQztxQkFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNiLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBRyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBRyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBRyxTQUFTLEVBQUUsQ0FBQzt3QkFDOUUsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxnQkFBZ0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDcEYsQ0FBQzs7d0JBQU0sTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixPQUFPLGdCQUFnQixLQUFLLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVILENBQUM7cUJBQU0sQ0FBQztvQkFDRixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsOEJBQThCLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxDQUFDO1lBQ04sQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7QUE3REYsOENBOERDO0FBN0R1QiwwQkFBUSxHQUFHLGlCQUFpQixDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PSAgentLogger } from "../PSAgentLogger";
|
|
2
|
+
import { PSAgentTool } from "../PSAgentTool";
|
|
3
|
+
export declare class PSReadFileTool extends PSAgentTool {
|
|
4
|
+
static readonly toolName = "read_file";
|
|
5
|
+
private paths;
|
|
6
|
+
constructor(options: {
|
|
7
|
+
paths?: string[];
|
|
8
|
+
});
|
|
9
|
+
run(input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PSReadFileTool = void 0;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const v4_1 = require("zod/v4");
|
|
11
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
12
|
+
const helpers_1 = require("../utils/helpers");
|
|
13
|
+
class PSReadFileTool extends PSAgentTool_1.PSAgentTool {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super({
|
|
16
|
+
name: PSReadFileTool.toolName,
|
|
17
|
+
description: "Reads content of a 'file' from the repository identified by 'path'.",
|
|
18
|
+
type: "API",
|
|
19
|
+
local_execution: true,
|
|
20
|
+
hitl: true,
|
|
21
|
+
inputschema: {
|
|
22
|
+
url: `http://localhost/${PSReadFileTool.toolName}`,
|
|
23
|
+
method: "POST",
|
|
24
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
25
|
+
path: v4_1.z.string().meta({
|
|
26
|
+
title: "File_Path",
|
|
27
|
+
description: "The path of the file to be read. This should be a valid file path of files in the repository."
|
|
28
|
+
}),
|
|
29
|
+
}).meta({
|
|
30
|
+
title: `${PSReadFileTool.toolName}_request_body`,
|
|
31
|
+
description: `The request body parameters for the ${PSReadFileTool.toolName} tool.`,
|
|
32
|
+
}), { "io": "input" }),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
this.paths = [];
|
|
36
|
+
this.paths = options.paths || [];
|
|
37
|
+
}
|
|
38
|
+
run(input, log) {
|
|
39
|
+
if (!input.path || typeof input.path !== "string") {
|
|
40
|
+
throw new Error("Invalid file path provided.");
|
|
41
|
+
}
|
|
42
|
+
const logger = log || console;
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const filePath = path_1.default.resolve(...this.paths, input.path);
|
|
45
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
46
|
+
reject(new Error(`File not found at path: ${input.path}`));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const stats = fs_1.default.statSync(filePath); // Ensure the file exists
|
|
50
|
+
if (stats.isFile()) {
|
|
51
|
+
logger.info(`📖 Reading file:\`${input.path}\` ${(0, helpers_1.formatFileSize)(stats.size)}`);
|
|
52
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
53
|
+
// logger.info(`> Read ${stats.size} bytes from file.`);
|
|
54
|
+
return resolve({
|
|
55
|
+
status: 'success',
|
|
56
|
+
content,
|
|
57
|
+
size: stats.size,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
reject(new Error(`Path is not a file: ${input.path}`));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.PSReadFileTool = PSReadFileTool;
|
|
67
|
+
PSReadFileTool.toolName = "read_file";
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNSZWFkRmlsZVRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTUmVhZEZpbGVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUF1RDtBQUN2RCw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBRXhCLCtCQUEyQjtBQUczQixnREFBNkM7QUFDN0MsOENBQWtEO0FBR2xELE1BQWEsY0FBZSxTQUFRLHlCQUFXO0lBRzlDLFlBQVksT0FFWDtRQUNBLEtBQUssQ0FBQztZQUNMLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUTtZQUM3QixXQUFXLEVBQUUscUVBQXFFO1lBQ2xGLElBQUksRUFBRSxLQUFLO1lBQ1gsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUU7Z0JBQ1osR0FBRyxFQUFFLG9CQUFvQixjQUFjLENBQUMsUUFBUSxFQUFFO2dCQUNsRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxXQUFXLEVBQUUsTUFBQyxDQUFDLFlBQVksQ0FBQyxNQUFDLENBQUMsTUFBTSxDQUFDO29CQUNwQyxJQUFJLEVBQUUsTUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDckIsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLFdBQVcsRUFBRSwrRkFBK0Y7cUJBQzVHLENBQUM7aUJBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDUCxLQUFLLEVBQUUsR0FBRyxjQUFjLENBQUMsUUFBUSxlQUFlO29CQUNoRCxXQUFXLEVBQUUsdUNBQXVDLGNBQWMsQ0FBQyxRQUFRLFFBQVE7aUJBQ25GLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUN0QjtTQUNELENBQUMsQ0FBQztRQXZCSSxVQUFLLEdBQWEsRUFBRSxDQUFDO1FBd0I1QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDTSxHQUFHLENBQUMsS0FBMEIsRUFBRSxHQUFtQjtRQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksT0FBTyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsT0FBTztZQUNSLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1lBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEtBQUssQ0FBQyxJQUFJLE1BQU0sSUFBQSx3QkFBYyxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9FLE1BQU0sT0FBTyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQyx3REFBd0Q7Z0JBQzVELE9BQU8sT0FBTyxDQUFDO29CQUNkLE1BQU0sRUFBRSxTQUFTO29CQUNqQixPQUFPO29CQUNQLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOztBQXJERix3Q0FzREM7QUFyRHVCLHVCQUFRLEdBQUcsV0FBVyxBQUFkLENBQWUifQ==
|
|
@@ -60,18 +60,10 @@ class PSSubAgentTool extends PSAgentTool_1.PSAgentTool {
|
|
|
60
60
|
constructor(sub_agents) {
|
|
61
61
|
super({
|
|
62
62
|
name: PSSubAgentTool.TOOL_NAME,
|
|
63
|
-
description:
|
|
64
|
-
List of the sub agents you can invoke are as follows:
|
|
65
|
-
${sub_agents.map(sa => `- ${sa.Name}: ${sa.Description}\n\t* input schema for ${sa.Name} : ${JSON.stringify(sa.InputSchema)}\n`).join("\n")}
|
|
66
|
-
The input is a JSON array with each object in array having the following properties:
|
|
67
|
-
- 'name' (string) - the name of the sub agent to be created or modified.
|
|
68
|
-
- 'input' (object) - the input to the sub agent confirming to its input schema.
|
|
69
|
-
The output will be a JSON array outputs from the agents.`,
|
|
63
|
+
description: generateDescription(sub_agents),
|
|
70
64
|
inputschema: {
|
|
71
65
|
url: `http://localhost/${PSSubAgentTool.TOOL_NAME}`,
|
|
72
66
|
method: "POST",
|
|
73
|
-
//title: `${PSSubAgentTool.TOOL_NAME}_inputs`,
|
|
74
|
-
//description: "Input for Artifact Tool",
|
|
75
67
|
requestBody: {
|
|
76
68
|
type: "object",
|
|
77
69
|
properties: {
|
|
@@ -84,7 +76,7 @@ The output will be a JSON array outputs from the agents.`,
|
|
|
84
76
|
properties: {
|
|
85
77
|
name: {
|
|
86
78
|
type: "string",
|
|
87
|
-
title: "name",
|
|
79
|
+
title: "subagent name",
|
|
88
80
|
description: "The name of the sub agent",
|
|
89
81
|
},
|
|
90
82
|
input: {
|
|
@@ -133,7 +125,7 @@ The output will be a JSON array outputs from the agents.`,
|
|
|
133
125
|
parts: [
|
|
134
126
|
{
|
|
135
127
|
kind: "text",
|
|
136
|
-
text:
|
|
128
|
+
text: JSON.stringify(sa_input.input, null, 2)
|
|
137
129
|
}
|
|
138
130
|
],
|
|
139
131
|
role: "user",
|
|
@@ -141,8 +133,20 @@ The output will be a JSON array outputs from the agents.`,
|
|
|
141
133
|
};
|
|
142
134
|
const reqContext = new server_1.RequestContext(userMessage, taskId, (0, zod_1.uuidv4)().toString());
|
|
143
135
|
console.log(userMessage, taskId, reqContext);
|
|
144
|
-
|
|
145
|
-
|
|
136
|
+
const eventBus = new PSExecutionEventBus();
|
|
137
|
+
sa.execute(reqContext, eventBus).then((result) => {
|
|
138
|
+
console.log(`Sub agent ${sa_input.name} completed with result: ${JSON.stringify(result)}`);
|
|
139
|
+
resolve({
|
|
140
|
+
status: "success",
|
|
141
|
+
output: result
|
|
142
|
+
});
|
|
143
|
+
}).catch((e) => {
|
|
144
|
+
console.error(`Sub agent ${sa_input.name} failed with error: ${e.message}`);
|
|
145
|
+
reject({
|
|
146
|
+
status: "error",
|
|
147
|
+
output: `Sub agent ${sa_input.name} invocation failed with error: ${e.message}`
|
|
148
|
+
});
|
|
149
|
+
});
|
|
146
150
|
}
|
|
147
151
|
catch (e) {
|
|
148
152
|
reject({
|
|
@@ -151,6 +155,20 @@ The output will be a JSON array outputs from the agents.`,
|
|
|
151
155
|
});
|
|
152
156
|
}
|
|
153
157
|
}));
|
|
158
|
+
const results = await Promise.all(agentworkers).then((results) => {
|
|
159
|
+
console.log(`All sub agents completed with results: ${JSON.stringify(results)}`);
|
|
160
|
+
return {
|
|
161
|
+
status: "success",
|
|
162
|
+
output: results
|
|
163
|
+
};
|
|
164
|
+
}).catch((e) => {
|
|
165
|
+
console.error(`One or more sub agents failed with error: ${e.message}`);
|
|
166
|
+
return {
|
|
167
|
+
status: "error",
|
|
168
|
+
output: `One or more sub agents invocation failed with error: ${e.message}`
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
return results;
|
|
154
172
|
}
|
|
155
173
|
return {
|
|
156
174
|
status: "error",
|
|
@@ -160,4 +178,113 @@ The output will be a JSON array outputs from the agents.`,
|
|
|
160
178
|
}
|
|
161
179
|
exports.PSSubAgentTool = PSSubAgentTool;
|
|
162
180
|
PSSubAgentTool.TOOL_NAME = "subagent_tool";
|
|
163
|
-
|
|
181
|
+
function generateDescription(sub_agents) {
|
|
182
|
+
//`Use this ${PSSubAgentTool.TOOL_NAME} one or more of sub agents available.
|
|
183
|
+
const description = `
|
|
184
|
+
Launch a new agent to handle complex, multi-step tasks autonomously.
|
|
185
|
+
|
|
186
|
+
Available agent types and the tools they have access to:
|
|
187
|
+
${sub_agents.map(sa => `- ${sa.Name}: ${sa.Description.replace(/\n/g, '\n ')}\n input schema for ${sa.Name} : ${JSON.stringify(sa.InputSchema)}\n`).join("\n")}
|
|
188
|
+
|
|
189
|
+
The input is a JSON array with each object in array having the following properties:
|
|
190
|
+
- 'name' (string) - the name of the sub agent to be created or modified.
|
|
191
|
+
- 'input' (object) - the input to the sub agent matching to its input schema.
|
|
192
|
+
The output will be a JSON array outputs from the agents.
|
|
193
|
+
|
|
194
|
+
Examples:
|
|
195
|
+
|
|
196
|
+
- <example>
|
|
197
|
+
Context: User wants to add a new feature to the support bot
|
|
198
|
+
user: "I want to add a feature that automatically detects when customers are asking about refunds and processes them"
|
|
199
|
+
assistant: "I'll use the requirements-analyzer agent to analyze this request and create an implementation plan"
|
|
200
|
+
<commentary>
|
|
201
|
+
The user has provided a feature request that needs analysis and planning before implementation.
|
|
202
|
+
</commentary>
|
|
203
|
+
|
|
204
|
+
</example>
|
|
205
|
+
- <example>
|
|
206
|
+
Context: User reports a vague issue
|
|
207
|
+
user: "The bot isn't working properly with some messages"
|
|
208
|
+
assistant: "Let me use the requirements-analyzer agent to explore this issue and determine what clarification is needed"
|
|
209
|
+
<commentary>
|
|
210
|
+
This is a vague issue report that needs exploration and likely clarification from the user.
|
|
211
|
+
</commentary>
|
|
212
|
+
</example>
|
|
213
|
+
- <example>
|
|
214
|
+
Context: User provides a clear, specific task
|
|
215
|
+
user: "Add logging to the message debouncer in start-bot.ts to track when messages are combined"
|
|
216
|
+
assistant: "I'll analyze this request with the requirements-analyzer agent to create an implementation plan"
|
|
217
|
+
<commentary>
|
|
218
|
+
Even clear requests benefit from analysis to ensure proper implementation planning.
|
|
219
|
+
</commentary>
|
|
220
|
+
</example> (Tools: Glob, Grep, LS, ExitPlanMode, Read, NotebookRead, WebFetch, TodoWrite, WebSearch, Bash)
|
|
221
|
+
- playwright-test-engineer: Use this agent when you need to create or improve Playwright E2E tests for web applications. Examples: <example>Context: User has a specification for a login form but hasn't implemented the UI yet. user: 'I need tests for a login form with email, password fields and a submit button that shows validation errors' assistant: 'I'll use the playwright-test-engineer agent to create test-first E2E tests based on your specification' <commentary>Since the user needs Playwright tests written before implementation, use the playwright-test-engineer agent to create semantic, specification-driven tests.</commentary></example> <example>Context: User has implemented a booking form component and wants comprehensive E2E tests. user: 'Here's my BookingForm.tsx component, can you write Playwright tests for it?' assistant: 'I'll analyze your BookingForm component and use the playwright-test-engineer agent to create comprehensive E2E tests' <commentary>Since the user has existing UI code and needs tests, use the playwright-test-engineer agent to inspect the component and write targeted tests.</commentary></example> (Tools: *)
|
|
222
|
+
|
|
223
|
+
When using the subagent tool, you must specify a subagent name parameter to select which agent to use.
|
|
224
|
+
|
|
225
|
+
When NOT to use the Sub Agent tool:
|
|
226
|
+
|
|
227
|
+
- If you want to read a specific file path, use the Read or Glob tool instead of the Agent tool, to find the match more
|
|
228
|
+
quickly
|
|
229
|
+
- If you are searching for a specific class definition like "class Foo", use the Glob tool instead, to find the match
|
|
230
|
+
more quickly
|
|
231
|
+
- If you are searching for code within a specific file or set of 2-3 files, use the Read tool instead of the Agent tool,
|
|
232
|
+
to find the match more quickly
|
|
233
|
+
- Other tasks that are not related to the agent descriptions above
|
|
234
|
+
|
|
235
|
+
Usage notes:
|
|
236
|
+
|
|
237
|
+
1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with
|
|
238
|
+
multiple tool uses
|
|
239
|
+
2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible
|
|
240
|
+
to the user. To show the user the result, you should send a text message back to the user with a concise summary of
|
|
241
|
+
the result.
|
|
242
|
+
3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent
|
|
243
|
+
be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed
|
|
244
|
+
task description for the agent to perform autonomously and you should specify exactly what information the agent
|
|
245
|
+
should return back to you in its final and only message to you.
|
|
246
|
+
4. The agent's outputs should generally be trusted
|
|
247
|
+
5. Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, web fetches,
|
|
248
|
+
etc.), since it is not aware of the user's intent
|
|
249
|
+
6. If the agent description mentions that it should be used proactively, then you should try your best to use it without
|
|
250
|
+
the user having to ask for it first. Use your judgement.
|
|
251
|
+
|
|
252
|
+
Example usage:
|
|
253
|
+
|
|
254
|
+
<example_agent_descriptions>
|
|
255
|
+
"code-reviewer": use this agent after you are done writing a signficant piece of code
|
|
256
|
+
"greeting-responder": use this agent when to respond to user greetings with a friendly joke
|
|
257
|
+
</example_agent_description>
|
|
258
|
+
|
|
259
|
+
<example>
|
|
260
|
+
user: "Please write a function that checks if a number is prime"
|
|
261
|
+
assistant: Sure let me write a function that checks if a number is prime
|
|
262
|
+
assistant: First let me use the Write tool to write a function that checks if a number is prime
|
|
263
|
+
assistant: I'm going to use the Write tool to write the following code:
|
|
264
|
+
<code>
|
|
265
|
+
function isPrime(n) {
|
|
266
|
+
if (n <= 1) return false
|
|
267
|
+
for (let i = 2; i * i <= n; i++) {
|
|
268
|
+
if (n % i === 0) return false
|
|
269
|
+
}
|
|
270
|
+
return true
|
|
271
|
+
}
|
|
272
|
+
</code>
|
|
273
|
+
<commentary>
|
|
274
|
+
Since a signficant piece of code was written and the task was completed, now use the code-reviewer agent to review the code
|
|
275
|
+
</commentary>
|
|
276
|
+
assistant: Now let me use the code-reviewer agent to review the code
|
|
277
|
+
assistant: Uses the Task tool to launch the with the code-reviewer agent
|
|
278
|
+
</example>
|
|
279
|
+
|
|
280
|
+
<example>
|
|
281
|
+
user: "Hello"
|
|
282
|
+
<commentary>
|
|
283
|
+
Since the user is greeting, use the greeting-responder agent to respond with a friendly joke
|
|
284
|
+
</commentary>
|
|
285
|
+
assistant: "I'm going to use the Task tool to launch the with the greeting-responder agent"
|
|
286
|
+
</example>
|
|
287
|
+
`;
|
|
288
|
+
return description;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNTdWJBZ2VudFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTU3ViQWdlbnRUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLCtDQUE0RjtBQUM1Riw2QkFBNkI7QUFHN0IsZ0RBQTZDO0FBSTdDLE1BQWEsbUJBQW1CO0lBQWhDO1FBQ0ksY0FBUyxHQUFzRSxFQUFFLENBQUM7SUE0Q3RGLENBQUM7SUEzQ0csT0FBTyxDQUFDLEtBQTBCO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxFQUFFLENBQUMsU0FBK0IsRUFBRSxRQUE4QztRQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFBLENBQUM7SUFDRixHQUFHLENBQUMsU0FBK0IsRUFBRSxRQUE4QztRQUNqRixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FB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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PSAgentLogger } from "../PSAgentLogger";
|
|
2
|
+
import { PSAgentTool } from "../PSAgentTool";
|
|
3
|
+
export declare class PSWriteFileTool extends PSAgentTool {
|
|
4
|
+
static readonly toolName = "write_file";
|
|
5
|
+
private paths;
|
|
6
|
+
constructor(options: {
|
|
7
|
+
paths?: string[];
|
|
8
|
+
});
|
|
9
|
+
run(input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PSWriteFileTool = void 0;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const v4_1 = require("zod/v4");
|
|
11
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
12
|
+
const helpers_1 = require("../utils/helpers");
|
|
13
|
+
class PSWriteFileTool extends PSAgentTool_1.PSAgentTool {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super({
|
|
16
|
+
name: PSWriteFileTool.toolName,
|
|
17
|
+
description: "Writes content to a file in repository identified by 'path'.",
|
|
18
|
+
type: "API",
|
|
19
|
+
local_execution: true,
|
|
20
|
+
hitl: true,
|
|
21
|
+
inputschema: {
|
|
22
|
+
url: `http://localhost/${PSWriteFileTool.toolName}`,
|
|
23
|
+
method: "POST",
|
|
24
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
25
|
+
path: v4_1.z.string().meta({
|
|
26
|
+
title: "File_Path",
|
|
27
|
+
description: "The path of the file to be write. This should be a valid file path in the repository."
|
|
28
|
+
}),
|
|
29
|
+
content: v4_1.z.string().meta({
|
|
30
|
+
title: "File_Content",
|
|
31
|
+
description: "The content to be written to the file. This should be a valid string content."
|
|
32
|
+
}),
|
|
33
|
+
}).meta({
|
|
34
|
+
title: `${PSWriteFileTool.toolName}_request_body`,
|
|
35
|
+
description: `The request body parameters for the ${PSWriteFileTool.toolName} tool.`,
|
|
36
|
+
}), { "io": "input" }),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
this.paths = [];
|
|
40
|
+
this.paths = options.paths || [];
|
|
41
|
+
}
|
|
42
|
+
run(input, log) {
|
|
43
|
+
if (!input.path || typeof input.path !== "string") {
|
|
44
|
+
throw new Error("Invalid file path provided.");
|
|
45
|
+
}
|
|
46
|
+
const logger = log || console;
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const filePath = path_1.default.resolve(...this.paths, input.path);
|
|
49
|
+
const content = input.content;
|
|
50
|
+
// if (!filePath.startsWith(run.srcDir))
|
|
51
|
+
// filePath = path.join(run.srcDir, lastevent.toolInput.request_body.path);
|
|
52
|
+
try {
|
|
53
|
+
logger.info(`📝 Writing ${(0, helpers_1.formatFileSize)(content.length)} to file:\`${input.path}\``);
|
|
54
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
|
|
55
|
+
fs_1.default.writeFileSync(filePath, (0, helpers_1.unEscapeHTML)(content), 'utf-8');
|
|
56
|
+
// logger.info(`> Wrote ${content.length} bytes to file.`);
|
|
57
|
+
return resolve({
|
|
58
|
+
status: 'success'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof Error) {
|
|
63
|
+
reject(new Error(`Failed to write file at path: ${input.path}. Error: ${error.message}`));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
reject(new Error(`Failed to write file at path: ${input.path}. Unknown error.`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.PSWriteFileTool = PSWriteFileTool;
|
|
73
|
+
PSWriteFileTool.toolName = "write_file";
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNXcml0ZUZpbGVUb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29scy9QU1dyaXRlRmlsZVRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdURBQXVEO0FBQ3ZELDRDQUFvQjtBQUNwQixnREFBd0I7QUFFeEIsK0JBQTJCO0FBRzNCLGdEQUE2QztBQUM3Qyw4Q0FBZ0U7QUFFaEUsTUFBYSxlQUFnQixTQUFRLHlCQUFXO0lBRy9DLFlBQVksT0FFWDtRQUNBLEtBQUssQ0FBQztZQUNMLElBQUksRUFBRSxlQUFlLENBQUMsUUFBUTtZQUM5QixXQUFXLEVBQUUsOERBQThEO1lBQzNFLElBQUksRUFBRSxLQUFLO1lBQ1gsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUU7Z0JBQ1osR0FBRyxFQUFFLG9CQUFvQixlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUNuRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxXQUFXLEVBQUUsTUFBQyxDQUFDLFlBQVksQ0FBQyxNQUFDLENBQUMsTUFBTSxDQUFDO29CQUNwQyxJQUFJLEVBQUUsTUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDckIsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLFdBQVcsRUFBRSx1RkFBdUY7cUJBQ3BHLENBQUM7b0JBQ0YsT0FBTyxFQUFFLE1BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLEtBQUssRUFBRSxjQUFjO3dCQUNyQixXQUFXLEVBQUUsK0VBQStFO3FCQUM1RixDQUFDO2lCQUNGLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsS0FBSyxFQUFFLEdBQUcsZUFBZSxDQUFDLFFBQVEsZUFBZTtvQkFDakQsV0FBVyxFQUFFLHVDQUF1QyxlQUFlLENBQUMsUUFBUSxRQUFRO2lCQUNwRixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDdEI7U0FDRCxDQUFDLENBQUM7UUEzQkksVUFBSyxHQUFhLEVBQUUsQ0FBQztRQTRCNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ00sR0FBRyxDQUFDLEtBQTBCLEVBQUUsR0FBbUI7UUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzlCLHdDQUF3QztZQUN4Qyw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFBLHdCQUFjLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUN0RixZQUFFLENBQUMsU0FBUyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUQsWUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBQSxzQkFBWSxFQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RCwyREFBMkQ7Z0JBQy9ELE9BQU8sT0FBTyxDQUFDO29CQUNkLE1BQU0sRUFBRSxTQUFTO2lCQUNqQixDQUFDLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7b0JBQzVCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLElBQUksWUFBWSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRixDQUFDO3FCQUFNLENBQUM7b0JBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlDQUFpQyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOztBQTFERiwwQ0EyREM7QUExRHVCLHdCQUFRLEdBQUcsWUFBWSxBQUFmLENBQWdCIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentTool } from "./AgentTool";
|
|
2
|
+
import { TaskLogger } from "./TaskLogger";
|
|
3
|
+
export declare class ReadFileTool extends AgentTool {
|
|
4
|
+
static readonly toolName = "read_file";
|
|
5
|
+
private paths;
|
|
6
|
+
constructor(options: {
|
|
7
|
+
paths?: string[];
|
|
8
|
+
});
|
|
9
|
+
execute(input: Record<string, any>, log?: TaskLogger): Promise<Record<string, any>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReadFileTool = void 0;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
|
+
const AgentTool_1 = require("./AgentTool");
|
|
9
|
+
const v4_1 = require("zod/v4");
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const helpers_1 = require("./helpers");
|
|
13
|
+
class ReadFileTool extends AgentTool_1.AgentTool {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super({
|
|
16
|
+
name: ReadFileTool.toolName,
|
|
17
|
+
description: "Reads content of a 'file' from the repository identified by 'path'.",
|
|
18
|
+
type: "API",
|
|
19
|
+
local_execution: true,
|
|
20
|
+
hitl: true,
|
|
21
|
+
inputs: {
|
|
22
|
+
url: `http://localhost/${ReadFileTool.toolName}`,
|
|
23
|
+
method: "POST",
|
|
24
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
25
|
+
path: v4_1.z.string().meta({
|
|
26
|
+
title: "File_Path",
|
|
27
|
+
description: "The path of the file to be read. This should be a valid file path of files in the repository."
|
|
28
|
+
}),
|
|
29
|
+
}).meta({
|
|
30
|
+
title: `${ReadFileTool.toolName}_request_body`,
|
|
31
|
+
description: `The request body parameters for the ${ReadFileTool.toolName} tool.`,
|
|
32
|
+
}), { "io": "input" }),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
this.paths = [];
|
|
36
|
+
this.paths = options.paths || [];
|
|
37
|
+
}
|
|
38
|
+
execute(input, log) {
|
|
39
|
+
if (!input.path || typeof input.path !== "string") {
|
|
40
|
+
throw new Error("Invalid file path provided.");
|
|
41
|
+
}
|
|
42
|
+
const logger = log || console;
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const filePath = path_1.default.resolve(...this.paths, input.path);
|
|
45
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
46
|
+
reject(new Error(`File not found at path: ${input.path}`));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const stats = fs_1.default.statSync(filePath); // Ensure the file exists
|
|
50
|
+
if (stats.isFile()) {
|
|
51
|
+
logger.info(`📖 Reading file:\`${input.path}\` ${(0, helpers_1.formatFileSize)(stats.size)}`);
|
|
52
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
53
|
+
// logger.info(`> Read ${stats.size} bytes from file.`);
|
|
54
|
+
return resolve({
|
|
55
|
+
status: 'success',
|
|
56
|
+
content,
|
|
57
|
+
size: stats.size,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
reject(new Error(`Path is not a file: ${input.path}`));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ReadFileTool = ReadFileTool;
|
|
67
|
+
ReadFileTool.toolName = "read_file";
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhZEZpbGVUb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29scy9SZWFkRmlsZVRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdURBQXVEO0FBQ3ZELDJDQUF3QztBQUN4QywrQkFBMkI7QUFDM0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUV4Qix1Q0FBMkM7QUFFM0MsTUFBYSxZQUFhLFNBQVEscUJBQVM7SUFHMUMsWUFBWSxPQUVYO1FBQ0EsS0FBSyxDQUFDO1lBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxRQUFRO1lBQzNCLFdBQVcsRUFBRSxxRUFBcUU7WUFDbEYsSUFBSSxFQUFFLEtBQUs7WUFDWCxlQUFlLEVBQUUsSUFBSTtZQUNyQixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRTtnQkFDUCxHQUFHLEVBQUUsb0JBQW9CLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hELE1BQU0sRUFBRSxNQUFNO2dCQUNkLFdBQVcsRUFBRSxNQUFDLENBQUMsWUFBWSxDQUFDLE1BQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3BDLElBQUksRUFBRSxNQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUNyQixLQUFLLEVBQUUsV0FBVzt3QkFDbEIsV0FBVyxFQUFFLCtGQUErRjtxQkFDNUcsQ0FBQztpQkFDRixDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNQLEtBQUssRUFBRSxHQUFHLFlBQVksQ0FBQyxRQUFRLGVBQWU7b0JBQzlDLFdBQVcsRUFBRSx1Q0FBdUMsWUFBWSxDQUFDLFFBQVEsUUFBUTtpQkFDakYsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQ3RCO1NBQ0QsQ0FBQyxDQUFDO1FBdkJJLFVBQUssR0FBYSxFQUFFLENBQUM7UUF3QjVCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNNLE9BQU8sQ0FBQyxLQUEwQixFQUFFLEdBQWdCO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDOUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxPQUFPO1lBQ1IsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLFlBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7WUFDOUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxDQUFDLElBQUksTUFBTSxJQUFBLHdCQUFjLEVBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0UsTUFBTSxPQUFPLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLHdEQUF3RDtnQkFDNUQsT0FBTyxPQUFPLENBQUM7b0JBQ2QsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLE9BQU87b0JBQ1AsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNoQixDQUFDLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7O0FBckRGLG9DQXNEQztBQXJEdUIscUJBQVEsR0FBRyxXQUFXLEFBQWQsQ0FBZSJ9
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { PSAgentLogger } from "../PSAgentLogger";
|
|
2
|
+
import { PSAgentTool } from "../PSAgentTool";
|
|
3
|
+
export declare enum TodoStatus {
|
|
4
|
+
PENDING = "pending",
|
|
5
|
+
IN_PROGRESS = "in_progress",
|
|
6
|
+
COMPLETED = "completed"
|
|
7
|
+
}
|
|
8
|
+
export declare enum TodoPriority {
|
|
9
|
+
HIGH = "high",
|
|
10
|
+
MEDIUM = "medium",
|
|
11
|
+
LOW = "low"
|
|
12
|
+
}
|
|
13
|
+
export interface Todo {
|
|
14
|
+
id: string;
|
|
15
|
+
content: string;
|
|
16
|
+
status: TodoStatus;
|
|
17
|
+
priority: TodoPriority;
|
|
18
|
+
created_at: string;
|
|
19
|
+
updated_at: string;
|
|
20
|
+
metadata?: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export declare class TaskStore {
|
|
23
|
+
private lastModified;
|
|
24
|
+
private todos;
|
|
25
|
+
private filename?;
|
|
26
|
+
constructor(todos: Todo[], filename?: string);
|
|
27
|
+
get LastModified(): string;
|
|
28
|
+
get Todos(): Todo[];
|
|
29
|
+
set Todos(todos: Todo[]);
|
|
30
|
+
}
|
|
31
|
+
export interface TodoReadResponse {
|
|
32
|
+
todos: Todo[];
|
|
33
|
+
}
|
|
34
|
+
export interface TodoWriteParams {
|
|
35
|
+
todos: Array<Record<string, any>>;
|
|
36
|
+
}
|
|
37
|
+
export interface TodoWriteResponse {
|
|
38
|
+
success: boolean;
|
|
39
|
+
count: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class PSTodoReadTool extends PSAgentTool {
|
|
42
|
+
static readonly toolName = "read_todo";
|
|
43
|
+
private store;
|
|
44
|
+
constructor(options: {
|
|
45
|
+
store: TaskStore;
|
|
46
|
+
});
|
|
47
|
+
run(_input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
48
|
+
}
|
|
49
|
+
export declare class PSTodoWriteTool extends PSAgentTool {
|
|
50
|
+
static readonly toolName = "write_todo";
|
|
51
|
+
private store;
|
|
52
|
+
constructor(options: {
|
|
53
|
+
store: TaskStore;
|
|
54
|
+
});
|
|
55
|
+
get Todos(): Todo[];
|
|
56
|
+
run(input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
57
|
+
}
|