psadk 1.1.23 → 1.1.24
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/build/main/lib/PSAI.d.ts +1 -1
- package/build/main/lib/PSAI.js +52 -41
- package/build/main/lib/PSAgent.js +1 -1
- package/build/main/lib/PSAgentConfig.d.ts +5 -5
- package/build/main/lib/PSAgentLogger.js +3 -3
- package/build/main/lib/PSAgentTask.js +1 -1
- package/build/main/lib/PSAgentTool.d.ts +4 -4
- package/build/main/lib/PSAgentTool.js +11 -11
- package/build/main/lib/tools/BraveWebSearchTool.d.ts +2 -2
- package/build/main/lib/tools/BraveWebSearchTool.js +20 -18
- package/build/main/lib/tools/PSArtifactTool.d.ts +1 -1
- package/build/main/lib/tools/PSArtifactTool.js +25 -25
- package/build/main/lib/tools/PSCommandLineTool.d.ts +2 -2
- package/build/main/lib/tools/PSCommandLineTool.js +22 -21
- package/build/main/lib/tools/PSMemoryTool.d.ts +2 -2
- package/build/main/lib/tools/PSMemoryTool.js +93 -65
- package/build/main/lib/tools/PSReadFileTool.d.ts +2 -2
- package/build/main/lib/tools/PSReadFileTool.js +13 -11
- package/build/main/lib/tools/PSSubAgentTool.d.ts +4 -4
- package/build/main/lib/tools/PSSubAgentTool.js +50 -47
- package/build/main/lib/tools/TodoTool.d.ts +2 -2
- package/build/main/lib/tools/TodoTool.js +45 -41
- package/build/main/lib/utils/helpers.js +5 -3
- package/build/module/lib/PSAI.d.ts +1 -1
- package/build/module/lib/PSAI.js +53 -42
- package/build/module/lib/PSAgent.js +1 -1
- package/build/module/lib/PSAgentConfig.d.ts +5 -5
- package/build/module/lib/PSAgentLogger.js +3 -3
- package/build/module/lib/PSAgentTask.js +1 -1
- package/build/module/lib/PSAgentTool.d.ts +4 -4
- package/build/module/lib/PSAgentTool.js +11 -11
- package/build/module/lib/tools/BraveWebSearchTool.d.ts +2 -2
- package/build/module/lib/tools/BraveWebSearchTool.js +20 -18
- package/build/module/lib/tools/PSArtifactTool.d.ts +1 -1
- package/build/module/lib/tools/PSArtifactTool.js +25 -25
- package/build/module/lib/tools/PSCommandLineTool.d.ts +2 -2
- package/build/module/lib/tools/PSCommandLineTool.js +22 -21
- package/build/module/lib/tools/PSMemoryTool.d.ts +2 -2
- package/build/module/lib/tools/PSMemoryTool.js +93 -65
- package/build/module/lib/tools/PSReadFileTool.d.ts +2 -2
- package/build/module/lib/tools/PSReadFileTool.js +13 -11
- package/build/module/lib/tools/PSSubAgentTool.d.ts +4 -4
- package/build/module/lib/tools/PSSubAgentTool.js +50 -47
- package/build/module/lib/tools/TodoTool.d.ts +2 -2
- package/build/module/lib/tools/TodoTool.js +45 -41
- package/build/module/lib/utils/helpers.js +5 -3
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import z from
|
|
2
|
-
import { PSAgentLogger } from
|
|
1
|
+
import z from 'zod/v4';
|
|
2
|
+
import { PSAgentLogger } from './PSAgentLogger';
|
|
3
3
|
export interface IPSAgentToolResult {
|
|
4
4
|
error: Error | null;
|
|
5
5
|
result?: Record<string, any>;
|
|
@@ -17,7 +17,7 @@ export declare class PSAgentTool {
|
|
|
17
17
|
private hitl;
|
|
18
18
|
private inputschema;
|
|
19
19
|
private runCallback?;
|
|
20
|
-
constructor({ name, description, type, local_execution, hitl, inputschema, runCallback }: {
|
|
20
|
+
constructor({ name, description, type, local_execution, hitl, inputschema, runCallback, }: {
|
|
21
21
|
name: string;
|
|
22
22
|
description: string;
|
|
23
23
|
type?: string;
|
|
@@ -47,7 +47,7 @@ export declare class PSAgentTool {
|
|
|
47
47
|
get Inputs(): IPSAgentToolInput;
|
|
48
48
|
set Inputs(value: IPSAgentToolInput);
|
|
49
49
|
run(input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
50
|
-
static LocalTool({ name, description, requestschema, runCallback }: {
|
|
50
|
+
static LocalTool({ name, description, requestschema, runCallback, }: {
|
|
51
51
|
name: string;
|
|
52
52
|
description: string;
|
|
53
53
|
requestschema: z.core.JSONSchema.BaseSchema;
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PSAgentTool = void 0;
|
|
4
4
|
class PSAgentTool {
|
|
5
|
-
constructor({ name, description, type =
|
|
5
|
+
constructor({ name, description, type = 'API', local_execution = true, hitl = true, inputschema, runCallback, }) {
|
|
6
6
|
this.name = name;
|
|
7
7
|
this.description = description;
|
|
8
8
|
this.type = type;
|
|
9
9
|
this.local_execution = local_execution;
|
|
10
10
|
this.hitl = {
|
|
11
11
|
required: hitl,
|
|
12
|
-
interrupt:
|
|
13
|
-
level: 0
|
|
12
|
+
interrupt: 'before',
|
|
13
|
+
level: 0,
|
|
14
14
|
};
|
|
15
15
|
this.inputschema = inputschema;
|
|
16
16
|
if (runCallback) {
|
|
17
|
-
if (typeof runCallback !==
|
|
18
|
-
throw new Error(
|
|
17
|
+
if (typeof runCallback !== 'function') {
|
|
18
|
+
throw new Error('executionFn must be a function');
|
|
19
19
|
}
|
|
20
20
|
this.runCallback = runCallback;
|
|
21
21
|
}
|
|
@@ -58,27 +58,27 @@ class PSAgentTool {
|
|
|
58
58
|
}
|
|
59
59
|
run(input, log) {
|
|
60
60
|
if (!this.runCallback) {
|
|
61
|
-
throw new Error(
|
|
61
|
+
throw new Error('run callback function is not defined for this tool');
|
|
62
62
|
}
|
|
63
63
|
return this.runCallback(input, log);
|
|
64
64
|
}
|
|
65
|
-
static LocalTool({ name, description, requestschema, runCallback }) {
|
|
65
|
+
static LocalTool({ name, description, requestschema, runCallback, }) {
|
|
66
66
|
return new PSAgentTool({
|
|
67
67
|
name,
|
|
68
68
|
description,
|
|
69
|
-
type:
|
|
69
|
+
type: 'API',
|
|
70
70
|
local_execution: true,
|
|
71
71
|
hitl: true,
|
|
72
72
|
inputschema: {
|
|
73
73
|
//title: `${name}_inputs.`,
|
|
74
74
|
//description: `Inputs for ${name} tool.`,
|
|
75
75
|
url: `http://localhost/${name}`,
|
|
76
|
-
method:
|
|
76
|
+
method: 'POST',
|
|
77
77
|
requestBody: requestschema,
|
|
78
78
|
},
|
|
79
|
-
runCallback
|
|
79
|
+
runCallback,
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
exports.PSAgentTool = PSAgentTool;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBZ2VudFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL1BTQWdlbnRUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtCQSxNQUFhLFdBQVc7SUFnQnRCLFlBQVksRUFDVixJQUFJLEVBQ0osV0FBVyxFQUNYLElBQUksR0FBRyxLQUFLLEVBQ1osZUFBZSxHQUFHLElBQUksRUFDdEIsSUFBSSxHQUFHLElBQUksRUFDWCxXQUFXLEVBQ1gsV0FBVyxHQVlaO1FBQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRztZQUNWLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLFFBQVE7WUFDbkIsS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFXLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFXLFdBQVcsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQVcsSUFBSSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQVcsY0FBYyxDQUFDLEtBQWM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBVyxJQUFJLENBQUMsS0FJZjtRQUNDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQXdCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFTSxHQUFHLENBQ1IsS0FBMEIsRUFDMUIsR0FBbUI7UUFFbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDdEIsSUFBSSxFQUNKLFdBQVcsRUFDWCxhQUFhLEVBQ2IsV0FBVyxHQVNaO1FBQ0MsT0FBTyxJQUFJLFdBQVcsQ0FBQztZQUNyQixJQUFJO1lBQ0osV0FBVztZQUNYLElBQUksRUFBRSxLQUFLO1lBQ1gsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUU7Z0JBQ1gsMkJBQTJCO2dCQUMzQiwwQ0FBMEM7Z0JBQzFDLEdBQUcsRUFBRSxvQkFBb0IsSUFBSSxFQUFFO2dCQUMvQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxXQUFXLEVBQUUsYUFBYTthQUMzQjtZQUNELFdBQVc7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF0SUQsa0NBc0lDIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PSAgentLogger } from
|
|
2
|
-
import { PSAgentTool } from
|
|
1
|
+
import { PSAgentLogger } from '../PSAgentLogger';
|
|
2
|
+
import { PSAgentTool } from '../PSAgentTool';
|
|
3
3
|
export declare class BraveWebSearchTool extends PSAgentTool {
|
|
4
4
|
static readonly toolName = "search_web_with_brave";
|
|
5
5
|
braveSearchApiKey?: string;
|
|
@@ -8,22 +8,24 @@ class BraveWebSearchTool extends PSAgentTool_1.PSAgentTool {
|
|
|
8
8
|
constructor(options) {
|
|
9
9
|
super({
|
|
10
10
|
name: BraveWebSearchTool.toolName,
|
|
11
|
-
description:
|
|
12
|
-
type:
|
|
11
|
+
description: 'searches the web for the given query.',
|
|
12
|
+
type: 'API',
|
|
13
13
|
local_execution: true,
|
|
14
14
|
hitl: true,
|
|
15
15
|
inputschema: {
|
|
16
16
|
url: `http://localhost/${BraveWebSearchTool.toolName}`,
|
|
17
|
-
method:
|
|
18
|
-
requestBody: v4_1.z.toJSONSchema(v4_1.z
|
|
17
|
+
method: 'POST',
|
|
18
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z
|
|
19
|
+
.object({
|
|
19
20
|
query: v4_1.z.url().meta({
|
|
20
|
-
title:
|
|
21
|
-
description:
|
|
21
|
+
title: 'search query',
|
|
22
|
+
description: 'The query to search the web for.',
|
|
22
23
|
}),
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
})
|
|
25
|
+
.meta({
|
|
26
|
+
title: 'search_request_body',
|
|
27
|
+
description: 'The request body parameters for the search tool.',
|
|
28
|
+
}), { io: 'input' }),
|
|
27
29
|
},
|
|
28
30
|
});
|
|
29
31
|
this.braveSearchApiKey = options.braveSearchApiKey;
|
|
@@ -35,12 +37,12 @@ class BraveWebSearchTool extends PSAgentTool_1.PSAgentTool {
|
|
|
35
37
|
count: '10',
|
|
36
38
|
text_decorations: 'false',
|
|
37
39
|
result_filter: 'web',
|
|
38
|
-
summary: '1'
|
|
40
|
+
summary: '1',
|
|
39
41
|
});
|
|
40
42
|
const response = await fetch(`https://api.search.brave.com/res/v1/web/search?${params}`, {
|
|
41
43
|
method: 'get',
|
|
42
44
|
headers: {
|
|
43
|
-
|
|
45
|
+
Accept: 'application/json',
|
|
44
46
|
'Accept-Encoding': 'gzip',
|
|
45
47
|
'x-subscription-token': this.braveSearchApiKey || process.env.BRAVE_SEARCH_API_KEY || '',
|
|
46
48
|
},
|
|
@@ -56,13 +58,13 @@ class BraveWebSearchTool extends PSAgentTool_1.PSAgentTool {
|
|
|
56
58
|
return output;
|
|
57
59
|
}
|
|
58
60
|
catch (error) {
|
|
59
|
-
console.error(
|
|
61
|
+
console.error('Error in bravewebsearch:', error);
|
|
60
62
|
throw error;
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
run(input, log) {
|
|
64
|
-
if (!input.query || typeof input.query !==
|
|
65
|
-
throw new Error(
|
|
66
|
+
if (!input.query || typeof input.query !== 'string') {
|
|
67
|
+
throw new Error('Invalid query provided.');
|
|
66
68
|
}
|
|
67
69
|
return new Promise((resolve, reject) => {
|
|
68
70
|
try {
|
|
@@ -70,7 +72,7 @@ class BraveWebSearchTool extends PSAgentTool_1.PSAgentTool {
|
|
|
70
72
|
const output = this.bravewebsearch(input.query);
|
|
71
73
|
return resolve({
|
|
72
74
|
status: 'success',
|
|
73
|
-
output
|
|
75
|
+
output,
|
|
74
76
|
});
|
|
75
77
|
}
|
|
76
78
|
catch (error) {
|
|
@@ -85,5 +87,5 @@ class BraveWebSearchTool extends PSAgentTool_1.PSAgentTool {
|
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
exports.BraveWebSearchTool = BraveWebSearchTool;
|
|
88
|
-
BraveWebSearchTool.toolName =
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
BraveWebSearchTool.toolName = 'search_web_with_brave';
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJhdmVXZWJTZWFyY2hUb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29scy9CcmF2ZVdlYlNlYXJjaFRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQXVEO0FBQ3ZELCtCQUEyQjtBQUczQixnREFBNkM7QUFFN0MsTUFBYSxrQkFBbUIsU0FBUSx5QkFBVztJQUdqRCxZQUFZLE9BQXVDO1FBQ2pELEtBQUssQ0FBQztZQUNKLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxRQUFRO1lBQ2pDLFdBQVcsRUFBRSx1Q0FBdUM7WUFDcEQsSUFBSSxFQUFFLEtBQUs7WUFDWCxlQUFlLEVBQUUsSUFBSTtZQUNyQixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRTtnQkFDWCxHQUFHLEVBQUUsb0JBQW9CLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtnQkFDdEQsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsV0FBVyxFQUFFLE1BQUMsQ0FBQyxZQUFZLENBQ3pCLE1BQUM7cUJBQ0UsTUFBTSxDQUFDO29CQUNOLEtBQUssRUFBRSxNQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUNsQixLQUFLLEVBQUUsY0FBYzt3QkFDckIsV0FBVyxFQUFFLGtDQUFrQztxQkFDaEQsQ0FBQztpQkFDSCxDQUFDO3FCQUNELElBQUksQ0FBQztvQkFDSixLQUFLLEVBQUUscUJBQXFCO29CQUM1QixXQUFXLEVBQUUsa0RBQWtEO2lCQUNoRSxDQUFDLEVBQ0osRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQ2hCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQWE7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUM7Z0JB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
|
|
@@ -15,32 +15,32 @@ The input is a JSON object with the following properties:
|
|
|
15
15
|
The output will be a JSON object with the status and output result of the action.`,
|
|
16
16
|
inputschema: {
|
|
17
17
|
url: `http://localhost/${PSArtifactTool.TOOL_NAME}`,
|
|
18
|
-
method:
|
|
18
|
+
method: 'POST',
|
|
19
19
|
//title: `${PSArtifactTool.TOOL_NAME}_inputs`,
|
|
20
20
|
//description: "Input for Artifact Tool",
|
|
21
21
|
requestBody: {
|
|
22
|
-
type:
|
|
22
|
+
type: 'object',
|
|
23
23
|
properties: {
|
|
24
24
|
name: {
|
|
25
|
-
type:
|
|
26
|
-
title:
|
|
27
|
-
description:
|
|
25
|
+
type: 'string',
|
|
26
|
+
title: 'name',
|
|
27
|
+
description: 'The name of the artifact',
|
|
28
28
|
},
|
|
29
29
|
content: {
|
|
30
|
-
type:
|
|
31
|
-
title:
|
|
32
|
-
description:
|
|
30
|
+
type: 'string',
|
|
31
|
+
title: 'content',
|
|
32
|
+
description: 'The content of the artifact',
|
|
33
33
|
},
|
|
34
34
|
action: {
|
|
35
|
-
type:
|
|
36
|
-
title:
|
|
35
|
+
type: 'string',
|
|
36
|
+
title: 'action',
|
|
37
37
|
description: "the action to perform on the content, either 'read' or 'write'",
|
|
38
|
-
enum: [
|
|
39
|
-
}
|
|
38
|
+
enum: ['read', 'write'],
|
|
39
|
+
},
|
|
40
40
|
},
|
|
41
|
-
required: [
|
|
42
|
-
}
|
|
43
|
-
}
|
|
41
|
+
required: ['name', 'action'],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
44
|
});
|
|
45
45
|
this.artifacts = {};
|
|
46
46
|
if (artifactsStore) {
|
|
@@ -51,29 +51,29 @@ The output will be a JSON object with the status and output result of the action
|
|
|
51
51
|
const name = input.name;
|
|
52
52
|
const action = input.action;
|
|
53
53
|
if (!name || name.trim().length === 0) {
|
|
54
|
-
throw new Error(
|
|
54
|
+
throw new Error('name should not be empty');
|
|
55
55
|
}
|
|
56
56
|
const isExisting = this.artifacts[name];
|
|
57
|
-
if (action ===
|
|
57
|
+
if (action === 'read') {
|
|
58
58
|
return {
|
|
59
|
-
status:
|
|
59
|
+
status: 'success',
|
|
60
60
|
output: this.artifacts[name],
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
-
else if (action ==
|
|
63
|
+
else if (action == 'write') {
|
|
64
64
|
const content = input.content || '';
|
|
65
65
|
this.artifacts[name] = content;
|
|
66
66
|
return {
|
|
67
|
-
status:
|
|
68
|
-
output: `Artifact ${name} ${isExisting ? 'modified' : 'created'} with content length ${content.length}
|
|
67
|
+
status: 'success',
|
|
68
|
+
output: `Artifact ${name} ${isExisting ? 'modified' : 'created'} with content length ${content.length}`,
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
return {
|
|
72
|
-
status:
|
|
73
|
-
output: `Invalid action ${input.action}, must be either 'read' or 'write'
|
|
72
|
+
status: 'error',
|
|
73
|
+
output: `Invalid action ${input.action}, must be either 'read' or 'write'`,
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
exports.PSArtifactTool = PSArtifactTool;
|
|
78
|
-
PSArtifactTool.TOOL_NAME =
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
PSArtifactTool.TOOL_NAME = 'artifact_tool';
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBcnRpZmFjdFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTQXJ0aWZhY3RUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUN2RCxnREFBNkM7QUFFN0MsTUFBYSxjQUFlLFNBQVEseUJBQVc7SUFHN0MsWUFBWSxjQUF1QztRQUNqRCxLQUFLLENBQUM7WUFDSixJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVM7WUFDOUIsV0FBVyxFQUFFLFlBQVksY0FBYyxDQUFDLFNBQVM7Ozs7O2tGQUsyQjtZQUM1RSxXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFLG9CQUFvQixjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUNuRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCw4Q0FBOEM7Z0JBQzlDLHlDQUF5QztnQkFDekMsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixJQUFJLEVBQUU7NEJBQ0osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsS0FBSyxFQUFFLE1BQU07NEJBQ2IsV0FBVyxFQUFFLDBCQUEwQjt5QkFDeEM7d0JBQ0QsT0FBTyxFQUFFOzRCQUNQLElBQUksRUFBRSxRQUFROzRCQUNkLEtBQUssRUFBRSxTQUFTOzRCQUNoQixXQUFXLEVBQUUsNkJBQTZCO3lCQUMzQzt3QkFDRCxNQUFNLEVBQUU7NEJBQ04sSUFBSSxFQUFFLFFBQVE7NEJBQ2QsS0FBSyxFQUFFLFFBQVE7NEJBQ2YsV0FBVyxFQUNULGdFQUFnRTs0QkFDbEUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQzt5QkFDeEI7cUJBQ0Y7b0JBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztpQkFDN0I7YUFDRjtTQUNGLENBQUMsQ0FBQztRQXZDWSxjQUFTLEdBQTJCLEVBQUUsQ0FBQztRQXdDdEQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVlLEtBQUssQ0FBQyxHQUFHLENBQ3ZCLEtBQTBCO1FBRTFCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQzthQUM3QixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQy9CLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxZQUFZLElBQUksSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyx3QkFBd0IsT0FBTyxDQUFDLE1BQU0sRUFBRTthQUN4RyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRSxrQkFBa0IsS0FBSyxDQUFDLE1BQU0sb0NBQW9DO1NBQzNFLENBQUM7SUFDSixDQUFDOztBQTFFSCx3Q0EyRUM7QUExRVEsd0JBQVMsR0FBRyxlQUFlLEFBQWxCLENBQW1CIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PSAgentLogger } from
|
|
2
|
-
import { PSAgentTool } from
|
|
1
|
+
import { PSAgentLogger } from '../PSAgentLogger';
|
|
2
|
+
import { PSAgentTool } from '../PSAgentTool';
|
|
3
3
|
export declare class PSCommandLineTool extends PSAgentTool {
|
|
4
4
|
static readonly toolName = "run_commandline";
|
|
5
5
|
private cwd;
|
|
@@ -10,29 +10,31 @@ class PSCommandLineTool extends PSAgentTool_1.PSAgentTool {
|
|
|
10
10
|
constructor(options) {
|
|
11
11
|
super({
|
|
12
12
|
name: PSCommandLineTool.toolName,
|
|
13
|
-
description:
|
|
14
|
-
type:
|
|
13
|
+
description: 'executes a shell command in the command shell like bash.',
|
|
14
|
+
type: 'API',
|
|
15
15
|
local_execution: true,
|
|
16
16
|
hitl: true,
|
|
17
17
|
inputschema: {
|
|
18
|
-
url:
|
|
19
|
-
method:
|
|
20
|
-
requestBody: v4_1.z.toJSONSchema(v4_1.z
|
|
18
|
+
url: 'http://localhost/run_commandline',
|
|
19
|
+
method: 'POST',
|
|
20
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z
|
|
21
|
+
.object({
|
|
21
22
|
command: v4_1.z.string().meta({
|
|
22
|
-
title:
|
|
23
|
-
description:
|
|
23
|
+
title: 'command',
|
|
24
|
+
description: 'The command to run in the bash command shell.',
|
|
24
25
|
}),
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
})
|
|
27
|
+
.meta({
|
|
28
|
+
title: 'run_commandline_request_body',
|
|
29
|
+
description: 'The request body parameters for the run_commandline tool.',
|
|
30
|
+
}), { io: 'input' }),
|
|
29
31
|
},
|
|
30
32
|
});
|
|
31
33
|
this.cwd = options.cwd || process.cwd();
|
|
32
34
|
}
|
|
33
35
|
run(input, log) {
|
|
34
|
-
if (!input.command || typeof input.command !==
|
|
35
|
-
throw new Error(
|
|
36
|
+
if (!input.command || typeof input.command !== 'string') {
|
|
37
|
+
throw new Error('Invalid command provided.');
|
|
36
38
|
}
|
|
37
39
|
const logger = log || console;
|
|
38
40
|
return new Promise((resolve, reject) => {
|
|
@@ -40,13 +42,10 @@ class PSCommandLineTool extends PSAgentTool_1.PSAgentTool {
|
|
|
40
42
|
try {
|
|
41
43
|
logger.info(`🛠️ Running command: \`${command}\``);
|
|
42
44
|
const output = (0, child_process_1.execSync)(command, { cwd: this.cwd, encoding: 'utf-8' });
|
|
43
|
-
logger.info(
|
|
44
|
-
+ `> ${command}\n`
|
|
45
|
-
+ `${output}\n`
|
|
46
|
-
+ "```\n\n");
|
|
45
|
+
logger.info('```bash\n' + `> ${command}\n` + `${output}\n` + '```\n\n');
|
|
47
46
|
return resolve({
|
|
48
47
|
status: 'success',
|
|
49
|
-
output: output ||
|
|
48
|
+
output: output || 'Command executed successfully with no output.',
|
|
50
49
|
});
|
|
51
50
|
}
|
|
52
51
|
catch (error) {
|
|
@@ -56,7 +55,9 @@ class PSCommandLineTool extends PSAgentTool_1.PSAgentTool {
|
|
|
56
55
|
reject(new Error(`Failed to execute command: ${command}. Error: ${error.message}`));
|
|
57
56
|
}
|
|
58
57
|
else if (sperr) {
|
|
59
|
-
if (sperr.stderr !== '' &&
|
|
58
|
+
if (sperr.stderr !== '' &&
|
|
59
|
+
sperr.stderr !== undefined &&
|
|
60
|
+
sperr.stdout !== undefined) {
|
|
60
61
|
reject(new Error(`${sperr.stderr}\n${sperr.stdout}\nexit code: ${sperr.status}`));
|
|
61
62
|
}
|
|
62
63
|
else
|
|
@@ -70,5 +71,5 @@ class PSCommandLineTool extends PSAgentTool_1.PSAgentTool {
|
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
exports.PSCommandLineTool = PSCommandLineTool;
|
|
73
|
-
PSCommandLineTool.toolName =
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
PSCommandLineTool.toolName = 'run_commandline';
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNDb21tYW5kTGluZVRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTQ29tbWFuZExpbmVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUN2RCxpREFBMkQ7QUFFM0QsK0JBQTJCO0FBRzNCLGdEQUE2QztBQUM3Qyw4Q0FBZ0Q7QUFFaEQsTUFBYSxpQkFBa0IsU0FBUSx5QkFBVztJQUdoRCxZQUFZLE9BQXdCO1FBQ2xDLEtBQUssQ0FBQztZQUNKLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO1lBQ2hDLFdBQVcsRUFBRSwwREFBMEQ7WUFDdkUsSUFBSSxFQUFFLEtBQUs7WUFDWCxlQUFlLEVBQUUsSUFBSTtZQUNyQixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRTtnQkFDWCxHQUFHLEVBQUUsa0NBQWtDO2dCQUN2QyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxXQUFXLEVBQUUsTUFBQyxDQUFDLFlBQVksQ0FDekIsTUFBQztxQkFDRSxNQUFNLENBQUM7b0JBQ04sT0FBTyxFQUFFLE1BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZCLEtBQUssRUFBRSxTQUFTO3dCQUNoQixXQUFXLEVBQUUsK0NBQStDO3FCQUM3RCxDQUFDO2lCQUNILENBQUM7cUJBQ0QsSUFBSSxDQUFDO29CQUNKLEtBQUssRUFBRSw4QkFBOEI7b0JBQ3JDLFdBQVcsRUFDVCwyREFBMkQ7aUJBQzlELENBQUMsRUFDSixFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FDaEI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUNNLEdBQUcsQ0FDUixLQUEwQixFQUMxQixHQUFtQjtRQUVuQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksT0FBTyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBQSxzQkFBWSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsT0FBTyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBUSxFQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLE9BQU8sSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBRXhFLE9BQU8sT0FBTyxDQUFDO29CQUNiLE1BQU0sRUFBRSxTQUFTO29CQUNqQixNQUFNLEVBQUUsTUFBTSxJQUFJLCtDQUErQztpQkFDbEUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsS0FBaUMsQ0FBQztnQkFDaEQsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sQ0FDSixJQUFJLEtBQUssQ0FDUCw4QkFBOEIsT0FBTyxZQUFZLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FDakUsQ0FDRixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDakIsSUFDRSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUU7d0JBQ25CLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUzt3QkFDMUIsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQzFCLENBQUM7d0JBQ0QsTUFBTSxDQUNKLElBQUksS0FBSyxDQUNQLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxnQkFBZ0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUMvRCxDQUNGLENBQUM7b0JBQ0osQ0FBQzs7d0JBQ0MsTUFBTSxDQUNKLElBQUksS0FBSyxDQUNQLDhCQUE4QixPQUFPLGdCQUFnQixLQUFLLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FDNUYsQ0FDRixDQUFDO2dCQUNOLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQ0osSUFBSSxLQUFLLENBQUMsOEJBQThCLE9BQU8sa0JBQWtCLENBQUMsQ0FDbkUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwRkgsOENBcUZDO0FBcEZ3QiwwQkFBUSxHQUFHLGlCQUFpQixDQUFDIn0=
|