@codingame/monaco-vscode-katex-common 30.0.0 → 31.0.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 (276) hide show
  1. package/package.json +3 -3
  2. package/vscode/src/vs/platform/actions/browser/actionbar.d.ts +16 -0
  3. package/vscode/src/vs/platform/actions/browser/actionbar.js +22 -0
  4. package/vscode/src/vs/platform/actions/browser/buttonbar.js +2 -2
  5. package/vscode/src/vs/platform/networkFilter/common/domainMatcher.d.ts +50 -0
  6. package/vscode/src/vs/platform/networkFilter/common/domainMatcher.js +138 -0
  7. package/vscode/src/vs/platform/networkFilter/common/settings.d.ts +12 -0
  8. package/vscode/src/vs/platform/networkFilter/common/settings.js +14 -0
  9. package/vscode/src/vs/platform/sandbox/common/sandboxHelperIpc.d.ts +18 -0
  10. package/vscode/src/vs/platform/sandbox/common/sandboxHelperIpc.js +13 -0
  11. package/vscode/src/vs/platform/sandbox/common/terminalSandboxService.d.ts +73 -0
  12. package/vscode/src/vs/platform/sandbox/common/terminalSandboxService.js +10 -0
  13. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityProvider.js +16 -16
  14. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.d.ts +3 -1
  15. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.js +51 -24
  16. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatElicitationActions.js +1 -1
  17. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.d.ts +2 -1
  18. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.js +64 -72
  19. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.js +10 -10
  20. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.d.ts +2 -1
  21. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.js +17 -14
  22. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.js +13 -13
  23. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionApprovalModel.js +1 -1
  24. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.js +17 -18
  25. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.js +5 -2
  26. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.d.ts +5 -0
  27. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.js +73 -9
  28. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsOpener.js +1 -1
  29. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.js +32 -32
  30. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentModel.d.ts +1 -0
  31. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentModel.js +20 -2
  32. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.d.ts +1 -0
  33. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.js +73 -49
  34. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/implicitContextAttachment.js +12 -12
  35. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.d.ts +0 -6
  36. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.js +41 -99
  37. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +14 -14
  38. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.d.ts +2 -1
  39. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +13 -9
  40. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +12 -12
  41. package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.js +1 -1
  42. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.js +14 -15
  43. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatAgentHover.js +2 -2
  44. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.d.ts +11 -12
  45. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.js +339 -161
  46. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentMarkdownRenderer.js +9 -2
  47. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAgentCommandContentPart.js +1 -1
  48. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAnonymousRateLimitedPart.js +2 -2
  49. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.d.ts +9 -4
  50. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.js +33 -5
  51. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.js +1 -1
  52. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCodeCitationContentPart.js +1 -1
  53. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCollections.d.ts +43 -1
  54. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCollections.js +147 -2
  55. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCommandContentPart.js +1 -1
  56. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationContentPart.js +2 -2
  57. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationWidget.d.ts +4 -0
  58. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationWidget.js +55 -6
  59. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatContentCodePools.d.ts +1 -1
  60. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatContentCodePools.js +7 -5
  61. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatContentParts.d.ts +1 -3
  62. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatDiffBlockPart.js +42 -10
  63. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatDisabledClaudeHooksContentPart.js +3 -3
  64. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExtensionsContentPart.js +1 -1
  65. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatHookContentPart.js +1 -1
  66. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/animations/animation.d.ts +18 -0
  67. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/animations/animationRegistry.d.ts +15 -0
  68. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/animations/animationRegistry.js +16 -0
  69. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/animations/blockAnimations.d.ts +13 -0
  70. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/animations/blockAnimations.js +33 -0
  71. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/buffer.d.ts +46 -0
  72. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/bufferRegistry.d.ts +11 -0
  73. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/bufferRegistry.js +12 -0
  74. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/offBuffer.d.ts +9 -0
  75. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/offBuffer.js +12 -0
  76. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/paragraphBuffer.d.ts +23 -0
  77. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/paragraphBuffer.js +37 -0
  78. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/wordBuffer.d.ts +34 -0
  79. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/buffers/wordBuffer.js +68 -0
  80. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/chatIncrementalRendering.d.ts +77 -0
  81. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/chatIncrementalRendering.js +170 -0
  82. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatIncrementalRendering/media/chatIncrementalRendering.css +112 -0
  83. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.d.ts +3 -1
  84. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.js +26 -16
  85. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.d.ts +24 -6
  86. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.js +111 -145
  87. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersInteractionContentPart.js +8 -8
  88. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.js +4 -4
  89. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatPlanReviewPart.d.ts +58 -0
  90. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatPlanReviewPart.js +425 -0
  91. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.d.ts +16 -7
  92. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.js +68 -25
  93. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.d.ts +5 -1
  94. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.js +101 -45
  95. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.js +4 -4
  96. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatReferencesContentPart.js +6 -6
  97. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatResourceGroupWidget.js +5 -5
  98. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.d.ts +36 -4
  99. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.js +217 -25
  100. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.js +6 -6
  101. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTextEditContentPart.js +1 -1
  102. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.d.ts +23 -3
  103. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.js +168 -60
  104. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTipContentPart.js +10 -10
  105. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTodoListWidget.js +18 -17
  106. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.d.ts +1 -5
  107. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.js +7 -18
  108. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolOutputContentSubPart.d.ts +1 -5
  109. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolOutputContentSubPart.js +7 -19
  110. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.js +1 -1
  111. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatWorkspaceEditContentPart.js +3 -3
  112. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.d.ts +24 -19
  113. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.js +104 -78
  114. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css +11 -2
  115. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatPlanReview.css +257 -0
  116. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css +19 -0
  117. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatSubagentContent.css +30 -0
  118. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css +1 -1
  119. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css +12 -0
  120. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatToolConfirmationCarousel.css +286 -0
  121. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.js +1 -1
  122. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.js +4 -4
  123. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.js +1 -1
  124. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.js +3 -3
  125. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMissingSandboxDepsConfirmationSubPart.js +2 -2
  126. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.js +15 -11
  127. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.d.ts +1 -7
  128. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.js +25 -47
  129. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.d.ts +29 -53
  130. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.js +258 -321
  131. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationCarouselPart.d.ts +53 -0
  132. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationCarouselPart.js +392 -0
  133. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.d.ts +1 -3
  134. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.js +24 -30
  135. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.d.ts +2 -3
  136. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.js +9 -8
  137. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolOutputPart.js +2 -2
  138. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPartUtilities.js +5 -5
  139. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.js +5 -5
  140. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/terminalToolAutoExpand.d.ts +6 -3
  141. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/terminalToolAutoExpand.js +2 -3
  142. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatDragAndDrop.js +11 -11
  143. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.d.ts +38 -11
  144. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.js +577 -113
  145. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.d.ts +0 -7
  146. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.js +4 -7
  147. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.d.ts +1 -8
  148. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.js +58 -75
  149. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatFollowups.js +1 -1
  150. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.d.ts +44 -12
  151. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.js +362 -188
  152. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPickerActionItem.d.ts +0 -2
  153. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.d.ts +4 -5
  154. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.js +42 -95
  155. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelSelectionLogic.d.ts +2 -1
  156. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.js +9 -10
  157. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.js +57 -38
  158. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.d.ts +21 -15
  159. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/{modelPickerActionItem2.js → modelPickerActionItem.js} +5 -7
  160. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.js +38 -31
  161. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.js +4 -5
  162. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerActionItem.js +3 -3
  163. package/vscode/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +94 -40
  164. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.js +7 -7
  165. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.js +2 -2
  166. package/vscode/src/vs/workbench/contrib/chat/common/chatArtifactExtraction.d.ts +16 -0
  167. package/vscode/src/vs/workbench/contrib/chat/common/chatArtifactExtraction.js +218 -0
  168. package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.js +7 -7
  169. package/vscode/src/vs/workbench/contrib/chat/common/widget/annotations.js +6 -1
  170. package/vscode/src/vs/workbench/contrib/chat/common/widget/chatColors.js +15 -15
  171. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatAffordance.js +12 -21
  172. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.d.ts +2 -32
  173. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.js +355 -156
  174. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.d.ts +2 -13
  175. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.js +72 -65
  176. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.d.ts +4 -43
  177. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.js +238 -204
  178. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.d.ts +4 -19
  179. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.js +128 -115
  180. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.d.ts +6 -9
  181. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.js +152 -49
  182. package/vscode/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +64 -0
  183. package/vscode/src/vs/workbench/contrib/inlineChat/common/inlineChat.js +40 -40
  184. package/vscode/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.js +3 -3
  185. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.js +7 -7
  186. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.js +2 -2
  187. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.js +2 -2
  188. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.js +24 -24
  189. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.js +3 -3
  190. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.js +7 -7
  191. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.js +1 -1
  192. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.js +5 -5
  193. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffList.js +1 -1
  194. package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditor.js +1 -1
  195. package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.js +1 -1
  196. package/vscode/src/vs/workbench/contrib/terminal/terminalContribChatExports.d.ts +2 -0
  197. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/alternativeRecommendation.d.ts +2 -0
  198. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/alternativeRecommendation.js +41 -0
  199. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandParsers/commandFileWriteParser.d.ts +24 -0
  200. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandParsers/sedFileWriteParser.d.ts +26 -0
  201. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandParsers/sedFileWriteParser.js +142 -0
  202. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/basicExecuteStrategy.d.ts +45 -0
  203. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/basicExecuteStrategy.js +165 -0
  204. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/executeStrategy.d.ts +53 -0
  205. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/executeStrategy.js +163 -0
  206. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.d.ts +27 -0
  207. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.js +142 -0
  208. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/richExecuteStrategy.d.ts +29 -0
  209. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/richExecuteStrategy.js +144 -0
  210. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/strategyHelpers.d.ts +40 -0
  211. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/strategyHelpers.js +174 -0
  212. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/outputHelpers.d.ts +7 -0
  213. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/outputHelpers.js +43 -0
  214. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalHelpers.d.ts +42 -0
  215. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalHelpers.js +256 -0
  216. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.d.ts +42 -0
  217. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.js +94 -0
  218. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.d.ts +42 -0
  219. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.js +221 -0
  220. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/commandLineAutoApprover.d.ts +31 -0
  221. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/commandLineAutoApprover.js +392 -0
  222. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/npmScriptAutoApprover.d.ts +45 -0
  223. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/npmScriptAutoApprover.js +243 -0
  224. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAnalyzer.d.ts +52 -0
  225. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAnalyzer.js +10 -0
  226. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAutoApproveAnalyzer.d.ts +20 -0
  227. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAutoApproveAnalyzer.js +310 -0
  228. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineFileWriteAnalyzer.d.ts +19 -0
  229. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineFileWriteAnalyzer.js +168 -0
  230. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineSandboxAnalyzer.d.ts +11 -0
  231. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineSandboxAnalyzer.js +33 -0
  232. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/commandLinePresenter.d.ts +41 -0
  233. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/nodeCommandLinePresenter.d.ts +19 -0
  234. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/nodeCommandLinePresenter.js +37 -0
  235. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/pythonCommandLinePresenter.d.ts +19 -0
  236. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/pythonCommandLinePresenter.js +37 -0
  237. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/rubyCommandLinePresenter.d.ts +19 -0
  238. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/rubyCommandLinePresenter.js +44 -0
  239. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/sandboxedCommandLinePresenter.d.ts +13 -0
  240. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/sandboxedCommandLinePresenter.js +22 -0
  241. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineBackgroundDetachRewriter.d.ts +22 -0
  242. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineBackgroundDetachRewriter.js +47 -0
  243. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineCdPrefixRewriter.d.ts +5 -0
  244. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineCdPrefixRewriter.js +27 -0
  245. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLinePreventHistoryRewriter.d.ts +14 -0
  246. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLinePreventHistoryRewriter.js +29 -0
  247. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLinePwshChainOperatorRewriter.d.ts +8 -0
  248. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLinePwshChainOperatorRewriter.js +33 -0
  249. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineRewriter.d.ts +24 -0
  250. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineSandboxRewriter.d.ts +8 -0
  251. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineSandboxRewriter.js +32 -0
  252. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.d.ts +108 -0
  253. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.js +412 -0
  254. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/types.d.ts +42 -0
  255. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/types.js +23 -0
  256. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/outputAnalyzer.d.ts +9 -0
  257. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.d.ts +192 -0
  258. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.js +2258 -0
  259. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sandboxOutputAnalyzer.d.ts +22 -0
  260. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sandboxOutputAnalyzer.js +43 -0
  261. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalCommandArtifactCollector.d.ts +17 -0
  262. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalCommandArtifactCollector.js +118 -0
  263. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalToolAutoApprove.d.ts +22 -0
  264. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalToolAutoApprove.js +44 -0
  265. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/toolIds.d.ts +1 -0
  266. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/treeSitterCommandParser.d.ts +25 -0
  267. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/treeSitterCommandParser.js +141 -0
  268. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.d.ts +85 -0
  269. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.js +608 -0
  270. package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/searchableOptionPickerActionItem.d.ts +0 -40
  271. package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/searchableOptionPickerActionItem.js +0 -196
  272. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem2.d.ts +0 -29
  273. package/vscode/src/vs/workbench/contrib/chat/common/widget/codeBlockModelCollection.d.ts +0 -46
  274. package/vscode/src/vs/workbench/contrib/chat/common/widget/codeBlockModelCollection.js +0 -215
  275. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatGutterAffordance.d.ts +0 -18
  276. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatGutterAffordance.js +0 -107
@@ -1,13 +1,12 @@
1
1
 
2
2
  import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
- import { $ as $$1, append, addDisposableListener, EventType, createElement, DisposableResizeObserver, clearNode, addStandardDisposableListener, WindowIntervalTimer, getWindow, reset, findParentWithClass } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
3
+ import { $ as $$1, append, addDisposableListener, EventType, createElement, DisposableResizeObserver, clearNode, addStandardDisposableListener, WindowIntervalTimer, getWindow, reset, findParentWithClass, hide, show } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
4
4
  import { renderFormattedText } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/formattedTextRenderer';
5
5
  import { StandardKeyboardEvent } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/keyboardEvent';
6
6
  import { alert } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/aria/aria';
7
7
  import { getDefaultHoverDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/hover/hoverDelegateFactory';
8
8
  import { CachedListVirtualDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/list/list';
9
9
  import { coalesce, distinct } from '@codingame/monaco-vscode-api/vscode/vs/base/common/arrays';
10
- import { findLast } from '@codingame/monaco-vscode-api/vscode/vs/base/common/arraysFind';
11
10
  import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
12
11
  import { toErrorMessage } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errorMessage';
13
12
  import { canceledName } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
@@ -15,7 +14,7 @@ import { Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/even
15
14
  import { MarkdownString } from '@codingame/monaco-vscode-api/vscode/vs/base/common/htmlContent';
16
15
  import { Iterable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/iterator';
17
16
  import { KeyCode } from '@codingame/monaco-vscode-api/vscode/vs/base/common/keyCodes';
18
- import { Disposable, DisposableStore, dispose, toDisposable, thenIfNotDisposed } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
17
+ import { Disposable, DisposableStore, dispose, toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
19
18
  import { ResourceMap } from '@codingame/monaco-vscode-api/vscode/vs/base/common/map';
20
19
  import { FileAccess, Schemas } from '@codingame/monaco-vscode-api/vscode/vs/base/common/network';
21
20
  import { clamp } from '@codingame/monaco-vscode-api/vscode/vs/base/common/numbers';
@@ -44,12 +43,12 @@ import { ChatContextKeys } from '@codingame/monaco-vscode-api/vscode/vs/workbenc
44
43
  import { chatSubcommandLeader } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/requestParser/chatParserTypes';
45
44
  import { ChatAgentVoteDirection, ChatRequestQueueKind, IChatToolInvocation, isChatFollowup, ChatErrorLevel } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatService/chatService';
46
45
  import { IChatService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatService/chatService.service';
46
+ import { ChatPlanReviewData } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatProgressTypes/chatPlanReviewData';
47
47
  import { ChatQuestionCarouselData } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatProgressTypes/chatQuestionCarouselData';
48
48
  import { localChatSessionType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatSessionsService';
49
49
  import { getChatSessionType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatUri';
50
50
  import { isResponseVM, isPendingDividerVM, isRequestVM } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatViewModel';
51
51
  import { getNWords } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatWordCounter';
52
- import { CodeBlockModelCollection } from '../../common/widget/codeBlockModelCollection.js';
53
52
  import { ChatConfiguration, ChatAgentLocation, CollapsedToolsDisplayMode, ThinkingDisplayMode, ChatModeKind } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
54
53
  import { ClickAnimation } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/animations/animations';
55
54
  import { MarkHelpfulActionId } from '../actions/chatTitleActions.js';
@@ -68,13 +67,14 @@ import { InlineTextModelCollection } from './chatContentParts/chatContentParts.j
68
67
  import { ChatElicitationContentPart } from './chatContentParts/chatElicitationContentPart.js';
69
68
  import { ChatErrorConfirmationContentPart } from './chatContentParts/chatErrorConfirmationPart.js';
70
69
  import { ChatErrorContentPart } from './chatContentParts/chatErrorContentPart.js';
70
+ import { ChatPlanReviewPart } from './chatContentParts/chatPlanReviewPart.js';
71
71
  import { ChatQuestionCarouselPart } from './chatContentParts/chatQuestionCarouselPart.js';
72
72
  import { ChatExtensionsContentPart } from './chatContentParts/chatExtensionsContentPart.js';
73
- import { codeblockHasClosingBackticks, ChatMarkdownContentPart } from './chatContentParts/chatMarkdownContentPart.js';
73
+ import { ChatMarkdownContentPart, codeblockHasClosingBackticks } from './chatContentParts/chatMarkdownContentPart.js';
74
74
  import { ChatMcpServersInteractionContentPart } from './chatContentParts/chatMcpServersInteractionContentPart.js';
75
75
  import { ChatDisabledClaudeHooksContentPart } from './chatContentParts/chatDisabledClaudeHooksContentPart.js';
76
76
  import { ChatMultiDiffContentPart } from './chatContentParts/chatMultiDiffContentPart.js';
77
- import { ChatWorkingProgressContentPart, ChatProgressContentPart } from './chatContentParts/chatProgressContentPart.js';
77
+ import { ChatWorkingProgressContentPart, ChatProgressSubPart, ChatProgressContentPart } from './chatContentParts/chatProgressContentPart.js';
78
78
  import { ChatPullRequestContentPart } from './chatContentParts/chatPullRequestContentPart.js';
79
79
  import { ChatQuotaExceededPart } from './chatContentParts/chatQuotaExceededPart.js';
80
80
  import { CollapsibleListPool, ChatUsedReferencesListContentPart } from './chatContentParts/chatReferencesContentPart.js';
@@ -90,6 +90,7 @@ import { ChatCodeBlockContentProvider } from './chatContentParts/codeBlockPart.j
90
90
  import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
91
91
  import { isEqual } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
92
92
  import { IAccessibilityService } from '@codingame/monaco-vscode-api/vscode/vs/platform/accessibility/common/accessibility.service';
93
+ import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
93
94
  import { ChatHookContentPart } from './chatContentParts/chatHookContentPart.js';
94
95
  import { HookType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/hookTypes';
95
96
  import { IWorkbenchEnvironmentService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/environment/common/environmentService.service';
@@ -129,7 +130,6 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
129
130
  editorOptions,
130
131
  rendererOptions,
131
132
  delegate,
132
- codeBlockModelCollection,
133
133
  overflowWidgetsDomNode,
134
134
  viewModel,
135
135
  instantiationService,
@@ -144,12 +144,12 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
144
144
  chatService,
145
145
  accessibilitySignalService,
146
146
  accessibilityService,
147
- environmentService
147
+ environmentService,
148
+ telemetryService
148
149
  ) {
149
150
  super();
150
151
  this.rendererOptions = rendererOptions;
151
152
  this.delegate = delegate;
152
- this.codeBlockModelCollection = codeBlockModelCollection;
153
153
  this.viewModel = viewModel;
154
154
  this.instantiationService = instantiationService;
155
155
  this.configService = configService;
@@ -164,6 +164,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
164
164
  this.accessibilitySignalService = accessibilitySignalService;
165
165
  this.accessibilityService = accessibilityService;
166
166
  this.environmentService = environmentService;
167
+ this.telemetryService = telemetryService;
167
168
  this.codeBlocksByResponseId = ( new Map());
168
169
  this.codeBlocksByEditorUri = ( new ResourceMap());
169
170
  this.fileTreesByResponseId = ( new Map());
@@ -172,6 +173,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
172
173
  this.responseTemplateDataByRequestId = ( new Map());
173
174
  this.pendingQuestionCarousels = ( new ResourceMap());
174
175
  this._notifiedQuestionCarousels = ( new Set());
176
+ this.workingProgressConfirmationEndListeners = ( new WeakSet());
175
177
  this._onDidClickFollowup = this._register(( new Emitter()));
176
178
  this.onDidClickFollowup = this._onDidClickFollowup.event;
177
179
  this._onDidClickRerunWithAgentOrCommandDetection = this._register(( new Emitter()));
@@ -190,17 +192,18 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
190
192
  this._currentLayoutWidth = observableValue(this, 0);
191
193
  this._isVisible = true;
192
194
  this._onDidChangeVisibility = this._register(( new Emitter()));
195
+ this._incrementalRenderingTelemetryLogged = false;
193
196
  this._announcedToolProgressKeys = ( new Set());
194
197
  this.chatContentMarkdownRenderer = this.instantiationService.createInstance(ChatContentMarkdownRenderer);
195
198
  this.markdownDecorationsRenderer = this.instantiationService.createInstance(ChatMarkdownDecorationsRenderer);
196
199
  this._editorPool = this._register(
197
- this.instantiationService.createInstance(EditorPool, editorOptions, delegate, overflowWidgetsDomNode, false)
200
+ this.instantiationService.createInstance(EditorPool, editorOptions, delegate, overflowWidgetsDomNode, true)
198
201
  );
199
202
  this._toolEditorPool = this._register(
200
203
  this.instantiationService.createInstance(EditorPool, editorOptions, delegate, overflowWidgetsDomNode, true)
201
204
  );
202
205
  this._diffEditorPool = this._register(
203
- this.instantiationService.createInstance(DiffEditorPool, editorOptions, delegate, overflowWidgetsDomNode, false)
206
+ this.instantiationService.createInstance(DiffEditorPool, editorOptions, delegate, overflowWidgetsDomNode, true)
204
207
  );
205
208
  this._treePool = this._register(
206
209
  this.instantiationService.createInstance(TreePool, this._onDidChangeVisibility.event)
@@ -211,11 +214,8 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
211
214
  undefined,
212
215
  undefined
213
216
  ));
214
- this._register(this.instantiationService.createInstance(ChatCodeBlockContentProvider));
215
217
  this._inlineTextModels = this._register(this.instantiationService.createInstance(InlineTextModelCollection));
216
- this._toolInvocationCodeBlockCollection = this._register(
217
- this.instantiationService.createInstance(CodeBlockModelCollection, "tools")
218
- );
218
+ this._register(this.instantiationService.createInstance(ChatCodeBlockContentProvider));
219
219
  this._register(this.chatService.onDidSubmitRequest(e => {
220
220
  const carousels = this.pendingQuestionCarousels.get(e.chatSessionResource);
221
221
  if (carousels) {
@@ -265,6 +265,9 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
265
265
  return;
266
266
  }
267
267
  const normalizedHeight = Math.ceil(height);
268
+ if (normalizedHeight === template.currentElement.currentRenderedHeight) {
269
+ return;
270
+ }
268
271
  template.currentElement.currentRenderedHeight = normalizedHeight;
269
272
  if (template.currentElement !== this._elementBeingRendered) {
270
273
  this._onDidChangeItemHeight.fire({
@@ -306,12 +309,13 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
306
309
  this.fileTreesByResponseId.clear();
307
310
  this.focusedFileTreesByResponseId.clear();
308
311
  this.responseTemplateDataByRequestId.clear();
312
+ this.templateDataByRequestId.clear();
313
+ this._onDidUpdateViewModel.fire();
309
314
  this._editorPool.clear();
310
315
  this._toolEditorPool.clear();
311
316
  this._diffEditorPool.clear();
312
317
  this._treePool.clear();
313
318
  this._contentReferencesListPool.clear();
314
- this._onDidUpdateViewModel.fire();
315
319
  }
316
320
  getCodeBlockInfoForEditor(uri) {
317
321
  return this.codeBlocksByEditorUri.get(uri);
@@ -460,7 +464,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
460
464
  const checkpointRestoreContainer = append(rowContainer, $(".checkpoint-restore-container"));
461
465
  append(checkpointRestoreContainer, $(".checkpoint-line-left"));
462
466
  const label = append(checkpointRestoreContainer, $("span.checkpoint-label-text"));
463
- label.textContent = ( localize(6996, "Checkpoint Restored"));
467
+ label.textContent = ( localize(7116, "Checkpoint Restored"));
464
468
  const dot = append(checkpointRestoreContainer, $("span.checkpoint-dot-separator"));
465
469
  dot.textContent = "·";
466
470
  dot.setAttribute("aria-hidden", "true");
@@ -595,6 +599,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
595
599
  templateData.footerToolbar.context = undefined;
596
600
  templateData.checkpointToolbar.context = undefined;
597
601
  templateData.checkpointRestoreToolbar.context = undefined;
602
+ templateData.currentElement = undefined;
598
603
  }
599
604
  renderChatTreeItem(element, index, templateData) {
600
605
  if (templateData.currentElement && templateData.currentElement.id !== element.id) {
@@ -667,6 +672,10 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
667
672
  "show-detail-progress",
668
673
  isResponseVM(element) && !element.isComplete && !element.progressMessages.length && !progressMessageAtBottomOfResponse
669
674
  );
675
+ templateData.rowContainer.classList.toggle(
676
+ "chat-progress-reservable",
677
+ isResponseVM(element) && !element.isComplete && !!progressMessageAtBottomOfResponse
678
+ );
670
679
  const updateContainerCheckmarks = () => templateData.rowContainer.classList.toggle(
671
680
  "show-checkmarks",
672
681
  !!this.configService.getValue(AccessibilityWorkbenchSettingId.ShowChatCheckmarks)
@@ -680,14 +689,15 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
680
689
  if (!this.rendererOptions.noHeader) {
681
690
  this.renderAvatar(element, templateData);
682
691
  }
692
+ const isSystemInitiatedRequest = isRequestVM(element) && !!element.isSystemInitiated;
683
693
  templateData.username.textContent = element.username;
684
694
  templateData.username.classList.toggle(
685
695
  "hidden",
686
- element.username === COPILOT_USERNAME || this.environmentService.isSessionsWindow
696
+ element.username === COPILOT_USERNAME || this.environmentService.isSessionsWindow || isSystemInitiatedRequest
687
697
  );
688
698
  templateData.avatarContainer.classList.toggle(
689
699
  "hidden",
690
- element.username === COPILOT_USERNAME || this.environmentService.isSessionsWindow
700
+ element.username === COPILOT_USERNAME || this.environmentService.isSessionsWindow || isSystemInitiatedRequest
691
701
  );
692
702
  this.hoverHidden(templateData.requestHover);
693
703
  clearNode(templateData.detail);
@@ -698,7 +708,10 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
698
708
  const supportsForkOrRestoration = this.rendererOptions.supportsFork || (this.rendererOptions.restorable ?? true);
699
709
  const checkpointEnabled = this.configService.getValue(ChatConfiguration.CheckpointsEnabled) && supportsForkOrRestoration;
700
710
  const isPendingRequest = isRequestVM(element) && !!element.pendingKind;
701
- templateData.checkpointContainer.classList.toggle("hidden", isResponseVM(element) || isPendingRequest || !checkpointEnabled);
711
+ templateData.checkpointContainer.classList.toggle(
712
+ "hidden",
713
+ isResponseVM(element) || isPendingRequest || isSystemInitiatedRequest || !checkpointEnabled
714
+ );
702
715
  templateData.footerToolbar.refresh();
703
716
  templateData.checkpointToolbar.refresh();
704
717
  templateData.checkpointRestoreToolbar.refresh();
@@ -747,7 +760,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
747
760
  templateData.requestHover.classList.toggle("editing", editing && isInput);
748
761
  templateData.requestHover.classList.toggle(
749
762
  "hidden",
750
- (!!this.viewModel?.editing && !editing) || isResponseVM(element) || !this.rendererOptions.editable
763
+ (!!this.viewModel?.editing && !editing) || isResponseVM(element) || !this.rendererOptions.editable || isSystemInitiatedRequest
751
764
  );
752
765
  templateData.requestHover.classList.toggle("expanded", this.configService.getValue("chat.editRequests") === "hover");
753
766
  templateData.requestHover.classList.toggle("checkpoints-enabled", checkpointEnabled);
@@ -766,28 +779,38 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
766
779
  rowRoot?.classList.toggle("response", isResponseVM(element));
767
780
  templateData.rowContainer.classList.toggle(mostRecentResponseClassName, index === this.delegate.getListLength() - 1);
768
781
  templateData.rowContainer.classList.toggle("confirmation-message", isRequestVM(element) && !!element.confirmation);
769
- const shouldShowHeader = isResponseVM(element) && !this.rendererOptions.noHeader;
782
+ const shouldShowHeader = (isResponseVM(element) && !this.rendererOptions.noHeader) && !isSystemInitiatedRequest;
770
783
  templateData.header?.classList.toggle("header-disabled", !shouldShowHeader);
771
784
  if (isRequestVM(element) && element.confirmation) {
772
785
  this.renderConfirmationAction(element, templateData);
773
786
  }
787
+ const incrementalRendering = this.configService.getValue(ChatConfiguration.IncrementalRendering);
774
788
  if (isResponseVM(element) && index === this.delegate.getListLength() - 1 && (!element.isComplete || element.renderData)) {
775
789
  this.traceLayout("renderElement", `start progressive render, index=${index}`);
776
- const timer = templateData.elementDisposables.add(new WindowIntervalTimer());
777
- const runProgressiveRender = initial => {
778
- try {
779
- if (this.doNextProgressiveRender(element, index, templateData, !!initial)) {
790
+ if (incrementalRendering && !element.renderData) {
791
+ this.logIncrementalRenderingTelemetry();
792
+ this.doIncrementalRender(element, index, templateData);
793
+ } else {
794
+ const timer = templateData.elementDisposables.add(new WindowIntervalTimer());
795
+ const runProgressiveRender = initial => {
796
+ try {
797
+ if (this.doNextProgressiveRender(element, index, templateData, !!initial)) {
798
+ timer.cancel();
799
+ }
800
+ } catch (err) {
780
801
  timer.cancel();
802
+ this.logService.error(err);
781
803
  }
782
- } catch (err) {
783
- timer.cancel();
784
- this.logService.error(err);
785
- }
786
- };
787
- timer.cancelAndSet(runProgressiveRender, 50, getWindow(templateData.rowContainer));
788
- runProgressiveRender(true);
804
+ };
805
+ timer.cancelAndSet(runProgressiveRender, 50, getWindow(templateData.rowContainer));
806
+ runProgressiveRender(true);
807
+ }
789
808
  } else {
790
809
  if (isResponseVM(element)) {
810
+ if (incrementalRendering) {
811
+ const rate = this.getProgressiveRenderRate(element);
812
+ this._updateMorpherRate(templateData, rate, true);
813
+ }
791
814
  this.renderChatResponseBasic(element, index, templateData);
792
815
  } else if (isRequestVM(element)) {
793
816
  this.renderChatRequest(element, index, templateData);
@@ -813,11 +836,16 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
813
836
  const dividerContent = $$1(".pending-divider-content");
814
837
  const label = append(dividerContent, $$1("span.pending-divider-label"));
815
838
  if (element.dividerKind === ChatRequestQueueKind.Steering) {
816
- label.textContent = ( localize(6997, "Steering"));
817
- label.title = ( localize(6998, "Steering message will be sent after the next tool call happens"));
839
+ if (element.isSystemInitiated) {
840
+ label.textContent = ( localize(7117, "System Notification"));
841
+ label.title = ( localize(7118, "System notification will be sent after the next tool call happens"));
842
+ } else {
843
+ label.textContent = ( localize(7119, "Steering"));
844
+ label.title = ( localize(7120, "Steering message will be sent after the next tool call happens"));
845
+ }
818
846
  } else {
819
- label.textContent = ( localize(6999, "Queued"));
820
- label.title = ( localize(7000, "Queued messages will be sent after the current request completes"));
847
+ label.textContent = ( localize(7121, "Queued"));
848
+ label.title = ( localize(7122, "Queued messages will be sent after the current request completes"));
821
849
  }
822
850
  templateData.value.appendChild(dividerContent);
823
851
  }
@@ -825,10 +853,10 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
825
853
  clearNode(templateData.detail);
826
854
  if (element.agentOrSlashCommandDetected) {
827
855
  const msg = element.slashCommand ? ( localize(
828
- 7001,
856
+ 7123,
829
857
  "used {0} [[(rerun without)]]",
830
858
  `${chatSubcommandLeader}${element.slashCommand.name}`
831
- )) : ( localize(7002, "[[(rerun without)]]"));
859
+ )) : ( localize(7124, "[[(rerun without)]]"));
832
860
  reset(templateData.detail, renderFormattedText(msg, {
833
861
  actionHandler: {
834
862
  disposables: templateData.elementDisposables,
@@ -841,7 +869,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
841
869
  this.delegate.currentChatMode(),
842
870
  this.rendererOptions.progressMessageAtBottomOfResponse
843
871
  )) {
844
- templateData.detail.textContent = ( localize(7003, "Working"));
872
+ templateData.detail.textContent = ( localize(7125, "Working"));
845
873
  }
846
874
  }
847
875
  renderConfirmationAction(element, templateData) {
@@ -850,7 +878,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
850
878
  append(templateData.detail, $("span.codicon.codicon-check", {
851
879
  "aria-hidden": "true"
852
880
  }));
853
- append(templateData.detail, $("span.confirmation-text", undefined, ( localize(7004, "Selected \"{0}\"", element.confirmation))));
881
+ append(templateData.detail, $("span.confirmation-text", undefined, ( localize(7126, "Selected \"{0}\"", element.confirmation))));
854
882
  templateData.header?.classList.remove("header-disabled");
855
883
  templateData.header?.classList.add("partially-disabled");
856
884
  }
@@ -889,14 +917,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
889
917
  }
890
918
  renderChatResponseBasic(element, index, templateData) {
891
919
  templateData.rowContainer.classList.toggle("chat-response-loading", (isResponseVM(element) && !element.isComplete));
892
- if (element.isComplete || element.isCanceled) {
893
- const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
894
- if (lastThinking?.domNode && lastThinking.getIsActive()) {
895
- lastThinking.finalizeTitleIfDefault();
896
- lastThinking.markAsInactive();
897
- }
898
- this.finalizeAllSubagentParts(templateData);
899
- }
920
+ this.finalizeCompletedResponseParts(element, templateData);
900
921
  const content = [];
901
922
  const isFiltered = !!element.errorDetails?.responseIsFiltered;
902
923
  if (!isFiltered) {
@@ -923,57 +944,205 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
923
944
  if (fileChangesSummaryPart) {
924
945
  content.push(fileChangesSummaryPart);
925
946
  }
947
+ const workingProgress = this.shouldShowWorkingProgress(element, content, false, templateData);
948
+ if (workingProgress) {
949
+ content.push(workingProgress);
950
+ }
926
951
  const diff = this.diff(templateData.renderedParts ?? [], content, element);
927
952
  this.renderChatContentDiff(diff, content, element, index, templateData);
953
+ this.finalizeCompletedResponseParts(element, templateData);
954
+ }
955
+ finalizeCompletedResponseParts(element, templateData) {
956
+ if (!element.isComplete && !element.isCanceled) {
957
+ return;
958
+ }
959
+ const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
960
+ if (lastThinking?.domNode && lastThinking.getIsActive()) {
961
+ lastThinking.finalizeTitleIfDefault();
962
+ lastThinking.markAsInactive();
963
+ }
964
+ this.finalizeAllSubagentParts(templateData);
928
965
  }
929
966
  shouldShowWorkingProgress(element, partsToRender, moreContentAvailable, templateData) {
930
- if (element.agentOrSlashCommandDetected || this.rendererOptions.renderStyle === "minimal" || element.isComplete || !checkModeOption(
967
+ if (element.agentOrSlashCommandDetected || this.rendererOptions.renderStyle === "minimal") {
968
+ return undefined;
969
+ }
970
+ const showProgressDetails = this.configService.getValue(ChatConfiguration.ChatPersistentProgressEnabled) !== false;
971
+ if (element.isComplete) {
972
+ return undefined;
973
+ }
974
+ const workingState = {
975
+ confirmationAdjustedTimestamp: element.confirmationAdjustedTimestamp,
976
+ completionTokenCountObs: element.completionTokenCountObs,
977
+ isComplete: element.isComplete,
978
+ completedAt: element.model.completedAt,
979
+ elapsedMs: element.model.elapsedMs
980
+ };
981
+ if (!checkModeOption(
931
982
  this.delegate.currentChatMode(),
932
983
  this.rendererOptions.progressMessageAtBottomOfResponse
933
984
  )) {
934
- return false;
985
+ return undefined;
986
+ }
987
+ if (isResponseVM(element)) {
988
+ const widget = this.chatWidgetService.getWidgetBySessionResource(element.sessionResource);
989
+ if (widget?.inputPart.hasActiveToolConfirmationCarousel) {
990
+ const nonSubagentConfirmationCount = this.getPendingToolConfirmationCount(partsToRender, false);
991
+ if (nonSubagentConfirmationCount > 0) {
992
+ return {
993
+ kind: "working",
994
+ content: ( new MarkdownString()).appendText(this.getConfirmationPendingLabel(nonSubagentConfirmationCount))
995
+ };
996
+ }
997
+ if (this.getPendingToolConfirmationCount(partsToRender, true) > 0 || this.getSubagentPart(templateData.renderedParts)) {
998
+ return undefined;
999
+ }
1000
+ return {
1001
+ kind: "working",
1002
+ content: ( new MarkdownString()).appendText(this.getConfirmationPendingLabel(1))
1003
+ };
1004
+ }
1005
+ }
1006
+ let lastPart;
1007
+ for (let i = partsToRender.length - 1; i >= 0; i--) {
1008
+ const part = partsToRender[i];
1009
+ if (part.kind !== "markdownContent" || part.content.value.trim().length > 0) {
1010
+ lastPart = part;
1011
+ break;
1012
+ }
1013
+ }
1014
+ if (showProgressDetails) {
1015
+ const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
1016
+ if (lastThinking?.getIsActive() && !lastThinking.isFixedScrollingMode) {
1017
+ return undefined;
1018
+ }
1019
+ if (lastPart?.kind === "progressMessage") {
1020
+ return undefined;
1021
+ }
1022
+ return {
1023
+ kind: "working",
1024
+ state: workingState
1025
+ };
935
1026
  }
936
1027
  if (( partsToRender.some(
937
1028
  part => part.kind === "toolInvocation" && IChatToolInvocation.isStreaming(part)
938
1029
  ))) {
939
- return false;
1030
+ return undefined;
940
1031
  }
941
1032
  if (( partsToRender.some(
942
1033
  part => part.kind === "toolInvocation" && !IChatToolInvocation.isComplete(part) && isMcpToolInvocation(part)
943
1034
  ))) {
944
- return false;
1035
+ return undefined;
945
1036
  }
946
- const lastPart = findLast(
947
- partsToRender,
948
- part => part.kind !== "markdownContent" || part.content.value.trim().length > 0
949
- );
950
1037
  const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
951
1038
  if (lastThinking) {
952
- return false;
1039
+ return undefined;
953
1040
  }
954
1041
  if (lastPart && (lastPart.kind === "toolInvocation" || lastPart.kind === "toolInvocationSerialized")) {
955
1042
  if (lastPart.isAttachedToThinking) {
956
- return false;
1043
+ return undefined;
957
1044
  }
958
1045
  const collapsedToolsMode = this.configService.getValue("chat.agent.thinking.collapsedTools");
959
1046
  if (collapsedToolsMode !== CollapsedToolsDisplayMode.Off && this.shouldPinPart(lastPart, isResponseVM(element) ? element : undefined)) {
960
- return false;
1047
+ return undefined;
961
1048
  }
962
1049
  }
963
1050
  const hasRenderedThinkingPart = ( (templateData.renderedParts ?? []).some(part => part instanceof ChatThinkingContentPart));
964
1051
  const hasEditPillMarkdown = ( partsToRender.some(part => part.kind === "markdownContent" && this.hasEditCodeblockUri(part)));
965
1052
  if (hasRenderedThinkingPart && hasEditPillMarkdown) {
966
- return false;
1053
+ return undefined;
967
1054
  }
968
1055
  if (this.getSubagentPart(templateData.renderedParts)) {
969
- return false;
1056
+ return undefined;
970
1057
  }
971
- if (!lastPart || lastPart.kind === "references" || (lastPart.kind === "markdownContent" && !moreContentAvailable && this.hasBeenCaughtUpLongEnough(element)) || ((lastPart.kind === "toolInvocation" || lastPart.kind === "toolInvocationSerialized") && (IChatToolInvocation.isComplete(lastPart) || lastPart.presentation === "hidden")) || ((lastPart.kind === "textEditGroup" || lastPart.kind === "notebookEditGroup") && lastPart.done && !( partsToRender.some(
1058
+ if (!lastPart || lastPart.kind === "references" || (lastPart.kind === "markdownContent" && !moreContentAvailable && this.hasBeenCaughtUpLongEnough(element)) || ((lastPart.kind === "toolInvocation" || lastPart.kind === "toolInvocationSerialized") && (IChatToolInvocation.isComplete(lastPart) || IChatToolInvocation.isEffectivelyHidden(lastPart))) || ((lastPart.kind === "textEditGroup" || lastPart.kind === "notebookEditGroup") && lastPart.done && !( partsToRender.some(
972
1059
  part => part.kind === "toolInvocation" && !IChatToolInvocation.isComplete(part)
973
1060
  ))) || (lastPart.kind === "progressTask" && lastPart.deferred.isSettled) || lastPart.kind === "mcpServersStarting" || lastPart.kind === "disabledClaudeHooks" || lastPart.kind === "hook") {
974
- return true;
1061
+ return {
1062
+ kind: "working"
1063
+ };
975
1064
  }
976
- return false;
1065
+ return undefined;
1066
+ }
1067
+ getPendingToolConfirmationCount(parts, includeSubagentConfirmations) {
1068
+ return parts.filter(part => {
1069
+ if (part.kind !== "toolInvocation") {
1070
+ return false;
1071
+ }
1072
+ const state = part.state.get();
1073
+ return state.type === IChatToolInvocation.StateKind.WaitingForConfirmation && !!state.confirmationMessages?.title && part.presentation !== "hidden" && part.source.type !== "mcp" && (isSubagentToolInvocation(part) === includeSubagentConfirmations);
1074
+ }).length;
1075
+ }
1076
+ getConfirmationPendingLabel(count) {
1077
+ return count === 1 ? ( localize(7127, "1 confirmation pending")) : ( localize(7128, "{0} confirmations pending", count));
1078
+ }
1079
+ removeWorkingProgressContentPart(templateData) {
1080
+ const renderedParts = templateData.renderedParts;
1081
+ if (!renderedParts) {
1082
+ return;
1083
+ }
1084
+ for (let i = renderedParts.length - 1; i >= 0; i--) {
1085
+ const part = renderedParts[i];
1086
+ if (part instanceof ChatWorkingProgressContentPart) {
1087
+ part.dispose();
1088
+ part.domNode?.remove();
1089
+ renderedParts.splice(i, 1);
1090
+ this.fireItemHeightChange(templateData);
1091
+ return;
1092
+ }
1093
+ }
1094
+ }
1095
+ updateWorkingProgressForPendingConfirmations(templateData) {
1096
+ const element = templateData.currentElement;
1097
+ if (!isResponseVM(element)) {
1098
+ return;
1099
+ }
1100
+ if (element.isComplete && this.configService.getValue(ChatConfiguration.ChatPersistentProgressEnabled) !== false) {
1101
+ return;
1102
+ }
1103
+ const pendingConfirmationCount = this.getPendingToolConfirmationCount(element.response.value, false);
1104
+ if (pendingConfirmationCount === 0) {
1105
+ this.removeWorkingProgressContentPart(templateData);
1106
+ return;
1107
+ }
1108
+ const workingProgressPart = this.getWorkingProgressContentPart(templateData);
1109
+ if (workingProgressPart) {
1110
+ workingProgressPart.updateWorkingContent(( new MarkdownString()).appendText(this.getConfirmationPendingLabel(pendingConfirmationCount)));
1111
+ }
1112
+ }
1113
+ getWorkingProgressContentPart(templateData) {
1114
+ const renderedParts = templateData.renderedParts;
1115
+ if (!renderedParts) {
1116
+ return undefined;
1117
+ }
1118
+ for (let i = renderedParts.length - 1; i >= 0; i--) {
1119
+ const part = renderedParts[i];
1120
+ if (part instanceof ChatWorkingProgressContentPart) {
1121
+ return part;
1122
+ }
1123
+ }
1124
+ return undefined;
1125
+ }
1126
+ createUpdateWorkingProgressOnConfirmationEnd(toolInvocation, templateData) {
1127
+ if (( this.workingProgressConfirmationEndListeners.has(toolInvocation))) {
1128
+ return undefined;
1129
+ }
1130
+ this.workingProgressConfirmationEndListeners.add(toolInvocation);
1131
+ let wasWaitingForConfirmation = false;
1132
+ const disposable = autorun(reader => {
1133
+ const currentState = toolInvocation.state.read(reader);
1134
+ const isWaitingForConfirmation = currentState.type === IChatToolInvocation.StateKind.WaitingForConfirmation;
1135
+ if (wasWaitingForConfirmation && !isWaitingForConfirmation) {
1136
+ this.updateWorkingProgressForPendingConfirmations(templateData);
1137
+ this.workingProgressConfirmationEndListeners.delete(toolInvocation);
1138
+ disposable.dispose();
1139
+ }
1140
+ wasWaitingForConfirmation = isWaitingForConfirmation;
1141
+ });
1142
+ return toDisposable(() => {
1143
+ this.workingProgressConfirmationEndListeners.delete(toolInvocation);
1144
+ disposable.dispose();
1145
+ });
977
1146
  }
978
1147
  hasBeenCaughtUpLongEnough(element) {
979
1148
  const lastRenderTime = element.renderData?.lastRenderTime;
@@ -998,6 +1167,11 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
998
1167
  renderChatRequest(element, index, templateData) {
999
1168
  templateData.rowContainer.classList.toggle("chat-response-loading", false);
1000
1169
  templateData.rowContainer.classList.toggle("pending-request", !!element.pendingKind);
1170
+ templateData.rowContainer.classList.toggle("system-initiated-request", !!element.isSystemInitiated);
1171
+ if (element.isSystemInitiated) {
1172
+ this.renderSystemInitiatedRequest(element, templateData);
1173
+ return;
1174
+ }
1001
1175
  if (element.pendingKind && this._pendingDragController) {
1002
1176
  templateData.rowContainer.dataset.pendingRequestId = element.id;
1003
1177
  templateData.rowContainer.dataset.pendingKind = element.pendingKind;
@@ -1064,7 +1238,6 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1064
1238
  container: templateData.rowContainer,
1065
1239
  editorPool: this._editorPool,
1066
1240
  diffEditorPool: this._diffEditorPool,
1067
- codeBlockModelCollection: this.codeBlockModelCollection,
1068
1241
  currentWidth: this._currentLayoutWidth,
1069
1242
  onDidChangeVisibility: this._onDidChangeVisibility.event,
1070
1243
  inlineTextModels: this._inlineTextModels,
@@ -1102,13 +1275,73 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1102
1275
  }
1103
1276
  templateData.renderedParts = parts;
1104
1277
  if (element.variables.length) {
1105
- const newPart = this.renderAttachments(element.variables, element.contentReferences, templateData);
1278
+ const newPart = this.renderAttachments(
1279
+ element.variables,
1280
+ element.contentReferences,
1281
+ element.modelId,
1282
+ templateData
1283
+ );
1106
1284
  if (newPart.domNode) {
1107
1285
  templateData.value.appendChild(newPart.domNode);
1108
1286
  }
1109
1287
  templateData.elementDisposables.add(newPart);
1110
1288
  }
1111
1289
  }
1290
+ renderSystemInitiatedRequest(element, templateData) {
1291
+ clearNode(templateData.value);
1292
+ if (templateData.renderedParts) {
1293
+ dispose(templateData.renderedParts);
1294
+ }
1295
+ templateData.renderedParts = [];
1296
+ const label = element.systemInitiatedLabel ?? element.messageText;
1297
+ const rendered = this.chatContentMarkdownRenderer.render(( new MarkdownString(label)));
1298
+ templateData.elementDisposables.add(rendered);
1299
+ rendered.element.classList.add("progress-step");
1300
+ const progressPart = this.instantiationService.createInstance(ChatProgressSubPart, rendered.element, Codicon.check, undefined);
1301
+ templateData.elementDisposables.add(progressPart);
1302
+ templateData.value.appendChild(progressPart.domNode);
1303
+ }
1304
+ doIncrementalRender(element, index, templateData) {
1305
+ if (!this._isVisible) {
1306
+ return;
1307
+ }
1308
+ const rate = this.getProgressiveRenderRate(element);
1309
+ this._updateMorpherRate(templateData, rate, element.isComplete || element.isCanceled);
1310
+ if (element.isCanceled || element.isComplete) {
1311
+ element.renderData = undefined;
1312
+ templateData.rowContainer.classList.toggle("chat-response-loading", false);
1313
+ this.renderChatResponseBasic(element, index, templateData);
1314
+ return;
1315
+ }
1316
+ templateData.rowContainer.classList.toggle("chat-response-loading", true);
1317
+ const contentForThisTurn = this.getNextProgressiveRenderContent(element, templateData);
1318
+ const partsToRender = this.diff(templateData.renderedParts ?? [], contentForThisTurn.content, element);
1319
+ const contentIsAlreadyRendered = partsToRender.every(part => part === null);
1320
+ if (!contentIsAlreadyRendered) {
1321
+ this.renderChatContentDiff(partsToRender, contentForThisTurn.content, element, index, templateData);
1322
+ }
1323
+ }
1324
+ _updateMorpherRate(templateData, rate, isComplete) {
1325
+ const renderedParts = templateData.renderedParts;
1326
+ if (!renderedParts) {
1327
+ return;
1328
+ }
1329
+ for (const part of renderedParts) {
1330
+ if (part instanceof ChatMarkdownContentPart) {
1331
+ part.updateStreamRate(rate, isComplete);
1332
+ }
1333
+ }
1334
+ }
1335
+ logIncrementalRenderingTelemetry() {
1336
+ if (this._incrementalRenderingTelemetryLogged) {
1337
+ return;
1338
+ }
1339
+ this._incrementalRenderingTelemetryLogged = true;
1340
+ this.telemetryService.publicLog2("chatIncrementalRenderingSettings", {
1341
+ animationStyle: this.configService.getValue(ChatConfiguration.IncrementalRenderingStyle) ?? "none",
1342
+ buffering: this.configService.getValue(ChatConfiguration.IncrementalRenderingBuffering) ?? "word"
1343
+ });
1344
+ }
1112
1345
  doNextProgressiveRender(element, index, templateData, isInRenderElement) {
1113
1346
  if (!this._isVisible) {
1114
1347
  return true;
@@ -1187,6 +1420,12 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1187
1420
  renderedParts[contentIndex] = alreadyRenderedPart;
1188
1421
  return;
1189
1422
  }
1423
+ if (partToRender.kind === "markdownContent" && alreadyRenderedPart instanceof ChatMarkdownContentPart && this.configService.getValue(ChatConfiguration.IncrementalRendering)) {
1424
+ if (alreadyRenderedPart.tryIncrementalUpdate(partToRender)) {
1425
+ renderedParts[contentIndex] = alreadyRenderedPart;
1426
+ return;
1427
+ }
1428
+ }
1190
1429
  alreadyRenderedPart.dispose();
1191
1430
  if (alreadyRenderedPart.domNode) {
1192
1431
  const thinkingToolWrapper = findParentWithClass(alreadyRenderedPart.domNode, "chat-thinking-tool-wrapper");
@@ -1203,7 +1442,6 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1203
1442
  container: templateData.rowContainer,
1204
1443
  editorPool: this._editorPool,
1205
1444
  diffEditorPool: this._diffEditorPool,
1206
- codeBlockModelCollection: this.codeBlockModelCollection,
1207
1445
  currentWidth: this._currentLayoutWidth,
1208
1446
  onDidChangeVisibility: this._onDidChangeVisibility.event,
1209
1447
  inlineTextModels: this._inlineTextModels,
@@ -1212,12 +1450,13 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1212
1450
  };
1213
1451
  const lastThinking = this.getLastThinkingPart(renderedParts);
1214
1452
  if (lastThinking && (partToRender.kind === "toolInvocation" || partToRender.kind === "toolInvocationSerialized" || partToRender.kind === "markdownContent" || partToRender.kind === "textEditGroup" || partToRender.kind === "hook") && this.shouldPinPart(partToRender, element)) {
1453
+ if (alreadyRenderedPart instanceof ChatMarkdownContentPart) {
1454
+ lastThinking.removeEditPillByPartId(alreadyRenderedPart.codeblocksPartId);
1455
+ }
1215
1456
  const newPart = this.renderChatContentPart(partToRender, templateData, context);
1216
1457
  if (newPart) {
1217
1458
  renderedParts[contentIndex] = newPart;
1218
- if (alreadyRenderedPart instanceof ChatWorkingProgressContentPart && alreadyRenderedPart?.domNode) {
1219
- alreadyRenderedPart.domNode.remove();
1220
- }
1459
+ alreadyRenderedPart?.domNode?.remove();
1221
1460
  }
1222
1461
  return;
1223
1462
  }
@@ -1253,6 +1492,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1253
1492
  getNextProgressiveRenderContent(element, templateData) {
1254
1493
  const data = this.getDataForProgressiveRender(element);
1255
1494
  const renderImmediately = this.configService.getValue("chat.experimental.renderMarkdownImmediately") === true;
1495
+ const incrementalRendering = this.configService.getValue(ChatConfiguration.IncrementalRendering) === true;
1256
1496
  const renderableResponse = annotateSpecialMarkdownContent(element.response.value);
1257
1497
  this.traceLayout(
1258
1498
  "getNextProgressiveRenderContent",
@@ -1267,7 +1507,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1267
1507
  let moreContentAvailable = false;
1268
1508
  for (let i = 0; i < renderableResponse.length; i++) {
1269
1509
  const part = renderableResponse[i];
1270
- if (part.kind === "markdownContent" && !renderImmediately) {
1510
+ if (part.kind === "markdownContent" && !renderImmediately && !incrementalRendering) {
1271
1511
  const wordCountResult = getNWords(part.content.value, numNeededWords);
1272
1512
  this.traceLayout(
1273
1513
  "getNextProgressiveRenderContent",
@@ -1315,10 +1555,9 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1315
1555
  renderedParts: partsToRender
1316
1556
  };
1317
1557
  }
1318
- if (this.shouldShowWorkingProgress(element, partsToRender, moreContentAvailable, templateData)) {
1319
- partsToRender.push({
1320
- kind: "working"
1321
- });
1558
+ const workingProgress = this.shouldShowWorkingProgress(element, partsToRender, moreContentAvailable, templateData);
1559
+ if (workingProgress) {
1560
+ partsToRender.push(workingProgress);
1322
1561
  }
1323
1562
  const fileChangesSummaryPart = this.getChatFileChangesSummaryPart(element);
1324
1563
  if (fileChangesSummaryPart) {
@@ -1487,7 +1726,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1487
1726
  return;
1488
1727
  }
1489
1728
  for (const part of templateData.renderedParts) {
1490
- if (part instanceof ChatSubagentContentPart && part.getIsActive()) {
1729
+ if (part instanceof ChatSubagentContentPart && part.getIsActive() && !part.hasToolsWaitingForConfirmation) {
1491
1730
  part.markAsInactive();
1492
1731
  }
1493
1732
  }
@@ -1496,6 +1735,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1496
1735
  this.finalizeCurrentThinkingPart(context, templateData);
1497
1736
  const lastSubagent = this.getSubagentPart(templateData.renderedParts, subagentId);
1498
1737
  if (lastSubagent) {
1738
+ this.maybeRouteSubagentToolToCarousel(toolInvocation, lastSubagent, context, templateData, codeBlockStartIndex);
1499
1739
  if (!isParentSubagentTool(toolInvocation)) {
1500
1740
  lastSubagent.appendToolInvocation(toolInvocation, codeBlockStartIndex);
1501
1741
  }
@@ -1510,14 +1750,69 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1510
1750
  this._contentReferencesListPool,
1511
1751
  this._toolEditorPool,
1512
1752
  () => this._currentLayoutWidth.get(),
1513
- this._toolInvocationCodeBlockCollection,
1514
1753
  this._announcedToolProgressKeys
1515
1754
  );
1755
+ this.maybeRouteSubagentToolToCarousel(toolInvocation, subagentPart, context, templateData, codeBlockStartIndex);
1516
1756
  if (!isParentSubagentTool(toolInvocation)) {
1517
1757
  subagentPart.appendToolInvocation(toolInvocation, codeBlockStartIndex);
1518
1758
  }
1519
1759
  return subagentPart;
1520
1760
  }
1761
+ maybeRouteSubagentToolToCarousel(toolInvocation, subagentPart, context, templateData, codeBlockStartIndex) {
1762
+ if (!this.configService.getValue(ChatConfiguration.ToolConfirmationCarousel)) {
1763
+ return;
1764
+ }
1765
+ if (toolInvocation.kind !== "toolInvocation" || !isResponseVM(context.element)) {
1766
+ return;
1767
+ }
1768
+ if (isParentSubagentTool(toolInvocation) || toolInvocation.presentation === "hidden" || toolInvocation.source.type === "mcp") {
1769
+ return;
1770
+ }
1771
+ if (!!this.viewModel?.editing) {
1772
+ return;
1773
+ }
1774
+ const widget = this.chatWidgetService.getWidgetBySessionResource(context.element.sessionResource);
1775
+ if (!widget) {
1776
+ return;
1777
+ }
1778
+ const subAgentInvocationId = subagentPart.subAgentInvocationId;
1779
+ const agentName = subagentPart.getAgentLabel();
1780
+ const scrollToSubagent = targetSubAgentId => {
1781
+ const currentTemplateData = this.getTemplateDataForRequestId(context.element.id);
1782
+ const currentSubagentPart = this.getSubagentPart(currentTemplateData?.renderedParts, targetSubAgentId) ?? subagentPart;
1783
+ currentSubagentPart.domNode.scrollIntoView({
1784
+ behavior: "smooth",
1785
+ block: "center"
1786
+ });
1787
+ };
1788
+ const navigateToCarousel = targetSubAgentId => {
1789
+ widget.inputPart.activateCarouselForSubagent(targetSubAgentId);
1790
+ };
1791
+ const factory = tool => this.instantiationService.createInstance(
1792
+ ChatToolInvocationPart,
1793
+ tool,
1794
+ context,
1795
+ this.chatContentMarkdownRenderer,
1796
+ this._contentReferencesListPool,
1797
+ this._toolEditorPool,
1798
+ () => this._currentLayoutWidth.get(),
1799
+ this._announcedToolProgressKeys,
1800
+ codeBlockStartIndex
1801
+ );
1802
+ const addToolToCarousel = tool => {
1803
+ widget.inputPart.addToolToConfirmationCarousel(tool, factory, subAgentInvocationId, agentName, scrollToSubagent);
1804
+ const listener = this.createUpdateWorkingProgressOnConfirmationEnd(tool, templateData);
1805
+ if (listener) {
1806
+ templateData.elementDisposables.add(listener);
1807
+ }
1808
+ };
1809
+ const shouldUseCarouselForTool = (tool, state) => this.configService.getValue(ChatConfiguration.ToolConfirmationCarousel) && !this.viewModel?.editing && tool.presentation !== "hidden" && tool.source.type !== "mcp" && state.type === IChatToolInvocation.StateKind.WaitingForConfirmation && !!state.confirmationMessages?.title;
1810
+ subagentPart.enableCarouselMode(navigateToCarousel, addToolToCarousel, shouldUseCarouselForTool);
1811
+ const toolState = toolInvocation.state.get();
1812
+ if (toolState.type === IChatToolInvocation.StateKind.WaitingForConfirmation && toolState.confirmationMessages?.title) {
1813
+ addToolToCarousel(toolInvocation);
1814
+ }
1815
+ }
1521
1816
  finalizeCurrentThinkingPart(context, templateData) {
1522
1817
  const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
1523
1818
  if (!lastThinking) {
@@ -1541,19 +1836,19 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1541
1836
  const isResponseElement = isResponseVM(context.element);
1542
1837
  const shouldPin = this.shouldPinPart(content, isResponseElement ? context.element : undefined);
1543
1838
  if (context.element.isComplete && !shouldPin) {
1544
- for (const templateData of ( this.templateDataByRequestId.values())) {
1545
- if (templateData.renderedParts) {
1546
- const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
1547
- if (lastThinking?.getIsActive()) {
1548
- this.finalizeCurrentThinkingPart(context, templateData);
1549
- }
1839
+ const elementTemplateData = this.getTemplateDataForRequestId(context.element.id);
1840
+ if (elementTemplateData?.renderedParts) {
1841
+ const lastThinking = this.getLastThinkingPart(elementTemplateData.renderedParts);
1842
+ if (lastThinking?.getIsActive()) {
1843
+ this.finalizeCurrentThinkingPart(context, elementTemplateData);
1550
1844
  }
1551
1845
  }
1552
1846
  }
1553
1847
  const isSubagentContent = (content.kind === "toolInvocation" || content.kind === "toolInvocationSerialized") && isSubagentToolInvocation(content);
1554
1848
  if (context.element.isComplete && !isSubagentContent) {
1555
- for (const templateData of ( this.templateDataByRequestId.values())) {
1556
- this.finalizeAllSubagentParts(templateData);
1849
+ const elementTemplateData = this.getTemplateDataForRequestId(context.element.id);
1850
+ if (elementTemplateData) {
1851
+ this.finalizeAllSubagentParts(elementTemplateData);
1557
1852
  }
1558
1853
  }
1559
1854
  if (content.kind === "treeData") {
@@ -1620,6 +1915,8 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1620
1915
  return this.renderElicitation(context, content, templateData);
1621
1916
  } else if (content.kind === "questionCarousel") {
1622
1917
  return this.renderQuestionCarousel(context, content, templateData);
1918
+ } else if (content.kind === "planReview") {
1919
+ return this.renderPlanReview(context, content);
1623
1920
  } else if (content.kind === "changesSummary") {
1624
1921
  return this.renderChangesSummary(content, context, templateData);
1625
1922
  } else if (content.kind === "mcpServersStarting") {
@@ -1643,7 +1940,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1643
1940
  "ChatListItemRenderer#renderChatContentPart: error rendering content",
1644
1941
  toErrorMessage(err, true)
1645
1942
  );
1646
- const errorPart = this.instantiationService.createInstance(ChatErrorContentPart, ChatErrorLevel.Error, ( new MarkdownString(( localize(7005, "Failed to render content")) + `: ${toErrorMessage(err, false)}`)), content, this.chatContentMarkdownRenderer);
1943
+ const errorPart = this.instantiationService.createInstance(ChatErrorContentPart, ChatErrorLevel.Error, ( new MarkdownString(( localize(7129, "Failed to render content")) + `: ${toErrorMessage(err, false)}`)), content, this.chatContentMarkdownRenderer);
1647
1944
  return {
1648
1945
  dispose: () => errorPart.dispose(),
1649
1946
  domNode: errorPart.domNode,
@@ -1756,10 +2053,8 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1756
2053
  }));
1757
2054
  part.codeblocks?.forEach((info, i) => {
1758
2055
  codeBlocksByResponseId[codeBlockStartIndex + i] = info;
1759
- part.addDisposable(thenIfNotDisposed(info.uriPromise, uri => {
1760
- if (!uri) {
1761
- return;
1762
- }
2056
+ const uri = info.uri;
2057
+ if (uri) {
1763
2058
  this.codeBlocksByEditorUri.set(uri, info);
1764
2059
  part.addDisposable(toDisposable(() => {
1765
2060
  const codeblock = this.codeBlocksByEditorUri.get(uri);
@@ -1767,10 +2062,19 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1767
2062
  this.codeBlocksByEditorUri.delete(uri);
1768
2063
  }
1769
2064
  }));
1770
- }));
2065
+ }
1771
2066
  });
1772
2067
  }
1773
2068
  renderToolInvocation(toolInvocation, context, templateData) {
2069
+ if (IChatToolInvocation.isComplete(toolInvocation)) {
2070
+ const msg = toolInvocation.pastTenseMessage ?? toolInvocation.invocationMessage;
2071
+ const text = typeof msg === "string" ? msg : msg?.value;
2072
+ if (!text || text.trim().length === 0) {
2073
+ return this.renderNoContent(
2074
+ other => (other.kind === "toolInvocation" || other.kind === "toolInvocationSerialized") && other.toolCallId === toolInvocation.toolCallId
2075
+ );
2076
+ }
2077
+ }
1774
2078
  if (this.configService.getValue("chat.agent.thinking.collapsedTools") === CollapsedToolsDisplayMode.Off) {
1775
2079
  this.finalizeCurrentThinkingPart(context, templateData);
1776
2080
  }
@@ -1785,7 +2089,6 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1785
2089
  this._contentReferencesListPool,
1786
2090
  this._toolEditorPool,
1787
2091
  () => this._currentLayoutWidth.get(),
1788
- this._toolInvocationCodeBlockCollection,
1789
2092
  this._announcedToolProgressKeys,
1790
2093
  codeBlockStartIndex
1791
2094
  );
@@ -1799,7 +2102,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1799
2102
  const collapsedToolsMode = this.configService.getValue("chat.agent.thinking.collapsedTools");
1800
2103
  if (isResponseVM(context.element) && collapsedToolsMode !== CollapsedToolsDisplayMode.Off) {
1801
2104
  const lastThinking = this.getLastThinkingPart(templateData.renderedParts);
1802
- if (!lastThinking && toolInvocation.presentation !== "hidden" && this.shouldPinPart(toolInvocation, context.element) && collapsedToolsMode === CollapsedToolsDisplayMode.Always) {
2105
+ if (!lastThinking && !IChatToolInvocation.isEffectivelyHidden(toolInvocation) && this.shouldPinPart(toolInvocation, context.element) && collapsedToolsMode === CollapsedToolsDisplayMode.Always) {
1803
2106
  const thinkingPart = this.renderThinkingPart({
1804
2107
  kind: "thinking"
1805
2108
  }, context, templateData);
@@ -1818,7 +2121,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1818
2121
  return thinkingPart;
1819
2122
  }
1820
2123
  if (this.shouldPinPart(toolInvocation, context.element)) {
1821
- if (lastThinking && toolInvocation.presentation !== "hidden") {
2124
+ if (lastThinking && !IChatToolInvocation.isEffectivelyHidden(toolInvocation)) {
1822
2125
  toolInvocation.isAttachedToThinking = true;
1823
2126
  lastThinking.appendItem(createToolPart, toolInvocation.toolId, toolInvocation, templateData.value);
1824
2127
  this.setupConfirmationTransitionWatcher(
@@ -1838,12 +2141,46 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1838
2141
  }
1839
2142
  }
1840
2143
  const subagentId = getSubagentId(toolInvocation);
1841
- if (subagentId && isResponseVM(context.element) && toolInvocation.presentation !== "hidden") {
2144
+ if (subagentId && isResponseVM(context.element) && !IChatToolInvocation.isEffectivelyHidden(toolInvocation)) {
1842
2145
  return this.handleSubagentToolGrouping(toolInvocation, subagentId, context, templateData, codeBlockStartIndex);
1843
2146
  }
1844
2147
  const {
1845
2148
  part
1846
2149
  } = createToolPart();
2150
+ if (this.configService.getValue(ChatConfiguration.ToolConfirmationCarousel) && toolInvocation.kind === "toolInvocation" && isResponseVM(context.element) && toolInvocation.source.type !== "mcp" && !this.viewModel?.editing) {
2151
+ const widget = this.chatWidgetService.getWidgetBySessionResource(context.element.sessionResource);
2152
+ if (widget) {
2153
+ const factory = tool => this.instantiationService.createInstance(
2154
+ ChatToolInvocationPart,
2155
+ tool,
2156
+ context,
2157
+ this.chatContentMarkdownRenderer,
2158
+ this._contentReferencesListPool,
2159
+ this._toolEditorPool,
2160
+ () => this._currentLayoutWidth.get(),
2161
+ this._announcedToolProgressKeys,
2162
+ codeBlockStartIndex
2163
+ );
2164
+ const routePartToCarousel = () => {
2165
+ widget.inputPart.addToolToConfirmationCarousel(toolInvocation, factory);
2166
+ hide(part.domNode);
2167
+ return true;
2168
+ };
2169
+ part.addDisposable(autorun(reader => {
2170
+ const state = toolInvocation.state.read(reader);
2171
+ const isCarouselConfirmation = state.type === IChatToolInvocation.StateKind.WaitingForConfirmation && !!state.confirmationMessages?.title && toolInvocation.presentation !== "hidden" && toolInvocation.source.type !== "mcp" && !this.viewModel?.editing;
2172
+ if (isCarouselConfirmation) {
2173
+ if (!routePartToCarousel()) ;
2174
+ } else if (IChatToolInvocation.isEffectivelyHidden(toolInvocation, reader)) {
2175
+ this.updateWorkingProgressForPendingConfirmations(templateData);
2176
+ hide(part.domNode);
2177
+ } else {
2178
+ this.updateWorkingProgressForPendingConfirmations(templateData);
2179
+ show(part.domNode);
2180
+ }
2181
+ }));
2182
+ }
2183
+ }
1847
2184
  return part;
1848
2185
  }
1849
2186
  setupConfirmationTransitionWatcher(
@@ -1857,10 +2194,12 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1857
2194
  if (toolInvocation.kind !== "toolInvocation") {
1858
2195
  return;
1859
2196
  }
1860
- const removeConfirmationWidget = () => {
2197
+ const moveConfirmationWidgetOutOfThinking = () => {
1861
2198
  const createdPart = getCreatedPart();
1862
2199
  toolInvocation.isAttachedToThinking = false;
2200
+ let part;
1863
2201
  if (createdPart?.domNode) {
2202
+ part = createdPart;
1864
2203
  const wrapper = createdPart.domNode.parentElement;
1865
2204
  if (wrapper?.classList.contains("chat-thinking-tool-wrapper")) {
1866
2205
  wrapper.remove();
@@ -1870,8 +2209,10 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1870
2209
  } else {
1871
2210
  thinkingPart.removeLazyItem(toolInvocation.toolId);
1872
2211
  const {
1873
- domNode
2212
+ domNode,
2213
+ part: createdPart
1874
2214
  } = createToolPart();
2215
+ part = createdPart;
1875
2216
  templateData.value.appendChild(domNode);
1876
2217
  }
1877
2218
  this.finalizeCurrentThinkingPart(context, templateData);
@@ -1879,13 +2220,59 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1879
2220
  thinkingPart.domNode?.remove();
1880
2221
  thinkingPart.dispose();
1881
2222
  }
2223
+ return part;
2224
+ };
2225
+ const isWorkingState = type => type === IChatToolInvocation.StateKind.Streaming || type === IChatToolInvocation.StateKind.Executing;
2226
+ const tryRouteConfirmationToCarousel = () => {
2227
+ if (!this.configService.getValue(ChatConfiguration.ToolConfirmationCarousel) || !isResponseVM(context.element) || this.viewModel?.editing || toolInvocation.presentation === "hidden" || toolInvocation.source.type === "mcp") {
2228
+ return false;
2229
+ }
2230
+ const state = toolInvocation.state.get();
2231
+ if (state.type !== IChatToolInvocation.StateKind.WaitingForConfirmation || !state.confirmationMessages?.title) {
2232
+ return false;
2233
+ }
2234
+ const widget = this.chatWidgetService.getWidgetBySessionResource(context.element.sessionResource);
2235
+ if (!widget) {
2236
+ return false;
2237
+ }
2238
+ const part = moveConfirmationWidgetOutOfThinking();
2239
+ const factory = tool => this.instantiationService.createInstance(
2240
+ ChatToolInvocationPart,
2241
+ tool,
2242
+ context,
2243
+ this.chatContentMarkdownRenderer,
2244
+ this._contentReferencesListPool,
2245
+ this._toolEditorPool,
2246
+ () => this._currentLayoutWidth.get(),
2247
+ this._announcedToolProgressKeys,
2248
+ context.codeBlockStartIndex
2249
+ );
2250
+ part.addDisposable(autorun(reader => {
2251
+ const currentState = toolInvocation.state.read(reader);
2252
+ if (currentState.type === IChatToolInvocation.StateKind.WaitingForConfirmation && currentState.confirmationMessages?.title) {
2253
+ widget.inputPart.addToolToConfirmationCarousel(toolInvocation, factory);
2254
+ hide(part.domNode);
2255
+ } else if (IChatToolInvocation.isEffectivelyHidden(toolInvocation, reader)) {
2256
+ this.updateWorkingProgressForPendingConfirmations(templateData);
2257
+ hide(part.domNode);
2258
+ } else {
2259
+ this.updateWorkingProgressForPendingConfirmations(templateData);
2260
+ show(part.domNode);
2261
+ }
2262
+ }));
2263
+ return true;
1882
2264
  };
1883
2265
  const currentState = toolInvocation.state.get();
1884
- if (currentState.type === IChatToolInvocation.StateKind.WaitingForConfirmation || currentState.type === IChatToolInvocation.StateKind.WaitingForPostApproval) {
1885
- removeConfirmationWidget();
2266
+ if (currentState.type === IChatToolInvocation.StateKind.WaitingForConfirmation) {
2267
+ if (!tryRouteConfirmationToCarousel()) {
2268
+ moveConfirmationWidgetOutOfThinking();
2269
+ }
2270
+ return;
2271
+ }
2272
+ if (currentState.type === IChatToolInvocation.StateKind.WaitingForPostApproval) {
2273
+ moveConfirmationWidgetOutOfThinking();
1886
2274
  return;
1887
2275
  }
1888
- const isWorkingState = type => type === IChatToolInvocation.StateKind.Streaming || type === IChatToolInvocation.StateKind.Executing;
1889
2276
  if (!isWorkingState(currentState.type)) {
1890
2277
  return;
1891
2278
  }
@@ -1898,7 +2285,9 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1898
2285
  }
1899
2286
  didRemoveConfirmationWidget = true;
1900
2287
  disposable.dispose();
1901
- removeConfirmationWidget();
2288
+ if (state.type !== IChatToolInvocation.StateKind.WaitingForConfirmation || !tryRouteConfirmationToCarousel()) {
2289
+ moveConfirmationWidgetOutOfThinking();
2290
+ }
1902
2291
  }
1903
2292
  });
1904
2293
  thinkingPart.addDisposable(disposable);
@@ -1928,7 +2317,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1928
2317
  }
1929
2318
  const shouldPinToThinking = hookPart.hookType === HookType.PreToolUse || hookPart.hookType === HookType.PostToolUse;
1930
2319
  if (shouldPinToThinking) {
1931
- const hookTitle = hookPart.stopReason ? (hookPart.toolDisplayName ? ( localize(7006, "Blocked {0}", hookPart.toolDisplayName)) : ( localize(7007, "Blocked by hook"))) : (hookPart.toolDisplayName ? ( localize(7008, "Used {0}, but received a warning", hookPart.toolDisplayName)) : ( localize(7009, "Tool call received a warning")));
2320
+ const hookTitle = hookPart.stopReason ? (hookPart.toolDisplayName ? ( localize(7130, "Blocked {0}", hookPart.toolDisplayName)) : ( localize(7131, "Blocked by hook"))) : (hookPart.toolDisplayName ? ( localize(7132, "Used {0}, but received a warning", hookPart.toolDisplayName)) : ( localize(7133, "Tool call received a warning")));
1932
2321
  let thinkingPart = this.getLastThinkingPart(templateData.renderedParts);
1933
2322
  if (!thinkingPart) {
1934
2323
  const newThinking = this.renderThinkingPart({
@@ -1960,6 +2349,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1960
2349
  if (!isResponseVM(context.element)) {
1961
2350
  return;
1962
2351
  }
2352
+ this.finalizeCurrentThinkingPart(context, templateData);
1963
2353
  const taskPart = this.instantiationService.createInstance(
1964
2354
  ChatTaskContentPart,
1965
2355
  task,
@@ -1984,6 +2374,21 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
1984
2374
  renderQuestionCarousel(context, carousel, templateData) {
1985
2375
  this.finalizeCurrentThinkingPart(context, templateData);
1986
2376
  this._notifyOnQuestionCarousel(context, carousel);
2377
+ if (!carousel.terminalId && isResponseVM(context.element)) {
2378
+ const responseElement = context.element;
2379
+ const model = this.chatService.getSession(responseElement.sessionResource);
2380
+ const request = model?.getRequests().find(r => r.id === responseElement.requestId);
2381
+ if (request?.terminalExecutionId) {
2382
+ carousel.terminalId = request.terminalExecutionId;
2383
+ this.logService.trace(
2384
+ `ChatListItemRenderer#renderQuestionCarousel: backfilled terminalId=${carousel.terminalId} for request=${responseElement.requestId}`
2385
+ );
2386
+ } else {
2387
+ this.logService.trace(
2388
+ `ChatListItemRenderer#renderQuestionCarousel: no terminalExecutionId to backfill for request=${responseElement.requestId}`
2389
+ );
2390
+ }
2391
+ }
1987
2392
  const widget = isResponseVM(context.element) ? this.chatWidgetService.getWidgetBySessionResource(context.element.sessionResource) : undefined;
1988
2393
  const shouldAutoFocus = widget ? widget.getInput() === "" : true;
1989
2394
  const responseId = isResponseVM(context.element) ? context.element.requestId : undefined;
@@ -2085,10 +2490,10 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2085
2490
  return;
2086
2491
  }
2087
2492
  const questionCount = carousel.questions.length;
2088
- const question = carousel.questions.length > 0 && carousel.questions[0].message ? carousel.questions[0].message : ( localize(7010, "Chat input required."));
2493
+ const question = carousel.questions.length > 0 && carousel.questions[0].message ? carousel.questions[0].message : ( localize(7134, "Chat input required."));
2089
2494
  const stringQuestion = typeof question === "string" ? question : question.value;
2090
- const alertMessage = questionCount === 1 ? ( localize(7011, "Chat input required (1 question): {0}", stringQuestion)) : ( localize(
2091
- 7012,
2495
+ const alertMessage = questionCount === 1 ? ( localize(7135, "Chat input required (1 question): {0}", stringQuestion)) : ( localize(
2496
+ 7136,
2092
2497
  "Chat input required ({0} questions): {1}",
2093
2498
  questionCount,
2094
2499
  stringQuestion
@@ -2097,12 +2502,60 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2097
2502
  if (stableKey) {
2098
2503
  this._notifiedQuestionCarousels.add(stableKey);
2099
2504
  }
2100
- const signalMessage = questionCount === 1 ? ( localize(7013, "Chat needs your input (1 question).")) : ( localize(7014, "Chat needs your input ({0} questions).", questionCount));
2505
+ const signalMessage = questionCount === 1 ? ( localize(7137, "Chat needs your input (1 question).")) : ( localize(7138, "Chat needs your input ({0} questions).", questionCount));
2101
2506
  this.accessibilitySignalService.playSignal(AccessibilitySignal.chatUserActionRequired, {
2102
2507
  allowManyInParallel: true,
2103
2508
  customAlertMessage: signalMessage
2104
2509
  });
2105
2510
  }
2511
+ renderPlanReview(context, review) {
2512
+ const widget = isResponseVM(context.element) ? this.chatWidgetService.getWidgetBySessionResource(context.element.sessionResource) : undefined;
2513
+ const responseId = isResponseVM(context.element) ? context.element.requestId : undefined;
2514
+ const reviewKey = review.resolveId ?? `${responseId ?? ""}_${context.contentIndex}`;
2515
+ const handleSubmit = result => {
2516
+ review.data = result;
2517
+ review.isUsed = true;
2518
+ if (review instanceof ChatPlanReviewData) {
2519
+ review.completion.complete(result);
2520
+ }
2521
+ widget?.input.clearPlanReview(undefined, reviewKey);
2522
+ };
2523
+ const responseIsComplete = isResponseVM(context.element) && context.element.isComplete;
2524
+ if (review.isUsed || responseIsComplete) {
2525
+ if (responseIsComplete && !review.isUsed) {
2526
+ review.isUsed = true;
2527
+ if (review instanceof ChatPlanReviewData) {
2528
+ review.completion.complete(undefined);
2529
+ }
2530
+ if (responseId) {
2531
+ widget?.input.clearPlanReview(responseId);
2532
+ }
2533
+ }
2534
+ return this.renderNoContent(other => other.kind === "planReview");
2535
+ }
2536
+ const isEditing = !!this.viewModel?.editing;
2537
+ const dockedPart = isEditing ? undefined : widget?.input.renderPlanReview(review, context, {
2538
+ onSubmit: handleSubmit
2539
+ });
2540
+ if (!dockedPart) {
2541
+ const fallbackPart = this.instantiationService.createInstance(ChatPlanReviewPart, review, context, {
2542
+ onSubmit: handleSubmit
2543
+ });
2544
+ return fallbackPart;
2545
+ }
2546
+ return this.renderNoContent((other, _followingContent, element) => {
2547
+ if (review.isUsed || (isResponseVM(element) && element.isComplete)) {
2548
+ return false;
2549
+ }
2550
+ if (other.kind === "planReview") {
2551
+ if (review.resolveId && other.resolveId) {
2552
+ return review.resolveId === other.resolveId;
2553
+ }
2554
+ return other === review;
2555
+ }
2556
+ return false;
2557
+ });
2558
+ }
2106
2559
  removeCarouselFromTracking(context, part) {
2107
2560
  if (isResponseVM(context.element)) {
2108
2561
  const carousels = this.pendingQuestionCarousels.get(context.element.sessionResource);
@@ -2115,10 +2568,11 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2115
2568
  const part = this.instantiationService.createInstance(ChatCheckpointFileChangesSummaryContentPart, content, context);
2116
2569
  return part;
2117
2570
  }
2118
- renderAttachments(variables, contentReferences, templateData) {
2571
+ renderAttachments(variables, contentReferences, modelId, templateData) {
2119
2572
  return this.instantiationService.createInstance(ChatAttachmentsContentPart, {
2120
2573
  variables,
2121
2574
  contentReferences,
2575
+ modelId,
2122
2576
  domNode: undefined
2123
2577
  });
2124
2578
  }
@@ -2152,7 +2606,6 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2152
2606
  this.chatContentMarkdownRenderer,
2153
2607
  undefined,
2154
2608
  this._currentLayoutWidth.get(),
2155
- this.codeBlockModelCollection,
2156
2609
  {}
2157
2610
  );
2158
2611
  markdownPart.addDisposable(
@@ -2188,7 +2641,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2188
2641
  })
2189
2642
  );
2190
2643
  markdownPart.addDisposable(
2191
- this.hoverService.setupManagedHover(getDefaultHoverDelegate("element"), markdownPart.domNode, ( localize(7015, "Click to Edit")), {
2644
+ this.hoverService.setupManagedHover(getDefaultHoverDelegate("element"), markdownPart.domNode, ( localize(7139, "Click to Edit")), {
2192
2645
  trapFocus: true
2193
2646
  })
2194
2647
  );
@@ -2215,7 +2668,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2215
2668
  subagentPart.appendMarkdownItem(() => ({
2216
2669
  domNode: markdownPart.domNode,
2217
2670
  disposable: markdownPart
2218
- }), markdownPart.codeblocksPartId, markdown, templateData.value);
2671
+ }), markdownPart.codeblocksPartId, markdown, templateData.value, markdownPart);
2219
2672
  return subagentPart;
2220
2673
  }
2221
2674
  }
@@ -2228,7 +2681,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2228
2681
  thinkingPart.appendItem(() => ({
2229
2682
  domNode: markdownPart.domNode,
2230
2683
  disposable: markdownPart
2231
- }), markdownPart.codeblocksPartId, markdown, templateData.value, markdownPart.onDidChangeDiff);
2684
+ }), markdownPart.codeblocksPartId, markdown, templateData.value, markdownPart.onDidChangeDiff, markdownPart);
2232
2685
  }
2233
2686
  return thinkingPart;
2234
2687
  }
@@ -2306,6 +2759,17 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2306
2759
  if (templateData.currentElement && !this.viewModel?.editing) {
2307
2760
  this.templateDataByRequestId.delete(templateData.currentElement.id);
2308
2761
  }
2762
+ const codeBlocks = this.codeBlocksByResponseId.get(node.element.id);
2763
+ if (codeBlocks) {
2764
+ for (const info of codeBlocks) {
2765
+ if (info?.uri) {
2766
+ this.codeBlocksByEditorUri.delete(info.uri);
2767
+ }
2768
+ }
2769
+ this.codeBlocksByResponseId.delete(node.element.id);
2770
+ }
2771
+ this.fileTreesByResponseId.delete(node.element.id);
2772
+ this.focusedFileTreesByResponseId.delete(node.element.id);
2309
2773
  if (isRequestVM(node.element) && node.element.id === this.viewModel?.editing?.id && details?.onScroll) {
2310
2774
  this._onDidDispose.fire(templateData);
2311
2775
  }
@@ -2333,7 +2797,7 @@ let ChatListItemRenderer = class ChatListItemRenderer extends Disposable {
2333
2797
  requestHover.style.opacity = "0";
2334
2798
  }
2335
2799
  };
2336
- ChatListItemRenderer = ChatListItemRenderer_1 = ( __decorate([( __param(6, IInstantiationService)), ( __param(7, IConfigurationService)), ( __param(8, ILogService)), ( __param(9, IContextKeyService)), ( __param(10, IThemeService)), ( __param(11, ICommandService)), ( __param(12, IHoverService)), ( __param(13, IChatWidgetService)), ( __param(14, IChatEntitlementService)), ( __param(15, IChatService)), ( __param(16, IAccessibilitySignalService)), ( __param(17, IAccessibilityService)), ( __param(18, IWorkbenchEnvironmentService))], ChatListItemRenderer));
2800
+ ChatListItemRenderer = ChatListItemRenderer_1 = ( __decorate([( __param(5, IInstantiationService)), ( __param(6, IConfigurationService)), ( __param(7, ILogService)), ( __param(8, IContextKeyService)), ( __param(9, IThemeService)), ( __param(10, ICommandService)), ( __param(11, IHoverService)), ( __param(12, IChatWidgetService)), ( __param(13, IChatEntitlementService)), ( __param(14, IChatService)), ( __param(15, IAccessibilitySignalService)), ( __param(16, IAccessibilityService)), ( __param(17, IWorkbenchEnvironmentService)), ( __param(18, ITelemetryService))], ChatListItemRenderer));
2337
2801
  class ChatListDelegate extends CachedListVirtualDelegate {
2338
2802
  constructor(defaultElementHeight) {
2339
2803
  super();