@codingame/monaco-vscode-telemetry-service-override 36.2.7 → 37.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.
Files changed (44) hide show
  1. package/index.js +1 -1
  2. package/package.json +2 -2
  3. package/vscode/src/vs/base/common/editArcTracker.d.ts +29 -0
  4. package/vscode/src/vs/base/common/editArcTracker.js +291 -0
  5. package/vscode/src/vs/platform/agentHost/common/diffComputeService.d.ts +19 -0
  6. package/vscode/src/vs/platform/agentHost/common/fileEditAttribution.d.ts +107 -0
  7. package/vscode/src/vs/platform/agentHost/common/fileEditAttribution.js +59 -0
  8. package/vscode/src/vs/platform/agentHost/common/fileEditAttribution.service.d.ts +12 -0
  9. package/vscode/src/vs/platform/telemetry/browser/errorTelemetry.js +5 -5
  10. package/vscode/src/vs/platform/telemetry/common/1dsAppender.d.ts +2 -0
  11. package/vscode/src/vs/platform/telemetry/common/1dsAppender.js +12 -10
  12. package/vscode/src/vs/platform/telemetry/common/editArcTelemetry.d.ts +141 -0
  13. package/vscode/src/vs/platform/telemetry/common/editArcTelemetry.js +5 -0
  14. package/vscode/src/vs/platform/telemetry/common/editTelemetry.d.ts +49 -0
  15. package/vscode/src/vs/platform/telemetry/common/editTelemetry.js +10 -0
  16. package/vscode/src/vs/platform/telemetry/common/telemetryLogAppender.d.ts +5 -2
  17. package/vscode/src/vs/platform/telemetry/common/telemetryLogAppender.js +4 -3
  18. package/vscode/src/vs/platform/telemetry/common/telemetryService.d.ts +14 -4
  19. package/vscode/src/vs/platform/telemetry/common/telemetryService.js +50 -34
  20. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsChart.js +1 -1
  21. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editStats/aiStatsStatusBar.js +8 -8
  22. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetry.contribution.js +12 -7
  23. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetryContribution.js +2 -1
  24. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/documentWithAnnotatedEdits.d.ts +7 -1
  25. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/helpers/documentWithAnnotatedEdits.js +15 -2
  26. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settingIds.d.ts +1 -1
  27. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/settingIds.js +1 -2
  28. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/agentHostEditMarkerService.d.ts +83 -0
  29. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/agentHostEditMarkerService.js +690 -0
  30. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetryReporter.d.ts +2 -2
  31. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.d.ts +3 -3
  32. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/arcTelemetrySender.js +3 -0
  33. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingFeature.js +11 -4
  34. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingImpl.d.ts +15 -4
  35. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editSourceTrackingImpl.js +185 -83
  36. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editTracker.d.ts +21 -5
  37. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/editTracker.js +128 -12
  38. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/scmAdapter.d.ts +7 -2
  39. package/vscode/src/vs/workbench/contrib/editTelemetry/common/arcTracker.d.ts +3 -11
  40. package/vscode/src/vs/workbench/contrib/editTelemetry/common/arcTracker.js +17 -47
  41. package/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.js +13 -2
  42. package/vscode/src/vs/workbench/services/telemetry/browser/telemetryService.d.ts +1 -1
  43. package/vscode/src/vs/workbench/services/dataChannel/browser/dataChannelService.d.ts +0 -10
  44. package/vscode/src/vs/workbench/services/dataChannel/browser/dataChannelService.js +0 -30
package/index.js CHANGED
@@ -4,7 +4,7 @@ import { SyncDescriptor } from '@codingame/monaco-vscode-api/vscode/vs/platform/
4
4
  import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
5
5
  import { TelemetryService } from './vscode/src/vs/workbench/services/telemetry/browser/telemetryService.js';
6
6
  import { IDataChannelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/dataChannel/common/dataChannel.service';
7
- import { DataChannelService } from './vscode/src/vs/workbench/services/dataChannel/browser/dataChannelService.js';
7
+ import { DataChannelService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/dataChannel/browser/dataChannelService';
8
8
  import './vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.js';
9
9
  import './vscode/src/vs/workbench/contrib/editTelemetry/browser/editTelemetry.contribution.js';
10
10
  import './vscode/src/vs/workbench/contrib/bracketPairColorizer2Telemetry/browser/bracketPairColorizer2Telemetry.contribution.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingame/monaco-vscode-telemetry-service-override",
3
- "version": "36.2.7",
3
+ "version": "37.0.0",
4
4
  "private": false,
5
5
  "description": "VSCode public API plugged on the monaco editor - telemetry service-override",
6
6
  "keywords": [],
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "type": "module",
17
17
  "dependencies": {
18
- "@codingame/monaco-vscode-api": "36.2.7",
18
+ "@codingame/monaco-vscode-api": "37.0.0",
19
19
  "@microsoft/1ds-core-js": "3.2.18",
20
20
  "@microsoft/1ds-post-js": "3.2.18"
21
21
  },
@@ -0,0 +1,29 @@
1
+ export interface IArcTextReplacement {
2
+ readonly start: number;
3
+ readonly endExclusive: number;
4
+ readonly text: string;
5
+ }
6
+ export interface IArcTextEdit {
7
+ readonly replacements: readonly IArcTextReplacement[];
8
+ }
9
+ export interface IEditArcLineCountInfo {
10
+ readonly deletedLineCounts: number;
11
+ readonly insertedLineCounts: number;
12
+ }
13
+ export interface IEditArcValues extends IEditArcLineCountInfo {
14
+ readonly arc: number;
15
+ }
16
+ /**
17
+ * Tracks how many characters from an initial edit survive later edits.
18
+ */
19
+ export declare class EditArcTracker {
20
+ private readonly _valueBeforeTrackedEdit;
21
+ private readonly _trackedEdit;
22
+ private _updatedTrackedEdit;
23
+ constructor(_valueBeforeTrackedEdit: string, trackedEdit: IArcTextEdit);
24
+ getOriginalCharacterCount(): number;
25
+ handleEdits(edit: IArcTextEdit): void;
26
+ getAcceptedRestrainedCharactersCount(): number;
27
+ getLineCountInfo(): IEditArcLineCountInfo;
28
+ getValues(): IEditArcValues;
29
+ }
@@ -0,0 +1,291 @@
1
+
2
+ import { BugIndicatingError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
3
+ import { commonPrefixLength, commonSuffixLength, splitLines } from '@codingame/monaco-vscode-api/vscode/vs/base/common/strings';
4
+
5
+ class EditArcTracker {
6
+ constructor(_valueBeforeTrackedEdit, trackedEdit) {
7
+ this._valueBeforeTrackedEdit = _valueBeforeTrackedEdit;
8
+ this._trackedEdit = normalizeReplacements(removeCommonText(trackedEdit.replacements, _valueBeforeTrackedEdit, true));
9
+ this._updatedTrackedEdit = this._trackedEdit;
10
+ }
11
+ getOriginalCharacterCount() {
12
+ let result = 0;
13
+ for (const replacement of this._trackedEdit) {
14
+ result += replacement.text.length;
15
+ }
16
+ return result;
17
+ }
18
+ handleEdits(edit) {
19
+ const untrackedEdit = normalizeReplacements(( edit.replacements.map(replacement => ({
20
+ ...replacement,
21
+ isTracked: false
22
+ }))));
23
+ this._updatedTrackedEdit = compose(this._updatedTrackedEdit, untrackedEdit);
24
+ }
25
+ getAcceptedRestrainedCharactersCount() {
26
+ let result = 0;
27
+ for (const replacement of this._updatedTrackedEdit) {
28
+ if (replacement.isTracked) {
29
+ result += replacement.text.length;
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ getLineCountInfo() {
35
+ return getLineCountInfo(
36
+ this._updatedTrackedEdit.filter(replacement => replacement.isTracked),
37
+ this._valueBeforeTrackedEdit
38
+ );
39
+ }
40
+ getValues() {
41
+ return {
42
+ arc: this.getAcceptedRestrainedCharactersCount(),
43
+ ...this.getLineCountInfo()
44
+ };
45
+ }
46
+ }
47
+ function removeCommonText(replacements, originalText, isTracked) {
48
+ return ( replacements.map(replacement => {
49
+ const oldText = originalText.substring(replacement.start, replacement.endExclusive);
50
+ const prefixLength = commonPrefixLength(oldText, replacement.text);
51
+ const suffixLength = Math.min(
52
+ oldText.length - prefixLength,
53
+ replacement.text.length - prefixLength,
54
+ commonSuffixLength(oldText, replacement.text)
55
+ );
56
+ return {
57
+ start: replacement.start + prefixLength,
58
+ endExclusive: replacement.endExclusive - suffixLength,
59
+ text: replacement.text.substring(prefixLength, replacement.text.length - suffixLength),
60
+ isTracked
61
+ };
62
+ }));
63
+ }
64
+ function normalizeReplacements(replacements) {
65
+ const result = [];
66
+ let previous;
67
+ for (const replacement of replacements) {
68
+ if (replacement.start > replacement.endExclusive) {
69
+ throw ( new BugIndicatingError("Edit replacement start must not be after its end"));
70
+ }
71
+ if (previous && replacement.start < previous.endExclusive) {
72
+ throw ( new BugIndicatingError("Edit replacements must be sorted and disjoint"));
73
+ }
74
+ if (replacement.start === replacement.endExclusive && replacement.text.length === 0) {
75
+ continue;
76
+ }
77
+ if (previous && previous.endExclusive === replacement.start && previous.isTracked === replacement.isTracked) {
78
+ previous = {
79
+ start: previous.start,
80
+ endExclusive: replacement.endExclusive,
81
+ text: previous.text + replacement.text,
82
+ isTracked: previous.isTracked
83
+ };
84
+ continue;
85
+ }
86
+ if (previous) {
87
+ result.push(previous);
88
+ }
89
+ previous = replacement;
90
+ }
91
+ if (previous) {
92
+ result.push(previous);
93
+ }
94
+ return result;
95
+ }
96
+ function compose(first, second) {
97
+ if (first.length === 0) {
98
+ return second.slice();
99
+ }
100
+ if (second.length === 0) {
101
+ return first.slice();
102
+ }
103
+ const firstQueue = first.slice();
104
+ const result = [];
105
+ let firstToSecondOffset = 0;
106
+ for (const secondReplacement of second) {
107
+ while (true) {
108
+ const firstReplacement = firstQueue[0];
109
+ if (!firstReplacement || firstReplacement.start + firstToSecondOffset + firstReplacement.text.length >= secondReplacement.start) {
110
+ break;
111
+ }
112
+ firstQueue.shift();
113
+ result.push(firstReplacement);
114
+ firstToSecondOffset += firstReplacement.text.length - (firstReplacement.endExclusive - firstReplacement.start);
115
+ }
116
+ const offsetBeforeIntersections = firstToSecondOffset;
117
+ let firstIntersecting;
118
+ let lastIntersecting;
119
+ while (true) {
120
+ const firstReplacement = firstQueue[0];
121
+ if (!firstReplacement || firstReplacement.start + firstToSecondOffset > secondReplacement.endExclusive) {
122
+ break;
123
+ }
124
+ firstIntersecting ??= firstReplacement;
125
+ lastIntersecting = firstReplacement;
126
+ firstQueue.shift();
127
+ firstToSecondOffset += firstReplacement.text.length - (firstReplacement.endExclusive - firstReplacement.start);
128
+ }
129
+ if (!firstIntersecting) {
130
+ result.push(deltaReplacement(secondReplacement, -firstToSecondOffset));
131
+ continue;
132
+ }
133
+ const replaceStart = Math.min(
134
+ firstIntersecting.start,
135
+ secondReplacement.start - offsetBeforeIntersections
136
+ );
137
+ const prefixLength = secondReplacement.start - (firstIntersecting.start + offsetBeforeIntersections);
138
+ if (prefixLength > 0) {
139
+ result.push(
140
+ sliceReplacement(firstIntersecting, replaceStart, replaceStart, 0, prefixLength)
141
+ );
142
+ }
143
+ if (!lastIntersecting) {
144
+ throw ( new BugIndicatingError("Missing intersecting ARC edit"));
145
+ }
146
+ const suffixLength = lastIntersecting.endExclusive + firstToSecondOffset - secondReplacement.endExclusive;
147
+ if (suffixLength > 0) {
148
+ const suffix = sliceReplacement(
149
+ lastIntersecting,
150
+ lastIntersecting.endExclusive,
151
+ lastIntersecting.endExclusive,
152
+ lastIntersecting.text.length - suffixLength,
153
+ lastIntersecting.text.length
154
+ );
155
+ firstQueue.unshift(suffix);
156
+ firstToSecondOffset -= suffix.text.length - (suffix.endExclusive - suffix.start);
157
+ }
158
+ result.push(sliceReplacement(
159
+ secondReplacement,
160
+ replaceStart,
161
+ secondReplacement.endExclusive - firstToSecondOffset,
162
+ 0,
163
+ secondReplacement.text.length
164
+ ));
165
+ }
166
+ result.push(...firstQueue);
167
+ return normalizeReplacements(result);
168
+ }
169
+ function deltaReplacement(replacement, offset) {
170
+ return {
171
+ ...replacement,
172
+ start: replacement.start + offset,
173
+ endExclusive: replacement.endExclusive + offset
174
+ };
175
+ }
176
+ function sliceReplacement(replacement, start, endExclusive, textStart, textEndExclusive) {
177
+ return {
178
+ start,
179
+ endExclusive,
180
+ text: replacement.text.substring(textStart, textEndExclusive),
181
+ isTracked: replacement.isTracked
182
+ };
183
+ }
184
+ function getLineCountInfo(replacements, initialText) {
185
+ if (replacements.length === 0) {
186
+ return {
187
+ deletedLineCounts: 0,
188
+ insertedLineCounts: 0
189
+ };
190
+ }
191
+ const lineOffsets = ( new LineOffsets(initialText));
192
+ const textReplacements = ( replacements.map(replacement => ({
193
+ start: lineOffsets.getPosition(replacement.start),
194
+ end: lineOffsets.getPosition(replacement.endExclusive),
195
+ startOffset: replacement.start,
196
+ endOffset: replacement.endExclusive,
197
+ text: replacement.text
198
+ })));
199
+ let deletedLineCounts = 0;
200
+ let insertedLineCounts = 0;
201
+ let current = [];
202
+ for (let i = 0; i < textReplacements.length; i++) {
203
+ const replacement = textReplacements[i];
204
+ const next = textReplacements[i + 1];
205
+ current.push(replacement);
206
+ if (next && next.start.lineNumber === replacement.end.lineNumber) {
207
+ continue;
208
+ }
209
+ const joined = joinTextReplacements(current, initialText);
210
+ current = [];
211
+ const newLines = splitLines(joined.text);
212
+ let startLineNumber = joined.start.lineNumber;
213
+ let endLineNumberExclusive = joined.end.lineNumber + 1;
214
+ const firstLinePrefix = initialText.substring(lineOffsets.getLineStart(joined.start.lineNumber), joined.startOffset);
215
+ newLines[0] = firstLinePrefix + newLines[0];
216
+ const lastLineSuffix = initialText.substring(joined.endOffset, lineOffsets.getLineEnd(joined.end.lineNumber));
217
+ newLines[newLines.length - 1] += lastLineSuffix;
218
+ const startsAtLineEnd = joined.start.column === lineOffsets.getLineLength(joined.start.lineNumber) + 1;
219
+ const endsAtLineStart = joined.end.column === 1;
220
+ if (startsAtLineEnd && newLines[0].length === firstLinePrefix.length) {
221
+ startLineNumber++;
222
+ newLines.shift();
223
+ }
224
+ if (newLines.length > 0 && startLineNumber < endLineNumberExclusive && endsAtLineStart && newLines[newLines.length - 1].length === lastLineSuffix.length) {
225
+ endLineNumberExclusive--;
226
+ newLines.pop();
227
+ }
228
+ deletedLineCounts += endLineNumberExclusive - startLineNumber;
229
+ insertedLineCounts += newLines.length;
230
+ }
231
+ return {
232
+ deletedLineCounts,
233
+ insertedLineCounts
234
+ };
235
+ }
236
+ function joinTextReplacements(replacements, initialText) {
237
+ const first = replacements[0];
238
+ const last = replacements[replacements.length - 1];
239
+ let text = first.text;
240
+ for (let i = 1; i < replacements.length; i++) {
241
+ text += initialText.substring(replacements[i - 1].endOffset, replacements[i].startOffset);
242
+ text += replacements[i].text;
243
+ }
244
+ return {
245
+ start: first.start,
246
+ end: last.end,
247
+ startOffset: first.startOffset,
248
+ endOffset: last.endOffset,
249
+ text
250
+ };
251
+ }
252
+ class LineOffsets {
253
+ constructor(text) {
254
+ this._lineStarts = [0];
255
+ this._lineEnds = [];
256
+ for (let i = 0; i < text.length; i++) {
257
+ if (text.charCodeAt(i) === 10) {
258
+ this._lineStarts.push(i + 1);
259
+ this._lineEnds.push(i > 0 && text.charCodeAt(i - 1) === 13 ? i - 1 : i);
260
+ }
261
+ }
262
+ this._lineEnds.push(text.length);
263
+ }
264
+ getPosition(offset) {
265
+ let low = 0;
266
+ let high = this._lineStarts.length - 1;
267
+ while (low < high) {
268
+ const middle = Math.ceil((low + high) / 2);
269
+ if (this._lineStarts[middle] <= offset) {
270
+ low = middle;
271
+ } else {
272
+ high = middle - 1;
273
+ }
274
+ }
275
+ return {
276
+ lineNumber: low + 1,
277
+ column: offset - this._lineStarts[low] + 1
278
+ };
279
+ }
280
+ getLineStart(lineNumber) {
281
+ return this._lineStarts[lineNumber - 1];
282
+ }
283
+ getLineEnd(lineNumber) {
284
+ return this._lineEnds[lineNumber - 1];
285
+ }
286
+ getLineLength(lineNumber) {
287
+ return this.getLineEnd(lineNumber) - this.getLineStart(lineNumber);
288
+ }
289
+ }
290
+
291
+ export { EditArcTracker };
@@ -0,0 +1,19 @@
1
+ import { IArcTextReplacement } from "../../../base/common/editArcTracker.js";
2
+ export interface IDiffCountResult {
3
+ added: number;
4
+ removed: number;
5
+ changes: readonly IOffsetEdit[];
6
+ }
7
+ export interface IOffsetEdit {
8
+ startOffset: number;
9
+ endOffsetExclusive: number;
10
+ newText: string;
11
+ }
12
+ export interface IDetailedDiffResult {
13
+ added: number;
14
+ removed: number;
15
+ replacements: readonly IArcTextReplacement[];
16
+ hitTimeout: boolean;
17
+ }
18
+ /** Default timeout for diff computation in milliseconds. */
19
+ export declare const DEFAULT_DIFF_TIMEOUT_MS = 5000;
@@ -0,0 +1,107 @@
1
+ import { IOffsetEdit } from "./diffComputeService.js";
2
+ import { ToolResultFileEditContent } from "@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/state/sessionState";
3
+ import { URI } from "@codingame/monaco-vscode-api/vscode/vs/base/common/uri";
4
+ import { EditTelemetryTrigger } from "../../telemetry/common/editTelemetry.js";
5
+ import { IAgentEditAttributionService } from "./fileEditAttribution.service.js";
6
+ export declare const FILE_EDIT_ATTRIBUTION_PROPERTY = "_vscodeEditAttribution";
7
+ export declare const MAX_EDIT_ATTRIBUTION_FILE_SIZE: number;
8
+ interface IFileEditAttributionMarkerBase {
9
+ readonly version: 1;
10
+ readonly editId: string;
11
+ readonly sequence: number;
12
+ }
13
+ export interface IFileEditAttributionSource {
14
+ readonly modelId?: string;
15
+ readonly conversationId: string;
16
+ readonly requestId: string;
17
+ readonly harness: string;
18
+ }
19
+ export interface ITrackedFileEditAttributionMarker extends IFileEditAttributionMarkerBase {
20
+ readonly status?: "tracked";
21
+ readonly beforeDigest: string;
22
+ readonly afterDigest: string;
23
+ readonly source?: IFileEditAttributionSource;
24
+ }
25
+ export interface ISkippedFileEditAttributionMarker extends IFileEditAttributionMarkerBase {
26
+ readonly status: "skipped";
27
+ readonly reason: "fileTooLarge";
28
+ readonly untrackedEditCount?: number;
29
+ readonly insertedCount: number;
30
+ }
31
+ export type IFileEditAttributionMarker = ITrackedFileEditAttributionMarker | ISkippedFileEditAttributionMarker;
32
+ export type AttributedToolResultFileEditContent = ToolResultFileEditContent & {
33
+ readonly [FILE_EDIT_ATTRIBUTION_PROPERTY]: IFileEditAttributionMarker;
34
+ };
35
+ export interface IAgentEditAttribution {
36
+ readonly sessionUri: string;
37
+ readonly turnId: string;
38
+ readonly toolCallId: string;
39
+ readonly filePath: string;
40
+ readonly beforeText: string;
41
+ readonly afterText: string;
42
+ readonly changes: readonly IOffsetEdit[];
43
+ readonly modelId: string | undefined;
44
+ readonly toolName: string;
45
+ }
46
+ export declare class NullAgentEditAttributionService implements IAgentEditAttributionService {
47
+ readonly _serviceBrand: undefined;
48
+ setEnabled(_enabled: boolean): void;
49
+ recordEdit(_edit: IAgentEditAttribution): Promise<IFileEditAttributionMarker | undefined>;
50
+ flushSession(_sessionUri: string): Promise<void>;
51
+ prepareFlush(_params: IPrepareEditAttributionFlushParams): Promise<IPreparedEditAttributionFlush | undefined>;
52
+ commitFlush(_params: ICommitEditAttributionFlushParams): Promise<IEditAttributionFlushResult>;
53
+ cancelFlush(_params: ICancelEditAttributionFlushParams): Promise<IEditAttributionFlushResult>;
54
+ }
55
+ export interface IPrepareEditAttributionFlushParams {
56
+ readonly resource: URI;
57
+ readonly trigger: EditTelemetryTrigger;
58
+ readonly statsUuid: string;
59
+ readonly isDirty: boolean;
60
+ readonly flushToken: string;
61
+ readonly languageId: string;
62
+ }
63
+ export interface IPreparedEditAttributionFlush {
64
+ readonly flushToken: string;
65
+ readonly agentModifiedCount: number;
66
+ readonly lastSequence?: number;
67
+ readonly coverageGapThroughSequence?: number;
68
+ readonly standaloneCoverageGapAcknowledgements?: readonly IEditAttributionCoverageGapAcknowledgement[];
69
+ }
70
+ export interface IEditAttributionCoverageGapAcknowledgement {
71
+ readonly id: string;
72
+ readonly sequences: readonly number[];
73
+ readonly editCount: number;
74
+ readonly insertedCount: number;
75
+ }
76
+ export interface ICommitEditAttributionFlushParams {
77
+ readonly flushToken: string;
78
+ readonly totalModifiedCount: number;
79
+ }
80
+ export interface ICancelEditAttributionFlushParams {
81
+ readonly flushToken: string;
82
+ }
83
+ export type EditAttributionFlushOutcome = "committed" | "cancelled" | "missing";
84
+ export interface IEditAttributionFlushResult {
85
+ readonly outcome: EditAttributionFlushOutcome;
86
+ readonly agentModifiedCount: number;
87
+ readonly lastSequence?: number;
88
+ readonly coverageGapThroughSequence?: number;
89
+ readonly standaloneCoverageGapAcknowledgements?: readonly IEditAttributionCoverageGapAcknowledgement[];
90
+ }
91
+ export declare function getFileEditAttributionMarker(content: ToolResultFileEditContent): IFileEditAttributionMarker | undefined;
92
+ export declare function createFileEditContentDigest(content: string): string;
93
+ export declare function buildPrepareEditAttributionResource(params: IPrepareEditAttributionFlushParams): URI;
94
+ export declare function buildCommitEditAttributionResource(params: ICommitEditAttributionFlushParams): URI;
95
+ export declare function buildCancelEditAttributionResource(params: ICancelEditAttributionFlushParams): URI;
96
+ export type EditAttributionResourceRequest = {
97
+ readonly kind: "prepare";
98
+ readonly params: IPrepareEditAttributionFlushParams;
99
+ } | {
100
+ readonly kind: "commit";
101
+ readonly params: ICommitEditAttributionFlushParams;
102
+ } | {
103
+ readonly kind: "cancel";
104
+ readonly params: ICancelEditAttributionFlushParams;
105
+ };
106
+ export declare function parseEditAttributionResource(resource: URI): EditAttributionResourceRequest | undefined;
107
+ export {};
@@ -0,0 +1,59 @@
1
+
2
+ import { stringHash } from '@codingame/monaco-vscode-api/vscode/vs/base/common/hash';
3
+ import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
4
+
5
+ const FILE_EDIT_ATTRIBUTION_PROPERTY = "_vscodeEditAttribution";
6
+ const EDIT_ATTRIBUTION_RESOURCE_SCHEME = "agent-edit-attribution";
7
+ function getFileEditAttributionMarker(content) {
8
+ const marker = content[FILE_EDIT_ATTRIBUTION_PROPERTY];
9
+ if (marker?.version !== 1 || typeof marker.editId !== "string" || !Number.isSafeInteger(marker.sequence) || marker.sequence < 0) {
10
+ return undefined;
11
+ }
12
+ if (marker.status === "skipped") {
13
+ return marker.reason === "fileTooLarge" && (marker.untrackedEditCount === undefined || (Number.isSafeInteger(marker.untrackedEditCount) && marker.untrackedEditCount > 0)) && Number.isSafeInteger(marker.insertedCount) && marker.insertedCount >= 0 ? marker : undefined;
14
+ }
15
+ if (marker.status !== undefined && marker.status !== "tracked") {
16
+ return undefined;
17
+ }
18
+ if (typeof marker.beforeDigest !== "string" || typeof marker.afterDigest !== "string" || (marker.source !== undefined && !isFileEditAttributionSource(marker.source))) {
19
+ return undefined;
20
+ }
21
+ return marker;
22
+ }
23
+ function isFileEditAttributionSource(source) {
24
+ if (typeof source !== "object" || source === null || Array.isArray(source)) {
25
+ return false;
26
+ }
27
+ const candidate = source;
28
+ return (candidate.modelId === undefined || typeof candidate.modelId === "string") && typeof candidate.conversationId === "string" && typeof candidate.requestId === "string" && typeof candidate.harness === "string";
29
+ }
30
+ function createFileEditContentDigest(content) {
31
+ return `${content.length}:${stringHash(content, 0)}:${stringHash(content, 5381)}`;
32
+ }
33
+ function buildPrepareEditAttributionResource(params) {
34
+ return buildEditAttributionResource("prepare", {
35
+ resource: ( params.resource.toString()),
36
+ trigger: params.trigger,
37
+ statsUuid: params.statsUuid,
38
+ isDirty: params.isDirty,
39
+ flushToken: params.flushToken,
40
+ languageId: params.languageId
41
+ });
42
+ }
43
+ function buildCommitEditAttributionResource(params) {
44
+ return buildEditAttributionResource("commit", params);
45
+ }
46
+ function buildCancelEditAttributionResource(params) {
47
+ return buildEditAttributionResource("cancel", params);
48
+ }
49
+ function buildEditAttributionResource(kind, value) {
50
+ const params = ( new URLSearchParams());
51
+ params.set("payload", JSON.stringify(value));
52
+ return ( URI.from({
53
+ scheme: EDIT_ATTRIBUTION_RESOURCE_SCHEME,
54
+ path: `/${kind}`,
55
+ query: ( params.toString())
56
+ }));
57
+ }
58
+
59
+ export { FILE_EDIT_ATTRIBUTION_PROPERTY, buildCancelEditAttributionResource, buildCommitEditAttributionResource, buildPrepareEditAttributionResource, createFileEditContentDigest, getFileEditAttributionMarker };
@@ -0,0 +1,12 @@
1
+ import { IAgentEditAttribution, IFileEditAttributionMarker, IPrepareEditAttributionFlushParams, IPreparedEditAttributionFlush, ICommitEditAttributionFlushParams, IEditAttributionFlushResult, ICancelEditAttributionFlushParams } from "./fileEditAttribution.js";
2
+ export declare const IAgentEditAttributionService: import("@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation").ServiceIdentifier<IAgentEditAttributionService>;
3
+ export interface IAgentEditAttributionService {
4
+ readonly _serviceBrand: undefined;
5
+ /** Disabling attribution is permanent for the lifetime of the service. */
6
+ setEnabled(enabled: boolean): void;
7
+ recordEdit(edit: IAgentEditAttribution): Promise<IFileEditAttributionMarker | undefined>;
8
+ flushSession(sessionUri: string): Promise<void>;
9
+ prepareFlush(params: IPrepareEditAttributionFlushParams): Promise<IPreparedEditAttributionFlush | undefined>;
10
+ commitFlush(params: ICommitEditAttributionFlushParams): Promise<IEditAttributionFlushResult>;
11
+ cancelFlush(params: ICancelEditAttributionFlushParams): Promise<IEditAttributionFlushResult>;
12
+ }
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { mainWindow } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/window';
3
- import { getRecentDisposableResizeObserverAttributionForLoopError } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
3
+ import { getRecentDisposableResizeObserverContextForLoopError } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
4
4
  import { ErrorNoTelemetry } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
5
5
  import { toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
6
6
  import BaseErrorTelemetry from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/errorTelemetry';
@@ -45,10 +45,10 @@ class ErrorTelemetry extends BaseErrorTelemetry {
45
45
  : err.stack;
46
46
  }
47
47
  }
48
- const resizeObserverAttribution = getRecentDisposableResizeObserverAttributionForLoopError(msg);
49
- if (resizeObserverAttribution) {
50
- data.msg = resizeObserverAttribution;
51
- data.callstack = resizeObserverAttribution;
48
+ const resizeObserverContext = getRecentDisposableResizeObserverContextForLoopError(msg);
49
+ if (resizeObserverContext) {
50
+ data.msg = resizeObserverContext;
51
+ data.callstack = resizeObserverContext;
52
52
  }
53
53
  this._enqueue(data);
54
54
  }
@@ -6,6 +6,8 @@ export interface IAppInsightsCore {
6
6
  track(item: ITelemetryItem | IExtendedTelemetryItem): void;
7
7
  unload(isAsync: boolean, unloadComplete: (unloadState: ITelemetryUnloadState) => void): void;
8
8
  }
9
+ /** Fills in the envelope fields every event needs, including the internal-only routing flag. */
10
+ export declare function applyEnvelopeDefaults(envelope: ITelemetryItem, isInternalMachine: boolean | undefined): void;
9
11
  export declare abstract class AbstractOneDataSystemAppender implements ITelemetryAppender {
10
12
  private readonly _isInternalTelemetry;
11
13
  private _eventPrefix;
@@ -5,6 +5,16 @@ import { validateTelemetryData } from '@codingame/monaco-vscode-api/vscode/vs/pl
5
5
 
6
6
  const endpointUrl = "https://mobile.events.data.microsoft.com/OneCollector/1.0";
7
7
  const endpointHealthUrl = "https://mobile.events.data.microsoft.com/ping";
8
+ function applyEnvelopeDefaults(envelope, isInternalMachine) {
9
+ envelope["ext"] = envelope["ext"] ?? {};
10
+ envelope["ext"]["web"] = envelope["ext"]["web"] ?? {};
11
+ envelope["ext"]["web"]["consentDetails"] = "{\"GPC_DataSharingOptIn\":false}";
12
+ const baseData = envelope["baseData"];
13
+ if (isInternalMachine || baseData?.measurements?.["common.msftInternal"] === 1) {
14
+ envelope["ext"]["utc"] = envelope["ext"]["utc"] ?? {};
15
+ envelope["ext"]["utc"]["flags"] = 0x0000811ECD;
16
+ }
17
+ }
8
18
  async function getClient(instrumentationKey, addInternalFlag, xhrOverride) {
9
19
  const oneDs = await import('@microsoft/1ds-core-js');
10
20
  const postPlugin = await import('@microsoft/1ds-post-js');
@@ -30,15 +40,7 @@ async function getClient(instrumentationKey, addInternalFlag, xhrOverride) {
30
40
  coreConfig.extensionConfig[collectorChannelPlugin.identifier] = channelConfig;
31
41
  }
32
42
  appInsightsCore.initialize(coreConfig, []);
33
- appInsightsCore.addTelemetryInitializer(envelope => {
34
- envelope["ext"] = envelope["ext"] ?? {};
35
- envelope["ext"]["web"] = envelope["ext"]["web"] ?? {};
36
- envelope["ext"]["web"]["consentDetails"] = "{\"GPC_DataSharingOptIn\":false}";
37
- if (addInternalFlag) {
38
- envelope["ext"]["utc"] = envelope["ext"]["utc"] ?? {};
39
- envelope["ext"]["utc"]["flags"] = 0x0000811ECD;
40
- }
41
- });
43
+ appInsightsCore.addTelemetryInitializer(envelope => applyEnvelopeDefaults(envelope, addInternalFlag));
42
44
  return appInsightsCore;
43
45
  }
44
46
  class AbstractOneDataSystemAppender {
@@ -119,4 +121,4 @@ class AbstractOneDataSystemAppender {
119
121
  }
120
122
  }
121
123
 
122
- export { AbstractOneDataSystemAppender };
124
+ export { AbstractOneDataSystemAppender, applyEnvelopeDefaults };