From 82479027c5ff88937cd12d42f2a54cbdceb52bad Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Sun, 24 Aug 2025 23:47:40 -0700 Subject: [PATCH 1/7] some thinking improvements (#263204) --- .../workbench/contrib/chat/browser/chatListRenderer.ts | 6 ++++++ src/vs/workbench/contrib/chat/browser/media/chat.css | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index fca47b5141a77..7dd6dbe70a4fc 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -709,6 +709,12 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer Date: Sun, 24 Aug 2025 23:50:22 -0700 Subject: [PATCH 2/7] Update instructions for builds (#262638) * Add more validation instructions * Fix validation instructions numbering * Refined validation instructions --- .github/copilot-instructions.md | 19 +++ .../instructions/telemetry.instructions.md | 114 ++++++++++++++++++ .../instructions/typescript.instructions.md | 25 ---- 3 files changed, 133 insertions(+), 25 deletions(-) create mode 100644 .github/instructions/telemetry.instructions.md delete mode 100644 .github/instructions/typescript.instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index bf7d42ba5a386..a17472617fc96 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -46,6 +46,25 @@ Each extension follows the standard VS Code extension structure with `package.js 3. **Follow imports**: Check what files import the problematic module 4. **Check test files**: Often reveal usage patterns and expected behavior +## Validating TypeScript changes + +You MUST check compilation output before running ANY script or declaring work complete! + +1. **ALWAYS** check the `VS Code - Build` watch task output for compilation errors +2. **NEVER** run tests if there are compilation errors +3. **NEVER** use `npm run compile` to compile TypeScript files, always check task output +4. **FIX** all compilation errors before moving forward + +### TypeScript compilation steps +- Monitor the `VS Code - Build` task outputs for real-time compilation errors as you make changes +- This task runs `Core - Build` and `Ext - Build` to incrementally compile VS Code TypeScript sources and built-in extensions +- Start the task if it's not already running in the background + +### TypeScript validation steps +- Use run test tool or `scripts/test.sh` (`scripts\test.bat` on Windows) for unit tests (add `--grep ` to filter tests) +- Use `scripts/test-integration.sh` (or `scripts\test-integration.bat` on Windows) for integration tests +- Use `npm run valid-layers-check` to check for layering issues + ## Coding Guidelines ### Indentation diff --git a/.github/instructions/telemetry.instructions.md b/.github/instructions/telemetry.instructions.md new file mode 100644 index 0000000000000..ab8c01bca926a --- /dev/null +++ b/.github/instructions/telemetry.instructions.md @@ -0,0 +1,114 @@ +--- +applyTo: '**/*.ts' +description: Telemetry Implementation Guide +--- + +Patterns for GDPR-compliant telemetry in VS Code with proper type safety and privacy protection. + +## Implementation Pattern + +### 1. Define Types +```typescript +type MyFeatureEvent = { + action: string; + duration: number; + success: boolean; + errorCode?: string; +}; + +type MyFeatureClassification = { + action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The action performed.' }; + duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'Time in milliseconds.' }; + success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Whether action succeeded.' }; + errorCode: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'Error code if action failed.' }; + owner: 'yourGitHubUsername'; + comment: 'Tracks MyFeature usage and performance.'; +}; +``` + +### 2.1. Send Event +```typescript +this.telemetryService.publicLog2('myFeatureAction', { + action: 'buttonClick', + duration: 150, + success: true +}); +``` + +### 2.2. Error Events +For error-specific telemetry with stack traces or error messages: +```typescript +type MyErrorEvent = { + operation: string; + errorMessage: string; + duration?: number; +}; + +type MyErrorClassification = { + operation: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'The operation that failed.' }; + errorMessage: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth'; comment: 'The error message.' }; + duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'Time until failure.' }; + owner: 'yourGitHubUsername'; + comment: 'Tracks MyFeature errors for reliability.'; +}; + +this.telemetryService.publicLogError2('myFeatureError', { + operation: 'fileRead', + errorMessage: error.message, + duration: 1200 +}); +``` + +### 3. Service Injection +```typescript +constructor( + @ITelemetryService private readonly telemetryService: ITelemetryService, +) { super(); } +``` + +## GDPR Classifications & Purposes + +**Classifications (choose the most restrictive):** +- `SystemMetaData` - **Most common.** Non-personal system info, user preferences, feature usage, identifiers (extension IDs, language types, counts, durations, success flags) +- `CallstackOrException` - Error messages, stack traces, exception details. **Only for actual error information.** +- `PublicNonPersonalData` - Data already publicly available (rare) + +**Purposes (combine with different classifications):** +- `FeatureInsight` - **Default.** Understanding how features are used, user behavior patterns, feature adoption +- `PerformanceAndHealth` - **For errors & performance.** Metrics, error rates, performance measurements, diagnostics + +**Required Properties:** +- `comment` - Clear explanation of what the field contains and why it's collected +- `owner` - GitHub username (infer from branch or ask) +- `isMeasurement: true` - **Required** for all numeric values flags used in calculations + +## Error Events + +Use `publicLogError2` for errors with `CallstackOrException` classification: + +```typescript +this.telemetryService.publicLogError2('myFeatureError', { + errorMessage: error.message, + errorCode: 'MYFEATURE_001', + context: 'initialization' +}); +``` + +## Naming & Privacy Rules + +**Naming Conventions:** +- Event names: `camelCase` with context (`extensionActivationError`, `chatMessageSent`) +- Property names: specific and descriptive (`agentId` not `id`, `durationMs` not `duration`) +- Common patterns: `success/hasError/isEnabled`, `sessionId/extensionId`, `type/kind/source` + +**Critical Don'ts:** +- ❌ No PII (usernames, emails, file paths, content) +- ❌ Missing `owner` field in classification (infer from branch name or ask user) +- ❌ Vague comments ("user data" → "selected language identifier") +- ❌ Wrong classification +- ❌ Missing `isMeasurement` on numeric metrics + +**Privacy Requirements:** +- Minimize data collection to essential insights only +- Use hashes/categories instead of raw values when possible +- Document clear purpose for each data point diff --git a/.github/instructions/typescript.instructions.md b/.github/instructions/typescript.instructions.md deleted file mode 100644 index f5bd2aaae8899..0000000000000 --- a/.github/instructions/typescript.instructions.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -applyTo: '**/*.ts' ---- - -# VS Code Copilot Development Instructions for TypeScript - -You MUST check compilation output before running ANY script or declaring work complete! - -1. **ALWAYS** check the "VS Code - Build" task output for compilation errors -3. **NEVER** run tests if there are compilation errors -3. **NEVER** use `npm run compile` to compile TypeScript files, always check task output -4. **FIX** all compilation errors before moving forward - -## TypeScript compilation steps - -Typescript compilation errors can be found by running the "VS Code - Build" task, which compiles the VS Code TypeScript sources and the built-in extensions: -- This background task may already be running from previous development sessions -- If not already running, start the task to get real-time compilation feedback -- The task provides incremental compilation, so it will automatically recompile when files change - -## TypeScript validation steps -- Use `scripts/test.sh` (or `scripts\test.bat` on Windows) for unit tests (add `--grep ` to filter tests) -- Use `scripts/test-integration.sh` (or `scripts\test-integration.bat` on Windows) for integration tests -- Use `npm run valid-layers-check` to check for layering issues - From 2509d0f66d2b5866e9d8322e3f8f709b33e11352 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 Aug 2025 09:55:06 +0200 Subject: [PATCH 3/7] chat - use `chatSparkle` consistently (#263211) cc @eli-w-king --- .../contrib/chat/browser/actions/chatQuickInputActions.ts | 4 ++-- src/vs/workbench/contrib/chat/browser/chatEditorInput.ts | 2 +- .../workbench/contrib/inlineChat/browser/inlineChatActions.ts | 2 +- .../terminalContrib/chat/browser/terminalChatActions.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.ts index f5f9343bed897..e6bb0e25d247e 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.ts @@ -26,7 +26,7 @@ export function registerQuickChatActions() { title: localize2('chat.openInChatView.label', "Open in Chat View"), f1: false, category: CHAT_CATEGORY, - icon: Codicon.commentDiscussion, + icon: Codicon.chatSparkle, menu: { id: MenuId.ChatInputSide, group: 'navigation', @@ -71,7 +71,7 @@ class QuickChatGlobalAction extends Action2 { id: ASK_QUICK_QUESTION_ACTION_ID, title: localize2('quickChat', 'Quick Chat'), precondition: ChatContextKeys.enabled, - icon: Codicon.commentDiscussion, + icon: Codicon.chatSparkle, f1: false, category: CHAT_CATEGORY, keybinding: { diff --git a/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts b/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts index d60bc3d53814a..4e839a8db1f0e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts @@ -23,7 +23,7 @@ import { ChatAgentLocation } from '../common/constants.js'; import { IClearEditingSessionConfirmationOptions } from './actions/chatActions.js'; import type { IChatEditorOptions } from './chatEditor.js'; -const ChatEditorIcon = registerIcon('chat-editor-label-icon', Codicon.commentDiscussion, nls.localize('chatEditorLabelIcon', 'Icon of the chat editor label.')); +const ChatEditorIcon = registerIcon('chat-editor-label-icon', Codicon.chatSparkle, nls.localize('chatEditorLabelIcon', 'Icon of the chat editor label.')); export class ChatEditorInput extends EditorInput implements IEditorCloseHandler { static readonly countsInUse = new Set(); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index c5a015719bf81..4849a2b062123 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -488,7 +488,7 @@ export class ViewInChatAction extends AbstractInline1ChatAction { super({ id: ACTION_VIEW_IN_CHAT, title: localize('viewInChat', 'View in Chat'), - icon: Codicon.commentDiscussion, + icon: Codicon.chatSparkle, precondition: CTX_INLINE_CHAT_VISIBLE, menu: [{ id: MENU_INLINE_CHAT_WIDGET_STATUS, diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index 9878c01548a00..8271c7cdb5d91 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -281,7 +281,7 @@ registerActiveXtermAction({ ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), ), - icon: Codicon.commentDiscussion, + icon: Codicon.chatSparkle, menu: [{ id: MENU_TERMINAL_CHAT_WIDGET_STATUS, group: 'zzz', From 5c9a45ef5004af76d13a9a5f0b3e8cdf8708e4a3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 25 Aug 2025 11:00:48 +0200 Subject: [PATCH 4/7] show icon for ai actions in hover (#263225) --- src/vs/base/browser/ui/hover/hoverWidget.css | 5 +++++ src/vs/base/browser/ui/hover/hoverWidget.ts | 3 ++- .../editor/contrib/hover/browser/markerHoverParticipant.ts | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/hover/hoverWidget.css b/src/vs/base/browser/ui/hover/hoverWidget.css index ccaac1ed9b23c..11f1fdccc7c09 100644 --- a/src/vs/base/browser/ui/hover/hoverWidget.css +++ b/src/vs/base/browser/ui/hover/hoverWidget.css @@ -138,6 +138,7 @@ .monaco-hover .hover-row.status-bar .actions .action-container .action .icon { padding-right: 4px; + vertical-align: middle; } .monaco-hover .hover-row.status-bar .actions .action-container a { @@ -145,6 +146,10 @@ text-decoration: var(--text-link-decoration); } +.monaco-hover .hover-row.status-bar .actions .action-container a .icon.codicon { + color: var(--vscode-textLink-foreground); +} + .monaco-hover .markdown-hover .hover-contents .codicon { color: inherit; font-size: inherit; diff --git a/src/vs/base/browser/ui/hover/hoverWidget.ts b/src/vs/base/browser/ui/hover/hoverWidget.ts index c2f976a8ce8e3..cafeb69f17a8c 100644 --- a/src/vs/base/browser/ui/hover/hoverWidget.ts +++ b/src/vs/base/browser/ui/hover/hoverWidget.ts @@ -74,7 +74,8 @@ export class HoverAction extends Disposable { this.action = dom.append(this.actionContainer, $('a.action')); this.action.setAttribute('role', 'button'); if (actionOptions.iconClass) { - dom.append(this.action, $(`span.icon.${actionOptions.iconClass}`)); + const iconElement = dom.append(this.action, $(`span.icon`)); + iconElement.classList.add(...actionOptions.iconClass.split(' ')); } this.actionRenderedLabel = keybindingLabel ? `${actionOptions.label} (${keybindingLabel})` : actionOptions.label; const label = dom.append(this.action, $('span')); diff --git a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index b98ab86b945e5..c9f7c4479de11 100644 --- a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -26,6 +26,8 @@ import { ITextEditorOptions } from '../../../../platform/editor/common/editor.js import { IMarker, IMarkerData, MarkerSeverity } from '../../../../platform/markers/common/markers.js'; import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { Progress } from '../../../../platform/progress/common/progress.js'; +import { ThemeIcon } from '../../../../base/common/themables.js'; +import { Codicon } from '../../../../base/common/codicons.js'; const $ = dom.$; @@ -264,6 +266,7 @@ export class MarkerHoverParticipant implements IEditorHoverParticipant { const controller = CodeActionController.get(this._editor); controller?.applyCodeAction(aiCodeAction, false, false, ApplyCodeActionReason.FromProblemsHover); From d551c82a5af8b82abc26d9da49a28591cbb8a67b Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 25 Aug 2025 10:46:23 +0200 Subject: [PATCH 5/7] Adds currentDeletedLineCount to editTelemetry.reportEditArc --- .../editTelemetry/browser/telemetry/arcTelemetrySender.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts b/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts index 466595a6092b0..88723d82bdace 100644 --- a/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts +++ b/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts @@ -146,6 +146,7 @@ export class ChatArcTelemetrySender extends Disposable { originalLineCount: number; currentLineCount: number; originalDeletedLineCount: number; + currentDeletedLineCount: number; }, { owner: 'hediet'; comment: 'Reports the accepted and retained character count for an inline completion/edit.'; @@ -168,6 +169,7 @@ export class ChatArcTelemetrySender extends Disposable { originalLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original line count before any edits.' }; currentLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current line count after edits.' }; originalDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original deleted line count before any edits.' }; + currentDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current deleted line count after edits.' }; }>('editTelemetry.reportEditArc', { sourceKeyCleaned: data.toKey(Number.MAX_SAFE_INTEGER, { $extensionId: false, @@ -196,6 +198,7 @@ export class ChatArcTelemetrySender extends Disposable { originalLineCount: res.originalLineCount, currentLineCount: res.currentLineCount, originalDeletedLineCount: res.originalDeletedLineCount, + currentDeletedLineCount: res.currentDeletedLineCount, ...forwardToChannelIf(isCopilotLikeExtension(data.props.$extensionId)), }); From fc6145238255fc968d5f384f662fd700c570f7cd Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 25 Aug 2025 09:17:27 +0000 Subject: [PATCH 6/7] SCM - remove code that is not being referenced (#263227) --- src/vs/workbench/contrib/scm/common/scm.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index 638f694dce75a..9f10ac505ef75 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -243,7 +243,3 @@ export interface ISCMViewService { readonly activeRepository: IObservable; pinActiveRepository(repository: ISCMRepository | undefined): void; } - -export const SCM_CHANGES_EDITOR_ID = 'workbench.editor.scmChangesEditor'; - -export interface ISCMChangesEditor { } From 21263f009d516ad4f41431f3a410a9cf627a6a04 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 25 Aug 2025 11:44:33 +0200 Subject: [PATCH 7/7] reorder fields to group them --- .../browser/telemetry/arcTelemetrySender.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts b/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts index 88723d82bdace..dc25bf50bcfb4 100644 --- a/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts +++ b/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.ts @@ -52,11 +52,12 @@ export class InlineEditArcTelemetrySender extends Disposable { languageId: string; didBranchChange: number; timeDelayMs: number; - arc: number; + originalCharCount: number; originalLineCount: number; - currentLineCount: number; originalDeletedLineCount: number; + arc: number; + currentLineCount: number; currentDeletedLineCount: number; }, { owner: 'hediet'; @@ -69,11 +70,12 @@ export class InlineEditArcTelemetrySender extends Disposable { didBranchChange: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Indicates if the branch changed in the meantime. If the branch changed (value is 1); this event should probably be ignored.' }; timeDelayMs: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The time delay between the user accepting the edit and measuring the survival rate.' }; - arc: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The accepted and restrained character count.' }; + originalCharCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original character count before any edits.' }; originalLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original line count before any edits.' }; - currentLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current line count after edits.' }; originalDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original deleted line count before any edits.' }; + arc: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The accepted and restrained character count.' }; + currentLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current line count after edits.' }; currentDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current deleted line count after edits.' }; }>('editTelemetry.reportInlineEditArc', { extensionId: data.$extensionId ?? '', @@ -82,11 +84,12 @@ export class InlineEditArcTelemetrySender extends Disposable { languageId: data.$$languageId, didBranchChange: res.didBranchChange ? 1 : 0, timeDelayMs: res.timeDelayMs, - arc: res.arc, + originalCharCount: res.originalCharCount, originalLineCount: res.originalLineCount, - currentLineCount: res.currentLineCount, originalDeletedLineCount: res.originalDeletedLineCount, + arc: res.arc, + currentLineCount: res.currentLineCount, currentDeletedLineCount: res.currentDeletedLineCount, ...forwardToChannelIf(isCopilotLikeExtension(data.$extensionId)), @@ -140,12 +143,12 @@ export class ChatArcTelemetrySender extends Disposable { didBranchChange: number; timeDelayMs: number; - arc: number; - originalCharCount: number; + originalCharCount: number; originalLineCount: number; - currentLineCount: number; originalDeletedLineCount: number; + arc: number; + currentLineCount: number; currentDeletedLineCount: number; }, { owner: 'hediet'; @@ -164,11 +167,12 @@ export class ChatArcTelemetrySender extends Disposable { didBranchChange: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Indicates if the branch changed in the meantime. If the branch changed (value is 1); this event should probably be ignored.' }; timeDelayMs: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The time delay between the user accepting the edit and measuring the survival rate.' }; - arc: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The accepted and restrained character count.' }; + originalCharCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original character count before any edits.' }; originalLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original line count before any edits.' }; - currentLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current line count after edits.' }; originalDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original deleted line count before any edits.' }; + arc: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The accepted and restrained character count.' }; + currentLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current line count after edits.' }; currentDeletedLineCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The current deleted line count after edits.' }; }>('editTelemetry.reportEditArc', { sourceKeyCleaned: data.toKey(Number.MAX_SAFE_INTEGER, { @@ -192,12 +196,12 @@ export class ChatArcTelemetrySender extends Disposable { didBranchChange: res.didBranchChange ? 1 : 0, timeDelayMs: res.timeDelayMs, - arc: res.arc, - originalCharCount: res.originalCharCount, + originalCharCount: res.originalCharCount, originalLineCount: res.originalLineCount, - currentLineCount: res.currentLineCount, originalDeletedLineCount: res.originalDeletedLineCount, + arc: res.arc, + currentLineCount: res.currentLineCount, currentDeletedLineCount: res.currentDeletedLineCount, ...forwardToChannelIf(isCopilotLikeExtension(data.props.$extensionId)),