@theia/ai-claude-code 1.75.0-next.3 → 1.75.0-next.34

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 (70) hide show
  1. package/lib/browser/claude-code-chat-agent.js +1 -1
  2. package/lib/browser/claude-code-chat-agent.js.map +1 -1
  3. package/lib/browser/claude-code-edit-tool-service.js +1 -1
  4. package/lib/browser/claude-code-edit-tool-service.js.map +1 -1
  5. package/lib/browser/claude-code-file-edit-backup-service.js +1 -1
  6. package/lib/browser/claude-code-file-edit-backup-service.js.map +1 -1
  7. package/lib/browser/claude-code-frontend-service.d.ts +1 -1
  8. package/lib/browser/claude-code-frontend-service.d.ts.map +1 -1
  9. package/lib/browser/claude-code-frontend-service.js +1 -0
  10. package/lib/browser/claude-code-frontend-service.js.map +1 -1
  11. package/lib/browser/claude-code-slash-commands-contribution.js +1 -1
  12. package/lib/browser/claude-code-slash-commands-contribution.js.map +1 -1
  13. package/lib/browser/renderers/bash-tool-renderer.d.ts +2 -0
  14. package/lib/browser/renderers/bash-tool-renderer.d.ts.map +1 -1
  15. package/lib/browser/renderers/bash-tool-renderer.js +6 -1
  16. package/lib/browser/renderers/bash-tool-renderer.js.map +1 -1
  17. package/lib/browser/renderers/edit-tool-renderer.d.ts +2 -0
  18. package/lib/browser/renderers/edit-tool-renderer.d.ts.map +1 -1
  19. package/lib/browser/renderers/edit-tool-renderer.js +9 -4
  20. package/lib/browser/renderers/edit-tool-renderer.js.map +1 -1
  21. package/lib/browser/renderers/glob-tool-renderer.d.ts +2 -0
  22. package/lib/browser/renderers/glob-tool-renderer.d.ts.map +1 -1
  23. package/lib/browser/renderers/glob-tool-renderer.js +6 -1
  24. package/lib/browser/renderers/glob-tool-renderer.js.map +1 -1
  25. package/lib/browser/renderers/grep-tool-renderer.d.ts +2 -0
  26. package/lib/browser/renderers/grep-tool-renderer.d.ts.map +1 -1
  27. package/lib/browser/renderers/grep-tool-renderer.js +6 -1
  28. package/lib/browser/renderers/grep-tool-renderer.js.map +1 -1
  29. package/lib/browser/renderers/ls-tool-renderer.d.ts.map +1 -1
  30. package/lib/browser/renderers/ls-tool-renderer.js +3 -3
  31. package/lib/browser/renderers/ls-tool-renderer.js.map +1 -1
  32. package/lib/browser/renderers/multiedit-tool-renderer.d.ts.map +1 -1
  33. package/lib/browser/renderers/multiedit-tool-renderer.js +3 -3
  34. package/lib/browser/renderers/multiedit-tool-renderer.js.map +1 -1
  35. package/lib/browser/renderers/read-tool-renderer.d.ts +2 -0
  36. package/lib/browser/renderers/read-tool-renderer.d.ts.map +1 -1
  37. package/lib/browser/renderers/read-tool-renderer.js +9 -4
  38. package/lib/browser/renderers/read-tool-renderer.js.map +1 -1
  39. package/lib/browser/renderers/todo-write-renderer.d.ts +2 -0
  40. package/lib/browser/renderers/todo-write-renderer.d.ts.map +1 -1
  41. package/lib/browser/renderers/todo-write-renderer.js +6 -1
  42. package/lib/browser/renderers/todo-write-renderer.js.map +1 -1
  43. package/lib/browser/renderers/web-fetch-tool-renderer.d.ts +2 -0
  44. package/lib/browser/renderers/web-fetch-tool-renderer.d.ts.map +1 -1
  45. package/lib/browser/renderers/web-fetch-tool-renderer.js +6 -1
  46. package/lib/browser/renderers/web-fetch-tool-renderer.js.map +1 -1
  47. package/lib/browser/renderers/write-tool-renderer.d.ts.map +1 -1
  48. package/lib/browser/renderers/write-tool-renderer.js +3 -3
  49. package/lib/browser/renderers/write-tool-renderer.js.map +1 -1
  50. package/lib/node/claude-code-service-impl.d.ts +2 -1
  51. package/lib/node/claude-code-service-impl.d.ts.map +1 -1
  52. package/lib/node/claude-code-service-impl.js +1 -1
  53. package/lib/node/claude-code-service-impl.js.map +1 -1
  54. package/package.json +10 -10
  55. package/src/browser/claude-code-chat-agent.ts +1 -1
  56. package/src/browser/claude-code-edit-tool-service.ts +1 -1
  57. package/src/browser/claude-code-file-edit-backup-service.ts +1 -1
  58. package/src/browser/claude-code-frontend-service.ts +3 -3
  59. package/src/browser/claude-code-slash-commands-contribution.ts +1 -1
  60. package/src/browser/renderers/bash-tool-renderer.tsx +6 -3
  61. package/src/browser/renderers/edit-tool-renderer.tsx +10 -5
  62. package/src/browser/renderers/glob-tool-renderer.tsx +6 -3
  63. package/src/browser/renderers/grep-tool-renderer.tsx +6 -3
  64. package/src/browser/renderers/ls-tool-renderer.tsx +4 -2
  65. package/src/browser/renderers/multiedit-tool-renderer.tsx +4 -2
  66. package/src/browser/renderers/read-tool-renderer.tsx +10 -5
  67. package/src/browser/renderers/todo-write-renderer.tsx +6 -3
  68. package/src/browser/renderers/web-fetch-tool-renderer.tsx +6 -3
  69. package/src/browser/renderers/write-tool-renderer.tsx +4 -2
  70. package/src/node/claude-code-service-impl.ts +2 -2
@@ -19,14 +19,14 @@ import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { LabelProvider } from '@theia/core/lib/browser';
21
21
  import { URI } from '@theia/core/lib/common/uri';
22
- import { inject, injectable } from '@theia/core/shared/inversify';
22
+ import { inject, injectable, named } from '@theia/core/shared/inversify';
23
23
  import * as React from '@theia/core/shared/react';
24
24
  import { ReactNode } from '@theia/core/shared/react';
25
25
  import { EditorManager } from '@theia/editor/lib/browser';
26
26
  import { WorkspaceService } from '@theia/workspace/lib/browser';
27
27
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
28
28
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
29
- import { nls } from '@theia/core';
29
+ import { nls, ILogger } from '@theia/core';
30
30
 
31
31
  interface EditToolInput {
32
32
  file_path: string;
@@ -47,6 +47,9 @@ export class EditToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
47
47
  @inject(EditorManager)
48
48
  protected readonly editorManager: EditorManager;
49
49
 
50
+ @inject(ILogger) @named('ai-claude-code:EditToolRenderer')
51
+ protected readonly logger: ILogger;
52
+
50
53
  canHandle(response: ChatResponseContent): number {
51
54
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'Edit') {
52
55
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -62,9 +65,10 @@ export class EditToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
62
65
  workspaceService={this.workspaceService}
63
66
  labelProvider={this.labelProvider}
64
67
  editorManager={this.editorManager}
68
+ logger={this.logger}
65
69
  />;
66
70
  } catch (error) {
67
- console.warn('Failed to parse Edit tool input:', error);
71
+ this.logger.warn('Failed to parse Edit tool input:', error);
68
72
  return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseEditToolData', 'Failed to parse Edit tool data')}</div>;
69
73
  }
70
74
  }
@@ -75,7 +79,8 @@ const EditToolComponent: React.FC<{
75
79
  workspaceService: WorkspaceService;
76
80
  labelProvider: LabelProvider;
77
81
  editorManager: EditorManager;
78
- }> = ({ input, workspaceService, labelProvider, editorManager }) => {
82
+ logger: ILogger;
83
+ }> = ({ input, workspaceService, labelProvider, editorManager, logger }) => {
79
84
  const getFileName = (filePath: string): string => filePath.split('/').pop() || filePath;
80
85
  const getWorkspaceRelativePath = async (filePath: string): Promise<string> => {
81
86
  try {
@@ -101,7 +106,7 @@ const EditToolComponent: React.FC<{
101
106
  const uri = new URI(input.file_path);
102
107
  await editorManager.open(uri);
103
108
  } catch (error) {
104
- console.error('Failed to open file:', error);
109
+ logger.error('Failed to open file:', error);
105
110
  }
106
111
  };
107
112
 
@@ -19,13 +19,13 @@ import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { codicon, LabelProvider } from '@theia/core/lib/browser';
21
21
  import { URI } from '@theia/core/lib/common/uri';
22
- import { inject, injectable } from '@theia/core/shared/inversify';
22
+ import { inject, injectable, named } from '@theia/core/shared/inversify';
23
23
  import * as React from '@theia/core/shared/react';
24
24
  import { ReactNode } from '@theia/core/shared/react';
25
25
  import { WorkspaceService } from '@theia/workspace/lib/browser';
26
26
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
27
27
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
28
- import { nls } from '@theia/core';
28
+ import { nls, ILogger } from '@theia/core';
29
29
 
30
30
  interface GlobToolInput {
31
31
  pattern: string;
@@ -41,6 +41,9 @@ export class GlobToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
41
41
  @inject(LabelProvider)
42
42
  protected readonly labelProvider: LabelProvider;
43
43
 
44
+ @inject(ILogger) @named('ai-claude-code:GlobToolRenderer')
45
+ protected readonly logger: ILogger;
46
+
44
47
  canHandle(response: ChatResponseContent): number {
45
48
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'Glob') {
46
49
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -57,7 +60,7 @@ export class GlobToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
57
60
  labelProvider={this.labelProvider}
58
61
  />;
59
62
  } catch (error) {
60
- console.warn('Failed to parse Glob tool input:', error);
63
+ this.logger.warn('Failed to parse Glob tool input:', error);
61
64
  return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseGlobToolData', 'Failed to parse Glob tool data')}</div>;
62
65
  }
63
66
  }
@@ -19,13 +19,13 @@ import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { codicon, LabelProvider } from '@theia/core/lib/browser';
21
21
  import { URI } from '@theia/core/lib/common/uri';
22
- import { inject, injectable } from '@theia/core/shared/inversify';
22
+ import { inject, injectable, named } from '@theia/core/shared/inversify';
23
23
  import * as React from '@theia/core/shared/react';
24
24
  import { ReactNode } from '@theia/core/shared/react';
25
25
  import { WorkspaceService } from '@theia/workspace/lib/browser';
26
26
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
27
27
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
28
- import { nls } from '@theia/core';
28
+ import { nls, ILogger } from '@theia/core';
29
29
 
30
30
  interface GrepToolInput {
31
31
  pattern: string;
@@ -57,6 +57,9 @@ export class GrepToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
57
57
  @inject(LabelProvider)
58
58
  protected readonly labelProvider: LabelProvider;
59
59
 
60
+ @inject(ILogger) @named('ai-claude-code:GrepToolRenderer')
61
+ protected readonly logger: ILogger;
62
+
60
63
  canHandle(response: ChatResponseContent): number {
61
64
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'Grep') {
62
65
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -73,7 +76,7 @@ export class GrepToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
73
76
  labelProvider={this.labelProvider}
74
77
  />;
75
78
  } catch (error) {
76
- console.warn('Failed to parse Grep tool input:', error);
79
+ this.logger.warn('Failed to parse Grep tool input:', error);
77
80
  return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseGrepToolData', 'Failed to parse Grep tool data')}</div>;
78
81
  }
79
82
  }
@@ -63,6 +63,7 @@ export class LSToolRenderer implements ChatResponsePartRenderer<ToolCallChatResp
63
63
  workspaceService={this.workspaceService}
64
64
  labelProvider={this.labelProvider}
65
65
  editorManager={this.editorManager}
66
+ logger={this.logger}
66
67
  />;
67
68
  } catch (error) {
68
69
  this.logger.warn('Failed to parse LS tool input:', error);
@@ -76,7 +77,8 @@ const LSToolComponent: React.FC<{
76
77
  workspaceService: WorkspaceService;
77
78
  labelProvider: LabelProvider;
78
79
  editorManager: EditorManager;
79
- }> = ({ input, workspaceService, labelProvider, editorManager }) => {
80
+ logger: ILogger;
81
+ }> = ({ input, workspaceService, labelProvider, editorManager, logger }) => {
80
82
  const getDirectoryName = (dirPath: string): string => dirPath.split('/').pop() || dirPath;
81
83
  const getWorkspaceRelativePath = async (dirPath: string): Promise<string> => {
82
84
  try {
@@ -94,7 +96,7 @@ const LSToolComponent: React.FC<{
94
96
  // Note: This might need to be adjusted based on how directories are opened in Theia
95
97
  await editorManager.open(uri);
96
98
  } catch (error) {
97
- console.error('Failed to open directory:', error);
99
+ logger.error('Failed to open directory:', error);
98
100
  }
99
101
  };
100
102
 
@@ -69,6 +69,7 @@ export class MultiEditToolRenderer implements ChatResponsePartRenderer<ToolCallC
69
69
  workspaceService={this.workspaceService}
70
70
  labelProvider={this.labelProvider}
71
71
  editorManager={this.editorManager}
72
+ logger={this.logger}
72
73
  />;
73
74
  } catch (error) {
74
75
  this.logger.warn('Failed to parse MultiEdit tool input:', error);
@@ -82,7 +83,8 @@ const MultiEditToolComponent: React.FC<{
82
83
  workspaceService: WorkspaceService;
83
84
  labelProvider: LabelProvider;
84
85
  editorManager: EditorManager;
85
- }> = ({ input, workspaceService, labelProvider, editorManager }) => {
86
+ logger: ILogger;
87
+ }> = ({ input, workspaceService, labelProvider, editorManager, logger }) => {
86
88
  const getFileName = (filePath: string): string => filePath.split('/').pop() || filePath;
87
89
  const getWorkspaceRelativePath = async (filePath: string): Promise<string> => {
88
90
  try {
@@ -108,7 +110,7 @@ const MultiEditToolComponent: React.FC<{
108
110
  const uri = new URI(input.file_path);
109
111
  await editorManager.open(uri);
110
112
  } catch (error) {
111
- console.error('Failed to open file:', error);
113
+ logger.error('Failed to open file:', error);
112
114
  }
113
115
  };
114
116
 
@@ -19,14 +19,14 @@ import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { LabelProvider } from '@theia/core/lib/browser';
21
21
  import { URI } from '@theia/core/lib/common/uri';
22
- import { inject, injectable } from '@theia/core/shared/inversify';
22
+ import { inject, injectable, named } from '@theia/core/shared/inversify';
23
23
  import * as React from '@theia/core/shared/react';
24
24
  import { ReactNode } from '@theia/core/shared/react';
25
25
  import { EditorManager } from '@theia/editor/lib/browser';
26
26
  import { WorkspaceService } from '@theia/workspace/lib/browser';
27
27
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
28
28
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
29
- import { nls } from '@theia/core';
29
+ import { nls, ILogger } from '@theia/core';
30
30
 
31
31
  interface ReadToolInput {
32
32
  file_path: string;
@@ -46,6 +46,9 @@ export class ReadToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
46
46
  @inject(EditorManager)
47
47
  protected readonly editorManager: EditorManager;
48
48
 
49
+ @inject(ILogger) @named('ai-claude-code:ReadToolRenderer')
50
+ protected readonly logger: ILogger;
51
+
49
52
  canHandle(response: ChatResponseContent): number {
50
53
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'Read') {
51
54
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -61,9 +64,10 @@ export class ReadToolRenderer implements ChatResponsePartRenderer<ToolCallChatRe
61
64
  workspaceService={this.workspaceService}
62
65
  labelProvider={this.labelProvider}
63
66
  editorManager={this.editorManager}
67
+ logger={this.logger}
64
68
  />;
65
69
  } catch (error) {
66
- console.warn('Failed to parse Read tool input:', error);
70
+ this.logger.warn('Failed to parse Read tool input:', error);
67
71
  return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseReadToolData', 'Failed to parse Read tool data')}</div>;
68
72
  }
69
73
  }
@@ -74,7 +78,8 @@ const ReadToolComponent: React.FC<{
74
78
  workspaceService: WorkspaceService;
75
79
  labelProvider: LabelProvider;
76
80
  editorManager: EditorManager;
77
- }> = ({ input, workspaceService, labelProvider, editorManager }) => {
81
+ logger: ILogger;
82
+ }> = ({ input, workspaceService, labelProvider, editorManager, logger }) => {
78
83
  const getFileName = (filePath: string): string => filePath.split('/').pop() || filePath;
79
84
  const getWorkspaceRelativePath = async (filePath: string): Promise<string> => {
80
85
  try {
@@ -100,7 +105,7 @@ const ReadToolComponent: React.FC<{
100
105
  const uri = new URI(input.file_path);
101
106
  await editorManager.open(uri);
102
107
  } catch (error) {
103
- console.error('Failed to open file:', error);
108
+ logger.error('Failed to open file:', error);
104
109
  }
105
110
  };
106
111
 
@@ -18,12 +18,12 @@ import { ChatResponsePartRenderer } from '@theia/ai-chat-ui/lib/browser/chat-res
18
18
  import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { codicon } from '@theia/core/lib/browser';
21
- import { injectable } from '@theia/core/shared/inversify';
21
+ import { injectable, inject, named } from '@theia/core/shared/inversify';
22
22
  import * as React from '@theia/core/shared/react';
23
23
  import { ReactNode } from '@theia/core/shared/react';
24
24
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
25
25
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
26
- import { nls } from '@theia/core';
26
+ import { nls, ILogger } from '@theia/core';
27
27
 
28
28
  interface TodoItem {
29
29
  id: string;
@@ -77,6 +77,9 @@ class TodoWriteRegistry {
77
77
  @injectable()
78
78
  export class TodoWriteRenderer implements ChatResponsePartRenderer<ToolCallChatResponseContent> {
79
79
 
80
+ @inject(ILogger) @named('ai-claude-code:TodoWriteRenderer')
81
+ protected readonly logger: ILogger;
82
+
80
83
  canHandle(response: ChatResponseContent): number {
81
84
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'TodoWrite') {
82
85
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -89,7 +92,7 @@ export class TodoWriteRenderer implements ChatResponsePartRenderer<ToolCallChatR
89
92
  const input = JSON.parse(response.arguments || '{}') as TodoWriteInput;
90
93
  return <TodoListComponent todos={input.todos || []} sessionId={parentNode.sessionId} />;
91
94
  } catch (error) {
92
- console.warn('Failed to parse TodoWrite input:', error);
95
+ this.logger.warn('Failed to parse TodoWrite input:', error);
93
96
  return <div className="claude-code-tool todo-list-error">{nls.localize('theia/ai/claude-code/failedToParseTodoListData', 'Failed to parse todo list data')}</div>;
94
97
  }
95
98
  }
@@ -18,12 +18,12 @@ import { ChatResponsePartRenderer } from '@theia/ai-chat-ui/lib/browser/chat-res
18
18
  import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
19
  import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
20
  import { codicon } from '@theia/core/lib/browser';
21
- import { injectable } from '@theia/core/shared/inversify';
21
+ import { injectable, inject, named } from '@theia/core/shared/inversify';
22
22
  import * as React from '@theia/core/shared/react';
23
23
  import { ReactNode } from '@theia/core/shared/react';
24
24
  import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
25
25
  import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
26
- import { nls } from '@theia/core';
26
+ import { nls, ILogger } from '@theia/core';
27
27
 
28
28
  interface WebFetchToolInput {
29
29
  url: string;
@@ -33,6 +33,9 @@ interface WebFetchToolInput {
33
33
  @injectable()
34
34
  export class WebFetchToolRenderer implements ChatResponsePartRenderer<ToolCallChatResponseContent> {
35
35
 
36
+ @inject(ILogger) @named('ai-claude-code:WebFetchToolRenderer')
37
+ protected readonly logger: ILogger;
38
+
36
39
  canHandle(response: ChatResponseContent): number {
37
40
  if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'WebFetch') {
38
41
  return 15; // Higher than default ToolCallPartRenderer (10)
@@ -45,7 +48,7 @@ export class WebFetchToolRenderer implements ChatResponsePartRenderer<ToolCallCh
45
48
  const input = JSON.parse(response.arguments || '{}') as WebFetchToolInput;
46
49
  return <WebFetchToolComponent input={input} />;
47
50
  } catch (error) {
48
- console.warn('Failed to parse WebFetch tool input:', error);
51
+ this.logger.warn('Failed to parse WebFetch tool input:', error);
49
52
  return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseWebFetchToolData', 'Failed to parse WebFetch tool data')}</div>;
50
53
  }
51
54
  }
@@ -63,6 +63,7 @@ export class WriteToolRenderer implements ChatResponsePartRenderer<ToolCallChatR
63
63
  workspaceService={this.workspaceService}
64
64
  labelProvider={this.labelProvider}
65
65
  editorManager={this.editorManager}
66
+ logger={this.logger}
66
67
  />;
67
68
  } catch (error) {
68
69
  this.logger.warn('Failed to parse Write tool input:', error);
@@ -76,7 +77,8 @@ const WriteToolComponent: React.FC<{
76
77
  workspaceService: WorkspaceService;
77
78
  labelProvider: LabelProvider;
78
79
  editorManager: EditorManager;
79
- }> = ({ input, workspaceService, labelProvider, editorManager }) => {
80
+ logger: ILogger;
81
+ }> = ({ input, workspaceService, labelProvider, editorManager, logger }) => {
80
82
  const getFileName = (filePath: string): string => filePath.split('/').pop() || filePath;
81
83
 
82
84
  const getWorkspaceRelativePath = async (filePath: string): Promise<string> => {
@@ -94,7 +96,7 @@ const WriteToolComponent: React.FC<{
94
96
  const uri = new URI(input.file_path);
95
97
  await editorManager.open(uri);
96
98
  } catch (error) {
97
- console.error('Failed to open file:', error);
99
+ logger.error('Failed to open file:', error);
98
100
  }
99
101
  };
100
102
 
@@ -37,8 +37,8 @@ interface ToolApprovalResult {
37
37
  @injectable()
38
38
  export class ClaudeCodeServiceImpl implements ClaudeCodeService {
39
39
 
40
- @inject(ILogger) @named('ClaudeCode')
41
- private logger: ILogger;
40
+ @inject(ILogger) @named('ai-claude-code:ClaudeCodeServiceImpl')
41
+ protected readonly logger: ILogger;
42
42
 
43
43
  private client: ClaudeCodeClient;
44
44
  private abortControllers = new Map<string, AbortController>();