@resolveio/server-lib 22.1.19 → 22.1.20

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.
@@ -35,14 +35,62 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
+ var __read = (this && this.__read) || function (o, n) {
39
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
40
+ if (!m) return o;
41
+ var i = m.call(o), r, ar = [], e;
42
+ try {
43
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
+ }
45
+ catch (error) { e = { error: error }; }
46
+ finally {
47
+ try {
48
+ if (r && !r.done && (m = i["return"])) m.call(i);
49
+ }
50
+ finally { if (e) throw e.error; }
51
+ }
52
+ return ar;
53
+ };
54
+ var __values = (this && this.__values) || function(o) {
55
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
56
+ if (m) return m.call(o);
57
+ if (o && typeof o.length === "number") return {
58
+ next: function () {
59
+ if (o && i >= o.length) o = void 0;
60
+ return { value: o && o[i++], done: !o };
61
+ }
62
+ };
63
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
64
+ };
65
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
66
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
67
+ if (ar || !(i in from)) {
68
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
69
+ ar[i] = from[i];
70
+ }
71
+ }
72
+ return to.concat(ar || Array.prototype.slice.call(from));
73
+ };
38
74
  Object.defineProperty(exports, "__esModule", { value: true });
39
75
  exports.loadMongoExplorerMethods = loadMongoExplorerMethods;
40
76
  var simpl_schema_1 = require("simpl-schema");
41
77
  var user_collection_1 = require("../collections/user.collection");
42
78
  var resolveio_server_app_1 = require("../resolveio-server-app");
79
+ var openai_client_1 = require("../services/openai-client");
43
80
  var common_1 = require("../util/common");
44
81
  var DEFAULT_LIMIT = 100;
45
82
  var MAX_LIMIT = 2000;
83
+ var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
84
+ var MAX_REVIEW_STRING_LENGTH = 500;
85
+ var MAX_REVIEW_ARRAY_ITEMS = 10;
86
+ var MAX_REVIEW_OBJECT_KEYS = 40;
87
+ var MAX_REVIEW_DEPTH = 4;
88
+ var MAX_REVIEW_LIST_ITEMS = 6;
89
+ var MAX_REVIEW_CHANGED_FIELDS = 60;
90
+ var DEFAULT_RISK_REVIEW_TIMEOUT_MS = 30000;
91
+ var DEFAULT_RISK_REVIEW_MAX_TOKENS = 700;
92
+ var DEFAULT_RISK_REVIEW_MODEL = 'gpt-5.3-codex';
93
+ var SENSITIVE_REVIEW_FIELD_REGEX = /(password|secret|token|api[_-]?key|salt|hash|email|phone|address|ssn|services|roles)/i;
46
94
  function parseMongoExplorerWriteUsers() {
47
95
  var raw = typeof process.env.MONGO_EXPLORER_WRITE_USERS === 'string' ? process.env.MONGO_EXPLORER_WRITE_USERS.trim() : '';
48
96
  if (!raw) {
@@ -65,6 +113,24 @@ function parseMongoExplorerWriteUsers() {
65
113
  .map(function (value) { return value.trim(); })
66
114
  .filter(Boolean);
67
115
  }
116
+ function normalizeExplorerMode(mode) {
117
+ var normalizedMode = String(mode || '').trim().toLowerCase();
118
+ if (normalizedMode === 'resolveio') {
119
+ return 'resolveio';
120
+ }
121
+ return 'aicoder';
122
+ }
123
+ function isAdminUser(user) {
124
+ var _a;
125
+ if (!user) {
126
+ return false;
127
+ }
128
+ var username = String(user.username || '').trim().toLowerCase();
129
+ return username === 'admin' || ((_a = user.roles) === null || _a === void 0 ? void 0 : _a.super_admin) === true;
130
+ }
131
+ function allowUnschemaizedWrites() {
132
+ return process.env.MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE === 'true';
133
+ }
68
134
  function resolveDatabaseName(database) {
69
135
  var _a, _b;
70
136
  var defaultDb = ((_a = resolveio_server_app_1.ResolveIOServer.getServerConfig()) === null || _a === void 0 ? void 0 : _a.DATABASE) || '';
@@ -93,6 +159,172 @@ function resolveCollectionHandle(database, collection) {
93
159
  dbCollection: db.collection(collection)
94
160
  };
95
161
  }
162
+ function getSchemaDefinition(collectionRef) {
163
+ if (!collectionRef || !collectionRef.simplschema || typeof collectionRef.simplschema.schema !== 'function') {
164
+ return {};
165
+ }
166
+ var schema = collectionRef.simplschema.schema();
167
+ return schema && typeof schema === 'object' ? schema : {};
168
+ }
169
+ function getSchemaTypeName(definition) {
170
+ var _a, _b;
171
+ var typeDefs = (_a = definition === null || definition === void 0 ? void 0 : definition.type) === null || _a === void 0 ? void 0 : _a.definitions;
172
+ if (!Array.isArray(typeDefs) || !typeDefs.length) {
173
+ return 'Any';
174
+ }
175
+ var firstType = (_b = typeDefs[0]) === null || _b === void 0 ? void 0 : _b.type;
176
+ if (!firstType) {
177
+ return 'Any';
178
+ }
179
+ if (firstType === String) {
180
+ return 'String';
181
+ }
182
+ if (firstType === Number) {
183
+ return 'Number';
184
+ }
185
+ if (firstType === Boolean) {
186
+ return 'Boolean';
187
+ }
188
+ if (firstType === Date) {
189
+ return 'Date';
190
+ }
191
+ if (firstType === Object) {
192
+ return 'Object';
193
+ }
194
+ if (firstType === Array) {
195
+ return 'Array';
196
+ }
197
+ var typeName = firstType.name || String(firstType);
198
+ if (typeName === 'Integer') {
199
+ return 'Number';
200
+ }
201
+ return typeName;
202
+ }
203
+ function toLabel(path) {
204
+ var last = path.split('.').pop() || path;
205
+ return last
206
+ .replace(/\$/g, '')
207
+ .replace(/_/g, ' ')
208
+ .replace(/\s+/g, ' ')
209
+ .trim();
210
+ }
211
+ function isProtectedFieldSegment(segment) {
212
+ if (!segment) {
213
+ return false;
214
+ }
215
+ if (segment === '_id') {
216
+ return true;
217
+ }
218
+ var normalizedSegment = segment.replace(/\[\d+\]/g, '');
219
+ return normalizedSegment.toLowerCase().startsWith('id_');
220
+ }
221
+ function isProtectedFieldPath(path) {
222
+ var segments = String(path || '').split('.').filter(Boolean);
223
+ return segments.some(function (segment) { return isProtectedFieldSegment(segment); });
224
+ }
225
+ function safeStringify(value) {
226
+ try {
227
+ return JSON.stringify(value);
228
+ }
229
+ catch (_a) {
230
+ return String(value);
231
+ }
232
+ }
233
+ function collectProtectedFieldPaths(value, prefix, out) {
234
+ if (prefix === void 0) { prefix = ''; }
235
+ if (out === void 0) { out = {}; }
236
+ if (Array.isArray(value)) {
237
+ value.forEach(function (item, index) {
238
+ var nextPrefix = prefix ? "".concat(prefix, "[").concat(index, "]") : "[".concat(index, "]");
239
+ collectProtectedFieldPaths(item, nextPrefix, out);
240
+ });
241
+ return out;
242
+ }
243
+ if (!value || typeof value !== 'object') {
244
+ return out;
245
+ }
246
+ Object.keys(value).forEach(function (key) {
247
+ var nextPrefix = prefix ? "".concat(prefix, ".").concat(key) : key;
248
+ if (isProtectedFieldSegment(key)) {
249
+ out[nextPrefix] = value[key];
250
+ }
251
+ collectProtectedFieldPaths(value[key], nextPrefix, out);
252
+ });
253
+ return out;
254
+ }
255
+ function ensureProtectedFieldsUnchanged(originalDoc, updatedDoc) {
256
+ var originalProtected = collectProtectedFieldPaths(originalDoc || {});
257
+ var updatedProtected = collectProtectedFieldPaths(updatedDoc || {});
258
+ var violations = [];
259
+ Object.keys(originalProtected).forEach(function (path) {
260
+ if (!Object.prototype.hasOwnProperty.call(updatedProtected, path)) {
261
+ violations.push(path);
262
+ return;
263
+ }
264
+ var originalValue = safeStringify(originalProtected[path]);
265
+ var updatedValue = safeStringify(updatedProtected[path]);
266
+ if (originalValue !== updatedValue) {
267
+ violations.push(path);
268
+ }
269
+ });
270
+ Object.keys(updatedProtected).forEach(function (path) {
271
+ if (!Object.prototype.hasOwnProperty.call(originalProtected, path)) {
272
+ violations.push(path);
273
+ }
274
+ });
275
+ if (violations.length) {
276
+ var preview = violations.slice(0, 4).join(', ');
277
+ throw new Error("Mongo Explorer: Protected fields cannot be edited (".concat(preview).concat(violations.length > 4 ? ', ...' : '', ")"));
278
+ }
279
+ }
280
+ function coerceDateValue(value) {
281
+ if (value instanceof Date) {
282
+ return value;
283
+ }
284
+ if (typeof value !== 'string' || !ISO_DATE_REGEX.test(value)) {
285
+ return value;
286
+ }
287
+ var parsed = new Date(value);
288
+ return Number.isNaN(parsed.getTime()) ? value : parsed;
289
+ }
290
+ function coerceDatePath(target, segments) {
291
+ if (!target || !segments.length) {
292
+ return;
293
+ }
294
+ var _a = __read(segments), segment = _a[0], rest = _a.slice(1);
295
+ if (segment === '$') {
296
+ if (Array.isArray(target)) {
297
+ target.forEach(function (item) { return coerceDatePath(item, rest); });
298
+ }
299
+ return;
300
+ }
301
+ if (!Object.prototype.hasOwnProperty.call(target, segment)) {
302
+ return;
303
+ }
304
+ if (rest.length === 0) {
305
+ var updatedValue = coerceDateValue(target[segment]);
306
+ if (updatedValue !== target[segment]) {
307
+ target[segment] = updatedValue;
308
+ }
309
+ return;
310
+ }
311
+ coerceDatePath(target[segment], rest);
312
+ }
313
+ function coerceDateFields(collectionRef, doc) {
314
+ if (!collectionRef || !collectionRef.simplschema || !doc) {
315
+ return;
316
+ }
317
+ var schema = getSchemaDefinition(collectionRef);
318
+ Object.keys(schema).forEach(function (schemaKey) {
319
+ var _a;
320
+ var definition = schema[schemaKey];
321
+ var typeDefs = (_a = definition === null || definition === void 0 ? void 0 : definition.type) === null || _a === void 0 ? void 0 : _a.definitions;
322
+ if (!Array.isArray(typeDefs) || !typeDefs.some(function (typeDef) { return typeDef.type === Date; })) {
323
+ return;
324
+ }
325
+ coerceDatePath(doc, schemaKey.split('.'));
326
+ });
327
+ }
96
328
  function normalizeFindOptions(options) {
97
329
  var normalized = options || {};
98
330
  var projection = normalized.projection && Object.keys(normalized.projection).length ? normalized.projection : undefined;
@@ -130,9 +362,9 @@ function userHasView(user, view) {
130
362
  }
131
363
  return false;
132
364
  }
133
- function ensureWriteAccess(context, permissionView) {
365
+ function ensureWriteAccess(context, permissionView, mode) {
134
366
  return __awaiter(this, void 0, void 0, function () {
135
- var idUser, user, allowedUsers, username_1, email_1, id_1, isAllowed, normalizedPermission;
367
+ var idUser, user, normalizedMode, allowedUsers, username_1, email_1, id_1, isAllowed, normalizedPermission;
136
368
  var _a;
137
369
  return __generator(this, function (_b) {
138
370
  switch (_b.label) {
@@ -150,6 +382,10 @@ function ensureWriteAccess(context, permissionView) {
150
382
  if (user.readonly) {
151
383
  throw new Error('Mongo Explorer: Readonly user');
152
384
  }
385
+ normalizedMode = normalizeExplorerMode(mode);
386
+ if (normalizedMode === 'resolveio' && !isAdminUser(user)) {
387
+ throw new Error('Mongo Explorer: ResolveIO mode is read only for non-admin users');
388
+ }
153
389
  allowedUsers = parseMongoExplorerWriteUsers();
154
390
  if (allowedUsers.length) {
155
391
  username_1 = String(user.username || '').trim().toLowerCase();
@@ -181,6 +417,437 @@ function ensureWriteAccess(context, permissionView) {
181
417
  });
182
418
  });
183
419
  }
420
+ function buildDeleteSafetyCollections(collectionRef) {
421
+ var schema = getSchemaDefinition(collectionRef);
422
+ return Object.keys(schema).filter(function (path) { return isProtectedFieldPath(path) && path !== '_id'; });
423
+ }
424
+ function buildDeleteImpact(database, sourceCollection, docId) {
425
+ return __awaiter(this, void 0, void 0, function () {
426
+ var mainDb, mongoManager, collections, impacts, unresolved, collections_1, collections_1_1, collectionRef, collectionName, referencePaths, query, docs, _a, e_1_1;
427
+ var e_1, _b;
428
+ var _c;
429
+ return __generator(this, function (_d) {
430
+ switch (_d.label) {
431
+ case 0:
432
+ mainDb = ((_c = resolveio_server_app_1.ResolveIOServer.getServerConfig()) === null || _c === void 0 ? void 0 : _c.DATABASE) || '';
433
+ if (database !== mainDb) {
434
+ return [2 /*return*/, {
435
+ has_references: false,
436
+ unresolved: true,
437
+ collections: []
438
+ }];
439
+ }
440
+ mongoManager = resolveio_server_app_1.ResolveIOServer.getMongoManager();
441
+ collections = (mongoManager === null || mongoManager === void 0 ? void 0 : mongoManager.collections) ? mongoManager.collections() : [];
442
+ impacts = [];
443
+ unresolved = false;
444
+ _d.label = 1;
445
+ case 1:
446
+ _d.trys.push([1, 8, 9, 10]);
447
+ collections_1 = __values(collections), collections_1_1 = collections_1.next();
448
+ _d.label = 2;
449
+ case 2:
450
+ if (!!collections_1_1.done) return [3 /*break*/, 7];
451
+ collectionRef = collections_1_1.value;
452
+ collectionName = collectionRef === null || collectionRef === void 0 ? void 0 : collectionRef.collectionName;
453
+ if (!collectionName) {
454
+ return [3 /*break*/, 6];
455
+ }
456
+ if (collectionName === "".concat(sourceCollection, ".versions")) {
457
+ return [3 /*break*/, 6];
458
+ }
459
+ referencePaths = buildDeleteSafetyCollections(collectionRef);
460
+ if (!referencePaths.length) {
461
+ return [3 /*break*/, 6];
462
+ }
463
+ query = {
464
+ $or: referencePaths.map(function (path) {
465
+ var _a;
466
+ return (_a = {}, _a[path] = docId, _a);
467
+ })
468
+ };
469
+ _d.label = 3;
470
+ case 3:
471
+ _d.trys.push([3, 5, , 6]);
472
+ return [4 /*yield*/, collectionRef.find(query, { projection: { _id: 1 }, limit: 3 })];
473
+ case 4:
474
+ docs = _d.sent();
475
+ if (Array.isArray(docs) && docs.length) {
476
+ impacts.push({
477
+ collection: collectionName,
478
+ references: docs.length,
479
+ sample_ids: docs.map(function (doc) { return String((doc === null || doc === void 0 ? void 0 : doc._id) || ''); }).filter(Boolean)
480
+ });
481
+ }
482
+ return [3 /*break*/, 6];
483
+ case 5:
484
+ _a = _d.sent();
485
+ unresolved = true;
486
+ return [3 /*break*/, 6];
487
+ case 6:
488
+ collections_1_1 = collections_1.next();
489
+ return [3 /*break*/, 2];
490
+ case 7: return [3 /*break*/, 10];
491
+ case 8:
492
+ e_1_1 = _d.sent();
493
+ e_1 = { error: e_1_1 };
494
+ return [3 /*break*/, 10];
495
+ case 9:
496
+ try {
497
+ if (collections_1_1 && !collections_1_1.done && (_b = collections_1.return)) _b.call(collections_1);
498
+ }
499
+ finally { if (e_1) throw e_1.error; }
500
+ return [7 /*endfinally*/];
501
+ case 10: return [2 /*return*/, {
502
+ has_references: impacts.length > 0,
503
+ unresolved: unresolved,
504
+ collections: impacts.sort(function (a, b) { return a.collection.localeCompare(b.collection); })
505
+ }];
506
+ }
507
+ });
508
+ });
509
+ }
510
+ function normalizeOptionalString(value) {
511
+ if (typeof value === 'string') {
512
+ var trimmed = value.trim();
513
+ return trimmed.length ? trimmed : undefined;
514
+ }
515
+ if (value === null || value === undefined) {
516
+ return undefined;
517
+ }
518
+ var normalized = String(value).trim();
519
+ return normalized.length ? normalized : undefined;
520
+ }
521
+ function normalizePositiveNumber(value, fallback) {
522
+ var parsed = Number(value);
523
+ if (!Number.isFinite(parsed) || parsed <= 0) {
524
+ return fallback;
525
+ }
526
+ return parsed;
527
+ }
528
+ function parseBooleanValue(value, fallback) {
529
+ if (typeof value === 'boolean') {
530
+ return value;
531
+ }
532
+ var normalized = String(value || '').trim().toLowerCase();
533
+ if (!normalized.length) {
534
+ return fallback;
535
+ }
536
+ if (['1', 'true', 'yes', 'on'].includes(normalized)) {
537
+ return true;
538
+ }
539
+ if (['0', 'false', 'no', 'off'].includes(normalized)) {
540
+ return false;
541
+ }
542
+ return fallback;
543
+ }
544
+ function truncateForRiskReview(value, maxLength) {
545
+ if (maxLength === void 0) { maxLength = MAX_REVIEW_STRING_LENGTH; }
546
+ var normalized = String(value || '');
547
+ if (normalized.length <= maxLength) {
548
+ return normalized;
549
+ }
550
+ var diff = normalized.length - maxLength;
551
+ return "".concat(normalized.slice(0, maxLength), "...[+").concat(diff, " chars]");
552
+ }
553
+ function sanitizeForRiskReview(value, depth) {
554
+ if (depth === void 0) { depth = 0; }
555
+ if (value === null || value === undefined) {
556
+ return value;
557
+ }
558
+ if (depth > MAX_REVIEW_DEPTH) {
559
+ return '[Truncated depth]';
560
+ }
561
+ if (value instanceof Date) {
562
+ return value.toISOString();
563
+ }
564
+ if (typeof value === 'string') {
565
+ return truncateForRiskReview(value);
566
+ }
567
+ if (typeof value === 'number' || typeof value === 'boolean') {
568
+ return value;
569
+ }
570
+ if (Array.isArray(value)) {
571
+ var sanitized = value
572
+ .slice(0, MAX_REVIEW_ARRAY_ITEMS)
573
+ .map(function (item) { return sanitizeForRiskReview(item, depth + 1); });
574
+ if (value.length > MAX_REVIEW_ARRAY_ITEMS) {
575
+ sanitized.push("[".concat(value.length - MAX_REVIEW_ARRAY_ITEMS, " more item(s)]"));
576
+ }
577
+ return sanitized;
578
+ }
579
+ if (typeof value === 'object') {
580
+ var output_1 = {};
581
+ var keys = Object.keys(value);
582
+ var limitedKeys = keys.slice(0, MAX_REVIEW_OBJECT_KEYS);
583
+ limitedKeys.forEach(function (key) {
584
+ if (SENSITIVE_REVIEW_FIELD_REGEX.test(key)) {
585
+ output_1[key] = '[REDACTED]';
586
+ return;
587
+ }
588
+ output_1[key] = sanitizeForRiskReview(value[key], depth + 1);
589
+ });
590
+ if (keys.length > MAX_REVIEW_OBJECT_KEYS) {
591
+ output_1.__truncated_keys = keys.length - MAX_REVIEW_OBJECT_KEYS;
592
+ }
593
+ return output_1;
594
+ }
595
+ return truncateForRiskReview(String(value));
596
+ }
597
+ function pickChangedFields(beforeDocument, afterDocument) {
598
+ var e_2, _a;
599
+ if (!beforeDocument || typeof beforeDocument !== 'object' || !afterDocument || typeof afterDocument !== 'object') {
600
+ return [];
601
+ }
602
+ var changed = [];
603
+ var fieldNames = new Set(__spreadArray(__spreadArray([], __read(Object.keys(beforeDocument)), false), __read(Object.keys(afterDocument)), false));
604
+ try {
605
+ for (var fieldNames_1 = __values(fieldNames), fieldNames_1_1 = fieldNames_1.next(); !fieldNames_1_1.done; fieldNames_1_1 = fieldNames_1.next()) {
606
+ var field = fieldNames_1_1.value;
607
+ if (changed.length >= MAX_REVIEW_CHANGED_FIELDS) {
608
+ break;
609
+ }
610
+ var beforeValue = safeStringify(beforeDocument[field]);
611
+ var afterValue = safeStringify(afterDocument[field]);
612
+ if (beforeValue !== afterValue) {
613
+ changed.push(field);
614
+ }
615
+ }
616
+ }
617
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
618
+ finally {
619
+ try {
620
+ if (fieldNames_1_1 && !fieldNames_1_1.done && (_a = fieldNames_1.return)) _a.call(fieldNames_1);
621
+ }
622
+ finally { if (e_2) throw e_2.error; }
623
+ }
624
+ return changed;
625
+ }
626
+ function normalizeRiskLevel(value) {
627
+ var normalized = String(value || '').trim().toLowerCase();
628
+ if (normalized === 'low') {
629
+ return 'low';
630
+ }
631
+ if (normalized === 'medium') {
632
+ return 'medium';
633
+ }
634
+ if (normalized === 'high') {
635
+ return 'high';
636
+ }
637
+ if (normalized === 'critical') {
638
+ return 'critical';
639
+ }
640
+ return 'high';
641
+ }
642
+ function normalizeRiskList(value) {
643
+ if (!Array.isArray(value)) {
644
+ return [];
645
+ }
646
+ return value
647
+ .map(function (item) { return normalizeOptionalString(item); })
648
+ .filter(function (item) { return !!item; })
649
+ .slice(0, MAX_REVIEW_LIST_ITEMS)
650
+ .map(function (item) { return truncateForRiskReview(item, 220); });
651
+ }
652
+ function buildFallbackRiskReview(operation, summary, model) {
653
+ if (model === void 0) { model = ''; }
654
+ return {
655
+ operation: operation,
656
+ risk_level: 'high',
657
+ should_block: true,
658
+ summary: truncateForRiskReview(summary, 220),
659
+ reasons: [
660
+ 'AI review could not produce a reliable result.',
661
+ 'Proceed only with explicit approval and manual dependency checks.'
662
+ ],
663
+ suggested_checks: [
664
+ 'Confirm related records and id_* references before writing.',
665
+ 'Validate that schema-required fields and date values remain valid.'
666
+ ],
667
+ confidence: 0,
668
+ model: model || '',
669
+ request_id: '',
670
+ review_status: 'fallback',
671
+ reviewed_at: new Date().toISOString()
672
+ };
673
+ }
674
+ function buildDisabledRiskReview(operation) {
675
+ return {
676
+ operation: operation,
677
+ risk_level: 'low',
678
+ should_block: false,
679
+ summary: 'AI risk review is disabled by configuration.',
680
+ reasons: [],
681
+ suggested_checks: [],
682
+ confidence: 1,
683
+ model: '',
684
+ request_id: '',
685
+ review_status: 'disabled',
686
+ reviewed_at: new Date().toISOString()
687
+ };
688
+ }
689
+ function parseRiskReviewPayload(content) {
690
+ var normalized = String(content || '').trim();
691
+ if (!normalized.length) {
692
+ return {};
693
+ }
694
+ try {
695
+ return JSON.parse(normalized);
696
+ }
697
+ catch (_a) {
698
+ // Fall through and try to parse a JSON object embedded in plain text.
699
+ }
700
+ var start = normalized.indexOf('{');
701
+ var end = normalized.lastIndexOf('}');
702
+ if (start !== -1 && end > start) {
703
+ var candidate = normalized.slice(start, end + 1);
704
+ try {
705
+ return JSON.parse(candidate);
706
+ }
707
+ catch (_b) {
708
+ return {};
709
+ }
710
+ }
711
+ return {};
712
+ }
713
+ function normalizeRiskReview(operation, payload, model, requestId) {
714
+ var riskLevel = normalizeRiskLevel(payload === null || payload === void 0 ? void 0 : payload.risk_level);
715
+ var normalizedConfidence = Number(payload === null || payload === void 0 ? void 0 : payload.confidence);
716
+ var confidence = Number.isFinite(normalizedConfidence)
717
+ ? Math.max(0, Math.min(1, normalizedConfidence))
718
+ : 0.6;
719
+ var summary = normalizeOptionalString(payload === null || payload === void 0 ? void 0 : payload.summary)
720
+ || "Codex review marked this operation as ".concat(riskLevel, " risk.");
721
+ var reasons = normalizeRiskList(payload === null || payload === void 0 ? void 0 : payload.reasons);
722
+ var suggestedChecks = normalizeRiskList(payload === null || payload === void 0 ? void 0 : payload.suggested_checks);
723
+ var shouldBlock = (payload === null || payload === void 0 ? void 0 : payload.should_block) === true || riskLevel === 'critical';
724
+ return {
725
+ operation: operation,
726
+ risk_level: riskLevel,
727
+ should_block: !!shouldBlock,
728
+ summary: truncateForRiskReview(summary, 220),
729
+ reasons: reasons,
730
+ suggested_checks: suggestedChecks,
731
+ confidence: confidence,
732
+ model: model || '',
733
+ request_id: requestId || '',
734
+ review_status: 'ok',
735
+ reviewed_at: new Date().toISOString()
736
+ };
737
+ }
738
+ function resolveRiskReviewSettings() {
739
+ var _a, _b, _c, _d, _e;
740
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
741
+ var enabled = parseBooleanValue((_a = serverConfig['MONGO_EXPLORER_ENABLE_AI_RISK_REVIEW']) !== null && _a !== void 0 ? _a : process.env.MONGO_EXPLORER_ENABLE_AI_RISK_REVIEW, true);
742
+ var model = normalizeOptionalString(serverConfig['MONGO_EXPLORER_RISK_REVIEW_MODEL']
743
+ || process.env.MONGO_EXPLORER_RISK_REVIEW_MODEL
744
+ || serverConfig['AI_ASSISTANT_CODEX_MODEL']
745
+ || process.env.AI_ASSISTANT_CODEX_MODEL
746
+ || serverConfig['AI_DASHBOARD_CODEX_MODEL']
747
+ || process.env.AI_DASHBOARD_CODEX_MODEL
748
+ || serverConfig['OPENAI_MODEL']
749
+ || process.env.OPENAI_MODEL) || DEFAULT_RISK_REVIEW_MODEL;
750
+ var fallbackModel = normalizeOptionalString(serverConfig['MONGO_EXPLORER_RISK_REVIEW_FALLBACK_MODEL']
751
+ || process.env.MONGO_EXPLORER_RISK_REVIEW_FALLBACK_MODEL
752
+ || serverConfig['AI_ASSISTANT_CODEX_FALLBACK_MODEL']
753
+ || process.env.AI_ASSISTANT_CODEX_FALLBACK_MODEL
754
+ || serverConfig['AI_DASHBOARD_CODEX_FALLBACK_MODEL']
755
+ || process.env.AI_DASHBOARD_CODEX_FALLBACK_MODEL);
756
+ var timeoutMs = normalizePositiveNumber((_b = serverConfig['MONGO_EXPLORER_RISK_REVIEW_TIMEOUT_MS']) !== null && _b !== void 0 ? _b : process.env.MONGO_EXPLORER_RISK_REVIEW_TIMEOUT_MS, DEFAULT_RISK_REVIEW_TIMEOUT_MS);
757
+ var maxTokens = normalizePositiveNumber((_c = serverConfig['MONGO_EXPLORER_RISK_REVIEW_MAX_TOKENS']) !== null && _c !== void 0 ? _c : process.env.MONGO_EXPLORER_RISK_REVIEW_MAX_TOKENS, DEFAULT_RISK_REVIEW_MAX_TOKENS);
758
+ var maxRetries = normalizePositiveNumber((_d = serverConfig['OPENAI_MAX_RETRIES']) !== null && _d !== void 0 ? _d : process.env.OPENAI_MAX_RETRIES, 1);
759
+ var retryDelayMs = normalizePositiveNumber((_e = serverConfig['OPENAI_RETRY_DELAY_MS']) !== null && _e !== void 0 ? _e : process.env.OPENAI_RETRY_DELAY_MS, 750);
760
+ var apiKey = normalizeOptionalString(serverConfig['OPENAI_API_KEY'] || process.env.OPENAI_API_KEY) || '';
761
+ var baseUrl = normalizeOptionalString(serverConfig['OPENAI_BASE_URL'] || process.env.OPENAI_BASE_URL);
762
+ return {
763
+ enabled: enabled,
764
+ apiKey: apiKey,
765
+ baseUrl: baseUrl,
766
+ model: model,
767
+ fallbackModel: fallbackModel,
768
+ timeoutMs: timeoutMs,
769
+ maxTokens: maxTokens,
770
+ maxRetries: maxRetries,
771
+ retryDelayMs: retryDelayMs
772
+ };
773
+ }
774
+ function buildRiskReviewPrompt(input) {
775
+ var payload = {
776
+ database: input.database,
777
+ collection: input.collection,
778
+ operation: input.operation,
779
+ mode: input.mode,
780
+ changed_fields: pickChangedFields(input.before_document, input.after_document),
781
+ delete_impact: sanitizeForRiskReview(input.delete_impact || null),
782
+ before_document: sanitizeForRiskReview(input.before_document || null),
783
+ after_document: sanitizeForRiskReview(input.after_document || null)
784
+ };
785
+ return [
786
+ 'Review this MongoDB write operation for runtime and data integrity risk.',
787
+ 'Focus on foreign-key style id_* dependencies, schema compatibility, destructive impact, and financial/operational record safety.',
788
+ 'Return JSON only.',
789
+ JSON.stringify(payload, null, 2)
790
+ ].join('\n');
791
+ }
792
+ function reviewOperationRisk(input) {
793
+ return __awaiter(this, void 0, void 0, function () {
794
+ var settings, client, systemPrompt, response, payload, err_1, detail;
795
+ return __generator(this, function (_a) {
796
+ switch (_a.label) {
797
+ case 0:
798
+ settings = resolveRiskReviewSettings();
799
+ if (!settings.enabled) {
800
+ return [2 /*return*/, buildDisabledRiskReview(input.operation)];
801
+ }
802
+ if (!settings.apiKey) {
803
+ return [2 /*return*/, buildFallbackRiskReview(input.operation, 'AI risk review unavailable: OPENAI_API_KEY is missing.')];
804
+ }
805
+ client = new openai_client_1.OpenAIClient({
806
+ apiKey: settings.apiKey,
807
+ baseUrl: settings.baseUrl,
808
+ model: settings.model,
809
+ fallbackModel: settings.fallbackModel,
810
+ temperature: 0.1,
811
+ maxTokens: settings.maxTokens,
812
+ maxRetries: (0, common_1.round)(settings.maxRetries),
813
+ retryDelayMs: (0, common_1.round)(settings.retryDelayMs),
814
+ responseFormat: 'json'
815
+ });
816
+ systemPrompt = [
817
+ 'You are a MongoDB operation safety reviewer for a production SaaS application.',
818
+ 'Respond with a single JSON object only.',
819
+ 'Required keys:',
820
+ 'risk_level ("low" | "medium" | "high" | "critical"),',
821
+ 'should_block (boolean),',
822
+ 'summary (string),',
823
+ 'reasons (string[]),',
824
+ 'suggested_checks (string[]),',
825
+ 'confidence (number between 0 and 1).',
826
+ 'Keep summary concise (<= 220 chars).'
827
+ ].join(' ');
828
+ _a.label = 1;
829
+ case 1:
830
+ _a.trys.push([1, 3, , 4]);
831
+ return [4 /*yield*/, client.chat([
832
+ { role: 'system', content: systemPrompt },
833
+ { role: 'user', content: buildRiskReviewPrompt(input) }
834
+ ], {
835
+ timeoutMs: (0, common_1.round)(settings.timeoutMs),
836
+ responseFormat: 'json'
837
+ })];
838
+ case 2:
839
+ response = _a.sent();
840
+ payload = parseRiskReviewPayload(response.content);
841
+ return [2 /*return*/, normalizeRiskReview(input.operation, payload, response.model || settings.model, response.requestId || '')];
842
+ case 3:
843
+ err_1 = _a.sent();
844
+ detail = (err_1 === null || err_1 === void 0 ? void 0 : err_1.message) ? String(err_1.message) : 'Unknown AI review error';
845
+ return [2 /*return*/, buildFallbackRiskReview(input.operation, "AI risk review failed: ".concat(truncateForRiskReview(detail, 160)), settings.model)];
846
+ case 4: return [2 /*return*/];
847
+ }
848
+ });
849
+ });
850
+ }
184
851
  function loadMongoExplorerMethods(methodManager) {
185
852
  methodManager.methods({
186
853
  mongoExplorerListCollections: {
@@ -259,6 +926,47 @@ function loadMongoExplorerMethods(methodManager) {
259
926
  });
260
927
  }
261
928
  },
929
+ mongoExplorerGetCollectionSchema: {
930
+ check: new simpl_schema_1.default({
931
+ database: {
932
+ type: String,
933
+ optional: true
934
+ },
935
+ collection: {
936
+ type: String
937
+ }
938
+ }),
939
+ function: function (database, collection) {
940
+ var dbName = resolveDatabaseName(database);
941
+ var managerCollection = resolveCollectionHandle(dbName, collection).managerCollection;
942
+ if (!managerCollection) {
943
+ return Promise.resolve({
944
+ collection: collection,
945
+ has_schema: false,
946
+ fields: []
947
+ });
948
+ }
949
+ var schema = getSchemaDefinition(managerCollection);
950
+ var fields = Object.keys(schema)
951
+ .sort(function (a, b) { return a.localeCompare(b); })
952
+ .map(function (path) {
953
+ var definition = schema[path];
954
+ return {
955
+ path: path,
956
+ label: toLabel(path),
957
+ type: getSchemaTypeName(definition),
958
+ optional: (definition === null || definition === void 0 ? void 0 : definition.optional) === true,
959
+ protected: isProtectedFieldPath(path),
960
+ depth: path.split('.').filter(function (segment) { return segment !== '$'; }).length - 1
961
+ };
962
+ });
963
+ return Promise.resolve({
964
+ collection: collection,
965
+ has_schema: true,
966
+ fields: fields
967
+ });
968
+ }
969
+ },
262
970
  mongoExplorerAggregate: {
263
971
  bypassSession: true,
264
972
  check: new simpl_schema_1.default({
@@ -306,14 +1014,18 @@ function loadMongoExplorerMethods(methodManager) {
306
1014
  permissionView: {
307
1015
  type: String,
308
1016
  optional: true
1017
+ },
1018
+ mode: {
1019
+ type: String,
1020
+ optional: true
309
1021
  }
310
1022
  }),
311
- function: function (database, command, permissionView) {
1023
+ function: function (database, command, permissionView, mode) {
312
1024
  return __awaiter(this, void 0, void 0, function () {
313
1025
  var db;
314
1026
  return __generator(this, function (_a) {
315
1027
  switch (_a.label) {
316
- case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView)];
1028
+ case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView, mode)];
317
1029
  case 1:
318
1030
  _a.sent();
319
1031
  db = resolveDatabase(database);
@@ -339,14 +1051,18 @@ function loadMongoExplorerMethods(methodManager) {
339
1051
  permissionView: {
340
1052
  type: String,
341
1053
  optional: true
1054
+ },
1055
+ mode: {
1056
+ type: String,
1057
+ optional: true
342
1058
  }
343
1059
  }),
344
- function: function (database, collection, document, permissionView) {
1060
+ function: function (database, collection, document, permissionView, mode) {
345
1061
  return __awaiter(this, void 0, void 0, function () {
346
1062
  var dbName, _a, managerCollection, dbCollection;
347
1063
  return __generator(this, function (_b) {
348
1064
  switch (_b.label) {
349
- case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView)];
1065
+ case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView, mode)];
350
1066
  case 1:
351
1067
  _b.sent();
352
1068
  dbName = resolveDatabaseName(database);
@@ -354,6 +1070,9 @@ function loadMongoExplorerMethods(methodManager) {
354
1070
  if (!document || typeof document !== 'object') {
355
1071
  throw new Error('Mongo Explorer: Document is required');
356
1072
  }
1073
+ if (!managerCollection && !allowUnschemaizedWrites()) {
1074
+ throw new Error('Mongo Explorer: Writes require schema-backed collections. Set MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE=true to bypass.');
1075
+ }
357
1076
  if (!document._id) {
358
1077
  document._id = (0, common_1.objectIdHexString)();
359
1078
  }
@@ -361,6 +1080,7 @@ function loadMongoExplorerMethods(methodManager) {
361
1080
  document.__v = 0;
362
1081
  }
363
1082
  if (!managerCollection) return [3 /*break*/, 3];
1083
+ coerceDateFields(managerCollection, document);
364
1084
  return [4 /*yield*/, managerCollection.insertOne(document)];
365
1085
  case 2:
366
1086
  _b.sent();
@@ -391,31 +1111,114 @@ function loadMongoExplorerMethods(methodManager) {
391
1111
  permissionView: {
392
1112
  type: String,
393
1113
  optional: true
1114
+ },
1115
+ mode: {
1116
+ type: String,
1117
+ optional: true
394
1118
  }
395
1119
  }),
396
- function: function (database, collection, document, permissionView) {
1120
+ function: function (database, collection, document, permissionView, mode) {
397
1121
  return __awaiter(this, void 0, void 0, function () {
398
- var dbName, _a, managerCollection, dbCollection;
399
- return __generator(this, function (_b) {
400
- switch (_b.label) {
401
- case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView)];
1122
+ var dbName, _a, managerCollection, dbCollection, currentDoc, _b;
1123
+ return __generator(this, function (_c) {
1124
+ switch (_c.label) {
1125
+ case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView, mode)];
402
1126
  case 1:
403
- _b.sent();
1127
+ _c.sent();
404
1128
  dbName = resolveDatabaseName(database);
405
1129
  _a = resolveCollectionHandle(dbName, collection), managerCollection = _a.managerCollection, dbCollection = _a.dbCollection;
406
1130
  if (!document || typeof document !== 'object' || !document._id) {
407
1131
  throw new Error('Mongo Explorer: Document with _id is required');
408
1132
  }
409
1133
  if (!managerCollection) return [3 /*break*/, 3];
410
- return [4 /*yield*/, managerCollection.replaceOne({ _id: document._id }, document)];
1134
+ return [4 /*yield*/, managerCollection.findOne({ _id: document._id })];
411
1135
  case 2:
412
- _b.sent();
1136
+ _b = _c.sent();
413
1137
  return [3 /*break*/, 5];
414
- case 3: return [4 /*yield*/, dbCollection.replaceOne({ _id: document._id }, document)];
1138
+ case 3: return [4 /*yield*/, dbCollection.findOne({ _id: document._id })];
415
1139
  case 4:
416
- _b.sent();
417
- _b.label = 5;
418
- case 5: return [2 /*return*/, true];
1140
+ _b = _c.sent();
1141
+ _c.label = 5;
1142
+ case 5:
1143
+ currentDoc = _b;
1144
+ if (!currentDoc) {
1145
+ throw new Error('Mongo Explorer: Document not found');
1146
+ }
1147
+ ensureProtectedFieldsUnchanged(currentDoc, document);
1148
+ if (!managerCollection && !allowUnschemaizedWrites()) {
1149
+ throw new Error('Mongo Explorer: Writes require schema-backed collections. Set MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE=true to bypass.');
1150
+ }
1151
+ if (!managerCollection) return [3 /*break*/, 7];
1152
+ coerceDateFields(managerCollection, document);
1153
+ return [4 /*yield*/, managerCollection.replaceOne({ _id: document._id }, document)];
1154
+ case 6:
1155
+ _c.sent();
1156
+ return [3 /*break*/, 9];
1157
+ case 7: return [4 /*yield*/, dbCollection.replaceOne({ _id: document._id }, document)];
1158
+ case 8:
1159
+ _c.sent();
1160
+ _c.label = 9;
1161
+ case 9: return [2 /*return*/, true];
1162
+ }
1163
+ });
1164
+ });
1165
+ }
1166
+ },
1167
+ mongoExplorerReviewOperationRisk: {
1168
+ check: new simpl_schema_1.default({
1169
+ database: {
1170
+ type: String,
1171
+ optional: true
1172
+ },
1173
+ collection: {
1174
+ type: String
1175
+ },
1176
+ operation: {
1177
+ type: String,
1178
+ allowedValues: ['insert', 'replace', 'delete', 'command']
1179
+ },
1180
+ before_document: {
1181
+ type: Object,
1182
+ blackbox: true,
1183
+ optional: true
1184
+ },
1185
+ after_document: {
1186
+ type: Object,
1187
+ blackbox: true,
1188
+ optional: true
1189
+ },
1190
+ delete_impact: {
1191
+ type: Object,
1192
+ blackbox: true,
1193
+ optional: true
1194
+ },
1195
+ permissionView: {
1196
+ type: String,
1197
+ optional: true
1198
+ },
1199
+ mode: {
1200
+ type: String,
1201
+ optional: true
1202
+ }
1203
+ }),
1204
+ function: function (database, collection, operation, before_document, after_document, delete_impact, permissionView, mode) {
1205
+ return __awaiter(this, void 0, void 0, function () {
1206
+ var dbName;
1207
+ return __generator(this, function (_a) {
1208
+ switch (_a.label) {
1209
+ case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView, mode)];
1210
+ case 1:
1211
+ _a.sent();
1212
+ dbName = resolveDatabaseName(database);
1213
+ return [2 /*return*/, reviewOperationRisk({
1214
+ database: dbName,
1215
+ collection: collection,
1216
+ operation: operation,
1217
+ mode: normalizeExplorerMode(mode),
1218
+ before_document: before_document,
1219
+ after_document: after_document,
1220
+ delete_impact: delete_impact
1221
+ })];
419
1222
  }
420
1223
  });
421
1224
  });
@@ -436,33 +1239,75 @@ function loadMongoExplorerMethods(methodManager) {
436
1239
  permissionView: {
437
1240
  type: String,
438
1241
  optional: true
1242
+ },
1243
+ force: {
1244
+ type: Boolean,
1245
+ optional: true
1246
+ },
1247
+ mode: {
1248
+ type: String,
1249
+ optional: true
439
1250
  }
440
1251
  }),
441
- function: function (database, collection, doc_id, permissionView) {
442
- return __awaiter(this, void 0, void 0, function () {
443
- var dbName, _a, managerCollection, dbCollection, deleteFilter;
1252
+ function: function (database_1, collection_1, doc_id_1, permissionView_1) {
1253
+ return __awaiter(this, arguments, void 0, function (database, collection, doc_id, permissionView, force, mode) {
1254
+ var dbName, impact, collectionPreview, _a, managerCollection, dbCollection, deleteFilter;
1255
+ if (force === void 0) { force = false; }
444
1256
  return __generator(this, function (_b) {
445
1257
  switch (_b.label) {
446
- case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView)];
1258
+ case 0: return [4 /*yield*/, ensureWriteAccess(this, permissionView, mode)];
447
1259
  case 1:
448
1260
  _b.sent();
449
1261
  dbName = resolveDatabaseName(database);
1262
+ return [4 /*yield*/, buildDeleteImpact(dbName, collection, doc_id)];
1263
+ case 2:
1264
+ impact = _b.sent();
1265
+ if (!force && (impact.unresolved || impact.has_references)) {
1266
+ collectionPreview = impact.collections.slice(0, 3).map(function (item) { return item.collection; }).join(', ');
1267
+ if (impact.unresolved) {
1268
+ throw new Error('Mongo Explorer: Delete blocked because dependency checks could not complete. Use force delete after review.');
1269
+ }
1270
+ throw new Error("Mongo Explorer: Delete blocked. Document is referenced by ".concat(collectionPreview).concat(impact.collections.length > 3 ? ', ...' : ''));
1271
+ }
450
1272
  _a = resolveCollectionHandle(dbName, collection), managerCollection = _a.managerCollection, dbCollection = _a.dbCollection;
451
1273
  deleteFilter = { _id: doc_id };
452
- if (!managerCollection) return [3 /*break*/, 3];
1274
+ if (!managerCollection) return [3 /*break*/, 4];
453
1275
  return [4 /*yield*/, managerCollection.deleteOne(deleteFilter)];
454
- case 2:
1276
+ case 3:
455
1277
  _b.sent();
456
- return [3 /*break*/, 5];
457
- case 3: return [4 /*yield*/, dbCollection.deleteOne(deleteFilter)];
458
- case 4:
1278
+ return [3 /*break*/, 6];
1279
+ case 4: return [4 /*yield*/, dbCollection.deleteOne(deleteFilter)];
1280
+ case 5:
459
1281
  _b.sent();
460
- _b.label = 5;
461
- case 5: return [2 /*return*/, true];
1282
+ _b.label = 6;
1283
+ case 6: return [2 /*return*/, true];
462
1284
  }
463
1285
  });
464
1286
  });
465
1287
  }
1288
+ },
1289
+ mongoExplorerDeleteImpact: {
1290
+ check: new simpl_schema_1.default({
1291
+ database: {
1292
+ type: String,
1293
+ optional: true
1294
+ },
1295
+ collection: {
1296
+ type: String
1297
+ },
1298
+ doc_id: {
1299
+ type: String
1300
+ }
1301
+ }),
1302
+ function: function (database, collection, doc_id) {
1303
+ return __awaiter(this, void 0, void 0, function () {
1304
+ var dbName;
1305
+ return __generator(this, function (_a) {
1306
+ dbName = resolveDatabaseName(database);
1307
+ return [2 /*return*/, buildDeleteImpact(dbName, collection, doc_id)];
1308
+ });
1309
+ });
1310
+ }
466
1311
  }
467
1312
  });
468
1313
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/methods/mongo-explorer.ts"],"names":[],"mappings":"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","file":"mongo-explorer.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Db } from 'mongodb';\nimport { Users } from '../collections/user.collection';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { objectIdHexString } from '../util/common';\n\nconst DEFAULT_LIMIT = 100;\nconst MAX_LIMIT = 2000;\n\ntype ExplorerFindOptions = {\n\tprojection?: Record<string, number>;\n\tsort?: Record<string, any>;\n\tlimit?: number;\n\tskip?: number;\n\tincludeTotal?: boolean;\n};\n\nfunction parseMongoExplorerWriteUsers(): string[] {\n\tconst raw = typeof process.env.MONGO_EXPLORER_WRITE_USERS === 'string' ? process.env.MONGO_EXPLORER_WRITE_USERS.trim() : '';\n\tif (!raw) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (Array.isArray(parsed)) {\n\t\t\treturn parsed.map(value => String(value)).filter(value => value.trim().length);\n\t\t}\n\t\tif (typeof parsed === 'string') {\n\t\t\treturn [parsed.trim()].filter(Boolean);\n\t\t}\n\t}\n\tcatch {\n\t\t// Fall back to comma-separated list.\n\t}\n\n\treturn raw\n\t\t.split(',')\n\t\t.map(value => value.trim())\n\t\t.filter(Boolean);\n}\n\nfunction resolveDatabaseName(database?: string): string {\n\tconst defaultDb = ResolveIOServer.getServerConfig()?.DATABASE || '';\n\tconst dbName = typeof database === 'string' && database.trim().length ? database.trim() : defaultDb;\n\n\tif (!dbName) {\n\t\tthrow new Error('Mongo Explorer: Database is required');\n\t}\n\n\tconst allowedDatabases = ResolveIOServer.getMongoManager()?.getWatchedDatabases() || [];\n\tif (allowedDatabases.length && !allowedDatabases.includes(dbName)) {\n\t\tthrow new Error('Mongo Explorer: Database access denied');\n\t}\n\n\treturn dbName;\n}\n\nfunction resolveDatabase(database?: string): Db {\n\tconst dbName = resolveDatabaseName(database);\n\treturn ResolveIOServer.getMongoConnection().db(dbName);\n}\n\nfunction resolveCollectionHandle(database: string, collection: string) {\n\tconst mainDb = ResolveIOServer.getServerConfig()?.DATABASE || '';\n\tconst isMainDb = database === mainDb;\n\tconst managerCollection = isMainDb ? ResolveIOServer.getMongoManager()?.collection(collection) : null;\n\tconst db = ResolveIOServer.getMongoConnection().db(database);\n\n\treturn {\n\t\tmanagerCollection,\n\t\tdbCollection: db.collection(collection)\n\t};\n}\n\nfunction normalizeFindOptions(options?: ExplorerFindOptions) {\n\tconst normalized = options || {};\n\tconst projection = normalized.projection && Object.keys(normalized.projection).length ? normalized.projection : undefined;\n\tconst sort = normalized.sort && Object.keys(normalized.sort).length ? normalized.sort : undefined;\n\tconst limit = typeof normalized.limit === 'number' ? Math.min(Math.max(normalized.limit, 0), MAX_LIMIT) : DEFAULT_LIMIT;\n\tconst skip = typeof normalized.skip === 'number' ? Math.max(normalized.skip, 0) : 0;\n\n\treturn {\n\t\tfindOptions: {\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\tlimit,\n\t\t\tskip\n\t\t},\n\t\tincludeTotal: normalized.includeTotal === true\n\t};\n}\n\nfunction userHasView(user, view: string): boolean {\n\tif (!user || !view) {\n\t\treturn false;\n\t}\n\n\tif (user.roles?.super_admin) {\n\t\treturn true;\n\t}\n\n\tconst groups = Array.isArray(user.roles?.groups) ? user.roles.groups : [];\n\tconst miscs = Array.isArray(user.roles?.miscs) ? user.roles.miscs : [];\n\n\tif (groups.some(group => Array.isArray(group.views) && group.views.some(v => v.startsWith(view)))) {\n\t\treturn true;\n\t}\n\n\tif (miscs.some(v => v.startsWith(view))) {\n\t\treturn true;\n\t}\n\n\tif (groups.some(group => group.name === view)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nasync function ensureWriteAccess(context: any, permissionView?: string) {\n\tconst idUser = context?.id_user;\n\tif (!idUser) {\n\t\tthrow new Error('Mongo Explorer: Unauthorized');\n\t}\n\n\tconst user = await Users.findOne({_id: idUser});\n\tif (!user) {\n\t\tthrow new Error('Mongo Explorer: Unauthorized');\n\t}\n\n\tif (user.readonly) {\n\t\tthrow new Error('Mongo Explorer: Readonly user');\n\t}\n\n\tconst allowedUsers = parseMongoExplorerWriteUsers();\n\tif (allowedUsers.length) {\n\t\tconst username = String(user.username || '').trim().toLowerCase();\n\t\tconst email = String(user.email || '').trim().toLowerCase();\n\t\tconst id = String(user._id || '').trim();\n\t\tconst isAllowed = allowedUsers.some(entry => {\n\t\t\tconst normalized = String(entry || '').trim().toLowerCase();\n\t\t\tif (!normalized) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn normalized === username || (email && normalized === email) || (id && entry === id);\n\t\t});\n\n\t\tif (!isAllowed) {\n\t\t\tthrow new Error('Mongo Explorer: Write access denied');\n\t\t}\n\t}\n\n\tif (user.roles?.super_admin) {\n\t\treturn;\n\t}\n\n\tconst normalizedPermission = typeof permissionView === 'string' ? permissionView.trim() : '';\n\n\tif (!normalizedPermission) {\n\t\treturn;\n\t}\n\n\tif (userHasView(user, normalizedPermission)) {\n\t\treturn;\n\t}\n\n\tthrow new Error('Mongo Explorer: Write access denied');\n}\n\nexport function loadMongoExplorerMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tmongoExplorerListCollections: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database?: string) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\tconst collections = await db.listCollections().toArray();\n\t\t\t\treturn collections\n\t\t\t\t\t.map(col => ({\n\t\t\t\t\t\tname: col.name,\n\t\t\t\t\t\ttype: col.type || 'collection'\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t\t\t}\n\t\t},\n\t\tmongoExplorerFind: {\n\t\t\tbypassSession: true,\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tquery: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, query: any = {}, options?) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\tconst normalized = normalizeFindOptions(options);\n\t\t\t\tconst documents = await db.collection(collection).find(query || {}, normalized.findOptions).toArray();\n\t\t\t\tlet total = null;\n\n\t\t\t\tif (normalized.includeTotal) {\n\t\t\t\t\ttotal = await db.collection(collection).countDocuments(query || {});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tdocuments,\n\t\t\t\t\ttotal\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\tmongoExplorerAggregate: {\n\t\t\tbypassSession: true,\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpipeline: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'pipeline.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\toptional: true,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, pipeline: any[], options: any = {}) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\treturn db.collection(collection).aggregate(pipeline || [], options || undefined).toArray();\n\t\t\t}\n\t\t},\n\t\tmongoExplorerCommand: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcommand: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, command: any, permissionView?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView);\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\treturn db.command(command);\n\t\t\t}\n\t\t},\n\t\tmongoExplorerInsertDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdocument: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, document: any, permissionView?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView);\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\n\t\t\t\tif (!document || typeof document !== 'object') {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Document is required');\n\t\t\t\t}\n\n\t\t\t\tif (!document._id) {\n\t\t\t\t\tdocument._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (document.__v === undefined) {\n\t\t\t\t\tdocument.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (managerCollection) {\n\t\t\t\t\tawait managerCollection.insertOne(document);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tawait dbCollection.insertOne(document);\n\t\t\t\t}\n\n\t\t\t\treturn document._id;\n\t\t\t}\n\t\t},\n\t\tmongoExplorerReplaceDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdocument: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, document: any, permissionView?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView);\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\n\t\t\t\tif (!document || typeof document !== 'object' || !document._id) {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Document with _id is required');\n\t\t\t\t}\n\n\t\t\t\tif (managerCollection) {\n\t\t\t\t\tawait managerCollection.replaceOne({_id: document._id}, document);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tawait dbCollection.replaceOne({_id: document._id}, document);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tmongoExplorerDeleteDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdoc_id: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\t\tfunction: async function(database: string, collection: string, doc_id: string, permissionView?: string) {\n\t\t\t\t\tawait ensureWriteAccess(this, permissionView);\n\t\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\t\t\t\t\tconst deleteFilter = { _id: doc_id } as any;\n\n\t\t\t\t\tif (managerCollection) {\n\t\t\t\t\t\tawait managerCollection.deleteOne(deleteFilter);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tawait dbCollection.deleteOne(deleteFilter);\n\t\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"sources":["../../src/methods/mongo-explorer.ts"],"names":[],"mappings":"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","file":"mongo-explorer.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Db } from 'mongodb';\nimport { Users } from '../collections/user.collection';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { OpenAIClient } from '../services/openai-client';\nimport { objectIdHexString, round } from '../util/common';\n\nconst DEFAULT_LIMIT = 100;\nconst MAX_LIMIT = 2000;\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$/;\nconst MAX_REVIEW_STRING_LENGTH = 500;\nconst MAX_REVIEW_ARRAY_ITEMS = 10;\nconst MAX_REVIEW_OBJECT_KEYS = 40;\nconst MAX_REVIEW_DEPTH = 4;\nconst MAX_REVIEW_LIST_ITEMS = 6;\nconst MAX_REVIEW_CHANGED_FIELDS = 60;\nconst DEFAULT_RISK_REVIEW_TIMEOUT_MS = 30000;\nconst DEFAULT_RISK_REVIEW_MAX_TOKENS = 700;\nconst DEFAULT_RISK_REVIEW_MODEL = 'gpt-5.3-codex';\nconst SENSITIVE_REVIEW_FIELD_REGEX = /(password|secret|token|api[_-]?key|salt|hash|email|phone|address|ssn|services|roles)/i;\n\ntype ExplorerFindOptions = {\n\tprojection?: Record<string, number>;\n\tsort?: Record<string, any>;\n\tlimit?: number;\n\tskip?: number;\n\tincludeTotal?: boolean;\n};\n\ntype ExplorerMode = 'resolveio' | 'aicoder';\n\ntype MongoExplorerDeleteImpactCollection = {\n\tcollection: string;\n\treferences: number;\n\tsample_ids: string[];\n};\n\ntype MongoExplorerDeleteImpact = {\n\thas_references: boolean;\n\tunresolved: boolean;\n\tcollections: MongoExplorerDeleteImpactCollection[];\n};\n\ntype MongoExplorerRiskOperation = 'insert' | 'replace' | 'delete' | 'command';\ntype MongoExplorerRiskLevel = 'low' | 'medium' | 'high' | 'critical';\ntype MongoExplorerRiskReviewStatus = 'ok' | 'fallback' | 'disabled';\n\ntype MongoExplorerRiskReview = {\n\toperation: MongoExplorerRiskOperation;\n\trisk_level: MongoExplorerRiskLevel;\n\tshould_block: boolean;\n\tsummary: string;\n\treasons: string[];\n\tsuggested_checks: string[];\n\tconfidence: number;\n\tmodel: string;\n\trequest_id: string;\n\treview_status: MongoExplorerRiskReviewStatus;\n\treviewed_at: string;\n};\n\ntype MongoExplorerRiskReviewInput = {\n\tdatabase: string;\n\tcollection: string;\n\toperation: MongoExplorerRiskOperation;\n\tmode: ExplorerMode;\n\tbefore_document?: any;\n\tafter_document?: any;\n\tdelete_impact?: MongoExplorerDeleteImpact;\n};\n\nfunction parseMongoExplorerWriteUsers(): string[] {\n\tconst raw = typeof process.env.MONGO_EXPLORER_WRITE_USERS === 'string' ? process.env.MONGO_EXPLORER_WRITE_USERS.trim() : '';\n\tif (!raw) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (Array.isArray(parsed)) {\n\t\t\treturn parsed.map(value => String(value)).filter(value => value.trim().length);\n\t\t}\n\t\tif (typeof parsed === 'string') {\n\t\t\treturn [parsed.trim()].filter(Boolean);\n\t\t}\n\t}\n\tcatch {\n\t\t// Fall back to comma-separated list.\n\t}\n\n\treturn raw\n\t\t.split(',')\n\t\t.map(value => value.trim())\n\t\t.filter(Boolean);\n}\n\nfunction normalizeExplorerMode(mode?: string): ExplorerMode {\n\tconst normalizedMode = String(mode || '').trim().toLowerCase();\n\tif (normalizedMode === 'resolveio') {\n\t\treturn 'resolveio';\n\t}\n\treturn 'aicoder';\n}\n\nfunction isAdminUser(user: any): boolean {\n\tif (!user) {\n\t\treturn false;\n\t}\n\n\tconst username = String(user.username || '').trim().toLowerCase();\n\treturn username === 'admin' || user.roles?.super_admin === true;\n}\n\nfunction allowUnschemaizedWrites(): boolean {\n\treturn process.env.MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE === 'true';\n}\n\nfunction resolveDatabaseName(database?: string): string {\n\tconst defaultDb = ResolveIOServer.getServerConfig()?.DATABASE || '';\n\tconst dbName = typeof database === 'string' && database.trim().length ? database.trim() : defaultDb;\n\n\tif (!dbName) {\n\t\tthrow new Error('Mongo Explorer: Database is required');\n\t}\n\n\tconst allowedDatabases = ResolveIOServer.getMongoManager()?.getWatchedDatabases() || [];\n\tif (allowedDatabases.length && !allowedDatabases.includes(dbName)) {\n\t\tthrow new Error('Mongo Explorer: Database access denied');\n\t}\n\n\treturn dbName;\n}\n\nfunction resolveDatabase(database?: string): Db {\n\tconst dbName = resolveDatabaseName(database);\n\treturn ResolveIOServer.getMongoConnection().db(dbName);\n}\n\nfunction resolveCollectionHandle(database: string, collection: string) {\n\tconst mainDb = ResolveIOServer.getServerConfig()?.DATABASE || '';\n\tconst isMainDb = database === mainDb;\n\tconst managerCollection = isMainDb ? ResolveIOServer.getMongoManager()?.collection(collection) : null;\n\tconst db = ResolveIOServer.getMongoConnection().db(database);\n\n\treturn {\n\t\tmanagerCollection,\n\t\tdbCollection: db.collection(collection)\n\t};\n}\n\nfunction getSchemaDefinition(collectionRef: any): Record<string, any> {\n\tif (!collectionRef || !collectionRef.simplschema || typeof collectionRef.simplschema.schema !== 'function') {\n\t\treturn {};\n\t}\n\n\tconst schema = collectionRef.simplschema.schema();\n\treturn schema && typeof schema === 'object' ? schema : {};\n}\n\nfunction getSchemaTypeName(definition: any): string {\n\tconst typeDefs = definition?.type?.definitions;\n\tif (!Array.isArray(typeDefs) || !typeDefs.length) {\n\t\treturn 'Any';\n\t}\n\n\tconst firstType = typeDefs[0]?.type;\n\tif (!firstType) {\n\t\treturn 'Any';\n\t}\n\n\tif (firstType === String) {\n\t\treturn 'String';\n\t}\n\tif (firstType === Number) {\n\t\treturn 'Number';\n\t}\n\tif (firstType === Boolean) {\n\t\treturn 'Boolean';\n\t}\n\tif (firstType === Date) {\n\t\treturn 'Date';\n\t}\n\tif (firstType === Object) {\n\t\treturn 'Object';\n\t}\n\tif (firstType === Array) {\n\t\treturn 'Array';\n\t}\n\n\tconst typeName = firstType.name || String(firstType);\n\tif (typeName === 'Integer') {\n\t\treturn 'Number';\n\t}\n\treturn typeName;\n}\n\nfunction toLabel(path: string): string {\n\tconst last = path.split('.').pop() || path;\n\treturn last\n\t\t.replace(/\\$/g, '')\n\t\t.replace(/_/g, ' ')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.trim();\n}\n\nfunction isProtectedFieldSegment(segment: string): boolean {\n\tif (!segment) {\n\t\treturn false;\n\t}\n\n\tif (segment === '_id') {\n\t\treturn true;\n\t}\n\n\tconst normalizedSegment = segment.replace(/\\[\\d+\\]/g, '');\n\treturn normalizedSegment.toLowerCase().startsWith('id_');\n}\n\nfunction isProtectedFieldPath(path: string): boolean {\n\tconst segments = String(path || '').split('.').filter(Boolean);\n\treturn segments.some(segment => isProtectedFieldSegment(segment));\n}\n\nfunction safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t}\n\tcatch {\n\t\treturn String(value);\n\t}\n}\n\nfunction collectProtectedFieldPaths(value: any, prefix = '', out: Record<string, any> = {}): Record<string, any> {\n\tif (Array.isArray(value)) {\n\t\tvalue.forEach((item, index) => {\n\t\t\tconst nextPrefix = prefix ? `${prefix}[${index}]` : `[${index}]`;\n\t\t\tcollectProtectedFieldPaths(item, nextPrefix, out);\n\t\t});\n\t\treturn out;\n\t}\n\n\tif (!value || typeof value !== 'object') {\n\t\treturn out;\n\t}\n\n\tObject.keys(value).forEach((key) => {\n\t\tconst nextPrefix = prefix ? `${prefix}.${key}` : key;\n\t\tif (isProtectedFieldSegment(key)) {\n\t\t\tout[nextPrefix] = value[key];\n\t\t}\n\t\tcollectProtectedFieldPaths(value[key], nextPrefix, out);\n\t});\n\n\treturn out;\n}\n\nfunction ensureProtectedFieldsUnchanged(originalDoc: any, updatedDoc: any) {\n\tconst originalProtected = collectProtectedFieldPaths(originalDoc || {});\n\tconst updatedProtected = collectProtectedFieldPaths(updatedDoc || {});\n\tconst violations: string[] = [];\n\n\tObject.keys(originalProtected).forEach((path) => {\n\t\tif (!Object.prototype.hasOwnProperty.call(updatedProtected, path)) {\n\t\t\tviolations.push(path);\n\t\t\treturn;\n\t\t}\n\n\t\tconst originalValue = safeStringify(originalProtected[path]);\n\t\tconst updatedValue = safeStringify(updatedProtected[path]);\n\t\tif (originalValue !== updatedValue) {\n\t\t\tviolations.push(path);\n\t\t}\n\t});\n\n\tObject.keys(updatedProtected).forEach((path) => {\n\t\tif (!Object.prototype.hasOwnProperty.call(originalProtected, path)) {\n\t\t\tviolations.push(path);\n\t\t}\n\t});\n\n\tif (violations.length) {\n\t\tconst preview = violations.slice(0, 4).join(', ');\n\t\tthrow new Error(`Mongo Explorer: Protected fields cannot be edited (${preview}${violations.length > 4 ? ', ...' : ''})`);\n\t}\n}\n\nfunction coerceDateValue(value: unknown): unknown {\n\tif (value instanceof Date) {\n\t\treturn value;\n\t}\n\n\tif (typeof value !== 'string' || !ISO_DATE_REGEX.test(value)) {\n\t\treturn value;\n\t}\n\n\tconst parsed = new Date(value);\n\treturn Number.isNaN(parsed.getTime()) ? value : parsed;\n}\n\nfunction coerceDatePath(target: any, segments: string[]) {\n\tif (!target || !segments.length) {\n\t\treturn;\n\t}\n\n\tconst [segment, ...rest] = segments;\n\n\tif (segment === '$') {\n\t\tif (Array.isArray(target)) {\n\t\t\ttarget.forEach(item => coerceDatePath(item, rest));\n\t\t}\n\t\treturn;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(target, segment)) {\n\t\treturn;\n\t}\n\n\tif (rest.length === 0) {\n\t\tconst updatedValue = coerceDateValue(target[segment]);\n\t\tif (updatedValue !== target[segment]) {\n\t\t\ttarget[segment] = updatedValue;\n\t\t}\n\t\treturn;\n\t}\n\n\tcoerceDatePath(target[segment], rest);\n}\n\nfunction coerceDateFields(collectionRef: any, doc: any) {\n\tif (!collectionRef || !collectionRef.simplschema || !doc) {\n\t\treturn;\n\t}\n\n\tconst schema = getSchemaDefinition(collectionRef);\n\tObject.keys(schema).forEach((schemaKey) => {\n\t\tconst definition = schema[schemaKey];\n\t\tconst typeDefs = definition?.type?.definitions;\n\t\tif (!Array.isArray(typeDefs) || !typeDefs.some(typeDef => typeDef.type === Date)) {\n\t\t\treturn;\n\t\t}\n\n\t\tcoerceDatePath(doc, schemaKey.split('.'));\n\t});\n}\n\nfunction normalizeFindOptions(options?: ExplorerFindOptions) {\n\tconst normalized = options || {};\n\tconst projection = normalized.projection && Object.keys(normalized.projection).length ? normalized.projection : undefined;\n\tconst sort = normalized.sort && Object.keys(normalized.sort).length ? normalized.sort : undefined;\n\tconst limit = typeof normalized.limit === 'number' ? Math.min(Math.max(normalized.limit, 0), MAX_LIMIT) : DEFAULT_LIMIT;\n\tconst skip = typeof normalized.skip === 'number' ? Math.max(normalized.skip, 0) : 0;\n\n\treturn {\n\t\tfindOptions: {\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\tlimit,\n\t\t\tskip\n\t\t},\n\t\tincludeTotal: normalized.includeTotal === true\n\t};\n}\n\nfunction userHasView(user, view: string): boolean {\n\tif (!user || !view) {\n\t\treturn false;\n\t}\n\n\tif (user.roles?.super_admin) {\n\t\treturn true;\n\t}\n\n\tconst groups = Array.isArray(user.roles?.groups) ? user.roles.groups : [];\n\tconst miscs = Array.isArray(user.roles?.miscs) ? user.roles.miscs : [];\n\n\tif (groups.some(group => Array.isArray(group.views) && group.views.some(v => v.startsWith(view)))) {\n\t\treturn true;\n\t}\n\n\tif (miscs.some(v => v.startsWith(view))) {\n\t\treturn true;\n\t}\n\n\tif (groups.some(group => group.name === view)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nasync function ensureWriteAccess(context: any, permissionView?: string, mode?: string) {\n\tconst idUser = context?.id_user;\n\tif (!idUser) {\n\t\tthrow new Error('Mongo Explorer: Unauthorized');\n\t}\n\n\tconst user = await Users.findOne({_id: idUser});\n\tif (!user) {\n\t\tthrow new Error('Mongo Explorer: Unauthorized');\n\t}\n\n\tif (user.readonly) {\n\t\tthrow new Error('Mongo Explorer: Readonly user');\n\t}\n\n\tconst normalizedMode = normalizeExplorerMode(mode);\n\tif (normalizedMode === 'resolveio' && !isAdminUser(user)) {\n\t\tthrow new Error('Mongo Explorer: ResolveIO mode is read only for non-admin users');\n\t}\n\n\tconst allowedUsers = parseMongoExplorerWriteUsers();\n\tif (allowedUsers.length) {\n\t\tconst username = String(user.username || '').trim().toLowerCase();\n\t\tconst email = String(user.email || '').trim().toLowerCase();\n\t\tconst id = String(user._id || '').trim();\n\t\tconst isAllowed = allowedUsers.some(entry => {\n\t\t\tconst normalized = String(entry || '').trim().toLowerCase();\n\t\t\tif (!normalized) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn normalized === username || (email && normalized === email) || (id && entry === id);\n\t\t});\n\n\t\tif (!isAllowed) {\n\t\t\tthrow new Error('Mongo Explorer: Write access denied');\n\t\t}\n\t}\n\n\tif (user.roles?.super_admin) {\n\t\treturn;\n\t}\n\n\tconst normalizedPermission = typeof permissionView === 'string' ? permissionView.trim() : '';\n\n\tif (!normalizedPermission) {\n\t\treturn;\n\t}\n\n\tif (userHasView(user, normalizedPermission)) {\n\t\treturn;\n\t}\n\n\tthrow new Error('Mongo Explorer: Write access denied');\n}\n\nfunction buildDeleteSafetyCollections(collectionRef: any): string[] {\n\tconst schema = getSchemaDefinition(collectionRef);\n\treturn Object.keys(schema).filter(path => isProtectedFieldPath(path) && path !== '_id');\n}\n\nasync function buildDeleteImpact(database: string, sourceCollection: string, docId: string): Promise<MongoExplorerDeleteImpact> {\n\tconst mainDb = ResolveIOServer.getServerConfig()?.DATABASE || '';\n\tif (database !== mainDb) {\n\t\treturn {\n\t\t\thas_references: false,\n\t\t\tunresolved: true,\n\t\t\tcollections: []\n\t\t};\n\t}\n\n\tconst mongoManager = ResolveIOServer.getMongoManager();\n\tconst collections = mongoManager?.collections ? mongoManager.collections() : [];\n\tconst impacts: MongoExplorerDeleteImpactCollection[] = [];\n\tlet unresolved = false;\n\n\tfor (const collectionRef of collections) {\n\t\tconst collectionName = collectionRef?.collectionName;\n\t\tif (!collectionName) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (collectionName === `${sourceCollection}.versions`) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst referencePaths = buildDeleteSafetyCollections(collectionRef);\n\t\tif (!referencePaths.length) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst query = {\n\t\t\t$or: referencePaths.map(path => ({ [path]: docId }))\n\t\t};\n\n\t\ttry {\n\t\t\tconst docs = await collectionRef.find(query, { projection: { _id: 1 }, limit: 3 });\n\t\t\tif (Array.isArray(docs) && docs.length) {\n\t\t\t\timpacts.push({\n\t\t\t\t\tcollection: collectionName,\n\t\t\t\t\treferences: docs.length,\n\t\t\t\t\tsample_ids: docs.map(doc => String(doc?._id || '')).filter(Boolean)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tcatch {\n\t\t\tunresolved = true;\n\t\t}\n\t}\n\n\treturn {\n\t\thas_references: impacts.length > 0,\n\t\tunresolved,\n\t\tcollections: impacts.sort((a, b) => a.collection.localeCompare(b.collection))\n\t};\n}\n\nfunction normalizeOptionalString(value: any): string | undefined {\n\tif (typeof value === 'string') {\n\t\tconst trimmed = value.trim();\n\t\treturn trimmed.length ? trimmed : undefined;\n\t}\n\tif (value === null || value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst normalized = String(value).trim();\n\treturn normalized.length ? normalized : undefined;\n}\n\nfunction normalizePositiveNumber(value: any, fallback: number): number {\n\tconst parsed = Number(value);\n\tif (!Number.isFinite(parsed) || parsed <= 0) {\n\t\treturn fallback;\n\t}\n\treturn parsed;\n}\n\nfunction parseBooleanValue(value: any, fallback: boolean): boolean {\n\tif (typeof value === 'boolean') {\n\t\treturn value;\n\t}\n\tconst normalized = String(value || '').trim().toLowerCase();\n\tif (!normalized.length) {\n\t\treturn fallback;\n\t}\n\tif (['1', 'true', 'yes', 'on'].includes(normalized)) {\n\t\treturn true;\n\t}\n\tif (['0', 'false', 'no', 'off'].includes(normalized)) {\n\t\treturn false;\n\t}\n\treturn fallback;\n}\n\nfunction truncateForRiskReview(value: string, maxLength = MAX_REVIEW_STRING_LENGTH): string {\n\tconst normalized = String(value || '');\n\tif (normalized.length <= maxLength) {\n\t\treturn normalized;\n\t}\n\tconst diff = normalized.length - maxLength;\n\treturn `${normalized.slice(0, maxLength)}...[+${diff} chars]`;\n}\n\nfunction sanitizeForRiskReview(value: any, depth = 0): any {\n\tif (value === null || value === undefined) {\n\t\treturn value;\n\t}\n\n\tif (depth > MAX_REVIEW_DEPTH) {\n\t\treturn '[Truncated depth]';\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\n\tif (typeof value === 'string') {\n\t\treturn truncateForRiskReview(value);\n\t}\n\n\tif (typeof value === 'number' || typeof value === 'boolean') {\n\t\treturn value;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tconst sanitized = value\n\t\t\t.slice(0, MAX_REVIEW_ARRAY_ITEMS)\n\t\t\t.map(item => sanitizeForRiskReview(item, depth + 1));\n\t\tif (value.length > MAX_REVIEW_ARRAY_ITEMS) {\n\t\t\tsanitized.push(`[${value.length - MAX_REVIEW_ARRAY_ITEMS} more item(s)]`);\n\t\t}\n\t\treturn sanitized;\n\t}\n\n\tif (typeof value === 'object') {\n\t\tconst output: Record<string, any> = {};\n\t\tconst keys = Object.keys(value);\n\t\tconst limitedKeys = keys.slice(0, MAX_REVIEW_OBJECT_KEYS);\n\t\tlimitedKeys.forEach((key) => {\n\t\t\tif (SENSITIVE_REVIEW_FIELD_REGEX.test(key)) {\n\t\t\t\toutput[key] = '[REDACTED]';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\toutput[key] = sanitizeForRiskReview(value[key], depth + 1);\n\t\t});\n\t\tif (keys.length > MAX_REVIEW_OBJECT_KEYS) {\n\t\t\toutput.__truncated_keys = keys.length - MAX_REVIEW_OBJECT_KEYS;\n\t\t}\n\t\treturn output;\n\t}\n\n\treturn truncateForRiskReview(String(value));\n}\n\nfunction pickChangedFields(beforeDocument: any, afterDocument: any): string[] {\n\tif (!beforeDocument || typeof beforeDocument !== 'object' || !afterDocument || typeof afterDocument !== 'object') {\n\t\treturn [];\n\t}\n\n\tconst changed: string[] = [];\n\tconst fieldNames = new Set<string>([\n\t\t...Object.keys(beforeDocument),\n\t\t...Object.keys(afterDocument)\n\t]);\n\n\tfor (const field of fieldNames) {\n\t\tif (changed.length >= MAX_REVIEW_CHANGED_FIELDS) {\n\t\t\tbreak;\n\t\t}\n\t\tconst beforeValue = safeStringify(beforeDocument[field]);\n\t\tconst afterValue = safeStringify(afterDocument[field]);\n\t\tif (beforeValue !== afterValue) {\n\t\t\tchanged.push(field);\n\t\t}\n\t}\n\n\treturn changed;\n}\n\nfunction normalizeRiskLevel(value: any): MongoExplorerRiskLevel {\n\tconst normalized = String(value || '').trim().toLowerCase();\n\tif (normalized === 'low') {\n\t\treturn 'low';\n\t}\n\tif (normalized === 'medium') {\n\t\treturn 'medium';\n\t}\n\tif (normalized === 'high') {\n\t\treturn 'high';\n\t}\n\tif (normalized === 'critical') {\n\t\treturn 'critical';\n\t}\n\treturn 'high';\n}\n\nfunction normalizeRiskList(value: any): string[] {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\treturn value\n\t\t.map(item => normalizeOptionalString(item))\n\t\t.filter((item): item is string => !!item)\n\t\t.slice(0, MAX_REVIEW_LIST_ITEMS)\n\t\t.map(item => truncateForRiskReview(item, 220));\n}\n\nfunction buildFallbackRiskReview(operation: MongoExplorerRiskOperation, summary: string, model = ''): MongoExplorerRiskReview {\n\treturn {\n\t\toperation,\n\t\trisk_level: 'high',\n\t\tshould_block: true,\n\t\tsummary: truncateForRiskReview(summary, 220),\n\t\treasons: [\n\t\t\t'AI review could not produce a reliable result.',\n\t\t\t'Proceed only with explicit approval and manual dependency checks.'\n\t\t],\n\t\tsuggested_checks: [\n\t\t\t'Confirm related records and id_* references before writing.',\n\t\t\t'Validate that schema-required fields and date values remain valid.'\n\t\t],\n\t\tconfidence: 0,\n\t\tmodel: model || '',\n\t\trequest_id: '',\n\t\treview_status: 'fallback',\n\t\treviewed_at: new Date().toISOString()\n\t};\n}\n\nfunction buildDisabledRiskReview(operation: MongoExplorerRiskOperation): MongoExplorerRiskReview {\n\treturn {\n\t\toperation,\n\t\trisk_level: 'low',\n\t\tshould_block: false,\n\t\tsummary: 'AI risk review is disabled by configuration.',\n\t\treasons: [],\n\t\tsuggested_checks: [],\n\t\tconfidence: 1,\n\t\tmodel: '',\n\t\trequest_id: '',\n\t\treview_status: 'disabled',\n\t\treviewed_at: new Date().toISOString()\n\t};\n}\n\nfunction parseRiskReviewPayload(content: string): any {\n\tconst normalized = String(content || '').trim();\n\tif (!normalized.length) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\treturn JSON.parse(normalized);\n\t}\n\tcatch {\n\t\t// Fall through and try to parse a JSON object embedded in plain text.\n\t}\n\n\tconst start = normalized.indexOf('{');\n\tconst end = normalized.lastIndexOf('}');\n\tif (start !== -1 && end > start) {\n\t\tconst candidate = normalized.slice(start, end + 1);\n\t\ttry {\n\t\t\treturn JSON.parse(candidate);\n\t\t}\n\t\tcatch {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\treturn {};\n}\n\nfunction normalizeRiskReview(\n\toperation: MongoExplorerRiskOperation,\n\tpayload: any,\n\tmodel: string,\n\trequestId: string\n): MongoExplorerRiskReview {\n\tconst riskLevel = normalizeRiskLevel(payload?.risk_level);\n\tconst normalizedConfidence = Number(payload?.confidence);\n\tconst confidence = Number.isFinite(normalizedConfidence)\n\t\t? Math.max(0, Math.min(1, normalizedConfidence))\n\t\t: 0.6;\n\tconst summary = normalizeOptionalString(payload?.summary)\n\t\t|| `Codex review marked this operation as ${riskLevel} risk.`;\n\tconst reasons = normalizeRiskList(payload?.reasons);\n\tconst suggestedChecks = normalizeRiskList(payload?.suggested_checks);\n\tconst shouldBlock = payload?.should_block === true || riskLevel === 'critical';\n\n\treturn {\n\t\toperation,\n\t\trisk_level: riskLevel,\n\t\tshould_block: !!shouldBlock,\n\t\tsummary: truncateForRiskReview(summary, 220),\n\t\treasons,\n\t\tsuggested_checks: suggestedChecks,\n\t\tconfidence,\n\t\tmodel: model || '',\n\t\trequest_id: requestId || '',\n\t\treview_status: 'ok',\n\t\treviewed_at: new Date().toISOString()\n\t};\n}\n\nfunction resolveRiskReviewSettings() {\n\tconst serverConfig = ResolveIOServer.getServerConfig() || {};\n\n\tconst enabled = parseBooleanValue(\n\t\tserverConfig['MONGO_EXPLORER_ENABLE_AI_RISK_REVIEW'] ?? process.env.MONGO_EXPLORER_ENABLE_AI_RISK_REVIEW,\n\t\ttrue\n\t);\n\n\tconst model = normalizeOptionalString(\n\t\tserverConfig['MONGO_EXPLORER_RISK_REVIEW_MODEL']\n\t\t|| process.env.MONGO_EXPLORER_RISK_REVIEW_MODEL\n\t\t|| serverConfig['AI_ASSISTANT_CODEX_MODEL']\n\t\t|| process.env.AI_ASSISTANT_CODEX_MODEL\n\t\t|| serverConfig['AI_DASHBOARD_CODEX_MODEL']\n\t\t|| process.env.AI_DASHBOARD_CODEX_MODEL\n\t\t|| serverConfig['OPENAI_MODEL']\n\t\t|| process.env.OPENAI_MODEL\n\t) || DEFAULT_RISK_REVIEW_MODEL;\n\n\tconst fallbackModel = normalizeOptionalString(\n\t\tserverConfig['MONGO_EXPLORER_RISK_REVIEW_FALLBACK_MODEL']\n\t\t|| process.env.MONGO_EXPLORER_RISK_REVIEW_FALLBACK_MODEL\n\t\t|| serverConfig['AI_ASSISTANT_CODEX_FALLBACK_MODEL']\n\t\t|| process.env.AI_ASSISTANT_CODEX_FALLBACK_MODEL\n\t\t|| serverConfig['AI_DASHBOARD_CODEX_FALLBACK_MODEL']\n\t\t|| process.env.AI_DASHBOARD_CODEX_FALLBACK_MODEL\n\t);\n\n\tconst timeoutMs = normalizePositiveNumber(\n\t\tserverConfig['MONGO_EXPLORER_RISK_REVIEW_TIMEOUT_MS'] ?? process.env.MONGO_EXPLORER_RISK_REVIEW_TIMEOUT_MS,\n\t\tDEFAULT_RISK_REVIEW_TIMEOUT_MS\n\t);\n\n\tconst maxTokens = normalizePositiveNumber(\n\t\tserverConfig['MONGO_EXPLORER_RISK_REVIEW_MAX_TOKENS'] ?? process.env.MONGO_EXPLORER_RISK_REVIEW_MAX_TOKENS,\n\t\tDEFAULT_RISK_REVIEW_MAX_TOKENS\n\t);\n\n\tconst maxRetries = normalizePositiveNumber(\n\t\tserverConfig['OPENAI_MAX_RETRIES'] ?? process.env.OPENAI_MAX_RETRIES,\n\t\t1\n\t);\n\n\tconst retryDelayMs = normalizePositiveNumber(\n\t\tserverConfig['OPENAI_RETRY_DELAY_MS'] ?? process.env.OPENAI_RETRY_DELAY_MS,\n\t\t750\n\t);\n\n\tconst apiKey = normalizeOptionalString(serverConfig['OPENAI_API_KEY'] || process.env.OPENAI_API_KEY) || '';\n\tconst baseUrl = normalizeOptionalString(serverConfig['OPENAI_BASE_URL'] || process.env.OPENAI_BASE_URL);\n\n\treturn {\n\t\tenabled,\n\t\tapiKey,\n\t\tbaseUrl,\n\t\tmodel,\n\t\tfallbackModel,\n\t\ttimeoutMs,\n\t\tmaxTokens,\n\t\tmaxRetries,\n\t\tretryDelayMs\n\t};\n}\n\nfunction buildRiskReviewPrompt(input: MongoExplorerRiskReviewInput): string {\n\tconst payload = {\n\t\tdatabase: input.database,\n\t\tcollection: input.collection,\n\t\toperation: input.operation,\n\t\tmode: input.mode,\n\t\tchanged_fields: pickChangedFields(input.before_document, input.after_document),\n\t\tdelete_impact: sanitizeForRiskReview(input.delete_impact || null),\n\t\tbefore_document: sanitizeForRiskReview(input.before_document || null),\n\t\tafter_document: sanitizeForRiskReview(input.after_document || null)\n\t};\n\n\treturn [\n\t\t'Review this MongoDB write operation for runtime and data integrity risk.',\n\t\t'Focus on foreign-key style id_* dependencies, schema compatibility, destructive impact, and financial/operational record safety.',\n\t\t'Return JSON only.',\n\t\tJSON.stringify(payload, null, 2)\n\t].join('\\n');\n}\n\nasync function reviewOperationRisk(input: MongoExplorerRiskReviewInput): Promise<MongoExplorerRiskReview> {\n\tconst settings = resolveRiskReviewSettings();\n\tif (!settings.enabled) {\n\t\treturn buildDisabledRiskReview(input.operation);\n\t}\n\n\tif (!settings.apiKey) {\n\t\treturn buildFallbackRiskReview(input.operation, 'AI risk review unavailable: OPENAI_API_KEY is missing.');\n\t}\n\n\tconst client = new OpenAIClient({\n\t\tapiKey: settings.apiKey,\n\t\tbaseUrl: settings.baseUrl,\n\t\tmodel: settings.model,\n\t\tfallbackModel: settings.fallbackModel,\n\t\ttemperature: 0.1,\n\t\tmaxTokens: settings.maxTokens,\n\t\tmaxRetries: round(settings.maxRetries),\n\t\tretryDelayMs: round(settings.retryDelayMs),\n\t\tresponseFormat: 'json'\n\t});\n\n\tconst systemPrompt = [\n\t\t'You are a MongoDB operation safety reviewer for a production SaaS application.',\n\t\t'Respond with a single JSON object only.',\n\t\t'Required keys:',\n\t\t'risk_level (\"low\" | \"medium\" | \"high\" | \"critical\"),',\n\t\t'should_block (boolean),',\n\t\t'summary (string),',\n\t\t'reasons (string[]),',\n\t\t'suggested_checks (string[]),',\n\t\t'confidence (number between 0 and 1).',\n\t\t'Keep summary concise (<= 220 chars).'\n\t].join(' ');\n\n\ttry {\n\t\tconst response = await client.chat(\n\t\t\t[\n\t\t\t\t{ role: 'system', content: systemPrompt },\n\t\t\t\t{ role: 'user', content: buildRiskReviewPrompt(input) }\n\t\t\t],\n\t\t\t{\n\t\t\t\ttimeoutMs: round(settings.timeoutMs),\n\t\t\t\tresponseFormat: 'json'\n\t\t\t}\n\t\t);\n\n\t\tconst payload = parseRiskReviewPayload(response.content);\n\t\treturn normalizeRiskReview(input.operation, payload, response.model || settings.model, response.requestId || '');\n\t}\n\tcatch (err) {\n\t\tconst detail = err?.message ? String(err.message) : 'Unknown AI review error';\n\t\treturn buildFallbackRiskReview(input.operation, `AI risk review failed: ${truncateForRiskReview(detail, 160)}`, settings.model);\n\t}\n}\n\nexport function loadMongoExplorerMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tmongoExplorerListCollections: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database?: string) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\tconst collections = await db.listCollections().toArray();\n\t\t\t\treturn collections\n\t\t\t\t\t.map(col => ({\n\t\t\t\t\t\tname: col.name,\n\t\t\t\t\t\ttype: col.type || 'collection'\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t\t\t}\n\t\t},\n\t\tmongoExplorerFind: {\n\t\t\tbypassSession: true,\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tquery: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, query: any = {}, options?) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\tconst normalized = normalizeFindOptions(options);\n\t\t\t\tconst documents = await db.collection(collection).find(query || {}, normalized.findOptions).toArray();\n\t\t\t\tlet total = null;\n\n\t\t\t\tif (normalized.includeTotal) {\n\t\t\t\t\ttotal = await db.collection(collection).countDocuments(query || {});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tdocuments,\n\t\t\t\t\ttotal\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\tmongoExplorerGetCollectionSchema: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(database: string, collection: string) {\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst { managerCollection } = resolveCollectionHandle(dbName, collection);\n\t\t\t\tif (!managerCollection) {\n\t\t\t\t\treturn Promise.resolve({\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\thas_schema: false,\n\t\t\t\t\t\tfields: []\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst schema = getSchemaDefinition(managerCollection);\n\t\t\t\tconst fields = Object.keys(schema)\n\t\t\t\t\t.sort((a, b) => a.localeCompare(b))\n\t\t\t\t\t.map((path) => {\n\t\t\t\t\t\tconst definition = schema[path];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tlabel: toLabel(path),\n\t\t\t\t\t\t\ttype: getSchemaTypeName(definition),\n\t\t\t\t\t\t\toptional: definition?.optional === true,\n\t\t\t\t\t\t\tprotected: isProtectedFieldPath(path),\n\t\t\t\t\t\t\tdepth: path.split('.').filter((segment: string) => segment !== '$').length - 1\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcollection,\n\t\t\t\t\thas_schema: true,\n\t\t\t\t\tfields\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tmongoExplorerAggregate: {\n\t\t\tbypassSession: true,\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpipeline: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'pipeline.$': {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\toptional: true,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, pipeline: any[], options: any = {}) {\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\treturn db.collection(collection).aggregate(pipeline || [], options || undefined).toArray();\n\t\t\t}\n\t\t},\n\t\tmongoExplorerCommand: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcommand: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tmode: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, command: any, permissionView?: string, mode?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView, mode);\n\t\t\t\tconst db = resolveDatabase(database);\n\t\t\t\treturn db.command(command);\n\t\t\t}\n\t\t},\n\t\tmongoExplorerInsertDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdocument: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tmode: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, document: any, permissionView?: string, mode?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView, mode);\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\n\t\t\t\tif (!document || typeof document !== 'object') {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Document is required');\n\t\t\t\t}\n\n\t\t\t\tif (!managerCollection && !allowUnschemaizedWrites()) {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Writes require schema-backed collections. Set MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE=true to bypass.');\n\t\t\t\t}\n\n\t\t\t\tif (!document._id) {\n\t\t\t\t\tdocument._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (document.__v === undefined) {\n\t\t\t\t\tdocument.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (managerCollection) {\n\t\t\t\t\tcoerceDateFields(managerCollection, document);\n\t\t\t\t\tawait managerCollection.insertOne(document);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tawait dbCollection.insertOne(document);\n\t\t\t\t}\n\n\t\t\t\treturn document._id;\n\t\t\t}\n\t\t},\n\t\t\tmongoExplorerReplaceDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdocument: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tmode: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, document: any, permissionView?: string, mode?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView, mode);\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\n\t\t\t\tif (!document || typeof document !== 'object' || !document._id) {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Document with _id is required');\n\t\t\t\t}\n\n\t\t\t\tconst currentDoc = managerCollection\n\t\t\t\t\t? await managerCollection.findOne({_id: document._id})\n\t\t\t\t\t: await dbCollection.findOne({_id: document._id});\n\t\t\t\tif (!currentDoc) {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Document not found');\n\t\t\t\t}\n\n\t\t\t\tensureProtectedFieldsUnchanged(currentDoc, document);\n\n\t\t\t\tif (!managerCollection && !allowUnschemaizedWrites()) {\n\t\t\t\t\tthrow new Error('Mongo Explorer: Writes require schema-backed collections. Set MONGO_EXPLORER_ALLOW_UNSCHEMATIZED_WRITE=true to bypass.');\n\t\t\t\t}\n\n\t\t\t\tif (managerCollection) {\n\t\t\t\t\tcoerceDateFields(managerCollection, document);\n\t\t\t\t\tawait managerCollection.replaceOne({_id: document._id}, document);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tawait dbCollection.replaceOne({_id: document._id}, document);\n\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t},\n\t\t\tmongoExplorerReviewOperationRisk: {\n\t\t\t\tcheck: new SimpleSchema({\n\t\t\t\t\tdatabase: {\n\t\t\t\t\t\ttype: String,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t},\n\t\t\t\t\tcollection: {\n\t\t\t\t\t\ttype: String\n\t\t\t\t\t},\n\t\t\t\t\toperation: {\n\t\t\t\t\t\ttype: String,\n\t\t\t\t\t\tallowedValues: ['insert', 'replace', 'delete', 'command']\n\t\t\t\t\t},\n\t\t\t\t\tbefore_document: {\n\t\t\t\t\t\ttype: Object,\n\t\t\t\t\t\tblackbox: true,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t},\n\t\t\t\t\tafter_document: {\n\t\t\t\t\t\ttype: Object,\n\t\t\t\t\t\tblackbox: true,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t},\n\t\t\t\t\tdelete_impact: {\n\t\t\t\t\t\ttype: Object,\n\t\t\t\t\t\tblackbox: true,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t},\n\t\t\t\t\tpermissionView: {\n\t\t\t\t\t\ttype: String,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t},\n\t\t\t\t\tmode: {\n\t\t\t\t\t\ttype: String,\n\t\t\t\t\t\toptional: true\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tfunction: async function(\n\t\t\t\t\tdatabase: string,\n\t\t\t\t\tcollection: string,\n\t\t\t\t\toperation: MongoExplorerRiskOperation,\n\t\t\t\t\tbefore_document?: any,\n\t\t\t\t\tafter_document?: any,\n\t\t\t\t\tdelete_impact?: MongoExplorerDeleteImpact,\n\t\t\t\t\tpermissionView?: string,\n\t\t\t\t\tmode?: string\n\t\t\t\t) {\n\t\t\t\t\tawait ensureWriteAccess(this, permissionView, mode);\n\t\t\t\t\tconst dbName = resolveDatabaseName(database);\n\n\t\t\t\t\treturn reviewOperationRisk({\n\t\t\t\t\t\tdatabase: dbName,\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\toperation,\n\t\t\t\t\t\tmode: normalizeExplorerMode(mode),\n\t\t\t\t\t\tbefore_document,\n\t\t\t\t\t\tafter_document,\n\t\t\t\t\t\tdelete_impact\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tmongoExplorerDeleteDocument: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdoc_id: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpermissionView: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tforce: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tmode: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, doc_id: string, permissionView?: string, force = false, mode?: string) {\n\t\t\t\tawait ensureWriteAccess(this, permissionView, mode);\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\tconst impact = await buildDeleteImpact(dbName, collection, doc_id);\n\t\t\t\tif (!force && (impact.unresolved || impact.has_references)) {\n\t\t\t\t\tconst collectionPreview = impact.collections.slice(0, 3).map(item => item.collection).join(', ');\n\t\t\t\t\tif (impact.unresolved) {\n\t\t\t\t\t\tthrow new Error('Mongo Explorer: Delete blocked because dependency checks could not complete. Use force delete after review.');\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(`Mongo Explorer: Delete blocked. Document is referenced by ${collectionPreview}${impact.collections.length > 3 ? ', ...' : ''}`);\n\t\t\t\t}\n\n\t\t\t\tconst { managerCollection, dbCollection } = resolveCollectionHandle(dbName, collection);\n\t\t\t\tconst deleteFilter = { _id: doc_id } as any;\n\n\t\t\t\tif (managerCollection) {\n\t\t\t\t\tawait managerCollection.deleteOne(deleteFilter);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tawait dbCollection.deleteOne(deleteFilter);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tmongoExplorerDeleteImpact: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdatabase: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\tcollection: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tdoc_id: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(database: string, collection: string, doc_id: string) {\n\t\t\t\tconst dbName = resolveDatabaseName(database);\n\t\t\t\treturn buildDeleteImpact(dbName, collection, doc_id);\n\t\t\t}\n\t\t}\n\t});\n}\n"]}
package/methods.ts CHANGED
@@ -147,23 +147,29 @@ export function SERVER_METHODS(resolveioServer) {
147
147
  mongoExplorerAggregate: (database: string, collection: string, pipeline: any[], options: any = {}, cb?: Function): Promise<any> => {
148
148
  return resolveioServer.call('mongoExplorerAggregate', database, collection, pipeline, options, cb);
149
149
  },
150
- mongoExplorerCommand: (database: string, command: any, permissionView?: string, cb?: Function): Promise<any> => {
151
- return resolveioServer.call('mongoExplorerCommand', database, command, permissionView, cb);
150
+ mongoExplorerCommand: (database: string, command: any, permissionView?: string, mode?: string, cb?: Function): Promise<any> => {
151
+ return resolveioServer.call('mongoExplorerCommand', database, command, permissionView, mode, cb);
152
152
  },
153
- mongoExplorerDeleteDocument: (database: string, collection: string, doc_id: string, permissionView?: string, cb?: Function): Promise<any> => {
154
- return resolveioServer.call('mongoExplorerDeleteDocument', database, collection, doc_id, permissionView, cb);
153
+ mongoExplorerDeleteDocument: (database: string, collection: string, doc_id: string, permissionView?: string, force = false, mode?: string, cb?: Function): Promise<any> => {
154
+ return resolveioServer.call('mongoExplorerDeleteDocument', database, collection, doc_id, permissionView, force, mode, cb);
155
+ },
156
+ mongoExplorerDeleteImpact: (database: string, collection: string, doc_id: string, cb?: Function): Promise<any> => {
157
+ return resolveioServer.call('mongoExplorerDeleteImpact', database, collection, doc_id, cb);
155
158
  },
156
159
  mongoExplorerFind: (database: string, collection: string, query: any = {}, options?, cb?: Function): Promise<any> => {
157
160
  return resolveioServer.call('mongoExplorerFind', database, collection, query, options, cb);
158
161
  },
159
- mongoExplorerInsertDocument: (database: string, collection: string, document: any, permissionView?: string, cb?: Function): Promise<any> => {
160
- return resolveioServer.call('mongoExplorerInsertDocument', database, collection, document, permissionView, cb);
162
+ mongoExplorerGetCollectionSchema: (database: string, collection: string, cb?: Function): Promise<any> => {
163
+ return resolveioServer.call('mongoExplorerGetCollectionSchema', database, collection, cb);
164
+ },
165
+ mongoExplorerInsertDocument: (database: string, collection: string, document: any, permissionView?: string, mode?: string, cb?: Function): Promise<any> => {
166
+ return resolveioServer.call('mongoExplorerInsertDocument', database, collection, document, permissionView, mode, cb);
161
167
  },
162
168
  mongoExplorerListCollections: (database?: string, cb?: Function): Promise<any> => {
163
169
  return resolveioServer.call('mongoExplorerListCollections', database, cb);
164
170
  },
165
- mongoExplorerReplaceDocument: (database: string, collection: string, document: any, permissionView?: string, cb?: Function): Promise<any> => {
166
- return resolveioServer.call('mongoExplorerReplaceDocument', database, collection, document, permissionView, cb);
171
+ mongoExplorerReplaceDocument: (database: string, collection: string, document: any, permissionView?: string, mode?: string, cb?: Function): Promise<any> => {
172
+ return resolveioServer.call('mongoExplorerReplaceDocument', database, collection, document, permissionView, mode, cb);
167
173
  },
168
174
  monitorCPUs: (cb?: Function): Promise<any> => {
169
175
  return resolveioServer.call('monitorCPUs', cb);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "22.1.19",
3
+ "version": "22.1.20",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",