@polka-codes/core 0.10.11 → 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.
Files changed (250) hide show
  1. package/dist/Agent/backoff.d.ts +7 -0
  2. package/dist/Agent/backoff.js +21 -0
  3. package/dist/Agent/backoff.js.map +1 -0
  4. package/dist/Agent/index.d.ts +2 -0
  5. package/dist/Agent/index.js +3 -0
  6. package/dist/Agent/index.js.map +1 -0
  7. package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
  8. package/dist/Agent/parseJsonFromMarkdown.js +34 -0
  9. package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
  10. package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
  11. package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
  12. package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
  13. package/dist/Agent/prompts.d.ts +9 -0
  14. package/dist/Agent/prompts.js +107 -0
  15. package/dist/Agent/prompts.js.map +1 -0
  16. package/dist/UsageMeter.d.ts +101 -0
  17. package/dist/UsageMeter.js +299 -0
  18. package/dist/UsageMeter.js.map +1 -0
  19. package/dist/UsageMeter.test.d.ts +4 -0
  20. package/dist/UsageMeter.test.js +556 -0
  21. package/dist/UsageMeter.test.js.map +1 -0
  22. package/dist/config/base.d.ts +68 -0
  23. package/dist/config/base.js +56 -0
  24. package/dist/config/base.js.map +1 -0
  25. package/dist/config/memory.d.ts +24 -0
  26. package/dist/config/memory.js +36 -0
  27. package/dist/config/memory.js.map +1 -0
  28. package/dist/config.d.ts +236 -0
  29. package/dist/config.js +184 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/errors/base.d.ts +31 -0
  32. package/dist/errors/base.js +60 -0
  33. package/dist/errors/base.js.map +1 -0
  34. package/dist/errors/index.d.ts +1 -0
  35. package/dist/errors/index.js +3 -0
  36. package/dist/errors/index.js.map +1 -0
  37. package/dist/fs/index.d.ts +2 -0
  38. package/dist/fs/index.js +3 -0
  39. package/dist/fs/index.js.map +1 -0
  40. package/dist/fs/node-provider.d.ts +16 -0
  41. package/dist/fs/node-provider.js +47 -0
  42. package/dist/fs/node-provider.js.map +1 -0
  43. package/dist/fs/provider.d.ts +61 -0
  44. package/dist/fs/provider.js +3 -0
  45. package/dist/fs/provider.js.map +1 -0
  46. package/dist/index.d.ts +20 -191
  47. package/dist/index.js +21 -4123
  48. package/dist/index.js.map +1 -0
  49. package/dist/memory/index.d.ts +1 -0
  50. package/dist/memory/index.js +2 -0
  51. package/dist/memory/index.js.map +1 -0
  52. package/dist/memory/types.d.ts +136 -0
  53. package/dist/memory/types.js +2 -0
  54. package/dist/memory/types.js.map +1 -0
  55. package/dist/path.d.ts +9 -0
  56. package/dist/path.js +68 -0
  57. package/dist/path.js.map +1 -0
  58. package/dist/path.test.d.ts +1 -0
  59. package/dist/path.test.js +82 -0
  60. package/dist/path.test.js.map +1 -0
  61. package/dist/pricing/converter.d.ts +6 -0
  62. package/dist/pricing/converter.js +13 -0
  63. package/dist/pricing/converter.js.map +1 -0
  64. package/dist/pricing/converter.test.d.ts +1 -0
  65. package/dist/pricing/converter.test.js +54 -0
  66. package/dist/pricing/converter.test.js.map +1 -0
  67. package/dist/pricing/index.d.ts +2 -0
  68. package/dist/pricing/index.js +2 -0
  69. package/dist/pricing/index.js.map +1 -0
  70. package/dist/pricing/portkey-client.d.ts +2 -0
  71. package/dist/pricing/portkey-client.js +57 -0
  72. package/dist/pricing/portkey-client.js.map +1 -0
  73. package/dist/pricing/pricing-service.d.ts +6 -0
  74. package/dist/pricing/pricing-service.js +125 -0
  75. package/dist/pricing/pricing-service.js.map +1 -0
  76. package/dist/pricing/pricing-service.test.d.ts +1 -0
  77. package/dist/pricing/pricing-service.test.js +141 -0
  78. package/dist/pricing/pricing-service.test.js.map +1 -0
  79. package/dist/pricing/types.d.ts +24 -0
  80. package/dist/pricing/types.js +2 -0
  81. package/dist/pricing/types.js.map +1 -0
  82. package/dist/skills/__tests__/discovery.test.d.ts +1 -0
  83. package/dist/skills/__tests__/discovery.test.js +254 -0
  84. package/dist/skills/__tests__/discovery.test.js.map +1 -0
  85. package/dist/skills/__tests__/validation.test.d.ts +1 -0
  86. package/dist/skills/__tests__/validation.test.js +221 -0
  87. package/dist/skills/__tests__/validation.test.js.map +1 -0
  88. package/dist/skills/constants.d.ts +32 -0
  89. package/dist/skills/constants.js +50 -0
  90. package/dist/skills/constants.js.map +1 -0
  91. package/dist/skills/discovery.d.ts +56 -0
  92. package/dist/skills/discovery.js +392 -0
  93. package/dist/skills/discovery.js.map +1 -0
  94. package/dist/skills/index.d.ts +4 -0
  95. package/dist/skills/index.js +6 -0
  96. package/dist/skills/index.js.map +1 -0
  97. package/dist/skills/tools/index.d.ts +3 -0
  98. package/dist/skills/tools/index.js +5 -0
  99. package/dist/skills/tools/index.js.map +1 -0
  100. package/dist/skills/tools/listSkills.d.ts +54 -0
  101. package/dist/skills/tools/listSkills.js +52 -0
  102. package/dist/skills/tools/listSkills.js.map +1 -0
  103. package/dist/skills/tools/loadSkill.d.ts +52 -0
  104. package/dist/skills/tools/loadSkill.js +86 -0
  105. package/dist/skills/tools/loadSkill.js.map +1 -0
  106. package/dist/skills/tools/readSkillFile.d.ts +43 -0
  107. package/dist/skills/tools/readSkillFile.js +68 -0
  108. package/dist/skills/tools/readSkillFile.js.map +1 -0
  109. package/dist/skills/types.d.ts +83 -0
  110. package/dist/skills/types.js +42 -0
  111. package/dist/skills/types.js.map +1 -0
  112. package/dist/skills/validation.d.ts +30 -0
  113. package/dist/skills/validation.js +133 -0
  114. package/dist/skills/validation.js.map +1 -0
  115. package/dist/tool.d.ts +51 -0
  116. package/dist/tool.js +2 -0
  117. package/dist/tool.js.map +1 -0
  118. package/dist/tools/askFollowupQuestion.d.ts +35 -0
  119. package/dist/tools/askFollowupQuestion.js +105 -0
  120. package/dist/tools/askFollowupQuestion.js.map +1 -0
  121. package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
  122. package/dist/tools/askFollowupQuestion.test.js +80 -0
  123. package/dist/tools/askFollowupQuestion.test.js.map +1 -0
  124. package/dist/tools/executeCommand.d.ts +29 -0
  125. package/dist/tools/executeCommand.js +82 -0
  126. package/dist/tools/executeCommand.js.map +1 -0
  127. package/dist/tools/executeCommand.test.d.ts +1 -0
  128. package/dist/tools/executeCommand.test.js +60 -0
  129. package/dist/tools/executeCommand.test.js.map +1 -0
  130. package/dist/tools/fetchUrl.d.ts +26 -0
  131. package/dist/tools/fetchUrl.js +85 -0
  132. package/dist/tools/fetchUrl.js.map +1 -0
  133. package/dist/tools/index.d.ts +15 -0
  134. package/dist/tools/index.js +17 -0
  135. package/dist/tools/index.js.map +1 -0
  136. package/dist/tools/listFiles.d.ts +35 -0
  137. package/dist/tools/listFiles.js +61 -0
  138. package/dist/tools/listFiles.js.map +1 -0
  139. package/dist/tools/listFiles.test.d.ts +1 -0
  140. package/dist/tools/listFiles.test.js +59 -0
  141. package/dist/tools/listFiles.test.js.map +1 -0
  142. package/dist/tools/provider.d.ts +76 -0
  143. package/dist/tools/provider.js +60 -0
  144. package/dist/tools/provider.js.map +1 -0
  145. package/dist/tools/readBinaryFile.d.ts +26 -0
  146. package/dist/tools/readBinaryFile.js +52 -0
  147. package/dist/tools/readBinaryFile.js.map +1 -0
  148. package/dist/tools/readFile.d.ts +35 -0
  149. package/dist/tools/readFile.js +128 -0
  150. package/dist/tools/readFile.js.map +1 -0
  151. package/dist/tools/readFile.test.d.ts +1 -0
  152. package/dist/tools/readFile.test.js +37 -0
  153. package/dist/tools/readFile.test.js.map +1 -0
  154. package/dist/tools/removeFile.d.ts +26 -0
  155. package/dist/tools/removeFile.js +49 -0
  156. package/dist/tools/removeFile.js.map +1 -0
  157. package/dist/tools/removeFile.test.d.ts +1 -0
  158. package/dist/tools/removeFile.test.js +32 -0
  159. package/dist/tools/removeFile.test.js.map +1 -0
  160. package/dist/tools/renameFile.d.ts +29 -0
  161. package/dist/tools/renameFile.js +48 -0
  162. package/dist/tools/renameFile.js.map +1 -0
  163. package/dist/tools/renameFile.test.d.ts +1 -0
  164. package/dist/tools/renameFile.test.js +53 -0
  165. package/dist/tools/renameFile.test.js.map +1 -0
  166. package/dist/tools/replaceInFile.d.ts +29 -0
  167. package/dist/tools/replaceInFile.js +233 -0
  168. package/dist/tools/replaceInFile.js.map +1 -0
  169. package/dist/tools/replaceInFile.test.d.ts +1 -0
  170. package/dist/tools/replaceInFile.test.js +79 -0
  171. package/dist/tools/replaceInFile.test.js.map +1 -0
  172. package/dist/tools/response-builders.d.ts +64 -0
  173. package/dist/tools/response-builders.js +88 -0
  174. package/dist/tools/response-builders.js.map +1 -0
  175. package/dist/tools/search.d.ts +26 -0
  176. package/dist/tools/search.js +56 -0
  177. package/dist/tools/search.js.map +1 -0
  178. package/dist/tools/search.test.d.ts +1 -0
  179. package/dist/tools/search.test.js +22 -0
  180. package/dist/tools/search.test.js.map +1 -0
  181. package/dist/tools/searchFiles.d.ts +32 -0
  182. package/dist/tools/searchFiles.js +86 -0
  183. package/dist/tools/searchFiles.js.map +1 -0
  184. package/dist/tools/todo.d.ts +37 -0
  185. package/dist/tools/todo.js +41 -0
  186. package/dist/tools/todo.js.map +1 -0
  187. package/dist/tools/utils/index.d.ts +1 -0
  188. package/dist/tools/utils/index.js +2 -0
  189. package/dist/tools/utils/index.js.map +1 -0
  190. package/dist/tools/utils/replaceInFile.d.ts +7 -0
  191. package/dist/tools/utils/replaceInFile.js +133 -0
  192. package/dist/tools/utils/replaceInFile.js.map +1 -0
  193. package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
  194. package/dist/tools/utils/replaceInFile.test.js +308 -0
  195. package/dist/tools/utils/replaceInFile.test.js.map +1 -0
  196. package/dist/tools/utils.d.ts +10 -0
  197. package/dist/tools/utils.js +27 -0
  198. package/dist/tools/utils.js.map +1 -0
  199. package/dist/tools/writeToFile.d.ts +29 -0
  200. package/dist/tools/writeToFile.js +85 -0
  201. package/dist/tools/writeToFile.js.map +1 -0
  202. package/dist/tools/writeToFile.test.d.ts +1 -0
  203. package/dist/tools/writeToFile.test.js +46 -0
  204. package/dist/tools/writeToFile.test.js.map +1 -0
  205. package/dist/utils/index.d.ts +1 -0
  206. package/dist/utils/index.js +3 -0
  207. package/dist/utils/index.js.map +1 -0
  208. package/dist/utils/merge.d.ts +26 -0
  209. package/dist/utils/merge.js +45 -0
  210. package/dist/utils/merge.js.map +1 -0
  211. package/dist/workflow/agent.workflow.d.ts +39 -0
  212. package/dist/workflow/agent.workflow.js +166 -0
  213. package/dist/workflow/agent.workflow.js.map +1 -0
  214. package/dist/workflow/agent.workflow.test.d.ts +1 -0
  215. package/dist/workflow/agent.workflow.test.js +175 -0
  216. package/dist/workflow/agent.workflow.test.js.map +1 -0
  217. package/dist/workflow/control-flow.test.d.ts +1 -0
  218. package/dist/workflow/control-flow.test.js +323 -0
  219. package/dist/workflow/control-flow.test.js.map +1 -0
  220. package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
  221. package/dist/workflow/dynamic-edge-cases.test.js +486 -0
  222. package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
  223. package/dist/workflow/dynamic-types.d.ts +124 -0
  224. package/dist/workflow/dynamic-types.js +105 -0
  225. package/dist/workflow/dynamic-types.js.map +1 -0
  226. package/dist/workflow/dynamic.d.ts +118 -0
  227. package/dist/workflow/dynamic.js +999 -0
  228. package/dist/workflow/dynamic.js.map +1 -0
  229. package/dist/workflow/index.d.ts +6 -0
  230. package/dist/workflow/index.js +8 -0
  231. package/dist/workflow/index.js.map +1 -0
  232. package/dist/workflow/json-ai-types.d.ts +122 -0
  233. package/dist/workflow/json-ai-types.js +144 -0
  234. package/dist/workflow/json-ai-types.js.map +1 -0
  235. package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
  236. package/dist/workflow/json-schema-conversion.test.js +371 -0
  237. package/dist/workflow/json-schema-conversion.test.js.map +1 -0
  238. package/dist/workflow/try-catch.test.d.ts +1 -0
  239. package/dist/workflow/try-catch.test.js +443 -0
  240. package/dist/workflow/try-catch.test.js.map +1 -0
  241. package/dist/workflow/types.d.ts +103 -0
  242. package/dist/workflow/types.js +17 -0
  243. package/dist/workflow/types.js.map +1 -0
  244. package/dist/workflow/workflow.d.ts +29 -0
  245. package/dist/workflow/workflow.js +57 -0
  246. package/dist/workflow/workflow.js.map +1 -0
  247. package/dist/workflow/workflow.test.d.ts +1 -0
  248. package/dist/workflow/workflow.test.js +189 -0
  249. package/dist/workflow/workflow.test.js.map +1 -0
  250. 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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool.js.map
@@ -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;