@codingame/monaco-vscode-katex-common 28.4.0 → 29.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/vscode/src/vs/platform/actions/browser/buttonbar.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityProvider.js +17 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatElicitationActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.d.ts +3 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.js +158 -47
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.js +22 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.d.ts +16 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.js +121 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.d.ts +8 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.js +15 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsOpener.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.d.ts +29 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.js +349 -109
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/media/agentsessionsviewer.css +47 -23
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.d.ts +6 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.js +104 -62
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatImplicitContext.js +1 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/implicitContextAttachment.js +13 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.js +34 -40
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +21 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.d.ts +8 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.js +13 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessions.contribution.d.ts +29 -50
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessions.contribution.js +261 -282
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/searchableOptionPickerActionItem.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/searchableOptionPickerActionItem.js +7 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatAgentHover.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.d.ts +31 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.js +184 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentMarkdownRenderer.js +4 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAgentCommandContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAnonymousRateLimitedPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCodeCitationContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCommandContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationContentPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatDisabledClaudeHooksContentPart.js +4 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExtensionsContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatHookContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.d.ts +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.js +42 -34
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.js +14 -18
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersInteractionContentPart.js +11 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.js +6 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.d.ts +25 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.js +332 -114
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatReferencesContentPart.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatReferencesContentPart.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatResourceGroupWidget.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatResourceGroupWidget.js +10 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.js +11 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.d.ts +7 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.js +66 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTextEditContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.d.ts +28 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.js +272 -107
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingExternalResourcesWidget.d.ts +18 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingExternalResourcesWidget.js +70 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTipContentPart.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTodoListWidget.js +17 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.js +6 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatWorkspaceEditContentPart.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css +151 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatInlineAnchorWidget.css +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css +96 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css +6 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css +86 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.d.ts +7 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.js +5 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatInputOutputMarkdownProgressPart.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatInputOutputMarkdownProgressPart.js +8 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.d.ts +28 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.js +273 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatSimpleToolProgressPart.js +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.js +28 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.d.ts +22 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.js +81 -32
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.js +20 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.js +11 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolOutputPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPartUtilities.d.ts +6 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPartUtilities.js +21 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolProgressPart.js +2 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatDragAndDrop.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.d.ts +0 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.js +112 -163
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.js +11 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.d.ts +9 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.js +137 -52
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatFollowups.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.d.ts +12 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.js +108 -38
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.d.ts +9 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.js +385 -247
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.d.ts +5 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.js +23 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem2.js +4 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.js +23 -23
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerActionItem.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +124 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.d.ts +4 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.js +24 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.js +30 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatContextUsageDetails.css +84 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.d.ts +31 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.js +170 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/internalCustomizations/internalPromptFileSystem.d.ts +47 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/internalCustomizations/internalPromptFileSystem.js +95 -0
- package/vscode/src/vs/workbench/contrib/chat/common/widget/annotations.js +4 -1
- package/vscode/src/vs/workbench/contrib/chat/common/widget/chatColors.js +15 -15
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatAffordance.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatAffordance.js +4 -3
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.js +38 -6
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatEditorAffordance.js +31 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.d.ts +12 -3
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.js +130 -23
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.d.ts +23 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.js +41 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.js +5 -5
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatOverlayWidget.css +55 -3
- package/vscode/src/vs/workbench/contrib/inlineChat/common/inlineChat.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/inlineChat/common/inlineChat.js +50 -39
- package/vscode/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.js +3 -3
- package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.js +7 -7
- package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.js +2 -2
- package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditor.js +1 -1
- package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatQuestionCarouselAutoReply.d.ts +0 -35
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatQuestionCarouselAutoReply.js +0 -440
package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.js
CHANGED
|
@@ -22,15 +22,21 @@ let ChatContextUsageDetails = class ChatContextUsageDetails extends Disposable {
|
|
|
22
22
|
this.domNode = $(".chat-context-usage-details");
|
|
23
23
|
this.quotaItem = this.domNode.appendChild($(".quota-indicator"));
|
|
24
24
|
const header = this.domNode.insertBefore($("div.header"), this.quotaItem);
|
|
25
|
-
header.textContent = ( localize(
|
|
25
|
+
header.textContent = ( localize(7092, "Context Window"));
|
|
26
26
|
const quotaLabel = this.quotaItem.appendChild($(".quota-label"));
|
|
27
27
|
this.tokenCountLabel = quotaLabel.appendChild($("span"));
|
|
28
28
|
this.percentageLabel = quotaLabel.appendChild($("span.quota-value"));
|
|
29
29
|
const progressBar = this.quotaItem.appendChild($(".quota-bar"));
|
|
30
30
|
this.progressFill = progressBar.appendChild($(".quota-bit"));
|
|
31
|
+
this.outputBufferFill = progressBar.appendChild($(".quota-bit.output-buffer"));
|
|
32
|
+
this.outputBufferLegend = this.quotaItem.appendChild($(".output-buffer-legend"));
|
|
33
|
+
this.outputBufferLegend.appendChild($(".output-buffer-swatch"));
|
|
34
|
+
const legendLabel = this.outputBufferLegend.appendChild($("span"));
|
|
35
|
+
legendLabel.textContent = ( localize(7093, "Reserved for response"));
|
|
36
|
+
this.outputBufferLegend.style.display = "none";
|
|
31
37
|
this.tokenDetailsContainer = this.domNode.appendChild($(".token-details-container"));
|
|
32
38
|
this.warningMessage = this.domNode.appendChild($("div.description"));
|
|
33
|
-
this.warningMessage.textContent = ( localize(
|
|
39
|
+
this.warningMessage.textContent = ( localize(7094, "Quality may decline as limit nears."));
|
|
34
40
|
this.warningMessage.style.display = "none";
|
|
35
41
|
this.actionsSection = this.domNode.appendChild($(".actions-section"));
|
|
36
42
|
const buttonBarContainer = this.actionsSection.appendChild($(".button-bar-container"));
|
|
@@ -63,16 +69,27 @@ let ChatContextUsageDetails = class ChatContextUsageDetails extends Disposable {
|
|
|
63
69
|
percentage,
|
|
64
70
|
usedTokens,
|
|
65
71
|
totalContextWindow,
|
|
72
|
+
outputBufferPercentage,
|
|
66
73
|
promptTokenDetails
|
|
67
74
|
} = data;
|
|
68
75
|
this.tokenCountLabel.textContent = ( localize(
|
|
69
|
-
|
|
76
|
+
7095,
|
|
70
77
|
"{0} / {1} tokens",
|
|
71
78
|
this.formatTokenCount(usedTokens, 1),
|
|
72
79
|
this.formatTokenCount(totalContextWindow, 0)
|
|
73
80
|
));
|
|
74
|
-
this.percentageLabel.textContent = ( localize(
|
|
75
|
-
|
|
81
|
+
this.percentageLabel.textContent = ( localize(7096, "{0}%", Math.min(100, percentage).toFixed(0)));
|
|
82
|
+
const usageBarWidth = Math.max(0, Math.min(100, percentage));
|
|
83
|
+
this.progressFill.style.width = `${usageBarWidth}%`;
|
|
84
|
+
if (outputBufferPercentage !== undefined && outputBufferPercentage > 0) {
|
|
85
|
+
this.outputBufferFill.style.width = `${Math.max(0, Math.min(100 - usageBarWidth, outputBufferPercentage))}%`;
|
|
86
|
+
this.outputBufferFill.style.display = "";
|
|
87
|
+
this.outputBufferLegend.style.display = "";
|
|
88
|
+
} else {
|
|
89
|
+
this.outputBufferFill.style.width = "0";
|
|
90
|
+
this.outputBufferFill.style.display = "none";
|
|
91
|
+
this.outputBufferLegend.style.display = "none";
|
|
92
|
+
}
|
|
76
93
|
this.quotaItem.classList.remove("warning", "error");
|
|
77
94
|
if (percentage >= 90) {
|
|
78
95
|
this.quotaItem.classList.add("error");
|
|
@@ -111,8 +128,8 @@ let ChatContextUsageDetails = class ChatContextUsageDetails extends Disposable {
|
|
|
111
128
|
}
|
|
112
129
|
if (totalPercentage < 100) {
|
|
113
130
|
const uncategorizedPercentage = 100 - totalPercentage;
|
|
114
|
-
categoryMap.set(( localize(
|
|
115
|
-
label: ( localize(
|
|
131
|
+
categoryMap.set(( localize(7097, "Uncategorized")), [{
|
|
132
|
+
label: ( localize(7098, "Other")),
|
|
116
133
|
percentageOfPrompt: uncategorizedPercentage
|
|
117
134
|
}]);
|
|
118
135
|
}
|
package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { registerCss } from '@codingame/monaco-vscode-api/css';
|
|
3
3
|
import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
|
|
4
4
|
import * as chatContextUsageWidget from './media/chatContextUsageWidget.css';
|
|
5
|
-
import { $ as $$1, addDisposableListener, EventType } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
|
|
5
|
+
import { $ as $$1, createElementNS, addDisposableListener, EventType } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
|
|
6
6
|
import { Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
|
|
7
7
|
import { Disposable, MutableDisposable, DisposableStore } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
8
8
|
import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
|
|
@@ -37,16 +37,16 @@ class CircularProgressIndicator {
|
|
|
37
37
|
constructor() {
|
|
38
38
|
const r = CircularProgressIndicator.RADIUS;
|
|
39
39
|
this.circumference = 2 * Math.PI * r;
|
|
40
|
-
this.domNode =
|
|
40
|
+
this.domNode = createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
41
41
|
this.domNode.setAttribute("viewBox", "0 0 36 36");
|
|
42
42
|
this.domNode.classList.add("circular-progress");
|
|
43
|
-
const bgCircle =
|
|
43
|
+
const bgCircle = createElementNS("http://www.w3.org/2000/svg", "circle");
|
|
44
44
|
bgCircle.setAttribute("cx", String(CircularProgressIndicator.CENTER_X));
|
|
45
45
|
bgCircle.setAttribute("cy", String(CircularProgressIndicator.CENTER_Y));
|
|
46
46
|
bgCircle.setAttribute("r", String(r));
|
|
47
47
|
bgCircle.classList.add("progress-bg");
|
|
48
48
|
this.domNode.appendChild(bgCircle);
|
|
49
|
-
this.progressCircle =
|
|
49
|
+
this.progressCircle = createElementNS("http://www.w3.org/2000/svg", "circle");
|
|
50
50
|
this.progressCircle.setAttribute("cx", String(CircularProgressIndicator.CENTER_X));
|
|
51
51
|
this.progressCircle.setAttribute("cy", String(CircularProgressIndicator.CENTER_Y));
|
|
52
52
|
this.progressCircle.setAttribute("r", String(r));
|
|
@@ -110,7 +110,7 @@ let ChatContextUsageWidget = class ChatContextUsageWidget extends Disposable {
|
|
|
110
110
|
this.domNode.style.display = "none";
|
|
111
111
|
this.domNode.setAttribute("tabindex", "0");
|
|
112
112
|
this.domNode.setAttribute("role", "button");
|
|
113
|
-
this.domNode.setAttribute("aria-label", ( localize(
|
|
113
|
+
this.domNode.setAttribute("aria-label", ( localize(7099, "Context window usage")));
|
|
114
114
|
const iconContainer = this.domNode.appendChild($(".icon-container"));
|
|
115
115
|
this.progressIndicator = ( new CircularProgressIndicator());
|
|
116
116
|
iconContainer.appendChild(this.progressIndicator.domNode);
|
|
@@ -224,24 +224,43 @@ let ChatContextUsageWidget = class ChatContextUsageWidget extends Disposable {
|
|
|
224
224
|
return;
|
|
225
225
|
}
|
|
226
226
|
const promptTokens = usage.promptTokens;
|
|
227
|
+
const completionTokens = usage.completionTokens;
|
|
227
228
|
const promptTokenDetails = usage.promptTokenDetails;
|
|
229
|
+
const outputBuffer = usage.outputBuffer;
|
|
228
230
|
const totalContextWindow = maxInputTokens + maxOutputTokens;
|
|
229
|
-
const usedTokens = promptTokens +
|
|
230
|
-
const percentage =
|
|
231
|
-
|
|
231
|
+
const usedTokens = promptTokens + completionTokens;
|
|
232
|
+
const percentage = (usedTokens / totalContextWindow) * 100;
|
|
233
|
+
const outputBufferPercentage = outputBuffer !== undefined ? (Math.max(0, outputBuffer - completionTokens) / totalContextWindow) * 100 : undefined;
|
|
234
|
+
this.render(
|
|
235
|
+
percentage,
|
|
236
|
+
completionTokens,
|
|
237
|
+
usedTokens,
|
|
238
|
+
totalContextWindow,
|
|
239
|
+
outputBufferPercentage,
|
|
240
|
+
promptTokenDetails
|
|
241
|
+
);
|
|
232
242
|
this.show();
|
|
233
243
|
}
|
|
234
|
-
render(
|
|
244
|
+
render(
|
|
245
|
+
percentage,
|
|
246
|
+
completionTokens,
|
|
247
|
+
usedTokens,
|
|
248
|
+
totalContextWindow,
|
|
249
|
+
outputBufferPercentage,
|
|
250
|
+
promptTokenDetails
|
|
251
|
+
) {
|
|
235
252
|
this.currentData = {
|
|
236
253
|
usedTokens,
|
|
254
|
+
completionTokens,
|
|
237
255
|
totalContextWindow,
|
|
238
256
|
percentage,
|
|
257
|
+
outputBufferPercentage,
|
|
239
258
|
promptTokenDetails
|
|
240
259
|
};
|
|
241
260
|
this.progressIndicator.setProgress(percentage);
|
|
242
|
-
const roundedPercentage = Math.round(percentage);
|
|
261
|
+
const roundedPercentage = Math.min(100, Math.round(percentage));
|
|
243
262
|
this.percentageLabel.textContent = `${roundedPercentage}%`;
|
|
244
|
-
this.domNode.setAttribute("aria-label", ( localize(
|
|
263
|
+
this.domNode.setAttribute("aria-label", ( localize(7100, "Context window usage: {0}%", roundedPercentage)));
|
|
245
264
|
this.domNode.classList.remove("warning", "error");
|
|
246
265
|
if (percentage >= 90) {
|
|
247
266
|
this.domNode.classList.add("error");
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
border-radius: 4px;
|
|
53
53
|
border: 1px solid var(--vscode-gauge-border);
|
|
54
54
|
margin: 4px 0;
|
|
55
|
+
display: flex;
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
.chat-context-usage-details .quota-indicator .quota-bar .quota-bit {
|
|
@@ -61,6 +62,55 @@
|
|
|
61
62
|
transition: width 0.3s ease;
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
.chat-context-usage-details .quota-indicator .quota-bar .quota-bit.output-buffer {
|
|
66
|
+
background: repeating-linear-gradient(
|
|
67
|
+
-45deg,
|
|
68
|
+
var(--vscode-gauge-foreground),
|
|
69
|
+
var(--vscode-gauge-foreground) 2px,
|
|
70
|
+
transparent 2px,
|
|
71
|
+
transparent 4px
|
|
72
|
+
);
|
|
73
|
+
border-radius: 0 4px 4px 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.chat-context-usage-details .quota-indicator .quota-bar .quota-bit:not(.output-buffer):has(+ .quota-bit.output-buffer:not([style*="display: none"])) {
|
|
77
|
+
border-radius: 4px 0 0 4px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Output buffer legend */
|
|
81
|
+
.chat-context-usage-details .quota-indicator .output-buffer-legend {
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
gap: 6px;
|
|
85
|
+
margin-top: 4px;
|
|
86
|
+
font-size: 11px;
|
|
87
|
+
color: var(--vscode-descriptionForeground);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.chat-context-usage-details .quota-indicator .output-buffer-legend .output-buffer-swatch {
|
|
91
|
+
width: 12px;
|
|
92
|
+
height: 8px;
|
|
93
|
+
border-radius: 2px;
|
|
94
|
+
background: repeating-linear-gradient(
|
|
95
|
+
-45deg,
|
|
96
|
+
var(--vscode-gauge-foreground),
|
|
97
|
+
var(--vscode-gauge-foreground) 2px,
|
|
98
|
+
transparent 2px,
|
|
99
|
+
transparent 4px
|
|
100
|
+
);
|
|
101
|
+
flex-shrink: 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.chat-context-usage-details .quota-indicator.warning .output-buffer-swatch {
|
|
105
|
+
background: repeating-linear-gradient(
|
|
106
|
+
-45deg,
|
|
107
|
+
var(--vscode-gauge-warningForeground),
|
|
108
|
+
var(--vscode-gauge-warningForeground) 2px,
|
|
109
|
+
transparent 2px,
|
|
110
|
+
transparent 4px
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
64
114
|
.chat-context-usage-details .quota-indicator.warning .quota-bar {
|
|
65
115
|
background-color: var(--vscode-gauge-warningBackground);
|
|
66
116
|
}
|
|
@@ -69,6 +119,26 @@
|
|
|
69
119
|
background-color: var(--vscode-gauge-warningForeground);
|
|
70
120
|
}
|
|
71
121
|
|
|
122
|
+
.chat-context-usage-details .quota-indicator.warning .quota-bar .quota-bit.output-buffer {
|
|
123
|
+
background: repeating-linear-gradient(
|
|
124
|
+
-45deg,
|
|
125
|
+
var(--vscode-gauge-warningForeground),
|
|
126
|
+
var(--vscode-gauge-warningForeground) 2px,
|
|
127
|
+
transparent 2px,
|
|
128
|
+
transparent 4px
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.chat-context-usage-details .quota-indicator.error .output-buffer-swatch {
|
|
133
|
+
background: repeating-linear-gradient(
|
|
134
|
+
-45deg,
|
|
135
|
+
var(--vscode-gauge-errorForeground),
|
|
136
|
+
var(--vscode-gauge-errorForeground) 2px,
|
|
137
|
+
transparent 2px,
|
|
138
|
+
transparent 4px
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
72
142
|
.chat-context-usage-details .quota-indicator.error .quota-bar {
|
|
73
143
|
background-color: var(--vscode-gauge-errorBackground);
|
|
74
144
|
}
|
|
@@ -77,6 +147,16 @@
|
|
|
77
147
|
background-color: var(--vscode-gauge-errorForeground);
|
|
78
148
|
}
|
|
79
149
|
|
|
150
|
+
.chat-context-usage-details .quota-indicator.error .quota-bar .quota-bit.output-buffer {
|
|
151
|
+
background: repeating-linear-gradient(
|
|
152
|
+
-45deg,
|
|
153
|
+
var(--vscode-gauge-errorForeground),
|
|
154
|
+
var(--vscode-gauge-errorForeground) 2px,
|
|
155
|
+
transparent 2px,
|
|
156
|
+
transparent 4px
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
80
160
|
/* Description / warning text — matching ChatStatusDashboard */
|
|
81
161
|
.chat-context-usage-details div.description {
|
|
82
162
|
font-size: 11px;
|
|
@@ -100,6 +180,10 @@
|
|
|
100
180
|
font-weight: 600;
|
|
101
181
|
}
|
|
102
182
|
|
|
183
|
+
.chat-context-usage-details .token-category:first-child .token-category-header {
|
|
184
|
+
margin-top: 8px;
|
|
185
|
+
}
|
|
186
|
+
|
|
103
187
|
.chat-context-usage-details .token-detail-item {
|
|
104
188
|
display: flex;
|
|
105
189
|
justify-content: space-between;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { VSBuffer } from "@codingame/monaco-vscode-api/vscode/vs/base/common/buffer";
|
|
2
|
+
import { URI } from "@codingame/monaco-vscode-api/vscode/vs/base/common/uri";
|
|
3
|
+
import { IChatResponseViewModel, IChatRequestViewModel } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatViewModel";
|
|
4
|
+
import { IChatToolInvocation, IChatToolInvocationSerialized } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatService/chatService";
|
|
5
|
+
export interface IChatExtractedImage {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly uri: URI;
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly mimeType: string;
|
|
10
|
+
readonly data: VSBuffer;
|
|
11
|
+
readonly source: string;
|
|
12
|
+
readonly caption: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface IChatExtractedImageCollection {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly title: string;
|
|
17
|
+
readonly images: IChatExtractedImage[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract all images from a chat response's tool invocations and inline references.
|
|
21
|
+
* Tool invocation images are extracted from output details and message URIs.
|
|
22
|
+
* Inline reference images (file URIs) are read via the provided {@link readFile} callback.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractImagesFromChatResponse(response: IChatResponseViewModel, readFile: (uri: URI) => Promise<VSBuffer>): Promise<IChatExtractedImageCollection>;
|
|
25
|
+
export declare function extractImagesFromToolInvocationOutputDetails(toolInvocation: IChatToolInvocation | IChatToolInvocationSerialized, sessionResource: URI): IChatExtractedImage[];
|
|
26
|
+
export declare function extractImagesFromToolInvocationMessages(toolInvocation: IChatToolInvocation | IChatToolInvocationSerialized, readFile: (uri: URI) => Promise<VSBuffer>): Promise<IChatExtractedImage[]>;
|
|
27
|
+
export declare function coerceImageBuffer(value: unknown): Uint8Array | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Extract images from a chat request's variable attachments (user-attached images).
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractImagesFromChatRequest(request: IChatRequestViewModel): IChatExtractedImage[];
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
|
|
2
|
+
import { decodeBase64, VSBuffer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/buffer';
|
|
3
|
+
import { getExtensionForMimeType, getMediaMime } from '@codingame/monaco-vscode-api/vscode/vs/base/common/mime';
|
|
4
|
+
import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
|
|
5
|
+
import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
6
|
+
import { isLocation } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/languages';
|
|
7
|
+
import { isRequestVM } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatViewModel';
|
|
8
|
+
import { ChatResponseResource } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/model/chatModel';
|
|
9
|
+
import { IChatToolInvocation } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatService/chatService';
|
|
10
|
+
import { isToolResultInputOutputDetails, isToolResultOutputDetails } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/tools/languageModelToolsService';
|
|
11
|
+
import { isImageVariableEntry } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/attachments/chatVariableEntries';
|
|
12
|
+
|
|
13
|
+
async function extractImagesFromChatResponse(response, readFile) {
|
|
14
|
+
const allImages = [];
|
|
15
|
+
for (const item of response.response.value) {
|
|
16
|
+
if (item.kind === "toolInvocation" || item.kind === "toolInvocationSerialized") {
|
|
17
|
+
const images = extractImagesFromToolInvocationOutputDetails(item, response.sessionResource);
|
|
18
|
+
allImages.push(...images);
|
|
19
|
+
const messageImages = await extractImagesFromToolInvocationMessages(item, readFile);
|
|
20
|
+
allImages.push(...messageImages);
|
|
21
|
+
} else if (item.kind === "inlineReference") {
|
|
22
|
+
const image = await extractImageFromInlineReference(item, readFile);
|
|
23
|
+
if (image) {
|
|
24
|
+
allImages.push(image);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const request = response.session.getItems().find(item => isRequestVM(item) && item.id === response.requestId);
|
|
29
|
+
const title = request ? request.messageText : ( localize(7192, "Images"));
|
|
30
|
+
return {
|
|
31
|
+
id: ( response.sessionResource.toString()) + "_" + response.id,
|
|
32
|
+
title,
|
|
33
|
+
images: allImages
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function extractImagesFromToolInvocationOutputDetails(toolInvocation, sessionResource) {
|
|
37
|
+
const images = [];
|
|
38
|
+
const resultDetails = IChatToolInvocation.resultDetails(toolInvocation);
|
|
39
|
+
const msg = toolInvocation.pastTenseMessage ?? toolInvocation.invocationMessage;
|
|
40
|
+
const caption = msg ? (typeof msg === "string" ? msg : msg.value) : undefined;
|
|
41
|
+
const pushImage = (mimeType, data, outputIndex) => {
|
|
42
|
+
const ext = getExtensionForMimeType(mimeType);
|
|
43
|
+
const permalinkBasename = ext ? `file${ext}` : "file.bin";
|
|
44
|
+
const uri = ChatResponseResource.createUri(sessionResource, toolInvocation.toolCallId, outputIndex, permalinkBasename);
|
|
45
|
+
images.push({
|
|
46
|
+
id: `${toolInvocation.toolCallId}_${outputIndex}`,
|
|
47
|
+
uri,
|
|
48
|
+
name: ( localize(7193, "Image {0}", images.length + 1)),
|
|
49
|
+
mimeType,
|
|
50
|
+
data,
|
|
51
|
+
source: ( localize(7194, "Tool: {0}", toolInvocation.toolId)),
|
|
52
|
+
caption
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
if (isToolResultInputOutputDetails(resultDetails)) {
|
|
56
|
+
for (let i = 0; i < resultDetails.output.length; i++) {
|
|
57
|
+
const outputItem = resultDetails.output[i];
|
|
58
|
+
if (outputItem.type === "embed" && outputItem.mimeType?.startsWith("image/") && !outputItem.isText) {
|
|
59
|
+
pushImage(outputItem.mimeType, decodeBase64(outputItem.value), i);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} else if (isToolResultOutputDetails(resultDetails)) {
|
|
63
|
+
const output = resultDetails.output;
|
|
64
|
+
if (output.mimeType?.startsWith("image/")) {
|
|
65
|
+
const data = getImageDataFromOutputDetails(resultDetails, toolInvocation);
|
|
66
|
+
if (data) {
|
|
67
|
+
pushImage(output.mimeType, data, 0);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return images;
|
|
72
|
+
}
|
|
73
|
+
async function extractImagesFromToolInvocationMessages(toolInvocation, readFile) {
|
|
74
|
+
const message = toolInvocation.pastTenseMessage ?? toolInvocation.invocationMessage;
|
|
75
|
+
if (!message || typeof message === "string" || !message.uris || ( Object.keys(message.uris)).length === 0) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const images = [];
|
|
79
|
+
for (const uriComponents of ( Object.values(message.uris))) {
|
|
80
|
+
const uri = URI.revive(uriComponents);
|
|
81
|
+
const mimeType = getMediaMime(uri.path);
|
|
82
|
+
if (mimeType?.startsWith("image/")) {
|
|
83
|
+
let data;
|
|
84
|
+
try {
|
|
85
|
+
data = await readFile(uri);
|
|
86
|
+
} catch {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const name = uri.path.split("/").pop() ?? "image";
|
|
90
|
+
images.push({
|
|
91
|
+
id: ( uri.toString()),
|
|
92
|
+
uri,
|
|
93
|
+
name,
|
|
94
|
+
mimeType,
|
|
95
|
+
data,
|
|
96
|
+
source: ( localize(7194, "Tool: {0}", toolInvocation.toolId)),
|
|
97
|
+
caption: message.value
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return images;
|
|
102
|
+
}
|
|
103
|
+
function getImageDataFromOutputDetails(resultDetails, toolInvocation) {
|
|
104
|
+
if (toolInvocation.kind === "toolInvocationSerialized") {
|
|
105
|
+
const serializedDetails = resultDetails;
|
|
106
|
+
if (serializedDetails.output.base64Data) {
|
|
107
|
+
return decodeBase64(serializedDetails.output.base64Data);
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
} else {
|
|
111
|
+
return resultDetails.output.value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function extractImageFromInlineReference(part, readFile) {
|
|
115
|
+
const ref = part.inlineReference;
|
|
116
|
+
const refUri = URI.isUri(ref) ? ref : isLocation(ref) ? ref.uri : ref.location.uri;
|
|
117
|
+
const mime = getMediaMime(refUri.path);
|
|
118
|
+
if (!mime?.startsWith("image/")) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
let data;
|
|
122
|
+
try {
|
|
123
|
+
data = await readFile(refUri);
|
|
124
|
+
} catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const name = part.name ?? refUri.path.split("/").pop() ?? "image";
|
|
128
|
+
return {
|
|
129
|
+
id: ( refUri.toString()),
|
|
130
|
+
uri: refUri,
|
|
131
|
+
name,
|
|
132
|
+
mimeType: mime,
|
|
133
|
+
data,
|
|
134
|
+
source: ( localize(7195, "File")),
|
|
135
|
+
caption: undefined
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function coerceImageBuffer(value) {
|
|
139
|
+
return value instanceof Uint8Array ? value : value instanceof ArrayBuffer ? ( new Uint8Array(value)) : (value && typeof value === "object" && !Array.isArray(value)) ? ( new Uint8Array(( ( Object.keys(value)).sort((a, b) => Number(a) - Number(b)).map(key => value[key])))) : undefined;
|
|
140
|
+
}
|
|
141
|
+
function extractImagesFromChatRequest(request) {
|
|
142
|
+
const images = [];
|
|
143
|
+
for (const variable of request.variables) {
|
|
144
|
+
if (!isImageVariableEntry(variable)) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const buffer = coerceImageBuffer(variable.value);
|
|
148
|
+
if (!buffer) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const mimeType = variable.mimeType ?? getMediaMime(variable.name) ?? "image/png";
|
|
152
|
+
const uri = variable.references?.[0]?.reference;
|
|
153
|
+
const imageUri = URI.isUri(uri) ? uri : ( URI.from({
|
|
154
|
+
scheme: "data",
|
|
155
|
+
path: variable.name
|
|
156
|
+
}));
|
|
157
|
+
images.push({
|
|
158
|
+
id: ( imageUri.toString()),
|
|
159
|
+
uri: imageUri,
|
|
160
|
+
name: variable.name,
|
|
161
|
+
mimeType,
|
|
162
|
+
data: VSBuffer.wrap(buffer),
|
|
163
|
+
source: ( localize(7196, "Attachment")),
|
|
164
|
+
caption: undefined
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return images;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export { coerceImageBuffer, extractImagesFromChatRequest, extractImagesFromChatResponse, extractImagesFromToolInvocationMessages, extractImagesFromToolInvocationOutputDetails };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Event } from "@codingame/monaco-vscode-api/vscode/vs/base/common/event";
|
|
2
|
+
import { Disposable, IDisposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
|
|
3
|
+
import { URI } from "@codingame/monaco-vscode-api/vscode/vs/base/common/uri";
|
|
4
|
+
import { FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IFileWriteOptions, IStat } from "@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files";
|
|
5
|
+
import { IFileService } from "@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service";
|
|
6
|
+
/**
|
|
7
|
+
* URI scheme for internal chat prompt files (skills, instructions, agents, etc.)
|
|
8
|
+
* backed by a readonly virtual filesystem.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CHAT_INTERNAL_SCHEME = "vscode-chat-internal";
|
|
11
|
+
/**
|
|
12
|
+
* A readonly virtual filesystem provider for internal chat prompt files.
|
|
13
|
+
*
|
|
14
|
+
* Files are registered at startup via {@link registerFile} and cannot be
|
|
15
|
+
* modified or deleted afterwards.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ChatInternalFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability {
|
|
18
|
+
private readonly files;
|
|
19
|
+
readonly onDidChangeCapabilities: Event<any>;
|
|
20
|
+
readonly onDidChangeFile: Event<any>;
|
|
21
|
+
readonly capabilities: number;
|
|
22
|
+
/**
|
|
23
|
+
* Register a file with static content. Must be called before the
|
|
24
|
+
* file can be read. Typically called once at startup.
|
|
25
|
+
*/
|
|
26
|
+
registerFile(uri: URI, content: string): void;
|
|
27
|
+
watch(): IDisposable;
|
|
28
|
+
stat(resource: URI): Promise<IStat>;
|
|
29
|
+
mkdir(): Promise<void>;
|
|
30
|
+
readdir(resource: URI): Promise<[
|
|
31
|
+
string,
|
|
32
|
+
FileType
|
|
33
|
+
][]>;
|
|
34
|
+
delete(_resource: URI, _opts: IFileDeleteOptions): Promise<void>;
|
|
35
|
+
rename(_from: URI, _to: URI, _opts: IFileOverwriteOptions): Promise<void>;
|
|
36
|
+
readFile(resource: URI): Promise<Uint8Array>;
|
|
37
|
+
writeFile(_resource: URI, _content: Uint8Array, _opts: IFileWriteOptions): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Registers the internal chat filesystem provider with the file service,
|
|
41
|
+
* populates it with built-in files, and returns both the provider (for
|
|
42
|
+
* event subscription) and a disposable for cleanup.
|
|
43
|
+
*/
|
|
44
|
+
export declare function registerChatInternalFileSystem(fileService: IFileService): {
|
|
45
|
+
provider: ChatInternalFileSystemProvider;
|
|
46
|
+
disposable: IDisposable;
|
|
47
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
|
|
2
|
+
import { VSBuffer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/buffer';
|
|
3
|
+
import { Event } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
|
|
4
|
+
import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
5
|
+
import { FileSystemProviderCapabilities, FileType, createFileSystemProviderError, FileSystemProviderErrorCode } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files';
|
|
6
|
+
|
|
7
|
+
const CHAT_INTERNAL_SCHEME = "vscode-chat-internal";
|
|
8
|
+
class ChatInternalFileSystemProvider extends Disposable {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.files = ( new Map());
|
|
12
|
+
this.onDidChangeCapabilities = Event.None;
|
|
13
|
+
this.onDidChangeFile = Event.None;
|
|
14
|
+
this.capabilities = FileSystemProviderCapabilities.FileReadWrite | FileSystemProviderCapabilities.Readonly | FileSystemProviderCapabilities.PathCaseSensitive;
|
|
15
|
+
}
|
|
16
|
+
registerFile(uri, content) {
|
|
17
|
+
this.files.set(( uri.toString()), VSBuffer.fromString(content).buffer);
|
|
18
|
+
}
|
|
19
|
+
watch() {
|
|
20
|
+
return Disposable.None;
|
|
21
|
+
}
|
|
22
|
+
async stat(resource) {
|
|
23
|
+
const data = this.files.get(( resource.toString()));
|
|
24
|
+
if (data) {
|
|
25
|
+
return {
|
|
26
|
+
type: FileType.File,
|
|
27
|
+
ctime: 0,
|
|
28
|
+
mtime: 0,
|
|
29
|
+
size: data.byteLength
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const prefix = ( resource.toString()) + "/";
|
|
33
|
+
for (const key of ( this.files.keys())) {
|
|
34
|
+
if (key.startsWith(prefix)) {
|
|
35
|
+
return {
|
|
36
|
+
type: FileType.Directory,
|
|
37
|
+
ctime: 0,
|
|
38
|
+
mtime: 0,
|
|
39
|
+
size: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw createFileSystemProviderError("file not found", FileSystemProviderErrorCode.FileNotFound);
|
|
44
|
+
}
|
|
45
|
+
async mkdir() {
|
|
46
|
+
throw createFileSystemProviderError("readonly filesystem", FileSystemProviderErrorCode.NoPermissions);
|
|
47
|
+
}
|
|
48
|
+
async readdir(resource) {
|
|
49
|
+
const prefix = ( resource.toString()) + "/";
|
|
50
|
+
const entries = ( new Map());
|
|
51
|
+
for (const key of ( this.files.keys())) {
|
|
52
|
+
if (key.startsWith(prefix)) {
|
|
53
|
+
const rest = key.substring(prefix.length);
|
|
54
|
+
const slash = rest.indexOf("/");
|
|
55
|
+
if (slash === -1) {
|
|
56
|
+
entries.set(rest, FileType.File);
|
|
57
|
+
} else {
|
|
58
|
+
entries.set(rest.substring(0, slash), FileType.Directory);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return [...entries.entries()];
|
|
63
|
+
}
|
|
64
|
+
async delete(_resource, _opts) {
|
|
65
|
+
throw createFileSystemProviderError("readonly filesystem", FileSystemProviderErrorCode.NoPermissions);
|
|
66
|
+
}
|
|
67
|
+
async rename(_from, _to, _opts) {
|
|
68
|
+
throw createFileSystemProviderError("readonly filesystem", FileSystemProviderErrorCode.NoPermissions);
|
|
69
|
+
}
|
|
70
|
+
async readFile(resource) {
|
|
71
|
+
const data = this.files.get(( resource.toString()));
|
|
72
|
+
if (data) {
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
75
|
+
throw createFileSystemProviderError("file not found", FileSystemProviderErrorCode.FileNotFound);
|
|
76
|
+
}
|
|
77
|
+
async writeFile(_resource, _content, _opts) {
|
|
78
|
+
throw createFileSystemProviderError("readonly filesystem", FileSystemProviderErrorCode.NoPermissions);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function registerChatInternalFileSystem(fileService) {
|
|
82
|
+
const provider = ( new ChatInternalFileSystemProvider());
|
|
83
|
+
const registration = fileService.registerProvider(CHAT_INTERNAL_SCHEME, provider);
|
|
84
|
+
return {
|
|
85
|
+
provider,
|
|
86
|
+
disposable: {
|
|
87
|
+
dispose() {
|
|
88
|
+
registration.dispose();
|
|
89
|
+
provider.dispose();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { CHAT_INTERNAL_SCHEME, ChatInternalFileSystemProvider, registerChatInternalFileSystem };
|
|
@@ -221,6 +221,9 @@ function extractSubAgentInvocationIdFromText(text) {
|
|
|
221
221
|
}
|
|
222
222
|
return undefined;
|
|
223
223
|
}
|
|
224
|
+
function hasCodeblockUriTag(text) {
|
|
225
|
+
return text.includes("<vscode_codeblock_uri");
|
|
226
|
+
}
|
|
224
227
|
function hasEditCodeblockUriTag(text) {
|
|
225
228
|
return text.includes("<vscode_codeblock_uri isEdit");
|
|
226
229
|
}
|
|
@@ -264,4 +267,4 @@ function extractVulnerabilitiesFromText(text) {
|
|
|
264
267
|
};
|
|
265
268
|
}
|
|
266
269
|
|
|
267
|
-
export { annotateSpecialMarkdownContent, contentRefUrl, extractCodeblockUrisFromText, extractSubAgentInvocationIdFromText, extractVulnerabilitiesFromText, hasEditCodeblockUriTag, isInsideCodeContext };
|
|
270
|
+
export { annotateSpecialMarkdownContent, contentRefUrl, extractCodeblockUrisFromText, extractSubAgentInvocationIdFromText, extractVulnerabilitiesFromText, hasCodeblockUriTag, hasEditCodeblockUriTag, isInsideCodeContext };
|