@resolveio/server-lib 20.13.12 → 20.14.1

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 (58) hide show
  1. package/collections/ai-terminal-conversation.collection.d.ts +2 -0
  2. package/collections/ai-terminal-conversation.collection.js +133 -0
  3. package/collections/ai-terminal-conversation.collection.js.map +1 -0
  4. package/collections/ai-terminal-message.collection.d.ts +2 -0
  5. package/collections/ai-terminal-message.collection.js +113 -0
  6. package/collections/ai-terminal-message.collection.js.map +1 -0
  7. package/collections/communication-metric.collection.d.ts +2 -0
  8. package/collections/communication-metric.collection.js +133 -0
  9. package/collections/communication-metric.collection.js.map +1 -0
  10. package/collections/openai-usage-ledger.collection.d.ts +2 -0
  11. package/collections/openai-usage-ledger.collection.js +120 -0
  12. package/collections/openai-usage-ledger.collection.js.map +1 -0
  13. package/managers/communication-metric.manager.d.ts +16 -0
  14. package/managers/communication-metric.manager.js +134 -0
  15. package/managers/communication-metric.manager.js.map +1 -0
  16. package/managers/method.manager.d.ts +2 -0
  17. package/managers/method.manager.js +162 -45
  18. package/managers/method.manager.js.map +1 -1
  19. package/managers/openai-usage-ledger.manager.d.ts +14 -0
  20. package/managers/openai-usage-ledger.manager.js +137 -0
  21. package/managers/openai-usage-ledger.manager.js.map +1 -0
  22. package/managers/subscription.manager.js +2 -0
  23. package/managers/subscription.manager.js.map +1 -1
  24. package/methods/ai-terminal.d.ts +1 -0
  25. package/methods/ai-terminal.js +1200 -0
  26. package/methods/ai-terminal.js.map +1 -0
  27. package/methods/report-builder.js +741 -0
  28. package/methods/report-builder.js.map +1 -1
  29. package/methods.ts +27 -0
  30. package/models/ai-terminal-conversation.model.d.ts +16 -0
  31. package/models/ai-terminal-conversation.model.js +4 -0
  32. package/models/ai-terminal-conversation.model.js.map +1 -0
  33. package/models/ai-terminal-message.model.d.ts +22 -0
  34. package/models/ai-terminal-message.model.js +4 -0
  35. package/models/ai-terminal-message.model.js.map +1 -0
  36. package/models/communication-metric.model.d.ts +20 -0
  37. package/models/communication-metric.model.js +4 -0
  38. package/models/communication-metric.model.js.map +1 -0
  39. package/models/openai-usage-ledger.model.d.ts +14 -0
  40. package/models/openai-usage-ledger.model.js +4 -0
  41. package/models/openai-usage-ledger.model.js.map +1 -0
  42. package/package.json +5 -1
  43. package/public_api.d.ts +13 -0
  44. package/public_api.js +13 -0
  45. package/public_api.js.map +1 -1
  46. package/publications/ai-terminal.d.ts +1 -0
  47. package/publications/ai-terminal.js +58 -0
  48. package/publications/ai-terminal.js.map +1 -0
  49. package/publications.ts +6 -0
  50. package/services/codex-client.d.ts +81 -0
  51. package/services/codex-client.js +991 -0
  52. package/services/codex-client.js.map +1 -0
  53. package/services/openai-client.d.ts +46 -0
  54. package/services/openai-client.js +315 -0
  55. package/services/openai-client.js.map +1 -0
  56. package/util/tokenizer.d.ts +5 -0
  57. package/util/tokenizer.js +35 -0
  58. package/util/tokenizer.js.map +1 -0
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.recordCommunicationMetric = recordCommunicationMetric;
51
+ exports.recordEmailMetric = recordEmailMetric;
52
+ exports.recordTextMessageMetric = recordTextMessageMetric;
53
+ var communication_metric_collection_1 = require("../collections/communication-metric.collection");
54
+ var resolveio_server_app_1 = require("../resolveio-server-app");
55
+ var normalizeString = function (value) {
56
+ if (typeof value !== 'string') {
57
+ return undefined;
58
+ }
59
+ var trimmed = value.trim();
60
+ return trimmed.length ? trimmed : undefined;
61
+ };
62
+ var buildMetadata = function (input) {
63
+ var _a, _b;
64
+ var config = ((_a = resolveio_server_app_1.ResolveIOServer.getServerConfig) === null || _a === void 0 ? void 0 : _a.call(resolveio_server_app_1.ResolveIOServer)) || {};
65
+ var metadata = {
66
+ clientSlug: normalizeString(input.clientSlug) || normalizeString((_b = resolveio_server_app_1.ResolveIOServer.getClientName) === null || _b === void 0 ? void 0 : _b.call(resolveio_server_app_1.ResolveIOServer)),
67
+ clientName: normalizeString(input.clientName) || normalizeString(config['CLIENT_NAME']),
68
+ id_client: normalizeString(input.id_client),
69
+ channel: input.channel,
70
+ status: input.status,
71
+ provider: normalizeString(input.provider)
72
+ };
73
+ if (input.metadata && typeof input.metadata === 'object') {
74
+ Object.assign(metadata, input.metadata);
75
+ }
76
+ Object.keys(metadata).forEach(function (key) {
77
+ if (metadata[key] === undefined || metadata[key] === null || metadata[key] === '') {
78
+ delete metadata[key];
79
+ }
80
+ });
81
+ return Object.keys(metadata).length ? metadata : undefined;
82
+ };
83
+ function recordCommunicationMetric(input) {
84
+ return __awaiter(this, void 0, void 0, function () {
85
+ var value, payload, err_1;
86
+ return __generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0:
89
+ if (!input || !input.channel || !input.status) {
90
+ return [2 /*return*/];
91
+ }
92
+ value = Number.isFinite(input.value) ? input.value : 1;
93
+ if (!value) {
94
+ return [2 /*return*/];
95
+ }
96
+ payload = {
97
+ date: input.timestamp instanceof Date ? input.timestamp : new Date(),
98
+ type: "".concat(input.channel, ".").concat(input.status),
99
+ value: value,
100
+ unit: input.unit || 'count',
101
+ metadata: buildMetadata(input)
102
+ };
103
+ _a.label = 1;
104
+ case 1:
105
+ _a.trys.push([1, 3, , 4]);
106
+ return [4 /*yield*/, communication_metric_collection_1.CommunicationMetrics.insertOne(payload)];
107
+ case 2:
108
+ _a.sent();
109
+ return [3 /*break*/, 4];
110
+ case 3:
111
+ err_1 = _a.sent();
112
+ console.error('Failed to record communication metric', err_1);
113
+ return [3 /*break*/, 4];
114
+ case 4: return [2 /*return*/];
115
+ }
116
+ });
117
+ });
118
+ }
119
+ function recordEmailMetric(input) {
120
+ return __awaiter(this, void 0, void 0, function () {
121
+ return __generator(this, function (_a) {
122
+ return [2 /*return*/, recordCommunicationMetric(__assign(__assign({}, input), { channel: 'email' }))];
123
+ });
124
+ });
125
+ }
126
+ function recordTextMessageMetric(input) {
127
+ return __awaiter(this, void 0, void 0, function () {
128
+ return __generator(this, function (_a) {
129
+ return [2 /*return*/, recordCommunicationMetric(__assign(__assign({}, input), { channel: 'sms' }))];
130
+ });
131
+ });
132
+ }
133
+
134
+ //# sourceMappingURL=communication-metric.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/managers/communication-metric.manager.ts"],"names":[],"mappings":"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","file":"communication-metric.manager.js","sourcesContent":["import { CommunicationMetrics } from '../collections/communication-metric.collection';\nimport { CommunicationMetricChannel, CommunicationMetricStatus } from '../models/communication-metric.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport interface CommunicationMetricInput {\n\tchannel: CommunicationMetricChannel;\n\tstatus: CommunicationMetricStatus;\n\tvalue?: number;\n\tunit?: string;\n\ttimestamp?: Date;\n\tprovider?: string;\n\tclientSlug?: string;\n\tclientName?: string;\n\tid_client?: string;\n\tmetadata?: Record<string, any>;\n}\n\nconst normalizeString = (value: any): string | undefined => {\n\tif (typeof value !== 'string') {\n\t\treturn undefined;\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed.length ? trimmed : undefined;\n};\n\nconst buildMetadata = (input: CommunicationMetricInput): Record<string, any> | undefined => {\n\tconst config = ResolveIOServer.getServerConfig?.() || {};\n\tconst metadata: Record<string, any> = {\n\t\tclientSlug: normalizeString(input.clientSlug) || normalizeString(ResolveIOServer.getClientName?.()),\n\t\tclientName: normalizeString(input.clientName) || normalizeString(config['CLIENT_NAME']),\n\t\tid_client: normalizeString(input.id_client),\n\t\tchannel: input.channel,\n\t\tstatus: input.status,\n\t\tprovider: normalizeString(input.provider)\n\t};\n\n\tif (input.metadata && typeof input.metadata === 'object') {\n\t\tObject.assign(metadata, input.metadata);\n\t}\n\n\tObject.keys(metadata).forEach(key => {\n\t\tif (metadata[key] === undefined || metadata[key] === null || metadata[key] === '') {\n\t\t\tdelete metadata[key];\n\t\t}\n\t});\n\n\treturn Object.keys(metadata).length ? metadata : undefined;\n};\n\nexport async function recordCommunicationMetric(input: CommunicationMetricInput): Promise<void> {\n\tif (!input || !input.channel || !input.status) {\n\t\treturn;\n\t}\n\n\tconst value = Number.isFinite(input.value) ? input.value : 1;\n\tif (!value) {\n\t\treturn;\n\t}\n\n\tconst payload = {\n\t\tdate: input.timestamp instanceof Date ? input.timestamp : new Date(),\n\t\ttype: `${input.channel}.${input.status}`,\n\t\tvalue,\n\t\tunit: input.unit || 'count',\n\t\tmetadata: buildMetadata(input)\n\t};\n\n\ttry {\n\t\tawait CommunicationMetrics.insertOne(payload);\n\t}\n\tcatch (err) {\n\t\tconsole.error('Failed to record communication metric', err);\n\t}\n}\n\nexport async function recordEmailMetric(input: Omit<CommunicationMetricInput, 'channel'>): Promise<void> {\n\treturn recordCommunicationMetric({ ...input, channel: 'email' });\n}\n\nexport async function recordTextMessageMetric(input: Omit<CommunicationMetricInput, 'channel'>): Promise<void> {\n\treturn recordCommunicationMetric({ ...input, channel: 'sms' });\n}\n"]}
@@ -51,6 +51,8 @@ export declare class MethodManager {
51
51
  setupEmailWatcher(): void;
52
52
  loadPendingEmails(): Promise<void>;
53
53
  tryProcessEmail(): Promise<void>;
54
+ private shouldTrackTextMessageMetric;
55
+ private getTextMessageProvider;
54
56
  safeStringify(obj: any): string;
55
57
  getCircularReplacer(): (key: any, value: any) => any;
56
58
  private tryMergeEmailOccurrence;
@@ -96,6 +96,7 @@ var cron_jobs_1 = require("../fixtures/cron-jobs");
96
96
  var init_1 = require("../fixtures/init");
97
97
  var accounts_1 = require("../methods/accounts");
98
98
  var aws_1 = require("../methods/aws");
99
+ var ai_terminal_1 = require("../methods/ai-terminal");
99
100
  var collections_1 = require("../methods/collections");
100
101
  var counters_1 = require("../methods/counters");
101
102
  var cron_jobs_2 = require("../methods/cron-jobs");
@@ -111,6 +112,7 @@ var resolveio_server_app_1 = require("../resolveio-server-app");
111
112
  var common_1 = require("../util/common");
112
113
  var error_reporter_1 = require("../util/error-reporter");
113
114
  var error_tracking_1 = require("../util/error-tracking");
115
+ var communication_metric_manager_1 = require("./communication-metric.manager");
114
116
  function appendCorrelationIdToSubject(subject, correlationId) {
115
117
  if (!correlationId) {
116
118
  return subject;
@@ -335,6 +337,7 @@ var MethodManager = /** @class */ (function () {
335
337
  _a.sent();
336
338
  (0, accounts_1.loadAccountMethods)(this);
337
339
  (0, aws_1.loadAWSMethods)(this);
340
+ (0, ai_terminal_1.loadAiTerminalMethods)(this);
338
341
  (0, collections_1.loadCollectionMethods)(this);
339
342
  (0, counters_1.loadCounterMethods)(this);
340
343
  (0, logs_1.loadLogMethods)(this);
@@ -587,7 +590,7 @@ var MethodManager = /** @class */ (function () {
587
590
  };
588
591
  MethodManager.prototype.callMethodInternal = function (correlationId, methodName, methodData) {
589
592
  return __awaiter(this, void 0, void 0, function () {
590
- var method, releaseLocalConcurrency, methodCallback_1, functionMethodData_1, session, shouldStartTransaction, executeWithExistingSession_1, monitor_2;
593
+ var method, shouldTrackTextMetric, textMetricProvider, releaseLocalConcurrency, methodCallback_1, functionMethodData_1, session, shouldStartTransaction, executeWithExistingSession_1, monitor_2;
591
594
  var _this = this;
592
595
  return __generator(this, function (_a) {
593
596
  switch (_a.label) {
@@ -597,6 +600,8 @@ var MethodManager = /** @class */ (function () {
597
600
  console.log('No Method: ' + methodName);
598
601
  throw new Error("No Method: ".concat(methodName));
599
602
  }
603
+ shouldTrackTextMetric = this.shouldTrackTextMessageMetric(methodName);
604
+ textMetricProvider = shouldTrackTextMetric ? this.getTextMessageProvider() : undefined;
600
605
  return [4 /*yield*/, this.acquireLocalConcurrency(methodName, method.maxConcurrency)];
601
606
  case 1:
602
607
  releaseLocalConcurrency = _a.sent();
@@ -679,7 +684,7 @@ var MethodManager = /** @class */ (function () {
679
684
  !methodName.startsWith('monitor-') &&
680
685
  !methodName.startsWith('log');
681
686
  executeWithExistingSession_1 = function () { return __awaiter(_this, void 0, void 0, function () {
682
- var monitor, res, err_3, _a, normalizedError, resolvedCorrelationId;
687
+ var monitor, res, error_2, err_3, _a, normalizedError, resolvedCorrelationId, error_3;
683
688
  var _b;
684
689
  return __generator(this, function (_c) {
685
690
  switch (_c.label) {
@@ -687,15 +692,33 @@ var MethodManager = /** @class */ (function () {
687
692
  monitor = this._monitorManagerFunction.startMonitorFunction('Method', methodName, this['user'] || '', '', functionMethodData_1);
688
693
  _c.label = 1;
689
694
  case 1:
690
- _c.trys.push([1, 3, 7, 9]);
695
+ _c.trys.push([1, 7, 15, 17]);
691
696
  return [4 /*yield*/, (_b = method.function).call.apply(_b, __spreadArray([Object.assign({}, this, MethodManager.prototype)], __read(functionMethodData_1), false))];
692
697
  case 2:
693
698
  res = _c.sent();
694
699
  if (methodCallback_1) {
695
700
  methodCallback_1(null, res);
696
701
  }
697
- return [2 /*return*/, res];
702
+ if (!shouldTrackTextMetric) return [3 /*break*/, 6];
703
+ _c.label = 3;
698
704
  case 3:
705
+ _c.trys.push([3, 5, , 6]);
706
+ return [4 /*yield*/, (0, communication_metric_manager_1.recordTextMessageMetric)({
707
+ status: 'sent',
708
+ provider: textMetricProvider,
709
+ metadata: {
710
+ method: methodName
711
+ }
712
+ })];
713
+ case 4:
714
+ _c.sent();
715
+ return [3 /*break*/, 6];
716
+ case 5:
717
+ error_2 = _c.sent();
718
+ console.error('Error recording text message metric:', error_2);
719
+ return [3 /*break*/, 6];
720
+ case 6: return [2 /*return*/, res];
721
+ case 7:
699
722
  err_3 = _c.sent();
700
723
  if (err_3.code === 112 || err_3.codeName === 'WriteConflict' || err_3.code === 251 || err_3.codeName === 'NoSuchTransaction') {
701
724
  throw err_3; // Write error, retry
@@ -714,13 +737,32 @@ var MethodManager = /** @class */ (function () {
714
737
  data: methodData,
715
738
  error: normalizedError
716
739
  }, { context: 'callMethod-existing-session', methodName: methodName }, normalizedError.stack)];
717
- case 4:
740
+ case 8:
718
741
  _c.sent();
719
742
  normalizedError.message = "".concat(new Date().toISOString(), " - Error in Method (").concat(methodName, ") - Existing Session: ").concat(normalizedError.message);
720
743
  if (methodCallback_1) {
721
744
  methodCallback_1(normalizedError, null);
722
745
  }
723
- if (!!process.env.IS_WORKER_INSTANCE) return [3 /*break*/, 6];
746
+ if (!shouldTrackTextMetric) return [3 /*break*/, 12];
747
+ _c.label = 9;
748
+ case 9:
749
+ _c.trys.push([9, 11, , 12]);
750
+ return [4 /*yield*/, (0, communication_metric_manager_1.recordTextMessageMetric)({
751
+ status: 'failed',
752
+ provider: textMetricProvider,
753
+ metadata: {
754
+ method: methodName
755
+ }
756
+ })];
757
+ case 10:
758
+ _c.sent();
759
+ return [3 /*break*/, 12];
760
+ case 11:
761
+ error_3 = _c.sent();
762
+ console.error('Error recording text message metric:', error_3);
763
+ return [3 /*break*/, 12];
764
+ case 12:
765
+ if (!!process.env.IS_WORKER_INSTANCE) return [3 /*break*/, 14];
724
766
  return [4 /*yield*/, this.callMethod('insertErrorLog', "Error in Method: ".concat(methodName), {
725
767
  method: methodName,
726
768
  methodData: methodData,
@@ -732,22 +774,22 @@ var MethodManager = /** @class */ (function () {
732
774
  },
733
775
  correlationId: resolvedCorrelationId
734
776
  })];
735
- case 5:
777
+ case 13:
736
778
  _c.sent();
737
- _c.label = 6;
738
- case 6: throw normalizedError;
739
- case 7: return [4 /*yield*/, this._monitorManagerFunction.finishMonitorFunction(monitor)];
740
- case 8:
779
+ _c.label = 14;
780
+ case 14: throw normalizedError;
781
+ case 15: return [4 /*yield*/, this._monitorManagerFunction.finishMonitorFunction(monitor)];
782
+ case 16:
741
783
  _c.sent();
742
784
  return [7 /*endfinally*/];
743
- case 9: return [2 /*return*/];
785
+ case 17: return [2 /*return*/];
744
786
  }
745
787
  });
746
788
  }); };
747
789
  if (shouldStartTransaction) {
748
790
  monitor_2 = null;
749
791
  return [2 /*return*/, resolveio_server_app_1.ResolveIOServer.getMongoManager().oneTimeTransaction(function () { return __awaiter(_this, void 0, void 0, function () {
750
- var res, err_4, _a, normalizedError, resolvedCorrelationId;
792
+ var res, error_4, err_4, _a, normalizedError, resolvedCorrelationId, error_5;
751
793
  var _b;
752
794
  return __generator(this, function (_c) {
753
795
  switch (_c.label) {
@@ -756,15 +798,33 @@ var MethodManager = /** @class */ (function () {
756
798
  monitor_2 = this._monitorManagerFunction.startMonitorFunction('Method', methodName, this['user'] || '', '', functionMethodData_1);
757
799
  _c.label = 1;
758
800
  case 1:
759
- _c.trys.push([1, 3, 7, 9]);
801
+ _c.trys.push([1, 7, 15, 17]);
760
802
  return [4 /*yield*/, (_b = method.function).call.apply(_b, __spreadArray([Object.assign({}, this, MethodManager.prototype)], __read(functionMethodData_1), false))];
761
803
  case 2:
762
804
  res = _c.sent();
763
805
  if (methodCallback_1) {
764
806
  methodCallback_1(null, res);
765
807
  }
766
- return [2 /*return*/, res];
808
+ if (!shouldTrackTextMetric) return [3 /*break*/, 6];
809
+ _c.label = 3;
767
810
  case 3:
811
+ _c.trys.push([3, 5, , 6]);
812
+ return [4 /*yield*/, (0, communication_metric_manager_1.recordTextMessageMetric)({
813
+ status: 'sent',
814
+ provider: textMetricProvider,
815
+ metadata: {
816
+ method: methodName
817
+ }
818
+ })];
819
+ case 4:
820
+ _c.sent();
821
+ return [3 /*break*/, 6];
822
+ case 5:
823
+ error_4 = _c.sent();
824
+ console.error('Error recording text message metric:', error_4);
825
+ return [3 /*break*/, 6];
826
+ case 6: return [2 /*return*/, res];
827
+ case 7:
768
828
  err_4 = _c.sent();
769
829
  if (err_4.code === 112 || err_4.codeName === 'WriteConflict' || err_4.code === 251 || err_4.codeName === 'NoSuchTransaction') {
770
830
  throw err_4; // Write error, retry
@@ -783,13 +843,32 @@ var MethodManager = /** @class */ (function () {
783
843
  data: methodData,
784
844
  error: normalizedError
785
845
  }, { context: 'callMethod-new-session', methodName: methodName }, normalizedError.stack)];
786
- case 4:
846
+ case 8:
787
847
  _c.sent();
788
848
  normalizedError.message = "".concat(new Date().toISOString(), " - Error in Method With Session (").concat(methodName, ") - New Session: ").concat(normalizedError.message);
789
849
  if (methodCallback_1) {
790
850
  methodCallback_1(normalizedError, null);
791
851
  }
792
- if (!!process.env.IS_WORKER_INSTANCE) return [3 /*break*/, 6];
852
+ if (!shouldTrackTextMetric) return [3 /*break*/, 12];
853
+ _c.label = 9;
854
+ case 9:
855
+ _c.trys.push([9, 11, , 12]);
856
+ return [4 /*yield*/, (0, communication_metric_manager_1.recordTextMessageMetric)({
857
+ status: 'failed',
858
+ provider: textMetricProvider,
859
+ metadata: {
860
+ method: methodName
861
+ }
862
+ })];
863
+ case 10:
864
+ _c.sent();
865
+ return [3 /*break*/, 12];
866
+ case 11:
867
+ error_5 = _c.sent();
868
+ console.error('Error recording text message metric:', error_5);
869
+ return [3 /*break*/, 12];
870
+ case 12:
871
+ if (!!process.env.IS_WORKER_INSTANCE) return [3 /*break*/, 14];
793
872
  return [4 /*yield*/, this.callMethod('insertErrorLog', "Error in Method: ".concat(methodName), {
794
873
  method: methodName,
795
874
  methodData: methodData,
@@ -801,15 +880,15 @@ var MethodManager = /** @class */ (function () {
801
880
  },
802
881
  correlationId: resolvedCorrelationId
803
882
  })];
804
- case 5:
883
+ case 13:
805
884
  _c.sent();
806
- _c.label = 6;
807
- case 6: throw normalizedError;
808
- case 7: return [4 /*yield*/, this._monitorManagerFunction.finishMonitorFunction(monitor_2)];
809
- case 8:
885
+ _c.label = 14;
886
+ case 14: throw normalizedError;
887
+ case 15: return [4 /*yield*/, this._monitorManagerFunction.finishMonitorFunction(monitor_2)];
888
+ case 16:
810
889
  _c.sent();
811
890
  return [7 /*endfinally*/];
812
- case 9: return [2 /*return*/];
891
+ case 17: return [2 /*return*/];
813
892
  }
814
893
  });
815
894
  }); })];
@@ -971,7 +1050,7 @@ var MethodManager = /** @class */ (function () {
971
1050
  case 1:
972
1051
  _a.trys.push([1, 5, 6, 9]);
973
1052
  _loop_1 = function () {
974
- var emailId, pendingEmail, queuedAt, timeSinceQueued, remainingDelay, emailHistory, validAttachments, attachmentError, _b, _c, att, response, arrayBuffer, buffer, maxSize, err_6, e_2_1, mailOptions;
1053
+ var emailId, pendingEmail, queuedAt, timeSinceQueued, remainingDelay, emailHistory, validAttachments, attachmentError, _b, _c, att, response, arrayBuffer, buffer, maxSize, err_6, e_2_1, mailOptions, emailProvider;
975
1054
  var e_2, _d;
976
1055
  return __generator(this, function (_e) {
977
1056
  switch (_e.label) {
@@ -1126,14 +1205,17 @@ var MethodManager = /** @class */ (function () {
1126
1205
  return newAtt;
1127
1206
  });
1128
1207
  }
1129
- // Send the email
1208
+ emailProvider = (!mailOptions.force_ses && this_1._mailerCustom) ? 'custom' : 'ses';
1130
1209
  (!mailOptions.force_ses && this_1._mailerCustom ? this_1._mailerCustom : this_1._mailerSES).sendMail(mailOptions, function (err) { return __awaiter(_this, void 0, void 0, function () {
1131
- var error_2;
1210
+ var metricStatus, error_6, error_7;
1132
1211
  return __generator(this, function (_a) {
1133
1212
  switch (_a.label) {
1134
1213
  case 0:
1135
- _a.trys.push([0, 7, , 9]);
1136
- if (!err) return [3 /*break*/, 2];
1214
+ metricStatus = err ? 'failed' : 'sent';
1215
+ _a.label = 1;
1216
+ case 1:
1217
+ _a.trys.push([1, 8, 10, 14]);
1218
+ if (!err) return [3 /*break*/, 3];
1137
1219
  console.error('Failed to send email:', err);
1138
1220
  return [4 /*yield*/, email_history_collection_1.EmailHistories.updateOne({ _id: emailHistory._id }, {
1139
1221
  $set: {
@@ -1142,39 +1224,56 @@ var MethodManager = /** @class */ (function () {
1142
1224
  completedAt: new Date(),
1143
1225
  },
1144
1226
  })];
1145
- case 1:
1146
- _a.sent();
1147
- return [3 /*break*/, 6];
1148
1227
  case 2:
1149
- if (!(emailHistory.email === 'dev@resolveio.com')) return [3 /*break*/, 4];
1150
- return [4 /*yield*/, email_history_collection_1.EmailHistories.deleteOne({ _id: emailHistory._id })];
1228
+ _a.sent();
1229
+ return [3 /*break*/, 7];
1151
1230
  case 3:
1231
+ if (!(emailHistory.email === 'dev@resolveio.com')) return [3 /*break*/, 5];
1232
+ return [4 /*yield*/, email_history_collection_1.EmailHistories.deleteOne({ _id: emailHistory._id })];
1233
+ case 4:
1152
1234
  _a.sent();
1153
- return [3 /*break*/, 6];
1154
- case 4: return [4 /*yield*/, email_history_collection_1.EmailHistories.updateOne({ _id: emailHistory._id }, {
1235
+ return [3 /*break*/, 7];
1236
+ case 5: return [4 /*yield*/, email_history_collection_1.EmailHistories.updateOne({ _id: emailHistory._id }, {
1155
1237
  $set: {
1156
1238
  status: 'completed',
1157
1239
  completedAt: new Date(),
1158
1240
  },
1159
1241
  })];
1160
- case 5:
1242
+ case 6:
1161
1243
  _a.sent();
1162
- _a.label = 6;
1163
- case 6: return [3 /*break*/, 9];
1164
- case 7:
1165
- error_2 = _a.sent();
1166
- console.error('Error in sendMail callback:', error_2);
1244
+ _a.label = 7;
1245
+ case 7: return [3 /*break*/, 14];
1246
+ case 8:
1247
+ error_6 = _a.sent();
1248
+ console.error('Error in sendMail callback:', error_6);
1167
1249
  return [4 /*yield*/, email_history_collection_1.EmailHistories.updateOne({ _id: emailHistory._id }, {
1168
1250
  $set: {
1169
1251
  status: 'failed',
1170
- error: typeof error_2 === 'string' ? error_2 : this.safeStringify(error_2),
1252
+ error: typeof error_6 === 'string' ? error_6 : this.safeStringify(error_6),
1171
1253
  completedAt: new Date(),
1172
1254
  },
1173
1255
  })];
1174
- case 8:
1256
+ case 9:
1257
+ _a.sent();
1258
+ return [3 /*break*/, 14];
1259
+ case 10:
1260
+ _a.trys.push([10, 12, , 13]);
1261
+ return [4 /*yield*/, (0, communication_metric_manager_1.recordEmailMetric)({
1262
+ status: metricStatus,
1263
+ provider: emailProvider,
1264
+ metadata: {
1265
+ method: 'sendEmail'
1266
+ }
1267
+ })];
1268
+ case 11:
1175
1269
  _a.sent();
1176
- return [3 /*break*/, 9];
1177
- case 9: return [2 /*return*/];
1270
+ return [3 /*break*/, 13];
1271
+ case 12:
1272
+ error_7 = _a.sent();
1273
+ console.error('Error recording email metric:', error_7);
1274
+ return [3 /*break*/, 13];
1275
+ case 13: return [7 /*endfinally*/];
1276
+ case 14: return [2 /*return*/];
1178
1277
  }
1179
1278
  });
1180
1279
  }); });
@@ -1215,6 +1314,24 @@ var MethodManager = /** @class */ (function () {
1215
1314
  });
1216
1315
  });
1217
1316
  };
1317
+ MethodManager.prototype.shouldTrackTextMessageMetric = function (methodName) {
1318
+ var normalized = String(methodName || '').trim().toLowerCase();
1319
+ if (!normalized) {
1320
+ return false;
1321
+ }
1322
+ return normalized.startsWith('sendsms') || normalized.startsWith('sendtext');
1323
+ };
1324
+ MethodManager.prototype.getTextMessageProvider = function () {
1325
+ var _a, _b, _c;
1326
+ var provider = ((_a = this.serverConfig) === null || _a === void 0 ? void 0 : _a['SMS_PROVIDER']) || '';
1327
+ if (typeof provider === 'string' && provider.trim().length) {
1328
+ return provider.trim().toLowerCase();
1329
+ }
1330
+ if (((_b = this.serverConfig) === null || _b === void 0 ? void 0 : _b['TWILIO_SID']) || ((_c = this.serverConfig) === null || _c === void 0 ? void 0 : _c['TWILIO_AUTH_TOKEN'])) {
1331
+ return 'twilio';
1332
+ }
1333
+ return undefined;
1334
+ };
1218
1335
  MethodManager.prototype.safeStringify = function (obj) {
1219
1336
  try {
1220
1337
  return JSON.stringify(obj, this.getCircularReplacer());