wave-agent-sdk 0.0.8 → 0.0.10
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 +92 -23
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +340 -137
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/managers/aiManager.d.ts +14 -36
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +74 -77
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +4 -3
- package/dist/managers/hookManager.d.ts +3 -8
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +39 -29
- package/dist/managers/liveConfigManager.d.ts +55 -18
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/liveConfigManager.js +372 -90
- package/dist/managers/lspManager.d.ts +43 -0
- package/dist/managers/lspManager.d.ts.map +1 -0
- package/dist/managers/lspManager.js +326 -0
- package/dist/managers/messageManager.d.ts +8 -16
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +52 -74
- package/dist/managers/permissionManager.d.ts +66 -0
- package/dist/managers/permissionManager.d.ts.map +1 -0
- package/dist/managers/permissionManager.js +208 -0
- package/dist/managers/skillManager.d.ts +1 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +2 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +0 -1
- package/dist/managers/subagentManager.d.ts +8 -23
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +97 -117
- package/dist/managers/toolManager.d.ts +38 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +66 -2
- package/dist/services/aiService.d.ts +3 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +123 -30
- package/dist/services/configurationService.d.ts +116 -0
- package/dist/services/configurationService.d.ts.map +1 -0
- package/dist/services/configurationService.js +585 -0
- package/dist/services/fileWatcher.d.ts.map +1 -1
- package/dist/services/fileWatcher.js +5 -6
- package/dist/services/hook.d.ts +7 -124
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +46 -458
- package/dist/services/jsonlHandler.d.ts +24 -15
- package/dist/services/jsonlHandler.d.ts.map +1 -1
- package/dist/services/jsonlHandler.js +67 -88
- package/dist/services/memory.d.ts +0 -9
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +2 -49
- package/dist/services/session.d.ts +82 -33
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +275 -181
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +72 -13
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +25 -0
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +30 -6
- package/dist/tools/lspTool.d.ts +6 -0
- package/dist/tools/lspTool.d.ts.map +1 -0
- package/dist/tools/lspTool.js +589 -0
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +26 -7
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +111 -2
- package/dist/tools/skillTool.js +2 -2
- package/dist/tools/todoWriteTool.d.ts.map +1 -1
- package/dist/tools/todoWriteTool.js +23 -0
- package/dist/tools/types.d.ts +11 -8
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +25 -9
- package/dist/types/commands.d.ts +0 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +4 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +69 -0
- package/dist/types/configuration.d.ts.map +1 -0
- package/dist/types/configuration.js +8 -0
- package/dist/types/core.d.ts +10 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/environment.d.ts +41 -0
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/fileSearch.d.ts +5 -0
- package/dist/types/fileSearch.d.ts.map +1 -0
- package/dist/types/fileSearch.js +1 -0
- package/dist/types/hooks.d.ts +11 -2
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -7
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -0
- package/dist/types/lsp.d.ts +90 -0
- package/dist/types/lsp.d.ts.map +1 -0
- package/dist/types/lsp.js +4 -0
- package/dist/types/messaging.d.ts +6 -11
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +35 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +12 -0
- package/dist/types/session.d.ts +1 -6
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +35 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +4 -0
- package/dist/utils/abortUtils.d.ts +34 -0
- package/dist/utils/abortUtils.d.ts.map +1 -0
- package/dist/utils/abortUtils.js +92 -0
- package/dist/utils/bashHistory.d.ts +4 -0
- package/dist/utils/bashHistory.d.ts.map +1 -1
- package/dist/utils/bashHistory.js +21 -4
- package/dist/utils/builtinSubagents.d.ts +7 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -0
- package/dist/utils/builtinSubagents.js +65 -0
- package/dist/utils/cacheControlUtils.d.ts +8 -33
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +83 -126
- package/dist/utils/constants.d.ts +0 -12
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -13
- package/dist/utils/convertMessagesForAPI.d.ts +2 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +33 -14
- package/dist/utils/fileSearch.d.ts +14 -0
- package/dist/utils/fileSearch.d.ts.map +1 -0
- package/dist/utils/fileSearch.js +88 -0
- package/dist/utils/fileUtils.d.ts +14 -2
- package/dist/utils/fileUtils.d.ts.map +1 -1
- package/dist/utils/fileUtils.js +101 -17
- package/dist/utils/globalLogger.d.ts +0 -14
- package/dist/utils/globalLogger.d.ts.map +1 -1
- package/dist/utils/globalLogger.js +0 -16
- package/dist/utils/largeOutputHandler.d.ts +15 -0
- package/dist/utils/largeOutputHandler.d.ts.map +1 -0
- package/dist/utils/largeOutputHandler.js +40 -0
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/markdownParser.js +1 -17
- package/dist/utils/messageOperations.d.ts +1 -11
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +7 -24
- package/dist/utils/pathEncoder.d.ts +4 -0
- package/dist/utils/pathEncoder.d.ts.map +1 -1
- package/dist/utils/pathEncoder.js +16 -9
- package/dist/utils/subagentParser.d.ts +2 -2
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +10 -7
- package/dist/utils/tokenEstimator.d.ts +39 -0
- package/dist/utils/tokenEstimator.d.ts.map +1 -0
- package/dist/utils/tokenEstimator.js +55 -0
- package/package.json +5 -8
- package/src/agent.ts +460 -216
- package/src/index.ts +2 -0
- package/src/managers/aiManager.ts +107 -111
- package/src/managers/backgroundBashManager.ts +4 -3
- package/src/managers/hookManager.ts +44 -39
- package/src/managers/liveConfigManager.ts +524 -138
- package/src/managers/lspManager.ts +434 -0
- package/src/managers/messageManager.ts +73 -103
- package/src/managers/permissionManager.ts +276 -0
- package/src/managers/skillManager.ts +3 -1
- package/src/managers/slashCommandManager.ts +1 -2
- package/src/managers/subagentManager.ts +116 -159
- package/src/managers/toolManager.ts +95 -3
- package/src/services/aiService.ts +207 -26
- package/src/services/configurationService.ts +762 -0
- package/src/services/fileWatcher.ts +5 -6
- package/src/services/hook.ts +50 -631
- package/src/services/jsonlHandler.ts +84 -100
- package/src/services/memory.ts +2 -59
- package/src/services/session.ts +338 -213
- package/src/tools/bashTool.ts +89 -16
- package/src/tools/deleteFileTool.ts +36 -0
- package/src/tools/editTool.ts +41 -7
- package/src/tools/lspTool.ts +760 -0
- package/src/tools/multiEditTool.ts +37 -8
- package/src/tools/readTool.ts +125 -2
- package/src/tools/skillTool.ts +2 -2
- package/src/tools/todoWriteTool.ts +33 -1
- package/src/tools/types.ts +15 -9
- package/src/tools/writeTool.ts +36 -10
- package/src/types/commands.ts +0 -1
- package/src/types/config.ts +5 -0
- package/src/types/configuration.ts +73 -0
- package/src/types/core.ts +11 -0
- package/src/types/environment.ts +44 -0
- package/src/types/fileSearch.ts +4 -0
- package/src/types/hooks.ts +14 -11
- package/src/types/index.ts +5 -0
- package/src/types/lsp.ts +96 -0
- package/src/types/messaging.ts +8 -13
- package/src/types/permissions.ts +48 -0
- package/src/types/session.ts +3 -8
- package/src/types/skills.ts +1 -0
- package/src/types/tools.ts +38 -0
- package/src/utils/abortUtils.ts +118 -0
- package/src/utils/bashHistory.ts +28 -4
- package/src/utils/builtinSubagents.ts +71 -0
- package/src/utils/cacheControlUtils.ts +106 -171
- package/src/utils/constants.ts +1 -16
- package/src/utils/convertMessagesForAPI.ts +38 -14
- package/src/utils/fileSearch.ts +107 -0
- package/src/utils/fileUtils.ts +114 -19
- package/src/utils/globalLogger.ts +0 -17
- package/src/utils/largeOutputHandler.ts +55 -0
- package/src/utils/markdownParser.ts +1 -19
- package/src/utils/messageOperations.ts +7 -35
- package/src/utils/pathEncoder.ts +24 -9
- package/src/utils/subagentParser.ts +11 -8
- package/src/utils/tokenEstimator.ts +68 -0
- package/dist/constants/events.d.ts +0 -28
- package/dist/constants/events.d.ts.map +0 -1
- package/dist/constants/events.js +0 -27
- package/dist/services/configurationWatcher.d.ts +0 -120
- package/dist/services/configurationWatcher.d.ts.map +0 -1
- package/dist/services/configurationWatcher.js +0 -439
- package/dist/services/memoryStore.d.ts +0 -81
- package/dist/services/memoryStore.d.ts.map +0 -1
- package/dist/services/memoryStore.js +0 -200
- package/dist/types/memoryStore.d.ts +0 -82
- package/dist/types/memoryStore.d.ts.map +0 -1
- package/dist/types/memoryStore.js +0 -7
- package/dist/utils/configResolver.d.ts +0 -65
- package/dist/utils/configResolver.d.ts.map +0 -1
- package/dist/utils/configResolver.js +0 -210
- package/src/constants/events.ts +0 -38
- package/src/services/configurationWatcher.ts +0 -622
- package/src/services/memoryStore.ts +0 -279
- package/src/types/memoryStore.ts +0 -94
- package/src/utils/configResolver.ts +0 -302
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
2
|
import { AIManager } from "./aiManager.js";
|
|
3
3
|
import { MessageManager } from "./messageManager.js";
|
|
4
|
+
import { addConsolidatedAbortListener, createAbortPromise, } from "../utils/abortUtils.js";
|
|
4
5
|
export class SubagentManager {
|
|
5
6
|
constructor(options) {
|
|
6
7
|
this.instances = new Map();
|
|
@@ -10,9 +11,9 @@ export class SubagentManager {
|
|
|
10
11
|
this.parentMessageManager = options.parentMessageManager;
|
|
11
12
|
this.callbacks = options.callbacks; // Store SubagentManagerCallbacks
|
|
12
13
|
this.logger = options.logger;
|
|
13
|
-
this.
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
14
|
+
this.getGatewayConfig = options.getGatewayConfig;
|
|
15
|
+
this.getModelConfig = options.getModelConfig;
|
|
16
|
+
this.getTokenLimit = options.getTokenLimit;
|
|
16
17
|
this.hookManager = options.hookManager;
|
|
17
18
|
this.onUsageAdded = options.onUsageAdded;
|
|
18
19
|
}
|
|
@@ -52,10 +53,7 @@ export class SubagentManager {
|
|
|
52
53
|
* Create a new subagent instance with isolated managers
|
|
53
54
|
*/
|
|
54
55
|
async createInstance(configuration, parameters) {
|
|
55
|
-
if (!this.parentToolManager
|
|
56
|
-
!this.gatewayConfig ||
|
|
57
|
-
!this.modelConfig ||
|
|
58
|
-
!this.tokenLimit) {
|
|
56
|
+
if (!this.parentToolManager) {
|
|
59
57
|
throw new Error("SubagentManager not properly initialized - call initialize() first");
|
|
60
58
|
}
|
|
61
59
|
const subagentId = randomUUID();
|
|
@@ -66,15 +64,10 @@ export class SubagentManager {
|
|
|
66
64
|
workdir: this.workdir,
|
|
67
65
|
logger: this.logger,
|
|
68
66
|
sessionType: "subagent",
|
|
69
|
-
parentSessionId: this.parentMessageManager.getSessionId(),
|
|
70
67
|
subagentType: parameters.subagent_type,
|
|
71
68
|
});
|
|
72
69
|
// Use the parent tool manager directly - tool restrictions will be handled by allowedTools parameter
|
|
73
70
|
const toolManager = this.parentToolManager;
|
|
74
|
-
// Determine model to use
|
|
75
|
-
const modelToUse = configuration.model && configuration.model !== "inherit"
|
|
76
|
-
? configuration.model
|
|
77
|
-
: this.modelConfig.agentModel;
|
|
78
71
|
// Create isolated AIManager for the subagent
|
|
79
72
|
const aiManager = new AIManager({
|
|
80
73
|
messageManager,
|
|
@@ -84,12 +77,29 @@ export class SubagentManager {
|
|
|
84
77
|
systemPrompt: configuration.systemPrompt,
|
|
85
78
|
subagentType: parameters.subagent_type, // Pass subagent type for hook context
|
|
86
79
|
hookManager: this.hookManager,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
80
|
+
getGatewayConfig: this.getGatewayConfig,
|
|
81
|
+
getModelConfig: () => {
|
|
82
|
+
// Determine model dynamically each time
|
|
83
|
+
const parentModelConfig = this.getModelConfig();
|
|
84
|
+
let modelToUse;
|
|
85
|
+
if (!configuration.model || configuration.model === "inherit") {
|
|
86
|
+
// Use parent's agentModel for "inherit" or undefined
|
|
87
|
+
modelToUse = parentModelConfig.agentModel;
|
|
88
|
+
}
|
|
89
|
+
else if (configuration.model === "fastModel") {
|
|
90
|
+
// Use parent's fastModel for special "fastModel" value
|
|
91
|
+
modelToUse = parentModelConfig.fastModel;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Use specific model name
|
|
95
|
+
modelToUse = configuration.model;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
...parentModelConfig,
|
|
99
|
+
agentModel: modelToUse,
|
|
100
|
+
};
|
|
91
101
|
},
|
|
92
|
-
|
|
102
|
+
getTokenLimit: this.getTokenLimit,
|
|
93
103
|
callbacks: {
|
|
94
104
|
onUsageAdded: this.onUsageAdded,
|
|
95
105
|
},
|
|
@@ -126,14 +136,22 @@ export class SubagentManager {
|
|
|
126
136
|
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
127
137
|
status: "active",
|
|
128
138
|
});
|
|
129
|
-
// Set up abort handler
|
|
139
|
+
// Set up consolidated abort handler to prevent listener accumulation
|
|
140
|
+
let abortCleanup;
|
|
130
141
|
if (abortSignal) {
|
|
131
|
-
abortSignal
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
abortCleanup = addConsolidatedAbortListener(abortSignal, [
|
|
143
|
+
() => {
|
|
144
|
+
// Update status to aborted
|
|
145
|
+
this.updateInstanceStatus(instance.subagentId, "aborted");
|
|
146
|
+
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
147
|
+
status: "aborted",
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
() => {
|
|
151
|
+
// Abort the AI execution
|
|
152
|
+
instance.aiManager.abortAIMessage();
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
137
155
|
}
|
|
138
156
|
// Add the user's prompt as a message
|
|
139
157
|
instance.messageManager.addUserMessage({ content: prompt });
|
|
@@ -150,31 +168,42 @@ export class SubagentManager {
|
|
|
150
168
|
}
|
|
151
169
|
// Execute the AI request with tool restrictions
|
|
152
170
|
// The AIManager will handle abort signals through its own abort controllers
|
|
153
|
-
//
|
|
171
|
+
// Resolve model name for sendAIMessage
|
|
172
|
+
let resolvedModel;
|
|
173
|
+
if (instance.configuration.model &&
|
|
174
|
+
instance.configuration.model !== "inherit") {
|
|
175
|
+
if (instance.configuration.model === "fastModel") {
|
|
176
|
+
// Use parent's fastModel for special "fastModel" value
|
|
177
|
+
const parentModelConfig = this.getModelConfig();
|
|
178
|
+
resolvedModel = parentModelConfig.fastModel;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
// Use specific model name
|
|
182
|
+
resolvedModel = instance.configuration.model;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// For "inherit" or undefined, resolvedModel remains undefined (uses AIManager default)
|
|
154
186
|
const executeAI = instance.aiManager.sendAIMessage({
|
|
155
187
|
allowedTools,
|
|
156
|
-
model:
|
|
157
|
-
? instance.configuration.model
|
|
158
|
-
: undefined,
|
|
188
|
+
model: resolvedModel,
|
|
159
189
|
});
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
reject(new Error("Task was aborted"));
|
|
172
|
-
});
|
|
173
|
-
}),
|
|
174
|
-
]);
|
|
190
|
+
try {
|
|
191
|
+
// If we have an abort signal, race against it using utilities to prevent listener accumulation
|
|
192
|
+
if (abortSignal) {
|
|
193
|
+
await Promise.race([
|
|
194
|
+
executeAI,
|
|
195
|
+
createAbortPromise(abortSignal, "Task was aborted"),
|
|
196
|
+
]);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
await executeAI;
|
|
200
|
+
}
|
|
175
201
|
}
|
|
176
|
-
|
|
177
|
-
|
|
202
|
+
finally {
|
|
203
|
+
// Clean up abort listeners to prevent memory leaks
|
|
204
|
+
if (abortCleanup) {
|
|
205
|
+
abortCleanup();
|
|
206
|
+
}
|
|
178
207
|
}
|
|
179
208
|
// Get the latest messages to extract the response
|
|
180
209
|
const messages = instance.messageManager.getMessages();
|
|
@@ -266,15 +295,22 @@ export class SubagentManager {
|
|
|
266
295
|
workdir: this.workdir,
|
|
267
296
|
logger: this.logger,
|
|
268
297
|
sessionType: "subagent",
|
|
269
|
-
parentSessionId: this.parentMessageManager.getSessionId(),
|
|
270
298
|
subagentType: configuration.name, // Use configuration name for restored sessions
|
|
271
299
|
});
|
|
272
300
|
// Use the parent tool manager
|
|
273
301
|
const toolManager = this.parentToolManager;
|
|
274
302
|
// Determine model to use
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
303
|
+
let modelToUse;
|
|
304
|
+
const parentModelConfig = this.getModelConfig();
|
|
305
|
+
if (!configuration.model || configuration.model === "inherit") {
|
|
306
|
+
modelToUse = parentModelConfig.agentModel;
|
|
307
|
+
}
|
|
308
|
+
else if (configuration.model === "fastModel") {
|
|
309
|
+
modelToUse = parentModelConfig.fastModel;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
modelToUse = configuration.model;
|
|
313
|
+
}
|
|
278
314
|
// Create AIManager for the restored subagent
|
|
279
315
|
const aiManager = new AIManager({
|
|
280
316
|
messageManager,
|
|
@@ -284,12 +320,12 @@ export class SubagentManager {
|
|
|
284
320
|
systemPrompt: configuration.systemPrompt,
|
|
285
321
|
subagentType: configuration.name, // Use configuration name as subagent type for restored instances
|
|
286
322
|
hookManager: this.hookManager,
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
...
|
|
323
|
+
getGatewayConfig: this.getGatewayConfig,
|
|
324
|
+
getModelConfig: () => ({
|
|
325
|
+
...parentModelConfig,
|
|
290
326
|
agentModel: modelToUse,
|
|
291
|
-
},
|
|
292
|
-
|
|
327
|
+
}),
|
|
328
|
+
getTokenLimit: this.getTokenLimit,
|
|
293
329
|
callbacks: {
|
|
294
330
|
onUsageAdded: this.onUsageAdded,
|
|
295
331
|
},
|
|
@@ -308,19 +344,7 @@ export class SubagentManager {
|
|
|
308
344
|
// IMPORTANT: Store instance in map BEFORE calling setMessages
|
|
309
345
|
// This ensures the callback can find the instance
|
|
310
346
|
this.instances.set(subagentId, instance);
|
|
311
|
-
|
|
312
|
-
const sessionDataObj = {
|
|
313
|
-
id: sessionData.id,
|
|
314
|
-
messages: sessionData.messages,
|
|
315
|
-
version: "1.0.0",
|
|
316
|
-
metadata: {
|
|
317
|
-
workdir: this.workdir,
|
|
318
|
-
startedAt: new Date().toISOString(),
|
|
319
|
-
lastActiveAt: new Date().toISOString(),
|
|
320
|
-
latestTotalTokens: 0,
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
messageManager.initializeFromSession(sessionDataObj);
|
|
347
|
+
messageManager.initializeFromSession(sessionData);
|
|
324
348
|
}
|
|
325
349
|
catch (error) {
|
|
326
350
|
this.logger?.warn(`Failed to restore subagent session ${subagentId}:`, error);
|
|
@@ -352,6 +376,12 @@ export class SubagentManager {
|
|
|
352
376
|
this.callbacks.onSubagentAssistantContentUpdated(subagentId, chunk, accumulated);
|
|
353
377
|
}
|
|
354
378
|
},
|
|
379
|
+
onAssistantReasoningUpdated: (chunk, accumulated) => {
|
|
380
|
+
// Forward assistant reasoning updates to parent via SubagentManager callbacks
|
|
381
|
+
if (this.callbacks?.onSubagentAssistantReasoningUpdated) {
|
|
382
|
+
this.callbacks.onSubagentAssistantReasoningUpdated(subagentId, chunk, accumulated);
|
|
383
|
+
}
|
|
384
|
+
},
|
|
355
385
|
onToolBlockUpdated: (params) => {
|
|
356
386
|
// Forward tool block updates to parent via SubagentManager callbacks
|
|
357
387
|
if (this.callbacks?.onSubagentToolBlockUpdated) {
|
|
@@ -377,54 +407,4 @@ export class SubagentManager {
|
|
|
377
407
|
},
|
|
378
408
|
};
|
|
379
409
|
}
|
|
380
|
-
/**
|
|
381
|
-
* Update configuration for SubagentManager and all active subagents
|
|
382
|
-
* This method updates configuration for live config reload support
|
|
383
|
-
* @param newGatewayConfig - New gateway configuration
|
|
384
|
-
* @param newModelConfig - New model configuration
|
|
385
|
-
* @param newTokenLimit - New token limit
|
|
386
|
-
*/
|
|
387
|
-
updateConfiguration(newGatewayConfig, newModelConfig, newTokenLimit) {
|
|
388
|
-
this.logger?.info("Live Config: Updating SubagentManager configuration");
|
|
389
|
-
// Update stored configuration
|
|
390
|
-
this.gatewayConfig = newGatewayConfig;
|
|
391
|
-
this.modelConfig = newModelConfig;
|
|
392
|
-
this.tokenLimit = newTokenLimit;
|
|
393
|
-
// Update all active subagent AIManager instances
|
|
394
|
-
let updatedCount = 0;
|
|
395
|
-
for (const [subagentId, instance] of this.instances.entries()) {
|
|
396
|
-
if (instance.status === "active" || instance.status === "initializing") {
|
|
397
|
-
try {
|
|
398
|
-
// For subagents, we need to preserve their model if it was explicitly set
|
|
399
|
-
const subagentModelConfig = {
|
|
400
|
-
...newModelConfig,
|
|
401
|
-
// If subagent has its own model configured, preserve it
|
|
402
|
-
agentModel: instance.configuration.model &&
|
|
403
|
-
instance.configuration.model !== "inherit"
|
|
404
|
-
? instance.configuration.model
|
|
405
|
-
: newModelConfig.agentModel,
|
|
406
|
-
};
|
|
407
|
-
instance.aiManager.updateConfiguration(newGatewayConfig, subagentModelConfig, newTokenLimit);
|
|
408
|
-
updatedCount++;
|
|
409
|
-
this.logger?.debug(`Live Config: Updated configuration for subagent ${subagentId}`);
|
|
410
|
-
}
|
|
411
|
-
catch (error) {
|
|
412
|
-
this.logger?.error(`Live Config: Failed to update configuration for subagent ${subagentId}: ${error.message}`);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
this.logger?.info(`Live Config: SubagentManager configuration updated - ${updatedCount} active subagents updated`);
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Get current configuration for debugging
|
|
420
|
-
*/
|
|
421
|
-
getCurrentConfiguration() {
|
|
422
|
-
const activeSubagents = Array.from(this.instances.values()).filter((instance) => instance.status === "active" || instance.status === "initializing").length;
|
|
423
|
-
return {
|
|
424
|
-
gatewayConfig: { ...this.gatewayConfig },
|
|
425
|
-
modelConfig: { ...this.modelConfig },
|
|
426
|
-
tokenLimit: this.tokenLimit,
|
|
427
|
-
activeSubagents,
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
410
|
}
|
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
import type { ToolContext, ToolPlugin, ToolResult } from "../tools/types.js";
|
|
2
2
|
import { McpManager } from "./mcpManager.js";
|
|
3
|
+
import { PermissionManager } from "./permissionManager.js";
|
|
3
4
|
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
4
|
-
import type { Logger } from "../types/index.js";
|
|
5
|
+
import type { Logger, PermissionMode, PermissionCallback, ILspManager } from "../types/index.js";
|
|
5
6
|
import type { SubagentManager } from "./subagentManager.js";
|
|
6
7
|
import type { SkillManager } from "./skillManager.js";
|
|
7
8
|
export interface ToolManagerOptions {
|
|
8
9
|
mcpManager: McpManager;
|
|
10
|
+
lspManager?: ILspManager;
|
|
9
11
|
logger?: Logger;
|
|
12
|
+
/** Optional permission manager for handling tool permission checks */
|
|
13
|
+
permissionManager?: PermissionManager;
|
|
14
|
+
/** Permission mode for tool execution (defaults to "default") */
|
|
15
|
+
permissionMode?: PermissionMode;
|
|
16
|
+
/** Custom permission callback for tool usage */
|
|
17
|
+
canUseToolCallback?: PermissionCallback;
|
|
10
18
|
}
|
|
11
19
|
/**
|
|
12
20
|
* Tool Manager
|
|
21
|
+
*
|
|
22
|
+
* Manages tool registration and execution with optional permission system integration.
|
|
23
|
+
* Supports both built-in tools and MCP (Model Context Protocol) tools.
|
|
13
24
|
*/
|
|
14
25
|
declare class ToolManager {
|
|
15
26
|
private tools;
|
|
16
27
|
private mcpManager;
|
|
28
|
+
private lspManager?;
|
|
17
29
|
private logger?;
|
|
30
|
+
private permissionManager?;
|
|
31
|
+
private permissionMode?;
|
|
32
|
+
private canUseToolCallback?;
|
|
18
33
|
constructor(options: ToolManagerOptions);
|
|
19
34
|
/**
|
|
20
35
|
* Register a new tool
|
|
@@ -47,9 +62,31 @@ declare class ToolManager {
|
|
|
47
62
|
subagentManager?: SubagentManager;
|
|
48
63
|
skillManager?: SkillManager;
|
|
49
64
|
}): void;
|
|
65
|
+
/**
|
|
66
|
+
* Execute a tool by name with the provided arguments and context
|
|
67
|
+
*
|
|
68
|
+
* Enhances the context with permission-related fields before execution:
|
|
69
|
+
* - permissionMode: The current permission mode (default or bypassPermissions)
|
|
70
|
+
* - canUseToolCallback: Custom permission callback if provided
|
|
71
|
+
* - permissionManager: The PermissionManager instance for permission checks
|
|
72
|
+
*
|
|
73
|
+
* @param name - Name of the tool to execute
|
|
74
|
+
* @param args - Arguments to pass to the tool
|
|
75
|
+
* @param context - Execution context for the tool
|
|
76
|
+
* @returns Promise resolving to the tool execution result
|
|
77
|
+
*/
|
|
50
78
|
execute(name: string, args: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
|
|
51
79
|
list(): ToolPlugin[];
|
|
52
80
|
getToolsConfig(): ChatCompletionFunctionTool[];
|
|
81
|
+
/**
|
|
82
|
+
* Get the current permission mode
|
|
83
|
+
*/
|
|
84
|
+
getPermissionMode(): PermissionMode;
|
|
85
|
+
/**
|
|
86
|
+
* Set the permission mode
|
|
87
|
+
* @param mode - The new permission mode
|
|
88
|
+
*/
|
|
89
|
+
setPermissionMode(mode: PermissionMode): void;
|
|
53
90
|
}
|
|
54
91
|
export { ToolManager };
|
|
55
92
|
//# sourceMappingURL=toolManager.d.ts.map
|
|
@@ -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;
|
|
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;AAe7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,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,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,iEAAiE;IACjE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED;;;;;GAKG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAqB;gBAEpC,OAAO,EAAE,kBAAkB;IAUvC;;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;IAiCR;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA2DtB,IAAI,IAAI,UAAU,EAAE;IAMpB,cAAc,IAAI,0BAA0B,EAAE;IAQ9C;;OAEG;IACI,iBAAiB,IAAI,cAAc;IAS1C;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;CAGrD;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -9,16 +9,25 @@ import { grepTool } from "../tools/grepTool.js";
|
|
|
9
9
|
import { lsTool } from "../tools/lsTool.js";
|
|
10
10
|
import { readTool } from "../tools/readTool.js";
|
|
11
11
|
import { todoWriteTool } from "../tools/todoWriteTool.js";
|
|
12
|
+
import { lspTool } from "../tools/lspTool.js";
|
|
12
13
|
import { createTaskTool } from "../tools/taskTool.js";
|
|
13
14
|
import { createSkillTool } from "../tools/skillTool.js";
|
|
14
15
|
/**
|
|
15
16
|
* Tool Manager
|
|
17
|
+
*
|
|
18
|
+
* Manages tool registration and execution with optional permission system integration.
|
|
19
|
+
* Supports both built-in tools and MCP (Model Context Protocol) tools.
|
|
16
20
|
*/
|
|
17
21
|
class ToolManager {
|
|
18
22
|
constructor(options) {
|
|
19
23
|
this.tools = new Map();
|
|
20
24
|
this.mcpManager = options.mcpManager;
|
|
25
|
+
this.lspManager = options.lspManager;
|
|
21
26
|
this.logger = options.logger;
|
|
27
|
+
this.permissionManager = options.permissionManager;
|
|
28
|
+
// Store CLI permission mode, let PermissionManager resolve effective mode
|
|
29
|
+
this.permissionMode = options.permissionMode;
|
|
30
|
+
this.canUseToolCallback = options.canUseToolCallback;
|
|
22
31
|
}
|
|
23
32
|
/**
|
|
24
33
|
* Register a new tool
|
|
@@ -63,6 +72,7 @@ class ToolManager {
|
|
|
63
72
|
lsTool,
|
|
64
73
|
readTool,
|
|
65
74
|
todoWriteTool,
|
|
75
|
+
lspTool,
|
|
66
76
|
];
|
|
67
77
|
for (const tool of builtInTools) {
|
|
68
78
|
this.tools.set(tool.name, tool);
|
|
@@ -77,18 +87,55 @@ class ToolManager {
|
|
|
77
87
|
this.tools.set(skillTool.name, skillTool);
|
|
78
88
|
}
|
|
79
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Execute a tool by name with the provided arguments and context
|
|
92
|
+
*
|
|
93
|
+
* Enhances the context with permission-related fields before execution:
|
|
94
|
+
* - permissionMode: The current permission mode (default or bypassPermissions)
|
|
95
|
+
* - canUseToolCallback: Custom permission callback if provided
|
|
96
|
+
* - permissionManager: The PermissionManager instance for permission checks
|
|
97
|
+
*
|
|
98
|
+
* @param name - Name of the tool to execute
|
|
99
|
+
* @param args - Arguments to pass to the tool
|
|
100
|
+
* @param context - Execution context for the tool
|
|
101
|
+
* @returns Promise resolving to the tool execution result
|
|
102
|
+
*/
|
|
80
103
|
async execute(name, args, context) {
|
|
104
|
+
// Resolve effective permission mode (CLI override > configuration > default)
|
|
105
|
+
const effectivePermissionMode = this.permissionManager
|
|
106
|
+
? this.permissionManager.getCurrentEffectiveMode(this.permissionMode)
|
|
107
|
+
: this.permissionMode || "default";
|
|
108
|
+
// Enhance context with permission-related fields
|
|
109
|
+
const enhancedContext = {
|
|
110
|
+
...context,
|
|
111
|
+
permissionMode: effectivePermissionMode,
|
|
112
|
+
canUseToolCallback: this.canUseToolCallback,
|
|
113
|
+
permissionManager: this.permissionManager,
|
|
114
|
+
mcpManager: this.mcpManager,
|
|
115
|
+
lspManager: this.lspManager,
|
|
116
|
+
};
|
|
117
|
+
this.logger?.debug("Executing tool with enhanced context", {
|
|
118
|
+
toolName: name,
|
|
119
|
+
cliPermissionMode: this.permissionMode,
|
|
120
|
+
effectivePermissionMode,
|
|
121
|
+
hasPermissionManager: !!this.permissionManager,
|
|
122
|
+
hasPermissionCallback: !!this.canUseToolCallback,
|
|
123
|
+
});
|
|
81
124
|
// Check if it's an MCP tool first
|
|
82
125
|
if (this.mcpManager.isMcpTool(name)) {
|
|
83
|
-
return this.mcpManager.executeMcpToolByRegistry(name, args,
|
|
126
|
+
return this.mcpManager.executeMcpToolByRegistry(name, args, enhancedContext);
|
|
84
127
|
}
|
|
85
128
|
// Check built-in tools
|
|
86
129
|
const plugin = this.tools.get(name);
|
|
87
130
|
if (plugin) {
|
|
88
131
|
try {
|
|
89
|
-
return await plugin.execute(args,
|
|
132
|
+
return await plugin.execute(args, enhancedContext);
|
|
90
133
|
}
|
|
91
134
|
catch (error) {
|
|
135
|
+
this.logger?.error("Tool execution failed", {
|
|
136
|
+
toolName: name,
|
|
137
|
+
error: error instanceof Error ? error.message : String(error),
|
|
138
|
+
});
|
|
92
139
|
return {
|
|
93
140
|
success: false,
|
|
94
141
|
content: "",
|
|
@@ -96,6 +143,7 @@ class ToolManager {
|
|
|
96
143
|
};
|
|
97
144
|
}
|
|
98
145
|
}
|
|
146
|
+
this.logger?.warn("Tool not found", { toolName: name });
|
|
99
147
|
return {
|
|
100
148
|
success: false,
|
|
101
149
|
content: "",
|
|
@@ -112,6 +160,22 @@ class ToolManager {
|
|
|
112
160
|
const mcpToolsConfig = this.mcpManager.getMcpToolsConfig();
|
|
113
161
|
return [...builtInToolsConfig, ...mcpToolsConfig];
|
|
114
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Get the current permission mode
|
|
165
|
+
*/
|
|
166
|
+
getPermissionMode() {
|
|
167
|
+
if (this.permissionManager) {
|
|
168
|
+
return this.permissionManager.getCurrentEffectiveMode(this.permissionMode);
|
|
169
|
+
}
|
|
170
|
+
return this.permissionMode || "default";
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Set the permission mode
|
|
174
|
+
* @param mode - The new permission mode
|
|
175
|
+
*/
|
|
176
|
+
setPermissionMode(mode) {
|
|
177
|
+
this.permissionMode = mode;
|
|
178
|
+
}
|
|
115
179
|
}
|
|
116
180
|
// Export tool registry class and types
|
|
117
181
|
export { ToolManager };
|
|
@@ -21,14 +21,16 @@ export interface CallAgentOptions {
|
|
|
21
21
|
parametersChunk?: string;
|
|
22
22
|
stage?: "start" | "streaming" | "running" | "end";
|
|
23
23
|
}) => void;
|
|
24
|
+
onReasoningUpdate?: (content: string) => void;
|
|
24
25
|
}
|
|
25
26
|
export interface CallAgentResult {
|
|
26
27
|
content?: string;
|
|
27
28
|
tool_calls?: ChatCompletionMessageToolCall[];
|
|
29
|
+
reasoning_content?: string;
|
|
28
30
|
usage?: ClaudeUsage;
|
|
29
31
|
finish_reason?: "stop" | "length" | "tool_calls" | "content_filter" | "function_call" | null;
|
|
30
32
|
response_headers?: Record<string, string>;
|
|
31
|
-
|
|
33
|
+
additionalFields?: Record<string, unknown>;
|
|
32
34
|
}
|
|
33
35
|
export declare function callAgent(options: CallAgentOptions): Promise<CallAgentResult>;
|
|
34
36
|
export interface CompressMessagesOptions {
|
|
@@ -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,EAGL,0BAA0B,EAC1B,0BAA0B,EAE3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;
|
|
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,EAGL,0BAA0B,EAC1B,0BAA0B,EAE3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AAqGvC,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;IAGtB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE;QACxB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;KACnD,KAAK,IAAI,CAAC;IACX,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EACV,MAAM,GACN,QAAQ,GACR,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,IAAI,CAAC;IACT,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA2U1B;AA4OD,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,CA8JjC"}
|