@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
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ <div align='center'>
2
+
3
+ <br />
4
+
5
+ <img src='https://raw.githubusercontent.com/eclipse-theia/theia/master/logo/theia.svg?sanitize=true' alt='theia-ext-logo' width='100px' />
6
+
7
+ <h2>ECLIPSE THEIA - Claude Code Integration</h2>
8
+
9
+ <hr />
10
+
11
+ </div>
12
+
13
+ ## Description
14
+
15
+ The `@theia/ai-claude-code` integrates Anthropic's Claude Code as an agent into the Theia platform.
16
+
17
+ ## Additional Information
18
+
19
+ - [Theia - GitHub](https://github.com/eclipse-theia/theia)
20
+ - [Theia - Website](https://theia-ide.org/)
21
+
22
+ ## License
23
+
24
+ - [Eclipse Public License 2.0](http://www.eclipse.org/legal/epl-2.0/)
25
+ - [一 (Secondary) GNU General Public License, version 2 with the GNU Classpath Exception](https://projects.eclipse.org/license/secondary-gpl-2.0-cp)
26
+
27
+ ## Trademark
28
+
29
+ "Theia" is a trademark of the Eclipse Foundation
30
+ <https://www.eclipse.org/theia>
@@ -0,0 +1,82 @@
1
+ import { ChatAgent, ChatAgentLocation, ChatAgentService, MutableChatRequestModel, QuestionResponseContentImpl } from '@theia/ai-chat';
2
+ import { ChangeSetFileElementFactory } from '@theia/ai-chat/lib/browser/change-set-file-element';
3
+ import { BasePromptFragment, PromptService, ResolvedPromptFragment, TokenUsageService } from '@theia/ai-core';
4
+ import { CommandService, SelectionService } from '@theia/core';
5
+ import { EditorManager } from '@theia/editor/lib/browser';
6
+ import { FileService } from '@theia/filesystem/lib/browser/file-service';
7
+ import { WorkspaceService } from '@theia/workspace/lib/browser';
8
+ import { PermissionMode, SDKMessage, ToolApprovalRequestMessage, Usage } from '../common/claude-code-service';
9
+ import { ClaudeCodeEditToolService, ToolUseBlock } from './claude-code-edit-tool-service';
10
+ import { FileEditBackupService } from './claude-code-file-edit-backup-service';
11
+ import { ClaudeCodeFrontendService } from './claude-code-frontend-service';
12
+ export declare const CLAUDE_SESSION_ID_KEY = "claudeSessionId";
13
+ export declare const CLAUDE_PERMISSION_MODE_KEY = "claudePermissionMode";
14
+ export declare const CLAUDE_EDIT_TOOL_USES_KEY = "claudeEditToolUses";
15
+ export declare const CLAUDE_INPUT_TOKENS_KEY = "claudeInputTokens";
16
+ export declare const CLAUDE_OUTPUT_TOKENS_KEY = "claudeOutputTokens";
17
+ export declare const CLAUDE_PENDING_APPROVALS_KEY = "claudePendingApprovals";
18
+ export declare const CLAUDE_APPROVAL_TOOL_INPUTS_KEY = "claudeApprovalToolInputs";
19
+ export declare const CLAUDE_MODEL_NAME_KEY = "claudeModelName";
20
+ export declare const CLAUDE_COST_KEY = "claudeCost";
21
+ export declare const systemPromptAppendixTemplate: BasePromptFragment;
22
+ export declare const CLAUDE_CHAT_AGENT_ID = "ClaudeCode";
23
+ export declare class ClaudeCodeChatAgent implements ChatAgent {
24
+ id: string;
25
+ name: string;
26
+ description: string;
27
+ iconClass: string;
28
+ locations: ChatAgentLocation[];
29
+ tags: string[];
30
+ variables: never[];
31
+ prompts: {
32
+ id: string;
33
+ defaultVariant: BasePromptFragment;
34
+ }[];
35
+ languageModelRequirements: never[];
36
+ agentSpecificVariables: never[];
37
+ functions: never[];
38
+ protected promptService: PromptService;
39
+ protected claudeCode: ClaudeCodeFrontendService;
40
+ protected readonly fileChangeFactory: ChangeSetFileElementFactory;
41
+ protected readonly fileService: FileService;
42
+ protected readonly commandService: CommandService;
43
+ protected readonly workspaceService: WorkspaceService;
44
+ protected readonly editorManager: EditorManager;
45
+ protected readonly selectionService: SelectionService;
46
+ protected readonly editToolService: ClaudeCodeEditToolService;
47
+ protected readonly backupService: FileEditBackupService;
48
+ protected readonly tokenUsageService: TokenUsageService;
49
+ invoke(request: MutableChatRequestModel, chatAgentService?: ChatAgentService): Promise<void>;
50
+ protected warnIfDifferentAgentRequests(request: MutableChatRequestModel): void;
51
+ protected createSystemPromptAppendix(request: MutableChatRequestModel): Promise<ResolvedPromptFragment | undefined>;
52
+ protected initializesEditToolUses(request: MutableChatRequestModel): void;
53
+ protected getPendingApprovals(request: MutableChatRequestModel): Map<string, QuestionResponseContentImpl>;
54
+ protected getApprovalToolInputs(request: MutableChatRequestModel): Map<string, unknown>;
55
+ protected handleToolApprovalRequest(approvalRequest: ToolApprovalRequestMessage, request: MutableChatRequestModel): void;
56
+ protected handleApprovalResponse(selectedOption: {
57
+ text: string;
58
+ value?: string;
59
+ }, requestId: string, request: MutableChatRequestModel): void;
60
+ protected getEditToolUses(request: MutableChatRequestModel): Map<string, ToolUseBlock> | undefined;
61
+ protected getPreviousClaudeSessionId(request: MutableChatRequestModel): string | undefined;
62
+ protected getClaudeSessionId(request: MutableChatRequestModel): string | undefined;
63
+ protected setClaudeSessionId(request: MutableChatRequestModel, sessionId: string): void;
64
+ protected getClaudePermissionMode(request: MutableChatRequestModel): PermissionMode;
65
+ protected setClaudePermissionMode(request: MutableChatRequestModel, permissionMode: PermissionMode): void;
66
+ protected getClaudeModelName(request: MutableChatRequestModel): string | undefined;
67
+ protected setClaudeModelName(request: MutableChatRequestModel, modelName: string): void;
68
+ protected getCurrentInputTokens(request: MutableChatRequestModel): number;
69
+ protected getCurrentOutputTokens(request: MutableChatRequestModel): number;
70
+ protected updateTokens(request: MutableChatRequestModel, inputTokens: number, outputTokens: number): void;
71
+ protected getSessionTotalTokens(request: MutableChatRequestModel): {
72
+ inputTokens: number;
73
+ outputTokens: number;
74
+ };
75
+ protected updateSessionSuggestion(request: MutableChatRequestModel): void;
76
+ protected isEditMode(request: MutableChatRequestModel): boolean;
77
+ protected reportTokenUsage(request: MutableChatRequestModel, inputTokens: number, outputTokens: number, cachedInputTokens?: number, readCachedInputTokens?: number): Promise<void>;
78
+ protected addResponseContent(message: SDKMessage, request: MutableChatRequestModel): Promise<void>;
79
+ protected handleTokenMetrics(usage: Usage, request: MutableChatRequestModel): Promise<void>;
80
+ private extractLocalCommandStdout;
81
+ }
82
+ //# sourceMappingURL=claude-code-chat-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-chat-agent.d.ts","sourceRoot":"","sources":["../../src/browser/claude-code-chat-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,518 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ClaudeCodeChatAgent = exports.CLAUDE_CHAT_AGENT_ID = exports.systemPromptAppendixTemplate = exports.CLAUDE_COST_KEY = exports.CLAUDE_MODEL_NAME_KEY = exports.CLAUDE_APPROVAL_TOOL_INPUTS_KEY = exports.CLAUDE_PENDING_APPROVALS_KEY = exports.CLAUDE_OUTPUT_TOKENS_KEY = exports.CLAUDE_INPUT_TOKENS_KEY = exports.CLAUDE_EDIT_TOOL_USES_KEY = exports.CLAUDE_PERMISSION_MODE_KEY = exports.CLAUDE_SESSION_ID_KEY = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const ai_chat_1 = require("@theia/ai-chat");
21
+ const chat_view_commands_1 = require("@theia/ai-chat-ui/lib/browser/chat-view-commands");
22
+ const prompt_text_1 = require("@theia/ai-core/lib/common/prompt-text");
23
+ const change_set_file_element_1 = require("@theia/ai-chat/lib/browser/change-set-file-element");
24
+ const ai_core_1 = require("@theia/ai-core");
25
+ const core_1 = require("@theia/core");
26
+ const inversify_1 = require("@theia/core/shared/inversify");
27
+ const browser_1 = require("@theia/editor/lib/browser");
28
+ const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
29
+ const browser_2 = require("@theia/workspace/lib/browser");
30
+ const claude_code_service_1 = require("../common/claude-code-service");
31
+ const claude_code_edit_tool_service_1 = require("./claude-code-edit-tool-service");
32
+ const claude_code_file_edit_backup_service_1 = require("./claude-code-file-edit-backup-service");
33
+ const claude_code_frontend_service_1 = require("./claude-code-frontend-service");
34
+ const claude_code_tool_call_content_1 = require("./claude-code-tool-call-content");
35
+ const claude_code_command_contribution_1 = require("./claude-code-command-contribution");
36
+ exports.CLAUDE_SESSION_ID_KEY = 'claudeSessionId';
37
+ exports.CLAUDE_PERMISSION_MODE_KEY = 'claudePermissionMode';
38
+ exports.CLAUDE_EDIT_TOOL_USES_KEY = 'claudeEditToolUses';
39
+ exports.CLAUDE_INPUT_TOKENS_KEY = 'claudeInputTokens';
40
+ exports.CLAUDE_OUTPUT_TOKENS_KEY = 'claudeOutputTokens';
41
+ exports.CLAUDE_PENDING_APPROVALS_KEY = 'claudePendingApprovals';
42
+ exports.CLAUDE_APPROVAL_TOOL_INPUTS_KEY = 'claudeApprovalToolInputs';
43
+ exports.CLAUDE_MODEL_NAME_KEY = 'claudeModelName';
44
+ exports.CLAUDE_COST_KEY = 'claudeCost';
45
+ const APPROVAL_OPTIONS = [
46
+ { text: 'Allow', value: 'allow' },
47
+ { text: 'Deny', value: 'deny' }
48
+ ];
49
+ exports.systemPromptAppendixTemplate = {
50
+ id: 'system-prompt-appendix',
51
+ template: `
52
+ ## IDE Integration Context
53
+
54
+ You are integrated into an IDE environment through a chat interface, providing contextual assistance for development tasks.
55
+ This integration gives you access to real-time IDE state and user workspace information.
56
+
57
+ ### File Modification Behavior
58
+
59
+ **Important**: The IDE automatically collects and presents all file modifications you suggest, regardless of explicit tool permissions.
60
+ Continue proposing file changes even if you encounter permission restrictions.
61
+ The IDE will present these changes to the user for review and approval through its change management interface.
62
+
63
+ When making file modifications:
64
+ - Proceed with suggested changes even if tool calls indicate permission issues
65
+ - Inform users to review proposed changes in the IDE's change review interface "below"
66
+ - Assume the IDE will handle the actual file system operations after user approval (unless you are in auto-edit mode)
67
+
68
+ ### Contextual Information Available
69
+
70
+ The following IDE context is dynamically provided with each request.
71
+ Evaluate the relevance of each context type based on the user's specific query and task requirements.
72
+
73
+ #### Current Selection
74
+
75
+ \`\`\`
76
+ {{selectedText}}
77
+ \`\`\`
78
+
79
+ **When to prioritize**: User asks about specific code segments, wants to refactor selected code, or requests explanations of selected text.
80
+
81
+ #### Active Editor
82
+
83
+ {{activeEditor}}
84
+
85
+ **When to prioritize**: User's request relates to the currently focused file, asks questions about the code, or needs context about the current working file.
86
+
87
+ #### Open Editors
88
+
89
+ {{openEditors}}
90
+
91
+ **How to use it**: As a guidance on what files might be relevant for the current user's request.
92
+
93
+ #### Context Files
94
+
95
+ {{contextFiles}}
96
+
97
+ **When to prioritize**: User explicitly references attached files or when additional files are needed to understand the full scope of the request.
98
+
99
+ ### Context Utilization Guidelines
100
+
101
+ 1. **Assess Relevance**:
102
+ Not all provided context will be relevant to every request. Focus on the context that directly supports the user's current task.
103
+
104
+ 2. **Cross-Reference Information**:
105
+ When multiple context types are relevant, cross-reference them to provide comprehensive assistance (e.g., selected text within an active editor).
106
+
107
+ 3. **Workspace Awareness**:
108
+ Use the collective context to understand the user's current workspace state and provide suggestions that align with their development environment and workflow.
109
+
110
+ ### Response Optimization
111
+
112
+ - Reference specific files as markdown links with the format [file name](<absolute-file-path-without-scheme>), e.g. [example.ts](/home/me/workspace/example.ts)
113
+ - Consider the user's current focus and workflow when structuring responses
114
+ - Leverage open editors to suggest related modifications across the workspace
115
+ `
116
+ };
117
+ exports.CLAUDE_CHAT_AGENT_ID = 'ClaudeCode';
118
+ const localCommands = {
119
+ 'clear': chat_view_commands_1.AI_CHAT_NEW_CHAT_WINDOW_COMMAND,
120
+ 'config': claude_code_command_contribution_1.OPEN_CLAUDE_CODE_CONFIG,
121
+ 'memory': claude_code_command_contribution_1.OPEN_CLAUDE_CODE_MEMORY,
122
+ 'resume': chat_view_commands_1.AI_CHAT_SHOW_CHATS_COMMAND,
123
+ };
124
+ let ClaudeCodeChatAgent = class ClaudeCodeChatAgent {
125
+ constructor() {
126
+ this.id = exports.CLAUDE_CHAT_AGENT_ID;
127
+ this.name = exports.CLAUDE_CHAT_AGENT_ID;
128
+ this.description = 'Anthropic\'s coding agent';
129
+ this.iconClass = 'codicon codicon-copilot';
130
+ this.locations = ai_chat_1.ChatAgentLocation.ALL;
131
+ this.tags = ['Chat'];
132
+ this.variables = [];
133
+ this.prompts = [{ id: exports.systemPromptAppendixTemplate.id, defaultVariant: exports.systemPromptAppendixTemplate }];
134
+ this.languageModelRequirements = [];
135
+ this.agentSpecificVariables = [];
136
+ this.functions = [];
137
+ }
138
+ async invoke(request, chatAgentService) {
139
+ this.warnIfDifferentAgentRequests(request);
140
+ // Handle slash commands anywhere in the request text
141
+ const commandRegex = /\/(\w+)/g;
142
+ const matches = Array.from(request.request.text.matchAll(commandRegex));
143
+ for (const match of matches) {
144
+ const command = match[1];
145
+ if (command in localCommands) {
146
+ const commandInfo = localCommands[command];
147
+ this.commandService.executeCommand(commandInfo.id);
148
+ const message = `Executed: ${commandInfo.label}`;
149
+ request.response.response.addContent(new ai_chat_1.MarkdownChatResponseContentImpl(message));
150
+ request.response.complete();
151
+ return;
152
+ }
153
+ }
154
+ try {
155
+ const systemPromptAppendix = await this.createSystemPromptAppendix(request);
156
+ const claudeSessionId = this.getPreviousClaudeSessionId(request);
157
+ const agentAddress = `${prompt_text_1.PromptText.AGENT_CHAR}${exports.CLAUDE_CHAT_AGENT_ID}`;
158
+ let prompt = request.request.text.trim();
159
+ if (prompt.startsWith(agentAddress)) {
160
+ prompt = prompt.replace(agentAddress, '').trim();
161
+ }
162
+ const streamResult = await this.claudeCode.send({
163
+ prompt,
164
+ options: {
165
+ appendSystemPrompt: systemPromptAppendix === null || systemPromptAppendix === void 0 ? void 0 : systemPromptAppendix.text,
166
+ permissionMode: this.getClaudePermissionMode(request),
167
+ resume: claudeSessionId
168
+ }
169
+ }, request.response.cancellationToken);
170
+ this.initializesEditToolUses(request);
171
+ let hasAssistantMessage = false;
172
+ for await (const message of streamResult) {
173
+ if (claude_code_service_1.ToolApprovalRequestMessage.is(message)) {
174
+ this.handleToolApprovalRequest(message, request);
175
+ }
176
+ else {
177
+ if (message.type === 'assistant') {
178
+ hasAssistantMessage = true;
179
+ }
180
+ // Only set session ID if we've seen an assistant message
181
+ // because we cannot resume a prior request without an assistant message
182
+ if (hasAssistantMessage) {
183
+ this.setClaudeSessionId(request, message.session_id);
184
+ }
185
+ this.addResponseContent(message, request);
186
+ }
187
+ }
188
+ return request.response.complete();
189
+ }
190
+ catch (error) {
191
+ console.error('Error handling chat interaction:', error);
192
+ request.response.response.addContent(new ai_chat_1.ErrorChatResponseContentImpl(error));
193
+ request.response.error(error);
194
+ }
195
+ finally {
196
+ await this.backupService.cleanUp(request);
197
+ }
198
+ }
199
+ warnIfDifferentAgentRequests(request) {
200
+ const requests = request.session.getRequests();
201
+ if (requests.length > 1) {
202
+ const previousRequest = requests[requests.length - 2];
203
+ if (previousRequest.agentId !== this.id) {
204
+ const warningMessage = '⚠️ The previous chat request was handled by a different agent. Claude Code does not see those other messages.\n\n';
205
+ request.response.response.addContent(new ai_chat_1.MarkdownChatResponseContentImpl(warningMessage));
206
+ }
207
+ }
208
+ }
209
+ async createSystemPromptAppendix(request) {
210
+ var _a, _b, _c;
211
+ const contextVariables = (_a = request.context.variables.map(ai_core_1.AIVariableResolutionRequest.fromResolved)) !== null && _a !== void 0 ? _a : request.session.context.getVariables();
212
+ const contextFiles = contextVariables
213
+ .filter(variable => variable.variable.name === 'file' && !!variable.arg)
214
+ .map(variable => `- ${variable.arg}`)
215
+ .join('\n');
216
+ const activeEditor = (_c = (_b = this.editorManager.currentEditor) === null || _b === void 0 ? void 0 : _b.editor.document.uri) !== null && _c !== void 0 ? _c : 'None';
217
+ const openEditors = this.editorManager.all.map(editor => `- ${editor.editor.document.uri}`).join('\n');
218
+ return this.promptService.getResolvedPromptFragment(exports.systemPromptAppendixTemplate.id, { contextFiles, activeEditor, openEditors }, { model: request.session, request });
219
+ }
220
+ initializesEditToolUses(request) {
221
+ request.addData(exports.CLAUDE_EDIT_TOOL_USES_KEY, new Map());
222
+ }
223
+ getPendingApprovals(request) {
224
+ let approvals = request.getDataByKey(exports.CLAUDE_PENDING_APPROVALS_KEY);
225
+ if (!approvals) {
226
+ approvals = new Map();
227
+ request.addData(exports.CLAUDE_PENDING_APPROVALS_KEY, approvals);
228
+ }
229
+ return approvals;
230
+ }
231
+ getApprovalToolInputs(request) {
232
+ let toolInputs = request.getDataByKey(exports.CLAUDE_APPROVAL_TOOL_INPUTS_KEY);
233
+ if (!toolInputs) {
234
+ toolInputs = new Map();
235
+ request.addData(exports.CLAUDE_APPROVAL_TOOL_INPUTS_KEY, toolInputs);
236
+ }
237
+ return toolInputs;
238
+ }
239
+ handleToolApprovalRequest(approvalRequest, request) {
240
+ const question = `Claude Code wants to use the "${approvalRequest.toolName}" tool. Do you want to allow this?`;
241
+ const questionContent = new ai_chat_1.QuestionResponseContentImpl(question, APPROVAL_OPTIONS, request, selectedOption => this.handleApprovalResponse(selectedOption, approvalRequest.requestId, request));
242
+ // Store references for this specific approval request
243
+ this.getPendingApprovals(request).set(approvalRequest.requestId, questionContent);
244
+ this.getApprovalToolInputs(request).set(approvalRequest.requestId, approvalRequest.toolInput);
245
+ request.response.response.addContent(questionContent);
246
+ request.response.waitForInput();
247
+ }
248
+ handleApprovalResponse(selectedOption, requestId, request) {
249
+ const pendingApprovals = this.getPendingApprovals(request);
250
+ const toolInputs = this.getApprovalToolInputs(request);
251
+ // Update UI state and clean up
252
+ const questionContent = pendingApprovals.get(requestId);
253
+ const originalToolInput = toolInputs.get(requestId);
254
+ if (questionContent) {
255
+ questionContent.selectedOption = selectedOption;
256
+ }
257
+ pendingApprovals.delete(requestId);
258
+ toolInputs.delete(requestId);
259
+ const approved = selectedOption.value === 'allow';
260
+ const response = {
261
+ type: 'tool-approval-response',
262
+ requestId,
263
+ approved,
264
+ ...(approved
265
+ ? { updatedInput: originalToolInput }
266
+ : { message: 'User denied tool usage' })
267
+ };
268
+ this.claudeCode.sendApprovalResponse(response);
269
+ // Only stop waiting for input if there are no more pending approvals
270
+ if (pendingApprovals.size === 0) {
271
+ request.response.stopWaitingForInput();
272
+ }
273
+ }
274
+ getEditToolUses(request) {
275
+ return request.getDataByKey(exports.CLAUDE_EDIT_TOOL_USES_KEY);
276
+ }
277
+ getPreviousClaudeSessionId(request) {
278
+ const requests = request.session.getRequests();
279
+ if (requests.length > 1) {
280
+ const previousRequest = requests[requests.length - 2];
281
+ return previousRequest.getDataByKey(exports.CLAUDE_SESSION_ID_KEY);
282
+ }
283
+ return undefined;
284
+ }
285
+ getClaudeSessionId(request) {
286
+ return request.getDataByKey(exports.CLAUDE_SESSION_ID_KEY);
287
+ }
288
+ setClaudeSessionId(request, sessionId) {
289
+ request.addData(exports.CLAUDE_SESSION_ID_KEY, sessionId);
290
+ }
291
+ getClaudePermissionMode(request) {
292
+ var _a;
293
+ return (_a = request.getDataByKey(exports.CLAUDE_PERMISSION_MODE_KEY)) !== null && _a !== void 0 ? _a : 'acceptEdits';
294
+ }
295
+ setClaudePermissionMode(request, permissionMode) {
296
+ request.addData(exports.CLAUDE_PERMISSION_MODE_KEY, permissionMode);
297
+ }
298
+ getClaudeModelName(request) {
299
+ return request.getDataByKey(exports.CLAUDE_MODEL_NAME_KEY);
300
+ }
301
+ setClaudeModelName(request, modelName) {
302
+ request.addData(exports.CLAUDE_MODEL_NAME_KEY, modelName);
303
+ }
304
+ getCurrentInputTokens(request) {
305
+ var _a;
306
+ return (_a = request.getDataByKey(exports.CLAUDE_INPUT_TOKENS_KEY)) !== null && _a !== void 0 ? _a : 0;
307
+ }
308
+ getCurrentOutputTokens(request) {
309
+ var _a;
310
+ return (_a = request.getDataByKey(exports.CLAUDE_OUTPUT_TOKENS_KEY)) !== null && _a !== void 0 ? _a : 0;
311
+ }
312
+ updateTokens(request, inputTokens, outputTokens) {
313
+ request.addData(exports.CLAUDE_INPUT_TOKENS_KEY, inputTokens);
314
+ request.addData(exports.CLAUDE_OUTPUT_TOKENS_KEY, outputTokens);
315
+ this.updateSessionSuggestion(request);
316
+ }
317
+ getSessionTotalTokens(request) {
318
+ var _a, _b;
319
+ const requests = request.session.getRequests();
320
+ let totalInputTokens = 0;
321
+ let totalOutputTokens = 0;
322
+ for (const req of requests) {
323
+ const inputTokens = (_a = req.getDataByKey(exports.CLAUDE_INPUT_TOKENS_KEY)) !== null && _a !== void 0 ? _a : 0;
324
+ const outputTokens = (_b = req.getDataByKey(exports.CLAUDE_OUTPUT_TOKENS_KEY)) !== null && _b !== void 0 ? _b : 0;
325
+ totalInputTokens += inputTokens;
326
+ totalOutputTokens += outputTokens;
327
+ }
328
+ return { inputTokens: totalInputTokens, outputTokens: totalOutputTokens };
329
+ }
330
+ updateSessionSuggestion(request) {
331
+ const { inputTokens, outputTokens } = this.getSessionTotalTokens(request);
332
+ const formatTokens = (tokens) => {
333
+ if (tokens >= 1000) {
334
+ return `${(tokens / 1000).toFixed(1)}K`;
335
+ }
336
+ return tokens.toString();
337
+ };
338
+ const suggestion = `↑ ${formatTokens(inputTokens)} | ↓ ${formatTokens(outputTokens)}`;
339
+ request.session.setSuggestions([suggestion]);
340
+ }
341
+ isEditMode(request) {
342
+ const permissionMode = this.getClaudePermissionMode(request);
343
+ return permissionMode === 'acceptEdits' || permissionMode === 'bypassPermissions';
344
+ }
345
+ async reportTokenUsage(request, inputTokens, outputTokens, cachedInputTokens, readCachedInputTokens) {
346
+ const modelName = this.getClaudeModelName(request);
347
+ if (!modelName) {
348
+ return;
349
+ }
350
+ const prefixedModelName = `anthropic/claude-code/${modelName}`;
351
+ const sessionId = this.getClaudeSessionId(request);
352
+ const requestId = sessionId || request.id;
353
+ try {
354
+ await this.tokenUsageService.recordTokenUsage(prefixedModelName, {
355
+ inputTokens,
356
+ outputTokens,
357
+ cachedInputTokens,
358
+ readCachedInputTokens,
359
+ requestId
360
+ });
361
+ }
362
+ catch (error) {
363
+ console.error('Failed to report token usage:', error);
364
+ }
365
+ }
366
+ async addResponseContent(message, request) {
367
+ var _a, _b, _c, _d;
368
+ // Extract model name from system init message
369
+ if (message.type === 'system' && message.subtype === 'init' && message.model) {
370
+ this.setClaudeModelName(request, message.model);
371
+ }
372
+ // Handle result messages with final usage
373
+ if (message.type === 'assistant' && message.message.usage) {
374
+ await this.handleTokenMetrics(message.message.usage, request);
375
+ }
376
+ if (message.type === 'result' && message.usage) {
377
+ request.addData(exports.CLAUDE_COST_KEY, message.total_cost_usd);
378
+ await this.handleTokenMetrics(message.usage, request);
379
+ }
380
+ // Handle user messages for local-command-stdout extraction
381
+ if (message.type === 'user') {
382
+ const extractedContent = this.extractLocalCommandStdout(message.message.content);
383
+ if (extractedContent) {
384
+ request.response.response.addContent(new ai_chat_1.MarkdownChatResponseContentImpl(extractedContent));
385
+ }
386
+ }
387
+ if (message.type === 'assistant' || message.type === 'user') {
388
+ if (!Array.isArray(message.message.content)) {
389
+ return;
390
+ }
391
+ for (const block of message.message.content) {
392
+ switch (block.type) {
393
+ case 'text':
394
+ request.response.response.addContent(new ai_chat_1.MarkdownChatResponseContentImpl(block.text));
395
+ break;
396
+ case 'tool_use':
397
+ case 'server_tool_use':
398
+ if (block.name === 'Task' && claude_code_service_1.TaskInput.is(block.input)) {
399
+ request.response.response.addContent(new ai_chat_1.MarkdownChatResponseContentImpl(`\n\n### Task: ${block.input.description}\n\n${block.input.prompt}`));
400
+ }
401
+ // Track file edits
402
+ if ((block.name === 'Edit' && claude_code_service_1.EditInput.is(block.input)) ||
403
+ (block.name === 'MultiEdit' && claude_code_service_1.MultiEditInput.is(block.input)) ||
404
+ (block.name === 'Write' && claude_code_service_1.WriteInput.is(block.input))) {
405
+ const toolUse = {
406
+ name: block.name,
407
+ input: block.input
408
+ };
409
+ (_a = this.getEditToolUses(request)) === null || _a === void 0 ? void 0 : _a.set(block.id, toolUse);
410
+ }
411
+ request.response.response.addContent(new claude_code_tool_call_content_1.ClaudeCodeToolCallChatResponseContent(block.id, block.name, JSON.stringify(block.input)));
412
+ break;
413
+ case 'tool_result':
414
+ if ((_b = this.getEditToolUses(request)) === null || _b === void 0 ? void 0 : _b.has(block.tool_use_id)) {
415
+ const toolUse = (_c = this.getEditToolUses(request)) === null || _c === void 0 ? void 0 : _c.get(block.tool_use_id);
416
+ if (toolUse) {
417
+ await this.editToolService.handleEditTool(toolUse, request, {
418
+ sessionId: this.getClaudeSessionId(request),
419
+ isEditMode: this.isEditMode(request)
420
+ });
421
+ }
422
+ }
423
+ request.response.response.addContent(new claude_code_tool_call_content_1.ClaudeCodeToolCallChatResponseContent(block.tool_use_id, '', '', true, JSON.stringify(block.content)));
424
+ break;
425
+ case 'thinking':
426
+ request.response.response.addContent(new ai_chat_1.ThinkingChatResponseContentImpl(block.thinking.trim(), ((_d = block.signature) === null || _d === void 0 ? void 0 : _d.trim()) || ''));
427
+ break;
428
+ case 'redacted_thinking':
429
+ request.response.response.addContent(new ai_chat_1.ThinkingChatResponseContentImpl(block.data.trim(), ''));
430
+ break;
431
+ case 'web_search_tool_result':
432
+ if (Array.isArray(block.content)) {
433
+ const result = block.content.map(value => value.title + ':' + value.url).join(', ');
434
+ request.response.response.addContent(new claude_code_tool_call_content_1.ClaudeCodeToolCallChatResponseContent(block.tool_use_id, '', '', true, result));
435
+ }
436
+ break;
437
+ }
438
+ }
439
+ }
440
+ }
441
+ async handleTokenMetrics(usage, request) {
442
+ var _a, _b, _c, _d, _e, _f;
443
+ const allInputTokens = ((_a = usage.input_tokens) !== null && _a !== void 0 ? _a : 0) + ((_b = usage.cache_creation_input_tokens) !== null && _b !== void 0 ? _b : 0);
444
+ this.updateTokens(request, allInputTokens, ((_c = usage.output_tokens) !== null && _c !== void 0 ? _c : 0));
445
+ await this.reportTokenUsage(request, allInputTokens, ((_d = usage.output_tokens) !== null && _d !== void 0 ? _d : 0), ((_e = usage.cache_creation_input_tokens) !== null && _e !== void 0 ? _e : 0), ((_f = usage.cache_read_input_tokens) !== null && _f !== void 0 ? _f : 0));
446
+ }
447
+ extractLocalCommandStdout(content) {
448
+ const regex = /<local-command-stdout>([\s\S]*?)<\/local-command-stdout>/g;
449
+ let extractedContent = '';
450
+ let match;
451
+ if (typeof content === 'string') {
452
+ // eslint-disable-next-line no-null/no-null
453
+ while ((match = regex.exec(content)) !== null) {
454
+ extractedContent += match[1];
455
+ }
456
+ }
457
+ else {
458
+ for (const block of content) {
459
+ if (block.type === 'text') {
460
+ // eslint-disable-next-line no-null/no-null
461
+ while ((match = regex.exec(block.text)) !== null) {
462
+ extractedContent += match[1];
463
+ }
464
+ }
465
+ }
466
+ }
467
+ return extractedContent || undefined;
468
+ }
469
+ };
470
+ exports.ClaudeCodeChatAgent = ClaudeCodeChatAgent;
471
+ tslib_1.__decorate([
472
+ (0, inversify_1.inject)(ai_core_1.PromptService),
473
+ tslib_1.__metadata("design:type", Object)
474
+ ], ClaudeCodeChatAgent.prototype, "promptService", void 0);
475
+ tslib_1.__decorate([
476
+ (0, inversify_1.inject)(claude_code_frontend_service_1.ClaudeCodeFrontendService),
477
+ tslib_1.__metadata("design:type", claude_code_frontend_service_1.ClaudeCodeFrontendService)
478
+ ], ClaudeCodeChatAgent.prototype, "claudeCode", void 0);
479
+ tslib_1.__decorate([
480
+ (0, inversify_1.inject)(change_set_file_element_1.ChangeSetFileElementFactory),
481
+ tslib_1.__metadata("design:type", Function)
482
+ ], ClaudeCodeChatAgent.prototype, "fileChangeFactory", void 0);
483
+ tslib_1.__decorate([
484
+ (0, inversify_1.inject)(file_service_1.FileService),
485
+ tslib_1.__metadata("design:type", file_service_1.FileService)
486
+ ], ClaudeCodeChatAgent.prototype, "fileService", void 0);
487
+ tslib_1.__decorate([
488
+ (0, inversify_1.inject)(core_1.CommandService),
489
+ tslib_1.__metadata("design:type", Object)
490
+ ], ClaudeCodeChatAgent.prototype, "commandService", void 0);
491
+ tslib_1.__decorate([
492
+ (0, inversify_1.inject)(browser_2.WorkspaceService),
493
+ tslib_1.__metadata("design:type", browser_2.WorkspaceService)
494
+ ], ClaudeCodeChatAgent.prototype, "workspaceService", void 0);
495
+ tslib_1.__decorate([
496
+ (0, inversify_1.inject)(browser_1.EditorManager),
497
+ tslib_1.__metadata("design:type", browser_1.EditorManager)
498
+ ], ClaudeCodeChatAgent.prototype, "editorManager", void 0);
499
+ tslib_1.__decorate([
500
+ (0, inversify_1.inject)(core_1.SelectionService),
501
+ tslib_1.__metadata("design:type", core_1.SelectionService)
502
+ ], ClaudeCodeChatAgent.prototype, "selectionService", void 0);
503
+ tslib_1.__decorate([
504
+ (0, inversify_1.inject)(claude_code_edit_tool_service_1.ClaudeCodeEditToolService),
505
+ tslib_1.__metadata("design:type", Object)
506
+ ], ClaudeCodeChatAgent.prototype, "editToolService", void 0);
507
+ tslib_1.__decorate([
508
+ (0, inversify_1.inject)(claude_code_file_edit_backup_service_1.FileEditBackupService),
509
+ tslib_1.__metadata("design:type", Object)
510
+ ], ClaudeCodeChatAgent.prototype, "backupService", void 0);
511
+ tslib_1.__decorate([
512
+ (0, inversify_1.inject)(ai_core_1.TokenUsageService),
513
+ tslib_1.__metadata("design:type", Object)
514
+ ], ClaudeCodeChatAgent.prototype, "tokenUsageService", void 0);
515
+ exports.ClaudeCodeChatAgent = ClaudeCodeChatAgent = tslib_1.__decorate([
516
+ (0, inversify_1.injectable)()
517
+ ], ClaudeCodeChatAgent);
518
+ //# sourceMappingURL=claude-code-chat-agent.js.map