@polka-codes/core 0.10.13 → 0.10.17

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,105 @@
1
+ import { z } from 'zod';
2
+ const questionObject = z.object({
3
+ prompt: z.string().describe('The text of the question.').meta({ usageValue: 'question text here' }),
4
+ options: z
5
+ .array(z.string())
6
+ .default([])
7
+ .describe('Ordered list of suggested answers (omit if none).')
8
+ .meta({ usageValue: 'suggested answer here' }),
9
+ });
10
+ export const toolInfo = {
11
+ name: 'askFollowupQuestion',
12
+ 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.',
13
+ parameters: z
14
+ .object({
15
+ questions: z
16
+ .array(questionObject)
17
+ .describe('One or more follow-up questions you need answered before you can continue.')
18
+ .meta({ usageValue: 'questions here' }),
19
+ })
20
+ .meta({
21
+ examples: [
22
+ {
23
+ description: 'Single clarifying question (no options)',
24
+ input: {
25
+ questions: [{ prompt: 'What is the target deployment environment?' }],
26
+ },
27
+ },
28
+ {
29
+ description: 'Single question with multiple-choice options',
30
+ input: {
31
+ questions: [
32
+ {
33
+ prompt: 'Which frontend framework are you using?',
34
+ options: ['React', 'Angular', 'Vue', 'Svelte'],
35
+ },
36
+ ],
37
+ },
38
+ },
39
+ {
40
+ description: 'Two related questions in one call',
41
+ input: {
42
+ questions: [
43
+ { prompt: 'What type of application are you building?' },
44
+ {
45
+ prompt: 'Preferred programming language?',
46
+ options: ['JavaScript', 'TypeScript', 'Python', 'Java'],
47
+ },
48
+ ],
49
+ },
50
+ },
51
+ {
52
+ description: 'Binary (yes/no) confirmation',
53
+ input: {
54
+ questions: [
55
+ {
56
+ prompt: 'Is it acceptable to refactor existing tests to improve performance?',
57
+ options: ['Yes', 'No'],
58
+ },
59
+ ],
60
+ },
61
+ },
62
+ ],
63
+ }),
64
+ };
65
+ export const handler = async (provider, args) => {
66
+ if (!provider.askFollowupQuestion) {
67
+ return {
68
+ success: false,
69
+ message: {
70
+ type: 'error-text',
71
+ value: 'Not possible to ask followup question.',
72
+ },
73
+ };
74
+ }
75
+ const { questions } = toolInfo.parameters.parse(args);
76
+ if (questions.length === 0) {
77
+ return {
78
+ success: false,
79
+ message: {
80
+ type: 'error-text',
81
+ value: 'No questions provided',
82
+ },
83
+ };
84
+ }
85
+ const answers = [];
86
+ for (const question of questions) {
87
+ const { prompt, options } = question;
88
+ const answer = await provider.askFollowupQuestion(prompt, options);
89
+ answers.push(`<ask_followup_question_answer question="${prompt}">
90
+ ${answer}
91
+ </ask_followup_question_answer>`);
92
+ }
93
+ return {
94
+ success: true,
95
+ message: {
96
+ type: 'text',
97
+ value: answers.join('\n'),
98
+ },
99
+ };
100
+ };
101
+ export default {
102
+ ...toolInfo,
103
+ handler,
104
+ };
105
+ //# sourceMappingURL=askFollowupQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askFollowupQuestion.js","sourceRoot":"","sources":["../../src/tools/askFollowupQuestion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it, spyOn } from 'bun:test';
2
+ import askFollowupQuestion from './askFollowupQuestion';
3
+ import { MockProvider } from './provider';
4
+ describe('askFollowupQuestion', () => {
5
+ it('should return the correct response', async () => {
6
+ const mockProvider = new MockProvider();
7
+ spyOn(mockProvider, 'askFollowupQuestion').mockResolvedValue('Test response');
8
+ const result = await askFollowupQuestion.handler(mockProvider, {
9
+ questions: [
10
+ {
11
+ prompt: 'Test question',
12
+ options: ['option1', 'option2'],
13
+ },
14
+ ],
15
+ });
16
+ expect(result).toMatchSnapshot();
17
+ });
18
+ it('should handle errors', async () => {
19
+ const mockProvider = new MockProvider();
20
+ spyOn(mockProvider, 'askFollowupQuestion').mockRejectedValue(new Error('Test error'));
21
+ await expect(askFollowupQuestion.handler(mockProvider, {
22
+ questions: [
23
+ {
24
+ prompt: 'Test question',
25
+ options: ['option1', 'option2'],
26
+ },
27
+ ],
28
+ })).rejects.toMatchSnapshot();
29
+ });
30
+ it('should handle multiple questions', async () => {
31
+ const mockProvider = new MockProvider();
32
+ spyOn(mockProvider, 'askFollowupQuestion').mockResolvedValue('Answer1|Answer2');
33
+ const result = await askFollowupQuestion.handler(mockProvider, {
34
+ questions: [
35
+ {
36
+ prompt: 'First question?',
37
+ options: ['A', 'B'],
38
+ },
39
+ {
40
+ prompt: 'Second question?',
41
+ options: ['X', 'Y'],
42
+ },
43
+ ],
44
+ });
45
+ expect(result).toMatchSnapshot();
46
+ });
47
+ it('should handle questions without options', async () => {
48
+ const mockProvider = new MockProvider();
49
+ spyOn(mockProvider, 'askFollowupQuestion').mockResolvedValue('Free text answer');
50
+ const result = await askFollowupQuestion.handler(mockProvider, {
51
+ questions: [
52
+ {
53
+ prompt: 'Open-ended question',
54
+ },
55
+ ],
56
+ });
57
+ expect(result).toMatchSnapshot();
58
+ });
59
+ it('should handle empty options array', async () => {
60
+ const mockProvider = new MockProvider();
61
+ spyOn(mockProvider, 'askFollowupQuestion').mockResolvedValue('Fallback answer');
62
+ const result = await askFollowupQuestion.handler(mockProvider, {
63
+ questions: [
64
+ {
65
+ prompt: 'Question with empty options',
66
+ options: [],
67
+ },
68
+ ],
69
+ });
70
+ expect(result).toMatchSnapshot();
71
+ });
72
+ it('should validate required parameters', async () => {
73
+ const mockProvider = new MockProvider();
74
+ await expect(askFollowupQuestion.handler(mockProvider, {})).rejects.toMatchSnapshot();
75
+ await expect(askFollowupQuestion.handler(mockProvider, {
76
+ questions: [{}],
77
+ })).rejects.toMatchSnapshot();
78
+ });
79
+ });
80
+ //# sourceMappingURL=askFollowupQuestion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askFollowupQuestion.test.js","sourceRoot":"","sources":["../../src/tools/askFollowupQuestion.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../tool';
3
+ import type { CommandProvider } from './provider';
4
+ export declare const toolInfo: {
5
+ readonly name: "executeCommand";
6
+ readonly description: "Run a single CLI command. The command is always executed in the project-root working directory (regardless of earlier commands). Prefer one-off shell commands over wrapper scripts for flexibility. **IMPORTANT**: After an `execute_command` call, you MUST stop and NOT allowed to make further tool calls in the same message.";
7
+ readonly parameters: z.ZodObject<{
8
+ command: z.ZodString;
9
+ requiresApproval: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
10
+ }, z.core.$strip>;
11
+ };
12
+ export declare const handler: ToolHandler<typeof toolInfo, CommandProvider>;
13
+ declare const _default: {
14
+ handler: ToolHandler<{
15
+ readonly name: "executeCommand";
16
+ readonly description: "Run a single CLI command. The command is always executed in the project-root working directory (regardless of earlier commands). Prefer one-off shell commands over wrapper scripts for flexibility. **IMPORTANT**: After an `execute_command` call, you MUST stop and NOT allowed to make further tool calls in the same message.";
17
+ readonly parameters: z.ZodObject<{
18
+ command: z.ZodString;
19
+ requiresApproval: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
20
+ }, z.core.$strip>;
21
+ }, CommandProvider>;
22
+ name: "executeCommand";
23
+ description: "Run a single CLI command. The command is always executed in the project-root working directory (regardless of earlier commands). Prefer one-off shell commands over wrapper scripts for flexibility. **IMPORTANT**: After an `execute_command` call, you MUST stop and NOT allowed to make further tool calls in the same message.";
24
+ parameters: z.ZodObject<{
25
+ command: z.ZodString;
26
+ requiresApproval: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
27
+ }, z.core.$strip>;
28
+ };
29
+ export default _default;
@@ -0,0 +1,82 @@
1
+ import { z } from 'zod';
2
+ import { createProviderError, preprocessBoolean } from './utils';
3
+ export const toolInfo = {
4
+ name: 'executeCommand',
5
+ description: 'Run a single CLI command. The command is always executed in the project-root working directory (regardless of earlier commands). Prefer one-off shell commands over wrapper scripts for flexibility. **IMPORTANT**: After an `execute_command` call, you MUST stop and NOT allowed to make further tool calls in the same message.',
6
+ parameters: z
7
+ .object({
8
+ command: z
9
+ .string()
10
+ .describe('The exact command to run (valid for the current OS). It must be correctly formatted and free of harmful instructions.')
11
+ .meta({ usageValue: 'your-command-here' }),
12
+ requiresApproval: z
13
+ .preprocess(preprocessBoolean, z.boolean().optional().default(false))
14
+ .describe('Set to `true` for commands that install/uninstall software, modify or delete files, change system settings, perform network operations, or have other side effects. Use `false` for safe, read-only, or purely local development actions (e.g., listing files, make a build, running tests).')
15
+ .meta({ usageValue: 'true | false' }),
16
+ })
17
+ .meta({
18
+ examples: [
19
+ {
20
+ description: 'Make a build',
21
+ input: {
22
+ command: 'npm run build',
23
+ requiresApproval: 'false',
24
+ },
25
+ },
26
+ ],
27
+ }),
28
+ };
29
+ export const handler = async (provider, args) => {
30
+ if (!provider.executeCommand) {
31
+ return createProviderError('execute command. Abort');
32
+ }
33
+ const { command, requiresApproval } = toolInfo.parameters.parse(args);
34
+ try {
35
+ const result = await provider.executeCommand(command, requiresApproval);
36
+ let message = `<command>${command}</command>
37
+ <command_exit_code>${result.exitCode}</command_exit_code>
38
+ `;
39
+ if (result.summary) {
40
+ message += `<command_output_summary>\n${result.summary}\n</command_output_summary>\n`;
41
+ }
42
+ else {
43
+ message += `<command_stdout>
44
+ ${result.stdout}
45
+ </command_stdout>
46
+ <command_stderr>
47
+ ${result.stderr}
48
+ </command_stderr>
49
+ `;
50
+ }
51
+ if (result.exitCode === 0) {
52
+ return {
53
+ success: true,
54
+ message: {
55
+ type: 'text',
56
+ value: message,
57
+ },
58
+ };
59
+ }
60
+ return {
61
+ success: false,
62
+ message: {
63
+ type: 'error-text',
64
+ value: message,
65
+ },
66
+ };
67
+ }
68
+ catch (error) {
69
+ return {
70
+ success: false,
71
+ message: {
72
+ type: 'error-text',
73
+ value: error instanceof Error ? error.message : String(error),
74
+ },
75
+ };
76
+ }
77
+ };
78
+ export default {
79
+ ...toolInfo,
80
+ handler,
81
+ };
82
+ //# sourceMappingURL=executeCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeCommand.js","sourceRoot":"","sources":["../../src/tools/executeCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,oUAAoU;IAEtU,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,CAAC,wHAAwH,CAAC;aAClI,IAAI,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;QAC5C,gBAAgB,EAAE,CAAC;aAChB,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aACpE,QAAQ,CACP,8RAA8R,CAC/R;aACA,IAAI,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;KACxC,CAAC;SACD,IAAI,CAAC;QACJ,QAAQ,EAAE;YACR;gBACE,WAAW,EAAE,cAAc;gBAC3B,KAAK,EAAE;oBACL,OAAO,EAAE,eAAe;oBACxB,gBAAgB,EAAE,OAAO;iBAC1B;aACF;SACF;KACF,CAAC;CACuB,CAAA;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAkD,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC7F,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC7B,OAAO,mBAAmB,CAAC,wBAAwB,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;QACvE,IAAI,OAAO,GAAG,YAAY,OAAO;qBAChB,MAAM,CAAC,QAAQ;CACnC,CAAA;QACG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,IAAI,6BAA6B,MAAM,CAAC,OAAO,+BAA+B,CAAA;QACvF,CAAC;aAAM,CAAC;YACN,OAAO,IAAI;EACf,MAAM,CAAC,MAAM;;;EAGb,MAAM,CAAC,MAAM;;CAEd,CAAA;QACG,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,OAAO;iBACf;aACF,CAAA;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,OAAO;aACf;SACF,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D;SACF,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,eAAe;IACb,GAAG,QAAQ;IACX,OAAO;CACe,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it, spyOn } from 'bun:test';
2
+ import executeCommand from './executeCommand';
3
+ import { MockProvider } from './provider';
4
+ describe('executeCommand', () => {
5
+ it('should execute command successfully', async () => {
6
+ const mockProvider = new MockProvider();
7
+ spyOn(mockProvider, 'executeCommand').mockResolvedValue({
8
+ stdout: 'Command output',
9
+ stderr: 'stderr',
10
+ exitCode: 0,
11
+ });
12
+ const result = await executeCommand.handler(mockProvider, {
13
+ command: 'echo test',
14
+ requiresApproval: 'false',
15
+ });
16
+ expect(result).toMatchSnapshot();
17
+ expect(mockProvider.executeCommand).toHaveBeenCalledWith('echo test', false);
18
+ });
19
+ it('should handle command errors', async () => {
20
+ const mockProvider = new MockProvider();
21
+ spyOn(mockProvider, 'executeCommand').mockRejectedValue(new Error('Command failed'));
22
+ const result = executeCommand.handler(mockProvider, {
23
+ command: 'invalid-command',
24
+ requiresApproval: 'false',
25
+ });
26
+ // The handler now catches the error and returns a ToolResponseError
27
+ const toolResponse = await result;
28
+ expect(toolResponse).toMatchSnapshot();
29
+ expect(mockProvider.executeCommand).toHaveBeenCalledWith('invalid-command', false);
30
+ });
31
+ it('should handle command with non-zero exit code', async () => {
32
+ const mockProvider = new MockProvider();
33
+ spyOn(mockProvider, 'executeCommand').mockResolvedValue({
34
+ stdout: 'Command output',
35
+ stderr: 'stderr',
36
+ exitCode: 1,
37
+ });
38
+ const result = await executeCommand.handler(mockProvider, {
39
+ command: 'invalid-command',
40
+ requiresApproval: 'false',
41
+ });
42
+ expect(result).toMatchSnapshot();
43
+ expect(mockProvider.executeCommand).toHaveBeenCalledWith('invalid-command', false);
44
+ });
45
+ it('should handle approval required', async () => {
46
+ const mockProvider = new MockProvider();
47
+ spyOn(mockProvider, 'executeCommand').mockResolvedValue({
48
+ stdout: 'Approved command',
49
+ stderr: 'stderr',
50
+ exitCode: 0,
51
+ });
52
+ const result = await executeCommand.handler(mockProvider, {
53
+ command: 'rm -rf /',
54
+ requiresApproval: 'true',
55
+ });
56
+ expect(result).toMatchSnapshot();
57
+ expect(mockProvider.executeCommand).toHaveBeenCalledWith('rm -rf /', true);
58
+ });
59
+ });
60
+ //# sourceMappingURL=executeCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeCommand.test.js","sourceRoot":"","sources":["../../src/tools/executeCommand.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../tool';
3
+ import type { WebProvider } from './provider';
4
+ export declare const toolInfo: {
5
+ readonly name: "fetchUrl";
6
+ readonly description: "Fetch the content located at one or more HTTP(S) URLs and return it in Markdown format. This works for standard web pages as well as raw files (e.g. README.md, source code) hosted on platforms like GitHub.";
7
+ readonly parameters: z.ZodObject<{
8
+ url: z.ZodPipe<z.ZodTransform<string[], unknown>, z.ZodArray<z.ZodString>>;
9
+ }, z.core.$strip>;
10
+ };
11
+ export declare const handler: ToolHandler<typeof toolInfo, WebProvider>;
12
+ declare const _default: {
13
+ handler: ToolHandler<{
14
+ readonly name: "fetchUrl";
15
+ readonly description: "Fetch the content located at one or more HTTP(S) URLs and return it in Markdown format. This works for standard web pages as well as raw files (e.g. README.md, source code) hosted on platforms like GitHub.";
16
+ readonly parameters: z.ZodObject<{
17
+ url: z.ZodPipe<z.ZodTransform<string[], unknown>, z.ZodArray<z.ZodString>>;
18
+ }, z.core.$strip>;
19
+ }, WebProvider>;
20
+ name: "fetchUrl";
21
+ description: "Fetch the content located at one or more HTTP(S) URLs and return it in Markdown format. This works for standard web pages as well as raw files (e.g. README.md, source code) hosted on platforms like GitHub.";
22
+ parameters: z.ZodObject<{
23
+ url: z.ZodPipe<z.ZodTransform<string[], unknown>, z.ZodArray<z.ZodString>>;
24
+ }, z.core.$strip>;
25
+ };
26
+ export default _default;
@@ -0,0 +1,85 @@
1
+ // generated by polka.codes
2
+ import { z } from 'zod';
3
+ export const toolInfo = {
4
+ name: 'fetchUrl',
5
+ description: 'Fetch the content located at one or more HTTP(S) URLs and return it in Markdown format. This works for standard web pages as well as raw files (e.g. README.md, source code) hosted on platforms like GitHub.',
6
+ parameters: z
7
+ .object({
8
+ url: z
9
+ .preprocess((val) => {
10
+ if (!val)
11
+ return [];
12
+ const values = Array.isArray(val) ? val : [val];
13
+ return values.flatMap((i) => (typeof i === 'string' ? i.split(',') : [])).filter((s) => s.length > 0);
14
+ }, z.array(z.string()))
15
+ .describe('One or more URLs to fetch, separated by commas if multiple.')
16
+ .meta({ usageValue: 'url' }),
17
+ })
18
+ .meta({
19
+ examples: [
20
+ {
21
+ description: 'Fetch a single webpage',
22
+ input: {
23
+ url: 'https://example.com',
24
+ },
25
+ },
26
+ {
27
+ description: 'Fetch multiple webpages',
28
+ input: {
29
+ url: 'https://example.com,https://developer.mozilla.org/en-US/docs/Web/HTTP',
30
+ },
31
+ },
32
+ {
33
+ description: 'Fetch a raw file from GitHub',
34
+ input: {
35
+ url: 'https://raw.githubusercontent.com/user/repo/main/README.md',
36
+ },
37
+ },
38
+ ],
39
+ }),
40
+ };
41
+ export const handler = async (provider, args) => {
42
+ if (!provider.fetchUrl) {
43
+ return {
44
+ success: false,
45
+ message: {
46
+ type: 'error-text',
47
+ value: 'Not possible to fetch url.',
48
+ },
49
+ };
50
+ }
51
+ const { url: urls } = toolInfo.parameters.parse(args);
52
+ if (urls.length === 0) {
53
+ return {
54
+ success: false,
55
+ message: {
56
+ type: 'error-text',
57
+ value: 'No URLs provided. Please provide at least one URL to fetch.',
58
+ },
59
+ };
60
+ }
61
+ const results = [];
62
+ for (const url of urls) {
63
+ try {
64
+ const content = provider.fetchUrl(url).then((res) => `<fetch_url_content url="${url}">${res}</fetch_url_content>`);
65
+ results.push(content);
66
+ }
67
+ catch (error) {
68
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
69
+ results.push(Promise.resolve(`<fetch_url_error url="${url}">${errorMessage}</fetch_url_error>`));
70
+ }
71
+ }
72
+ const resolvedResults = await Promise.all(results);
73
+ return {
74
+ success: true,
75
+ message: {
76
+ type: 'text',
77
+ value: resolvedResults.join('\n'),
78
+ },
79
+ };
80
+ };
81
+ export default {
82
+ ...toolInfo,
83
+ handler,
84
+ };
85
+ //# sourceMappingURL=fetchUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchUrl.js","sourceRoot":"","sources":["../../src/tools/fetchUrl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export { default as askFollowupQuestion } from './askFollowupQuestion';
2
+ export { default as executeCommand } from './executeCommand';
3
+ export { default as fetchUrl } from './fetchUrl';
4
+ export { default as listFiles } from './listFiles';
5
+ export * from './provider';
6
+ export { default as readBinaryFile } from './readBinaryFile';
7
+ export { default as readFile } from './readFile';
8
+ export { default as removeFile } from './removeFile';
9
+ export { default as renameFile } from './renameFile';
10
+ export { default as replaceInFile } from './replaceInFile';
11
+ export { createErrorResponse, createProviderErrorResponse, createSuccessResponse, createValidationErrorResponse, } from './response-builders';
12
+ export { default as search } from './search';
13
+ export { default as searchFiles } from './searchFiles';
14
+ export * from './todo';
15
+ export { default as writeToFile } from './writeToFile';
@@ -0,0 +1,17 @@
1
+ // generated by polka.codes
2
+ export { default as askFollowupQuestion } from './askFollowupQuestion';
3
+ export { default as executeCommand } from './executeCommand';
4
+ export { default as fetchUrl } from './fetchUrl';
5
+ export { default as listFiles } from './listFiles';
6
+ export * from './provider';
7
+ export { default as readBinaryFile } from './readBinaryFile';
8
+ export { default as readFile } from './readFile';
9
+ export { default as removeFile } from './removeFile';
10
+ export { default as renameFile } from './renameFile';
11
+ export { default as replaceInFile } from './replaceInFile';
12
+ export { createErrorResponse, createProviderErrorResponse, createSuccessResponse, createValidationErrorResponse, } from './response-builders';
13
+ export { default as search } from './search';
14
+ export { default as searchFiles } from './searchFiles';
15
+ export * from './todo';
16
+ export { default as writeToFile } from './writeToFile';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAA;AAElD,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,cAAc,QAAQ,CAAA;AACtB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../tool';
3
+ import type { FilesystemProvider } from './provider';
4
+ export declare const toolInfo: {
5
+ readonly name: "listFiles";
6
+ readonly description: "Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.";
7
+ readonly parameters: z.ZodObject<{
8
+ path: z.ZodString;
9
+ maxCount: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
10
+ recursive: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
11
+ includeIgnored: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
12
+ }, z.core.$strip>;
13
+ };
14
+ export declare const handler: ToolHandler<typeof toolInfo, FilesystemProvider>;
15
+ declare const _default: {
16
+ handler: ToolHandler<{
17
+ readonly name: "listFiles";
18
+ readonly description: "Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.";
19
+ readonly parameters: z.ZodObject<{
20
+ path: z.ZodString;
21
+ maxCount: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
22
+ recursive: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
23
+ includeIgnored: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
24
+ }, z.core.$strip>;
25
+ }, FilesystemProvider>;
26
+ name: "listFiles";
27
+ description: "Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.";
28
+ parameters: z.ZodObject<{
29
+ path: z.ZodString;
30
+ maxCount: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
31
+ recursive: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
32
+ includeIgnored: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
33
+ }, z.core.$strip>;
34
+ };
35
+ export default _default;
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { createProviderError, preprocessBoolean } from './utils';
3
+ export const toolInfo = {
4
+ name: 'listFiles',
5
+ description: 'Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.',
6
+ parameters: z
7
+ .object({
8
+ path: z
9
+ .string()
10
+ .describe('The path of the directory to list contents for (relative to the current working directory)')
11
+ .meta({ usageValue: 'Directory path here' }),
12
+ maxCount: z.coerce
13
+ .number()
14
+ .optional()
15
+ .default(2000)
16
+ .describe('The maximum number of files to list. Default to 2000')
17
+ .meta({ usageValue: 'Maximum number of files to list (optional)' }),
18
+ recursive: z
19
+ .preprocess(preprocessBoolean, z.boolean().optional().default(true))
20
+ .describe('Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.')
21
+ .meta({ usageValue: 'true or false (optional)' }),
22
+ includeIgnored: z
23
+ .preprocess(preprocessBoolean, z.boolean().optional().default(false))
24
+ .describe('Whether to include ignored files. Use true to include files ignored by .gitignore.')
25
+ .meta({ usageValue: 'true or false (optional)' }),
26
+ })
27
+ .meta({
28
+ examples: [
29
+ {
30
+ description: 'Request to list files',
31
+ input: {
32
+ path: 'src',
33
+ maxCount: '100',
34
+ },
35
+ },
36
+ ],
37
+ }),
38
+ };
39
+ export const handler = async (provider, args) => {
40
+ if (!provider.listFiles) {
41
+ return createProviderError('list files');
42
+ }
43
+ const { path, maxCount, recursive, includeIgnored } = toolInfo.parameters.parse(args);
44
+ const [files, limitReached] = await provider.listFiles(path, recursive, maxCount, includeIgnored);
45
+ return {
46
+ success: true,
47
+ message: {
48
+ type: 'text',
49
+ value: `<list_files_path>${path}</list_files_path>
50
+ <list_files_files>
51
+ ${files.join('\n')}
52
+ </list_files_files>
53
+ <list_files_truncated>${limitReached}</list_files_truncated>`,
54
+ },
55
+ };
56
+ };
57
+ export default {
58
+ ...toolInfo,
59
+ handler,
60
+ };
61
+ //# sourceMappingURL=listFiles.js.map