@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.
- package/lib/browser/claude-code-chat-agent.js +1 -1
- package/lib/browser/claude-code-chat-agent.js.map +1 -1
- package/lib/browser/claude-code-edit-tool-service.js +1 -1
- package/lib/browser/claude-code-edit-tool-service.js.map +1 -1
- package/lib/browser/claude-code-file-edit-backup-service.js +1 -1
- package/lib/browser/claude-code-file-edit-backup-service.js.map +1 -1
- package/lib/browser/claude-code-frontend-service.d.ts +1 -1
- package/lib/browser/claude-code-frontend-service.d.ts.map +1 -1
- package/lib/browser/claude-code-frontend-service.js +1 -0
- package/lib/browser/claude-code-frontend-service.js.map +1 -1
- package/lib/browser/claude-code-slash-commands-contribution.js +1 -1
- package/lib/browser/claude-code-slash-commands-contribution.js.map +1 -1
- package/lib/browser/renderers/bash-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/bash-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/bash-tool-renderer.js +6 -1
- package/lib/browser/renderers/bash-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/edit-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/edit-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/edit-tool-renderer.js +9 -4
- package/lib/browser/renderers/edit-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/glob-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/glob-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/glob-tool-renderer.js +6 -1
- package/lib/browser/renderers/glob-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/grep-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/grep-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/grep-tool-renderer.js +6 -1
- package/lib/browser/renderers/grep-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/ls-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/ls-tool-renderer.js +3 -3
- package/lib/browser/renderers/ls-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/multiedit-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/multiedit-tool-renderer.js +3 -3
- package/lib/browser/renderers/multiedit-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/read-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/read-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/read-tool-renderer.js +9 -4
- package/lib/browser/renderers/read-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/todo-write-renderer.d.ts +2 -0
- package/lib/browser/renderers/todo-write-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/todo-write-renderer.js +6 -1
- package/lib/browser/renderers/todo-write-renderer.js.map +1 -1
- package/lib/browser/renderers/web-fetch-tool-renderer.d.ts +2 -0
- package/lib/browser/renderers/web-fetch-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/web-fetch-tool-renderer.js +6 -1
- package/lib/browser/renderers/web-fetch-tool-renderer.js.map +1 -1
- package/lib/browser/renderers/write-tool-renderer.d.ts.map +1 -1
- package/lib/browser/renderers/write-tool-renderer.js +3 -3
- package/lib/browser/renderers/write-tool-renderer.js.map +1 -1
- package/lib/node/claude-code-service-impl.d.ts +2 -1
- package/lib/node/claude-code-service-impl.d.ts.map +1 -1
- package/lib/node/claude-code-service-impl.js +1 -1
- package/lib/node/claude-code-service-impl.js.map +1 -1
- package/package.json +10 -10
- package/src/browser/claude-code-chat-agent.ts +1 -1
- package/src/browser/claude-code-edit-tool-service.ts +1 -1
- package/src/browser/claude-code-file-edit-backup-service.ts +1 -1
- package/src/browser/claude-code-frontend-service.ts +3 -3
- package/src/browser/claude-code-slash-commands-contribution.ts +1 -1
- package/src/browser/renderers/bash-tool-renderer.tsx +6 -3
- package/src/browser/renderers/edit-tool-renderer.tsx +10 -5
- package/src/browser/renderers/glob-tool-renderer.tsx +6 -3
- package/src/browser/renderers/grep-tool-renderer.tsx +6 -3
- package/src/browser/renderers/ls-tool-renderer.tsx +4 -2
- package/src/browser/renderers/multiedit-tool-renderer.tsx +4 -2
- package/src/browser/renderers/read-tool-renderer.tsx +10 -5
- package/src/browser/renderers/todo-write-renderer.tsx +6 -3
- package/src/browser/renderers/web-fetch-tool-renderer.tsx +6 -3
- package/src/browser/renderers/write-tool-renderer.tsx +4 -2
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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('
|
|
41
|
-
|
|
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>();
|