@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.
Files changed (36) hide show
  1. package/managers/error-auto-fix.manager.d.ts +6 -0
  2. package/managers/error-auto-fix.manager.js +215 -85
  3. package/managers/error-auto-fix.manager.js.map +1 -1
  4. package/managers/method.manager.js +2 -0
  5. package/managers/method.manager.js.map +1 -1
  6. package/managers/mongo.manager.d.ts +3 -0
  7. package/managers/mongo.manager.js +184 -65
  8. package/managers/mongo.manager.js.map +1 -1
  9. package/managers/slow-query-verifier.manager.d.ts +30 -0
  10. package/managers/slow-query-verifier.manager.js +691 -192
  11. package/managers/slow-query-verifier.manager.js.map +1 -1
  12. package/managers/subscription.manager.d.ts +1 -0
  13. package/managers/subscription.manager.js +60 -21
  14. package/managers/subscription.manager.js.map +1 -1
  15. package/managers/worker-dispatcher.manager.js +60 -6
  16. package/managers/worker-dispatcher.manager.js.map +1 -1
  17. package/methods/ai-terminal.d.ts +4 -0
  18. package/methods/ai-terminal.js +64 -26
  19. package/methods/ai-terminal.js.map +1 -1
  20. package/methods/app-settings.js +2 -2
  21. package/methods/app-settings.js.map +1 -1
  22. package/methods/diagnostics.d.ts +2 -0
  23. package/methods/diagnostics.js +514 -0
  24. package/methods/diagnostics.js.map +1 -0
  25. package/methods.ts +15 -0
  26. package/package.json +1 -1
  27. package/resolveio-server-app.d.ts +17 -1
  28. package/resolveio-server-app.js +293 -25
  29. package/resolveio-server-app.js.map +1 -1
  30. package/server-app.js +22 -36
  31. package/server-app.js.map +1 -1
  32. package/util/error-reporter.js +26 -126
  33. package/util/error-reporter.js.map +1 -1
  34. package/util/slow-query-reporter.d.ts +0 -3
  35. package/util/slow-query-reporter.js +13 -120
  36. 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 disabled - missing critical configuration.');
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.autoRunEnabled) {
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: getBoolean('AUTOFIX_ENABLED', 'enabled', false),
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: process.env.AUTOFIX_ENABLED ? 'environment' : (Object.keys(scAutofix).length ? 'serverConfig' : 'defaults'),
314
+ configSource: hasAutoOptimizeEnv ? 'environment' : (Object.keys(scAutofix).length ? 'serverConfig' : 'defaults'),
296
315
  openaiEnvironment: openaiEnvironment,
297
316
  openaiProjectId: openaiProjectId,
298
- autoRunEnabled: getBoolean('AUTOFIX_AUTORUN_ENABLED', 'autoRunEnabled', false),
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.reserveLog = function (email, client) {
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 (!(this.config.autoRunEnabled && (updatedExisting.status === 'failed' || updatedExisting.status === 'skipped') && !updatedExisting.ignored)) return [3 /*break*/, 17];
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: this.config.autoRunEnabled ? 'in_progress' : 'pending',
1193
+ status: autoOptimizeEnabled ? 'in_progress' : 'pending',
1086
1194
  ignored: false,
1087
- attempt_count: this.config.autoRunEnabled ? 1 : 0,
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: this.config.autoRunEnabled ? now : undefined,
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, error_1, e_1_1;
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
- error_1 = _b.sent();
1229
- console.error('Failed sending auto-fix escalation email', { recipient: recipient, logId: log._id, error: error_1 });
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, error_2, e_3_1;
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
- error_2 = _b.sent();
1371
- console.error('Failed sending library-issue auto-fix email', { recipient: recipient, logId: log._id, error: error_2 });
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, error_3;
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
- error_3 = _a.sent();
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: (error_3 === null || error_3 === void 0 ? void 0 : error_3.message) || error_3
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.reserveLog(email, client)];
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*/, 5];
1812
- if (!(reservation.reason && this.shouldNotifySkip(reservation.reason))) return [3 /*break*/, 4];
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 3:
1931
+ case 4:
1821
1932
  _b.sent();
1822
- _b.label = 4;
1823
- case 4: return [2 /*return*/, {
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 5:
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 6:
1958
+ case 7:
1848
1959
  _b.sent();
1849
- if (!classification.skip) return [3 /*break*/, 10];
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 7:
1967
+ case 8:
1856
1968
  updated = _b.sent();
1857
- if (!classification.notify) return [3 /*break*/, 9];
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 8:
1977
+ case 9:
1866
1978
  _b.sent();
1867
- _b.label = 9;
1868
- case 9: return [2 /*return*/, {
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 10:
1874
- if (!!this.config.autoRunEnabled) return [3 /*break*/, 13];
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 11:
1990
+ case 12:
1879
1991
  queued = _b.sent();
1880
1992
  return [4 /*yield*/, this.notifyCustomerWorkflowStatus('detected_autofix_disabled', email, queued || reservation.log)];
1881
- case 12:
1993
+ case 13:
1882
1994
  _b.sent();
1883
1995
  return [2 /*return*/, {
1884
1996
  status: 'queued',
1885
1997
  log: queued
1886
1998
  }];
1887
- case 13: return [4 /*yield*/, this.notifyCustomerWorkflowStatus('detected_autofix_enabled', email, reservation.log)];
1888
- case 14:
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 15:
2003
+ case 16:
1892
2004
  result = _b.sent();
1893
2005
  return [4 /*yield*/, this.notify(result)];
1894
- case 16:
2006
+ case 17:
1895
2007
  _b.sent();
1896
2008
  _a = result.log;
1897
- if (_a) return [3 /*break*/, 18];
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
- return [4 /*yield*/, ErrorAutoFixLogs.findOneAndUpdate({ _id: logId }, {
1940
- $inc: {
1941
- attempt_count: 1
1942
- },
1943
- $set: {
1944
- status: 'in_progress',
1945
- last_attempt_at: now,
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 3:
2084
+ case 5:
1956
2085
  result = _a.sent();
1957
2086
  return [4 /*yield*/, this.notify(result)];
1958
- case 4:
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, error_4, manager;
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
- error_4 = _a.sent();
2045
- if (!this.shouldFallbackDashboardMethod(error_4)) {
2046
- throw error_4;
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, error_5, manager;
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
- error_5 = _a.sent();
2075
- if (!this.shouldFallbackDashboardMethod(error_5)) {
2076
- throw error_5;
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, error_6, manager;
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
- error_6 = _a.sent();
2107
- if (!this.shouldFallbackDashboardMethod(error_6)) {
2108
- throw error_6;
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 error_7;
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
- error_7 = _a.sent();
2380
- console.error('Auto-fix dashboard monitor failed', { logId: logId, jobId: normalizedJobId, error: error_7 });
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, error_8, message, isRunning, error_9, message, job, publishOutcome, fallbackBranch, branchName, successLog;
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
- error_8 = _b.sent();
2441
- message = (error_8 === null || error_8 === void 0 ? void 0 : error_8.message) || 'Failed while waiting for dashboard job completion.';
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
- error_9 = _b.sent();
2457
- message = (error_9 === null || error_9 === void 0 ? void 0 : error_9.message) || 'Unable to confirm dashboard job completion state.';
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, error_10, message, jobId, queuedLog;
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
- error_10 = _a.sent();
2583
- message = (error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'Unable to enqueue dashboard auto-fix job.';
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;