wave-agent-sdk 0.0.1

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 (170) hide show
  1. package/README.md +32 -0
  2. package/dist/agent.d.ts +96 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +286 -0
  5. package/dist/hooks/executor.d.ts +56 -0
  6. package/dist/hooks/executor.d.ts.map +1 -0
  7. package/dist/hooks/executor.js +312 -0
  8. package/dist/hooks/index.d.ts +17 -0
  9. package/dist/hooks/index.d.ts.map +1 -0
  10. package/dist/hooks/index.js +14 -0
  11. package/dist/hooks/manager.d.ts +90 -0
  12. package/dist/hooks/manager.d.ts.map +1 -0
  13. package/dist/hooks/manager.js +395 -0
  14. package/dist/hooks/matcher.d.ts +49 -0
  15. package/dist/hooks/matcher.d.ts.map +1 -0
  16. package/dist/hooks/matcher.js +147 -0
  17. package/dist/hooks/settings.d.ts +46 -0
  18. package/dist/hooks/settings.d.ts.map +1 -0
  19. package/dist/hooks/settings.js +100 -0
  20. package/dist/hooks/types.d.ts +80 -0
  21. package/dist/hooks/types.d.ts.map +1 -0
  22. package/dist/hooks/types.js +59 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +20 -0
  26. package/dist/managers/aiManager.d.ts +61 -0
  27. package/dist/managers/aiManager.d.ts.map +1 -0
  28. package/dist/managers/aiManager.js +415 -0
  29. package/dist/managers/backgroundBashManager.d.ts +27 -0
  30. package/dist/managers/backgroundBashManager.d.ts.map +1 -0
  31. package/dist/managers/backgroundBashManager.js +166 -0
  32. package/dist/managers/bashManager.d.ts +20 -0
  33. package/dist/managers/bashManager.d.ts.map +1 -0
  34. package/dist/managers/bashManager.js +66 -0
  35. package/dist/managers/mcpManager.d.ts +63 -0
  36. package/dist/managers/mcpManager.d.ts.map +1 -0
  37. package/dist/managers/mcpManager.js +378 -0
  38. package/dist/managers/messageManager.d.ts +85 -0
  39. package/dist/managers/messageManager.d.ts.map +1 -0
  40. package/dist/managers/messageManager.js +265 -0
  41. package/dist/managers/skillManager.d.ts +59 -0
  42. package/dist/managers/skillManager.d.ts.map +1 -0
  43. package/dist/managers/skillManager.js +317 -0
  44. package/dist/managers/slashCommandManager.d.ts +77 -0
  45. package/dist/managers/slashCommandManager.d.ts.map +1 -0
  46. package/dist/managers/slashCommandManager.js +208 -0
  47. package/dist/managers/toolManager.d.ts +23 -0
  48. package/dist/managers/toolManager.d.ts.map +1 -0
  49. package/dist/managers/toolManager.js +79 -0
  50. package/dist/services/aiService.d.ts +28 -0
  51. package/dist/services/aiService.d.ts.map +1 -0
  52. package/dist/services/aiService.js +180 -0
  53. package/dist/services/memory.d.ts +8 -0
  54. package/dist/services/memory.d.ts.map +1 -0
  55. package/dist/services/memory.js +128 -0
  56. package/dist/services/session.d.ts +54 -0
  57. package/dist/services/session.d.ts.map +1 -0
  58. package/dist/services/session.js +196 -0
  59. package/dist/tools/bashTool.d.ts +14 -0
  60. package/dist/tools/bashTool.d.ts.map +1 -0
  61. package/dist/tools/bashTool.js +351 -0
  62. package/dist/tools/deleteFileTool.d.ts +6 -0
  63. package/dist/tools/deleteFileTool.d.ts.map +1 -0
  64. package/dist/tools/deleteFileTool.js +67 -0
  65. package/dist/tools/editTool.d.ts +6 -0
  66. package/dist/tools/editTool.d.ts.map +1 -0
  67. package/dist/tools/editTool.js +168 -0
  68. package/dist/tools/globTool.d.ts +6 -0
  69. package/dist/tools/globTool.d.ts.map +1 -0
  70. package/dist/tools/globTool.js +113 -0
  71. package/dist/tools/grepTool.d.ts +6 -0
  72. package/dist/tools/grepTool.d.ts.map +1 -0
  73. package/dist/tools/grepTool.js +268 -0
  74. package/dist/tools/lsTool.d.ts +6 -0
  75. package/dist/tools/lsTool.d.ts.map +1 -0
  76. package/dist/tools/lsTool.js +160 -0
  77. package/dist/tools/multiEditTool.d.ts +6 -0
  78. package/dist/tools/multiEditTool.d.ts.map +1 -0
  79. package/dist/tools/multiEditTool.js +222 -0
  80. package/dist/tools/readTool.d.ts +6 -0
  81. package/dist/tools/readTool.d.ts.map +1 -0
  82. package/dist/tools/readTool.js +136 -0
  83. package/dist/tools/types.d.ts +35 -0
  84. package/dist/tools/types.d.ts.map +1 -0
  85. package/dist/tools/types.js +4 -0
  86. package/dist/tools/writeTool.d.ts +6 -0
  87. package/dist/tools/writeTool.d.ts.map +1 -0
  88. package/dist/tools/writeTool.js +138 -0
  89. package/dist/types.d.ts +212 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +13 -0
  92. package/dist/utils/bashHistory.d.ts +46 -0
  93. package/dist/utils/bashHistory.d.ts.map +1 -0
  94. package/dist/utils/bashHistory.js +236 -0
  95. package/dist/utils/commandArgumentParser.d.ts +34 -0
  96. package/dist/utils/commandArgumentParser.d.ts.map +1 -0
  97. package/dist/utils/commandArgumentParser.js +123 -0
  98. package/dist/utils/constants.d.ts +27 -0
  99. package/dist/utils/constants.d.ts.map +1 -0
  100. package/dist/utils/constants.js +28 -0
  101. package/dist/utils/convertMessagesForAPI.d.ts +9 -0
  102. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -0
  103. package/dist/utils/convertMessagesForAPI.js +189 -0
  104. package/dist/utils/customCommands.d.ts +14 -0
  105. package/dist/utils/customCommands.d.ts.map +1 -0
  106. package/dist/utils/customCommands.js +71 -0
  107. package/dist/utils/fileFilter.d.ts +26 -0
  108. package/dist/utils/fileFilter.d.ts.map +1 -0
  109. package/dist/utils/fileFilter.js +177 -0
  110. package/dist/utils/markdownParser.d.ts +27 -0
  111. package/dist/utils/markdownParser.d.ts.map +1 -0
  112. package/dist/utils/markdownParser.js +109 -0
  113. package/dist/utils/mcpUtils.d.ts +24 -0
  114. package/dist/utils/mcpUtils.d.ts.map +1 -0
  115. package/dist/utils/mcpUtils.js +51 -0
  116. package/dist/utils/messageOperations.d.ts +118 -0
  117. package/dist/utils/messageOperations.d.ts.map +1 -0
  118. package/dist/utils/messageOperations.js +334 -0
  119. package/dist/utils/path.d.ts +25 -0
  120. package/dist/utils/path.d.ts.map +1 -0
  121. package/dist/utils/path.js +109 -0
  122. package/dist/utils/skillParser.d.ts +18 -0
  123. package/dist/utils/skillParser.d.ts.map +1 -0
  124. package/dist/utils/skillParser.js +147 -0
  125. package/dist/utils/stringUtils.d.ts +13 -0
  126. package/dist/utils/stringUtils.d.ts.map +1 -0
  127. package/dist/utils/stringUtils.js +44 -0
  128. package/package.json +51 -0
  129. package/src/agent.ts +405 -0
  130. package/src/hooks/executor.ts +440 -0
  131. package/src/hooks/index.ts +52 -0
  132. package/src/hooks/manager.ts +618 -0
  133. package/src/hooks/matcher.ts +187 -0
  134. package/src/hooks/settings.ts +129 -0
  135. package/src/hooks/types.ts +169 -0
  136. package/src/index.ts +24 -0
  137. package/src/managers/aiManager.ts +573 -0
  138. package/src/managers/backgroundBashManager.ts +203 -0
  139. package/src/managers/bashManager.ts +97 -0
  140. package/src/managers/mcpManager.ts +493 -0
  141. package/src/managers/messageManager.ts +415 -0
  142. package/src/managers/skillManager.ts +404 -0
  143. package/src/managers/slashCommandManager.ts +293 -0
  144. package/src/managers/toolManager.ts +106 -0
  145. package/src/services/aiService.ts +252 -0
  146. package/src/services/memory.ts +149 -0
  147. package/src/services/session.ts +265 -0
  148. package/src/tools/bashTool.ts +402 -0
  149. package/src/tools/deleteFileTool.ts +81 -0
  150. package/src/tools/editTool.ts +192 -0
  151. package/src/tools/globTool.ts +135 -0
  152. package/src/tools/grepTool.ts +326 -0
  153. package/src/tools/lsTool.ts +187 -0
  154. package/src/tools/multiEditTool.ts +268 -0
  155. package/src/tools/readTool.ts +165 -0
  156. package/src/tools/types.ts +47 -0
  157. package/src/tools/writeTool.ts +163 -0
  158. package/src/types.ts +260 -0
  159. package/src/utils/bashHistory.ts +303 -0
  160. package/src/utils/commandArgumentParser.ts +153 -0
  161. package/src/utils/constants.ts +37 -0
  162. package/src/utils/convertMessagesForAPI.ts +236 -0
  163. package/src/utils/customCommands.ts +85 -0
  164. package/src/utils/fileFilter.ts +202 -0
  165. package/src/utils/markdownParser.ts +156 -0
  166. package/src/utils/mcpUtils.ts +81 -0
  167. package/src/utils/messageOperations.ts +506 -0
  168. package/src/utils/path.ts +118 -0
  169. package/src/utils/skillParser.ts +188 -0
  170. package/src/utils/stringUtils.ts +50 -0
@@ -0,0 +1,188 @@
1
+ import { readFileSync } from "fs";
2
+ import { dirname } from "path";
3
+ import type {
4
+ ParsedSkillFile,
5
+ SkillParseOptions,
6
+ SkillFrontmatter,
7
+ SkillMetadata,
8
+ } from "../types.js";
9
+
10
+ /**
11
+ * Parse a SKILL.md file and validate its contents
12
+ */
13
+ export function parseSkillFile(
14
+ filePath: string,
15
+ options: SkillParseOptions = {},
16
+ ): ParsedSkillFile {
17
+ const { validateMetadata = true, basePath } = options;
18
+
19
+ const result: ParsedSkillFile = {
20
+ frontmatter: { name: "", description: "" },
21
+ content: "",
22
+ skillMetadata: {
23
+ name: "",
24
+ description: "",
25
+ type: "personal",
26
+ skillPath: "",
27
+ },
28
+ validationErrors: [],
29
+ isValid: false,
30
+ };
31
+
32
+ try {
33
+ // Read file content
34
+ const content = readFileSync(filePath, "utf-8");
35
+ result.content = content;
36
+
37
+ // Parse YAML frontmatter
38
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
39
+ if (!frontmatterMatch) {
40
+ result.validationErrors.push("Missing YAML frontmatter");
41
+ return result;
42
+ }
43
+
44
+ const yamlContent = frontmatterMatch[1];
45
+ result.frontmatter = parseYamlFrontmatter(yamlContent);
46
+
47
+ if (!result.frontmatter.name || !result.frontmatter.description) {
48
+ result.validationErrors.push(
49
+ "Missing required fields: name and description",
50
+ );
51
+ return result;
52
+ }
53
+
54
+ // Determine skill type and path
55
+ const skillPath = basePath || dirname(filePath);
56
+ const skillType = skillPath.includes("/.wave/skills")
57
+ ? "project"
58
+ : "personal";
59
+
60
+ result.skillMetadata = {
61
+ name: result.frontmatter.name,
62
+ description: result.frontmatter.description,
63
+ type: skillType,
64
+ skillPath,
65
+ };
66
+
67
+ // Validate metadata if requested
68
+ if (validateMetadata) {
69
+ const validationErrors = validateSkillMetadata(result.skillMetadata);
70
+ result.validationErrors.push(...validationErrors);
71
+ }
72
+
73
+ result.isValid = result.validationErrors.length === 0;
74
+ return result;
75
+ } catch (error) {
76
+ result.validationErrors.push(
77
+ `Failed to read skill file: ${error instanceof Error ? error.message : String(error)}`,
78
+ );
79
+ return result;
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Simple YAML frontmatter parser for skill files
85
+ */
86
+ function parseYamlFrontmatter(yamlContent: string): SkillFrontmatter {
87
+ const frontmatter: SkillFrontmatter = { name: "", description: "" };
88
+
89
+ try {
90
+ const lines = yamlContent.split("\n");
91
+ for (const line of lines) {
92
+ const trimmed = line.trim();
93
+ if (!trimmed || trimmed.startsWith("#")) continue;
94
+
95
+ const colonIndex = trimmed.indexOf(":");
96
+ if (colonIndex === -1) continue;
97
+
98
+ const key = trimmed.substring(0, colonIndex).trim();
99
+ const value = trimmed
100
+ .substring(colonIndex + 1)
101
+ .trim()
102
+ .replace(/^["']|["']$/g, "");
103
+
104
+ if (key && value) {
105
+ frontmatter[key] = value;
106
+ }
107
+ }
108
+ } catch {
109
+ // Return empty frontmatter on parse error - validation will catch missing fields
110
+ }
111
+
112
+ return frontmatter;
113
+ }
114
+
115
+ /**
116
+ * Validate skill metadata according to requirements
117
+ */
118
+ export function validateSkillMetadata(metadata: SkillMetadata): string[] {
119
+ const errors: string[] = [];
120
+
121
+ // Import SKILL_DEFAULTS dynamically to avoid circular imports
122
+ const NAME_PATTERN = /^[a-z0-9-]+$/;
123
+ const MAX_NAME_LENGTH = 64;
124
+ const MAX_DESCRIPTION_LENGTH = 1024;
125
+ const MIN_DESCRIPTION_LENGTH = 1;
126
+
127
+ // Validate name
128
+ if (!metadata.name) {
129
+ errors.push("Skill name is required");
130
+ } else {
131
+ if (metadata.name.length > MAX_NAME_LENGTH) {
132
+ errors.push(`Skill name must be ${MAX_NAME_LENGTH} characters or less`);
133
+ }
134
+ if (!NAME_PATTERN.test(metadata.name)) {
135
+ errors.push(
136
+ "Skill name must contain only lowercase letters, numbers, and hyphens",
137
+ );
138
+ }
139
+ }
140
+
141
+ // Validate description
142
+ if (!metadata.description) {
143
+ errors.push("Skill description is required");
144
+ } else {
145
+ if (metadata.description.length < MIN_DESCRIPTION_LENGTH) {
146
+ errors.push(
147
+ `Skill description must be at least ${MIN_DESCRIPTION_LENGTH} character`,
148
+ );
149
+ }
150
+ if (metadata.description.length > MAX_DESCRIPTION_LENGTH) {
151
+ errors.push(
152
+ `Skill description must be ${MAX_DESCRIPTION_LENGTH} characters or less`,
153
+ );
154
+ }
155
+ }
156
+
157
+ return errors;
158
+ }
159
+
160
+ /**
161
+ * Check if a skill name is valid format
162
+ */
163
+ export function isValidSkillName(name: string): boolean {
164
+ const NAME_PATTERN = /^[a-z0-9-]+$/;
165
+ const MAX_NAME_LENGTH = 64;
166
+
167
+ return (
168
+ name.length > 0 && name.length <= MAX_NAME_LENGTH && NAME_PATTERN.test(name)
169
+ );
170
+ }
171
+
172
+ /**
173
+ * Generate user-friendly error messages for skill validation
174
+ */
175
+ export function formatSkillError(skillPath: string, errors: string[]): string {
176
+ const header = `Skill validation failed for ${skillPath}:`;
177
+ const errorList = errors.map((error) => ` • ${error}`).join("\n");
178
+
179
+ const suggestions = [
180
+ "To fix this skill:",
181
+ " 1. Ensure SKILL.md has valid YAML frontmatter (---...---)",
182
+ " 2. Include required fields: name and description",
183
+ " 3. Use lowercase letters, numbers, and hyphens only for name",
184
+ " 4. Keep name under 64 characters and description under 1024 characters",
185
+ ].join("\n");
186
+
187
+ return `${header}\n${errorList}\n\n${suggestions}`;
188
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Remove code block wrappers
3
+ * @param content Content that may contain code block wrappers
4
+ * @returns Content after removing wrappers
5
+ */
6
+ export function removeCodeBlockWrappers(content: string): string {
7
+ // Remove code block wrappers from beginning and end
8
+ // Supports the following formats:
9
+ // ```language
10
+ // code content
11
+ // ```
12
+ //
13
+ // ```
14
+ // code content
15
+ // ```
16
+
17
+ const lines = content.split("\n");
18
+ let startIndex = 0;
19
+ let endIndex = lines.length - 1;
20
+
21
+ // Check if there is a code block marker at the beginning
22
+ if (lines[startIndex]?.trim().startsWith("```")) {
23
+ startIndex = 1;
24
+ }
25
+
26
+ // Check if there is a code block marker at the end
27
+ if (lines[endIndex]?.trim() === "```") {
28
+ endIndex = endIndex - 1;
29
+ }
30
+
31
+ // If no complete code block wrapper is found, return original content
32
+ if (startIndex === 0 && endIndex === lines.length - 1) {
33
+ return content;
34
+ }
35
+
36
+ // Return content after removing wrappers
37
+ return lines.slice(startIndex, endIndex + 1).join("\n");
38
+ }
39
+
40
+ /**
41
+ * Function to remove ANSI color codes
42
+ * @param text Text containing ANSI color codes
43
+ * @returns Plain text with color codes removed
44
+ */
45
+ export const stripAnsiColors = (text: string): string => {
46
+ // Create the escape character dynamically to avoid control character detection
47
+ const escapeChar = String.fromCharCode(27); // ESC character
48
+ const ansiEscapeRegex = new RegExp(`${escapeChar}\\[[0-9;]*[a-zA-Z]`, "g");
49
+ return text.replace(ansiEscapeRegex, "");
50
+ };