jxp 4.1.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.env.sample +30 -0
  2. package/README.md +2 -0
  3. package/dist/bin/index_audit.d.ts +3 -0
  4. package/dist/bin/index_audit.d.ts.map +1 -0
  5. package/dist/bin/index_audit.js +66 -0
  6. package/dist/bin/index_audit.js.map +1 -0
  7. package/dist/bin/mcp-stdio-bridge.d.ts +3 -0
  8. package/dist/bin/mcp-stdio-bridge.d.ts.map +1 -0
  9. package/dist/bin/mcp-stdio-bridge.js +87 -0
  10. package/dist/bin/mcp-stdio-bridge.js.map +1 -0
  11. package/dist/bin/server.d.ts.map +1 -1
  12. package/dist/bin/server.js +8 -2
  13. package/dist/bin/server.js.map +1 -1
  14. package/dist/libs/builtin_models.d.ts +21 -0
  15. package/dist/libs/builtin_models.d.ts.map +1 -0
  16. package/dist/libs/builtin_models.js +125 -0
  17. package/dist/libs/builtin_models.js.map +1 -0
  18. package/dist/libs/docs-auth.d.ts.map +1 -1
  19. package/dist/libs/docs-auth.js +6 -2
  20. package/dist/libs/docs-auth.js.map +1 -1
  21. package/dist/libs/docs.js +105 -44
  22. package/dist/libs/docs.js.map +1 -1
  23. package/dist/libs/groups.js +3 -4
  24. package/dist/libs/groups.js.map +1 -1
  25. package/dist/libs/index_diagnostics.d.ts +144 -0
  26. package/dist/libs/index_diagnostics.d.ts.map +1 -0
  27. package/dist/libs/index_diagnostics.js +671 -0
  28. package/dist/libs/index_diagnostics.js.map +1 -0
  29. package/dist/libs/jxp.d.ts.map +1 -1
  30. package/dist/libs/jxp.js +97 -331
  31. package/dist/libs/jxp.js.map +1 -1
  32. package/dist/libs/load-config.d.ts +2 -0
  33. package/dist/libs/load-config.d.ts.map +1 -1
  34. package/dist/libs/load-config.js +10 -0
  35. package/dist/libs/load-config.js.map +1 -1
  36. package/dist/libs/login.js +3 -8
  37. package/dist/libs/login.js.map +1 -1
  38. package/dist/libs/mcp/auth.d.ts +4 -0
  39. package/dist/libs/mcp/auth.d.ts.map +1 -0
  40. package/dist/libs/mcp/auth.js +49 -0
  41. package/dist/libs/mcp/auth.js.map +1 -0
  42. package/dist/libs/mcp/config.d.ts +21 -0
  43. package/dist/libs/mcp/config.d.ts.map +1 -0
  44. package/dist/libs/mcp/config.js +66 -0
  45. package/dist/libs/mcp/config.js.map +1 -0
  46. package/dist/libs/mcp/context.d.ts +5 -0
  47. package/dist/libs/mcp/context.d.ts.map +1 -0
  48. package/dist/libs/mcp/context.js +14 -0
  49. package/dist/libs/mcp/context.js.map +1 -0
  50. package/dist/libs/mcp/describe.d.ts +13 -0
  51. package/dist/libs/mcp/describe.d.ts.map +1 -0
  52. package/dist/libs/mcp/describe.js +36 -0
  53. package/dist/libs/mcp/describe.js.map +1 -0
  54. package/dist/libs/mcp/docs_auth.d.ts +5 -0
  55. package/dist/libs/mcp/docs_auth.d.ts.map +1 -0
  56. package/dist/libs/mcp/docs_auth.js +36 -0
  57. package/dist/libs/mcp/docs_auth.js.map +1 -0
  58. package/dist/libs/mcp/dynamic_import.d.ts +6 -0
  59. package/dist/libs/mcp/dynamic_import.d.ts.map +1 -0
  60. package/dist/libs/mcp/dynamic_import.js +12 -0
  61. package/dist/libs/mcp/dynamic_import.js.map +1 -0
  62. package/dist/libs/mcp/execute_tool.d.ts +10 -0
  63. package/dist/libs/mcp/execute_tool.d.ts.map +1 -0
  64. package/dist/libs/mcp/execute_tool.js +65 -0
  65. package/dist/libs/mcp/execute_tool.js.map +1 -0
  66. package/dist/libs/mcp/guides/default.md +67 -0
  67. package/dist/libs/mcp/guides.d.ts +14 -0
  68. package/dist/libs/mcp/guides.d.ts.map +1 -0
  69. package/dist/libs/mcp/guides.js +127 -0
  70. package/dist/libs/mcp/guides.js.map +1 -0
  71. package/dist/libs/mcp/model_visibility.d.ts +31 -0
  72. package/dist/libs/mcp/model_visibility.d.ts.map +1 -0
  73. package/dist/libs/mcp/model_visibility.js +73 -0
  74. package/dist/libs/mcp/model_visibility.js.map +1 -0
  75. package/dist/libs/mcp/mount.d.ts +10 -0
  76. package/dist/libs/mcp/mount.d.ts.map +1 -0
  77. package/dist/libs/mcp/mount.js +68 -0
  78. package/dist/libs/mcp/mount.js.map +1 -0
  79. package/dist/libs/mcp/read_service.d.ts +23 -0
  80. package/dist/libs/mcp/read_service.d.ts.map +1 -0
  81. package/dist/libs/mcp/read_service.js +141 -0
  82. package/dist/libs/mcp/read_service.js.map +1 -0
  83. package/dist/libs/mcp/server.d.ts +23 -0
  84. package/dist/libs/mcp/server.d.ts.map +1 -0
  85. package/dist/libs/mcp/server.js +111 -0
  86. package/dist/libs/mcp/server.js.map +1 -0
  87. package/dist/libs/parse_byte_size.d.ts +10 -0
  88. package/dist/libs/parse_byte_size.d.ts.map +1 -0
  89. package/dist/libs/parse_byte_size.js +80 -0
  90. package/dist/libs/parse_byte_size.js.map +1 -0
  91. package/dist/libs/query_limits.js +99 -13
  92. package/dist/libs/query_limits.js.map +1 -1
  93. package/dist/libs/read_handlers.d.ts +13 -0
  94. package/dist/libs/read_handlers.d.ts.map +1 -0
  95. package/dist/libs/read_handlers.js +381 -0
  96. package/dist/libs/read_handlers.js.map +1 -0
  97. package/dist/libs/schema.js +2 -2
  98. package/dist/libs/schema.js.map +1 -1
  99. package/dist/libs/schema_serialize.d.ts +3 -0
  100. package/dist/libs/schema_serialize.d.ts.map +1 -0
  101. package/dist/libs/schema_serialize.js +45 -0
  102. package/dist/libs/schema_serialize.js.map +1 -0
  103. package/dist/libs/security.js +7 -11
  104. package/dist/libs/security.js.map +1 -1
  105. package/dist/libs/setup.js +3 -4
  106. package/dist/libs/setup.js.map +1 -1
  107. package/dist/libs/startup.d.ts +4 -0
  108. package/dist/libs/startup.d.ts.map +1 -1
  109. package/dist/libs/startup.js +17 -0
  110. package/dist/libs/startup.js.map +1 -1
  111. package/dist/models/indexquerylog_model.d.ts +19 -0
  112. package/dist/models/indexquerylog_model.d.ts.map +1 -0
  113. package/dist/models/indexquerylog_model.js +32 -0
  114. package/dist/models/indexquerylog_model.js.map +1 -0
  115. package/dist/types/jxp-config.d.ts +29 -0
  116. package/dist/types/jxp-config.d.ts.map +1 -1
  117. package/dist/types/schema-fields.d.ts +4 -0
  118. package/dist/types/schema-fields.d.ts.map +1 -1
  119. package/docs/api.md +16 -2
  120. package/docs/changelog.md +101 -1
  121. package/docs/configuration.md +39 -0
  122. package/docs/index.md +2 -0
  123. package/docs/index_diagnostics.md +127 -0
  124. package/docs/mcp.md +134 -0
  125. package/docs/schemas.md +3 -1
  126. package/mkdocs.yml +2 -0
  127. package/package.json +26 -9
  128. package/templates/assets/diagnostics.js +352 -0
  129. package/templates/assets/docs.css +107 -0
  130. package/templates/assets/mcp-console.js +343 -0
  131. package/templates/diagnostics.pug +94 -0
  132. package/templates/index.pug +38 -0
  133. package/templates/mcp.pug +112 -0
  134. package/templates/navbar.pug +2 -0
  135. package/templates/sidebar.pug +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_diagnostics.js","sourceRoot":"","sources":["../../src/libs/index_diagnostics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jxp.d.ts","sourceRoot":"","sources":["../../src/libs/jxp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAw+BrD,QAAA,MAAM,GAAG,GAAa,SAAS,SAAS,QAgYvC,CAAC;AAEF,SAAS,GAAG,CAAC"}
1
+ {"version":3,"file":"jxp.d.ts","sourceRoot":"","sources":["../../src/libs/jxp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAivBrD,QAAA,MAAM,GAAG,GAAa,SAAS,SAAS,QA4cvC,CAAC;AAEF,SAAS,GAAG,CAAC"}
package/dist/libs/jxp.js CHANGED
@@ -17,7 +17,6 @@ const ws = require("./ws");
17
17
  const modeldir = require("./modeldir");
18
18
  const query_manipulation = require("./query_manipulation");
19
19
  const corsMiddleware = require('restify-cors-middleware2');
20
- const { Parser: CsvParser } = require('@json2csv/plainjs');
21
20
  const cache = require("./cache");
22
21
  const query_limits = require("./query_limits");
23
22
  const query_sanitize = require("./query_sanitize");
@@ -28,6 +27,9 @@ const response_sanitize = require("./response_sanitize");
28
27
  const link_index = require("./link_index");
29
28
  const { safeErrorMessage } = require("./safe_error");
30
29
  const { logRequestError, logAndThrow } = require("./request_log");
30
+ const index_diagnostics = require("./index_diagnostics");
31
+ const builtin_models = require("./builtin_models");
32
+ const read_handlers = require("./read_handlers");
31
33
  const schemaModule = require("./schema");
32
34
  global.JXPSchema = schemaModule.default || schemaModule;
33
35
  var models = {};
@@ -127,25 +129,32 @@ const outputJSON = async (req, res) => {
127
129
  };
128
130
  // Outputs whatever is in res.result as CSV
129
131
  const outputCSV = (req, res, next) => {
130
- const opts = { "flatten": true };
131
132
  if (!res.result.data) {
132
133
  throw new errors.InternalServerError("Error generating CSV");
133
134
  }
134
135
  try {
135
- const data = res.result.data.map(row => row._doc);
136
- if (!data.length) {
137
- throw ("");
136
+ const csv = read_handlers.resultToCsv(res.result);
137
+ const limits = query_limits.getLimits(req);
138
+ if (limits.max_response_bytes > 0) {
139
+ const size = Buffer.byteLength(csv, "utf8");
140
+ if (size > limits.max_response_bytes) {
141
+ const err = new errors.PayloadTooLargeError(`CSV export size ${size} bytes exceeds maximum ${limits.max_response_bytes} bytes. ` +
142
+ `Reduce ?limit= or narrow ?filter=.`);
143
+ logRequestError(req, res, err, "response_size", `${size}B max=${limits.max_response_bytes}B`);
144
+ throw err;
145
+ }
138
146
  }
139
147
  res.writeHead(200, {
140
- 'Content-Type': 'text/csv',
141
- 'Content-Disposition': 'attachment; filename=export.csv'
148
+ "Content-Type": "text/csv",
149
+ "Content-Disposition": "attachment; filename=export.csv",
142
150
  });
143
- const csv = new CsvParser(opts).parse(data);
144
151
  res.end(csv);
145
152
  next();
146
153
  }
147
154
  catch (err) {
148
- logRequestError(req, res, err, "outputCSV");
155
+ if (!(err instanceof errors.PayloadTooLargeError)) {
156
+ logRequestError(req, res, err, "outputCSV");
157
+ }
149
158
  throw new errors.InternalServerError(safeErrorMessage(err));
150
159
  }
151
160
  };
@@ -153,136 +162,32 @@ const outputCSV = (req, res, next) => {
153
162
  const actionGet = async (req, res) => {
154
163
  const opname = `get ${req.modelname} ${ops++}`;
155
164
  console.time(opname);
156
- let filters = {};
157
- try {
158
- filters = parseFilter(req.query.filter);
159
- filters = query_sanitize.sanitizeFilter(filters, getSecurityOpts(req));
160
- }
161
- catch (err) {
162
- logRequestError(req, res, err, "filter");
163
- if (err instanceof errors.BadRequestError) {
164
- throw err;
165
- }
166
- if (err instanceof errors.ForbiddenError) {
167
- throw err;
168
- }
169
- throw new errors.InternalServerError(safeErrorMessage(err));
170
- }
171
- const search = query_sanitize.parseSearchObject(req.query.search);
172
- for (const i in search) {
173
- filters[i] = search[i];
174
- }
175
- let countquery = filters;
176
- let qcount = req.Model.find(filters);
177
- let q = req.Model.find(filters);
178
- let checkDeleted = [{ _deleted: false }, { _deleted: null }];
179
- if (!req.query.showDeleted) {
180
- countquery = Object.assign({ $or: checkDeleted }, countquery);
181
- qcount.or(checkDeleted);
182
- q.or(checkDeleted);
183
- }
184
- if (req.query.search) {
185
- // console.log({ search: req.query.search });
186
- q = req.Model.find({ $text: { $search: req.query.search } }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } });
187
- countquery = Object.assign({ $text: { $search: req.query.search } }, countquery);
188
- qcount = req.Model.find({ $text: { $search: req.query.search } });
189
- }
190
- if (res.user) {
191
- q.options = ({ user: res.user });
192
- }
193
165
  try {
194
- const estimatedCount = await req.Model.estimatedDocumentCount();
195
- let count = -1;
196
- if (query_limits.shouldRunCount(req)) {
197
- if (estimatedCount < 100000 && Object.keys(countquery).length !== 0) {
198
- count = await qcount.countDocuments();
199
- }
200
- else {
201
- count = estimatedCount;
202
- }
203
- }
204
- const result = {};
205
- if (count >= 0) {
206
- result.count = count;
207
- }
208
- const effectiveLimit = query_limits.enforceListLimit(req, estimatedCount, res);
209
- query_limits.applyListPagination(q, result, req, effectiveLimit, count >= 0 ? count : 0, changeUrlParams);
210
- if (req.query.sort) {
211
- q.sort(req.query.sort);
212
- result.sort = req.query.sort;
213
- }
214
- if (req.query.populate) {
215
- if ((typeof req.query.populate === "object") && !Array.isArray(req.query.populate)) {
216
- for (let i in req.query.populate) {
217
- q.populate(i, req.query.populate[i].replace(/,/g, " "));
218
- }
219
- }
220
- else {
221
- q.populate(req.query.populate);
222
- }
223
- result.populate = req.query.populate;
224
- }
225
166
  if (req.query.autopopulate) {
226
167
  res.header("jxp-autopopulate-warning", "expensive");
227
- for (let key in req.Model.schema.paths) {
228
- const dirpath = req.Model.schema.paths[key];
229
- if (dirpath.instance == "ObjectID" && dirpath.options.link) {
230
- q.populate(String(dirpath.options.map_to || dirpath.options.virtual || dirpath.options.link.toLowerCase()));
231
- }
232
- }
233
- result.autopopulate = true;
234
- }
235
- if (req.query.fields) {
236
- const fields = req.query.fields.split(",");
237
- const select = {};
238
- fields.forEach(field => {
239
- select[field] = 1;
240
- });
241
- q.select(select);
242
- }
243
- if (req.query.search) {
244
- result.search = req.query.search;
245
168
  }
246
- result.data = await q.exec();
247
- response_sanitize.sanitizeListResult(result, getStripFields(req));
248
- res.result = result;
169
+ await read_handlers.executeList(req, res);
249
170
  if (debug)
250
171
  console.timeEnd(opname);
251
172
  }
252
173
  catch (err) {
253
174
  if (debug)
254
175
  console.timeEnd(opname);
255
- if (!(err instanceof errors.BadRequestError) &&
256
- !(err instanceof errors.ForbiddenError)) {
257
- logRequestError(req, res, err, "get");
258
- }
259
- if (err instanceof errors.BadRequestError) {
260
- throw err;
261
- }
262
- if (err instanceof errors.ForbiddenError) {
263
- throw err;
264
- }
265
- if (err.code)
266
- throw err;
267
- throw new errors.InternalServerError(safeErrorMessage(err));
176
+ throw err;
268
177
  }
269
178
  };
270
179
  const actionGetOne = async (req, res) => {
271
180
  const opname = `getOne ${req.modelname}/${req.params.item_id} ${ops++}`;
272
181
  console.time(opname);
273
182
  try {
274
- const data = await getOne(req.Model, req.params.item_id, req.query, { user: res.user });
275
- res.result = { data };
183
+ await read_handlers.executeGetOne(req, res);
276
184
  if (debug)
277
185
  console.timeEnd(opname);
278
186
  }
279
187
  catch (err) {
280
- logRequestError(req, res, err, "getOne");
281
188
  if (debug)
282
189
  console.timeEnd(opname);
283
- if (err.code)
284
- throw err;
285
- throw new errors.InternalServerError(safeErrorMessage(err));
190
+ throw err;
286
191
  }
287
192
  };
288
193
  const actionPost = async (req, res) => {
@@ -467,38 +372,15 @@ const actionDelete = async (req, res) => {
467
372
  const actionCount = async (req, res) => {
468
373
  const opname = `count ${req.modelname} ${ops++}`;
469
374
  console.time(opname);
470
- let filters = {};
471
375
  try {
472
- filters = parseFilter(req.query.filter);
473
- filters = query_sanitize.sanitizeFilter(filters, getSecurityOpts(req));
474
- }
475
- catch (err) {
476
- logRequestError(req, res, err, "filter");
477
- if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
478
- throw err;
479
- }
480
- throw new errors.InternalServerError(safeErrorMessage(err));
481
- }
482
- const search = query_sanitize.parseSearchObject(req.query.search);
483
- for (const i in search) {
484
- filters[i] = search[i];
485
- }
486
- if (!req.query.showDeleted) {
487
- filters = Object.assign({ $or: [{ _deleted: false }, { _deleted: null }] }, filters);
488
- }
489
- try {
490
- const count = await req.Model.countDocuments(filters).exec();
491
- res.result = { count };
376
+ await read_handlers.executeCount(req, res);
492
377
  if (debug)
493
378
  console.timeEnd(opname);
494
379
  }
495
380
  catch (err) {
496
- logRequestError(req, res, err, "count");
497
381
  if (debug)
498
382
  console.timeEnd(opname);
499
- if (err.code)
500
- throw err;
501
- throw new errors.InternalServerError(safeErrorMessage(err));
383
+ throw err;
502
384
  }
503
385
  };
504
386
  const actionCall = async (req, res) => {
@@ -570,16 +452,16 @@ const actionQuery = async (req, res) => {
570
452
  let qcount = req.Model.find({ "$and": query });
571
453
  let q = req.Model.find({ "$and": query });
572
454
  try {
455
+ const estimatedCount = await req.Model.estimatedDocumentCount();
456
+ const result = {};
457
+ const { limit: effectiveLimit, limitCapped, filterExemption } = query_limits.enforceListLimit(req, estimatedCount, res, { result, bodyQuery: sanitizedQuery });
573
458
  let count = -1;
574
- if (query_limits.shouldRunCount(req)) {
459
+ if (query_limits.shouldRunCount(req, { filterExemption, limitCapped })) {
575
460
  count = await qcount.countDocuments();
576
461
  }
577
- const result = {};
578
462
  if (count >= 0) {
579
463
  result.count = count;
580
464
  }
581
- const estimatedCount = await req.Model.estimatedDocumentCount();
582
- const effectiveLimit = query_limits.enforceListLimit(req, estimatedCount, res);
583
465
  query_limits.applyListPagination(q, result, req, effectiveLimit, count >= 0 ? count : 0, changeUrlParams);
584
466
  if (req.query.sort) {
585
467
  q.sort(req.query.sort);
@@ -615,6 +497,8 @@ const actionQuery = async (req, res) => {
615
497
  }
616
498
  result.data = await q.exec();
617
499
  response_sanitize.sanitizeListResult(result, getStripFields(req));
500
+ query_limits.finalizeListPagination(result, req, Array.isArray(result.data) ? result.data.length : 0, effectiveLimit, count, changeUrlParams);
501
+ query_limits.enforceResponseSize(result, req, res);
618
502
  res.result = result;
619
503
  if (debug)
620
504
  console.timeEnd(opname);
@@ -624,10 +508,13 @@ const actionQuery = async (req, res) => {
624
508
  if (debug)
625
509
  console.timeEnd(opname);
626
510
  if (!(err instanceof errors.BadRequestError) &&
627
- !(err instanceof errors.ForbiddenError)) {
511
+ !(err instanceof errors.ForbiddenError) &&
512
+ !(err instanceof errors.PayloadTooLargeError)) {
628
513
  logRequestError(req, res, err, "query");
629
514
  }
630
- if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
515
+ if (err instanceof errors.BadRequestError ||
516
+ err instanceof errors.ForbiddenError ||
517
+ err instanceof errors.PayloadTooLargeError) {
631
518
  throw err;
632
519
  }
633
520
  if (err.code)
@@ -746,175 +633,6 @@ const actionBulkWrite = async (req, res) => {
746
633
  // });
747
634
  // };
748
635
  // Utitlities
749
- const getOne = async (Model, item_id, params, options) => {
750
- const query = Model.findById(item_id, {}, options);
751
- if (params.populate) {
752
- if ((typeof params.populate === "object") && !Array.isArray(params.populate)) {
753
- for (let i in params.populate) {
754
- query.populate(i, params.populate[i].replace(/,/g, " "));
755
- }
756
- }
757
- else {
758
- query.populate(params.populate);
759
- }
760
- }
761
- if (params.autopopulate) {
762
- for (let key in Model.schema.paths) {
763
- var dirpath = Model.schema.paths[key];
764
- if (dirpath.instance == "ObjectID" && dirpath.options.link) {
765
- query.populate(String(dirpath.options.map_to || dirpath.options.virtual || dirpath.options.link.toLowerCase()));
766
- }
767
- }
768
- }
769
- try {
770
- var item = await query.exec();
771
- if (!item) {
772
- // console.error("Could not find document");
773
- throw new errors.NotFoundError(`Could not find document ${item_id} on ${Model.modelName}`);
774
- }
775
- if (item._deleted && !params.showDeleted) {
776
- // console.error("Document is deleted");
777
- throw new errors.NotFoundError(`Document ${item_id} is deleted on ${Model.modelName}`);
778
- }
779
- return response_sanitize.sanitizeDocument(item);
780
- }
781
- catch (err) {
782
- if (err.code)
783
- throw err;
784
- throw new errors.InternalServerError(safeErrorMessage(err));
785
- }
786
- };
787
- // Helper function to check if a string is an ISO date string
788
- function isISODateString(str) {
789
- if (typeof str !== 'string')
790
- return false;
791
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z$/;
792
- if (!isoDateRegex.test(str))
793
- return false;
794
- const date = new Date(str);
795
- if (isNaN(date.getTime())) {
796
- throw new errors.BadRequestError("Invalid date format");
797
- }
798
- return true;
799
- }
800
- const parseFilter = (filter, depth = 0) => {
801
- const MAX_DEPTH = 10;
802
- if (!filter)
803
- return {};
804
- if (depth > MAX_DEPTH) {
805
- throw new errors.BadRequestError("Maximum filter depth exceeded");
806
- }
807
- if (typeof filter !== "object" || filter === null)
808
- return filter;
809
- // Handle arrays by merging their operators
810
- if (Array.isArray(filter)) {
811
- const result = {};
812
- filter.forEach(item => {
813
- if (typeof item === "string" && item.includes(":")) {
814
- const parts = item.split(":");
815
- const key = parts[0];
816
- const value = parts.slice(1).join(":");
817
- if (key.startsWith("$")) {
818
- try {
819
- if (isISODateString(value)) {
820
- result[key] = new Date(value);
821
- }
822
- else {
823
- result[key] = value;
824
- }
825
- }
826
- catch (err) {
827
- if (err instanceof errors.BadRequestError) {
828
- throw err;
829
- }
830
- throw new errors.BadRequestError("Invalid date format");
831
- }
832
- }
833
- }
834
- });
835
- return result;
836
- }
837
- // Create a new object to avoid modifying the input
838
- const parsedFilter = {};
839
- for (let i in filter) {
840
- if (filter[i] === "false") {
841
- parsedFilter[i] = false;
842
- continue;
843
- }
844
- if (filter[i] === "true") {
845
- parsedFilter[i] = true;
846
- continue;
847
- }
848
- if (typeof filter[i] === "string") {
849
- try {
850
- if (isISODateString(filter[i])) {
851
- parsedFilter[i] = new Date(filter[i]);
852
- continue;
853
- }
854
- }
855
- catch (err) {
856
- if (err instanceof errors.BadRequestError) {
857
- throw err;
858
- }
859
- throw new errors.BadRequestError("Invalid date format");
860
- }
861
- if (filter[i].includes(":")) {
862
- const parts = filter[i].split(":");
863
- const key = parts[0];
864
- const value = parts.slice(1).join(":");
865
- if (key.startsWith("$")) {
866
- try {
867
- if (isISODateString(value)) {
868
- if (!parsedFilter[i])
869
- parsedFilter[i] = {};
870
- parsedFilter[i][key] = new Date(value);
871
- }
872
- else if (value.startsWith("[") && value.endsWith("]")) {
873
- if (!parsedFilter[i])
874
- parsedFilter[i] = {};
875
- parsedFilter[i][key] = value.slice(1, -1).split(",");
876
- }
877
- else if (key === "$regex" && value.startsWith("/")) {
878
- if (!parsedFilter[i])
879
- parsedFilter[i] = {};
880
- const match = value.match(/^\/(.+?)\/([gimy]*)$/);
881
- if (match) {
882
- parsedFilter[i][key] = new RegExp(match[1], match[2]);
883
- }
884
- }
885
- else {
886
- if (!parsedFilter[i])
887
- parsedFilter[i] = {};
888
- parsedFilter[i][key] = value;
889
- }
890
- }
891
- catch (err) {
892
- if (err instanceof errors.BadRequestError) {
893
- throw err;
894
- }
895
- throw new errors.BadRequestError("Invalid date format");
896
- }
897
- }
898
- else {
899
- parsedFilter[i] = filter[i];
900
- }
901
- }
902
- else {
903
- parsedFilter[i] = filter[i];
904
- }
905
- }
906
- else if (Array.isArray(filter[i])) {
907
- parsedFilter[i] = parseFilter(filter[i], depth + 1);
908
- }
909
- else if (typeof filter[i] === "object") {
910
- parsedFilter[i] = parseFilter(filter[i], depth + 1);
911
- }
912
- else {
913
- parsedFilter[i] = filter[i];
914
- }
915
- }
916
- return parsedFilter;
917
- };
918
636
  const _deSerialize = (data) => {
919
637
  function assign(obj, keyPath, value) {
920
638
  const MAX_DEPTH = 20; // Prevent excessive nesting
@@ -997,6 +715,8 @@ const changeUrlParams = (req, key, val) => {
997
715
  return req.config.url + req.path() + "?" + querystring.stringify(q);
998
716
  };
999
717
  const JXP = function (options) {
718
+ // Must run before models load; reads QUERY_INDEX_MONITOR / INDEX_DIAGNOSTICS_ENABLED from env
719
+ index_diagnostics.registerQueryIndexMonitor(options.index_diagnostics);
1000
720
  const server = restify.createServer();
1001
721
  const model_dir = options.model_dir || modeldir.findModelDir(path.dirname(process.argv[1]));
1002
722
  //Set up config with default
@@ -1047,6 +767,7 @@ const JXP = function (options) {
1047
767
  default: 100,
1048
768
  require_limit_always: true,
1049
769
  skip_count_unless_paginated: true,
770
+ max_response_size: "10mb",
1050
771
  },
1051
772
  security: {
1052
773
  strip_fields: ["password"],
@@ -1079,21 +800,14 @@ const JXP = function (options) {
1079
800
  global.apikey = config.apikey;
1080
801
  global.server = config.server;
1081
802
  global.model_dir = config.model_dir;
1082
- // Pre-load models
1083
- var files = fs.readdirSync(config.model_dir);
1084
- let modelnames = files.filter(function (fname) {
1085
- return fname.endsWith("_model.js");
1086
- });
1087
- modelnames.forEach(function (fname) {
1088
- var modelname = fname.replace("_model.js", "");
1089
- const mod = require(path.join(config.model_dir, fname));
1090
- models[modelname] = mod.default || mod;
1091
- });
803
+ // Pre-load app models, then jxp built-ins for any missing slugs
804
+ Object.assign(models, builtin_models.loadAllModels(config.model_dir));
805
+ index_diagnostics.wireQueryLogPersistence(models);
1092
806
  link_index.buildLinkIndex(models);
1093
- setup.init(config);
1094
- security.init(config);
1095
- login.init(config);
1096
- groups.init(config);
807
+ setup.init(models, config);
808
+ security.init(models, config);
809
+ login.init(models, config);
810
+ groups.init(models, config);
1097
811
  ws.init({ models });
1098
812
  cache.init(config);
1099
813
  const docs = new Docs({ config, models });
@@ -1200,6 +914,9 @@ const JXP = function (options) {
1200
914
  server.post("/docs/logout", docsAuth.logout);
1201
915
  server.get("/docs/assets/:file", docs.serveAsset.bind(docs));
1202
916
  server.get("/docs/api", docsAuth.docsAccessMiddleware, docs.apiIndex.bind(docs));
917
+ server.get("/docs/mcp", docsAuth.docsAccessMiddleware, docs.mcpPlayground.bind(docs));
918
+ server.post("/docs/mcp/call", docsAuth.docsAccessMiddleware, docs.mcpCall.bind(docs));
919
+ server.get("/docs/diagnostics", docsAuth.docsAccessMiddleware, docs.diagnostics.bind(docs));
1203
920
  server.get("/docs/md/:md_doc", docs.md.bind(docs));
1204
921
  server.get("/docs/model/:modelname", docsAuth.docsAccessMiddleware, docs.model.bind(docs));
1205
922
  server.get("/", docs.frontPage.bind(docs));
@@ -1216,6 +933,55 @@ const JXP = function (options) {
1216
933
  /* Cache */
1217
934
  server.get("/cache/stats", security.login, security.admin_only, cache.stats, outputJSON);
1218
935
  server.get("/cache/clear", security.login, security.admin_only, cache.clearAll, outputJSON);
936
+ /* Index diagnostics (admin) */
937
+ const actionDiagnosticsIndexes = async (req, res) => {
938
+ const refresh = req.query?.refresh === "true" || req.query?.refresh === "1";
939
+ const includeUnused = req.query?.unused === "true" || req.query?.unused === "1";
940
+ res.result = await index_diagnostics.getCachedIndexAudit(models, {
941
+ refresh: !!refresh,
942
+ includeUnused: !!includeUnused,
943
+ });
944
+ };
945
+ const actionDiagnosticsQueries = async (req, res) => {
946
+ const limit = parseInt(String(req.query?.limit ?? "50"), 10);
947
+ const skip = parseInt(String(req.query?.skip ?? "0"), 10);
948
+ const severity = typeof req.query?.severity === "string" ? req.query.severity : undefined;
949
+ const modelRaw = typeof req.query?.model === "string"
950
+ ? req.query.model
951
+ : typeof req.query?.model_name === "string"
952
+ ? req.query.model_name
953
+ : undefined;
954
+ const model_name = modelRaw
955
+ ? builtin_models.resolveModelFilterName(models, modelRaw)
956
+ : undefined;
957
+ res.result = await index_diagnostics.listQueryLogs({
958
+ limit: Number.isFinite(limit) ? limit : 50,
959
+ skip: Number.isFinite(skip) ? skip : 0,
960
+ severity,
961
+ model_name,
962
+ });
963
+ };
964
+ const actionDiagnosticsIndexesSync = async (req, res) => {
965
+ const confirm = typeof req.body?.confirm === "string"
966
+ ? req.body.confirm
967
+ : typeof req.query?.confirm === "string"
968
+ ? req.query.confirm
969
+ : undefined;
970
+ const who = res.user?.email || res.user?._id?.toString?.() || "unknown";
971
+ console.log(`[index-diagnostics] sync requested by ${who} confirm=${confirm === index_diagnostics.SYNC_CONFIRM_PHRASE ? "ok" : "invalid"}`);
972
+ try {
973
+ res.result = await index_diagnostics.syncAllModels(models, { confirm });
974
+ }
975
+ catch (err) {
976
+ logRequestError(req, res, err, "diagnostics/indexes/sync");
977
+ throw err;
978
+ }
979
+ };
980
+ server.get("/diagnostics/indexes", security.login, security.admin_only, actionDiagnosticsIndexes, outputJSON);
981
+ server.get("/diagnostics/queries", security.login, security.admin_only, actionDiagnosticsQueries, outputJSON);
982
+ server.post("/diagnostics/indexes/sync", security.login, security.admin_only, actionDiagnosticsIndexesSync, outputJSON);
983
+ const { mountMcp } = require("./mcp/mount");
984
+ mountMcp(server, { config, models });
1219
985
  return server;
1220
986
  };
1221
987
  module.exports = JXP;