@polka-codes/core 0.10.13 → 0.10.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Agent/backoff.d.ts +7 -0
- package/dist/Agent/backoff.js +21 -0
- package/dist/Agent/backoff.js.map +1 -0
- package/dist/Agent/index.d.ts +2 -0
- package/dist/Agent/index.js +3 -0
- package/dist/Agent/index.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
- package/dist/Agent/parseJsonFromMarkdown.js +34 -0
- package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
- package/dist/Agent/prompts.d.ts +9 -0
- package/dist/Agent/prompts.js +107 -0
- package/dist/Agent/prompts.js.map +1 -0
- package/dist/UsageMeter.d.ts +101 -0
- package/dist/UsageMeter.js +299 -0
- package/dist/UsageMeter.js.map +1 -0
- package/dist/UsageMeter.test.d.ts +4 -0
- package/dist/UsageMeter.test.js +556 -0
- package/dist/UsageMeter.test.js.map +1 -0
- package/dist/config/base.d.ts +68 -0
- package/dist/config/base.js +56 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/memory.d.ts +24 -0
- package/dist/config/memory.js +36 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config.d.ts +236 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/base.d.ts +31 -0
- package/dist/errors/base.js +60 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/fs/index.d.ts +2 -0
- package/dist/fs/index.js +3 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/node-provider.d.ts +16 -0
- package/dist/fs/node-provider.js +47 -0
- package/dist/fs/node-provider.js.map +1 -0
- package/dist/fs/provider.d.ts +61 -0
- package/dist/fs/provider.js +3 -0
- package/dist/fs/provider.js.map +1 -0
- package/dist/index.d.ts +20 -191
- package/dist/index.js +21 -4123
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +136 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/path.d.ts +9 -0
- package/dist/path.js +68 -0
- package/dist/path.js.map +1 -0
- package/dist/path.test.d.ts +1 -0
- package/dist/path.test.js +82 -0
- package/dist/path.test.js.map +1 -0
- package/dist/pricing/converter.d.ts +6 -0
- package/dist/pricing/converter.js +13 -0
- package/dist/pricing/converter.js.map +1 -0
- package/dist/pricing/converter.test.d.ts +1 -0
- package/dist/pricing/converter.test.js +54 -0
- package/dist/pricing/converter.test.js.map +1 -0
- package/dist/pricing/index.d.ts +2 -0
- package/dist/pricing/index.js +2 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/portkey-client.d.ts +2 -0
- package/dist/pricing/portkey-client.js +57 -0
- package/dist/pricing/portkey-client.js.map +1 -0
- package/dist/pricing/pricing-service.d.ts +6 -0
- package/dist/pricing/pricing-service.js +125 -0
- package/dist/pricing/pricing-service.js.map +1 -0
- package/dist/pricing/pricing-service.test.d.ts +1 -0
- package/dist/pricing/pricing-service.test.js +141 -0
- package/dist/pricing/pricing-service.test.js.map +1 -0
- package/dist/pricing/types.d.ts +24 -0
- package/dist/pricing/types.js +2 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/skills/__tests__/discovery.test.d.ts +1 -0
- package/dist/skills/__tests__/discovery.test.js +254 -0
- package/dist/skills/__tests__/discovery.test.js.map +1 -0
- package/dist/skills/__tests__/validation.test.d.ts +1 -0
- package/dist/skills/__tests__/validation.test.js +221 -0
- package/dist/skills/__tests__/validation.test.js.map +1 -0
- package/dist/skills/constants.d.ts +32 -0
- package/dist/skills/constants.js +50 -0
- package/dist/skills/constants.js.map +1 -0
- package/dist/skills/discovery.d.ts +56 -0
- package/dist/skills/discovery.js +392 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/tools/index.d.ts +3 -0
- package/dist/skills/tools/index.js +5 -0
- package/dist/skills/tools/index.js.map +1 -0
- package/dist/skills/tools/listSkills.d.ts +54 -0
- package/dist/skills/tools/listSkills.js +52 -0
- package/dist/skills/tools/listSkills.js.map +1 -0
- package/dist/skills/tools/loadSkill.d.ts +52 -0
- package/dist/skills/tools/loadSkill.js +86 -0
- package/dist/skills/tools/loadSkill.js.map +1 -0
- package/dist/skills/tools/readSkillFile.d.ts +43 -0
- package/dist/skills/tools/readSkillFile.js +68 -0
- package/dist/skills/tools/readSkillFile.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.js +42 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.d.ts +30 -0
- package/dist/skills/validation.js +133 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/tool.d.ts +51 -0
- package/dist/tool.js +2 -0
- package/dist/tool.js.map +1 -0
- package/dist/tools/askFollowupQuestion.d.ts +35 -0
- package/dist/tools/askFollowupQuestion.js +105 -0
- package/dist/tools/askFollowupQuestion.js.map +1 -0
- package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
- package/dist/tools/askFollowupQuestion.test.js +80 -0
- package/dist/tools/askFollowupQuestion.test.js.map +1 -0
- package/dist/tools/executeCommand.d.ts +29 -0
- package/dist/tools/executeCommand.js +82 -0
- package/dist/tools/executeCommand.js.map +1 -0
- package/dist/tools/executeCommand.test.d.ts +1 -0
- package/dist/tools/executeCommand.test.js +60 -0
- package/dist/tools/executeCommand.test.js.map +1 -0
- package/dist/tools/fetchUrl.d.ts +26 -0
- package/dist/tools/fetchUrl.js +85 -0
- package/dist/tools/fetchUrl.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listFiles.d.ts +35 -0
- package/dist/tools/listFiles.js +61 -0
- package/dist/tools/listFiles.js.map +1 -0
- package/dist/tools/listFiles.test.d.ts +1 -0
- package/dist/tools/listFiles.test.js +59 -0
- package/dist/tools/listFiles.test.js.map +1 -0
- package/dist/tools/provider.d.ts +76 -0
- package/dist/tools/provider.js +60 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/readBinaryFile.d.ts +26 -0
- package/dist/tools/readBinaryFile.js +52 -0
- package/dist/tools/readBinaryFile.js.map +1 -0
- package/dist/tools/readFile.d.ts +35 -0
- package/dist/tools/readFile.js +128 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readFile.test.d.ts +1 -0
- package/dist/tools/readFile.test.js +37 -0
- package/dist/tools/readFile.test.js.map +1 -0
- package/dist/tools/removeFile.d.ts +26 -0
- package/dist/tools/removeFile.js +49 -0
- package/dist/tools/removeFile.js.map +1 -0
- package/dist/tools/removeFile.test.d.ts +1 -0
- package/dist/tools/removeFile.test.js +32 -0
- package/dist/tools/removeFile.test.js.map +1 -0
- package/dist/tools/renameFile.d.ts +29 -0
- package/dist/tools/renameFile.js +48 -0
- package/dist/tools/renameFile.js.map +1 -0
- package/dist/tools/renameFile.test.d.ts +1 -0
- package/dist/tools/renameFile.test.js +53 -0
- package/dist/tools/renameFile.test.js.map +1 -0
- package/dist/tools/replaceInFile.d.ts +29 -0
- package/dist/tools/replaceInFile.js +233 -0
- package/dist/tools/replaceInFile.js.map +1 -0
- package/dist/tools/replaceInFile.test.d.ts +1 -0
- package/dist/tools/replaceInFile.test.js +79 -0
- package/dist/tools/replaceInFile.test.js.map +1 -0
- package/dist/tools/response-builders.d.ts +64 -0
- package/dist/tools/response-builders.js +88 -0
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/search.d.ts +26 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/search.test.d.ts +1 -0
- package/dist/tools/search.test.js +22 -0
- package/dist/tools/search.test.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +32 -0
- package/dist/tools/searchFiles.js +86 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/todo.d.ts +37 -0
- package/dist/tools/todo.js +41 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/utils/index.d.ts +1 -0
- package/dist/tools/utils/index.js +2 -0
- package/dist/tools/utils/index.js.map +1 -0
- package/dist/tools/utils/replaceInFile.d.ts +7 -0
- package/dist/tools/utils/replaceInFile.js +133 -0
- package/dist/tools/utils/replaceInFile.js.map +1 -0
- package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
- package/dist/tools/utils/replaceInFile.test.js +308 -0
- package/dist/tools/utils/replaceInFile.test.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.js +27 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/writeToFile.d.ts +29 -0
- package/dist/tools/writeToFile.js +85 -0
- package/dist/tools/writeToFile.js.map +1 -0
- package/dist/tools/writeToFile.test.d.ts +1 -0
- package/dist/tools/writeToFile.test.js +46 -0
- package/dist/tools/writeToFile.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +26 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/workflow/agent.workflow.d.ts +39 -0
- package/dist/workflow/agent.workflow.js +166 -0
- package/dist/workflow/agent.workflow.js.map +1 -0
- package/dist/workflow/agent.workflow.test.d.ts +1 -0
- package/dist/workflow/agent.workflow.test.js +175 -0
- package/dist/workflow/agent.workflow.test.js.map +1 -0
- package/dist/workflow/control-flow.test.d.ts +1 -0
- package/dist/workflow/control-flow.test.js +323 -0
- package/dist/workflow/control-flow.test.js.map +1 -0
- package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
- package/dist/workflow/dynamic-edge-cases.test.js +486 -0
- package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
- package/dist/workflow/dynamic-types.d.ts +124 -0
- package/dist/workflow/dynamic-types.js +105 -0
- package/dist/workflow/dynamic-types.js.map +1 -0
- package/dist/workflow/dynamic.d.ts +118 -0
- package/dist/workflow/dynamic.js +999 -0
- package/dist/workflow/dynamic.js.map +1 -0
- package/dist/workflow/index.d.ts +6 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/json-ai-types.d.ts +122 -0
- package/dist/workflow/json-ai-types.js +144 -0
- package/dist/workflow/json-ai-types.js.map +1 -0
- package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
- package/dist/workflow/json-schema-conversion.test.js +371 -0
- package/dist/workflow/json-schema-conversion.test.js.map +1 -0
- package/dist/workflow/try-catch.test.d.ts +1 -0
- package/dist/workflow/try-catch.test.js +443 -0
- package/dist/workflow/try-catch.test.js.map +1 -0
- package/dist/workflow/types.d.ts +103 -0
- package/dist/workflow/types.js +17 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/workflow.d.ts +29 -0
- package/dist/workflow/workflow.js +57 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.d.ts +1 -0
- package/dist/workflow/workflow.test.js +189 -0
- package/dist/workflow/workflow.test.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { validateSkillReferences, validateSkillSecurity } from '../validation';
|
|
4
|
+
/**
|
|
5
|
+
* Tool input parameters for loading a skill
|
|
6
|
+
*/
|
|
7
|
+
export const LoadSkillInputSchema = z.object({
|
|
8
|
+
skillName: z.string().describe('The name of the skill to load'),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Tool output for loading a skill
|
|
12
|
+
*/
|
|
13
|
+
export const LoadSkillOutputSchema = z.object({
|
|
14
|
+
success: z.boolean(),
|
|
15
|
+
skill: z
|
|
16
|
+
.object({
|
|
17
|
+
name: z.string(),
|
|
18
|
+
description: z.string(),
|
|
19
|
+
content: z.string(),
|
|
20
|
+
availableFiles: z.array(z.string()),
|
|
21
|
+
})
|
|
22
|
+
.optional(),
|
|
23
|
+
error: z.string().optional(),
|
|
24
|
+
warnings: z.array(z.string()).optional(),
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Load a skill by name to access its instructions and resources
|
|
28
|
+
*
|
|
29
|
+
* This tool enables agents to autonomously load specialized knowledge
|
|
30
|
+
* and capabilities based on task context.
|
|
31
|
+
*/
|
|
32
|
+
export async function loadSkill(input, context) {
|
|
33
|
+
const { skillName } = input;
|
|
34
|
+
// Find the skill reference
|
|
35
|
+
const skillRef = context.availableSkills.find((s) => s.metadata.name === skillName);
|
|
36
|
+
if (!skillRef) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: `Skill '${skillName}' not found`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
// Load the full skill
|
|
44
|
+
const skill = await context.loadSkill(skillName);
|
|
45
|
+
if (!skill) {
|
|
46
|
+
return {
|
|
47
|
+
success: false,
|
|
48
|
+
error: `Failed to load skill '${skillName}'`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Validate security
|
|
52
|
+
validateSkillSecurity(skill);
|
|
53
|
+
// Check for reference warnings
|
|
54
|
+
const warnings = validateSkillReferences(skill);
|
|
55
|
+
// Load the skill as active
|
|
56
|
+
context.activeSkill = skill;
|
|
57
|
+
context.skillLoadingHistory.push(skillName);
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
skill: {
|
|
61
|
+
name: skill.metadata.name,
|
|
62
|
+
description: skill.metadata.description,
|
|
63
|
+
content: skill.content,
|
|
64
|
+
availableFiles: Array.from(skill.files.keys()),
|
|
65
|
+
},
|
|
66
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Failed to load skill '${skillName}': ${message}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Tool info for loadSkill (used in agent workflow)
|
|
79
|
+
*/
|
|
80
|
+
export const loadSkillToolInfo = {
|
|
81
|
+
name: 'loadSkill',
|
|
82
|
+
description: 'Load a skill by name to access its instructions and resources. Use this when you need specialized knowledge or capabilities for a specific task.',
|
|
83
|
+
parameters: LoadSkillInputSchema,
|
|
84
|
+
returns: LoadSkillOutputSchema,
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=loadSkill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadSkill.js","sourceRoot":"","sources":["../../../src/skills/tools/loadSkill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { SkillContext } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Tool input parameters for reading a skill file
|
|
5
|
+
*/
|
|
6
|
+
export declare const ReadSkillFileInputSchema: z.ZodObject<{
|
|
7
|
+
skillName: z.ZodString;
|
|
8
|
+
filename: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type ReadSkillFileInput = z.infer<typeof ReadSkillFileInputSchema>;
|
|
11
|
+
/**
|
|
12
|
+
* Tool output for reading a skill file
|
|
13
|
+
*/
|
|
14
|
+
export declare const ReadSkillFileOutputSchema: z.ZodObject<{
|
|
15
|
+
success: z.ZodBoolean;
|
|
16
|
+
content: z.ZodOptional<z.ZodString>;
|
|
17
|
+
error: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type ReadSkillFileOutput = z.infer<typeof ReadSkillFileOutputSchema>;
|
|
20
|
+
/**
|
|
21
|
+
* Read a supporting file from a loaded skill
|
|
22
|
+
*
|
|
23
|
+
* This tool enables agents to access supporting files bundled with skills,
|
|
24
|
+
* such as reference documentation, examples, scripts, or templates.
|
|
25
|
+
* Files are returned as plain text content.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readSkillFile(input: ReadSkillFileInput, context: SkillContext): Promise<ReadSkillFileOutput>;
|
|
28
|
+
/**
|
|
29
|
+
* Tool info for readSkillFile (used in agent workflow)
|
|
30
|
+
*/
|
|
31
|
+
export declare const readSkillFileToolInfo: {
|
|
32
|
+
readonly name: "readSkillFile";
|
|
33
|
+
readonly description: "Read a supporting file from a skill. Use this to access reference documentation, examples, scripts, or templates bundled with a skill. First use loadSkill to see available files, then use this tool to read specific files.";
|
|
34
|
+
readonly parameters: z.ZodObject<{
|
|
35
|
+
skillName: z.ZodString;
|
|
36
|
+
filename: z.ZodString;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
readonly returns: z.ZodObject<{
|
|
39
|
+
success: z.ZodBoolean;
|
|
40
|
+
content: z.ZodOptional<z.ZodString>;
|
|
41
|
+
error: z.ZodOptional<z.ZodString>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Tool input parameters for reading a skill file
|
|
5
|
+
*/
|
|
6
|
+
export const ReadSkillFileInputSchema = z.object({
|
|
7
|
+
skillName: z.string().describe('The name of the skill'),
|
|
8
|
+
filename: z.string().describe('The name of the file to read (e.g., "reference.md", "scripts/helper.py")'),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Tool output for reading a skill file
|
|
12
|
+
*/
|
|
13
|
+
export const ReadSkillFileOutputSchema = z.object({
|
|
14
|
+
success: z.boolean(),
|
|
15
|
+
content: z.string().optional(),
|
|
16
|
+
error: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Read a supporting file from a loaded skill
|
|
20
|
+
*
|
|
21
|
+
* This tool enables agents to access supporting files bundled with skills,
|
|
22
|
+
* such as reference documentation, examples, scripts, or templates.
|
|
23
|
+
* Files are returned as plain text content.
|
|
24
|
+
*/
|
|
25
|
+
export async function readSkillFile(input, context) {
|
|
26
|
+
const { skillName, filename } = input;
|
|
27
|
+
// Check if active skill matches
|
|
28
|
+
let skill = context.activeSkill && context.activeSkill.metadata.name === skillName ? context.activeSkill : null;
|
|
29
|
+
// If not active, try to load it
|
|
30
|
+
if (!skill) {
|
|
31
|
+
try {
|
|
32
|
+
skill = await context.loadSkill(skillName);
|
|
33
|
+
}
|
|
34
|
+
catch (_error) {
|
|
35
|
+
// Ignore load error, will be handled by null check
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!skill) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: `Skill '${skillName}' not found or could not be loaded. Use loadSkill first.`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Check if file exists in skill
|
|
45
|
+
if (!skill.files.has(filename)) {
|
|
46
|
+
const availableFiles = Array.from(skill.files.keys()).sort();
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
error: `File '${filename}' not found in skill '${skillName}'. Available files: ${availableFiles.join(', ') || 'none'}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Return file content
|
|
53
|
+
const content = skill.files.get(filename);
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
content,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Tool info for readSkillFile (used in agent workflow)
|
|
61
|
+
*/
|
|
62
|
+
export const readSkillFileToolInfo = {
|
|
63
|
+
name: 'readSkillFile',
|
|
64
|
+
description: 'Read a supporting file from a skill. Use this to access reference documentation, examples, scripts, or templates bundled with a skill. First use loadSkill to see available files, then use this tool to read specific files.',
|
|
65
|
+
parameters: ReadSkillFileInputSchema,
|
|
66
|
+
returns: ReadSkillFileOutputSchema,
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=readSkillFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readSkillFile.js","sourceRoot":"","sources":["../../../src/skills/tools/readSkillFile.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;CAC1G,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAA;AAIF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB,EAAE,OAAqB;IAClF,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAErC,gCAAgC;IAChC,IAAI,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAE/G,gCAAgC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,SAAS,0DAA0D;SACrF,CAAA;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC5D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS,QAAQ,yBAAyB,SAAS,uBAAuB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;SACvH,CAAA;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEzC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO;KACR,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,+NAA+N;IACjO,UAAU,EAAE,wBAAwB;IACpC,OAAO,EAAE,yBAAyB;CAC1B,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for skill metadata (YAML frontmatter in SKILL.md)
|
|
4
|
+
*/
|
|
5
|
+
export declare const skillMetadataSchema: z.ZodObject<{
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
description: z.ZodString;
|
|
8
|
+
allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type SkillMetadata = z.infer<typeof skillMetadataSchema>;
|
|
11
|
+
/**
|
|
12
|
+
* Represents a reference to a discovered skill (metadata only)
|
|
13
|
+
*/
|
|
14
|
+
export interface SkillReference {
|
|
15
|
+
/**
|
|
16
|
+
* Parsed metadata from SKILL.md frontmatter
|
|
17
|
+
*/
|
|
18
|
+
metadata: SkillMetadata;
|
|
19
|
+
/**
|
|
20
|
+
* Absolute path to the skill directory on disk
|
|
21
|
+
*/
|
|
22
|
+
path: string;
|
|
23
|
+
/**
|
|
24
|
+
* Where the skill was loaded from
|
|
25
|
+
*/
|
|
26
|
+
source: 'personal' | 'project' | 'plugin';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Represents a loaded Agent Skill with all its content
|
|
30
|
+
*/
|
|
31
|
+
export interface Skill extends SkillReference {
|
|
32
|
+
/**
|
|
33
|
+
* Main instructions content (SKILL.md without frontmatter)
|
|
34
|
+
*/
|
|
35
|
+
content: string;
|
|
36
|
+
/**
|
|
37
|
+
* Additional files bundled with the skill
|
|
38
|
+
* Key is relative path from skill directory (e.g., "reference.md", "scripts/helper.py")
|
|
39
|
+
* Value is file content
|
|
40
|
+
*/
|
|
41
|
+
files: Map<string, string>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Context object passed to agents and tools for skill operations
|
|
45
|
+
*/
|
|
46
|
+
export interface SkillContext {
|
|
47
|
+
/**
|
|
48
|
+
* Currently active/loaded skill (if any)
|
|
49
|
+
*/
|
|
50
|
+
activeSkill: Skill | null;
|
|
51
|
+
/**
|
|
52
|
+
* All available skills discovered from all sources (metadata only)
|
|
53
|
+
*/
|
|
54
|
+
availableSkills: SkillReference[];
|
|
55
|
+
/**
|
|
56
|
+
* History of skills loaded during the session (for debugging/telemetry)
|
|
57
|
+
*/
|
|
58
|
+
skillLoadingHistory: string[];
|
|
59
|
+
/**
|
|
60
|
+
* Load a skill by name
|
|
61
|
+
*/
|
|
62
|
+
loadSkill: (name: string) => Promise<Skill | null>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Error thrown when skill discovery fails
|
|
66
|
+
*
|
|
67
|
+
* Note: This error has a custom `path` property that is accessed by callers.
|
|
68
|
+
* Keeping as a class since the error factory doesn't support custom properties.
|
|
69
|
+
*/
|
|
70
|
+
export declare class SkillDiscoveryError extends Error {
|
|
71
|
+
path: string;
|
|
72
|
+
constructor(message: string, path: string);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Error thrown when skill validation fails
|
|
76
|
+
*
|
|
77
|
+
* Note: This error has a custom `path` property that is accessed by callers.
|
|
78
|
+
* Keeping as a class since the error factory doesn't support custom properties.
|
|
79
|
+
*/
|
|
80
|
+
export declare class SkillValidationError extends Error {
|
|
81
|
+
path: string;
|
|
82
|
+
constructor(message: string, path: string);
|
|
83
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Zod schema for skill metadata (YAML frontmatter in SKILL.md)
|
|
5
|
+
*/
|
|
6
|
+
export const skillMetadataSchema = z.object({
|
|
7
|
+
name: z
|
|
8
|
+
.string()
|
|
9
|
+
.regex(/^[a-z0-9-]+$/, 'Skill name must be lowercase letters, numbers, and hyphens')
|
|
10
|
+
.max(64, 'Skill name must be at most 64 characters'),
|
|
11
|
+
description: z.string().max(1024, 'Description must be at most 1024 characters'),
|
|
12
|
+
allowedTools: z.array(z.string()).optional(),
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when skill discovery fails
|
|
16
|
+
*
|
|
17
|
+
* Note: This error has a custom `path` property that is accessed by callers.
|
|
18
|
+
* Keeping as a class since the error factory doesn't support custom properties.
|
|
19
|
+
*/
|
|
20
|
+
export class SkillDiscoveryError extends Error {
|
|
21
|
+
path;
|
|
22
|
+
constructor(message, path) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.path = path;
|
|
25
|
+
this.name = 'SkillDiscoveryError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Error thrown when skill validation fails
|
|
30
|
+
*
|
|
31
|
+
* Note: This error has a custom `path` property that is accessed by callers.
|
|
32
|
+
* Keeping as a class since the error factory doesn't support custom properties.
|
|
33
|
+
*/
|
|
34
|
+
export class SkillValidationError extends Error {
|
|
35
|
+
path;
|
|
36
|
+
constructor(message, path) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.path = path;
|
|
39
|
+
this.name = 'SkillValidationError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,KAAK,CAAC,cAAc,EAAE,4DAA4D,CAAC;SACnF,GAAG,CAAC,EAAE,EAAE,0CAA0C,CAAC;IACtD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,6CAA6C,CAAC;IAChF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAA;AAkEF;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAGnC;IAFT,YACE,OAAe,EACR,IAAY;QAEnB,KAAK,CAAC,OAAO,CAAC,CAAA;QAFP,SAAI,GAAJ,IAAI,CAAQ;QAGnB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAGpC;IAFT,YACE,OAAe,EACR,IAAY;QAEnB,KAAK,CAAC,OAAO,CAAC,CAAA;QAFP,SAAI,GAAJ,IAAI,CAAQ;QAGnB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Skill } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a skill's security constraints
|
|
4
|
+
*
|
|
5
|
+
* @throws {SkillValidationError} if validation fails
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateSkillSecurity(skill: Skill): void;
|
|
8
|
+
/**
|
|
9
|
+
* Validate file references in skill content
|
|
10
|
+
*
|
|
11
|
+
* Warns about external references and absolute paths
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateSkillReferences(skill: Skill): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Validate a skill's metadata
|
|
16
|
+
* Note: Zod already validates name format, max length, and description max length
|
|
17
|
+
* This function only validates requirements not covered by Zod
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateSkillMetadata(skill: Skill): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Get file statistics for a skill
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSkillStats(skill: Skill): {
|
|
24
|
+
totalSize: number;
|
|
25
|
+
fileCount: number;
|
|
26
|
+
largestFile: {
|
|
27
|
+
name: string;
|
|
28
|
+
size: number;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { join, normalize } from 'node:path';
|
|
2
|
+
import { SKILL_LIMITS, SUSPICIOUS_PATTERNS } from './constants';
|
|
3
|
+
import { SkillValidationError } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Validate a skill's security constraints
|
|
6
|
+
*
|
|
7
|
+
* @throws {SkillValidationError} if validation fails
|
|
8
|
+
*/
|
|
9
|
+
export function validateSkillSecurity(skill) {
|
|
10
|
+
const { MAX_FILE_SIZE, MAX_SKILL_SIZE } = SKILL_LIMITS;
|
|
11
|
+
// Check file sizes
|
|
12
|
+
let totalSize = 0;
|
|
13
|
+
// Check main content size
|
|
14
|
+
const contentSize = Buffer.byteLength(skill.content, 'utf8');
|
|
15
|
+
if (contentSize > MAX_FILE_SIZE) {
|
|
16
|
+
throw new SkillValidationError(`SKILL.md content exceeds size limit (${contentSize} > ${MAX_FILE_SIZE})`, join(skill.path, 'SKILL.md'));
|
|
17
|
+
}
|
|
18
|
+
totalSize += contentSize;
|
|
19
|
+
// Check supporting file sizes
|
|
20
|
+
for (const [filename, content] of skill.files) {
|
|
21
|
+
const fileSize = Buffer.byteLength(content, 'utf8');
|
|
22
|
+
if (fileSize > MAX_FILE_SIZE) {
|
|
23
|
+
throw new SkillValidationError(`File ${filename} exceeds size limit (${fileSize} > ${MAX_FILE_SIZE})`, join(skill.path, filename));
|
|
24
|
+
}
|
|
25
|
+
totalSize += fileSize;
|
|
26
|
+
}
|
|
27
|
+
// Check total skill size
|
|
28
|
+
if (totalSize > MAX_SKILL_SIZE) {
|
|
29
|
+
throw new SkillValidationError(`Skill total size exceeds limit (${totalSize} > ${MAX_SKILL_SIZE})`, skill.path);
|
|
30
|
+
}
|
|
31
|
+
// Check for suspicious patterns in all files
|
|
32
|
+
validateContentSecurity(skill.content, skill.path);
|
|
33
|
+
for (const [filename, content] of skill.files) {
|
|
34
|
+
validateContentSecurity(content, join(skill.path, filename));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate content for suspicious patterns
|
|
39
|
+
*/
|
|
40
|
+
function validateContentSecurity(content, path) {
|
|
41
|
+
for (const pattern of SUSPICIOUS_PATTERNS) {
|
|
42
|
+
if (pattern.test(content)) {
|
|
43
|
+
throw new SkillValidationError('Suspicious content detected', path);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate file references in skill content
|
|
49
|
+
*
|
|
50
|
+
* Warns about external references and absolute paths
|
|
51
|
+
*/
|
|
52
|
+
export function validateSkillReferences(skill) {
|
|
53
|
+
const warnings = [];
|
|
54
|
+
// Check for external network references
|
|
55
|
+
const externalRefs = skill.content.match(/https?:\/\/[^\s\])]+/g) || [];
|
|
56
|
+
if (externalRefs.length > 0 && !skill.metadata.description.toLowerCase().includes('external')) {
|
|
57
|
+
warnings.push(`Skill '${skill.metadata.name}' contains external references. Consider adding 'external' to description for transparency.`);
|
|
58
|
+
}
|
|
59
|
+
// Check for absolute paths in file references (markdown links and code)
|
|
60
|
+
// Only look in code blocks and markdown links to avoid false positives
|
|
61
|
+
const codeBlocks = skill.content.match(/```[\s\S]*?```/g) || [];
|
|
62
|
+
for (const block of codeBlocks) {
|
|
63
|
+
// Look for absolute paths starting with / but not common exceptions
|
|
64
|
+
const pathsInCode = block.match(/\/[a-zA-Z][\w./-]*/g) || [];
|
|
65
|
+
for (const path of pathsInCode) {
|
|
66
|
+
// Skip system paths and common non-filesystem patterns
|
|
67
|
+
if (!path.startsWith('/dev') && !path.startsWith('/proc') && !path.startsWith('/sys') && !path.startsWith('//')) {
|
|
68
|
+
warnings.push(`Skill '${skill.metadata.name}' contains possible absolute path '${path}'. Use relative paths instead.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Validate that referenced files exist
|
|
73
|
+
// Use a safe regex that extracts markdown link URLs
|
|
74
|
+
// Matches [text](url) where url can contain spaces but not unbalanced parentheses
|
|
75
|
+
// This prevents ReDoS vulnerabilities while supporting common markdown link patterns
|
|
76
|
+
const linkRegex = /\[[^\]]+\]\(([^)]+(?:\s+[^)]+)*)\)/g;
|
|
77
|
+
let match;
|
|
78
|
+
match = linkRegex.exec(skill.content);
|
|
79
|
+
while (match !== null) {
|
|
80
|
+
const filepath = match[1];
|
|
81
|
+
match = linkRegex.exec(skill.content);
|
|
82
|
+
// Skip external URLs and anchor links
|
|
83
|
+
if (filepath.startsWith('http://') || filepath.startsWith('https://') || filepath.startsWith('#')) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Normalize the filepath to handle ./prefix and redundant slashes
|
|
87
|
+
// Then convert backslashes to forward slashes for consistent lookup
|
|
88
|
+
// (discovery.ts always uses forward slashes in map keys)
|
|
89
|
+
const normalizedPath = normalize(filepath)
|
|
90
|
+
.replace(/^\.?\//, '')
|
|
91
|
+
.replace(/\\/g, '/');
|
|
92
|
+
// Check if referenced file exists
|
|
93
|
+
if (!skill.files.has(normalizedPath)) {
|
|
94
|
+
warnings.push(`Referenced file not found: ${filepath}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return warnings;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate a skill's metadata
|
|
101
|
+
* Note: Zod already validates name format, max length, and description max length
|
|
102
|
+
* This function only validates requirements not covered by Zod
|
|
103
|
+
*/
|
|
104
|
+
export function validateSkillMetadata(skill) {
|
|
105
|
+
const errors = [];
|
|
106
|
+
// Check that description is meaningful (Zod doesn't validate min length)
|
|
107
|
+
if (skill.metadata.description.length < 20) {
|
|
108
|
+
errors.push(`Description too short: ${skill.metadata.description.length} < 20`);
|
|
109
|
+
}
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get file statistics for a skill
|
|
114
|
+
*/
|
|
115
|
+
export function getSkillStats(skill) {
|
|
116
|
+
let totalSize = Buffer.byteLength(skill.content, 'utf8');
|
|
117
|
+
let largestFile = { name: 'SKILL.md', size: totalSize };
|
|
118
|
+
let fileCount = 1; // SKILL.md
|
|
119
|
+
for (const [name, content] of skill.files) {
|
|
120
|
+
const size = Buffer.byteLength(content, 'utf8');
|
|
121
|
+
totalSize += size;
|
|
122
|
+
fileCount++;
|
|
123
|
+
if (size > largestFile.size) {
|
|
124
|
+
largestFile = { name, size };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
totalSize,
|
|
129
|
+
fileCount,
|
|
130
|
+
largestFile,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/skills/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { JSONValue } from '@ai-sdk/provider';
|
|
2
|
+
import type { z } from 'zod';
|
|
3
|
+
export type ToolParameterValue = string | {
|
|
4
|
+
[key: string]: ToolParameterValue;
|
|
5
|
+
} | ToolParameterValue[];
|
|
6
|
+
export type ToolParameter = {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
required: boolean;
|
|
10
|
+
usageValue?: string;
|
|
11
|
+
allowMultiple?: boolean;
|
|
12
|
+
children?: ToolParameter[];
|
|
13
|
+
};
|
|
14
|
+
export type ToolInfo = {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
parameters: z.ZodObject<any>;
|
|
18
|
+
};
|
|
19
|
+
export type FullToolInfo = ToolInfo & {
|
|
20
|
+
handler: ToolHandler<ToolInfo, any>;
|
|
21
|
+
};
|
|
22
|
+
export type ToolResponseResultMedia = {
|
|
23
|
+
type: 'media';
|
|
24
|
+
data: string;
|
|
25
|
+
mediaType: string;
|
|
26
|
+
url: string;
|
|
27
|
+
};
|
|
28
|
+
export type ToolResponseResult = {
|
|
29
|
+
type: 'text';
|
|
30
|
+
value: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'json';
|
|
33
|
+
value: JSONValue;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'error-text';
|
|
36
|
+
value: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'error-json';
|
|
39
|
+
value: JSONValue;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'content';
|
|
42
|
+
value: Array<{
|
|
43
|
+
type: 'text';
|
|
44
|
+
text: string;
|
|
45
|
+
} | ToolResponseResultMedia>;
|
|
46
|
+
};
|
|
47
|
+
export type ToolResponse = {
|
|
48
|
+
success: boolean;
|
|
49
|
+
message: ToolResponseResult;
|
|
50
|
+
};
|
|
51
|
+
export type ToolHandler<_T, P> = (provider: P, args: Partial<Record<string, ToolParameterValue>>) => Promise<ToolResponse>;
|
package/dist/tool.js
ADDED
package/dist/tool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolHandler } from '../tool';
|
|
3
|
+
import type { InteractionProvider } from './provider';
|
|
4
|
+
export declare const toolInfo: {
|
|
5
|
+
readonly name: "askFollowupQuestion";
|
|
6
|
+
readonly description: "Call this when vital details are missing. Pose each follow-up as one direct, unambiguous question. If it speeds the reply, add up to five short, mutually-exclusive answer options. Group any related questions in the same call to avoid a back-and-forth chain.";
|
|
7
|
+
readonly parameters: z.ZodObject<{
|
|
8
|
+
questions: z.ZodArray<z.ZodObject<{
|
|
9
|
+
prompt: z.ZodString;
|
|
10
|
+
options: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
11
|
+
}, z.core.$strip>>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
};
|
|
14
|
+
export declare const handler: ToolHandler<typeof toolInfo, InteractionProvider>;
|
|
15
|
+
declare const _default: {
|
|
16
|
+
handler: ToolHandler<{
|
|
17
|
+
readonly name: "askFollowupQuestion";
|
|
18
|
+
readonly description: "Call this when vital details are missing. Pose each follow-up as one direct, unambiguous question. If it speeds the reply, add up to five short, mutually-exclusive answer options. Group any related questions in the same call to avoid a back-and-forth chain.";
|
|
19
|
+
readonly parameters: z.ZodObject<{
|
|
20
|
+
questions: z.ZodArray<z.ZodObject<{
|
|
21
|
+
prompt: z.ZodString;
|
|
22
|
+
options: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
23
|
+
}, z.core.$strip>>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
}, InteractionProvider>;
|
|
26
|
+
name: "askFollowupQuestion";
|
|
27
|
+
description: "Call this when vital details are missing. Pose each follow-up as one direct, unambiguous question. If it speeds the reply, add up to five short, mutually-exclusive answer options. Group any related questions in the same call to avoid a back-and-forth chain.";
|
|
28
|
+
parameters: z.ZodObject<{
|
|
29
|
+
questions: z.ZodArray<z.ZodObject<{
|
|
30
|
+
prompt: z.ZodString;
|
|
31
|
+
options: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
};
|
|
35
|
+
export default _default;
|