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.
Files changed (190) 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/core/session.d.ts +3 -0
  11. package/dist/core/session.d.ts.map +1 -0
  12. package/dist/core/session.js +1 -0
  13. package/dist/index.d.ts +2 -9
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -10
  16. package/dist/managers/MemoryRuleManager.d.ts +3 -1
  17. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  18. package/dist/managers/MemoryRuleManager.js +2 -1
  19. package/dist/managers/aiManager.d.ts +13 -23
  20. package/dist/managers/aiManager.d.ts.map +1 -1
  21. package/dist/managers/aiManager.js +60 -32
  22. package/dist/managers/backgroundTaskManager.d.ts +3 -1
  23. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  24. package/dist/managers/backgroundTaskManager.js +2 -1
  25. package/dist/managers/bashManager.d.ts +4 -4
  26. package/dist/managers/bashManager.d.ts.map +1 -1
  27. package/dist/managers/bashManager.js +5 -2
  28. package/dist/managers/foregroundTaskManager.d.ts +3 -0
  29. package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
  30. package/dist/managers/foregroundTaskManager.js +2 -1
  31. package/dist/managers/hookManager.d.ts +3 -3
  32. package/dist/managers/hookManager.d.ts.map +1 -1
  33. package/dist/managers/hookManager.js +20 -19
  34. package/dist/managers/liveConfigManager.d.ts +6 -13
  35. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  36. package/dist/managers/liveConfigManager.js +50 -45
  37. package/dist/managers/lspManager.d.ts +4 -5
  38. package/dist/managers/lspManager.d.ts.map +1 -1
  39. package/dist/managers/lspManager.js +13 -12
  40. package/dist/managers/mcpManager.d.ts +3 -2
  41. package/dist/managers/mcpManager.d.ts.map +1 -1
  42. package/dist/managers/mcpManager.js +16 -15
  43. package/dist/managers/messageManager.d.ts +5 -7
  44. package/dist/managers/messageManager.d.ts.map +1 -1
  45. package/dist/managers/messageManager.js +12 -7
  46. package/dist/managers/permissionManager.d.ts +6 -4
  47. package/dist/managers/permissionManager.d.ts.map +1 -1
  48. package/dist/managers/permissionManager.js +39 -63
  49. package/dist/managers/planManager.d.ts +4 -6
  50. package/dist/managers/planManager.d.ts.map +1 -1
  51. package/dist/managers/planManager.js +18 -4
  52. package/dist/managers/pluginManager.d.ts +10 -22
  53. package/dist/managers/pluginManager.d.ts.map +1 -1
  54. package/dist/managers/pluginManager.js +27 -14
  55. package/dist/managers/reversionManager.d.ts +4 -3
  56. package/dist/managers/reversionManager.d.ts.map +1 -1
  57. package/dist/managers/reversionManager.js +5 -2
  58. package/dist/managers/skillManager.d.ts +3 -2
  59. package/dist/managers/skillManager.d.ts.map +1 -1
  60. package/dist/managers/skillManager.js +15 -14
  61. package/dist/managers/slashCommandManager.d.ts +9 -16
  62. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  63. package/dist/managers/slashCommandManager.js +21 -10
  64. package/dist/managers/subagentManager.d.ts +7 -17
  65. package/dist/managers/subagentManager.d.ts.map +1 -1
  66. package/dist/managers/subagentManager.js +41 -34
  67. package/dist/managers/toolManager.d.ts +15 -38
  68. package/dist/managers/toolManager.d.ts.map +1 -1
  69. package/dist/managers/toolManager.js +67 -56
  70. package/dist/prompts/index.d.ts +6 -2
  71. package/dist/prompts/index.d.ts.map +1 -1
  72. package/dist/prompts/index.js +8 -4
  73. package/dist/services/MarketplaceService.d.ts.map +1 -1
  74. package/dist/services/MarketplaceService.js +13 -0
  75. package/dist/services/aiService.d.ts +4 -0
  76. package/dist/services/aiService.d.ts.map +1 -1
  77. package/dist/services/aiService.js +47 -7
  78. package/dist/services/configurationService.d.ts.map +1 -1
  79. package/dist/services/configurationService.js +30 -11
  80. package/dist/services/taskManager.d.ts +3 -1
  81. package/dist/services/taskManager.d.ts.map +1 -1
  82. package/dist/services/taskManager.js +3 -2
  83. package/dist/tools/bashTool.d.ts.map +1 -1
  84. package/dist/tools/bashTool.js +19 -4
  85. package/dist/tools/editTool.d.ts.map +1 -1
  86. package/dist/tools/editTool.js +16 -4
  87. package/dist/tools/readTool.d.ts.map +1 -1
  88. package/dist/tools/readTool.js +2 -2
  89. package/dist/tools/skillTool.d.ts +2 -4
  90. package/dist/tools/skillTool.d.ts.map +1 -1
  91. package/dist/tools/skillTool.js +61 -61
  92. package/dist/tools/taskOutputTool.d.ts.map +1 -1
  93. package/dist/tools/taskOutputTool.js +3 -2
  94. package/dist/tools/taskTool.d.ts +2 -4
  95. package/dist/tools/taskTool.d.ts.map +1 -1
  96. package/dist/tools/taskTool.js +192 -187
  97. package/dist/tools/types.d.ts +12 -1
  98. package/dist/tools/types.d.ts.map +1 -1
  99. package/dist/tools/writeTool.d.ts.map +1 -1
  100. package/dist/tools/writeTool.js +5 -2
  101. package/dist/types/core.d.ts +2 -0
  102. package/dist/types/core.d.ts.map +1 -1
  103. package/dist/types/marketplace.d.ts +8 -0
  104. package/dist/types/marketplace.d.ts.map +1 -1
  105. package/dist/types/messaging.d.ts +1 -0
  106. package/dist/types/messaging.d.ts.map +1 -1
  107. package/dist/types/permissions.d.ts +3 -1
  108. package/dist/types/permissions.d.ts.map +1 -1
  109. package/dist/types/permissions.js +1 -3
  110. package/dist/types/skills.d.ts +0 -2
  111. package/dist/types/skills.d.ts.map +1 -1
  112. package/dist/types/tools.d.ts +0 -15
  113. package/dist/types/tools.d.ts.map +1 -1
  114. package/dist/utils/container.d.ts +31 -0
  115. package/dist/utils/container.d.ts.map +1 -0
  116. package/dist/utils/container.js +79 -0
  117. package/dist/utils/containerSetup.d.ts +26 -0
  118. package/dist/utils/containerSetup.d.ts.map +1 -0
  119. package/dist/utils/containerSetup.js +187 -0
  120. package/dist/utils/editUtils.d.ts +0 -3
  121. package/dist/utils/editUtils.d.ts.map +1 -1
  122. package/dist/utils/editUtils.js +4 -3
  123. package/dist/utils/hookMatcher.d.ts +1 -1
  124. package/dist/utils/hookMatcher.d.ts.map +1 -1
  125. package/dist/utils/hookMatcher.js +2 -2
  126. package/dist/utils/messageOperations.d.ts +2 -1
  127. package/dist/utils/messageOperations.d.ts.map +1 -1
  128. package/dist/utils/messageOperations.js +4 -1
  129. package/dist/utils/openaiClient.js +2 -2
  130. package/dist/utils/stringUtils.d.ts +6 -0
  131. package/dist/utils/stringUtils.d.ts.map +1 -1
  132. package/dist/utils/stringUtils.js +8 -0
  133. package/package.json +1 -1
  134. package/src/agent.ts +60 -282
  135. package/src/constants/tools.ts +0 -2
  136. package/src/core/plugin.ts +224 -0
  137. package/src/core/session.ts +6 -0
  138. package/src/index.ts +2 -11
  139. package/src/managers/MemoryRuleManager.ts +6 -1
  140. package/src/managers/aiManager.ts +84 -58
  141. package/src/managers/backgroundTaskManager.ts +5 -1
  142. package/src/managers/bashManager.ts +9 -4
  143. package/src/managers/foregroundTaskManager.ts +3 -0
  144. package/src/managers/hookManager.ts +21 -23
  145. package/src/managers/liveConfigManager.ts +57 -53
  146. package/src/managers/lspManager.ts +14 -19
  147. package/src/managers/mcpManager.ts +20 -20
  148. package/src/managers/messageManager.ts +19 -12
  149. package/src/managers/permissionManager.ts +45 -70
  150. package/src/managers/planManager.ts +26 -7
  151. package/src/managers/pluginManager.ts +37 -33
  152. package/src/managers/reversionManager.ts +5 -3
  153. package/src/managers/skillManager.ts +19 -20
  154. package/src/managers/slashCommandManager.ts +30 -25
  155. package/src/managers/subagentManager.ts +53 -53
  156. package/src/managers/toolManager.ts +93 -90
  157. package/src/prompts/index.ts +13 -5
  158. package/src/services/MarketplaceService.ts +13 -0
  159. package/src/services/aiService.ts +61 -15
  160. package/src/services/configurationService.ts +34 -13
  161. package/src/services/taskManager.ts +6 -2
  162. package/src/tools/bashTool.ts +19 -4
  163. package/src/tools/editTool.ts +17 -4
  164. package/src/tools/readTool.ts +2 -2
  165. package/src/tools/skillTool.ts +75 -71
  166. package/src/tools/taskOutputTool.ts +3 -2
  167. package/src/tools/taskTool.ts +224 -225
  168. package/src/tools/types.ts +14 -1
  169. package/src/tools/writeTool.ts +5 -2
  170. package/src/types/core.ts +2 -0
  171. package/src/types/marketplace.ts +9 -0
  172. package/src/types/messaging.ts +1 -0
  173. package/src/types/permissions.ts +2 -4
  174. package/src/types/skills.ts +0 -3
  175. package/src/types/tools.ts +0 -17
  176. package/src/utils/container.ts +92 -0
  177. package/src/utils/containerSetup.ts +279 -0
  178. package/src/utils/editUtils.ts +4 -3
  179. package/src/utils/hookMatcher.ts +2 -2
  180. package/src/utils/messageOperations.ts +5 -0
  181. package/src/utils/openaiClient.ts +2 -2
  182. package/src/utils/stringUtils.ts +9 -0
  183. package/dist/tools/deleteFileTool.d.ts +0 -6
  184. package/dist/tools/deleteFileTool.d.ts.map +0 -1
  185. package/dist/tools/deleteFileTool.js +0 -100
  186. package/dist/tools/multiEditTool.d.ts +0 -6
  187. package/dist/tools/multiEditTool.d.ts.map +0 -1
  188. package/dist/tools/multiEditTool.js +0 -246
  189. package/src/tools/deleteFileTool.ts +0 -127
  190. package/src/tools/multiEditTool.ts +0 -306
@@ -0,0 +1,92 @@
1
+ /**
2
+ * A simple Dependency Injection container to manage late-binding dependencies
3
+ * and resolve circular references.
4
+ */
5
+ export class Container {
6
+ private services = new Map<string, unknown>();
7
+ private factories = new Map<string, () => unknown>();
8
+ private parent?: Container;
9
+
10
+ constructor(parent?: Container) {
11
+ this.parent = parent;
12
+ }
13
+
14
+ /**
15
+ * Create a child container that inherits from this container
16
+ */
17
+ createChild(): Container {
18
+ return new Container(this);
19
+ }
20
+
21
+ /**
22
+ * Register a singleton instance
23
+ */
24
+ register<T>(token: string, instance: T): void {
25
+ this.services.set(token, instance);
26
+ }
27
+
28
+ /**
29
+ * Register a factory function for lazy resolution
30
+ */
31
+ provide<T>(token: string, factory: () => T): void {
32
+ this.factories.set(token, factory);
33
+ }
34
+
35
+ /**
36
+ * Resolve a service by token
37
+ */
38
+ get<T>(token: string): T | undefined {
39
+ if (this.services.has(token)) {
40
+ return this.services.get(token) as T;
41
+ }
42
+
43
+ const factory = this.factories.get(token);
44
+ if (factory) {
45
+ const instance = factory() as T;
46
+ this.services.set(token, instance);
47
+ return instance;
48
+ }
49
+
50
+ if (this.parent) {
51
+ return this.parent.get<T>(token);
52
+ }
53
+
54
+ return undefined;
55
+ }
56
+
57
+ /**
58
+ * Check if a service exists
59
+ */
60
+ has(token: string): boolean {
61
+ return (
62
+ this.services.has(token) ||
63
+ this.factories.has(token) ||
64
+ (this.parent ? this.parent.has(token) : false)
65
+ );
66
+ }
67
+ }
68
+
69
+ // Example usage for ToolManager:
70
+ /*
71
+ const container = new Container();
72
+
73
+ // 1. Provide managers lazily
74
+ container.provide('SubagentManager', () => new SubagentManager(...));
75
+ container.provide('SkillManager', () => new SkillManager(...));
76
+
77
+ // 2. ToolManager can now resolve them only when needed (e.g., in execute)
78
+ class ToolManager {
79
+ constructor(private container: Container) {}
80
+
81
+ async execute(name: string, args: any, context: any) {
82
+ const enhancedContext = {
83
+ ...context,
84
+ subagentManager: this.container.has('SubagentManager')
85
+ ? this.container.get('SubagentManager')
86
+ : undefined,
87
+ // ...
88
+ };
89
+ // ...
90
+ }
91
+ }
92
+ */
@@ -0,0 +1,279 @@
1
+ import * as fs from "fs/promises";
2
+ import { Container } from "./container.js";
3
+ import { ForegroundTaskManager } from "../managers/foregroundTaskManager.js";
4
+ import { BackgroundTaskManager } from "../managers/backgroundTaskManager.js";
5
+ import { TaskManager } from "../services/taskManager.js";
6
+ import { MessageManager } from "../managers/messageManager.js";
7
+ import { AIManager } from "../managers/aiManager.js";
8
+ import { ToolManager } from "../managers/toolManager.js";
9
+ import { McpManager } from "../managers/mcpManager.js";
10
+ import { LspManager } from "../managers/lspManager.js";
11
+ import { PermissionManager } from "../managers/permissionManager.js";
12
+ import { PlanManager } from "../managers/planManager.js";
13
+ import { HookManager } from "../managers/hookManager.js";
14
+ import { SkillManager } from "../managers/skillManager.js";
15
+ import { SlashCommandManager } from "../managers/slashCommandManager.js";
16
+ import { PluginManager } from "../managers/pluginManager.js";
17
+ import { BashManager } from "../managers/bashManager.js";
18
+ import { MemoryRuleManager } from "../managers/MemoryRuleManager.js";
19
+ import { ReversionManager } from "../managers/reversionManager.js";
20
+ import { SubagentManager } from "../managers/subagentManager.js";
21
+ import { LiveConfigManager } from "../managers/liveConfigManager.js";
22
+ import { ConfigurationService } from "../services/configurationService.js";
23
+ import { ReversionService } from "../services/reversionService.js";
24
+ import type { AgentOptions } from "../agent.js";
25
+ import type {
26
+ PermissionMode,
27
+ Usage,
28
+ Task,
29
+ BackgroundTask,
30
+ ToolPermissionContext,
31
+ } from "../types/index.js";
32
+ import type { GatewayConfig, ModelConfig } from "../types/config.js";
33
+
34
+ import { logger } from "./globalLogger.js";
35
+
36
+ export interface AgentContainerSetupOptions {
37
+ options: AgentOptions;
38
+ workdir: string;
39
+ configurationService: ConfigurationService;
40
+ systemPrompt?: string;
41
+ stream: boolean;
42
+
43
+ // Callbacks to Agent methods
44
+ onSessionIdChange: (sessionId: string) => void;
45
+ onTasksChange: (tasks: BackgroundTask[]) => void;
46
+ onSessionTasksChange: (tasks: Task[]) => void;
47
+ onPermissionModeChange: (mode: PermissionMode) => void;
48
+ handlePlanModeTransition: (mode: PermissionMode) => void;
49
+ setPermissionMode: (mode: PermissionMode) => void;
50
+ addPermissionRule: (rule: string) => Promise<void>;
51
+ addUsage: (usage: Usage) => void;
52
+
53
+ // Getters
54
+ getGatewayConfig: () => GatewayConfig;
55
+ getModelConfig: () => ModelConfig;
56
+ getMaxInputTokens: () => number;
57
+ getLanguage: () => string | undefined;
58
+ }
59
+
60
+ export function setupAgentContainer(
61
+ setupOptions: AgentContainerSetupOptions,
62
+ ): Container {
63
+ const {
64
+ options,
65
+ workdir,
66
+ configurationService,
67
+ systemPrompt,
68
+ stream,
69
+ onSessionIdChange,
70
+ onTasksChange,
71
+ onSessionTasksChange,
72
+ onPermissionModeChange,
73
+ handlePlanModeTransition,
74
+ setPermissionMode,
75
+ addPermissionRule,
76
+ addUsage,
77
+ getGatewayConfig,
78
+ getModelConfig,
79
+ getMaxInputTokens,
80
+ getLanguage,
81
+ } = setupOptions;
82
+
83
+ const callbacks = options.callbacks || {};
84
+ const container = new Container();
85
+
86
+ const foregroundTaskManager = new ForegroundTaskManager(container);
87
+ container.register("ForegroundTaskManager", foregroundTaskManager);
88
+ container.register("ConfigurationService", configurationService);
89
+
90
+ const memoryRuleManager = new MemoryRuleManager(container, { workdir });
91
+ container.register("MemoryRuleManager", memoryRuleManager);
92
+
93
+ const messageManager = new MessageManager(container, {
94
+ callbacks: {
95
+ ...callbacks,
96
+ onSessionIdChange: (sessionId) => {
97
+ onSessionIdChange(sessionId);
98
+ callbacks.onSessionIdChange?.(sessionId);
99
+ },
100
+ },
101
+ workdir,
102
+ });
103
+ container.register("MessageManager", messageManager);
104
+
105
+ const resolvedTaskListId =
106
+ configurationService.getEnvironmentVars().WAVE_TASK_LIST_ID ||
107
+ process.env.WAVE_TASK_LIST_ID ||
108
+ messageManager.getRootSessionId();
109
+
110
+ const taskManager = new TaskManager(container, resolvedTaskListId);
111
+ container.register("TaskManager", taskManager);
112
+ taskManager.on("tasksChange", async () => {
113
+ const tasks = await taskManager.listTasks();
114
+ onSessionTasksChange(tasks);
115
+ });
116
+
117
+ const backgroundTaskManager = new BackgroundTaskManager(container, {
118
+ callbacks: {
119
+ ...callbacks,
120
+ onTasksChange: (tasks) => {
121
+ onTasksChange(tasks);
122
+ callbacks.onTasksChange?.(tasks);
123
+ },
124
+ },
125
+ workdir,
126
+ });
127
+ container.register("BackgroundTaskManager", backgroundTaskManager);
128
+
129
+ const mcpManager = new McpManager(container, { callbacks });
130
+ container.register("McpManager", mcpManager);
131
+
132
+ const lspManager = options.lspManager || new LspManager(container);
133
+ container.register("LspManager", lspManager);
134
+
135
+ const permissionManager = new PermissionManager(container, { workdir });
136
+ container.register("PermissionManager", permissionManager);
137
+ permissionManager.setOnConfiguredDefaultModeChange((mode) => {
138
+ handlePlanModeTransition(mode);
139
+ onPermissionModeChange(mode);
140
+ });
141
+
142
+ const planManager = new PlanManager(container);
143
+ container.register("PlanManager", planManager);
144
+
145
+ const hookManager = new HookManager(container, workdir);
146
+ container.register("HookManager", hookManager);
147
+
148
+ const skillManager = new SkillManager(container, { workdir });
149
+ container.register("SkillManager", skillManager);
150
+
151
+ container.register(
152
+ "ReversionService",
153
+ new ReversionService(messageManager.getTranscriptPath()),
154
+ );
155
+ const reversionManager = new ReversionManager(container);
156
+ container.register("ReversionManager", reversionManager);
157
+
158
+ const canUseToolWithNotification = options.canUseTool
159
+ ? async (context: ToolPermissionContext) => {
160
+ try {
161
+ const notificationMessage = `Claude needs your permission to use ${context.toolName}`;
162
+ await hookManager.executeHooks("Notification", {
163
+ event: "Notification",
164
+ projectDir: workdir,
165
+ timestamp: new Date(),
166
+ sessionId: messageManager.getSessionId(),
167
+ transcriptPath: messageManager.getTranscriptPath(),
168
+ cwd: workdir,
169
+ message: notificationMessage,
170
+ notificationType: "permission_prompt",
171
+ env: configurationService.getEnvironmentVars(),
172
+ });
173
+ } catch (error) {
174
+ logger.warn("Failed to execute notification hooks", {
175
+ toolName: context.toolName,
176
+ error: error instanceof Error ? error.message : String(error),
177
+ });
178
+ }
179
+
180
+ const decision = await options.canUseTool!(context);
181
+
182
+ const planFilePath = permissionManager.getPlanFilePath();
183
+
184
+ if (decision.newPermissionMode) {
185
+ setPermissionMode(decision.newPermissionMode);
186
+ }
187
+
188
+ if (decision.newPermissionRule) {
189
+ await addPermissionRule(decision.newPermissionRule);
190
+ }
191
+
192
+ if (decision.clearContext) {
193
+ messageManager.clearMessages();
194
+ if (planFilePath) {
195
+ try {
196
+ const planContent = await fs.readFile(planFilePath, "utf-8");
197
+ messageManager.addUserMessage({
198
+ content: `Implement the following plan:\n\n${planContent}`,
199
+ });
200
+ } catch (error) {
201
+ logger.warn("Failed to read plan file for context clearing", {
202
+ planFilePath,
203
+ error: error instanceof Error ? error.message : String(error),
204
+ });
205
+ }
206
+ }
207
+ }
208
+
209
+ return decision;
210
+ }
211
+ : undefined;
212
+
213
+ const toolManager = new ToolManager({
214
+ container,
215
+ tools: options.tools,
216
+ });
217
+ container.register("ToolManager", toolManager);
218
+
219
+ container.register("PermissionMode", options.permissionMode);
220
+ logger.info("Registering CanUseToolCallback", {
221
+ hasCallback: !!canUseToolWithNotification,
222
+ });
223
+ container.register("CanUseToolCallback", canUseToolWithNotification);
224
+
225
+ const liveConfigManager = new LiveConfigManager(container, { workdir });
226
+ container.register("LiveConfigManager", liveConfigManager);
227
+
228
+ const subagentManager = new SubagentManager(container, {
229
+ workdir,
230
+ callbacks: {
231
+ onSubagentUserMessageAdded: callbacks.onSubagentUserMessageAdded,
232
+ onSubagentAssistantMessageAdded:
233
+ callbacks.onSubagentAssistantMessageAdded,
234
+ onSubagentAssistantContentUpdated:
235
+ callbacks.onSubagentAssistantContentUpdated,
236
+ onSubagentAssistantReasoningUpdated:
237
+ callbacks.onSubagentAssistantReasoningUpdated,
238
+ onSubagentToolBlockUpdated: callbacks.onSubagentToolBlockUpdated,
239
+ onSubagentMessagesChange: callbacks.onSubagentMessagesChange,
240
+ onSubagentLatestTotalTokensChange:
241
+ callbacks.onSubagentLatestTotalTokensChange,
242
+ },
243
+ getGatewayConfig,
244
+ getModelConfig,
245
+ getMaxInputTokens,
246
+ getLanguage,
247
+ getEnvironmentVars: () => configurationService.getEnvironmentVars(),
248
+ onUsageAdded: (usage: Usage) => addUsage(usage),
249
+ });
250
+ container.register("SubagentManager", subagentManager);
251
+
252
+ const aiManager = new AIManager(container, {
253
+ callbacks: {
254
+ ...callbacks,
255
+ onUsageAdded: (usage: Usage) => addUsage(usage),
256
+ },
257
+ workdir,
258
+ systemPrompt,
259
+ stream,
260
+ getGatewayConfig,
261
+ getModelConfig,
262
+ getMaxInputTokens,
263
+ getLanguage,
264
+ getEnvironmentVars: () => configurationService.getEnvironmentVars(),
265
+ });
266
+ container.register("AIManager", aiManager);
267
+
268
+ const slashCommandManager = new SlashCommandManager(container, { workdir });
269
+ container.register("SlashCommandManager", slashCommandManager);
270
+ slashCommandManager.initialize();
271
+
272
+ const pluginManager = new PluginManager(container, { workdir });
273
+ container.register("PluginManager", pluginManager);
274
+
275
+ const bashManager = new BashManager(container, { workdir });
276
+ container.register("BashManager", bashManager);
277
+
278
+ return container;
279
+ }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Utility functions for file editing tools
3
3
  */
4
+ import { formatLineNumberPrefix } from "./stringUtils.js";
4
5
 
5
6
  /**
6
7
  * Escape regular expression special characters
@@ -75,10 +76,10 @@ export function analyzeEditMismatch(
75
76
  const expectedLine = searchLines[j];
76
77
 
77
78
  if (actualLine === expectedLine) {
78
- reportLines.push(`${lineNum.toString().padStart(4)} | ${actualLine}`);
79
+ reportLines.push(`${formatLineNumberPrefix(lineNum)}${actualLine}`);
79
80
  } else {
80
- reportLines.push(`${lineNum.toString().padStart(4)} | - ${expectedLine}`);
81
- reportLines.push(`${lineNum.toString().padStart(4)} | + ${actualLine}`);
81
+ reportLines.push(`${formatLineNumberPrefix(lineNum)}- ${expectedLine}`);
82
+ reportLines.push(`${formatLineNumberPrefix(lineNum)}+ ${actualLine}`);
82
83
  }
83
84
  }
84
85
 
@@ -131,8 +131,8 @@ export class HookMatcher {
131
131
  * Get all tool names that would match this pattern from a given list
132
132
  * Useful for testing and validation
133
133
  */
134
- getMatches(pattern: string, toolNames: string[]): string[] {
135
- return toolNames.filter((toolName) => this.matches(pattern, toolName));
134
+ getMatches(pattern: string, tools: string[]): string[] {
135
+ return tools.filter((toolName) => this.matches(pattern, toolName));
136
136
  }
137
137
 
138
138
  /**
@@ -35,6 +35,7 @@ export interface UpdateToolBlockParams {
35
35
  stage: "start" | "streaming" | "running" | "end";
36
36
  name?: string;
37
37
  shortResult?: string;
38
+ startLineNumber?: number;
38
39
  images?: Array<{ data: string; mediaType?: string }>;
39
40
  compactParams?: string;
40
41
  parametersChunk?: string; // Incremental parameter updates for streaming
@@ -198,6 +199,7 @@ export const updateToolBlockInMessage = ({
198
199
  stage,
199
200
  name,
200
201
  shortResult,
202
+ startLineNumber,
201
203
  images,
202
204
  compactParams,
203
205
  parametersChunk,
@@ -217,6 +219,8 @@ export const updateToolBlockInMessage = ({
217
219
  toolBlock.parameters = parameters;
218
220
  if (result !== undefined) toolBlock.result = result;
219
221
  if (shortResult !== undefined) toolBlock.shortResult = shortResult;
222
+ if (startLineNumber !== undefined)
223
+ toolBlock.startLineNumber = startLineNumber;
220
224
  toolBlock.images = images; // Add image data update
221
225
  if (success !== undefined) toolBlock.success = success;
222
226
  if (error !== undefined) toolBlock.error = error;
@@ -236,6 +240,7 @@ export const updateToolBlockInMessage = ({
236
240
  parameters: parameters,
237
241
  result: result || "",
238
242
  shortResult: shortResult,
243
+ startLineNumber: startLineNumber,
239
244
  images: images, // Add image data
240
245
  id: id,
241
246
  name: name || "unknown",
@@ -86,8 +86,8 @@ export class OpenAIClient {
86
86
 
87
87
  const fetchFn = (customFetch as typeof fetch) || fetch;
88
88
  let lastError: (Error & { status?: number; body?: unknown }) | undefined;
89
- const maxRetries = 3;
90
- const initialDelay = 1000;
89
+ const maxRetries = 5;
90
+ const initialDelay = 2000;
91
91
 
92
92
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
93
93
  if (attempt > 0) {
@@ -82,3 +82,12 @@ export const stripAnsiColors = (text: string): string => {
82
82
  const ansiEscapeRegex = new RegExp(`${escapeChar}\\[[0-9;]*[a-zA-Z]`, "g");
83
83
  return text.replace(ansiEscapeRegex, "");
84
84
  };
85
+
86
+ /**
87
+ * Format a line number prefix in cat -n style (padStart(6) + tab)
88
+ * @param lineNumber The line number
89
+ * @returns Formatted line number prefix
90
+ */
91
+ export function formatLineNumberPrefix(lineNumber: number): string {
92
+ return `${lineNumber.toString().padStart(6)}\t`;
93
+ }
@@ -1,6 +0,0 @@
1
- import type { ToolPlugin } from "./types.js";
2
- /**
3
- * Delete file tool plugin
4
- */
5
- export declare const deleteFileTool: ToolPlugin;
6
- //# sourceMappingURL=deleteFileTool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deleteFileTool.d.ts","sourceRoot":"","sources":["../../src/tools/deleteFileTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,UAqH5B,CAAC"}
@@ -1,100 +0,0 @@
1
- import { unlink } from "fs/promises";
2
- import { logger } from "../utils/globalLogger.js";
3
- import { resolvePath, getDisplayPath } from "../utils/path.js";
4
- import { DELETE_FILE_TOOL_NAME } from "../constants/tools.js";
5
- /**
6
- * Delete file tool plugin
7
- */
8
- export const deleteFileTool = {
9
- name: DELETE_FILE_TOOL_NAME,
10
- config: {
11
- type: "function",
12
- function: {
13
- name: DELETE_FILE_TOOL_NAME,
14
- description: `Deletes a file at the specified path. The operation will fail gracefully if:
15
- - The file doesn't exist
16
- - The operation is rejected for security reasons
17
- - The file cannot be deleted`,
18
- parameters: {
19
- type: "object",
20
- properties: {
21
- target_file: {
22
- type: "string",
23
- description: "The path of the file to delete, relative to the workspace root.",
24
- },
25
- },
26
- required: ["target_file"],
27
- },
28
- },
29
- },
30
- execute: async (args, context) => {
31
- const targetFile = args.target_file;
32
- if (!targetFile || typeof targetFile !== "string") {
33
- return {
34
- success: false,
35
- content: "",
36
- error: "target_file parameter is required and must be a string",
37
- };
38
- }
39
- try {
40
- const filePath = resolvePath(targetFile, context.workdir);
41
- // Permission check after validation but before real operation
42
- // Permission check after validation but before real operation
43
- if (context.permissionManager) {
44
- try {
45
- const permissionContext = context.permissionManager.createContext(DELETE_FILE_TOOL_NAME, context.permissionMode || "default", context.canUseToolCallback, { target_file: targetFile });
46
- const permissionResult = await context.permissionManager.checkPermission(permissionContext);
47
- if (permissionResult.behavior === "deny") {
48
- return {
49
- success: false,
50
- content: "",
51
- error: `${DELETE_FILE_TOOL_NAME} operation denied, reason: ${permissionResult.message || "No reason provided"}`,
52
- };
53
- }
54
- }
55
- catch {
56
- return {
57
- success: false,
58
- content: "",
59
- error: "Permission check failed",
60
- };
61
- }
62
- }
63
- // Record snapshot for reversion
64
- let snapshotId;
65
- if (context.reversionManager && context.messageId) {
66
- snapshotId = await context.reversionManager.recordSnapshot(context.messageId, filePath, "delete");
67
- }
68
- // Delete file
69
- await unlink(filePath);
70
- // Commit snapshot on success
71
- if (context.reversionManager && snapshotId) {
72
- await context.reversionManager.commitSnapshot(snapshotId);
73
- }
74
- logger.debug(`Successfully deleted file: ${filePath}`);
75
- return {
76
- success: true,
77
- content: `Successfully deleted file: ${targetFile}`,
78
- shortResult: "File deleted",
79
- };
80
- }
81
- catch (error) {
82
- if (error.code === "ENOENT") {
83
- return {
84
- success: false,
85
- content: "",
86
- error: `File does not exist: ${targetFile}`,
87
- };
88
- }
89
- return {
90
- success: false,
91
- content: "",
92
- error: error instanceof Error ? error.message : String(error),
93
- };
94
- }
95
- },
96
- formatCompactParams: (params, context) => {
97
- const targetFile = params.target_file;
98
- return getDisplayPath(targetFile || "", context.workdir);
99
- },
100
- };
@@ -1,6 +0,0 @@
1
- import type { ToolPlugin } from "./types.js";
2
- /**
3
- * Multi-edit tool plugin
4
- */
5
- export declare const multiEditTool: ToolPlugin;
6
- //# sourceMappingURL=multiEditTool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiEditTool.d.ts","sourceRoot":"","sources":["../../src/tools/multiEditTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AA6BtE;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UA+Q3B,CAAC"}