@resolveio/server-lib 22.2.17 → 22.2.19
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 +1 -0
- package/managers/error-auto-fix.manager.js +70 -15
- 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 +22 -0
- package/managers/slow-query-verifier.manager.js +435 -53
- package/managers/slow-query-verifier.manager.js.map +1 -1
- package/managers/subscription.manager.d.ts +1 -0
- package/managers/subscription.manager.js +57 -21
- package/managers/subscription.manager.js.map +1 -1
- package/methods/ai-terminal.d.ts +21 -0
- package/methods/ai-terminal.js +175 -31
- package/methods/ai-terminal.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/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
|
@@ -275,11 +275,11 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
275
275
|
|| slowQueryConfig.escalationEmails
|
|
276
276
|
|| slowQueryConfig.notifyEmails);
|
|
277
277
|
return {
|
|
278
|
-
enabled: getBoolean('SLOW_QUERY_VERIFIER_ENABLED', 'enabled',
|
|
278
|
+
enabled: getBoolean('SLOW_QUERY_VERIFIER_ENABLED', 'enabled', false),
|
|
279
279
|
fallbackToMainDB: getBoolean('SLOW_QUERY_VERIFIER_FALLBACK_MAIN_DB', 'fallbackToMainDB', true),
|
|
280
280
|
debugLogging: getBoolean('SLOW_QUERY_VERIFIER_DEBUG_LOGS', 'debugLogging', false),
|
|
281
281
|
configSource: process.env.SLOW_QUERY_VERIFIER_ENABLED ? 'environment' : (Object.keys(verifierConfig).length ? 'serverConfig' : 'defaults'),
|
|
282
|
-
autoOptimizeEnabled: getBoolean('SLOW_QUERY_AUTO_OPTIMIZE_ENABLED', 'autoOptimizeEnabled',
|
|
282
|
+
autoOptimizeEnabled: getBoolean('SLOW_QUERY_AUTO_OPTIMIZE_ENABLED', 'autoOptimizeEnabled', false),
|
|
283
283
|
autoOptimizeWaitTimeoutMs: getNumber('SLOW_QUERY_AUTO_OPTIMIZE_WAIT_TIMEOUT_MS', 'autoOptimizeWaitTimeoutMs', 45 * 60 * 1000),
|
|
284
284
|
autoOptimizeDurationRatioTarget: clampRatio(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_DURATION_RATIO', 'autoOptimizeDurationRatioTarget', AUTO_OPTIMIZE_DEFAULT_IMPROVEMENT_RATIO), AUTO_OPTIMIZE_DEFAULT_IMPROVEMENT_RATIO),
|
|
285
285
|
autoOptimizeDocsRatioTarget: clampRatio(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_DOCS_RATIO', 'autoOptimizeDocsRatioTarget', AUTO_OPTIMIZE_DEFAULT_IMPROVEMENT_RATIO), AUTO_OPTIMIZE_DEFAULT_IMPROVEMENT_RATIO),
|
|
@@ -290,6 +290,8 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
290
290
|
autoOptimizeFingerprintWindowHours: normalizePositiveInt(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_FINGERPRINT_WINDOW_HOURS', 'autoOptimizeFingerprintWindowHours', AUTO_OPTIMIZE_DEFAULT_FINGERPRINT_WINDOW_HOURS), AUTO_OPTIMIZE_DEFAULT_FINGERPRINT_WINDOW_HOURS),
|
|
291
291
|
autoOptimizeRequiredTokens: normalizeNonNegativeInt(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_REQUIRED_TOKENS', 'autoOptimizeRequiredTokens', 0), 0),
|
|
292
292
|
autoOptimizeOutputCompareEnabled: getBoolean('SLOW_QUERY_AUTO_OPTIMIZE_OUTPUT_COMPARE_ENABLED', 'autoOptimizeOutputCompareEnabled', true),
|
|
293
|
+
autoOptimizeRequireExactOutput: getBoolean('SLOW_QUERY_AUTO_OPTIMIZE_REQUIRE_EXACT_OUTPUT', 'autoOptimizeRequireExactOutput', true),
|
|
294
|
+
autoOptimizeOutputMismatchRetryCount: normalizeNonNegativeInt(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_OUTPUT_MISMATCH_RETRY_COUNT', 'autoOptimizeOutputMismatchRetryCount', 2), 2),
|
|
293
295
|
autoOptimizeOutputCompareMaxDocs: normalizePositiveInt(getNumber('SLOW_QUERY_AUTO_OPTIMIZE_OUTPUT_COMPARE_MAX_DOCS', 'autoOptimizeOutputCompareMaxDocs', AUTO_OPTIMIZE_DEFAULT_OUTPUT_COMPARE_MAX_DOCS), AUTO_OPTIMIZE_DEFAULT_OUTPUT_COMPARE_MAX_DOCS),
|
|
294
296
|
escalationEmails: escalationEmails
|
|
295
297
|
};
|
|
@@ -435,6 +437,325 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
435
437
|
});
|
|
436
438
|
});
|
|
437
439
|
};
|
|
440
|
+
SlowQueryVerifier.prototype.runLog = function (logId, options) {
|
|
441
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
442
|
+
var existing, updated;
|
|
443
|
+
return __generator(this, function (_a) {
|
|
444
|
+
switch (_a.label) {
|
|
445
|
+
case 0:
|
|
446
|
+
if (!logId) {
|
|
447
|
+
throw new Error('Slow query log ID is required.');
|
|
448
|
+
}
|
|
449
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
450
|
+
case 1:
|
|
451
|
+
existing = _a.sent();
|
|
452
|
+
if (!existing) {
|
|
453
|
+
return [2 /*return*/, {
|
|
454
|
+
status: 'not_found',
|
|
455
|
+
reason: 'Slow query log not found.'
|
|
456
|
+
}];
|
|
457
|
+
}
|
|
458
|
+
if (existing.ignored) {
|
|
459
|
+
throw new Error('Slow query log is ignored.');
|
|
460
|
+
}
|
|
461
|
+
if (this.autoOptimizeInFlight.has(logId) || existing.auto_fix_status === 'running' || existing.status === 'queued') {
|
|
462
|
+
return [2 /*return*/, {
|
|
463
|
+
status: 'in_progress',
|
|
464
|
+
reason: 'Slow query optimization is already running.',
|
|
465
|
+
log: existing
|
|
466
|
+
}];
|
|
467
|
+
}
|
|
468
|
+
this.autoOptimizeInFlight.add(logId);
|
|
469
|
+
_a.label = 2;
|
|
470
|
+
case 2:
|
|
471
|
+
_a.trys.push([2, , 4, 5]);
|
|
472
|
+
return [4 /*yield*/, this.runLogWithRetries(logId, {
|
|
473
|
+
force: !!(options === null || options === void 0 ? void 0 : options.force),
|
|
474
|
+
retryOutputMismatch: true
|
|
475
|
+
})];
|
|
476
|
+
case 3:
|
|
477
|
+
_a.sent();
|
|
478
|
+
return [3 /*break*/, 5];
|
|
479
|
+
case 4:
|
|
480
|
+
this.autoOptimizeInFlight.delete(logId);
|
|
481
|
+
return [7 /*endfinally*/];
|
|
482
|
+
case 5: return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
483
|
+
case 6:
|
|
484
|
+
updated = _a.sent();
|
|
485
|
+
if (!updated) {
|
|
486
|
+
return [2 /*return*/, {
|
|
487
|
+
status: 'not_found',
|
|
488
|
+
reason: 'Slow query log no longer exists.'
|
|
489
|
+
}];
|
|
490
|
+
}
|
|
491
|
+
if (updated.auto_fix_status === 'running' || updated.status === 'queued') {
|
|
492
|
+
return [2 /*return*/, {
|
|
493
|
+
status: 'in_progress',
|
|
494
|
+
reason: 'Slow query optimization queued.',
|
|
495
|
+
log: updated
|
|
496
|
+
}];
|
|
497
|
+
}
|
|
498
|
+
if (updated.auto_fix_status === 'completed' || updated.status === 'optimized') {
|
|
499
|
+
return [2 /*return*/, {
|
|
500
|
+
status: 'success',
|
|
501
|
+
reason: 'Slow query optimization completed.',
|
|
502
|
+
log: updated
|
|
503
|
+
}];
|
|
504
|
+
}
|
|
505
|
+
if (updated.auto_fix_status === 'failed') {
|
|
506
|
+
return [2 /*return*/, {
|
|
507
|
+
status: 'failed',
|
|
508
|
+
reason: updated.verification_notes || updated.auto_fix_disabled_reason || 'Slow query optimization failed.',
|
|
509
|
+
log: updated
|
|
510
|
+
}];
|
|
511
|
+
}
|
|
512
|
+
return [2 /*return*/, {
|
|
513
|
+
status: 'updated',
|
|
514
|
+
reason: updated.verification_notes || '',
|
|
515
|
+
log: updated
|
|
516
|
+
}];
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
});
|
|
520
|
+
};
|
|
521
|
+
SlowQueryVerifier.prototype.queueLogRun = function (logId, options) {
|
|
522
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
523
|
+
var existing, queuedAt, queuedLog;
|
|
524
|
+
var _this = this;
|
|
525
|
+
return __generator(this, function (_a) {
|
|
526
|
+
switch (_a.label) {
|
|
527
|
+
case 0:
|
|
528
|
+
if (!logId) {
|
|
529
|
+
throw new Error('Slow query log ID is required.');
|
|
530
|
+
}
|
|
531
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
532
|
+
case 1:
|
|
533
|
+
existing = _a.sent();
|
|
534
|
+
if (!existing) {
|
|
535
|
+
return [2 /*return*/, {
|
|
536
|
+
status: 'not_found',
|
|
537
|
+
reason: 'Slow query log not found.'
|
|
538
|
+
}];
|
|
539
|
+
}
|
|
540
|
+
if (existing.ignored) {
|
|
541
|
+
throw new Error('Slow query log is ignored.');
|
|
542
|
+
}
|
|
543
|
+
if (this.autoOptimizeInFlight.has(logId) || existing.auto_fix_status === 'running' || existing.status === 'queued') {
|
|
544
|
+
return [2 /*return*/, {
|
|
545
|
+
status: 'in_progress',
|
|
546
|
+
reason: 'Slow query optimization is already running.',
|
|
547
|
+
log: existing
|
|
548
|
+
}];
|
|
549
|
+
}
|
|
550
|
+
queuedAt = new Date();
|
|
551
|
+
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
552
|
+
$set: {
|
|
553
|
+
status: 'queued',
|
|
554
|
+
auto_fix_status: 'queued',
|
|
555
|
+
verification_notes: 'Slow query optimization queued from super-admin.',
|
|
556
|
+
last_triaged_by: 'super-admin',
|
|
557
|
+
last_triaged_at: queuedAt
|
|
558
|
+
}
|
|
559
|
+
})];
|
|
560
|
+
case 2:
|
|
561
|
+
_a.sent();
|
|
562
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
563
|
+
case 3:
|
|
564
|
+
queuedLog = (_a.sent()) || existing;
|
|
565
|
+
this.autoOptimizeInFlight.add(logId);
|
|
566
|
+
setImmediate(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
567
|
+
var error_1;
|
|
568
|
+
return __generator(this, function (_a) {
|
|
569
|
+
switch (_a.label) {
|
|
570
|
+
case 0:
|
|
571
|
+
_a.trys.push([0, 2, 3, 4]);
|
|
572
|
+
return [4 /*yield*/, this.runLogWithRetries(logId, {
|
|
573
|
+
force: !!(options === null || options === void 0 ? void 0 : options.force),
|
|
574
|
+
retryOutputMismatch: true
|
|
575
|
+
})];
|
|
576
|
+
case 1:
|
|
577
|
+
_a.sent();
|
|
578
|
+
return [3 /*break*/, 4];
|
|
579
|
+
case 2:
|
|
580
|
+
error_1 = _a.sent();
|
|
581
|
+
console.error('Slow query queued run failed', { logId: logId, error: (error_1 === null || error_1 === void 0 ? void 0 : error_1.message) || error_1 });
|
|
582
|
+
return [3 /*break*/, 4];
|
|
583
|
+
case 3:
|
|
584
|
+
this.autoOptimizeInFlight.delete(logId);
|
|
585
|
+
return [7 /*endfinally*/];
|
|
586
|
+
case 4: return [2 /*return*/];
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
}); });
|
|
590
|
+
return [2 /*return*/, {
|
|
591
|
+
status: 'in_progress',
|
|
592
|
+
reason: 'Slow query optimization queued.',
|
|
593
|
+
log: queuedLog
|
|
594
|
+
}];
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
};
|
|
599
|
+
SlowQueryVerifier.prototype.deployLog = function (logId) {
|
|
600
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
601
|
+
var log, jobId, job, publishOutcome, now, existingResult, refreshed, error_2, message, refreshed;
|
|
602
|
+
return __generator(this, function (_a) {
|
|
603
|
+
switch (_a.label) {
|
|
604
|
+
case 0:
|
|
605
|
+
if (!logId) {
|
|
606
|
+
throw new Error('Slow query log ID is required.');
|
|
607
|
+
}
|
|
608
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
609
|
+
case 1:
|
|
610
|
+
log = _a.sent();
|
|
611
|
+
if (!log) {
|
|
612
|
+
return [2 /*return*/, {
|
|
613
|
+
status: 'not_found',
|
|
614
|
+
reason: 'Slow query log not found.'
|
|
615
|
+
}];
|
|
616
|
+
}
|
|
617
|
+
jobId = String(log.openai_task_id || '').trim();
|
|
618
|
+
if (!jobId) {
|
|
619
|
+
throw new Error('Slow query log does not have a dashboard job id to deploy.');
|
|
620
|
+
}
|
|
621
|
+
_a.label = 2;
|
|
622
|
+
case 2:
|
|
623
|
+
_a.trys.push([2, 6, , 9]);
|
|
624
|
+
return [4 /*yield*/, this.publishDashboardJob(jobId)];
|
|
625
|
+
case 3:
|
|
626
|
+
job = _a.sent();
|
|
627
|
+
publishOutcome = this.evaluateDashboardPublishOutcome(job);
|
|
628
|
+
now = new Date();
|
|
629
|
+
existingResult = (log.auto_fix_result && typeof log.auto_fix_result === 'object')
|
|
630
|
+
? __assign({}, log.auto_fix_result) : {};
|
|
631
|
+
existingResult.manual_deploy = {
|
|
632
|
+
job_id: jobId,
|
|
633
|
+
requested_at: now,
|
|
634
|
+
success: publishOutcome.success,
|
|
635
|
+
message: publishOutcome.message,
|
|
636
|
+
branch_name: publishOutcome.branchName || existingResult.publish_branch || ''
|
|
637
|
+
};
|
|
638
|
+
if (publishOutcome.branchName) {
|
|
639
|
+
existingResult.publish_branch = publishOutcome.branchName;
|
|
640
|
+
}
|
|
641
|
+
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
642
|
+
$set: {
|
|
643
|
+
auto_fix_result: existingResult,
|
|
644
|
+
verification_notes: publishOutcome.success
|
|
645
|
+
? "Manual deploy completed: ".concat(publishOutcome.message)
|
|
646
|
+
: "Manual deploy failed: ".concat(publishOutcome.message),
|
|
647
|
+
last_triaged_by: 'super-admin',
|
|
648
|
+
last_triaged_at: now
|
|
649
|
+
}
|
|
650
|
+
})];
|
|
651
|
+
case 4:
|
|
652
|
+
_a.sent();
|
|
653
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
654
|
+
case 5:
|
|
655
|
+
refreshed = (_a.sent()) || log;
|
|
656
|
+
return [2 /*return*/, {
|
|
657
|
+
status: publishOutcome.success ? 'success' : 'failed',
|
|
658
|
+
reason: publishOutcome.message,
|
|
659
|
+
log: refreshed
|
|
660
|
+
}];
|
|
661
|
+
case 6:
|
|
662
|
+
error_2 = _a.sent();
|
|
663
|
+
message = (error_2 === null || error_2 === void 0 ? void 0 : error_2.message) || 'Manual deploy failed.';
|
|
664
|
+
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
665
|
+
$set: {
|
|
666
|
+
verification_notes: "Manual deploy failed: ".concat(message),
|
|
667
|
+
last_triaged_by: 'super-admin',
|
|
668
|
+
last_triaged_at: new Date()
|
|
669
|
+
}
|
|
670
|
+
})];
|
|
671
|
+
case 7:
|
|
672
|
+
_a.sent();
|
|
673
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
674
|
+
case 8:
|
|
675
|
+
refreshed = _a.sent();
|
|
676
|
+
return [2 /*return*/, {
|
|
677
|
+
status: 'failed',
|
|
678
|
+
reason: message,
|
|
679
|
+
log: refreshed || log
|
|
680
|
+
}];
|
|
681
|
+
case 9: return [2 /*return*/];
|
|
682
|
+
}
|
|
683
|
+
});
|
|
684
|
+
});
|
|
685
|
+
};
|
|
686
|
+
SlowQueryVerifier.prototype.runLogWithRetries = function (logId, options) {
|
|
687
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
688
|
+
var retryBudget, retriesUsed, latest, maxAttempts, attemptsUsed;
|
|
689
|
+
return __generator(this, function (_a) {
|
|
690
|
+
switch (_a.label) {
|
|
691
|
+
case 0:
|
|
692
|
+
retryBudget = options.retryOutputMismatch
|
|
693
|
+
? (Number.isFinite(Number(this.config.autoOptimizeOutputMismatchRetryCount))
|
|
694
|
+
? Number(this.config.autoOptimizeOutputMismatchRetryCount)
|
|
695
|
+
: 0)
|
|
696
|
+
: 0;
|
|
697
|
+
retriesUsed = 0;
|
|
698
|
+
_a.label = 1;
|
|
699
|
+
case 1:
|
|
700
|
+
if (!true) return [3 /*break*/, 5];
|
|
701
|
+
return [4 /*yield*/, this.runAutoOptimization(logId, options.force)];
|
|
702
|
+
case 2:
|
|
703
|
+
_a.sent();
|
|
704
|
+
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
705
|
+
case 3:
|
|
706
|
+
latest = _a.sent();
|
|
707
|
+
if (!latest) {
|
|
708
|
+
return [2 /*return*/, null];
|
|
709
|
+
}
|
|
710
|
+
if (!options.retryOutputMismatch
|
|
711
|
+
|| !this.shouldRetryForOutputMismatch(latest)
|
|
712
|
+
|| retriesUsed >= retryBudget) {
|
|
713
|
+
return [2 /*return*/, latest];
|
|
714
|
+
}
|
|
715
|
+
maxAttempts = Number.isFinite(Number(this.config.autoOptimizeMaxAttemptsPerQuery))
|
|
716
|
+
? Number(this.config.autoOptimizeMaxAttemptsPerQuery)
|
|
717
|
+
: 0;
|
|
718
|
+
attemptsUsed = Number.isFinite(Number(latest.auto_fix_attempt_count))
|
|
719
|
+
? Number(latest.auto_fix_attempt_count)
|
|
720
|
+
: 0;
|
|
721
|
+
if (maxAttempts > 0 && attemptsUsed >= maxAttempts) {
|
|
722
|
+
return [2 /*return*/, latest];
|
|
723
|
+
}
|
|
724
|
+
retriesUsed += 1;
|
|
725
|
+
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
726
|
+
$set: {
|
|
727
|
+
verification_notes: "Output equivalence mismatch detected. Retrying (".concat(retriesUsed, "/").concat(retryBudget, ")."),
|
|
728
|
+
last_triaged_by: 'auto-slow-query',
|
|
729
|
+
last_triaged_at: new Date()
|
|
730
|
+
}
|
|
731
|
+
})];
|
|
732
|
+
case 4:
|
|
733
|
+
_a.sent();
|
|
734
|
+
return [3 /*break*/, 1];
|
|
735
|
+
case 5: return [2 /*return*/];
|
|
736
|
+
}
|
|
737
|
+
});
|
|
738
|
+
});
|
|
739
|
+
};
|
|
740
|
+
SlowQueryVerifier.prototype.shouldRetryForOutputMismatch = function (log) {
|
|
741
|
+
if (!log || log.ignored || log.auto_fix_status !== 'failed') {
|
|
742
|
+
return false;
|
|
743
|
+
}
|
|
744
|
+
var result = (log.auto_fix_result && typeof log.auto_fix_result === 'object')
|
|
745
|
+
? log.auto_fix_result
|
|
746
|
+
: {};
|
|
747
|
+
var validation = (result.validation && typeof result.validation === 'object')
|
|
748
|
+
? result.validation
|
|
749
|
+
: {};
|
|
750
|
+
var outputEquivalence = result.output_equivalence;
|
|
751
|
+
var validationReason = String(validation.reason || '').toLowerCase();
|
|
752
|
+
var notes = String(log.verification_notes || '').toLowerCase();
|
|
753
|
+
if (outputEquivalence && outputEquivalence.passed === false) {
|
|
754
|
+
return true;
|
|
755
|
+
}
|
|
756
|
+
return validationReason.includes('output equivalence')
|
|
757
|
+
|| notes.includes('output equivalence');
|
|
758
|
+
};
|
|
438
759
|
SlowQueryVerifier.prototype.runExplain = function (log, overrides) {
|
|
439
760
|
return __awaiter(this, void 0, void 0, function () {
|
|
440
761
|
var collectionName, target, client, db, effectiveLog, pipeline_1, filter, findOptions, aggregateOptions_1, explainResponse, usedVerbosity, explainAggregate, cursor, err_3, code, codeName, message, fallbackErr_1, durationMs_1, cursor, _a, durationMs_2, durationMs, explainPlanRaw, explainStatsRaw, stageSummaries, explainPlan, explainStats;
|
|
@@ -819,7 +1140,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
819
1140
|
SlowQueryVerifier.prototype.runAutoOptimizationInBackground = function (logId) {
|
|
820
1141
|
var _this = this;
|
|
821
1142
|
setImmediate(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
822
|
-
var
|
|
1143
|
+
var error_3;
|
|
823
1144
|
return __generator(this, function (_a) {
|
|
824
1145
|
switch (_a.label) {
|
|
825
1146
|
case 0:
|
|
@@ -829,8 +1150,8 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
829
1150
|
_a.sent();
|
|
830
1151
|
return [3 /*break*/, 4];
|
|
831
1152
|
case 2:
|
|
832
|
-
|
|
833
|
-
console.error('Slow query auto optimization failed', { logId: logId, error: (
|
|
1153
|
+
error_3 = _a.sent();
|
|
1154
|
+
console.error('Slow query auto optimization failed', { logId: logId, error: (error_3 === null || error_3 === void 0 ? void 0 : error_3.message) || error_3 });
|
|
834
1155
|
return [3 /*break*/, 4];
|
|
835
1156
|
case 3:
|
|
836
1157
|
this.autoOptimizeInFlight.delete(logId);
|
|
@@ -858,7 +1179,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
858
1179
|
};
|
|
859
1180
|
SlowQueryVerifier.prototype.sendSlowQueryEscalationNotice = function (log, reason) {
|
|
860
1181
|
return __awaiter(this, void 0, void 0, function () {
|
|
861
|
-
var recipients, subject, body, methodManager, recipients_1, recipients_1_1, recipient,
|
|
1182
|
+
var recipients, subject, body, methodManager, recipients_1, recipients_1_1, recipient, error_4, e_2_1;
|
|
862
1183
|
var e_2, _a;
|
|
863
1184
|
return __generator(this, function (_b) {
|
|
864
1185
|
switch (_b.label) {
|
|
@@ -899,8 +1220,8 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
899
1220
|
_b.sent();
|
|
900
1221
|
return [3 /*break*/, 6];
|
|
901
1222
|
case 5:
|
|
902
|
-
|
|
903
|
-
console.error('Failed sending slow-query escalation email', { recipient: recipient, logId: log._id, error:
|
|
1223
|
+
error_4 = _b.sent();
|
|
1224
|
+
console.error('Failed sending slow-query escalation email', { recipient: recipient, logId: log._id, error: error_4 });
|
|
904
1225
|
return [3 /*break*/, 6];
|
|
905
1226
|
case 6:
|
|
906
1227
|
recipients_1_1 = recipients_1.next();
|
|
@@ -1163,7 +1484,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1163
1484
|
};
|
|
1164
1485
|
SlowQueryVerifier.prototype.notifyCustomerSlowQueryStatus = function (stage, log, extra) {
|
|
1165
1486
|
return __awaiter(this, void 0, void 0, function () {
|
|
1166
|
-
var target, isGeneratedApp, generatedApp, issueKey, dedupeKey, metadata, targetPayload, idUsers, payload,
|
|
1487
|
+
var target, isGeneratedApp, generatedApp, issueKey, dedupeKey, metadata, targetPayload, idUsers, payload, error_5;
|
|
1167
1488
|
return __generator(this, function (_a) {
|
|
1168
1489
|
switch (_a.label) {
|
|
1169
1490
|
case 0:
|
|
@@ -1259,12 +1580,12 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1259
1580
|
_a.sent();
|
|
1260
1581
|
return [3 /*break*/, 12];
|
|
1261
1582
|
case 11:
|
|
1262
|
-
|
|
1583
|
+
error_5 = _a.sent();
|
|
1263
1584
|
if (this.config.debugLogging) {
|
|
1264
1585
|
console.warn('Slow query customer notification failed', {
|
|
1265
1586
|
logId: log._id,
|
|
1266
1587
|
stage: stage,
|
|
1267
|
-
error: (
|
|
1588
|
+
error: (error_5 === null || error_5 === void 0 ? void 0 : error_5.message) || error_5
|
|
1268
1589
|
});
|
|
1269
1590
|
}
|
|
1270
1591
|
return [3 /*break*/, 12];
|
|
@@ -1597,7 +1918,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1597
1918
|
};
|
|
1598
1919
|
SlowQueryVerifier.prototype.createDashboardJob = function (payload) {
|
|
1599
1920
|
return __awaiter(this, void 0, void 0, function () {
|
|
1600
|
-
var methodManager,
|
|
1921
|
+
var methodManager, error_6, manager;
|
|
1601
1922
|
return __generator(this, function (_a) {
|
|
1602
1923
|
switch (_a.label) {
|
|
1603
1924
|
case 0:
|
|
@@ -1608,9 +1929,9 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1608
1929
|
return [4 /*yield*/, methodManager.callMethod('aiDashboardCreateJob', payload)];
|
|
1609
1930
|
case 2: return [2 /*return*/, _a.sent()];
|
|
1610
1931
|
case 3:
|
|
1611
|
-
|
|
1612
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
1613
|
-
throw
|
|
1932
|
+
error_6 = _a.sent();
|
|
1933
|
+
if (!this.shouldFallbackDashboardMethod(error_6)) {
|
|
1934
|
+
throw error_6;
|
|
1614
1935
|
}
|
|
1615
1936
|
return [3 /*break*/, 4];
|
|
1616
1937
|
case 4:
|
|
@@ -1625,7 +1946,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1625
1946
|
};
|
|
1626
1947
|
SlowQueryVerifier.prototype.waitForDashboardJobStop = function (jobId, timeoutMs) {
|
|
1627
1948
|
return __awaiter(this, void 0, void 0, function () {
|
|
1628
|
-
var methodManager,
|
|
1949
|
+
var methodManager, error_7, manager;
|
|
1629
1950
|
return __generator(this, function (_a) {
|
|
1630
1951
|
switch (_a.label) {
|
|
1631
1952
|
case 0:
|
|
@@ -1638,9 +1959,9 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1638
1959
|
_a.sent();
|
|
1639
1960
|
return [2 /*return*/];
|
|
1640
1961
|
case 3:
|
|
1641
|
-
|
|
1642
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
1643
|
-
throw
|
|
1962
|
+
error_7 = _a.sent();
|
|
1963
|
+
if (!this.shouldFallbackDashboardMethod(error_7)) {
|
|
1964
|
+
throw error_7;
|
|
1644
1965
|
}
|
|
1645
1966
|
return [3 /*break*/, 4];
|
|
1646
1967
|
case 4:
|
|
@@ -1657,7 +1978,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1657
1978
|
};
|
|
1658
1979
|
SlowQueryVerifier.prototype.isDashboardJobRunning = function (jobId) {
|
|
1659
1980
|
return __awaiter(this, void 0, void 0, function () {
|
|
1660
|
-
var methodManager, running,
|
|
1981
|
+
var methodManager, running, error_8, manager;
|
|
1661
1982
|
return __generator(this, function (_a) {
|
|
1662
1983
|
switch (_a.label) {
|
|
1663
1984
|
case 0:
|
|
@@ -1670,9 +1991,9 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1670
1991
|
running = _a.sent();
|
|
1671
1992
|
return [2 /*return*/, !!running];
|
|
1672
1993
|
case 3:
|
|
1673
|
-
|
|
1674
|
-
if (!this.shouldFallbackDashboardMethod(
|
|
1675
|
-
throw
|
|
1994
|
+
error_8 = _a.sent();
|
|
1995
|
+
if (!this.shouldFallbackDashboardMethod(error_8)) {
|
|
1996
|
+
throw error_8;
|
|
1676
1997
|
}
|
|
1677
1998
|
return [3 /*break*/, 4];
|
|
1678
1999
|
case 4:
|
|
@@ -1685,6 +2006,34 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1685
2006
|
});
|
|
1686
2007
|
});
|
|
1687
2008
|
};
|
|
2009
|
+
SlowQueryVerifier.prototype.publishDashboardJob = function (jobId) {
|
|
2010
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2011
|
+
var methodManager, error_9, manager;
|
|
2012
|
+
return __generator(this, function (_a) {
|
|
2013
|
+
switch (_a.label) {
|
|
2014
|
+
case 0:
|
|
2015
|
+
methodManager = resolveio_server_app_1.ResolveIOServer.getMainServer().getMethodManager();
|
|
2016
|
+
_a.label = 1;
|
|
2017
|
+
case 1:
|
|
2018
|
+
_a.trys.push([1, 3, , 4]);
|
|
2019
|
+
return [4 /*yield*/, methodManager.callMethod('aiDashboardPublishJob', jobId)];
|
|
2020
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
2021
|
+
case 3:
|
|
2022
|
+
error_9 = _a.sent();
|
|
2023
|
+
if (!this.shouldFallbackDashboardMethod(error_9)) {
|
|
2024
|
+
throw error_9;
|
|
2025
|
+
}
|
|
2026
|
+
return [3 /*break*/, 4];
|
|
2027
|
+
case 4:
|
|
2028
|
+
manager = resolveio_server_app_1.ResolveIOServer['AIDashboardManager'];
|
|
2029
|
+
if (!(manager && manager.isEnabled && manager.isEnabled() && typeof manager.publishJob === 'function')) return [3 /*break*/, 6];
|
|
2030
|
+
return [4 /*yield*/, manager.publishJob(jobId)];
|
|
2031
|
+
case 5: return [2 /*return*/, _a.sent()];
|
|
2032
|
+
case 6: throw new Error('AI Dashboard manager is not available.');
|
|
2033
|
+
}
|
|
2034
|
+
});
|
|
2035
|
+
});
|
|
2036
|
+
};
|
|
1688
2037
|
SlowQueryVerifier.prototype.evaluateDashboardPublishOutcome = function (job) {
|
|
1689
2038
|
var logEntries = Array.isArray(job === null || job === void 0 ? void 0 : job.log) ? job.log : [];
|
|
1690
2039
|
var lastMatch = function (predicate) {
|
|
@@ -1701,7 +2050,12 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1701
2050
|
}
|
|
1702
2051
|
var publishEntry = lastMatch(function (entry) { return /Published build to /i.test(entry || ''); });
|
|
1703
2052
|
if (publishEntry) {
|
|
1704
|
-
|
|
2053
|
+
var branchMatch = publishEntry.match(/\(([^()]+)\)\.?$/);
|
|
2054
|
+
return {
|
|
2055
|
+
success: true,
|
|
2056
|
+
message: publishEntry,
|
|
2057
|
+
branchName: (branchMatch && branchMatch[1]) ? branchMatch[1].trim() : undefined
|
|
2058
|
+
};
|
|
1705
2059
|
}
|
|
1706
2060
|
var skippedEntry = lastMatch(function (entry) { return /Publish skipped/i.test(entry || ''); });
|
|
1707
2061
|
if (skippedEntry) {
|
|
@@ -1933,6 +2287,22 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
1933
2287
|
};
|
|
1934
2288
|
};
|
|
1935
2289
|
SlowQueryVerifier.prototype.evaluateOptimizationOutcome = function (baseline, after, outputEquivalence) {
|
|
2290
|
+
if (this.config.autoOptimizeRequireExactOutput) {
|
|
2291
|
+
if (!this.config.autoOptimizeOutputCompareEnabled) {
|
|
2292
|
+
return {
|
|
2293
|
+
passed: false,
|
|
2294
|
+
reason: 'Exact output equivalence is required but output comparison is disabled.',
|
|
2295
|
+
outputEquivalence: outputEquivalence
|
|
2296
|
+
};
|
|
2297
|
+
}
|
|
2298
|
+
if (!outputEquivalence) {
|
|
2299
|
+
return {
|
|
2300
|
+
passed: false,
|
|
2301
|
+
reason: 'Output equivalence proof is required but was not generated.',
|
|
2302
|
+
outputEquivalence: outputEquivalence
|
|
2303
|
+
};
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
1936
2306
|
if (outputEquivalence && !outputEquivalence.passed) {
|
|
1937
2307
|
return {
|
|
1938
2308
|
passed: false,
|
|
@@ -2035,14 +2405,17 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2035
2405
|
'5. Locate the source query in app code and optimize it safely (query shape contract must remain compatible).',
|
|
2036
2406
|
'6. Add or adjust indexes/code paths so docs examined and processing time drop significantly.',
|
|
2037
2407
|
'7. Measure before/after `explain(\"executionStats\")` and identify the slowest stages by execution time/docs examined.',
|
|
2038
|
-
'8.
|
|
2408
|
+
'8. Returned data must be exactly equivalent before and after optimization. Any output difference is a failed run.',
|
|
2039
2409
|
'9. In `$lookup`, avoid `$expr` + `$in` when equivalent `localField` / `foreignField` joins are possible and index-friendly.',
|
|
2040
2410
|
'10. Run build/lint checks and iterate until green.',
|
|
2041
|
-
'11.
|
|
2411
|
+
'11. Use workspace context `/var/ai-workspace/<id_slow_query>` and inspect transpiled runtime references under `/var/app/current`.',
|
|
2412
|
+
'12. Publish to default branch and deploy artifacts automatically after build success.',
|
|
2042
2413
|
'',
|
|
2043
2414
|
"App: ".concat(app.name || app._id),
|
|
2044
2415
|
"Repo: ".concat(app.repo || 'unknown'),
|
|
2045
2416
|
"Slow Query #: ".concat(log.slow_query_count_string || log._id || ''),
|
|
2417
|
+
"Workspace Context Id: ".concat(String((log === null || log === void 0 ? void 0 : log._id) || '').trim() || 'n/a'),
|
|
2418
|
+
"Workspace Path: /var/ai-workspace/".concat(String((log === null || log === void 0 ? void 0 : log._id) || '').trim() || '<id_slow_query>'),
|
|
2046
2419
|
"Collection: ".concat(log.collection),
|
|
2047
2420
|
"Query Hash: ".concat(log.query_hash),
|
|
2048
2421
|
"Slow Query Log Id: ".concat(String((log === null || log === void 0 ? void 0 : log._id) || '').trim() || 'n/a'),
|
|
@@ -2496,13 +2869,14 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2496
2869
|
});
|
|
2497
2870
|
});
|
|
2498
2871
|
};
|
|
2499
|
-
SlowQueryVerifier.prototype.runAutoOptimization = function (
|
|
2500
|
-
return __awaiter(this,
|
|
2501
|
-
var log, attemptsUsed, maxAttempts, cooldownDeadline, fingerprintMaxAttempts, windowHours, windowStart, fingerprintAttempts, app, tokenEligibility, reason, baselineExplain,
|
|
2872
|
+
SlowQueryVerifier.prototype.runAutoOptimization = function (logId_1) {
|
|
2873
|
+
return __awaiter(this, arguments, void 0, function (logId, force) {
|
|
2874
|
+
var log, attemptsUsed, maxAttempts, cooldownDeadline, fingerprintMaxAttempts, windowHours, windowStart, fingerprintAttempts, app, tokenEligibility, reason, baselineExplain, error_10, baselineFallbackDuration, baselineDurationMs, baselineMetrics, baselineOutputFingerprint, error_11, title, description, job, error_12, jobId, attemptStartedAt, queuedLog, error_13, isRunning, error_14, finalJob, publishOutcome, refreshedLog, afterExplain, error_15, afterMetrics, outputEquivalence, afterOutputFingerprint, error_16, validation, autoFixResult, optimizedLog;
|
|
2875
|
+
if (force === void 0) { force = false; }
|
|
2502
2876
|
return __generator(this, function (_a) {
|
|
2503
2877
|
switch (_a.label) {
|
|
2504
2878
|
case 0:
|
|
2505
|
-
if (!logId || !this.config.autoOptimizeEnabled) {
|
|
2879
|
+
if (!logId || (!this.config.autoOptimizeEnabled && !force)) {
|
|
2506
2880
|
return [2 /*return*/];
|
|
2507
2881
|
}
|
|
2508
2882
|
return [4 /*yield*/, SlowQueryLogs.findOne({ _id: logId })];
|
|
@@ -2511,12 +2885,16 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2511
2885
|
if (!log || !log._id || log.ignored) {
|
|
2512
2886
|
return [2 /*return*/];
|
|
2513
2887
|
}
|
|
2514
|
-
if (log.status === 'optimized') {
|
|
2888
|
+
if (log.status === 'optimized' && !force) {
|
|
2515
2889
|
return [2 /*return*/];
|
|
2516
2890
|
}
|
|
2517
|
-
if (log.auto_fix_status === 'running'
|
|
2891
|
+
if (log.auto_fix_status === 'running') {
|
|
2518
2892
|
return [2 /*return*/];
|
|
2519
2893
|
}
|
|
2894
|
+
if (log.auto_fix_status === 'queued' && String(log.openai_task_id || '').trim()) {
|
|
2895
|
+
return [2 /*return*/];
|
|
2896
|
+
}
|
|
2897
|
+
if (!!force) return [3 /*break*/, 8];
|
|
2520
2898
|
attemptsUsed = Number.isFinite(Number(log.auto_fix_attempt_count))
|
|
2521
2899
|
? Number(log.auto_fix_attempt_count)
|
|
2522
2900
|
: 0;
|
|
@@ -2584,15 +2962,15 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2584
2962
|
baselineExplain = _a.sent();
|
|
2585
2963
|
return [3 /*break*/, 19];
|
|
2586
2964
|
case 16:
|
|
2587
|
-
|
|
2965
|
+
error_10 = _a.sent();
|
|
2588
2966
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2589
2967
|
$set: {
|
|
2590
2968
|
status: 'investigating',
|
|
2591
2969
|
auto_fix_status: 'failed',
|
|
2592
2970
|
auto_fix_result: {
|
|
2593
|
-
baseline_error: (
|
|
2971
|
+
baseline_error: (error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'unknown'
|
|
2594
2972
|
},
|
|
2595
|
-
verification_notes: "Auto optimize baseline measurement failed: ".concat((
|
|
2973
|
+
verification_notes: "Auto optimize baseline measurement failed: ".concat((error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'unknown error'),
|
|
2596
2974
|
last_triaged_by: 'auto-slow-query',
|
|
2597
2975
|
last_triaged_at: new Date()
|
|
2598
2976
|
}
|
|
@@ -2618,15 +2996,15 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2618
2996
|
baselineOutputFingerprint = _a.sent();
|
|
2619
2997
|
return [3 /*break*/, 25];
|
|
2620
2998
|
case 22:
|
|
2621
|
-
|
|
2999
|
+
error_11 = _a.sent();
|
|
2622
3000
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2623
3001
|
$set: {
|
|
2624
3002
|
status: 'investigating',
|
|
2625
3003
|
auto_fix_status: 'failed',
|
|
2626
3004
|
auto_fix_result: {
|
|
2627
|
-
baseline_error: (
|
|
3005
|
+
baseline_error: (error_11 === null || error_11 === void 0 ? void 0 : error_11.message) || 'unknown'
|
|
2628
3006
|
},
|
|
2629
|
-
verification_notes: "Auto optimize baseline output comparison failed: ".concat((
|
|
3007
|
+
verification_notes: "Auto optimize baseline output comparison failed: ".concat((error_11 === null || error_11 === void 0 ? void 0 : error_11.message) || 'unknown error'),
|
|
2630
3008
|
last_triaged_by: 'auto-slow-query',
|
|
2631
3009
|
last_triaged_at: new Date()
|
|
2632
3010
|
}
|
|
@@ -2655,12 +3033,12 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2655
3033
|
job = _a.sent();
|
|
2656
3034
|
return [3 /*break*/, 31];
|
|
2657
3035
|
case 28:
|
|
2658
|
-
|
|
3036
|
+
error_12 = _a.sent();
|
|
2659
3037
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2660
3038
|
$set: {
|
|
2661
3039
|
status: 'investigating',
|
|
2662
3040
|
auto_fix_status: 'failed',
|
|
2663
|
-
verification_notes: "Auto optimize enqueue failed: ".concat((
|
|
3041
|
+
verification_notes: "Auto optimize enqueue failed: ".concat((error_12 === null || error_12 === void 0 ? void 0 : error_12.message) || 'unknown error'),
|
|
2664
3042
|
last_triaged_by: 'auto-slow-query',
|
|
2665
3043
|
last_triaged_at: new Date()
|
|
2666
3044
|
}
|
|
@@ -2725,16 +3103,16 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2725
3103
|
_a.sent();
|
|
2726
3104
|
return [3 /*break*/, 42];
|
|
2727
3105
|
case 39:
|
|
2728
|
-
|
|
3106
|
+
error_13 = _a.sent();
|
|
2729
3107
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2730
3108
|
$set: {
|
|
2731
3109
|
status: 'investigating',
|
|
2732
3110
|
auto_fix_status: 'failed',
|
|
2733
3111
|
auto_fix_result: {
|
|
2734
3112
|
job_id: jobId,
|
|
2735
|
-
error: (
|
|
3113
|
+
error: (error_13 === null || error_13 === void 0 ? void 0 : error_13.message) || 'timeout'
|
|
2736
3114
|
},
|
|
2737
|
-
verification_notes: "Auto optimize wait failed: ".concat((
|
|
3115
|
+
verification_notes: "Auto optimize wait failed: ".concat((error_13 === null || error_13 === void 0 ? void 0 : error_13.message) || 'timeout'),
|
|
2738
3116
|
last_triaged_by: 'auto-slow-query',
|
|
2739
3117
|
last_triaged_at: new Date()
|
|
2740
3118
|
}
|
|
@@ -2755,16 +3133,16 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2755
3133
|
isRunning = _a.sent();
|
|
2756
3134
|
return [3 /*break*/, 47];
|
|
2757
3135
|
case 45:
|
|
2758
|
-
|
|
3136
|
+
error_14 = _a.sent();
|
|
2759
3137
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2760
3138
|
$set: {
|
|
2761
3139
|
status: 'investigating',
|
|
2762
3140
|
auto_fix_status: 'failed',
|
|
2763
3141
|
auto_fix_result: {
|
|
2764
3142
|
job_id: jobId,
|
|
2765
|
-
error: (
|
|
3143
|
+
error: (error_14 === null || error_14 === void 0 ? void 0 : error_14.message) || 'unknown'
|
|
2766
3144
|
},
|
|
2767
|
-
verification_notes: "Unable to confirm dashboard job state: ".concat((
|
|
3145
|
+
verification_notes: "Unable to confirm dashboard job state: ".concat((error_14 === null || error_14 === void 0 ? void 0 : error_14.message) || 'unknown error'),
|
|
2768
3146
|
last_triaged_by: 'auto-slow-query',
|
|
2769
3147
|
last_triaged_at: new Date()
|
|
2770
3148
|
}
|
|
@@ -2826,7 +3204,8 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2826
3204
|
auto_fix_status: 'failed',
|
|
2827
3205
|
auto_fix_result: {
|
|
2828
3206
|
job_id: jobId,
|
|
2829
|
-
publish_message: publishOutcome.message
|
|
3207
|
+
publish_message: publishOutcome.message,
|
|
3208
|
+
publish_branch: publishOutcome.branchName || ''
|
|
2830
3209
|
},
|
|
2831
3210
|
verification_notes: "Auto optimize publish/deploy failed: ".concat(publishOutcome.message),
|
|
2832
3211
|
last_triaged_by: 'auto-slow-query',
|
|
@@ -2850,7 +3229,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2850
3229
|
afterExplain = _a.sent();
|
|
2851
3230
|
return [3 /*break*/, 64];
|
|
2852
3231
|
case 61:
|
|
2853
|
-
|
|
3232
|
+
error_15 = _a.sent();
|
|
2854
3233
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2855
3234
|
$set: {
|
|
2856
3235
|
status: 'investigating',
|
|
@@ -2858,9 +3237,10 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2858
3237
|
auto_fix_result: {
|
|
2859
3238
|
job_id: jobId,
|
|
2860
3239
|
publish_message: publishOutcome.message,
|
|
2861
|
-
|
|
3240
|
+
publish_branch: publishOutcome.branchName || '',
|
|
3241
|
+
validation_error: (error_15 === null || error_15 === void 0 ? void 0 : error_15.message) || 'unknown'
|
|
2862
3242
|
},
|
|
2863
|
-
verification_notes: "Post-deploy validation failed: ".concat((
|
|
3243
|
+
verification_notes: "Post-deploy validation failed: ".concat((error_15 === null || error_15 === void 0 ? void 0 : error_15.message) || 'unknown error'),
|
|
2864
3244
|
last_triaged_by: 'auto-slow-query',
|
|
2865
3245
|
last_triaged_at: new Date()
|
|
2866
3246
|
}
|
|
@@ -2889,7 +3269,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2889
3269
|
outputEquivalence = this.compareOutputEquivalence(baselineOutputFingerprint, afterOutputFingerprint);
|
|
2890
3270
|
return [3 /*break*/, 70];
|
|
2891
3271
|
case 67:
|
|
2892
|
-
|
|
3272
|
+
error_16 = _a.sent();
|
|
2893
3273
|
return [4 /*yield*/, SlowQueryLogs.updateOne({ _id: logId }, {
|
|
2894
3274
|
$set: {
|
|
2895
3275
|
status: 'investigating',
|
|
@@ -2897,11 +3277,12 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2897
3277
|
auto_fix_result: {
|
|
2898
3278
|
job_id: jobId,
|
|
2899
3279
|
publish_message: publishOutcome.message,
|
|
3280
|
+
publish_branch: publishOutcome.branchName || '',
|
|
2900
3281
|
baseline: baselineMetrics,
|
|
2901
3282
|
after: afterMetrics,
|
|
2902
|
-
output_equivalence_error: (
|
|
3283
|
+
output_equivalence_error: (error_16 === null || error_16 === void 0 ? void 0 : error_16.message) || 'unknown'
|
|
2903
3284
|
},
|
|
2904
|
-
verification_notes: "Post-deploy output comparison failed: ".concat((
|
|
3285
|
+
verification_notes: "Post-deploy output comparison failed: ".concat((error_16 === null || error_16 === void 0 ? void 0 : error_16.message) || 'unknown error'),
|
|
2905
3286
|
explain_plan: afterExplain.explainPlan,
|
|
2906
3287
|
explain_execution_stats: afterExplain.explainStats,
|
|
2907
3288
|
explain_generated_at: new Date(),
|
|
@@ -2926,6 +3307,7 @@ var SlowQueryVerifier = /** @class */ (function () {
|
|
|
2926
3307
|
autoFixResult = {
|
|
2927
3308
|
job_id: jobId,
|
|
2928
3309
|
publish_message: publishOutcome.message,
|
|
3310
|
+
publish_branch: publishOutcome.branchName || '',
|
|
2929
3311
|
baseline: baselineMetrics,
|
|
2930
3312
|
after: afterMetrics,
|
|
2931
3313
|
output_equivalence: outputEquivalence,
|