@resolveio/server-lib 22.3.24 → 22.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "22.3.24",
3
+ "version": "22.3.25",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
package/public_api.d.ts CHANGED
@@ -91,4 +91,5 @@ export * from './services/codex-client';
91
91
  export * from './util/common';
92
92
  export * from './util/customer-portal-password';
93
93
  export * from './util/ai-qa-policy';
94
+ export * from './util/ai-runner-artifacts';
94
95
  export * from './util/tokenizer';
package/public_api.js CHANGED
@@ -107,6 +107,7 @@ __exportStar(require("./services/codex-client"), exports);
107
107
  __exportStar(require("./util/common"), exports);
108
108
  __exportStar(require("./util/customer-portal-password"), exports);
109
109
  __exportStar(require("./util/ai-qa-policy"), exports);
110
+ __exportStar(require("./util/ai-runner-artifacts"), exports);
110
111
  __exportStar(require("./util/tokenizer"), exports);
111
112
 
112
113
  //# sourceMappingURL=public_api.js.map
package/public_api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/public_api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,uEAAqD;AACrD,uEAAqD;AACrD,8EAA4D;AAC5D,qFAAmE;AACnE,oFAAkE;AAClE,oFAAkE;AAClE,+EAA6D;AAC7D,mEAAiD;AACjD,oFAAkE;AAClE,iFAA+D;AAC/D,gFAA8D;AAC9D,4EAA0D;AAC1D,oEAAkD;AAClD,yEAAuD;AACvD,0EAAwD;AACxD,gEAA8C;AAC9C,uEAAqD;AACrD,gEAA8C;AAC9C,8EAA4D;AAC5D,4EAA0D;AAC1D,+DAA6C;AAC7C,2EAAyD;AACzD,uEAAqD;AACrD,4EAA0D;AAC1D,0EAAwD;AACxD,yEAAuD;AACvD,wEAAsD;AACtD,+EAA6D;AAC7D,kFAAgE;AAChE,iFAA+D;AAC/D,sEAAoD;AACpD,sEAAoD;AACpD,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAClD,gFAA8D;AAC9D,yEAAuD;AACvD,gEAA8C;AAC9C,mFAAiE;AACjE,0EAAwD;AACxD,4DAA0C;AAC1C,6DAA2C;AAC3C,0EAAwD;AACxD,0EAAwD;AACxD,qEAAmD;AACnD,yEAAuD;AACvD,qEAAmD;AACnD,sEAAoD;AACpD,yDAAuC;AACvC,0EAAwD;AACxD,uEAAqD;AACrD,kEAAgD;AAChD,0DAAwC;AACxC,wDAAsC;AACtC,+DAA6C;AAC7C,gEAA8C;AAC9C,sDAAoC;AACpC,6DAA2C;AAC3C,sDAAoC;AACpC,oEAAkD;AAClD,kEAAgD;AAChD,qDAAmC;AACnC,iEAA+C;AAC/C,iEAA+C;AAC/C,wDAAsC;AACtC,6DAA2C;AAC3C,gEAA8C;AAC9C,+DAA6C;AAC7C,8DAA4C;AAC5C,qEAAmD;AACnD,4DAA0C;AAC1C,4DAA0C;AAC1C,wEAAsD;AACtD,uEAAqD;AACrD,gEAA8C;AAC9C,mEAAiD;AACjD,gEAA8C;AAC9C,8DAA4C;AAC5C,gEAA8C;AAC9C,4DAA0C;AAC1C,4DAA0C;AAC1C,sDAAoC;AACpC,uDAAqC;AACrC,4DAA0C;AAC1C,yEAAuD;AACvD,0EAAwD;AACxD,yDAAuC;AACvC,2DAAyC;AACzC,0DAAwC;AACxC,gDAA8B;AAC9B,kEAAgD;AAChD,sDAAoC;AACpC,mDAAiC","file":"public_api.js","sourcesContent":["export * from './collections/app-status.collection';\nexport * from './collections/app-setting.collection';\nexport * from './ai/resolveio-platform-intelligence';\nexport * from './ai/resolveio-platform-intelligence-memory';\nexport * from './ai/resolveio-platform-intelligence-memory-corpus';\nexport * from './collections/ai-terminal-issue-report.collection';\nexport * from './collections/ai-terminal-conversation.collection';\nexport * from './collections/ai-terminal-message.collection';\nexport * from './collections/counter.collection';\nexport * from './collections/customer-portal-password.collection';\nexport * from './collections/customer-notification.collection';\nexport * from './collections/communication-metric.collection';\nexport * from './collections/cron-job-history.collection';\nexport * from './collections/cron-job.collection';\nexport * from './collections/email-history.collection';\nexport * from './collections/email-verified.collection';\nexport * from './collections/file.collection';\nexport * from './collections/flag-update.collection';\nexport * from './collections/flag.collection';\nexport * from './collections/log-method-latency.collection';\nexport * from './collections/log-subscription.collection';\nexport * from './collections/log.collection';\nexport * from './collections/logged-in-users.collection';\nexport * from './collections/monitor-cpu.collection';\nexport * from './collections/monitor-function.collection';\nexport * from './collections/monitor-memory.collection';\nexport * from './collections/monitor-mongo.collection';\nexport * from './collections/notification.collection';\nexport * from './collections/openai-usage-ledger.collection';\nexport * from './collections/report-builder-library.collection';\nexport * from './collections/report-builder-report.collection';\nexport * from './collections/user-group.collection';\nexport * from './collections/user-guide.collection';\nexport * from './collections/user.collection';\nexport * from './managers/mongo.manager';\nexport * from './managers/error-auto-fix.manager';\nexport * from './managers/ai-assistant-codex-manager.manager';\nexport * from './managers/slow-query-verifier.manager';\nexport * from './managers/slow-query.manager';\nexport * from './managers/customer-notification-content.manager';\nexport * from './managers/diagnostic-manager-bootstrap';\nexport * from './models/app-status.model';\nexport * from './models/app-setting.model';\nexport * from './models/ai-terminal-issue-report.model';\nexport * from './models/ai-terminal-conversation.model';\nexport * from './models/ai-terminal-message.model';\nexport * from './models/billing-logged-in-users.model';\nexport * from './models/collection-document.model';\nexport * from './models/communication-metric.model';\nexport * from './models/counter.model';\nexport * from './models/customer-portal-password.model';\nexport * from './models/customer-notification.model';\nexport * from './models/cron-job-history.model';\nexport * from './models/cron-job.model';\nexport * from './models/dialog.model';\nexport * from './models/email-history.model';\nexport * from './models/email-verified.model';\nexport * from './models/file.model';\nexport * from './models/flag-update.model';\nexport * from './models/flag.model';\nexport * from './models/log-method-latency.model';\nexport * from './models/log-subscription.model';\nexport * from './models/log.model';\nexport * from './models/logged-in-users.model';\nexport * from './models/method-response.model';\nexport * from './models/method.model';\nexport * from './models/monitor-cpu.model';\nexport * from './models/monitor-memory.model';\nexport * from './models/monitor-mongo.model';\nexport * from './models/notification.model';\nexport * from './models/openai-usage-ledger.model';\nexport * from './models/pagination.model';\nexport * from './models/permission.model';\nexport * from './models/report-builder-library.model';\nexport * from './models/report-builder-report.model';\nexport * from './models/report-builder.model';\nexport * from './models/select-data-label.model';\nexport * from './models/server-message.model';\nexport * from './models/subscription.model';\nexport * from './models/support-ticket.model';\nexport * from './models/user-group.model';\nexport * from './models/user-guide.model';\nexport * from './models/user.model';\nexport * from './types/error-report';\nexport * from './types/slow-query-report';\nexport * from './managers/openai-usage-ledger.manager';\nexport * from './managers/communication-metric.manager';\nexport * from './resolveio-server-app';\nexport * from './services/openai-client';\nexport * from './services/codex-client';\nexport * from './util/common';\nexport * from './util/customer-portal-password';\nexport * from './util/ai-qa-policy';\nexport * from './util/tokenizer';\n"]}
1
+ {"version":3,"sources":["../../src/public_api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,uEAAqD;AACrD,uEAAqD;AACrD,8EAA4D;AAC5D,qFAAmE;AACnE,oFAAkE;AAClE,oFAAkE;AAClE,+EAA6D;AAC7D,mEAAiD;AACjD,oFAAkE;AAClE,iFAA+D;AAC/D,gFAA8D;AAC9D,4EAA0D;AAC1D,oEAAkD;AAClD,yEAAuD;AACvD,0EAAwD;AACxD,gEAA8C;AAC9C,uEAAqD;AACrD,gEAA8C;AAC9C,8EAA4D;AAC5D,4EAA0D;AAC1D,+DAA6C;AAC7C,2EAAyD;AACzD,uEAAqD;AACrD,4EAA0D;AAC1D,0EAAwD;AACxD,yEAAuD;AACvD,wEAAsD;AACtD,+EAA6D;AAC7D,kFAAgE;AAChE,iFAA+D;AAC/D,sEAAoD;AACpD,sEAAoD;AACpD,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAClD,gFAA8D;AAC9D,yEAAuD;AACvD,gEAA8C;AAC9C,mFAAiE;AACjE,0EAAwD;AACxD,4DAA0C;AAC1C,6DAA2C;AAC3C,0EAAwD;AACxD,0EAAwD;AACxD,qEAAmD;AACnD,yEAAuD;AACvD,qEAAmD;AACnD,sEAAoD;AACpD,yDAAuC;AACvC,0EAAwD;AACxD,uEAAqD;AACrD,kEAAgD;AAChD,0DAAwC;AACxC,wDAAsC;AACtC,+DAA6C;AAC7C,gEAA8C;AAC9C,sDAAoC;AACpC,6DAA2C;AAC3C,sDAAoC;AACpC,oEAAkD;AAClD,kEAAgD;AAChD,qDAAmC;AACnC,iEAA+C;AAC/C,iEAA+C;AAC/C,wDAAsC;AACtC,6DAA2C;AAC3C,gEAA8C;AAC9C,+DAA6C;AAC7C,8DAA4C;AAC5C,qEAAmD;AACnD,4DAA0C;AAC1C,4DAA0C;AAC1C,wEAAsD;AACtD,uEAAqD;AACrD,gEAA8C;AAC9C,mEAAiD;AACjD,gEAA8C;AAC9C,8DAA4C;AAC5C,gEAA8C;AAC9C,4DAA0C;AAC1C,4DAA0C;AAC1C,sDAAoC;AACpC,uDAAqC;AACrC,4DAA0C;AAC1C,yEAAuD;AACvD,0EAAwD;AACxD,yDAAuC;AACvC,2DAAyC;AACzC,0DAAwC;AACxC,gDAA8B;AAC9B,kEAAgD;AAChD,sDAAoC;AACpC,6DAA2C;AAC3C,mDAAiC","file":"public_api.js","sourcesContent":["export * from './collections/app-status.collection';\nexport * from './collections/app-setting.collection';\nexport * from './ai/resolveio-platform-intelligence';\nexport * from './ai/resolveio-platform-intelligence-memory';\nexport * from './ai/resolveio-platform-intelligence-memory-corpus';\nexport * from './collections/ai-terminal-issue-report.collection';\nexport * from './collections/ai-terminal-conversation.collection';\nexport * from './collections/ai-terminal-message.collection';\nexport * from './collections/counter.collection';\nexport * from './collections/customer-portal-password.collection';\nexport * from './collections/customer-notification.collection';\nexport * from './collections/communication-metric.collection';\nexport * from './collections/cron-job-history.collection';\nexport * from './collections/cron-job.collection';\nexport * from './collections/email-history.collection';\nexport * from './collections/email-verified.collection';\nexport * from './collections/file.collection';\nexport * from './collections/flag-update.collection';\nexport * from './collections/flag.collection';\nexport * from './collections/log-method-latency.collection';\nexport * from './collections/log-subscription.collection';\nexport * from './collections/log.collection';\nexport * from './collections/logged-in-users.collection';\nexport * from './collections/monitor-cpu.collection';\nexport * from './collections/monitor-function.collection';\nexport * from './collections/monitor-memory.collection';\nexport * from './collections/monitor-mongo.collection';\nexport * from './collections/notification.collection';\nexport * from './collections/openai-usage-ledger.collection';\nexport * from './collections/report-builder-library.collection';\nexport * from './collections/report-builder-report.collection';\nexport * from './collections/user-group.collection';\nexport * from './collections/user-guide.collection';\nexport * from './collections/user.collection';\nexport * from './managers/mongo.manager';\nexport * from './managers/error-auto-fix.manager';\nexport * from './managers/ai-assistant-codex-manager.manager';\nexport * from './managers/slow-query-verifier.manager';\nexport * from './managers/slow-query.manager';\nexport * from './managers/customer-notification-content.manager';\nexport * from './managers/diagnostic-manager-bootstrap';\nexport * from './models/app-status.model';\nexport * from './models/app-setting.model';\nexport * from './models/ai-terminal-issue-report.model';\nexport * from './models/ai-terminal-conversation.model';\nexport * from './models/ai-terminal-message.model';\nexport * from './models/billing-logged-in-users.model';\nexport * from './models/collection-document.model';\nexport * from './models/communication-metric.model';\nexport * from './models/counter.model';\nexport * from './models/customer-portal-password.model';\nexport * from './models/customer-notification.model';\nexport * from './models/cron-job-history.model';\nexport * from './models/cron-job.model';\nexport * from './models/dialog.model';\nexport * from './models/email-history.model';\nexport * from './models/email-verified.model';\nexport * from './models/file.model';\nexport * from './models/flag-update.model';\nexport * from './models/flag.model';\nexport * from './models/log-method-latency.model';\nexport * from './models/log-subscription.model';\nexport * from './models/log.model';\nexport * from './models/logged-in-users.model';\nexport * from './models/method-response.model';\nexport * from './models/method.model';\nexport * from './models/monitor-cpu.model';\nexport * from './models/monitor-memory.model';\nexport * from './models/monitor-mongo.model';\nexport * from './models/notification.model';\nexport * from './models/openai-usage-ledger.model';\nexport * from './models/pagination.model';\nexport * from './models/permission.model';\nexport * from './models/report-builder-library.model';\nexport * from './models/report-builder-report.model';\nexport * from './models/report-builder.model';\nexport * from './models/select-data-label.model';\nexport * from './models/server-message.model';\nexport * from './models/subscription.model';\nexport * from './models/support-ticket.model';\nexport * from './models/user-group.model';\nexport * from './models/user-guide.model';\nexport * from './models/user.model';\nexport * from './types/error-report';\nexport * from './types/slow-query-report';\nexport * from './managers/openai-usage-ledger.manager';\nexport * from './managers/communication-metric.manager';\nexport * from './resolveio-server-app';\nexport * from './services/openai-client';\nexport * from './services/codex-client';\nexport * from './util/common';\nexport * from './util/customer-portal-password';\nexport * from './util/ai-qa-policy';\nexport * from './util/ai-runner-artifacts';\nexport * from './util/tokenizer';\n"]}
@@ -0,0 +1,71 @@
1
+ export interface ResolveIORunnerEvidenceAttachment {
2
+ filename: string;
3
+ path: string;
4
+ contentType?: string;
5
+ cid?: string;
6
+ file_id?: string;
7
+ key?: string;
8
+ content_hash?: string;
9
+ ticket_url?: string;
10
+ uploaded_to_support_ticket?: boolean;
11
+ upload_error?: string;
12
+ }
13
+ export interface ResolveIORunnerPersistedEvidenceFile {
14
+ file_id: string;
15
+ filename: string;
16
+ key?: string;
17
+ contentType?: string;
18
+ content_hash?: string;
19
+ ticket_url?: string;
20
+ }
21
+ export interface ResolveIORunnerEvidenceUploadInput {
22
+ filename: string;
23
+ filePath: string;
24
+ contentType: string;
25
+ size: number;
26
+ contentBuffer: Buffer;
27
+ contentHash: string;
28
+ }
29
+ export interface ResolveIORunnerEvidenceUploadResult {
30
+ file_id?: string;
31
+ id_file?: string;
32
+ _id?: string;
33
+ key?: string;
34
+ name?: string;
35
+ filename?: string;
36
+ }
37
+ export interface ResolveIORunnerPersistEvidenceOptions {
38
+ attachments?: ResolveIORunnerEvidenceAttachment[];
39
+ evidence?: any;
40
+ job?: any;
41
+ ticket?: any;
42
+ ticketUrl?: string;
43
+ roots?: string[];
44
+ previousFiles?: any[];
45
+ existingFileIds?: any[];
46
+ maxFiles?: number;
47
+ uploadFile: any;
48
+ }
49
+ export interface ResolveIORunnerPersistEvidenceResult {
50
+ attachments: ResolveIORunnerEvidenceAttachment[];
51
+ fileIds: string[];
52
+ files: ResolveIORunnerPersistedEvidenceFile[];
53
+ errors: string[];
54
+ }
55
+ export declare function inferResolveIORunnerEvidenceContentType(fileName: string): string;
56
+ export declare function buildResolveIORunnerEvidenceCid(filePath: string): string;
57
+ export declare function normalizeResolveIORunnerPersistedEvidenceFiles(value: any): ResolveIORunnerPersistedEvidenceFile[];
58
+ export declare function mergeResolveIORunnerEvidenceFileIds(...values: any[]): string[];
59
+ export declare function collectResolveIORunnerEvidenceArtifactPaths(input?: {
60
+ evidence?: any;
61
+ job?: any;
62
+ roots?: string[];
63
+ maxFiles?: number;
64
+ }): string[];
65
+ export declare function toResolveIORunnerEvidenceAttachments(input?: {
66
+ evidence?: any;
67
+ job?: any;
68
+ roots?: string[];
69
+ maxFiles?: number;
70
+ }): ResolveIORunnerEvidenceAttachment[];
71
+ export declare function persistResolveIORunnerEvidenceArtifacts(options: ResolveIORunnerPersistEvidenceOptions): Promise<ResolveIORunnerPersistEvidenceResult>;
@@ -0,0 +1,493 @@
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 __values = (this && this.__values) || function(o) {
50
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
51
+ if (m) return m.call(o);
52
+ if (o && typeof o.length === "number") return {
53
+ next: function () {
54
+ if (o && i >= o.length) o = void 0;
55
+ return { value: o && o[i++], done: !o };
56
+ }
57
+ };
58
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
59
+ };
60
+ var __read = (this && this.__read) || function (o, n) {
61
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
62
+ if (!m) return o;
63
+ var i = m.call(o), r, ar = [], e;
64
+ try {
65
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
66
+ }
67
+ catch (error) { e = { error: error }; }
68
+ finally {
69
+ try {
70
+ if (r && !r.done && (m = i["return"])) m.call(i);
71
+ }
72
+ finally { if (e) throw e.error; }
73
+ }
74
+ return ar;
75
+ };
76
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
77
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
78
+ if (ar || !(i in from)) {
79
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
80
+ ar[i] = from[i];
81
+ }
82
+ }
83
+ return to.concat(ar || Array.prototype.slice.call(from));
84
+ };
85
+ Object.defineProperty(exports, "__esModule", { value: true });
86
+ exports.inferResolveIORunnerEvidenceContentType = inferResolveIORunnerEvidenceContentType;
87
+ exports.buildResolveIORunnerEvidenceCid = buildResolveIORunnerEvidenceCid;
88
+ exports.normalizeResolveIORunnerPersistedEvidenceFiles = normalizeResolveIORunnerPersistedEvidenceFiles;
89
+ exports.mergeResolveIORunnerEvidenceFileIds = mergeResolveIORunnerEvidenceFileIds;
90
+ exports.collectResolveIORunnerEvidenceArtifactPaths = collectResolveIORunnerEvidenceArtifactPaths;
91
+ exports.toResolveIORunnerEvidenceAttachments = toResolveIORunnerEvidenceAttachments;
92
+ exports.persistResolveIORunnerEvidenceArtifacts = persistResolveIORunnerEvidenceArtifacts;
93
+ var node_crypto_1 = require("node:crypto");
94
+ var fs = require("fs");
95
+ var path = require("path");
96
+ function inferResolveIORunnerEvidenceContentType(fileName) {
97
+ var normalized = String(fileName || '').trim().toLowerCase();
98
+ if (normalized.endsWith('.png')) {
99
+ return 'image/png';
100
+ }
101
+ if (normalized.endsWith('.jpg') || normalized.endsWith('.jpeg')) {
102
+ return 'image/jpeg';
103
+ }
104
+ if (normalized.endsWith('.webp')) {
105
+ return 'image/webp';
106
+ }
107
+ if (normalized.endsWith('.zip')) {
108
+ return 'application/zip';
109
+ }
110
+ if (normalized.endsWith('.json')) {
111
+ return 'application/json';
112
+ }
113
+ if (normalized.endsWith('.txt') || normalized.endsWith('.log')) {
114
+ return 'text/plain; charset=utf-8';
115
+ }
116
+ return 'application/octet-stream';
117
+ }
118
+ function buildResolveIORunnerEvidenceCid(filePath) {
119
+ var baseName = path.basename(String(filePath || '').trim()) || 'runner-artifact';
120
+ var normalized = baseName
121
+ .toLowerCase()
122
+ .replace(/[^a-z0-9._-]+/g, '-')
123
+ .replace(/^-+|-+$/g, '')
124
+ .slice(0, 80) || 'runner-artifact';
125
+ var digest = (0, node_crypto_1.createHash)('sha1').update(String(filePath || '')).digest('hex').slice(0, 12);
126
+ return "".concat(normalized, "-").concat(digest, "@resolveio-runner");
127
+ }
128
+ function normalizeResolveIORunnerPersistedEvidenceFiles(value) {
129
+ if (!Array.isArray(value)) {
130
+ return [];
131
+ }
132
+ return value
133
+ .map(function (item) {
134
+ var fileId = String((item === null || item === void 0 ? void 0 : item.file_id) || (item === null || item === void 0 ? void 0 : item.id_file) || (item === null || item === void 0 ? void 0 : item._id) || '').trim();
135
+ if (!fileId) {
136
+ return null;
137
+ }
138
+ return {
139
+ file_id: fileId,
140
+ filename: String((item === null || item === void 0 ? void 0 : item.filename) || (item === null || item === void 0 ? void 0 : item.name) || '').trim(),
141
+ key: String((item === null || item === void 0 ? void 0 : item.key) || '').trim() || undefined,
142
+ contentType: String((item === null || item === void 0 ? void 0 : item.contentType) || (item === null || item === void 0 ? void 0 : item.content_type) || '').trim() || undefined,
143
+ content_hash: String((item === null || item === void 0 ? void 0 : item.content_hash) || (item === null || item === void 0 ? void 0 : item.hash) || '').trim() || undefined,
144
+ ticket_url: String((item === null || item === void 0 ? void 0 : item.ticket_url) || '').trim() || undefined
145
+ };
146
+ })
147
+ .filter(function (item) { return !!item; });
148
+ }
149
+ function mergeResolveIORunnerEvidenceFileIds() {
150
+ var values = [];
151
+ for (var _i = 0; _i < arguments.length; _i++) {
152
+ values[_i] = arguments[_i];
153
+ }
154
+ var ids = [];
155
+ var seen = new Set();
156
+ var push = function (value) {
157
+ if (Array.isArray(value)) {
158
+ value.forEach(push);
159
+ return;
160
+ }
161
+ var id = String((value === null || value === void 0 ? void 0 : value.file_id) || (value === null || value === void 0 ? void 0 : value.id_file) || (value === null || value === void 0 ? void 0 : value._id) || value || '').trim();
162
+ if (!id || seen.has(id)) {
163
+ return;
164
+ }
165
+ seen.add(id);
166
+ ids.push(id);
167
+ };
168
+ values.forEach(push);
169
+ return ids;
170
+ }
171
+ function collectResolveIORunnerEvidenceText(value, output) {
172
+ if (value === null || value === undefined) {
173
+ return;
174
+ }
175
+ if (typeof value === 'string') {
176
+ output.push(value);
177
+ return;
178
+ }
179
+ if (Array.isArray(value)) {
180
+ value.forEach(function (entry) { return collectResolveIORunnerEvidenceText(entry, output); });
181
+ return;
182
+ }
183
+ if (typeof value === 'object') {
184
+ Object.values(value).forEach(function (entry) { return collectResolveIORunnerEvidenceText(entry, output); });
185
+ }
186
+ }
187
+ function normalizeArtifactCandidatePath(value) {
188
+ return String(value || '')
189
+ .trim()
190
+ .replace(/[),.;:'"]+$/g, '')
191
+ .replace(/\\/g, '/');
192
+ }
193
+ function pathExists(filePath) {
194
+ try {
195
+ return !!filePath && fs.existsSync(filePath) && fs.statSync(filePath).isFile();
196
+ }
197
+ catch (_a) {
198
+ return false;
199
+ }
200
+ }
201
+ function resolveArtifactCandidate(candidate, roots) {
202
+ var e_1, _a;
203
+ var normalized = normalizeArtifactCandidatePath(candidate);
204
+ if (!normalized) {
205
+ return '';
206
+ }
207
+ if (path.isAbsolute(normalized)) {
208
+ return pathExists(normalized) ? normalized : '';
209
+ }
210
+ try {
211
+ for (var roots_1 = __values(roots), roots_1_1 = roots_1.next(); !roots_1_1.done; roots_1_1 = roots_1.next()) {
212
+ var root = roots_1_1.value;
213
+ var normalizedRoot = String(root || '').trim();
214
+ if (!normalizedRoot) {
215
+ continue;
216
+ }
217
+ var resolved = path.resolve(normalizedRoot, normalized);
218
+ if (pathExists(resolved)) {
219
+ return resolved;
220
+ }
221
+ }
222
+ }
223
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
224
+ finally {
225
+ try {
226
+ if (roots_1_1 && !roots_1_1.done && (_a = roots_1.return)) _a.call(roots_1);
227
+ }
228
+ finally { if (e_1) throw e_1.error; }
229
+ }
230
+ return '';
231
+ }
232
+ function collectResolveIORunnerEvidenceArtifactPaths(input) {
233
+ var e_2, _a, e_3, _b, e_4, _c, e_5, _d, e_6, _e;
234
+ var _f, _g, _h, _j;
235
+ if (input === void 0) { input = {}; }
236
+ var values = [];
237
+ collectResolveIORunnerEvidenceText(input.evidence, values);
238
+ var job = input.job || {};
239
+ collectResolveIORunnerEvidenceText(job.responseSummary, values);
240
+ collectResolveIORunnerEvidenceText(job.lastVerificationSummary, values);
241
+ collectResolveIORunnerEvidenceText(job.lastRerunReason, values);
242
+ collectResolveIORunnerEvidenceText((_f = job.artifacts) === null || _f === void 0 ? void 0 : _f.agentNotes, values);
243
+ collectResolveIORunnerEvidenceText((_g = job.artifacts) === null || _g === void 0 ? void 0 : _g.supportArtifacts, values);
244
+ collectResolveIORunnerEvidenceText((_h = job.artifacts) === null || _h === void 0 ? void 0 : _h.qaArtifacts, values);
245
+ collectResolveIORunnerEvidenceText((_j = job.artifacts) === null || _j === void 0 ? void 0 : _j.qa_artifacts, values);
246
+ collectResolveIORunnerEvidenceText(job.qa_artifacts, values);
247
+ collectResolveIORunnerEvidenceText(job.supportQaArtifacts, values);
248
+ collectResolveIORunnerEvidenceText(job.runnerEvidenceArtifacts, values);
249
+ if (Array.isArray(job.tasks)) {
250
+ try {
251
+ for (var _k = __values(job.tasks), _l = _k.next(); !_l.done; _l = _k.next()) {
252
+ var task = _l.value;
253
+ collectResolveIORunnerEvidenceText(task === null || task === void 0 ? void 0 : task.title, values);
254
+ collectResolveIORunnerEvidenceText(task === null || task === void 0 ? void 0 : task.notes, values);
255
+ collectResolveIORunnerEvidenceText(task === null || task === void 0 ? void 0 : task.artifacts, values);
256
+ collectResolveIORunnerEvidenceText(task === null || task === void 0 ? void 0 : task.evidence, values);
257
+ }
258
+ }
259
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
260
+ finally {
261
+ try {
262
+ if (_l && !_l.done && (_a = _k.return)) _a.call(_k);
263
+ }
264
+ finally { if (e_2) throw e_2.error; }
265
+ }
266
+ }
267
+ if (Array.isArray(job.log)) {
268
+ collectResolveIORunnerEvidenceText(job.log.slice(-160), values);
269
+ }
270
+ var roots = Array.from(new Set(__spreadArray(__spreadArray([], __read((input.roots || [])), false), [
271
+ job.workspacePath,
272
+ job.projectRoot && job.workspacePath ? path.join(job.workspacePath, job.projectRoot) : '',
273
+ job.projectDisplayPath && job.workspacePath ? path.join(job.workspacePath, job.projectDisplayPath) : '',
274
+ job.localPath
275
+ ], false).map(function (entry) { return String(entry || '').trim(); }).filter(Boolean)));
276
+ var candidates = [];
277
+ try {
278
+ for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
279
+ var value = values_1_1.value;
280
+ var text = String(value || '');
281
+ try {
282
+ for (var _m = (e_4 = void 0, __values(text.matchAll(/((?:\/tmp\/|\/var\/|\/Users\/)[^\s)'"]+?\.(?:png|jpe?g|webp|zip|json|txt|log))/gi))), _o = _m.next(); !_o.done; _o = _m.next()) {
283
+ var match = _o.value;
284
+ candidates.push(match[1]);
285
+ }
286
+ }
287
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
288
+ finally {
289
+ try {
290
+ if (_o && !_o.done && (_c = _m.return)) _c.call(_m);
291
+ }
292
+ finally { if (e_4) throw e_4.error; }
293
+ }
294
+ try {
295
+ for (var _p = (e_5 = void 0, __values(text.matchAll(/(?:^|[\s("'`])((?:(?:[\w.-]+\/)*qa-artifacts|qa-artifacts|test-results|playwright-report|\.build-output)\/[^\s)'"]+?\.(?:png|jpe?g|webp|zip|json|txt|log))/gim))), _q = _p.next(); !_q.done; _q = _p.next()) {
296
+ var match = _q.value;
297
+ candidates.push(match[1]);
298
+ }
299
+ }
300
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
301
+ finally {
302
+ try {
303
+ if (_q && !_q.done && (_d = _p.return)) _d.call(_p);
304
+ }
305
+ finally { if (e_5) throw e_5.error; }
306
+ }
307
+ }
308
+ }
309
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
310
+ finally {
311
+ try {
312
+ if (values_1_1 && !values_1_1.done && (_b = values_1.return)) _b.call(values_1);
313
+ }
314
+ finally { if (e_3) throw e_3.error; }
315
+ }
316
+ var resolved = [];
317
+ var seen = new Set();
318
+ try {
319
+ for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {
320
+ var candidate = candidates_1_1.value;
321
+ var filePath = resolveArtifactCandidate(candidate, roots);
322
+ if (!filePath || seen.has(filePath)) {
323
+ continue;
324
+ }
325
+ seen.add(filePath);
326
+ resolved.push(filePath);
327
+ if (resolved.length >= (input.maxFiles || 8)) {
328
+ break;
329
+ }
330
+ }
331
+ }
332
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
333
+ finally {
334
+ try {
335
+ if (candidates_1_1 && !candidates_1_1.done && (_e = candidates_1.return)) _e.call(candidates_1);
336
+ }
337
+ finally { if (e_6) throw e_6.error; }
338
+ }
339
+ return resolved;
340
+ }
341
+ function toResolveIORunnerEvidenceAttachments(input) {
342
+ if (input === void 0) { input = {}; }
343
+ return collectResolveIORunnerEvidenceArtifactPaths(input).map(function (filePath) {
344
+ var filename = path.basename(filePath);
345
+ return {
346
+ filename: filename,
347
+ path: filePath,
348
+ contentType: inferResolveIORunnerEvidenceContentType(filename),
349
+ cid: buildResolveIORunnerEvidenceCid(filePath)
350
+ };
351
+ });
352
+ }
353
+ function persistResolveIORunnerEvidenceArtifacts(options) {
354
+ return __awaiter(this, void 0, void 0, function () {
355
+ var maxFiles, previousFiles, existingByHash, previousFiles_1, previousFiles_1_1, file, attachments, persistedFiles, fileIds, errors, nextAttachments, seenPaths, attachments_1, attachments_1_1, attachment, filePath, filename, contentType, error, stat, error, contentBuffer, contentHash, existing, uploaded, fileId, persisted, error_1, message, e_7_1;
356
+ var e_8, _a, e_7, _b;
357
+ return __generator(this, function (_c) {
358
+ switch (_c.label) {
359
+ case 0:
360
+ maxFiles = Math.max(1, options.maxFiles || 8);
361
+ previousFiles = normalizeResolveIORunnerPersistedEvidenceFiles(options.previousFiles);
362
+ existingByHash = new Map();
363
+ try {
364
+ for (previousFiles_1 = __values(previousFiles), previousFiles_1_1 = previousFiles_1.next(); !previousFiles_1_1.done; previousFiles_1_1 = previousFiles_1.next()) {
365
+ file = previousFiles_1_1.value;
366
+ if (file.content_hash) {
367
+ existingByHash.set(file.content_hash, file);
368
+ }
369
+ }
370
+ }
371
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
372
+ finally {
373
+ try {
374
+ if (previousFiles_1_1 && !previousFiles_1_1.done && (_a = previousFiles_1.return)) _a.call(previousFiles_1);
375
+ }
376
+ finally { if (e_8) throw e_8.error; }
377
+ }
378
+ attachments = __spreadArray(__spreadArray([], __read((options.attachments || [])), false), __read(toResolveIORunnerEvidenceAttachments({
379
+ evidence: options.evidence,
380
+ job: options.job,
381
+ roots: options.roots,
382
+ maxFiles: maxFiles
383
+ })), false);
384
+ persistedFiles = __spreadArray([], __read(previousFiles), false);
385
+ fileIds = mergeResolveIORunnerEvidenceFileIds(options.existingFileIds, previousFiles.map(function (file) { return file.file_id; }));
386
+ errors = [];
387
+ nextAttachments = [];
388
+ seenPaths = new Set();
389
+ _c.label = 1;
390
+ case 1:
391
+ _c.trys.push([1, 10, 11, 12]);
392
+ attachments_1 = __values(attachments), attachments_1_1 = attachments_1.next();
393
+ _c.label = 2;
394
+ case 2:
395
+ if (!!attachments_1_1.done) return [3 /*break*/, 9];
396
+ attachment = attachments_1_1.value;
397
+ if (nextAttachments.length >= maxFiles) {
398
+ return [3 /*break*/, 9];
399
+ }
400
+ filePath = String((attachment === null || attachment === void 0 ? void 0 : attachment.path) || '').trim();
401
+ if (!filePath || seenPaths.has(filePath)) {
402
+ return [3 /*break*/, 8];
403
+ }
404
+ seenPaths.add(filePath);
405
+ filename = String((attachment === null || attachment === void 0 ? void 0 : attachment.filename) || path.basename(filePath) || 'runner-qa-artifact.png').trim();
406
+ contentType = String((attachment === null || attachment === void 0 ? void 0 : attachment.contentType) || inferResolveIORunnerEvidenceContentType(filename)).trim();
407
+ if (!pathExists(filePath)) {
408
+ error = "".concat(filename, ": evidence file was not found before S3 upload.");
409
+ errors.push(error);
410
+ nextAttachments.push(__assign(__assign({}, attachment), { filename: filename, upload_error: error }));
411
+ return [3 /*break*/, 8];
412
+ }
413
+ return [4 /*yield*/, fs.promises.stat(filePath)];
414
+ case 3:
415
+ stat = _c.sent();
416
+ if (!stat.isFile() || stat.size <= 0) {
417
+ error = "".concat(filename, ": evidence file was empty before S3 upload.");
418
+ errors.push(error);
419
+ nextAttachments.push(__assign(__assign({}, attachment), { filename: filename, upload_error: error }));
420
+ return [3 /*break*/, 8];
421
+ }
422
+ return [4 /*yield*/, fs.promises.readFile(filePath)];
423
+ case 4:
424
+ contentBuffer = _c.sent();
425
+ contentHash = (0, node_crypto_1.createHash)('sha1').update(new Uint8Array(contentBuffer)).digest('hex');
426
+ existing = existingByHash.get(contentHash);
427
+ if (existing) {
428
+ fileIds.push(existing.file_id);
429
+ nextAttachments.push(__assign(__assign({}, attachment), { filename: filename, file_id: existing.file_id, key: existing.key, content_hash: contentHash, ticket_url: options.ticketUrl || existing.ticket_url, uploaded_to_support_ticket: true }));
430
+ return [3 /*break*/, 8];
431
+ }
432
+ _c.label = 5;
433
+ case 5:
434
+ _c.trys.push([5, 7, , 8]);
435
+ return [4 /*yield*/, options.uploadFile({
436
+ filename: filename,
437
+ filePath: filePath,
438
+ contentType: contentType,
439
+ size: stat.size,
440
+ contentBuffer: contentBuffer,
441
+ contentHash: contentHash
442
+ })];
443
+ case 6:
444
+ uploaded = _c.sent();
445
+ fileId = String((uploaded === null || uploaded === void 0 ? void 0 : uploaded.file_id) || (uploaded === null || uploaded === void 0 ? void 0 : uploaded.id_file) || (uploaded === null || uploaded === void 0 ? void 0 : uploaded._id) || '').trim();
446
+ if (!fileId) {
447
+ throw new Error('artifact upload returned no file id');
448
+ }
449
+ persisted = {
450
+ file_id: fileId,
451
+ filename: String((uploaded === null || uploaded === void 0 ? void 0 : uploaded.filename) || (uploaded === null || uploaded === void 0 ? void 0 : uploaded.name) || filename).trim() || filename,
452
+ key: String((uploaded === null || uploaded === void 0 ? void 0 : uploaded.key) || '').trim() || undefined,
453
+ contentType: contentType,
454
+ content_hash: contentHash,
455
+ ticket_url: String(options.ticketUrl || '').trim() || undefined
456
+ };
457
+ persistedFiles.push(persisted);
458
+ existingByHash.set(contentHash, persisted);
459
+ fileIds.push(fileId);
460
+ nextAttachments.push(__assign(__assign({}, attachment), { filename: filename, file_id: fileId, key: persisted.key, content_hash: contentHash, ticket_url: persisted.ticket_url, uploaded_to_support_ticket: true }));
461
+ return [3 /*break*/, 8];
462
+ case 7:
463
+ error_1 = _c.sent();
464
+ message = "".concat(filename, ": ").concat((error_1 === null || error_1 === void 0 ? void 0 : error_1.message) || error_1);
465
+ errors.push(message);
466
+ nextAttachments.push(__assign(__assign({}, attachment), { filename: filename, content_hash: contentHash, upload_error: message }));
467
+ return [3 /*break*/, 8];
468
+ case 8:
469
+ attachments_1_1 = attachments_1.next();
470
+ return [3 /*break*/, 2];
471
+ case 9: return [3 /*break*/, 12];
472
+ case 10:
473
+ e_7_1 = _c.sent();
474
+ e_7 = { error: e_7_1 };
475
+ return [3 /*break*/, 12];
476
+ case 11:
477
+ try {
478
+ if (attachments_1_1 && !attachments_1_1.done && (_b = attachments_1.return)) _b.call(attachments_1);
479
+ }
480
+ finally { if (e_7) throw e_7.error; }
481
+ return [7 /*endfinally*/];
482
+ case 12: return [2 /*return*/, {
483
+ attachments: nextAttachments,
484
+ fileIds: mergeResolveIORunnerEvidenceFileIds(fileIds),
485
+ files: persistedFiles,
486
+ errors: errors
487
+ }];
488
+ }
489
+ });
490
+ });
491
+ }
492
+
493
+ //# sourceMappingURL=ai-runner-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/ai-runner-artifacts.ts"],"names":[],"mappings":"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","file":"ai-runner-artifacts.js","sourcesContent":["import { createHash } from 'node:crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface ResolveIORunnerEvidenceAttachment {\n\tfilename: string;\n\tpath: string;\n\tcontentType?: string;\n\tcid?: string;\n\tfile_id?: string;\n\tkey?: string;\n\tcontent_hash?: string;\n\tticket_url?: string;\n\tuploaded_to_support_ticket?: boolean;\n\tupload_error?: string;\n}\n\nexport interface ResolveIORunnerPersistedEvidenceFile {\n\tfile_id: string;\n\tfilename: string;\n\tkey?: string;\n\tcontentType?: string;\n\tcontent_hash?: string;\n\tticket_url?: string;\n}\n\nexport interface ResolveIORunnerEvidenceUploadInput {\n\tfilename: string;\n\tfilePath: string;\n\tcontentType: string;\n\tsize: number;\n\tcontentBuffer: Buffer;\n\tcontentHash: string;\n}\n\nexport interface ResolveIORunnerEvidenceUploadResult {\n\tfile_id?: string;\n\tid_file?: string;\n\t_id?: string;\n\tkey?: string;\n\tname?: string;\n\tfilename?: string;\n}\n\nexport interface ResolveIORunnerPersistEvidenceOptions {\n\tattachments?: ResolveIORunnerEvidenceAttachment[];\n\tevidence?: any;\n\tjob?: any;\n\tticket?: any;\n\tticketUrl?: string;\n\troots?: string[];\n\tpreviousFiles?: any[];\n\texistingFileIds?: any[];\n\tmaxFiles?: number;\n\tuploadFile: any;\n}\n\nexport interface ResolveIORunnerPersistEvidenceResult {\n\tattachments: ResolveIORunnerEvidenceAttachment[];\n\tfileIds: string[];\n\tfiles: ResolveIORunnerPersistedEvidenceFile[];\n\terrors: string[];\n}\n\nexport function inferResolveIORunnerEvidenceContentType(fileName: string): string {\n\tconst normalized = String(fileName || '').trim().toLowerCase();\n\tif (normalized.endsWith('.png')) {\n\t\treturn 'image/png';\n\t}\n\tif (normalized.endsWith('.jpg') || normalized.endsWith('.jpeg')) {\n\t\treturn 'image/jpeg';\n\t}\n\tif (normalized.endsWith('.webp')) {\n\t\treturn 'image/webp';\n\t}\n\tif (normalized.endsWith('.zip')) {\n\t\treturn 'application/zip';\n\t}\n\tif (normalized.endsWith('.json')) {\n\t\treturn 'application/json';\n\t}\n\tif (normalized.endsWith('.txt') || normalized.endsWith('.log')) {\n\t\treturn 'text/plain; charset=utf-8';\n\t}\n\treturn 'application/octet-stream';\n}\n\nexport function buildResolveIORunnerEvidenceCid(filePath: string): string {\n\tconst baseName = path.basename(String(filePath || '').trim()) || 'runner-artifact';\n\tconst normalized = baseName\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9._-]+/g, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.slice(0, 80) || 'runner-artifact';\n\tconst digest = createHash('sha1').update(String(filePath || '')).digest('hex').slice(0, 12);\n\treturn `${normalized}-${digest}@resolveio-runner`;\n}\n\nexport function normalizeResolveIORunnerPersistedEvidenceFiles(value: any): ResolveIORunnerPersistedEvidenceFile[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\treturn value\n\t\t.map((item): ResolveIORunnerPersistedEvidenceFile | null => {\n\t\t\tconst fileId = String(item?.file_id || item?.id_file || item?._id || '').trim();\n\t\t\tif (!fileId) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tfile_id: fileId,\n\t\t\t\tfilename: String(item?.filename || item?.name || '').trim(),\n\t\t\t\tkey: String(item?.key || '').trim() || undefined,\n\t\t\t\tcontentType: String(item?.contentType || item?.content_type || '').trim() || undefined,\n\t\t\t\tcontent_hash: String(item?.content_hash || item?.hash || '').trim() || undefined,\n\t\t\t\tticket_url: String(item?.ticket_url || '').trim() || undefined\n\t\t\t};\n\t\t})\n\t\t.filter((item): item is ResolveIORunnerPersistedEvidenceFile => !!item);\n}\n\nexport function mergeResolveIORunnerEvidenceFileIds(...values: any[]): string[] {\n\tconst ids: string[] = [];\n\tconst seen = new Set<string>();\n\tconst push = (value: any) => {\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach(push);\n\t\t\treturn;\n\t\t}\n\t\tconst id = String(value?.file_id || value?.id_file || value?._id || value || '').trim();\n\t\tif (!id || seen.has(id)) {\n\t\t\treturn;\n\t\t}\n\t\tseen.add(id);\n\t\tids.push(id);\n\t};\n\tvalues.forEach(push);\n\treturn ids;\n}\n\nfunction collectResolveIORunnerEvidenceText(value: any, output: string[]): void {\n\tif (value === null || value === undefined) {\n\t\treturn;\n\t}\n\tif (typeof value === 'string') {\n\t\toutput.push(value);\n\t\treturn;\n\t}\n\tif (Array.isArray(value)) {\n\t\tvalue.forEach((entry) => collectResolveIORunnerEvidenceText(entry, output));\n\t\treturn;\n\t}\n\tif (typeof value === 'object') {\n\t\tObject.values(value).forEach((entry) => collectResolveIORunnerEvidenceText(entry, output));\n\t}\n}\n\nfunction normalizeArtifactCandidatePath(value: string): string {\n\treturn String(value || '')\n\t\t.trim()\n\t\t.replace(/[),.;:'\"]+$/g, '')\n\t\t.replace(/\\\\/g, '/');\n}\n\nfunction pathExists(filePath: string): boolean {\n\ttry {\n\t\treturn !!filePath && fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n\t}\n\tcatch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveArtifactCandidate(candidate: string, roots: string[]): string {\n\tconst normalized = normalizeArtifactCandidatePath(candidate);\n\tif (!normalized) {\n\t\treturn '';\n\t}\n\tif (path.isAbsolute(normalized)) {\n\t\treturn pathExists(normalized) ? normalized : '';\n\t}\n\tfor (const root of roots) {\n\t\tconst normalizedRoot = String(root || '').trim();\n\t\tif (!normalizedRoot) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst resolved = path.resolve(normalizedRoot, normalized);\n\t\tif (pathExists(resolved)) {\n\t\t\treturn resolved;\n\t\t}\n\t}\n\treturn '';\n}\n\nexport function collectResolveIORunnerEvidenceArtifactPaths(input: {\n\tevidence?: any;\n\tjob?: any;\n\troots?: string[];\n\tmaxFiles?: number;\n} = {}): string[] {\n\tconst values: string[] = [];\n\tcollectResolveIORunnerEvidenceText(input.evidence, values);\n\tconst job = input.job || {};\n\tcollectResolveIORunnerEvidenceText(job.responseSummary, values);\n\tcollectResolveIORunnerEvidenceText(job.lastVerificationSummary, values);\n\tcollectResolveIORunnerEvidenceText(job.lastRerunReason, values);\n\tcollectResolveIORunnerEvidenceText(job.artifacts?.agentNotes, values);\n\tcollectResolveIORunnerEvidenceText(job.artifacts?.supportArtifacts, values);\n\tcollectResolveIORunnerEvidenceText(job.artifacts?.qaArtifacts, values);\n\tcollectResolveIORunnerEvidenceText(job.artifacts?.qa_artifacts, values);\n\tcollectResolveIORunnerEvidenceText(job.qa_artifacts, values);\n\tcollectResolveIORunnerEvidenceText(job.supportQaArtifacts, values);\n\tcollectResolveIORunnerEvidenceText(job.runnerEvidenceArtifacts, values);\n\tif (Array.isArray(job.tasks)) {\n\t\tfor (const task of job.tasks) {\n\t\t\tcollectResolveIORunnerEvidenceText(task?.title, values);\n\t\t\tcollectResolveIORunnerEvidenceText(task?.notes, values);\n\t\t\tcollectResolveIORunnerEvidenceText(task?.artifacts, values);\n\t\t\tcollectResolveIORunnerEvidenceText(task?.evidence, values);\n\t\t}\n\t}\n\tif (Array.isArray(job.log)) {\n\t\tcollectResolveIORunnerEvidenceText(job.log.slice(-160), values);\n\t}\n\n\tconst roots = Array.from(new Set([\n\t\t...(input.roots || []),\n\t\tjob.workspacePath,\n\t\tjob.projectRoot && job.workspacePath ? path.join(job.workspacePath, job.projectRoot) : '',\n\t\tjob.projectDisplayPath && job.workspacePath ? path.join(job.workspacePath, job.projectDisplayPath) : '',\n\t\tjob.localPath\n\t].map((entry) => String(entry || '').trim()).filter(Boolean)));\n\tconst candidates: string[] = [];\n\tfor (const value of values) {\n\t\tconst text = String(value || '');\n\t\tfor (const match of text.matchAll(/((?:\\/tmp\\/|\\/var\\/|\\/Users\\/)[^\\s)'\"]+?\\.(?:png|jpe?g|webp|zip|json|txt|log))/gi)) {\n\t\t\tcandidates.push(match[1]);\n\t\t}\n\t\tfor (const match of text.matchAll(/(?:^|[\\s(\"'`])((?:(?:[\\w.-]+\\/)*qa-artifacts|qa-artifacts|test-results|playwright-report|\\.build-output)\\/[^\\s)'\"]+?\\.(?:png|jpe?g|webp|zip|json|txt|log))/gim)) {\n\t\t\tcandidates.push(match[1]);\n\t\t}\n\t}\n\tconst resolved: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const candidate of candidates) {\n\t\tconst filePath = resolveArtifactCandidate(candidate, roots);\n\t\tif (!filePath || seen.has(filePath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(filePath);\n\t\tresolved.push(filePath);\n\t\tif (resolved.length >= (input.maxFiles || 8)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn resolved;\n}\n\nexport function toResolveIORunnerEvidenceAttachments(input: {\n\tevidence?: any;\n\tjob?: any;\n\troots?: string[];\n\tmaxFiles?: number;\n} = {}): ResolveIORunnerEvidenceAttachment[] {\n\treturn collectResolveIORunnerEvidenceArtifactPaths(input).map((filePath) => {\n\t\tconst filename = path.basename(filePath);\n\t\treturn {\n\t\t\tfilename,\n\t\t\tpath: filePath,\n\t\t\tcontentType: inferResolveIORunnerEvidenceContentType(filename),\n\t\t\tcid: buildResolveIORunnerEvidenceCid(filePath)\n\t\t};\n\t});\n}\n\nexport async function persistResolveIORunnerEvidenceArtifacts(\n\toptions: ResolveIORunnerPersistEvidenceOptions\n): Promise<ResolveIORunnerPersistEvidenceResult> {\n\tconst maxFiles = Math.max(1, options.maxFiles || 8);\n\tconst previousFiles = normalizeResolveIORunnerPersistedEvidenceFiles(options.previousFiles);\n\tconst existingByHash = new Map<string, ResolveIORunnerPersistedEvidenceFile>();\n\tfor (const file of previousFiles) {\n\t\tif (file.content_hash) {\n\t\t\texistingByHash.set(file.content_hash, file);\n\t\t}\n\t}\n\tconst attachments = [\n\t\t...(options.attachments || []),\n\t\t...toResolveIORunnerEvidenceAttachments({\n\t\t\tevidence: options.evidence,\n\t\t\tjob: options.job,\n\t\t\troots: options.roots,\n\t\t\tmaxFiles\n\t\t})\n\t];\n\tconst persistedFiles = [...previousFiles];\n\tconst fileIds = mergeResolveIORunnerEvidenceFileIds(options.existingFileIds, previousFiles.map((file) => file.file_id));\n\tconst errors: string[] = [];\n\tconst nextAttachments: ResolveIORunnerEvidenceAttachment[] = [];\n\tconst seenPaths = new Set<string>();\n\n\tfor (const attachment of attachments) {\n\t\tif (nextAttachments.length >= maxFiles) {\n\t\t\tbreak;\n\t\t}\n\t\tconst filePath = String(attachment?.path || '').trim();\n\t\tif (!filePath || seenPaths.has(filePath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseenPaths.add(filePath);\n\t\tconst filename = String(attachment?.filename || path.basename(filePath) || 'runner-qa-artifact.png').trim();\n\t\tconst contentType = String(attachment?.contentType || inferResolveIORunnerEvidenceContentType(filename)).trim();\n\t\tif (!pathExists(filePath)) {\n\t\t\tconst error = `${filename}: evidence file was not found before S3 upload.`;\n\t\t\terrors.push(error);\n\t\t\tnextAttachments.push({ ...attachment, filename, upload_error: error });\n\t\t\tcontinue;\n\t\t}\n\t\tconst stat = await fs.promises.stat(filePath);\n\t\tif (!stat.isFile() || stat.size <= 0) {\n\t\t\tconst error = `${filename}: evidence file was empty before S3 upload.`;\n\t\t\terrors.push(error);\n\t\t\tnextAttachments.push({ ...attachment, filename, upload_error: error });\n\t\t\tcontinue;\n\t\t}\n\t\tconst contentBuffer = await fs.promises.readFile(filePath);\n\t\tconst contentHash = createHash('sha1').update(new Uint8Array(contentBuffer)).digest('hex');\n\t\tconst existing = existingByHash.get(contentHash);\n\t\tif (existing) {\n\t\t\tfileIds.push(existing.file_id);\n\t\t\tnextAttachments.push({\n\t\t\t\t...attachment,\n\t\t\t\tfilename,\n\t\t\t\tfile_id: existing.file_id,\n\t\t\t\tkey: existing.key,\n\t\t\t\tcontent_hash: contentHash,\n\t\t\t\tticket_url: options.ticketUrl || existing.ticket_url,\n\t\t\t\tuploaded_to_support_ticket: true\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst uploaded = await options.uploadFile({\n\t\t\t\tfilename,\n\t\t\t\tfilePath,\n\t\t\t\tcontentType,\n\t\t\t\tsize: stat.size,\n\t\t\t\tcontentBuffer,\n\t\t\t\tcontentHash\n\t\t\t});\n\t\t\tconst fileId = String(uploaded?.file_id || uploaded?.id_file || uploaded?._id || '').trim();\n\t\t\tif (!fileId) {\n\t\t\t\tthrow new Error('artifact upload returned no file id');\n\t\t\t}\n\t\t\tconst persisted: ResolveIORunnerPersistedEvidenceFile = {\n\t\t\t\tfile_id: fileId,\n\t\t\t\tfilename: String(uploaded?.filename || uploaded?.name || filename).trim() || filename,\n\t\t\t\tkey: String(uploaded?.key || '').trim() || undefined,\n\t\t\t\tcontentType,\n\t\t\t\tcontent_hash: contentHash,\n\t\t\t\tticket_url: String(options.ticketUrl || '').trim() || undefined\n\t\t\t};\n\t\t\tpersistedFiles.push(persisted);\n\t\t\texistingByHash.set(contentHash, persisted);\n\t\t\tfileIds.push(fileId);\n\t\t\tnextAttachments.push({\n\t\t\t\t...attachment,\n\t\t\t\tfilename,\n\t\t\t\tfile_id: fileId,\n\t\t\t\tkey: persisted.key,\n\t\t\t\tcontent_hash: contentHash,\n\t\t\t\tticket_url: persisted.ticket_url,\n\t\t\t\tuploaded_to_support_ticket: true\n\t\t\t});\n\t\t}\n\t\tcatch (error) {\n\t\t\tconst message = `${filename}: ${(error as Error)?.message || error}`;\n\t\t\terrors.push(message);\n\t\t\tnextAttachments.push({ ...attachment, filename, content_hash: contentHash, upload_error: message });\n\t\t}\n\t}\n\n\treturn {\n\t\tattachments: nextAttachments,\n\t\tfileIds: mergeResolveIORunnerEvidenceFileIds(fileIds),\n\t\tfiles: persistedFiles,\n\t\terrors\n\t};\n}\n"]}