@resolveio/server-lib 22.3.123 → 22.3.125

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 (34) hide show
  1. package/collections/ai-run.collection.d.ts +3 -0
  2. package/collections/ai-run.collection.js +170 -0
  3. package/collections/ai-run.collection.js.map +1 -0
  4. package/managers/ai-run-evidence.manager.d.ts +36 -0
  5. package/managers/ai-run-evidence.manager.js +377 -0
  6. package/managers/ai-run-evidence.manager.js.map +1 -0
  7. package/managers/openai-usage-ledger.manager.d.ts +1 -0
  8. package/managers/openai-usage-ledger.manager.js +5 -56
  9. package/managers/openai-usage-ledger.manager.js.map +1 -1
  10. package/models/ai-run.model.d.ts +19 -0
  11. package/models/ai-run.model.js +4 -0
  12. package/models/ai-run.model.js.map +1 -0
  13. package/package.json +3 -1
  14. package/public_api.d.ts +7 -0
  15. package/public_api.js +7 -0
  16. package/public_api.js.map +1 -1
  17. package/util/ai-run-evidence-adapters.d.ts +33 -0
  18. package/util/ai-run-evidence-adapters.js +660 -0
  19. package/util/ai-run-evidence-adapters.js.map +1 -0
  20. package/util/ai-run-evidence-dashboard.d.ts +67 -0
  21. package/util/ai-run-evidence-dashboard.js +309 -0
  22. package/util/ai-run-evidence-dashboard.js.map +1 -0
  23. package/util/ai-run-evidence-eval.d.ts +86 -0
  24. package/util/ai-run-evidence-eval.js +854 -0
  25. package/util/ai-run-evidence-eval.js.map +1 -0
  26. package/util/ai-run-evidence.d.ts +212 -0
  27. package/util/ai-run-evidence.js +649 -0
  28. package/util/ai-run-evidence.js.map +1 -0
  29. package/util/ai-runner-qa-tools.d.ts +1 -0
  30. package/util/ai-runner-qa-tools.js +150 -16
  31. package/util/ai-runner-qa-tools.js.map +1 -1
  32. package/util/openai-usage-cost.d.ts +6 -0
  33. package/util/openai-usage-cost.js +92 -0
  34. package/util/openai-usage-cost.js.map +1 -0
@@ -0,0 +1,3 @@
1
+ import { AIRunModel } from '../models/ai-run.model';
2
+ export declare const AIRuns: import("../managers/mongo.manager").MongoManagerCollection<AIRunModel> | import("../managers/mongo.manager").MongoManagerUserCollection<AIRunModel>;
3
+ export declare const AIRunVersions: import("../managers/mongo.manager").MongoManagerCollection<AIRunModel> | import("../managers/mongo.manager").MongoManagerUserCollection<AIRunModel>;
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.AIRunVersions = exports.AIRuns = void 0;
40
+ var mongo_manager_1 = require("../managers/mongo.manager");
41
+ var schema = {
42
+ _id: {
43
+ type: String,
44
+ optional: true
45
+ },
46
+ __v: {
47
+ type: Number,
48
+ optional: true
49
+ },
50
+ createdAt: {
51
+ type: Date,
52
+ optional: true
53
+ },
54
+ updatedAt: {
55
+ type: Date,
56
+ optional: true
57
+ },
58
+ source: {
59
+ type: String
60
+ },
61
+ sourceIds: {
62
+ type: Object,
63
+ blackbox: true
64
+ },
65
+ title: {
66
+ type: String,
67
+ optional: true
68
+ },
69
+ status: {
70
+ type: String,
71
+ optional: true
72
+ },
73
+ phase: {
74
+ type: String,
75
+ optional: true
76
+ },
77
+ startedAt: {
78
+ type: Date,
79
+ optional: true
80
+ },
81
+ completedAt: {
82
+ type: Date,
83
+ optional: true
84
+ },
85
+ outcome: {
86
+ type: String
87
+ },
88
+ events: {
89
+ type: Array,
90
+ optional: true
91
+ },
92
+ 'events.$': {
93
+ type: Object,
94
+ blackbox: true
95
+ },
96
+ gates: {
97
+ type: Array,
98
+ optional: true
99
+ },
100
+ 'gates.$': {
101
+ type: Object,
102
+ blackbox: true
103
+ },
104
+ qa: {
105
+ type: Object,
106
+ optional: true,
107
+ blackbox: true
108
+ },
109
+ cost: {
110
+ type: Object,
111
+ optional: true,
112
+ blackbox: true
113
+ },
114
+ nextAction: {
115
+ type: String,
116
+ optional: true
117
+ },
118
+ warnings: {
119
+ type: Array,
120
+ optional: true
121
+ },
122
+ 'warnings.$': {
123
+ type: String
124
+ },
125
+ metadata: {
126
+ type: Object,
127
+ optional: true,
128
+ blackbox: true
129
+ }
130
+ };
131
+ var model = mongo_manager_1.MongoManagerModel.create({
132
+ collectionName: 'ai-runs',
133
+ schema: schema,
134
+ useVersionCollection: true,
135
+ useReportBuilder: false,
136
+ reportBuilderLookupTables: [],
137
+ timestamps: true,
138
+ createLogs: true,
139
+ checkSchema: true,
140
+ collectionOptions: null
141
+ });
142
+ exports.AIRuns = model.collection_main;
143
+ exports.AIRunVersions = model.collection_version;
144
+ setTimeout(function () { return __awaiter(void 0, void 0, void 0, function () {
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0: return [4 /*yield*/, exports.AIRuns.createIndex({ source: 1, outcome: 1, updatedAt: -1 })];
148
+ case 1:
149
+ _a.sent();
150
+ return [4 /*yield*/, exports.AIRuns.createIndex({ 'sourceIds.ticketNumber': 1, updatedAt: -1 })];
151
+ case 2:
152
+ _a.sent();
153
+ return [4 /*yield*/, exports.AIRuns.createIndex({ 'sourceIds.ticketId': 1, updatedAt: -1 })];
154
+ case 3:
155
+ _a.sent();
156
+ return [4 /*yield*/, exports.AIRuns.createIndex({ 'sourceIds.appId': 1, updatedAt: -1 })];
157
+ case 4:
158
+ _a.sent();
159
+ return [4 /*yield*/, exports.AIRuns.createIndex({ 'sourceIds.jobId': 1, updatedAt: -1 })];
160
+ case 5:
161
+ _a.sent();
162
+ return [4 /*yield*/, exports.AIRuns.createIndex({ 'sourceIds.conversationId': 1, updatedAt: -1 })];
163
+ case 6:
164
+ _a.sent();
165
+ return [2 /*return*/];
166
+ }
167
+ });
168
+ }); }, 5000);
169
+
170
+ //# sourceMappingURL=ai-run.collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collections/ai-run.collection.ts"],"names":[],"mappings":"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","file":"ai-run.collection.js","sourcesContent":["import { MongoManagerModel } from '../managers/mongo.manager';\nimport { AIRunModel } from '../models/ai-run.model';\n\nconst schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tsource: {\n\t\ttype: String\n\t},\n\tsourceIds: {\n\t\ttype: Object,\n\t\tblackbox: true\n\t},\n\ttitle: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tstatus: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tphase: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tstartedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tcompletedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\toutcome: {\n\t\ttype: String\n\t},\n\tevents: {\n\t\ttype: Array,\n\t\toptional: true\n\t},\n\t'events.$': {\n\t\ttype: Object,\n\t\tblackbox: true\n\t},\n\tgates: {\n\t\ttype: Array,\n\t\toptional: true\n\t},\n\t'gates.$': {\n\t\ttype: Object,\n\t\tblackbox: true\n\t},\n\tqa: {\n\t\ttype: Object,\n\t\toptional: true,\n\t\tblackbox: true\n\t},\n\tcost: {\n\t\ttype: Object,\n\t\toptional: true,\n\t\tblackbox: true\n\t},\n\tnextAction: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\twarnings: {\n\t\ttype: Array,\n\t\toptional: true\n\t},\n\t'warnings.$': {\n\t\ttype: String\n\t},\n\tmetadata: {\n\t\ttype: Object,\n\t\toptional: true,\n\t\tblackbox: true\n\t}\n};\n\nconst model = MongoManagerModel.create<AIRunModel>({\n\tcollectionName: 'ai-runs',\n\tschema,\n\tuseVersionCollection: true,\n\tuseReportBuilder: false,\n\treportBuilderLookupTables: [],\n\ttimestamps: true,\n\tcreateLogs: true,\n\tcheckSchema: true,\n\tcollectionOptions: null\n});\n\nexport const AIRuns = model.collection_main;\nexport const AIRunVersions = model.collection_version;\n\nsetTimeout(async () => {\n\tawait AIRuns.createIndex({ source: 1, outcome: 1, updatedAt: -1 });\n\tawait AIRuns.createIndex({ 'sourceIds.ticketNumber': 1, updatedAt: -1 });\n\tawait AIRuns.createIndex({ 'sourceIds.ticketId': 1, updatedAt: -1 });\n\tawait AIRuns.createIndex({ 'sourceIds.appId': 1, updatedAt: -1 });\n\tawait AIRuns.createIndex({ 'sourceIds.jobId': 1, updatedAt: -1 });\n\tawait AIRuns.createIndex({ 'sourceIds.conversationId': 1, updatedAt: -1 });\n}, 5000);\n"]}
@@ -0,0 +1,36 @@
1
+ import { AIRunModel } from '../models/ai-run.model';
2
+ import { AIRun, AIRunOutcomeLabel, AIRunSource } from '../util/ai-run-evidence';
3
+ import { AIRunDatasetExport, AIRunDatasetExportOptions } from '../util/ai-run-evidence-eval';
4
+ export interface AIRunPersistenceResult {
5
+ requested: number;
6
+ upsertedCount: number;
7
+ matchedCount: number;
8
+ modifiedCount: number;
9
+ ids: string[];
10
+ }
11
+ export interface AIRunQuery {
12
+ source?: AIRunSource;
13
+ outcome?: AIRunOutcomeLabel;
14
+ sourceIds?: Record<string, string>;
15
+ updatedAfter?: Date | string;
16
+ updatedBefore?: Date | string;
17
+ limit?: number;
18
+ skip?: number;
19
+ includeTrainingExamples?: boolean;
20
+ }
21
+ export interface AIRunSummary {
22
+ total: number;
23
+ bySource: Record<string, number>;
24
+ byOutcome: Record<string, number>;
25
+ byFailureClass: Record<string, number>;
26
+ estimatedUsd: number;
27
+ totalTokens: number;
28
+ }
29
+ export declare function resolveAIRunStableId(run: AIRun): string;
30
+ export declare function normalizeAIRunForPersistence(run: AIRun): AIRunModel;
31
+ export declare class AIRunEvidenceManager {
32
+ static upsertRuns(runs: AIRun[]): Promise<AIRunPersistenceResult>;
33
+ static findRuns(query?: AIRunQuery): Promise<AIRunModel[]>;
34
+ static summarizeRuns(query?: AIRunQuery): Promise<AIRunSummary>;
35
+ static exportRuns(query?: AIRunQuery, options?: AIRunDatasetExportOptions): Promise<AIRunDatasetExport>;
36
+ }
@@ -0,0 +1,377 @@
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
+ var __rest = (this && this.__rest) || function (s, e) {
50
+ var t = {};
51
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
+ t[p] = s[p];
53
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
+ t[p[i]] = s[p[i]];
57
+ }
58
+ return t;
59
+ };
60
+ var __values = (this && this.__values) || function(o) {
61
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
62
+ if (m) return m.call(o);
63
+ if (o && typeof o.length === "number") return {
64
+ next: function () {
65
+ if (o && i >= o.length) o = void 0;
66
+ return { value: o && o[i++], done: !o };
67
+ }
68
+ };
69
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
70
+ };
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ exports.AIRunEvidenceManager = void 0;
73
+ exports.resolveAIRunStableId = resolveAIRunStableId;
74
+ exports.normalizeAIRunForPersistence = normalizeAIRunForPersistence;
75
+ var crypto_1 = require("crypto");
76
+ var ai_run_collection_1 = require("../collections/ai-run.collection");
77
+ var common_1 = require("../util/common");
78
+ var ai_run_evidence_eval_1 = require("../util/ai-run-evidence-eval");
79
+ function cleanText(value, max) {
80
+ if (max === void 0) { max = 1000; }
81
+ return String(value || '').replace(/\s+/g, ' ').trim().slice(0, max);
82
+ }
83
+ function safeKey(value) {
84
+ var cleaned = cleanText(value, 300).toLowerCase().replace(/[^a-z0-9_.:-]+/g, '-').replace(/^-+|-+$/g, '');
85
+ return cleaned || (0, crypto_1.createHash)('sha1').update(value || (0, common_1.objectIdHexString)()).digest('hex').slice(0, 24);
86
+ }
87
+ function normalizeDate(value) {
88
+ if (value instanceof Date && Number.isFinite(value.getTime())) {
89
+ return value;
90
+ }
91
+ if (value) {
92
+ var parsed = new Date(value);
93
+ if (Number.isFinite(parsed.getTime())) {
94
+ return parsed;
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ function countBy(values) {
100
+ var e_1, _a;
101
+ var result = {};
102
+ try {
103
+ for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
104
+ var value = values_1_1.value;
105
+ result[value] = (result[value] || 0) + 1;
106
+ }
107
+ }
108
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
109
+ finally {
110
+ try {
111
+ if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
112
+ }
113
+ finally { if (e_1) throw e_1.error; }
114
+ }
115
+ return result;
116
+ }
117
+ function stripUndefined(value) {
118
+ var e_2, _a;
119
+ var next = {};
120
+ try {
121
+ for (var _b = __values(Object.keys(value)), _c = _b.next(); !_c.done; _c = _b.next()) {
122
+ var key = _c.value;
123
+ if (value[key] !== undefined) {
124
+ next[key] = value[key];
125
+ }
126
+ }
127
+ }
128
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
129
+ finally {
130
+ try {
131
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
132
+ }
133
+ finally { if (e_2) throw e_2.error; }
134
+ }
135
+ return next;
136
+ }
137
+ function resolveSourceKey(run) {
138
+ var e_3, _a, e_4, _b;
139
+ var sourceIds = run.sourceIds || {};
140
+ var priorityKeys = [
141
+ 'ticketNumber',
142
+ 'ticketId',
143
+ 'appId',
144
+ 'jobId',
145
+ 'conversationId',
146
+ 'domain',
147
+ 'userId'
148
+ ];
149
+ try {
150
+ for (var priorityKeys_1 = __values(priorityKeys), priorityKeys_1_1 = priorityKeys_1.next(); !priorityKeys_1_1.done; priorityKeys_1_1 = priorityKeys_1.next()) {
151
+ var key = priorityKeys_1_1.value;
152
+ if (sourceIds[key]) {
153
+ return "".concat(key, ":").concat(sourceIds[key]);
154
+ }
155
+ }
156
+ }
157
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
158
+ finally {
159
+ try {
160
+ if (priorityKeys_1_1 && !priorityKeys_1_1.done && (_a = priorityKeys_1.return)) _a.call(priorityKeys_1);
161
+ }
162
+ finally { if (e_3) throw e_3.error; }
163
+ }
164
+ var sortedSourceIds = {};
165
+ try {
166
+ for (var _c = __values(Object.keys(sourceIds).sort()), _d = _c.next(); !_d.done; _d = _c.next()) {
167
+ var key = _d.value;
168
+ var value = cleanText(sourceIds[key], 300);
169
+ if (value) {
170
+ sortedSourceIds[key] = value;
171
+ }
172
+ }
173
+ }
174
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
175
+ finally {
176
+ try {
177
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
178
+ }
179
+ finally { if (e_4) throw e_4.error; }
180
+ }
181
+ if (Object.keys(sortedSourceIds).length) {
182
+ return JSON.stringify(sortedSourceIds);
183
+ }
184
+ return [
185
+ run.title || '',
186
+ run.status || '',
187
+ run.phase || '',
188
+ run.startedAt || '',
189
+ run.completedAt || ''
190
+ ].join('|');
191
+ }
192
+ function resolveAIRunStableId(run) {
193
+ if (run.id) {
194
+ return cleanText(run.id, 240);
195
+ }
196
+ var source = cleanText(run.source, 80) || 'unknown';
197
+ var sourceKey = resolveSourceKey(run);
198
+ var compactSourceKey = safeKey(sourceKey);
199
+ if (compactSourceKey.length <= 160) {
200
+ return "ai-run:".concat(source, ":").concat(compactSourceKey);
201
+ }
202
+ var digest = (0, crypto_1.createHash)('sha1').update("".concat(source, ":").concat(sourceKey)).digest('hex').slice(0, 32);
203
+ return "ai-run:".concat(source, ":").concat(digest);
204
+ }
205
+ function normalizeAIRunForPersistence(run) {
206
+ var _id = resolveAIRunStableId(run);
207
+ return stripUndefined({
208
+ _id: _id,
209
+ source: run.source || 'unknown',
210
+ sourceIds: run.sourceIds || {},
211
+ title: cleanText(run.title, 500),
212
+ status: cleanText(run.status, 160),
213
+ phase: cleanText(run.phase, 160),
214
+ startedAt: normalizeDate(run.startedAt),
215
+ completedAt: normalizeDate(run.completedAt),
216
+ outcome: run.outcome || 'unknown',
217
+ events: Array.isArray(run.events) ? run.events : [],
218
+ gates: Array.isArray(run.gates) ? run.gates : [],
219
+ qa: run.qa,
220
+ cost: run.cost,
221
+ nextAction: cleanText(run.nextAction, 2000),
222
+ warnings: Array.isArray(run.warnings) ? run.warnings.map(function (warning) { return cleanText(warning, 300); }).filter(Boolean) : [],
223
+ metadata: __assign(__assign({}, (run.metadata || {})), { failureClass: (0, ai_run_evidence_eval_1.classifyAIRunFailureClass)(run), sourceRunId: run.id || '' })
224
+ });
225
+ }
226
+ function buildAIRunFindQuery(query) {
227
+ var e_5, _a;
228
+ var _b;
229
+ if (query === void 0) { query = {}; }
230
+ var selector = {};
231
+ if (query.source) {
232
+ selector.source = query.source;
233
+ }
234
+ if (query.outcome) {
235
+ selector.outcome = query.outcome;
236
+ }
237
+ try {
238
+ for (var _c = __values(Object.keys(query.sourceIds || {})), _d = _c.next(); !_d.done; _d = _c.next()) {
239
+ var key = _d.value;
240
+ var value = cleanText((_b = query.sourceIds) === null || _b === void 0 ? void 0 : _b[key], 300);
241
+ if (value) {
242
+ selector["sourceIds.".concat(key)] = value;
243
+ }
244
+ }
245
+ }
246
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
247
+ finally {
248
+ try {
249
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
250
+ }
251
+ finally { if (e_5) throw e_5.error; }
252
+ }
253
+ var updatedAt = {};
254
+ var updatedAfter = normalizeDate(query.updatedAfter);
255
+ var updatedBefore = normalizeDate(query.updatedBefore);
256
+ if (updatedAfter) {
257
+ updatedAt.$gte = updatedAfter;
258
+ }
259
+ if (updatedBefore) {
260
+ updatedAt.$lte = updatedBefore;
261
+ }
262
+ if (Object.keys(updatedAt).length) {
263
+ selector.updatedAt = updatedAt;
264
+ }
265
+ return selector;
266
+ }
267
+ var AIRunEvidenceManager = /** @class */ (function () {
268
+ function AIRunEvidenceManager() {
269
+ }
270
+ AIRunEvidenceManager.upsertRuns = function (runs) {
271
+ return __awaiter(this, void 0, void 0, function () {
272
+ var docs, operations, result;
273
+ return __generator(this, function (_a) {
274
+ switch (_a.label) {
275
+ case 0:
276
+ docs = runs.map(function (run) { return normalizeAIRunForPersistence(run); });
277
+ operations = docs.map(function (doc) {
278
+ var _id = doc._id, createdAt = doc.createdAt, setDoc = __rest(doc, ["_id", "createdAt"]);
279
+ return {
280
+ updateOne: {
281
+ filter: { _id: _id },
282
+ update: {
283
+ $set: __assign(__assign({}, setDoc), { updatedAt: new Date() }),
284
+ $setOnInsert: {
285
+ _id: _id,
286
+ createdAt: createdAt || new Date()
287
+ }
288
+ },
289
+ upsert: true
290
+ }
291
+ };
292
+ });
293
+ if (!operations.length) {
294
+ return [2 /*return*/, {
295
+ requested: 0,
296
+ upsertedCount: 0,
297
+ matchedCount: 0,
298
+ modifiedCount: 0,
299
+ ids: []
300
+ }];
301
+ }
302
+ return [4 /*yield*/, ai_run_collection_1.AIRuns.bulkWrite(operations, { ordered: false }, false, true, true)];
303
+ case 1:
304
+ result = _a.sent();
305
+ return [2 /*return*/, {
306
+ requested: docs.length,
307
+ upsertedCount: Number((result === null || result === void 0 ? void 0 : result.upsertedCount) || 0),
308
+ matchedCount: Number((result === null || result === void 0 ? void 0 : result.matchedCount) || 0),
309
+ modifiedCount: Number((result === null || result === void 0 ? void 0 : result.modifiedCount) || 0),
310
+ ids: docs.map(function (doc) { return String(doc._id || ''); }).filter(Boolean)
311
+ }];
312
+ }
313
+ });
314
+ });
315
+ };
316
+ AIRunEvidenceManager.findRuns = function () {
317
+ return __awaiter(this, arguments, void 0, function (query) {
318
+ var limit, skip;
319
+ if (query === void 0) { query = {}; }
320
+ return __generator(this, function (_a) {
321
+ switch (_a.label) {
322
+ case 0:
323
+ limit = Math.min(Math.max(Number(query.limit || 100), 1), 1000);
324
+ skip = Math.max(Number(query.skip || 0), 0);
325
+ return [4 /*yield*/, ai_run_collection_1.AIRuns.find(buildAIRunFindQuery(query), {
326
+ sort: { updatedAt: -1 },
327
+ limit: limit,
328
+ skip: skip
329
+ })];
330
+ case 1: return [2 /*return*/, _a.sent()];
331
+ }
332
+ });
333
+ });
334
+ };
335
+ AIRunEvidenceManager.summarizeRuns = function () {
336
+ return __awaiter(this, arguments, void 0, function (query) {
337
+ var runs, estimatedUsd, totalTokens;
338
+ if (query === void 0) { query = {}; }
339
+ return __generator(this, function (_a) {
340
+ switch (_a.label) {
341
+ case 0: return [4 /*yield*/, this.findRuns(__assign(__assign({}, query), { limit: Math.min(Math.max(Number(query.limit || 1000), 1), 5000) }))];
342
+ case 1:
343
+ runs = _a.sent();
344
+ estimatedUsd = runs.reduce(function (sum, run) { var _a; return sum + (Number((_a = run.cost) === null || _a === void 0 ? void 0 : _a.estimatedUsd) || 0); }, 0);
345
+ totalTokens = runs.reduce(function (sum, run) { var _a; return sum + (Number((_a = run.cost) === null || _a === void 0 ? void 0 : _a.totalTokens) || 0); }, 0);
346
+ return [2 /*return*/, {
347
+ total: runs.length,
348
+ bySource: countBy(runs.map(function (run) { return run.source || 'unknown'; })),
349
+ byOutcome: countBy(runs.map(function (run) { return run.outcome || 'unknown'; })),
350
+ byFailureClass: countBy(runs.map(function (run) { var _a; return String(((_a = run.metadata) === null || _a === void 0 ? void 0 : _a.failureClass) || 'unknown'); })),
351
+ estimatedUsd: Number(estimatedUsd.toFixed(6)),
352
+ totalTokens: totalTokens
353
+ }];
354
+ }
355
+ });
356
+ });
357
+ };
358
+ AIRunEvidenceManager.exportRuns = function () {
359
+ return __awaiter(this, arguments, void 0, function (query, options) {
360
+ var runs;
361
+ if (query === void 0) { query = {}; }
362
+ if (options === void 0) { options = {}; }
363
+ return __generator(this, function (_a) {
364
+ switch (_a.label) {
365
+ case 0: return [4 /*yield*/, this.findRuns(__assign(__assign({}, query), { limit: Math.min(Math.max(Number(query.limit || 1000), 1), 5000) }))];
366
+ case 1:
367
+ runs = _a.sent();
368
+ return [2 /*return*/, (0, ai_run_evidence_eval_1.buildAIRunDatasetExport)(runs, options)];
369
+ }
370
+ });
371
+ });
372
+ };
373
+ return AIRunEvidenceManager;
374
+ }());
375
+ exports.AIRunEvidenceManager = AIRunEvidenceManager;
376
+
377
+ //# sourceMappingURL=ai-run-evidence.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/managers/ai-run-evidence.manager.ts"],"names":[],"mappings":"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","file":"ai-run-evidence.manager.js","sourcesContent":["import { createHash } from 'crypto';\nimport { AIRuns } from '../collections/ai-run.collection';\nimport { AIRunModel } from '../models/ai-run.model';\nimport { objectIdHexString } from '../util/common';\nimport {\n\tAIRun,\n\tAIRunOutcomeLabel,\n\tAIRunSource\n} from '../util/ai-run-evidence';\nimport {\n\tAIRunDatasetExport,\n\tAIRunDatasetExportOptions,\n\tbuildAIRunDatasetExport,\n\tclassifyAIRunFailureClass\n} from '../util/ai-run-evidence-eval';\n\nexport interface AIRunPersistenceResult {\n\trequested: number;\n\tupsertedCount: number;\n\tmatchedCount: number;\n\tmodifiedCount: number;\n\tids: string[];\n}\n\nexport interface AIRunQuery {\n\tsource?: AIRunSource;\n\toutcome?: AIRunOutcomeLabel;\n\tsourceIds?: Record<string, string>;\n\tupdatedAfter?: Date | string;\n\tupdatedBefore?: Date | string;\n\tlimit?: number;\n\tskip?: number;\n\tincludeTrainingExamples?: boolean;\n}\n\nexport interface AIRunSummary {\n\ttotal: number;\n\tbySource: Record<string, number>;\n\tbyOutcome: Record<string, number>;\n\tbyFailureClass: Record<string, number>;\n\testimatedUsd: number;\n\ttotalTokens: number;\n}\n\nfunction cleanText(value: any, max = 1000): string {\n\treturn String(value || '').replace(/\\s+/g, ' ').trim().slice(0, max);\n}\n\nfunction safeKey(value: string): string {\n\tconst cleaned = cleanText(value, 300).toLowerCase().replace(/[^a-z0-9_.:-]+/g, '-').replace(/^-+|-+$/g, '');\n\treturn cleaned || createHash('sha1').update(value || objectIdHexString()).digest('hex').slice(0, 24);\n}\n\nfunction normalizeDate(value: any): Date | undefined {\n\tif (value instanceof Date && Number.isFinite(value.getTime())) {\n\t\treturn value;\n\t}\n\tif (value) {\n\t\tconst parsed = new Date(value);\n\t\tif (Number.isFinite(parsed.getTime())) {\n\t\t\treturn parsed;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n\tconst result: Record<string, number> = {};\n\tfor (const value of values) {\n\t\tresult[value] = (result[value] || 0) + 1;\n\t}\n\treturn result;\n}\n\nfunction stripUndefined<T extends Record<string, any>>(value: T): T {\n\tconst next: Record<string, any> = {};\n\tfor (const key of Object.keys(value)) {\n\t\tif (value[key] !== undefined) {\n\t\t\tnext[key] = value[key];\n\t\t}\n\t}\n\treturn next as T;\n}\n\nfunction resolveSourceKey(run: AIRun): string {\n\tconst sourceIds = run.sourceIds || {};\n\tconst priorityKeys = [\n\t\t'ticketNumber',\n\t\t'ticketId',\n\t\t'appId',\n\t\t'jobId',\n\t\t'conversationId',\n\t\t'domain',\n\t\t'userId'\n\t];\n\tfor (const key of priorityKeys) {\n\t\tif (sourceIds[key]) {\n\t\t\treturn `${key}:${sourceIds[key]}`;\n\t\t}\n\t}\n\tconst sortedSourceIds: Record<string, string> = {};\n\tfor (const key of Object.keys(sourceIds).sort()) {\n\t\tconst value = cleanText(sourceIds[key], 300);\n\t\tif (value) {\n\t\t\tsortedSourceIds[key] = value;\n\t\t}\n\t}\n\tif (Object.keys(sortedSourceIds).length) {\n\t\treturn JSON.stringify(sortedSourceIds);\n\t}\n\treturn [\n\t\trun.title || '',\n\t\trun.status || '',\n\t\trun.phase || '',\n\t\trun.startedAt || '',\n\t\trun.completedAt || ''\n\t].join('|');\n}\n\nexport function resolveAIRunStableId(run: AIRun): string {\n\tif (run.id) {\n\t\treturn cleanText(run.id, 240);\n\t}\n\tconst source = cleanText(run.source, 80) || 'unknown';\n\tconst sourceKey = resolveSourceKey(run);\n\tconst compactSourceKey = safeKey(sourceKey);\n\tif (compactSourceKey.length <= 160) {\n\t\treturn `ai-run:${source}:${compactSourceKey}`;\n\t}\n\tconst digest = createHash('sha1').update(`${source}:${sourceKey}`).digest('hex').slice(0, 32);\n\treturn `ai-run:${source}:${digest}`;\n}\n\nexport function normalizeAIRunForPersistence(run: AIRun): AIRunModel {\n\tconst _id = resolveAIRunStableId(run);\n\treturn stripUndefined({\n\t\t_id,\n\t\tsource: run.source || 'unknown',\n\t\tsourceIds: run.sourceIds || {},\n\t\ttitle: cleanText(run.title, 500),\n\t\tstatus: cleanText(run.status, 160),\n\t\tphase: cleanText(run.phase, 160),\n\t\tstartedAt: normalizeDate(run.startedAt),\n\t\tcompletedAt: normalizeDate(run.completedAt),\n\t\toutcome: run.outcome || 'unknown',\n\t\tevents: Array.isArray(run.events) ? run.events : [],\n\t\tgates: Array.isArray(run.gates) ? run.gates : [],\n\t\tqa: run.qa,\n\t\tcost: run.cost,\n\t\tnextAction: cleanText(run.nextAction, 2000),\n\t\twarnings: Array.isArray(run.warnings) ? run.warnings.map((warning) => cleanText(warning, 300)).filter(Boolean) : [],\n\t\tmetadata: {\n\t\t\t...(run.metadata || {}),\n\t\t\tfailureClass: classifyAIRunFailureClass(run),\n\t\t\tsourceRunId: run.id || ''\n\t\t}\n\t});\n}\n\nfunction buildAIRunFindQuery(query: AIRunQuery = {}): Record<string, any> {\n\tconst selector: Record<string, any> = {};\n\tif (query.source) {\n\t\tselector.source = query.source;\n\t}\n\tif (query.outcome) {\n\t\tselector.outcome = query.outcome;\n\t}\n\tfor (const key of Object.keys(query.sourceIds || {})) {\n\t\tconst value = cleanText(query.sourceIds?.[key], 300);\n\t\tif (value) {\n\t\t\tselector[`sourceIds.${key}`] = value;\n\t\t}\n\t}\n\tconst updatedAt: Record<string, Date> = {};\n\tconst updatedAfter = normalizeDate(query.updatedAfter);\n\tconst updatedBefore = normalizeDate(query.updatedBefore);\n\tif (updatedAfter) {\n\t\tupdatedAt.$gte = updatedAfter;\n\t}\n\tif (updatedBefore) {\n\t\tupdatedAt.$lte = updatedBefore;\n\t}\n\tif (Object.keys(updatedAt).length) {\n\t\tselector.updatedAt = updatedAt;\n\t}\n\treturn selector;\n}\n\nexport class AIRunEvidenceManager {\n\tstatic async upsertRuns(runs: AIRun[]): Promise<AIRunPersistenceResult> {\n\t\tconst docs = runs.map((run) => normalizeAIRunForPersistence(run));\n\t\tconst operations = docs.map((doc) => {\n\t\t\tconst { _id, createdAt, ...setDoc } = doc;\n\t\t\treturn {\n\t\t\t\tupdateOne: {\n\t\t\t\t\tfilter: { _id },\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t...setDoc,\n\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$setOnInsert: {\n\t\t\t\t\t\t\t_id,\n\t\t\t\t\t\t\tcreatedAt: createdAt || new Date()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tupsert: true\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t\tif (!operations.length) {\n\t\t\treturn {\n\t\t\t\trequested: 0,\n\t\t\t\tupsertedCount: 0,\n\t\t\t\tmatchedCount: 0,\n\t\t\t\tmodifiedCount: 0,\n\t\t\t\tids: []\n\t\t\t};\n\t\t}\n\t\tconst result = await AIRuns.bulkWrite(operations, { ordered: false }, false, true, true);\n\t\treturn {\n\t\t\trequested: docs.length,\n\t\t\tupsertedCount: Number(result?.upsertedCount || 0),\n\t\t\tmatchedCount: Number(result?.matchedCount || 0),\n\t\t\tmodifiedCount: Number(result?.modifiedCount || 0),\n\t\t\tids: docs.map((doc) => String(doc._id || '')).filter(Boolean)\n\t\t};\n\t}\n\n\tstatic async findRuns(query: AIRunQuery = {}): Promise<AIRunModel[]> {\n\t\tconst limit = Math.min(Math.max(Number(query.limit || 100), 1), 1000);\n\t\tconst skip = Math.max(Number(query.skip || 0), 0);\n\t\treturn await AIRuns.find(buildAIRunFindQuery(query), {\n\t\t\tsort: { updatedAt: -1 },\n\t\t\tlimit,\n\t\t\tskip\n\t\t});\n\t}\n\n\tstatic async summarizeRuns(query: AIRunQuery = {}): Promise<AIRunSummary> {\n\t\tconst runs = await this.findRuns({\n\t\t\t...query,\n\t\t\tlimit: Math.min(Math.max(Number(query.limit || 1000), 1), 5000)\n\t\t});\n\t\tconst estimatedUsd = runs.reduce((sum, run) => sum + (Number(run.cost?.estimatedUsd) || 0), 0);\n\t\tconst totalTokens = runs.reduce((sum, run) => sum + (Number(run.cost?.totalTokens) || 0), 0);\n\t\treturn {\n\t\t\ttotal: runs.length,\n\t\t\tbySource: countBy(runs.map((run) => run.source || 'unknown')),\n\t\t\tbyOutcome: countBy(runs.map((run) => run.outcome || 'unknown')),\n\t\t\tbyFailureClass: countBy(runs.map((run) => String(run.metadata?.failureClass || 'unknown'))),\n\t\t\testimatedUsd: Number(estimatedUsd.toFixed(6)),\n\t\t\ttotalTokens\n\t\t};\n\t}\n\n\tstatic async exportRuns(query: AIRunQuery = {}, options: AIRunDatasetExportOptions = {}): Promise<AIRunDatasetExport> {\n\t\tconst runs = await this.findRuns({\n\t\t\t...query,\n\t\t\tlimit: Math.min(Math.max(Number(query.limit || 1000), 1), 5000)\n\t\t});\n\t\treturn buildAIRunDatasetExport(runs as AIRun[], options);\n\t}\n}\n"]}
@@ -1,3 +1,4 @@
1
+ export { estimateOpenAIUsageCost, OpenAIUsagePricingConfig } from '../util/openai-usage-cost';
1
2
  export interface OpenAIUsageRecordInput {
2
3
  id_client?: string;
3
4
  model: string;