@aws/lsp-codewhisperer 0.0.82 → 0.0.84
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/CHANGELOG.md +43 -0
- package/out/language-server/agenticChat/agenticChatController.js +105 -35
- package/out/language-server/agenticChat/agenticChatController.js.map +1 -1
- package/out/language-server/agenticChat/agenticChatResultStream.d.ts +1 -0
- package/out/language-server/agenticChat/agenticChatResultStream.js +21 -0
- package/out/language-server/agenticChat/agenticChatResultStream.js.map +1 -1
- package/out/language-server/agenticChat/constants/constants.d.ts +30 -0
- package/out/language-server/agenticChat/constants/constants.js +44 -1
- package/out/language-server/agenticChat/constants/constants.js.map +1 -1
- package/out/language-server/agenticChat/constants/modelSelection.d.ts +2 -2
- package/out/language-server/agenticChat/constants/modelSelection.js +6 -5
- package/out/language-server/agenticChat/constants/modelSelection.js.map +1 -1
- package/out/language-server/agenticChat/context/agenticChatTriggerContext.d.ts +2 -1
- package/out/language-server/agenticChat/context/agenticChatTriggerContext.js +3 -1
- package/out/language-server/agenticChat/context/agenticChatTriggerContext.js.map +1 -1
- package/out/language-server/agenticChat/context/memorybank/memoryBankController.js +4 -3
- package/out/language-server/agenticChat/context/memorybank/memoryBankController.js.map +1 -1
- package/out/language-server/agenticChat/retry/delayInterceptor.d.ts +33 -0
- package/out/language-server/agenticChat/retry/delayInterceptor.js +79 -0
- package/out/language-server/agenticChat/retry/delayInterceptor.js.map +1 -0
- package/out/language-server/agenticChat/retry/errorTransformer.d.ts +15 -0
- package/out/language-server/agenticChat/retry/errorTransformer.js +152 -0
- package/out/language-server/agenticChat/retry/errorTransformer.js.map +1 -0
- package/out/language-server/agenticChat/retry/index.d.ts +3 -0
- package/out/language-server/agenticChat/retry/index.js +11 -0
- package/out/language-server/agenticChat/retry/index.js.map +1 -0
- package/out/language-server/agenticChat/retry/qRetryStrategy.d.ts +20 -0
- package/out/language-server/agenticChat/retry/qRetryStrategy.js +71 -0
- package/out/language-server/agenticChat/retry/qRetryStrategy.js.map +1 -0
- package/out/language-server/agenticChat/retry/retryClassifier.d.ts +32 -0
- package/out/language-server/agenticChat/retry/retryClassifier.js +122 -0
- package/out/language-server/agenticChat/retry/retryClassifier.js.map +1 -0
- package/out/language-server/agenticChat/tabBarController.d.ts +4 -0
- package/out/language-server/agenticChat/tabBarController.js +19 -2
- package/out/language-server/agenticChat/tabBarController.js.map +1 -1
- package/out/language-server/agenticChat/tools/chatDb/chatDb.d.ts +3 -25
- package/out/language-server/agenticChat/tools/chatDb/chatDb.js +12 -107
- package/out/language-server/agenticChat/tools/chatDb/chatDb.js.map +1 -1
- package/out/language-server/agenticChat/tools/chatDb/util.js +1 -2
- package/out/language-server/agenticChat/tools/chatDb/util.js.map +1 -1
- package/out/language-server/agenticChat/tools/fsRead.d.ts +3 -1
- package/out/language-server/agenticChat/tools/fsRead.js +12 -7
- package/out/language-server/agenticChat/tools/fsRead.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReview.js +30 -14
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReview.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewConstants.js +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewConstants.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewTypes.d.ts +8 -0
- package/out/language-server/chat/chatController.js.map +1 -1
- package/out/language-server/chat/chatSessionService.d.ts +8 -1
- package/out/language-server/chat/chatSessionService.js +38 -81
- package/out/language-server/chat/chatSessionService.js.map +1 -1
- package/out/language-server/chat/constants.d.ts +1 -0
- package/out/language-server/chat/constants.js +2 -1
- package/out/language-server/chat/constants.js.map +1 -1
- package/out/language-server/chat/telemetry/chatTelemetryController.d.ts +2 -1
- package/out/language-server/chat/telemetry/chatTelemetryController.js +12 -1
- package/out/language-server/chat/telemetry/chatTelemetryController.js.map +1 -1
- package/out/language-server/inline-completion/codeWhispererServer.d.ts +0 -1
- package/out/language-server/inline-completion/codeWhispererServer.js +17 -481
- package/out/language-server/inline-completion/codeWhispererServer.js.map +1 -1
- package/out/language-server/inline-completion/contants/constants.js.map +1 -0
- package/out/language-server/inline-completion/{editCompletionHandler.d.ts → handler/editCompletionHandler.d.ts} +10 -10
- package/out/language-server/inline-completion/{editCompletionHandler.js → handler/editCompletionHandler.js} +17 -14
- package/out/language-server/inline-completion/handler/editCompletionHandler.js.map +1 -0
- package/out/language-server/inline-completion/handler/inlineCompletionHandler.d.ts +32 -0
- package/out/language-server/inline-completion/handler/inlineCompletionHandler.js +377 -0
- package/out/language-server/inline-completion/handler/inlineCompletionHandler.js.map +1 -0
- package/out/language-server/inline-completion/handler/sessionResultsHandler.d.ts +23 -0
- package/out/language-server/inline-completion/handler/sessionResultsHandler.js +119 -0
- package/out/language-server/inline-completion/handler/sessionResultsHandler.js.map +1 -0
- package/out/language-server/inline-completion/{telemetry.d.ts → telemetry/telemetry.d.ts} +2 -2
- package/out/language-server/inline-completion/{telemetry.js → telemetry/telemetry.js} +2 -2
- package/out/language-server/inline-completion/telemetry/telemetry.js.map +1 -0
- package/out/language-server/inline-completion/{codeDiffTracker.d.ts → tracker/codeDiffTracker.d.ts} +2 -2
- package/out/language-server/inline-completion/{codeDiffTracker.js → tracker/codeDiffTracker.js} +1 -1
- package/out/language-server/inline-completion/tracker/codeDiffTracker.js.map +1 -0
- package/out/language-server/inline-completion/tracker/codeEditTracker.js +1 -1
- package/out/language-server/inline-completion/tracker/codeEditTracker.js.map +1 -1
- package/out/language-server/inline-completion/{codePercentage.d.ts → tracker/codePercentageTracker.d.ts} +1 -1
- package/out/language-server/inline-completion/{codePercentage.js → tracker/codePercentageTracker.js} +1 -1
- package/out/language-server/inline-completion/tracker/codePercentageTracker.js.map +1 -0
- package/out/language-server/inline-completion/{diffUtils.d.ts → utils/diffUtils.d.ts} +29 -12
- package/out/language-server/inline-completion/utils/diffUtils.js +407 -0
- package/out/language-server/inline-completion/utils/diffUtils.js.map +1 -0
- package/out/language-server/inline-completion/utils/mergeRightUtils.d.ts +9 -0
- package/out/language-server/inline-completion/utils/mergeRightUtils.js +67 -0
- package/out/language-server/inline-completion/utils/mergeRightUtils.js.map +1 -0
- package/out/language-server/inline-completion/utils/textDocumentUtils.d.ts +3 -0
- package/out/language-server/inline-completion/utils/textDocumentUtils.js +37 -0
- package/out/language-server/inline-completion/utils/textDocumentUtils.js.map +1 -0
- package/out/language-server/inline-completion/{trigger.d.ts → utils/triggerUtils.d.ts} +4 -4
- package/out/language-server/inline-completion/{trigger.js → utils/triggerUtils.js} +3 -3
- package/out/language-server/inline-completion/utils/triggerUtils.js.map +1 -0
- package/out/language-server/netTransform/artifactManager.d.ts +2 -2
- package/out/language-server/netTransform/artifactManager.js +6 -10
- package/out/language-server/netTransform/artifactManager.js.map +1 -1
- package/out/language-server/workspaceContext/workspaceFolderManager.js +3 -1
- package/out/language-server/workspaceContext/workspaceFolderManager.js.map +1 -1
- package/out/shared/amazonQServiceManager/AmazonQIAMServiceManager.d.ts +1 -1
- package/out/shared/amazonQServiceManager/AmazonQIAMServiceManager.js +8 -2
- package/out/shared/amazonQServiceManager/AmazonQIAMServiceManager.js.map +1 -1
- package/out/shared/amazonQServiceManager/AmazonQTokenServiceManager.js +1 -0
- package/out/shared/amazonQServiceManager/AmazonQTokenServiceManager.js.map +1 -1
- package/out/shared/amazonQServiceManager/BaseAmazonQServiceManager.js +6 -0
- package/out/shared/amazonQServiceManager/BaseAmazonQServiceManager.js.map +1 -1
- package/out/shared/codeWhispererService.js +52 -20
- package/out/shared/codeWhispererService.js.map +1 -1
- package/out/shared/streamingClientService.d.ts +7 -1
- package/out/shared/streamingClientService.js +53 -15
- package/out/shared/streamingClientService.js.map +1 -1
- package/out/shared/telemetry/telemetryService.js.map +1 -1
- package/out/shared/telemetry/types.d.ts +8 -0
- package/out/shared/telemetry/types.js +1 -0
- package/out/shared/telemetry/types.js.map +1 -1
- package/out/shared/testUtils.d.ts +0 -3
- package/out/shared/testUtils.js +1 -22
- package/out/shared/testUtils.js.map +1 -1
- package/out/shared/utils.d.ts +10 -4
- package/out/shared/utils.js +20 -11
- package/out/shared/utils.js.map +1 -1
- package/package.json +4 -5
- package/out/language-server/inline-completion/codeDiffTracker.js.map +0 -1
- package/out/language-server/inline-completion/codePercentage.js.map +0 -1
- package/out/language-server/inline-completion/constants.js.map +0 -1
- package/out/language-server/inline-completion/diffUtils.js +0 -255
- package/out/language-server/inline-completion/diffUtils.js.map +0 -1
- package/out/language-server/inline-completion/editCompletionHandler.js.map +0 -1
- package/out/language-server/inline-completion/mergeRightUtils.d.ts +0 -25
- package/out/language-server/inline-completion/mergeRightUtils.js +0 -114
- package/out/language-server/inline-completion/mergeRightUtils.js.map +0 -1
- package/out/language-server/inline-completion/telemetry.js.map +0 -1
- package/out/language-server/inline-completion/trigger.js.map +0 -1
- /package/out/language-server/inline-completion/{constants.d.ts → contants/constants.d.ts} +0 -0
- /package/out/language-server/inline-completion/{constants.js → contants/constants.js} +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QErrorTransformer = void 0;
|
|
4
|
+
const utils_1 = require("../../../shared/utils");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const errors_2 = require("../../../shared/amazonQServiceManager/errors");
|
|
7
|
+
const constants_1 = require("../constants/constants");
|
|
8
|
+
/**
|
|
9
|
+
* Q-specific error transformation for AWS SDK native retry.
|
|
10
|
+
* AWS SDK handles retries, this transforms final errors into user-friendly Q messages.
|
|
11
|
+
*/
|
|
12
|
+
class QErrorTransformer {
|
|
13
|
+
logging;
|
|
14
|
+
isModelSelectionEnabled;
|
|
15
|
+
constructor(logging, isModelSelectionEnabled = false) {
|
|
16
|
+
this.logging = logging;
|
|
17
|
+
this.isModelSelectionEnabled =
|
|
18
|
+
typeof isModelSelectionEnabled === 'function' ? isModelSelectionEnabled : () => isModelSelectionEnabled;
|
|
19
|
+
}
|
|
20
|
+
extractResponseBody(error) {
|
|
21
|
+
return (this.extractTextFromBody(error.cause?.$metadata?.body) ||
|
|
22
|
+
this.extractTextFromBody(error.$metadata?.body) ||
|
|
23
|
+
this.extractTextFromBody(error.cause?.body) ||
|
|
24
|
+
this.extractTextFromBody(error.body) ||
|
|
25
|
+
this.extractTextFromBody(error.response?.data) ||
|
|
26
|
+
this.extractTextFromBody(error.response?.body) ||
|
|
27
|
+
error.message ||
|
|
28
|
+
null);
|
|
29
|
+
}
|
|
30
|
+
extractTextFromBody(body) {
|
|
31
|
+
try {
|
|
32
|
+
if (typeof body === 'string') {
|
|
33
|
+
return body;
|
|
34
|
+
}
|
|
35
|
+
if (body instanceof Uint8Array) {
|
|
36
|
+
return new TextDecoder('utf-8', { fatal: false }).decode(body);
|
|
37
|
+
}
|
|
38
|
+
if (body instanceof ArrayBuffer) {
|
|
39
|
+
return new TextDecoder('utf-8', { fatal: false }).decode(body);
|
|
40
|
+
}
|
|
41
|
+
if (typeof body === 'object' && body !== null) {
|
|
42
|
+
return JSON.stringify(body);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
transformFinalError(error, attemptCount) {
|
|
51
|
+
// Use default attempt count if not provided
|
|
52
|
+
const attempts = attemptCount ?? constants_1.MAX_REQUEST_ATTEMPTS;
|
|
53
|
+
const requestId = (0, utils_1.getRequestID)(error);
|
|
54
|
+
// Don't transform authentication errors - let them pass through for auth follow-up handling
|
|
55
|
+
if (error instanceof errors_2.AmazonQServicePendingSigninError || error instanceof errors_2.AmazonQServicePendingProfileError) {
|
|
56
|
+
return error;
|
|
57
|
+
}
|
|
58
|
+
// Handle specific error types with retry context
|
|
59
|
+
if ((0, utils_1.isUsageLimitError)(error)) {
|
|
60
|
+
return new errors_1.AgenticChatError(`Request failed after ${attempts} attempts`, 'AmazonQUsageLimitError', error instanceof Error ? error : undefined, requestId);
|
|
61
|
+
}
|
|
62
|
+
// Check response body for monthly limits
|
|
63
|
+
const bodyStr = this.extractResponseBody(error);
|
|
64
|
+
if (bodyStr && bodyStr.includes(constants_1.MONTHLY_LIMIT_ERROR_MARKER)) {
|
|
65
|
+
return new errors_1.AgenticChatError(`Request failed after ${attempts} attempts`, 'AmazonQUsageLimitError', error instanceof Error ? error : undefined, requestId);
|
|
66
|
+
}
|
|
67
|
+
if (error?.name === 'AbortError' ||
|
|
68
|
+
error?.code === 'RequestAborted' ||
|
|
69
|
+
error?.name === 'RequestAborted' ||
|
|
70
|
+
(0, errors_1.isRequestAbortedError)(error)) {
|
|
71
|
+
return new errors_1.AgenticChatError('Request aborted', 'RequestAborted', error instanceof Error ? error : undefined, requestId);
|
|
72
|
+
}
|
|
73
|
+
if (error?.name === 'InputTooLong' ||
|
|
74
|
+
error?.code === 'InputTooLong' ||
|
|
75
|
+
error?.message?.includes('input too long') ||
|
|
76
|
+
(0, errors_1.isInputTooLongError)(error)) {
|
|
77
|
+
return new errors_1.AgenticChatError('Too much context loaded. I have cleared the conversation history. Please retry your request with smaller input.', 'InputTooLong', error instanceof Error ? error : undefined, requestId);
|
|
78
|
+
}
|
|
79
|
+
// Check for model unavailability first (before general throttling)
|
|
80
|
+
const statusCode = this.getStatusCode(error);
|
|
81
|
+
const isModelUnavailable = (statusCode === constants_1.HTTP_STATUS_TOO_MANY_REQUESTS &&
|
|
82
|
+
(error.cause?.reason === constants_1.INSUFFICIENT_MODEL_CAPACITY ||
|
|
83
|
+
error.reason === constants_1.INSUFFICIENT_MODEL_CAPACITY)) ||
|
|
84
|
+
(statusCode === constants_1.HTTP_STATUS_INTERNAL_SERVER_ERROR && error.message === constants_1.HIGH_LOAD_ERROR_MESSAGE);
|
|
85
|
+
if (isModelUnavailable) {
|
|
86
|
+
const message = this.isModelSelectionEnabled()
|
|
87
|
+
? `The model you selected is temporarily unavailable. Please switch to a different model and try again.`
|
|
88
|
+
: `I am experiencing high traffic, please try again shortly.`;
|
|
89
|
+
return new errors_1.AgenticChatError(message, 'QModelResponse', error instanceof Error ? error : undefined, requestId);
|
|
90
|
+
}
|
|
91
|
+
if ((0, utils_1.isAwsThrottlingError)(error) || (0, errors_1.isThrottlingRelated)(error) || this.isThrottlingError(error)) {
|
|
92
|
+
return new errors_1.AgenticChatError(`Service is currently experiencing high traffic. Request failed after ${attempts} attempts. Please try again later.`, 'RequestThrottled', error instanceof Error ? error : undefined, requestId);
|
|
93
|
+
}
|
|
94
|
+
// Handle other errors - fallback to QModelResponse with request ID
|
|
95
|
+
return new errors_1.AgenticChatError(error instanceof Error ? error.message : String(error), 'QModelResponse', error instanceof Error ? error : undefined, requestId);
|
|
96
|
+
}
|
|
97
|
+
isThrottlingError(error) {
|
|
98
|
+
const statusCode = this.getStatusCode(error);
|
|
99
|
+
// Check for AWS throttling patterns
|
|
100
|
+
if (statusCode === constants_1.HTTP_STATUS_TOO_MANY_REQUESTS ||
|
|
101
|
+
error?.name === 'ThrottlingException' ||
|
|
102
|
+
error?.code === 'ThrottlingException')
|
|
103
|
+
return true;
|
|
104
|
+
// Check for service overloaded errors (status 500 with specific messages)
|
|
105
|
+
if (statusCode === constants_1.HTTP_STATUS_INTERNAL_SERVER_ERROR) {
|
|
106
|
+
// Check response body directly (not error message) to avoid conflict with model unavailability
|
|
107
|
+
const responseBody = error.cause?.$metadata?.body || error.$metadata?.body;
|
|
108
|
+
if (responseBody) {
|
|
109
|
+
const isOverloaded = responseBody.includes(constants_1.HIGH_LOAD_ERROR_MESSAGE) ||
|
|
110
|
+
responseBody.includes(constants_1.SERVICE_UNAVAILABLE_EXCEPTION);
|
|
111
|
+
this.logging?.debug(`QErrorTransformer: Service overloaded error detected (status 500): ${isOverloaded}`);
|
|
112
|
+
return isOverloaded;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Model capacity issues - but these should be handled by model unavailability check first
|
|
116
|
+
if (statusCode === constants_1.HTTP_STATUS_TOO_MANY_REQUESTS &&
|
|
117
|
+
(error.cause?.reason === constants_1.INSUFFICIENT_MODEL_CAPACITY || error.reason === constants_1.INSUFFICIENT_MODEL_CAPACITY)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
getStatusCode(error) {
|
|
123
|
+
try {
|
|
124
|
+
// AWS SDK v3 metadata patterns
|
|
125
|
+
if (error.cause?.$metadata?.httpStatusCode)
|
|
126
|
+
return error.cause.$metadata.httpStatusCode;
|
|
127
|
+
if (error.$metadata?.httpStatusCode)
|
|
128
|
+
return error.$metadata.httpStatusCode;
|
|
129
|
+
// Direct status properties
|
|
130
|
+
if (error.statusCode)
|
|
131
|
+
return error.statusCode;
|
|
132
|
+
if (error.status)
|
|
133
|
+
return error.status;
|
|
134
|
+
// Response object patterns
|
|
135
|
+
if (error.response?.status)
|
|
136
|
+
return error.response.status;
|
|
137
|
+
if (error.response?.statusCode)
|
|
138
|
+
return error.response.statusCode;
|
|
139
|
+
// Nested error patterns
|
|
140
|
+
if (error.cause?.statusCode)
|
|
141
|
+
return error.cause.statusCode;
|
|
142
|
+
if (error.cause?.status)
|
|
143
|
+
return error.cause.status;
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.QErrorTransformer = QErrorTransformer;
|
|
152
|
+
//# sourceMappingURL=errorTransformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorTransformer.js","sourceRoot":"","sources":["../../../../src/language-server/agenticChat/retry/errorTransformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QErrorTransformer = exports.QDelayTrackingInterceptor = exports.RetryAction = exports.QRetryClassifier = void 0;
|
|
4
|
+
var retryClassifier_1 = require("./retryClassifier");
|
|
5
|
+
Object.defineProperty(exports, "QRetryClassifier", { enumerable: true, get: function () { return retryClassifier_1.QRetryClassifier; } });
|
|
6
|
+
Object.defineProperty(exports, "RetryAction", { enumerable: true, get: function () { return retryClassifier_1.RetryAction; } });
|
|
7
|
+
var delayInterceptor_1 = require("./delayInterceptor");
|
|
8
|
+
Object.defineProperty(exports, "QDelayTrackingInterceptor", { enumerable: true, get: function () { return delayInterceptor_1.QDelayTrackingInterceptor; } });
|
|
9
|
+
var errorTransformer_1 = require("./errorTransformer");
|
|
10
|
+
Object.defineProperty(exports, "QErrorTransformer", { enumerable: true, get: function () { return errorTransformer_1.QErrorTransformer; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/language-server/agenticChat/retry/index.ts"],"names":[],"mappings":";;;AAAA,qDAAwH;AAA/G,mHAAA,gBAAgB,OAAA;AAAE,8GAAA,WAAW,OAAA;AACtC,uDAAsF;AAA7E,6HAAA,yBAAyB,OAAA;AAClC,uDAAsD;AAA7C,qHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RetryToken, RetryErrorInfo } from '@aws-sdk/types';
|
|
2
|
+
import { AdaptiveRetryStrategy } from '@smithy/util-retry';
|
|
3
|
+
import { QRetryClassifier } from './retryClassifier';
|
|
4
|
+
import { QDelayTrackingInterceptor } from './delayInterceptor';
|
|
5
|
+
import { Logging } from '@aws/language-server-runtimes/server-interface';
|
|
6
|
+
/**
|
|
7
|
+
* Custom retry strategy that extends AWS SDK v3's AdaptiveRetryStrategy with Q-specific logic
|
|
8
|
+
*/
|
|
9
|
+
export declare class QRetryStrategy extends AdaptiveRetryStrategy {
|
|
10
|
+
private retryClassifier;
|
|
11
|
+
private delayInterceptor;
|
|
12
|
+
private maxAttempts;
|
|
13
|
+
private logging?;
|
|
14
|
+
private attemptCount;
|
|
15
|
+
constructor(retryClassifier: QRetryClassifier, delayInterceptor: QDelayTrackingInterceptor, maxAttempts: number, logging?: Logging);
|
|
16
|
+
acquireInitialRetryToken(retryTokenScope: string): Promise<RetryToken>;
|
|
17
|
+
refreshRetryTokenForRetry(token: RetryToken, errorInfo: RetryErrorInfo): Promise<RetryToken>;
|
|
18
|
+
recordSuccess(token: RetryToken): void;
|
|
19
|
+
getAttemptCount(): number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QRetryStrategy = void 0;
|
|
4
|
+
const util_retry_1 = require("@smithy/util-retry");
|
|
5
|
+
const retryClassifier_1 = require("./retryClassifier");
|
|
6
|
+
const utils_1 = require("../../../shared/utils");
|
|
7
|
+
/**
|
|
8
|
+
* Custom retry strategy that extends AWS SDK v3's AdaptiveRetryStrategy with Q-specific logic
|
|
9
|
+
*/
|
|
10
|
+
class QRetryStrategy extends util_retry_1.AdaptiveRetryStrategy {
|
|
11
|
+
retryClassifier;
|
|
12
|
+
delayInterceptor;
|
|
13
|
+
maxAttempts;
|
|
14
|
+
logging;
|
|
15
|
+
attemptCount = 0;
|
|
16
|
+
constructor(retryClassifier, delayInterceptor, maxAttempts, logging) {
|
|
17
|
+
super(() => Promise.resolve(maxAttempts));
|
|
18
|
+
this.retryClassifier = retryClassifier;
|
|
19
|
+
this.delayInterceptor = delayInterceptor;
|
|
20
|
+
this.maxAttempts = maxAttempts;
|
|
21
|
+
this.logging = logging;
|
|
22
|
+
}
|
|
23
|
+
async acquireInitialRetryToken(retryTokenScope) {
|
|
24
|
+
this.attemptCount = 0;
|
|
25
|
+
this.logging?.log(`QRetryStrategy: Initial retry token acquired for scope: ${retryTokenScope}, attempt count reset to 0`);
|
|
26
|
+
// AdaptiveRetryStrategy returns StandardRetryToken, but interface expects RetryToken
|
|
27
|
+
return super.acquireInitialRetryToken(retryTokenScope);
|
|
28
|
+
}
|
|
29
|
+
async refreshRetryTokenForRetry(token, errorInfo) {
|
|
30
|
+
const currentAttempt = token.getRetryCount() + 1;
|
|
31
|
+
this.attemptCount = currentAttempt;
|
|
32
|
+
const errorCode = (0, utils_1.sanitizeLogInput)(errorInfo.error?.name || errorInfo.error?.code || 'Unknown');
|
|
33
|
+
this.logging?.log(`QRetryStrategy: Retry attempt ${currentAttempt} for error: ${errorCode}`);
|
|
34
|
+
// Apply Q-specific retry classification
|
|
35
|
+
const context = { error: errorInfo.error, response: errorInfo.error?.$response };
|
|
36
|
+
const action = this.retryClassifier.classifyRetry(context);
|
|
37
|
+
this.logging?.log(`QRetryStrategy: Retry classification result: ${action}`);
|
|
38
|
+
// Check if we should retry based on Q classification
|
|
39
|
+
if (action === retryClassifier_1.RetryAction.RetryForbidden) {
|
|
40
|
+
this.logging?.log(`QRetryStrategy: Retry forbidden, stopping retries after ${currentAttempt} attempts`);
|
|
41
|
+
throw errorInfo.error;
|
|
42
|
+
}
|
|
43
|
+
// Track delay for UI notifications - CALL BEFORE ATTEMPT
|
|
44
|
+
this.delayInterceptor.beforeAttempt(currentAttempt + 1);
|
|
45
|
+
// Delegate to adaptive strategy for delay calculation and max attempts check
|
|
46
|
+
// AdaptiveRetryStrategy expects StandardRetryToken but we receive RetryToken
|
|
47
|
+
// The token from acquireInitialRetryToken is actually StandardRetryToken, so this cast is safe
|
|
48
|
+
return super.refreshRetryTokenForRetry(token, errorInfo);
|
|
49
|
+
}
|
|
50
|
+
recordSuccess(token) {
|
|
51
|
+
try {
|
|
52
|
+
this.logging?.log(`QRetryStrategy: Request succeeded after ${this.attemptCount + 1} total attempts`);
|
|
53
|
+
// Reset delay tracking on success
|
|
54
|
+
this.delayInterceptor.reset();
|
|
55
|
+
this.attemptCount = 0;
|
|
56
|
+
// Call parent to maintain adaptive strategy state
|
|
57
|
+
// Token is actually StandardRetryToken from AdaptiveRetryStrategy
|
|
58
|
+
super.recordSuccess(token);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Log but don't throw - success recording should not fail
|
|
62
|
+
this.logging?.log(`QRetryStrategy: Warning - failed to reset state after success: ${error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Test helper method to get current attempt count
|
|
66
|
+
getAttemptCount() {
|
|
67
|
+
return this.attemptCount;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.QRetryStrategy = QRetryStrategy;
|
|
71
|
+
//# sourceMappingURL=qRetryStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qRetryStrategy.js","sourceRoot":"","sources":["../../../../src/language-server/agenticChat/retry/qRetryStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Logging } from '@aws/language-server-runtimes/server-interface';
|
|
2
|
+
export declare enum RetryAction {
|
|
3
|
+
NoActionIndicated = "no_action",
|
|
4
|
+
RetryForbidden = "retry_forbidden",
|
|
5
|
+
ThrottlingError = "throttling_error"
|
|
6
|
+
}
|
|
7
|
+
export interface RetryClassifierPriority {
|
|
8
|
+
value: number;
|
|
9
|
+
}
|
|
10
|
+
export interface InterceptorContext {
|
|
11
|
+
error: any;
|
|
12
|
+
response?: {
|
|
13
|
+
status?: number;
|
|
14
|
+
body?: string | Uint8Array;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Retry classifier that matches CLI's QCliRetryClassifier behavior.
|
|
19
|
+
* Runs after AWS SDK's transient error classifier with higher priority.
|
|
20
|
+
*/
|
|
21
|
+
export declare class QRetryClassifier {
|
|
22
|
+
private logging?;
|
|
23
|
+
constructor(logging?: Logging);
|
|
24
|
+
static priority(): RetryClassifierPriority;
|
|
25
|
+
classifyRetry(context: InterceptorContext): RetryAction;
|
|
26
|
+
private extractResponseBody;
|
|
27
|
+
private extractTextFromBody;
|
|
28
|
+
private isMonthlyLimitError;
|
|
29
|
+
private isServiceOverloadedError;
|
|
30
|
+
name(): string;
|
|
31
|
+
priority(): RetryClassifierPriority;
|
|
32
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QRetryClassifier = exports.RetryAction = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const constants_1 = require("../constants/constants");
|
|
6
|
+
var RetryAction;
|
|
7
|
+
(function (RetryAction) {
|
|
8
|
+
RetryAction["NoActionIndicated"] = "no_action";
|
|
9
|
+
RetryAction["RetryForbidden"] = "retry_forbidden";
|
|
10
|
+
RetryAction["ThrottlingError"] = "throttling_error";
|
|
11
|
+
})(RetryAction || (exports.RetryAction = RetryAction = {}));
|
|
12
|
+
/**
|
|
13
|
+
* Retry classifier that matches CLI's QCliRetryClassifier behavior.
|
|
14
|
+
* Runs after AWS SDK's transient error classifier with higher priority.
|
|
15
|
+
*/
|
|
16
|
+
class QRetryClassifier {
|
|
17
|
+
logging;
|
|
18
|
+
constructor(logging) {
|
|
19
|
+
this.logging = logging;
|
|
20
|
+
}
|
|
21
|
+
static priority() {
|
|
22
|
+
// Run after transient error classifier (higher priority number)
|
|
23
|
+
return { value: 100 };
|
|
24
|
+
}
|
|
25
|
+
classifyRetry(context) {
|
|
26
|
+
const error = context.error;
|
|
27
|
+
// Handle non-retryable errors first (matching original + enhanced detection)
|
|
28
|
+
if (error?.name === 'AccessDeniedException' ||
|
|
29
|
+
error?.name === 'SERVICE_QUOTA_EXCEPTION' ||
|
|
30
|
+
error?.name === 'AbortError' ||
|
|
31
|
+
error?.code === 'RequestAborted' ||
|
|
32
|
+
error?.name === 'RequestAborted' ||
|
|
33
|
+
(0, errors_1.isRequestAbortedError)(error)) {
|
|
34
|
+
return RetryAction.RetryForbidden;
|
|
35
|
+
}
|
|
36
|
+
if (error?.reason === constants_1.CONTENT_LENGTH_EXCEEDS_THRESHOLD ||
|
|
37
|
+
(0, errors_1.isInputTooLongError)(error) ||
|
|
38
|
+
error?.reason === constants_1.INVALID_MODEL_ID) {
|
|
39
|
+
return RetryAction.RetryForbidden;
|
|
40
|
+
}
|
|
41
|
+
// Check for monthly limit error in error object
|
|
42
|
+
if (this.isMonthlyLimitError(error)) {
|
|
43
|
+
return RetryAction.RetryForbidden;
|
|
44
|
+
}
|
|
45
|
+
if (error?.message === constants_1.MAXIMUM_CHAT_CONTENT_MESSAGE) {
|
|
46
|
+
return RetryAction.RetryForbidden;
|
|
47
|
+
}
|
|
48
|
+
const bodyStr = this.extractResponseBody(context);
|
|
49
|
+
if (bodyStr && this.isServiceOverloadedError(context, bodyStr)) {
|
|
50
|
+
return RetryAction.ThrottlingError;
|
|
51
|
+
}
|
|
52
|
+
// Check for model capacity issues
|
|
53
|
+
const status = context.response?.status || context.error?.$metadata?.httpStatusCode;
|
|
54
|
+
if (status === 429 && error?.reason === constants_1.INSUFFICIENT_MODEL_CAPACITY) {
|
|
55
|
+
return RetryAction.ThrottlingError;
|
|
56
|
+
}
|
|
57
|
+
// Check for throttling related errors (from errors.ts)
|
|
58
|
+
if ((0, errors_1.isThrottlingRelated)(error)) {
|
|
59
|
+
return RetryAction.ThrottlingError;
|
|
60
|
+
}
|
|
61
|
+
return RetryAction.NoActionIndicated;
|
|
62
|
+
}
|
|
63
|
+
extractResponseBody(context) {
|
|
64
|
+
// Try context response first
|
|
65
|
+
const contextBody = this.extractTextFromBody(context.response?.body);
|
|
66
|
+
if (contextBody)
|
|
67
|
+
return contextBody;
|
|
68
|
+
// Fallback to error-based extraction
|
|
69
|
+
const error = context.error;
|
|
70
|
+
return (error?.message ||
|
|
71
|
+
this.extractTextFromBody(error?.cause?.$metadata?.body) ||
|
|
72
|
+
this.extractTextFromBody(error?.$metadata?.body) ||
|
|
73
|
+
this.extractTextFromBody(error?.cause?.body) ||
|
|
74
|
+
this.extractTextFromBody(error?.body) ||
|
|
75
|
+
this.extractTextFromBody(error?.response?.data) ||
|
|
76
|
+
this.extractTextFromBody(error?.response?.body) ||
|
|
77
|
+
null);
|
|
78
|
+
}
|
|
79
|
+
extractTextFromBody(body) {
|
|
80
|
+
try {
|
|
81
|
+
if (typeof body === 'string') {
|
|
82
|
+
return body;
|
|
83
|
+
}
|
|
84
|
+
if (body instanceof Uint8Array) {
|
|
85
|
+
const decoded = new TextDecoder('utf-8', { fatal: false }).decode(body);
|
|
86
|
+
return decoded || null;
|
|
87
|
+
}
|
|
88
|
+
if (body instanceof ArrayBuffer) {
|
|
89
|
+
return new TextDecoder('utf-8', { fatal: false }).decode(body);
|
|
90
|
+
}
|
|
91
|
+
if (typeof body === 'object' && body !== null) {
|
|
92
|
+
return JSON.stringify(body);
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
isMonthlyLimitError(error) {
|
|
101
|
+
const isMonthlyLimit = error?.reason === constants_1.MONTHLY_LIMIT_ERROR_MARKER;
|
|
102
|
+
this.logging?.debug(`QRetryClassifier: Monthly limit error detected: ${isMonthlyLimit}`);
|
|
103
|
+
return isMonthlyLimit;
|
|
104
|
+
}
|
|
105
|
+
isServiceOverloadedError(context, bodyStr) {
|
|
106
|
+
const status = context.response?.status || context.error?.status || context.error?.$metadata?.httpStatusCode;
|
|
107
|
+
if (status !== constants_1.HTTP_STATUS_INTERNAL_SERVER_ERROR) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const isOverloaded = bodyStr.includes(constants_1.HIGH_LOAD_ERROR_MESSAGE) || bodyStr.includes(constants_1.SERVICE_UNAVAILABLE_EXCEPTION);
|
|
111
|
+
this.logging?.debug(`QRetryClassifier: Service overloaded error detected (status 500): ${isOverloaded}`);
|
|
112
|
+
return isOverloaded;
|
|
113
|
+
}
|
|
114
|
+
name() {
|
|
115
|
+
return 'Q Language Server Retry Classifier';
|
|
116
|
+
}
|
|
117
|
+
priority() {
|
|
118
|
+
return QRetryClassifier.priority();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.QRetryClassifier = QRetryClassifier;
|
|
122
|
+
//# sourceMappingURL=retryClassifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryClassifier.js","sourceRoot":"","sources":["../../../../src/language-server/agenticChat/retry/retryClassifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,10 @@ export declare class TabBarController {
|
|
|
61
61
|
* When IDE is opened, restore chats that were previously open in IDE for the current workspace.
|
|
62
62
|
*/
|
|
63
63
|
loadChats(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Determines if the environment is JupyterLab.
|
|
66
|
+
*/
|
|
67
|
+
private isJupyterLabEnvironment;
|
|
64
68
|
static enableChatExport(params?: InitializeParams): boolean;
|
|
65
69
|
static enableShowLogs(params?: InitializeParams): boolean;
|
|
66
70
|
}
|
|
@@ -11,6 +11,7 @@ const vscode_uri_1 = require("vscode-uri");
|
|
|
11
11
|
const types_1 = require("../../shared/telemetry/types");
|
|
12
12
|
const lsp_core_1 = require("@aws/lsp-core");
|
|
13
13
|
const MaxRestoredHistoryMessages = 250;
|
|
14
|
+
const JUPYTERLAB_APP_TYPE_VALUE = 'jupyterlab';
|
|
14
15
|
/**
|
|
15
16
|
* Controller for managing chat history and export functionality.
|
|
16
17
|
*
|
|
@@ -259,10 +260,14 @@ class TabBarController {
|
|
|
259
260
|
* When IDE is opened, restore chats that were previously open in IDE for the current workspace.
|
|
260
261
|
*/
|
|
261
262
|
async loadChats() {
|
|
262
|
-
|
|
263
|
+
const isJupyterLab = this.isJupyterLabEnvironment();
|
|
264
|
+
// For non-JupyterLab environments, prevent multiple loads
|
|
265
|
+
if (!isJupyterLab && this.#loadedChats) {
|
|
263
266
|
return;
|
|
264
267
|
}
|
|
265
|
-
|
|
268
|
+
if (!isJupyterLab) {
|
|
269
|
+
this.#loadedChats = true;
|
|
270
|
+
}
|
|
266
271
|
const openConversations = this.#chatHistoryDb.getOpenTabs();
|
|
267
272
|
if (openConversations) {
|
|
268
273
|
for (const conversation of openConversations) {
|
|
@@ -277,6 +282,18 @@ class TabBarController {
|
|
|
277
282
|
});
|
|
278
283
|
}
|
|
279
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Determines if the environment is JupyterLab.
|
|
287
|
+
*/
|
|
288
|
+
isJupyterLabEnvironment() {
|
|
289
|
+
try {
|
|
290
|
+
return process.env.SAGEMAKER_APP_TYPE_LOWERCASE === JUPYTERLAB_APP_TYPE_VALUE;
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
this.#features.logging.error(`Failed to read SAGEMAKER_APP_TYPE_LOWERCASE environment variable: ${error}`);
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
280
297
|
static enableChatExport(params) {
|
|
281
298
|
if (params?.initializationOptions?.aws?.awsClientCapabilities?.window?.showSaveFileDialog) {
|
|
282
299
|
// Export Chat UX flow relies on show Save File dialog protocol supported by client
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabBarController.js","sourceRoot":"","sources":["../../../src/language-server/agenticChat/tabBarController.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kDAAgF;AAChF,8CAA6E;AAW7E,2CAAuC;AAGvC,wDAAoE;AACpE,4CAAiD;AAEjD,MAAM,0BAA0B,GAAG,GAAG,CAAA;
|
|
1
|
+
{"version":3,"file":"tabBarController.js","sourceRoot":"","sources":["../../../src/language-server/agenticChat/tabBarController.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@ export declare class ToolResultValidationError extends Error {
|
|
|
6
6
|
constructor(message?: string);
|
|
7
7
|
}
|
|
8
8
|
export declare const EMPTY_CONVERSATION_LIST_ID = "empty";
|
|
9
|
-
export declare const MaxOverallCharacters = 570000;
|
|
10
9
|
/**
|
|
11
10
|
* A singleton database class that manages chat history persistence using LokiJS.
|
|
12
11
|
* This class handles storage and retrieval of chat conversations, messages, and tab states
|
|
@@ -107,36 +106,15 @@ export declare class ChatDatabase {
|
|
|
107
106
|
* This method manages chat messages by creating a new history with compacted summary and dummy response pairs
|
|
108
107
|
*/
|
|
109
108
|
replaceWithSummary(tabId: string, tabType: TabType, conversationId: string, message: Message): void;
|
|
110
|
-
/**
|
|
111
|
-
* Replace history with summary/dummyResponse pair within a specified tab.
|
|
112
|
-
*
|
|
113
|
-
* This method manages chat messages by creating a new history with compacted summary and dummy response pairs
|
|
114
|
-
*/
|
|
115
|
-
replaceHistory(tabId: string, tabType: TabType, conversationId: string, messages: Message[]): void;
|
|
116
109
|
formatChatHistoryMessage(message: Message): Message;
|
|
117
110
|
/**
|
|
118
111
|
* Prepare the history messages for service request and fix the persisted history in DB to maintain the following invariants:
|
|
119
|
-
* 1. The
|
|
120
|
-
* 2. The first message is from the user and without any tool usage results, and the last message is from the assistant.
|
|
112
|
+
* 1. The first message is from the user and without any tool usage results, and the last message is from the assistant.
|
|
121
113
|
* The history contains alternating sequene of userMessage followed by assistantMessages
|
|
122
|
-
*
|
|
123
|
-
* 4. The history character length is <= MaxConversationHistoryCharacters - newUserMessageCharacterCount. Oldest messages are dropped.
|
|
124
|
-
*/
|
|
125
|
-
fixAndGetHistory(tabId: string, conversationId: string, newUserMessage: ChatMessage, pinnedContextMessages: ChatMessage[]): MessagesWithCharacterCount;
|
|
126
|
-
/**
|
|
127
|
-
* Finds a suitable "break point" index in the message sequence.
|
|
128
|
-
*
|
|
129
|
-
* It ensures that the "break point" is at a clean conversation boundary where:
|
|
130
|
-
* 1. The message is from a user (type === 'prompt')
|
|
131
|
-
* 2. The message doesn't contain tool results that would break tool use/result pairs
|
|
132
|
-
* 3. The message has a non-empty body
|
|
133
|
-
*
|
|
134
|
-
* @param allMessages The array of conversation messages to search through
|
|
135
|
-
* @returns The index to trim from, or undefined if no suitable trimming point is found
|
|
114
|
+
* 2. The toolUse and toolResult relationship is valid
|
|
136
115
|
*/
|
|
137
|
-
|
|
116
|
+
fixAndGetHistory(tabId: string, newUserMessage: ChatMessage, pinnedContextMessages: ChatMessage[]): MessagesWithCharacterCount;
|
|
138
117
|
private isValidUserMessageWithoutToolResults;
|
|
139
|
-
private trimMessagesToMaxLength;
|
|
140
118
|
private calculateToolSpecCharacterCount;
|
|
141
119
|
calculateNewMessageCharacterCount(newUserMessage: ChatMessage, pinnedContextMessages: ChatMessage[]): number;
|
|
142
120
|
calculateMessagesCharacterCount(allMessages: Message[]): number;
|