@theia/ai-claude-code 1.65.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 (128) hide show
  1. package/README.md +30 -0
  2. package/lib/browser/claude-code-chat-agent.d.ts +82 -0
  3. package/lib/browser/claude-code-chat-agent.d.ts.map +1 -0
  4. package/lib/browser/claude-code-chat-agent.js +518 -0
  5. package/lib/browser/claude-code-chat-agent.js.map +1 -0
  6. package/lib/browser/claude-code-command-contribution.d.ts +16 -0
  7. package/lib/browser/claude-code-command-contribution.d.ts.map +1 -0
  8. package/lib/browser/claude-code-command-contribution.js +86 -0
  9. package/lib/browser/claude-code-command-contribution.js.map +1 -0
  10. package/lib/browser/claude-code-edit-tool-service.d.ts +61 -0
  11. package/lib/browser/claude-code-edit-tool-service.d.ts.map +1 -0
  12. package/lib/browser/claude-code-edit-tool-service.js +219 -0
  13. package/lib/browser/claude-code-edit-tool-service.js.map +1 -0
  14. package/lib/browser/claude-code-file-edit-backup-service.d.ts +57 -0
  15. package/lib/browser/claude-code-file-edit-backup-service.d.ts.map +1 -0
  16. package/lib/browser/claude-code-file-edit-backup-service.js +92 -0
  17. package/lib/browser/claude-code-file-edit-backup-service.js.map +1 -0
  18. package/lib/browser/claude-code-frontend-module.d.ts +5 -0
  19. package/lib/browser/claude-code-frontend-module.d.ts.map +1 -0
  20. package/lib/browser/claude-code-frontend-module.js +83 -0
  21. package/lib/browser/claude-code-frontend-module.js.map +1 -0
  22. package/lib/browser/claude-code-frontend-service.d.ts +40 -0
  23. package/lib/browser/claude-code-frontend-service.d.ts.map +1 -0
  24. package/lib/browser/claude-code-frontend-service.js +190 -0
  25. package/lib/browser/claude-code-frontend-service.js.map +1 -0
  26. package/lib/browser/claude-code-slash-commands-contribution.d.ts +17 -0
  27. package/lib/browser/claude-code-slash-commands-contribution.d.ts.map +1 -0
  28. package/lib/browser/claude-code-slash-commands-contribution.js +154 -0
  29. package/lib/browser/claude-code-slash-commands-contribution.js.map +1 -0
  30. package/lib/browser/claude-code-tool-call-content.d.ts +8 -0
  31. package/lib/browser/claude-code-tool-call-content.d.ts.map +1 -0
  32. package/lib/browser/claude-code-tool-call-content.js +30 -0
  33. package/lib/browser/claude-code-tool-call-content.js.map +1 -0
  34. package/lib/browser/renderers/bash-tool-renderer.d.ts +10 -0
  35. package/lib/browser/renderers/bash-tool-renderer.d.ts.map +1 -0
  36. package/lib/browser/renderers/bash-tool-renderer.js +71 -0
  37. package/lib/browser/renderers/bash-tool-renderer.js.map +1 -0
  38. package/lib/browser/renderers/collapsible-tool-renderer.d.ts +13 -0
  39. package/lib/browser/renderers/collapsible-tool-renderer.d.ts.map +1 -0
  40. package/lib/browser/renderers/collapsible-tool-renderer.js +48 -0
  41. package/lib/browser/renderers/collapsible-tool-renderer.js.map +1 -0
  42. package/lib/browser/renderers/edit-tool-renderer.d.ts +16 -0
  43. package/lib/browser/renderers/edit-tool-renderer.d.ts.map +1 -0
  44. package/lib/browser/renderers/edit-tool-renderer.js +134 -0
  45. package/lib/browser/renderers/edit-tool-renderer.js.map +1 -0
  46. package/lib/browser/renderers/glob-tool-renderer.d.ts +14 -0
  47. package/lib/browser/renderers/glob-tool-renderer.d.ts.map +1 -0
  48. package/lib/browser/renderers/glob-tool-renderer.js +107 -0
  49. package/lib/browser/renderers/glob-tool-renderer.js.map +1 -0
  50. package/lib/browser/renderers/grep-tool-renderer.d.ts +14 -0
  51. package/lib/browser/renderers/grep-tool-renderer.d.ts.map +1 -0
  52. package/lib/browser/renderers/grep-tool-renderer.js +157 -0
  53. package/lib/browser/renderers/grep-tool-renderer.js.map +1 -0
  54. package/lib/browser/renderers/ls-tool-renderer.d.ts +16 -0
  55. package/lib/browser/renderers/ls-tool-renderer.d.ts.map +1 -0
  56. package/lib/browser/renderers/ls-tool-renderer.js +116 -0
  57. package/lib/browser/renderers/ls-tool-renderer.js.map +1 -0
  58. package/lib/browser/renderers/multiedit-tool-renderer.d.ts +16 -0
  59. package/lib/browser/renderers/multiedit-tool-renderer.d.ts.map +1 -0
  60. package/lib/browser/renderers/multiedit-tool-renderer.js +152 -0
  61. package/lib/browser/renderers/multiedit-tool-renderer.js.map +1 -0
  62. package/lib/browser/renderers/read-tool-renderer.d.ts +16 -0
  63. package/lib/browser/renderers/read-tool-renderer.d.ts.map +1 -0
  64. package/lib/browser/renderers/read-tool-renderer.js +121 -0
  65. package/lib/browser/renderers/read-tool-renderer.js.map +1 -0
  66. package/lib/browser/renderers/todo-write-renderer.d.ts +10 -0
  67. package/lib/browser/renderers/todo-write-renderer.d.ts.map +1 -0
  68. package/lib/browser/renderers/todo-write-renderer.js +132 -0
  69. package/lib/browser/renderers/todo-write-renderer.js.map +1 -0
  70. package/lib/browser/renderers/web-fetch-tool-renderer.d.ts +10 -0
  71. package/lib/browser/renderers/web-fetch-tool-renderer.d.ts.map +1 -0
  72. package/lib/browser/renderers/web-fetch-tool-renderer.js +82 -0
  73. package/lib/browser/renderers/web-fetch-tool-renderer.js.map +1 -0
  74. package/lib/browser/renderers/write-tool-renderer.d.ts +16 -0
  75. package/lib/browser/renderers/write-tool-renderer.d.ts.map +1 -0
  76. package/lib/browser/renderers/write-tool-renderer.js +113 -0
  77. package/lib/browser/renderers/write-tool-renderer.js.map +1 -0
  78. package/lib/common/claude-code-preferences.d.ts +4 -0
  79. package/lib/common/claude-code-preferences.d.ts.map +1 -0
  80. package/lib/common/claude-code-preferences.js +33 -0
  81. package/lib/common/claude-code-preferences.js.map +1 -0
  82. package/lib/common/claude-code-service.d.ts +231 -0
  83. package/lib/common/claude-code-service.d.ts.map +1 -0
  84. package/lib/common/claude-code-service.js +82 -0
  85. package/lib/common/claude-code-service.js.map +1 -0
  86. package/lib/common/index.d.ts +2 -0
  87. package/lib/common/index.d.ts.map +1 -0
  88. package/lib/common/index.js +20 -0
  89. package/lib/common/index.js.map +1 -0
  90. package/lib/node/claude-code-backend-module.d.ts +4 -0
  91. package/lib/node/claude-code-backend-module.d.ts.map +1 -0
  92. package/lib/node/claude-code-backend-module.js +35 -0
  93. package/lib/node/claude-code-backend-module.js.map +1 -0
  94. package/lib/node/claude-code-service-impl.d.ts +32 -0
  95. package/lib/node/claude-code-service-impl.d.ts.map +1 -0
  96. package/lib/node/claude-code-service-impl.js +426 -0
  97. package/lib/node/claude-code-service-impl.js.map +1 -0
  98. package/lib/package.spec.d.ts +1 -0
  99. package/lib/package.spec.d.ts.map +1 -0
  100. package/lib/package.spec.js +26 -0
  101. package/lib/package.spec.js.map +1 -0
  102. package/package.json +57 -0
  103. package/src/browser/claude-code-chat-agent.ts +591 -0
  104. package/src/browser/claude-code-command-contribution.ts +80 -0
  105. package/src/browser/claude-code-edit-tool-service.ts +313 -0
  106. package/src/browser/claude-code-file-edit-backup-service.ts +141 -0
  107. package/src/browser/claude-code-frontend-module.ts +100 -0
  108. package/src/browser/claude-code-frontend-service.ts +215 -0
  109. package/src/browser/claude-code-slash-commands-contribution.ts +175 -0
  110. package/src/browser/claude-code-tool-call-content.ts +30 -0
  111. package/src/browser/renderers/bash-tool-renderer.tsx +97 -0
  112. package/src/browser/renderers/collapsible-tool-renderer.tsx +78 -0
  113. package/src/browser/renderers/edit-tool-renderer.tsx +180 -0
  114. package/src/browser/renderers/glob-tool-renderer.tsx +136 -0
  115. package/src/browser/renderers/grep-tool-renderer.tsx +190 -0
  116. package/src/browser/renderers/ls-tool-renderer.tsx +160 -0
  117. package/src/browser/renderers/multiedit-tool-renderer.tsx +204 -0
  118. package/src/browser/renderers/read-tool-renderer.tsx +170 -0
  119. package/src/browser/renderers/todo-write-renderer.tsx +178 -0
  120. package/src/browser/renderers/web-fetch-tool-renderer.tsx +108 -0
  121. package/src/browser/renderers/write-tool-renderer.tsx +155 -0
  122. package/src/browser/style/claude-code-tool-renderers.css +487 -0
  123. package/src/common/claude-code-preferences.ts +33 -0
  124. package/src/common/claude-code-service.ts +303 -0
  125. package/src/common/index.ts +17 -0
  126. package/src/node/claude-code-backend-module.ts +42 -0
  127. package/src/node/claude-code-service-impl.ts +462 -0
  128. package/src/package.spec.ts +27 -0
@@ -0,0 +1,155 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 EclipseSource GmbH.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { ChatResponsePartRenderer } from '@theia/ai-chat-ui/lib/browser/chat-response-part-renderer';
18
+ import { ResponseNode } from '@theia/ai-chat-ui/lib/browser/chat-tree-view';
19
+ import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
20
+ import { codicon, LabelProvider } from '@theia/core/lib/browser';
21
+ import { URI } from '@theia/core/lib/common/uri';
22
+ import { inject, injectable } from '@theia/core/shared/inversify';
23
+ import * as React from '@theia/core/shared/react';
24
+ import { ReactNode } from '@theia/core/shared/react';
25
+ import { EditorManager } from '@theia/editor/lib/browser';
26
+ import { WorkspaceService } from '@theia/workspace/lib/browser';
27
+ import { ClaudeCodeToolCallChatResponseContent } from '../claude-code-tool-call-content';
28
+ import { CollapsibleToolRenderer } from './collapsible-tool-renderer';
29
+
30
+ interface WriteToolInput {
31
+ file_path: string;
32
+ content: string;
33
+ }
34
+
35
+ @injectable()
36
+ export class WriteToolRenderer implements ChatResponsePartRenderer<ToolCallChatResponseContent> {
37
+
38
+ @inject(WorkspaceService)
39
+ protected readonly workspaceService: WorkspaceService;
40
+
41
+ @inject(LabelProvider)
42
+ protected readonly labelProvider: LabelProvider;
43
+
44
+ @inject(EditorManager)
45
+ protected readonly editorManager: EditorManager;
46
+
47
+ canHandle(response: ChatResponseContent): number {
48
+ if (ClaudeCodeToolCallChatResponseContent.is(response) && response.name === 'Write') {
49
+ return 15; // Higher than default ToolCallPartRenderer (10)
50
+ }
51
+ return -1;
52
+ }
53
+
54
+ render(response: ToolCallChatResponseContent, parentNode: ResponseNode): ReactNode {
55
+ try {
56
+ const input = JSON.parse(response.arguments || '{}') as WriteToolInput;
57
+ return <WriteToolComponent
58
+ input={input}
59
+ workspaceService={this.workspaceService}
60
+ labelProvider={this.labelProvider}
61
+ editorManager={this.editorManager}
62
+ />;
63
+ } catch (error) {
64
+ console.warn('Failed to parse Write tool input:', error);
65
+ return <div className="claude-code-tool error">Failed to parse Write tool data</div>;
66
+ }
67
+ }
68
+ }
69
+
70
+ const WriteToolComponent: React.FC<{
71
+ input: WriteToolInput;
72
+ workspaceService: WorkspaceService;
73
+ labelProvider: LabelProvider;
74
+ editorManager: EditorManager;
75
+ }> = ({ input, workspaceService, labelProvider, editorManager }) => {
76
+ const getFileName = (filePath: string): string => filePath.split('/').pop() || filePath;
77
+
78
+ const getWorkspaceRelativePath = async (filePath: string): Promise<string> => {
79
+ try {
80
+ const absoluteUri = new URI(filePath);
81
+ const workspaceRelativePath = await workspaceService.getWorkspaceRelativePath(absoluteUri);
82
+ return workspaceRelativePath || '';
83
+ } catch {
84
+ return '';
85
+ }
86
+ };
87
+
88
+ const handleOpenFile = async () => {
89
+ try {
90
+ const uri = new URI(input.file_path);
91
+ await editorManager.open(uri);
92
+ } catch (error) {
93
+ console.error('Failed to open file:', error);
94
+ }
95
+ };
96
+
97
+ const [relativePath, setRelativePath] = React.useState<string>('');
98
+
99
+ React.useEffect(() => {
100
+ getWorkspaceRelativePath(input.file_path).then(setRelativePath);
101
+ }, [input.file_path]);
102
+
103
+ const getContentSizeInfo = (): string => {
104
+ const lines = input.content.split('\n').length;
105
+ return `+${lines}`;
106
+ };
107
+
108
+ const compactHeader = (
109
+ <>
110
+ <div className="claude-code-tool header-left">
111
+ <span className="claude-code-tool title">Writing</span>
112
+ <span className={`${codicon('edit')} claude-code-tool icon`} />
113
+ <span
114
+ className="claude-code-tool file-name clickable-element"
115
+ onClick={handleOpenFile}
116
+ title="Click to open file in editor"
117
+ >
118
+ {getFileName(input.file_path)}
119
+ </span>
120
+ {relativePath && <span className="claude-code-tool relative-path">{relativePath}</span>}
121
+ </div>
122
+ <div className="claude-code-tool header-right">
123
+ <span className="claude-code-tool badge added">{getContentSizeInfo()}</span>
124
+ </div>
125
+ </>
126
+ );
127
+
128
+ const expandedContent = (
129
+ <div className="claude-code-tool details">
130
+ <div className="claude-code-tool detail-row">
131
+ <span className="claude-code-tool detail-label">File Path</span>
132
+ <code className="claude-code-tool detail-value">{input.file_path}</code>
133
+ </div>
134
+ <div className="claude-code-tool detail-row">
135
+ <span className="claude-code-tool detail-label">Preview</span>
136
+ <pre className="claude-code-tool detail-value code-preview">
137
+ {input.content.length > 500
138
+ ? input.content.substring(0, 500) + '...'
139
+ : input.content}
140
+ </pre>
141
+ </div>
142
+ <div className="claude-code-tool detail-row">
143
+ <span className="claude-code-tool detail-label">Lines</span>
144
+ <span className="claude-code-tool detail-value">{input.content.split('\n').length}</span>
145
+ </div>
146
+ </div>
147
+ );
148
+
149
+ return (
150
+ <CollapsibleToolRenderer
151
+ compactHeader={compactHeader}
152
+ expandedContent={expandedContent}
153
+ />
154
+ );
155
+ };
@@ -0,0 +1,487 @@
1
+ /* Base container and structure */
2
+ .claude-code-tool.container {
3
+ border: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
4
+ border-radius: var(--theia-ui-padding);
5
+ margin: var(--theia-ui-padding) 0;
6
+ background-color: var(--theia-sideBar-background);
7
+ overflow: hidden;
8
+ }
9
+
10
+ .claude-code-tool.header {
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ padding: 6px;
15
+ background-color: var(--theia-editorGroupHeader-tabsBackground);
16
+ white-space: nowrap;
17
+ overflow: hidden;
18
+ }
19
+
20
+ .claude-code-tool.header-left {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--theia-ui-padding);
24
+ min-width: 0;
25
+ flex: 1;
26
+ overflow: hidden;
27
+ }
28
+
29
+ .claude-code-tool.header-right {
30
+ flex-shrink: 0;
31
+ }
32
+
33
+ .claude-code-tool.icon {
34
+ color: var(--theia-charts-blue);
35
+ }
36
+
37
+ .claude-code-tool.icon.theia-file-icons-js::before {
38
+ margin-right: 0px;
39
+ }
40
+
41
+ .claude-code-tool.title {
42
+ font-weight: 600;
43
+ color: var(--theia-foreground);
44
+ font-size: var(--theia-ui-font-size1);
45
+ }
46
+
47
+ .claude-code-tool.file-name {
48
+ color: var(--theia-foreground);
49
+ font-size: var(--theia-ui-font-size1);
50
+ flex-shrink: 0;
51
+ }
52
+
53
+ .claude-code-tool.relative-path {
54
+ color: var(--theia-descriptionForeground);
55
+ font-size: var(--theia-ui-font-size0);
56
+ font-family: var(--theia-ui-font-family-mono);
57
+ overflow: hidden;
58
+ text-overflow: ellipsis;
59
+ white-space: nowrap;
60
+ min-width: 0;
61
+ }
62
+
63
+ .claude-code-tool.badge {
64
+ font-size: var(--theia-ui-font-size0);
65
+ font-weight: 500;
66
+ padding: 2px 6px;
67
+ background-color: var(--theia-badge-background);
68
+ color: var(--theia-badge-foreground);
69
+ border-radius: calc(var(--theia-ui-padding) / 3);
70
+ font-family: var(--theia-ui-font-family-mono);
71
+ }
72
+
73
+ .claude-code-tool.badge.added {
74
+ background-color: var(--theia-editorOverviewRuler-addedForeground);
75
+ color: var(--theia-foreground);
76
+ }
77
+
78
+ .claude-code-tool.badge.deleted {
79
+ background-color: var(--theia-editorOverviewRuler-deletedForeground);
80
+ color: var(--theia-foreground);
81
+ }
82
+
83
+ .claude-code-tool.content {
84
+ padding: var(--theia-ui-padding);
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: calc(var(--theia-ui-padding) * 2 / 3);
88
+ }
89
+
90
+ .claude-code-tool.parameters {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: calc(var(--theia-ui-padding) / 3);
94
+ padding: calc(var(--theia-ui-padding) * 2 / 3);
95
+ background-color: var(--theia-editorWidget-background);
96
+ border-radius: calc(var(--theia-ui-padding) / 2);
97
+ border: var(--theia-border-width) solid var(--theia-widget-border);
98
+ }
99
+
100
+ .claude-code-tool.parameter {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: var(--theia-ui-padding);
104
+ }
105
+
106
+ .claude-code-tool.parameter-label {
107
+ color: var(--theia-descriptionForeground);
108
+ font-size: var(--theia-ui-font-size0);
109
+ min-width: 120px;
110
+ flex-shrink: 0;
111
+ }
112
+
113
+ .claude-code-tool.parameter-value {
114
+ color: var(--theia-foreground);
115
+ font-size: var(--theia-ui-font-size0);
116
+ font-weight: 500;
117
+ padding: 2px 6px;
118
+ background-color: var(--theia-badge-background);
119
+ color: var(--theia-badge-foreground);
120
+ border-radius: calc(var(--theia-ui-padding) / 3);
121
+ font-family: var(--theia-ui-font-family-mono);
122
+ }
123
+
124
+ .claude-code-tool.error {
125
+ padding: var(--theia-ui-padding);
126
+ color: var(--theia-errorForeground);
127
+ background-color: var(--theia-errorBackground);
128
+ border-radius: var(--theia-ui-padding);
129
+ margin: var(--theia-ui-padding) 0;
130
+ border: var(--theia-border-width) solid var(--theia-errorBorder);
131
+ }
132
+
133
+ /* Collapsible section styles */
134
+ .claude-code-tool.expand-icon {
135
+ margin-right: calc(var(--theia-ui-padding) / 2);
136
+ }
137
+
138
+ .claude-code-tool.expanded-content {
139
+ padding: var(--theia-ui-padding);
140
+ }
141
+
142
+ /* Clickable elements within headers */
143
+ .clickable-element {
144
+ cursor: pointer;
145
+ border-radius: calc(var(--theia-ui-padding) / 4);
146
+ transition: background-color 0.15s ease;
147
+ }
148
+
149
+ .clickable-element:hover {
150
+ background-color: var(--theia-toolbar-hoverBackground);
151
+ text-decoration: underline;
152
+ }
153
+
154
+ /* Hover effects */
155
+ .claude-code-tool.container:hover {
156
+ background-color: var(--theia-list-hoverBackground);
157
+ }
158
+
159
+ /* Tool-specific styles */
160
+
161
+ /* Bash Tool */
162
+ .claude-code-tool.command {
163
+ color: var(--theia-foreground);
164
+ font-size: var(--theia-ui-font-size1);
165
+ font-family: var(--theia-ui-font-family-mono);
166
+ flex-shrink: 0;
167
+ }
168
+
169
+ .claude-code-tool.description {
170
+ color: var(--theia-descriptionForeground);
171
+ font-size: var(--theia-ui-font-size1);
172
+ }
173
+
174
+ /* Edit Tool */
175
+ .claude-code-tool.edit-changes {
176
+ display: flex;
177
+ flex-direction: column;
178
+ gap: calc(var(--theia-ui-padding) / 2);
179
+ }
180
+
181
+ .claude-code-tool.edit-change {
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: calc(var(--theia-ui-padding) / 3);
185
+ }
186
+
187
+ .claude-code-tool.edit-label {
188
+ color: var(--theia-descriptionForeground);
189
+ font-size: var(--theia-ui-font-size0);
190
+ font-weight: 500;
191
+ }
192
+
193
+ .claude-code-tool.edit-old {
194
+ color: var(--theia-textCodeBlock-foreground);
195
+ background-color: var(--theia-merge-incomingContentBackground);
196
+ padding: calc(var(--theia-ui-padding) / 2) calc(var(--theia-ui-padding) * 2 / 3);
197
+ border-radius: calc(var(--theia-ui-padding) / 3);
198
+ font-family: var(--theia-ui-font-family-mono);
199
+ font-size: var(--theia-ui-font-size0);
200
+ border-left: 3px solid var(--theia-merge-incomingHeaderBackground);
201
+ }
202
+
203
+ .claude-code-tool.edit-new {
204
+ color: var(--theia-textCodeBlock-foreground);
205
+ background-color: var(--theia-merge-currentContentBackground);
206
+ padding: calc(var(--theia-ui-padding) / 2) calc(var(--theia-ui-padding) * 2 / 3);
207
+ border-radius: calc(var(--theia-ui-padding) / 3);
208
+ font-family: var(--theia-ui-font-family-mono);
209
+ font-size: var(--theia-ui-font-size0);
210
+ border-left: 3px solid var(--theia-merge-currentHeaderBackground);
211
+ }
212
+
213
+ /* Grep Tool */
214
+ .claude-code-tool.pattern {
215
+ color: var(--theia-foreground);
216
+ font-size: var(--theia-ui-font-size1);
217
+ font-family: var(--theia-ui-font-family-mono);
218
+ font-weight: 600;
219
+ background-color: var(--theia-textCodeBlock-background);
220
+ padding: 2px 6px;
221
+ border-radius: calc(var(--theia-ui-padding) / 3);
222
+ border: var(--theia-border-width) solid var(--theia-widget-border);
223
+ }
224
+
225
+ .claude-code-tool.scope {
226
+ color: var(--theia-descriptionForeground);
227
+ font-size: var(--theia-ui-font-size0);
228
+ font-style: italic;
229
+ }
230
+
231
+ /* Glob Tool */
232
+ .claude-code-tool.glob-pattern {
233
+ color: var(--theia-foreground);
234
+ font-size: var(--theia-ui-font-size1);
235
+ font-family: var(--theia-ui-font-family-mono);
236
+ font-weight: 600;
237
+ background-color: var(--theia-textCodeBlock-background);
238
+ padding: 2px 6px;
239
+ border-radius: calc(var(--theia-ui-padding) / 3);
240
+ border: var(--theia-border-width) solid var(--theia-widget-border);
241
+ }
242
+
243
+ /* TodoWrite Renderer Styles */
244
+ .claude-code-tool.todo-list-container {
245
+ border: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
246
+ border-radius: var(--theia-ui-padding);
247
+ margin: var(--theia-ui-padding) 0;
248
+ background-color: var(--theia-sideBar-background);
249
+ overflow: hidden;
250
+ }
251
+
252
+ .claude-code-tool.todo-list-header {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: var(--theia-ui-padding);
256
+ padding: 6px;
257
+ background-color: var(--theia-editorGroupHeader-tabsBackground);
258
+ border-bottom: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
259
+ }
260
+
261
+ .claude-code-tool.todo-list-icon {
262
+ color: var(--theia-button-background);
263
+ font-size: var(--theia-icon-size);
264
+ }
265
+
266
+ .claude-code-tool.todo-list-title {
267
+ font-weight: 600;
268
+ color: var(--theia-foreground);
269
+ font-size: var(--theia-ui-font-size1);
270
+ }
271
+
272
+ .claude-code-tool.todo-list-progress {
273
+ margin-left: auto;
274
+ color: var(--theia-badge-foreground);
275
+ font-size: var(--theia-ui-font-size0);
276
+ padding: 2px 6px;
277
+ background-color: var(--theia-badge-background);
278
+ border-radius: calc(var(--theia-ui-padding) / 3);
279
+ line-height: 1;
280
+ }
281
+
282
+ .claude-code-tool.todo-list-empty {
283
+ padding: var(--theia-ui-padding);
284
+ color: var(--theia-descriptionForeground);
285
+ font-style: italic;
286
+ text-align: center;
287
+ }
288
+
289
+ .claude-code-tool.todo-list-items {
290
+ padding: 0;
291
+ }
292
+
293
+ .claude-code-tool.todo-item {
294
+ border-bottom: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
295
+ transition: background-color 0.2s ease;
296
+ }
297
+
298
+ .claude-code-tool.todo-item:last-child {
299
+ border-bottom: none;
300
+ }
301
+
302
+ .claude-code-tool.todo-item:hover {
303
+ background-color: var(--theia-toolbar-hoverBackground);
304
+ }
305
+
306
+ .claude-code-tool.todo-item-main {
307
+ display: flex;
308
+ align-items: flex-start;
309
+ gap: calc(var(--theia-ui-padding) * 2 / 3);
310
+ padding: 6px;
311
+ }
312
+
313
+ .claude-code-tool.todo-item-status {
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ min-width: var(--theia-icon-size);
318
+ height: var(--theia-icon-size);
319
+ margin-top: 2px;
320
+ }
321
+
322
+ .claude-code-tool.todo-status-icon {
323
+ font-size: var(--theia-icon-size);
324
+ }
325
+
326
+ .claude-code-tool.todo-status-icon.completed {
327
+ color: var(--theia-charts-green);
328
+ }
329
+
330
+ .claude-code-tool.todo-status-icon.in-progress {
331
+ color: var(--theia-progressBar-background);
332
+ }
333
+
334
+ .claude-code-tool.todo-status-icon.pending {
335
+ color: var(--theia-descriptionForeground);
336
+ }
337
+
338
+ .claude-code-tool.todo-item-content {
339
+ flex: 1;
340
+ min-width: 0;
341
+ display: flex;
342
+ align-items: center;
343
+ gap: calc(var(--theia-ui-padding) * 2 / 3);
344
+ }
345
+
346
+ .claude-code-tool.todo-item-text {
347
+ flex: 1;
348
+ color: var(--theia-foreground);
349
+ line-height: 1.4;
350
+ white-space: nowrap;
351
+ overflow: hidden;
352
+ text-overflow: ellipsis;
353
+ min-width: 0;
354
+ }
355
+
356
+ .claude-code-tool.todo-item.status-completed .claude-code-tool.todo-item-text {
357
+ text-decoration: line-through;
358
+ color: var(--theia-descriptionForeground);
359
+ }
360
+
361
+ .claude-code-tool.todo-priority {
362
+ padding: 2px 6px;
363
+ border-radius: calc(var(--theia-ui-padding) / 3);
364
+ font-size: var(--theia-ui-font-size0);
365
+ font-weight: 500;
366
+ text-transform: uppercase;
367
+ letter-spacing: 0.3px;
368
+ flex-shrink: 0;
369
+ }
370
+
371
+ .claude-code-tool.todo-priority.priority-high {
372
+ background-color: rgba(var(--theia-charts-red-rgb, 204, 0, 0), 0.8);
373
+ color: var(--theia-button-foreground);
374
+ }
375
+
376
+ .claude-code-tool.todo-priority.priority-medium {
377
+ background-color: rgba(var(--theia-charts-orange-rgb, 255, 165, 0), 0.8);
378
+ color: var(--theia-button-foreground);
379
+ }
380
+
381
+ .claude-code-tool.todo-priority.priority-low {
382
+ background-color: rgba(var(--theia-charts-blue-rgb, 0, 122, 204), 0.8);
383
+ color: var(--theia-button-foreground);
384
+ }
385
+
386
+ .claude-code-tool.todo-list-error {
387
+ padding: var(--theia-ui-padding);
388
+ color: var(--theia-errorForeground);
389
+ background-color: var(--theia-errorBackground);
390
+ border-radius: var(--theia-ui-padding);
391
+ margin: var(--theia-ui-padding) 0;
392
+ }
393
+
394
+ /* Progress bar for completed items */
395
+ .claude-code-tool.todo-item.status-completed {
396
+ opacity: 0.8;
397
+ }
398
+
399
+ /* Animation for in-progress items */
400
+ .claude-code-tool.todo-item.status-in-progress {
401
+ background-color: rgba(var(--theia-progressBar-background-rgb, 0, 122, 204),
402
+ 0.05);
403
+ }
404
+
405
+ .claude-code-tool.todo-item.status-in-progress .claude-code-tool.todo-item-text {
406
+ font-weight: 500;
407
+ }
408
+
409
+ /* Detail section styles */
410
+ .claude-code-tool.details {
411
+ display: flex;
412
+ flex-direction: column;
413
+ gap: calc(var(--theia-ui-padding) / 2);
414
+ }
415
+
416
+ .claude-code-tool.detail-row {
417
+ display: flex;
418
+ align-items: flex-start;
419
+ gap: calc(var(--theia-ui-padding) / 2);
420
+ margin-bottom: calc(var(--theia-ui-padding) / 3);
421
+ }
422
+
423
+ .claude-code-tool.detail-label {
424
+ color: var(--theia-descriptionForeground);
425
+ font-size: var(--theia-ui-font-size1);
426
+ font-weight: 500;
427
+ min-width: 80px;
428
+ flex-shrink: 0;
429
+ }
430
+
431
+ .claude-code-tool.detail-label::after {
432
+ content: " ";
433
+ margin-left: 2px;
434
+ }
435
+
436
+ .claude-code-tool.detail-value {
437
+ color: var(--theia-foreground);
438
+ font-size: var(--theia-ui-font-size1);
439
+ flex: 1;
440
+ min-width: 0;
441
+ word-break: break-word;
442
+ }
443
+
444
+ .claude-code-tool.detail-value.code-preview {
445
+ background-color: var(--theia-textCodeBlock-background);
446
+ padding: calc(var(--theia-ui-padding) / 2);
447
+ border-radius: calc(var(--theia-ui-padding) / 3);
448
+ font-family: var(--theia-ui-font-family-mono);
449
+ border: var(--theia-border-width) solid var(--theia-widget-border);
450
+ white-space: pre-wrap;
451
+ overflow-x: auto;
452
+ margin: 0;
453
+ }
454
+
455
+ /* MultiEdit specific styles */
456
+ .claude-code-tool.edit-preview {
457
+ background-color: var(--theia-editorWidget-background);
458
+ border: var(--theia-border-width) solid var(--theia-widget-border);
459
+ border-radius: calc(var(--theia-ui-padding) / 2);
460
+ padding: calc(var(--theia-ui-padding) * 2 / 3);
461
+ margin: calc(var(--theia-ui-padding) / 2) 0;
462
+ }
463
+
464
+ .claude-code-tool.edit-preview-header {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: calc(var(--theia-ui-padding) / 2);
468
+ margin-bottom: calc(var(--theia-ui-padding) / 2);
469
+ padding-bottom: calc(var(--theia-ui-padding) / 3);
470
+ border-bottom: var(--theia-border-width) solid var(--theia-sideBarSectionHeader-border);
471
+ }
472
+
473
+ .claude-code-tool.edit-preview-title {
474
+ font-weight: 600;
475
+ color: var(--theia-foreground);
476
+ font-size: var(--theia-ui-font-size0);
477
+ }
478
+
479
+ .claude-code-tool.edit-preview-badge {
480
+ font-size: var(--theia-ui-font-size0);
481
+ font-weight: 500;
482
+ padding: 1px 4px;
483
+ background-color: var(--theia-badge-background);
484
+ color: var(--theia-badge-foreground);
485
+ border-radius: calc(var(--theia-ui-padding) / 4);
486
+ font-family: var(--theia-ui-font-family-mono);
487
+ }
@@ -0,0 +1,33 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 EclipseSource GmbH.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { AI_CORE_PREFERENCES_TITLE } from '@theia/ai-core/lib/common/ai-core-preferences';
18
+ import { nls, PreferenceSchema } from '@theia/core';
19
+
20
+ export const CLAUDE_CODE_EXECUTABLE_PATH_PREF = 'ai-features.claudeCode.executablePath';
21
+
22
+ export const ClaudeCodePreferencesSchema: PreferenceSchema = {
23
+ properties: {
24
+ [CLAUDE_CODE_EXECUTABLE_PATH_PREF]: {
25
+ type: 'string',
26
+ markdownDescription: nls.localize('theia/ai/claude-code/executablePath/description',
27
+ 'Path to the Claude Code executable (cli.js). Usually copying the result of `which claude` ' +
28
+ 'here will work. If not specified, the system will attempt to resolve the path automatically ' +
29
+ 'from the global npm installation.'),
30
+ title: AI_CORE_PREFERENCES_TITLE,
31
+ },
32
+ }
33
+ };