@codingame/monaco-vscode-telemetry-service-override 32.0.1 → 33.0.9

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 (48) hide show
  1. package/index.js +2 -0
  2. package/package.json +3 -3
  3. package/vscode/src/vs/platform/telemetry/common/telemetryLogAppender.js +1 -1
  4. package/vscode/src/vs/platform/telemetry/common/telemetryService.js +21 -21
  5. package/vscode/src/vs/workbench/contrib/bracketPairColorizer2Telemetry/browser/bracketPairColorizer2Telemetry.contribution.d.ts +1 -0
  6. package/vscode/src/vs/workbench/contrib/bracketPairColorizer2Telemetry/browser/bracketPairColorizer2Telemetry.contribution.js +34 -0
  7. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/aiContributionFeature.d.ts +15 -0
  8. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/aiContributionFeature.js +97 -0
  9. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsChart.d.ts +24 -0
  10. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsChart.js +236 -0
  11. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsFeature.d.ts +24 -0
  12. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsFeature.js +213 -0
  13. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsStatusBar.d.ts +27 -0
  14. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsStatusBar.js +250 -0
  15. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/media.css +127 -0
  16. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetry.contribution.d.ts +1 -0
  17. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetry.contribution.js +75 -0
  18. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetryContribution.d.ts +8 -0
  19. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetryContribution.js +82 -0
  20. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/annotatedDocuments.d.ts +30 -0
  21. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/annotatedDocuments.js +79 -0
  22. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/documentWithAnnotatedEdits.d.ts +128 -0
  23. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/documentWithAnnotatedEdits.js +297 -0
  24. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/observableWorkspace.d.ts +31 -0
  25. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/observableWorkspace.js +66 -0
  26. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/utils.d.ts +9 -0
  27. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/utils.js +47 -0
  28. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/vscodeObservableWorkspace.d.ts +26 -0
  29. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/vscodeObservableWorkspace.js +84 -0
  30. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settingIds.d.ts +2 -0
  31. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settingIds.js +6 -0
  32. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settings.d.ts +3 -0
  33. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settings.js +7 -0
  34. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetryReporter.d.ts +37 -0
  35. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetryReporter.js +80 -0
  36. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.d.ts +20 -0
  37. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.js +173 -0
  38. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingFeature.d.ts +23 -0
  39. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingFeature.js +232 -0
  40. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingImpl.d.ts +48 -0
  41. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingImpl.js +292 -0
  42. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editTracker.d.ts +41 -0
  43. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editTracker.js +99 -0
  44. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/scmAdapter.d.ts +18 -0
  45. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/scmAdapter.js +44 -0
  46. package/vscode/src/vs/workbench/contrib/editTelemetry/common/arcTracker.d.ts +29 -0
  47. package/vscode/src/vs/workbench/contrib/editTelemetry/common/arcTracker.js +64 -0
  48. package/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.js +1 -1
@@ -0,0 +1,80 @@
1
+
2
+ import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
+ import { TimeoutTimer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
4
+ import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
5
+ import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
6
+ import { BaseStringEdit } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/core/edits/stringEdit';
7
+ import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
8
+ import { ArcTracker } from '../../common/arcTracker.js';
9
+ import { runOnChange } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/utils/runOnChange';
10
+
11
+ let ArcTelemetryReporter = class ArcTelemetryReporter extends Disposable {
12
+ constructor(
13
+ _timesMs,
14
+ _documentValueBeforeTrackedEdit,
15
+ _document,
16
+ _gitRepo,
17
+ _trackedEdit,
18
+ _sendTelemetryEvent,
19
+ _dispose,
20
+ _telemetryService
21
+ ) {
22
+ super();
23
+ this._timesMs = _timesMs;
24
+ this._documentValueBeforeTrackedEdit = _documentValueBeforeTrackedEdit;
25
+ this._document = _document;
26
+ this._gitRepo = _gitRepo;
27
+ this._trackedEdit = _trackedEdit;
28
+ this._sendTelemetryEvent = _sendTelemetryEvent;
29
+ this._dispose = _dispose;
30
+ this._telemetryService = _telemetryService;
31
+ this._arcTracker = ( new ArcTracker(this._documentValueBeforeTrackedEdit, this._trackedEdit));
32
+ this._store.add(runOnChange(this._document.value, (_val, _prevVal, changes) => {
33
+ const edit = BaseStringEdit.composeOrUndefined(( changes.map(c => c.edit)));
34
+ if (edit) {
35
+ this._arcTracker.handleEdits(edit);
36
+ }
37
+ }));
38
+ this._initialLineCounts = this._arcTracker.getLineCountInfo();
39
+ this._initialBranchName = this._gitRepo.get()?.headBranchNameObs.get();
40
+ for (let i = 0; i < this._timesMs.length; i++) {
41
+ const timeMs = this._timesMs[i];
42
+ if (timeMs <= 0) {
43
+ this._report(timeMs);
44
+ } else {
45
+ this._reportAfter(timeMs, i === this._timesMs.length - 1 ? () => {
46
+ this._dispose();
47
+ } : undefined);
48
+ }
49
+ }
50
+ }
51
+ _reportAfter(timeoutMs, cb) {
52
+ const timer = new TimeoutTimer(() => {
53
+ this._report(timeoutMs);
54
+ timer.dispose();
55
+ if (cb) {
56
+ cb();
57
+ }
58
+ }, timeoutMs);
59
+ this._store.add(timer);
60
+ }
61
+ _report(timeMs) {
62
+ const currentBranch = this._gitRepo.get()?.headBranchNameObs.get();
63
+ const didBranchChange = currentBranch !== this._initialBranchName;
64
+ const currentLineCounts = this._arcTracker.getLineCountInfo();
65
+ this._sendTelemetryEvent({
66
+ telemetryService: this._telemetryService,
67
+ timeDelayMs: timeMs,
68
+ didBranchChange,
69
+ arc: this._arcTracker.getAcceptedRestrainedCharactersCount(),
70
+ originalCharCount: this._arcTracker.getOriginalCharacterCount(),
71
+ currentLineCount: currentLineCounts.insertedLineCounts,
72
+ currentDeletedLineCount: currentLineCounts.deletedLineCounts,
73
+ originalLineCount: this._initialLineCounts.insertedLineCounts,
74
+ originalDeletedLineCount: this._initialLineCounts.deletedLineCounts
75
+ });
76
+ }
77
+ };
78
+ ArcTelemetryReporter = ( __decorate([( __param(7, ITelemetryService))], ArcTelemetryReporter));
79
+
80
+ export { ArcTelemetryReporter };
@@ -0,0 +1,20 @@
1
+ import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
2
+ import { IObservable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/observable";
3
+ import { IInstantiationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
4
+ import { EditSourceData, IDocumentWithAnnotatedEdits } from "../helpers/documentWithAnnotatedEdits.js";
5
+ import { IAiEditTelemetryService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryService.service";
6
+ import type { ScmRepoAdapter } from "./scmAdapter.js";
7
+ import { IRandomService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/editTelemetry/browser/randomService.service";
8
+ export declare class EditTelemetryReportInlineEditArcSender extends Disposable {
9
+ private readonly _instantiationService;
10
+ constructor(docWithAnnotatedEdits: IDocumentWithAnnotatedEdits<EditSourceData>, scmRepoBridge: IObservable<ScmRepoAdapter | undefined>, _instantiationService: IInstantiationService);
11
+ }
12
+ export declare class CreateSuggestionIdForChatOrInlineChatCaller extends Disposable {
13
+ private readonly _aiEditTelemetryService;
14
+ constructor(docWithAnnotatedEdits: IDocumentWithAnnotatedEdits<EditSourceData>, _aiEditTelemetryService: IAiEditTelemetryService);
15
+ }
16
+ export declare class EditTelemetryReportEditArcForChatOrInlineChatSender extends Disposable {
17
+ private readonly _instantiationService;
18
+ private readonly _randomService;
19
+ constructor(docWithAnnotatedEdits: IDocumentWithAnnotatedEdits<EditSourceData>, scmRepoBridge: IObservable<ScmRepoAdapter | undefined>, _instantiationService: IInstantiationService, _randomService: IRandomService);
20
+ }
@@ -0,0 +1,173 @@
1
+
2
+ import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
+ import { onUnexpectedError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
4
+ import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
5
+ import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
6
+ import { AnnotatedStringEdit } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/core/edits/stringEdit';
7
+ import { EditDeltaInfo } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/textModelEditSource';
8
+ import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
9
+ import { createDocWithJustReason } from '../helpers/documentWithAnnotatedEdits.js';
10
+ import { IAiEditTelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryService.service';
11
+ import { forwardToChannelIf, isCopilotLikeExtension } from '@codingame/monaco-vscode-api/vscode/vs/platform/dataChannel/browser/forwardingTelemetryService';
12
+ import { ProviderId } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/languages';
13
+ import { ArcTelemetryReporter } from './arcTelemetryReporter.js';
14
+ import { IRandomService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/editTelemetry/browser/randomService.service';
15
+ import { runOnChange } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/utils/runOnChange';
16
+
17
+ let EditTelemetryReportInlineEditArcSender = class EditTelemetryReportInlineEditArcSender extends Disposable {
18
+ constructor(docWithAnnotatedEdits, scmRepoBridge, _instantiationService) {
19
+ super();
20
+ this._instantiationService = _instantiationService;
21
+ this._register(runOnChange(docWithAnnotatedEdits.value, (_val, _prev, changes) => {
22
+ const edit = AnnotatedStringEdit.compose(( changes.map(c => c.edit)));
23
+ if (!( edit.replacements.some(r => r.data.editSource.metadata.source === "inlineCompletionAccept"))) {
24
+ return;
25
+ }
26
+ if (!edit.replacements.every(r => r.data.editSource.metadata.source === "inlineCompletionAccept")) {
27
+ onUnexpectedError(( new Error("ArcTelemetrySender: Not all edits are inline completion accept edits!")));
28
+ return;
29
+ }
30
+ if (edit.replacements[0].data.editSource.metadata.source !== "inlineCompletionAccept") {
31
+ return;
32
+ }
33
+ const data = edit.replacements[0].data.editSource.metadata;
34
+ const docWithJustReason = createDocWithJustReason(docWithAnnotatedEdits, this._store);
35
+ const reporter = this._store.add(
36
+ this._instantiationService.createInstance(ArcTelemetryReporter, ( [0, 30, 120, 300, 600, 900].map(s => s * 1000)), _prev, docWithJustReason, scmRepoBridge, edit, res => {
37
+ res.telemetryService.publicLog2("editTelemetry.reportInlineEditArc", {
38
+ extensionId: data.$extensionId ?? "",
39
+ extensionVersion: data.$extensionVersion ?? "",
40
+ opportunityId: data.$$requestUuid ?? "unknown",
41
+ languageId: data.$$languageId,
42
+ correlationId: data.$$correlationId,
43
+ didBranchChange: res.didBranchChange ? 1 : 0,
44
+ timeDelayMs: res.timeDelayMs,
45
+ originalCharCount: res.originalCharCount,
46
+ originalLineCount: res.originalLineCount,
47
+ originalDeletedLineCount: res.originalDeletedLineCount,
48
+ arc: res.arc,
49
+ currentLineCount: res.currentLineCount,
50
+ currentDeletedLineCount: res.currentDeletedLineCount,
51
+ ...forwardToChannelIf(isCopilotLikeExtension(data.$extensionId))
52
+ });
53
+ }, () => {
54
+ this._store.delete(reporter);
55
+ })
56
+ );
57
+ }));
58
+ }
59
+ };
60
+ EditTelemetryReportInlineEditArcSender = ( __decorate([( __param(2, IInstantiationService))], EditTelemetryReportInlineEditArcSender));
61
+ let CreateSuggestionIdForChatOrInlineChatCaller = class CreateSuggestionIdForChatOrInlineChatCaller extends Disposable {
62
+ constructor(docWithAnnotatedEdits, _aiEditTelemetryService) {
63
+ super();
64
+ this._aiEditTelemetryService = _aiEditTelemetryService;
65
+ this._register(runOnChange(docWithAnnotatedEdits.value, (_val, _prev, changes) => {
66
+ const edit = AnnotatedStringEdit.compose(( changes.map(c => c.edit)));
67
+ const supportedSource = ( new Set(["Chat.applyEdits", "inlineChat.applyEdits"]));
68
+ if (!( edit.replacements.some(r => ( supportedSource.has(r.data.editSource.metadata.source))))) {
69
+ return;
70
+ }
71
+ if (!edit.replacements.every(r => ( supportedSource.has(r.data.editSource.metadata.source)))) {
72
+ onUnexpectedError(( new Error(
73
+ `ArcTelemetrySender: Not all edits are ${edit.replacements[0].data.editSource.metadata.source}!`
74
+ )));
75
+ return;
76
+ }
77
+ let applyCodeBlockSuggestionId = undefined;
78
+ const data = edit.replacements[0].data.editSource;
79
+ let feature;
80
+ if (data.metadata.source === "Chat.applyEdits") {
81
+ feature = "sideBarChat";
82
+ if (data.metadata.$$mode === "applyCodeBlock") {
83
+ applyCodeBlockSuggestionId = data.metadata.$$codeBlockSuggestionId;
84
+ }
85
+ } else {
86
+ feature = "inlineChat";
87
+ }
88
+ const providerId = ( new ProviderId(
89
+ data.props.$extensionId,
90
+ data.props.$extensionVersion,
91
+ data.props.$providerId
92
+ ));
93
+ this._aiEditTelemetryService.createSuggestionId({
94
+ applyCodeBlockSuggestionId,
95
+ languageId: data.props.$$languageId,
96
+ presentation: "highlightedEdit",
97
+ feature,
98
+ source: providerId,
99
+ modelId: data.props.$modelId,
100
+ modeId: data.props.$$mode,
101
+ editDeltaInfo: EditDeltaInfo.fromEdit(edit, _prev),
102
+ sourceRequestId: undefined
103
+ });
104
+ }));
105
+ }
106
+ };
107
+ CreateSuggestionIdForChatOrInlineChatCaller = ( __decorate([( __param(1, IAiEditTelemetryService))], CreateSuggestionIdForChatOrInlineChatCaller));
108
+ let EditTelemetryReportEditArcForChatOrInlineChatSender = class EditTelemetryReportEditArcForChatOrInlineChatSender extends Disposable {
109
+ constructor(
110
+ docWithAnnotatedEdits,
111
+ scmRepoBridge,
112
+ _instantiationService,
113
+ _randomService
114
+ ) {
115
+ super();
116
+ this._instantiationService = _instantiationService;
117
+ this._randomService = _randomService;
118
+ this._register(runOnChange(docWithAnnotatedEdits.value, (_val, _prev, changes) => {
119
+ const edit = AnnotatedStringEdit.compose(( changes.map(c => c.edit)));
120
+ const supportedSource = ( new Set(["Chat.applyEdits", "inlineChat.applyEdits"]));
121
+ if (!( edit.replacements.some(r => ( supportedSource.has(r.data.editSource.metadata.source))))) {
122
+ return;
123
+ }
124
+ if (!edit.replacements.every(r => ( supportedSource.has(r.data.editSource.metadata.source)))) {
125
+ onUnexpectedError(( new Error(
126
+ `ArcTelemetrySender: Not all edits are ${edit.replacements[0].data.editSource.metadata.source}!`
127
+ )));
128
+ return;
129
+ }
130
+ const data = edit.replacements[0].data.editSource;
131
+ const uniqueEditId = this._randomService.generateUuid();
132
+ const docWithJustReason = createDocWithJustReason(docWithAnnotatedEdits, this._store);
133
+ const reporter = this._store.add(
134
+ this._instantiationService.createInstance(ArcTelemetryReporter, ( [0, 60, 300].map(s => s * 1000)), _prev, docWithJustReason, scmRepoBridge, edit, res => {
135
+ res.telemetryService.publicLog2("editTelemetry.reportEditArc", {
136
+ sourceKeyCleaned: data.toKey(Number.MAX_SAFE_INTEGER, {
137
+ $extensionId: false,
138
+ $extensionVersion: false,
139
+ $$requestUuid: false,
140
+ $$sessionId: false,
141
+ $$requestId: false,
142
+ $$languageId: false,
143
+ $modelId: false
144
+ }),
145
+ extensionId: data.props.$extensionId,
146
+ extensionVersion: data.props.$extensionVersion,
147
+ opportunityId: data.props.$$requestUuid,
148
+ editSessionId: data.props.$$sessionId,
149
+ requestId: data.props.$$requestId,
150
+ modelId: data.props.$modelId,
151
+ languageId: data.props.$$languageId,
152
+ mode: data.props.$$mode,
153
+ uniqueEditId,
154
+ didBranchChange: res.didBranchChange ? 1 : 0,
155
+ timeDelayMs: res.timeDelayMs,
156
+ originalCharCount: res.originalCharCount,
157
+ originalLineCount: res.originalLineCount,
158
+ originalDeletedLineCount: res.originalDeletedLineCount,
159
+ arc: res.arc,
160
+ currentLineCount: res.currentLineCount,
161
+ currentDeletedLineCount: res.currentDeletedLineCount,
162
+ ...forwardToChannelIf(isCopilotLikeExtension(data.props.$extensionId))
163
+ });
164
+ }, () => {
165
+ this._store.delete(reporter);
166
+ })
167
+ );
168
+ }));
169
+ }
170
+ };
171
+ EditTelemetryReportEditArcForChatOrInlineChatSender = ( __decorate([( __param(2, IInstantiationService)), ( __param(3, IRandomService))], EditTelemetryReportEditArcForChatOrInlineChatSender));
172
+
173
+ export { CreateSuggestionIdForChatOrInlineChatCaller, EditTelemetryReportEditArcForChatOrInlineChatSender, EditTelemetryReportInlineEditArcSender };
@@ -0,0 +1,23 @@
1
+ import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
2
+ import { IConfigurationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service";
3
+ import { IInstantiationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
4
+ import { IEditorService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/editor/common/editorService.service";
5
+ import { IStatusbarService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/statusbar/browser/statusbar.service";
6
+ import { IAnnotatedDocuments } from "../helpers/annotatedDocuments.js";
7
+ import { VSCodeWorkspace } from "../helpers/vscodeObservableWorkspace.js";
8
+ import { IExtensionService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensions.service";
9
+ export declare class EditTrackingFeature extends Disposable {
10
+ private readonly _workspace;
11
+ private readonly _annotatedDocuments;
12
+ private readonly _configurationService;
13
+ private readonly _instantiationService;
14
+ private readonly _statusbarService;
15
+ private readonly _editorService;
16
+ private readonly _extensionService;
17
+ private readonly _editSourceTrackingShowDecorations;
18
+ private readonly _editSourceTrackingShowStatusBar;
19
+ private readonly _showStateInMarkdownDoc;
20
+ private readonly _toggleDecorations;
21
+ constructor(_workspace: VSCodeWorkspace, _annotatedDocuments: IAnnotatedDocuments, _configurationService: IConfigurationService, _instantiationService: IInstantiationService, _statusbarService: IStatusbarService, _editorService: IEditorService, _extensionService: IExtensionService);
22
+ private _createEditSourceAgenda;
23
+ }
@@ -0,0 +1,232 @@
1
+
2
+ import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
+ import { CachedFunction } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cache';
4
+ import { MarkdownString } from '@codingame/monaco-vscode-api/vscode/vs/base/common/htmlContent';
5
+ import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
6
+ import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
7
+ import { DynamicCssRules } from '@codingame/monaco-vscode-api/vscode/vs/editor/browser/editorDom';
8
+ import { observableCodeEditor } from '@codingame/monaco-vscode-api/vscode/vs/editor/browser/observableCodeEditor';
9
+ import { CodeEditorWidget } from '@codingame/monaco-vscode-api/vscode/vs/editor/browser/widget/codeEditor/codeEditorWidget';
10
+ import { CommandsRegistry } from '@codingame/monaco-vscode-api/vscode/vs/platform/commands/common/commands';
11
+ import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
12
+ import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
13
+ import { ServiceCollection } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/serviceCollection';
14
+ import { observableConfigValue } from '@codingame/monaco-vscode-api/vscode/vs/platform/observable/common/platformObservableUtils';
15
+ import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
16
+ import { IEditorService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/editor/common/editorService.service';
17
+ import { StatusbarAlignment } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/statusbar/browser/statusbar';
18
+ import { IStatusbarService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/statusbar/browser/statusbar.service';
19
+ import { EditSourceTrackingImpl } from './editSourceTrackingImpl.js';
20
+ import { DataChannelForwardingTelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/dataChannel/browser/forwardingTelemetryService';
21
+ import { EDIT_TELEMETRY_SHOW_DECORATIONS, EDIT_TELEMETRY_SHOW_STATUS_BAR, EDIT_TELEMETRY_DETAILS_SETTING_ID } from '../settings.js';
22
+ import { IExtensionService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensions.service';
23
+ import { observableFromEvent } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/observables/observableFromEvent';
24
+ import { derived, derivedWithSetter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/observables/derived';
25
+ import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
26
+ import { mapObservableArrayCached } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/utils/utils';
27
+ import { observableValue } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/observables/observableValue';
28
+
29
+ let EditTrackingFeature = class EditTrackingFeature extends Disposable {
30
+ constructor(
31
+ _workspace,
32
+ _annotatedDocuments,
33
+ _configurationService,
34
+ _instantiationService,
35
+ _statusbarService,
36
+ _editorService,
37
+ _extensionService
38
+ ) {
39
+ super();
40
+ this._workspace = _workspace;
41
+ this._annotatedDocuments = _annotatedDocuments;
42
+ this._configurationService = _configurationService;
43
+ this._instantiationService = _instantiationService;
44
+ this._statusbarService = _statusbarService;
45
+ this._editorService = _editorService;
46
+ this._extensionService = _extensionService;
47
+ this._showStateInMarkdownDoc = "editTelemetry.showDebugDetails";
48
+ this._toggleDecorations = "editTelemetry.toggleDebugDecorations";
49
+ this._editSourceTrackingShowDecorations = makeSettable(
50
+ observableConfigValue(EDIT_TELEMETRY_SHOW_DECORATIONS, false, this._configurationService)
51
+ );
52
+ this._editSourceTrackingShowStatusBar = observableConfigValue(EDIT_TELEMETRY_SHOW_STATUS_BAR, false, this._configurationService);
53
+ const editSourceDetailsEnabled = observableConfigValue(EDIT_TELEMETRY_DETAILS_SETTING_ID, false, this._configurationService);
54
+ const extensions = observableFromEvent(this._extensionService.onDidChangeExtensions, () => {
55
+ return this._extensionService.extensions;
56
+ });
57
+ const extensionIds = derived(reader => ( new Set(( extensions.read(reader).map(e => e.id?.toLowerCase())))));
58
+ function getExtensionInfoObs(extensionId, extensionService) {
59
+ const extIdLowerCase = extensionId.toLowerCase();
60
+ return derived(reader => ( extensionIds.read(reader).has(extIdLowerCase)));
61
+ }
62
+ const copilotInstalled = getExtensionInfoObs("GitHub.copilot");
63
+ const copilotChatInstalled = getExtensionInfoObs("GitHub.copilot-chat");
64
+ const shouldSendDetails = derived(
65
+ reader => editSourceDetailsEnabled.read(reader) || !!copilotInstalled.read(reader) || !!copilotChatInstalled.read(reader)
66
+ );
67
+ const instantiationServiceWithInterceptedTelemetry = this._instantiationService.createChild(( new ServiceCollection([
68
+ ITelemetryService,
69
+ this._instantiationService.createInstance(DataChannelForwardingTelemetryService)
70
+ ])));
71
+ const impl = this._register(
72
+ instantiationServiceWithInterceptedTelemetry.createInstance(EditSourceTrackingImpl, shouldSendDetails, this._annotatedDocuments)
73
+ );
74
+ this._register(autorun(reader => {
75
+ if (!this._editSourceTrackingShowDecorations.read(reader)) {
76
+ return;
77
+ }
78
+ const visibleEditors = observableFromEvent(
79
+ this,
80
+ this._editorService.onDidVisibleEditorsChange,
81
+ () => this._editorService.visibleTextEditorControls
82
+ );
83
+ mapObservableArrayCached(this, visibleEditors, (editor, store) => {
84
+ if (editor instanceof CodeEditorWidget) {
85
+ const obsEditor = observableCodeEditor(editor);
86
+ const cssStyles = ( new DynamicCssRules(editor));
87
+ const decorations = ( new CachedFunction(source => {
88
+ const r = store.add(cssStyles.createClassNameRef({
89
+ backgroundColor: source.getColor()
90
+ }));
91
+ return r.className;
92
+ }));
93
+ store.add(obsEditor.setDecorations(derived(reader => {
94
+ const uri = obsEditor.model.read(reader)?.uri;
95
+ if (!uri) {
96
+ return [];
97
+ }
98
+ const doc = this._workspace.getDocument(uri);
99
+ if (!doc) {
100
+ return [];
101
+ }
102
+ const docsState = impl.docsState.read(reader).get(doc);
103
+ if (!docsState) {
104
+ return [];
105
+ }
106
+ const ranges = (docsState.longtermTracker.read(reader)?.getTrackedRanges(reader)) ?? [];
107
+ return ( ranges.map(r => ({
108
+ range: doc.value.read(undefined).getTransformer().getRange(r.range),
109
+ options: {
110
+ description: "editSourceTracking",
111
+ inlineClassName: decorations.get(r.source)
112
+ }
113
+ })));
114
+ })));
115
+ }
116
+ }).recomputeInitiallyAndOnChange(reader.store);
117
+ }));
118
+ this._register(autorun(reader => {
119
+ if (!this._editSourceTrackingShowStatusBar.read(reader)) {
120
+ return;
121
+ }
122
+ const statusBarItem = reader.store.add(this._statusbarService.addEntry({
123
+ name: "",
124
+ text: "",
125
+ command: this._showStateInMarkdownDoc,
126
+ tooltip: "Edit Source Tracking",
127
+ ariaLabel: ""
128
+ }, "editTelemetry", StatusbarAlignment.RIGHT, 100));
129
+ const sumChangedCharacters = derived(reader => {
130
+ const docs = impl.docsState.read(reader);
131
+ let sum = 0;
132
+ for (const state of ( docs.values())) {
133
+ const t = state.longtermTracker.read(reader);
134
+ if (!t) {
135
+ continue;
136
+ }
137
+ const d = state.getTelemetryData(t.getTrackedRanges(reader));
138
+ sum += d.totalModifiedCharactersInFinalState;
139
+ }
140
+ return sum;
141
+ });
142
+ const tooltipMarkdownString = derived(reader => {
143
+ const docs = impl.docsState.read(reader);
144
+ const docsDataInTooltip = [];
145
+ const editSources = [];
146
+ for (const [doc, state] of docs) {
147
+ const tracker = state.longtermTracker.read(reader);
148
+ if (!tracker) {
149
+ continue;
150
+ }
151
+ const trackedRanges = tracker.getTrackedRanges(reader);
152
+ const data = state.getTelemetryData(trackedRanges);
153
+ if (data.totalModifiedCharactersInFinalState === 0) {
154
+ continue;
155
+ }
156
+ editSources.push(...( trackedRanges.map(r => r.source)));
157
+ const filteredData = Object.fromEntries(
158
+ Object.entries(data).filter(([_, value]) => !(typeof value === "number") || value !== 0)
159
+ );
160
+ docsDataInTooltip.push([
161
+ `### ${doc.uri.fsPath}`,
162
+ "```json",
163
+ JSON.stringify(filteredData, undefined, "\t"),
164
+ "```",
165
+ "\n"
166
+ ].join("\n"));
167
+ }
168
+ let tooltipContent;
169
+ if (docsDataInTooltip.length === 0) {
170
+ tooltipContent = "No modified documents";
171
+ } else if (docsDataInTooltip.length <= 3) {
172
+ tooltipContent = docsDataInTooltip.join("\n\n");
173
+ } else {
174
+ const lastThree = docsDataInTooltip.slice(-3);
175
+ tooltipContent = "...\n\n" + lastThree.join("\n\n");
176
+ }
177
+ const agenda = this._createEditSourceAgenda(editSources);
178
+ const tooltipWithCommand = ( new MarkdownString(
179
+ tooltipContent + "\n\n[View Details](command:" + this._showStateInMarkdownDoc + ")"
180
+ ));
181
+ tooltipWithCommand.appendMarkdown(
182
+ "\n\n" + agenda + "\n\nToggle decorations: [Click here](command:" + this._toggleDecorations + ")"
183
+ );
184
+ tooltipWithCommand.isTrusted = {
185
+ enabledCommands: [this._toggleDecorations]
186
+ };
187
+ tooltipWithCommand.supportHtml = true;
188
+ return tooltipWithCommand;
189
+ });
190
+ reader.store.add(autorun(reader => {
191
+ statusBarItem.update({
192
+ name: "editTelemetry",
193
+ text: `$(edit) ${sumChangedCharacters.read(reader)} chars inserted`,
194
+ ariaLabel: `Edit Source Tracking: ${sumChangedCharacters.read(reader)} modified characters`,
195
+ tooltip: tooltipMarkdownString.read(reader),
196
+ command: this._showStateInMarkdownDoc
197
+ });
198
+ }));
199
+ reader.store.add(CommandsRegistry.registerCommand(this._toggleDecorations, () => {
200
+ this._editSourceTrackingShowDecorations.set(!this._editSourceTrackingShowDecorations.read(undefined), undefined);
201
+ }));
202
+ }));
203
+ }
204
+ _createEditSourceAgenda(editSources) {
205
+ const editSourcesSeen = ( new Set());
206
+ const editSourceInfo = [];
207
+ for (const editSource of editSources) {
208
+ if (!( editSourcesSeen.has(( editSource.toString())))) {
209
+ editSourcesSeen.add(( editSource.toString()));
210
+ editSourceInfo.push({
211
+ name: ( editSource.toString()),
212
+ color: editSource.getColor()
213
+ });
214
+ }
215
+ }
216
+ const agendaItems = ( editSourceInfo.map(
217
+ info => `<span style="background-color:${info.color};border-radius:3px;">${info.name}</span>`
218
+ ));
219
+ return agendaItems.join(" ");
220
+ }
221
+ };
222
+ EditTrackingFeature = ( __decorate([( __param(2, IConfigurationService)), ( __param(3, IInstantiationService)), ( __param(4, IStatusbarService)), ( __param(5, IEditorService)), ( __param(6, IExtensionService))], EditTrackingFeature));
223
+ function makeSettable(obs) {
224
+ const overrideObs = observableValue("overrideObs", undefined);
225
+ return derivedWithSetter(overrideObs, reader => {
226
+ return overrideObs.read(reader) ?? obs.read(reader);
227
+ }, (value, tx) => {
228
+ overrideObs.set(value, tx);
229
+ });
230
+ }
231
+
232
+ export { EditTrackingFeature };
@@ -0,0 +1,48 @@
1
+ import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
2
+ import { IObservable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/observable";
3
+ import { IInstantiationService } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
4
+ import { ITelemetryService } from "@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service";
5
+ import { IUserAttentionService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/services/userAttention/common/userAttentionService.service";
6
+ import { AnnotatedDocument, IAnnotatedDocuments } from "../helpers/annotatedDocuments.js";
7
+ import { DocumentEditSourceTracker, TrackedEdit } from "./editTracker.js";
8
+ import { ScmAdapter } from "./scmAdapter.js";
9
+ import { IRandomService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/editTelemetry/browser/randomService.service";
10
+ type EditTelemetryMode = "longterm" | "10minFocusWindow" | "20minFocusWindow";
11
+ type EditTelemetryTrigger = "10hours" | "hashChange" | "branchChange" | "closed" | "time";
12
+ export declare class EditSourceTrackingImpl extends Disposable {
13
+ private readonly _statsEnabled;
14
+ private readonly _annotatedDocuments;
15
+ private readonly _instantiationService;
16
+ readonly docsState: IObservable<Map<import("../helpers/observableWorkspace.js").IObservableDocument, TrackedDocumentInfo>>;
17
+ private readonly _states;
18
+ constructor(_statsEnabled: IObservable<boolean>, _annotatedDocuments: IAnnotatedDocuments, _instantiationService: IInstantiationService);
19
+ }
20
+ declare class TrackedDocumentInfo extends Disposable {
21
+ private readonly _doc;
22
+ private readonly _scm;
23
+ private readonly _statsEnabled;
24
+ private readonly _instantiationService;
25
+ private readonly _telemetryService;
26
+ private readonly _randomService;
27
+ private readonly _userAttentionService;
28
+ readonly longtermTracker: IObservable<DocumentEditSourceTracker<undefined> | undefined>;
29
+ readonly windowedTracker: IObservable<DocumentEditSourceTracker<undefined> | undefined>;
30
+ readonly windowedFocusTracker: IObservable<DocumentEditSourceTracker<undefined> | undefined>;
31
+ private readonly _repo;
32
+ constructor(_doc: AnnotatedDocument, _scm: ScmAdapter, _statsEnabled: IObservable<boolean>, _instantiationService: IInstantiationService, _telemetryService: ITelemetryService, _randomService: IRandomService, _userAttentionService: IUserAttentionService);
33
+ sendTelemetry(mode: EditTelemetryMode, trigger: EditTelemetryTrigger, t: DocumentEditSourceTracker, focusTime: number, actualTime: number): Promise<void>;
34
+ getTelemetryData(ranges: readonly TrackedEdit[]): {
35
+ nesModifiedCount: number;
36
+ inlineCompletionsCopilotModifiedCount: number;
37
+ inlineCompletionsNESModifiedCount: number;
38
+ otherAIModifiedCount: number;
39
+ userModifiedCount: number;
40
+ ideModifiedCount: number;
41
+ unknownModifiedCount: number;
42
+ externalModifiedCount: number;
43
+ totalModifiedCharactersInFinalState: number;
44
+ languageId: string;
45
+ isTrackedByGit: Promise<boolean> | undefined;
46
+ };
47
+ }
48
+ export {};