@gitlab/duo-ui 10.19.0 → 10.21.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 (27) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/agentic_chat/agentic_duo_chat.js +8 -3
  3. package/dist/components/chat/components/duo_chat_header/duo_chat_header.js +28 -3
  4. package/dist/components/chat/components/duo_chat_message_tool_approval/components/create_commit_tool_params.js +148 -0
  5. package/dist/components/chat/components/duo_chat_message_tool_approval/components/create_issue_tool_params.js +88 -0
  6. package/dist/components/chat/components/duo_chat_message_tool_approval/components/create_merge_request_tool_params.js +83 -0
  7. package/dist/components/chat/components/duo_chat_message_tool_approval/components/pre_block.js +38 -0
  8. package/dist/components/chat/components/duo_chat_message_tool_approval/components/run_command_tool_params.js +62 -0
  9. package/dist/components/chat/components/duo_chat_message_tool_approval/message_tool_approval.js +46 -8
  10. package/dist/components/chat/mock_data.js +85 -1
  11. package/dist/components.css +1 -1
  12. package/dist/components.css.map +1 -1
  13. package/dist/tailwind.css +1 -1
  14. package/dist/tailwind.css.map +1 -1
  15. package/dist/utils/object.js +9 -0
  16. package/package.json +4 -4
  17. package/src/components/agentic_chat/agentic_duo_chat.vue +9 -2
  18. package/src/components/chat/components/duo_chat_header/duo_chat_header.vue +64 -12
  19. package/src/components/chat/components/duo_chat_message_tool_approval/components/create_commit_tool_params.vue +155 -0
  20. package/src/components/chat/components/duo_chat_message_tool_approval/components/create_issue_tool_params.vue +80 -0
  21. package/src/components/chat/components/duo_chat_message_tool_approval/components/create_merge_request_tool_params.vue +74 -0
  22. package/src/components/chat/components/duo_chat_message_tool_approval/components/pre_block.vue +5 -0
  23. package/src/components/chat/components/duo_chat_message_tool_approval/components/run_command_tool_params.vue +30 -0
  24. package/src/components/chat/components/duo_chat_message_tool_approval/message_tool_approval.vue +143 -88
  25. package/src/components/chat/mock_data.js +99 -0
  26. package/src/utils/object.js +4 -0
  27. package/translations.js +24 -2
@@ -1,6 +1,18 @@
1
1
  <script>
2
- import { GlButton, GlIcon, GlFormTextarea, GlFormGroup } from '@gitlab/ui';
2
+ import { GlButton, GlFormTextarea, GlFormGroup, GlCard, GlBadge } from '@gitlab/ui';
3
3
  import { translate } from '../../../../utils/i18n';
4
+ import { convertKeysToCamelCase } from '../../../../utils/object';
5
+ import CreateCommitToolParams from './components/create_commit_tool_params.vue';
6
+ import CreateIssueToolParams from './components/create_issue_tool_params.vue';
7
+ import CreateMergeRequestToolParams from './components/create_merge_request_tool_params.vue';
8
+ import RunCommandToolParams from './components/run_command_tool_params.vue';
9
+
10
+ export const APPROVAL_TOOL_NAMES = {
11
+ createCommit: 'create_commit',
12
+ createIssue: 'create_issue',
13
+ createMergeRequest: 'create_merge_request',
14
+ runCommand: 'run_command',
15
+ };
4
16
 
5
17
  export const PROCESSING_STATE = {
6
18
  APPROVING: 'approving',
@@ -9,10 +21,6 @@ export const PROCESSING_STATE = {
9
21
  };
10
22
 
11
23
  export const i18n = {
12
- TOOL_APPROVAL_TITLE: translate(
13
- 'MessageToolApproval.toolApprovalTitle',
14
- 'Duo would like to execute a tool. Do you want to proceed?'
15
- ),
16
24
  TOOL_APPROVAL_DESCRIPTION: translate(
17
25
  'MessageToolApproval.toolApprovalDescription',
18
26
  'GitLab Duo Agentic Chat wants to execute a tool. Do you want to proceed?'
@@ -34,15 +42,46 @@ export const i18n = {
34
42
  "Tell Duo why you're rejecting this tool execution..."
35
43
  ),
36
44
  CANCEL_TEXT: translate('MessageToolApproval.cancelText', 'Cancel'),
45
+ TOOL_APPROVAL_TITLES: {
46
+ [APPROVAL_TOOL_NAMES.createCommit]: translate(
47
+ 'MessageToolApproval.createCommit',
48
+ 'Duo wants to push a commit.'
49
+ ),
50
+ [APPROVAL_TOOL_NAMES.createIssue]: translate(
51
+ 'MessageToolApproval.createIssue',
52
+ 'Duo wants to open an issue.'
53
+ ),
54
+ [APPROVAL_TOOL_NAMES.createMergeRequest]: translate(
55
+ 'MessageToolApproval.createMergeRequest',
56
+ 'Duo wants to create a merge request.'
57
+ ),
58
+ [APPROVAL_TOOL_NAMES.runCommand]: translate(
59
+ 'MessageToolApproval.runCommand',
60
+ 'Duo wants to run a command.'
61
+ ),
62
+ },
63
+ TOOL_STATUS: translate('MessageToolApproval.toolStatus', 'Pending'),
64
+ };
65
+
66
+ const TOOL_PARAMS_VIEW_COMPONENTS = {
67
+ [APPROVAL_TOOL_NAMES.createCommit]: 'CreateCommitToolParams',
68
+ [APPROVAL_TOOL_NAMES.createIssue]: 'CreateIssueToolParams',
69
+ [APPROVAL_TOOL_NAMES.createMergeRequest]: 'CreateMergeRequestToolParams',
70
+ [APPROVAL_TOOL_NAMES.runCommand]: 'RunCommandToolParams',
37
71
  };
38
72
 
39
73
  export default {
40
74
  name: 'MessageToolApproval',
41
75
  components: {
42
76
  GlButton,
43
- GlIcon,
77
+ GlCard,
44
78
  GlFormTextarea,
45
79
  GlFormGroup,
80
+ GlBadge,
81
+ CreateCommitToolParams,
82
+ CreateIssueToolParams,
83
+ CreateMergeRequestToolParams,
84
+ RunCommandToolParams,
46
85
  },
47
86
  props: {
48
87
  message: {
@@ -69,9 +108,15 @@ export default {
69
108
  toolParameters() {
70
109
  return this.message?.tool_info?.args || {};
71
110
  },
111
+ camelCaseToolParameters() {
112
+ return convertKeysToCamelCase(this.toolParameters);
113
+ },
72
114
  hasToolParameters() {
73
115
  return Object.keys(this.toolParameters).length > 0;
74
116
  },
117
+ toolApprovalTitle() {
118
+ return i18n.TOOL_APPROVAL_TITLES[this.toolName];
119
+ },
75
120
  isApproving() {
76
121
  return this.isProcessing && this.localProcessingState === PROCESSING_STATE.APPROVING;
77
122
  },
@@ -87,6 +132,9 @@ export default {
87
132
  denyButtonText() {
88
133
  return this.isDenying ? this.$options.i18n.DENYING_TEXT : this.$options.i18n.DENY_TEXT;
89
134
  },
135
+ toolParamsViewComponent() {
136
+ return TOOL_PARAMS_VIEW_COMPONENTS[this.toolName];
137
+ },
90
138
  },
91
139
  watch: {
92
140
  // Reset local state when processing completes
@@ -127,104 +175,111 @@ export default {
127
175
  },
128
176
  },
129
177
  i18n,
178
+ APPROVAL_TOOL_NAMES,
130
179
  };
131
180
  </script>
132
181
 
133
182
  <template>
134
- <div
135
- class="md gl-border gl-rounded-bl-none gl-border-1 gl-border-solid gl-border-transparent gl-bg-subtle gl-p-4 gl-leading-20 gl-text-default gl-break-anywhere"
136
- >
137
- <p class="gl-mb-3 gl-text-gray-700">
138
- {{ $options.i18n.TOOL_APPROVAL_TITLE }}
139
- </p>
140
-
141
- <div class="gl-mb-3 gl-flex gl-items-center gl-gap-2">
142
- <gl-icon name="work-item-maintenance" class="gl-text-gray-500" />
143
- <strong>{{ toolName }}</strong>
144
- </div>
145
-
146
- <div class="gl-border gl-mb-4 gl-rounded-base gl-border-gray-200 gl-bg-gray-50 gl-p-3">
147
- <p class="gl-mb-1 gl-text-sm gl-text-gray-500">
148
- {{ $options.i18n.REQUEST_TEXT }}
149
- </p>
150
- <code
151
- v-if="hasToolParameters"
152
- class="gl-whitespace-pre-wrap gl-text-sm gl-text-default gl-font-monospace"
153
- data-testid="tool-parameters"
154
- >{{ JSON.stringify(toolParameters, null, 2) }}</code
155
- >
156
- <span v-else class="gl-text-sm gl-text-gray-500" data-testid="no-parameters-message">
157
- {{ $options.i18n.NO_PARAMETERS_TEXT }}
158
- </span>
159
- </div>
160
-
161
- <div v-if="!showDenialReason" class="gl-flex gl-justify-between">
162
- <gl-button
163
- variant="danger"
164
- size="small"
165
- icon="cancel"
166
- data-testid="deny-tool-inline"
167
- :disabled="buttonsDisabled"
168
- :loading="isDenying"
169
- @click="handleDeny"
170
- >
171
- {{ denyButtonText }}
172
- </gl-button>
173
-
174
- <gl-button
175
- variant="confirm"
176
- size="small"
177
- icon="play"
178
- data-testid="approve-tool-inline"
179
- :disabled="buttonsDisabled"
180
- :loading="isApproving"
181
- @click="handleApprove"
182
- >
183
- {{ approveButtonText }}
184
- </gl-button>
183
+ <gl-card>
184
+ <template #header>
185
+ <div class="gl-flex gl-items-center gl-justify-between">
186
+ <span>
187
+ {{ toolApprovalTitle }}
188
+ </span>
189
+ <gl-badge>
190
+ {{ $options.i18n.TOOL_STATUS }}
191
+ </gl-badge>
192
+ </div>
193
+ </template>
194
+ <component
195
+ :is="toolParamsViewComponent"
196
+ v-if="toolParamsViewComponent"
197
+ class="gl-leading-20"
198
+ v-bind="camelCaseToolParameters"
199
+ />
200
+ <div
201
+ v-else
202
+ class="md gl-border gl-rounded-bl-none gl-border-1 gl-border-solid gl-border-transparent gl-bg-subtle gl-p-4 gl-leading-20 gl-text-default gl-break-anywhere"
203
+ >
204
+ <div class="gl-border gl-mb-4 gl-rounded-base gl-border-gray-200 gl-bg-gray-50 gl-p-3">
205
+ <p class="gl-mb-1 gl-text-sm gl-text-gray-500">
206
+ {{ $options.i18n.REQUEST_TEXT }}
207
+ </p>
208
+ <code
209
+ v-if="hasToolParameters"
210
+ class="gl-whitespace-pre-wrap gl-text-sm gl-text-default gl-font-monospace"
211
+ data-testid="tool-parameters"
212
+ >{{ JSON.stringify(toolParameters, null, 2) }}</code
213
+ >
214
+ <span v-else class="gl-text-sm gl-text-gray-500" data-testid="no-parameters-message">
215
+ {{ $options.i18n.NO_PARAMETERS_TEXT }}
216
+ </span>
217
+ </div>
185
218
  </div>
186
- <div v-else class="gl-mt-3">
187
- <gl-form-group
188
- :label="$options.i18n.DENIAL_REASON_LABEL"
189
- label-for="inline-rejection-reason"
190
- :optional="true"
191
- class="gl-mb-3"
192
- >
193
- <gl-form-textarea
194
- id="inline-rejection-reason"
195
- v-model="denialReason"
196
- :placeholder="$options.i18n.DENIAL_REASON_PLACEHOLDER"
197
- :rows="2"
198
- :no-resize="true"
199
- :submit-on-enter="false"
200
- :disabled="buttonsDisabled"
201
- data-testid="denial-reason-textarea"
202
- autofocus
203
- @submit="submitDenial"
204
- />
205
- </gl-form-group>
206
-
207
- <div class="gl-flex gl-gap-3">
219
+ <template #footer>
220
+ <div v-if="!showDenialReason" class="gl-flex gl-gap-2">
208
221
  <gl-button
222
+ variant="confirm"
209
223
  size="small"
210
- data-testid="cancel-denial"
224
+ data-testid="approve-tool-inline"
211
225
  :disabled="buttonsDisabled"
212
- @click="cancelDenial"
226
+ :loading="isApproving"
227
+ @click="handleApprove"
213
228
  >
214
- {{ $options.i18n.CANCEL_TEXT }}
229
+ {{ approveButtonText }}
215
230
  </gl-button>
216
231
  <gl-button
217
- variant="danger"
218
232
  size="small"
219
- icon="cancel"
220
- data-testid="submit-denial"
233
+ data-testid="deny-tool-inline"
221
234
  :disabled="buttonsDisabled"
222
235
  :loading="isDenying"
223
- @click="submitDenial"
236
+ @click="handleDeny"
224
237
  >
225
238
  {{ denyButtonText }}
226
239
  </gl-button>
227
240
  </div>
228
- </div>
229
- </div>
241
+ <div v-else>
242
+ <gl-form-group
243
+ :label="$options.i18n.DENIAL_REASON_LABEL"
244
+ label-for="inline-rejection-reason"
245
+ :optional="true"
246
+ class="gl-mb-3"
247
+ >
248
+ <gl-form-textarea
249
+ id="inline-rejection-reason"
250
+ v-model="denialReason"
251
+ :placeholder="$options.i18n.DENIAL_REASON_PLACEHOLDER"
252
+ :rows="2"
253
+ :no-resize="true"
254
+ :submit-on-enter="false"
255
+ :disabled="buttonsDisabled"
256
+ data-testid="denial-reason-textarea"
257
+ autofocus
258
+ @submit="submitDenial"
259
+ />
260
+ </gl-form-group>
261
+
262
+ <div class="gl-flex gl-gap-3">
263
+ <gl-button
264
+ size="small"
265
+ data-testid="submit-denial"
266
+ variant="confirm"
267
+ :disabled="buttonsDisabled"
268
+ :loading="isDenying"
269
+ @click="submitDenial"
270
+ >
271
+ {{ denyButtonText }}
272
+ </gl-button>
273
+ <gl-button
274
+ size="small"
275
+ data-testid="cancel-denial"
276
+ :disabled="buttonsDisabled"
277
+ @click="cancelDenial"
278
+ >
279
+ {{ $options.i18n.CANCEL_TEXT }}
280
+ </gl-button>
281
+ </div>
282
+ </div>
283
+ </template>
284
+ </gl-card>
230
285
  </template>
@@ -169,6 +169,105 @@ export const MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_PARAMS = {
169
169
  role: 'request',
170
170
  };
171
171
 
172
+ export const MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_CREATE_MERGE_REQUEST = {
173
+ id: '125',
174
+ content: 'Tool create_merge_request requires approval. Please confirm if you want to proceed.',
175
+ message_type: MESSAGE_MODEL_ROLES.request,
176
+ tool_info: {
177
+ name: 'create_merge_request',
178
+ args: {
179
+ project_id: 123,
180
+ source_branch: 'rename-all-spec-files',
181
+ target_branch: 'main',
182
+ title: 'Rename all the *.spec.ts files to *.test.ts',
183
+ description:
184
+ '## What does this MR do?\n\nThis MR updates the `group` field in the `web_ide_language_server` beta feature flag configuration from `group::remote development` to `group:: editor extensions`.\n\n## Related issues\n\nThis change aligns the feature flag with the correct group ownership.\n\n## Changes made\n\n- Updated `config/feature_flags/beta/web_ide_language_server.yml`\n- Changed group field from `group::remote development` to `group:: editor extensions`\n\n## Checklist\n\n- [x] Feature flag configuration updated\n- [x] Group field correctly set to `group:: editor extensions`',
185
+ },
186
+ },
187
+ timestamp: '2025-06-25T19:22:21.290791+00:00',
188
+ status: 'success',
189
+ role: 'request',
190
+ };
191
+
192
+ export const MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_RUN_COMMAND = {
193
+ id: '125',
194
+ content: 'Tool run_command requires approval. Please confirm if you want to proceed.',
195
+ message_type: MESSAGE_MODEL_ROLES.request,
196
+ tool_info: {
197
+ name: 'run_command',
198
+ args: {
199
+ program: 'ls',
200
+ args: '-a | grep package.json',
201
+ },
202
+ },
203
+ timestamp: '2025-06-25T19:22:21.290791+00:00',
204
+ status: 'success',
205
+ role: 'request',
206
+ };
207
+
208
+ export const MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_CREATE_ISSUE = {
209
+ id: '125',
210
+ content: 'Tool run_command requires approval. Please confirm if you want to proceed.',
211
+ message_type: MESSAGE_MODEL_ROLES.request,
212
+ tool_info: {
213
+ name: 'create_issue',
214
+ args: {
215
+ project_id: 123,
216
+ title: 'CSP bug in VSCode Fork prevents loading external web views in Web IDE',
217
+ description:
218
+ "## Problem\n\nThe VSCode Fork implementation has a Content Security Policy (CSP) bug that prevents external web views from loading properly in the Web IDE.\n\n## Impact\n\n- External web views fail to load within the Web IDE environment\n- This affects functionality that relies on embedding external content\n- Users may experience broken or non-functional web view components\n\n## Expected Behavior\n\nExternal web views should load successfully within the Web IDE when permitted by security policies.\n\n## Current Behavior\n\nExternal web views are blocked due to CSP restrictions in the VSCode Fork implementation.\n\n## Technical Details\n\nThis appears to be related to how the VSCode Fork handles Content Security Policy headers, which may be overly restrictive for the Web IDE's use case with external web views.\n\n## Next Steps\n\n- [ ] Investigate the specific CSP directives causing the issue\n- [ ] Determine which external domains/resources need to be allowlisted\n- [ ] Implement appropriate CSP modifications in the VSCode Fork\n- [ ] Test the fix with various external web view scenarios\n- [ ] Ensure security implications are properly evaluated",
219
+ labels: 'bug,web-ide,vscode-fork,csp,security',
220
+ },
221
+ },
222
+ timestamp: '2025-06-25T19:22:21.290791+00:00',
223
+ status: 'success',
224
+ role: 'request',
225
+ };
226
+
227
+ export const MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_CREATE_COMMIT = {
228
+ id: '125',
229
+ content: 'Tool create_commit requires approval. Please confirm if you want to proceed.',
230
+ message_type: MESSAGE_MODEL_ROLES.request,
231
+ tool_info: {
232
+ name: 'create_commit',
233
+ args: {
234
+ project_id: 35104827,
235
+ branch: 'feat/add-web-ide-duo-chat-package',
236
+ start_branch: 'main',
237
+ commit_message:
238
+ 'feat: add web-ide-duo-chat package with TypeScript setup\n\n- Create new package @gitlab/web-ide-duo-chat\n- Set up TypeScript configuration following project patterns\n- Add src directory with index.ts entry point\n- Configure package.json with workspace dependencies\n- Add package reference to root tsconfig.json',
239
+ actions: [
240
+ {
241
+ action: 'create',
242
+ file_path: 'packages/web-ide-duo-chat/package.json',
243
+ content:
244
+ '{\n "name": "@gitlab/web-ide-duo-chat",\n "version": "0.0.1",\n "main": "./src/index.ts",\n "license": "MIT",\n "packageManager": "yarn@3.2.0",\n "devDependencies": {\n "@gitlab/utils-test": "workspace:*"\n },\n "dependencies": {\n "@gitlab/logger": "workspace:*",\n "@gitlab/web-ide-types": "workspace:*"\n },\n "publishConfig": {\n "main": "./lib/index.js"\n }\n}\n',
245
+ },
246
+ {
247
+ action: 'create',
248
+ file_path: 'packages/web-ide-duo-chat/src/types.ts',
249
+ content:
250
+ "/**\n * Represents a chat message in the Duo Chat interface\n */\nexport interface ChatMessage {\n /**\n * Unique identifier for the message\n */\n id: string;\n /**\n * The content of the message\n */\n content: string;\n /**\n * Who sent the message\n */\n sender: 'user' | 'assistant';\n /**\n * Timestamp when the message was created\n */\n timestamp: Date;\n /**\n * Optional metadata for the message\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a chat conversation\n */\nexport interface ChatConversation {\n /**\n * Unique identifier for the conversation\n */\n id: string;\n /**\n * Title of the conversation\n */\n title: string;\n /**\n * Messages in the conversation\n */\n messages: ChatMessage[];\n /**\n * When the conversation was created\n */\n createdAt: Date;\n /**\n * When the conversation was last updated\n */\n updatedAt: Date;\n}\n\n/**\n * Event types for Duo Chat\n */\nexport type DuoChatEvent = \n | { type: 'message-sent'; payload: ChatMessage }\n | { type: 'message-received'; payload: ChatMessage }\n | { type: 'conversation-started'; payload: ChatConversation }\n | { type: 'conversation-ended'; payload: { conversationId: string } }\n | { type: 'error'; payload: { error: Error; context?: string } };\n\n/**\n * Callback function for handling Duo Chat events\n */\nexport type DuoChatEventHandler = (event: DuoChatEvent) => void;\n\n/**\n * Interface for Duo Chat service providers\n */\nexport interface DuoChatProvider {\n /**\n * Send a message and get a response\n */\n sendMessage(message: string, conversationId?: string): Promise<ChatMessage>;\n /**\n * Start a new conversation\n */\n startConversation(title?: string): Promise<ChatConversation>;\n /**\n * Get conversation history\n */\n getConversation(conversationId: string): Promise<ChatConversation | null>;\n /**\n * List all conversations\n */\n listConversations(): Promise<ChatConversation[]>;\n}\n",
251
+ },
252
+ {
253
+ action: 'update',
254
+ file_path: 'tsconfig.json',
255
+ content:
256
+ '{\n "extends": "./tsconfig.base.json",\n "references": [\n { "path": "./packages/example" },\n { "path": "./packages/gitlab-api-client" },\n { "path": "./packages/gitlab-api-client-factory" },\n { "path": "./packages/logger" },\n { "path": "./packages/oauth-client" },\n { "path": "./packages/utils-crypto" },\n { "path": "./packages/utils-escape" },\n { "path": "./packages/utils-test" },\n { "path": "./packages/utils-path" },\n { "path": "./packages/vscode-bootstrap" },\n { "path": "./packages/vscode-mediator-commands" },\n { "path": "./packages/web-ide" },\n { "path": "./packages/web-ide-duo-chat" },\n { "path": "./packages/web-ide-fs" },\n { "path": "./packages/web-ide-types" },\n { "path": "./packages/web-ide-interop" },\n { "path": "./packages/vscode-extension-web-ide" },\n { "path": "./packages/cross-origin-channel" },\n { "path": "./packages/cloudflare" }\n ],\n "files": []\n}\n',
257
+ },
258
+ {
259
+ action: 'move',
260
+ file_path: 'yarn.lock',
261
+ previous_path: 'yarn.lock.bkp',
262
+ },
263
+ ],
264
+ },
265
+ },
266
+ timestamp: '2025-06-25T19:22:21.290791+00:00',
267
+ status: 'success',
268
+ role: 'assistant',
269
+ };
270
+
172
271
  export const MOCK_WORKFLOW_END_MESSAGE = {
173
272
  id: '123',
174
273
  content: "Search for 'duo.*chat.*message' in directory",
@@ -0,0 +1,4 @@
1
+ import mapKeys from 'lodash/mapKeys';
2
+ import camelCase from 'lodash/camelCase';
3
+
4
+ export const convertKeysToCamelCase = (obj = {}) => mapKeys(obj, (value, key) => camelCase(key));
package/translations.js CHANGED
@@ -33,6 +33,25 @@ export default {
33
33
  'AgenticToolRejectionModal.placeholder': "Explain why you're rejecting this tool execution...",
34
34
  'AgenticToolRejectionModal.submitText': 'Submit Rejection',
35
35
  'AgenticToolRejectionModal.title': 'Provide Rejection Reason',
36
+ 'CreateCommitToolParams.actionWithNoContent': 'This action does not have any content.',
37
+ 'CreateCommitToolParams.actionsCountMessage': null,
38
+ 'CreateCommitToolParams.chmodFileActionLabel': 'Change permissions for file %{filePath}',
39
+ 'CreateCommitToolParams.commitSummaryMessage':
40
+ 'Create a commit in the branch %{branch} and project %{project}.',
41
+ 'CreateCommitToolParams.createFileActionLabel': 'Create file %{filePath}',
42
+ 'CreateCommitToolParams.deleteFileActionLabel': 'Delete file %{filePath}',
43
+ 'CreateCommitToolParams.expandFileChanges': 'Expand file changes',
44
+ 'CreateCommitToolParams.moveFileActionLabel': 'Move file %{filePath}',
45
+ 'CreateCommitToolParams.readCommitMessage': 'Read commit message',
46
+ 'CreateCommitToolParams.unknownFileActionLabel': 'Modify file %{filePath}',
47
+ 'CreateCommitToolParams.updateFileActionLabel': 'Update file %{filePath}',
48
+ 'CreateIssueToolParams.ACCORDION_TITLE': 'Read description',
49
+ 'CreateIssueToolParams.ISSUE_SUMMARY_MESSAGE_BASE':
50
+ 'Open an issue with title "%{title}" in project %{project}.',
51
+ 'CreateIssueToolParams.ISSUE_SUMMARY_MESSAGE_WITH_LABELS': 'Assign the labels %{labels}.',
52
+ 'CreateMergeRequestToolParams.ACCORDION_TITLE': 'Read description',
53
+ 'CreateMergeRequestToolParams.MERGE_REQUEST_SUMMARY_MESSAGE':
54
+ 'Open a merge request with title "%{title}" in project %{project} from branch %{sourceBranch} to branch %{targetBranch}.',
36
55
  'DuoChat.chatBackLabel': 'Back to history',
37
56
  'DuoChat.chatBackToChatToolTip': 'Back to chat',
38
57
  'DuoChat.chatCancelLabel': 'Cancel',
@@ -105,6 +124,9 @@ export default {
105
124
  'MessageToolApproval.approveText': 'Approve',
106
125
  'MessageToolApproval.approvingText': 'Approving...',
107
126
  'MessageToolApproval.cancelText': 'Cancel',
127
+ 'MessageToolApproval.createCommit': 'Duo wants to push a commit.',
128
+ 'MessageToolApproval.createIssue': 'Duo wants to open an issue.',
129
+ 'MessageToolApproval.createMergeRequest': 'Duo wants to create a merge request.',
108
130
  'MessageToolApproval.denialReasonLabel': 'Rejection reason',
109
131
  'MessageToolApproval.denialReasonPlaceholder':
110
132
  "Tell Duo why you're rejecting this tool execution...",
@@ -112,10 +134,10 @@ export default {
112
134
  'MessageToolApproval.denyingText': 'Denying...',
113
135
  'MessageToolApproval.noParametersText': 'No parameters will be sent with this request.',
114
136
  'MessageToolApproval.parametersText': 'Request',
137
+ 'MessageToolApproval.runCommand': 'Duo wants to run a command.',
115
138
  'MessageToolApproval.toolApprovalDescription':
116
139
  'GitLab Duo Agentic Chat wants to execute a tool. Do you want to proceed?',
117
- 'MessageToolApproval.toolApprovalTitle':
118
- 'Duo would like to execute a tool. Do you want to proceed?',
119
140
  'MessageToolApproval.toolLabel': 'Tool:',
141
+ 'MessageToolApproval.toolStatus': 'Pending',
120
142
  'MessageToolApproval.toolUnknown': 'Unknown',
121
143
  };