@vscode/chat-lib 0.3.1-11 → 0.3.1-12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.d.ts +52 -8
- package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.js +208 -41
- package/dist/src/_internal/extension/inlineEdits/common/userInteractionMonitor.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts +3 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js +14 -3
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +2 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
- package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/common/promptCrafting.js +2 -0
- package/dist/src/_internal/extension/xtab/common/promptCrafting.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts +31 -0
- package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js +197 -4
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
- package/dist/src/_internal/platform/chat/common/commonTypes.d.ts +1 -2
- package/dist/src/_internal/platform/chat/common/commonTypes.d.ts.map +1 -1
- package/dist/src/_internal/platform/chat/common/commonTypes.js +8 -8
- package/dist/src/_internal/platform/chat/common/commonTypes.js.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +3 -0
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.js +3 -0
- package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js +8 -4
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
- package/dist/src/_internal/platform/env/common/envService.d.ts +6 -0
- package/dist/src/_internal/platform/env/common/envService.d.ts.map +1 -1
- package/dist/src/_internal/platform/env/common/envService.js.map +1 -1
- package/dist/src/_internal/platform/env/common/nullEnvService.d.ts +3 -0
- package/dist/src/_internal/platform/env/common/nullEnvService.d.ts.map +1 -1
- package/dist/src/_internal/platform/env/common/nullEnvService.js +4 -0
- package/dist/src/_internal/platform/env/common/nullEnvService.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts +79 -2
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js +198 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts +7 -0
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js +10 -0
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js.map +1 -1
- package/dist/src/_internal/platform/networking/common/networking.d.ts +2 -0
- package/dist/src/_internal/platform/networking/common/networking.d.ts.map +1 -1
- package/dist/src/_internal/platform/networking/common/networking.js.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +4 -0
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.js +4 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.js.map +1 -1
- package/dist/src/_internal/platform/telemetry/common/telemetry.d.ts +2 -0
- package/dist/src/_internal/platform/telemetry/common/telemetry.d.ts.map +1 -1
- package/dist/src/_internal/platform/telemetry/common/telemetry.js +1 -0
- package/dist/src/_internal/platform/telemetry/common/telemetry.js.map +1 -1
- package/dist/src/_internal/platform/telemetry/common/telemetryData.d.ts.map +1 -1
- package/dist/src/_internal/platform/telemetry/common/telemetryData.js +3 -0
- package/dist/src/_internal/platform/telemetry/common/telemetryData.js.map +1 -1
- package/dist/src/_internal/util/common/test/shims/themes.d.ts +13 -0
- package/dist/src/_internal/util/common/test/shims/themes.d.ts.map +1 -0
- package/dist/src/_internal/util/common/test/shims/themes.js +27 -0
- package/dist/src/_internal/util/common/test/shims/themes.js.map +1 -0
- package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.d.ts.map +1 -1
- package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.js +3 -1
- package/dist/src/_internal/util/common/test/shims/vscodeTypesShim.js.map +1 -1
- package/dist/src/_internal/vscodeTypes.d.ts +1 -0
- package/dist/src/_internal/vscodeTypes.d.ts.map +1 -1
- package/dist/src/_internal/vscodeTypes.js +3 -1
- package/dist/src/_internal/vscodeTypes.js.map +1 -1
- package/dist/src/main.d.ts +2 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +1 -0
- package/dist/src/main.js.map +1 -1
- package/dist/src/package.json +13 -4
- package/package.json +2 -2
|
@@ -1,15 +1,62 @@
|
|
|
1
1
|
import { IConfigurationService } from '../../../platform/configuration/common/configurationService';
|
|
2
|
-
import { AggressivenessLevel } from '../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
|
|
2
|
+
import { AggressivenessLevel, UserHappinessScoreConfiguration } from '../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
|
|
3
|
+
import { ILogService } from '../../../platform/log/common/logService';
|
|
3
4
|
import { IExperimentationService } from '../../../platform/telemetry/common/nullExperimentationService';
|
|
5
|
+
import { ITelemetryService } from '../../../platform/telemetry/common/telemetry';
|
|
4
6
|
import { DelaySession } from './delay';
|
|
7
|
+
export declare enum ActionKind {
|
|
8
|
+
Accepted = "accepted",
|
|
9
|
+
Rejected = "rejected",
|
|
10
|
+
Ignored = "ignored"
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Represents a user interaction wrt an inline edit suggestion.
|
|
14
|
+
*/
|
|
15
|
+
export interface NESUserAction {
|
|
16
|
+
time: number;
|
|
17
|
+
kind: ActionKind;
|
|
18
|
+
}
|
|
19
|
+
export declare const MAX_INTERACTIONS_CONSIDERED = 10;
|
|
20
|
+
export declare const MAX_INTERACTIONS_STORED = 30;
|
|
21
|
+
/**
|
|
22
|
+
* Get window of actions with ignored action limiting via window expansion.
|
|
23
|
+
*
|
|
24
|
+
* When ignored limit is reached, skip excess ignored actions but expand window
|
|
25
|
+
* further back to still get MAX_INTERACTIONS_CONSIDERED items.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getWindowWithIgnoredLimit(actions: NESUserAction[], config: UserHappinessScoreConfiguration): NESUserAction[];
|
|
28
|
+
/**
|
|
29
|
+
* Calculate user happiness score from actions.
|
|
30
|
+
* Value between 0 and 1 indicating user happiness.
|
|
31
|
+
* 1 means very happy, 0 means very unhappy.
|
|
32
|
+
*
|
|
33
|
+
* Uses position-weighted scoring with ignored action limiting:
|
|
34
|
+
* - More recent actions have higher weight
|
|
35
|
+
* - Ignored actions can be limited (consecutive or total) to prevent score dilution
|
|
36
|
+
* - Score is adjusted towards neutral (0.5) based on data confidence
|
|
37
|
+
*/
|
|
38
|
+
export declare function getUserHappinessScore(actions: NESUserAction[], config: UserHappinessScoreConfiguration): number;
|
|
5
39
|
export declare class UserInteractionMonitor {
|
|
6
40
|
private readonly _configurationService;
|
|
7
41
|
private readonly _experimentationService;
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
|
|
42
|
+
private readonly _logService;
|
|
43
|
+
private readonly _telemetryService;
|
|
44
|
+
/**
|
|
45
|
+
* Used for aggressiveness level calculation.
|
|
46
|
+
* Includes all action types (accepted, rejected, ignored).
|
|
47
|
+
*/
|
|
48
|
+
protected _recentUserActionsForAggressiveness: NESUserAction[];
|
|
49
|
+
/**
|
|
50
|
+
* Used for timing/debounce calculation.
|
|
51
|
+
* Only includes accepted and rejected actions (ignored actions don't affect timing).
|
|
52
|
+
*/
|
|
53
|
+
protected _recentUserActionsForTiming: (NESUserAction & {
|
|
54
|
+
kind: ActionKind.Accepted | ActionKind.Rejected;
|
|
55
|
+
})[];
|
|
56
|
+
constructor(_configurationService: IConfigurationService, _experimentationService: IExperimentationService, _logService: ILogService, _telemetryService: ITelemetryService);
|
|
11
57
|
handleAcceptance(): void;
|
|
12
58
|
handleRejection(): void;
|
|
59
|
+
handleIgnored(): void;
|
|
13
60
|
private _recordUserAction;
|
|
14
61
|
createDelaySession(requestTime: number | undefined): DelaySession;
|
|
15
62
|
private _getExpectedTotalTime;
|
|
@@ -21,10 +68,7 @@ export declare class UserInteractionMonitor {
|
|
|
21
68
|
aggressivenessLevel: AggressivenessLevel;
|
|
22
69
|
userHappinessScore: number | undefined;
|
|
23
70
|
};
|
|
24
|
-
|
|
25
|
-
* Value between 0 and 1 indicating user happiness.
|
|
26
|
-
* 1 means very happy, 0 means very unhappy.
|
|
27
|
-
*/
|
|
71
|
+
protected _getUserHappinessScoreConfiguration(): UserHappinessScoreConfiguration;
|
|
28
72
|
private _getUserHappinessScore;
|
|
29
73
|
}
|
|
30
74
|
//# sourceMappingURL=userInteractionMonitor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userInteractionMonitor.d.ts","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/common/userInteractionMonitor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAC/G,OAAO,EAAE,mBAAmB,EAAE,MAAM,kEAAkE,CAAC;
|
|
1
|
+
{"version":3,"file":"userInteractionMonitor.d.ts","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/common/userInteractionMonitor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAC/G,OAAO,EAAE,mBAAmB,EAA0F,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AAChO,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,oBAAY,UAAU;IACrB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;CACjB;AAED,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,aAAa,EAAE,EACxB,MAAM,EAAE,+BAA+B,GACrC,aAAa,EAAE,CAyCjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,aAAa,EAAE,EACxB,MAAM,EAAE,+BAA+B,GACrC,MAAM,CA0DR;AAED,qBAAa,sBAAsB;IAeV,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAhBtD;;;OAGG;IACH,SAAS,CAAC,mCAAmC,EAAE,aAAa,EAAE,CAAM;IAEpE;;;OAGG;IACH,SAAS,CAAC,2BAA2B,EAAE,CAAC,aAAa,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAM;gBAG3E,qBAAqB,EAAE,qBAAqB,EAC1C,uBAAuB,EAAE,uBAAuB,EAC5D,WAAW,EAAE,WAAW,EAClB,iBAAiB,EAAE,iBAAiB;IAKlE,gBAAgB,IAAI,IAAI;IAIxB,eAAe,IAAI,IAAI;IAIvB,aAAa,IAAI,IAAI;IAI5B,OAAO,CAAC,iBAAiB;IAgBlB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY;IASxE,OAAO,CAAC,qBAAqB;IAiC7B;;;OAGG;IACI,sBAAsB,IAAI;QAAE,mBAAmB,EAAE,mBAAmB,CAAC;QAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE;IAoBrH,SAAS,CAAC,mCAAmC,IAAI,+BAA+B;IA2BhF,OAAO,CAAC,sBAAsB;CAG9B"}
|
|
@@ -3,41 +3,202 @@
|
|
|
3
3
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
4
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
6
22
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
7
23
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
8
24
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
9
25
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
10
26
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
11
27
|
};
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
12
45
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
13
46
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
14
47
|
};
|
|
15
|
-
var UserInteractionMonitor_1;
|
|
16
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.UserInteractionMonitor = void 0;
|
|
49
|
+
exports.UserInteractionMonitor = exports.MAX_INTERACTIONS_STORED = exports.MAX_INTERACTIONS_CONSIDERED = exports.ActionKind = void 0;
|
|
50
|
+
exports.getWindowWithIgnoredLimit = getWindowWithIgnoredLimit;
|
|
51
|
+
exports.getUserHappinessScore = getUserHappinessScore;
|
|
18
52
|
const configurationService_1 = require("../../../platform/configuration/common/configurationService");
|
|
19
53
|
const xtabPromptOptions_1 = require("../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions");
|
|
54
|
+
const logService_1 = require("../../../platform/log/common/logService");
|
|
20
55
|
const nullExperimentationService_1 = require("../../../platform/telemetry/common/nullExperimentationService");
|
|
56
|
+
const telemetry_1 = require("../../../platform/telemetry/common/telemetry");
|
|
57
|
+
const errors = __importStar(require("../../../util/common/errors"));
|
|
21
58
|
const delay_1 = require("./delay");
|
|
59
|
+
var ActionKind;
|
|
60
|
+
(function (ActionKind) {
|
|
61
|
+
ActionKind["Accepted"] = "accepted";
|
|
62
|
+
ActionKind["Rejected"] = "rejected";
|
|
63
|
+
ActionKind["Ignored"] = "ignored";
|
|
64
|
+
})(ActionKind || (exports.ActionKind = ActionKind = {}));
|
|
65
|
+
exports.MAX_INTERACTIONS_CONSIDERED = 10;
|
|
66
|
+
exports.MAX_INTERACTIONS_STORED = 30;
|
|
67
|
+
/**
|
|
68
|
+
* Get window of actions with ignored action limiting via window expansion.
|
|
69
|
+
*
|
|
70
|
+
* When ignored limit is reached, skip excess ignored actions but expand window
|
|
71
|
+
* further back to still get MAX_INTERACTIONS_CONSIDERED items.
|
|
72
|
+
*/
|
|
73
|
+
function getWindowWithIgnoredLimit(actions, config) {
|
|
74
|
+
const { limitConsecutiveIgnored, limitTotalIgnored, ignoredLimit } = config;
|
|
75
|
+
if (!limitConsecutiveIgnored && !limitTotalIgnored) {
|
|
76
|
+
// No limiting - just take last MAX_INTERACTIONS_CONSIDERED
|
|
77
|
+
return actions.slice(-exports.MAX_INTERACTIONS_CONSIDERED);
|
|
78
|
+
}
|
|
79
|
+
const result = [];
|
|
80
|
+
let consecutiveIgnored = 0;
|
|
81
|
+
let totalIgnored = 0;
|
|
82
|
+
// Walk backwards through history
|
|
83
|
+
for (let i = actions.length - 1; i >= 0 && result.length < exports.MAX_INTERACTIONS_CONSIDERED; i--) {
|
|
84
|
+
const action = actions[i];
|
|
85
|
+
if (action.kind === ActionKind.Ignored) {
|
|
86
|
+
let skip = false;
|
|
87
|
+
if (limitConsecutiveIgnored && consecutiveIgnored >= ignoredLimit) {
|
|
88
|
+
skip = true;
|
|
89
|
+
}
|
|
90
|
+
if (limitTotalIgnored && totalIgnored >= ignoredLimit) {
|
|
91
|
+
skip = true;
|
|
92
|
+
}
|
|
93
|
+
if (skip) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
consecutiveIgnored++;
|
|
97
|
+
totalIgnored++;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
consecutiveIgnored = 0; // Reset consecutive count on accept/reject
|
|
101
|
+
}
|
|
102
|
+
result.push(action);
|
|
103
|
+
}
|
|
104
|
+
// Reverse to get chronological order
|
|
105
|
+
result.reverse();
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Calculate user happiness score from actions.
|
|
110
|
+
* Value between 0 and 1 indicating user happiness.
|
|
111
|
+
* 1 means very happy, 0 means very unhappy.
|
|
112
|
+
*
|
|
113
|
+
* Uses position-weighted scoring with ignored action limiting:
|
|
114
|
+
* - More recent actions have higher weight
|
|
115
|
+
* - Ignored actions can be limited (consecutive or total) to prevent score dilution
|
|
116
|
+
* - Score is adjusted towards neutral (0.5) based on data confidence
|
|
117
|
+
*/
|
|
118
|
+
function getUserHappinessScore(actions, config) {
|
|
119
|
+
if (actions.length === 0) {
|
|
120
|
+
return 0.5; // neutral score when no data
|
|
121
|
+
}
|
|
122
|
+
// Get window of actions with ignored limiting
|
|
123
|
+
const window = getWindowWithIgnoredLimit(actions, config);
|
|
124
|
+
if (window.length === 0) {
|
|
125
|
+
return 0.5; // neutral score when no data after filtering
|
|
126
|
+
}
|
|
127
|
+
// Calculate weighted score
|
|
128
|
+
let weightedScore = 0; // Sum of weighted normalized scores
|
|
129
|
+
let totalWeight = 0; // Sum of weights applied
|
|
130
|
+
let scoredActionCount = 0; // Count of actions that contributed to score
|
|
131
|
+
for (let i = 0; i < window.length; i++) {
|
|
132
|
+
const action = window[i];
|
|
133
|
+
// Skip ignored actions if not included in score calculation
|
|
134
|
+
if (action.kind === ActionKind.Ignored && !config.includeIgnored) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
scoredActionCount++;
|
|
138
|
+
// Calculate weight based on position (more recent = higher weight)
|
|
139
|
+
// Position 0 (oldest) has lowest weight, last position has highest weight
|
|
140
|
+
const weight = i + 1;
|
|
141
|
+
// Get score based on action kind from configuration
|
|
142
|
+
let score;
|
|
143
|
+
switch (action.kind) {
|
|
144
|
+
case ActionKind.Accepted:
|
|
145
|
+
score = config.acceptedScore;
|
|
146
|
+
break;
|
|
147
|
+
case ActionKind.Rejected:
|
|
148
|
+
score = config.rejectedScore;
|
|
149
|
+
break;
|
|
150
|
+
case ActionKind.Ignored:
|
|
151
|
+
score = config.ignoredScore;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
// Normalize score to 0-1 range based on accept/reject weights
|
|
155
|
+
const normalized = (score - config.rejectedScore) / (config.acceptedScore - config.rejectedScore);
|
|
156
|
+
weightedScore += normalized * weight;
|
|
157
|
+
totalWeight += weight;
|
|
158
|
+
}
|
|
159
|
+
const rawScore = totalWeight > 0 ? weightedScore / totalWeight : 0.5;
|
|
160
|
+
// Adjust score towards neutral (0.5) when we have fewer data points
|
|
161
|
+
// This prevents extreme scores with limited data
|
|
162
|
+
const dataConfidence = scoredActionCount / exports.MAX_INTERACTIONS_CONSIDERED;
|
|
163
|
+
return 0.5 + (rawScore - 0.5) * dataConfidence;
|
|
164
|
+
}
|
|
22
165
|
let UserInteractionMonitor = class UserInteractionMonitor {
|
|
23
|
-
|
|
24
|
-
static { this.MAX_INTERACTIONS_CONSIDERED = 10; }
|
|
25
|
-
constructor(_configurationService, _experimentationService) {
|
|
166
|
+
constructor(_configurationService, _experimentationService, _logService, _telemetryService) {
|
|
26
167
|
this._configurationService = _configurationService;
|
|
27
168
|
this._experimentationService = _experimentationService;
|
|
28
|
-
this.
|
|
169
|
+
this._logService = _logService;
|
|
170
|
+
this._telemetryService = _telemetryService;
|
|
171
|
+
/**
|
|
172
|
+
* Used for aggressiveness level calculation.
|
|
173
|
+
* Includes all action types (accepted, rejected, ignored).
|
|
174
|
+
*/
|
|
175
|
+
this._recentUserActionsForAggressiveness = [];
|
|
176
|
+
/**
|
|
177
|
+
* Used for timing/debounce calculation.
|
|
178
|
+
* Only includes accepted and rejected actions (ignored actions don't affect timing).
|
|
179
|
+
*/
|
|
180
|
+
this._recentUserActionsForTiming = [];
|
|
29
181
|
}
|
|
30
182
|
// Capture user interactions
|
|
31
183
|
handleAcceptance() {
|
|
32
|
-
this._recordUserAction(
|
|
184
|
+
this._recordUserAction(ActionKind.Accepted);
|
|
33
185
|
}
|
|
34
186
|
handleRejection() {
|
|
35
|
-
this._recordUserAction(
|
|
187
|
+
this._recordUserAction(ActionKind.Rejected);
|
|
188
|
+
}
|
|
189
|
+
handleIgnored() {
|
|
190
|
+
this._recordUserAction(ActionKind.Ignored);
|
|
36
191
|
}
|
|
37
192
|
_recordUserAction(kind) {
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
this.
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
// Always record for aggressiveness calculation
|
|
195
|
+
this._recentUserActionsForAggressiveness.push({ time: now, kind });
|
|
196
|
+
this._recentUserActionsForAggressiveness = this._recentUserActionsForAggressiveness.slice(-exports.MAX_INTERACTIONS_STORED);
|
|
197
|
+
// Only record accepts/rejects for timing calculation
|
|
198
|
+
if (kind !== ActionKind.Ignored) {
|
|
199
|
+
this._recentUserActionsForTiming.push({ time: now, kind });
|
|
200
|
+
this._recentUserActionsForTiming = this._recentUserActionsForTiming.slice(-exports.MAX_INTERACTIONS_CONSIDERED);
|
|
201
|
+
}
|
|
41
202
|
}
|
|
42
203
|
// Creates a DelaySession based on recent user interactions
|
|
43
204
|
createDelaySession(requestTime) {
|
|
@@ -55,14 +216,15 @@ let UserInteractionMonitor = class UserInteractionMonitor {
|
|
|
55
216
|
const now = Date.now();
|
|
56
217
|
let multiplier = 1;
|
|
57
218
|
// Calculate impact of each action with time decay
|
|
58
|
-
|
|
219
|
+
// Uses timing-specific array which only contains accepts/rejects
|
|
220
|
+
for (const action of this._recentUserActionsForTiming) {
|
|
59
221
|
const timeSinceAction = now - action.time;
|
|
60
222
|
if (timeSinceAction > DEBOUNCE_DECAY_TIME_MS) {
|
|
61
223
|
continue;
|
|
62
224
|
}
|
|
63
225
|
// Exponential decay: impact decreases as time passes
|
|
64
226
|
const decayFactor = Math.exp(-timeSinceAction / DEBOUNCE_DECAY_TIME_MS);
|
|
65
|
-
const actionWeight = action.kind ===
|
|
227
|
+
const actionWeight = action.kind === ActionKind.Rejected ? REJECTION_WEIGHT : ACCEPTANCE_WEIGHT;
|
|
66
228
|
multiplier *= 1 + ((actionWeight - 1) * decayFactor);
|
|
67
229
|
}
|
|
68
230
|
let debounceTime = baseDebounceTime * multiplier;
|
|
@@ -81,11 +243,12 @@ let UserInteractionMonitor = class UserInteractionMonitor {
|
|
|
81
243
|
return { aggressivenessLevel: configuredAggressivenessLevel, userHappinessScore: undefined };
|
|
82
244
|
}
|
|
83
245
|
let level;
|
|
84
|
-
const
|
|
85
|
-
|
|
246
|
+
const config = this._getUserHappinessScoreConfiguration();
|
|
247
|
+
const userHappinessScore = this._getUserHappinessScore(config);
|
|
248
|
+
if (userHappinessScore >= config.highThreshold) {
|
|
86
249
|
level = xtabPromptOptions_1.AggressivenessLevel.High;
|
|
87
250
|
}
|
|
88
|
-
else if (userHappinessScore >=
|
|
251
|
+
else if (userHappinessScore >= config.mediumThreshold) {
|
|
89
252
|
level = xtabPromptOptions_1.AggressivenessLevel.Medium;
|
|
90
253
|
}
|
|
91
254
|
else {
|
|
@@ -93,36 +256,40 @@ let UserInteractionMonitor = class UserInteractionMonitor {
|
|
|
93
256
|
}
|
|
94
257
|
return { aggressivenessLevel: level, userHappinessScore };
|
|
95
258
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (this._recentUserActions.length === 0) {
|
|
102
|
-
return 0.5; // neutral score when no data
|
|
259
|
+
_getUserHappinessScoreConfiguration() {
|
|
260
|
+
const configKey = configurationService_1.ConfigKey.TeamInternal.InlineEditsUserHappinessScoreConfigurationString;
|
|
261
|
+
const configString = this._configurationService.getExperimentBasedConfig(configKey, this._experimentationService);
|
|
262
|
+
if (configString === undefined) {
|
|
263
|
+
return xtabPromptOptions_1.DEFAULT_USER_HAPPINESS_SCORE_CONFIGURATION;
|
|
103
264
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
for (let i = 0; i < this._recentUserActions.length; i++) {
|
|
107
|
-
const action = this._recentUserActions[i];
|
|
108
|
-
// Calculate weight based on position (more recent = higher weight)
|
|
109
|
-
// Position 0 (oldest) has lowest weight, last position has highest weight
|
|
110
|
-
const weight = i + 1;
|
|
111
|
-
// Accepted = 1, Rejected = 0
|
|
112
|
-
const score = action.kind === 'accepted' ? 1 : 0;
|
|
113
|
-
weightedScore += score * weight;
|
|
114
|
-
totalWeight += weight;
|
|
265
|
+
try {
|
|
266
|
+
return (0, xtabPromptOptions_1.parseUserHappinessScoreConfigurationString)(configString);
|
|
115
267
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
268
|
+
catch (e) {
|
|
269
|
+
this._logService.error(e, 'Failed to parse user happiness score configuration, using default config');
|
|
270
|
+
// Log to telemetry when we fail to parse an experimental config, but still offer the default config to avoid disruption.
|
|
271
|
+
/* __GDPR__
|
|
272
|
+
"incorrectNesAdaptiveAggressivenessConfig" : {
|
|
273
|
+
"owner": "bstee615",
|
|
274
|
+
"comment": "Capture if model configuration string is invalid JSON.",
|
|
275
|
+
"configName": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Name of the configuration that failed to parse." },
|
|
276
|
+
"errorMessage": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error message from JSON.parse." },
|
|
277
|
+
"configValue": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "The invalid JSON string." }
|
|
278
|
+
}
|
|
279
|
+
*/
|
|
280
|
+
this._telemetryService.sendMSFTTelemetryEvent('incorrectNesAdaptiveAggressivenessConfig', { configName: configKey.id, errorMessage: errors.toString(errors.fromUnknown(e)), configValue: configString });
|
|
281
|
+
return xtabPromptOptions_1.DEFAULT_USER_HAPPINESS_SCORE_CONFIGURATION;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
_getUserHappinessScore(config) {
|
|
285
|
+
return getUserHappinessScore(this._recentUserActionsForAggressiveness, config);
|
|
121
286
|
}
|
|
122
287
|
};
|
|
123
288
|
exports.UserInteractionMonitor = UserInteractionMonitor;
|
|
124
|
-
exports.UserInteractionMonitor = UserInteractionMonitor =
|
|
289
|
+
exports.UserInteractionMonitor = UserInteractionMonitor = __decorate([
|
|
125
290
|
__param(0, configurationService_1.IConfigurationService),
|
|
126
|
-
__param(1, nullExperimentationService_1.IExperimentationService)
|
|
291
|
+
__param(1, nullExperimentationService_1.IExperimentationService),
|
|
292
|
+
__param(2, logService_1.ILogService),
|
|
293
|
+
__param(3, telemetry_1.ITelemetryService)
|
|
127
294
|
], UserInteractionMonitor);
|
|
128
295
|
//# sourceMappingURL=userInteractionMonitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userInteractionMonitor.js","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/common/userInteractionMonitor.ts"],"names":[],"mappings":";AAAA;;;gGAGgG
|
|
1
|
+
{"version":3,"file":"userInteractionMonitor.js","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/common/userInteractionMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export interface INextEditProvider<T extends INextEditResult, TTelemetry, TData
|
|
|
26
26
|
handleShown(suggestion: T): void;
|
|
27
27
|
handleAcceptance(docId: DocumentId, suggestion: T): void;
|
|
28
28
|
handleRejection(docId: DocumentId, suggestion: T): void;
|
|
29
|
-
handleIgnored(docId: DocumentId, suggestion: T,
|
|
29
|
+
handleIgnored(docId: DocumentId, suggestion: T, supersededBy: INextEditResult | undefined): void;
|
|
30
30
|
lastRejectionTime: number;
|
|
31
31
|
lastTriggerTime: number;
|
|
32
32
|
}
|
|
@@ -52,6 +52,8 @@ export declare class NextEditProvider extends Disposable implements INextEditPro
|
|
|
52
52
|
*/
|
|
53
53
|
private _speculativePendingRequest;
|
|
54
54
|
private _lastShownTime;
|
|
55
|
+
/** The requestId of the last shown suggestion. We store only the requestId (not the object) to avoid preventing garbage collection. */
|
|
56
|
+
private _lastShownSuggestionId;
|
|
55
57
|
private _lastRejectionTime;
|
|
56
58
|
get lastRejectionTime(): number;
|
|
57
59
|
private _lastTriggerTime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextEditProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/node/nextEditProvider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAa,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,2DAA2D,CAAC;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,2DAA2D,CAAC;AACxG,OAAO,EAAuB,mBAAmB,EAAE,MAAM,0DAA0D,CAAC;AACpH,OAAO,EAAE,0BAA0B,EAA0L,MAAM,gEAAgE,CAAC;AAEpS,OAAO,EAAmC,uBAAuB,EAAE,MAAM,kFAAkF,CAAC;AAC5J,OAAO,EAAyB,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAC/I,OAAO,EAAW,WAAW,EAAa,MAAM,yCAAyC,CAAC;AAE1F,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAMxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAmB,WAAW,EAAgB,MAAM,wCAAwC,CAAC;AAUhH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsCnE,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,uBAAuB;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,UAAU,EAAE,KAAK,GAAG,IAAI,CAAE,SAAQ,WAAW;IAC1G,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3M,WAAW,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;IACzD,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;IACxD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"nextEditProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/_internal/extension/inlineEdits/node/nextEditProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -134,6 +134,8 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
134
134
|
*/
|
|
135
135
|
this._speculativePendingRequest = null;
|
|
136
136
|
this._lastShownTime = 0;
|
|
137
|
+
/** The requestId of the last shown suggestion. We store only the requestId (not the object) to avoid preventing garbage collection. */
|
|
138
|
+
this._lastShownSuggestionId = undefined;
|
|
137
139
|
this._lastRejectionTime = 0;
|
|
138
140
|
this._lastTriggerTime = 0;
|
|
139
141
|
this._shouldExpandEditWindow = false;
|
|
@@ -360,7 +362,7 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
360
362
|
if (requestToReuse) {
|
|
361
363
|
// Nice! No need to make another request, we can reuse the result from a pending request.
|
|
362
364
|
if (speculativeRequest) {
|
|
363
|
-
logger.trace(
|
|
365
|
+
logger.trace(`reusing speculative pending request (opportunityId=${speculativeRequest.opportunityId}, headerRequestId=${speculativeRequest.id})`);
|
|
364
366
|
// Clear the speculative request since we're using it
|
|
365
367
|
this._speculativePendingRequest = null;
|
|
366
368
|
}
|
|
@@ -659,6 +661,7 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
659
661
|
}
|
|
660
662
|
handleShown(suggestion) {
|
|
661
663
|
this._lastShownTime = Date.now();
|
|
664
|
+
this._lastShownSuggestionId = suggestion.requestId;
|
|
662
665
|
// Trigger speculative request for the post-edit document state
|
|
663
666
|
const speculativeRequestsEnabled = this._configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsSpeculativeRequests, this._expService);
|
|
664
667
|
if (speculativeRequestsEnabled) {
|
|
@@ -721,7 +724,6 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
721
724
|
logger.trace('document not found for speculative request');
|
|
722
725
|
return;
|
|
723
726
|
}
|
|
724
|
-
logger.trace('triggering speculative request for post-edit state');
|
|
725
727
|
// Cancel any previous speculative request
|
|
726
728
|
this._speculativePendingRequest?.request.cancellationTokenSource.cancel();
|
|
727
729
|
this._speculativePendingRequest = null;
|
|
@@ -734,6 +736,7 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
734
736
|
// Use a dummy version since this is speculative and we don't have the actual post-edit version
|
|
735
737
|
const logContext = new inlineEditLogContext_1.InlineEditRequestLogContext(docId.uri, 0, undefined);
|
|
736
738
|
const req = new NextEditFetchRequest(`sp-${suggestion.source.opportunityId}`, logContext, undefined);
|
|
739
|
+
logger.trace(`triggering speculative request for post-edit state (opportunityId=${req.opportunityId}, headerRequestId=${req.headerRequestId})`);
|
|
737
740
|
try {
|
|
738
741
|
const speculativeRequest = await this._createSpeculativeRequest(req, doc, historyContext, postEditContent, rootedEdit, result.edit, logger);
|
|
739
742
|
if (speculativeRequest) {
|
|
@@ -897,7 +900,15 @@ let NextEditProvider = class NextEditProvider extends lifecycle_1.Disposable {
|
|
|
897
900
|
this._lastRejectionTime = Date.now();
|
|
898
901
|
this._statelessNextEditProvider.handleRejection?.();
|
|
899
902
|
}
|
|
900
|
-
handleIgnored(docId, suggestion, supersededBy) {
|
|
903
|
+
handleIgnored(docId, suggestion, supersededBy) {
|
|
904
|
+
// Check if this was the last shown suggestion
|
|
905
|
+
const wasShown = this._lastShownSuggestionId === suggestion.requestId;
|
|
906
|
+
const wasSuperseded = supersededBy !== undefined;
|
|
907
|
+
if (wasShown && !wasSuperseded) {
|
|
908
|
+
// Was shown to the user
|
|
909
|
+
this._statelessNextEditProvider.handleIgnored?.();
|
|
910
|
+
}
|
|
911
|
+
}
|
|
901
912
|
async runSnippy(docId, suggestion) {
|
|
902
913
|
if (suggestion.result === undefined || suggestion.result.edit === undefined) {
|
|
903
914
|
return;
|