wave-agent-sdk 0.2.1 → 0.5.0

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 (194) hide show
  1. package/dist/agent.d.ts +66 -20
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +156 -83
  4. package/dist/constants/prompts.d.ts +7 -2
  5. package/dist/constants/prompts.d.ts.map +1 -1
  6. package/dist/constants/prompts.js +41 -5
  7. package/dist/constants/tools.d.ts +2 -2
  8. package/dist/constants/tools.js +2 -2
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  13. package/dist/managers/MemoryRuleManager.js +16 -2
  14. package/dist/managers/aiManager.d.ts +14 -4
  15. package/dist/managers/aiManager.d.ts.map +1 -1
  16. package/dist/managers/aiManager.js +61 -9
  17. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  18. package/dist/managers/backgroundBashManager.js +1 -0
  19. package/dist/managers/backgroundTaskManager.d.ts +35 -0
  20. package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
  21. package/dist/managers/backgroundTaskManager.js +249 -0
  22. package/dist/managers/bashManager.d.ts.map +1 -1
  23. package/dist/managers/bashManager.js +0 -3
  24. package/dist/managers/foregroundTaskManager.d.ts +9 -0
  25. package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
  26. package/dist/managers/foregroundTaskManager.js +20 -0
  27. package/dist/managers/liveConfigManager.d.ts +1 -1
  28. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  29. package/dist/managers/lspManager.d.ts.map +1 -1
  30. package/dist/managers/lspManager.js +3 -1
  31. package/dist/managers/messageManager.d.ts +34 -4
  32. package/dist/managers/messageManager.d.ts.map +1 -1
  33. package/dist/managers/messageManager.js +104 -13
  34. package/dist/managers/permissionManager.d.ts.map +1 -1
  35. package/dist/managers/permissionManager.js +11 -13
  36. package/dist/managers/pluginManager.d.ts.map +1 -1
  37. package/dist/managers/pluginManager.js +3 -2
  38. package/dist/managers/pluginScopeManager.d.ts +13 -2
  39. package/dist/managers/pluginScopeManager.d.ts.map +1 -1
  40. package/dist/managers/pluginScopeManager.js +38 -0
  41. package/dist/managers/reversionManager.d.ts +39 -0
  42. package/dist/managers/reversionManager.d.ts.map +1 -0
  43. package/dist/managers/reversionManager.js +118 -0
  44. package/dist/managers/slashCommandManager.d.ts +4 -1
  45. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  46. package/dist/managers/slashCommandManager.js +16 -6
  47. package/dist/managers/subagentManager.d.ts +13 -2
  48. package/dist/managers/subagentManager.d.ts.map +1 -1
  49. package/dist/managers/subagentManager.js +144 -35
  50. package/dist/managers/toolManager.d.ts +11 -1
  51. package/dist/managers/toolManager.d.ts.map +1 -1
  52. package/dist/managers/toolManager.js +11 -3
  53. package/dist/services/GitService.d.ts.map +1 -1
  54. package/dist/services/GitService.js +6 -2
  55. package/dist/services/MarketplaceService.d.ts +14 -1
  56. package/dist/services/MarketplaceService.d.ts.map +1 -1
  57. package/dist/services/MarketplaceService.js +72 -4
  58. package/dist/services/MemoryRuleService.d.ts +1 -1
  59. package/dist/services/MemoryRuleService.d.ts.map +1 -1
  60. package/dist/services/MemoryRuleService.js +13 -2
  61. package/dist/services/aiService.js +1 -1
  62. package/dist/services/configurationService.d.ts +18 -2
  63. package/dist/services/configurationService.d.ts.map +1 -1
  64. package/dist/services/configurationService.js +62 -0
  65. package/dist/services/fileWatcher.d.ts +0 -5
  66. package/dist/services/fileWatcher.d.ts.map +1 -1
  67. package/dist/services/fileWatcher.js +0 -11
  68. package/dist/services/memory.js +1 -1
  69. package/dist/services/pluginLoader.d.ts.map +1 -1
  70. package/dist/services/pluginLoader.js +6 -1
  71. package/dist/services/reversionService.d.ts +24 -0
  72. package/dist/services/reversionService.d.ts.map +1 -0
  73. package/dist/services/reversionService.js +76 -0
  74. package/dist/services/session.d.ts +7 -0
  75. package/dist/services/session.d.ts.map +1 -1
  76. package/dist/services/session.js +126 -3
  77. package/dist/tools/bashTool.d.ts +0 -8
  78. package/dist/tools/bashTool.d.ts.map +1 -1
  79. package/dist/tools/bashTool.js +52 -174
  80. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  81. package/dist/tools/deleteFileTool.js +9 -0
  82. package/dist/tools/editTool.d.ts.map +1 -1
  83. package/dist/tools/editTool.js +15 -4
  84. package/dist/tools/multiEditTool.d.ts.map +1 -1
  85. package/dist/tools/multiEditTool.js +16 -5
  86. package/dist/tools/taskOutputTool.d.ts +3 -0
  87. package/dist/tools/taskOutputTool.d.ts.map +1 -0
  88. package/dist/tools/taskOutputTool.js +149 -0
  89. package/dist/tools/taskStopTool.d.ts +3 -0
  90. package/dist/tools/taskStopTool.d.ts.map +1 -0
  91. package/dist/tools/taskStopTool.js +65 -0
  92. package/dist/tools/taskTool.d.ts.map +1 -1
  93. package/dist/tools/taskTool.js +105 -63
  94. package/dist/tools/types.d.ts +7 -0
  95. package/dist/tools/types.d.ts.map +1 -1
  96. package/dist/tools/writeTool.d.ts.map +1 -1
  97. package/dist/tools/writeTool.js +9 -0
  98. package/dist/types/commands.d.ts +1 -0
  99. package/dist/types/commands.d.ts.map +1 -1
  100. package/dist/types/configuration.d.ts +3 -0
  101. package/dist/types/configuration.d.ts.map +1 -1
  102. package/dist/types/environment.d.ts +2 -1
  103. package/dist/types/environment.d.ts.map +1 -1
  104. package/dist/types/environment.js +0 -6
  105. package/dist/types/history.d.ts +5 -0
  106. package/dist/types/history.d.ts.map +1 -0
  107. package/dist/types/history.js +1 -0
  108. package/dist/types/index.d.ts +1 -0
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/index.js +1 -0
  111. package/dist/types/marketplace.d.ts +4 -0
  112. package/dist/types/marketplace.d.ts.map +1 -1
  113. package/dist/types/messaging.d.ts +7 -1
  114. package/dist/types/messaging.d.ts.map +1 -1
  115. package/dist/types/processes.d.ts +24 -4
  116. package/dist/types/processes.d.ts.map +1 -1
  117. package/dist/types/reversion.d.ts +29 -0
  118. package/dist/types/reversion.d.ts.map +1 -0
  119. package/dist/types/reversion.js +1 -0
  120. package/dist/utils/builtinSubagents.d.ts.map +1 -1
  121. package/dist/utils/builtinSubagents.js +16 -0
  122. package/dist/utils/constants.d.ts +2 -2
  123. package/dist/utils/constants.d.ts.map +1 -1
  124. package/dist/utils/constants.js +2 -2
  125. package/dist/utils/editUtils.d.ts +4 -9
  126. package/dist/utils/editUtils.d.ts.map +1 -1
  127. package/dist/utils/editUtils.js +54 -55
  128. package/dist/utils/messageOperations.d.ts +3 -1
  129. package/dist/utils/messageOperations.d.ts.map +1 -1
  130. package/dist/utils/messageOperations.js +8 -1
  131. package/dist/utils/openaiClient.d.ts.map +1 -1
  132. package/dist/utils/openaiClient.js +56 -26
  133. package/dist/utils/promptHistory.d.ts +20 -0
  134. package/dist/utils/promptHistory.d.ts.map +1 -0
  135. package/dist/utils/promptHistory.js +117 -0
  136. package/package.json +5 -3
  137. package/src/agent.ts +193 -109
  138. package/src/constants/prompts.ts +45 -5
  139. package/src/constants/tools.ts +2 -2
  140. package/src/index.ts +1 -1
  141. package/src/managers/MemoryRuleManager.ts +18 -2
  142. package/src/managers/aiManager.ts +87 -18
  143. package/src/managers/backgroundBashManager.ts +1 -0
  144. package/src/managers/backgroundTaskManager.ts +306 -0
  145. package/src/managers/bashManager.ts +0 -4
  146. package/src/managers/foregroundTaskManager.ts +26 -0
  147. package/src/managers/liveConfigManager.ts +2 -1
  148. package/src/managers/lspManager.ts +3 -1
  149. package/src/managers/messageManager.ts +136 -18
  150. package/src/managers/permissionManager.ts +11 -13
  151. package/src/managers/pluginManager.ts +4 -3
  152. package/src/managers/pluginScopeManager.ts +57 -8
  153. package/src/managers/reversionManager.ts +152 -0
  154. package/src/managers/slashCommandManager.ts +30 -7
  155. package/src/managers/subagentManager.ts +176 -31
  156. package/src/managers/toolManager.ts +23 -4
  157. package/src/services/GitService.ts +6 -2
  158. package/src/services/MarketplaceService.ts +100 -4
  159. package/src/services/MemoryRuleService.ts +18 -6
  160. package/src/services/aiService.ts +1 -1
  161. package/src/services/configurationService.ts +79 -1
  162. package/src/services/fileWatcher.ts +0 -13
  163. package/src/services/memory.ts +1 -1
  164. package/src/services/pluginLoader.ts +7 -1
  165. package/src/services/reversionService.ts +94 -0
  166. package/src/services/session.ts +161 -3
  167. package/src/tools/bashTool.ts +73 -200
  168. package/src/tools/deleteFileTool.ts +15 -0
  169. package/src/tools/editTool.ts +20 -10
  170. package/src/tools/multiEditTool.ts +21 -11
  171. package/src/tools/taskOutputTool.ts +174 -0
  172. package/src/tools/taskStopTool.ts +72 -0
  173. package/src/tools/taskTool.ts +130 -74
  174. package/src/tools/types.ts +7 -0
  175. package/src/tools/writeTool.ts +14 -0
  176. package/src/types/commands.ts +3 -0
  177. package/src/types/configuration.ts +4 -0
  178. package/src/types/environment.ts +3 -1
  179. package/src/types/history.ts +4 -0
  180. package/src/types/index.ts +1 -0
  181. package/src/types/marketplace.ts +5 -0
  182. package/src/types/messaging.ts +9 -1
  183. package/src/types/processes.ts +33 -4
  184. package/src/types/reversion.ts +29 -0
  185. package/src/utils/builtinSubagents.ts +18 -0
  186. package/src/utils/constants.ts +2 -2
  187. package/src/utils/editUtils.ts +66 -58
  188. package/src/utils/messageOperations.ts +10 -0
  189. package/src/utils/openaiClient.ts +69 -35
  190. package/src/utils/promptHistory.ts +133 -0
  191. package/dist/utils/bashHistory.d.ts +0 -50
  192. package/dist/utils/bashHistory.d.ts.map +0 -1
  193. package/dist/utils/bashHistory.js +0 -256
  194. package/src/utils/bashHistory.ts +0 -320
@@ -2,68 +2,67 @@
2
2
  * Utility functions for file editing tools
3
3
  */
4
4
  /**
5
- * Find a match in content that is identical to searchString except for a consistent indentation offset.
6
- *
7
- * Priority:
8
- * 1. If exact matches exist, returns searchString (letting the tool handle uniqueness/replaceAll).
9
- * 2. If no exact match, but exactly one unique indentation-insensitive match exists, returns that match.
10
- * 3. Otherwise returns null.
5
+ * Escape regular expression special characters
11
6
  */
12
- export function findIndentationInsensitiveMatch(content, searchString) {
13
- // 1. If exact match exists, return it
14
- if (content.includes(searchString)) {
15
- return searchString;
16
- }
17
- const searchLines = searchString.split("\n");
18
- if (searchLines.length === 0)
19
- return null;
7
+ export function escapeRegExp(string) {
8
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
+ }
10
+ /**
11
+ * Analyze why an edit failed by finding the best partial match and highlighting mismatches.
12
+ */
13
+ export function analyzeEditMismatch(content, searchString) {
20
14
  const contentLines = content.split("\n");
21
- let foundMatch = null;
15
+ const searchLines = searchString.split("\n");
16
+ if (searchLines.length === 0 || contentLines.length === 0) {
17
+ return "old_string not found in file (empty search or content)";
18
+ }
19
+ let bestMatchIndex = -1;
20
+ let bestMatchScore = -1;
21
+ // Sliding window to find the best partial match
22
22
  for (let i = 0; i <= contentLines.length - searchLines.length; i++) {
23
- let offset = null;
24
- let isMatch = true;
23
+ let currentScore = 0;
25
24
  for (let j = 0; j < searchLines.length; j++) {
26
- const sLine = searchLines[j];
27
- const cLine = contentLines[i + j];
28
- const sTrimmed = sLine.trimStart();
29
- const cTrimmed = cLine.trimStart();
30
- // If trimmed content doesn't match, it's not a match
31
- if (sTrimmed !== cTrimmed) {
32
- isMatch = false;
33
- break;
34
- }
35
- // For non-empty lines, check for consistent indentation offset
36
- if (sTrimmed !== "") {
37
- const sIndent = sLine.length - sTrimmed.length;
38
- const cIndent = cLine.length - cTrimmed.length;
39
- const currentOffset = cIndent - sIndent;
40
- if (offset === null) {
41
- offset = currentOffset;
42
- }
43
- else if (offset !== currentOffset) {
44
- isMatch = false;
45
- break;
46
- }
25
+ if (contentLines[i + j] === searchLines[j]) {
26
+ currentScore++;
47
27
  }
48
28
  }
49
- if (isMatch) {
50
- const matchCandidate = contentLines
51
- .slice(i, i + searchLines.length)
52
- .join("\n");
53
- if (foundMatch !== null && foundMatch !== matchCandidate) {
54
- // Multiple different smart matches found
55
- return null;
29
+ // Heuristic: prioritize matches where first or last lines match
30
+ if (contentLines[i] === searchLines[0])
31
+ currentScore += 0.5;
32
+ if (contentLines[i + searchLines.length - 1] ===
33
+ searchLines[searchLines.length - 1])
34
+ currentScore += 0.5;
35
+ // Also consider trimmed matches to catch indentation issues
36
+ for (let j = 0; j < searchLines.length; j++) {
37
+ if (contentLines[i + j].trim() === searchLines[j].trim() &&
38
+ contentLines[i + j] !== searchLines[j]) {
39
+ currentScore += 0.1;
56
40
  }
57
- foundMatch = matchCandidate;
41
+ }
42
+ if (currentScore > bestMatchScore) {
43
+ bestMatchScore = currentScore;
44
+ bestMatchIndex = i;
58
45
  }
59
46
  }
60
- // If we found exactly one unique smart match (or multiple instances of the same smart match)
61
- // return it. The tool will then check for uniqueness if replaceAll is false.
62
- return foundMatch;
63
- }
64
- /**
65
- * Escape regular expression special characters
66
- */
67
- export function escapeRegExp(string) {
68
- return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
47
+ // If no decent match found (score <= 0), return generic message
48
+ if (bestMatchScore <= 0) {
49
+ return "old_string not found in file (no similar block found)";
50
+ }
51
+ // Generate detailed report
52
+ const reportLines = [
53
+ `old_string not found in file. Best partial match found at line ${bestMatchIndex + 1}:`,
54
+ ];
55
+ for (let j = 0; j < searchLines.length; j++) {
56
+ const lineNum = bestMatchIndex + j + 1;
57
+ const actualLine = contentLines[bestMatchIndex + j];
58
+ const expectedLine = searchLines[j];
59
+ if (actualLine === expectedLine) {
60
+ reportLines.push(`${lineNum.toString().padStart(4)} | ${actualLine}`);
61
+ }
62
+ else {
63
+ reportLines.push(`${lineNum.toString().padStart(4)} | - ${expectedLine} (expected)`);
64
+ reportLines.push(`${lineNum.toString().padStart(4)} | + ${actualLine} (actual)`);
65
+ }
66
+ }
67
+ return reportLines.join("\n");
69
68
  }
@@ -111,6 +111,7 @@ export interface AddSubagentBlockParams {
111
111
  status: "active" | "completed" | "error" | "aborted";
112
112
  sessionId: string;
113
113
  configuration: SubagentConfiguration;
114
+ runInBackground?: boolean;
114
115
  }
115
116
  export interface UpdateSubagentBlockParams {
116
117
  messages: Message[];
@@ -118,10 +119,11 @@ export interface UpdateSubagentBlockParams {
118
119
  status: "active" | "completed" | "error" | "aborted";
119
120
  sessionId?: string;
120
121
  }
121
- export declare const addSubagentBlockToMessage: ({ messages, subagentId, subagentName, status, sessionId, configuration, }: AddSubagentBlockParams) => Message[];
122
+ export declare const addSubagentBlockToMessage: ({ messages, subagentId, subagentName, status, sessionId, configuration, runInBackground, }: AddSubagentBlockParams) => Message[];
122
123
  export declare const updateSubagentBlockInMessage: (messages: Message[], subagentId: string, updates: Partial<{
123
124
  status: "active" | "completed" | "error" | "aborted";
124
125
  sessionId: string;
126
+ runInBackground: boolean;
125
127
  }>) => Message[];
126
128
  /**
127
129
  * Removes the last user message from the messages array
@@ -1 +1 @@
1
- {"version":3,"file":"messageOperations.d.ts","sourceRoot":"","sources":["../../src/utils/messageOperations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageOperations.d.ts","sourceRoot":"","sources":["../../src/utils/messageOperations.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,7 @@ export const addUserMessageToMessages = ({ messages, content, images, customComm
80
80
  });
81
81
  }
82
82
  const userMessage = {
83
+ id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
83
84
  role: "user",
84
85
  blocks,
85
86
  };
@@ -106,6 +107,7 @@ export const addAssistantMessageToMessages = (messages, content, toolCalls, usag
106
107
  });
107
108
  }
108
109
  const initialAssistantMessage = {
110
+ id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
109
111
  role: "assistant",
110
112
  blocks,
111
113
  usage, // Include usage data if provided
@@ -326,13 +328,14 @@ export const completeCommandInMessage = ({ messages, command, exitCode, }) => {
326
328
  }
327
329
  return newMessages;
328
330
  };
329
- export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName, status, sessionId, configuration, }) => {
331
+ export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName, status, sessionId, configuration, runInBackground, }) => {
330
332
  const newMessages = [...messages];
331
333
  // Find the last assistant message or create one
332
334
  let lastAssistantMessage = newMessages[newMessages.length - 1];
333
335
  if (!lastAssistantMessage || lastAssistantMessage.role !== "assistant") {
334
336
  // Create new assistant message if the last message is not from assistant
335
337
  lastAssistantMessage = {
338
+ id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
336
339
  role: "assistant",
337
340
  blocks: [],
338
341
  };
@@ -346,6 +349,7 @@ export const addSubagentBlockToMessage = ({ messages, subagentId, subagentName,
346
349
  status,
347
350
  sessionId,
348
351
  configuration,
352
+ runInBackground,
349
353
  });
350
354
  return newMessages;
351
355
  };
@@ -363,6 +367,9 @@ export const updateSubagentBlockInMessage = (messages, subagentId, updates) => {
363
367
  if (updates.sessionId !== undefined) {
364
368
  block.sessionId = updates.sessionId;
365
369
  }
370
+ if (updates.runInBackground !== undefined) {
371
+ block.runInBackground = updates.runInBackground;
372
+ }
366
373
  return newMessages;
367
374
  }
368
375
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openaiClient.d.ts","sourceRoot":"","sources":["../../src/utils/openaiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,mCAAmC,EACnC,mBAAmB,EACnB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,KAAK,YAAY,GACb,sCAAsC,GACtC,mCAAmC,CAAC;AAExC,UAAU,WAAW,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,UAAU,UAAU,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACxC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEzC,IAAI,IAAI;;qBAGO,CAAC,SAAS,YAAY,UACrB,CAAC,YACC;gBAAE,MAAM,CAAC,EAAE,WAAW,CAAA;aAAE,KACjC,UAAU,CACX,CAAC,SAAS,mCAAmC,GACzC,aAAa,CAAC,mBAAmB,CAAC,GAClC,cAAc,CACnB;;MAuBN;YAEa,OAAO;YAgGN,oBAAoB;CAqCpC"}
1
+ {"version":3,"file":"openaiClient.d.ts","sourceRoot":"","sources":["../../src/utils/openaiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,mCAAmC,EACnC,mBAAmB,EACnB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,KAAK,YAAY,GACb,sCAAsC,GACtC,mCAAmC,CAAC;AAExC,UAAU,WAAW,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,UAAU,UAAU,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACxC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEzC,IAAI,IAAI;;qBAGO,CAAC,SAAS,YAAY,UACrB,CAAC,YACC;gBAAE,MAAM,CAAC,EAAE,WAAW,CAAA;aAAE,KACjC,UAAU,CACX,CAAC,SAAS,mCAAmC,GACzC,aAAa,CAAC,mBAAmB,CAAC,GAClC,cAAc,CACnB;;MAyBN;YAEa,OAAO;YAgIN,oBAAoB;CAqCpC"}
@@ -11,7 +11,9 @@ export class OpenAIClient {
11
11
  const promise = responsePromise.then((res) => res.data);
12
12
  promise.withResponse = () => responsePromise;
13
13
  // Prevent unhandled rejection if only withResponse() is used
14
- promise.catch(() => { });
14
+ promise.catch((e) => {
15
+ logger.error("Unhandled OpenAI promise rejection:", e);
16
+ });
15
17
  return promise;
16
18
  },
17
19
  },
@@ -26,25 +28,52 @@ export class OpenAIClient {
26
28
  ...defaultHeaders,
27
29
  };
28
30
  const fetchFn = customFetch || fetch;
29
- const response = await fetchFn(url, {
30
- method: "POST",
31
- headers,
32
- body: JSON.stringify(params),
33
- signal: options?.signal,
34
- ...fetchOptions,
35
- });
36
- if (!response.ok) {
31
+ let lastError;
32
+ const maxRetries = 3;
33
+ const initialDelay = 1000;
34
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
35
+ if (attempt > 0) {
36
+ const delay = initialDelay * Math.pow(2, attempt - 1);
37
+ await new Promise((resolve) => setTimeout(resolve, delay));
38
+ }
39
+ const response = await fetchFn(url, {
40
+ method: "POST",
41
+ headers,
42
+ body: JSON.stringify(params),
43
+ signal: options?.signal,
44
+ ...fetchOptions,
45
+ });
46
+ if (response.ok) {
47
+ if (params.stream) {
48
+ return {
49
+ data: this.streamChatCompletion(response),
50
+ response,
51
+ };
52
+ }
53
+ else {
54
+ const data = await response.json();
55
+ return {
56
+ data,
57
+ response,
58
+ };
59
+ }
60
+ }
37
61
  let errorBody;
38
62
  try {
39
63
  const text = await response.text();
40
64
  try {
41
65
  errorBody = JSON.parse(text);
42
66
  }
43
- catch {
67
+ catch (e) {
68
+ logger.error("Failed to parse error response body as JSON", {
69
+ error: e,
70
+ text,
71
+ });
44
72
  errorBody = text;
45
73
  }
46
74
  }
47
- catch {
75
+ catch (e) {
76
+ logger.error("Failed to read error response text", { error: e });
48
77
  errorBody = {};
49
78
  }
50
79
  const error = new Error(typeof errorBody === "object" &&
@@ -59,6 +88,19 @@ export class OpenAIClient {
59
88
  : response.statusText);
60
89
  error.status = response.status;
61
90
  error.body = errorBody;
91
+ if (response.status === 429 && attempt < maxRetries) {
92
+ const responseHeaders = {};
93
+ response.headers.forEach((value, key) => {
94
+ responseHeaders[key] = value;
95
+ });
96
+ logger.warn("OpenAI API 429 Too Many Requests, retrying...", {
97
+ attempt: attempt + 1,
98
+ status: response.status,
99
+ responseHeaders,
100
+ });
101
+ lastError = error;
102
+ continue;
103
+ }
62
104
  const responseHeaders = {};
63
105
  response.headers.forEach((value, key) => {
64
106
  responseHeaders[key] = value;
@@ -72,19 +114,7 @@ export class OpenAIClient {
72
114
  });
73
115
  throw error;
74
116
  }
75
- if (params.stream) {
76
- return {
77
- data: this.streamChatCompletion(response),
78
- response,
79
- };
80
- }
81
- else {
82
- const data = await response.json();
83
- return {
84
- data,
85
- response,
86
- };
87
- }
117
+ throw lastError;
88
118
  }
89
119
  async *streamChatCompletion(response) {
90
120
  const reader = response.body?.getReader();
@@ -111,8 +141,8 @@ export class OpenAIClient {
111
141
  const json = JSON.parse(data);
112
142
  yield json;
113
143
  }
114
- catch {
115
- // Ignore parse errors for non-JSON lines if any
144
+ catch (e) {
145
+ logger.error("Failed to parse stream chunk", { error: e, data });
116
146
  }
117
147
  }
118
148
  }
@@ -0,0 +1,20 @@
1
+ import { PromptEntry } from "../types/history.js";
2
+ export declare class PromptHistoryManager {
3
+ /**
4
+ * Add a new prompt to history
5
+ */
6
+ static addEntry(prompt: string): Promise<void>;
7
+ /**
8
+ * Trim history file to MAX_HISTORY_ENTRIES
9
+ */
10
+ private static trimHistory;
11
+ /**
12
+ * Get all history entries
13
+ */
14
+ static getHistory(): Promise<PromptEntry[]>;
15
+ /**
16
+ * Search history by query
17
+ */
18
+ static searchHistory(query: string): Promise<PromptEntry[]>;
19
+ }
20
+ //# sourceMappingURL=promptHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptHistory.d.ts","sourceRoot":"","sources":["../../src/utils/promptHistory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAiBlD,qBAAa,oBAAoB;IAC/B;;OAEG;WACU,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD;;OAEG;mBACkB,WAAW;IAoBhC;;OAEG;WACU,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAwCjD;;OAEG;WACU,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAgBlE"}
@@ -0,0 +1,117 @@
1
+ import fs from "fs";
2
+ import { PROMPT_HISTORY_FILE, DATA_DIRECTORY } from "./constants.js";
3
+ import { logger } from "./globalLogger.js";
4
+ /**
5
+ * Ensure data directory exists
6
+ */
7
+ const ensureDataDirectory = () => {
8
+ try {
9
+ if (!fs.existsSync(DATA_DIRECTORY)) {
10
+ fs.mkdirSync(DATA_DIRECTORY, { recursive: true });
11
+ }
12
+ }
13
+ catch (error) {
14
+ logger.debug("Failed to create data directory:", error);
15
+ }
16
+ };
17
+ const MAX_HISTORY_ENTRIES = 1000;
18
+ export class PromptHistoryManager {
19
+ /**
20
+ * Add a new prompt to history
21
+ */
22
+ static async addEntry(prompt) {
23
+ try {
24
+ if (!prompt.trim())
25
+ return;
26
+ ensureDataDirectory();
27
+ const entry = {
28
+ prompt,
29
+ timestamp: Date.now(),
30
+ };
31
+ const line = JSON.stringify(entry) + "\n";
32
+ await fs.promises.appendFile(PROMPT_HISTORY_FILE, line, "utf-8");
33
+ // Periodically trim history file to prevent it from growing too large
34
+ // We do this randomly (1 in 50 chance) to avoid performance hit on every entry
35
+ if (Math.random() < 0.02) {
36
+ await this.trimHistory();
37
+ }
38
+ }
39
+ catch (error) {
40
+ logger.debug("Failed to add prompt to history:", error);
41
+ }
42
+ }
43
+ /**
44
+ * Trim history file to MAX_HISTORY_ENTRIES
45
+ */
46
+ static async trimHistory() {
47
+ try {
48
+ if (!fs.existsSync(PROMPT_HISTORY_FILE))
49
+ return;
50
+ const data = await fs.promises.readFile(PROMPT_HISTORY_FILE, "utf-8");
51
+ const lines = data.split("\n").filter((line) => line.trim());
52
+ if (lines.length > MAX_HISTORY_ENTRIES * 1.2) {
53
+ const trimmedLines = lines.slice(-MAX_HISTORY_ENTRIES);
54
+ await fs.promises.writeFile(PROMPT_HISTORY_FILE, trimmedLines.join("\n") + "\n", "utf-8");
55
+ }
56
+ }
57
+ catch (error) {
58
+ logger.debug("Failed to trim prompt history:", error);
59
+ }
60
+ }
61
+ /**
62
+ * Get all history entries
63
+ */
64
+ static async getHistory() {
65
+ try {
66
+ if (!fs.existsSync(PROMPT_HISTORY_FILE)) {
67
+ return [];
68
+ }
69
+ const data = await fs.promises.readFile(PROMPT_HISTORY_FILE, "utf-8");
70
+ const lines = data.split("\n").filter((line) => line.trim());
71
+ const entries = lines
72
+ .map((line) => {
73
+ try {
74
+ return JSON.parse(line);
75
+ }
76
+ catch {
77
+ logger.debug("Failed to parse history line:", line);
78
+ return null;
79
+ }
80
+ })
81
+ .filter((entry) => entry !== null);
82
+ // Deduplicate by prompt, keeping the most recent one
83
+ const uniqueEntries = [];
84
+ const seenPrompts = new Set();
85
+ // Process from newest to oldest
86
+ for (let i = entries.length - 1; i >= 0; i--) {
87
+ const entry = entries[i];
88
+ if (!seenPrompts.has(entry.prompt)) {
89
+ uniqueEntries.push(entry);
90
+ seenPrompts.add(entry.prompt);
91
+ }
92
+ }
93
+ return uniqueEntries;
94
+ }
95
+ catch (error) {
96
+ logger.debug("Failed to load prompt history:", error);
97
+ return [];
98
+ }
99
+ }
100
+ /**
101
+ * Search history by query
102
+ */
103
+ static async searchHistory(query) {
104
+ try {
105
+ const history = await this.getHistory();
106
+ if (!query.trim()) {
107
+ return history;
108
+ }
109
+ const normalizedQuery = query.toLowerCase();
110
+ return history.filter((entry) => entry.prompt.toLowerCase().includes(normalizedQuery));
111
+ }
112
+ catch (error) {
113
+ logger.debug("Failed to search prompt history:", error);
114
+ return [];
115
+ }
116
+ }
117
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-agent-sdk",
3
- "version": "0.2.1",
3
+ "version": "0.5.0",
4
4
  "description": "SDK for building AI-powered development tools and agents",
5
5
  "keywords": [
6
6
  "ai",
@@ -32,10 +32,11 @@
32
32
  "openai": "^5.12.2"
33
33
  },
34
34
  "devDependencies": {
35
+ "@vitest/coverage-v8": "^4.0.18",
35
36
  "rimraf": "^6.1.2",
36
37
  "tsc-alias": "^1.8.16",
37
38
  "tsx": "^4.20.4",
38
- "vitest": "^3.2.4"
39
+ "vitest": "^4.0.18"
39
40
  },
40
41
  "engines": {
41
42
  "node": ">=22.0.0"
@@ -45,7 +46,8 @@
45
46
  "build": "rimraf dist && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
46
47
  "type-check": "tsc --noEmit --incremental",
47
48
  "watch": "tsc -p tsconfig.build.json --watch & tsc-alias -p tsconfig.build.json --watch",
48
- "test": "vitest run",
49
+ "test": "vitest run --reporter=dot",
50
+ "test:coverage": "vitest run --coverage --reporter=dot",
49
51
  "lint": "eslint --cache",
50
52
  "format": "prettier --write .",
51
53
  "version:patch": "node ../../scripts/version.js patch",