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.
- package/dist/agent.d.ts +66 -20
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +156 -83
- package/dist/constants/prompts.d.ts +7 -2
- package/dist/constants/prompts.d.ts.map +1 -1
- package/dist/constants/prompts.js +41 -5
- package/dist/constants/tools.d.ts +2 -2
- package/dist/constants/tools.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
- package/dist/managers/MemoryRuleManager.js +16 -2
- package/dist/managers/aiManager.d.ts +14 -4
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +61 -9
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +1 -0
- package/dist/managers/backgroundTaskManager.d.ts +35 -0
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
- package/dist/managers/backgroundTaskManager.js +249 -0
- package/dist/managers/bashManager.d.ts.map +1 -1
- package/dist/managers/bashManager.js +0 -3
- package/dist/managers/foregroundTaskManager.d.ts +9 -0
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
- package/dist/managers/foregroundTaskManager.js +20 -0
- package/dist/managers/liveConfigManager.d.ts +1 -1
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +3 -1
- package/dist/managers/messageManager.d.ts +34 -4
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +104 -13
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +11 -13
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +3 -2
- package/dist/managers/pluginScopeManager.d.ts +13 -2
- package/dist/managers/pluginScopeManager.d.ts.map +1 -1
- package/dist/managers/pluginScopeManager.js +38 -0
- package/dist/managers/reversionManager.d.ts +39 -0
- package/dist/managers/reversionManager.d.ts.map +1 -0
- package/dist/managers/reversionManager.js +118 -0
- package/dist/managers/slashCommandManager.d.ts +4 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +16 -6
- package/dist/managers/subagentManager.d.ts +13 -2
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +144 -35
- package/dist/managers/toolManager.d.ts +11 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +11 -3
- package/dist/services/GitService.d.ts.map +1 -1
- package/dist/services/GitService.js +6 -2
- package/dist/services/MarketplaceService.d.ts +14 -1
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +72 -4
- package/dist/services/MemoryRuleService.d.ts +1 -1
- package/dist/services/MemoryRuleService.d.ts.map +1 -1
- package/dist/services/MemoryRuleService.js +13 -2
- package/dist/services/aiService.js +1 -1
- package/dist/services/configurationService.d.ts +18 -2
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +62 -0
- package/dist/services/fileWatcher.d.ts +0 -5
- package/dist/services/fileWatcher.d.ts.map +1 -1
- package/dist/services/fileWatcher.js +0 -11
- package/dist/services/memory.js +1 -1
- package/dist/services/pluginLoader.d.ts.map +1 -1
- package/dist/services/pluginLoader.js +6 -1
- package/dist/services/reversionService.d.ts +24 -0
- package/dist/services/reversionService.d.ts.map +1 -0
- package/dist/services/reversionService.js +76 -0
- package/dist/services/session.d.ts +7 -0
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +126 -3
- package/dist/tools/bashTool.d.ts +0 -8
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +52 -174
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +9 -0
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +15 -4
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +16 -5
- package/dist/tools/taskOutputTool.d.ts +3 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -0
- package/dist/tools/taskOutputTool.js +149 -0
- package/dist/tools/taskStopTool.d.ts +3 -0
- package/dist/tools/taskStopTool.d.ts.map +1 -0
- package/dist/tools/taskStopTool.js +65 -0
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +105 -63
- package/dist/tools/types.d.ts +7 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +9 -0
- package/dist/types/commands.d.ts +1 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +3 -0
- package/dist/types/configuration.d.ts.map +1 -1
- package/dist/types/environment.d.ts +2 -1
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/environment.js +0 -6
- package/dist/types/history.d.ts +5 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/marketplace.d.ts +4 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/messaging.d.ts +7 -1
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +24 -4
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/reversion.d.ts +29 -0
- package/dist/types/reversion.d.ts.map +1 -0
- package/dist/types/reversion.js +1 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +16 -0
- package/dist/utils/constants.d.ts +2 -2
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +2 -2
- package/dist/utils/editUtils.d.ts +4 -9
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +54 -55
- package/dist/utils/messageOperations.d.ts +3 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +8 -1
- package/dist/utils/openaiClient.d.ts.map +1 -1
- package/dist/utils/openaiClient.js +56 -26
- package/dist/utils/promptHistory.d.ts +20 -0
- package/dist/utils/promptHistory.d.ts.map +1 -0
- package/dist/utils/promptHistory.js +117 -0
- package/package.json +5 -3
- package/src/agent.ts +193 -109
- package/src/constants/prompts.ts +45 -5
- package/src/constants/tools.ts +2 -2
- package/src/index.ts +1 -1
- package/src/managers/MemoryRuleManager.ts +18 -2
- package/src/managers/aiManager.ts +87 -18
- package/src/managers/backgroundBashManager.ts +1 -0
- package/src/managers/backgroundTaskManager.ts +306 -0
- package/src/managers/bashManager.ts +0 -4
- package/src/managers/foregroundTaskManager.ts +26 -0
- package/src/managers/liveConfigManager.ts +2 -1
- package/src/managers/lspManager.ts +3 -1
- package/src/managers/messageManager.ts +136 -18
- package/src/managers/permissionManager.ts +11 -13
- package/src/managers/pluginManager.ts +4 -3
- package/src/managers/pluginScopeManager.ts +57 -8
- package/src/managers/reversionManager.ts +152 -0
- package/src/managers/slashCommandManager.ts +30 -7
- package/src/managers/subagentManager.ts +176 -31
- package/src/managers/toolManager.ts +23 -4
- package/src/services/GitService.ts +6 -2
- package/src/services/MarketplaceService.ts +100 -4
- package/src/services/MemoryRuleService.ts +18 -6
- package/src/services/aiService.ts +1 -1
- package/src/services/configurationService.ts +79 -1
- package/src/services/fileWatcher.ts +0 -13
- package/src/services/memory.ts +1 -1
- package/src/services/pluginLoader.ts +7 -1
- package/src/services/reversionService.ts +94 -0
- package/src/services/session.ts +161 -3
- package/src/tools/bashTool.ts +73 -200
- package/src/tools/deleteFileTool.ts +15 -0
- package/src/tools/editTool.ts +20 -10
- package/src/tools/multiEditTool.ts +21 -11
- package/src/tools/taskOutputTool.ts +174 -0
- package/src/tools/taskStopTool.ts +72 -0
- package/src/tools/taskTool.ts +130 -74
- package/src/tools/types.ts +7 -0
- package/src/tools/writeTool.ts +14 -0
- package/src/types/commands.ts +3 -0
- package/src/types/configuration.ts +4 -0
- package/src/types/environment.ts +3 -1
- package/src/types/history.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/marketplace.ts +5 -0
- package/src/types/messaging.ts +9 -1
- package/src/types/processes.ts +33 -4
- package/src/types/reversion.ts +29 -0
- package/src/utils/builtinSubagents.ts +18 -0
- package/src/utils/constants.ts +2 -2
- package/src/utils/editUtils.ts +66 -58
- package/src/utils/messageOperations.ts +10 -0
- package/src/utils/openaiClient.ts +69 -35
- package/src/utils/promptHistory.ts +133 -0
- package/dist/utils/bashHistory.d.ts +0 -50
- package/dist/utils/bashHistory.d.ts.map +0 -1
- package/dist/utils/bashHistory.js +0 -256
- package/src/utils/bashHistory.ts +0 -320
package/dist/utils/editUtils.js
CHANGED
|
@@ -2,68 +2,67 @@
|
|
|
2
2
|
* Utility functions for file editing tools
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
|
24
|
-
let isMatch = true;
|
|
23
|
+
let currentScore = 0;
|
|
25
24
|
for (let j = 0; j < searchLines.length; j++) {
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
41
|
+
}
|
|
42
|
+
if (currentScore > bestMatchScore) {
|
|
43
|
+
bestMatchScore = currentScore;
|
|
44
|
+
bestMatchIndex = i;
|
|
58
45
|
}
|
|
59
46
|
}
|
|
60
|
-
// If
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,qBAAqB,EACrB,UAAU,CACX,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,UAAU,OAAO,EAAE,KAAG,MAAM,EAcnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,KAAG,MAmCxD,CAAC;AAGF,eAAO,MAAM,wBAAwB,GAAI,8DAMtC,oBAAoB,KAAG,OAAO,
|
|
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;;
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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": "^
|
|
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",
|