@resolveio/server-lib 22.2.18 → 22.2.20
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/managers/error-auto-fix.manager.d.ts +6 -0
- package/managers/error-auto-fix.manager.js +215 -85
- package/managers/error-auto-fix.manager.js.map +1 -1
- package/managers/method.manager.js +2 -0
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.d.ts +3 -0
- package/managers/mongo.manager.js +184 -65
- package/managers/mongo.manager.js.map +1 -1
- package/managers/slow-query-verifier.manager.d.ts +30 -0
- package/managers/slow-query-verifier.manager.js +691 -192
- package/managers/slow-query-verifier.manager.js.map +1 -1
- package/managers/subscription.manager.d.ts +1 -0
- package/managers/subscription.manager.js +60 -21
- package/managers/subscription.manager.js.map +1 -1
- package/managers/worker-dispatcher.manager.js +60 -6
- package/managers/worker-dispatcher.manager.js.map +1 -1
- package/methods/ai-terminal.d.ts +4 -0
- package/methods/ai-terminal.js +64 -26
- package/methods/ai-terminal.js.map +1 -1
- package/methods/app-settings.js +2 -2
- package/methods/app-settings.js.map +1 -1
- package/methods/diagnostics.d.ts +2 -0
- package/methods/diagnostics.js +514 -0
- package/methods/diagnostics.js.map +1 -0
- package/methods.ts +15 -0
- package/package.json +1 -1
- package/resolveio-server-app.d.ts +17 -1
- package/resolveio-server-app.js +293 -25
- package/resolveio-server-app.js.map +1 -1
- package/server-app.js +22 -36
- package/server-app.js.map +1 -1
- package/util/error-reporter.js +26 -126
- package/util/error-reporter.js.map +1 -1
- package/util/slow-query-reporter.d.ts +0 -3
- package/util/slow-query-reporter.js +13 -120
- package/util/slow-query-reporter.js.map +1 -1
|
@@ -67,6 +67,9 @@ export declare class ErrorAutoFixManager {
|
|
|
67
67
|
private _serverConfig;
|
|
68
68
|
private readonly githubApiBase;
|
|
69
69
|
private readonly dashboardMonitors;
|
|
70
|
+
private static readonly APP_SETTINGS_CACHE_TTL_MS;
|
|
71
|
+
private appSettingsAutoOptimizeCacheExpiresAt;
|
|
72
|
+
private appSettingsAutoOptimizeCacheValue;
|
|
70
73
|
private ready;
|
|
71
74
|
constructor(serverConfig: any, dependencies?: Partial<ErrorAutoFixManagerDependencies>);
|
|
72
75
|
isReady(): boolean;
|
|
@@ -82,6 +85,7 @@ export declare class ErrorAutoFixManager {
|
|
|
82
85
|
private resolveEnvironmentForTask;
|
|
83
86
|
private buildEmailFromReport;
|
|
84
87
|
private classifyEmail;
|
|
88
|
+
private isMongoOriginError;
|
|
85
89
|
private generateRawEmailHash;
|
|
86
90
|
private generateIssueHash;
|
|
87
91
|
private normalizeTextForHash;
|
|
@@ -101,6 +105,8 @@ export declare class ErrorAutoFixManager {
|
|
|
101
105
|
private findOpenPullRequest;
|
|
102
106
|
private createPullRequest;
|
|
103
107
|
private commentOnPullRequest;
|
|
108
|
+
private parseBooleanEnv;
|
|
109
|
+
private resolveAutoOptimizeEnabled;
|
|
104
110
|
private reserveLog;
|
|
105
111
|
private markDuplicate;
|
|
106
112
|
private updateLog;
|
|
@@ -93,6 +93,7 @@ var axios_1 = require("axios");
|
|
|
93
93
|
var crypto_1 = require("crypto");
|
|
94
94
|
var url_1 = require("url");
|
|
95
95
|
var user_collection_1 = require("../collections/user.collection");
|
|
96
|
+
var app_setting_collection_1 = require("../collections/app-setting.collection");
|
|
96
97
|
var customer_notification_content_manager_1 = require("./customer-notification-content.manager");
|
|
97
98
|
var OPTIONAL_COLLECTION = {
|
|
98
99
|
findOne: function () { return Promise.resolve(null); },
|
|
@@ -144,6 +145,21 @@ var INFRA_SUBJECT_KEYWORDS = [
|
|
|
144
145
|
'high cpu usage',
|
|
145
146
|
'high ram usage'
|
|
146
147
|
];
|
|
148
|
+
var MONGO_SOURCE_KEYWORDS = [
|
|
149
|
+
'mongo-explorer',
|
|
150
|
+
'mongo explorer',
|
|
151
|
+
'mongo-manager',
|
|
152
|
+
'mongo manager',
|
|
153
|
+
'mongomanager',
|
|
154
|
+
'mongodb'
|
|
155
|
+
];
|
|
156
|
+
var MONGO_TEXT_PATTERNS = [
|
|
157
|
+
/\[mongo\]/i,
|
|
158
|
+
/\bmongo(?:db)?\s+(?:server\s+)?error\b/i,
|
|
159
|
+
/\bmongoservererror\b/i,
|
|
160
|
+
/\bmongonetwork(?:timeout)?error\b/i,
|
|
161
|
+
/\bmongonetworktimeouterror\b/i
|
|
162
|
+
];
|
|
147
163
|
var DEFAULT_ERROR_ALERT_EMAIL = 'dev@resolveio.com';
|
|
148
164
|
var MAX_LOCAL_NOTIFICATION_USERS = 5000;
|
|
149
165
|
var LIBRARY_MARKER_PATTERNS = [
|
|
@@ -161,6 +177,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
161
177
|
this._serverConfig = null;
|
|
162
178
|
this.githubApiBase = 'https://api.github.com';
|
|
163
179
|
this.dashboardMonitors = new Map();
|
|
180
|
+
this.appSettingsAutoOptimizeCacheExpiresAt = 0;
|
|
181
|
+
this.appSettingsAutoOptimizeCacheValue = null;
|
|
164
182
|
this.ready = false;
|
|
165
183
|
var resolvedDependencies = resolveErrorAutoFixManagerDependencies(dependencies);
|
|
166
184
|
applyErrorAutoFixDependencies(resolvedDependencies);
|
|
@@ -173,8 +191,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
173
191
|
return;
|
|
174
192
|
}
|
|
175
193
|
if (!this.config.dashboardWorkflowEnabled && (!this.config.repoRoot || !this.config.githubOwner || !this.config.githubRepo)) {
|
|
176
|
-
console.warn('ErrorAutoFixManager
|
|
177
|
-
return;
|
|
194
|
+
console.warn('ErrorAutoFixManager auto-optimize unavailable - missing repository configuration. Ingest and manual runs remain available.');
|
|
178
195
|
}
|
|
179
196
|
this.ready = true;
|
|
180
197
|
// console.log('ErrorAutoFixManager initialized (HTTP intake mode).');
|
|
@@ -182,7 +199,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
182
199
|
// if (this.config.debugLogging) {
|
|
183
200
|
// console.log('ErrorAutoFixManager debug logging enabled.');
|
|
184
201
|
// }
|
|
185
|
-
// if (!this.config.
|
|
202
|
+
// if (!this.config.autoOptimizeEnabled) {
|
|
186
203
|
// console.log('ErrorAutoFixManager auto-run disabled. Manual OpenAI runs required.');
|
|
187
204
|
// }
|
|
188
205
|
}
|
|
@@ -281,8 +298,10 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
281
298
|
var ingestSource = typeof process.env.AUTOFIX_INGEST_KEYS !== 'undefined'
|
|
282
299
|
? process.env.AUTOFIX_INGEST_KEYS
|
|
283
300
|
: scAutofix.ingestKeys;
|
|
301
|
+
var hasAutoOptimizeEnv = typeof process.env.AUTOFIX_AUTO_OPTIMIZE_ENABLED !== 'undefined';
|
|
302
|
+
var autoOptimizeEnabled = getBoolean('AUTOFIX_AUTO_OPTIMIZE_ENABLED', 'autoOptimizeEnabled', false);
|
|
284
303
|
return {
|
|
285
|
-
enabled:
|
|
304
|
+
enabled: true,
|
|
286
305
|
repoRoot: getString('AUTOFIX_REPO_ROOT', 'repoRoot', ''),
|
|
287
306
|
baseBranch: getString('AUTOFIX_BASE_BRANCH', 'baseBranch', 'main'),
|
|
288
307
|
branchPrefix: getString('AUTOFIX_BRANCH_PREFIX', 'branchPrefix', 'openai/auto'),
|
|
@@ -292,10 +311,10 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
292
311
|
commandTimeoutMs: getNumber('AUTOFIX_COMMAND_TIMEOUT_MS', 'commandTimeoutMs', 600000),
|
|
293
312
|
notifyEmails: notifyEmails,
|
|
294
313
|
debugLogging: getBoolean('AUTOFIX_DEBUG_LOGS', 'debugLogging', false),
|
|
295
|
-
configSource:
|
|
314
|
+
configSource: hasAutoOptimizeEnv ? 'environment' : (Object.keys(scAutofix).length ? 'serverConfig' : 'defaults'),
|
|
296
315
|
openaiEnvironment: openaiEnvironment,
|
|
297
316
|
openaiProjectId: openaiProjectId,
|
|
298
|
-
|
|
317
|
+
autoOptimizeEnabled: autoOptimizeEnabled,
|
|
299
318
|
ingestKeys: parseKeyList(ingestSource),
|
|
300
319
|
dashboardWorkflowEnabled: getBoolean('AUTOFIX_DASHBOARD_WORKFLOW_ENABLED', 'dashboardWorkflowEnabled', true),
|
|
301
320
|
dashboardFallbackToGithub: getBoolean('AUTOFIX_DASHBOARD_FALLBACK_TO_GITHUB', 'dashboardFallbackToGithub', true),
|
|
@@ -534,6 +553,14 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
534
553
|
(normalizedBody.includes('auto-fix workflow') || normalizedBody.includes('autofix workflow'))) {
|
|
535
554
|
return { source: 'noise', skip: true, reason: 'AutoFix status notification' };
|
|
536
555
|
}
|
|
556
|
+
if (this.isMongoOriginError(email)) {
|
|
557
|
+
return {
|
|
558
|
+
source: 'infrastructure',
|
|
559
|
+
skip: true,
|
|
560
|
+
reason: 'Mongo-origin error ignored for auto-fix',
|
|
561
|
+
markIgnored: true
|
|
562
|
+
};
|
|
563
|
+
}
|
|
537
564
|
if (subject.includes('[database]') || subject.includes('[server]')) {
|
|
538
565
|
return { source: 'infrastructure', skip: true, reason: 'Infrastructure alert (subject tag)' };
|
|
539
566
|
}
|
|
@@ -553,6 +580,20 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
553
580
|
}
|
|
554
581
|
return { source: 'app', skip: false };
|
|
555
582
|
};
|
|
583
|
+
ErrorAutoFixManager.prototype.isMongoOriginError = function (email) {
|
|
584
|
+
var sourceApp = String((email === null || email === void 0 ? void 0 : email.sourceApp) || '').toLowerCase();
|
|
585
|
+
var sourceEnvironment = String((email === null || email === void 0 ? void 0 : email.sourceEnvironment) || '').toLowerCase();
|
|
586
|
+
var subject = String((email === null || email === void 0 ? void 0 : email.subject) || '').toLowerCase();
|
|
587
|
+
var body = String((email === null || email === void 0 ? void 0 : email.body) || '');
|
|
588
|
+
var sourceMatches = MONGO_SOURCE_KEYWORDS.some(function (keyword) {
|
|
589
|
+
return sourceApp.includes(keyword) || sourceEnvironment.includes(keyword);
|
|
590
|
+
});
|
|
591
|
+
if (sourceMatches) {
|
|
592
|
+
return true;
|
|
593
|
+
}
|
|
594
|
+
var text = "".concat(subject, "\n").concat(body);
|
|
595
|
+
return MONGO_TEXT_PATTERNS.some(function (pattern) { return pattern.test(text); });
|
|
596
|
+
};
|
|
556
597
|
ErrorAutoFixManager.prototype.generateRawEmailHash = function (email) {
|
|
557
598
|
return (0, crypto_1.createHash)('sha256').update("".concat(email.subject || '', "\n").concat(email.body || ''), 'utf8').digest('hex');
|
|
558
599
|
};
|
|
@@ -889,9 +930,76 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
889
930
|
});
|
|
890
931
|
});
|
|
891
932
|
};
|
|
892
|
-
ErrorAutoFixManager.prototype.
|
|
933
|
+
ErrorAutoFixManager.prototype.parseBooleanEnv = function (envKey) {
|
|
934
|
+
if (typeof process.env[envKey] === 'undefined') {
|
|
935
|
+
return null;
|
|
936
|
+
}
|
|
937
|
+
return process.env[envKey] === 'true';
|
|
938
|
+
};
|
|
939
|
+
ErrorAutoFixManager.prototype.resolveAutoOptimizeEnabled = function () {
|
|
893
940
|
return __awaiter(this, void 0, void 0, function () {
|
|
941
|
+
var now, envValue, enabled, activeSetting, _a, error_1;
|
|
942
|
+
var _b;
|
|
943
|
+
return __generator(this, function (_c) {
|
|
944
|
+
switch (_c.label) {
|
|
945
|
+
case 0:
|
|
946
|
+
now = Date.now();
|
|
947
|
+
if (this.appSettingsAutoOptimizeCacheValue !== null && now < this.appSettingsAutoOptimizeCacheExpiresAt) {
|
|
948
|
+
return [2 /*return*/, this.appSettingsAutoOptimizeCacheValue];
|
|
949
|
+
}
|
|
950
|
+
envValue = this.parseBooleanEnv('AUTOFIX_AUTO_OPTIMIZE_ENABLED');
|
|
951
|
+
enabled = envValue !== null ? envValue : !!this.config.autoOptimizeEnabled;
|
|
952
|
+
_c.label = 1;
|
|
953
|
+
case 1:
|
|
954
|
+
_c.trys.push([1, 6, , 7]);
|
|
955
|
+
if (!(app_setting_collection_1.AppSettings && typeof app_setting_collection_1.AppSettings.findOne === 'function')) return [3 /*break*/, 5];
|
|
956
|
+
return [4 /*yield*/, app_setting_collection_1.AppSettings.findOne({
|
|
957
|
+
is_active: {
|
|
958
|
+
$ne: false
|
|
959
|
+
}
|
|
960
|
+
}, {
|
|
961
|
+
sort: {
|
|
962
|
+
updatedAt: -1,
|
|
963
|
+
createdAt: -1
|
|
964
|
+
}
|
|
965
|
+
})];
|
|
966
|
+
case 2:
|
|
967
|
+
_a = (_c.sent());
|
|
968
|
+
if (_a) return [3 /*break*/, 4];
|
|
969
|
+
return [4 /*yield*/, app_setting_collection_1.AppSettings.findOne({}, {
|
|
970
|
+
sort: {
|
|
971
|
+
updatedAt: -1,
|
|
972
|
+
createdAt: -1
|
|
973
|
+
}
|
|
974
|
+
})];
|
|
975
|
+
case 3:
|
|
976
|
+
_a = (_c.sent());
|
|
977
|
+
_c.label = 4;
|
|
978
|
+
case 4:
|
|
979
|
+
activeSetting = _a;
|
|
980
|
+
if (activeSetting && typeof activeSetting.enable_auto_fix === 'boolean') {
|
|
981
|
+
enabled = !!activeSetting.enable_auto_fix;
|
|
982
|
+
}
|
|
983
|
+
_c.label = 5;
|
|
984
|
+
case 5: return [3 /*break*/, 7];
|
|
985
|
+
case 6:
|
|
986
|
+
error_1 = _c.sent();
|
|
987
|
+
if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.debugLogging) {
|
|
988
|
+
console.warn('ErrorAutoFixManager failed to read app settings auto-fix toggle', error_1);
|
|
989
|
+
}
|
|
990
|
+
return [3 /*break*/, 7];
|
|
991
|
+
case 7:
|
|
992
|
+
this.appSettingsAutoOptimizeCacheValue = enabled;
|
|
993
|
+
this.appSettingsAutoOptimizeCacheExpiresAt = now + ErrorAutoFixManager.APP_SETTINGS_CACHE_TTL_MS;
|
|
994
|
+
return [2 /*return*/, enabled];
|
|
995
|
+
}
|
|
996
|
+
});
|
|
997
|
+
});
|
|
998
|
+
};
|
|
999
|
+
ErrorAutoFixManager.prototype.reserveLog = function (email_1, client_1) {
|
|
1000
|
+
return __awaiter(this, arguments, void 0, function (email, client, autoOptimizeEnabled) {
|
|
894
1001
|
var hash, rawHash, now, existing, updatedExisting, metaUpdate, reactivated, attemptsUsed, maxAttempts, reason, exhausted, resumed, counterValue, counterString, doc;
|
|
1002
|
+
if (autoOptimizeEnabled === void 0) { autoOptimizeEnabled = false; }
|
|
895
1003
|
return __generator(this, function (_a) {
|
|
896
1004
|
switch (_a.label) {
|
|
897
1005
|
case 0:
|
|
@@ -1000,7 +1108,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1000
1108
|
reason: 'ignored'
|
|
1001
1109
|
}];
|
|
1002
1110
|
}
|
|
1003
|
-
if (!(
|
|
1111
|
+
if (!(autoOptimizeEnabled && (updatedExisting.status === 'failed' || updatedExisting.status === 'skipped') && !updatedExisting.ignored)) return [3 /*break*/, 17];
|
|
1004
1112
|
attemptsUsed = Number.isFinite(Number(updatedExisting.attempt_count))
|
|
1005
1113
|
? Number(updatedExisting.attempt_count)
|
|
1006
1114
|
: 0;
|
|
@@ -1082,14 +1190,14 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1082
1190
|
subject: email.subject,
|
|
1083
1191
|
message_id: email.messageId,
|
|
1084
1192
|
body: email.body,
|
|
1085
|
-
status:
|
|
1193
|
+
status: autoOptimizeEnabled ? 'in_progress' : 'pending',
|
|
1086
1194
|
ignored: false,
|
|
1087
|
-
attempt_count:
|
|
1195
|
+
attempt_count: autoOptimizeEnabled ? 1 : 0,
|
|
1088
1196
|
duplicate_count: 0,
|
|
1089
1197
|
autofix_error_count: counterValue,
|
|
1090
1198
|
autofix_error_count_string: counterString,
|
|
1091
1199
|
first_seen_at: now,
|
|
1092
|
-
last_attempt_at:
|
|
1200
|
+
last_attempt_at: autoOptimizeEnabled ? now : undefined,
|
|
1093
1201
|
from_email: email.fromAddress || '',
|
|
1094
1202
|
id_client: client === null || client === void 0 ? void 0 : client._id,
|
|
1095
1203
|
client_name: client === null || client === void 0 ? void 0 : client.name,
|
|
@@ -1183,7 +1291,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1183
1291
|
};
|
|
1184
1292
|
ErrorAutoFixManager.prototype.sendEscalationNotice = function (log, reason) {
|
|
1185
1293
|
return __awaiter(this, void 0, void 0, function () {
|
|
1186
|
-
var recipients, identifier, subject, body, methodManager, recipients_1, recipients_1_1, recipient,
|
|
1294
|
+
var recipients, identifier, subject, body, methodManager, recipients_1, recipients_1_1, recipient, error_2, e_1_1;
|
|
1187
1295
|
var e_1, _a;
|
|
1188
1296
|
return __generator(this, function (_b) {
|
|
1189
1297
|
switch (_b.label) {
|
|
@@ -1225,8 +1333,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1225
1333
|
_b.sent();
|
|
1226
1334
|
return [3 /*break*/, 6];
|
|
1227
1335
|
case 5:
|
|
1228
|
-
|
|
1229
|
-
console.error('Failed sending auto-fix escalation email', { recipient: recipient, logId: log._id, error:
|
|
1336
|
+
error_2 = _b.sent();
|
|
1337
|
+
console.error('Failed sending auto-fix escalation email', { recipient: recipient, logId: log._id, error: error_2 });
|
|
1230
1338
|
return [3 /*break*/, 6];
|
|
1231
1339
|
case 6:
|
|
1232
1340
|
recipients_1_1 = recipients_1.next();
|
|
@@ -1325,7 +1433,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1325
1433
|
};
|
|
1326
1434
|
ErrorAutoFixManager.prototype.sendLibraryIssueNotice = function (log, reason, evidence) {
|
|
1327
1435
|
return __awaiter(this, void 0, void 0, function () {
|
|
1328
|
-
var recipients, identifier, subject, body, methodManager, recipients_2, recipients_2_1, recipient,
|
|
1436
|
+
var recipients, identifier, subject, body, methodManager, recipients_2, recipients_2_1, recipient, error_3, e_3_1;
|
|
1329
1437
|
var e_3, _a;
|
|
1330
1438
|
return __generator(this, function (_b) {
|
|
1331
1439
|
switch (_b.label) {
|
|
@@ -1367,8 +1475,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1367
1475
|
_b.sent();
|
|
1368
1476
|
return [3 /*break*/, 6];
|
|
1369
1477
|
case 5:
|
|
1370
|
-
|
|
1371
|
-
console.error('Failed sending library-issue auto-fix email', { recipient: recipient, logId: log._id, error:
|
|
1478
|
+
error_3 = _b.sent();
|
|
1479
|
+
console.error('Failed sending library-issue auto-fix email', { recipient: recipient, logId: log._id, error: error_3 });
|
|
1372
1480
|
return [3 /*break*/, 6];
|
|
1373
1481
|
case 6:
|
|
1374
1482
|
recipients_2_1 = recipients_2.next();
|
|
@@ -1589,7 +1697,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1589
1697
|
};
|
|
1590
1698
|
ErrorAutoFixManager.prototype.notifyCustomerWorkflowStatus = function (stage, email, log, extra) {
|
|
1591
1699
|
return __awaiter(this, void 0, void 0, function () {
|
|
1592
|
-
var idClient, isGeneratedApp, resolvedEnvironment, app, issueKey, clientName, targetPayload, idUsers, basePayload, payload,
|
|
1700
|
+
var idClient, isGeneratedApp, resolvedEnvironment, app, issueKey, clientName, targetPayload, idUsers, basePayload, payload, error_4;
|
|
1593
1701
|
return __generator(this, function (_a) {
|
|
1594
1702
|
switch (_a.label) {
|
|
1595
1703
|
case 0:
|
|
@@ -1698,11 +1806,11 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1698
1806
|
_a.sent();
|
|
1699
1807
|
return [3 /*break*/, 11];
|
|
1700
1808
|
case 10:
|
|
1701
|
-
|
|
1809
|
+
error_4 = _a.sent();
|
|
1702
1810
|
this.debugLog('Failed to create customer auto-fix notification', {
|
|
1703
1811
|
logId: log === null || log === void 0 ? void 0 : log._id,
|
|
1704
1812
|
stage: stage,
|
|
1705
|
-
error: (
|
|
1813
|
+
error: (error_4 === null || error_4 === void 0 ? void 0 : error_4.message) || error_4
|
|
1706
1814
|
});
|
|
1707
1815
|
return [3 /*break*/, 11];
|
|
1708
1816
|
case 11: return [2 /*return*/];
|
|
@@ -1773,7 +1881,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1773
1881
|
};
|
|
1774
1882
|
ErrorAutoFixManager.prototype.ingestErrorReport = function (report) {
|
|
1775
1883
|
return __awaiter(this, void 0, void 0, function () {
|
|
1776
|
-
var normalizedReport, email, rawHash, fingerprint, client, reservation, classification, updated, queued, result, finalLog, _a;
|
|
1884
|
+
var normalizedReport, email, rawHash, fingerprint, client, autoOptimizeEnabled, reservation, classification, updated, queued, result, finalLog, _a;
|
|
1777
1885
|
return __generator(this, function (_b) {
|
|
1778
1886
|
switch (_b.label) {
|
|
1779
1887
|
case 0:
|
|
@@ -1805,11 +1913,14 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1805
1913
|
return [4 /*yield*/, this.resolveClientForReport(normalizedReport)];
|
|
1806
1914
|
case 1:
|
|
1807
1915
|
client = _b.sent();
|
|
1808
|
-
return [4 /*yield*/, this.
|
|
1916
|
+
return [4 /*yield*/, this.resolveAutoOptimizeEnabled()];
|
|
1809
1917
|
case 2:
|
|
1918
|
+
autoOptimizeEnabled = _b.sent();
|
|
1919
|
+
return [4 /*yield*/, this.reserveLog(email, client, autoOptimizeEnabled)];
|
|
1920
|
+
case 3:
|
|
1810
1921
|
reservation = _b.sent();
|
|
1811
|
-
if (!!reservation.proceed) return [3 /*break*/,
|
|
1812
|
-
if (!(reservation.reason && this.shouldNotifySkip(reservation.reason))) return [3 /*break*/,
|
|
1922
|
+
if (!!reservation.proceed) return [3 /*break*/, 6];
|
|
1923
|
+
if (!(reservation.reason && this.shouldNotifySkip(reservation.reason))) return [3 /*break*/, 5];
|
|
1813
1924
|
return [4 /*yield*/, this.notify({
|
|
1814
1925
|
status: 'skipped',
|
|
1815
1926
|
email: email,
|
|
@@ -1817,15 +1928,15 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1817
1928
|
error: "Skipped auto-fix (".concat(reservation.reason, ")."),
|
|
1818
1929
|
log: reservation.log
|
|
1819
1930
|
})];
|
|
1820
|
-
case
|
|
1931
|
+
case 4:
|
|
1821
1932
|
_b.sent();
|
|
1822
|
-
_b.label =
|
|
1823
|
-
case
|
|
1933
|
+
_b.label = 5;
|
|
1934
|
+
case 5: return [2 /*return*/, {
|
|
1824
1935
|
status: reservation.reason === 'duplicate' ? 'duplicate' : reservation.reason || 'skipped',
|
|
1825
1936
|
reason: reservation.reason,
|
|
1826
1937
|
log: reservation.log
|
|
1827
1938
|
}];
|
|
1828
|
-
case
|
|
1939
|
+
case 6:
|
|
1829
1940
|
email.logId = reservation.log._id;
|
|
1830
1941
|
classification = this.classifyEmail(email);
|
|
1831
1942
|
return [4 /*yield*/, this.updateLog(email.logId, {
|
|
@@ -1844,17 +1955,18 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1844
1955
|
attachments: email.attachments,
|
|
1845
1956
|
last_reported_at: email.reportedAt || new Date()
|
|
1846
1957
|
})];
|
|
1847
|
-
case
|
|
1958
|
+
case 7:
|
|
1848
1959
|
_b.sent();
|
|
1849
|
-
if (!classification.skip) return [3 /*break*/,
|
|
1960
|
+
if (!classification.skip) return [3 /*break*/, 11];
|
|
1850
1961
|
return [4 /*yield*/, this.updateLog(email.logId, {
|
|
1851
1962
|
status: 'skipped',
|
|
1963
|
+
ignored: !!classification.markIgnored,
|
|
1852
1964
|
last_error: classification.reason || 'Ignored non-app alert',
|
|
1853
1965
|
last_result_at: new Date()
|
|
1854
1966
|
})];
|
|
1855
|
-
case
|
|
1967
|
+
case 8:
|
|
1856
1968
|
updated = _b.sent();
|
|
1857
|
-
if (!classification.notify) return [3 /*break*/,
|
|
1969
|
+
if (!classification.notify) return [3 /*break*/, 10];
|
|
1858
1970
|
return [4 /*yield*/, this.notify({
|
|
1859
1971
|
status: 'skipped',
|
|
1860
1972
|
email: email,
|
|
@@ -1862,44 +1974,44 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1862
1974
|
log: updated,
|
|
1863
1975
|
reason: 'classified'
|
|
1864
1976
|
})];
|
|
1865
|
-
case
|
|
1977
|
+
case 9:
|
|
1866
1978
|
_b.sent();
|
|
1867
|
-
_b.label =
|
|
1868
|
-
case
|
|
1979
|
+
_b.label = 10;
|
|
1980
|
+
case 10: return [2 /*return*/, {
|
|
1869
1981
|
status: 'skipped',
|
|
1870
1982
|
reason: classification.reason,
|
|
1871
1983
|
log: updated
|
|
1872
1984
|
}];
|
|
1873
|
-
case
|
|
1874
|
-
if (!!
|
|
1985
|
+
case 11:
|
|
1986
|
+
if (!!autoOptimizeEnabled) return [3 /*break*/, 14];
|
|
1875
1987
|
return [4 /*yield*/, this.updateLog(email.logId, {
|
|
1876
1988
|
status: 'pending'
|
|
1877
1989
|
})];
|
|
1878
|
-
case
|
|
1990
|
+
case 12:
|
|
1879
1991
|
queued = _b.sent();
|
|
1880
1992
|
return [4 /*yield*/, this.notifyCustomerWorkflowStatus('detected_autofix_disabled', email, queued || reservation.log)];
|
|
1881
|
-
case
|
|
1993
|
+
case 13:
|
|
1882
1994
|
_b.sent();
|
|
1883
1995
|
return [2 /*return*/, {
|
|
1884
1996
|
status: 'queued',
|
|
1885
1997
|
log: queued
|
|
1886
1998
|
}];
|
|
1887
|
-
case
|
|
1888
|
-
case
|
|
1999
|
+
case 14: return [4 /*yield*/, this.notifyCustomerWorkflowStatus('detected_autofix_enabled', email, reservation.log)];
|
|
2000
|
+
case 15:
|
|
1889
2001
|
_b.sent();
|
|
1890
2002
|
return [4 /*yield*/, this.processEmail(email, reservation.log)];
|
|
1891
|
-
case
|
|
2003
|
+
case 16:
|
|
1892
2004
|
result = _b.sent();
|
|
1893
2005
|
return [4 /*yield*/, this.notify(result)];
|
|
1894
|
-
case
|
|
2006
|
+
case 17:
|
|
1895
2007
|
_b.sent();
|
|
1896
2008
|
_a = result.log;
|
|
1897
|
-
if (_a) return [3 /*break*/,
|
|
2009
|
+
if (_a) return [3 /*break*/, 19];
|
|
1898
2010
|
return [4 /*yield*/, ErrorAutoFixLogs.findOne({ _id: email.logId })];
|
|
1899
|
-
case 17:
|
|
1900
|
-
_a = (_b.sent());
|
|
1901
|
-
_b.label = 18;
|
|
1902
2011
|
case 18:
|
|
2012
|
+
_a = (_b.sent());
|
|
2013
|
+
_b.label = 19;
|
|
2014
|
+
case 19:
|
|
1903
2015
|
finalLog = _a;
|
|
1904
2016
|
return [2 /*return*/, {
|
|
1905
2017
|
status: result.status,
|
|
@@ -1912,7 +2024,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1912
2024
|
};
|
|
1913
2025
|
ErrorAutoFixManager.prototype.runLog = function (logId) {
|
|
1914
2026
|
return __awaiter(this, void 0, void 0, function () {
|
|
1915
|
-
var log, now, email, inProgressLog, result;
|
|
2027
|
+
var log, now, email, classification, ignoredLog, inProgressLog, result;
|
|
1916
2028
|
return __generator(this, function (_a) {
|
|
1917
2029
|
switch (_a.label) {
|
|
1918
2030
|
case 0:
|
|
@@ -1936,26 +2048,43 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
1936
2048
|
}
|
|
1937
2049
|
now = new Date();
|
|
1938
2050
|
email = this.buildEmailFromLog(log);
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
last_error: '',
|
|
1947
|
-
ignored: false
|
|
1948
|
-
}
|
|
1949
|
-
}, {
|
|
1950
|
-
returnDocument: 'after'
|
|
2051
|
+
classification = this.classifyEmail(email);
|
|
2052
|
+
if (!(classification.skip && classification.markIgnored)) return [3 /*break*/, 3];
|
|
2053
|
+
return [4 /*yield*/, this.updateLog(logId, {
|
|
2054
|
+
status: 'skipped',
|
|
2055
|
+
ignored: true,
|
|
2056
|
+
last_error: classification.reason || 'Mongo-origin error ignored for auto-fix',
|
|
2057
|
+
last_result_at: now
|
|
1951
2058
|
})];
|
|
1952
2059
|
case 2:
|
|
2060
|
+
ignoredLog = _a.sent();
|
|
2061
|
+
return [2 /*return*/, {
|
|
2062
|
+
status: 'skipped',
|
|
2063
|
+
email: email,
|
|
2064
|
+
reason: 'classified',
|
|
2065
|
+
error: classification.reason || 'Mongo-origin error ignored for auto-fix',
|
|
2066
|
+
log: ignoredLog
|
|
2067
|
+
}];
|
|
2068
|
+
case 3: return [4 /*yield*/, ErrorAutoFixLogs.findOneAndUpdate({ _id: logId }, {
|
|
2069
|
+
$inc: {
|
|
2070
|
+
attempt_count: 1
|
|
2071
|
+
},
|
|
2072
|
+
$set: {
|
|
2073
|
+
status: 'in_progress',
|
|
2074
|
+
last_attempt_at: now,
|
|
2075
|
+
last_error: '',
|
|
2076
|
+
ignored: false
|
|
2077
|
+
}
|
|
2078
|
+
}, {
|
|
2079
|
+
returnDocument: 'after'
|
|
2080
|
+
})];
|
|
2081
|
+
case 4:
|
|
1953
2082
|
inProgressLog = (_a.sent()) || log;
|
|
1954
2083
|
return [4 /*yield*/, this.processEmail(email, inProgressLog)];
|
|
1955
|
-
case
|
|
2084
|
+
case 5:
|
|
1956
2085
|
result = _a.sent();
|
|
1957
2086
|
return [4 /*yield*/, this.notify(result)];
|
|
1958
|
-
case
|
|
2087
|
+
case 6:
|
|
1959
2088
|
_a.sent();
|
|
1960
2089
|
return [2 /*return*/, result];
|
|
1961
2090
|
}
|
|
@@ -2030,7 +2159,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2030
2159
|
};
|
|
2031
2160
|
ErrorAutoFixManager.prototype.createDashboardJob = function (payload) {
|
|
2032
2161
|
return __awaiter(this, void 0, void 0, function () {
|
|
2033
|
-
var methodManager,
|
|
2162
|
+
var methodManager, error_5, manager;
|
|
2034
2163
|
return __generator(this, function (_a) {
|
|
2035
2164
|
switch (_a.label) {
|
|
2036
2165
|
case 0:
|
|
@@ -2041,9 +2170,9 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2041
2170
|
return [4 /*yield*/, methodManager.callMethod('aiDashboardCreateJob', payload)];
|
|
2042
2171
|
case 2: return [2 /*return*/, _a.sent()];
|
|
2043
2172
|
case 3:
|
|
2044
|
-
|
|
2045
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
2046
|
-
throw
|
|
2173
|
+
error_5 = _a.sent();
|
|
2174
|
+
if (!this.shouldFallbackDashboardMethod(error_5)) {
|
|
2175
|
+
throw error_5;
|
|
2047
2176
|
}
|
|
2048
2177
|
return [3 /*break*/, 4];
|
|
2049
2178
|
case 4:
|
|
@@ -2058,7 +2187,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2058
2187
|
};
|
|
2059
2188
|
ErrorAutoFixManager.prototype.waitForDashboardJobStop = function (jobId, timeoutMs) {
|
|
2060
2189
|
return __awaiter(this, void 0, void 0, function () {
|
|
2061
|
-
var methodManager,
|
|
2190
|
+
var methodManager, error_6, manager;
|
|
2062
2191
|
return __generator(this, function (_a) {
|
|
2063
2192
|
switch (_a.label) {
|
|
2064
2193
|
case 0:
|
|
@@ -2071,9 +2200,9 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2071
2200
|
_a.sent();
|
|
2072
2201
|
return [2 /*return*/];
|
|
2073
2202
|
case 3:
|
|
2074
|
-
|
|
2075
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
2076
|
-
throw
|
|
2203
|
+
error_6 = _a.sent();
|
|
2204
|
+
if (!this.shouldFallbackDashboardMethod(error_6)) {
|
|
2205
|
+
throw error_6;
|
|
2077
2206
|
}
|
|
2078
2207
|
return [3 /*break*/, 4];
|
|
2079
2208
|
case 4:
|
|
@@ -2090,7 +2219,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2090
2219
|
};
|
|
2091
2220
|
ErrorAutoFixManager.prototype.isDashboardJobRunning = function (jobId) {
|
|
2092
2221
|
return __awaiter(this, void 0, void 0, function () {
|
|
2093
|
-
var methodManager, running,
|
|
2222
|
+
var methodManager, running, error_7, manager;
|
|
2094
2223
|
return __generator(this, function (_a) {
|
|
2095
2224
|
switch (_a.label) {
|
|
2096
2225
|
case 0:
|
|
@@ -2103,9 +2232,9 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2103
2232
|
running = _a.sent();
|
|
2104
2233
|
return [2 /*return*/, !!running];
|
|
2105
2234
|
case 3:
|
|
2106
|
-
|
|
2107
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
2108
|
-
throw
|
|
2235
|
+
error_7 = _a.sent();
|
|
2236
|
+
if (!this.shouldFallbackDashboardMethod(error_7)) {
|
|
2237
|
+
throw error_7;
|
|
2109
2238
|
}
|
|
2110
2239
|
return [3 /*break*/, 4];
|
|
2111
2240
|
case 4:
|
|
@@ -2366,7 +2495,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2366
2495
|
return;
|
|
2367
2496
|
}
|
|
2368
2497
|
var monitor = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
2369
|
-
var
|
|
2498
|
+
var error_8;
|
|
2370
2499
|
return __generator(this, function (_a) {
|
|
2371
2500
|
switch (_a.label) {
|
|
2372
2501
|
case 0:
|
|
@@ -2376,8 +2505,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2376
2505
|
_a.sent();
|
|
2377
2506
|
return [3 /*break*/, 4];
|
|
2378
2507
|
case 2:
|
|
2379
|
-
|
|
2380
|
-
console.error('Auto-fix dashboard monitor failed', { logId: logId, jobId: normalizedJobId, error:
|
|
2508
|
+
error_8 = _a.sent();
|
|
2509
|
+
console.error('Auto-fix dashboard monitor failed', { logId: logId, jobId: normalizedJobId, error: error_8 });
|
|
2381
2510
|
return [3 /*break*/, 4];
|
|
2382
2511
|
case 3:
|
|
2383
2512
|
this.dashboardMonitors.delete(logId);
|
|
@@ -2390,7 +2519,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2390
2519
|
};
|
|
2391
2520
|
ErrorAutoFixManager.prototype.monitorDashboardAutoFixJob = function (log, email, jobId, effectiveEnvironment) {
|
|
2392
2521
|
return __awaiter(this, void 0, void 0, function () {
|
|
2393
|
-
var logId, fail,
|
|
2522
|
+
var logId, fail, error_9, message, isRunning, error_10, message, job, publishOutcome, fallbackBranch, branchName, successLog;
|
|
2394
2523
|
var _this = this;
|
|
2395
2524
|
var _a;
|
|
2396
2525
|
return __generator(this, function (_b) {
|
|
@@ -2437,8 +2566,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2437
2566
|
_b.sent();
|
|
2438
2567
|
return [3 /*break*/, 5];
|
|
2439
2568
|
case 3:
|
|
2440
|
-
|
|
2441
|
-
message = (
|
|
2569
|
+
error_9 = _b.sent();
|
|
2570
|
+
message = (error_9 === null || error_9 === void 0 ? void 0 : error_9.message) || 'Failed while waiting for dashboard job completion.';
|
|
2442
2571
|
return [4 /*yield*/, fail(message)];
|
|
2443
2572
|
case 4:
|
|
2444
2573
|
_b.sent();
|
|
@@ -2453,8 +2582,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2453
2582
|
isRunning = _b.sent();
|
|
2454
2583
|
return [3 /*break*/, 10];
|
|
2455
2584
|
case 8:
|
|
2456
|
-
|
|
2457
|
-
message = (
|
|
2585
|
+
error_10 = _b.sent();
|
|
2586
|
+
message = (error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'Unable to confirm dashboard job completion state.';
|
|
2458
2587
|
return [4 /*yield*/, fail(message)];
|
|
2459
2588
|
case 9:
|
|
2460
2589
|
_b.sent();
|
|
@@ -2520,7 +2649,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2520
2649
|
};
|
|
2521
2650
|
ErrorAutoFixManager.prototype.dispatchDashboardWorkflow = function (email, log) {
|
|
2522
2651
|
return __awaiter(this, void 0, void 0, function () {
|
|
2523
|
-
var fail, openaiEnvironment, app, repo, effectiveEnvironment, emailHash, rawHash, title, description, job,
|
|
2652
|
+
var fail, openaiEnvironment, app, repo, effectiveEnvironment, emailHash, rawHash, title, description, job, error_11, message, jobId, queuedLog;
|
|
2524
2653
|
var _this = this;
|
|
2525
2654
|
return __generator(this, function (_a) {
|
|
2526
2655
|
switch (_a.label) {
|
|
@@ -2579,8 +2708,8 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2579
2708
|
job = _a.sent();
|
|
2580
2709
|
return [3 /*break*/, 10];
|
|
2581
2710
|
case 8:
|
|
2582
|
-
|
|
2583
|
-
message = (
|
|
2711
|
+
error_11 = _a.sent();
|
|
2712
|
+
message = (error_11 === null || error_11 === void 0 ? void 0 : error_11.message) || 'Unable to enqueue dashboard auto-fix job.';
|
|
2584
2713
|
return [4 /*yield*/, fail('failed', 'dashboard_job_create_failed', message)];
|
|
2585
2714
|
case 9: return [2 /*return*/, _a.sent()];
|
|
2586
2715
|
case 10:
|
|
@@ -2892,6 +3021,7 @@ var ErrorAutoFixManager = /** @class */ (function () {
|
|
|
2892
3021
|
});
|
|
2893
3022
|
});
|
|
2894
3023
|
};
|
|
3024
|
+
ErrorAutoFixManager.APP_SETTINGS_CACHE_TTL_MS = 10000;
|
|
2895
3025
|
return ErrorAutoFixManager;
|
|
2896
3026
|
}());
|
|
2897
3027
|
exports.ErrorAutoFixManager = ErrorAutoFixManager;
|