@resolveio/server-lib 22.2.18 → 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.
@@ -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', true),
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', true),
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 error_1;
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
- error_1 = _a.sent();
833
- console.error('Slow query auto optimization failed', { logId: logId, error: (error_1 === null || error_1 === void 0 ? void 0 : error_1.message) || error_1 });
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, error_2, e_2_1;
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
- error_2 = _b.sent();
903
- console.error('Failed sending slow-query escalation email', { recipient: recipient, logId: log._id, error: error_2 });
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, error_3;
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
- error_3 = _a.sent();
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: (error_3 === null || error_3 === void 0 ? void 0 : error_3.message) || error_3
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, error_4, manager;
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
- error_4 = _a.sent();
1612
- if (!this.shouldFallbackDashboardMethod(error_4)) {
1613
- throw error_4;
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, error_5, manager;
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
- error_5 = _a.sent();
1642
- if (!this.shouldFallbackDashboardMethod(error_5)) {
1643
- throw error_5;
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, error_6, manager;
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
- error_6 = _a.sent();
1674
- if (!this.shouldFallbackDashboardMethod(error_6)) {
1675
- throw error_6;
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
- return { success: true, message: publishEntry };
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. Keep returned data behavior stable for existing consumers (output fingerprint + row count must remain equivalent).',
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. Publish to default branch and deploy artifacts automatically after build success.',
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 (logId) {
2500
- return __awaiter(this, void 0, void 0, function () {
2501
- var log, attemptsUsed, maxAttempts, cooldownDeadline, fingerprintMaxAttempts, windowHours, windowStart, fingerprintAttempts, app, tokenEligibility, reason, baselineExplain, error_7, baselineFallbackDuration, baselineDurationMs, baselineMetrics, baselineOutputFingerprint, error_8, title, description, job, error_9, jobId, attemptStartedAt, queuedLog, error_10, isRunning, error_11, finalJob, publishOutcome, refreshedLog, afterExplain, error_12, afterMetrics, outputEquivalence, afterOutputFingerprint, error_13, validation, autoFixResult, optimizedLog;
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' || log.auto_fix_status === 'queued') {
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
- error_7 = _a.sent();
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: (error_7 === null || error_7 === void 0 ? void 0 : error_7.message) || 'unknown'
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((error_7 === null || error_7 === void 0 ? void 0 : error_7.message) || 'unknown error'),
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
- error_8 = _a.sent();
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: (error_8 === null || error_8 === void 0 ? void 0 : error_8.message) || 'unknown'
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((error_8 === null || error_8 === void 0 ? void 0 : error_8.message) || 'unknown error'),
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
- error_9 = _a.sent();
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((error_9 === null || error_9 === void 0 ? void 0 : error_9.message) || 'unknown error'),
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
- error_10 = _a.sent();
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: (error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'timeout'
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((error_10 === null || error_10 === void 0 ? void 0 : error_10.message) || 'timeout'),
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
- error_11 = _a.sent();
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: (error_11 === null || error_11 === void 0 ? void 0 : error_11.message) || 'unknown'
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((error_11 === null || error_11 === void 0 ? void 0 : error_11.message) || 'unknown error'),
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
- error_12 = _a.sent();
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
- validation_error: (error_12 === null || error_12 === void 0 ? void 0 : error_12.message) || 'unknown'
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((error_12 === null || error_12 === void 0 ? void 0 : error_12.message) || 'unknown error'),
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
- error_13 = _a.sent();
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: (error_13 === null || error_13 === void 0 ? void 0 : error_13.message) || 'unknown'
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((error_13 === null || error_13 === void 0 ? void 0 : error_13.message) || 'unknown error'),
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,