monaco-editor-core 0.56.0-dev-20251124 → 0.56.0-dev-20251217

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 (337) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.cs.js +2 -2
  3. package/esm/nls.messages.de.js +2 -2
  4. package/esm/nls.messages.es.js +2 -2
  5. package/esm/nls.messages.fr.js +2 -2
  6. package/esm/nls.messages.it.js +2 -2
  7. package/esm/nls.messages.ja.js +2 -2
  8. package/esm/nls.messages.js +1 -1
  9. package/esm/nls.messages.json +1 -1
  10. package/esm/nls.messages.ko.js +2 -2
  11. package/esm/nls.messages.pl.js +2 -2
  12. package/esm/nls.messages.pt-br.js +2 -2
  13. package/esm/nls.messages.ru.js +2 -2
  14. package/esm/nls.messages.tr.js +2 -2
  15. package/esm/nls.messages.zh-cn.js +2 -2
  16. package/esm/nls.messages.zh-tw.js +2 -2
  17. package/esm/nls.metadata.json +34 -2
  18. package/esm/vs/base/browser/dom.js +1 -4
  19. package/esm/vs/base/browser/dom.js.map +1 -1
  20. package/esm/vs/base/browser/markdownRenderer.js +25 -11
  21. package/esm/vs/base/browser/markdownRenderer.js.map +1 -1
  22. package/esm/vs/base/browser/ui/button/button.js +15 -8
  23. package/esm/vs/base/browser/ui/button/button.js.map +1 -1
  24. package/esm/vs/base/browser/ui/codicons/codicon/codicon-modifiers.css +3 -8
  25. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  26. package/esm/vs/base/browser/ui/list/list.css +1 -0
  27. package/esm/vs/base/browser/ui/toolbar/toolbar.js +3 -0
  28. package/esm/vs/base/browser/ui/toolbar/toolbar.js.map +1 -1
  29. package/esm/vs/base/common/async.js +11 -0
  30. package/esm/vs/base/common/async.js.map +1 -1
  31. package/esm/vs/base/common/codiconsLibrary.js +11 -2
  32. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  33. package/esm/vs/base/common/defaultAccount.js +6 -0
  34. package/esm/vs/base/common/defaultAccount.js.map +1 -0
  35. package/esm/vs/base/common/equals.js +73 -24
  36. package/esm/vs/base/common/equals.js.map +1 -1
  37. package/esm/vs/base/common/event.js +14 -4
  38. package/esm/vs/base/common/event.js.map +1 -1
  39. package/esm/vs/base/common/iterator.js.map +1 -1
  40. package/esm/vs/base/common/keybindings.js +0 -8
  41. package/esm/vs/base/common/keybindings.js.map +1 -1
  42. package/esm/vs/base/common/lifecycle.js +2 -2
  43. package/esm/vs/base/common/lifecycle.js.map +1 -1
  44. package/esm/vs/base/common/marshallingIds.js.map +1 -1
  45. package/esm/vs/base/common/observableInternal/index.js +1 -1
  46. package/esm/vs/base/common/observableInternal/index.js.map +1 -1
  47. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js +1 -1
  48. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js.map +1 -1
  49. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js +16 -0
  50. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js.map +1 -1
  51. package/esm/vs/base/common/observableInternal/utils/utils.js +11 -0
  52. package/esm/vs/base/common/observableInternal/utils/utils.js.map +1 -1
  53. package/esm/vs/base/common/product.js.map +1 -1
  54. package/esm/vs/base/common/strings.js +3 -1
  55. package/esm/vs/base/common/strings.js.map +1 -1
  56. package/esm/vs/editor/browser/controller/dragScrolling.js +2 -1
  57. package/esm/vs/editor/browser/controller/dragScrolling.js.map +1 -1
  58. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js +73 -2
  59. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js.map +1 -1
  60. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js +7 -51
  61. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js.map +1 -1
  62. package/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js.map +1 -1
  63. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js +7 -20
  64. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js.map +1 -1
  65. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js +14 -44
  66. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js.map +1 -1
  67. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js +19 -0
  68. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js.map +1 -0
  69. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js +14 -1
  70. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js.map +1 -1
  71. package/esm/vs/editor/browser/controller/mouseHandler.js +5 -2
  72. package/esm/vs/editor/browser/controller/mouseHandler.js.map +1 -1
  73. package/esm/vs/editor/browser/editorBrowser.js.map +1 -1
  74. package/esm/vs/editor/browser/observableCodeEditor.js +32 -15
  75. package/esm/vs/editor/browser/observableCodeEditor.js.map +1 -1
  76. package/esm/vs/editor/browser/view.js +11 -2
  77. package/esm/vs/editor/browser/view.js.map +1 -1
  78. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js +5 -2
  79. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js.map +1 -1
  80. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +10 -0
  81. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js.map +1 -1
  82. package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js.map +1 -1
  83. package/esm/vs/editor/browser/widget/multiDiffEditor/style.css +48 -0
  84. package/esm/vs/editor/common/config/fontInfo.js +1 -1
  85. package/esm/vs/editor/common/config/fontInfo.js.map +1 -1
  86. package/esm/vs/editor/common/core/edits/edit.js +19 -0
  87. package/esm/vs/editor/common/core/edits/edit.js.map +1 -1
  88. package/esm/vs/editor/common/core/edits/stringEdit.js +13 -0
  89. package/esm/vs/editor/common/core/edits/stringEdit.js.map +1 -1
  90. package/esm/vs/editor/common/core/edits/textEdit.js.map +1 -1
  91. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js +24 -10
  92. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js.map +1 -1
  93. package/esm/vs/editor/common/cursor/cursorMoveCommands.js +4 -4
  94. package/esm/vs/editor/common/cursor/cursorMoveCommands.js.map +1 -1
  95. package/esm/vs/editor/common/cursor/cursorWordOperations.js +6 -3
  96. package/esm/vs/editor/common/cursor/cursorWordOperations.js.map +1 -1
  97. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js +2 -2
  98. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js.map +1 -1
  99. package/esm/vs/editor/common/languages/nullTokenize.js +1 -1
  100. package/esm/vs/editor/common/languages/nullTokenize.js.map +1 -1
  101. package/esm/vs/editor/common/languages/supports/tokenization.js +3 -0
  102. package/esm/vs/editor/common/languages/supports/tokenization.js.map +1 -1
  103. package/esm/vs/editor/common/languages.js +2 -1
  104. package/esm/vs/editor/common/languages.js.map +1 -1
  105. package/esm/vs/editor/common/model/decorationProvider.js +21 -1
  106. package/esm/vs/editor/common/model/decorationProvider.js.map +1 -1
  107. package/esm/vs/editor/common/model/textModel.js +49 -30
  108. package/esm/vs/editor/common/model/textModel.js.map +1 -1
  109. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js +6 -3
  110. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js.map +1 -1
  111. package/esm/vs/editor/common/model/tokens/annotations.js +177 -0
  112. package/esm/vs/editor/common/model/tokens/annotations.js.map +1 -0
  113. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js +131 -0
  114. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js.map +1 -0
  115. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js +9 -0
  116. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js.map +1 -1
  117. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js +9 -0
  118. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js.map +1 -1
  119. package/esm/vs/editor/common/textModelEditSource.js +2 -0
  120. package/esm/vs/editor/common/textModelEditSource.js.map +1 -1
  121. package/esm/vs/editor/common/textModelEvents.js.map +1 -1
  122. package/esm/vs/editor/common/viewLayout/lineDecorations.js.map +1 -1
  123. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +1 -1
  124. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js.map +1 -1
  125. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +54 -36
  126. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js.map +1 -1
  127. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +14 -1
  128. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js.map +1 -1
  129. package/esm/vs/editor/contrib/floatingMenu/browser/floatingMenu.css +1 -1
  130. package/esm/vs/editor/contrib/hover/browser/hover.css +1 -1
  131. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +1 -1
  132. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js.map +1 -1
  133. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  134. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js +1 -0
  135. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js.map +1 -1
  136. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js +2 -0
  137. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js.map +1 -1
  138. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +33 -4
  139. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  140. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +13 -12
  141. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js.map +1 -1
  142. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +7 -1
  143. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
  144. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +2 -2
  145. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  146. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js +2 -1
  147. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js.map +1 -1
  148. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js +8 -0
  149. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js.map +1 -0
  150. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js +198 -0
  151. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js.map +1 -0
  152. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js +40 -0
  153. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js.map +1 -0
  154. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +128 -65
  155. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  156. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +69 -13
  157. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
  158. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js +159 -94
  159. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js.map +1 -1
  160. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js +124 -50
  161. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js.map +1 -1
  162. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js +393 -0
  163. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js.map +1 -0
  164. package/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js.map +1 -1
  165. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js +20 -0
  166. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js.map +1 -1
  167. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js +59 -42
  168. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js.map +1 -1
  169. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +29 -8
  170. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js.map +1 -1
  171. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +78 -46
  172. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
  173. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +9 -4
  174. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  175. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +11 -4
  176. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
  177. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +81 -41
  178. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  179. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js +48 -0
  180. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js.map +1 -1
  181. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +18 -15
  182. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
  183. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js +3 -4
  184. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js.map +1 -1
  185. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js +6 -7
  186. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js.map +1 -1
  187. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js +4 -5
  188. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js.map +1 -1
  189. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js +4 -3
  190. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js.map +1 -1
  191. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js +8 -8
  192. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js.map +1 -1
  193. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js +9 -7
  194. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js.map +1 -1
  195. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js +203 -41
  196. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js.map +1 -1
  197. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js +189 -0
  198. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js.map +1 -0
  199. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js +85 -102
  200. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js.map +1 -1
  201. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js +75 -32
  202. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js.map +1 -1
  203. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js +121 -0
  204. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js.map +1 -0
  205. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js +2 -1
  206. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js.map +1 -1
  207. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +22 -20
  208. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
  209. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js +15 -5
  210. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js.map +1 -1
  211. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/view.css +39 -6
  212. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js +10 -5
  213. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js.map +1 -1
  214. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  215. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  216. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +32 -32
  217. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js.map +1 -1
  218. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  219. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  220. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  221. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  222. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  223. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  224. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  225. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  226. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +11 -11
  227. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  228. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  229. package/esm/vs/editor/contrib/rename/browser/rename.js +19 -11
  230. package/esm/vs/editor/contrib/rename/browser/rename.js.map +1 -1
  231. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  232. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js +3 -2
  233. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js.map +1 -1
  234. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  235. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  236. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js +33 -0
  237. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js.map +1 -1
  238. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  239. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  240. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js +12 -4
  241. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js.map +1 -1
  242. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js +1 -0
  243. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js.map +1 -1
  244. package/esm/vs/editor/contrib/suggest/browser/suggest.js +9 -8
  245. package/esm/vs/editor/contrib/suggest/browser/suggest.js.map +1 -1
  246. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +39 -28
  247. package/esm/vs/editor/contrib/suggest/browser/suggestController.js.map +1 -1
  248. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js +1 -0
  249. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js.map +1 -1
  250. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +22 -18
  251. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js.map +1 -1
  252. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +28 -6
  253. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js.map +1 -1
  254. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  255. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  256. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  257. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  258. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  259. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  260. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  261. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  262. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  263. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  264. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +19 -2
  265. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js.map +1 -1
  266. package/esm/vs/editor/editor.api.d.ts +37 -2
  267. package/esm/vs/editor/standalone/browser/standaloneLanguages.js +2 -2
  268. package/esm/vs/editor/standalone/browser/standaloneLanguages.js.map +1 -1
  269. package/esm/vs/editor/standalone/browser/standaloneServices.js +11 -1
  270. package/esm/vs/editor/standalone/browser/standaloneServices.js.map +1 -1
  271. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js +1 -1
  272. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js.map +1 -1
  273. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  274. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  275. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  276. package/esm/vs/platform/actionWidget/browser/actionWidget.css +11 -8
  277. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  278. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  279. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  280. package/esm/vs/platform/actions/common/actions.js +11 -4
  281. package/esm/vs/platform/actions/common/actions.js.map +1 -1
  282. package/esm/vs/platform/actions/common/menuService.js +2 -2
  283. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  284. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  285. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  286. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  287. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  288. package/esm/vs/platform/{product/common/productService.js → defaultAccount/common/defaultAccount.js} +2 -2
  289. package/esm/vs/platform/defaultAccount/common/defaultAccount.js.map +1 -0
  290. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  291. package/esm/vs/platform/hover/browser/hoverWidget.js +1 -1
  292. package/esm/vs/platform/hover/browser/updatableHoverWidget.js +1 -1
  293. package/esm/vs/platform/instantiation/common/instantiation.js.map +1 -1
  294. package/esm/vs/platform/instantiation/common/instantiationService.js +1 -8
  295. package/esm/vs/platform/instantiation/common/instantiationService.js.map +1 -1
  296. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  297. package/esm/vs/platform/list/browser/listService.js +27 -27
  298. package/esm/vs/platform/log/common/log.js +1 -1
  299. package/esm/vs/platform/log/common/log.js.map +1 -1
  300. package/esm/vs/platform/markers/common/markerService.js +6 -6
  301. package/esm/vs/platform/markers/common/markerService.js.map +1 -1
  302. package/esm/vs/platform/markers/common/markers.js +6 -6
  303. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +8 -8
  304. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  305. package/esm/vs/platform/quickinput/browser/media/quickInput.css +7 -3
  306. package/esm/vs/platform/quickinput/browser/quickInput.js +19 -11
  307. package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
  308. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  309. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  310. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  311. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  312. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  313. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  314. package/esm/vs/platform/theme/common/colors/baseColors.js +18 -17
  315. package/esm/vs/platform/theme/common/colors/baseColors.js.map +1 -1
  316. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  317. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  318. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  319. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  320. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  321. package/esm/vs/platform/theme/common/colors/minimapColors.js +13 -13
  322. package/esm/vs/platform/theme/common/colors/minimapColors.js.map +1 -1
  323. package/esm/vs/platform/theme/common/colors/miscColors.js +16 -16
  324. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  325. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  326. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  327. package/esm/vs/platform/undoRedo/common/undoRedoService.js +21 -21
  328. package/esm/vs/platform/undoRedo/common/undoRedoService.js.map +1 -1
  329. package/esm/vs/platform/window/common/window.js +1 -1
  330. package/esm/vs/platform/window/common/window.js.map +1 -1
  331. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  332. package/monaco.d.ts +37 -2
  333. package/package.json +2 -2
  334. package/version.txt +1 -1
  335. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js +0 -16
  336. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js.map +0 -1
  337. package/esm/vs/platform/product/common/productService.js.map +0 -1
@@ -16,8 +16,9 @@ import { booleanComparator, compareBy, compareUndefinedSmallest, numberComparato
16
16
  import { findLastMax } from '../../../../../base/common/arraysFind.js';
17
17
  import { RunOnceScheduler } from '../../../../../base/common/async.js';
18
18
  import { CancellationTokenSource } from '../../../../../base/common/cancellation.js';
19
- import { equalsIfDefined, itemEquals } from '../../../../../base/common/equals.js';
19
+ import { equalsIfDefined, thisEqualsC } from '../../../../../base/common/equals.js';
20
20
  import { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
21
+ import { cloneAndChange } from '../../../../../base/common/objects.js';
21
22
  import { derived, observableValue, recordChangesLazy, transaction } from '../../../../../base/common/observable.js';
22
23
  // eslint-disable-next-line local/code-no-deep-import-of-internal
23
24
  import { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';
@@ -30,7 +31,9 @@ import { ILogService } from '../../../../../platform/log/common/log.js';
30
31
  import { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';
31
32
  import product from '../../../../../platform/product/common/product.js';
32
33
  import { StringEdit } from '../../../../common/core/edits/stringEdit.js';
33
- import { InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind } from '../../../../common/languages.js';
34
+ import { Position } from '../../../../common/core/position.js';
35
+ import { Range } from '../../../../common/core/range.js';
36
+ import { Command, InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind } from '../../../../common/languages.js';
34
37
  import { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';
35
38
  import { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';
36
39
  import { formatRecordableLogEntry, StructuredLogger } from '../structuredLogger.js';
@@ -38,6 +41,7 @@ import { sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';
38
41
  import { wait } from '../utils.js';
39
42
  import { InlineSuggestionItem } from './inlineSuggestionItem.js';
40
43
  import { provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';
44
+ import { RenameSymbolProcessor } from './renameSymbolProcessor.js';
41
45
  let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
42
46
  static { InlineCompletionsSource_1 = this; }
43
47
  static { this._requestId = 0; }
@@ -92,6 +96,7 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
92
96
  this._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);
93
97
  this._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);
94
98
  this._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast(), 'editor.inlineSuggest.logFetch.commandId'));
99
+ this._renameProcessor = this._store.add(this._instantiationService.createInstance(RenameSymbolProcessor));
95
100
  this.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);
96
101
  const enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;
97
102
  if (enablementSetting) {
@@ -177,7 +182,7 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
177
182
  runWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));
178
183
  let shouldStopEarly = false;
179
184
  let producedSuggestion = false;
180
- const suggestions = [];
185
+ const providerSuggestions = [];
181
186
  for await (const list of providerResult.lists) {
182
187
  if (!list) {
183
188
  continue;
@@ -194,8 +199,10 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
194
199
  item.setNotShownReason('notInlineCompletionRequested');
195
200
  continue;
196
201
  }
202
+ item.addPerformanceMarker('providerReturned');
197
203
  const i = InlineSuggestionItem.create(item, this._textModel);
198
- suggestions.push(i);
204
+ item.addPerformanceMarker('itemCreated');
205
+ providerSuggestions.push(i);
199
206
  // Stop after first visible inline completion
200
207
  if (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {
201
208
  if (i.isVisible(this._textModel, this._cursorPosition.get())) {
@@ -207,6 +214,11 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
207
214
  break;
208
215
  }
209
216
  }
217
+ providerSuggestions.forEach(s => s.addPerformanceMarker('providersResolved'));
218
+ const suggestions = await Promise.all(providerSuggestions.map(async (s) => {
219
+ return this._renameProcessor.proposeRenameRefactoring(this._textModel, s);
220
+ }));
221
+ suggestions.forEach(s => s.addPerformanceMarker('renameProcessed'));
210
222
  providerResult.cancelAndDispose({ kind: 'lostRace' });
211
223
  if (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {
212
224
  const didAllProvidersReturn = providerResult.didAllProvidersReturn;
@@ -214,14 +226,45 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
214
226
  if (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {
215
227
  error = 'canceled';
216
228
  }
217
- const result = suggestions.map(c => ({
218
- range: c.editRange.toString(),
219
- text: c.insertText,
220
- hint: c.hint,
221
- isInlineEdit: c.isInlineEdit,
222
- showInlineEditMenu: c.showInlineEditMenu,
223
- providerId: c.source.provider.providerId?.toString(),
224
- }));
229
+ const result = suggestions.map(c => {
230
+ const comp = c.getSourceCompletion();
231
+ if (comp.doNotLog) {
232
+ return undefined;
233
+ }
234
+ const obj = {
235
+ insertText: comp.insertText,
236
+ range: comp.range,
237
+ additionalTextEdits: comp.additionalTextEdits,
238
+ uri: comp.uri,
239
+ command: comp.command,
240
+ gutterMenuLinkAction: comp.gutterMenuLinkAction,
241
+ shownCommand: comp.shownCommand,
242
+ completeBracketPairs: comp.completeBracketPairs,
243
+ isInlineEdit: comp.isInlineEdit,
244
+ showInlineEditMenu: comp.showInlineEditMenu,
245
+ showRange: comp.showRange,
246
+ warning: comp.warning,
247
+ hint: comp.hint,
248
+ supportsRename: comp.supportsRename,
249
+ correlationId: comp.correlationId,
250
+ jumpToPosition: comp.jumpToPosition,
251
+ };
252
+ return {
253
+ ...cloneAndChange(obj, v => {
254
+ if (Range.isIRange(v)) {
255
+ return Range.lift(v).toString();
256
+ }
257
+ if (Position.isIPosition(v)) {
258
+ return Position.lift(v).toString();
259
+ }
260
+ if (Command.is(v)) {
261
+ return { $commandId: v.id };
262
+ }
263
+ return v;
264
+ }),
265
+ $providerId: c.source.provider.providerId?.toString(),
266
+ };
267
+ }).filter(result => result !== undefined);
225
268
  this._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });
226
269
  }
227
270
  requestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);
@@ -244,6 +287,7 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
244
287
  if (remainingTimeToWait > 0) {
245
288
  await wait(remainingTimeToWait, source.token);
246
289
  }
290
+ suggestions.forEach(s => s.addPerformanceMarker('minShowDelayPassed'));
247
291
  if (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId
248
292
  || userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {
249
293
  const notShownReason = source.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :
@@ -339,6 +383,8 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
339
383
  extensionVersion: '0.0.0',
340
384
  groupId: 'empty',
341
385
  shown: false,
386
+ skuPlan: requestResponseInfo.requestInfo.sku?.plan,
387
+ skuType: requestResponseInfo.requestInfo.sku?.type,
342
388
  editorType: requestResponseInfo.requestInfo.editorType,
343
389
  requestReason: requestResponseInfo.requestInfo.reason,
344
390
  typingInterval: requestResponseInfo.requestInfo.typingInterval,
@@ -353,6 +399,7 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
353
399
  preceeded: undefined,
354
400
  superseded: undefined,
355
401
  reason: undefined,
402
+ acceptedAlternativeAction: undefined,
356
403
  correlationId: undefined,
357
404
  shownDuration: undefined,
358
405
  shownDurationUncollapsed: undefined,
@@ -369,7 +416,16 @@ let InlineCompletionsSource = class InlineCompletionsSource extends Disposable {
369
416
  characterCountModified: undefined,
370
417
  disjointReplacements: undefined,
371
418
  sameShapeReplacements: undefined,
419
+ longDistanceHintVisible: undefined,
420
+ longDistanceHintDistance: undefined,
372
421
  notShownReason: undefined,
422
+ renameCreated: false,
423
+ renameDuration: undefined,
424
+ renameTimedOut: false,
425
+ renameDroppedOtherEdits: undefined,
426
+ renameDroppedRenameEdits: undefined,
427
+ performanceMarkers: undefined,
428
+ editKind: undefined,
373
429
  };
374
430
  const dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);
375
431
  sendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);
@@ -400,7 +456,7 @@ class UpdateRequest {
400
456
  }
401
457
  satisfies(other) {
402
458
  return this.position.equals(other.position)
403
- && equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, itemEquals())
459
+ && equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, thisEqualsC())
404
460
  && (other.context.triggerKind === InlineCompletionTriggerKind.Automatic
405
461
  || this.context.triggerKind === InlineCompletionTriggerKind.Explicit)
406
462
  && this.versionId === other.versionId
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.ts","vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.ts"],"names":[],"mappings":"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","file":"inlineCompletionsSource.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { booleanComparator, compareBy, compareUndefinedSmallest, numberComparator } from '../../../../../base/common/arrays.js';\nimport { findLastMax } from '../../../../../base/common/arraysFind.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../base/common/equals.js';\nimport { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, IObservableWithChange, ITransaction, observableValue, recordChangesLazy, transaction } from '../../../../../base/common/observable.js';\n// eslint-disable-next-line local/code-no-deep-import-of-internal\nimport { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';\nimport { isDefined, isObject } from '../../../../../base/common/types.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { DataChannelForwardingTelemetryService, forwardToChannelIf, isCopilotLikeExtension } from '../../../../../platform/dataChannel/browser/forwardingTelemetryService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';\nimport product from '../../../../../platform/product/common/product.js';\nimport { StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind, InlineCompletionsProvider } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';\nimport { IFeatureDebounceInformation } from '../../../../common/services/languageFeatureDebounce.js';\nimport { IModelContentChangedEvent } from '../../../../common/textModelEvents.js';\nimport { formatRecordableLogEntry, IRecordableEditorLogEntry, IRecordableLogEntry, StructuredLogger } from '../structuredLogger.js';\nimport { InlineCompletionEndOfLifeEvent, sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';\nimport { wait } from '../utils.js';\nimport { InlineSuggestionIdentity, InlineSuggestionItem } from './inlineSuggestionItem.js';\nimport { InlineCompletionContextWithoutUuid, InlineSuggestRequestInfo, provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';\n\nexport class InlineCompletionsSource extends Disposable {\n\tprivate static _requestId = 0;\n\n\tprivate readonly _updateOperation = this._register(new MutableDisposable<UpdateOperation>());\n\n\tprivate readonly _loggingEnabled;\n\tprivate readonly _sendRequestData;\n\n\tprivate readonly _structuredFetchLogger;\n\n\tprivate readonly _state = observableReducerSettable(this, {\n\t\tinitial: () => ({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t}),\n\t\tdisposeFinal: (values) => {\n\t\t\tvalues.inlineCompletions.dispose();\n\t\t\tvalues.suggestWidgetInlineCompletions.dispose();\n\t\t},\n\t\tchangeTracker: recordChangesLazy(() => ({ versionId: this._versionId })),\n\t\tupdate: (reader, previousValue, changes) => {\n\t\t\tconst edit = StringEdit.compose(changes.changes.map(c => c.change ? offsetEditFromContentChanges(c.change.changes) : StringEdit.empty).filter(isDefined));\n\n\t\t\tif (edit.isEmpty()) {\n\t\t\t\treturn previousValue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tinlineCompletions: previousValue.inlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t\tsuggestWidgetInlineCompletions: previousValue.suggestWidgetInlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tpreviousValue.inlineCompletions.dispose();\n\t\t\t\tpreviousValue.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t}\n\t});\n\n\tpublic readonly inlineCompletions = this._state.map(this, v => v.inlineCompletions);\n\tpublic readonly suggestWidgetInlineCompletions = this._state.map(this, v => v.suggestWidgetInlineCompletions);\n\n\tprivate _completionsEnabled: Record<string, boolean> | undefined = undefined;\n\n\tconstructor(\n\t\tprivate readonly _textModel: ITextModel,\n\t\tprivate readonly _versionId: IObservableWithChange<number | null, IModelContentChangedEvent | undefined>,\n\t\tprivate readonly _debounceValue: IFeatureDebounceInformation,\n\t\tprivate readonly _cursorPosition: IObservable<Position>,\n\t\t@ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILogService private readonly _logService: ILogService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t) {\n\t\tsuper();\n\t\tthis._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast<\n\t\t\t{ kind: 'start'; requestId: number; context: unknown } & IRecordableEditorLogEntry\n\t\t\t| { kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number } & IRecordableLogEntry\n\t\t>(),\n\t\t\t'editor.inlineSuggest.logFetch.commandId'\n\t\t));\n\n\t\tthis.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;\n\t\tif (enablementSetting) {\n\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\t\tif (e.affectsConfiguration(enablementSetting)) {\n\t\t\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._state.recomputeInitiallyAndOnChange(this._store);\n\t}\n\n\tprivate _updateCompletionsEnablement(enalementSetting: string) {\n\t\tconst result = this._configurationService.getValue<Record<string, boolean>>(enalementSetting);\n\t\tif (!isObject(result)) {\n\t\t\tthis._completionsEnabled = undefined;\n\t\t} else {\n\t\t\tthis._completionsEnabled = result;\n\t\t}\n\t}\n\n\tpublic readonly clearOperationOnTextModelChange = derived(this, reader => {\n\t\tthis._versionId.read(reader);\n\t\tthis._updateOperation.clear();\n\t\treturn undefined; // always constant\n\t});\n\n\tprivate _log(entry:\n\t\t{ sourceId: string; kind: 'start'; requestId: number; context: unknown; provider: string | undefined } & IRecordableEditorLogEntry\n\t\t| { sourceId: string; kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number; didAllProvidersReturn: boolean } & IRecordableLogEntry\n\t) {\n\t\tif (this._loggingEnabled.get()) {\n\t\t\tthis._logService.info(formatRecordableLogEntry(entry));\n\t\t}\n\t\tthis._structuredFetchLogger.log(entry);\n\t}\n\n\tprivate readonly _loadingCount = observableValue(this, 0);\n\n\tpublic fetch(\n\t\tproviders: InlineCompletionsProvider[],\n\t\tprovidersLabel: string | undefined,\n\t\tcontext: InlineCompletionContextWithoutUuid,\n\t\tactiveInlineCompletion: InlineSuggestionIdentity | undefined,\n\t\twithDebounce: boolean,\n\t\tuserJumpedToActiveCompletion: IObservable<boolean>,\n\t\trequestInfo: InlineSuggestRequestInfo\n\t): Promise<boolean> {\n\t\tconst position = this._cursorPosition.get();\n\t\tconst request = new UpdateRequest(position, context, this._textModel.getVersionId(), new Set(providers));\n\n\t\tconst target = context.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions.get() : this.inlineCompletions.get();\n\n\t\tif (this._updateOperation.value?.request.satisfies(request)) {\n\t\t\treturn this._updateOperation.value.promise;\n\t\t} else if (target?.request?.satisfies(request)) {\n\t\t\treturn Promise.resolve(true);\n\t\t}\n\n\t\tconst updateOngoing = !!this._updateOperation.value;\n\t\tthis._updateOperation.clear();\n\n\t\tconst source = new CancellationTokenSource();\n\n\t\tconst promise = (async () => {\n\t\t\tconst store = new DisposableStore();\n\n\t\t\tthis._loadingCount.set(this._loadingCount.get() + 1, undefined);\n\t\t\tlet didDecrease = false;\n\t\t\tconst decreaseLoadingCount = () => {\n\t\t\t\tif (!didDecrease) {\n\t\t\t\t\tdidDecrease = true;\n\t\t\t\t\tthis._loadingCount.set(this._loadingCount.get() - 1, undefined);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst loadingReset = store.add(new RunOnceScheduler(() => decreaseLoadingCount(), 10 * 1000));\n\t\t\tloadingReset.schedule();\n\n\t\t\tconst inlineSuggestionsProviders = providers.filter(p => p.providerId);\n\t\t\tconst requestResponseInfo = new RequestResponseData(context, requestInfo, inlineSuggestionsProviders);\n\n\n\t\t\ttry {\n\t\t\t\tconst recommendedDebounceValue = this._debounceValue.get(this._textModel);\n\t\t\t\tconst debounceValue = findLastMax(\n\t\t\t\t\tproviders.map(p => p.debounceDelayMs),\n\t\t\t\t\tcompareUndefinedSmallest(numberComparator)\n\t\t\t\t) ?? recommendedDebounceValue;\n\n\t\t\t\t// Debounce in any case if update is ongoing\n\t\t\t\tconst shouldDebounce = updateOngoing || (withDebounce && context.triggerKind === InlineCompletionTriggerKind.Automatic);\n\t\t\t\tif (shouldDebounce) {\n\t\t\t\t\t// This debounces the operation\n\t\t\t\t\tawait wait(debounceValue, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:beforeFetch');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst requestId = InlineCompletionsSource._requestId++;\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tthis._log({\n\t\t\t\t\t\tsourceId: 'InlineCompletions.fetch',\n\t\t\t\t\t\tkind: 'start',\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tmodelUri: this._textModel.uri,\n\t\t\t\t\t\tmodelVersion: this._textModel.getVersionId(),\n\t\t\t\t\t\tcontext: { triggerKind: context.triggerKind, suggestInfo: context.selectedSuggestionInfo ? true : undefined },\n\t\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\t\tprovider: providersLabel,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst startTime = new Date();\n\t\t\t\tconst providerResult = provideInlineCompletions(providers, this._cursorPosition.get(), this._textModel, context, requestInfo, this._languageConfigurationService);\n\n\t\t\t\trunWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));\n\n\t\t\t\tlet shouldStopEarly = false;\n\t\t\t\tlet producedSuggestion = false;\n\n\t\t\t\tconst suggestions: InlineSuggestionItem[] = [];\n\t\t\t\tfor await (const list of providerResult.lists) {\n\t\t\t\t\tif (!list) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlist.addRef();\n\t\t\t\t\tstore.add(toDisposable(() => list.removeRef(list.inlineSuggestionsData.length === 0 ? { kind: 'empty' } : { kind: 'notTaken' })));\n\n\t\t\t\t\tfor (const item of list.inlineSuggestionsData) {\n\t\t\t\t\t\tproducedSuggestion = true;\n\t\t\t\t\t\tif (!context.includeInlineEdits && (item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineEditRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!context.includeInlineCompletions && !(item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineCompletionRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst i = InlineSuggestionItem.create(item, this._textModel);\n\t\t\t\t\t\tsuggestions.push(i);\n\t\t\t\t\t\t// Stop after first visible inline completion\n\t\t\t\t\t\tif (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {\n\t\t\t\t\t\t\tif (i.isVisible(this._textModel, this._cursorPosition.get())) {\n\t\t\t\t\t\t\t\tshouldStopEarly = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldStopEarly) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproviderResult.cancelAndDispose({ kind: 'lostRace' });\n\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tconst didAllProvidersReturn = providerResult.didAllProvidersReturn;\n\t\t\t\t\tlet error: string | undefined = undefined;\n\t\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\t\terror = 'canceled';\n\t\t\t\t\t}\n\t\t\t\t\tconst result = suggestions.map(c => ({\n\t\t\t\t\t\trange: c.editRange.toString(),\n\t\t\t\t\t\ttext: c.insertText,\n\t\t\t\t\t\thint: c.hint,\n\t\t\t\t\t\tisInlineEdit: c.isInlineEdit,\n\t\t\t\t\t\tshowInlineEditMenu: c.showInlineEditMenu,\n\t\t\t\t\t\tproviderId: c.source.provider.providerId?.toString(),\n\t\t\t\t\t}));\n\t\t\t\t\tthis._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });\n\t\t\t\t}\n\n\t\t\t\trequestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);\n\t\t\t\tif (producedSuggestion) {\n\t\t\t\t\trequestResponseInfo.setHasProducedSuggestion();\n\t\t\t\t\tif (suggestions.length > 0 && source.token.isCancellationRequested) {\n\t\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet('canceled:whileAwaitingOtherProviders'));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (source.token.isCancellationRequested) {\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:whileFetching');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completionsQuotaExceeded = this._contextKeyService.getContextKeyValue<boolean>('completionsQuotaExceeded');\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet(completionsQuotaExceeded ? 'completionsQuotaExceeded' : 'noSuggestion');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst remainingTimeToWait = context.earliestShownDateTime - Date.now();\n\t\t\t\tif (remainingTimeToWait > 0) {\n\t\t\t\t\tawait wait(remainingTimeToWait, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId\n\t\t\t\t\t|| userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {\n\t\t\t\t\tconst notShownReason =\n\t\t\t\t\t\tsource.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :\n\t\t\t\t\t\t\tthis._store.isDisposed ? 'canceled:disposed' :\n\t\t\t\t\t\t\t\tthis._textModel.getVersionId() !== request.versionId ? 'canceled:documentChanged' :\n\t\t\t\t\t\t\t\t\tuserJumpedToActiveCompletion.get() ? 'canceled:userJumped' :\n\t\t\t\t\t\t\t\t\t\t'unknown';\n\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet(notShownReason));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst endTime = new Date();\n\t\t\t\tthis._debounceValue.update(this._textModel, endTime.getTime() - startTime.getTime());\n\n\t\t\t\tconst cursorPosition = this._cursorPosition.get();\n\t\t\t\tthis._updateOperation.clear();\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\t/** @description Update completions with provider result */\n\t\t\t\t\tconst v = this._state.get();\n\n\t\t\t\t\tif (context.selectedSuggestionInfo) {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: v.suggestWidgetInlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: v.inlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t}\n\n\t\t\t\t\tv.inlineCompletions.dispose();\n\t\t\t\t\tv.suggestWidgetInlineCompletions.dispose();\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tstore.dispose();\n\t\t\t\tdecreaseLoadingCount();\n\t\t\t\tthis.sendInlineCompletionsRequestTelemetry(requestResponseInfo);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t})();\n\n\t\tconst updateOperation = new UpdateOperation(request, source, promise);\n\t\tthis._updateOperation.value = updateOperation;\n\n\t\treturn promise;\n\t}\n\n\tpublic clear(tx: ITransaction): void {\n\t\tthis._updateOperation.clear();\n\t\tconst v = this._state.get();\n\t\tthis._state.set({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty()\n\t\t}, tx);\n\t\tv.inlineCompletions.dispose();\n\t\tv.suggestWidgetInlineCompletions.dispose();\n\t}\n\n\tpublic seedInlineCompletionsWithSuggestWidget(): void {\n\t\tconst inlineCompletions = this.inlineCompletions.get();\n\t\tconst suggestWidgetInlineCompletions = this.suggestWidgetInlineCompletions.get();\n\t\tif (!suggestWidgetInlineCompletions) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\t/** @description Seed inline completions with (newer) suggest widget inline completions */\n\t\t\tif (!inlineCompletions || (suggestWidgetInlineCompletions.request?.versionId ?? -1) > (inlineCompletions.request?.versionId ?? -1)) {\n\t\t\t\tinlineCompletions?.dispose();\n\t\t\t\tconst s = this._state.get();\n\t\t\t\tthis._state.set({\n\t\t\t\t\tinlineCompletions: suggestWidgetInlineCompletions.clone(),\n\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t}, tx);\n\t\t\t\ts.inlineCompletions.dispose();\n\t\t\t\ts.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t\tthis.clearSuggestWidgetInlineCompletions(tx);\n\t\t});\n\t}\n\n\tprivate sendInlineCompletionsRequestTelemetry(\n\t\trequestResponseInfo: RequestResponseData\n\t): void {\n\t\tif (!this._sendRequestData.get() && !this._contextKeyService.getContextKeyValue<boolean>('isRunningUnificationExperiment')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (requestResponseInfo.requestUuid === undefined || requestResponseInfo.hasProducedSuggestion) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tif (!isCompletionsEnabled(this._completionsEnabled, this._textModel.getLanguageId())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst emptyEndOfLifeEvent: InlineCompletionEndOfLifeEvent = {\n\t\t\topportunityId: requestResponseInfo.requestUuid,\n\t\t\tnoSuggestionReason: requestResponseInfo.noSuggestionReason ?? 'unknown',\n\t\t\textensionId: 'vscode-core',\n\t\t\textensionVersion: '0.0.0',\n\t\t\tgroupId: 'empty',\n\t\t\tshown: false,\n\t\t\teditorType: requestResponseInfo.requestInfo.editorType,\n\t\t\trequestReason: requestResponseInfo.requestInfo.reason,\n\t\t\ttypingInterval: requestResponseInfo.requestInfo.typingInterval,\n\t\t\ttypingIntervalCharacterCount: requestResponseInfo.requestInfo.typingIntervalCharacterCount,\n\t\t\tlanguageId: requestResponseInfo.requestInfo.languageId,\n\t\t\tselectedSuggestionInfo: !!requestResponseInfo.context.selectedSuggestionInfo,\n\t\t\tavailableProviders: requestResponseInfo.providers.map(p => p.providerId?.toString()).filter(isDefined).join(','),\n\t\t\t...forwardToChannelIf(requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))),\n\t\t\ttimeUntilProviderRequest: undefined,\n\t\t\ttimeUntilProviderResponse: undefined,\n\t\t\tviewKind: undefined,\n\t\t\tpreceeded: undefined,\n\t\t\tsuperseded: undefined,\n\t\t\treason: undefined,\n\t\t\tcorrelationId: undefined,\n\t\t\tshownDuration: undefined,\n\t\t\tshownDurationUncollapsed: undefined,\n\t\t\ttimeUntilShown: undefined,\n\t\t\tpartiallyAccepted: undefined,\n\t\t\tpartiallyAcceptedCountSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedRatioSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedCharactersSinceOriginal: undefined,\n\t\t\tcursorColumnDistance: undefined,\n\t\t\tcursorLineDistance: undefined,\n\t\t\tlineCountOriginal: undefined,\n\t\t\tlineCountModified: undefined,\n\t\t\tcharacterCountOriginal: undefined,\n\t\t\tcharacterCountModified: undefined,\n\t\t\tdisjointReplacements: undefined,\n\t\t\tsameShapeReplacements: undefined,\n\t\t\tnotShownReason: undefined,\n\t\t};\n\n\t\tconst dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);\n\t\tsendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);\n\t}\n\n\tpublic clearSuggestWidgetInlineCompletions(tx: ITransaction): void {\n\t\tif (this._updateOperation.value?.request.context.selectedSuggestionInfo) {\n\t\t\tthis._updateOperation.clear();\n\t\t}\n\t}\n\n\tpublic cancelUpdate(): void {\n\t\tthis._updateOperation.clear();\n\t}\n}\n\nclass UpdateRequest {\n\tconstructor(\n\t\tpublic readonly position: Position,\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly versionId: number,\n\t\tpublic readonly providers: Set<InlineCompletionsProvider>,\n\t) {\n\t}\n\n\tpublic satisfies(other: UpdateRequest): boolean {\n\t\treturn this.position.equals(other.position)\n\t\t\t&& equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, itemEquals())\n\t\t\t&& (other.context.triggerKind === InlineCompletionTriggerKind.Automatic\n\t\t\t\t|| this.context.triggerKind === InlineCompletionTriggerKind.Explicit)\n\t\t\t&& this.versionId === other.versionId\n\t\t\t&& isSubset(other.providers, this.providers);\n\t}\n}\n\nclass RequestResponseData {\n\tpublic requestUuid: string | undefined;\n\tpublic noSuggestionReason: string | undefined;\n\tpublic hasProducedSuggestion = false;\n\n\tconstructor(\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly requestInfo: InlineSuggestRequestInfo,\n\t\tpublic readonly providers: InlineCompletionsProvider[],\n\t) { }\n\n\tsetRequestUuid(uuid: string) {\n\t\tthis.requestUuid = uuid;\n\t}\n\n\tsetNoSuggestionReasonIfNotSet(type: string) {\n\t\tthis.noSuggestionReason ??= type;\n\t}\n\n\tsetHasProducedSuggestion() {\n\t\tthis.hasProducedSuggestion = true;\n\t}\n}\n\nfunction isSubset<T>(set1: Set<T>, set2: Set<T>): boolean {\n\treturn [...set1].every(item => set2.has(item));\n}\n\nfunction isCompletionsEnabled(completionsEnablementObject: Record<string, boolean> | undefined, modeId: string = '*'): boolean {\n\tif (completionsEnablementObject === undefined) {\n\t\treturn false; // default to disabled if setting is not available\n\t}\n\n\tif (typeof completionsEnablementObject[modeId] !== 'undefined') {\n\t\treturn Boolean(completionsEnablementObject[modeId]); // go with setting if explicitly defined\n\t}\n\n\treturn Boolean(completionsEnablementObject['*']); // fallback to global setting otherwise\n}\n\nclass UpdateOperation implements IDisposable {\n\tconstructor(\n\t\tpublic readonly request: UpdateRequest,\n\t\tpublic readonly cancellationTokenSource: CancellationTokenSource,\n\t\tpublic readonly promise: Promise<boolean>,\n\t) {\n\t}\n\n\tdispose() {\n\t\tthis.cancellationTokenSource.cancel();\n\t}\n}\n\nclass InlineCompletionsState extends Disposable {\n\tpublic static createEmpty(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState([], undefined);\n\t}\n\n\tconstructor(\n\t\tpublic readonly inlineCompletions: readonly InlineSuggestionItem[],\n\t\tpublic readonly request: UpdateRequest | undefined,\n\t) {\n\t\tfor (const inlineCompletion of inlineCompletions) {\n\t\t\tinlineCompletion.addRef();\n\t\t}\n\n\t\tsuper();\n\n\t\tthis._register({\n\t\t\tdispose: () => {\n\t\t\t\tfor (const inlineCompletion of this.inlineCompletions) {\n\t\t\t\t\tinlineCompletion.removeRef();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _findById(id: InlineSuggestionIdentity): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.identity === id);\n\t}\n\n\tprivate _findByHash(hash: string): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.hash === hash);\n\t}\n\n\t/**\n\t * Applies the edit on the state.\n\t*/\n\tpublic createStateWithAppliedEdit(edit: StringEdit, textModel: ITextModel): InlineCompletionsState {\n\t\tconst newInlineCompletions = this.inlineCompletions.map(i => i.withEdit(edit, textModel)).filter(isDefined);\n\t\treturn new InlineCompletionsState(newInlineCompletions, this.request);\n\t}\n\n\tpublic createStateWithAppliedResults(updatedSuggestions: InlineSuggestionItem[], request: UpdateRequest, textModel: ITextModel, cursorPosition: Position, itemIdToPreserveAtTop: InlineSuggestionIdentity | undefined): InlineCompletionsState {\n\t\tlet itemToPreserve: InlineSuggestionItem | undefined = undefined;\n\t\tif (itemIdToPreserveAtTop) {\n\t\t\tconst itemToPreserveCandidate = this._findById(itemIdToPreserveAtTop);\n\t\t\tif (itemToPreserveCandidate && itemToPreserveCandidate.canBeReused(textModel, request.position)) {\n\t\t\t\titemToPreserve = itemToPreserveCandidate;\n\n\t\t\t\tconst updatedItemToPreserve = updatedSuggestions.find(i => i.hash === itemToPreserveCandidate.hash);\n\t\t\t\tif (updatedItemToPreserve) {\n\t\t\t\t\tupdatedSuggestions = moveToFront(updatedItemToPreserve, updatedSuggestions);\n\t\t\t\t} else {\n\t\t\t\t\tupdatedSuggestions = [itemToPreserveCandidate, ...updatedSuggestions];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst preferInlineCompletions = itemToPreserve\n\t\t\t// itemToPreserve has precedence\n\t\t\t? !itemToPreserve.isInlineEdit\n\t\t\t// Otherwise: prefer inline completion if there is a visible one\n\t\t\t: updatedSuggestions.some(i => !i.isInlineEdit && i.isVisible(textModel, cursorPosition));\n\n\t\tlet updatedItems: InlineSuggestionItem[] = [];\n\t\tfor (const i of updatedSuggestions) {\n\t\t\tconst oldItem = this._findByHash(i.hash);\n\t\t\tlet item;\n\t\t\tif (oldItem && oldItem !== i) {\n\t\t\t\titem = i.withIdentity(oldItem.identity);\n\t\t\t\ti.setIsPreceeded(oldItem);\n\t\t\t\toldItem.setEndOfLifeReason({ kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: i.getSourceCompletion() });\n\t\t\t} else {\n\t\t\t\titem = i;\n\t\t\t}\n\t\t\tif (preferInlineCompletions !== item.isInlineEdit) {\n\t\t\t\tupdatedItems.push(item);\n\t\t\t}\n\t\t}\n\n\t\tupdatedItems.sort(compareBy(i => i.showInlineEditMenu, booleanComparator));\n\t\tupdatedItems = distinctByKey(updatedItems, i => i.semanticId);\n\n\t\treturn new InlineCompletionsState(updatedItems, request);\n\t}\n\n\tpublic clone(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState(this.inlineCompletions, this.request);\n\t}\n}\n\n/** Keeps the first item in case of duplicates. */\nfunction distinctByKey<T>(items: T[], key: (item: T) => unknown): T[] {\n\tconst seen = new Set();\n\treturn items.filter(item => {\n\t\tconst k = key(item);\n\t\tif (seen.has(k)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(k);\n\t\treturn true;\n\t});\n}\n\nfunction moveToFront<T>(item: T, items: T[]): T[] {\n\tconst index = items.indexOf(item);\n\tif (index > -1) {\n\t\treturn [item, ...items.slice(0, index), ...items.slice(index + 1)];\n\t}\n\treturn items;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { booleanComparator, compareBy, compareUndefinedSmallest, numberComparator } from '../../../../../base/common/arrays.js';\nimport { findLastMax } from '../../../../../base/common/arraysFind.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../base/common/equals.js';\nimport { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, IObservableWithChange, ITransaction, observableValue, recordChangesLazy, transaction } from '../../../../../base/common/observable.js';\n// eslint-disable-next-line local/code-no-deep-import-of-internal\nimport { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';\nimport { isDefined, isObject } from '../../../../../base/common/types.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { DataChannelForwardingTelemetryService, forwardToChannelIf, isCopilotLikeExtension } from '../../../../../platform/dataChannel/browser/forwardingTelemetryService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';\nimport product from '../../../../../platform/product/common/product.js';\nimport { StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind, InlineCompletionsProvider } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';\nimport { IFeatureDebounceInformation } from '../../../../common/services/languageFeatureDebounce.js';\nimport { IModelContentChangedEvent } from '../../../../common/textModelEvents.js';\nimport { formatRecordableLogEntry, IRecordableEditorLogEntry, IRecordableLogEntry, StructuredLogger } from '../structuredLogger.js';\nimport { InlineCompletionEndOfLifeEvent, sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';\nimport { wait } from '../utils.js';\nimport { InlineSuggestionIdentity, InlineSuggestionItem } from './inlineSuggestionItem.js';\nimport { InlineCompletionContextWithoutUuid, InlineSuggestRequestInfo, provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';\n\nexport class InlineCompletionsSource extends Disposable {\n\tprivate static _requestId = 0;\n\n\tprivate readonly _updateOperation = this._register(new MutableDisposable<UpdateOperation>());\n\n\tprivate readonly _loggingEnabled;\n\tprivate readonly _sendRequestData;\n\n\tprivate readonly _structuredFetchLogger;\n\n\tprivate readonly _state = observableReducerSettable(this, {\n\t\tinitial: () => ({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t}),\n\t\tdisposeFinal: (values) => {\n\t\t\tvalues.inlineCompletions.dispose();\n\t\t\tvalues.suggestWidgetInlineCompletions.dispose();\n\t\t},\n\t\tchangeTracker: recordChangesLazy(() => ({ versionId: this._versionId })),\n\t\tupdate: (reader, previousValue, changes) => {\n\t\t\tconst edit = StringEdit.compose(changes.changes.map(c => c.change ? offsetEditFromContentChanges(c.change.changes) : StringEdit.empty).filter(isDefined));\n\n\t\t\tif (edit.isEmpty()) {\n\t\t\t\treturn previousValue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tinlineCompletions: previousValue.inlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t\tsuggestWidgetInlineCompletions: previousValue.suggestWidgetInlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tpreviousValue.inlineCompletions.dispose();\n\t\t\t\tpreviousValue.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t}\n\t});\n\n\tpublic readonly inlineCompletions = this._state.map(this, v => v.inlineCompletions);\n\tpublic readonly suggestWidgetInlineCompletions = this._state.map(this, v => v.suggestWidgetInlineCompletions);\n\n\tprivate _completionsEnabled: Record<string, boolean> | undefined = undefined;\n\n\tconstructor(\n\t\tprivate readonly _textModel: ITextModel,\n\t\tprivate readonly _versionId: IObservableWithChange<number | null, IModelContentChangedEvent | undefined>,\n\t\tprivate readonly _debounceValue: IFeatureDebounceInformation,\n\t\tprivate readonly _cursorPosition: IObservable<Position>,\n\t\t@ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILogService private readonly _logService: ILogService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t) {\n\t\tsuper();\n\t\tthis._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast<\n\t\t\t{ kind: 'start'; requestId: number; context: unknown } & IRecordableEditorLogEntry\n\t\t\t| { kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number } & IRecordableLogEntry\n\t\t>(),\n\t\t\t'editor.inlineSuggest.logFetch.commandId'\n\t\t));\n\n\t\tthis.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;\n\t\tif (enablementSetting) {\n\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\t\tif (e.affectsConfiguration(enablementSetting)) {\n\t\t\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._state.recomputeInitiallyAndOnChange(this._store);\n\t}\n\n\tprivate _updateCompletionsEnablement(enalementSetting: string) {\n\t\tconst result = this._configurationService.getValue<Record<string, boolean>>(enalementSetting);\n\t\tif (!isObject(result)) {\n\t\t\tthis._completionsEnabled = undefined;\n\t\t} else {\n\t\t\tthis._completionsEnabled = result;\n\t\t}\n\t}\n\n\tpublic readonly clearOperationOnTextModelChange = derived(this, reader => {\n\t\tthis._versionId.read(reader);\n\t\tthis._updateOperation.clear();\n\t\treturn undefined; // always constant\n\t});\n\n\tprivate _log(entry:\n\t\t{ sourceId: string; kind: 'start'; requestId: number; context: unknown; provider: string | undefined } & IRecordableEditorLogEntry\n\t\t| { sourceId: string; kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number; didAllProvidersReturn: boolean } & IRecordableLogEntry\n\t) {\n\t\tif (this._loggingEnabled.get()) {\n\t\t\tthis._logService.info(formatRecordableLogEntry(entry));\n\t\t}\n\t\tthis._structuredFetchLogger.log(entry);\n\t}\n\n\tprivate readonly _loadingCount = observableValue(this, 0);\n\n\tpublic fetch(\n\t\tproviders: InlineCompletionsProvider[],\n\t\tprovidersLabel: string | undefined,\n\t\tcontext: InlineCompletionContextWithoutUuid,\n\t\tactiveInlineCompletion: InlineSuggestionIdentity | undefined,\n\t\twithDebounce: boolean,\n\t\tuserJumpedToActiveCompletion: IObservable<boolean>,\n\t\trequestInfo: InlineSuggestRequestInfo\n\t): Promise<boolean> {\n\t\tconst position = this._cursorPosition.get();\n\t\tconst request = new UpdateRequest(position, context, this._textModel.getVersionId(), new Set(providers));\n\n\t\tconst target = context.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions.get() : this.inlineCompletions.get();\n\n\t\tif (this._updateOperation.value?.request.satisfies(request)) {\n\t\t\treturn this._updateOperation.value.promise;\n\t\t} else if (target?.request?.satisfies(request)) {\n\t\t\treturn Promise.resolve(true);\n\t\t}\n\n\t\tconst updateOngoing = !!this._updateOperation.value;\n\t\tthis._updateOperation.clear();\n\n\t\tconst source = new CancellationTokenSource();\n\n\t\tconst promise = (async () => {\n\t\t\tconst store = new DisposableStore();\n\n\t\t\tthis._loadingCount.set(this._loadingCount.get() + 1, undefined);\n\t\t\tlet didDecrease = false;\n\t\t\tconst decreaseLoadingCount = () => {\n\t\t\t\tif (!didDecrease) {\n\t\t\t\t\tdidDecrease = true;\n\t\t\t\t\tthis._loadingCount.set(this._loadingCount.get() - 1, undefined);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst loadingReset = store.add(new RunOnceScheduler(() => decreaseLoadingCount(), 10 * 1000));\n\t\t\tloadingReset.schedule();\n\n\t\t\tconst inlineSuggestionsProviders = providers.filter(p => p.providerId);\n\t\t\tconst requestResponseInfo = new RequestResponseData(context, requestInfo, inlineSuggestionsProviders);\n\n\n\t\t\ttry {\n\t\t\t\tconst recommendedDebounceValue = this._debounceValue.get(this._textModel);\n\t\t\t\tconst debounceValue = findLastMax(\n\t\t\t\t\tproviders.map(p => p.debounceDelayMs),\n\t\t\t\t\tcompareUndefinedSmallest(numberComparator)\n\t\t\t\t) ?? recommendedDebounceValue;\n\n\t\t\t\t// Debounce in any case if update is ongoing\n\t\t\t\tconst shouldDebounce = updateOngoing || (withDebounce && context.triggerKind === InlineCompletionTriggerKind.Automatic);\n\t\t\t\tif (shouldDebounce) {\n\t\t\t\t\t// This debounces the operation\n\t\t\t\t\tawait wait(debounceValue, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:beforeFetch');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst requestId = InlineCompletionsSource._requestId++;\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tthis._log({\n\t\t\t\t\t\tsourceId: 'InlineCompletions.fetch',\n\t\t\t\t\t\tkind: 'start',\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tmodelUri: this._textModel.uri,\n\t\t\t\t\t\tmodelVersion: this._textModel.getVersionId(),\n\t\t\t\t\t\tcontext: { triggerKind: context.triggerKind, suggestInfo: context.selectedSuggestionInfo ? true : undefined },\n\t\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\t\tprovider: providersLabel,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst startTime = new Date();\n\t\t\t\tconst providerResult = provideInlineCompletions(providers, this._cursorPosition.get(), this._textModel, context, requestInfo, this._languageConfigurationService);\n\n\t\t\t\trunWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));\n\n\t\t\t\tlet shouldStopEarly = false;\n\t\t\t\tlet producedSuggestion = false;\n\n\t\t\t\tconst suggestions: InlineSuggestionItem[] = [];\n\t\t\t\tfor await (const list of providerResult.lists) {\n\t\t\t\t\tif (!list) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlist.addRef();\n\t\t\t\t\tstore.add(toDisposable(() => list.removeRef(list.inlineSuggestionsData.length === 0 ? { kind: 'empty' } : { kind: 'notTaken' })));\n\n\t\t\t\t\tfor (const item of list.inlineSuggestionsData) {\n\t\t\t\t\t\tproducedSuggestion = true;\n\t\t\t\t\t\tif (!context.includeInlineEdits && (item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineEditRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!context.includeInlineCompletions && !(item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineCompletionRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst i = InlineSuggestionItem.create(item, this._textModel);\n\t\t\t\t\t\tsuggestions.push(i);\n\t\t\t\t\t\t// Stop after first visible inline completion\n\t\t\t\t\t\tif (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {\n\t\t\t\t\t\t\tif (i.isVisible(this._textModel, this._cursorPosition.get())) {\n\t\t\t\t\t\t\t\tshouldStopEarly = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldStopEarly) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproviderResult.cancelAndDispose({ kind: 'lostRace' });\n\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tconst didAllProvidersReturn = providerResult.didAllProvidersReturn;\n\t\t\t\t\tlet error: string | undefined = undefined;\n\t\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\t\terror = 'canceled';\n\t\t\t\t\t}\n\t\t\t\t\tconst result = suggestions.map(c => ({\n\t\t\t\t\t\trange: c.editRange.toString(),\n\t\t\t\t\t\ttext: c.insertText,\n\t\t\t\t\t\thint: c.hint,\n\t\t\t\t\t\tisInlineEdit: c.isInlineEdit,\n\t\t\t\t\t\tshowInlineEditMenu: c.showInlineEditMenu,\n\t\t\t\t\t\tproviderId: c.source.provider.providerId?.toString(),\n\t\t\t\t\t}));\n\t\t\t\t\tthis._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });\n\t\t\t\t}\n\n\t\t\t\trequestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);\n\t\t\t\tif (producedSuggestion) {\n\t\t\t\t\trequestResponseInfo.setHasProducedSuggestion();\n\t\t\t\t\tif (suggestions.length > 0 && source.token.isCancellationRequested) {\n\t\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet('canceled:whileAwaitingOtherProviders'));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (source.token.isCancellationRequested) {\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:whileFetching');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completionsQuotaExceeded = this._contextKeyService.getContextKeyValue<boolean>('completionsQuotaExceeded');\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet(completionsQuotaExceeded ? 'completionsQuotaExceeded' : 'noSuggestion');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst remainingTimeToWait = context.earliestShownDateTime - Date.now();\n\t\t\t\tif (remainingTimeToWait > 0) {\n\t\t\t\t\tawait wait(remainingTimeToWait, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId\n\t\t\t\t\t|| userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {\n\t\t\t\t\tconst notShownReason =\n\t\t\t\t\t\tsource.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :\n\t\t\t\t\t\t\tthis._store.isDisposed ? 'canceled:disposed' :\n\t\t\t\t\t\t\t\tthis._textModel.getVersionId() !== request.versionId ? 'canceled:documentChanged' :\n\t\t\t\t\t\t\t\t\tuserJumpedToActiveCompletion.get() ? 'canceled:userJumped' :\n\t\t\t\t\t\t\t\t\t\t'unknown';\n\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet(notShownReason));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst endTime = new Date();\n\t\t\t\tthis._debounceValue.update(this._textModel, endTime.getTime() - startTime.getTime());\n\n\t\t\t\tconst cursorPosition = this._cursorPosition.get();\n\t\t\t\tthis._updateOperation.clear();\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\t/** @description Update completions with provider result */\n\t\t\t\t\tconst v = this._state.get();\n\n\t\t\t\t\tif (context.selectedSuggestionInfo) {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: v.suggestWidgetInlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: v.inlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t}\n\n\t\t\t\t\tv.inlineCompletions.dispose();\n\t\t\t\t\tv.suggestWidgetInlineCompletions.dispose();\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tstore.dispose();\n\t\t\t\tdecreaseLoadingCount();\n\t\t\t\tthis.sendInlineCompletionsRequestTelemetry(requestResponseInfo);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t})();\n\n\t\tconst updateOperation = new UpdateOperation(request, source, promise);\n\t\tthis._updateOperation.value = updateOperation;\n\n\t\treturn promise;\n\t}\n\n\tpublic clear(tx: ITransaction): void {\n\t\tthis._updateOperation.clear();\n\t\tconst v = this._state.get();\n\t\tthis._state.set({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty()\n\t\t}, tx);\n\t\tv.inlineCompletions.dispose();\n\t\tv.suggestWidgetInlineCompletions.dispose();\n\t}\n\n\tpublic seedInlineCompletionsWithSuggestWidget(): void {\n\t\tconst inlineCompletions = this.inlineCompletions.get();\n\t\tconst suggestWidgetInlineCompletions = this.suggestWidgetInlineCompletions.get();\n\t\tif (!suggestWidgetInlineCompletions) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\t/** @description Seed inline completions with (newer) suggest widget inline completions */\n\t\t\tif (!inlineCompletions || (suggestWidgetInlineCompletions.request?.versionId ?? -1) > (inlineCompletions.request?.versionId ?? -1)) {\n\t\t\t\tinlineCompletions?.dispose();\n\t\t\t\tconst s = this._state.get();\n\t\t\t\tthis._state.set({\n\t\t\t\t\tinlineCompletions: suggestWidgetInlineCompletions.clone(),\n\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t}, tx);\n\t\t\t\ts.inlineCompletions.dispose();\n\t\t\t\ts.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t\tthis.clearSuggestWidgetInlineCompletions(tx);\n\t\t});\n\t}\n\n\tprivate sendInlineCompletionsRequestTelemetry(\n\t\trequestResponseInfo: RequestResponseData\n\t): void {\n\t\tif (!this._sendRequestData.get() && !this._contextKeyService.getContextKeyValue<boolean>('isRunningUnificationExperiment')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (requestResponseInfo.requestUuid === undefined || requestResponseInfo.hasProducedSuggestion) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tif (!isCompletionsEnabled(this._completionsEnabled, this._textModel.getLanguageId())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst emptyEndOfLifeEvent: InlineCompletionEndOfLifeEvent = {\n\t\t\topportunityId: requestResponseInfo.requestUuid,\n\t\t\tnoSuggestionReason: requestResponseInfo.noSuggestionReason ?? 'unknown',\n\t\t\textensionId: 'vscode-core',\n\t\t\textensionVersion: '0.0.0',\n\t\t\tgroupId: 'empty',\n\t\t\tshown: false,\n\t\t\teditorType: requestResponseInfo.requestInfo.editorType,\n\t\t\trequestReason: requestResponseInfo.requestInfo.reason,\n\t\t\ttypingInterval: requestResponseInfo.requestInfo.typingInterval,\n\t\t\ttypingIntervalCharacterCount: requestResponseInfo.requestInfo.typingIntervalCharacterCount,\n\t\t\tlanguageId: requestResponseInfo.requestInfo.languageId,\n\t\t\tselectedSuggestionInfo: !!requestResponseInfo.context.selectedSuggestionInfo,\n\t\t\tavailableProviders: requestResponseInfo.providers.map(p => p.providerId?.toString()).filter(isDefined).join(','),\n\t\t\t...forwardToChannelIf(requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))),\n\t\t\ttimeUntilProviderRequest: undefined,\n\t\t\ttimeUntilProviderResponse: undefined,\n\t\t\tviewKind: undefined,\n\t\t\tpreceeded: undefined,\n\t\t\tsuperseded: undefined,\n\t\t\treason: undefined,\n\t\t\tcorrelationId: undefined,\n\t\t\tshownDuration: undefined,\n\t\t\tshownDurationUncollapsed: undefined,\n\t\t\ttimeUntilShown: undefined,\n\t\t\tpartiallyAccepted: undefined,\n\t\t\tpartiallyAcceptedCountSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedRatioSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedCharactersSinceOriginal: undefined,\n\t\t\tcursorColumnDistance: undefined,\n\t\t\tcursorLineDistance: undefined,\n\t\t\tlineCountOriginal: undefined,\n\t\t\tlineCountModified: undefined,\n\t\t\tcharacterCountOriginal: undefined,\n\t\t\tcharacterCountModified: undefined,\n\t\t\tdisjointReplacements: undefined,\n\t\t\tsameShapeReplacements: undefined,\n\t\t\tnotShownReason: undefined,\n\t\t};\n\n\t\tconst dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);\n\t\tsendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);\n\t}\n\n\tpublic clearSuggestWidgetInlineCompletions(tx: ITransaction): void {\n\t\tif (this._updateOperation.value?.request.context.selectedSuggestionInfo) {\n\t\t\tthis._updateOperation.clear();\n\t\t}\n\t}\n\n\tpublic cancelUpdate(): void {\n\t\tthis._updateOperation.clear();\n\t}\n}\n\nclass UpdateRequest {\n\tconstructor(\n\t\tpublic readonly position: Position,\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly versionId: number,\n\t\tpublic readonly providers: Set<InlineCompletionsProvider>,\n\t) {\n\t}\n\n\tpublic satisfies(other: UpdateRequest): boolean {\n\t\treturn this.position.equals(other.position)\n\t\t\t&& equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, itemEquals())\n\t\t\t&& (other.context.triggerKind === InlineCompletionTriggerKind.Automatic\n\t\t\t\t|| this.context.triggerKind === InlineCompletionTriggerKind.Explicit)\n\t\t\t&& this.versionId === other.versionId\n\t\t\t&& isSubset(other.providers, this.providers);\n\t}\n}\n\nclass RequestResponseData {\n\tpublic requestUuid: string | undefined;\n\tpublic noSuggestionReason: string | undefined;\n\tpublic hasProducedSuggestion = false;\n\n\tconstructor(\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly requestInfo: InlineSuggestRequestInfo,\n\t\tpublic readonly providers: InlineCompletionsProvider[],\n\t) { }\n\n\tsetRequestUuid(uuid: string) {\n\t\tthis.requestUuid = uuid;\n\t}\n\n\tsetNoSuggestionReasonIfNotSet(type: string) {\n\t\tthis.noSuggestionReason ??= type;\n\t}\n\n\tsetHasProducedSuggestion() {\n\t\tthis.hasProducedSuggestion = true;\n\t}\n}\n\nfunction isSubset<T>(set1: Set<T>, set2: Set<T>): boolean {\n\treturn [...set1].every(item => set2.has(item));\n}\n\nfunction isCompletionsEnabled(completionsEnablementObject: Record<string, boolean> | undefined, modeId: string = '*'): boolean {\n\tif (completionsEnablementObject === undefined) {\n\t\treturn false; // default to disabled if setting is not available\n\t}\n\n\tif (typeof completionsEnablementObject[modeId] !== 'undefined') {\n\t\treturn Boolean(completionsEnablementObject[modeId]); // go with setting if explicitly defined\n\t}\n\n\treturn Boolean(completionsEnablementObject['*']); // fallback to global setting otherwise\n}\n\nclass UpdateOperation implements IDisposable {\n\tconstructor(\n\t\tpublic readonly request: UpdateRequest,\n\t\tpublic readonly cancellationTokenSource: CancellationTokenSource,\n\t\tpublic readonly promise: Promise<boolean>,\n\t) {\n\t}\n\n\tdispose() {\n\t\tthis.cancellationTokenSource.cancel();\n\t}\n}\n\nclass InlineCompletionsState extends Disposable {\n\tpublic static createEmpty(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState([], undefined);\n\t}\n\n\tconstructor(\n\t\tpublic readonly inlineCompletions: readonly InlineSuggestionItem[],\n\t\tpublic readonly request: UpdateRequest | undefined,\n\t) {\n\t\tfor (const inlineCompletion of inlineCompletions) {\n\t\t\tinlineCompletion.addRef();\n\t\t}\n\n\t\tsuper();\n\n\t\tthis._register({\n\t\t\tdispose: () => {\n\t\t\t\tfor (const inlineCompletion of this.inlineCompletions) {\n\t\t\t\t\tinlineCompletion.removeRef();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _findById(id: InlineSuggestionIdentity): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.identity === id);\n\t}\n\n\tprivate _findByHash(hash: string): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.hash === hash);\n\t}\n\n\t/**\n\t * Applies the edit on the state.\n\t*/\n\tpublic createStateWithAppliedEdit(edit: StringEdit, textModel: ITextModel): InlineCompletionsState {\n\t\tconst newInlineCompletions = this.inlineCompletions.map(i => i.withEdit(edit, textModel)).filter(isDefined);\n\t\treturn new InlineCompletionsState(newInlineCompletions, this.request);\n\t}\n\n\tpublic createStateWithAppliedResults(updatedSuggestions: InlineSuggestionItem[], request: UpdateRequest, textModel: ITextModel, cursorPosition: Position, itemIdToPreserveAtTop: InlineSuggestionIdentity | undefined): InlineCompletionsState {\n\t\tlet itemToPreserve: InlineSuggestionItem | undefined = undefined;\n\t\tif (itemIdToPreserveAtTop) {\n\t\t\tconst itemToPreserveCandidate = this._findById(itemIdToPreserveAtTop);\n\t\t\tif (itemToPreserveCandidate && itemToPreserveCandidate.canBeReused(textModel, request.position)) {\n\t\t\t\titemToPreserve = itemToPreserveCandidate;\n\n\t\t\t\tconst updatedItemToPreserve = updatedSuggestions.find(i => i.hash === itemToPreserveCandidate.hash);\n\t\t\t\tif (updatedItemToPreserve) {\n\t\t\t\t\tupdatedSuggestions = moveToFront(updatedItemToPreserve, updatedSuggestions);\n\t\t\t\t} else {\n\t\t\t\t\tupdatedSuggestions = [itemToPreserveCandidate, ...updatedSuggestions];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst preferInlineCompletions = itemToPreserve\n\t\t\t// itemToPreserve has precedence\n\t\t\t? !itemToPreserve.isInlineEdit\n\t\t\t// Otherwise: prefer inline completion if there is a visible one\n\t\t\t: updatedSuggestions.some(i => !i.isInlineEdit && i.isVisible(textModel, cursorPosition));\n\n\t\tlet updatedItems: InlineSuggestionItem[] = [];\n\t\tfor (const i of updatedSuggestions) {\n\t\t\tconst oldItem = this._findByHash(i.hash);\n\t\t\tlet item;\n\t\t\tif (oldItem && oldItem !== i) {\n\t\t\t\titem = i.withIdentity(oldItem.identity);\n\t\t\t\ti.setIsPreceeded(oldItem);\n\t\t\t\toldItem.setEndOfLifeReason({ kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: i.getSourceCompletion() });\n\t\t\t} else {\n\t\t\t\titem = i;\n\t\t\t}\n\t\t\tif (preferInlineCompletions !== item.isInlineEdit) {\n\t\t\t\tupdatedItems.push(item);\n\t\t\t}\n\t\t}\n\n\t\tupdatedItems.sort(compareBy(i => i.showInlineEditMenu, booleanComparator));\n\t\tupdatedItems = distinctByKey(updatedItems, i => i.semanticId);\n\n\t\treturn new InlineCompletionsState(updatedItems, request);\n\t}\n\n\tpublic clone(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState(this.inlineCompletions, this.request);\n\t}\n}\n\n/** Keeps the first item in case of duplicates. */\nfunction distinctByKey<T>(items: T[], key: (item: T) => unknown): T[] {\n\tconst seen = new Set();\n\treturn items.filter(item => {\n\t\tconst k = key(item);\n\t\tif (seen.has(k)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(k);\n\t\treturn true;\n\t});\n}\n\nfunction moveToFront<T>(item: T, items: T[]): T[] {\n\tconst index = items.indexOf(item);\n\tif (index > -1) {\n\t\treturn [item, ...items.slice(0, index), ...items.slice(index + 1)];\n\t}\n\treturn items;\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.ts","vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.ts"],"names":[],"mappings":"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","file":"inlineCompletionsSource.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { booleanComparator, compareBy, compareUndefinedSmallest, numberComparator } from '../../../../../base/common/arrays.js';\nimport { findLastMax } from '../../../../../base/common/arraysFind.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { equalsIfDefined, thisEqualsC } from '../../../../../base/common/equals.js';\nimport { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { cloneAndChange } from '../../../../../base/common/objects.js';\nimport { derived, IObservable, IObservableWithChange, ITransaction, observableValue, recordChangesLazy, transaction } from '../../../../../base/common/observable.js';\n// eslint-disable-next-line local/code-no-deep-import-of-internal\nimport { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';\nimport { isDefined, isObject } from '../../../../../base/common/types.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { DataChannelForwardingTelemetryService, forwardToChannelIf, isCopilotLikeExtension } from '../../../../../platform/dataChannel/browser/forwardingTelemetryService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';\nimport product from '../../../../../platform/product/common/product.js';\nimport { StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Command, InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind, InlineCompletionsProvider } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';\nimport { IFeatureDebounceInformation } from '../../../../common/services/languageFeatureDebounce.js';\nimport { IModelContentChangedEvent } from '../../../../common/textModelEvents.js';\nimport { formatRecordableLogEntry, IRecordableEditorLogEntry, IRecordableLogEntry, StructuredLogger } from '../structuredLogger.js';\nimport { InlineCompletionEndOfLifeEvent, sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';\nimport { wait } from '../utils.js';\nimport { InlineSuggestionIdentity, InlineSuggestionItem } from './inlineSuggestionItem.js';\nimport { InlineCompletionContextWithoutUuid, InlineSuggestRequestInfo, provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';\nimport { RenameSymbolProcessor } from './renameSymbolProcessor.js';\n\nexport class InlineCompletionsSource extends Disposable {\n\tprivate static _requestId = 0;\n\n\tprivate readonly _updateOperation = this._register(new MutableDisposable<UpdateOperation>());\n\n\tprivate readonly _loggingEnabled;\n\tprivate readonly _sendRequestData;\n\n\tprivate readonly _structuredFetchLogger;\n\n\tprivate readonly _state = observableReducerSettable(this, {\n\t\tinitial: () => ({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t}),\n\t\tdisposeFinal: (values) => {\n\t\t\tvalues.inlineCompletions.dispose();\n\t\t\tvalues.suggestWidgetInlineCompletions.dispose();\n\t\t},\n\t\tchangeTracker: recordChangesLazy(() => ({ versionId: this._versionId })),\n\t\tupdate: (reader, previousValue, changes) => {\n\t\t\tconst edit = StringEdit.compose(changes.changes.map(c => c.change ? offsetEditFromContentChanges(c.change.changes) : StringEdit.empty).filter(isDefined));\n\n\t\t\tif (edit.isEmpty()) {\n\t\t\t\treturn previousValue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tinlineCompletions: previousValue.inlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t\tsuggestWidgetInlineCompletions: previousValue.suggestWidgetInlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tpreviousValue.inlineCompletions.dispose();\n\t\t\t\tpreviousValue.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t}\n\t});\n\n\tpublic readonly inlineCompletions = this._state.map(this, v => v.inlineCompletions);\n\tpublic readonly suggestWidgetInlineCompletions = this._state.map(this, v => v.suggestWidgetInlineCompletions);\n\n\tprivate readonly _renameProcessor: RenameSymbolProcessor;\n\n\tprivate _completionsEnabled: Record<string, boolean> | undefined = undefined;\n\n\tconstructor(\n\t\tprivate readonly _textModel: ITextModel,\n\t\tprivate readonly _versionId: IObservableWithChange<number | null, IModelContentChangedEvent | undefined>,\n\t\tprivate readonly _debounceValue: IFeatureDebounceInformation,\n\t\tprivate readonly _cursorPosition: IObservable<Position>,\n\t\t@ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILogService private readonly _logService: ILogService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t) {\n\t\tsuper();\n\t\tthis._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast<\n\t\t\t{ kind: 'start'; requestId: number; context: unknown } & IRecordableEditorLogEntry\n\t\t\t| { kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number } & IRecordableLogEntry\n\t\t>(),\n\t\t\t'editor.inlineSuggest.logFetch.commandId'\n\t\t));\n\n\t\tthis._renameProcessor = this._store.add(this._instantiationService.createInstance(RenameSymbolProcessor));\n\n\t\tthis.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;\n\t\tif (enablementSetting) {\n\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\t\tif (e.affectsConfiguration(enablementSetting)) {\n\t\t\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._state.recomputeInitiallyAndOnChange(this._store);\n\t}\n\n\tprivate _updateCompletionsEnablement(enalementSetting: string) {\n\t\tconst result = this._configurationService.getValue<Record<string, boolean>>(enalementSetting);\n\t\tif (!isObject(result)) {\n\t\t\tthis._completionsEnabled = undefined;\n\t\t} else {\n\t\t\tthis._completionsEnabled = result;\n\t\t}\n\t}\n\n\tpublic readonly clearOperationOnTextModelChange = derived(this, reader => {\n\t\tthis._versionId.read(reader);\n\t\tthis._updateOperation.clear();\n\t\treturn undefined; // always constant\n\t});\n\n\tprivate _log(entry:\n\t\t{ sourceId: string; kind: 'start'; requestId: number; context: unknown; provider: string | undefined } & IRecordableEditorLogEntry\n\t\t| { sourceId: string; kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number; didAllProvidersReturn: boolean } & IRecordableLogEntry\n\t) {\n\t\tif (this._loggingEnabled.get()) {\n\t\t\tthis._logService.info(formatRecordableLogEntry(entry));\n\t\t}\n\t\tthis._structuredFetchLogger.log(entry);\n\t}\n\n\tprivate readonly _loadingCount = observableValue(this, 0);\n\n\tpublic fetch(\n\t\tproviders: InlineCompletionsProvider[],\n\t\tprovidersLabel: string | undefined,\n\t\tcontext: InlineCompletionContextWithoutUuid,\n\t\tactiveInlineCompletion: InlineSuggestionIdentity | undefined,\n\t\twithDebounce: boolean,\n\t\tuserJumpedToActiveCompletion: IObservable<boolean>,\n\t\trequestInfo: InlineSuggestRequestInfo\n\t): Promise<boolean> {\n\t\tconst position = this._cursorPosition.get();\n\t\tconst request = new UpdateRequest(position, context, this._textModel.getVersionId(), new Set(providers));\n\n\t\tconst target = context.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions.get() : this.inlineCompletions.get();\n\n\t\tif (this._updateOperation.value?.request.satisfies(request)) {\n\t\t\treturn this._updateOperation.value.promise;\n\t\t} else if (target?.request?.satisfies(request)) {\n\t\t\treturn Promise.resolve(true);\n\t\t}\n\n\t\tconst updateOngoing = !!this._updateOperation.value;\n\t\tthis._updateOperation.clear();\n\n\t\tconst source = new CancellationTokenSource();\n\n\t\tconst promise = (async () => {\n\t\t\tconst store = new DisposableStore();\n\n\t\t\tthis._loadingCount.set(this._loadingCount.get() + 1, undefined);\n\t\t\tlet didDecrease = false;\n\t\t\tconst decreaseLoadingCount = () => {\n\t\t\t\tif (!didDecrease) {\n\t\t\t\t\tdidDecrease = true;\n\t\t\t\t\tthis._loadingCount.set(this._loadingCount.get() - 1, undefined);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst loadingReset = store.add(new RunOnceScheduler(() => decreaseLoadingCount(), 10 * 1000));\n\t\t\tloadingReset.schedule();\n\n\t\t\tconst inlineSuggestionsProviders = providers.filter(p => p.providerId);\n\t\t\tconst requestResponseInfo = new RequestResponseData(context, requestInfo, inlineSuggestionsProviders);\n\n\n\t\t\ttry {\n\t\t\t\tconst recommendedDebounceValue = this._debounceValue.get(this._textModel);\n\t\t\t\tconst debounceValue = findLastMax(\n\t\t\t\t\tproviders.map(p => p.debounceDelayMs),\n\t\t\t\t\tcompareUndefinedSmallest(numberComparator)\n\t\t\t\t) ?? recommendedDebounceValue;\n\n\t\t\t\t// Debounce in any case if update is ongoing\n\t\t\t\tconst shouldDebounce = updateOngoing || (withDebounce && context.triggerKind === InlineCompletionTriggerKind.Automatic);\n\t\t\t\tif (shouldDebounce) {\n\t\t\t\t\t// This debounces the operation\n\t\t\t\t\tawait wait(debounceValue, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:beforeFetch');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst requestId = InlineCompletionsSource._requestId++;\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tthis._log({\n\t\t\t\t\t\tsourceId: 'InlineCompletions.fetch',\n\t\t\t\t\t\tkind: 'start',\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tmodelUri: this._textModel.uri,\n\t\t\t\t\t\tmodelVersion: this._textModel.getVersionId(),\n\t\t\t\t\t\tcontext: { triggerKind: context.triggerKind, suggestInfo: context.selectedSuggestionInfo ? true : undefined },\n\t\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\t\tprovider: providersLabel,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst startTime = new Date();\n\t\t\t\tconst providerResult = provideInlineCompletions(providers, this._cursorPosition.get(), this._textModel, context, requestInfo, this._languageConfigurationService);\n\n\t\t\t\trunWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));\n\n\t\t\t\tlet shouldStopEarly = false;\n\t\t\t\tlet producedSuggestion = false;\n\n\t\t\t\tconst providerSuggestions: InlineSuggestionItem[] = [];\n\t\t\t\tfor await (const list of providerResult.lists) {\n\t\t\t\t\tif (!list) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlist.addRef();\n\t\t\t\t\tstore.add(toDisposable(() => list.removeRef(list.inlineSuggestionsData.length === 0 ? { kind: 'empty' } : { kind: 'notTaken' })));\n\n\t\t\t\t\tfor (const item of list.inlineSuggestionsData) {\n\t\t\t\t\t\tproducedSuggestion = true;\n\t\t\t\t\t\tif (!context.includeInlineEdits && (item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineEditRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!context.includeInlineCompletions && !(item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineCompletionRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.addPerformanceMarker('providerReturned');\n\t\t\t\t\t\tconst i = InlineSuggestionItem.create(item, this._textModel);\n\t\t\t\t\t\titem.addPerformanceMarker('itemCreated');\n\t\t\t\t\t\tproviderSuggestions.push(i);\n\t\t\t\t\t\t// Stop after first visible inline completion\n\t\t\t\t\t\tif (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {\n\t\t\t\t\t\t\tif (i.isVisible(this._textModel, this._cursorPosition.get())) {\n\t\t\t\t\t\t\t\tshouldStopEarly = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldStopEarly) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproviderSuggestions.forEach(s => s.addPerformanceMarker('providersResolved'));\n\n\t\t\t\tconst suggestions: InlineSuggestionItem[] = await Promise.all(providerSuggestions.map(async s => {\n\t\t\t\t\treturn this._renameProcessor.proposeRenameRefactoring(this._textModel, s);\n\t\t\t\t}));\n\n\t\t\t\tsuggestions.forEach(s => s.addPerformanceMarker('renameProcessed'));\n\n\t\t\t\tproviderResult.cancelAndDispose({ kind: 'lostRace' });\n\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tconst didAllProvidersReturn = providerResult.didAllProvidersReturn;\n\t\t\t\t\tlet error: string | undefined = undefined;\n\t\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\t\terror = 'canceled';\n\t\t\t\t\t}\n\t\t\t\t\tconst result = suggestions.map(c => {\n\t\t\t\t\t\tconst comp = c.getSourceCompletion();\n\t\t\t\t\t\tif (comp.doNotLog) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\tinsertText: comp.insertText,\n\t\t\t\t\t\t\trange: comp.range,\n\t\t\t\t\t\t\tadditionalTextEdits: comp.additionalTextEdits,\n\t\t\t\t\t\t\turi: comp.uri,\n\t\t\t\t\t\t\tcommand: comp.command,\n\t\t\t\t\t\t\tgutterMenuLinkAction: comp.gutterMenuLinkAction,\n\t\t\t\t\t\t\tshownCommand: comp.shownCommand,\n\t\t\t\t\t\t\tcompleteBracketPairs: comp.completeBracketPairs,\n\t\t\t\t\t\t\tisInlineEdit: comp.isInlineEdit,\n\t\t\t\t\t\t\tshowInlineEditMenu: comp.showInlineEditMenu,\n\t\t\t\t\t\t\tshowRange: comp.showRange,\n\t\t\t\t\t\t\twarning: comp.warning,\n\t\t\t\t\t\t\thint: comp.hint,\n\t\t\t\t\t\t\tsupportsRename: comp.supportsRename,\n\t\t\t\t\t\t\tcorrelationId: comp.correlationId,\n\t\t\t\t\t\t\tjumpToPosition: comp.jumpToPosition,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...(cloneAndChange(obj, v => {\n\t\t\t\t\t\t\t\tif (Range.isIRange(v)) {\n\t\t\t\t\t\t\t\t\treturn Range.lift(v).toString();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (Position.isIPosition(v)) {\n\t\t\t\t\t\t\t\t\treturn Position.lift(v).toString();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (Command.is(v)) {\n\t\t\t\t\t\t\t\t\treturn { $commandId: v.id };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn v;\n\t\t\t\t\t\t\t}) as object),\n\t\t\t\t\t\t\t$providerId: c.source.provider.providerId?.toString(),\n\t\t\t\t\t\t};\n\t\t\t\t\t}).filter(result => result !== undefined);\n\n\t\t\t\t\tthis._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });\n\t\t\t\t}\n\n\t\t\t\trequestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);\n\t\t\t\tif (producedSuggestion) {\n\t\t\t\t\trequestResponseInfo.setHasProducedSuggestion();\n\t\t\t\t\tif (suggestions.length > 0 && source.token.isCancellationRequested) {\n\t\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet('canceled:whileAwaitingOtherProviders'));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (source.token.isCancellationRequested) {\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:whileFetching');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completionsQuotaExceeded = this._contextKeyService.getContextKeyValue<boolean>('completionsQuotaExceeded');\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet(completionsQuotaExceeded ? 'completionsQuotaExceeded' : 'noSuggestion');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst remainingTimeToWait = context.earliestShownDateTime - Date.now();\n\t\t\t\tif (remainingTimeToWait > 0) {\n\t\t\t\t\tawait wait(remainingTimeToWait, source.token);\n\t\t\t\t}\n\n\t\t\t\tsuggestions.forEach(s => s.addPerformanceMarker('minShowDelayPassed'));\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId\n\t\t\t\t\t|| userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {\n\t\t\t\t\tconst notShownReason =\n\t\t\t\t\t\tsource.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :\n\t\t\t\t\t\t\tthis._store.isDisposed ? 'canceled:disposed' :\n\t\t\t\t\t\t\t\tthis._textModel.getVersionId() !== request.versionId ? 'canceled:documentChanged' :\n\t\t\t\t\t\t\t\t\tuserJumpedToActiveCompletion.get() ? 'canceled:userJumped' :\n\t\t\t\t\t\t\t\t\t\t'unknown';\n\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet(notShownReason));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst endTime = new Date();\n\t\t\t\tthis._debounceValue.update(this._textModel, endTime.getTime() - startTime.getTime());\n\n\t\t\t\tconst cursorPosition = this._cursorPosition.get();\n\t\t\t\tthis._updateOperation.clear();\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\t/** @description Update completions with provider result */\n\t\t\t\t\tconst v = this._state.get();\n\n\t\t\t\t\tif (context.selectedSuggestionInfo) {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: v.suggestWidgetInlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: v.inlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t}\n\n\t\t\t\t\tv.inlineCompletions.dispose();\n\t\t\t\t\tv.suggestWidgetInlineCompletions.dispose();\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tstore.dispose();\n\t\t\t\tdecreaseLoadingCount();\n\t\t\t\tthis.sendInlineCompletionsRequestTelemetry(requestResponseInfo);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t})();\n\n\t\tconst updateOperation = new UpdateOperation(request, source, promise);\n\t\tthis._updateOperation.value = updateOperation;\n\n\t\treturn promise;\n\t}\n\n\tpublic clear(tx: ITransaction): void {\n\t\tthis._updateOperation.clear();\n\t\tconst v = this._state.get();\n\t\tthis._state.set({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty()\n\t\t}, tx);\n\t\tv.inlineCompletions.dispose();\n\t\tv.suggestWidgetInlineCompletions.dispose();\n\t}\n\n\tpublic seedInlineCompletionsWithSuggestWidget(): void {\n\t\tconst inlineCompletions = this.inlineCompletions.get();\n\t\tconst suggestWidgetInlineCompletions = this.suggestWidgetInlineCompletions.get();\n\t\tif (!suggestWidgetInlineCompletions) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\t/** @description Seed inline completions with (newer) suggest widget inline completions */\n\t\t\tif (!inlineCompletions || (suggestWidgetInlineCompletions.request?.versionId ?? -1) > (inlineCompletions.request?.versionId ?? -1)) {\n\t\t\t\tinlineCompletions?.dispose();\n\t\t\t\tconst s = this._state.get();\n\t\t\t\tthis._state.set({\n\t\t\t\t\tinlineCompletions: suggestWidgetInlineCompletions.clone(),\n\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t}, tx);\n\t\t\t\ts.inlineCompletions.dispose();\n\t\t\t\ts.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t\tthis.clearSuggestWidgetInlineCompletions(tx);\n\t\t});\n\t}\n\n\tprivate sendInlineCompletionsRequestTelemetry(\n\t\trequestResponseInfo: RequestResponseData\n\t): void {\n\t\tif (!this._sendRequestData.get() && !this._contextKeyService.getContextKeyValue<boolean>('isRunningUnificationExperiment')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (requestResponseInfo.requestUuid === undefined || requestResponseInfo.hasProducedSuggestion) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tif (!isCompletionsEnabled(this._completionsEnabled, this._textModel.getLanguageId())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst emptyEndOfLifeEvent: InlineCompletionEndOfLifeEvent = {\n\t\t\topportunityId: requestResponseInfo.requestUuid,\n\t\t\tnoSuggestionReason: requestResponseInfo.noSuggestionReason ?? 'unknown',\n\t\t\textensionId: 'vscode-core',\n\t\t\textensionVersion: '0.0.0',\n\t\t\tgroupId: 'empty',\n\t\t\tshown: false,\n\t\t\tskuPlan: requestResponseInfo.requestInfo.sku?.plan,\n\t\t\tskuType: requestResponseInfo.requestInfo.sku?.type,\n\t\t\teditorType: requestResponseInfo.requestInfo.editorType,\n\t\t\trequestReason: requestResponseInfo.requestInfo.reason,\n\t\t\ttypingInterval: requestResponseInfo.requestInfo.typingInterval,\n\t\t\ttypingIntervalCharacterCount: requestResponseInfo.requestInfo.typingIntervalCharacterCount,\n\t\t\tlanguageId: requestResponseInfo.requestInfo.languageId,\n\t\t\tselectedSuggestionInfo: !!requestResponseInfo.context.selectedSuggestionInfo,\n\t\t\tavailableProviders: requestResponseInfo.providers.map(p => p.providerId?.toString()).filter(isDefined).join(','),\n\t\t\t...forwardToChannelIf(requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))),\n\t\t\ttimeUntilProviderRequest: undefined,\n\t\t\ttimeUntilProviderResponse: undefined,\n\t\t\tviewKind: undefined,\n\t\t\tpreceeded: undefined,\n\t\t\tsuperseded: undefined,\n\t\t\treason: undefined,\n\t\t\tacceptedAlternativeAction: undefined,\n\t\t\tcorrelationId: undefined,\n\t\t\tshownDuration: undefined,\n\t\t\tshownDurationUncollapsed: undefined,\n\t\t\ttimeUntilShown: undefined,\n\t\t\tpartiallyAccepted: undefined,\n\t\t\tpartiallyAcceptedCountSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedRatioSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedCharactersSinceOriginal: undefined,\n\t\t\tcursorColumnDistance: undefined,\n\t\t\tcursorLineDistance: undefined,\n\t\t\tlineCountOriginal: undefined,\n\t\t\tlineCountModified: undefined,\n\t\t\tcharacterCountOriginal: undefined,\n\t\t\tcharacterCountModified: undefined,\n\t\t\tdisjointReplacements: undefined,\n\t\t\tsameShapeReplacements: undefined,\n\t\t\tlongDistanceHintVisible: undefined,\n\t\t\tlongDistanceHintDistance: undefined,\n\t\t\tnotShownReason: undefined,\n\t\t\trenameCreated: false,\n\t\t\trenameDuration: undefined,\n\t\t\trenameTimedOut: false,\n\t\t\trenameDroppedOtherEdits: undefined,\n\t\t\trenameDroppedRenameEdits: undefined,\n\t\t\tperformanceMarkers: undefined,\n\t\t\teditKind: undefined,\n\t\t};\n\n\t\tconst dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);\n\t\tsendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);\n\t}\n\n\tpublic clearSuggestWidgetInlineCompletions(tx: ITransaction): void {\n\t\tif (this._updateOperation.value?.request.context.selectedSuggestionInfo) {\n\t\t\tthis._updateOperation.clear();\n\t\t}\n\t}\n\n\tpublic cancelUpdate(): void {\n\t\tthis._updateOperation.clear();\n\t}\n}\n\nclass UpdateRequest {\n\tconstructor(\n\t\tpublic readonly position: Position,\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly versionId: number,\n\t\tpublic readonly providers: Set<InlineCompletionsProvider>,\n\t) {\n\t}\n\n\tpublic satisfies(other: UpdateRequest): boolean {\n\t\treturn this.position.equals(other.position)\n\t\t\t&& equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, thisEqualsC())\n\t\t\t&& (other.context.triggerKind === InlineCompletionTriggerKind.Automatic\n\t\t\t\t|| this.context.triggerKind === InlineCompletionTriggerKind.Explicit)\n\t\t\t&& this.versionId === other.versionId\n\t\t\t&& isSubset(other.providers, this.providers);\n\t}\n}\n\nclass RequestResponseData {\n\tpublic requestUuid: string | undefined;\n\tpublic noSuggestionReason: string | undefined;\n\tpublic hasProducedSuggestion = false;\n\n\tconstructor(\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly requestInfo: InlineSuggestRequestInfo,\n\t\tpublic readonly providers: InlineCompletionsProvider[],\n\t) { }\n\n\tsetRequestUuid(uuid: string) {\n\t\tthis.requestUuid = uuid;\n\t}\n\n\tsetNoSuggestionReasonIfNotSet(type: string) {\n\t\tthis.noSuggestionReason ??= type;\n\t}\n\n\tsetHasProducedSuggestion() {\n\t\tthis.hasProducedSuggestion = true;\n\t}\n}\n\nfunction isSubset<T>(set1: Set<T>, set2: Set<T>): boolean {\n\treturn [...set1].every(item => set2.has(item));\n}\n\nfunction isCompletionsEnabled(completionsEnablementObject: Record<string, boolean> | undefined, modeId: string = '*'): boolean {\n\tif (completionsEnablementObject === undefined) {\n\t\treturn false; // default to disabled if setting is not available\n\t}\n\n\tif (typeof completionsEnablementObject[modeId] !== 'undefined') {\n\t\treturn Boolean(completionsEnablementObject[modeId]); // go with setting if explicitly defined\n\t}\n\n\treturn Boolean(completionsEnablementObject['*']); // fallback to global setting otherwise\n}\n\nclass UpdateOperation implements IDisposable {\n\tconstructor(\n\t\tpublic readonly request: UpdateRequest,\n\t\tpublic readonly cancellationTokenSource: CancellationTokenSource,\n\t\tpublic readonly promise: Promise<boolean>,\n\t) {\n\t}\n\n\tdispose() {\n\t\tthis.cancellationTokenSource.cancel();\n\t}\n}\n\nclass InlineCompletionsState extends Disposable {\n\tpublic static createEmpty(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState([], undefined);\n\t}\n\n\tconstructor(\n\t\tpublic readonly inlineCompletions: readonly InlineSuggestionItem[],\n\t\tpublic readonly request: UpdateRequest | undefined,\n\t) {\n\t\tfor (const inlineCompletion of inlineCompletions) {\n\t\t\tinlineCompletion.addRef();\n\t\t}\n\n\t\tsuper();\n\n\t\tthis._register({\n\t\t\tdispose: () => {\n\t\t\t\tfor (const inlineCompletion of this.inlineCompletions) {\n\t\t\t\t\tinlineCompletion.removeRef();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _findById(id: InlineSuggestionIdentity): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.identity === id);\n\t}\n\n\tprivate _findByHash(hash: string): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.hash === hash);\n\t}\n\n\t/**\n\t * Applies the edit on the state.\n\t*/\n\tpublic createStateWithAppliedEdit(edit: StringEdit, textModel: ITextModel): InlineCompletionsState {\n\t\tconst newInlineCompletions = this.inlineCompletions.map(i => i.withEdit(edit, textModel)).filter(isDefined);\n\t\treturn new InlineCompletionsState(newInlineCompletions, this.request);\n\t}\n\n\tpublic createStateWithAppliedResults(updatedSuggestions: InlineSuggestionItem[], request: UpdateRequest, textModel: ITextModel, cursorPosition: Position, itemIdToPreserveAtTop: InlineSuggestionIdentity | undefined): InlineCompletionsState {\n\t\tlet itemToPreserve: InlineSuggestionItem | undefined = undefined;\n\t\tif (itemIdToPreserveAtTop) {\n\t\t\tconst itemToPreserveCandidate = this._findById(itemIdToPreserveAtTop);\n\t\t\tif (itemToPreserveCandidate && itemToPreserveCandidate.canBeReused(textModel, request.position)) {\n\t\t\t\titemToPreserve = itemToPreserveCandidate;\n\n\t\t\t\tconst updatedItemToPreserve = updatedSuggestions.find(i => i.hash === itemToPreserveCandidate.hash);\n\t\t\t\tif (updatedItemToPreserve) {\n\t\t\t\t\tupdatedSuggestions = moveToFront(updatedItemToPreserve, updatedSuggestions);\n\t\t\t\t} else {\n\t\t\t\t\tupdatedSuggestions = [itemToPreserveCandidate, ...updatedSuggestions];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst preferInlineCompletions = itemToPreserve\n\t\t\t// itemToPreserve has precedence\n\t\t\t? !itemToPreserve.isInlineEdit\n\t\t\t// Otherwise: prefer inline completion if there is a visible one\n\t\t\t: updatedSuggestions.some(i => !i.isInlineEdit && i.isVisible(textModel, cursorPosition));\n\n\t\tlet updatedItems: InlineSuggestionItem[] = [];\n\t\tfor (const i of updatedSuggestions) {\n\t\t\tconst oldItem = this._findByHash(i.hash);\n\t\t\tlet item;\n\t\t\tif (oldItem && oldItem !== i) {\n\t\t\t\titem = i.withIdentity(oldItem.identity);\n\t\t\t\ti.setIsPreceeded(oldItem);\n\t\t\t\toldItem.setEndOfLifeReason({ kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: i.getSourceCompletion() });\n\t\t\t} else {\n\t\t\t\titem = i;\n\t\t\t}\n\t\t\tif (preferInlineCompletions !== item.isInlineEdit) {\n\t\t\t\tupdatedItems.push(item);\n\t\t\t}\n\t\t}\n\n\t\tupdatedItems.sort(compareBy(i => i.showInlineEditMenu, booleanComparator));\n\t\tupdatedItems = distinctByKey(updatedItems, i => i.semanticId);\n\n\t\treturn new InlineCompletionsState(updatedItems, request);\n\t}\n\n\tpublic clone(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState(this.inlineCompletions, this.request);\n\t}\n}\n\n/** Keeps the first item in case of duplicates. */\nfunction distinctByKey<T>(items: T[], key: (item: T) => unknown): T[] {\n\tconst seen = new Set();\n\treturn items.filter(item => {\n\t\tconst k = key(item);\n\t\tif (seen.has(k)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(k);\n\t\treturn true;\n\t});\n}\n\nfunction moveToFront<T>(item: T, items: T[]): T[] {\n\tconst index = items.indexOf(item);\n\tif (index > -1) {\n\t\treturn [item, ...items.slice(0, index), ...items.slice(index + 1)];\n\t}\n\treturn items;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { booleanComparator, compareBy, compareUndefinedSmallest, numberComparator } from '../../../../../base/common/arrays.js';\nimport { findLastMax } from '../../../../../base/common/arraysFind.js';\nimport { RunOnceScheduler } from '../../../../../base/common/async.js';\nimport { CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { equalsIfDefined, thisEqualsC } from '../../../../../base/common/equals.js';\nimport { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { cloneAndChange } from '../../../../../base/common/objects.js';\nimport { derived, IObservable, IObservableWithChange, ITransaction, observableValue, recordChangesLazy, transaction } from '../../../../../base/common/observable.js';\n// eslint-disable-next-line local/code-no-deep-import-of-internal\nimport { observableReducerSettable } from '../../../../../base/common/observableInternal/experimental/reducer.js';\nimport { isDefined, isObject } from '../../../../../base/common/types.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { DataChannelForwardingTelemetryService, forwardToChannelIf, isCopilotLikeExtension } from '../../../../../platform/dataChannel/browser/forwardingTelemetryService.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { ILogService } from '../../../../../platform/log/common/log.js';\nimport { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js';\nimport product from '../../../../../platform/product/common/product.js';\nimport { StringEdit } from '../../../../common/core/edits/stringEdit.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Command, InlineCompletionEndOfLifeReasonKind, InlineCompletionTriggerKind, InlineCompletionsProvider } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { offsetEditFromContentChanges } from '../../../../common/model/textModelStringEdit.js';\nimport { IFeatureDebounceInformation } from '../../../../common/services/languageFeatureDebounce.js';\nimport { IModelContentChangedEvent } from '../../../../common/textModelEvents.js';\nimport { formatRecordableLogEntry, IRecordableEditorLogEntry, IRecordableLogEntry, StructuredLogger } from '../structuredLogger.js';\nimport { InlineCompletionEndOfLifeEvent, sendInlineCompletionsEndOfLifeTelemetry } from '../telemetry.js';\nimport { wait } from '../utils.js';\nimport { InlineSuggestionIdentity, InlineSuggestionItem } from './inlineSuggestionItem.js';\nimport { InlineCompletionContextWithoutUuid, InlineSuggestRequestInfo, provideInlineCompletions, runWhenCancelled } from './provideInlineCompletions.js';\nimport { RenameSymbolProcessor } from './renameSymbolProcessor.js';\n\nexport class InlineCompletionsSource extends Disposable {\n\tprivate static _requestId = 0;\n\n\tprivate readonly _updateOperation = this._register(new MutableDisposable<UpdateOperation>());\n\n\tprivate readonly _loggingEnabled;\n\tprivate readonly _sendRequestData;\n\n\tprivate readonly _structuredFetchLogger;\n\n\tprivate readonly _state = observableReducerSettable(this, {\n\t\tinitial: () => ({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t}),\n\t\tdisposeFinal: (values) => {\n\t\t\tvalues.inlineCompletions.dispose();\n\t\t\tvalues.suggestWidgetInlineCompletions.dispose();\n\t\t},\n\t\tchangeTracker: recordChangesLazy(() => ({ versionId: this._versionId })),\n\t\tupdate: (reader, previousValue, changes) => {\n\t\t\tconst edit = StringEdit.compose(changes.changes.map(c => c.change ? offsetEditFromContentChanges(c.change.changes) : StringEdit.empty).filter(isDefined));\n\n\t\t\tif (edit.isEmpty()) {\n\t\t\t\treturn previousValue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tinlineCompletions: previousValue.inlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t\tsuggestWidgetInlineCompletions: previousValue.suggestWidgetInlineCompletions.createStateWithAppliedEdit(edit, this._textModel),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tpreviousValue.inlineCompletions.dispose();\n\t\t\t\tpreviousValue.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t}\n\t});\n\n\tpublic readonly inlineCompletions = this._state.map(this, v => v.inlineCompletions);\n\tpublic readonly suggestWidgetInlineCompletions = this._state.map(this, v => v.suggestWidgetInlineCompletions);\n\n\tprivate readonly _renameProcessor: RenameSymbolProcessor;\n\n\tprivate _completionsEnabled: Record<string, boolean> | undefined = undefined;\n\n\tconstructor(\n\t\tprivate readonly _textModel: ITextModel,\n\t\tprivate readonly _versionId: IObservableWithChange<number | null, IModelContentChangedEvent | undefined>,\n\t\tprivate readonly _debounceValue: IFeatureDebounceInformation,\n\t\tprivate readonly _cursorPosition: IObservable<Position>,\n\t\t@ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILogService private readonly _logService: ILogService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t) {\n\t\tsuper();\n\t\tthis._loggingEnabled = observableConfigValue('editor.inlineSuggest.logFetch', false, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._sendRequestData = observableConfigValue('editor.inlineSuggest.emptyResponseInformation', true, this._configurationService).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._structuredFetchLogger = this._register(this._instantiationService.createInstance(StructuredLogger.cast<\n\t\t\t{ kind: 'start'; requestId: number; context: unknown } & IRecordableEditorLogEntry\n\t\t\t| { kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number } & IRecordableLogEntry\n\t\t>(),\n\t\t\t'editor.inlineSuggest.logFetch.commandId'\n\t\t));\n\n\t\tthis._renameProcessor = this._store.add(this._instantiationService.createInstance(RenameSymbolProcessor));\n\n\t\tthis.clearOperationOnTextModelChange.recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst enablementSetting = product.defaultChatAgent?.completionsEnablementSetting ?? undefined;\n\t\tif (enablementSetting) {\n\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\t\tif (e.affectsConfiguration(enablementSetting)) {\n\t\t\t\t\tthis._updateCompletionsEnablement(enablementSetting);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tthis._state.recomputeInitiallyAndOnChange(this._store);\n\t}\n\n\tprivate _updateCompletionsEnablement(enalementSetting: string) {\n\t\tconst result = this._configurationService.getValue<Record<string, boolean>>(enalementSetting);\n\t\tif (!isObject(result)) {\n\t\t\tthis._completionsEnabled = undefined;\n\t\t} else {\n\t\t\tthis._completionsEnabled = result;\n\t\t}\n\t}\n\n\tpublic readonly clearOperationOnTextModelChange = derived(this, reader => {\n\t\tthis._versionId.read(reader);\n\t\tthis._updateOperation.clear();\n\t\treturn undefined; // always constant\n\t});\n\n\tprivate _log(entry:\n\t\t{ sourceId: string; kind: 'start'; requestId: number; context: unknown; provider: string | undefined } & IRecordableEditorLogEntry\n\t\t| { sourceId: string; kind: 'end'; error: unknown; durationMs: number; result: unknown; requestId: number; didAllProvidersReturn: boolean } & IRecordableLogEntry\n\t) {\n\t\tif (this._loggingEnabled.get()) {\n\t\t\tthis._logService.info(formatRecordableLogEntry(entry));\n\t\t}\n\t\tthis._structuredFetchLogger.log(entry);\n\t}\n\n\tprivate readonly _loadingCount = observableValue(this, 0);\n\n\tpublic fetch(\n\t\tproviders: InlineCompletionsProvider[],\n\t\tprovidersLabel: string | undefined,\n\t\tcontext: InlineCompletionContextWithoutUuid,\n\t\tactiveInlineCompletion: InlineSuggestionIdentity | undefined,\n\t\twithDebounce: boolean,\n\t\tuserJumpedToActiveCompletion: IObservable<boolean>,\n\t\trequestInfo: InlineSuggestRequestInfo\n\t): Promise<boolean> {\n\t\tconst position = this._cursorPosition.get();\n\t\tconst request = new UpdateRequest(position, context, this._textModel.getVersionId(), new Set(providers));\n\n\t\tconst target = context.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions.get() : this.inlineCompletions.get();\n\n\t\tif (this._updateOperation.value?.request.satisfies(request)) {\n\t\t\treturn this._updateOperation.value.promise;\n\t\t} else if (target?.request?.satisfies(request)) {\n\t\t\treturn Promise.resolve(true);\n\t\t}\n\n\t\tconst updateOngoing = !!this._updateOperation.value;\n\t\tthis._updateOperation.clear();\n\n\t\tconst source = new CancellationTokenSource();\n\n\t\tconst promise = (async () => {\n\t\t\tconst store = new DisposableStore();\n\n\t\t\tthis._loadingCount.set(this._loadingCount.get() + 1, undefined);\n\t\t\tlet didDecrease = false;\n\t\t\tconst decreaseLoadingCount = () => {\n\t\t\t\tif (!didDecrease) {\n\t\t\t\t\tdidDecrease = true;\n\t\t\t\t\tthis._loadingCount.set(this._loadingCount.get() - 1, undefined);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst loadingReset = store.add(new RunOnceScheduler(() => decreaseLoadingCount(), 10 * 1000));\n\t\t\tloadingReset.schedule();\n\n\t\t\tconst inlineSuggestionsProviders = providers.filter(p => p.providerId);\n\t\t\tconst requestResponseInfo = new RequestResponseData(context, requestInfo, inlineSuggestionsProviders);\n\n\n\t\t\ttry {\n\t\t\t\tconst recommendedDebounceValue = this._debounceValue.get(this._textModel);\n\t\t\t\tconst debounceValue = findLastMax(\n\t\t\t\t\tproviders.map(p => p.debounceDelayMs),\n\t\t\t\t\tcompareUndefinedSmallest(numberComparator)\n\t\t\t\t) ?? recommendedDebounceValue;\n\n\t\t\t\t// Debounce in any case if update is ongoing\n\t\t\t\tconst shouldDebounce = updateOngoing || (withDebounce && context.triggerKind === InlineCompletionTriggerKind.Automatic);\n\t\t\t\tif (shouldDebounce) {\n\t\t\t\t\t// This debounces the operation\n\t\t\t\t\tawait wait(debounceValue, source.token);\n\t\t\t\t}\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:beforeFetch');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst requestId = InlineCompletionsSource._requestId++;\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tthis._log({\n\t\t\t\t\t\tsourceId: 'InlineCompletions.fetch',\n\t\t\t\t\t\tkind: 'start',\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tmodelUri: this._textModel.uri,\n\t\t\t\t\t\tmodelVersion: this._textModel.getVersionId(),\n\t\t\t\t\t\tcontext: { triggerKind: context.triggerKind, suggestInfo: context.selectedSuggestionInfo ? true : undefined },\n\t\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\t\tprovider: providersLabel,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst startTime = new Date();\n\t\t\t\tconst providerResult = provideInlineCompletions(providers, this._cursorPosition.get(), this._textModel, context, requestInfo, this._languageConfigurationService);\n\n\t\t\t\trunWhenCancelled(source.token, () => providerResult.cancelAndDispose({ kind: 'tokenCancellation' }));\n\n\t\t\t\tlet shouldStopEarly = false;\n\t\t\t\tlet producedSuggestion = false;\n\n\t\t\t\tconst providerSuggestions: InlineSuggestionItem[] = [];\n\t\t\t\tfor await (const list of providerResult.lists) {\n\t\t\t\t\tif (!list) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlist.addRef();\n\t\t\t\t\tstore.add(toDisposable(() => list.removeRef(list.inlineSuggestionsData.length === 0 ? { kind: 'empty' } : { kind: 'notTaken' })));\n\n\t\t\t\t\tfor (const item of list.inlineSuggestionsData) {\n\t\t\t\t\t\tproducedSuggestion = true;\n\t\t\t\t\t\tif (!context.includeInlineEdits && (item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineEditRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!context.includeInlineCompletions && !(item.isInlineEdit || item.showInlineEditMenu)) {\n\t\t\t\t\t\t\titem.setNotShownReason('notInlineCompletionRequested');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.addPerformanceMarker('providerReturned');\n\t\t\t\t\t\tconst i = InlineSuggestionItem.create(item, this._textModel);\n\t\t\t\t\t\titem.addPerformanceMarker('itemCreated');\n\t\t\t\t\t\tproviderSuggestions.push(i);\n\t\t\t\t\t\t// Stop after first visible inline completion\n\t\t\t\t\t\tif (!i.isInlineEdit && !i.showInlineEditMenu && context.triggerKind === InlineCompletionTriggerKind.Automatic) {\n\t\t\t\t\t\t\tif (i.isVisible(this._textModel, this._cursorPosition.get())) {\n\t\t\t\t\t\t\t\tshouldStopEarly = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldStopEarly) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproviderSuggestions.forEach(s => s.addPerformanceMarker('providersResolved'));\n\n\t\t\t\tconst suggestions: InlineSuggestionItem[] = await Promise.all(providerSuggestions.map(async s => {\n\t\t\t\t\treturn this._renameProcessor.proposeRenameRefactoring(this._textModel, s);\n\t\t\t\t}));\n\n\t\t\t\tsuggestions.forEach(s => s.addPerformanceMarker('renameProcessed'));\n\n\t\t\t\tproviderResult.cancelAndDispose({ kind: 'lostRace' });\n\n\t\t\t\tif (this._loggingEnabled.get() || this._structuredFetchLogger.isEnabled.get()) {\n\t\t\t\t\tconst didAllProvidersReturn = providerResult.didAllProvidersReturn;\n\t\t\t\t\tlet error: string | undefined = undefined;\n\t\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId) {\n\t\t\t\t\t\terror = 'canceled';\n\t\t\t\t\t}\n\t\t\t\t\tconst result = suggestions.map(c => {\n\t\t\t\t\t\tconst comp = c.getSourceCompletion();\n\t\t\t\t\t\tif (comp.doNotLog) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\tinsertText: comp.insertText,\n\t\t\t\t\t\t\trange: comp.range,\n\t\t\t\t\t\t\tadditionalTextEdits: comp.additionalTextEdits,\n\t\t\t\t\t\t\turi: comp.uri,\n\t\t\t\t\t\t\tcommand: comp.command,\n\t\t\t\t\t\t\tgutterMenuLinkAction: comp.gutterMenuLinkAction,\n\t\t\t\t\t\t\tshownCommand: comp.shownCommand,\n\t\t\t\t\t\t\tcompleteBracketPairs: comp.completeBracketPairs,\n\t\t\t\t\t\t\tisInlineEdit: comp.isInlineEdit,\n\t\t\t\t\t\t\tshowInlineEditMenu: comp.showInlineEditMenu,\n\t\t\t\t\t\t\tshowRange: comp.showRange,\n\t\t\t\t\t\t\twarning: comp.warning,\n\t\t\t\t\t\t\thint: comp.hint,\n\t\t\t\t\t\t\tsupportsRename: comp.supportsRename,\n\t\t\t\t\t\t\tcorrelationId: comp.correlationId,\n\t\t\t\t\t\t\tjumpToPosition: comp.jumpToPosition,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...(cloneAndChange(obj, v => {\n\t\t\t\t\t\t\t\tif (Range.isIRange(v)) {\n\t\t\t\t\t\t\t\t\treturn Range.lift(v).toString();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (Position.isIPosition(v)) {\n\t\t\t\t\t\t\t\t\treturn Position.lift(v).toString();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (Command.is(v)) {\n\t\t\t\t\t\t\t\t\treturn { $commandId: v.id };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn v;\n\t\t\t\t\t\t\t}) as object),\n\t\t\t\t\t\t\t$providerId: c.source.provider.providerId?.toString(),\n\t\t\t\t\t\t};\n\t\t\t\t\t}).filter(result => result !== undefined);\n\n\t\t\t\t\tthis._log({ sourceId: 'InlineCompletions.fetch', kind: 'end', requestId, durationMs: (Date.now() - startTime.getTime()), error, result, time: Date.now(), didAllProvidersReturn });\n\t\t\t\t}\n\n\t\t\t\trequestResponseInfo.setRequestUuid(providerResult.contextWithUuid.requestUuid);\n\t\t\t\tif (producedSuggestion) {\n\t\t\t\t\trequestResponseInfo.setHasProducedSuggestion();\n\t\t\t\t\tif (suggestions.length > 0 && source.token.isCancellationRequested) {\n\t\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet('canceled:whileAwaitingOtherProviders'));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (source.token.isCancellationRequested) {\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet('canceled:whileFetching');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completionsQuotaExceeded = this._contextKeyService.getContextKeyValue<boolean>('completionsQuotaExceeded');\n\t\t\t\t\t\trequestResponseInfo.setNoSuggestionReasonIfNotSet(completionsQuotaExceeded ? 'completionsQuotaExceeded' : 'noSuggestion');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst remainingTimeToWait = context.earliestShownDateTime - Date.now();\n\t\t\t\tif (remainingTimeToWait > 0) {\n\t\t\t\t\tawait wait(remainingTimeToWait, source.token);\n\t\t\t\t}\n\n\t\t\t\tsuggestions.forEach(s => s.addPerformanceMarker('minShowDelayPassed'));\n\n\t\t\t\tif (source.token.isCancellationRequested || this._store.isDisposed || this._textModel.getVersionId() !== request.versionId\n\t\t\t\t\t|| userJumpedToActiveCompletion.get() /* In the meantime the user showed interest for the active completion so dont hide it */) {\n\t\t\t\t\tconst notShownReason =\n\t\t\t\t\t\tsource.token.isCancellationRequested ? 'canceled:afterMinShowDelay' :\n\t\t\t\t\t\t\tthis._store.isDisposed ? 'canceled:disposed' :\n\t\t\t\t\t\t\t\tthis._textModel.getVersionId() !== request.versionId ? 'canceled:documentChanged' :\n\t\t\t\t\t\t\t\t\tuserJumpedToActiveCompletion.get() ? 'canceled:userJumped' :\n\t\t\t\t\t\t\t\t\t\t'unknown';\n\t\t\t\t\tsuggestions.forEach(s => s.setNotShownReasonIfNotSet(notShownReason));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst endTime = new Date();\n\t\t\t\tthis._debounceValue.update(this._textModel, endTime.getTime() - startTime.getTime());\n\n\t\t\t\tconst cursorPosition = this._cursorPosition.get();\n\t\t\t\tthis._updateOperation.clear();\n\t\t\t\ttransaction(tx => {\n\t\t\t\t\t/** @description Update completions with provider result */\n\t\t\t\t\tconst v = this._state.get();\n\n\t\t\t\t\tif (context.selectedSuggestionInfo) {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: v.suggestWidgetInlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._state.set({\n\t\t\t\t\t\t\tinlineCompletions: v.inlineCompletions.createStateWithAppliedResults(suggestions, request, this._textModel, cursorPosition, activeInlineCompletion),\n\t\t\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t\t\t}, tx);\n\t\t\t\t\t}\n\n\t\t\t\t\tv.inlineCompletions.dispose();\n\t\t\t\t\tv.suggestWidgetInlineCompletions.dispose();\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tstore.dispose();\n\t\t\t\tdecreaseLoadingCount();\n\t\t\t\tthis.sendInlineCompletionsRequestTelemetry(requestResponseInfo);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t})();\n\n\t\tconst updateOperation = new UpdateOperation(request, source, promise);\n\t\tthis._updateOperation.value = updateOperation;\n\n\t\treturn promise;\n\t}\n\n\tpublic clear(tx: ITransaction): void {\n\t\tthis._updateOperation.clear();\n\t\tconst v = this._state.get();\n\t\tthis._state.set({\n\t\t\tinlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty()\n\t\t}, tx);\n\t\tv.inlineCompletions.dispose();\n\t\tv.suggestWidgetInlineCompletions.dispose();\n\t}\n\n\tpublic seedInlineCompletionsWithSuggestWidget(): void {\n\t\tconst inlineCompletions = this.inlineCompletions.get();\n\t\tconst suggestWidgetInlineCompletions = this.suggestWidgetInlineCompletions.get();\n\t\tif (!suggestWidgetInlineCompletions) {\n\t\t\treturn;\n\t\t}\n\t\ttransaction(tx => {\n\t\t\t/** @description Seed inline completions with (newer) suggest widget inline completions */\n\t\t\tif (!inlineCompletions || (suggestWidgetInlineCompletions.request?.versionId ?? -1) > (inlineCompletions.request?.versionId ?? -1)) {\n\t\t\t\tinlineCompletions?.dispose();\n\t\t\t\tconst s = this._state.get();\n\t\t\t\tthis._state.set({\n\t\t\t\t\tinlineCompletions: suggestWidgetInlineCompletions.clone(),\n\t\t\t\t\tsuggestWidgetInlineCompletions: InlineCompletionsState.createEmpty(),\n\t\t\t\t}, tx);\n\t\t\t\ts.inlineCompletions.dispose();\n\t\t\t\ts.suggestWidgetInlineCompletions.dispose();\n\t\t\t}\n\t\t\tthis.clearSuggestWidgetInlineCompletions(tx);\n\t\t});\n\t}\n\n\tprivate sendInlineCompletionsRequestTelemetry(\n\t\trequestResponseInfo: RequestResponseData\n\t): void {\n\t\tif (!this._sendRequestData.get() && !this._contextKeyService.getContextKeyValue<boolean>('isRunningUnificationExperiment')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (requestResponseInfo.requestUuid === undefined || requestResponseInfo.hasProducedSuggestion) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tif (!isCompletionsEnabled(this._completionsEnabled, this._textModel.getLanguageId())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst emptyEndOfLifeEvent: InlineCompletionEndOfLifeEvent = {\n\t\t\topportunityId: requestResponseInfo.requestUuid,\n\t\t\tnoSuggestionReason: requestResponseInfo.noSuggestionReason ?? 'unknown',\n\t\t\textensionId: 'vscode-core',\n\t\t\textensionVersion: '0.0.0',\n\t\t\tgroupId: 'empty',\n\t\t\tshown: false,\n\t\t\tskuPlan: requestResponseInfo.requestInfo.sku?.plan,\n\t\t\tskuType: requestResponseInfo.requestInfo.sku?.type,\n\t\t\teditorType: requestResponseInfo.requestInfo.editorType,\n\t\t\trequestReason: requestResponseInfo.requestInfo.reason,\n\t\t\ttypingInterval: requestResponseInfo.requestInfo.typingInterval,\n\t\t\ttypingIntervalCharacterCount: requestResponseInfo.requestInfo.typingIntervalCharacterCount,\n\t\t\tlanguageId: requestResponseInfo.requestInfo.languageId,\n\t\t\tselectedSuggestionInfo: !!requestResponseInfo.context.selectedSuggestionInfo,\n\t\t\tavailableProviders: requestResponseInfo.providers.map(p => p.providerId?.toString()).filter(isDefined).join(','),\n\t\t\t...forwardToChannelIf(requestResponseInfo.providers.some(p => isCopilotLikeExtension(p.providerId?.extensionId))),\n\t\t\ttimeUntilProviderRequest: undefined,\n\t\t\ttimeUntilProviderResponse: undefined,\n\t\t\tviewKind: undefined,\n\t\t\tpreceeded: undefined,\n\t\t\tsuperseded: undefined,\n\t\t\treason: undefined,\n\t\t\tacceptedAlternativeAction: undefined,\n\t\t\tcorrelationId: undefined,\n\t\t\tshownDuration: undefined,\n\t\t\tshownDurationUncollapsed: undefined,\n\t\t\ttimeUntilShown: undefined,\n\t\t\tpartiallyAccepted: undefined,\n\t\t\tpartiallyAcceptedCountSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedRatioSinceOriginal: undefined,\n\t\t\tpartiallyAcceptedCharactersSinceOriginal: undefined,\n\t\t\tcursorColumnDistance: undefined,\n\t\t\tcursorLineDistance: undefined,\n\t\t\tlineCountOriginal: undefined,\n\t\t\tlineCountModified: undefined,\n\t\t\tcharacterCountOriginal: undefined,\n\t\t\tcharacterCountModified: undefined,\n\t\t\tdisjointReplacements: undefined,\n\t\t\tsameShapeReplacements: undefined,\n\t\t\tlongDistanceHintVisible: undefined,\n\t\t\tlongDistanceHintDistance: undefined,\n\t\t\tnotShownReason: undefined,\n\t\t\trenameCreated: false,\n\t\t\trenameDuration: undefined,\n\t\t\trenameTimedOut: false,\n\t\t\trenameDroppedOtherEdits: undefined,\n\t\t\trenameDroppedRenameEdits: undefined,\n\t\t\tperformanceMarkers: undefined,\n\t\t\teditKind: undefined,\n\t\t};\n\n\t\tconst dataChannel = this._instantiationService.createInstance(DataChannelForwardingTelemetryService);\n\t\tsendInlineCompletionsEndOfLifeTelemetry(dataChannel, emptyEndOfLifeEvent);\n\t}\n\n\tpublic clearSuggestWidgetInlineCompletions(tx: ITransaction): void {\n\t\tif (this._updateOperation.value?.request.context.selectedSuggestionInfo) {\n\t\t\tthis._updateOperation.clear();\n\t\t}\n\t}\n\n\tpublic cancelUpdate(): void {\n\t\tthis._updateOperation.clear();\n\t}\n}\n\nclass UpdateRequest {\n\tconstructor(\n\t\tpublic readonly position: Position,\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly versionId: number,\n\t\tpublic readonly providers: Set<InlineCompletionsProvider>,\n\t) {\n\t}\n\n\tpublic satisfies(other: UpdateRequest): boolean {\n\t\treturn this.position.equals(other.position)\n\t\t\t&& equalsIfDefined(this.context.selectedSuggestionInfo, other.context.selectedSuggestionInfo, thisEqualsC())\n\t\t\t&& (other.context.triggerKind === InlineCompletionTriggerKind.Automatic\n\t\t\t\t|| this.context.triggerKind === InlineCompletionTriggerKind.Explicit)\n\t\t\t&& this.versionId === other.versionId\n\t\t\t&& isSubset(other.providers, this.providers);\n\t}\n}\n\nclass RequestResponseData {\n\tpublic requestUuid: string | undefined;\n\tpublic noSuggestionReason: string | undefined;\n\tpublic hasProducedSuggestion = false;\n\n\tconstructor(\n\t\tpublic readonly context: InlineCompletionContextWithoutUuid,\n\t\tpublic readonly requestInfo: InlineSuggestRequestInfo,\n\t\tpublic readonly providers: InlineCompletionsProvider[],\n\t) { }\n\n\tsetRequestUuid(uuid: string) {\n\t\tthis.requestUuid = uuid;\n\t}\n\n\tsetNoSuggestionReasonIfNotSet(type: string) {\n\t\tthis.noSuggestionReason ??= type;\n\t}\n\n\tsetHasProducedSuggestion() {\n\t\tthis.hasProducedSuggestion = true;\n\t}\n}\n\nfunction isSubset<T>(set1: Set<T>, set2: Set<T>): boolean {\n\treturn [...set1].every(item => set2.has(item));\n}\n\nfunction isCompletionsEnabled(completionsEnablementObject: Record<string, boolean> | undefined, modeId: string = '*'): boolean {\n\tif (completionsEnablementObject === undefined) {\n\t\treturn false; // default to disabled if setting is not available\n\t}\n\n\tif (typeof completionsEnablementObject[modeId] !== 'undefined') {\n\t\treturn Boolean(completionsEnablementObject[modeId]); // go with setting if explicitly defined\n\t}\n\n\treturn Boolean(completionsEnablementObject['*']); // fallback to global setting otherwise\n}\n\nclass UpdateOperation implements IDisposable {\n\tconstructor(\n\t\tpublic readonly request: UpdateRequest,\n\t\tpublic readonly cancellationTokenSource: CancellationTokenSource,\n\t\tpublic readonly promise: Promise<boolean>,\n\t) {\n\t}\n\n\tdispose() {\n\t\tthis.cancellationTokenSource.cancel();\n\t}\n}\n\nclass InlineCompletionsState extends Disposable {\n\tpublic static createEmpty(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState([], undefined);\n\t}\n\n\tconstructor(\n\t\tpublic readonly inlineCompletions: readonly InlineSuggestionItem[],\n\t\tpublic readonly request: UpdateRequest | undefined,\n\t) {\n\t\tfor (const inlineCompletion of inlineCompletions) {\n\t\t\tinlineCompletion.addRef();\n\t\t}\n\n\t\tsuper();\n\n\t\tthis._register({\n\t\t\tdispose: () => {\n\t\t\t\tfor (const inlineCompletion of this.inlineCompletions) {\n\t\t\t\t\tinlineCompletion.removeRef();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _findById(id: InlineSuggestionIdentity): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.identity === id);\n\t}\n\n\tprivate _findByHash(hash: string): InlineSuggestionItem | undefined {\n\t\treturn this.inlineCompletions.find(i => i.hash === hash);\n\t}\n\n\t/**\n\t * Applies the edit on the state.\n\t*/\n\tpublic createStateWithAppliedEdit(edit: StringEdit, textModel: ITextModel): InlineCompletionsState {\n\t\tconst newInlineCompletions = this.inlineCompletions.map(i => i.withEdit(edit, textModel)).filter(isDefined);\n\t\treturn new InlineCompletionsState(newInlineCompletions, this.request);\n\t}\n\n\tpublic createStateWithAppliedResults(updatedSuggestions: InlineSuggestionItem[], request: UpdateRequest, textModel: ITextModel, cursorPosition: Position, itemIdToPreserveAtTop: InlineSuggestionIdentity | undefined): InlineCompletionsState {\n\t\tlet itemToPreserve: InlineSuggestionItem | undefined = undefined;\n\t\tif (itemIdToPreserveAtTop) {\n\t\t\tconst itemToPreserveCandidate = this._findById(itemIdToPreserveAtTop);\n\t\t\tif (itemToPreserveCandidate && itemToPreserveCandidate.canBeReused(textModel, request.position)) {\n\t\t\t\titemToPreserve = itemToPreserveCandidate;\n\n\t\t\t\tconst updatedItemToPreserve = updatedSuggestions.find(i => i.hash === itemToPreserveCandidate.hash);\n\t\t\t\tif (updatedItemToPreserve) {\n\t\t\t\t\tupdatedSuggestions = moveToFront(updatedItemToPreserve, updatedSuggestions);\n\t\t\t\t} else {\n\t\t\t\t\tupdatedSuggestions = [itemToPreserveCandidate, ...updatedSuggestions];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst preferInlineCompletions = itemToPreserve\n\t\t\t// itemToPreserve has precedence\n\t\t\t? !itemToPreserve.isInlineEdit\n\t\t\t// Otherwise: prefer inline completion if there is a visible one\n\t\t\t: updatedSuggestions.some(i => !i.isInlineEdit && i.isVisible(textModel, cursorPosition));\n\n\t\tlet updatedItems: InlineSuggestionItem[] = [];\n\t\tfor (const i of updatedSuggestions) {\n\t\t\tconst oldItem = this._findByHash(i.hash);\n\t\t\tlet item;\n\t\t\tif (oldItem && oldItem !== i) {\n\t\t\t\titem = i.withIdentity(oldItem.identity);\n\t\t\t\ti.setIsPreceeded(oldItem);\n\t\t\t\toldItem.setEndOfLifeReason({ kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: i.getSourceCompletion() });\n\t\t\t} else {\n\t\t\t\titem = i;\n\t\t\t}\n\t\t\tif (preferInlineCompletions !== item.isInlineEdit) {\n\t\t\t\tupdatedItems.push(item);\n\t\t\t}\n\t\t}\n\n\t\tupdatedItems.sort(compareBy(i => i.showInlineEditMenu, booleanComparator));\n\t\tupdatedItems = distinctByKey(updatedItems, i => i.semanticId);\n\n\t\treturn new InlineCompletionsState(updatedItems, request);\n\t}\n\n\tpublic clone(): InlineCompletionsState {\n\t\treturn new InlineCompletionsState(this.inlineCompletions, this.request);\n\t}\n}\n\n/** Keeps the first item in case of duplicates. */\nfunction distinctByKey<T>(items: T[], key: (item: T) => unknown): T[] {\n\tconst seen = new Set();\n\treturn items.filter(item => {\n\t\tconst k = key(item);\n\t\tif (seen.has(k)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(k);\n\t\treturn true;\n\t});\n}\n\nfunction moveToFront<T>(item: T, items: T[]): T[] {\n\tconst index = items.indexOf(item);\n\tif (index > -1) {\n\t\treturn [item, ...items.slice(0, index), ...items.slice(index + 1)];\n\t}\n\treturn items;\n}\n"]}