wave-agent-sdk 0.6.5 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +8 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +49 -240
- package/dist/constants/tools.d.ts +0 -2
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +0 -2
- package/dist/core/plugin.d.ts +86 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +164 -0
- package/dist/core/session.d.ts +3 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +1 -0
- package/dist/index.d.ts +2 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -10
- package/dist/managers/MemoryRuleManager.d.ts +3 -1
- package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
- package/dist/managers/MemoryRuleManager.js +2 -1
- package/dist/managers/aiManager.d.ts +13 -23
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +60 -32
- package/dist/managers/backgroundTaskManager.d.ts +3 -1
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +2 -1
- package/dist/managers/bashManager.d.ts +4 -4
- package/dist/managers/bashManager.d.ts.map +1 -1
- package/dist/managers/bashManager.js +5 -2
- package/dist/managers/foregroundTaskManager.d.ts +3 -0
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
- package/dist/managers/foregroundTaskManager.js +2 -1
- package/dist/managers/hookManager.d.ts +3 -3
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +20 -19
- package/dist/managers/liveConfigManager.d.ts +6 -13
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/liveConfigManager.js +50 -45
- package/dist/managers/lspManager.d.ts +4 -5
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +13 -12
- package/dist/managers/mcpManager.d.ts +3 -2
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +16 -15
- package/dist/managers/messageManager.d.ts +5 -7
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +12 -7
- package/dist/managers/permissionManager.d.ts +6 -4
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +39 -63
- package/dist/managers/planManager.d.ts +4 -6
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +18 -4
- package/dist/managers/pluginManager.d.ts +10 -22
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +27 -14
- package/dist/managers/reversionManager.d.ts +4 -3
- package/dist/managers/reversionManager.d.ts.map +1 -1
- package/dist/managers/reversionManager.js +5 -2
- package/dist/managers/skillManager.d.ts +3 -2
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +15 -14
- package/dist/managers/slashCommandManager.d.ts +9 -16
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +21 -10
- package/dist/managers/subagentManager.d.ts +7 -17
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +41 -34
- package/dist/managers/toolManager.d.ts +15 -38
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +67 -56
- package/dist/prompts/index.d.ts +6 -2
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +8 -4
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +13 -0
- package/dist/services/aiService.d.ts +4 -0
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +47 -7
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +30 -11
- package/dist/services/taskManager.d.ts +3 -1
- package/dist/services/taskManager.d.ts.map +1 -1
- package/dist/services/taskManager.js +3 -2
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +19 -4
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +16 -4
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +2 -2
- package/dist/tools/skillTool.d.ts +2 -4
- package/dist/tools/skillTool.d.ts.map +1 -1
- package/dist/tools/skillTool.js +61 -61
- package/dist/tools/taskOutputTool.d.ts.map +1 -1
- package/dist/tools/taskOutputTool.js +3 -2
- package/dist/tools/taskTool.d.ts +2 -4
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +192 -187
- package/dist/tools/types.d.ts +12 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +5 -2
- package/dist/types/core.d.ts +2 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/marketplace.d.ts +8 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/messaging.d.ts +1 -0
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +3 -1
- package/dist/types/permissions.d.ts.map +1 -1
- package/dist/types/permissions.js +1 -3
- package/dist/types/skills.d.ts +0 -2
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +0 -15
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/container.d.ts +31 -0
- package/dist/utils/container.d.ts.map +1 -0
- package/dist/utils/container.js +79 -0
- package/dist/utils/containerSetup.d.ts +26 -0
- package/dist/utils/containerSetup.d.ts.map +1 -0
- package/dist/utils/containerSetup.js +187 -0
- package/dist/utils/editUtils.d.ts +0 -3
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +4 -3
- package/dist/utils/hookMatcher.d.ts +1 -1
- package/dist/utils/hookMatcher.d.ts.map +1 -1
- package/dist/utils/hookMatcher.js +2 -2
- package/dist/utils/messageOperations.d.ts +2 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +4 -1
- package/dist/utils/openaiClient.js +2 -2
- package/dist/utils/stringUtils.d.ts +6 -0
- package/dist/utils/stringUtils.d.ts.map +1 -1
- package/dist/utils/stringUtils.js +8 -0
- package/package.json +1 -1
- package/src/agent.ts +60 -282
- package/src/constants/tools.ts +0 -2
- package/src/core/plugin.ts +224 -0
- package/src/core/session.ts +6 -0
- package/src/index.ts +2 -11
- package/src/managers/MemoryRuleManager.ts +6 -1
- package/src/managers/aiManager.ts +84 -58
- package/src/managers/backgroundTaskManager.ts +5 -1
- package/src/managers/bashManager.ts +9 -4
- package/src/managers/foregroundTaskManager.ts +3 -0
- package/src/managers/hookManager.ts +21 -23
- package/src/managers/liveConfigManager.ts +57 -53
- package/src/managers/lspManager.ts +14 -19
- package/src/managers/mcpManager.ts +20 -20
- package/src/managers/messageManager.ts +19 -12
- package/src/managers/permissionManager.ts +45 -70
- package/src/managers/planManager.ts +26 -7
- package/src/managers/pluginManager.ts +37 -33
- package/src/managers/reversionManager.ts +5 -3
- package/src/managers/skillManager.ts +19 -20
- package/src/managers/slashCommandManager.ts +30 -25
- package/src/managers/subagentManager.ts +53 -53
- package/src/managers/toolManager.ts +93 -90
- package/src/prompts/index.ts +13 -5
- package/src/services/MarketplaceService.ts +13 -0
- package/src/services/aiService.ts +61 -15
- package/src/services/configurationService.ts +34 -13
- package/src/services/taskManager.ts +6 -2
- package/src/tools/bashTool.ts +19 -4
- package/src/tools/editTool.ts +17 -4
- package/src/tools/readTool.ts +2 -2
- package/src/tools/skillTool.ts +75 -71
- package/src/tools/taskOutputTool.ts +3 -2
- package/src/tools/taskTool.ts +224 -225
- package/src/tools/types.ts +14 -1
- package/src/tools/writeTool.ts +5 -2
- package/src/types/core.ts +2 -0
- package/src/types/marketplace.ts +9 -0
- package/src/types/messaging.ts +1 -0
- package/src/types/permissions.ts +2 -4
- package/src/types/skills.ts +0 -3
- package/src/types/tools.ts +0 -17
- package/src/utils/container.ts +92 -0
- package/src/utils/containerSetup.ts +279 -0
- package/src/utils/editUtils.ts +4 -3
- package/src/utils/hookMatcher.ts +2 -2
- package/src/utils/messageOperations.ts +5 -0
- package/src/utils/openaiClient.ts +2 -2
- package/src/utils/stringUtils.ts +9 -0
- package/dist/tools/deleteFileTool.d.ts +0 -6
- package/dist/tools/deleteFileTool.d.ts.map +0 -1
- package/dist/tools/deleteFileTool.js +0 -100
- package/dist/tools/multiEditTool.d.ts +0 -6
- package/dist/tools/multiEditTool.d.ts.map +0 -1
- package/dist/tools/multiEditTool.js +0 -246
- package/src/tools/deleteFileTool.ts +0 -127
- package/src/tools/multiEditTool.ts +0 -306
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Container } from "../utils/container.js";
|
|
2
|
+
import { PluginManager } from "../managers/pluginManager.js";
|
|
3
|
+
import { PluginScopeManager } from "../managers/pluginScopeManager.js";
|
|
4
|
+
import { MarketplaceService } from "../services/MarketplaceService.js";
|
|
5
|
+
import { ConfigurationService } from "../services/configurationService.js";
|
|
6
|
+
/**
|
|
7
|
+
* PluginCore
|
|
8
|
+
*
|
|
9
|
+
* Encapsulates plugin management logic, providing a high-level API for
|
|
10
|
+
* installing, uninstalling, enabling, and disabling plugins.
|
|
11
|
+
*/
|
|
12
|
+
export class PluginCore {
|
|
13
|
+
constructor(workdir = process.cwd()) {
|
|
14
|
+
this.workdir = workdir;
|
|
15
|
+
this.container = new Container();
|
|
16
|
+
this.configurationService = new ConfigurationService();
|
|
17
|
+
this.marketplaceService = new MarketplaceService();
|
|
18
|
+
// Wire up ConfigurationService in the container for PluginManager to use
|
|
19
|
+
this.container.register("ConfigurationService", this.configurationService);
|
|
20
|
+
this.pluginManager = new PluginManager(this.container, {
|
|
21
|
+
workdir: this.workdir,
|
|
22
|
+
});
|
|
23
|
+
this.pluginScopeManager = new PluginScopeManager({
|
|
24
|
+
workdir: this.workdir,
|
|
25
|
+
configurationService: this.configurationService,
|
|
26
|
+
pluginManager: this.pluginManager,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Installs a plugin from a marketplace
|
|
31
|
+
*/
|
|
32
|
+
async installPlugin(pluginId, scope) {
|
|
33
|
+
const installedPlugin = await this.marketplaceService.installPlugin(pluginId);
|
|
34
|
+
if (scope) {
|
|
35
|
+
await this.enablePlugin(pluginId, scope);
|
|
36
|
+
}
|
|
37
|
+
return installedPlugin;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Uninstalls a plugin and removes it from all configuration scopes
|
|
41
|
+
*/
|
|
42
|
+
async uninstallPlugin(pluginId) {
|
|
43
|
+
await this.marketplaceService.uninstallPlugin(pluginId);
|
|
44
|
+
await this.pluginScopeManager.removePluginFromAllScopes(pluginId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Enables a plugin in the specified scope. If no scope is provided, it tries to find
|
|
48
|
+
* the scope where the plugin is already configured, or defaults to "user".
|
|
49
|
+
*/
|
|
50
|
+
async enablePlugin(pluginId, scope) {
|
|
51
|
+
const targetScope = scope || this.findPluginScope(pluginId) || "user";
|
|
52
|
+
await this.pluginScopeManager.enablePlugin(targetScope, pluginId);
|
|
53
|
+
return targetScope;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Disables a plugin in the specified scope. If no scope is provided, it tries to find
|
|
57
|
+
* the scope where the plugin is already configured, or defaults to "user".
|
|
58
|
+
*/
|
|
59
|
+
async disablePlugin(pluginId, scope) {
|
|
60
|
+
const targetScope = scope || this.findPluginScope(pluginId) || "user";
|
|
61
|
+
await this.pluginScopeManager.disablePlugin(targetScope, pluginId);
|
|
62
|
+
return targetScope;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Updates an installed plugin to the latest version from its marketplace
|
|
66
|
+
*/
|
|
67
|
+
async updatePlugin(pluginId) {
|
|
68
|
+
return await this.marketplaceService.updatePlugin(pluginId);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Lists all plugins from all registered marketplaces with their installation and enabled status
|
|
72
|
+
*/
|
|
73
|
+
async listPlugins() {
|
|
74
|
+
const installedPlugins = await this.marketplaceService.getInstalledPlugins();
|
|
75
|
+
const marketplaces = await this.marketplaceService.listMarketplaces();
|
|
76
|
+
const mergedEnabled = this.configurationService.getMergedEnabledPlugins(this.workdir);
|
|
77
|
+
const allMarketplacePlugins = [];
|
|
78
|
+
for (const m of marketplaces) {
|
|
79
|
+
try {
|
|
80
|
+
const manifest = await this.marketplaceService.loadMarketplaceManifest(this.marketplaceService.getMarketplacePath(m));
|
|
81
|
+
manifest.plugins.forEach((p) => {
|
|
82
|
+
const pluginId = `${p.name}@${m.name}`;
|
|
83
|
+
const installed = installedPlugins.plugins.find((ip) => ip.name === p.name && ip.marketplace === m.name);
|
|
84
|
+
allMarketplacePlugins.push({
|
|
85
|
+
...p,
|
|
86
|
+
marketplace: m.name,
|
|
87
|
+
installed: !!installed,
|
|
88
|
+
version: installed?.version,
|
|
89
|
+
cachePath: installed?.cachePath,
|
|
90
|
+
projectPath: installed?.projectPath,
|
|
91
|
+
scope: this.pluginScopeManager.findPluginScope(pluginId) || undefined,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Skip marketplaces that fail to load
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
plugins: allMarketplacePlugins,
|
|
101
|
+
mergedEnabled,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Adds a new marketplace
|
|
106
|
+
*/
|
|
107
|
+
async addMarketplace(input) {
|
|
108
|
+
return await this.marketplaceService.addMarketplace(input);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Removes a marketplace by name
|
|
112
|
+
*/
|
|
113
|
+
async removeMarketplace(name) {
|
|
114
|
+
await this.marketplaceService.removeMarketplace(name);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Updates a specific marketplace or all marketplaces
|
|
118
|
+
*/
|
|
119
|
+
async updateMarketplace(name) {
|
|
120
|
+
await this.marketplaceService.updateMarketplace(name);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Lists all registered marketplaces
|
|
124
|
+
*/
|
|
125
|
+
async listMarketplaces() {
|
|
126
|
+
return await this.marketplaceService.listMarketplaces();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Gets the registry of all installed plugins
|
|
130
|
+
*/
|
|
131
|
+
async getInstalledPlugins() {
|
|
132
|
+
return await this.marketplaceService.getInstalledPlugins();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets the merged enabled state of all plugins across all scopes
|
|
136
|
+
*/
|
|
137
|
+
getMergedEnabledPlugins() {
|
|
138
|
+
return this.configurationService.getMergedEnabledPlugins(this.workdir);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Loads a marketplace manifest from a local path
|
|
142
|
+
*/
|
|
143
|
+
async loadMarketplaceManifest(marketplacePath) {
|
|
144
|
+
return await this.marketplaceService.loadMarketplaceManifest(marketplacePath);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Resolves the local path for a marketplace
|
|
148
|
+
*/
|
|
149
|
+
getMarketplacePath(marketplace) {
|
|
150
|
+
return this.marketplaceService.getMarketplacePath(marketplace);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Finds the scope where a plugin is currently enabled/disabled
|
|
154
|
+
*/
|
|
155
|
+
findPluginScope(pluginId) {
|
|
156
|
+
return this.pluginScopeManager.findPluginScope(pluginId);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Removes a plugin from the enabled plugins in the specified scope
|
|
160
|
+
*/
|
|
161
|
+
async removeEnabledPlugin(scope, pluginId) {
|
|
162
|
+
await this.configurationService.removeEnabledPlugin(this.workdir, scope, pluginId);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { listSessions, truncateContent, loadSessionFromJsonl, } from "../services/session.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./services/memory.js";
|
|
3
|
-
export * from "./services/session.js";
|
|
4
|
-
export * from "./services/hook.js";
|
|
5
|
-
export * from "./services/jsonlHandler.js";
|
|
6
|
-
export * from "./services/configurationService.js";
|
|
7
|
-
export * from "./services/MarketplaceService.js";
|
|
1
|
+
export * from "./core/session.js";
|
|
8
2
|
export * from "./constants/tools.js";
|
|
9
|
-
export * from "./managers/pluginManager.js";
|
|
10
|
-
export * from "./managers/pluginScopeManager.js";
|
|
11
3
|
export * from "./agent.js";
|
|
4
|
+
export * from "./core/plugin.js";
|
|
12
5
|
export * from "./utils/bashParser.js";
|
|
13
6
|
export * from "./utils/convertMessagesForAPI.js";
|
|
14
7
|
export * from "./utils/fileFilter.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
// Export all services
|
|
2
|
-
export * from "./
|
|
3
|
-
export * from "./services/memory.js";
|
|
4
|
-
export * from "./services/session.js";
|
|
5
|
-
export * from "./services/hook.js";
|
|
6
|
-
export * from "./services/jsonlHandler.js";
|
|
7
|
-
export * from "./services/configurationService.js"; // New configuration management service
|
|
8
|
-
export * from "./services/MarketplaceService.js";
|
|
2
|
+
export * from "./core/session.js";
|
|
9
3
|
// Export constants
|
|
10
4
|
export * from "./constants/tools.js";
|
|
11
|
-
// Export managers
|
|
12
|
-
export * from "./managers/pluginManager.js";
|
|
13
|
-
export * from "./managers/pluginScopeManager.js";
|
|
14
5
|
// Export main agent
|
|
15
6
|
export * from "./agent.js";
|
|
7
|
+
export * from "./core/plugin.js";
|
|
16
8
|
// Export all utilities
|
|
17
9
|
export * from "./utils/bashParser.js";
|
|
18
10
|
export * from "./utils/convertMessagesForAPI.js";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MemoryRule } from "../types/memoryRule.js";
|
|
2
|
+
import { Container } from "../utils/container.js";
|
|
2
3
|
export interface MemoryRuleRegistryState {
|
|
3
4
|
/** All discovered rules, indexed by ID */
|
|
4
5
|
rules: Record<string, MemoryRule>;
|
|
@@ -9,10 +10,11 @@ export interface MemoryRuleManagerOptions {
|
|
|
9
10
|
workdir: string;
|
|
10
11
|
}
|
|
11
12
|
export declare class MemoryRuleManager {
|
|
13
|
+
private container;
|
|
12
14
|
private state;
|
|
13
15
|
private workdir;
|
|
14
16
|
private service;
|
|
15
|
-
constructor(options: MemoryRuleManagerOptions);
|
|
17
|
+
constructor(container: Container, options: MemoryRuleManagerOptions);
|
|
16
18
|
/**
|
|
17
19
|
* Scans .wave/rules and ~/.wave/rules for memory rule files.
|
|
18
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;
|
|
1
|
+
{"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAGzB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,wBAAwB;IAMnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YA8BtB,aAAa;YAyDb,YAAY;IAsB1B;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
|
|
@@ -4,7 +4,8 @@ import * as path from "node:path";
|
|
|
4
4
|
import * as os from "node:os";
|
|
5
5
|
import { logger } from "../utils/globalLogger.js";
|
|
6
6
|
export class MemoryRuleManager {
|
|
7
|
-
constructor(options) {
|
|
7
|
+
constructor(container, options) {
|
|
8
|
+
this.container = container;
|
|
8
9
|
this.state = {
|
|
9
10
|
rules: {},
|
|
10
11
|
activeRuleIds: new Set(),
|
|
@@ -1,26 +1,14 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
import type { MessageManager } from "./messageManager.js";
|
|
4
|
-
import type { BackgroundTaskManager } from "./backgroundTaskManager.js";
|
|
5
|
-
import type { HookManager } from "./hookManager.js";
|
|
6
|
-
import type { PermissionManager } from "./permissionManager.js";
|
|
1
|
+
import type { GatewayConfig, ModelConfig, Usage } from "../types/index.js";
|
|
2
|
+
import { Container } from "../utils/container.js";
|
|
7
3
|
export interface AIManagerCallbacks {
|
|
8
4
|
onCompressionStateChange?: (isCompressing: boolean) => void;
|
|
9
5
|
onUsageAdded?: (usage: Usage) => void;
|
|
10
6
|
}
|
|
11
7
|
export interface AIManagerOptions {
|
|
12
|
-
messageManager: MessageManager;
|
|
13
|
-
toolManager: ToolManager;
|
|
14
|
-
taskManager: import("../services/taskManager.js").TaskManager;
|
|
15
|
-
logger?: Logger;
|
|
16
|
-
backgroundTaskManager?: BackgroundTaskManager;
|
|
17
|
-
hookManager?: HookManager;
|
|
18
|
-
permissionManager?: PermissionManager;
|
|
19
8
|
callbacks?: AIManagerCallbacks;
|
|
20
9
|
workdir: string;
|
|
21
10
|
systemPrompt?: string;
|
|
22
11
|
subagentType?: string;
|
|
23
|
-
reversionManager?: import("./reversionManager.js").ReversionManager;
|
|
24
12
|
/**Whether to use streaming mode for AI responses - defaults to true */
|
|
25
13
|
stream?: boolean;
|
|
26
14
|
getGatewayConfig: () => GatewayConfig;
|
|
@@ -30,17 +18,10 @@ export interface AIManagerOptions {
|
|
|
30
18
|
getEnvironmentVars?: () => Record<string, string>;
|
|
31
19
|
}
|
|
32
20
|
export declare class AIManager {
|
|
21
|
+
private container;
|
|
33
22
|
isLoading: boolean;
|
|
34
23
|
private abortController;
|
|
35
24
|
private toolAbortController;
|
|
36
|
-
private logger?;
|
|
37
|
-
private toolManager;
|
|
38
|
-
private messageManager;
|
|
39
|
-
private taskManager;
|
|
40
|
-
private backgroundTaskManager?;
|
|
41
|
-
private hookManager?;
|
|
42
|
-
private reversionManager?;
|
|
43
|
-
private permissionManager?;
|
|
44
25
|
private workdir;
|
|
45
26
|
private systemPrompt?;
|
|
46
27
|
private subagentType?;
|
|
@@ -50,7 +31,14 @@ export declare class AIManager {
|
|
|
50
31
|
private getMaxInputTokensFn;
|
|
51
32
|
private getLanguageFn;
|
|
52
33
|
private getEnvironmentVarsFn?;
|
|
53
|
-
constructor(options: AIManagerOptions);
|
|
34
|
+
constructor(container: Container, options: AIManagerOptions);
|
|
35
|
+
private get toolManager();
|
|
36
|
+
private get messageManager();
|
|
37
|
+
private get taskManager();
|
|
38
|
+
private get backgroundTaskManager();
|
|
39
|
+
private get hookManager();
|
|
40
|
+
private get reversionManager();
|
|
41
|
+
private get permissionManager();
|
|
54
42
|
getGatewayConfig(): GatewayConfig;
|
|
55
43
|
getModelConfig(): ModelConfig;
|
|
56
44
|
getMaxInputTokens(): number;
|
|
@@ -67,6 +55,8 @@ export declare class AIManager {
|
|
|
67
55
|
private handleTokenUsageAndCompression;
|
|
68
56
|
getIsCompressing(): boolean;
|
|
69
57
|
setIsCompressing(isCompressing: boolean): void;
|
|
58
|
+
private get subagentManager();
|
|
59
|
+
private get skillManager();
|
|
70
60
|
sendAIMessage(options?: {
|
|
71
61
|
recursionDepth?: number;
|
|
72
62
|
model?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAY3E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,gBAAgB,EAAE,MAAM,aAAa,CAAC;IACtC,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,qBAAa,SAAS;IAkBlB,OAAO,CAAC,SAAS;IAjBZ,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAU;IAGxB,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,oBAAoB,CAAC,CAA+B;gBAIlD,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,gBAAgB;IAgB3B,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,WAAW,GAItB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,gBAAgB,GAM3B;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAGM,gBAAgB,IAAI,aAAa;IAIjC,cAAc,IAAI,WAAW;IAI7B,iBAAiB,IAAI,MAAM;IAI3B,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAYvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAsBf,8BAA8B;IA6ErC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOrD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,YAAY,GAEvB;IAEY,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oEAAoE;QACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,iEAAiE;QACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,IAAI,CAAC;IAugBhB;;;;OAIG;YACW,gBAAgB;IAiE9B;;;OAGG;YACW,sBAAsB;IA6DpC;;OAEG;YACW,uBAAuB;CAwDtC"}
|
|
@@ -1,22 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as aiService from "../services/aiService.js";
|
|
2
2
|
import { convertMessagesForAPI } from "../utils/convertMessagesForAPI.js";
|
|
3
3
|
import { calculateComprehensiveTotalTokens } from "../utils/tokenCalculation.js";
|
|
4
4
|
import * as fs from "node:fs/promises";
|
|
5
5
|
import { buildSystemPrompt } from "../prompts/index.js";
|
|
6
|
+
import { logger } from "../utils/globalLogger.js";
|
|
6
7
|
export class AIManager {
|
|
7
|
-
|
|
8
|
+
// Service overrides
|
|
9
|
+
constructor(container, options) {
|
|
10
|
+
this.container = container;
|
|
8
11
|
this.isLoading = false;
|
|
9
12
|
this.abortController = null;
|
|
10
13
|
this.toolAbortController = null;
|
|
11
14
|
this.isCompressing = false;
|
|
12
|
-
this.messageManager = options.messageManager;
|
|
13
|
-
this.toolManager = options.toolManager;
|
|
14
|
-
this.taskManager = options.taskManager;
|
|
15
|
-
this.backgroundTaskManager = options.backgroundTaskManager;
|
|
16
|
-
this.hookManager = options.hookManager;
|
|
17
|
-
this.reversionManager = options.reversionManager;
|
|
18
|
-
this.permissionManager = options.permissionManager;
|
|
19
|
-
this.logger = options.logger;
|
|
20
15
|
this.workdir = options.workdir;
|
|
21
16
|
this.systemPrompt = options.systemPrompt;
|
|
22
17
|
this.subagentType = options.subagentType; // Store subagent type
|
|
@@ -29,6 +24,27 @@ export class AIManager {
|
|
|
29
24
|
this.getLanguageFn = options.getLanguage;
|
|
30
25
|
this.getEnvironmentVarsFn = options.getEnvironmentVars;
|
|
31
26
|
}
|
|
27
|
+
get toolManager() {
|
|
28
|
+
return this.container.get("ToolManager");
|
|
29
|
+
}
|
|
30
|
+
get messageManager() {
|
|
31
|
+
return this.container.get("MessageManager");
|
|
32
|
+
}
|
|
33
|
+
get taskManager() {
|
|
34
|
+
return this.container.get("TaskManager");
|
|
35
|
+
}
|
|
36
|
+
get backgroundTaskManager() {
|
|
37
|
+
return this.container.get("BackgroundTaskManager");
|
|
38
|
+
}
|
|
39
|
+
get hookManager() {
|
|
40
|
+
return this.container.get("HookManager");
|
|
41
|
+
}
|
|
42
|
+
get reversionManager() {
|
|
43
|
+
return this.container.get("ReversionManager");
|
|
44
|
+
}
|
|
45
|
+
get permissionManager() {
|
|
46
|
+
return this.container.get("PermissionManager");
|
|
47
|
+
}
|
|
32
48
|
// Getter methods for accessing dynamic configuration
|
|
33
49
|
getGatewayConfig() {
|
|
34
50
|
return this.getGatewayConfigFn();
|
|
@@ -64,7 +80,7 @@ export class AIManager {
|
|
|
64
80
|
this.abortController.abort();
|
|
65
81
|
}
|
|
66
82
|
catch (error) {
|
|
67
|
-
|
|
83
|
+
logger?.error("Failed to abort AI service:", error);
|
|
68
84
|
}
|
|
69
85
|
}
|
|
70
86
|
// Interrupt tool execution
|
|
@@ -73,7 +89,7 @@ export class AIManager {
|
|
|
73
89
|
this.toolAbortController.abort();
|
|
74
90
|
}
|
|
75
91
|
catch (error) {
|
|
76
|
-
|
|
92
|
+
logger?.error("Failed to abort tool execution:", error);
|
|
77
93
|
}
|
|
78
94
|
}
|
|
79
95
|
this.setIsLoading(false);
|
|
@@ -93,7 +109,7 @@ export class AIManager {
|
|
|
93
109
|
}
|
|
94
110
|
}
|
|
95
111
|
catch (error) {
|
|
96
|
-
|
|
112
|
+
logger?.warn("Failed to generate compactParams", error);
|
|
97
113
|
}
|
|
98
114
|
return "";
|
|
99
115
|
}
|
|
@@ -109,7 +125,7 @@ export class AIManager {
|
|
|
109
125
|
(usage.cache_read_input_tokens || 0) +
|
|
110
126
|
(usage.cache_creation_input_tokens || 0) >
|
|
111
127
|
this.getMaxInputTokens()) {
|
|
112
|
-
|
|
128
|
+
logger?.debug(`Token usage exceeded ${this.getMaxInputTokens()}, compressing messages...`);
|
|
113
129
|
// Check if messages need compression
|
|
114
130
|
const messagesToCompress = this.messageManager.getMessages();
|
|
115
131
|
// If there are messages to compress, perform compression
|
|
@@ -119,7 +135,7 @@ export class AIManager {
|
|
|
119
135
|
await this.messageManager.saveSession();
|
|
120
136
|
this.setIsCompressing(true);
|
|
121
137
|
try {
|
|
122
|
-
const compressionResult = await compressMessages({
|
|
138
|
+
const compressionResult = await aiService.compressMessages({
|
|
123
139
|
gatewayConfig: this.getGatewayConfig(),
|
|
124
140
|
modelConfig: this.getModelConfig(),
|
|
125
141
|
messages: recentChatMessages,
|
|
@@ -143,10 +159,10 @@ export class AIManager {
|
|
|
143
159
|
if (compressionUsage && this.callbacks?.onUsageAdded) {
|
|
144
160
|
this.callbacks.onUsageAdded(compressionUsage);
|
|
145
161
|
}
|
|
146
|
-
|
|
162
|
+
logger?.debug(`Successfully compressed ${messagesToCompress.length} messages and updated session`);
|
|
147
163
|
}
|
|
148
164
|
catch (compressError) {
|
|
149
|
-
|
|
165
|
+
logger?.error("Failed to compress messages:", compressError);
|
|
150
166
|
}
|
|
151
167
|
finally {
|
|
152
168
|
this.setIsCompressing(false);
|
|
@@ -163,6 +179,12 @@ export class AIManager {
|
|
|
163
179
|
this.callbacks.onCompressionStateChange?.(isCompressing);
|
|
164
180
|
}
|
|
165
181
|
}
|
|
182
|
+
get subagentManager() {
|
|
183
|
+
return this.container.get("SubagentManager");
|
|
184
|
+
}
|
|
185
|
+
get skillManager() {
|
|
186
|
+
return this.container.get("SkillManager");
|
|
187
|
+
}
|
|
166
188
|
async sendAIMessage(options = {}) {
|
|
167
189
|
const { recursionDepth = 0, model, allowedRules, tools, maxTokens, } = options;
|
|
168
190
|
// Only check isLoading for the initial call (recursionDepth === 0)
|
|
@@ -201,7 +223,7 @@ export class AIManager {
|
|
|
201
223
|
const combinedMemory = await this.messageManager.getCombinedMemory();
|
|
202
224
|
// Track if assistant message has been created
|
|
203
225
|
let assistantMessageCreated = false;
|
|
204
|
-
|
|
226
|
+
logger?.debug("modelConfig in sendAIMessage", this.getModelConfig());
|
|
205
227
|
// Get current permission mode and plan file path
|
|
206
228
|
const currentMode = this.permissionManager?.getCurrentEffectiveMode(this.getModelConfig().permissionMode);
|
|
207
229
|
const toolsConfig = this.getFilteredToolsConfig(tools);
|
|
@@ -224,6 +246,9 @@ export class AIManager {
|
|
|
224
246
|
planModeOptions = { planFilePath, planExists };
|
|
225
247
|
}
|
|
226
248
|
}
|
|
249
|
+
// Get available subagents and skills for dynamic prompts
|
|
250
|
+
const availableSubagents = this.subagentManager?.getConfigurations();
|
|
251
|
+
const availableSkills = this.skillManager?.getAvailableSkills();
|
|
227
252
|
// Call AI service with streaming callbacks if enabled
|
|
228
253
|
const callAgentOptions = {
|
|
229
254
|
gatewayConfig: this.getGatewayConfig(),
|
|
@@ -240,6 +265,8 @@ export class AIManager {
|
|
|
240
265
|
language: this.getLanguage(),
|
|
241
266
|
isSubagent: !!this.subagentType,
|
|
242
267
|
planMode: planModeOptions,
|
|
268
|
+
availableSubagents,
|
|
269
|
+
availableSkills,
|
|
243
270
|
}), // Pass custom system prompt
|
|
244
271
|
maxTokens: maxTokens, // Pass max tokens override
|
|
245
272
|
};
|
|
@@ -280,7 +307,7 @@ export class AIManager {
|
|
|
280
307
|
this.messageManager.updateCurrentMessageReasoning(reasoning);
|
|
281
308
|
};
|
|
282
309
|
}
|
|
283
|
-
const result = await callAgent(callAgentOptions);
|
|
310
|
+
const result = await aiService.callAgent(callAgentOptions);
|
|
284
311
|
const createdByStreaming = assistantMessageCreated;
|
|
285
312
|
// For non-streaming mode, create assistant message after callAgent returns
|
|
286
313
|
// Also create if streaming mode but no streaming callbacks were called (e.g., when content comes directly in result)
|
|
@@ -294,12 +321,12 @@ export class AIManager {
|
|
|
294
321
|
if (result.finish_reason) {
|
|
295
322
|
// Log warning headers when finish reason is length
|
|
296
323
|
if (result.finish_reason === "length") {
|
|
297
|
-
|
|
324
|
+
logger?.warn("AI response truncated due to length limit. Response headers:", result.response_headers);
|
|
298
325
|
}
|
|
299
326
|
}
|
|
300
327
|
if (result.response_headers &&
|
|
301
328
|
Object.keys(result.response_headers).length > 0) {
|
|
302
|
-
|
|
329
|
+
logger?.debug("AI response headers:", result.response_headers);
|
|
303
330
|
}
|
|
304
331
|
if (result.additionalFields &&
|
|
305
332
|
Object.keys(result.additionalFields).length > 0) {
|
|
@@ -387,7 +414,7 @@ export class AIManager {
|
|
|
387
414
|
errorMessage +=
|
|
388
415
|
" (output truncated, please reduce your output)";
|
|
389
416
|
}
|
|
390
|
-
|
|
417
|
+
logger?.error(errorMessage, parseError);
|
|
391
418
|
this.messageManager.updateToolBlock({
|
|
392
419
|
id: toolId,
|
|
393
420
|
parameters: argsString,
|
|
@@ -416,7 +443,7 @@ export class AIManager {
|
|
|
416
443
|
const shouldExecuteTool = await this.executePreToolUseHooks(toolName, toolArgs, toolId);
|
|
417
444
|
// If PreToolUse hooks blocked execution, skip tool execution
|
|
418
445
|
if (!shouldExecuteTool) {
|
|
419
|
-
|
|
446
|
+
logger?.info(`Tool ${toolName} execution blocked by PreToolUse hooks`);
|
|
420
447
|
return; // Skip this tool and return from this map function
|
|
421
448
|
}
|
|
422
449
|
// Create tool execution context
|
|
@@ -449,6 +476,7 @@ export class AIManager {
|
|
|
449
476
|
name: toolName,
|
|
450
477
|
shortResult: toolResult.shortResult,
|
|
451
478
|
isManuallyBackgrounded: toolResult.isManuallyBackgrounded,
|
|
479
|
+
startLineNumber: toolResult.startLineNumber,
|
|
452
480
|
});
|
|
453
481
|
// Execute PostToolUse hooks after successful tool completion
|
|
454
482
|
await this.executePostToolUseHooks(toolId, toolName, toolArgs, toolResult);
|
|
@@ -492,7 +520,7 @@ export class AIManager {
|
|
|
492
520
|
const hasBackgrounded = toolBlocks.length > 0 &&
|
|
493
521
|
toolBlocks.some((block) => block.isManuallyBackgrounded);
|
|
494
522
|
if (hasBackgrounded) {
|
|
495
|
-
|
|
523
|
+
logger?.info("Some tools were manually backgrounded, stopping recursion.");
|
|
496
524
|
}
|
|
497
525
|
else if (!isCurrentlyAborted) {
|
|
498
526
|
// Recursively call AI service, increment recursion depth, and pass same configuration
|
|
@@ -535,7 +563,7 @@ export class AIManager {
|
|
|
535
563
|
// If Stop/SubagentStop hooks indicate we should continue (due to blocking errors),
|
|
536
564
|
// restart the AI conversation cycle
|
|
537
565
|
if (shouldContinue) {
|
|
538
|
-
|
|
566
|
+
logger?.info(`${this.subagentType ? "SubagentStop" : "Stop"} hooks indicate issues need fixing, continuing conversation...`);
|
|
539
567
|
// Restart the conversation to let AI fix the issues
|
|
540
568
|
// Use recursionDepth = 0 to set loading false again for continuation
|
|
541
569
|
await this.sendAIMessage({
|
|
@@ -579,13 +607,13 @@ export class AIManager {
|
|
|
579
607
|
const processResult = this.hookManager.processHookResults(hookName, results, this.messageManager);
|
|
580
608
|
// If hook processing indicates we should block (exit code 2), continue conversation
|
|
581
609
|
if (processResult.shouldBlock) {
|
|
582
|
-
|
|
610
|
+
logger?.info(`${hookName} hook blocked stopping with error:`, processResult.errorMessage);
|
|
583
611
|
shouldContinue = true;
|
|
584
612
|
}
|
|
585
613
|
}
|
|
586
614
|
// Log hook execution results for debugging
|
|
587
615
|
if (results.length > 0) {
|
|
588
|
-
|
|
616
|
+
logger?.debug(`Executed ${results.length} ${hookName} hook(s):`, results.map((r) => ({
|
|
589
617
|
success: r.success,
|
|
590
618
|
duration: r.duration,
|
|
591
619
|
exitCode: r.exitCode,
|
|
@@ -597,7 +625,7 @@ export class AIManager {
|
|
|
597
625
|
}
|
|
598
626
|
catch (error) {
|
|
599
627
|
// Hook execution errors should not interrupt the main workflow
|
|
600
|
-
|
|
628
|
+
logger?.error(`${this.subagentType ? "SubagentStop" : "Stop"} hook execution failed:`, error);
|
|
601
629
|
return false;
|
|
602
630
|
}
|
|
603
631
|
}
|
|
@@ -631,7 +659,7 @@ export class AIManager {
|
|
|
631
659
|
}
|
|
632
660
|
// Log hook execution results for debugging
|
|
633
661
|
if (results.length > 0) {
|
|
634
|
-
|
|
662
|
+
logger?.debug(`Executed ${results.length} PreToolUse hook(s) for ${toolName}:`, results.map((r) => ({
|
|
635
663
|
success: r.success,
|
|
636
664
|
duration: r.duration,
|
|
637
665
|
exitCode: r.exitCode,
|
|
@@ -643,7 +671,7 @@ export class AIManager {
|
|
|
643
671
|
}
|
|
644
672
|
catch (error) {
|
|
645
673
|
// Hook execution errors should not interrupt the main workflow
|
|
646
|
-
|
|
674
|
+
logger?.error("PreToolUse hook execution failed:", error);
|
|
647
675
|
return true; // Allow tool execution on hook errors
|
|
648
676
|
}
|
|
649
677
|
}
|
|
@@ -674,7 +702,7 @@ export class AIManager {
|
|
|
674
702
|
}
|
|
675
703
|
// Log hook execution results for debugging
|
|
676
704
|
if (results.length > 0) {
|
|
677
|
-
|
|
705
|
+
logger?.debug(`Executed ${results.length} PostToolUse hook(s) for ${toolName}:`, results.map((r) => ({
|
|
678
706
|
success: r.success,
|
|
679
707
|
duration: r.duration,
|
|
680
708
|
exitCode: r.exitCode,
|
|
@@ -685,7 +713,7 @@ export class AIManager {
|
|
|
685
713
|
}
|
|
686
714
|
catch (error) {
|
|
687
715
|
// Hook execution errors should not interrupt the main workflow
|
|
688
|
-
|
|
716
|
+
logger?.error("PostToolUse hook execution failed:", error);
|
|
689
717
|
}
|
|
690
718
|
}
|
|
691
719
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ChildProcess } from "child_process";
|
|
2
2
|
import { BackgroundTask } from "../types/processes.js";
|
|
3
|
+
import { Container } from "../utils/container.js";
|
|
3
4
|
export interface BackgroundTaskManagerCallbacks {
|
|
4
5
|
onTasksChange?: (tasks: BackgroundTask[]) => void;
|
|
5
6
|
}
|
|
@@ -8,11 +9,12 @@ export interface BackgroundTaskManagerOptions {
|
|
|
8
9
|
workdir: string;
|
|
9
10
|
}
|
|
10
11
|
export declare class BackgroundTaskManager {
|
|
12
|
+
private container;
|
|
11
13
|
private tasks;
|
|
12
14
|
private nextId;
|
|
13
15
|
private callbacks;
|
|
14
16
|
private workdir;
|
|
15
|
-
constructor(options: BackgroundTaskManagerOptions);
|
|
17
|
+
constructor(container: Container, options: BackgroundTaskManagerOptions);
|
|
16
18
|
private notifyTasksChange;
|
|
17
19
|
generateId(): string;
|
|
18
20
|
addTask(task: BackgroundTask): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,4BAA4B;IAMvC,OAAO,CAAC,iBAAiB;IAIlB,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/C,WAAW,IAAI,cAAc,EAAE;IAI/B,UAAU,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IA8GnD,YAAY,CACjB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,MAAW,GACzB,MAAM;IAoEF,SAAS,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiCrD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA+B7B,OAAO,IAAI,IAAI;CAUvB"}
|