wave-agent-sdk 0.0.4 → 0.0.6
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 +63 -9
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +103 -27
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/managers/aiManager.d.ts +5 -2
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +121 -53
- package/dist/managers/backgroundBashManager.d.ts +1 -1
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/{hooks/manager.d.ts → managers/hookManager.d.ts} +26 -7
- package/dist/managers/hookManager.d.ts.map +1 -0
- package/dist/{hooks/manager.js → managers/hookManager.js} +108 -18
- package/dist/managers/mcpManager.d.ts +1 -1
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +5 -5
- package/dist/managers/messageManager.d.ts +29 -5
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +33 -12
- package/dist/managers/skillManager.d.ts +1 -1
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +3 -3
- package/dist/managers/slashCommandManager.d.ts +1 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +1 -1
- package/dist/managers/subagentManager.d.ts +9 -12
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +43 -45
- package/dist/managers/toolManager.d.ts +1 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/services/aiService.d.ts +10 -2
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +25 -4
- package/dist/services/hook.d.ts +56 -0
- package/dist/services/hook.d.ts.map +1 -0
- package/dist/services/hook.js +276 -0
- package/dist/services/memory.js +3 -3
- package/dist/services/session.d.ts +65 -16
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +85 -34
- package/dist/tools/bashTool.js +2 -2
- package/dist/tools/deleteFileTool.js +1 -1
- package/dist/tools/editTool.js +1 -1
- package/dist/tools/multiEditTool.js +2 -2
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +7 -3
- package/dist/tools/writeTool.js +1 -1
- package/dist/types/commands.d.ts +24 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +5 -0
- package/dist/types/config.d.ts +13 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/core.d.ts +38 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/{types.js → types/core.js} +4 -13
- package/dist/{hooks/types.d.ts → types/hooks.d.ts} +2 -1
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/mcp.d.ts +28 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +5 -0
- package/dist/types/messaging.d.ts +80 -0
- package/dist/types/messaging.d.ts.map +1 -0
- package/dist/types/messaging.js +5 -0
- package/dist/types/processes.d.ts +17 -0
- package/dist/types/processes.d.ts.map +1 -0
- package/dist/types/processes.js +5 -0
- package/dist/types/skills.d.ts +78 -0
- package/dist/types/skills.d.ts.map +1 -0
- package/dist/types/skills.js +17 -0
- package/dist/utils/configResolver.d.ts +1 -1
- package/dist/utils/configResolver.d.ts.map +1 -1
- package/dist/utils/configResolver.js +1 -1
- package/dist/utils/configValidator.d.ts +1 -1
- package/dist/utils/configValidator.d.ts.map +1 -1
- package/dist/utils/configValidator.js +1 -1
- package/dist/utils/convertMessagesForAPI.d.ts +1 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/customCommands.d.ts +1 -1
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/{hooks/matcher.d.ts → utils/hookMatcher.d.ts} +1 -1
- package/dist/utils/hookMatcher.d.ts.map +1 -0
- package/dist/utils/markdownParser.d.ts +1 -1
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/mcpUtils.d.ts +1 -1
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/messageOperations.d.ts +7 -2
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +18 -1
- package/dist/utils/skillParser.d.ts +1 -1
- package/dist/utils/skillParser.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agent.ts +150 -50
- package/src/index.ts +3 -4
- package/src/managers/aiManager.ts +282 -164
- package/src/managers/backgroundBashManager.ts +1 -1
- package/src/{hooks/manager.ts → managers/hookManager.ts} +163 -28
- package/src/managers/mcpManager.ts +6 -6
- package/src/managers/messageManager.ts +69 -10
- package/src/managers/skillManager.ts +4 -4
- package/src/managers/slashCommandManager.ts +6 -2
- package/src/managers/subagentManager.ts +58 -53
- package/src/managers/toolManager.ts +1 -1
- package/src/services/aiService.ts +37 -7
- package/src/services/hook.ts +360 -0
- package/src/services/memory.ts +3 -3
- package/src/services/session.ts +99 -33
- package/src/tools/bashTool.ts +2 -2
- package/src/tools/deleteFileTool.ts +1 -1
- package/src/tools/editTool.ts +1 -1
- package/src/tools/multiEditTool.ts +2 -2
- package/src/tools/taskTool.ts +13 -5
- package/src/tools/writeTool.ts +1 -1
- package/src/types/commands.ts +26 -0
- package/src/types/config.ts +14 -0
- package/src/types/core.ts +49 -0
- package/src/{hooks/types.ts → types/hooks.ts} +1 -0
- package/src/types/index.ts +23 -0
- package/src/{types.ts → types/index.ts.backup} +13 -0
- package/src/types/mcp.ts +31 -0
- package/src/types/messaging.ts +103 -0
- package/src/types/processes.ts +18 -0
- package/src/types/skills.ts +91 -0
- package/src/utils/configResolver.ts +1 -1
- package/src/utils/configValidator.ts +5 -1
- package/src/utils/convertMessagesForAPI.ts +1 -1
- package/src/utils/customCommands.ts +1 -1
- package/src/utils/markdownParser.ts +1 -1
- package/src/utils/mcpUtils.ts +1 -1
- package/src/utils/messageOperations.ts +22 -1
- package/src/utils/skillParser.ts +1 -1
- package/dist/hooks/executor.d.ts +0 -56
- package/dist/hooks/executor.d.ts.map +0 -1
- package/dist/hooks/executor.js +0 -312
- package/dist/hooks/index.d.ts +0 -17
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -14
- package/dist/hooks/manager.d.ts.map +0 -1
- package/dist/hooks/matcher.d.ts.map +0 -1
- package/dist/hooks/settings.d.ts +0 -46
- package/dist/hooks/settings.d.ts.map +0 -1
- package/dist/hooks/settings.js +0 -100
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/types.d.ts +0 -276
- package/dist/types.d.ts.map +0 -1
- package/src/hooks/executor.ts +0 -440
- package/src/hooks/index.ts +0 -52
- package/src/hooks/settings.ts +0 -129
- /package/dist/{hooks/types.js → types/hooks.js} +0 -0
- /package/dist/{hooks/matcher.js → utils/hookMatcher.js} +0 -0
- /package/src/{hooks/matcher.ts → utils/hookMatcher.ts} +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
2
|
-
import type { Logger, Message } from "../types.js";
|
|
2
|
+
import type { Logger, Message, Usage } from "../types/index.js";
|
|
3
3
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
4
4
|
export interface MessageManagerCallbacks {
|
|
5
5
|
onMessagesChange?: (messages: Message[]) => void;
|
|
6
6
|
onSessionIdChange?: (sessionId: string) => void;
|
|
7
7
|
onLatestTotalTokensChange?: (latestTotalTokens: number) => void;
|
|
8
8
|
onUserInputHistoryChange?: (history: string[]) => void;
|
|
9
|
+
onUsagesChange?: (usages: Usage[]) => void;
|
|
9
10
|
onUserMessageAdded?: (content: string, images?: Array<{
|
|
10
11
|
path: string;
|
|
11
12
|
mimeType: string;
|
|
@@ -21,13 +22,22 @@ export interface MessageManagerCallbacks {
|
|
|
21
22
|
onAddCommandOutputMessage?: (command: string) => void;
|
|
22
23
|
onUpdateCommandOutputMessage?: (command: string, output: string) => void;
|
|
23
24
|
onCompleteCommandMessage?: (command: string, exitCode: number) => void;
|
|
24
|
-
onSubAgentBlockAdded?: (subagentId: string
|
|
25
|
-
|
|
25
|
+
onSubAgentBlockAdded?: (subagentId: string, parameters: {
|
|
26
|
+
description: string;
|
|
27
|
+
prompt: string;
|
|
28
|
+
subagent_type: string;
|
|
29
|
+
}) => void;
|
|
30
|
+
onSubAgentBlockUpdated?: (subagentId: string, messages: Message[], status: "active" | "completed" | "error" | "aborted") => void;
|
|
26
31
|
}
|
|
27
32
|
export interface MessageManagerOptions {
|
|
28
33
|
callbacks: MessageManagerCallbacks;
|
|
29
34
|
workdir: string;
|
|
30
35
|
logger?: Logger;
|
|
36
|
+
/**
|
|
37
|
+
* Custom session directory path
|
|
38
|
+
* @default join(homedir(), ".wave", "sessions")
|
|
39
|
+
*/
|
|
40
|
+
sessionDir?: string;
|
|
31
41
|
}
|
|
32
42
|
export declare class MessageManager {
|
|
33
43
|
private sessionId;
|
|
@@ -38,6 +48,7 @@ export declare class MessageManager {
|
|
|
38
48
|
private workdir;
|
|
39
49
|
private logger?;
|
|
40
50
|
private callbacks;
|
|
51
|
+
private sessionDir?;
|
|
41
52
|
constructor(options: MessageManagerOptions);
|
|
42
53
|
getSessionId(): string;
|
|
43
54
|
getMessages(): Message[];
|
|
@@ -68,7 +79,7 @@ export declare class MessageManager {
|
|
|
68
79
|
mimeType: string;
|
|
69
80
|
}>): void;
|
|
70
81
|
addCustomCommandMessage(commandName: string, content: string, originalInput?: string): void;
|
|
71
|
-
addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[]): void;
|
|
82
|
+
addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage): void;
|
|
72
83
|
updateToolBlock(params: AgentToolBlockUpdateParams): void;
|
|
73
84
|
addDiffBlock(filePath: string, diffResult: Array<{
|
|
74
85
|
value: string;
|
|
@@ -84,10 +95,23 @@ export declare class MessageManager {
|
|
|
84
95
|
addCommandOutputMessage(command: string): void;
|
|
85
96
|
updateCommandOutputMessage(command: string, output: string): void;
|
|
86
97
|
completeCommandMessage(command: string, exitCode: number): void;
|
|
87
|
-
addSubagentBlock(subagentId: string, subagentName: string, status
|
|
98
|
+
addSubagentBlock(subagentId: string, subagentName: string, status: "active" | "completed" | "error" | undefined, subagentMessages: Message[] | undefined, parameters: {
|
|
99
|
+
description: string;
|
|
100
|
+
prompt: string;
|
|
101
|
+
subagent_type: string;
|
|
102
|
+
}): void;
|
|
88
103
|
updateSubagentBlock(subagentId: string, updates: Partial<{
|
|
89
104
|
status: "active" | "completed" | "error" | "aborted";
|
|
90
105
|
messages: Message[];
|
|
91
106
|
}>): void;
|
|
107
|
+
/**
|
|
108
|
+
* Trigger usage change callback with all usage data from assistant messages
|
|
109
|
+
*/
|
|
110
|
+
triggerUsageChange(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Remove the last user message from the conversation
|
|
113
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
114
|
+
*/
|
|
115
|
+
removeLastUserMessage(): void;
|
|
92
116
|
}
|
|
93
117
|
//# sourceMappingURL=messageManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
|
-
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addDiffBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addMemoryBlockToMessage, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, } from "../utils/messageOperations.js";
|
|
2
|
+
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addDiffBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addMemoryBlockToMessage, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, removeLastUserMessage, } from "../utils/messageOperations.js";
|
|
3
3
|
import { cleanupExpiredSessions, getLatestSession, loadSession, saveSession, getSessionFilePath, } from "../services/session.js";
|
|
4
4
|
export class MessageManager {
|
|
5
5
|
constructor(options) {
|
|
@@ -11,6 +11,7 @@ export class MessageManager {
|
|
|
11
11
|
this.workdir = options.workdir;
|
|
12
12
|
this.callbacks = options.callbacks;
|
|
13
13
|
this.logger = options.logger;
|
|
14
|
+
this.sessionDir = options.sessionDir;
|
|
14
15
|
}
|
|
15
16
|
// Getter methods
|
|
16
17
|
getSessionId() {
|
|
@@ -26,7 +27,7 @@ export class MessageManager {
|
|
|
26
27
|
return [...this.userInputHistory];
|
|
27
28
|
}
|
|
28
29
|
getTranscriptPath() {
|
|
29
|
-
return getSessionFilePath(this.sessionId);
|
|
30
|
+
return getSessionFilePath(this.sessionId, this.sessionDir);
|
|
30
31
|
}
|
|
31
32
|
// Setter methods, will trigger callbacks
|
|
32
33
|
setSessionId(sessionId) {
|
|
@@ -44,7 +45,7 @@ export class MessageManager {
|
|
|
44
45
|
*/
|
|
45
46
|
async saveSession() {
|
|
46
47
|
try {
|
|
47
|
-
await saveSession(this.sessionId, this.messages, this.workdir, this.latestTotalTokens, this.sessionStartTime);
|
|
48
|
+
await saveSession(this.sessionId, this.messages, this.workdir, this.latestTotalTokens, this.sessionStartTime, this.sessionDir);
|
|
48
49
|
}
|
|
49
50
|
catch (error) {
|
|
50
51
|
this.logger?.error("Failed to save session:", error);
|
|
@@ -56,10 +57,10 @@ export class MessageManager {
|
|
|
56
57
|
async handleSessionRestoration(restoreSessionId, continueLastSession) {
|
|
57
58
|
// Clean up expired sessions first
|
|
58
59
|
try {
|
|
59
|
-
await cleanupExpiredSessions(this.workdir);
|
|
60
|
+
await cleanupExpiredSessions(this.workdir, this.sessionDir);
|
|
60
61
|
}
|
|
61
62
|
catch (error) {
|
|
62
|
-
|
|
63
|
+
this.logger?.warn("Failed to cleanup expired sessions:", error);
|
|
63
64
|
}
|
|
64
65
|
if (!restoreSessionId && !continueLastSession) {
|
|
65
66
|
return;
|
|
@@ -67,14 +68,14 @@ export class MessageManager {
|
|
|
67
68
|
try {
|
|
68
69
|
let sessionToRestore = null;
|
|
69
70
|
if (restoreSessionId) {
|
|
70
|
-
sessionToRestore = await loadSession(restoreSessionId);
|
|
71
|
+
sessionToRestore = await loadSession(restoreSessionId, this.sessionDir);
|
|
71
72
|
if (!sessionToRestore) {
|
|
72
73
|
console.error(`Session not found: ${restoreSessionId}`);
|
|
73
74
|
process.exit(1);
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
77
|
else if (continueLastSession) {
|
|
77
|
-
sessionToRestore = await getLatestSession(this.workdir);
|
|
78
|
+
sessionToRestore = await getLatestSession(this.workdir, this.sessionDir);
|
|
78
79
|
if (!sessionToRestore) {
|
|
79
80
|
console.error(`No previous session found for workdir: ${this.workdir}`);
|
|
80
81
|
process.exit(1);
|
|
@@ -157,8 +158,8 @@ export class MessageManager {
|
|
|
157
158
|
this.setMessages(newMessages);
|
|
158
159
|
this.callbacks.onCustomCommandAdded?.(commandName, content, originalInput);
|
|
159
160
|
}
|
|
160
|
-
addAssistantMessage(content, toolCalls) {
|
|
161
|
-
const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls);
|
|
161
|
+
addAssistantMessage(content, toolCalls, usage) {
|
|
162
|
+
const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls, usage);
|
|
162
163
|
this.setMessages(newMessages);
|
|
163
164
|
this.callbacks.onAssistantMessageAdded?.(content, toolCalls);
|
|
164
165
|
}
|
|
@@ -263,7 +264,7 @@ export class MessageManager {
|
|
|
263
264
|
this.callbacks.onCompleteCommandMessage?.(command, exitCode);
|
|
264
265
|
}
|
|
265
266
|
// Subagent block methods
|
|
266
|
-
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = []) {
|
|
267
|
+
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = [], parameters) {
|
|
267
268
|
const params = {
|
|
268
269
|
messages: this.messages,
|
|
269
270
|
subagentId,
|
|
@@ -273,7 +274,7 @@ export class MessageManager {
|
|
|
273
274
|
};
|
|
274
275
|
const updatedMessages = addSubagentBlockToMessage(params);
|
|
275
276
|
this.setMessages(updatedMessages);
|
|
276
|
-
this.callbacks.onSubAgentBlockAdded?.(params.subagentId);
|
|
277
|
+
this.callbacks.onSubAgentBlockAdded?.(params.subagentId, parameters);
|
|
277
278
|
}
|
|
278
279
|
updateSubagentBlock(subagentId, updates) {
|
|
279
280
|
const updatedMessages = updateSubagentBlockInMessage(this.messages, subagentId, updates);
|
|
@@ -284,6 +285,26 @@ export class MessageManager {
|
|
|
284
285
|
status: updates.status || "active",
|
|
285
286
|
subagentMessages: updates.messages || [],
|
|
286
287
|
};
|
|
287
|
-
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages);
|
|
288
|
+
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages, params.status);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Trigger usage change callback with all usage data from assistant messages
|
|
292
|
+
*/
|
|
293
|
+
triggerUsageChange() {
|
|
294
|
+
const usages = [];
|
|
295
|
+
for (const message of this.messages) {
|
|
296
|
+
if (message.role === "assistant" && message.usage) {
|
|
297
|
+
usages.push(message.usage);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
this.callbacks.onUsagesChange?.(usages);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Remove the last user message from the conversation
|
|
304
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
305
|
+
*/
|
|
306
|
+
removeLastUserMessage() {
|
|
307
|
+
const newMessages = removeLastUserMessage(this.messages);
|
|
308
|
+
this.setMessages(newMessages);
|
|
288
309
|
}
|
|
289
310
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SkillManagerOptions, SkillMetadata, Skill, SkillToolArgs, SkillInvocationContext } from "../types.js";
|
|
1
|
+
import type { SkillManagerOptions, SkillMetadata, Skill, SkillToolArgs, SkillInvocationContext } from "../types/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Manages skill discovery and loading
|
|
4
4
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,
|
|
1
|
+
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,mBAAwB;IAO7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IAiFrC;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;IAqCjE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
|
|
@@ -19,7 +19,7 @@ export class SkillManager {
|
|
|
19
19
|
* Initialize the skill manager by discovering available skills
|
|
20
20
|
*/
|
|
21
21
|
async initialize() {
|
|
22
|
-
this.logger?.
|
|
22
|
+
this.logger?.debug("Initializing SkillManager...");
|
|
23
23
|
try {
|
|
24
24
|
// Clear existing data before discovery
|
|
25
25
|
this.skillMetadata.clear();
|
|
@@ -40,7 +40,7 @@ export class SkillManager {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
this.initialized = true;
|
|
43
|
-
this.logger?.
|
|
43
|
+
this.logger?.debug(`SkillManager initialized with ${this.skillMetadata.size} skills`);
|
|
44
44
|
}
|
|
45
45
|
catch (error) {
|
|
46
46
|
this.logger?.error("Failed to initialize SkillManager:", error);
|
|
@@ -184,7 +184,7 @@ export class SkillManager {
|
|
|
184
184
|
*/
|
|
185
185
|
async executeSkill(args) {
|
|
186
186
|
const { skill_name } = args;
|
|
187
|
-
this.logger?.
|
|
187
|
+
this.logger?.debug(`Invoking skill: ${skill_name}`);
|
|
188
188
|
try {
|
|
189
189
|
// Load the skill
|
|
190
190
|
const skill = await this.loadSkill(skill_name);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { MessageManager } from "./messageManager.js";
|
|
2
2
|
import type { AIManager } from "./aiManager.js";
|
|
3
|
-
import type { SlashCommand, CustomSlashCommand, Logger } from "../types.js";
|
|
3
|
+
import type { SlashCommand, CustomSlashCommand, Logger } from "../types/index.js";
|
|
4
4
|
export interface SlashCommandManagerOptions {
|
|
5
5
|
messageManager: MessageManager;
|
|
6
6
|
aiManager: AIManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAYjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IA2E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
|
|
@@ -51,7 +51,7 @@ export class SlashCommandManager {
|
|
|
51
51
|
},
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
this.logger?.
|
|
54
|
+
this.logger?.debug(`Loaded ${customCommands.length} custom commands`);
|
|
55
55
|
}
|
|
56
56
|
catch (error) {
|
|
57
57
|
this.logger?.warn("Failed to load custom commands:", error);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
2
|
-
import type { Message, Logger, GatewayConfig, ModelConfig } from "../types.js";
|
|
2
|
+
import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
|
|
3
3
|
import { AIManager } from "./aiManager.js";
|
|
4
4
|
import { MessageManager } from "./messageManager.js";
|
|
5
5
|
import { ToolManager } from "./toolManager.js";
|
|
@@ -10,7 +10,6 @@ export interface SubagentInstance {
|
|
|
10
10
|
messageManager: MessageManager;
|
|
11
11
|
toolManager: ToolManager;
|
|
12
12
|
status: "initializing" | "active" | "completed" | "error" | "aborted";
|
|
13
|
-
taskDescription: string;
|
|
14
13
|
messages: Message[];
|
|
15
14
|
}
|
|
16
15
|
export interface SubagentManagerOptions {
|
|
@@ -21,6 +20,7 @@ export interface SubagentManagerOptions {
|
|
|
21
20
|
gatewayConfig: GatewayConfig;
|
|
22
21
|
modelConfig: ModelConfig;
|
|
23
22
|
tokenLimit: number;
|
|
23
|
+
onUsageAdded?: (usage: Usage) => void;
|
|
24
24
|
}
|
|
25
25
|
export declare class SubagentManager {
|
|
26
26
|
private instances;
|
|
@@ -32,6 +32,7 @@ export declare class SubagentManager {
|
|
|
32
32
|
private gatewayConfig;
|
|
33
33
|
private modelConfig;
|
|
34
34
|
private tokenLimit;
|
|
35
|
+
private onUsageAdded?;
|
|
35
36
|
constructor(options: SubagentManagerOptions);
|
|
36
37
|
/**
|
|
37
38
|
* Initialize the SubagentManager by loading and caching configurations
|
|
@@ -52,14 +53,18 @@ export declare class SubagentManager {
|
|
|
52
53
|
/**
|
|
53
54
|
* Create a new subagent instance with isolated managers
|
|
54
55
|
*/
|
|
55
|
-
createInstance(configuration: SubagentConfiguration,
|
|
56
|
+
createInstance(configuration: SubagentConfiguration, parameters: {
|
|
57
|
+
description: string;
|
|
58
|
+
prompt: string;
|
|
59
|
+
subagent_type: string;
|
|
60
|
+
}): Promise<SubagentInstance>;
|
|
56
61
|
/**
|
|
57
62
|
* Execute task using subagent instance
|
|
58
63
|
*
|
|
59
64
|
* IMPORTANT: This method automatically filters out the Task tool from allowedTools
|
|
60
65
|
* to prevent subagents from spawning other subagents (infinite recursion protection)
|
|
61
66
|
*/
|
|
62
|
-
executeTask(instance: SubagentInstance, prompt: string): Promise<string>;
|
|
67
|
+
executeTask(instance: SubagentInstance, prompt: string, abortSignal?: AbortSignal): Promise<string>;
|
|
63
68
|
/**
|
|
64
69
|
* Get instance by subagent ID
|
|
65
70
|
*/
|
|
@@ -72,14 +77,6 @@ export declare class SubagentManager {
|
|
|
72
77
|
* Add message to instance
|
|
73
78
|
*/
|
|
74
79
|
addMessageToInstance(subagentId: string, message: Message): void;
|
|
75
|
-
/**
|
|
76
|
-
* Abort a running subagent instance
|
|
77
|
-
*/
|
|
78
|
-
abortInstance(subagentId: string): boolean;
|
|
79
|
-
/**
|
|
80
|
-
* Abort all active subagent instances
|
|
81
|
-
*/
|
|
82
|
-
abortAllInstances(): void;
|
|
83
80
|
/**
|
|
84
81
|
* Clean up completed, errored, or aborted instances
|
|
85
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACtE,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,OAAO,EAAE,sBAAsB;IAW3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAY5D;;OAEG;IACH,iBAAiB,IAAI,qBAAqB,EAAE;IAS5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM;IAK/B;;OAEG;IACG,cAAc,CAClB,aAAa,EAAE,qBAAqB,EACpC,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAsF5B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC;IAsGlB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIxD;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhE;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAYzC;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,EAAE;IAOxC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -12,6 +12,7 @@ export class SubagentManager {
|
|
|
12
12
|
this.gatewayConfig = options.gatewayConfig;
|
|
13
13
|
this.modelConfig = options.modelConfig;
|
|
14
14
|
this.tokenLimit = options.tokenLimit;
|
|
15
|
+
this.onUsageAdded = options.onUsageAdded;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* Initialize the SubagentManager by loading and caching configurations
|
|
@@ -48,7 +49,7 @@ export class SubagentManager {
|
|
|
48
49
|
/**
|
|
49
50
|
* Create a new subagent instance with isolated managers
|
|
50
51
|
*/
|
|
51
|
-
async createInstance(configuration,
|
|
52
|
+
async createInstance(configuration, parameters) {
|
|
52
53
|
if (!this.parentToolManager ||
|
|
53
54
|
!this.gatewayConfig ||
|
|
54
55
|
!this.modelConfig ||
|
|
@@ -94,6 +95,9 @@ export class SubagentManager {
|
|
|
94
95
|
agentModel: modelToUse,
|
|
95
96
|
},
|
|
96
97
|
tokenLimit: this.tokenLimit,
|
|
98
|
+
callbacks: {
|
|
99
|
+
onUsageAdded: this.onUsageAdded,
|
|
100
|
+
},
|
|
97
101
|
});
|
|
98
102
|
const instance = {
|
|
99
103
|
subagentId,
|
|
@@ -102,12 +106,11 @@ export class SubagentManager {
|
|
|
102
106
|
messageManager,
|
|
103
107
|
toolManager,
|
|
104
108
|
status: "initializing",
|
|
105
|
-
taskDescription,
|
|
106
109
|
messages: [],
|
|
107
110
|
};
|
|
108
111
|
this.instances.set(subagentId, instance);
|
|
109
112
|
// Create subagent block in parent message manager
|
|
110
|
-
this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, "active", []);
|
|
113
|
+
this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, "active", [], parameters);
|
|
111
114
|
return instance;
|
|
112
115
|
}
|
|
113
116
|
/**
|
|
@@ -116,13 +119,27 @@ export class SubagentManager {
|
|
|
116
119
|
* IMPORTANT: This method automatically filters out the Task tool from allowedTools
|
|
117
120
|
* to prevent subagents from spawning other subagents (infinite recursion protection)
|
|
118
121
|
*/
|
|
119
|
-
async executeTask(instance, prompt) {
|
|
122
|
+
async executeTask(instance, prompt, abortSignal) {
|
|
120
123
|
try {
|
|
124
|
+
// Check if already aborted before starting
|
|
125
|
+
if (abortSignal?.aborted) {
|
|
126
|
+
throw new Error("Task was aborted before execution started");
|
|
127
|
+
}
|
|
121
128
|
// Set status to active and update parent
|
|
122
129
|
this.updateInstanceStatus(instance.subagentId, "active");
|
|
123
130
|
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
124
131
|
status: "active",
|
|
125
132
|
});
|
|
133
|
+
// Set up abort handler
|
|
134
|
+
if (abortSignal) {
|
|
135
|
+
abortSignal.addEventListener("abort", () => {
|
|
136
|
+
this.updateInstanceStatus(instance.subagentId, "aborted");
|
|
137
|
+
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
138
|
+
status: "aborted",
|
|
139
|
+
messages: instance.messages,
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
126
143
|
// Add the user's prompt as a message
|
|
127
144
|
instance.messageManager.addUserMessage(prompt);
|
|
128
145
|
// Create allowed tools list - always exclude Task tool to prevent subagent recursion
|
|
@@ -137,12 +154,33 @@ export class SubagentManager {
|
|
|
137
154
|
allowedTools = allTools.filter((tool) => tool !== "Task");
|
|
138
155
|
}
|
|
139
156
|
// Execute the AI request with tool restrictions
|
|
140
|
-
|
|
157
|
+
// The AIManager will handle abort signals through its own abort controllers
|
|
158
|
+
// We need to abort the AI execution if the external abort signal is triggered
|
|
159
|
+
const executeAI = instance.aiManager.sendAIMessage({
|
|
141
160
|
allowedTools,
|
|
142
161
|
model: instance.configuration.model !== "inherit"
|
|
143
162
|
? instance.configuration.model
|
|
144
163
|
: undefined,
|
|
145
164
|
});
|
|
165
|
+
// If we have an abort signal, race against it
|
|
166
|
+
if (abortSignal) {
|
|
167
|
+
await Promise.race([
|
|
168
|
+
executeAI,
|
|
169
|
+
new Promise((_, reject) => {
|
|
170
|
+
if (abortSignal.aborted) {
|
|
171
|
+
reject(new Error("Task was aborted"));
|
|
172
|
+
}
|
|
173
|
+
abortSignal.addEventListener("abort", () => {
|
|
174
|
+
// Abort the AI execution
|
|
175
|
+
instance.aiManager.abortAIMessage();
|
|
176
|
+
reject(new Error("Task was aborted"));
|
|
177
|
+
});
|
|
178
|
+
}),
|
|
179
|
+
]);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await executeAI;
|
|
183
|
+
}
|
|
146
184
|
// Get the latest messages to extract the response
|
|
147
185
|
const messages = instance.messageManager.getMessages();
|
|
148
186
|
const lastAssistantMessage = messages
|
|
@@ -194,44 +232,6 @@ export class SubagentManager {
|
|
|
194
232
|
instance.messages.push(message);
|
|
195
233
|
}
|
|
196
234
|
}
|
|
197
|
-
/**
|
|
198
|
-
* Abort a running subagent instance
|
|
199
|
-
*/
|
|
200
|
-
abortInstance(subagentId) {
|
|
201
|
-
const instance = this.instances.get(subagentId);
|
|
202
|
-
if (!instance) {
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
// Only abort active or initializing instances
|
|
206
|
-
if (instance.status !== "active" && instance.status !== "initializing") {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
try {
|
|
210
|
-
// Abort the AI manager operations
|
|
211
|
-
instance.aiManager.abortAIMessage();
|
|
212
|
-
// Update status
|
|
213
|
-
this.updateInstanceStatus(subagentId, "aborted");
|
|
214
|
-
this.parentMessageManager.updateSubagentBlock(subagentId, {
|
|
215
|
-
status: "aborted",
|
|
216
|
-
messages: instance.messages,
|
|
217
|
-
});
|
|
218
|
-
this.logger?.info(`Aborted subagent instance: ${subagentId}`);
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
catch (error) {
|
|
222
|
-
this.logger?.error(`Failed to abort subagent instance ${subagentId}:`, error);
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Abort all active subagent instances
|
|
228
|
-
*/
|
|
229
|
-
abortAllInstances() {
|
|
230
|
-
const activeInstances = this.getActiveInstances();
|
|
231
|
-
for (const instance of activeInstances) {
|
|
232
|
-
this.abortInstance(instance.subagentId);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
235
|
/**
|
|
236
236
|
* Clean up completed, errored, or aborted instances
|
|
237
237
|
*/
|
|
@@ -254,8 +254,6 @@ export class SubagentManager {
|
|
|
254
254
|
* Clean up all instances (for session end)
|
|
255
255
|
*/
|
|
256
256
|
cleanup() {
|
|
257
|
-
// Abort all active instances before cleanup
|
|
258
|
-
this.abortAllInstances();
|
|
259
257
|
this.instances.clear();
|
|
260
258
|
}
|
|
261
259
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ToolContext, ToolPlugin, ToolResult } from "../tools/types.js";
|
|
2
2
|
import { McpManager } from "./mcpManager.js";
|
|
3
3
|
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
4
|
-
import type { Logger } from "../types.js";
|
|
4
|
+
import type { Logger } from "../types/index.js";
|
|
5
5
|
import type { SubagentManager } from "./subagentManager.js";
|
|
6
6
|
import type { SkillManager } from "./skillManager.js";
|
|
7
7
|
export interface ToolManagerOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,kBAAkB;IAKvC;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,sBAAsB,CAAC,IAAI,CAAC,EAAE;QACnC,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,IAAI;IAgCF,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA2BtB,IAAI,IAAI,UAAU,EAAE;IAMpB,cAAc,IAAI,0BAA0B,EAAE;CAO/C;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChatCompletionMessageToolCall } from "openai/resources";
|
|
2
2
|
import { ChatCompletionMessageParam, ChatCompletionFunctionTool } from "openai/resources.js";
|
|
3
|
-
import type { GatewayConfig, ModelConfig } from "../types.js";
|
|
3
|
+
import type { GatewayConfig, ModelConfig } from "../types/index.js";
|
|
4
4
|
export interface CallAgentOptions {
|
|
5
5
|
gatewayConfig: GatewayConfig;
|
|
6
6
|
modelConfig: ModelConfig;
|
|
@@ -29,5 +29,13 @@ export interface CompressMessagesOptions {
|
|
|
29
29
|
messages: ChatCompletionMessageParam[];
|
|
30
30
|
abortSignal?: AbortSignal;
|
|
31
31
|
}
|
|
32
|
-
export
|
|
32
|
+
export interface CompressMessagesResult {
|
|
33
|
+
content: string;
|
|
34
|
+
usage?: {
|
|
35
|
+
prompt_tokens: number;
|
|
36
|
+
completion_tokens: number;
|
|
37
|
+
total_tokens: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare function compressMessages(options: CompressMessagesOptions): Promise<CompressMessagesResult>;
|
|
33
41
|
//# sourceMappingURL=aiService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4DpE,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAoH1B;AAED,MAAM,WAAW,uBAAuB;IAEtC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAuGjC"}
|
|
@@ -53,7 +53,14 @@ export async function callAgent(options) {
|
|
|
53
53
|
});
|
|
54
54
|
// Build system prompt content
|
|
55
55
|
let systemContent = systemPrompt ||
|
|
56
|
-
`You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user
|
|
56
|
+
`You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
|
|
57
|
+
|
|
58
|
+
# Tool usage policy
|
|
59
|
+
- When doing file search, prefer to use the Task tool in order to reduce context usage.
|
|
60
|
+
- You should proactively use the Task tool with specialized agents when the task at hand matches the agent's description.
|
|
61
|
+
- You have the capability to call multiple tools in a single response. When multiple independent pieces of information are requested, batch your tool calls together for optimal performance. When making multiple bash tool calls, you MUST send a single message with multiple tools calls to run the calls in parallel. For example, if you need to run "git status" and "git diff", send a single message with two tool calls to run the calls in parallel.
|
|
62
|
+
|
|
63
|
+
`;
|
|
57
64
|
// Always add environment information
|
|
58
65
|
systemContent += `
|
|
59
66
|
|
|
@@ -197,14 +204,28 @@ For technical conversations, structure as:
|
|
|
197
204
|
}, {
|
|
198
205
|
signal: abortSignal,
|
|
199
206
|
});
|
|
200
|
-
|
|
201
|
-
"Failed to compress conversation history"
|
|
207
|
+
const content = response.choices[0]?.message?.content?.trim() ||
|
|
208
|
+
"Failed to compress conversation history";
|
|
209
|
+
const usage = response.usage
|
|
210
|
+
? {
|
|
211
|
+
prompt_tokens: response.usage.prompt_tokens,
|
|
212
|
+
completion_tokens: response.usage.completion_tokens,
|
|
213
|
+
total_tokens: response.usage.total_tokens,
|
|
214
|
+
}
|
|
215
|
+
: undefined;
|
|
216
|
+
return {
|
|
217
|
+
content,
|
|
218
|
+
usage,
|
|
219
|
+
};
|
|
202
220
|
}
|
|
203
221
|
catch (error) {
|
|
204
222
|
if (error.name === "AbortError") {
|
|
205
223
|
throw new Error("Compression request was aborted");
|
|
206
224
|
}
|
|
207
225
|
// // logger.error("Failed to compress messages:", error);
|
|
208
|
-
return
|
|
226
|
+
return {
|
|
227
|
+
content: "Failed to compress conversation history",
|
|
228
|
+
usage: undefined,
|
|
229
|
+
};
|
|
209
230
|
}
|
|
210
231
|
}
|