wave-agent-sdk 0.0.15 → 0.0.17-alpha.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 (204) hide show
  1. package/dist/agent.d.ts +11 -1
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +71 -11
  4. package/dist/constants/prompts.d.ts +14 -0
  5. package/dist/constants/prompts.d.ts.map +1 -0
  6. package/dist/constants/prompts.js +61 -0
  7. package/dist/constants/tools.d.ts +18 -0
  8. package/dist/constants/tools.d.ts.map +1 -0
  9. package/dist/constants/tools.js +17 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +6 -0
  13. package/dist/managers/aiManager.d.ts +8 -2
  14. package/dist/managers/aiManager.d.ts.map +1 -1
  15. package/dist/managers/aiManager.js +52 -16
  16. package/dist/managers/hookManager.d.ts +7 -2
  17. package/dist/managers/hookManager.d.ts.map +1 -1
  18. package/dist/managers/hookManager.js +10 -0
  19. package/dist/managers/liveConfigManager.d.ts +1 -1
  20. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  21. package/dist/managers/liveConfigManager.js +43 -22
  22. package/dist/managers/permissionManager.d.ts +50 -1
  23. package/dist/managers/permissionManager.d.ts.map +1 -1
  24. package/dist/managers/permissionManager.js +289 -58
  25. package/dist/managers/planManager.d.ts +21 -0
  26. package/dist/managers/planManager.d.ts.map +1 -0
  27. package/dist/managers/planManager.js +35 -0
  28. package/dist/managers/pluginManager.d.ts +57 -0
  29. package/dist/managers/pluginManager.d.ts.map +1 -0
  30. package/dist/managers/pluginManager.js +124 -0
  31. package/dist/managers/pluginScopeManager.d.ts +35 -0
  32. package/dist/managers/pluginScopeManager.d.ts.map +1 -0
  33. package/dist/managers/pluginScopeManager.js +39 -0
  34. package/dist/managers/skillManager.d.ts +4 -0
  35. package/dist/managers/skillManager.d.ts.map +1 -1
  36. package/dist/managers/skillManager.js +15 -0
  37. package/dist/managers/slashCommandManager.d.ts +4 -0
  38. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  39. package/dist/managers/slashCommandManager.js +45 -3
  40. package/dist/managers/subagentManager.d.ts.map +1 -1
  41. package/dist/managers/subagentManager.js +3 -1
  42. package/dist/managers/toolManager.d.ts +4 -0
  43. package/dist/managers/toolManager.d.ts.map +1 -1
  44. package/dist/managers/toolManager.js +24 -1
  45. package/dist/services/GitService.d.ts +16 -0
  46. package/dist/services/GitService.d.ts.map +1 -0
  47. package/dist/services/GitService.js +75 -0
  48. package/dist/services/MarketplaceService.d.ts +62 -0
  49. package/dist/services/MarketplaceService.d.ts.map +1 -0
  50. package/dist/services/MarketplaceService.js +320 -0
  51. package/dist/services/aiService.d.ts +1 -0
  52. package/dist/services/aiService.d.ts.map +1 -1
  53. package/dist/services/aiService.js +11 -11
  54. package/dist/services/configurationService.d.ts +11 -4
  55. package/dist/services/configurationService.d.ts.map +1 -1
  56. package/dist/services/configurationService.js +211 -67
  57. package/dist/services/fileWatcher.js +3 -3
  58. package/dist/services/hook.js +1 -1
  59. package/dist/services/pluginLoader.d.ts +35 -0
  60. package/dist/services/pluginLoader.d.ts.map +1 -0
  61. package/dist/services/pluginLoader.js +149 -0
  62. package/dist/tools/askUserQuestion.d.ts +3 -0
  63. package/dist/tools/askUserQuestion.d.ts.map +1 -0
  64. package/dist/tools/askUserQuestion.js +109 -0
  65. package/dist/tools/bashTool.d.ts.map +1 -1
  66. package/dist/tools/bashTool.js +37 -40
  67. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  68. package/dist/tools/deleteFileTool.js +17 -19
  69. package/dist/tools/editTool.d.ts.map +1 -1
  70. package/dist/tools/editTool.js +29 -36
  71. package/dist/tools/exitPlanMode.d.ts +6 -0
  72. package/dist/tools/exitPlanMode.d.ts.map +1 -0
  73. package/dist/tools/exitPlanMode.js +76 -0
  74. package/dist/tools/globTool.d.ts.map +1 -1
  75. package/dist/tools/globTool.js +4 -3
  76. package/dist/tools/grepTool.d.ts.map +1 -1
  77. package/dist/tools/grepTool.js +5 -4
  78. package/dist/tools/lsTool.d.ts.map +1 -1
  79. package/dist/tools/lsTool.js +16 -3
  80. package/dist/tools/lspTool.d.ts.map +1 -1
  81. package/dist/tools/lspTool.js +3 -2
  82. package/dist/tools/multiEditTool.d.ts.map +1 -1
  83. package/dist/tools/multiEditTool.js +24 -31
  84. package/dist/tools/readTool.d.ts.map +1 -1
  85. package/dist/tools/readTool.js +16 -3
  86. package/dist/tools/skillTool.d.ts.map +1 -1
  87. package/dist/tools/skillTool.js +30 -27
  88. package/dist/tools/taskTool.d.ts.map +1 -1
  89. package/dist/tools/taskTool.js +36 -31
  90. package/dist/tools/todoWriteTool.d.ts.map +1 -1
  91. package/dist/tools/todoWriteTool.js +3 -2
  92. package/dist/tools/writeTool.d.ts.map +1 -1
  93. package/dist/tools/writeTool.js +13 -17
  94. package/dist/types/commands.d.ts +1 -0
  95. package/dist/types/commands.d.ts.map +1 -1
  96. package/dist/types/config.d.ts +2 -0
  97. package/dist/types/config.d.ts.map +1 -1
  98. package/dist/types/configuration.d.ts +36 -1
  99. package/dist/types/configuration.d.ts.map +1 -1
  100. package/dist/types/hooks.d.ts +2 -15
  101. package/dist/types/hooks.d.ts.map +1 -1
  102. package/dist/types/index.d.ts +3 -0
  103. package/dist/types/index.d.ts.map +1 -1
  104. package/dist/types/index.js +3 -0
  105. package/dist/types/marketplace.d.ts +43 -0
  106. package/dist/types/marketplace.d.ts.map +1 -0
  107. package/dist/types/marketplace.js +1 -0
  108. package/dist/types/permissions.d.ts +4 -2
  109. package/dist/types/permissions.d.ts.map +1 -1
  110. package/dist/types/permissions.js +8 -5
  111. package/dist/types/plugins.d.ts +35 -0
  112. package/dist/types/plugins.d.ts.map +1 -0
  113. package/dist/types/plugins.js +1 -0
  114. package/dist/types/tools.d.ts +17 -0
  115. package/dist/types/tools.d.ts.map +1 -1
  116. package/dist/utils/bashHistory.d.ts +3 -3
  117. package/dist/utils/bashHistory.d.ts.map +1 -1
  118. package/dist/utils/bashHistory.js +10 -8
  119. package/dist/utils/bashParser.d.ts.map +1 -1
  120. package/dist/utils/bashParser.js +63 -20
  121. package/dist/utils/configPaths.d.ts +4 -0
  122. package/dist/utils/configPaths.d.ts.map +1 -1
  123. package/dist/utils/configPaths.js +6 -0
  124. package/dist/utils/constants.d.ts +4 -0
  125. package/dist/utils/constants.d.ts.map +1 -1
  126. package/dist/utils/constants.js +4 -0
  127. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  128. package/dist/utils/convertMessagesForAPI.js +4 -2
  129. package/dist/utils/customCommands.d.ts +6 -0
  130. package/dist/utils/customCommands.d.ts.map +1 -1
  131. package/dist/utils/customCommands.js +1 -1
  132. package/dist/utils/editUtils.d.ts +17 -0
  133. package/dist/utils/editUtils.d.ts.map +1 -0
  134. package/dist/utils/editUtils.js +69 -0
  135. package/dist/utils/markdownParser.d.ts.map +1 -1
  136. package/dist/utils/markdownParser.js +25 -1
  137. package/dist/utils/messageOperations.d.ts.map +1 -1
  138. package/dist/utils/messageOperations.js +2 -1
  139. package/dist/utils/nameGenerator.d.ts +8 -0
  140. package/dist/utils/nameGenerator.d.ts.map +1 -0
  141. package/dist/utils/nameGenerator.js +75 -0
  142. package/dist/utils/openaiClient.d.ts.map +1 -1
  143. package/dist/utils/openaiClient.js +14 -2
  144. package/dist/utils/pathSafety.d.ts.map +1 -1
  145. package/dist/utils/pathSafety.js +17 -2
  146. package/package.json +6 -1
  147. package/src/agent.ts +95 -10
  148. package/src/constants/prompts.ts +93 -0
  149. package/src/constants/tools.ts +17 -0
  150. package/src/index.ts +8 -0
  151. package/src/managers/aiManager.ts +86 -18
  152. package/src/managers/hookManager.ts +23 -6
  153. package/src/managers/liveConfigManager.ts +56 -29
  154. package/src/managers/permissionManager.ts +361 -61
  155. package/src/managers/planManager.ts +45 -0
  156. package/src/managers/pluginManager.ts +182 -0
  157. package/src/managers/pluginScopeManager.ts +75 -0
  158. package/src/managers/skillManager.ts +18 -0
  159. package/src/managers/slashCommandManager.ts +67 -5
  160. package/src/managers/subagentManager.ts +3 -1
  161. package/src/managers/toolManager.ts +25 -3
  162. package/src/services/GitService.ts +97 -0
  163. package/src/services/MarketplaceService.ts +428 -0
  164. package/src/services/aiService.ts +33 -16
  165. package/src/services/configurationService.ts +244 -86
  166. package/src/services/fileWatcher.ts +3 -3
  167. package/src/services/hook.ts +1 -1
  168. package/src/services/pluginLoader.ts +181 -0
  169. package/src/tools/askUserQuestion.ts +128 -0
  170. package/src/tools/bashTool.ts +52 -49
  171. package/src/tools/deleteFileTool.ts +22 -28
  172. package/src/tools/editTool.ts +42 -48
  173. package/src/tools/exitPlanMode.ts +93 -0
  174. package/src/tools/globTool.ts +4 -4
  175. package/src/tools/grepTool.ts +9 -5
  176. package/src/tools/lsTool.ts +27 -4
  177. package/src/tools/lspTool.ts +3 -2
  178. package/src/tools/multiEditTool.ts +40 -42
  179. package/src/tools/readTool.ts +23 -4
  180. package/src/tools/skillTool.ts +35 -30
  181. package/src/tools/taskTool.ts +39 -33
  182. package/src/tools/todoWriteTool.ts +3 -2
  183. package/src/tools/writeTool.ts +19 -27
  184. package/src/types/commands.ts +1 -0
  185. package/src/types/config.ts +2 -0
  186. package/src/types/configuration.ts +42 -1
  187. package/src/types/hooks.ts +8 -25
  188. package/src/types/index.ts +3 -0
  189. package/src/types/marketplace.ts +52 -0
  190. package/src/types/permissions.ts +29 -6
  191. package/src/types/plugins.ts +37 -0
  192. package/src/types/tools.ts +20 -0
  193. package/src/utils/bashHistory.ts +9 -16
  194. package/src/utils/bashParser.ts +97 -46
  195. package/src/utils/configPaths.ts +7 -0
  196. package/src/utils/constants.ts +5 -0
  197. package/src/utils/convertMessagesForAPI.ts +4 -2
  198. package/src/utils/customCommands.ts +1 -1
  199. package/src/utils/editUtils.ts +82 -0
  200. package/src/utils/markdownParser.ts +28 -1
  201. package/src/utils/messageOperations.ts +2 -1
  202. package/src/utils/nameGenerator.ts +78 -0
  203. package/src/utils/openaiClient.ts +14 -2
  204. package/src/utils/pathSafety.ts +16 -2
@@ -0,0 +1,124 @@
1
+ import { PluginLoader } from "../services/pluginLoader.js";
2
+ import * as path from "path";
3
+ import { MarketplaceService } from "../services/MarketplaceService.js";
4
+ export class PluginManager {
5
+ constructor(options) {
6
+ this.plugins = new Map();
7
+ this.workdir = options.workdir;
8
+ this.logger = options.logger;
9
+ this.skillManager = options.skillManager;
10
+ this.hookManager = options.hookManager;
11
+ this.lspManager = options.lspManager;
12
+ this.mcpManager = options.mcpManager;
13
+ this.slashCommandManager = options.slashCommandManager;
14
+ this.enabledPlugins = options.enabledPlugins || {};
15
+ this.configurationService = options.configurationService;
16
+ }
17
+ /**
18
+ * Update enabled plugins configuration
19
+ */
20
+ updateEnabledPlugins(enabledPlugins) {
21
+ this.enabledPlugins = enabledPlugins;
22
+ }
23
+ /**
24
+ * Load plugins installed via marketplace
25
+ */
26
+ async loadInstalledPlugins() {
27
+ try {
28
+ // If configurationService is provided, use it to get the latest merged enabled plugins
29
+ if (this.configurationService) {
30
+ this.enabledPlugins = this.configurationService.getMergedEnabledPlugins(this.workdir);
31
+ }
32
+ const marketplaceService = new MarketplaceService();
33
+ const installedRegistry = await marketplaceService.getInstalledPlugins();
34
+ for (const p of installedRegistry.plugins) {
35
+ const pluginId = `${p.name}@${p.marketplace}`;
36
+ if (this.enabledPlugins[pluginId] !== true) {
37
+ this.logger?.info(`Plugin ${pluginId} is not enabled via configuration`);
38
+ continue;
39
+ }
40
+ await this.loadSinglePlugin(p.cachePath);
41
+ }
42
+ }
43
+ catch (error) {
44
+ this.logger?.error("Failed to load installed plugins:", error);
45
+ }
46
+ }
47
+ /**
48
+ * Load a single plugin from an absolute path
49
+ */
50
+ async loadSinglePlugin(absolutePath) {
51
+ try {
52
+ const manifest = await PluginLoader.loadManifest(absolutePath);
53
+ if (this.plugins.has(manifest.name)) {
54
+ // If already loaded (e.g. via explicit config), skip
55
+ this.logger?.warn(`Plugin with name '${manifest.name}' is already loaded`);
56
+ return;
57
+ }
58
+ const plugin = {
59
+ ...manifest,
60
+ path: absolutePath,
61
+ commands: PluginLoader.loadCommands(absolutePath),
62
+ skills: await PluginLoader.loadSkills(absolutePath),
63
+ lspConfig: await PluginLoader.loadLspConfig(absolutePath),
64
+ mcpConfig: await PluginLoader.loadMcpConfig(absolutePath),
65
+ hooksConfig: await PluginLoader.loadHooksConfig(absolutePath),
66
+ };
67
+ // Register components with managers
68
+ if (this.slashCommandManager && plugin.commands.length > 0) {
69
+ this.slashCommandManager.registerPluginCommands(plugin.name, plugin.commands);
70
+ }
71
+ if (this.skillManager && plugin.skills.length > 0) {
72
+ this.skillManager.registerPluginSkills(plugin.skills);
73
+ }
74
+ if (this.lspManager && plugin.lspConfig) {
75
+ for (const [language, config] of Object.entries(plugin.lspConfig)) {
76
+ this.lspManager.registerServer(language, config);
77
+ }
78
+ }
79
+ if (this.mcpManager && plugin.mcpConfig) {
80
+ for (const [name, config] of Object.entries(plugin.mcpConfig.mcpServers)) {
81
+ this.mcpManager.addServer(name, config);
82
+ }
83
+ }
84
+ if (this.hookManager && plugin.hooksConfig) {
85
+ this.hookManager.registerPluginHooks(plugin.hooksConfig);
86
+ }
87
+ this.plugins.set(manifest.name, plugin);
88
+ this.logger?.info(`Loaded plugin: ${manifest.name} v${manifest.version}`);
89
+ }
90
+ catch (error) {
91
+ this.logger?.error(`Failed to load plugin from ${absolutePath}`, error);
92
+ }
93
+ }
94
+ /**
95
+ * Load plugins from configuration
96
+ * @param configs Array of plugin configurations
97
+ */
98
+ async loadPlugins(configs) {
99
+ // Load installed plugins from marketplace first
100
+ await this.loadInstalledPlugins();
101
+ for (const config of configs) {
102
+ if (config.type !== "local") {
103
+ this.logger?.warn(`Unsupported plugin type: ${config.type}`);
104
+ continue;
105
+ }
106
+ const absolutePath = path.isAbsolute(config.path)
107
+ ? config.path
108
+ : path.resolve(this.workdir, config.path);
109
+ await this.loadSinglePlugin(absolutePath);
110
+ }
111
+ }
112
+ /**
113
+ * Get all loaded plugins
114
+ */
115
+ getPlugins() {
116
+ return Array.from(this.plugins.values());
117
+ }
118
+ /**
119
+ * Get a plugin by name
120
+ */
121
+ getPlugin(name) {
122
+ return this.plugins.get(name);
123
+ }
124
+ }
@@ -0,0 +1,35 @@
1
+ import { ConfigurationService } from "../services/configurationService.js";
2
+ import { PluginManager } from "./pluginManager.js";
3
+ import { Logger } from "../types/index.js";
4
+ export interface PluginScopeManagerOptions {
5
+ workdir: string;
6
+ configurationService: ConfigurationService;
7
+ pluginManager: PluginManager;
8
+ logger?: Logger;
9
+ }
10
+ export declare class PluginScopeManager {
11
+ private workdir;
12
+ private configurationService;
13
+ private pluginManager;
14
+ private logger?;
15
+ constructor(options: PluginScopeManagerOptions);
16
+ /**
17
+ * Enable a plugin in the specified scope
18
+ */
19
+ enablePlugin(scope: "user" | "project" | "local", pluginId: string): Promise<void>;
20
+ /**
21
+ * Disable a plugin in the specified scope
22
+ */
23
+ disablePlugin(scope: "user" | "project" | "local", pluginId: string): Promise<void>;
24
+ /**
25
+ * Get the merged enabled state of all plugins
26
+ */
27
+ getMergedEnabledPlugins(): Record<string, boolean>;
28
+ /**
29
+ * Refresh the plugin manager with the latest configuration
30
+ * Note: This only updates the configuration, it doesn't reload plugins.
31
+ * Reloading plugins might require a more complex logic (unloading/loading).
32
+ */
33
+ private refreshPluginManager;
34
+ }
35
+ //# sourceMappingURL=pluginScopeManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginScopeManager.d.ts","sourceRoot":"","sources":["../../src/managers/pluginScopeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,yBAAyB;IAO9C;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACH,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;CAI7B"}
@@ -0,0 +1,39 @@
1
+ export class PluginScopeManager {
2
+ constructor(options) {
3
+ this.workdir = options.workdir;
4
+ this.configurationService = options.configurationService;
5
+ this.pluginManager = options.pluginManager;
6
+ this.logger = options.logger;
7
+ }
8
+ /**
9
+ * Enable a plugin in the specified scope
10
+ */
11
+ async enablePlugin(scope, pluginId) {
12
+ await this.configurationService.updateEnabledPlugin(this.workdir, scope, pluginId, true);
13
+ this.logger?.info(`Enabled plugin ${pluginId} in ${scope} scope`);
14
+ this.refreshPluginManager();
15
+ }
16
+ /**
17
+ * Disable a plugin in the specified scope
18
+ */
19
+ async disablePlugin(scope, pluginId) {
20
+ await this.configurationService.updateEnabledPlugin(this.workdir, scope, pluginId, false);
21
+ this.logger?.info(`Disabled plugin ${pluginId} in ${scope} scope`);
22
+ this.refreshPluginManager();
23
+ }
24
+ /**
25
+ * Get the merged enabled state of all plugins
26
+ */
27
+ getMergedEnabledPlugins() {
28
+ return this.configurationService.getMergedEnabledPlugins(this.workdir);
29
+ }
30
+ /**
31
+ * Refresh the plugin manager with the latest configuration
32
+ * Note: This only updates the configuration, it doesn't reload plugins.
33
+ * Reloading plugins might require a more complex logic (unloading/loading).
34
+ */
35
+ refreshPluginManager() {
36
+ const enabledPlugins = this.getMergedEnabledPlugins();
37
+ this.pluginManager.updateEnabledPlugins(enabledPlugins);
38
+ }
39
+ }
@@ -55,5 +55,9 @@ export declare class SkillManager {
55
55
  * Format available skills list for error messages
56
56
  */
57
57
  private formatAvailableSkills;
58
+ /**
59
+ * Register skills provided by a plugin
60
+ */
61
+ registerPluginSkills(skills: Skill[]): void;
58
62
  }
59
63
  //# sourceMappingURL=skillManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,mBAAwB;IAQ7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IAiFrC;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;IAqCjE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
1
+ {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,mBAAwB;IAQ7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IAiFrC;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;IAqCjE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CAc5C"}
@@ -239,4 +239,19 @@ export class SkillManager {
239
239
  .map((skill) => `• **${skill.name}** (${skill.type}): ${skill.description}`)
240
240
  .join("\n");
241
241
  }
242
+ /**
243
+ * Register skills provided by a plugin
244
+ */
245
+ registerPluginSkills(skills) {
246
+ for (const skill of skills) {
247
+ this.skillMetadata.set(skill.name, {
248
+ name: skill.name,
249
+ description: skill.description,
250
+ type: skill.type,
251
+ skillPath: skill.skillPath,
252
+ });
253
+ this.skillContent.set(skill.name, skill);
254
+ }
255
+ this.logger?.debug(`Registered ${skills.length} plugin skills. Total skills: ${this.skillMetadata.size}`);
256
+ }
242
257
  }
@@ -20,6 +20,10 @@ export declare class SlashCommandManager {
20
20
  * Load custom commands from filesystem
21
21
  */
22
22
  private loadCustomCommands;
23
+ /**
24
+ * Register commands from a plugin with namespacing
25
+ */
26
+ registerPluginCommands(pluginName: string, commands: CustomSlashCommand[]): void;
23
27
  /**
24
28
  * Reload custom commands (useful for development)
25
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAejC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IAyE7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
1
+ {"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAejC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgD1B;;OAEG;IACI,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,IAAI;IA+CP;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IA0E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
@@ -47,9 +47,16 @@ export class SlashCommandManager {
47
47
  description,
48
48
  handler: async (args) => {
49
49
  // Substitute parameters in the command content
50
- const processedContent = hasParameterPlaceholders(command.content) && args
51
- ? substituteCommandParameters(command.content, args)
52
- : command.content;
50
+ let processedContent = command.content;
51
+ if (args) {
52
+ if (hasParameterPlaceholders(command.content)) {
53
+ processedContent = substituteCommandParameters(command.content, args);
54
+ }
55
+ else {
56
+ // If no placeholders, append arguments to the content
57
+ processedContent = `${command.content.trim()} ${args}`;
58
+ }
59
+ }
53
60
  await this.executeCustomCommandInMainAgent(command.name, processedContent, command.config, args);
54
61
  },
55
62
  });
@@ -60,6 +67,40 @@ export class SlashCommandManager {
60
67
  this.logger?.warn("Failed to load custom commands:", error);
61
68
  }
62
69
  }
70
+ /**
71
+ * Register commands from a plugin with namespacing
72
+ */
73
+ registerPluginCommands(pluginName, commands) {
74
+ for (const command of commands) {
75
+ const namespacedId = `${pluginName}:${command.id}`;
76
+ const namespacedName = `${pluginName}:${command.name}`;
77
+ this.customCommands.set(namespacedId, command);
78
+ // Generate description: prioritize custom description, otherwise use default description
79
+ const description = command.description ||
80
+ `Plugin command: ${namespacedName}${hasParameterPlaceholders(command.content) ? " (supports parameters)" : ""}`;
81
+ // Register as a regular command with a handler that executes the custom command
82
+ this.registerCommand({
83
+ id: namespacedId,
84
+ name: namespacedName,
85
+ description,
86
+ handler: async (args) => {
87
+ // Substitute parameters in the command content
88
+ let processedContent = command.content;
89
+ if (args) {
90
+ if (hasParameterPlaceholders(command.content)) {
91
+ processedContent = substituteCommandParameters(command.content, args);
92
+ }
93
+ else {
94
+ // If no placeholders, append arguments to the content
95
+ processedContent = `${command.content.trim()} ${args}`;
96
+ }
97
+ }
98
+ await this.executeCustomCommandInMainAgent(namespacedName, processedContent, command.config, args);
99
+ },
100
+ });
101
+ }
102
+ this.logger?.debug(`Registered ${commands.length} commands from plugin '${pluginName}'`);
103
+ }
63
104
  /**
64
105
  * Reload custom commands (useful for development)
65
106
  */
@@ -195,6 +236,7 @@ export class SlashCommandManager {
195
236
  // Execute the AI conversation with custom configuration
196
237
  await this.aiManager.sendAIMessage({
197
238
  model: config?.model,
239
+ allowedRules: config?.allowedTools,
198
240
  });
199
241
  }
200
242
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AAMvC,MAAM,WAAW,wBAAwB;IAEvC,gDAAgD;IAChD,0BAA0B,CAAC,EAAE,CAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,KACtB,IAAI,CAAC;IACV,wDAAwD;IACxD,+BAA+B,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,0DAA0D;IAC1D,iCAAiC,CAAC,EAAE,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,4DAA4D;IAC5D,mCAAmC,CAAC,EAAE,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,oDAAoD;IACpD,0BAA0B,CAAC,EAAE,CAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,0BAA0B,KAC/B,IAAI,CAAC;IACV,8CAA8C;IAC9C,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACtE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,cAAc,CAAC;IACrC,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,aAAa,CAAC;IACtC,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,SAAS,CAAC,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,OAAO,EAAE,sBAAsB;IAa3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAY5D;;OAEG;IACH,iBAAiB,IAAI,qBAAqB,EAAE;IAS5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM;IAK/B;;OAEG;IACG,cAAc,CAClB,aAAa,EAAE,qBAAqB,EACpC,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAuF5B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC;IAuHlB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIxD;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhE;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAYzC;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,EAAE;IAOxC;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACG,uBAAuB,CAC3B,gBAAgB,EAAE,KAAK,CAAC;QACtB,WAAW,EAAE,WAAW,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,qBAAqB,CAAC;KACtC,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAgFhB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAgEhC"}
@@ -77,6 +77,7 @@ export class SubagentManager {
77
77
  systemPrompt: configuration.systemPrompt,
78
78
  subagentType: parameters.subagent_type, // Pass subagent type for hook context
79
79
  hookManager: this.hookManager,
80
+ permissionManager: this.parentToolManager.getPermissionManager(),
80
81
  getGatewayConfig: this.getGatewayConfig,
81
82
  getModelConfig: () => {
82
83
  // Determine model dynamically each time
@@ -184,7 +185,7 @@ export class SubagentManager {
184
185
  }
185
186
  // For "inherit" or undefined, resolvedModel remains undefined (uses AIManager default)
186
187
  const executeAI = instance.aiManager.sendAIMessage({
187
- allowedTools,
188
+ tools: allowedTools,
188
189
  model: resolvedModel,
189
190
  });
190
191
  try {
@@ -320,6 +321,7 @@ export class SubagentManager {
320
321
  systemPrompt: configuration.systemPrompt,
321
322
  subagentType: configuration.name, // Use configuration name as subagent type for restored instances
322
323
  hookManager: this.hookManager,
324
+ permissionManager: this.parentToolManager.getPermissionManager(),
323
325
  getGatewayConfig: this.getGatewayConfig,
324
326
  getModelConfig: () => ({
325
327
  ...parentModelConfig,
@@ -87,6 +87,10 @@ declare class ToolManager {
87
87
  * @param mode - The new permission mode
88
88
  */
89
89
  setPermissionMode(mode: PermissionMode): void;
90
+ /**
91
+ * Get the permission manager
92
+ */
93
+ getPermissionManager(): PermissionManager | undefined;
90
94
  }
91
95
  export { ToolManager };
92
96
  //# 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;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"}
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;AAiB7E,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;IAmCR;;;;;;;;;;;;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;IAmB9C;;OAEG;IACI,iBAAiB,IAAI,cAAc;IAS1C;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpD;;OAEG;IACI,oBAAoB,IAAI,iBAAiB,GAAG,SAAS;CAG7D;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -3,6 +3,8 @@ import { deleteFileTool } from "../tools/deleteFileTool.js";
3
3
  import { editTool } from "../tools/editTool.js";
4
4
  import { multiEditTool } from "../tools/multiEditTool.js";
5
5
  import { writeTool } from "../tools/writeTool.js";
6
+ import { exitPlanModeTool } from "../tools/exitPlanMode.js";
7
+ import { askUserQuestionTool } from "../tools/askUserQuestion.js";
6
8
  // New tools
7
9
  import { globTool } from "../tools/globTool.js";
8
10
  import { grepTool } from "../tools/grepTool.js";
@@ -67,6 +69,8 @@ class ToolManager {
67
69
  editTool,
68
70
  multiEditTool,
69
71
  writeTool,
72
+ exitPlanModeTool,
73
+ askUserQuestionTool,
70
74
  globTool,
71
75
  grepTool,
72
76
  lsTool,
@@ -156,7 +160,20 @@ class ToolManager {
156
160
  return [...builtInTools, ...mcpTools];
157
161
  }
158
162
  getToolsConfig() {
159
- const builtInToolsConfig = Array.from(this.tools.values()).map((tool) => tool.config);
163
+ const effectivePermissionMode = this.getPermissionMode();
164
+ const builtInToolsConfig = Array.from(this.tools.values())
165
+ .filter((tool) => {
166
+ if (effectivePermissionMode === "bypassPermissions") {
167
+ if (tool.name === "ExitPlanMode" || tool.name === "AskUserQuestion") {
168
+ return false;
169
+ }
170
+ }
171
+ if (tool.name === "ExitPlanMode") {
172
+ return effectivePermissionMode === "plan";
173
+ }
174
+ return true;
175
+ })
176
+ .map((tool) => tool.config);
160
177
  const mcpToolsConfig = this.mcpManager.getMcpToolsConfig();
161
178
  return [...builtInToolsConfig, ...mcpToolsConfig];
162
179
  }
@@ -176,6 +193,12 @@ class ToolManager {
176
193
  setPermissionMode(mode) {
177
194
  this.permissionMode = mode;
178
195
  }
196
+ /**
197
+ * Get the permission manager
198
+ */
199
+ getPermissionManager() {
200
+ return this.permissionManager;
201
+ }
179
202
  }
180
203
  // Export tool registry class and types
181
204
  export { ToolManager };
@@ -0,0 +1,16 @@
1
+ export declare class GitService {
2
+ /**
3
+ * Checks if git is installed and available in the system path
4
+ */
5
+ isGitAvailable(): Promise<boolean>;
6
+ /**
7
+ * Clones a Git repository to a local path
8
+ */
9
+ clone(urlOrRepo: string, targetPath: string, ref?: string): Promise<void>;
10
+ /**
11
+ * Pulls the latest changes in a local repository
12
+ */
13
+ pull(targetPath: string): Promise<void>;
14
+ private handleGitError;
15
+ }
16
+ //# sourceMappingURL=GitService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../src/services/GitService.ts"],"names":[],"mappings":"AAKA,qBAAa,UAAU;IACrB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASxC;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C,OAAO,CAAC,cAAc;CA6BvB"}
@@ -0,0 +1,75 @@
1
+ import { exec } from "child_process";
2
+ import { promisify } from "util";
3
+ const execAsync = promisify(exec);
4
+ export class GitService {
5
+ /**
6
+ * Checks if git is installed and available in the system path
7
+ */
8
+ async isGitAvailable() {
9
+ try {
10
+ await execAsync("git --version");
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /**
18
+ * Clones a Git repository to a local path
19
+ */
20
+ async clone(urlOrRepo, targetPath, ref) {
21
+ if (!(await this.isGitAvailable())) {
22
+ throw new Error("Git is not installed or not found in PATH. Please install Git to use Git/GitHub marketplaces.");
23
+ }
24
+ let url = urlOrRepo;
25
+ if (!urlOrRepo.startsWith("http://") &&
26
+ !urlOrRepo.startsWith("https://") &&
27
+ !urlOrRepo.startsWith("git@") &&
28
+ !urlOrRepo.startsWith("ssh://")) {
29
+ // Assume GitHub repo format: owner/repo
30
+ url = `https://github.com/${urlOrRepo}.git`;
31
+ }
32
+ try {
33
+ const refArgs = ref ? `-b "${ref}"` : "--depth 1";
34
+ await execAsync(`LC_ALL=C git clone ${refArgs} "${url}" "${targetPath}"`);
35
+ }
36
+ catch (error) {
37
+ throw this.handleGitError(urlOrRepo, error);
38
+ }
39
+ }
40
+ /**
41
+ * Pulls the latest changes in a local repository
42
+ */
43
+ async pull(targetPath) {
44
+ if (!(await this.isGitAvailable())) {
45
+ throw new Error("Git is not installed or not found in PATH. Please install Git to use Git/GitHub marketplaces.");
46
+ }
47
+ try {
48
+ await execAsync(`LC_ALL=C git -C "${targetPath}" pull`);
49
+ }
50
+ catch (error) {
51
+ throw this.handleGitError(targetPath, error);
52
+ }
53
+ }
54
+ handleGitError(context, error) {
55
+ const stderr = error?.stderr || "";
56
+ const message = error?.message || String(error);
57
+ if (stderr.includes("Repository not found") ||
58
+ stderr.includes("not found")) {
59
+ return new Error(`Repository "${context}" not found. It might be private or doesn't exist.`);
60
+ }
61
+ if (stderr.includes("Could not read from remote repository")) {
62
+ return new Error(`Could not access repository "${context}". Please check your internet connection and permissions.`);
63
+ }
64
+ if (stderr.includes("Authentication failed")) {
65
+ return new Error(`Authentication failed for repository "${context}".`);
66
+ }
67
+ if (stderr.includes("rate limit")) {
68
+ return new Error(`GitHub rate limit exceeded. Please try again later.`);
69
+ }
70
+ if (stderr.includes("not a git repository")) {
71
+ return new Error(`The path "${context}" is not a valid git repository.`);
72
+ }
73
+ return new Error(`Git operation failed for "${context}": ${message}`);
74
+ }
75
+ }
@@ -0,0 +1,62 @@
1
+ import { KnownMarketplace, KnownMarketplacesRegistry, InstalledPlugin, InstalledPluginsRegistry, MarketplaceManifest } from "../types/marketplace.js";
2
+ /**
3
+ * Marketplace Service
4
+ *
5
+ * Handles local plugin marketplace registration, plugin installation,
6
+ * and state management for installed plugins.
7
+ */
8
+ export declare class MarketplaceService {
9
+ private pluginsDir;
10
+ private knownMarketplacesPath;
11
+ private installedPluginsPath;
12
+ private tmpDir;
13
+ private cacheDir;
14
+ private marketplacesDir;
15
+ private gitService;
16
+ constructor();
17
+ /**
18
+ * Ensures the required directory structure exists in ~/.wave/plugins
19
+ */
20
+ private ensureDirectoryStructure;
21
+ /**
22
+ * Loads the known marketplaces registry
23
+ */
24
+ getKnownMarketplaces(): Promise<KnownMarketplacesRegistry>;
25
+ /**
26
+ * Loads the installed plugins registry
27
+ */
28
+ getInstalledPlugins(): Promise<InstalledPluginsRegistry>;
29
+ /**
30
+ * Saves the known marketplaces registry
31
+ */
32
+ saveKnownMarketplaces(registry: KnownMarketplacesRegistry): Promise<void>;
33
+ /**
34
+ * Saves the installed plugins registry
35
+ */
36
+ saveInstalledPlugins(registry: InstalledPluginsRegistry): Promise<void>;
37
+ /**
38
+ * Loads a marketplace manifest from a local path
39
+ */
40
+ loadMarketplaceManifest(marketplacePath: string): Promise<MarketplaceManifest>;
41
+ /**
42
+ * Resolves the local path for a marketplace
43
+ */
44
+ getMarketplacePath(marketplace: KnownMarketplace): string;
45
+ /**
46
+ * Adds a new marketplace (local directory, GitHub repo, or Git URL)
47
+ */
48
+ addMarketplace(input: string): Promise<KnownMarketplace>;
49
+ /**
50
+ * Lists all registered marketplaces
51
+ */
52
+ listMarketplaces(): Promise<KnownMarketplace[]>;
53
+ /**
54
+ * Updates a specific marketplace or all marketplaces
55
+ */
56
+ updateMarketplace(name?: string): Promise<void>;
57
+ /**
58
+ * Installs a plugin from a marketplace
59
+ */
60
+ installPlugin(pluginAtMarketplace: string): Promise<InstalledPlugin>;
61
+ }
62
+ //# sourceMappingURL=MarketplaceService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAa;;IAoB/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAahE;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAa9D;;OAEG;IACG,qBAAqB,CACzB,QAAQ,EAAE,yBAAyB,GAClC,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,wBAAwB,GACjC,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,uBAAuB,CAC3B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,mBAAmB,CAAC;IAwB/B;;OAEG;IACI,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM;IAehE;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsF9D;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKrD;;OAEG;IACG,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CrD;;OAEG;IACG,aAAa,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAqH3E"}