wave-agent-sdk 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/agent.d.ts +8 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +49 -240
  4. package/dist/constants/tools.d.ts +0 -2
  5. package/dist/constants/tools.d.ts.map +1 -1
  6. package/dist/constants/tools.js +0 -2
  7. package/dist/core/plugin.d.ts +86 -0
  8. package/dist/core/plugin.d.ts.map +1 -0
  9. package/dist/core/plugin.js +164 -0
  10. package/dist/index.d.ts +1 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -5
  13. package/dist/managers/MemoryRuleManager.d.ts +3 -1
  14. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  15. package/dist/managers/MemoryRuleManager.js +2 -1
  16. package/dist/managers/aiManager.d.ts +13 -23
  17. package/dist/managers/aiManager.d.ts.map +1 -1
  18. package/dist/managers/aiManager.js +59 -32
  19. package/dist/managers/backgroundTaskManager.d.ts +3 -1
  20. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  21. package/dist/managers/backgroundTaskManager.js +2 -1
  22. package/dist/managers/bashManager.d.ts +4 -4
  23. package/dist/managers/bashManager.d.ts.map +1 -1
  24. package/dist/managers/bashManager.js +5 -2
  25. package/dist/managers/foregroundTaskManager.d.ts +3 -0
  26. package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
  27. package/dist/managers/foregroundTaskManager.js +2 -1
  28. package/dist/managers/hookManager.d.ts +3 -3
  29. package/dist/managers/hookManager.d.ts.map +1 -1
  30. package/dist/managers/hookManager.js +20 -19
  31. package/dist/managers/liveConfigManager.d.ts +6 -13
  32. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  33. package/dist/managers/liveConfigManager.js +50 -45
  34. package/dist/managers/lspManager.d.ts +4 -5
  35. package/dist/managers/lspManager.d.ts.map +1 -1
  36. package/dist/managers/lspManager.js +13 -12
  37. package/dist/managers/mcpManager.d.ts +3 -2
  38. package/dist/managers/mcpManager.d.ts.map +1 -1
  39. package/dist/managers/mcpManager.js +16 -15
  40. package/dist/managers/messageManager.d.ts +5 -7
  41. package/dist/managers/messageManager.d.ts.map +1 -1
  42. package/dist/managers/messageManager.js +12 -7
  43. package/dist/managers/permissionManager.d.ts +6 -4
  44. package/dist/managers/permissionManager.d.ts.map +1 -1
  45. package/dist/managers/permissionManager.js +39 -63
  46. package/dist/managers/planManager.d.ts +4 -6
  47. package/dist/managers/planManager.d.ts.map +1 -1
  48. package/dist/managers/planManager.js +18 -4
  49. package/dist/managers/pluginManager.d.ts +10 -22
  50. package/dist/managers/pluginManager.d.ts.map +1 -1
  51. package/dist/managers/pluginManager.js +27 -14
  52. package/dist/managers/reversionManager.d.ts +4 -3
  53. package/dist/managers/reversionManager.d.ts.map +1 -1
  54. package/dist/managers/reversionManager.js +5 -2
  55. package/dist/managers/skillManager.d.ts +3 -2
  56. package/dist/managers/skillManager.d.ts.map +1 -1
  57. package/dist/managers/skillManager.js +15 -14
  58. package/dist/managers/slashCommandManager.d.ts +9 -16
  59. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  60. package/dist/managers/slashCommandManager.js +21 -10
  61. package/dist/managers/subagentManager.d.ts +7 -17
  62. package/dist/managers/subagentManager.d.ts.map +1 -1
  63. package/dist/managers/subagentManager.js +41 -34
  64. package/dist/managers/toolManager.d.ts +15 -38
  65. package/dist/managers/toolManager.d.ts.map +1 -1
  66. package/dist/managers/toolManager.js +66 -56
  67. package/dist/prompts/index.d.ts +6 -2
  68. package/dist/prompts/index.d.ts.map +1 -1
  69. package/dist/prompts/index.js +8 -4
  70. package/dist/services/MarketplaceService.d.ts.map +1 -1
  71. package/dist/services/MarketplaceService.js +13 -0
  72. package/dist/services/aiService.d.ts +4 -0
  73. package/dist/services/aiService.d.ts.map +1 -1
  74. package/dist/services/aiService.js +47 -7
  75. package/dist/services/configurationService.d.ts.map +1 -1
  76. package/dist/services/configurationService.js +30 -11
  77. package/dist/services/taskManager.d.ts +3 -1
  78. package/dist/services/taskManager.d.ts.map +1 -1
  79. package/dist/services/taskManager.js +2 -1
  80. package/dist/tools/bashTool.js +2 -2
  81. package/dist/tools/editTool.d.ts.map +1 -1
  82. package/dist/tools/editTool.js +9 -1
  83. package/dist/tools/readTool.d.ts.map +1 -1
  84. package/dist/tools/readTool.js +2 -2
  85. package/dist/tools/skillTool.d.ts +2 -4
  86. package/dist/tools/skillTool.d.ts.map +1 -1
  87. package/dist/tools/skillTool.js +61 -61
  88. package/dist/tools/taskOutputTool.js +1 -1
  89. package/dist/tools/taskTool.d.ts +2 -4
  90. package/dist/tools/taskTool.d.ts.map +1 -1
  91. package/dist/tools/taskTool.js +192 -187
  92. package/dist/tools/types.d.ts +11 -1
  93. package/dist/tools/types.d.ts.map +1 -1
  94. package/dist/tools/writeTool.d.ts.map +1 -1
  95. package/dist/tools/writeTool.js +4 -2
  96. package/dist/types/marketplace.d.ts +8 -0
  97. package/dist/types/marketplace.d.ts.map +1 -1
  98. package/dist/types/permissions.d.ts +1 -1
  99. package/dist/types/permissions.d.ts.map +1 -1
  100. package/dist/types/permissions.js +1 -3
  101. package/dist/types/skills.d.ts +0 -2
  102. package/dist/types/skills.d.ts.map +1 -1
  103. package/dist/types/tools.d.ts +0 -15
  104. package/dist/types/tools.d.ts.map +1 -1
  105. package/dist/utils/container.d.ts +31 -0
  106. package/dist/utils/container.d.ts.map +1 -0
  107. package/dist/utils/container.js +79 -0
  108. package/dist/utils/containerSetup.d.ts +26 -0
  109. package/dist/utils/containerSetup.d.ts.map +1 -0
  110. package/dist/utils/containerSetup.js +165 -0
  111. package/dist/utils/editUtils.d.ts +0 -3
  112. package/dist/utils/editUtils.d.ts.map +1 -1
  113. package/dist/utils/editUtils.js +4 -3
  114. package/dist/utils/hookMatcher.d.ts +1 -1
  115. package/dist/utils/hookMatcher.d.ts.map +1 -1
  116. package/dist/utils/hookMatcher.js +2 -2
  117. package/dist/utils/openaiClient.js +2 -2
  118. package/dist/utils/stringUtils.d.ts +6 -0
  119. package/dist/utils/stringUtils.d.ts.map +1 -1
  120. package/dist/utils/stringUtils.js +8 -0
  121. package/package.json +1 -1
  122. package/src/agent.ts +60 -282
  123. package/src/constants/tools.ts +0 -2
  124. package/src/core/plugin.ts +224 -0
  125. package/src/index.ts +1 -6
  126. package/src/managers/MemoryRuleManager.ts +6 -1
  127. package/src/managers/aiManager.ts +83 -58
  128. package/src/managers/backgroundTaskManager.ts +5 -1
  129. package/src/managers/bashManager.ts +9 -4
  130. package/src/managers/foregroundTaskManager.ts +3 -0
  131. package/src/managers/hookManager.ts +21 -23
  132. package/src/managers/liveConfigManager.ts +57 -53
  133. package/src/managers/lspManager.ts +14 -19
  134. package/src/managers/mcpManager.ts +20 -20
  135. package/src/managers/messageManager.ts +19 -12
  136. package/src/managers/permissionManager.ts +45 -70
  137. package/src/managers/planManager.ts +26 -7
  138. package/src/managers/pluginManager.ts +37 -33
  139. package/src/managers/reversionManager.ts +5 -3
  140. package/src/managers/skillManager.ts +19 -20
  141. package/src/managers/slashCommandManager.ts +30 -25
  142. package/src/managers/subagentManager.ts +53 -53
  143. package/src/managers/toolManager.ts +91 -90
  144. package/src/prompts/index.ts +13 -5
  145. package/src/services/MarketplaceService.ts +13 -0
  146. package/src/services/aiService.ts +61 -15
  147. package/src/services/configurationService.ts +34 -13
  148. package/src/services/taskManager.ts +5 -1
  149. package/src/tools/bashTool.ts +2 -2
  150. package/src/tools/editTool.ts +9 -1
  151. package/src/tools/readTool.ts +2 -2
  152. package/src/tools/skillTool.ts +75 -71
  153. package/src/tools/taskOutputTool.ts +1 -1
  154. package/src/tools/taskTool.ts +224 -225
  155. package/src/tools/types.ts +12 -1
  156. package/src/tools/writeTool.ts +4 -2
  157. package/src/types/marketplace.ts +9 -0
  158. package/src/types/permissions.ts +0 -4
  159. package/src/types/skills.ts +0 -3
  160. package/src/types/tools.ts +0 -17
  161. package/src/utils/container.ts +92 -0
  162. package/src/utils/containerSetup.ts +256 -0
  163. package/src/utils/editUtils.ts +4 -3
  164. package/src/utils/hookMatcher.ts +2 -2
  165. package/src/utils/openaiClient.ts +2 -2
  166. package/src/utils/stringUtils.ts +9 -0
  167. package/dist/tools/deleteFileTool.d.ts +0 -6
  168. package/dist/tools/deleteFileTool.d.ts.map +0 -1
  169. package/dist/tools/deleteFileTool.js +0 -100
  170. package/dist/tools/multiEditTool.d.ts +0 -6
  171. package/dist/tools/multiEditTool.d.ts.map +0 -1
  172. package/dist/tools/multiEditTool.js +0 -246
  173. package/src/tools/deleteFileTool.ts +0 -127
  174. 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
+ }
package/dist/index.d.ts CHANGED
@@ -3,12 +3,9 @@ export * from "./services/memory.js";
3
3
  export * from "./services/session.js";
4
4
  export * from "./services/hook.js";
5
5
  export * from "./services/jsonlHandler.js";
6
- export * from "./services/configurationService.js";
7
- export * from "./services/MarketplaceService.js";
8
6
  export * from "./constants/tools.js";
9
- export * from "./managers/pluginManager.js";
10
- export * from "./managers/pluginScopeManager.js";
11
7
  export * from "./agent.js";
8
+ export * from "./core/plugin.js";
12
9
  export * from "./utils/bashParser.js";
13
10
  export * from "./utils/convertMessagesForAPI.js";
14
11
  export * from "./utils/fileFilter.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,sBAAsB,CAAC;AAGrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,YAAY,CAAC;AAG3B,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAG3C,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
@@ -4,15 +4,11 @@ export * from "./services/memory.js";
4
4
  export * from "./services/session.js";
5
5
  export * from "./services/hook.js";
6
6
  export * from "./services/jsonlHandler.js";
7
- export * from "./services/configurationService.js"; // New configuration management service
8
- export * from "./services/MarketplaceService.js";
9
7
  // Export constants
10
8
  export * from "./constants/tools.js";
11
- // Export managers
12
- export * from "./managers/pluginManager.js";
13
- export * from "./managers/pluginScopeManager.js";
14
9
  // Export main agent
15
10
  export * from "./agent.js";
11
+ export * from "./core/plugin.js";
16
12
  // Export all utilities
17
13
  export * from "./utils/bashParser.js";
18
14
  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;IAC5B,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,wBAAwB;IAK7C;;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"}
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 { Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
2
- import type { ToolManager } from "./toolManager.js";
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":"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"}
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;IAsgBhB;;;;OAIG;YACW,gBAAgB;IAiE9B;;;OAGG;YACW,sBAAsB;IA6DpC;;OAEG;YACW,uBAAuB;CAwDtC"}
@@ -1,22 +1,17 @@
1
- import { callAgent, compressMessages, } from "../services/aiService.js";
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
- constructor(options) {
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
- this.logger?.error("Failed to abort AI service:", error);
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
- this.logger?.error("Failed to abort tool execution:", error);
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
- this.logger?.warn("Failed to generate compactParams", error);
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
- this.logger?.debug(`Token usage exceeded ${this.getMaxInputTokens()}, compressing messages...`);
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
- this.logger?.debug(`Successfully compressed ${messagesToCompress.length} messages and updated session`);
162
+ logger?.debug(`Successfully compressed ${messagesToCompress.length} messages and updated session`);
147
163
  }
148
164
  catch (compressError) {
149
- this.logger?.error("Failed to compress messages:", compressError);
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
- this.logger?.debug("modelConfig in sendAIMessage", this.getModelConfig());
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
- this.logger?.warn("AI response truncated due to length limit. Response headers:", result.response_headers);
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
- this.logger?.debug("AI response headers:", result.response_headers);
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
- this.logger?.error(errorMessage, parseError);
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
- this.logger?.info(`Tool ${toolName} execution blocked by PreToolUse hooks`);
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
@@ -492,7 +519,7 @@ export class AIManager {
492
519
  const hasBackgrounded = toolBlocks.length > 0 &&
493
520
  toolBlocks.some((block) => block.isManuallyBackgrounded);
494
521
  if (hasBackgrounded) {
495
- this.logger?.info("Some tools were manually backgrounded, stopping recursion.");
522
+ logger?.info("Some tools were manually backgrounded, stopping recursion.");
496
523
  }
497
524
  else if (!isCurrentlyAborted) {
498
525
  // Recursively call AI service, increment recursion depth, and pass same configuration
@@ -535,7 +562,7 @@ export class AIManager {
535
562
  // If Stop/SubagentStop hooks indicate we should continue (due to blocking errors),
536
563
  // restart the AI conversation cycle
537
564
  if (shouldContinue) {
538
- this.logger?.info(`${this.subagentType ? "SubagentStop" : "Stop"} hooks indicate issues need fixing, continuing conversation...`);
565
+ logger?.info(`${this.subagentType ? "SubagentStop" : "Stop"} hooks indicate issues need fixing, continuing conversation...`);
539
566
  // Restart the conversation to let AI fix the issues
540
567
  // Use recursionDepth = 0 to set loading false again for continuation
541
568
  await this.sendAIMessage({
@@ -579,13 +606,13 @@ export class AIManager {
579
606
  const processResult = this.hookManager.processHookResults(hookName, results, this.messageManager);
580
607
  // If hook processing indicates we should block (exit code 2), continue conversation
581
608
  if (processResult.shouldBlock) {
582
- this.logger?.info(`${hookName} hook blocked stopping with error:`, processResult.errorMessage);
609
+ logger?.info(`${hookName} hook blocked stopping with error:`, processResult.errorMessage);
583
610
  shouldContinue = true;
584
611
  }
585
612
  }
586
613
  // Log hook execution results for debugging
587
614
  if (results.length > 0) {
588
- this.logger?.debug(`Executed ${results.length} ${hookName} hook(s):`, results.map((r) => ({
615
+ logger?.debug(`Executed ${results.length} ${hookName} hook(s):`, results.map((r) => ({
589
616
  success: r.success,
590
617
  duration: r.duration,
591
618
  exitCode: r.exitCode,
@@ -597,7 +624,7 @@ export class AIManager {
597
624
  }
598
625
  catch (error) {
599
626
  // Hook execution errors should not interrupt the main workflow
600
- this.logger?.error(`${this.subagentType ? "SubagentStop" : "Stop"} hook execution failed:`, error);
627
+ logger?.error(`${this.subagentType ? "SubagentStop" : "Stop"} hook execution failed:`, error);
601
628
  return false;
602
629
  }
603
630
  }
@@ -631,7 +658,7 @@ export class AIManager {
631
658
  }
632
659
  // Log hook execution results for debugging
633
660
  if (results.length > 0) {
634
- this.logger?.debug(`Executed ${results.length} PreToolUse hook(s) for ${toolName}:`, results.map((r) => ({
661
+ logger?.debug(`Executed ${results.length} PreToolUse hook(s) for ${toolName}:`, results.map((r) => ({
635
662
  success: r.success,
636
663
  duration: r.duration,
637
664
  exitCode: r.exitCode,
@@ -643,7 +670,7 @@ export class AIManager {
643
670
  }
644
671
  catch (error) {
645
672
  // Hook execution errors should not interrupt the main workflow
646
- this.logger?.error("PreToolUse hook execution failed:", error);
673
+ logger?.error("PreToolUse hook execution failed:", error);
647
674
  return true; // Allow tool execution on hook errors
648
675
  }
649
676
  }
@@ -674,7 +701,7 @@ export class AIManager {
674
701
  }
675
702
  // Log hook execution results for debugging
676
703
  if (results.length > 0) {
677
- this.logger?.debug(`Executed ${results.length} PostToolUse hook(s) for ${toolName}:`, results.map((r) => ({
704
+ logger?.debug(`Executed ${results.length} PostToolUse hook(s) for ${toolName}:`, results.map((r) => ({
678
705
  success: r.success,
679
706
  duration: r.duration,
680
707
  exitCode: r.exitCode,
@@ -685,7 +712,7 @@ export class AIManager {
685
712
  }
686
713
  catch (error) {
687
714
  // Hook execution errors should not interrupt the main workflow
688
- this.logger?.error("PostToolUse hook execution failed:", error);
715
+ logger?.error("PostToolUse hook execution failed:", error);
689
716
  }
690
717
  }
691
718
  }
@@ -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;AAIxE,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;IAChC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,4BAA4B;IAKjD,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"}
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"}
@@ -2,7 +2,8 @@ import { spawn } from "child_process";
2
2
  import { stripAnsiColors } from "../utils/stringUtils.js";
3
3
  import { logger } from "../utils/globalLogger.js";
4
4
  export class BackgroundTaskManager {
5
- constructor(options) {
5
+ constructor(container, options) {
6
+ this.container = container;
6
7
  this.tasks = new Map();
7
8
  this.nextId = 1;
8
9
  this.callbacks = options.callbacks || {};