@vscode/chat-lib 0.3.1-9 → 0.4.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/src/_internal/extension/byok/node/openAIEndpoint.d.ts +1 -6
  2. package/dist/src/_internal/extension/byok/node/openAIEndpoint.d.ts.map +1 -1
  3. package/dist/src/_internal/extension/byok/node/openAIEndpoint.js +9 -20
  4. package/dist/src/_internal/extension/byok/node/openAIEndpoint.js.map +1 -1
  5. package/dist/src/_internal/extension/common/constants.d.ts +0 -1
  6. package/dist/src/_internal/extension/common/constants.d.ts.map +1 -1
  7. package/dist/src/_internal/extension/common/constants.js +2 -1
  8. package/dist/src/_internal/extension/common/constants.js.map +1 -1
  9. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/completionsFromNetwork.d.ts +4 -2
  10. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/completionsFromNetwork.d.ts.map +1 -1
  11. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/completionsFromNetwork.js +38 -5
  12. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/completionsFromNetwork.js.map +1 -1
  13. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/ghostText.d.ts +0 -1
  14. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/ghostText.d.ts.map +1 -1
  15. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/ghostText.js +13 -13
  16. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/ghostText/ghostText.js.map +1 -1
  17. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.d.ts +1 -1
  18. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.d.ts.map +1 -1
  19. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js +205 -122
  20. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js.map +1 -1
  21. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/components/currentFile.d.ts.map +1 -1
  22. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/components/currentFile.js +15 -7
  23. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/components/currentFile.js.map +1 -1
  24. package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.d.ts +52 -8
  25. package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.d.ts.map +1 -1
  26. package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.js +208 -41
  27. package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.js.map +1 -1
  28. package/dist/src/_internal/extension/inlineEdits/node/nesConfigs.d.ts +1 -0
  29. package/dist/src/_internal/extension/inlineEdits/node/nesConfigs.d.ts.map +1 -1
  30. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts +14 -4
  31. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts.map +1 -1
  32. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js +46 -30
  33. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js.map +1 -1
  34. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts +24 -3
  35. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts.map +1 -1
  36. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js +471 -128
  37. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js.map +1 -1
  38. package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.d.ts.map +1 -1
  39. package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.js +5 -1
  40. package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.js.map +1 -1
  41. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts +0 -4
  42. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts.map +1 -1
  43. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.js.map +1 -1
  44. package/dist/src/_internal/extension/power/common/powerService.d.ts +22 -0
  45. package/dist/src/_internal/extension/power/common/powerService.d.ts.map +1 -0
  46. package/dist/src/_internal/extension/power/common/powerService.js +20 -0
  47. package/dist/src/_internal/extension/power/common/powerService.js.map +1 -0
  48. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts +6 -2
  49. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
  50. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +32 -8
  51. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
  52. package/dist/src/_internal/extension/xtab/common/diffHistoryForPrompt.d.ts +6 -0
  53. package/dist/src/_internal/extension/xtab/common/diffHistoryForPrompt.d.ts.map +1 -0
  54. package/dist/src/_internal/extension/xtab/common/diffHistoryForPrompt.js +89 -0
  55. package/dist/src/_internal/extension/xtab/common/diffHistoryForPrompt.js.map +1 -0
  56. package/dist/src/_internal/extension/xtab/common/lintErrors.d.ts +4 -4
  57. package/dist/src/_internal/extension/xtab/common/lintErrors.d.ts.map +1 -1
  58. package/dist/src/_internal/extension/xtab/common/lintErrors.js +70 -26
  59. package/dist/src/_internal/extension/xtab/common/lintErrors.js.map +1 -1
  60. package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts +13022 -364
  61. package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts.map +1 -1
  62. package/dist/src/_internal/extension/xtab/common/promptCrafting.js +14 -233
  63. package/dist/src/_internal/extension/xtab/common/promptCrafting.js.map +1 -1
  64. package/dist/src/_internal/extension/xtab/common/promptCraftingUtils.d.ts +4 -0
  65. package/dist/src/_internal/extension/xtab/common/promptCraftingUtils.d.ts.map +1 -0
  66. package/dist/src/_internal/extension/xtab/common/promptCraftingUtils.js +22 -0
  67. package/dist/src/_internal/extension/xtab/common/promptCraftingUtils.js.map +1 -0
  68. package/dist/src/_internal/extension/xtab/common/recentFilesForPrompt.d.ts +41 -0
  69. package/dist/src/_internal/extension/xtab/common/recentFilesForPrompt.d.ts.map +1 -0
  70. package/dist/src/_internal/extension/xtab/common/recentFilesForPrompt.js +375 -0
  71. package/dist/src/_internal/extension/xtab/common/recentFilesForPrompt.js.map +1 -0
  72. package/dist/src/_internal/extension/xtab/common/terminalOutput.d.ts +20 -0
  73. package/dist/src/_internal/extension/xtab/common/terminalOutput.d.ts.map +1 -0
  74. package/dist/src/_internal/extension/xtab/common/terminalOutput.js +105 -0
  75. package/dist/src/_internal/extension/xtab/common/terminalOutput.js.map +1 -0
  76. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts +2 -3
  77. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts.map +1 -1
  78. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js +2 -1
  79. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js.map +1 -1
  80. package/dist/src/_internal/extension/xtab/node/xtabEndpoint.d.ts.map +1 -1
  81. package/dist/src/_internal/extension/xtab/node/xtabEndpoint.js +1 -1
  82. package/dist/src/_internal/extension/xtab/node/xtabEndpoint.js.map +1 -1
  83. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.d.ts.map +1 -1
  84. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js +2 -1
  85. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js.map +1 -1
  86. package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts +52 -9
  87. package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
  88. package/dist/src/_internal/extension/xtab/node/xtabProvider.js +358 -155
  89. package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
  90. package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts +1 -4
  91. package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts.map +1 -1
  92. package/dist/src/_internal/extension/xtab/node/xtabUtils.js +21 -39
  93. package/dist/src/_internal/extension/xtab/node/xtabUtils.js.map +1 -1
  94. package/dist/src/_internal/platform/chat/common/commonTypes.d.ts +2 -2
  95. package/dist/src/_internal/platform/chat/common/commonTypes.d.ts.map +1 -1
  96. package/dist/src/_internal/platform/chat/common/commonTypes.js +8 -8
  97. package/dist/src/_internal/platform/chat/common/commonTypes.js.map +1 -1
  98. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +39 -5
  99. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
  100. package/dist/src/_internal/platform/configuration/common/configurationService.js +40 -8
  101. package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
  102. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts +1 -0
  103. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts.map +1 -1
  104. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js +8 -3
  105. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js.map +1 -1
  106. package/dist/src/_internal/platform/endpoint/common/compactionDataContainer.d.ts +17 -0
  107. package/dist/src/_internal/platform/endpoint/common/compactionDataContainer.d.ts.map +1 -0
  108. package/dist/src/_internal/platform/endpoint/common/compactionDataContainer.js +37 -0
  109. package/dist/src/_internal/platform/endpoint/common/compactionDataContainer.js.map +1 -0
  110. package/dist/src/_internal/platform/endpoint/common/endpointProvider.d.ts +9 -5
  111. package/dist/src/_internal/platform/endpoint/common/endpointProvider.d.ts.map +1 -1
  112. package/dist/src/_internal/platform/endpoint/common/endpointProvider.js.map +1 -1
  113. package/dist/src/_internal/platform/endpoint/common/endpointTypes.d.ts +1 -0
  114. package/dist/src/_internal/platform/endpoint/common/endpointTypes.d.ts.map +1 -1
  115. package/dist/src/_internal/platform/endpoint/common/endpointTypes.js +1 -0
  116. package/dist/src/_internal/platform/endpoint/common/endpointTypes.js.map +1 -1
  117. package/dist/src/_internal/platform/endpoint/common/phaseDataContainer.d.ts +16 -0
  118. package/dist/src/_internal/platform/endpoint/common/phaseDataContainer.d.ts.map +1 -0
  119. package/dist/src/_internal/platform/endpoint/common/phaseDataContainer.js +37 -0
  120. package/dist/src/_internal/platform/endpoint/common/phaseDataContainer.js.map +1 -0
  121. package/dist/src/_internal/platform/endpoint/node/autoChatEndpoint.js +1 -1
  122. package/dist/src/_internal/platform/endpoint/node/autoChatEndpoint.js.map +1 -1
  123. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts +6 -13
  124. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts.map +1 -1
  125. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js +18 -53
  126. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js.map +1 -1
  127. package/dist/src/_internal/platform/endpoint/node/copilotChatEndpoint.d.ts.map +1 -1
  128. package/dist/src/_internal/platform/endpoint/node/copilotChatEndpoint.js +1 -1
  129. package/dist/src/_internal/platform/endpoint/node/copilotChatEndpoint.js.map +1 -1
  130. package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
  131. package/dist/src/_internal/platform/endpoint/node/messagesApi.js +68 -28
  132. package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
  133. package/dist/src/_internal/platform/endpoint/node/responsesApi.d.ts.map +1 -1
  134. package/dist/src/_internal/platform/endpoint/node/responsesApi.js +81 -4
  135. package/dist/src/_internal/platform/endpoint/node/responsesApi.js.map +1 -1
  136. package/dist/src/_internal/platform/env/common/envService.d.ts +6 -0
  137. package/dist/src/_internal/platform/env/common/envService.d.ts.map +1 -1
  138. package/dist/src/_internal/platform/env/common/envService.js.map +1 -1
  139. package/dist/src/_internal/platform/env/common/nullEnvService.d.ts +3 -0
  140. package/dist/src/_internal/platform/env/common/nullEnvService.d.ts.map +1 -1
  141. package/dist/src/_internal/platform/env/common/nullEnvService.js +4 -0
  142. package/dist/src/_internal/platform/env/common/nullEnvService.js.map +1 -1
  143. package/dist/src/_internal/platform/github/common/githubAPI.d.ts +1 -1
  144. package/dist/src/_internal/platform/github/common/githubAPI.d.ts.map +1 -1
  145. package/dist/src/_internal/platform/github/common/githubAPI.js +4 -2
  146. package/dist/src/_internal/platform/github/common/githubAPI.js.map +1 -1
  147. package/dist/src/_internal/platform/github/common/githubService.d.ts +2 -0
  148. package/dist/src/_internal/platform/github/common/githubService.d.ts.map +1 -1
  149. package/dist/src/_internal/platform/github/common/githubService.js +3 -3
  150. package/dist/src/_internal/platform/github/common/githubService.js.map +1 -1
  151. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabHistoryOptions.d.ts +9 -0
  152. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabHistoryOptions.d.ts.map +1 -0
  153. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabHistoryOptions.js +18 -0
  154. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabHistoryOptions.js.map +1 -0
  155. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts +103 -2
  156. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts.map +1 -1
  157. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js +231 -1
  158. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js.map +1 -1
  159. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts +11 -5
  160. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts.map +1 -1
  161. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js +33 -18
  162. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js.map +1 -1
  163. package/dist/src/_internal/platform/inlineEdits/common/inlineEditsModelService.d.ts +2 -0
  164. package/dist/src/_internal/platform/inlineEdits/common/inlineEditsModelService.d.ts.map +1 -1
  165. package/dist/src/_internal/platform/inlineEdits/common/inlineEditsModelService.js +4 -0
  166. package/dist/src/_internal/platform/inlineEdits/common/inlineEditsModelService.js.map +1 -1
  167. package/dist/src/_internal/platform/inlineEdits/common/responseProcessor.d.ts +1 -2
  168. package/dist/src/_internal/platform/inlineEdits/common/responseProcessor.d.ts.map +1 -1
  169. package/dist/src/_internal/platform/inlineEdits/common/responseProcessor.js +13 -0
  170. package/dist/src/_internal/platform/inlineEdits/common/responseProcessor.js.map +1 -1
  171. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts +34 -10
  172. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts.map +1 -1
  173. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js +38 -6
  174. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js.map +1 -1
  175. package/dist/src/_internal/platform/inlineEdits/common/workspaceEditTracker/nesXtabHistoryTracker.d.ts +41 -2
  176. package/dist/src/_internal/platform/inlineEdits/common/workspaceEditTracker/nesXtabHistoryTracker.d.ts.map +1 -1
  177. package/dist/src/_internal/platform/inlineEdits/common/workspaceEditTracker/nesXtabHistoryTracker.js +90 -8
  178. package/dist/src/_internal/platform/inlineEdits/common/workspaceEditTracker/nesXtabHistoryTracker.js.map +1 -1
  179. package/dist/src/_internal/platform/inlineEdits/node/inlineEditsModelService.d.ts +9 -2
  180. package/dist/src/_internal/platform/inlineEdits/node/inlineEditsModelService.d.ts.map +1 -1
  181. package/dist/src/_internal/platform/inlineEdits/node/inlineEditsModelService.js +65 -54
  182. package/dist/src/_internal/platform/inlineEdits/node/inlineEditsModelService.js.map +1 -1
  183. package/dist/src/_internal/platform/log/common/logService.d.ts +30 -0
  184. package/dist/src/_internal/platform/log/common/logService.d.ts.map +1 -1
  185. package/dist/src/_internal/platform/log/common/logService.js.map +1 -1
  186. package/dist/src/_internal/platform/nesFetch/node/completionsFetchServiceImpl.d.ts +5 -1
  187. package/dist/src/_internal/platform/nesFetch/node/completionsFetchServiceImpl.d.ts.map +1 -1
  188. package/dist/src/_internal/platform/nesFetch/node/completionsFetchServiceImpl.js +121 -6
  189. package/dist/src/_internal/platform/nesFetch/node/completionsFetchServiceImpl.js.map +1 -1
  190. package/dist/src/_internal/platform/nesFetch/node/streamTransformer.d.ts +1 -4
  191. package/dist/src/_internal/platform/nesFetch/node/streamTransformer.d.ts.map +1 -1
  192. package/dist/src/_internal/platform/nesFetch/node/streamTransformer.js +1 -21
  193. package/dist/src/_internal/platform/nesFetch/node/streamTransformer.js.map +1 -1
  194. package/dist/src/_internal/platform/networking/common/anthropic.d.ts +16 -1
  195. package/dist/src/_internal/platform/networking/common/anthropic.d.ts.map +1 -1
  196. package/dist/src/_internal/platform/networking/common/anthropic.js +37 -4
  197. package/dist/src/_internal/platform/networking/common/anthropic.js.map +1 -1
  198. package/dist/src/_internal/platform/networking/common/fetch.d.ts +5 -2
  199. package/dist/src/_internal/platform/networking/common/fetch.d.ts.map +1 -1
  200. package/dist/src/_internal/platform/networking/common/fetch.js +9 -0
  201. package/dist/src/_internal/platform/networking/common/fetch.js.map +1 -1
  202. package/dist/src/_internal/platform/networking/common/fetcherService.d.ts +1 -0
  203. package/dist/src/_internal/platform/networking/common/fetcherService.d.ts.map +1 -1
  204. package/dist/src/_internal/platform/networking/common/fetcherService.js.map +1 -1
  205. package/dist/src/_internal/platform/networking/common/networking.d.ts +17 -15
  206. package/dist/src/_internal/platform/networking/common/networking.d.ts.map +1 -1
  207. package/dist/src/_internal/platform/networking/common/networking.js +5 -4
  208. package/dist/src/_internal/platform/networking/common/networking.js.map +1 -1
  209. package/dist/src/_internal/platform/networking/common/openai.d.ts +11 -0
  210. package/dist/src/_internal/platform/networking/common/openai.d.ts.map +1 -1
  211. package/dist/src/_internal/platform/networking/common/openai.js +3 -1
  212. package/dist/src/_internal/platform/networking/common/openai.js.map +1 -1
  213. package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts +35 -1
  214. package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts.map +1 -1
  215. package/dist/src/_internal/platform/requestLogger/common/capturingToken.js +21 -1
  216. package/dist/src/_internal/platform/requestLogger/common/capturingToken.js.map +1 -1
  217. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +35 -0
  218. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts.map +1 -1
  219. package/dist/src/_internal/platform/requestLogger/node/requestLogger.js +54 -1
  220. package/dist/src/_internal/platform/requestLogger/node/requestLogger.js.map +1 -1
  221. package/dist/src/_internal/platform/telemetry/common/telemetry.d.ts +2 -0
  222. package/dist/src/_internal/platform/telemetry/common/telemetry.d.ts.map +1 -1
  223. package/dist/src/_internal/platform/telemetry/common/telemetry.js +1 -0
  224. package/dist/src/_internal/platform/telemetry/common/telemetry.js.map +1 -1
  225. package/dist/src/_internal/platform/telemetry/common/telemetryData.d.ts.map +1 -1
  226. package/dist/src/_internal/platform/telemetry/common/telemetryData.js +3 -0
  227. package/dist/src/_internal/platform/telemetry/common/telemetryData.js.map +1 -1
  228. package/dist/src/_internal/platform/terminal/common/terminalService.d.ts +111 -0
  229. package/dist/src/_internal/platform/terminal/common/terminalService.d.ts.map +1 -0
  230. package/dist/src/_internal/platform/terminal/common/terminalService.js +83 -0
  231. package/dist/src/_internal/platform/terminal/common/terminalService.js.map +1 -0
  232. package/dist/src/_internal/util/common/arrays.d.ts +5 -0
  233. package/dist/src/_internal/util/common/arrays.d.ts.map +1 -1
  234. package/dist/src/_internal/util/common/arrays.js +10 -0
  235. package/dist/src/_internal/util/common/arrays.js.map +1 -1
  236. package/dist/src/_internal/util/common/asyncIterableUtils.d.ts +17 -0
  237. package/dist/src/_internal/util/common/asyncIterableUtils.d.ts.map +1 -0
  238. package/dist/src/_internal/util/common/asyncIterableUtils.js +94 -0
  239. package/dist/src/_internal/util/common/asyncIterableUtils.js.map +1 -0
  240. package/dist/src/_internal/util/common/result.d.ts +34 -10
  241. package/dist/src/_internal/util/common/result.d.ts.map +1 -1
  242. package/dist/src/_internal/util/common/result.js +91 -2
  243. package/dist/src/_internal/util/common/result.js.map +1 -1
  244. package/dist/src/_internal/util/common/test/shims/chatTypes.d.ts +27 -3
  245. package/dist/src/_internal/util/common/test/shims/chatTypes.d.ts.map +1 -1
  246. package/dist/src/_internal/util/common/test/shims/chatTypes.js +36 -5
  247. package/dist/src/_internal/util/common/test/shims/chatTypes.js.map +1 -1
  248. package/dist/src/_internal/util/common/test/shims/themes.d.ts +13 -0
  249. package/dist/src/_internal/util/common/test/shims/themes.d.ts.map +1 -0
  250. package/dist/src/_internal/util/common/test/shims/themes.js +27 -0
  251. package/dist/src/_internal/util/common/test/shims/themes.js.map +1 -0
  252. package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.d.ts.map +1 -1
  253. package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.js +5 -1
  254. package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.js.map +1 -1
  255. package/dist/src/_internal/util/vs/base/common/mime.d.ts.map +1 -1
  256. package/dist/src/_internal/util/vs/base/common/mime.js +7 -5
  257. package/dist/src/_internal/util/vs/base/common/mime.js.map +1 -1
  258. package/dist/src/_internal/vscodeTypes.d.ts +4 -0
  259. package/dist/src/_internal/vscodeTypes.d.ts.map +1 -1
  260. package/dist/src/_internal/vscodeTypes.js +6 -2
  261. package/dist/src/_internal/vscodeTypes.js.map +1 -1
  262. package/dist/src/main.d.ts +4 -1
  263. package/dist/src/main.d.ts.map +1 -1
  264. package/dist/src/main.js +10 -1
  265. package/dist/src/main.js.map +1 -1
  266. package/dist/src/package.json +560 -207
  267. package/package.json +2 -2
@@ -47,7 +47,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
47
47
  };
48
48
  var XtabProvider_1;
49
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
- exports.XtabProvider = void 0;
50
+ exports.EditIntentParseMode = exports.XtabProvider = void 0;
51
+ exports.computeAreaAroundEditWindowLinesRange = computeAreaAroundEditWindowLinesRange;
52
+ exports.mapChatFetcherErrorToNoNextEditReason = mapChatFetcherErrorToNoNextEditReason;
53
+ exports.overrideModelConfig = overrideModelConfig;
54
+ exports.pickSystemPrompt = pickSystemPrompt;
55
+ exports.determineLanguageContextOptions = determineLanguageContextOptions;
56
+ exports.getPredictionContents = getPredictionContents;
57
+ exports.parseEditIntentFromStream = parseEditIntentFromStream;
51
58
  exports.findMergeConflictMarkersRange = findMergeConflictMarkersRange;
52
59
  const chatMLFetcher_1 = require("../../../platform/chat/common/chatMLFetcher");
53
60
  const commonTypes_1 = require("../../../platform/chat/common/commonTypes");
@@ -69,6 +76,7 @@ const simulationTestContext_1 = require("../../../platform/simulationTestContext
69
76
  const nullExperimentationService_1 = require("../../../platform/telemetry/common/nullExperimentationService");
70
77
  const workspaceService_1 = require("../../../platform/workspace/common/workspaceService");
71
78
  const async_1 = require("../../../util/common/async");
79
+ const asyncIterableUtils_1 = require("../../../util/common/asyncIterableUtils");
72
80
  const errors = __importStar(require("../../../util/common/errors"));
73
81
  const result_1 = require("../../../util/common/result");
74
82
  const assert_1 = require("../../../util/vs/base/common/assert");
@@ -87,8 +95,10 @@ const importFiltering_1 = require("../../inlineEdits/node/importFiltering");
87
95
  const inlineSuggestion_1 = require("../common/inlineSuggestion");
88
96
  const lintErrors_1 = require("../common/lintErrors");
89
97
  const promptCrafting_1 = require("../common/promptCrafting");
98
+ const promptCraftingUtils_1 = require("../common/promptCraftingUtils");
90
99
  const systemMessages_1 = require("../common/systemMessages");
91
100
  const tags_1 = require("../common/tags");
101
+ const terminalOutput_1 = require("../common/terminalOutput");
92
102
  const xtabCurrentDocument_1 = require("../common/xtabCurrentDocument");
93
103
  const xtabCustomDiffPatchResponseHandler_1 = require("./xtabCustomDiffPatchResponseHandler");
94
104
  const xtabEndpoint_1 = require("./xtabEndpoint");
@@ -123,9 +133,9 @@ let XtabProvider = class XtabProvider {
123
133
  this.langDiagService = langDiagService;
124
134
  this.ignoreService = ignoreService;
125
135
  this.ID = XtabProvider_1.ID;
126
- this.showNextEditPreference = "always" /* ShowNextEditPreference.Always */;
127
136
  this.forceUseDefaultModel = false;
128
- this.userInteractionMonitor = new userInteractionMonitor_1.UserInteractionMonitor(this.configService, this.expService);
137
+ this.userInteractionMonitor = this.instaService.createInstance(userInteractionMonitor_1.UserInteractionMonitor);
138
+ this.terminalMonitor = this.instaService.createInstance(terminalOutput_1.TerminalMonitor);
129
139
  this.nextCursorPredictor = this.instaService.createInstance(xtabNextCursorPredictor_1.XtabNextCursorPredictor, XtabProvider_1.computeTokens);
130
140
  }
131
141
  handleAcceptance() {
@@ -134,46 +144,34 @@ let XtabProvider = class XtabProvider {
134
144
  handleRejection() {
135
145
  this.userInteractionMonitor.handleRejection();
136
146
  }
137
- async provideNextEdit(request, pushEdit, logger, logContext, cancellationToken) {
138
- const telemetry = new statelessNextEditProvider_1.StatelessNextEditTelemetryBuilder(request);
147
+ handleIgnored() {
148
+ this.userInteractionMonitor.handleIgnored();
149
+ }
150
+ async *provideNextEdit(request, logger, logContext, cancellationToken) {
151
+ const telemetry = new statelessNextEditProvider_1.StatelessNextEditTelemetryBuilder(request.headerRequestId);
139
152
  logContext.setProviderStartTime();
140
153
  try {
141
154
  if (request.xtabEditHistory.length === 0) {
142
- return statelessNextEditProvider_1.StatelessNextEditResult.noEdit(new statelessNextEditProvider_1.NoNextEditReason.ActiveDocumentHasNoEdits(), telemetry);
155
+ const noSuggestionReason = new statelessNextEditProvider_1.NoNextEditReason.ActiveDocumentHasNoEdits();
156
+ return new statelessNextEditProvider_1.WithStatelessProviderTelemetry(noSuggestionReason, telemetry.build(result_1.Result.error(noSuggestionReason)));
143
157
  }
144
158
  const delaySession = this.userInteractionMonitor.createDelaySession(request.providerRequestStartDateTime);
145
159
  const iterator = this.doGetNextEdit(request, delaySession, logger, logContext, cancellationToken, telemetry, RetryState.NotRetrying.INSTANCE);
146
160
  let res = await iterator.next(); // for-async-await loop doesn't work because we need to access the final return value
147
- let nextEditResult;
148
- if (res.done) {
149
- // stream already ended, so we can just return the final reason
150
- nextEditResult = result_1.Result.error(res.value);
151
- pushEdit(nextEditResult);
161
+ while (!res.done) {
162
+ yield new statelessNextEditProvider_1.WithStatelessProviderTelemetry(res.value, telemetry.build(result_1.Result.ok(undefined)));
163
+ res = await iterator.next();
152
164
  }
153
- else {
154
- // stream is not done yet, so we push the first edit and then continue streaming in the background
155
- nextEditResult = result_1.Result.ok(undefined);
156
- (async () => {
157
- let nEdits = 0;
158
- while (!res.done) {
159
- nEdits++;
160
- pushEdit(result_1.Result.ok(res.value));
161
- res = await iterator.next();
162
- }
163
- pushEdit(result_1.Result.error(res.value));
164
- })().catch((err) => {
165
- const error = errors.fromUnknown(err);
166
- logContext.addLog(`Error while streaming further edits: ${errors.fromUnknown(err)}`);
167
- pushEdit(result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.Unexpected(error)));
168
- });
169
- }
170
- if (nextEditResult.isError() && nextEditResult.err instanceof statelessNextEditProvider_1.NoNextEditReason.GotCancelled) {
165
+ const noNextEditReason = res.value;
166
+ if (noNextEditReason instanceof statelessNextEditProvider_1.NoNextEditReason.GotCancelled) {
171
167
  logContext.setIsSkipped();
172
168
  }
173
- return new statelessNextEditProvider_1.StatelessNextEditResult(nextEditResult, telemetry.build(nextEditResult));
169
+ return new statelessNextEditProvider_1.WithStatelessProviderTelemetry(noNextEditReason, telemetry.build(result_1.Result.error(noNextEditReason)));
174
170
  }
175
171
  catch (err) {
176
- return statelessNextEditProvider_1.StatelessNextEditResult.noEdit(new statelessNextEditProvider_1.NoNextEditReason.Unexpected(errors.fromUnknown(err)), telemetry);
172
+ const error = errors.fromUnknown(err);
173
+ const noSuggestionReason = new statelessNextEditProvider_1.NoNextEditReason.Unexpected(error);
174
+ return new statelessNextEditProvider_1.WithStatelessProviderTelemetry(noSuggestionReason, telemetry.build(result_1.Result.error(noSuggestionReason)));
177
175
  }
178
176
  finally {
179
177
  logContext.setProviderEndTime();
@@ -182,7 +180,13 @@ let XtabProvider = class XtabProvider {
182
180
  doGetNextEdit(request, delaySession, logger, logContext, cancellationToken, telemetryBuilder, retryState) {
183
181
  return this.doGetNextEditWithSelection(request, (0, nearbyCursorInlineEditProvider_1.getOrDeduceSelectionFromLastEdit)(request.getActiveDocument()), delaySession, logger, logContext, cancellationToken, telemetryBuilder, retryState);
184
182
  }
185
- async *doGetNextEditWithSelection(request, selection, delaySession, parentTracer, logContext, cancellationToken, telemetryBuilder, retryState) {
183
+ async *doGetNextEditWithSelection(request, selection, delaySession, parentTracer, logContext, cancellationToken, telemetryBuilder, retryState,
184
+ /**
185
+ * For cursor jump scenarios, this is the edit window around the original cursor position
186
+ * (before the jump). When provided, yielded edits will include this as `originalWindow`
187
+ * so the cache can serve the edit when the cursor is in either location.
188
+ */
189
+ originalEditWindow) {
186
190
  const tracer = parentTracer.createSubLogger(['XtabProvider', 'doGetNextEditWithSelection']);
187
191
  const activeDocument = request.getActiveDocument();
188
192
  if (selection === null) {
@@ -213,14 +217,14 @@ let XtabProvider = class XtabProvider {
213
217
  else {
214
218
  tracer.trace('No extra debounce applied');
215
219
  }
216
- const areaAroundEditWindowLinesRange = this.computeAreaAroundEditWindowLinesRange(currentDocument);
220
+ const areaAroundEditWindowLinesRange = computeAreaAroundEditWindowLinesRange(currentDocument);
217
221
  const editWindowLinesRange = this.computeEditWindowLinesRange(currentDocument, request, tracer, telemetryBuilder);
218
222
  const cursorOriginalLinesOffset = Math.max(0, currentDocument.cursorLineOffset - editWindowLinesRange.start);
219
223
  const editWindowLastLineLength = currentDocument.transformer.getLineLength(editWindowLinesRange.endExclusive);
220
224
  const editWindow = currentDocument.transformer.getOffsetRange(new range_1.Range(editWindowLinesRange.start + 1, 1, editWindowLinesRange.endExclusive, editWindowLastLineLength + 1));
221
225
  const editWindowLines = currentDocument.lines.slice(editWindowLinesRange.start, editWindowLinesRange.endExclusive);
222
226
  const editWindowTokenLimit = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabEditWindowMaxTokens, this.expService);
223
- if (editWindowTokenLimit !== undefined && (0, promptCrafting_1.countTokensForLines)(editWindowLines, XtabProvider_1.computeTokens) > editWindowTokenLimit) {
227
+ if (editWindowTokenLimit !== undefined && (0, promptCraftingUtils_1.countTokensForLines)(editWindowLines, XtabProvider_1.computeTokens) > editWindowTokenLimit) {
224
228
  return new statelessNextEditProvider_1.NoNextEditReason.PromptTooLarge('editWindow');
225
229
  }
226
230
  // Expected: editWindow.substring(activeDocument.documentAfterEdits.value) === editWindowLines.join('\n')
@@ -238,8 +242,8 @@ let XtabProvider = class XtabProvider {
238
242
  const { clippedTaggedCurrentDoc, areaAroundCodeToEdit } = taggedCurrentFileContentResult.val;
239
243
  telemetryBuilder.setNLinesOfCurrentFileInPrompt(clippedTaggedCurrentDoc.lines.length);
240
244
  const { aggressivenessLevel, userHappinessScore } = this.userInteractionMonitor.getAggressivenessLevel();
241
- // Log aggressiveness level and user happiness score when using XtabAggressiveness prompting strategy
242
- if (promptOptions.promptingStrategy === xtabPromptOptions_1.PromptingStrategy.XtabAggressiveness) {
245
+ // Log aggressiveness level and user happiness score when using an aggressiveness-aware prompting strategy
246
+ if ((0, xtabPromptOptions_1.isAggressivenessStrategy)(promptOptions.promptingStrategy)) {
243
247
  telemetryBuilder.setXtabAggressivenessLevel(aggressivenessLevel);
244
248
  if (userHappinessScore !== undefined) {
245
249
  telemetryBuilder.setXtabUserHappinessScore(userHappinessScore);
@@ -249,13 +253,13 @@ let XtabProvider = class XtabProvider {
249
253
  if (cancellationToken.isCancellationRequested) {
250
254
  return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterLanguageContextAwait');
251
255
  }
252
- const lintErrors = promptOptions.lintOptions ? new lintErrors_1.LintErrors(promptOptions.lintOptions, activeDocument.id, currentDocument, this.langDiagService) : undefined;
256
+ const lintErrors = new lintErrors_1.LintErrors(activeDocument.id, currentDocument, this.langDiagService);
253
257
  const promptPieces = new promptCrafting_1.PromptPieces(currentDocument, editWindowLinesRange, areaAroundEditWindowLinesRange, activeDocument, request.xtabEditHistory, clippedTaggedCurrentDoc.lines, areaAroundCodeToEdit, langCtx, aggressivenessLevel, lintErrors, XtabProvider_1.computeTokens, promptOptions);
254
258
  const userPrompt = (0, promptCrafting_1.getUserPrompt)(promptPieces);
255
259
  const responseFormat = xtabPromptOptions.ResponseFormat.fromPromptingStrategy(promptOptions.promptingStrategy);
256
260
  const prediction = this.getPredictedOutput(activeDocument, editWindowLines, responseFormat);
257
261
  const messages = (0, xtabUtils_1.constructMessages)({
258
- systemMsg: this.pickSystemPrompt(promptOptions.promptingStrategy),
262
+ systemMsg: pickSystemPrompt(promptOptions.promptingStrategy),
259
263
  userMsg: userPrompt,
260
264
  });
261
265
  logContext.setPrompt(messages);
@@ -269,13 +273,24 @@ let XtabProvider = class XtabProvider {
269
273
  if (cancellationToken.isCancellationRequested) {
270
274
  return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterDebounce');
271
275
  }
276
+ // Fire-and-forget: collect lint errors and terminal output for telemetry in background to avoid blocking the main path
277
+ Promise.resolve().then(() => {
278
+ const lintErrorsData = lintErrors.getData();
279
+ telemetryBuilder.setLintErrors(lintErrorsData);
280
+ logContext.setDiagnosticsData(lintErrorsData);
281
+ const terminalOutputData = this.terminalMonitor.getData();
282
+ telemetryBuilder.setTerminalOutput(terminalOutputData);
283
+ logContext.setTerminalData(terminalOutputData);
284
+ });
272
285
  request.fetchIssued = true;
273
286
  const cursorLineOffset = cursorPosition.column;
274
287
  return yield* this.streamEditsWithFiltering(request, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, editWindowLinesRange, promptPieces, prediction, {
275
288
  shouldRemoveCursorTagFromResponse,
276
289
  responseFormat,
277
290
  retryState,
278
- }, delaySession, tracer, telemetryBuilder, logContext, cancellationToken);
291
+ aggressivenessLevel,
292
+ userHappinessScore,
293
+ }, delaySession, tracer, telemetryBuilder, logContext, cancellationToken, originalEditWindow);
279
294
  }
280
295
  getAndProcessLanguageContext(request, delaySession, activeDocument, cursorPosition, promptOptions, tracer, logContext, cancellationToken) {
281
296
  const recordingEnabled = this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsLogContextRecorderEnabled);
@@ -285,7 +300,6 @@ let XtabProvider = class XtabProvider {
285
300
  const langCtxPromise = this.getLanguageContext(request, delaySession, activeDocument, cursorPosition, tracer, logContext, cancellationToken);
286
301
  // if recording, add diagnostics for the file to the recording and hook up the language context promise to write to the recording
287
302
  if (recordingEnabled) {
288
- logContext.setFileDiagnostics(this.langDiagService.getAllDiagnostics());
289
303
  langCtxPromise.then(langCtxs => {
290
304
  if (langCtxs) {
291
305
  logContext.setLanguageContext(langCtxs);
@@ -310,7 +324,7 @@ let XtabProvider = class XtabProvider {
310
324
  const cursorPositionVscode = new vscodeTypesShim_1.Position(cursorPosition.lineNumber - 1, cursorPosition.column - 1);
311
325
  const ctxRequest = {
312
326
  opportunityId: request.opportunityId,
313
- completionId: request.id,
327
+ completionId: request.headerRequestId,
314
328
  documentContext: {
315
329
  uri: textDoc.uri.toString(),
316
330
  languageId: textDoc.languageId,
@@ -359,9 +373,9 @@ let XtabProvider = class XtabProvider {
359
373
  }
360
374
  }
361
375
  async *streamEditsWithFiltering(request, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, // cursor offset within the line it's in; 1-based
362
- editWindowLineRange, promptPieces, prediction, opts, delaySession, parentTracer, telemetryBuilder, logContext, cancellationToken) {
376
+ editWindowLineRange, promptPieces, prediction, opts, delaySession, parentTracer, telemetryBuilder, logContext, cancellationToken, originalEditWindow) {
363
377
  const tracer = parentTracer.createSubLogger('streamEditsWithFiltering');
364
- const iterator = this.streamEdits(request, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, editWindowLineRange, promptPieces, prediction, opts, delaySession, tracer, telemetryBuilder, logContext, cancellationToken);
378
+ const iterator = this.streamEdits(request, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, editWindowLineRange, promptPieces, prediction, opts, delaySession, tracer, telemetryBuilder, logContext, cancellationToken, originalEditWindow);
365
379
  let nEdits = 0;
366
380
  let r = await iterator.next();
367
381
  while (!r.done) {
@@ -386,7 +400,7 @@ let XtabProvider = class XtabProvider {
386
400
  return r.value;
387
401
  }
388
402
  async *streamEdits(request, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, // cursor offset within the line it's in; 1-based
389
- editWindowLineRange, promptPieces, prediction, opts, delaySession, parentTracer, telemetryBuilder, logContext, cancellationToken) {
403
+ editWindowLineRange, promptPieces, prediction, opts, delaySession, parentTracer, telemetryBuilder, logContext, cancellationToken, originalEditWindow) {
390
404
  const tracer = parentTracer.createSubLogger('streamEdits');
391
405
  const useFetcher = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.NextEditSuggestionsFetcher, this.expService) || undefined;
392
406
  const fetchStreamSource = new chatMLFetcher_1.FetchStreamSource();
@@ -395,6 +409,7 @@ let XtabProvider = class XtabProvider {
395
409
  let chatResponseFailure;
396
410
  let ttft;
397
411
  const firstTokenReceived = new async_2.DeferredPromise();
412
+ logContext.setHeaderRequestId(request.headerRequestId);
398
413
  telemetryBuilder.setFetchStartedAt();
399
414
  logContext.setFetchStartTime();
400
415
  // we must not await this promise because we want to stream edits as they come in
@@ -423,9 +438,13 @@ let XtabProvider = class XtabProvider {
423
438
  },
424
439
  userInitiatedRequest: undefined,
425
440
  telemetryProperties: {
426
- requestId: request.id,
441
+ requestId: request.headerRequestId,
427
442
  },
428
443
  useFetcher,
444
+ customMetadata: {
445
+ aggressivenessLevel: opts.aggressivenessLevel,
446
+ userHappinessScore: opts.userHappinessScore,
447
+ },
429
448
  }, cancellationToken);
430
449
  telemetryBuilder.setResponse(fetchResultPromise.then((response) => ({ response, ttft })));
431
450
  logContext.setFullResponse(fetchResultPromise.then((response) => response.type === commonTypes_1.ChatFetchResponseType.Success ? response.value : undefined));
@@ -437,7 +456,7 @@ let XtabProvider = class XtabProvider {
437
456
  this.forceUseDefaultModel = true;
438
457
  return yield* this.doGetNextEdit(request, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, opts.retryState); // use the same retry state
439
458
  }
440
- return XtabProvider_1.mapChatFetcherErrorToNoNextEditReason(fetchRes);
459
+ return mapChatFetcherErrorToNoNextEditReason(fetchRes);
441
460
  }
442
461
  fetchResultPromise
443
462
  .then((response) => {
@@ -457,26 +476,47 @@ let XtabProvider = class XtabProvider {
457
476
  fetchStreamSource.resolve();
458
477
  logContext.setResponse(responseSoFar);
459
478
  });
460
- const llmLinesStream = (0, xtabUtils_1.toLines)(fetchStreamSource.stream);
479
+ const llmLinesStream = asyncIterableUtils_1.AsyncIterUtilsExt.splitLines(asyncIterableUtils_1.AsyncIterUtils.map(fetchStreamSource.stream, (chunk) => chunk.delta.text));
461
480
  // logging of times
462
481
  // removal of cursor tag if option is set
463
- const linesStream = (() => {
482
+ const linesStream = (async function* () {
464
483
  let i = 0;
465
- return llmLinesStream.map((v) => {
484
+ for await (const v of llmLinesStream) {
466
485
  const trace = `Line ${i++} emitted with latency ${fetchRequestStopWatch.elapsed()} ms`;
467
486
  tracer.trace(trace);
468
- return opts.shouldRemoveCursorTagFromResponse
487
+ yield opts.shouldRemoveCursorTagFromResponse
469
488
  ? v.replaceAll(tags_1.PromptTags.CURSOR, '')
470
489
  : v;
471
- });
490
+ }
472
491
  })();
473
492
  const isFromCursorJump = opts.retryState instanceof RetryState.Retrying && opts.retryState.reason === 'cursorJump';
474
493
  let cleanedLinesStream;
475
494
  if (opts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowOnly) {
476
495
  cleanedLinesStream = linesStream;
477
496
  }
497
+ else if (opts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntent ||
498
+ opts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort) {
499
+ // Determine parse mode based on response format
500
+ const parseMode = opts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort
501
+ ? EditIntentParseMode.ShortName
502
+ : EditIntentParseMode.Tags;
503
+ // Parse the edit_intent from the response
504
+ const { editIntent, remainingLinesStream, parseError } = await parseEditIntentFromStream(linesStream, tracer, parseMode);
505
+ // Log the edit intent for telemetry
506
+ telemetryBuilder.setEditIntent(editIntent);
507
+ // Log parse errors for telemetry - this helps detect malformed model output during flights
508
+ if (parseError) {
509
+ telemetryBuilder.setEditIntentParseError(parseError);
510
+ }
511
+ // Check if we should show this edit based on intent and aggressiveness
512
+ if (!xtabPromptOptions.EditIntent.shouldShowEdit(editIntent, promptPieces.aggressivenessLevel)) {
513
+ tracer.trace(`Filtered out edit due to edit intent "${editIntent}" with aggressiveness "${promptPieces.aggressivenessLevel}"`);
514
+ return new statelessNextEditProvider_1.NoNextEditReason.FilteredOut(`editIntent:${editIntent} aggressivenessLevel:${promptPieces.aggressivenessLevel}`);
515
+ }
516
+ cleanedLinesStream = remainingLinesStream;
517
+ }
478
518
  else if (opts.responseFormat === xtabPromptOptions.ResponseFormat.CustomDiffPatch) {
479
- return yield* xtabCustomDiffPatchResponseHandler_1.XtabCustomDiffPatchResponseHandler.handleResponse(linesStream, request.documentBeforeEdits, editWindow);
519
+ return yield* xtabCustomDiffPatchResponseHandler_1.XtabCustomDiffPatchResponseHandler.handleResponse(linesStream, request.documentBeforeEdits, editWindow, originalEditWindow);
480
520
  }
481
521
  else if (opts.responseFormat === xtabPromptOptions.ResponseFormat.UnifiedWithXml) {
482
522
  const linesIter = linesStream[Symbol.asyncIterator]();
@@ -497,7 +537,7 @@ let XtabProvider = class XtabProvider {
497
537
  return new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow);
498
538
  }
499
539
  const edit = new lineEdit_1.LineReplacement(new lineRange_1.LineRange(editWindowLineRange.start + cursorOriginalLinesOffset + 1 /* 0-based to 1-based */, editWindowLineRange.start + cursorOriginalLinesOffset + 2), [editWindowLines[cursorOriginalLinesOffset].slice(0, cursorLineOffset - 1) + lineWithCursorContinued.value + editWindowLines[cursorOriginalLinesOffset].slice(cursorLineOffset - 1)]);
500
- yield { edit, isFromCursorJump, window: editWindow };
540
+ yield { edit, isFromCursorJump, window: editWindow, originalWindow: originalEditWindow };
501
541
  const lines = [];
502
542
  let v = await linesIter.next();
503
543
  while (!v.done) {
@@ -513,21 +553,22 @@ let XtabProvider = class XtabProvider {
513
553
  yield {
514
554
  edit: new lineEdit_1.LineReplacement(new lineRange_1.LineRange(line, line), lines),
515
555
  isFromCursorJump,
516
- window: editWindow
556
+ window: editWindow,
557
+ originalWindow: originalEditWindow
517
558
  };
518
559
  return new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow);
519
560
  }
520
561
  if (trimmedLines === tags_1.ResponseTags.EDIT.start) {
521
- cleanedLinesStream = new async_2.AsyncIterableObject(async (emitter) => {
562
+ cleanedLinesStream = (async function* () {
522
563
  let v = await linesIter.next();
523
564
  while (!v.done) {
524
565
  if (v.value.includes(tags_1.ResponseTags.EDIT.end)) {
525
566
  return;
526
567
  }
527
- emitter.emitOne(v.value);
568
+ yield v.value;
528
569
  v = await linesIter.next();
529
570
  }
530
- });
571
+ })();
531
572
  }
532
573
  else {
533
574
  return new statelessNextEditProvider_1.NoNextEditReason.Unexpected(new Error(`unexpected tag ${trimmedLines}`));
@@ -589,12 +630,12 @@ let XtabProvider = class XtabProvider {
589
630
  }
590
631
  }
591
632
  }
592
- yield { edit: singleLineEdit, isFromCursorJump, window: editWindow };
633
+ yield { edit: singleLineEdit, isFromCursorJump, window: editWindow, originalWindow: originalEditWindow };
593
634
  i++;
594
635
  }
595
636
  }
596
637
  if (chatResponseFailure) {
597
- return XtabProvider_1.mapChatFetcherErrorToNoNextEditReason(chatResponseFailure);
638
+ return mapChatFetcherErrorToNoNextEditReason(chatResponseFailure);
598
639
  }
599
640
  return new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow);
600
641
  }
@@ -642,7 +683,7 @@ let XtabProvider = class XtabProvider {
642
683
  return new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow, nextCursorPosition);
643
684
  }
644
685
  case nextCursorLinePrediction_1.NextCursorLinePrediction.OnlyWithEdit: {
645
- const v = this.doGetNextEditWithSelection(request, new range_1.Range(nextCursorLineOneBased, nextCursorColumn, nextCursorLineOneBased, nextCursorColumn), delaySession, tracer, logContext, cancellationToken, telemetryBuilder, new RetryState.Retrying('cursorJump'));
686
+ const v = this.doGetNextEditWithSelection(request, new range_1.Range(nextCursorLineOneBased, nextCursorColumn, nextCursorLineOneBased, nextCursorColumn), delaySession, tracer, logContext, cancellationToken, telemetryBuilder, new RetryState.Retrying('cursorJump'), editWindow);
646
687
  return yield* v;
647
688
  }
648
689
  default: {
@@ -650,12 +691,6 @@ let XtabProvider = class XtabProvider {
650
691
  }
651
692
  }
652
693
  }
653
- computeAreaAroundEditWindowLinesRange(currentDocument) {
654
- const cursorLine = currentDocument.cursorLineOffset;
655
- const areaAroundStart = Math.max(0, cursorLine - promptCrafting_1.N_LINES_AS_CONTEXT);
656
- const areaAroundEndExcl = Math.min(currentDocument.lines.length, cursorLine + promptCrafting_1.N_LINES_AS_CONTEXT + 1);
657
- return new offsetRange_1.OffsetRange(areaAroundStart, areaAroundEndExcl);
658
- }
659
694
  computeEditWindowLinesRange(currentDocument, request, tracer, telemetry) {
660
695
  const currentDocLines = currentDocument.lines;
661
696
  const cursorLineOffset = currentDocument.cursorLineOffset;
@@ -718,29 +753,6 @@ let XtabProvider = class XtabProvider {
718
753
  }
719
754
  return new offsetRange_1.OffsetRange(codeToEditStart, codeToEditEndExcl);
720
755
  }
721
- static mapChatFetcherErrorToNoNextEditReason(fetchError) {
722
- switch (fetchError.type) {
723
- case commonTypes_1.ChatFetchResponseType.Canceled:
724
- return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterFetchCall');
725
- case commonTypes_1.ChatFetchResponseType.OffTopic:
726
- case commonTypes_1.ChatFetchResponseType.Filtered:
727
- case commonTypes_1.ChatFetchResponseType.PromptFiltered:
728
- case commonTypes_1.ChatFetchResponseType.Length:
729
- case commonTypes_1.ChatFetchResponseType.RateLimited:
730
- case commonTypes_1.ChatFetchResponseType.QuotaExceeded:
731
- case commonTypes_1.ChatFetchResponseType.ExtensionBlocked:
732
- case commonTypes_1.ChatFetchResponseType.AgentUnauthorized:
733
- case commonTypes_1.ChatFetchResponseType.AgentFailedDependency:
734
- case commonTypes_1.ChatFetchResponseType.InvalidStatefulMarker:
735
- return new statelessNextEditProvider_1.NoNextEditReason.Uncategorized(errors.fromUnknown(fetchError));
736
- case commonTypes_1.ChatFetchResponseType.BadRequest:
737
- case commonTypes_1.ChatFetchResponseType.NotFound:
738
- case commonTypes_1.ChatFetchResponseType.Failed:
739
- case commonTypes_1.ChatFetchResponseType.NetworkError:
740
- case commonTypes_1.ChatFetchResponseType.Unknown:
741
- return new statelessNextEditProvider_1.NoNextEditReason.FetchFailure(errors.fromUnknown(fetchError));
742
- }
743
- }
744
756
  determineModelConfiguration(activeDocument) {
745
757
  if (this.forceUseDefaultModel) {
746
758
  const defaultOptions = {
@@ -748,7 +760,7 @@ let XtabProvider = class XtabProvider {
748
760
  ...xtabPromptOptions.DEFAULT_OPTIONS,
749
761
  };
750
762
  const defaultModelConfig = this.modelService.defaultModelConfiguration();
751
- return XtabProvider_1.overrideModelConfig(defaultOptions, defaultModelConfig);
763
+ return overrideModelConfig(defaultOptions, defaultModelConfig);
752
764
  }
753
765
  const sourcedModelConfig = {
754
766
  modelName: undefined,
@@ -768,8 +780,9 @@ let XtabProvider = class XtabProvider {
768
780
  maxTokens: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedDocumentsMaxTokens, this.expService),
769
781
  includeViewedFiles: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabIncludeViewedFiles, this.expService),
770
782
  includeLineNumbers: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedIncludeLineNumbers, this.expService),
783
+ clippingStrategy: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedClippingStrategy, this.expService),
771
784
  },
772
- languageContext: this.determineLanguageContextOptions(activeDocument.languageId, {
785
+ languageContext: determineLanguageContextOptions(activeDocument.languageId, {
773
786
  enabled: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabled, this.expService),
774
787
  enabledLanguages: this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabledLanguages),
775
788
  enableAllContextProviders: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.Advanced.DiagnosticsContextProvider, this.expService)
@@ -791,49 +804,7 @@ let XtabProvider = class XtabProvider {
791
804
  const modelConfig = selectedModelConfig.promptingStrategy === xtabPromptOptions.PromptingStrategy.CopilotNesXtab
792
805
  ? { ...selectedModelConfig, includeTagsInCurrentFile: true }
793
806
  : selectedModelConfig;
794
- return XtabProvider_1.overrideModelConfig(sourcedModelConfig, modelConfig);
795
- }
796
- static overrideModelConfig(modelConfig, overridingConfig) {
797
- return {
798
- ...modelConfig,
799
- modelName: overridingConfig.modelName,
800
- promptingStrategy: overridingConfig.promptingStrategy,
801
- currentFile: {
802
- ...modelConfig.currentFile,
803
- includeTags: overridingConfig.includeTagsInCurrentFile,
804
- },
805
- lintOptions: overridingConfig.lintOptions ? { ...modelConfig.lintOptions, ...overridingConfig.lintOptions } : modelConfig.lintOptions,
806
- };
807
- }
808
- pickSystemPrompt(promptingStrategy) {
809
- switch (promptingStrategy) {
810
- case xtabPromptOptions.PromptingStrategy.UnifiedModel:
811
- return systemMessages_1.unifiedModelSystemPrompt;
812
- case xtabPromptOptions.PromptingStrategy.Codexv21NesUnified:
813
- case xtabPromptOptions.PromptingStrategy.SimplifiedSystemPrompt:
814
- return systemMessages_1.simplifiedPrompt;
815
- case xtabPromptOptions.PromptingStrategy.PatchBased:
816
- case xtabPromptOptions.PromptingStrategy.PatchBased01:
817
- case xtabPromptOptions.PromptingStrategy.Xtab275:
818
- case xtabPromptOptions.PromptingStrategy.XtabAggressiveness:
819
- return systemMessages_1.xtab275SystemPrompt;
820
- case xtabPromptOptions.PromptingStrategy.Nes41Miniv3:
821
- return systemMessages_1.nes41Miniv3SystemPrompt;
822
- case xtabPromptOptions.PromptingStrategy.CopilotNesXtab:
823
- case undefined:
824
- return systemMessages_1.systemPromptTemplate;
825
- default:
826
- (0, assert_1.assertNever)(promptingStrategy);
827
- }
828
- }
829
- determineLanguageContextOptions(languageId, { enabled, enabledLanguages, maxTokens, enableAllContextProviders, traitPosition }) {
830
- if (languageId in enabledLanguages) {
831
- return { enabled: enabledLanguages[languageId], maxTokens, traitPosition };
832
- }
833
- if (enableAllContextProviders) {
834
- return { enabled: true, maxTokens, traitPosition };
835
- }
836
- return { enabled, maxTokens, traitPosition };
807
+ return overrideModelConfig(sourcedModelConfig, modelConfig);
837
808
  }
838
809
  getEndpoint(configuredModelName) {
839
810
  const url = this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderUrl);
@@ -845,32 +816,13 @@ let XtabProvider = class XtabProvider {
845
816
  return (0, proxyXtabEndpoint_1.createProxyXtabEndpoint)(this.instaService, configuredModelName);
846
817
  }
847
818
  getPredictedOutput(doc, editWindowLines, responseFormat) {
848
- return this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderUsePrediction)
819
+ return this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderUsePrediction, this.expService)
849
820
  ? {
850
821
  type: 'content',
851
- content: this.getPredictionContents(doc, editWindowLines, responseFormat)
822
+ content: getPredictionContents(doc, editWindowLines, responseFormat)
852
823
  }
853
824
  : undefined;
854
825
  }
855
- getPredictionContents(doc, editWindowLines, responseFormat) {
856
- if (responseFormat === xtabPromptOptions.ResponseFormat.UnifiedWithXml) {
857
- return ['<EDIT>', ...editWindowLines, '</EDIT>'].join('\n');
858
- }
859
- else if (responseFormat === xtabPromptOptions.ResponseFormat.EditWindowOnly) {
860
- return editWindowLines.join('\n');
861
- }
862
- else if (responseFormat === xtabPromptOptions.ResponseFormat.CodeBlock) {
863
- return ['```', ...editWindowLines, '```'].join('\n');
864
- }
865
- else if (responseFormat === xtabPromptOptions.ResponseFormat.CustomDiffPatch) {
866
- const workspacePath = doc.workspaceRoot?.path;
867
- const workspaceRelativeDocPath = (0, promptCrafting_1.toUniquePath)(doc.id, workspacePath);
868
- return `${workspaceRelativeDocPath}:`;
869
- }
870
- else {
871
- (0, assert_1.assertNever)(responseFormat);
872
- }
873
- }
874
826
  async debounce(delaySession, retryState, logger, telemetry) {
875
827
  if (this.simulationCtx.isInSimulationTests) {
876
828
  return;
@@ -935,6 +887,257 @@ exports.XtabProvider = XtabProvider = XtabProvider_1 = __decorate([
935
887
  __param(8, languageDiagnosticsService_1.ILanguageDiagnosticsService),
936
888
  __param(9, ignoreService_1.IIgnoreService)
937
889
  ], XtabProvider);
890
+ function computeAreaAroundEditWindowLinesRange(currentDocument) {
891
+ const cursorLine = currentDocument.cursorLineOffset;
892
+ const areaAroundStart = Math.max(0, cursorLine - promptCrafting_1.N_LINES_AS_CONTEXT);
893
+ const areaAroundEndExcl = Math.min(currentDocument.lines.length, cursorLine + promptCrafting_1.N_LINES_AS_CONTEXT + 1);
894
+ return new offsetRange_1.OffsetRange(areaAroundStart, areaAroundEndExcl);
895
+ }
896
+ function mapChatFetcherErrorToNoNextEditReason(fetchError) {
897
+ switch (fetchError.type) {
898
+ case commonTypes_1.ChatFetchResponseType.Canceled:
899
+ return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterFetchCall');
900
+ case commonTypes_1.ChatFetchResponseType.OffTopic:
901
+ case commonTypes_1.ChatFetchResponseType.Filtered:
902
+ case commonTypes_1.ChatFetchResponseType.PromptFiltered:
903
+ case commonTypes_1.ChatFetchResponseType.Length:
904
+ case commonTypes_1.ChatFetchResponseType.RateLimited:
905
+ case commonTypes_1.ChatFetchResponseType.QuotaExceeded:
906
+ case commonTypes_1.ChatFetchResponseType.ExtensionBlocked:
907
+ case commonTypes_1.ChatFetchResponseType.AgentUnauthorized:
908
+ case commonTypes_1.ChatFetchResponseType.AgentFailedDependency:
909
+ case commonTypes_1.ChatFetchResponseType.InvalidStatefulMarker:
910
+ return new statelessNextEditProvider_1.NoNextEditReason.Uncategorized(errors.fromUnknown(fetchError));
911
+ case commonTypes_1.ChatFetchResponseType.BadRequest:
912
+ case commonTypes_1.ChatFetchResponseType.NotFound:
913
+ case commonTypes_1.ChatFetchResponseType.Failed:
914
+ case commonTypes_1.ChatFetchResponseType.NetworkError:
915
+ case commonTypes_1.ChatFetchResponseType.Unknown:
916
+ return new statelessNextEditProvider_1.NoNextEditReason.FetchFailure(errors.fromUnknown(fetchError));
917
+ }
918
+ }
919
+ function overrideModelConfig(modelConfig, overridingConfig) {
920
+ return {
921
+ ...modelConfig,
922
+ modelName: overridingConfig.modelName,
923
+ promptingStrategy: overridingConfig.promptingStrategy,
924
+ currentFile: {
925
+ ...modelConfig.currentFile,
926
+ includeTags: overridingConfig.includeTagsInCurrentFile,
927
+ },
928
+ lintOptions: overridingConfig.lintOptions ? { ...modelConfig.lintOptions, ...overridingConfig.lintOptions } : modelConfig.lintOptions,
929
+ };
930
+ }
931
+ function pickSystemPrompt(promptingStrategy) {
932
+ switch (promptingStrategy) {
933
+ case xtabPromptOptions.PromptingStrategy.UnifiedModel:
934
+ return systemMessages_1.unifiedModelSystemPrompt;
935
+ case xtabPromptOptions.PromptingStrategy.Codexv21NesUnified:
936
+ case xtabPromptOptions.PromptingStrategy.SimplifiedSystemPrompt:
937
+ return systemMessages_1.simplifiedPrompt;
938
+ case xtabPromptOptions.PromptingStrategy.PatchBased:
939
+ case xtabPromptOptions.PromptingStrategy.PatchBased01:
940
+ case xtabPromptOptions.PromptingStrategy.Xtab275:
941
+ case xtabPromptOptions.PromptingStrategy.XtabAggressiveness:
942
+ case xtabPromptOptions.PromptingStrategy.Xtab275Aggressiveness:
943
+ case xtabPromptOptions.PromptingStrategy.Xtab275EditIntent:
944
+ case xtabPromptOptions.PromptingStrategy.Xtab275EditIntentShort:
945
+ return systemMessages_1.xtab275SystemPrompt;
946
+ case xtabPromptOptions.PromptingStrategy.Nes41Miniv3:
947
+ return systemMessages_1.nes41Miniv3SystemPrompt;
948
+ case xtabPromptOptions.PromptingStrategy.CopilotNesXtab:
949
+ case undefined:
950
+ return systemMessages_1.systemPromptTemplate;
951
+ default:
952
+ (0, assert_1.assertNever)(promptingStrategy);
953
+ }
954
+ }
955
+ function determineLanguageContextOptions(languageId, { enabled, enabledLanguages, maxTokens, enableAllContextProviders, traitPosition }) {
956
+ if (languageId in enabledLanguages) {
957
+ return { enabled: enabledLanguages[languageId], maxTokens, traitPosition };
958
+ }
959
+ if (enableAllContextProviders) {
960
+ return { enabled: true, maxTokens, traitPosition };
961
+ }
962
+ return { enabled, maxTokens, traitPosition };
963
+ }
964
+ function getPredictionContents(doc, editWindowLines, responseFormat) {
965
+ if (responseFormat === xtabPromptOptions.ResponseFormat.UnifiedWithXml) {
966
+ return ['<EDIT>', ...editWindowLines, '</EDIT>'].join('\n');
967
+ }
968
+ else if (responseFormat === xtabPromptOptions.ResponseFormat.EditWindowOnly) {
969
+ return editWindowLines.join('\n');
970
+ }
971
+ else if (responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntent) {
972
+ // For EditWindowWithIntent, we predict the edit intent as high (most likely case) followed by the code
973
+ return ['<|edit_intent|>high<|/edit_intent|>', ...editWindowLines].join('\n');
974
+ }
975
+ else if (responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort) {
976
+ // For EditWindowWithIntentShort, we predict 'H' (high) followed by the code
977
+ return ['H', ...editWindowLines].join('\n');
978
+ }
979
+ else if (responseFormat === xtabPromptOptions.ResponseFormat.CodeBlock) {
980
+ return ['```', ...editWindowLines, '```'].join('\n');
981
+ }
982
+ else if (responseFormat === xtabPromptOptions.ResponseFormat.CustomDiffPatch) {
983
+ const workspacePath = doc.workspaceRoot?.path;
984
+ const workspaceRelativeDocPath = (0, promptCraftingUtils_1.toUniquePath)(doc.id, workspacePath);
985
+ return `${workspaceRelativeDocPath}:`;
986
+ }
987
+ else {
988
+ (0, assert_1.assertNever)(responseFormat);
989
+ }
990
+ }
991
+ /**
992
+ * Mode for parsing edit intent from the model response.
993
+ */
994
+ var EditIntentParseMode;
995
+ (function (EditIntentParseMode) {
996
+ /** Parse using XML-style tags: <|edit_intent|>value<|/edit_intent|> */
997
+ EditIntentParseMode["Tags"] = "tags";
998
+ /** Parse using short names on the first line: N|L|M|H */
999
+ EditIntentParseMode["ShortName"] = "shortName";
1000
+ })(EditIntentParseMode || (exports.EditIntentParseMode = EditIntentParseMode = {}));
1001
+ /**
1002
+ * Parses the edit_intent from the first line of the response stream.
1003
+ * The edit_intent MUST be on the first line, otherwise it's treated as not provided.
1004
+ * Returns the parsed EditIntent and a new stream with the remaining content.
1005
+ *
1006
+ * Supports two modes:
1007
+ * - Tags (default): <|edit_intent|>low|medium|high|no_edit<|/edit_intent|>
1008
+ * - ShortName: N|L|M|H on the first line
1009
+ *
1010
+ * @param linesStream The stream of lines from the model response
1011
+ * @param tracer Logger for tracing
1012
+ * @param mode The parse mode (Tags or ShortName), defaults to Tags
1013
+ */
1014
+ async function parseEditIntentFromStream(linesStream, tracer, mode = EditIntentParseMode.Tags) {
1015
+ if (mode === EditIntentParseMode.ShortName) {
1016
+ return parseEditIntentFromStreamShortName(linesStream, tracer);
1017
+ }
1018
+ return parseEditIntentFromStreamTags(linesStream, tracer);
1019
+ }
1020
+ /**
1021
+ * Parses the edit_intent using short name format (N|L|M|H on first line).
1022
+ */
1023
+ async function parseEditIntentFromStreamShortName(linesStream, tracer) {
1024
+ let editIntent = xtabPromptOptions.EditIntent.High; // Default to high (always show) if no short name found
1025
+ let parseError;
1026
+ const linesIter = linesStream[Symbol.asyncIterator]();
1027
+ const firstLineResult = await linesIter.next();
1028
+ if (firstLineResult.done) {
1029
+ // Empty stream
1030
+ parseError = 'emptyResponse';
1031
+ tracer.warn(`Empty response stream, no edit_intent short name found`);
1032
+ const remainingLinesStream = (async function* () { })();
1033
+ return { editIntent, remainingLinesStream, parseError };
1034
+ }
1035
+ const firstLine = firstLineResult.value.trim();
1036
+ // Check if the first line is a single character short name
1037
+ const parsedIntent = xtabPromptOptions.EditIntent.fromShortName(firstLine);
1038
+ if (parsedIntent !== undefined) {
1039
+ editIntent = parsedIntent;
1040
+ tracer.trace(`Parsed edit_intent short name from first line: "${firstLine}" -> ${editIntent}`);
1041
+ // Create a new stream with the remaining lines (excluding the short name line)
1042
+ const remainingLinesStream = (async function* () {
1043
+ let next = await linesIter.next();
1044
+ while (!next.done) {
1045
+ yield next.value;
1046
+ next = await linesIter.next();
1047
+ }
1048
+ })();
1049
+ return { editIntent, remainingLinesStream, parseError };
1050
+ }
1051
+ // Short name not found or invalid
1052
+ parseError = `unknownIntentValue:${firstLine}`;
1053
+ tracer.warn(`Edit intent parse error: ${parseError} (using Xtab275EditIntentShort prompting strategy). ` +
1054
+ `Defaulting to High (always show). First line was: "${firstLine.substring(0, 100)}..."`);
1055
+ // Return the first line plus the rest of the stream
1056
+ const remainingLinesStream = (async function* () {
1057
+ yield firstLineResult.value; // Use original value, not trimmed
1058
+ let next = await linesIter.next();
1059
+ while (!next.done) {
1060
+ yield next.value;
1061
+ next = await linesIter.next();
1062
+ }
1063
+ })();
1064
+ return { editIntent, remainingLinesStream, parseError };
1065
+ }
1066
+ /**
1067
+ * Parses the edit_intent tag from the first line of the response stream (original tag-based format).
1068
+ */
1069
+ async function parseEditIntentFromStreamTags(linesStream, tracer) {
1070
+ const EDIT_INTENT_START_TAG = '<|edit_intent|>';
1071
+ const EDIT_INTENT_END_TAG = '<|/edit_intent|>';
1072
+ let editIntent = xtabPromptOptions.EditIntent.High; // Default to high (always show) if no tag found
1073
+ let parseError;
1074
+ const linesIter = linesStream[Symbol.asyncIterator]();
1075
+ const firstLineResult = await linesIter.next();
1076
+ if (firstLineResult.done) {
1077
+ // Empty stream
1078
+ parseError = 'emptyResponse';
1079
+ tracer.warn(`Empty response stream, no edit_intent tag found`);
1080
+ const remainingLinesStream = (async function* () { })();
1081
+ return { editIntent, remainingLinesStream, parseError };
1082
+ }
1083
+ const firstLine = firstLineResult.value;
1084
+ // Check if the first line contains the complete edit_intent tag
1085
+ const startIdx = firstLine.indexOf(EDIT_INTENT_START_TAG);
1086
+ const endIdx = firstLine.indexOf(EDIT_INTENT_END_TAG);
1087
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
1088
+ // Found complete tag on first line
1089
+ const intentValue = firstLine.substring(startIdx + EDIT_INTENT_START_TAG.length, endIdx).trim().toLowerCase();
1090
+ // Check if it's a known intent value
1091
+ const knownIntentValues = ['no_edit', 'low', 'medium', 'high'];
1092
+ if (!knownIntentValues.includes(intentValue)) {
1093
+ parseError = `unknownIntentValue:${intentValue}`;
1094
+ tracer.warn(`Unknown edit_intent value: "${intentValue}", defaulting to High`);
1095
+ }
1096
+ editIntent = xtabPromptOptions.EditIntent.fromString(intentValue);
1097
+ tracer.trace(`Parsed edit_intent from first line: "${intentValue}" -> ${editIntent}`);
1098
+ // Calculate remaining content after the end tag on the first line
1099
+ const afterEndTag = firstLine.substring(endIdx + EDIT_INTENT_END_TAG.length);
1100
+ // Create a new stream that first yields remaining content from first line, then continues
1101
+ const remainingLinesStream = (async function* () {
1102
+ // Only yield remaining content from first line if non-empty
1103
+ if (afterEndTag.trim() !== '') {
1104
+ yield afterEndTag;
1105
+ }
1106
+ // Continue with rest of the stream
1107
+ let next = await linesIter.next();
1108
+ while (!next.done) {
1109
+ yield next.value;
1110
+ next = await linesIter.next();
1111
+ }
1112
+ })();
1113
+ return { editIntent, remainingLinesStream, parseError };
1114
+ }
1115
+ // Determine the parse error type
1116
+ if (startIdx !== -1 && endIdx === -1) {
1117
+ // Start tag found but no end tag - malformed (possibly split across lines)
1118
+ parseError = 'malformedTag:startWithoutEnd';
1119
+ }
1120
+ else if (startIdx === -1 && endIdx !== -1) {
1121
+ // End tag found but no start tag - malformed
1122
+ parseError = 'malformedTag:endWithoutStart';
1123
+ }
1124
+ else {
1125
+ // No tag found at all
1126
+ parseError = 'noTagFound';
1127
+ }
1128
+ tracer.warn(`Edit intent parse error: ${parseError} (using Xtab275EditIntent prompting strategy). ` +
1129
+ `Defaulting to High (always show). First line was: "${firstLine.substring(0, 100)}..."`);
1130
+ // Return the first line plus the rest of the stream
1131
+ const remainingLinesStream = (async function* () {
1132
+ yield firstLine;
1133
+ let next = await linesIter.next();
1134
+ while (!next.done) {
1135
+ yield next.value;
1136
+ next = await linesIter.next();
1137
+ }
1138
+ })();
1139
+ return { editIntent, remainingLinesStream, parseError };
1140
+ }
938
1141
  /**
939
1142
  * Finds the range of lines containing merge conflict markers within a specified edit window.
940
1143
  *