@codingame/monaco-vscode-workbench-service-override 37.3.2 → 37.3.4

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 (108) hide show
  1. package/package.json +10 -10
  2. package/session.js +11 -0
  3. package/vscode/src/vs/platform/agentHost/common/meta/agentCheckoutOperationMeta.d.ts +18 -0
  4. package/vscode/src/vs/platform/agentHost/common/meta/agentCheckoutOperationMeta.js +27 -0
  5. package/vscode/src/vs/sessions/browser/layoutActions.d.ts +1 -0
  6. package/vscode/src/vs/sessions/browser/layoutActions.js +146 -0
  7. package/vscode/src/vs/sessions/browser/parts/chatCompositeBar.js +6 -6
  8. package/vscode/src/vs/sessions/browser/parts/chatGroupView.js +5 -5
  9. package/vscode/src/vs/sessions/browser/parts/menubar.contribution.js +8 -8
  10. package/vscode/src/vs/sessions/browser/parts/sessionHeader.js +1 -1
  11. package/vscode/src/vs/sessions/browser/parts/sessionReadOnlyBanner.js +1 -1
  12. package/vscode/src/vs/sessions/browser/parts/sessionRemoteConnection.js +20 -20
  13. package/vscode/src/vs/sessions/browser/sessionsSetUpService.js +7 -7
  14. package/vscode/src/vs/sessions/browser/sessionsSignInDialog.js +4 -4
  15. package/vscode/src/vs/sessions/contrib/accountMenu/browser/account.contribution.js +42 -42
  16. package/vscode/src/vs/sessions/contrib/accountMenu/browser/chatPetAchievementBadges.js +11 -11
  17. package/vscode/src/vs/sessions/contrib/aiCustomizationTreeView/browser/aiCustomizationTreeView.contribution.js +18 -18
  18. package/vscode/src/vs/sessions/contrib/aiCustomizationTreeView/browser/aiCustomizationTreeViewViews.js +12 -12
  19. package/vscode/src/vs/sessions/contrib/applyCommitsToParentRepo/browser/applyChangesToParentRepo.d.ts +1 -0
  20. package/vscode/src/vs/sessions/contrib/applyCommitsToParentRepo/browser/applyChangesToParentRepo.js +149 -0
  21. package/vscode/src/vs/sessions/contrib/aquarium/browser/aquarium.contribution.js +12 -12
  22. package/vscode/src/vs/sessions/contrib/aquarium/browser/aquariumOverlay.js +10 -10
  23. package/vscode/src/vs/sessions/contrib/automations/browser/automationDialog.js +68 -68
  24. package/vscode/src/vs/sessions/contrib/automations/browser/automationDialogService.js +7 -7
  25. package/vscode/src/vs/sessions/contrib/automations/browser/automationRunner.js +4 -4
  26. package/vscode/src/vs/sessions/contrib/automations/browser/automationScheduler.js +2 -2
  27. package/vscode/src/vs/sessions/contrib/automations/browser/automationTools.js +38 -38
  28. package/vscode/src/vs/sessions/contrib/automations/browser/automations.contribution.js +2 -2
  29. package/vscode/src/vs/sessions/contrib/automations/browser/providerAutomationService.js +1 -1
  30. package/vscode/src/vs/sessions/contrib/changes/browser/changes.contribution.js +6 -6
  31. package/vscode/src/vs/sessions/contrib/changes/browser/changesActions.js +4 -4
  32. package/vscode/src/vs/sessions/contrib/changes/browser/changesViewActions.js +20 -20
  33. package/vscode/src/vs/sessions/contrib/changes/browser/changesetReviewActions.js +1 -1
  34. package/vscode/src/vs/sessions/contrib/changes/browser/sessionSyncChanges.js +9 -9
  35. package/vscode/src/vs/sessions/contrib/changes/browser/sessionsChangesAccessibilityHelp.js +17 -17
  36. package/vscode/src/vs/sessions/contrib/chat/browser/sessionChatInputToolbarDebug.js +17 -17
  37. package/vscode/src/vs/sessions/contrib/chat/browser/taskCommand.d.ts +44 -0
  38. package/vscode/src/vs/sessions/contrib/chat/browser/taskCommand.js +111 -0
  39. package/vscode/src/vs/sessions/contrib/chatDebug/browser/chatDebug.contribution.js +2 -2
  40. package/vscode/src/vs/sessions/contrib/codeReview/browser/codeReview.contributions.d.ts +1 -0
  41. package/vscode/src/vs/sessions/contrib/codeReview/browser/codeReview.contributions.js +75 -0
  42. package/vscode/src/vs/sessions/contrib/customViewTest/browser/customViewTest.contribution.js +7 -7
  43. package/vscode/src/vs/sessions/contrib/editor/browser/addTabActions.js +4 -4
  44. package/vscode/src/vs/sessions/contrib/editor/browser/editor.contribution.js +8 -8
  45. package/vscode/src/vs/sessions/contrib/editor/browser/emptyFileEditor.contribution.js +1 -1
  46. package/vscode/src/vs/sessions/contrib/editor/browser/emptyFileEditor.js +5 -5
  47. package/vscode/src/vs/sessions/contrib/editor/browser/emptyFileEditorInput.js +1 -1
  48. package/vscode/src/vs/sessions/contrib/files/browser/files.contribution.js +7 -7
  49. package/vscode/src/vs/sessions/contrib/files/browser/filesView.js +1 -1
  50. package/vscode/src/vs/sessions/contrib/layout/browser/baseSessionLayoutController.js +5 -5
  51. package/vscode/src/vs/sessions/contrib/layout/browser/sessions.layout.contribution.js +2 -2
  52. package/vscode/src/vs/sessions/contrib/layout/browser/singlePane/singlePaneExistingSessionStrategy.js +1 -1
  53. package/vscode/src/vs/sessions/contrib/onboardingTours/browser/newSessionViewV3Prompt.js +19 -19
  54. package/vscode/src/vs/sessions/contrib/onboardingTours/browser/tours/newSessionTour.js +4 -4
  55. package/vscode/src/vs/sessions/contrib/onboardingTours/browser/tours/newSessionViewTour.js +6 -6
  56. package/vscode/src/vs/sessions/contrib/onboardingTours/browser/tours/newSessionViewTourShared.js +2 -2
  57. package/vscode/src/vs/sessions/contrib/onboardingTours/browser/tours/newSessionViewV2Tour.js +4 -4
  58. package/vscode/src/vs/sessions/contrib/policyBlocked/browser/sessionsPolicyBlocked.js +24 -24
  59. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostClaudePermissionModePicker.d.ts +26 -0
  60. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostClaudePermissionModePicker.js +98 -0
  61. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostCodexApprovalsPicker.d.ts +33 -0
  62. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostCodexApprovalsPicker.js +98 -0
  63. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostForkActions.d.ts +1 -0
  64. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostForkActions.js +72 -0
  65. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostModeIcon.d.ts +2 -0
  66. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostModeIcon.js +13 -0
  67. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostModePicker.d.ts +122 -0
  68. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostModePicker.js +464 -0
  69. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerActionItem.d.ts +35 -0
  70. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerActionItem.js +90 -0
  71. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerDelegate.d.ts +84 -0
  72. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerDelegate.js +328 -0
  73. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostSessionBranchActions.d.ts +1 -0
  74. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostSessionBranchActions.js +94 -0
  75. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostSessionConfigPicker.d.ts +174 -0
  76. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentHostSessionConfigPicker.js +1390 -0
  77. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentMergeActions.d.ts +1 -0
  78. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/agentMergeActions.js +468 -0
  79. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/exportDebugLogsAction.d.ts +7 -0
  80. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/exportDebugLogsAction.js +48 -0
  81. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/media/agentHostSessionConfigPicker.css +44 -0
  82. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileAgentHostModePicker.d.ts +30 -0
  83. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileAgentHostModePicker.js +78 -0
  84. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatInputConfigPicker.d.ts +1 -0
  85. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatInputConfigPicker.js +345 -0
  86. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputTarget.d.ts +11 -0
  87. package/vscode/src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputTarget.js +26 -0
  88. package/vscode/src/vs/sessions/contrib/providers/remoteAgentHost/browser/devContainerAgentHostService.js +6 -6
  89. package/vscode/src/vs/sessions/contrib/search/browser/search.contribution.js +3 -3
  90. package/vscode/src/vs/sessions/contrib/search/browser/searchEditorEmptyState.contribution.js +1 -1
  91. package/vscode/src/vs/sessions/contrib/sessions/browser/blockedSessionsIndicatorModel.js +4 -4
  92. package/vscode/src/vs/sessions/contrib/sessions/browser/blockedSessionsList.js +5 -5
  93. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionDetailsAction.js +2 -2
  94. package/vscode/src/vs/sessions/contrib/sessions/browser/sessions.contribution.js +8 -8
  95. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionsActions.js +58 -58
  96. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.js +8 -8
  97. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionsWindowNotifier.js +5 -5
  98. package/vscode/src/vs/sessions/contrib/sessions/browser/views/automationTemplates.js +10 -10
  99. package/vscode/src/vs/sessions/contrib/sessions/browser/views/automationsAccessibility.js +38 -38
  100. package/vscode/src/vs/sessions/contrib/sessions/browser/views/automationsView.js +118 -118
  101. package/vscode/src/vs/sessions/contrib/sessions/browser/views/sessionsViewActions.js +53 -53
  102. package/vscode/src/vs/sessions/contrib/terminal/browser/agentHostSessionTaskRunner.d.ts +42 -0
  103. package/vscode/src/vs/sessions/contrib/terminal/browser/agentHostSessionTaskRunner.js +139 -0
  104. package/vscode/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.d.ts +120 -0
  105. package/vscode/src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.js +741 -0
  106. package/vscode/src/vs/sessions/services/sessions/browser/sessionsManagementService.js +2 -2
  107. package/vscode/src/vs/sessions/services/sessions/browser/sessionsService.js +2 -2
  108. package/vscode/src/vs/workbench/browser/layout.js +1 -1
@@ -0,0 +1,468 @@
1
+
2
+ import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
+ import { localize, localize2 } from '@codingame/monaco-vscode-api/vscode/vs/nls';
4
+ import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
5
+ import { Disposable, DisposableStore } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
6
+ import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
7
+ import { ThemeIcon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/themables';
8
+ import { Action2, MenuRegistry, registerAction2 } from '@codingame/monaco-vscode-api/vscode/vs/platform/actions/common/actions';
9
+ import { AgentMergeSettingId, resolveAgentMergeConfiguration, agentMergeMergePullRequestValues, AGENT_MERGE_SETTING_TAG } from '@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/agentMerge';
10
+ import { AgentHostPullRequestOperationId } from '@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/agentHostChangesetOperationService';
11
+ import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
12
+ import { ContextKeyExpr, RawContextKey } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey';
13
+ import { IContextKeyService } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey.service';
14
+ import { INotificationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/notification/common/notification.service';
15
+ import { IQuickInputService } from '@codingame/monaco-vscode-api/vscode/vs/platform/quickinput/common/quickInput.service';
16
+ import { ILogService } from '@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service';
17
+ import { registerWorkbenchContribution2, WorkbenchPhase } from '@codingame/monaco-vscode-api/vscode/vs/workbench/common/contributions';
18
+ import { IsSessionsWindowContext } from '@codingame/monaco-vscode-api/vscode/vs/workbench/common/contextkeys';
19
+ import { ChatContextKeys } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/actions/chatContextKeys';
20
+ import { IPreferencesService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/preferences/common/preferences.service';
21
+ import { ANY_AGENT_HOST_PROVIDER_RE, isAgentHostProvider } from '@codingame/monaco-vscode-api/vscode/vs/sessions/common/agentHostSessionsProvider';
22
+ import { SessionProviderIdContext, SessionIsArchivedContext, SessionHasOpenPullRequestContext, SessionPrimaryPullRequestOperationContext, SessionAgentMergeEnabledContext } from '@codingame/monaco-vscode-api/vscode/vs/sessions/common/contextkeys';
23
+ import { CHANGES_OPERATIONS_DROPDOWN_PRIMARY_GROUP } from '@codingame/monaco-vscode-api/vscode/vs/sessions/contrib/changes/browser/changesView';
24
+ import { Menus } from '@codingame/monaco-vscode-api/vscode/vs/sessions/browser/menus';
25
+ import { ISessionsProvidersService } from '@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/browser/sessionsProvidersService.service';
26
+ import { ISessionsService } from '@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/browser/sessionsService.service';
27
+ import { getSessionAgentMergeConfigurationObservable, getGlobalAgentMergeConfiguration } from '@codingame/monaco-vscode-api/vscode/vs/sessions/browser/sessionAgentMerge';
28
+ import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
29
+
30
+ const agentMergeCommandPrecondition = ( ContextKeyExpr.and(IsSessionsWindowContext, ChatContextKeys.enabled, ( ContextKeyExpr.regex(SessionProviderIdContext.key, ANY_AGENT_HOST_PROVIDER_RE)), ( SessionIsArchivedContext.negate()), ( ContextKeyExpr.equals(`config.${AgentMergeSettingId.Enabled}`, true))));
31
+ const agentMergeHasPullRequest = ( ContextKeyExpr.or(SessionHasOpenPullRequestContext, ...( Object.values(AgentHostPullRequestOperationId)).map(id => ( ContextKeyExpr.equals(SessionPrimaryPullRequestOperationContext.key, id)))));
32
+ const agentMergeMenuPrecondition = ( ContextKeyExpr.and(agentMergeCommandPrecondition, agentMergeHasPullRequest));
33
+ const agentMergeOwnsPrimaryButton = ( ContextKeyExpr.or(( ContextKeyExpr.equals(
34
+ SessionPrimaryPullRequestOperationContext.key,
35
+ AgentHostPullRequestOperationId.EnableAutoMerge
36
+ )), ( ContextKeyExpr.equals(
37
+ SessionPrimaryPullRequestOperationContext.key,
38
+ AgentHostPullRequestOperationId.DisableAutoMerge
39
+ )), ( ContextKeyExpr.and(( ContextKeyExpr.equals(
40
+ SessionPrimaryPullRequestOperationContext.key,
41
+ AgentHostPullRequestOperationId.MarkReadyWithAgentMerge
42
+ )), SessionAgentMergeEnabledContext)), ( ContextKeyExpr.and(SessionHasOpenPullRequestContext, ( ContextKeyExpr.equals(SessionPrimaryPullRequestOperationContext.key, ""))))));
43
+ const AgentMergeSessionActionContexts = {
44
+ addressReviews: new RawContextKey("sessionAgentMergeAddressReviews", false, {
45
+ type: "boolean",
46
+ description: ( localize(
47
+ 4259,
48
+ "True when Agent Merge may address reviews for the active agent session."
49
+ ))
50
+ }),
51
+ fixCI: new RawContextKey("sessionAgentMergeFixCI", false, {
52
+ type: "boolean",
53
+ description: ( localize(
54
+ 4260,
55
+ "True when Agent Merge may fix CI failures for the active agent session."
56
+ ))
57
+ }),
58
+ resolveConflicts: new RawContextKey("sessionAgentMergeResolveConflicts", false, {
59
+ type: "boolean",
60
+ description: ( localize(
61
+ 4261,
62
+ "True when Agent Merge may resolve conflicts for the active agent session."
63
+ ))
64
+ })
65
+ };
66
+ const AgentMergeSessionMergePullRequestContext = new RawContextKey("sessionAgentMergeMergePullRequest", "never", {
67
+ type: "string",
68
+ description: ( localize(
69
+ 4262,
70
+ "When Agent Merge may merge the pull request for the active agent session ('always', 'ifUnchanged' or 'never')."
71
+ ))
72
+ });
73
+ const agentMergeActionLabels = {
74
+ addressReviews: ( localize(4263, "Address Reviews")),
75
+ fixCI: ( localize(4264, "Fix CI Failures")),
76
+ resolveConflicts: ( localize(4265, "Resolve Conflicts and Behind Branches"))
77
+ };
78
+ const agentMergeRepairActions = ( Object.keys(agentMergeActionLabels));
79
+ const agentMergeMergePullRequestLabels = {
80
+ always: ( localize(4266, "On")),
81
+ ifUnchanged: ( localize(4267, "Only if Agent Merge Made No Changes")),
82
+ never: ( localize(4268, "Off"))
83
+ };
84
+ const agentMergeMergePullRequestDescriptions = {
85
+ always: ( localize(4269, "Merge the pull request whenever it is ready.")),
86
+ ifUnchanged: ( localize(
87
+ 4270,
88
+ "Merge the pull request only while Agent Merge has not changed it. Once a repair turn lands a commit this switches itself off."
89
+ )),
90
+ never: ( localize(4271, "Do not merge the pull request automatically."))
91
+ };
92
+ let AgentMergeContextContribution = class AgentMergeContextContribution extends Disposable {
93
+ static {
94
+ this.ID = "sessions.contrib.agentMergeContext";
95
+ }
96
+ constructor(
97
+ contextKeyService,
98
+ configurationService,
99
+ sessionsService,
100
+ sessionsProvidersService,
101
+ logService
102
+ ) {
103
+ super();
104
+ const enabledKey = SessionAgentMergeEnabledContext.bindTo(contextKeyService);
105
+ const actionKeys = ( new Map(agentMergeRepairActions.map(
106
+ action => [action, AgentMergeSessionActionContexts[action].bindTo(contextKeyService)]
107
+ )));
108
+ const mergePullRequestKey = AgentMergeSessionMergePullRequestContext.bindTo(contextKeyService);
109
+ let lastLogged;
110
+ this._register(autorun(reader => {
111
+ const session = sessionsService.activeSession.read(reader);
112
+ const state = session ? getSessionAgentMergeConfigurationObservable(session, sessionsProvidersService, configurationService).read(reader) : undefined;
113
+ const enabled = state?.enabled === true;
114
+ const effective = state?.actions ?? getGlobalAgentMergeConfiguration(configurationService);
115
+ enabledKey.set(enabled);
116
+ for (const [action, key] of actionKeys) {
117
+ key.set(effective[action]);
118
+ }
119
+ mergePullRequestKey.set(effective.mergePullRequest);
120
+ const authorized = agentMergeRepairActions.filter(action => effective[action]);
121
+ const signature = `${session?.sessionId ?? "none"}|${enabled}|${authorized.join(",")}|${effective.mergePullRequest}`;
122
+ if (lastLogged !== signature) {
123
+ lastLogged = signature;
124
+ logService.info(
125
+ `[AgentMergeActions] Session state: session=${session?.sessionId ?? "none"}, enabled=${enabled}, authorizedActions=[${authorized.join(", ") || "none"}], mergePullRequest=${effective.mergePullRequest}`
126
+ );
127
+ }
128
+ }));
129
+ }
130
+ };
131
+ AgentMergeContextContribution = ( __decorate([( __param(0, IContextKeyService)), ( __param(1, IConfigurationService)), ( __param(2, ISessionsService)), ( __param(3, ISessionsProvidersService)), ( __param(4, ILogService))], AgentMergeContextContribution));
132
+ registerWorkbenchContribution2(
133
+ AgentMergeContextContribution.ID,
134
+ AgentMergeContextContribution,
135
+ WorkbenchPhase.AfterRestored
136
+ );
137
+ class AgentMergeActionBase extends Action2 {
138
+ getActiveSession(accessor) {
139
+ const session = accessor.get(ISessionsService).activeSession.get();
140
+ const provider = session && accessor.get(ISessionsProvidersService).getProvider(session.providerId);
141
+ return session && provider && isAgentHostProvider(provider) ? {
142
+ session,
143
+ provider
144
+ } : undefined;
145
+ }
146
+ async updateOverrides(accessor, patch) {
147
+ const active = this.getActiveSession(accessor);
148
+ if (!active) {
149
+ return;
150
+ }
151
+ const configurationService = accessor.get(IConfigurationService);
152
+ const logService = accessor.get(ILogService);
153
+ const state = active.provider.getAgentMergeSessionState(active.session.sessionId);
154
+ const effective = resolveAgentMergeConfiguration(getGlobalAgentMergeConfiguration(configurationService), state?.overrides);
155
+ const overrides = {
156
+ addressReviews: effective.addressReviews,
157
+ fixCI: effective.fixCI,
158
+ resolveConflicts: effective.resolveConflicts,
159
+ mergePullRequest: effective.mergePullRequest,
160
+ ...patch
161
+ };
162
+ await active.provider.setAgentMergeOverrides(active.session.sessionId, overrides);
163
+ logService.info(
164
+ `[AgentMergeActions] Overrides updated: session=${active.session.sessionId}, change=${JSON.stringify(patch)}`
165
+ );
166
+ }
167
+ }
168
+ MenuRegistry.appendMenuItem(Menus.ChangesOperationsDropdown, {
169
+ submenu: Menus.ChangesAgentMerge,
170
+ title: ( localize2(4272, "Agent Merge")),
171
+ icon: Codicon.gitMerge,
172
+ group: CHANGES_OPERATIONS_DROPDOWN_PRIMARY_GROUP,
173
+ order: 1,
174
+ when: ( ContextKeyExpr.and(agentMergeMenuPrecondition, agentMergeOwnsPrimaryButton))
175
+ });
176
+ const agentMergeTopLevelMenus = [Menus.ChangesOperationsDropdown, Menus.ChangesAgentMerge];
177
+ registerAction2(class EnableAgentMergeInSessionAction extends AgentMergeActionBase {
178
+ constructor() {
179
+ super({
180
+ id: "sessions.agentHost.agentMerge.enableInSession",
181
+ title: ( localize2(4273, "Enable Agent Merge")),
182
+ f1: false,
183
+ menu: agentMergeTopLevelMenus.map(id => ({
184
+ id,
185
+ group: "1_agentMerge",
186
+ order: 1,
187
+ when: ( ContextKeyExpr.and(agentMergeMenuPrecondition, ( SessionAgentMergeEnabledContext.negate())))
188
+ }))
189
+ });
190
+ }
191
+ async run(accessor) {
192
+ const active = this.getActiveSession(accessor);
193
+ const logService = accessor.get(ILogService);
194
+ if (!active) {
195
+ return;
196
+ }
197
+ await active.provider.setAgentMergeEnabled(active.session.sessionId, true);
198
+ logService.info(
199
+ `[AgentMergeActions] Enabled from the title bar: session=${active.session.sessionId}`
200
+ );
201
+ }
202
+ });
203
+ registerAction2(class DisableAgentMergeInSessionAction extends AgentMergeActionBase {
204
+ constructor() {
205
+ super({
206
+ id: "sessions.agentHost.agentMerge.disableInSession",
207
+ title: ( localize2(4274, "Disable Agent Merge")),
208
+ f1: false,
209
+ menu: agentMergeTopLevelMenus.map(id => ({
210
+ id,
211
+ group: "1_agentMerge",
212
+ order: 1,
213
+ when: ( ContextKeyExpr.and(agentMergeMenuPrecondition, SessionAgentMergeEnabledContext))
214
+ }))
215
+ });
216
+ }
217
+ async run(accessor) {
218
+ const active = this.getActiveSession(accessor);
219
+ const logService = accessor.get(ILogService);
220
+ if (!active) {
221
+ return;
222
+ }
223
+ await active.provider.setAgentMergeEnabled(active.session.sessionId, false);
224
+ logService.info(
225
+ `[AgentMergeActions] Disabled from the title bar: session=${active.session.sessionId}`
226
+ );
227
+ }
228
+ });
229
+ for (const id of agentMergeTopLevelMenus) {
230
+ MenuRegistry.appendMenuItem(id, {
231
+ submenu: Menus.ChangesAgentMergeConfigure,
232
+ title: ( localize2(4275, "Configure Agent Merge")),
233
+ group: "1_agentMerge",
234
+ order: 2,
235
+ when: agentMergeMenuPrecondition
236
+ });
237
+ }
238
+ for (const [index, action] of agentMergeRepairActions.entries()) {
239
+ registerAction2(class ToggleAgentMergeRepairAction extends AgentMergeActionBase {
240
+ constructor() {
241
+ super({
242
+ id: `sessions.agentHost.agentMerge.toggle.${action}`,
243
+ title: {
244
+ value: agentMergeActionLabels[action],
245
+ original: agentMergeActionLabels[action]
246
+ },
247
+ toggled: AgentMergeSessionActionContexts[action],
248
+ f1: false,
249
+ menu: [{
250
+ id: Menus.ChangesAgentMergeConfigure,
251
+ group: "1_agentMergeActions",
252
+ order: index,
253
+ when: agentMergeMenuPrecondition
254
+ }]
255
+ });
256
+ }
257
+ async run(accessor) {
258
+ const active = this.getActiveSession(accessor);
259
+ if (!active) {
260
+ return;
261
+ }
262
+ const state = active.provider.getAgentMergeSessionState(active.session.sessionId);
263
+ const effective = resolveAgentMergeConfiguration(
264
+ getGlobalAgentMergeConfiguration(accessor.get(IConfigurationService)),
265
+ state?.overrides
266
+ );
267
+ await this.updateOverrides(accessor, {
268
+ [action]: !effective[action]
269
+ });
270
+ }
271
+ });
272
+ }
273
+ for (const value of agentMergeMergePullRequestValues) {
274
+ MenuRegistry.appendMenuItem(Menus.ChangesAgentMergeConfigure, mergePullRequestSubmenuItem(value));
275
+ }
276
+ function mergePullRequestSubmenuItem(value) {
277
+ const title = ( localize(4276, "Merge Pull Request ({0})", agentMergeMergePullRequestLabels[value]));
278
+ return {
279
+ submenu: Menus.ChangesAgentMergeMergePullRequest,
280
+ title: {
281
+ value: title,
282
+ original: title
283
+ },
284
+ group: "1_agentMergeActions",
285
+ order: agentMergeRepairActions.length,
286
+ when: ( ContextKeyExpr.and(agentMergeMenuPrecondition, ( AgentMergeSessionMergePullRequestContext.isEqualTo(value))))
287
+ };
288
+ }
289
+ for (const [index, value] of agentMergeMergePullRequestValues.entries()) {
290
+ registerAction2(class SetAgentMergeMergePullRequestAction extends AgentMergeActionBase {
291
+ constructor() {
292
+ super({
293
+ id: `sessions.agentHost.agentMerge.mergePullRequest.${value}`,
294
+ title: {
295
+ value: agentMergeMergePullRequestLabels[value],
296
+ original: agentMergeMergePullRequestLabels[value]
297
+ },
298
+ tooltip: agentMergeMergePullRequestDescriptions[value],
299
+ toggled: ( AgentMergeSessionMergePullRequestContext.isEqualTo(value)),
300
+ f1: false,
301
+ menu: [{
302
+ id: Menus.ChangesAgentMergeMergePullRequest,
303
+ group: "navigation",
304
+ order: index
305
+ }]
306
+ });
307
+ }
308
+ async run(accessor) {
309
+ await this.updateOverrides(accessor, {
310
+ mergePullRequest: value
311
+ });
312
+ }
313
+ });
314
+ }
315
+ registerAction2(class OpenAgentMergeDefaultsAction extends Action2 {
316
+ constructor() {
317
+ super({
318
+ id: "sessions.agentHost.agentMerge.openDefaults",
319
+ title: ( localize2(4277, "Agent Merge Defaults")),
320
+ f1: false,
321
+ menu: [{
322
+ id: Menus.ChangesAgentMergeConfigure,
323
+ group: "2_agentMergeDefaults",
324
+ order: 1,
325
+ when: agentMergeMenuPrecondition
326
+ }]
327
+ });
328
+ }
329
+ async run(accessor) {
330
+ const preferencesService = accessor.get(IPreferencesService);
331
+ const logService = accessor.get(ILogService);
332
+ await preferencesService.openSettings({
333
+ jsonEditor: false,
334
+ query: `@tag:${AGENT_MERGE_SETTING_TAG}`
335
+ });
336
+ logService.trace(`[AgentMergeActions] Opened Agent Merge defaults in the settings editor`);
337
+ }
338
+ });
339
+ registerAction2(class EnableAgentMergeAction extends AgentMergeActionBase {
340
+ constructor() {
341
+ super({
342
+ id: "sessions.agentHost.agentMerge.enable",
343
+ title: ( localize2(4278, "Enable Agent Merge for Active Session")),
344
+ f1: true,
345
+ precondition: ( ContextKeyExpr.and(agentMergeCommandPrecondition, ( SessionAgentMergeEnabledContext.negate())))
346
+ });
347
+ }
348
+ async run(accessor) {
349
+ const active = this.getActiveSession(accessor);
350
+ if (!active) {
351
+ return;
352
+ }
353
+ const logService = accessor.get(ILogService);
354
+ const notificationService = accessor.get(INotificationService);
355
+ await active.provider.setAgentMergeEnabled(active.session.sessionId, true);
356
+ logService.info(
357
+ `[AgentMergeActions] Enable requested: session=${active.session.sessionId}, provider=${active.session.providerId}`
358
+ );
359
+ notificationService.info(( localize(4279, "Agent Merge is enabled for the active session.")));
360
+ }
361
+ });
362
+ registerAction2(class DisableAgentMergeAction extends AgentMergeActionBase {
363
+ constructor() {
364
+ super({
365
+ id: "sessions.agentHost.agentMerge.disable",
366
+ title: ( localize2(4280, "Disable Agent Merge for Active Session")),
367
+ f1: true,
368
+ precondition: ( ContextKeyExpr.and(agentMergeCommandPrecondition, SessionAgentMergeEnabledContext))
369
+ });
370
+ }
371
+ async run(accessor) {
372
+ const active = this.getActiveSession(accessor);
373
+ if (!active) {
374
+ return;
375
+ }
376
+ const logService = accessor.get(ILogService);
377
+ const notificationService = accessor.get(INotificationService);
378
+ await active.provider.setAgentMergeEnabled(active.session.sessionId, false);
379
+ logService.info(
380
+ `[AgentMergeActions] Disable requested: session=${active.session.sessionId}, provider=${active.session.providerId}`
381
+ );
382
+ notificationService.info(( localize(4281, "Agent Merge is disabled for the active session.")));
383
+ }
384
+ });
385
+ registerAction2(class ConfigureAgentMergeAction extends AgentMergeActionBase {
386
+ constructor() {
387
+ super({
388
+ id: "sessions.agentHost.agentMerge.configure",
389
+ title: ( localize2(4282, "Configure Agent Merge for Active Session")),
390
+ f1: true,
391
+ precondition: agentMergeCommandPrecondition
392
+ });
393
+ }
394
+ async run(accessor) {
395
+ const active = this.getActiveSession(accessor);
396
+ if (!active) {
397
+ return;
398
+ }
399
+ const configurationService = accessor.get(IConfigurationService);
400
+ const quickInputService = accessor.get(IQuickInputService);
401
+ const logService = accessor.get(ILogService);
402
+ const notificationService = accessor.get(INotificationService);
403
+ const defaults = getGlobalAgentMergeConfiguration(configurationService);
404
+ const current = active.provider.getAgentMergeSessionState(active.session.sessionId);
405
+ const effective = resolveAgentMergeConfiguration(defaults, current?.overrides);
406
+ const picks = agentMergeRepairActions.map(action => ({
407
+ action,
408
+ label: agentMergeActionLabels[action],
409
+ picked: effective[action]
410
+ }));
411
+ const result = await pickAgentMergeActions(quickInputService, picks);
412
+ if (!result) {
413
+ return;
414
+ }
415
+ const overrides = result.reset ? undefined : toOverrides(result.actions, effective.mergePullRequest);
416
+ await active.provider.setAgentMergeOverrides(active.session.sessionId, overrides);
417
+ logService.info(
418
+ `[AgentMergeActions] Action overrides updated: session=${active.session.sessionId}, provider=${active.session.providerId}, reset=${result.reset}, enabledActions=${[...result.actions].sort().join(",") || "none"}`
419
+ );
420
+ notificationService.info(result.reset ? ( localize(
421
+ 4283,
422
+ "Agent Merge now follows the global action defaults for this session."
423
+ )) : ( localize(4284, "Agent Merge actions were updated for the active session.")));
424
+ }
425
+ });
426
+ function pickAgentMergeActions(quickInputService, picks) {
427
+ const store = ( new DisposableStore());
428
+ return (new Promise(resolve => {
429
+ const quickPick = store.add(quickInputService.createQuickPick());
430
+ quickPick.title = ( localize(4285, "Agent Merge"));
431
+ quickPick.placeholder = ( localize(4286, "Select actions Agent Merge may perform for this session"));
432
+ quickPick.canSelectMany = true;
433
+ quickPick.items = picks;
434
+ quickPick.selectedItems = picks.filter(pick => pick.picked);
435
+ quickPick.buttons = [{
436
+ iconClass: ThemeIcon.asClassName(Codicon.discard),
437
+ tooltip: ( localize(4287, "Reset to Global Defaults"))
438
+ }];
439
+ store.add(quickPick.onDidTriggerButton(() => {
440
+ resolve({
441
+ reset: true,
442
+ actions: ( new Set())
443
+ });
444
+ quickPick.hide();
445
+ }));
446
+ store.add(quickPick.onDidAccept(() => {
447
+ resolve({
448
+ reset: false,
449
+ actions: ( new Set(quickPick.selectedItems.map(item => item.action)))
450
+ });
451
+ quickPick.hide();
452
+ }));
453
+ store.add(quickPick.onDidHide(() => {
454
+ resolve(undefined);
455
+ store.dispose();
456
+ }));
457
+ quickPick.show();
458
+ }));
459
+ }
460
+ function toOverrides(selected, mergePullRequest) {
461
+ const overrides = {
462
+ mergePullRequest
463
+ };
464
+ for (const action of agentMergeRepairActions) {
465
+ overrides[action] = ( selected.has(action));
466
+ }
467
+ return overrides;
468
+ }
@@ -0,0 +1,7 @@
1
+ import { Action2 } from "@codingame/monaco-vscode-api/vscode/vs/platform/actions/common/actions";
2
+ import { ServicesAccessor } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
3
+ export declare class ExportAgentHostDebugLogsAction extends Action2 {
4
+ static readonly ID = "agentHost.exportDebugLogs";
5
+ constructor();
6
+ run(accessor: ServicesAccessor): Promise<void>;
7
+ }
@@ -0,0 +1,48 @@
1
+
2
+ import { localize2 } from '@codingame/monaco-vscode-api/vscode/vs/nls';
3
+ import { Categories } from '@codingame/monaco-vscode-api/vscode/vs/platform/action/common/actionCommonCategories';
4
+ import { Action2, registerAction2 } from '@codingame/monaco-vscode-api/vscode/vs/platform/actions/common/actions';
5
+ import { AGENT_HOST_ENABLED_CONTEXT_KEY } from '@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/agentHostEnablementService';
6
+ import { DEFAULT_CHAT_ID } from '@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/state/sessionState';
7
+ import { ContextKeyExpr } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey';
8
+ import { IsSessionsWindowContext } from '@codingame/monaco-vscode-api/vscode/vs/workbench/common/contextkeys';
9
+ import { exportAgentHostDebugLogs } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/actions/exportAgentHostDebugLogsAction';
10
+ import { ChatContextKeys } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/actions/chatContextKeys';
11
+ import { isAgentHostProvider } from '@codingame/monaco-vscode-api/vscode/vs/sessions/common/agentHostSessionsProvider';
12
+ import { ISessionsService } from '@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/browser/sessionsService.service';
13
+ import { ISessionsProvidersService } from '@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/browser/sessionsProvidersService.service';
14
+
15
+ class ExportAgentHostDebugLogsAction extends Action2 {
16
+ static {
17
+ this.ID = "agentHost.exportDebugLogs";
18
+ }
19
+ constructor() {
20
+ super({
21
+ id: ExportAgentHostDebugLogsAction.ID,
22
+ title: ( localize2(4306, "Export Agent Host Debug Logs...")),
23
+ f1: true,
24
+ category: Categories.Developer,
25
+ precondition: ( ContextKeyExpr.and(ChatContextKeys.enabled, ( ContextKeyExpr.or(IsSessionsWindowContext, AGENT_HOST_ENABLED_CONTEXT_KEY))))
26
+ });
27
+ }
28
+ async run(accessor) {
29
+ const sessionsService = accessor.get(ISessionsService);
30
+ const sessionsProvidersService = accessor.get(ISessionsProvidersService);
31
+ const activeSession = sessionsService.activeSession.get();
32
+ const provider = activeSession ? sessionsProvidersService.getProvider(activeSession.providerId) : undefined;
33
+ const activeProvider = provider && isAgentHostProvider(provider) ? provider : undefined;
34
+ const activeChat = activeSession?.activeChat.get();
35
+ const activeSessionContext = activeSession && activeProvider ? {
36
+ resource: activeSession.resource,
37
+ sessionTitle: activeSession.title.get(),
38
+ chatTitle: activeChat?.title.get(),
39
+ isLocal: activeSession.resource.scheme.startsWith("agent-host-"),
40
+ chatId: activeChat?.resource.fragment || DEFAULT_CHAT_ID,
41
+ backendChatResource: activeChat ? activeProvider.getBackendChatResource(activeChat.resource) : undefined
42
+ } : undefined;
43
+ await exportAgentHostDebugLogs(accessor, activeSessionContext);
44
+ }
45
+ }
46
+ registerAction2(ExportAgentHostDebugLogsAction);
47
+
48
+ export { ExportAgentHostDebugLogsAction };
@@ -0,0 +1,44 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ .sessions-chat-agent-host-config {
7
+ display: flex;
8
+ align-items: center;
9
+ /* Each config control carries its own surface, so they need a gap. */
10
+ gap: var(--vscode-spacing-size20);
11
+ min-width: 0;
12
+ }
13
+
14
+ .monaco-workbench .sessions-chat-agent-host-config-host[tabindex]:focus {
15
+ outline: none;
16
+ }
17
+
18
+ .sessions-chat-agent-host-config:empty {
19
+ display: none;
20
+ }
21
+
22
+ .sessions-chat-agent-host-config a.action-label {
23
+ touch-action: manipulation;
24
+ }
25
+
26
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox .action-label {
27
+ cursor: pointer;
28
+ }
29
+
30
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox .monaco-checkbox {
31
+ margin-right: var(--vscode-spacing-size60);
32
+ }
33
+
34
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox .sessions-chat-dropdown-label {
35
+ margin-left: 0;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox.disabled .action-label,
40
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox.disabled .sessions-chat-dropdown-label,
41
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox.resolving .action-label,
42
+ .sessions-chat-agent-host-config .sessions-chat-config-checkbox.resolving .sessions-chat-dropdown-label {
43
+ cursor: default;
44
+ }
@@ -0,0 +1,30 @@
1
+ import { IActionWidgetService } from "@codingame/monaco-vscode-api/vscode/vs/platform/actionWidget/browser/actionWidget.service";
2
+ import { IActionListOptions } from "@codingame/monaco-vscode-api/vscode/vs/platform/actionWidget/browser/actionList";
3
+ import { IHoverService } from "@codingame/monaco-vscode-api/vscode/vs/platform/hover/browser/hover.service";
4
+ import { ITelemetryService } from "@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service";
5
+ import { IInstantiationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
6
+ import { IConfigurationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service";
7
+ import { IPreferencesService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/preferences/common/preferences.service";
8
+ import { IChatWidgetService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/chat.service";
9
+ import { IChatPhoneInputPresenter } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.service";
10
+ import { IChatPetService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/chatPetService.service";
11
+ import { IObservable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/observable";
12
+ import { ISessionsProvidersService } from "@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/browser/sessionsProvidersService.service";
13
+ import { IActiveSession } from "@codingame/monaco-vscode-api/vscode/vs/sessions/services/sessions/common/sessionsManagement";
14
+ import { AgentHostModePicker } from "../agentHostModePicker.js";
15
+ /**
16
+ * Phone-aware variant of {@link AgentHostModePicker}. On phone-layout
17
+ * viewports the desktop action-widget popover is replaced with the same
18
+ * combined Mode + Model bottom sheet used by the workbench picker button and the
19
+ * empty new-chat picker (see {@link IChatPhoneInputPresenter}). On
20
+ * desktop the inherited `_showPicker` falls through to the base
21
+ * implementation, so this class is safe to keep through viewport-class
22
+ * transitions.
23
+ */
24
+ export declare class MobileAgentHostModePicker extends AgentHostModePicker {
25
+ private readonly _phonePresenter;
26
+ private readonly _chatWidgetService;
27
+ protected readonly _chatPetService: IChatPetService;
28
+ constructor(session: IObservable<IActiveSession | undefined>, actionWidgetService: IActionWidgetService, sessionsProvidersService: ISessionsProvidersService, telemetryService: ITelemetryService, hoverService: IHoverService, _phonePresenter: IChatPhoneInputPresenter, _chatWidgetService: IChatWidgetService, _chatPetService: IChatPetService, instantiationService: IInstantiationService, configurationService: IConfigurationService, preferencesService: IPreferencesService);
29
+ protected _showPicker(anchor?: HTMLElement | undefined, onHide?: () => void, listOptions?: IActionListOptions): boolean;
30
+ }