psadk 1.3.5 → 1.3.6
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/skills/types.d.ts +1 -1
- package/build/main/lib/tools/PSSkillTool.d.ts +1 -1
- package/build/main/lib/tools/PSSkillTool.js +11 -7
- package/build/module/lib/skills/types.d.ts +1 -1
- package/build/module/lib/tools/PSSkillTool.d.ts +1 -1
- package/build/module/lib/tools/PSSkillTool.js +12 -8
- package/package.json +1 -1
|
@@ -26,7 +26,7 @@ export interface PSSkillToolConfig {
|
|
|
26
26
|
autoInstall?: boolean;
|
|
27
27
|
}
|
|
28
28
|
export interface PSSkillToolExecutionConfig {
|
|
29
|
-
skillsPath: string;
|
|
29
|
+
skillsPath: string | readonly string[];
|
|
30
30
|
allowedSkills?: string[];
|
|
31
31
|
}
|
|
32
32
|
export interface SkillInstallationOptions {
|
|
@@ -3,7 +3,7 @@ import { PSAgentTool } from '../PSAgentTool';
|
|
|
3
3
|
import { PSSkillToolExecutionConfig, SkillExecutionResult } from '../skills/types';
|
|
4
4
|
export declare class PSSkillTool extends PSAgentTool {
|
|
5
5
|
static readonly toolName = "skill";
|
|
6
|
-
private
|
|
6
|
+
private skillsPaths;
|
|
7
7
|
private allowedSkills?;
|
|
8
8
|
constructor(config: PSSkillToolExecutionConfig);
|
|
9
9
|
/**
|
|
@@ -40,7 +40,9 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
40
40
|
}), { io: 'input' }),
|
|
41
41
|
},
|
|
42
42
|
});
|
|
43
|
-
this.
|
|
43
|
+
this.skillsPaths = Array.isArray(config.skillsPath)
|
|
44
|
+
? [...config.skillsPath]
|
|
45
|
+
: [config.skillsPath];
|
|
44
46
|
this.allowedSkills = config.allowedSkills;
|
|
45
47
|
}
|
|
46
48
|
/**
|
|
@@ -71,13 +73,15 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
71
73
|
if (!this.isSkillAllowed(skill_name)) {
|
|
72
74
|
throw new Error(`Skill not allowed: ${skill_name}. This agent is restricted to specific skills only.`);
|
|
73
75
|
}
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
// Search for skill across all configured paths (first match wins)
|
|
77
|
+
const matchedPath = this.skillsPaths.find((p) => (0, utils_1.skillExists)(p, skill_name));
|
|
78
|
+
if (!matchedPath) {
|
|
79
|
+
const searchedPaths = this.skillsPaths.join(', ');
|
|
80
|
+
throw new Error(`Skill not found: ${skill_name}. Searched paths: ${searchedPaths}.`);
|
|
77
81
|
}
|
|
78
82
|
try {
|
|
79
|
-
// Read skill content
|
|
80
|
-
const skillContent = await (0, utils_1.readSkillContent)(
|
|
83
|
+
// Read skill content from the matched path
|
|
84
|
+
const skillContent = await (0, utils_1.readSkillContent)(matchedPath, skill_name);
|
|
81
85
|
logger.info(`✅ Skill executed successfully: ${skill_name}`);
|
|
82
86
|
return {
|
|
83
87
|
status: 'success',
|
|
@@ -97,4 +101,4 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
97
101
|
}
|
|
98
102
|
exports.PSSkillTool = PSSkillTool;
|
|
99
103
|
PSSkillTool.toolName = 'skill';
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNTa2lsbFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTU2tpbGxUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUF1RDtBQUN2RCwrQkFBMkI7QUFHM0IsZ0RBQTZDO0FBSzdDLDJDQUl5QjtBQUN6Qix1RUFBK0M7QUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVyxFQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFNUMsc0ZBQXNGO0FBQ3RGLE1BQWEsV0FBWSxTQUFRLHlCQUFXO0lBSzFDLFlBQVksTUFBa0M7UUFDNUMsS0FBSyxDQUFDO1lBQ0osSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRO1lBQzFCLFdBQVcsRUFDVCxnRkFBZ0Y7Z0JBQ2hGLDJGQUEyRjtZQUM3RixJQUFJLEVBQUUsS0FBSztZQUNYLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFO2dCQUNYLEdBQUcsRUFBRSxvQkFBb0IsV0FBVyxDQUFDLFFBQVEsRUFBRTtnQkFDL0MsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsV0FBVyxFQUFFLE1BQUMsQ0FBQyxZQUFZLENBQ3pCLE1BQUM7cUJBQ0UsTUFBTSxDQUFDO29CQUNOLFVBQVUsRUFBRSxNQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUMxQixLQUFLLEVBQUUsWUFBWTt3QkFDbkIsV0FBVyxFQUNULGlHQUFpRztxQkFDcEcsQ0FBQztvQkFDRixTQUFTLEVBQUUsTUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDcEMsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLFdBQVcsRUFDVCxzR0FBc0c7cUJBQ3pHLENBQUM7aUJBQ0gsQ0FBQztxQkFDRCxJQUFJLENBQUM7b0JBQ0osS0FBSyxFQUFFLEdBQUcsV0FBVyxDQUFDLFFBQVEsZUFBZTtvQkFD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
|
|
@@ -26,7 +26,7 @@ export interface PSSkillToolConfig {
|
|
|
26
26
|
autoInstall?: boolean;
|
|
27
27
|
}
|
|
28
28
|
export interface PSSkillToolExecutionConfig {
|
|
29
|
-
skillsPath: string;
|
|
29
|
+
skillsPath: string | readonly string[];
|
|
30
30
|
allowedSkills?: string[];
|
|
31
31
|
}
|
|
32
32
|
export interface SkillInstallationOptions {
|
|
@@ -3,7 +3,7 @@ import { PSAgentTool } from '../PSAgentTool';
|
|
|
3
3
|
import { PSSkillToolExecutionConfig, SkillExecutionResult } from '../skills/types';
|
|
4
4
|
export declare class PSSkillTool extends PSAgentTool {
|
|
5
5
|
static readonly toolName = "skill";
|
|
6
|
-
private
|
|
6
|
+
private skillsPaths;
|
|
7
7
|
private allowedSkills?;
|
|
8
8
|
constructor(config: PSSkillToolExecutionConfig);
|
|
9
9
|
/**
|
|
@@ -13,7 +13,7 @@ const dlog = (0, debuglogger_1.default)('PSAI:SkillTool:');
|
|
|
13
13
|
//@todo arguments implementations, templated variable values expected in the arguments
|
|
14
14
|
class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
15
15
|
static toolName = 'skill';
|
|
16
|
-
|
|
16
|
+
skillsPaths;
|
|
17
17
|
allowedSkills;
|
|
18
18
|
constructor(config) {
|
|
19
19
|
super({
|
|
@@ -43,7 +43,9 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
43
43
|
}), { io: 'input' }),
|
|
44
44
|
},
|
|
45
45
|
});
|
|
46
|
-
this.
|
|
46
|
+
this.skillsPaths = Array.isArray(config.skillsPath)
|
|
47
|
+
? [...config.skillsPath]
|
|
48
|
+
: [config.skillsPath];
|
|
47
49
|
this.allowedSkills = config.allowedSkills;
|
|
48
50
|
}
|
|
49
51
|
/**
|
|
@@ -74,13 +76,15 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
74
76
|
if (!this.isSkillAllowed(skill_name)) {
|
|
75
77
|
throw new Error(`Skill not allowed: ${skill_name}. This agent is restricted to specific skills only.`);
|
|
76
78
|
}
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
// Search for skill across all configured paths (first match wins)
|
|
80
|
+
const matchedPath = this.skillsPaths.find((p) => (0, utils_1.skillExists)(p, skill_name));
|
|
81
|
+
if (!matchedPath) {
|
|
82
|
+
const searchedPaths = this.skillsPaths.join(', ');
|
|
83
|
+
throw new Error(`Skill not found: ${skill_name}. Searched paths: ${searchedPaths}.`);
|
|
80
84
|
}
|
|
81
85
|
try {
|
|
82
|
-
// Read skill content
|
|
83
|
-
const skillContent = await (0, utils_1.readSkillContent)(
|
|
86
|
+
// Read skill content from the matched path
|
|
87
|
+
const skillContent = await (0, utils_1.readSkillContent)(matchedPath, skill_name);
|
|
84
88
|
logger.info(`✅ Skill executed successfully: ${skill_name}`);
|
|
85
89
|
return {
|
|
86
90
|
status: 'success',
|
|
@@ -99,4 +103,4 @@ class PSSkillTool extends PSAgentTool_1.PSAgentTool {
|
|
|
99
103
|
}
|
|
100
104
|
}
|
|
101
105
|
exports.PSSkillTool = PSSkillTool;
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNTa2lsbFRvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1BTU2tpbGxUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUF1RDtBQUN2RCwrQkFBMkI7QUFHM0IsZ0RBQTZDO0FBSzdDLDJDQUl5QjtBQUN6Qix1RUFBK0M7QUFFL0MsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVyxFQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFNUMsc0ZBQXNGO0FBQ3RGLE1BQWEsV0FBWSxTQUFRLHlCQUFXO0lBQ25DLE1BQU0sQ0FBVSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLFdBQVcsQ0FBVztJQUN0QixhQUFhLENBQVk7SUFFakMsWUFBWSxNQUFrQztRQUM1QyxLQUFLLENBQUM7WUFDSixJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVE7WUFDMUIsV0FBVyxFQUNULGdGQUFnRjtnQkFDaEYsMkZBQTJGO1lBQzdGLElBQUksRUFBRSxLQUFLO1lBQ1gsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFLG9CQUFvQixXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxXQUFXLEVBQUUsTUFBQyxDQUFDLFlBQVksQ0FDekIsTUFBQztxQkFDRSxNQUFNLENBQUM7b0JBQ04sVUFBVSxFQUFFLE1BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQzFCLEtBQUssRUFBRSxZQUFZO3dCQUNuQixXQUFXLEVBQ1QsaUdBQWlHO3FCQUNwRyxDQUFDO29CQUNGLFNBQVMsRUFBRSxNQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUNwQyxLQUFLLEVBQUUsV0FBVzt3QkFDbEIsV0FBVyxFQUNULHNHQUFzRztxQkFDekcsQ0FBQztpQkFD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
|