@theia/ai-claude-code 1.66.0-next.41 → 1.66.0-next.67

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 (60) hide show
  1. package/lib/browser/claude-code-chat-agent.d.ts.map +1 -1
  2. package/lib/browser/claude-code-chat-agent.js +7 -7
  3. package/lib/browser/claude-code-chat-agent.js.map +1 -1
  4. package/lib/browser/claude-code-command-contribution.d.ts.map +1 -1
  5. package/lib/browser/claude-code-command-contribution.js +4 -4
  6. package/lib/browser/claude-code-command-contribution.js.map +1 -1
  7. package/lib/browser/claude-code-edit-tool-service.d.ts.map +1 -1
  8. package/lib/browser/claude-code-edit-tool-service.js +5 -4
  9. package/lib/browser/claude-code-edit-tool-service.js.map +1 -1
  10. package/lib/browser/claude-code-slash-commands-contribution.d.ts.map +1 -1
  11. package/lib/browser/claude-code-slash-commands-contribution.js +9 -8
  12. package/lib/browser/claude-code-slash-commands-contribution.js.map +1 -1
  13. package/lib/browser/renderers/bash-tool-renderer.d.ts.map +1 -1
  14. package/lib/browser/renderers/bash-tool-renderer.js +8 -12
  15. package/lib/browser/renderers/bash-tool-renderer.js.map +1 -1
  16. package/lib/browser/renderers/edit-tool-renderer.d.ts.map +1 -1
  17. package/lib/browser/renderers/edit-tool-renderer.js +10 -9
  18. package/lib/browser/renderers/edit-tool-renderer.js.map +1 -1
  19. package/lib/browser/renderers/glob-tool-renderer.d.ts.map +1 -1
  20. package/lib/browser/renderers/glob-tool-renderer.js +13 -16
  21. package/lib/browser/renderers/glob-tool-renderer.js.map +1 -1
  22. package/lib/browser/renderers/grep-tool-renderer.d.ts.map +1 -1
  23. package/lib/browser/renderers/grep-tool-renderer.js +31 -28
  24. package/lib/browser/renderers/grep-tool-renderer.js.map +1 -1
  25. package/lib/browser/renderers/ls-tool-renderer.d.ts.map +1 -1
  26. package/lib/browser/renderers/ls-tool-renderer.js +12 -12
  27. package/lib/browser/renderers/ls-tool-renderer.js.map +1 -1
  28. package/lib/browser/renderers/multiedit-tool-renderer.d.ts.map +1 -1
  29. package/lib/browser/renderers/multiedit-tool-renderer.js +14 -18
  30. package/lib/browser/renderers/multiedit-tool-renderer.js.map +1 -1
  31. package/lib/browser/renderers/read-tool-renderer.d.ts.map +1 -1
  32. package/lib/browser/renderers/read-tool-renderer.js +13 -10
  33. package/lib/browser/renderers/read-tool-renderer.js.map +1 -1
  34. package/lib/browser/renderers/todo-write-renderer.d.ts.map +1 -1
  35. package/lib/browser/renderers/todo-write-renderer.js +15 -14
  36. package/lib/browser/renderers/todo-write-renderer.js.map +1 -1
  37. package/lib/browser/renderers/web-fetch-tool-renderer.d.ts.map +1 -1
  38. package/lib/browser/renderers/web-fetch-tool-renderer.js +7 -6
  39. package/lib/browser/renderers/web-fetch-tool-renderer.js.map +1 -1
  40. package/lib/browser/renderers/write-tool-renderer.d.ts.map +1 -1
  41. package/lib/browser/renderers/write-tool-renderer.js +7 -6
  42. package/lib/browser/renderers/write-tool-renderer.js.map +1 -1
  43. package/lib/node/claude-code-service-impl.js +7 -7
  44. package/lib/node/claude-code-service-impl.js.map +1 -1
  45. package/package.json +10 -10
  46. package/src/browser/claude-code-chat-agent.ts +9 -8
  47. package/src/browser/claude-code-command-contribution.ts +4 -4
  48. package/src/browser/claude-code-edit-tool-service.ts +6 -5
  49. package/src/browser/claude-code-slash-commands-contribution.ts +9 -9
  50. package/src/browser/renderers/bash-tool-renderer.tsx +8 -7
  51. package/src/browser/renderers/edit-tool-renderer.tsx +10 -9
  52. package/src/browser/renderers/glob-tool-renderer.tsx +13 -11
  53. package/src/browser/renderers/grep-tool-renderer.tsx +33 -24
  54. package/src/browser/renderers/ls-tool-renderer.tsx +12 -9
  55. package/src/browser/renderers/multiedit-tool-renderer.tsx +14 -11
  56. package/src/browser/renderers/read-tool-renderer.tsx +13 -10
  57. package/src/browser/renderers/todo-write-renderer.tsx +17 -8
  58. package/src/browser/renderers/web-fetch-tool-renderer.tsx +7 -6
  59. package/src/browser/renderers/write-tool-renderer.tsx +7 -6
  60. package/src/node/claude-code-service-impl.ts +8 -8
@@ -23,14 +23,21 @@ 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
27
 
27
28
  interface TodoItem {
28
29
  id: string;
29
30
  content: string;
30
31
  status: 'pending' | 'in_progress' | 'completed';
31
- priority: 'high' | 'medium' | 'low';
32
+ priority: keyof typeof TODO_PRIORITIES;
32
33
  }
33
34
 
35
+ const TODO_PRIORITIES = {
36
+ 'high': nls.localize('theia/ai/claude-code/todoPriority/high', 'high'),
37
+ 'medium': nls.localize('theia/ai/claude-code/todoPriority/medium', 'medium'),
38
+ 'low': nls.localize('theia/ai/claude-code/todoPriority/low', 'low')
39
+ };
40
+
34
41
  interface TodoWriteInput {
35
42
  todos: TodoItem[];
36
43
  }
@@ -83,7 +90,7 @@ export class TodoWriteRenderer implements ChatResponsePartRenderer<ToolCallChatR
83
90
  return <TodoListComponent todos={input.todos || []} sessionId={parentNode.sessionId} />;
84
91
  } catch (error) {
85
92
  console.warn('Failed to parse TodoWrite input:', error);
86
- return <div className="claude-code-tool todo-list-error">Failed to parse todo list data</div>;
93
+ return <div className="claude-code-tool todo-list-error">{nls.localize('theia/ai/claude-code/failedToParseTodoListData', 'Failed to parse todo list data')}</div>;
87
94
  }
88
95
  }
89
96
  }
@@ -117,7 +124,7 @@ const TodoListComponent: React.FC<{ todos: TodoItem[]; sessionId: string }> = ({
117
124
  };
118
125
 
119
126
  const getPriorityBadge = (priority: TodoItem['priority']) => (
120
- <span className={`claude-code-tool todo-priority priority-${priority}`}>{priority}</span>
127
+ <span className={`claude-code-tool todo-priority priority-${priority}`}>{TODO_PRIORITIES[priority]}</span>
121
128
  );
122
129
 
123
130
  if (!todos || todos.length === 0) {
@@ -125,9 +132,9 @@ const TodoListComponent: React.FC<{ todos: TodoItem[]; sessionId: string }> = ({
125
132
  <div className="claude-code-tool todo-list-container">
126
133
  <div className="claude-code-tool todo-list-header">
127
134
  <span className={`${codicon('checklist')} claude-code-tool todo-list-icon`} />
128
- <span className="claude-code-tool todo-list-title">Todo List</span>
135
+ <span className="claude-code-tool todo-list-title">{nls.localize('theia/ai/claude-code/todoList', 'Todo List')}</span>
129
136
  </div>
130
- <div className="claude-code-tool todo-list-empty">No todos available</div>
137
+ <div className="claude-code-tool todo-list-empty">{nls.localize('theia/ai/claude-code/emptyTodoList', 'No todos available')}</div>
131
138
  </div>
132
139
  );
133
140
  }
@@ -138,12 +145,14 @@ const TodoListComponent: React.FC<{ todos: TodoItem[]; sessionId: string }> = ({
138
145
  const compactHeader = (
139
146
  <>
140
147
  <div className="claude-code-tool header-left">
141
- <span className="claude-code-tool title">Todo List</span>
148
+ <span className="claude-code-tool title">{nls.localize('theia/ai/claude-code/todoList', 'Todo List')}</span>
142
149
  <span className={`${codicon('checklist')} claude-code-tool icon`} />
143
- <span className="claude-code-tool progress-text">{completedCount}/{totalCount} completed</span>
150
+ <span className="claude-code-tool progress-text">{nls.localize('theia/ai/claude-code/completedCount', '{0}/{1} completed', completedCount, totalCount)}</span>
144
151
  </div>
145
152
  <div className="claude-code-tool header-right">
146
- <span className="claude-code-tool badge">{totalCount} item{totalCount !== 1 ? 's' : ''}</span>
153
+ <span className="claude-code-tool badge">{totalCount === 1
154
+ ? nls.localize('theia/ai/claude-code/oneItem', '1 item')
155
+ : nls.localize('theia/ai/claude-code/itemCount', '{0} items', totalCount)}</span>
147
156
  </div>
148
157
  </>
149
158
  );
@@ -23,6 +23,7 @@ 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
27
 
27
28
  interface WebFetchToolInput {
28
29
  url: string;
@@ -45,7 +46,7 @@ export class WebFetchToolRenderer implements ChatResponsePartRenderer<ToolCallCh
45
46
  return <WebFetchToolComponent input={input} />;
46
47
  } catch (error) {
47
48
  console.warn('Failed to parse WebFetch tool input:', error);
48
- return <div className="claude-code-tool error">Failed to parse WebFetch tool data</div>;
49
+ return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseWebFetchToolData', 'Failed to parse WebFetch tool data')}</div>;
49
50
  }
50
51
  }
51
52
  }
@@ -69,7 +70,7 @@ const WebFetchToolComponent: React.FC<{
69
70
  const compactHeader = (
70
71
  <>
71
72
  <div className="claude-code-tool header-left">
72
- <span className="claude-code-tool title">Fetching</span>
73
+ <span className="claude-code-tool title">{nls.localize('theia/ai/claude-code/fetching', 'Fetching')}</span>
73
74
  <span className={`${codicon('globe')} claude-code-tool icon`} />
74
75
  <span className="claude-code-tool command">{getDomain(input.url)}</span>
75
76
  <span className="claude-code-tool description" title={input.prompt}>
@@ -77,7 +78,7 @@ const WebFetchToolComponent: React.FC<{
77
78
  </span>
78
79
  </div>
79
80
  <div className="claude-code-tool header-right">
80
- <span className="claude-code-tool badge">Web Fetch</span>
81
+ <span className="claude-code-tool badge">{nls.localize('theia/ai/claude-code/webFetch', 'Web Fetch')}</span>
81
82
  </div>
82
83
  </>
83
84
  );
@@ -85,15 +86,15 @@ const WebFetchToolComponent: React.FC<{
85
86
  const expandedContent = (
86
87
  <div className="claude-code-tool details">
87
88
  <div className="claude-code-tool detail-row">
88
- <span className="claude-code-tool detail-label">URL</span>
89
+ <span className="claude-code-tool detail-label">{nls.localize('theia/ai/claude-code/url', 'URL')}</span>
89
90
  <code className="claude-code-tool detail-value">{input.url}</code>
90
91
  </div>
91
92
  <div className="claude-code-tool detail-row">
92
- <span className="claude-code-tool detail-label">Domain</span>
93
+ <span className="claude-code-tool detail-label">{nls.localize('theia/ai/claude-code/domain', 'Domain')}</span>
93
94
  <span className="claude-code-tool detail-value">{getDomain(input.url)}</span>
94
95
  </div>
95
96
  <div className="claude-code-tool detail-row">
96
- <span className="claude-code-tool detail-label">Prompt</span>
97
+ <span className="claude-code-tool detail-label">{nls.localizeByDefault('Prompt')}</span>
97
98
  <span className="claude-code-tool detail-value">{input.prompt}</span>
98
99
  </div>
99
100
  </div>
@@ -26,6 +26,7 @@ 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
30
 
30
31
  interface WriteToolInput {
31
32
  file_path: string;
@@ -62,7 +63,7 @@ export class WriteToolRenderer implements ChatResponsePartRenderer<ToolCallChatR
62
63
  />;
63
64
  } catch (error) {
64
65
  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
+ return <div className="claude-code-tool error">{nls.localize('theia/ai/claude-code/failedToParseWriteToolData', 'Failed to parse Write tool data')}</div>;
66
67
  }
67
68
  }
68
69
  }
@@ -108,12 +109,12 @@ const WriteToolComponent: React.FC<{
108
109
  const compactHeader = (
109
110
  <>
110
111
  <div className="claude-code-tool header-left">
111
- <span className="claude-code-tool title">Writing</span>
112
+ <span className="claude-code-tool title">{nls.localize('theia/ai/claude-code/writing', 'Writing')}</span>
112
113
  <span className={`${codicon('edit')} claude-code-tool icon`} />
113
114
  <span
114
115
  className="claude-code-tool file-name clickable-element"
115
116
  onClick={handleOpenFile}
116
- title="Click to open file in editor"
117
+ title={nls.localize('theia/ai/claude-code/openFileTooltip', 'Click to open file in editor')}
117
118
  >
118
119
  {getFileName(input.file_path)}
119
120
  </span>
@@ -128,11 +129,11 @@ const WriteToolComponent: React.FC<{
128
129
  const expandedContent = (
129
130
  <div className="claude-code-tool details">
130
131
  <div className="claude-code-tool detail-row">
131
- <span className="claude-code-tool detail-label">File Path</span>
132
+ <span className="claude-code-tool detail-label">{nls.localize('theia/ai/claude-code/filePath', 'File Path')}</span>
132
133
  <code className="claude-code-tool detail-value">{input.file_path}</code>
133
134
  </div>
134
135
  <div className="claude-code-tool detail-row">
135
- <span className="claude-code-tool detail-label">Preview</span>
136
+ <span className="claude-code-tool detail-label">{nls.localizeByDefault('Preview')}</span>
136
137
  <pre className="claude-code-tool detail-value code-preview">
137
138
  {input.content.length > 500
138
139
  ? input.content.substring(0, 500) + '...'
@@ -140,7 +141,7 @@ const WriteToolComponent: React.FC<{
140
141
  </pre>
141
142
  </div>
142
143
  <div className="claude-code-tool detail-row">
143
- <span className="claude-code-tool detail-label">Lines</span>
144
+ <span className="claude-code-tool detail-label">{nls.localize('theia/ai/claude-code/lines', 'Lines')}</span>
144
145
  <span className="claude-code-tool detail-value">{input.content.split('\n').length}</span>
145
146
  </div>
146
147
  </div>
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { ILogger, generateUuid } from '@theia/core';
17
+ import { ILogger, generateUuid, nls } from '@theia/core';
18
18
  import { inject, injectable, named } from '@theia/core/shared/inversify';
19
19
  import { execSync } from 'child_process';
20
20
  import { existsSync, realpathSync } from 'fs';
@@ -148,7 +148,7 @@ export class ClaudeCodeServiceImpl implements ClaudeCodeService {
148
148
 
149
149
  if (customClaudeCodePath) {
150
150
  if (!existsSync(customClaudeCodePath)) {
151
- throw new Error(`Specified Claude Code executable not found at: ${customClaudeCodePath}`);
151
+ throw new Error(nls.localize('theia/ai/claude-code/executableNotFoundAt', 'Specified Claude Code executable not found at: {0}', customClaudeCodePath));
152
152
  }
153
153
  const realPath = realpathSync(customClaudeCodePath);
154
154
  // Use the directory containing the cli.js file
@@ -161,10 +161,10 @@ export class ClaudeCodeServiceImpl implements ClaudeCodeService {
161
161
 
162
162
  // Check if file exists before importing
163
163
  if (!existsSync(sdkPath)) {
164
- throw new Error('Claude Code installation not found. ' +
164
+ throw new Error(nls.localize('theia/ai/claude-code/installationNotFoundAt', 'Claude Code installation not found. ' +
165
165
  'Please install with: `npm install -g @anthropic-ai/claude-code` ' +
166
166
  'and/or specify the path to the executable in the settings. ' +
167
- `We looked at ${sdkPath}`);
167
+ 'We looked at {0}', sdkPath));
168
168
  }
169
169
 
170
170
  const importPath = `file://${sdkPath}`;
@@ -182,9 +182,9 @@ export class ClaudeCodeServiceImpl implements ClaudeCodeService {
182
182
  return path.join(globalPath, '@anthropic-ai/claude-code');
183
183
  } catch (error) {
184
184
  this.logger.error('Failed to resolve global npm path:', error);
185
- throw new Error('Claude Code installation not found. ' +
185
+ throw new Error(nls.localize('theia/ai/claude-code/installationNotFound', 'Claude Code installation not found. ' +
186
186
  'Please install with: `npm install -g @anthropic-ai/claude-code` ' +
187
- 'and/or specify the path to the executable in the settings.');
187
+ 'and/or specify the path to the executable in the settings.'));
188
188
  }
189
189
  }
190
190
 
@@ -257,10 +257,10 @@ async function main() {
257
257
  });
258
258
 
259
259
  const hookData = JSON.parse(input);
260
-
260
+
261
261
  // Delete backup directory for this session
262
262
  const backupDir = path.join(hookData.cwd, '.claude', '.edit-baks', hookData.session_id);
263
-
263
+
264
264
  try {
265
265
  await fs.rm(backupDir, { recursive: true, force: true });
266
266
  console.log(\`Cleaned up session backups: \${hookData.session_id}\`);