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.
Files changed (62) hide show
  1. package/README.md +6 -0
  2. package/build/main/index.d.ts +5 -0
  3. package/build/main/index.js +7 -1
  4. package/build/main/lib/PSAI.d.ts +1 -1
  5. package/build/main/lib/PSAgent.d.ts +11 -0
  6. package/build/main/lib/PSAgent.js +59 -30
  7. package/build/main/lib/PSAgentConfig.d.ts +1 -1
  8. package/build/main/lib/PSAgentLogger.d.ts +7 -0
  9. package/build/main/lib/PSAgentLogger.js +19 -4
  10. package/build/main/lib/jwt.js +3 -1
  11. package/build/main/lib/tools/BraveWebSearchTool.d.ts +11 -0
  12. package/build/main/lib/tools/BraveWebSearchTool.js +89 -0
  13. package/build/main/lib/tools/PSCommandLineTool.d.ts +10 -0
  14. package/build/main/lib/tools/PSCommandLineTool.js +74 -0
  15. package/build/main/lib/tools/PSReadFileTool.d.ts +10 -0
  16. package/build/main/lib/tools/PSReadFileTool.js +68 -0
  17. package/build/main/lib/tools/PSSubAgentTool.js +141 -14
  18. package/build/main/lib/tools/PSWriteFileTool.d.ts +10 -0
  19. package/build/main/lib/tools/PSWriteFileTool.js +74 -0
  20. package/build/main/lib/tools/ReadFileTool.d.ts +10 -0
  21. package/build/main/lib/tools/ReadFileTool.js +68 -0
  22. package/build/main/lib/tools/TodoTool.d.ts +57 -0
  23. package/build/main/lib/tools/TodoTool.js +220 -0
  24. package/build/main/lib/tools/WebSearchTool.d.ts +9 -0
  25. package/build/main/lib/tools/WebSearchTool.js +92 -0
  26. package/build/main/lib/tools/WriteFileTool.d.ts +10 -0
  27. package/build/main/lib/tools/WriteFileTool.js +74 -0
  28. package/build/main/lib/utils/helpers.d.ts +4 -0
  29. package/build/main/lib/utils/helpers.js +41 -0
  30. package/build/module/index.d.ts +5 -0
  31. package/build/module/index.js +29 -7
  32. package/build/module/lib/PSAI.d.ts +4 -0
  33. package/build/module/lib/PSAI.js +101 -24
  34. package/build/module/lib/PSAgent.d.ts +21 -10
  35. package/build/module/lib/PSAgent.js +126 -85
  36. package/build/module/lib/PSAgentConfig.d.ts +23 -0
  37. package/build/module/lib/PSAgentConfig.js +3 -0
  38. package/build/module/lib/PSAgentLogger.d.ts +20 -0
  39. package/build/module/lib/PSAgentLogger.js +51 -0
  40. package/build/module/lib/PSAgentTask.d.ts +12 -0
  41. package/build/module/lib/PSAgentTask.js +33 -0
  42. package/build/module/lib/PSAgentTool.d.ts +56 -0
  43. package/build/module/lib/PSAgentTool.js +91 -0
  44. package/build/module/lib/jwt.d.ts +41 -0
  45. package/build/module/lib/jwt.js +75 -0
  46. package/build/module/lib/tools/BraveWebSearchTool.d.ts +11 -0
  47. package/build/module/lib/tools/BraveWebSearchTool.js +90 -0
  48. package/build/module/lib/tools/PSArtifactTool.d.ts +7 -0
  49. package/build/module/lib/tools/PSArtifactTool.js +79 -0
  50. package/build/module/lib/tools/PSCommandLineTool.d.ts +10 -0
  51. package/build/module/lib/tools/PSCommandLineTool.js +75 -0
  52. package/build/module/lib/tools/PSReadFileTool.d.ts +10 -0
  53. package/build/module/lib/tools/PSReadFileTool.js +68 -0
  54. package/build/module/lib/tools/PSSubAgentTool.d.ts +20 -0
  55. package/build/module/lib/tools/PSSubAgentTool.js +289 -0
  56. package/build/module/lib/tools/PSWriteFileTool.d.ts +10 -0
  57. package/build/module/lib/tools/PSWriteFileTool.js +74 -0
  58. package/build/module/lib/tools/TodoTool.d.ts +57 -0
  59. package/build/module/lib/tools/TodoTool.js +224 -0
  60. package/build/module/lib/utils/helpers.d.ts +4 -0
  61. package/build/module/lib/utils/helpers.js +41 -0
  62. 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: `Use this ${PSSubAgentTool.TOOL_NAME} one or more of sub agents available.
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: `Input: ${JSON.stringify(sa_input.input)}`
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
- resolve({});
145
- // collect results and return
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNTdWJBZ2VudFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTU3ViQWdlbnRUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLCtDQUE0RjtBQUM1Riw2QkFBNkI7QUFHN0IsZ0RBQTZDO0FBSTdDLE1BQWEsbUJBQW1CO0lBQWhDO1FBQ0ksY0FBUyxHQUFzRSxFQUFFLENBQUM7SUE0Q3RGLENBQUM7SUEzQ0csT0FBTyxDQUFDLEtBQTBCO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxFQUFFLENBQUMsU0FBK0IsRUFBRSxRQUE4QztRQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFBLENBQUM7SUFDRixHQUFHLENBQUMsU0FBK0IsRUFBRSxRQUE4QztRQUNqRixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FB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
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
+ }