@resolveio/server-lib 22.2.34 → 22.2.35

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 (649) hide show
  1. package/ai/assistant-core-heuristics.d.ts +11 -0
  2. package/ai/assistant-core-heuristics.js +531 -0
  3. package/ai/assistant-core-heuristics.js.map +1 -0
  4. package/client-server-app.d.ts +1 -0
  5. package/client-server-app.js +68 -0
  6. package/client-server-app.js.map +1 -0
  7. package/collections/ai-terminal-conversation.collection.d.ts +2 -0
  8. package/collections/ai-terminal-conversation.collection.js +140 -0
  9. package/collections/ai-terminal-conversation.collection.js.map +1 -0
  10. package/collections/ai-terminal-issue-report.collection.d.ts +2 -0
  11. package/collections/ai-terminal-issue-report.collection.js +148 -0
  12. package/collections/ai-terminal-issue-report.collection.js.map +1 -0
  13. package/collections/ai-terminal-message.collection.d.ts +2 -0
  14. package/collections/ai-terminal-message.collection.js +121 -0
  15. package/collections/ai-terminal-message.collection.js.map +1 -0
  16. package/collections/app-setting.collection.d.ts +3 -0
  17. package/collections/app-setting.collection.js +103 -0
  18. package/collections/app-setting.collection.js.map +1 -0
  19. package/collections/app-status.collection.d.ts +3 -0
  20. package/collections/app-status.collection.js +57 -0
  21. package/collections/app-status.collection.js.map +1 -0
  22. package/collections/communication-metric.collection.d.ts +2 -0
  23. package/collections/communication-metric.collection.js +133 -0
  24. package/collections/communication-metric.collection.js.map +1 -0
  25. package/collections/counter.collection.d.ts +3 -0
  26. package/collections/counter.collection.js +56 -0
  27. package/collections/counter.collection.js.map +1 -0
  28. package/collections/cron-job-history.collection.d.ts +3 -0
  29. package/collections/cron-job-history.collection.js +137 -0
  30. package/collections/cron-job-history.collection.js.map +1 -0
  31. package/collections/cron-job.collection.d.ts +3 -0
  32. package/collections/cron-job.collection.js +92 -0
  33. package/collections/cron-job.collection.js.map +1 -0
  34. package/collections/customer-notification.collection.d.ts +3 -0
  35. package/collections/customer-notification.collection.js +130 -0
  36. package/collections/customer-notification.collection.js.map +1 -0
  37. package/collections/customer-portal-password.collection.d.ts +3 -0
  38. package/collections/customer-portal-password.collection.js +75 -0
  39. package/collections/customer-portal-password.collection.js.map +1 -0
  40. package/collections/email-history.collection.d.ts +3 -0
  41. package/collections/email-history.collection.js +121 -0
  42. package/collections/email-history.collection.js.map +1 -0
  43. package/collections/email-verified.collection.d.ts +3 -0
  44. package/collections/email-verified.collection.js +61 -0
  45. package/collections/email-verified.collection.js.map +1 -0
  46. package/collections/file.collection.d.ts +3 -0
  47. package/collections/file.collection.js +74 -0
  48. package/collections/file.collection.js.map +1 -0
  49. package/collections/flag-update.collection.d.ts +3 -0
  50. package/collections/flag-update.collection.js +57 -0
  51. package/collections/flag-update.collection.js.map +1 -0
  52. package/collections/flag.collection.d.ts +3 -0
  53. package/collections/flag.collection.js +57 -0
  54. package/collections/flag.collection.js.map +1 -0
  55. package/collections/log-method-latency.collection.d.ts +3 -0
  56. package/collections/log-method-latency.collection.js +77 -0
  57. package/collections/log-method-latency.collection.js.map +1 -0
  58. package/collections/log-subscription.collection.d.ts +3 -0
  59. package/collections/log-subscription.collection.js +80 -0
  60. package/collections/log-subscription.collection.js.map +1 -0
  61. package/collections/log.collection.d.ts +3 -0
  62. package/collections/log.collection.js +93 -0
  63. package/collections/log.collection.js.map +1 -0
  64. package/collections/logged-in-users.collection.d.ts +3 -0
  65. package/collections/logged-in-users.collection.js +67 -0
  66. package/collections/logged-in-users.collection.js.map +1 -0
  67. package/collections/monitor-cpu.collection.d.ts +3 -0
  68. package/collections/monitor-cpu.collection.js +65 -0
  69. package/collections/monitor-cpu.collection.js.map +1 -0
  70. package/collections/monitor-function.collection.d.ts +3 -0
  71. package/collections/monitor-function.collection.js +74 -0
  72. package/collections/monitor-function.collection.js.map +1 -0
  73. package/collections/monitor-memory.collection.d.ts +3 -0
  74. package/collections/monitor-memory.collection.js +77 -0
  75. package/collections/monitor-memory.collection.js.map +1 -0
  76. package/collections/monitor-mongo.collection.d.ts +3 -0
  77. package/collections/monitor-mongo.collection.js +71 -0
  78. package/collections/monitor-mongo.collection.js.map +1 -0
  79. package/collections/notification.collection.d.ts +3 -0
  80. package/collections/notification.collection.js +57 -0
  81. package/collections/notification.collection.js.map +1 -0
  82. package/collections/openai-usage-ledger.collection.d.ts +2 -0
  83. package/collections/openai-usage-ledger.collection.js +124 -0
  84. package/collections/openai-usage-ledger.collection.js.map +1 -0
  85. package/collections/report-builder-dashboard-builder.collection.d.ts +3 -0
  86. package/collections/report-builder-dashboard-builder.collection.js +109 -0
  87. package/collections/report-builder-dashboard-builder.collection.js.map +1 -0
  88. package/collections/report-builder-library.collection.d.ts +3 -0
  89. package/collections/report-builder-library.collection.js +87 -0
  90. package/collections/report-builder-library.collection.js.map +1 -0
  91. package/collections/report-builder-report.collection.d.ts +4 -0
  92. package/collections/report-builder-report.collection.js +180 -0
  93. package/collections/report-builder-report.collection.js.map +1 -0
  94. package/collections/user-group.collection.d.ts +4 -0
  95. package/collections/user-group.collection.js +89 -0
  96. package/collections/user-group.collection.js.map +1 -0
  97. package/collections/user-guide.collection.d.ts +3 -0
  98. package/collections/user-guide.collection.js +57 -0
  99. package/collections/user-guide.collection.js.map +1 -0
  100. package/collections/user.collection.d.ts +4 -0
  101. package/collections/user.collection.js +180 -0
  102. package/collections/user.collection.js.map +1 -0
  103. package/cron/cron.d.ts +14 -0
  104. package/cron/cron.js +216 -0
  105. package/cron/cron.js.map +1 -0
  106. package/fixtures/cron-jobs.d.ts +1 -0
  107. package/fixtures/cron-jobs.js +150 -0
  108. package/fixtures/cron-jobs.js.map +1 -0
  109. package/fixtures/init.d.ts +1 -0
  110. package/fixtures/init.js +91 -0
  111. package/fixtures/init.js.map +1 -0
  112. package/http/auth.d.ts +2 -0
  113. package/http/auth.js +903 -0
  114. package/http/auth.js.map +1 -0
  115. package/http/health.d.ts +1 -0
  116. package/http/health.js +11 -0
  117. package/http/health.js.map +1 -0
  118. package/http/home.d.ts +1 -0
  119. package/http/home.js +134 -0
  120. package/http/home.js.map +1 -0
  121. package/http/slow-query-publication.d.ts +2 -0
  122. package/http/slow-query-publication.js +99 -0
  123. package/http/slow-query-publication.js.map +1 -0
  124. package/index.d.ts +1 -0
  125. package/index.js +19 -0
  126. package/index.js.map +1 -0
  127. package/managers/communication-metric.manager.d.ts +16 -0
  128. package/managers/communication-metric.manager.js +134 -0
  129. package/managers/communication-metric.manager.js.map +1 -0
  130. package/managers/cron.manager.d.ts +20 -0
  131. package/managers/cron.manager.js +534 -0
  132. package/managers/cron.manager.js.map +1 -0
  133. package/managers/customer-notification-content.manager.d.ts +55 -0
  134. package/managers/customer-notification-content.manager.js +158 -0
  135. package/managers/customer-notification-content.manager.js.map +1 -0
  136. package/managers/diagnostic-manager-bootstrap.d.ts +9 -0
  137. package/managers/diagnostic-manager-bootstrap.js +260 -0
  138. package/managers/diagnostic-manager-bootstrap.js.map +1 -0
  139. package/managers/error-auto-fix.manager.d.ts +149 -0
  140. package/managers/error-auto-fix.manager.js +3064 -0
  141. package/managers/error-auto-fix.manager.js.map +1 -0
  142. package/managers/local-log.manager.d.ts +18 -0
  143. package/managers/local-log.manager.js +88 -0
  144. package/managers/local-log.manager.js.map +1 -0
  145. package/managers/method.manager.d.ts +77 -0
  146. package/managers/method.manager.js +1701 -0
  147. package/managers/method.manager.js.map +1 -0
  148. package/managers/mongo.manager.d.ts +222 -0
  149. package/managers/mongo.manager.js +4984 -0
  150. package/managers/mongo.manager.js.map +1 -0
  151. package/managers/monitor.manager.d.ts +69 -0
  152. package/managers/monitor.manager.js +534 -0
  153. package/managers/monitor.manager.js.map +1 -0
  154. package/managers/openai-usage-ledger.manager.d.ts +15 -0
  155. package/managers/openai-usage-ledger.manager.js +144 -0
  156. package/managers/openai-usage-ledger.manager.js.map +1 -0
  157. package/managers/slow-query-verifier.manager.d.ts +144 -0
  158. package/managers/slow-query-verifier.manager.js +3857 -0
  159. package/managers/slow-query-verifier.manager.js.map +1 -0
  160. package/managers/slow-query.manager.d.ts +28 -0
  161. package/managers/slow-query.manager.js +468 -0
  162. package/managers/slow-query.manager.js.map +1 -0
  163. package/managers/subscription.manager.d.ts +169 -0
  164. package/managers/subscription.manager.js +3422 -0
  165. package/managers/subscription.manager.js.map +1 -0
  166. package/managers/websocket.manager.d.ts +73 -0
  167. package/managers/websocket.manager.js +673 -0
  168. package/managers/websocket.manager.js.map +1 -0
  169. package/managers/worker-dispatcher.manager.d.ts +117 -0
  170. package/managers/worker-dispatcher.manager.js +1210 -0
  171. package/managers/worker-dispatcher.manager.js.map +1 -0
  172. package/managers/worker-server.manager.d.ts +16 -0
  173. package/managers/worker-server.manager.js +530 -0
  174. package/managers/worker-server.manager.js.map +1 -0
  175. package/methods/accounts.d.ts +2 -0
  176. package/methods/accounts.js +624 -0
  177. package/methods/accounts.js.map +1 -0
  178. package/methods/ai-terminal.d.ts +304 -0
  179. package/methods/ai-terminal.js +25096 -0
  180. package/methods/ai-terminal.js.map +1 -0
  181. package/methods/app-settings.d.ts +2 -0
  182. package/methods/app-settings.js +169 -0
  183. package/methods/app-settings.js.map +1 -0
  184. package/methods/aws.d.ts +2 -0
  185. package/methods/aws.js +874 -0
  186. package/methods/aws.js.map +1 -0
  187. package/methods/collections.d.ts +2 -0
  188. package/methods/collections.js +626 -0
  189. package/methods/collections.js.map +1 -0
  190. package/methods/counters.d.ts +2 -0
  191. package/methods/counters.js +111 -0
  192. package/methods/counters.js.map +1 -0
  193. package/methods/cron-jobs.d.ts +2 -0
  194. package/methods/cron-jobs.js +2471 -0
  195. package/methods/cron-jobs.js.map +1 -0
  196. package/methods/customer-notifications.d.ts +2 -0
  197. package/methods/customer-notifications.js +528 -0
  198. package/methods/customer-notifications.js.map +1 -0
  199. package/methods/diagnostics.d.ts +2 -0
  200. package/methods/diagnostics.js +514 -0
  201. package/methods/diagnostics.js.map +1 -0
  202. package/methods/flag-updates.d.ts +2 -0
  203. package/methods/flag-updates.js +8 -0
  204. package/methods/flag-updates.js.map +1 -0
  205. package/methods/flags.d.ts +2 -0
  206. package/methods/flags.js +8 -0
  207. package/methods/flags.js.map +1 -0
  208. package/methods/logs.d.ts +2 -0
  209. package/methods/logs.js +750 -0
  210. package/methods/logs.js.map +1 -0
  211. package/methods/mongo-explorer.d.ts +2 -0
  212. package/methods/mongo-explorer.js +1811 -0
  213. package/methods/mongo-explorer.js.map +1 -0
  214. package/methods/monitor.d.ts +2 -0
  215. package/methods/monitor.js +543 -0
  216. package/methods/monitor.js.map +1 -0
  217. package/methods/pdf.d.ts +2 -0
  218. package/methods/pdf.js +1195 -0
  219. package/methods/pdf.js.map +1 -0
  220. package/methods/publications.d.ts +1 -0
  221. package/methods/publications.js +183 -0
  222. package/methods/publications.js.map +1 -0
  223. package/methods/report-builder.d.ts +2 -0
  224. package/methods/report-builder.js +3099 -0
  225. package/methods/report-builder.js.map +1 -0
  226. package/methods/support.d.ts +2 -0
  227. package/methods/support.js +313 -0
  228. package/methods/support.js.map +1 -0
  229. package/models/ai-terminal-conversation.model.d.ts +17 -0
  230. package/models/ai-terminal-conversation.model.js +4 -0
  231. package/models/ai-terminal-conversation.model.js.map +1 -0
  232. package/models/ai-terminal-issue-report.model.d.ts +19 -0
  233. package/models/ai-terminal-issue-report.model.js +4 -0
  234. package/models/ai-terminal-issue-report.model.js.map +1 -0
  235. package/models/ai-terminal-message.model.d.ts +22 -0
  236. package/models/ai-terminal-message.model.js +4 -0
  237. package/models/ai-terminal-message.model.js.map +1 -0
  238. package/models/app-setting.model.d.ts +16 -0
  239. package/models/app-setting.model.js +4 -0
  240. package/models/app-setting.model.js.map +1 -0
  241. package/{src/models/app-status.model.ts → models/app-status.model.d.ts} +2 -3
  242. package/models/app-status.model.js +4 -0
  243. package/models/app-status.model.js.map +1 -0
  244. package/{src/models/billing-logged-in-users.model.ts → models/billing-logged-in-users.model.d.ts} +4 -5
  245. package/models/billing-logged-in-users.model.js +4 -0
  246. package/models/billing-logged-in-users.model.js.map +1 -0
  247. package/models/collection-document.model.d.ts +21 -0
  248. package/models/collection-document.model.js +4 -0
  249. package/models/collection-document.model.js.map +1 -0
  250. package/models/communication-metric.model.d.ts +20 -0
  251. package/models/communication-metric.model.js +4 -0
  252. package/models/communication-metric.model.js.map +1 -0
  253. package/{src/models/counter.model.ts → models/counter.model.d.ts} +3 -4
  254. package/models/counter.model.js +4 -0
  255. package/models/counter.model.js.map +1 -0
  256. package/models/cron-job-history.model.d.ts +15 -0
  257. package/models/cron-job-history.model.js +4 -0
  258. package/models/cron-job-history.model.js.map +1 -0
  259. package/models/cron-job.model.d.ts +14 -0
  260. package/models/cron-job.model.js +4 -0
  261. package/models/cron-job.model.js.map +1 -0
  262. package/models/customer-notification.model.d.ts +26 -0
  263. package/models/customer-notification.model.js +4 -0
  264. package/models/customer-notification.model.js.map +1 -0
  265. package/models/customer-portal-password.model.d.ts +11 -0
  266. package/models/customer-portal-password.model.js +4 -0
  267. package/models/customer-portal-password.model.js.map +1 -0
  268. package/models/dialog.model.d.ts +23 -0
  269. package/models/dialog.model.js +4 -0
  270. package/models/dialog.model.js.map +1 -0
  271. package/models/email-history.model.d.ts +30 -0
  272. package/{src/models/email-history.model.ts → models/email-history.model.js} +4 -34
  273. package/models/email-history.model.js.map +1 -0
  274. package/{src/models/email-verified.model.ts → models/email-verified.model.d.ts} +5 -6
  275. package/models/email-verified.model.js +4 -0
  276. package/models/email-verified.model.js.map +1 -0
  277. package/{src/models/file.model.ts → models/file.model.d.ts} +7 -8
  278. package/models/file.model.js +4 -0
  279. package/models/file.model.js.map +1 -0
  280. package/{src/models/flag-update.model.ts → models/flag-update.model.d.ts} +3 -4
  281. package/models/flag-update.model.js +4 -0
  282. package/models/flag-update.model.js.map +1 -0
  283. package/{src/models/flag.model.ts → models/flag.model.d.ts} +3 -4
  284. package/models/flag.model.js +4 -0
  285. package/models/flag.model.js.map +1 -0
  286. package/models/log-method-latency.model.d.ts +10 -0
  287. package/models/log-method-latency.model.js +4 -0
  288. package/models/log-method-latency.model.js.map +1 -0
  289. package/{src/models/log-subscription.model.ts → models/log-subscription.model.d.ts} +9 -11
  290. package/models/log-subscription.model.js +4 -0
  291. package/models/log-subscription.model.js.map +1 -0
  292. package/models/log.model.d.ts +17 -0
  293. package/models/log.model.js +4 -0
  294. package/models/log.model.js.map +1 -0
  295. package/{src/models/logged-in-users.model.ts → models/logged-in-users.model.d.ts} +5 -6
  296. package/models/logged-in-users.model.js +4 -0
  297. package/models/logged-in-users.model.js.map +1 -0
  298. package/{src/models/method-response.model.ts → models/method-response.model.d.ts} +6 -7
  299. package/models/method-response.model.js +4 -0
  300. package/models/method-response.model.js.map +1 -0
  301. package/models/method.model.d.ts +24 -0
  302. package/models/method.model.js +4 -0
  303. package/models/method.model.js.map +1 -0
  304. package/{src/models/monitor-cpu.model.ts → models/monitor-cpu.model.d.ts} +7 -9
  305. package/models/monitor-cpu.model.js +4 -0
  306. package/models/monitor-cpu.model.js.map +1 -0
  307. package/models/monitor-function.model.d.ts +14 -0
  308. package/models/monitor-function.model.js +4 -0
  309. package/models/monitor-function.model.js.map +1 -0
  310. package/models/monitor-memory.model.d.ts +15 -0
  311. package/models/monitor-memory.model.js +4 -0
  312. package/models/monitor-memory.model.js.map +1 -0
  313. package/models/monitor-mongo.model.d.ts +13 -0
  314. package/models/monitor-mongo.model.js +4 -0
  315. package/models/monitor-mongo.model.js.map +1 -0
  316. package/{src/models/notification.model.ts → models/notification.model.d.ts} +4 -6
  317. package/models/notification.model.js +4 -0
  318. package/models/notification.model.js.map +1 -0
  319. package/models/openai-usage-ledger.model.d.ts +15 -0
  320. package/models/openai-usage-ledger.model.js +4 -0
  321. package/models/openai-usage-ledger.model.js.map +1 -0
  322. package/models/pagination.model.d.ts +11 -0
  323. package/models/pagination.model.js +28 -0
  324. package/models/pagination.model.js.map +1 -0
  325. package/models/permission.model.d.ts +12 -0
  326. package/models/permission.model.js +4 -0
  327. package/models/permission.model.js.map +1 -0
  328. package/models/report-builder-dashboard-builder.model.d.ts +25 -0
  329. package/models/report-builder-dashboard-builder.model.js +4 -0
  330. package/models/report-builder-dashboard-builder.model.js.map +1 -0
  331. package/models/report-builder-library.model.d.ts +17 -0
  332. package/models/report-builder-library.model.js +4 -0
  333. package/models/report-builder-library.model.js.map +1 -0
  334. package/models/report-builder-report.model.d.ts +120 -0
  335. package/models/report-builder-report.model.js +4 -0
  336. package/models/report-builder-report.model.js.map +1 -0
  337. package/models/report-builder.model.d.ts +61 -0
  338. package/models/report-builder.model.js +4 -0
  339. package/models/report-builder.model.js.map +1 -0
  340. package/models/select-data-label.model.d.ts +9 -0
  341. package/models/select-data-label.model.js +4 -0
  342. package/models/select-data-label.model.js.map +1 -0
  343. package/models/server-message.model.d.ts +32 -0
  344. package/models/server-message.model.js +4 -0
  345. package/models/server-message.model.js.map +1 -0
  346. package/models/slow-query-report.model.d.ts +23 -0
  347. package/models/slow-query-report.model.js +4 -0
  348. package/models/slow-query-report.model.js.map +1 -0
  349. package/models/subscription.model.d.ts +31 -0
  350. package/models/subscription.model.js +4 -0
  351. package/models/subscription.model.js.map +1 -0
  352. package/models/support-ticket.model.d.ts +86 -0
  353. package/models/support-ticket.model.js +4 -0
  354. package/models/support-ticket.model.js.map +1 -0
  355. package/models/user-group.model.d.ts +20 -0
  356. package/models/user-group.model.js +4 -0
  357. package/models/user-group.model.js.map +1 -0
  358. package/{src/models/user-guide.model.ts → models/user-guide.model.d.ts} +4 -5
  359. package/models/user-guide.model.js +4 -0
  360. package/models/user-guide.model.js.map +1 -0
  361. package/models/user.model.d.ts +84 -0
  362. package/models/user.model.js +4 -0
  363. package/models/user.model.js.map +1 -0
  364. package/package.json +1 -1
  365. package/private/images/ResolveIO.png +0 -0
  366. package/public_api.js +107 -0
  367. package/public_api.js.map +1 -0
  368. package/publications/ai-terminal.d.ts +1 -0
  369. package/publications/ai-terminal.js +122 -0
  370. package/publications/ai-terminal.js.map +1 -0
  371. package/publications/app-settings.d.ts +2 -0
  372. package/publications/app-settings.js +28 -0
  373. package/publications/app-settings.js.map +1 -0
  374. package/publications/app-status.d.ts +2 -0
  375. package/publications/app-status.js +16 -0
  376. package/publications/app-status.js.map +1 -0
  377. package/publications/cron-jobs.d.ts +2 -0
  378. package/publications/cron-jobs.js +32 -0
  379. package/publications/cron-jobs.js.map +1 -0
  380. package/publications/customer-notifications.d.ts +2 -0
  381. package/publications/customer-notifications.js +161 -0
  382. package/publications/customer-notifications.js.map +1 -0
  383. package/publications/files.d.ts +2 -0
  384. package/publications/files.js +36 -0
  385. package/publications/files.js.map +1 -0
  386. package/publications/flags-update.d.ts +2 -0
  387. package/publications/flags-update.js +22 -0
  388. package/publications/flags-update.js.map +1 -0
  389. package/publications/flags.d.ts +2 -0
  390. package/publications/flags.js +22 -0
  391. package/publications/flags.js.map +1 -0
  392. package/publications/logs.d.ts +2 -0
  393. package/publications/logs.js +164 -0
  394. package/publications/logs.js.map +1 -0
  395. package/publications/notifications.d.ts +2 -0
  396. package/publications/notifications.js +16 -0
  397. package/publications/notifications.js.map +1 -0
  398. package/publications/report-builder-dashboard-builders.d.ts +2 -0
  399. package/publications/report-builder-dashboard-builders.js +42 -0
  400. package/publications/report-builder-dashboard-builders.js.map +1 -0
  401. package/publications/report-builder-libraries.d.ts +2 -0
  402. package/publications/report-builder-libraries.js +90 -0
  403. package/publications/report-builder-libraries.js.map +1 -0
  404. package/publications/report-builder-reports.d.ts +2 -0
  405. package/publications/report-builder-reports.js +50 -0
  406. package/publications/report-builder-reports.js.map +1 -0
  407. package/publications/super-admin.d.ts +2 -0
  408. package/publications/super-admin.js +16 -0
  409. package/publications/super-admin.js.map +1 -0
  410. package/publications/user-groups.d.ts +1 -0
  411. package/publications/user-groups.js +16 -0
  412. package/publications/user-groups.js.map +1 -0
  413. package/publications/user-guides.d.ts +1 -0
  414. package/publications/user-guides.js +16 -0
  415. package/publications/user-guides.js.map +1 -0
  416. package/resolveio-server-app.d.ts +70 -0
  417. package/resolveio-server-app.js +801 -0
  418. package/resolveio-server-app.js.map +1 -0
  419. package/server-app.d.ts +167 -0
  420. package/server-app.js +2784 -0
  421. package/server-app.js.map +1 -0
  422. package/services/codex-client.d.ts +119 -0
  423. package/services/codex-client.js +1470 -0
  424. package/services/codex-client.js.map +1 -0
  425. package/services/openai-client.d.ts +46 -0
  426. package/services/openai-client.js +318 -0
  427. package/services/openai-client.js.map +1 -0
  428. package/types/error-report.d.ts +25 -0
  429. package/types/error-report.js +4 -0
  430. package/types/error-report.js.map +1 -0
  431. package/types/slow-query-report.d.ts +27 -0
  432. package/types/slow-query-report.js +6 -0
  433. package/types/slow-query-report.js.map +1 -0
  434. package/util/common.d.ts +31 -0
  435. package/util/common.js +683 -0
  436. package/util/common.js.map +1 -0
  437. package/util/customer-portal-password.d.ts +13 -0
  438. package/util/customer-portal-password.js +209 -0
  439. package/util/customer-portal-password.js.map +1 -0
  440. package/util/error-reporter.d.ts +52 -0
  441. package/util/error-reporter.js +326 -0
  442. package/util/error-reporter.js.map +1 -0
  443. package/util/error-tracking.d.ts +13 -0
  444. package/util/error-tracking.js +120 -0
  445. package/util/error-tracking.js.map +1 -0
  446. package/util/report-builder-unwinds.d.ts +15 -0
  447. package/util/report-builder-unwinds.js +156 -0
  448. package/util/report-builder-unwinds.js.map +1 -0
  449. package/util/schema-report-builder.d.ts +6 -0
  450. package/util/schema-report-builder.js +481 -0
  451. package/util/schema-report-builder.js.map +1 -0
  452. package/util/slow-query-reporter.d.ts +28 -0
  453. package/util/slow-query-reporter.js +226 -0
  454. package/util/slow-query-reporter.js.map +1 -0
  455. package/util/subscription-dependency-context.d.ts +34 -0
  456. package/util/subscription-dependency-context.js +1283 -0
  457. package/util/subscription-dependency-context.js.map +1 -0
  458. package/util/tokenizer.d.ts +5 -0
  459. package/util/tokenizer.js +41 -0
  460. package/util/tokenizer.js.map +1 -0
  461. package/workers/codex-runner.worker.d.ts +1 -0
  462. package/workers/codex-runner.worker.js +192 -0
  463. package/workers/codex-runner.worker.js.map +1 -0
  464. package/.github/workflows/ai-assistant-nightly-eval.yml +0 -224
  465. package/.github/workflows/ai-assistant-pr-guardrails.yml +0 -60
  466. package/.nodemon.json +0 -5
  467. package/.vscode/settings.json +0 -21
  468. package/AGENTS.md +0 -179
  469. package/README.md +0 -22
  470. package/build_package.sh +0 -5
  471. package/compileDTS.pl +0 -64
  472. package/docs/ai-assistant-nightly-eval.md +0 -65
  473. package/docs/ai-assistant-preflight-checklist.md +0 -23
  474. package/docs/ai-assistant-report-builder-bridge-playbook.md +0 -115
  475. package/eslint-plugin-custom/index.js +0 -7
  476. package/eslint-plugin-custom/rules/no-filter-zero-index.js +0 -44
  477. package/eslint.config.js +0 -103
  478. package/gulpfile.js +0 -216
  479. package/methodAndPublicationListGenerator.py +0 -319
  480. package/mongodbensurers.js +0 -2
  481. package/mongostop.js +0 -3
  482. package/settings.development.json +0 -25
  483. package/settings.development.redacted.json +0 -25
  484. package/src/.env +0 -12
  485. package/src/ai/assistant-core-heuristics.ts +0 -577
  486. package/src/client-server-app.ts +0 -12
  487. package/src/collections/ai-terminal-conversation.collection.ts +0 -91
  488. package/src/collections/ai-terminal-issue-report.collection.ts +0 -99
  489. package/src/collections/ai-terminal-message.collection.ts +0 -77
  490. package/src/collections/app-setting.collection.ts +0 -104
  491. package/src/collections/app-status.collection.ts +0 -58
  492. package/src/collections/communication-metric.collection.ts +0 -84
  493. package/src/collections/counter.collection.ts +0 -56
  494. package/src/collections/cron-job-history.collection.ts +0 -94
  495. package/src/collections/cron-job.collection.ts +0 -92
  496. package/src/collections/customer-notification.collection.ts +0 -131
  497. package/src/collections/customer-portal-password.collection.ts +0 -76
  498. package/src/collections/email-history.collection.ts +0 -121
  499. package/src/collections/email-verified.collection.ts +0 -61
  500. package/src/collections/file.collection.ts +0 -74
  501. package/src/collections/flag-update.collection.ts +0 -57
  502. package/src/collections/flag.collection.ts +0 -57
  503. package/src/collections/log-method-latency.collection.ts +0 -77
  504. package/src/collections/log-subscription.collection.ts +0 -80
  505. package/src/collections/log.collection.ts +0 -93
  506. package/src/collections/logged-in-users.collection.ts +0 -67
  507. package/src/collections/monitor-cpu.collection.ts +0 -65
  508. package/src/collections/monitor-function.collection.ts +0 -74
  509. package/src/collections/monitor-memory.collection.ts +0 -77
  510. package/src/collections/monitor-mongo.collection.ts +0 -71
  511. package/src/collections/notification.collection.ts +0 -57
  512. package/src/collections/openai-usage-ledger.collection.ts +0 -77
  513. package/src/collections/report-builder-dashboard-builder.collection.ts +0 -109
  514. package/src/collections/report-builder-library.collection.ts +0 -89
  515. package/src/collections/report-builder-report.collection.ts +0 -180
  516. package/src/collections/user-group.collection.ts +0 -89
  517. package/src/collections/user-guide.collection.ts +0 -57
  518. package/src/collections/user.collection.ts +0 -181
  519. package/src/cron/cron.ts +0 -117
  520. package/src/fixtures/cron-jobs.ts +0 -95
  521. package/src/fixtures/init.ts +0 -35
  522. package/src/http/auth.ts +0 -764
  523. package/src/http/health.ts +0 -7
  524. package/src/http/home.ts +0 -90
  525. package/src/http/slow-query-publication.ts +0 -49
  526. package/src/index.ts +0 -1
  527. package/src/managers/communication-metric.manager.ts +0 -82
  528. package/src/managers/cron.manager.ts +0 -333
  529. package/src/managers/customer-notification-content.manager.ts +0 -236
  530. package/src/managers/diagnostic-manager-bootstrap.ts +0 -165
  531. package/src/managers/error-auto-fix.manager.ts +0 -2767
  532. package/src/managers/local-log.manager.ts +0 -113
  533. package/src/managers/method.manager.ts +0 -1557
  534. package/src/managers/mongo.manager.ts +0 -4566
  535. package/src/managers/monitor.manager.ts +0 -489
  536. package/src/managers/openai-usage-ledger.manager.ts +0 -116
  537. package/src/managers/slow-query-verifier.manager.ts +0 -3590
  538. package/src/managers/slow-query.manager.ts +0 -519
  539. package/src/managers/subscription.manager.ts +0 -3120
  540. package/src/managers/websocket.manager.ts +0 -746
  541. package/src/managers/worker-dispatcher.manager.ts +0 -1318
  542. package/src/managers/worker-server.manager.ts +0 -468
  543. package/src/methods/accounts.ts +0 -532
  544. package/src/methods/ai-terminal.ts +0 -25505
  545. package/src/methods/app-settings.ts +0 -114
  546. package/src/methods/aws.ts +0 -646
  547. package/src/methods/collections.ts +0 -544
  548. package/src/methods/counters.ts +0 -67
  549. package/src/methods/cron-jobs.ts +0 -2610
  550. package/src/methods/customer-notifications.ts +0 -458
  551. package/src/methods/diagnostics.ts +0 -447
  552. package/src/methods/flag-updates.ts +0 -7
  553. package/src/methods/flags.ts +0 -7
  554. package/src/methods/logs.ts +0 -656
  555. package/src/methods/mongo-explorer.ts +0 -1883
  556. package/src/methods/monitor.ts +0 -540
  557. package/src/methods/pdf.ts +0 -1210
  558. package/src/methods/publications.ts +0 -128
  559. package/src/methods/report-builder.ts +0 -3305
  560. package/src/methods/support.ts +0 -210
  561. package/src/models/ai-terminal-conversation.model.ts +0 -19
  562. package/src/models/ai-terminal-issue-report.model.ts +0 -21
  563. package/src/models/ai-terminal-message.model.ts +0 -24
  564. package/src/models/app-setting.model.ts +0 -17
  565. package/src/models/collection-document.model.ts +0 -24
  566. package/src/models/communication-metric.model.ts +0 -23
  567. package/src/models/cron-job-history.model.ts +0 -16
  568. package/src/models/cron-job.model.ts +0 -15
  569. package/src/models/customer-notification.model.ts +0 -28
  570. package/src/models/customer-portal-password.model.ts +0 -12
  571. package/src/models/dialog.model.ts +0 -25
  572. package/src/models/log-method-latency.model.ts +0 -11
  573. package/src/models/log.model.ts +0 -19
  574. package/src/models/method.model.ts +0 -23
  575. package/src/models/monitor-function.model.ts +0 -16
  576. package/src/models/monitor-memory.model.ts +0 -17
  577. package/src/models/monitor-mongo.model.ts +0 -15
  578. package/src/models/openai-usage-ledger.model.ts +0 -16
  579. package/src/models/pagination.model.ts +0 -35
  580. package/src/models/permission.model.ts +0 -14
  581. package/src/models/report-builder-dashboard-builder.model.ts +0 -29
  582. package/src/models/report-builder-library.model.ts +0 -20
  583. package/src/models/report-builder-report.model.ts +0 -135
  584. package/src/models/report-builder.model.ts +0 -68
  585. package/src/models/select-data-label.model.ts +0 -9
  586. package/src/models/server-message.model.ts +0 -31
  587. package/src/models/slow-query-report.model.ts +0 -23
  588. package/src/models/subscription.model.ts +0 -73
  589. package/src/models/support-ticket.model.ts +0 -96
  590. package/src/models/user-group.model.ts +0 -24
  591. package/src/models/user.model.ts +0 -96
  592. package/src/private/images/ResolveIO.png +0 -0
  593. package/src/publications/ai-terminal.ts +0 -73
  594. package/src/publications/app-settings.ts +0 -25
  595. package/src/publications/app-status.ts +0 -13
  596. package/src/publications/cron-jobs.ts +0 -29
  597. package/src/publications/customer-notifications.ts +0 -101
  598. package/src/publications/files.ts +0 -33
  599. package/src/publications/flags-update.ts +0 -19
  600. package/src/publications/flags.ts +0 -19
  601. package/src/publications/logs.ts +0 -163
  602. package/src/publications/notifications.ts +0 -13
  603. package/src/publications/report-builder-dashboard-builders.ts +0 -39
  604. package/src/publications/report-builder-libraries.ts +0 -41
  605. package/src/publications/report-builder-reports.ts +0 -47
  606. package/src/publications/super-admin.ts +0 -13
  607. package/src/publications/user-groups.ts +0 -12
  608. package/src/publications/user-guides.ts +0 -12
  609. package/src/resolveio-server-app.ts +0 -617
  610. package/src/server-app.ts +0 -2616
  611. package/src/services/codex-client.ts +0 -1117
  612. package/src/services/openai-client.ts +0 -265
  613. package/src/types/error-report.ts +0 -26
  614. package/src/types/js-tiktoken.d.ts +0 -11
  615. package/src/types/slow-query-report.ts +0 -28
  616. package/src/util/common.ts +0 -649
  617. package/src/util/customer-portal-password.ts +0 -183
  618. package/src/util/error-reporter.ts +0 -332
  619. package/src/util/error-tracking.ts +0 -79
  620. package/src/util/report-builder-unwinds.ts +0 -180
  621. package/src/util/schema-report-builder.ts +0 -448
  622. package/src/util/slow-query-reporter.ts +0 -216
  623. package/src/util/subscription-dependency-context.ts +0 -1096
  624. package/src/util/tokenizer.ts +0 -38
  625. package/src/workers/codex-runner.worker.ts +0 -142
  626. package/start_server.sh +0 -5
  627. package/tests/ai-assistant-corpus-build.ts +0 -484
  628. package/tests/ai-assistant-corpus-replay-e2e.ts +0 -773
  629. package/tests/ai-assistant-data-parity-e2e.ts +0 -2018
  630. package/tests/ai-assistant-eval-triage.ts +0 -831
  631. package/tests/ai-assistant-openai-e2e.ts +0 -1061
  632. package/tests/ai-assistant-openai-git-e2e.ts +0 -155
  633. package/tests/ai-assistant-preflight-matrix.ts +0 -215
  634. package/tests/ai-assistant-routing-eval.test.ts +0 -560
  635. package/tests/ai-assistant-snf-live-eval.ts +0 -921
  636. package/tests/ai-assistant-utils.test.ts +0 -2165
  637. package/tests/error-reporter.test.ts +0 -145
  638. package/tests/report-builder-linking.test.ts +0 -79
  639. package/tests/subscription-connect-race.test.ts +0 -157
  640. package/tests/subscription-dependency-context.test.ts +0 -324
  641. package/tests/subscription-manager-collection-tracking.test.ts +0 -86
  642. package/tests/subscription-manager-invalidation.test.ts +0 -85
  643. package/tsconfig.json +0 -34
  644. /package/{src/private → private}/email-templates/enrollment.html +0 -0
  645. /package/{src/private → private}/email-templates/forgot-password.html +0 -0
  646. /package/{src/private → private}/email-templates/support-ticket-deleted.html +0 -0
  647. /package/{src/private → private}/email-templates/support-ticket-modified.html +0 -0
  648. /package/{src/private → private}/email-templates/support-ticket.html +0 -0
  649. /package/{src/public_api.ts → public_api.d.ts} +0 -0
@@ -0,0 +1,3099 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __read = (this && this.__read) || function (o, n) {
50
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
51
+ if (!m) return o;
52
+ var i = m.call(o), r, ar = [], e;
53
+ try {
54
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
55
+ }
56
+ catch (error) { e = { error: error }; }
57
+ finally {
58
+ try {
59
+ if (r && !r.done && (m = i["return"])) m.call(i);
60
+ }
61
+ finally { if (e) throw e.error; }
62
+ }
63
+ return ar;
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
+ };
74
+ var __values = (this && this.__values) || function(o) {
75
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
76
+ if (m) return m.call(o);
77
+ if (o && typeof o.length === "number") return {
78
+ next: function () {
79
+ if (o && i >= o.length) o = void 0;
80
+ return { value: o && o[i++], done: !o };
81
+ }
82
+ };
83
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
84
+ };
85
+ Object.defineProperty(exports, "__esModule", { value: true });
86
+ exports.loadReportBuilderMethods = loadReportBuilderMethods;
87
+ var simpl_schema_1 = require("simpl-schema");
88
+ var report_builder_report_collection_1 = require("../collections/report-builder-report.collection");
89
+ var user_collection_1 = require("../collections/user.collection");
90
+ var openai_usage_ledger_manager_1 = require("../managers/openai-usage-ledger.manager");
91
+ var pagination_model_1 = require("../models/pagination.model");
92
+ var resolveio_server_app_1 = require("../resolveio-server-app");
93
+ var codex_client_1 = require("../services/codex-client");
94
+ var common_1 = require("../util/common");
95
+ var report_builder_unwinds_1 = require("../util/report-builder-unwinds");
96
+ var schema_report_builder_1 = require("../util/schema-report-builder");
97
+ var tokenizer_1 = require("../util/tokenizer");
98
+ var ai_terminal_1 = require("./ai-terminal");
99
+ var DEFAULT_REPORT_BUILDER_CODEX_MODEL = 'gpt-5.3-codex';
100
+ var DEFAULT_REPORT_BUILDER_CODEX_FALLBACK_MODEL = 'gpt-5.2-codex';
101
+ var DEFAULT_REPORT_BUILDER_CODEX_TIMEOUT_MS = 60000;
102
+ var reportBuilderCodexClient = null;
103
+ function loadReportBuilderMethods(methodManager) {
104
+ methodManager.methods({
105
+ reportBuilderAiSuggest: {
106
+ check: new simpl_schema_1.default({
107
+ payload: {
108
+ type: Object,
109
+ blackbox: true
110
+ }
111
+ }),
112
+ function: function (payload) {
113
+ return __awaiter(this, void 0, void 0, function () {
114
+ return __generator(this, function (_a) {
115
+ switch (_a.label) {
116
+ case 0: return [4 /*yield*/, executeReportBuilderAi(payload || {}, this)];
117
+ case 1: return [2 /*return*/, _a.sent()];
118
+ }
119
+ });
120
+ });
121
+ }
122
+ },
123
+ reportbuilderreportWithId: {
124
+ check: new simpl_schema_1.default({
125
+ id: {
126
+ type: String
127
+ }
128
+ }),
129
+ function: function (id) {
130
+ return report_builder_report_collection_1.ReportBuilderReports.findOne({ _id: id });
131
+ }
132
+ },
133
+ reportBuilderBuildTree: {
134
+ check: new simpl_schema_1.default({
135
+ collection_root: {
136
+ type: String
137
+ },
138
+ collectionJoins: {
139
+ type: Array,
140
+ optional: true
141
+ },
142
+ 'collectionJoins.$': {
143
+ type: Object
144
+ },
145
+ 'collectionJoins.$.collection': {
146
+ type: String
147
+ },
148
+ 'collectionJoins.$.alias': {
149
+ type: String,
150
+ optional: true
151
+ },
152
+ 'collectionJoins.$.local_key': {
153
+ type: String,
154
+ optional: true
155
+ },
156
+ 'collectionJoins.$.foreign_key': {
157
+ type: String,
158
+ optional: true
159
+ }
160
+ }),
161
+ function: function (collection_root, collectionJoins) {
162
+ if (collectionJoins === void 0) { collectionJoins = []; }
163
+ var baseRootTree = buildCollectionTree(collection_root);
164
+ var collectionTrees = [
165
+ {
166
+ collection: collection_root,
167
+ alias: (0, common_1.toTitleCase)(collection_root.replace(/\_/g, ' ').replace(/-/g, ' ')),
168
+ lookup_as: '',
169
+ tree: (0, common_1.deepCopy)(baseRootTree)
170
+ }
171
+ ];
172
+ var rootTree = baseRootTree;
173
+ (collectionJoins || []).forEach(function (join, joinIndex) {
174
+ var joinLocalKey = join.local_key && join.local_key.trim().length ? join.local_key : '_id';
175
+ var joinForeignKey = join.foreign_key && join.foreign_key.trim().length ? join.foreign_key : '_id';
176
+ var joinAlias = buildJoinAlias(join, joinIndex);
177
+ var joinNode = buildJoinLookupNode(collection_root, __assign(__assign({}, join), { local_key: joinLocalKey, foreign_key: joinForeignKey }), joinAlias);
178
+ var joinTree = buildCollectionTree(join.collection, joinNode);
179
+ joinNode.children = joinTree.children;
180
+ joinNode.is_join = true;
181
+ rootTree.children.push(joinNode);
182
+ collectionTrees.push({
183
+ collection: join.collection,
184
+ alias: joinAlias,
185
+ lookup_as: joinNode.lookup_as,
186
+ tree: (0, common_1.deepCopy)(joinTree)
187
+ });
188
+ });
189
+ return Promise.resolve({
190
+ isLeaf: false,
191
+ children: rootTree.children,
192
+ trees: collectionTrees
193
+ });
194
+ }
195
+ },
196
+ reportBuilderGetDistinctValue: {
197
+ check: new simpl_schema_1.default({
198
+ treeLeaf: {
199
+ type: Object,
200
+ blackbox: true
201
+ }
202
+ }),
203
+ function: function (treeLeaf) {
204
+ return __awaiter(this, void 0, void 0, function () {
205
+ var fieldPath;
206
+ return __generator(this, function (_a) {
207
+ if (treeLeaf.fieldType === 'String') {
208
+ fieldPath = (treeLeaf && typeof treeLeaf.fieldPath === 'string') ? treeLeaf.fieldPath : '';
209
+ if (fieldPath.includes('(Lookup') || treeLeaf.lookup_collection) {
210
+ return [2 /*return*/, (0, schema_report_builder_1.mongoCommand)('distinct', treeLeaf.collection_name, fieldPath.replace(/^.+\(.+\) \(Lookup.*\)\.\$\./g, '').replace(/\.\$/g, ''))];
211
+ }
212
+ else {
213
+ return [2 /*return*/, (0, schema_report_builder_1.mongoCommand)('distinct', treeLeaf.collection_name, fieldPath.replace(/\.\$/g, ''))];
214
+ }
215
+ }
216
+ else {
217
+ return [2 /*return*/, []];
218
+ }
219
+ return [2 /*return*/];
220
+ });
221
+ });
222
+ }
223
+ },
224
+ reportBuilderGetResults: {
225
+ bypassSession: true,
226
+ check: new simpl_schema_1.default({
227
+ reportType: {
228
+ type: String
229
+ },
230
+ rootCollectionName: {
231
+ type: String
232
+ },
233
+ options: {
234
+ type: pagination_model_1.PaginationOptionsSchema
235
+ },
236
+ filters: {
237
+ type: Array,
238
+ optional: true
239
+ },
240
+ 'filters.$': {
241
+ type: Object,
242
+ blackbox: true,
243
+ optional: true
244
+ },
245
+ filterArrays: {
246
+ type: Array,
247
+ optional: true
248
+ },
249
+ 'filterArrays.$': {
250
+ type: Object,
251
+ blackbox: true,
252
+ optional: true
253
+ },
254
+ filterArrayFields: {
255
+ type: Array,
256
+ optional: true
257
+ },
258
+ 'filterArrayFields.$': {
259
+ type: Object,
260
+ blackbox: true,
261
+ optional: true
262
+ },
263
+ selectedFields: {
264
+ type: Array,
265
+ optional: true
266
+ },
267
+ 'selectedFields.$': {
268
+ type: Object,
269
+ optional: true,
270
+ blackbox: true
271
+ },
272
+ customFields: {
273
+ type: Array,
274
+ optional: true
275
+ },
276
+ 'customFields.$': {
277
+ type: Object,
278
+ optional: true,
279
+ blackbox: true
280
+ },
281
+ groupsRow: {
282
+ type: Array
283
+ },
284
+ 'groupsRow.$': {
285
+ type: Object,
286
+ blackbox: true
287
+ },
288
+ fieldsTotal: {
289
+ type: Array
290
+ },
291
+ 'fieldsTotal.$': {
292
+ type: Object,
293
+ blackbox: true
294
+ },
295
+ fieldsLink: {
296
+ type: Array
297
+ },
298
+ 'fieldsLink.$': {
299
+ type: Object,
300
+ blackbox: true
301
+ },
302
+ date_field: {
303
+ type: String,
304
+ optional: true
305
+ },
306
+ date_interval: {
307
+ type: String,
308
+ optional: true
309
+ },
310
+ displayType: {
311
+ type: String,
312
+ optional: true
313
+ }
314
+ }),
315
+ function: function (reportType_1, rootCollectionName_1, rootOptions_1) {
316
+ return __awaiter(this, arguments, void 0, function (reportType, rootCollectionName, rootOptions, filters, filterArrays, filterArrayFields, selectedFields, customFields, groupsRow, fieldsTotal, fieldsLink, date_field, date_interval, displayType) {
317
+ var modelCollection, datePaths, reportBuilderTimezone, lookupAliases, _a, rootFilters_1, lookupFilters_1, additionalCollectionsMap_1, additionalCollections, unionQuery_1, _b, sortToUse, layoutSortAdd, remappedFilters, remappedArrayFilters, postMatchAnd, readPreference_1, queryResult_1, err_1, tmpRes_1, query_1, initialQueryMatchCondition_1, sizes_1, divFields_1, queryMatchConditionLookup_1, queryGroup_1, groupedSorts_1, dateFieldPath, dateFieldExpr, utcHourExpr, utcMinuteExpr, utcSecondExpr, utcDayExpr, tzDayExpr, useUtcForDateOnlyExpr, groupingTimezoneExpr, queryProjection_1, _loop_1, i, readPreference, queryResult, err_2, tmpRes;
318
+ if (filters === void 0) { filters = []; }
319
+ if (filterArrays === void 0) { filterArrays = []; }
320
+ if (filterArrayFields === void 0) { filterArrayFields = []; }
321
+ if (selectedFields === void 0) { selectedFields = []; }
322
+ if (customFields === void 0) { customFields = []; }
323
+ if (groupsRow === void 0) { groupsRow = []; }
324
+ if (fieldsTotal === void 0) { fieldsTotal = []; }
325
+ if (fieldsLink === void 0) { fieldsLink = []; }
326
+ if (date_field === void 0) { date_field = ''; }
327
+ if (date_interval === void 0) { date_interval = ''; }
328
+ if (displayType === void 0) { displayType = ''; }
329
+ return __generator(this, function (_c) {
330
+ switch (_c.label) {
331
+ case 0:
332
+ modelCollection = resolveio_server_app_1.ResolveIOServer.getMongoManager().collection(rootCollectionName);
333
+ if (!!modelCollection) return [3 /*break*/, 1];
334
+ throw new Error('Error in Report builder get results: Invalid collection');
335
+ case 1:
336
+ filters = expandLayoutColumnFilters(filters, selectedFields);
337
+ filterArrays = expandLayoutColumnFilters(filterArrays, selectedFields);
338
+ datePaths = collectRootDatePaths(rootCollectionName);
339
+ if (datePaths.size) {
340
+ coerceDateFilters(filters, datePaths);
341
+ coerceDateFilters(filterArrays, datePaths);
342
+ }
343
+ reportBuilderTimezone = process.env.TZ_CLIENT || 'America/Chicago';
344
+ lookupAliases = collectLookupAliases(selectedFields, filterArrayFields, groupsRow);
345
+ _a = splitFiltersByLookup(filters, lookupAliases), rootFilters_1 = _a.rootFilters, lookupFilters_1 = _a.lookupFilters;
346
+ additionalCollectionsMap_1 = new Map();
347
+ (selectedFields || [])
348
+ .filter(function (f) {
349
+ return f &&
350
+ f.lookup_collection &&
351
+ (!f.lookup_local_key || !f.lookup_foreign_key);
352
+ })
353
+ .forEach(function (f) {
354
+ var alias = f.lookup_as || f.lookup_collection;
355
+ var key = "".concat(f.lookup_collection, "::").concat(alias);
356
+ if (!additionalCollectionsMap_1.has(key)) {
357
+ additionalCollectionsMap_1.set(key, { collection: f.lookup_collection, alias: alias });
358
+ }
359
+ });
360
+ additionalCollections = Array.from(additionalCollectionsMap_1.values());
361
+ if (!additionalCollections.length) return [3 /*break*/, 6];
362
+ unionQuery_1 = buildCollectionPipeline(rootCollectionName, '', selectedFields, filters.concat(rootFilters_1 || []), filterArrays.concat(lookupFilters_1 || []), true);
363
+ additionalCollections.forEach(function (cfg) {
364
+ unionQuery_1.push({
365
+ $unionWith: {
366
+ coll: cfg.collection,
367
+ pipeline: buildCollectionPipeline(cfg.collection, cfg.alias, selectedFields, filters.concat(rootFilters_1 || []), filterArrays.concat(lookupFilters_1 || []), false)
368
+ }
369
+ });
370
+ });
371
+ if (rootOptions.sort) {
372
+ _b = buildLayoutSortSpec(rootOptions.sort, selectedFields), sortToUse = _b.sortSpec, layoutSortAdd = _b.addFields;
373
+ if (Object.keys(layoutSortAdd).length) {
374
+ unionQuery_1.push({ $addFields: layoutSortAdd });
375
+ }
376
+ appendSafeSort(unionQuery_1, sortToUse, selectedFields, customFields);
377
+ }
378
+ remappedFilters = remapFiltersToIds(filters.concat(rootFilters_1 || []), selectedFields);
379
+ remappedArrayFilters = remapFiltersToIds(filterArrays.concat(lookupFilters_1 || []), selectedFields);
380
+ postMatchAnd = [];
381
+ if (remappedFilters.length) {
382
+ postMatchAnd.push.apply(postMatchAnd, __spreadArray([], __read(remappedFilters), false));
383
+ }
384
+ if (remappedArrayFilters.length) {
385
+ postMatchAnd.push.apply(postMatchAnd, __spreadArray([], __read(remappedArrayFilters), false));
386
+ }
387
+ if (postMatchAnd.length) {
388
+ unionQuery_1.push({ $match: { $and: postMatchAnd } });
389
+ }
390
+ readPreference_1 = this.serverConfig['ROOT_URL'] !== 'http://localhost:4200' ? 'secondary' : 'primary';
391
+ queryResult_1 = {
392
+ count: 0,
393
+ results: [],
394
+ totals: {}
395
+ };
396
+ _c.label = 2;
397
+ case 2:
398
+ _c.trys.push([2, 4, , 5]);
399
+ return [4 /*yield*/, executeReportBuilderQuery(modelCollection, unionQuery_1, rootOptions, fieldsTotal, selectedFields, customFields, readPreference_1)];
400
+ case 3:
401
+ queryResult_1 = _c.sent();
402
+ return [3 /*break*/, 5];
403
+ case 4:
404
+ err_1 = _c.sent();
405
+ console.log(err_1);
406
+ return [3 /*break*/, 5];
407
+ case 5:
408
+ tmpRes_1 = [{
409
+ count: queryResult_1.count,
410
+ results: queryResult_1.results,
411
+ totals: queryResult_1.totals
412
+ }];
413
+ return [2 /*return*/, tmpRes_1];
414
+ case 6:
415
+ query_1 = [];
416
+ initialQueryMatchCondition_1 = {
417
+ $and: []
418
+ };
419
+ // selectedFields.filter(a => a.collection_name === rootCollectionName).forEach(field => {
420
+ // initialQueryMatchCondition['$and'].push({
421
+ // $and: [
422
+ // {[field.fieldPath.replace(/\.\$/g, '')]: {$exists: 1}},
423
+ // // {[field.fieldPath.replace(/\.\$/g, '')]: {$ne: ''}},
424
+ // {[field.fieldPath.replace(/\.\$/g, '')]: {$ne: null}},
425
+ // ]
426
+ // });
427
+ // });
428
+ if (rootFilters_1.length) {
429
+ rootFilters_1.forEach(function (filter) { return initialQueryMatchCondition_1['$and'].push(filter); });
430
+ }
431
+ // Add filter to query
432
+ // if (filters.filter(a => (!a['$or'] && !Object.keys(a).some(b => b.includes('(Lookup'))) || (a['$or'] && !a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).length || selectedFields.filter(a => !a.fieldPath.includes('(Lookup')).length) {
433
+ if (initialQueryMatchCondition_1['$and'].length) {
434
+ query_1.push({
435
+ $match: initialQueryMatchCondition_1
436
+ });
437
+ }
438
+ // Add count
439
+ query_1.push({ $addFields: { count: { $sum: 1 } } });
440
+ sizes_1 = [];
441
+ filterArrayFields.filter(function (a) { return a.fieldPath; }).forEach(function (filterField) {
442
+ var fieldData = filterField.fieldPath.split('.$');
443
+ var fieldPath = '';
444
+ var _loop_2 = function (i) {
445
+ var _a, _b;
446
+ fieldPath += fieldData[i];
447
+ if (filterField.lookup_collection || fieldPath.split('.$')[fieldPath.split('.$').length - 1].includes('(Lookup')) {
448
+ (0, report_builder_unwinds_1.ensureLookupLocalKeyUnwinds)({
449
+ query: query_1,
450
+ sizes: sizes_1,
451
+ lookupLocalKey: filterField.lookup_local_key || '',
452
+ lookupAs: filterField.lookup_as || ''
453
+ });
454
+ var lookupAs_1 = filterField.lookup_as.replace(/\.\$/g, '');
455
+ if (!query_1.some(function (a) { return a.$lookup && a.$lookup.as === lookupAs_1; })) {
456
+ query_1.push({ $lookup: {
457
+ from: filterField.lookup_collection,
458
+ localField: (0, report_builder_unwinds_1.normalizeLookupField)(filterField.lookup_local_key),
459
+ foreignField: (0, report_builder_unwinds_1.normalizeLookupField)(filterField.lookup_foreign_key),
460
+ as: lookupAs_1
461
+ } });
462
+ var lookupSizeKey = filterField.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_');
463
+ sizes_1.push(lookupSizeKey);
464
+ var lookupSourceExpr = '$' + lookupAs_1;
465
+ query_1.push({ $addFields: (_a = {}, _a['size_' + lookupSizeKey] = { $size: { $cond: [{ $isArray: lookupSourceExpr }, lookupSourceExpr, []] } }, _a) });
466
+ var unwindPath = '$' + lookupAs_1;
467
+ query_1.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
468
+ }
469
+ }
470
+ else {
471
+ if (!query_1.some(function (a) { return a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath.replace(/\./g, '_')); })) {
472
+ sizes_1.push(fieldPath.replace(/\./g, '_'));
473
+ var sourceExpr = '$' + fieldPath;
474
+ query_1.push({ $addFields: (_b = {}, _b['size_' + fieldPath.replace(/\./g, '_')] = { $size: { $cond: [{ $isArray: sourceExpr }, sourceExpr, []] } }, _b) });
475
+ var unwindPath = '$' + fieldPath;
476
+ query_1.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
477
+ }
478
+ }
479
+ };
480
+ for (var i = 0; i < fieldData.length - 1; i++) {
481
+ _loop_2(i);
482
+ }
483
+ });
484
+ // Groups - Lookups / Sizes / Unwinds
485
+ groupsRow.forEach(function (row) {
486
+ var _a, _b, _c;
487
+ var rowField = (row && typeof row.field === 'string') ? row.field : '';
488
+ if (rowField.includes('$')) {
489
+ var fieldData = rowField.split('.$');
490
+ var fieldPath_1 = '';
491
+ var _loop_3 = function (i) {
492
+ var _d, _e;
493
+ fieldPath_1 += fieldData[i];
494
+ var lastSegment = fieldPath_1.split('.$')[fieldPath_1.split('.$').length - 1];
495
+ var hasLookup = !!((_a = row.treeItem) === null || _a === void 0 ? void 0 : _a.lookup_collection) || (lastSegment || '').includes('(Lookup');
496
+ if (hasLookup && ((_b = row.treeItem) === null || _b === void 0 ? void 0 : _b.lookup_collection) && ((_c = row.treeItem) === null || _c === void 0 ? void 0 : _c.lookup_as)) {
497
+ (0, report_builder_unwinds_1.ensureLookupLocalKeyUnwinds)({
498
+ query: query_1,
499
+ sizes: sizes_1,
500
+ lookupLocalKey: row.treeItem.lookup_local_key || '',
501
+ lookupAs: row.treeItem.lookup_as || ''
502
+ });
503
+ var lookupAsRaw = row.treeItem.lookup_as || '';
504
+ var lookupAs_2 = lookupAsRaw.replace(/\.\$/g, '');
505
+ if (!query_1.some(function (a) { return a.$lookup && a.$lookup.as === lookupAs_2; })) {
506
+ query_1.push({ $lookup: {
507
+ from: row.treeItem.lookup_collection,
508
+ localField: (0, report_builder_unwinds_1.normalizeLookupField)(row.treeItem.lookup_local_key || ''),
509
+ foreignField: (0, report_builder_unwinds_1.normalizeLookupField)(row.treeItem.lookup_foreign_key || ''),
510
+ as: lookupAs_2
511
+ } });
512
+ var sizeKey = lookupAsRaw.replace(/\.\$\./g, '_').replace(/\./g, '_');
513
+ sizes_1.push(sizeKey);
514
+ var sourceExpr = '$' + lookupAs_2;
515
+ query_1.push({ $addFields: (_d = {}, _d['size_' + sizeKey] = { $size: { $cond: [{ $isArray: sourceExpr }, sourceExpr, []] } }, _d) });
516
+ var unwindPath = '$' + lookupAs_2;
517
+ query_1.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
518
+ }
519
+ }
520
+ else {
521
+ if (!query_1.some(function (a) { return a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath_1.replace(/\.\$\./g, '.').replace(/\./g, '_')); })) {
522
+ var sizeKey = fieldPath_1.replace(/\.\$\./g, '.').replace(/\./g, '_');
523
+ sizes_1.push(sizeKey);
524
+ var sourceExpr = '$' + fieldPath_1.replace(/\.\$\./g, '.');
525
+ query_1.push({ $addFields: (_e = {}, _e['size_' + sizeKey] = { $size: { $cond: [{ $isArray: sourceExpr }, sourceExpr, []] } }, _e) });
526
+ var unwindPath = '$' + fieldPath_1.replace(/\.\$\./g, '.');
527
+ query_1.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
528
+ }
529
+ }
530
+ fieldPath_1 += '.$';
531
+ };
532
+ for (var i = 0; i < fieldData.length - 1; i++) {
533
+ _loop_3(i);
534
+ }
535
+ }
536
+ });
537
+ (0, report_builder_unwinds_1.applyLinkFieldUnwinds)({
538
+ query: query_1,
539
+ sizes: sizes_1,
540
+ fieldsLink: fieldsLink,
541
+ selectedFields: selectedFields,
542
+ filterArrayFields: filterArrayFields,
543
+ groupsRow: groupsRow
544
+ });
545
+ divFields_1 = { $addFields: {} };
546
+ fieldsTotal.filter(function (a) { return a.type === 'sum'; }).forEach(function (total) {
547
+ selectedFields.filter(function (a) { return a.fieldType === 'Number' || a.leafValueType === 'Count'; }).forEach(function (field) {
548
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
549
+ if (!fieldPath && field.leafValueType !== 'Count') {
550
+ return;
551
+ }
552
+ var multFields = [];
553
+ if (!fieldPath.includes('.$')) {
554
+ sizes_1.forEach(function (size) {
555
+ multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
556
+ });
557
+ }
558
+ else {
559
+ sizes_1.filter(function (a) { return !fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !filterArrayFields.filter(function (a) { return a.fieldPath; }).some(function (b) { return b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }); }).forEach(function (size) {
560
+ multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
561
+ });
562
+ }
563
+ if (multFields.length) {
564
+ if (field.leafValueType === 'Count') {
565
+ divFields_1.$addFields[total.id + '_' + field.id] = {
566
+ $divide: ['$count', { $multiply: multFields }]
567
+ };
568
+ }
569
+ else {
570
+ divFields_1.$addFields[total.id + '_' + field.id] = {
571
+ $divide: [buildArrayAwareNumericFieldExpr(fieldPath), { $multiply: multFields }]
572
+ };
573
+ }
574
+ }
575
+ else {
576
+ if (field.leafValueType === 'Count') {
577
+ divFields_1.$addFields[total.id + '_' + field.id] = '$count';
578
+ }
579
+ else {
580
+ divFields_1.$addFields[total.id + '_' + field.id] = buildArrayAwareNumericFieldExpr(fieldPath);
581
+ }
582
+ }
583
+ });
584
+ });
585
+ selectedFields.filter(function (a) { return a.fieldType === 'Number' && a.leafValueType === 'Sum'; }).forEach(function (field) {
586
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
587
+ if (!fieldPath) {
588
+ return;
589
+ }
590
+ var multFields = [];
591
+ sizes_1.filter(function (a) { return !fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !groupsRow.some(function (b) { return (b.field || '').replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }) && !filterArrayFields.filter(function (a) { return a.fieldPath; }).some(function (b) { return b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }); }).forEach(function (size) {
592
+ multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
593
+ });
594
+ if (multFields.length) {
595
+ divFields_1.$addFields[fieldPath.replace(/\.\$/g, '')] = {
596
+ $divide: [buildArrayAwareNumericFieldExpr(fieldPath), { $multiply: multFields }]
597
+ };
598
+ }
599
+ });
600
+ selectedFields.filter(function (a) { return a.leafValueType === 'Count'; }).forEach(function (field) {
601
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
602
+ if (!fieldPath) {
603
+ return;
604
+ }
605
+ var multFields = [];
606
+ sizes_1.filter(function (a) { return !fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !groupsRow.some(function (b) { return (b.field || '').replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }) && !filterArrayFields.filter(function (a) { return a.fieldPath; }).some(function (b) { return b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a); }); }).forEach(function (size) {
607
+ multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
608
+ });
609
+ if (multFields.length) {
610
+ divFields_1.$addFields['count_' + fieldPath.replace(/\.\$/g, '')] = {
611
+ $divide: ['$count', { $multiply: multFields }]
612
+ };
613
+ }
614
+ else {
615
+ if (reportType !== 'Dated' && sizes_1.filter(function (a) { return fieldPath.replace(/\.\$\./g, '_').includes(a); }).length) {
616
+ sizes_1.filter(function (a) { return fieldPath.replace(/\.\$\./g, '_').includes(a); }).forEach(function (size) {
617
+ divFields_1.$addFields['count_' + fieldPath.replace(/\.\$/g, '')] = '$size_' + size;
618
+ });
619
+ }
620
+ else {
621
+ divFields_1.$addFields['count_' + fieldPath.replace(/\.\$/g, '')] = '$count';
622
+ }
623
+ }
624
+ });
625
+ fieldsTotal.filter(function (a) { return a.type === 'avg'; }).forEach(function (total) {
626
+ selectedFields.filter(function (a) { return a.fieldType === 'Number' || a.leafValueType === 'Count'; }).forEach(function (field) {
627
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
628
+ if (!fieldPath && field.leafValueType !== 'Count') {
629
+ return;
630
+ }
631
+ divFields_1.$addFields[total.id + '_' + field.id] = buildArrayAwareNumericFieldExpr(fieldPath);
632
+ });
633
+ });
634
+ if (Object.keys(divFields_1.$addFields).length > 0) {
635
+ query_1.push(divFields_1);
636
+ }
637
+ fieldsLink.filter(function (a) { return a.field_first && a.field_second; }).forEach(function (link) {
638
+ var _a, _b;
639
+ query_1.push({ $addFields: (_a = {}, _a[link.id] = { $cmp: ['$' + link.field_first.replace(/\.\$/g, ''), '$' + link.field_second.replace(/\.\$/g, '')] }, _a) });
640
+ query_1.push({ $match: (_b = {}, _b[link.id] = 0, _b) });
641
+ });
642
+ customFields.forEach(function (cust) {
643
+ cust.operations.filter(function (a) { return a.operation && !a.fields.some(function (b) { return (b.field === null || b.field === '') && b.value === null; }); }).forEach(function (operation, opIndex) {
644
+ var _a, _b;
645
+ var custFieldGroup = {};
646
+ if (operation.operation === 'divide') {
647
+ var condCheck_1 = [];
648
+ operation.fields.filter(function (a) { return a.field || a.value !== null; }).forEach(function (field) {
649
+ if (field.field) {
650
+ condCheck_1.push({ $eq: ['$' + field.field.replace(/\.\$/g, ''), 0] });
651
+ condCheck_1.push({ $eq: ['$' + field.field.replace(/\.\$/g, ''), null] });
652
+ }
653
+ else {
654
+ condCheck_1.push({ $eq: [field.value, 0] });
655
+ condCheck_1.push({ $eq: [field.value, null] });
656
+ }
657
+ });
658
+ if (opIndex > 0) {
659
+ condCheck_1.push({ $eq: ['$' + cust.selFieldId, 0] });
660
+ condCheck_1.push({ $eq: ['$' + cust.selFieldId, null] });
661
+ }
662
+ var tmpOperationFields_1 = [];
663
+ if (opIndex > 0) {
664
+ tmpOperationFields_1.push('$' + cust.selFieldId);
665
+ }
666
+ operation.fields.filter(function (a) { return a.field || a.value !== null; }).forEach(function (field) {
667
+ if (field.field) {
668
+ tmpOperationFields_1.push('$' + field.field.replace(/\.\$/g, ''));
669
+ }
670
+ else {
671
+ tmpOperationFields_1.push(field.value);
672
+ }
673
+ });
674
+ custFieldGroup[cust.selFieldId] = {
675
+ $cond: { if: { $or: condCheck_1 }, then: 0, else: (_a = {}, _a['$' + operation.operation] = tmpOperationFields_1, _a) }
676
+ };
677
+ }
678
+ else {
679
+ custFieldGroup[cust.selFieldId] = (_b = {},
680
+ _b['$' + operation.operation] = [],
681
+ _b);
682
+ if (opIndex > 0) {
683
+ custFieldGroup[cust.selFieldId]['$' + operation.operation].push({ $cond: { if: { $eq: ['$' + cust.selFieldId, null] }, then: 0, else: '$' + cust.selFieldId } });
684
+ }
685
+ var condOr_1 = [];
686
+ operation.fields.filter(function (a) { return a.field || a.value !== null; }).forEach(function (field) {
687
+ if (field.field) {
688
+ condOr_1.push({ $eq: ['$' + field.field.replace(/\.\$/g, ''), null] });
689
+ }
690
+ else {
691
+ condOr_1.push({ $eq: [field.value, null] });
692
+ }
693
+ });
694
+ operation.fields.filter(function (a) { return a.field || a.value !== null; }).forEach(function (field) {
695
+ if (field.field) {
696
+ custFieldGroup[cust.selFieldId]['$' + operation.operation].push({ $cond: { if: { $or: condOr_1 }, then: 0, else: '$' + field.field.replace(/\.\$/g, '') } });
697
+ }
698
+ else {
699
+ custFieldGroup[cust.selFieldId]['$' + operation.operation].push({ $cond: { if: { $or: condOr_1 }, then: 0, else: field.value } });
700
+ }
701
+ });
702
+ }
703
+ query_1.push({ $addFields: custFieldGroup });
704
+ });
705
+ });
706
+ fieldsTotal.forEach(function (total) {
707
+ customFields.forEach(function (field) {
708
+ var _a;
709
+ query_1.push({ $addFields: (_a = {}, _a[total.id + '_' + field.selFieldId] = '$' + field.selFieldId, _a) });
710
+ });
711
+ });
712
+ queryMatchConditionLookup_1 = {
713
+ $and: []
714
+ };
715
+ if (lookupFilters_1.length) {
716
+ lookupFilters_1.forEach(function (filter) { return queryMatchConditionLookup_1['$and'].push(filter); });
717
+ }
718
+ filterArrays.forEach(function (filter) {
719
+ queryMatchConditionLookup_1['$and'].push(filter);
720
+ });
721
+ if (queryMatchConditionLookup_1.$and.length) {
722
+ query_1.push({ $match: queryMatchConditionLookup_1 });
723
+ }
724
+ queryGroup_1 = {
725
+ _id: {}
726
+ };
727
+ if (groupsRow.length || !displayType || displayType === 'grouped') {
728
+ if (!groupsRow.length) {
729
+ queryGroup_1._id = '$_id';
730
+ }
731
+ else {
732
+ if (rootOptions.sort) {
733
+ groupedSorts_1 = {};
734
+ Object.keys(rootOptions.sort).forEach(function (sortField) {
735
+ var selField = selectedFields.find(function (a) { return a.id === sortField; });
736
+ if (selField) {
737
+ var sortPath = (selField && typeof selField.fieldPath === 'string') ? selField.fieldPath.replace(/\.\$/g, '') : '';
738
+ if (sortPath) {
739
+ groupedSorts_1[sortPath] = rootOptions.sort[sortField];
740
+ }
741
+ }
742
+ });
743
+ if (Object.keys(groupedSorts_1).length > 0) {
744
+ query_1.push({
745
+ $sort: groupedSorts_1
746
+ });
747
+ }
748
+ }
749
+ }
750
+ if (groupsRow.length && date_field && date_interval) {
751
+ dateFieldPath = (typeof date_field === 'string') ? date_field.replace(/\.\$/g, '') : '';
752
+ if (dateFieldPath) {
753
+ dateFieldExpr = '$' + dateFieldPath;
754
+ utcHourExpr = { '$hour': { date: dateFieldExpr, timezone: 'UTC' } };
755
+ utcMinuteExpr = { '$minute': { date: dateFieldExpr, timezone: 'UTC' } };
756
+ utcSecondExpr = { '$second': { date: dateFieldExpr, timezone: 'UTC' } };
757
+ utcDayExpr = { '$dayOfMonth': { date: dateFieldExpr, timezone: 'UTC' } };
758
+ tzDayExpr = { '$dayOfMonth': { date: dateFieldExpr, timezone: reportBuilderTimezone } };
759
+ useUtcForDateOnlyExpr = {
760
+ $and: [
761
+ { $eq: [utcHourExpr, 0] },
762
+ { $eq: [utcMinuteExpr, 0] },
763
+ { $eq: [utcSecondExpr, 0] },
764
+ { $ne: [utcDayExpr, tzDayExpr] }
765
+ ]
766
+ };
767
+ groupingTimezoneExpr = { $cond: [useUtcForDateOnlyExpr, 'UTC', reportBuilderTimezone] };
768
+ if (date_interval === 'Seconds') {
769
+ queryGroup_1._id['second'] = { '$second': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
770
+ queryGroup_1._id['minute'] = { '$minute': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
771
+ queryGroup_1._id['hour'] = { '$hour': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
772
+ queryGroup_1._id['day'] = { '$dayOfMonth': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
773
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
774
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
775
+ }
776
+ else if (date_interval === 'Minutes') {
777
+ queryGroup_1._id['minute'] = { '$minute': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
778
+ queryGroup_1._id['hour'] = { '$hour': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
779
+ queryGroup_1._id['day'] = { '$dayOfMonth': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
780
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
781
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
782
+ }
783
+ else if (date_interval === 'Hours') {
784
+ queryGroup_1._id['hour'] = { '$hour': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
785
+ queryGroup_1._id['day'] = { '$dayOfMonth': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
786
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
787
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
788
+ }
789
+ else if (date_interval === 'Daily') {
790
+ queryGroup_1._id['day'] = { '$dayOfMonth': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
791
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
792
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
793
+ }
794
+ else if (date_interval === 'Weekly') {
795
+ queryGroup_1._id['week'] = { '$isoWeek': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
796
+ queryGroup_1._id['year'] = { '$isoWeekYear': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
797
+ }
798
+ else if (date_interval === 'Monthly') {
799
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
800
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
801
+ }
802
+ else if (date_interval === 'Quarterly') {
803
+ queryGroup_1._id['month'] = { '$month': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
804
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
805
+ }
806
+ else if (date_interval === 'Yearly') {
807
+ queryGroup_1._id['year'] = { '$year': { 'date': dateFieldExpr, 'timezone': groupingTimezoneExpr } };
808
+ }
809
+ }
810
+ }
811
+ groupsRow.forEach(function (row) {
812
+ var rowField = (row && typeof row.field === 'string') ? row.field : '';
813
+ if (!rowField || !(row === null || row === void 0 ? void 0 : row.id)) {
814
+ return;
815
+ }
816
+ queryGroup_1._id[row.id] = '$' + rowField.replace(/\.\$/g, '');
817
+ });
818
+ selectedFields.forEach(function (field) {
819
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
820
+ if (!fieldPath) {
821
+ if (field.leafValueType === 'Count') {
822
+ queryGroup_1[field.id] = { '$sum': 1 };
823
+ }
824
+ return;
825
+ }
826
+ if (field.leafValueType === 'Average') {
827
+ queryGroup_1[field.id] = { '$avg': '$' + fieldPath.replace(/\.\$/g, '') };
828
+ }
829
+ else if (field.leafValueType === 'Sum') {
830
+ queryGroup_1[field.id] = { '$sum': buildArrayAwareNumericFieldExpr(fieldPath) };
831
+ }
832
+ else if (field.leafValueType === 'Count') {
833
+ queryGroup_1[field.id] = { '$sum': '$count_' + fieldPath.replace(/\.\$/g, '') };
834
+ }
835
+ else if (field.leafValueType === 'Minimum') {
836
+ queryGroup_1[field.id] = { '$min': '$' + fieldPath.replace(/\.\$/g, '') };
837
+ }
838
+ else if (field.leafValueType === 'Maximum') {
839
+ queryGroup_1[field.id] = { '$max': '$' + fieldPath.replace(/\.\$/g, '') };
840
+ }
841
+ else if (field.leafValueType === 'First') {
842
+ queryGroup_1[field.id] = { '$first': '$' + fieldPath.replace(/\.\$/g, '') };
843
+ }
844
+ else if (field.leafValueType === 'Last') {
845
+ queryGroup_1[field.id] = { '$last': '$' + fieldPath.replace(/\.\$/g, '') };
846
+ }
847
+ else if (field.leafValueType === 'Unique') {
848
+ queryGroup_1[field.id] = { '$addToSet': '$' + fieldPath.replace(/\.\$/g, '') };
849
+ }
850
+ else {
851
+ queryGroup_1[field.id] = { '$push': { $ifNull: ['$' + fieldPath.replace(/\.\$/g, ''), null] } };
852
+ }
853
+ });
854
+ customFields.forEach(function (cust) {
855
+ if (cust.leafValueType === 'Average') {
856
+ queryGroup_1[cust.selFieldId] = { '$avg': '$' + cust.selFieldId };
857
+ }
858
+ else if (cust.leafValueType === 'Sum') {
859
+ queryGroup_1[cust.selFieldId] = { '$sum': '$' + cust.selFieldId };
860
+ }
861
+ else if (cust.leafValueType === 'Count') {
862
+ if (reportType === 'Dated') {
863
+ queryGroup_1[cust.selFieldId] = { '$sum': '$count_' + cust.selFieldId };
864
+ }
865
+ else {
866
+ queryGroup_1[cust.selFieldId] = { '$push': '$count_' + cust.selFieldId };
867
+ }
868
+ }
869
+ else if (cust.leafValueType === 'Minimum') {
870
+ queryGroup_1[cust.selFieldId] = { '$min': '$' + cust.selFieldId };
871
+ }
872
+ else if (cust.leafValueType === 'Maximum') {
873
+ queryGroup_1[cust.selFieldId] = { '$max': '$' + cust.selFieldId };
874
+ }
875
+ else if (cust.leafValueType === 'First') {
876
+ queryGroup_1[cust.selFieldId] = { '$first': '$' + cust.selFieldId };
877
+ }
878
+ else if (cust.leafValueType === 'Last') {
879
+ queryGroup_1[cust.selFieldId] = { '$last': '$' + cust.selFieldId };
880
+ }
881
+ else if (cust.leafValueType === 'Unique') {
882
+ queryGroup_1[cust.selFieldId] = { '$addToSet': '$' + cust.selFieldId };
883
+ }
884
+ else {
885
+ queryGroup_1[cust.selFieldId] = { '$push': { $ifNull: ['$' + cust.selFieldId, null] } };
886
+ }
887
+ });
888
+ // Totals
889
+ if (fieldsTotal.length) {
890
+ fieldsTotal.forEach(function (total) {
891
+ selectedFields.filter(function (a) { return a.fieldType === 'Number' || a.leafValueType === 'Count'; }).forEach(function (field) {
892
+ var _a;
893
+ queryGroup_1[total.id + '_' + field.id] = (_a = {}, _a['$' + total.type] = '$' + total.id + '_' + field.id, _a);
894
+ });
895
+ customFields.forEach(function (field) {
896
+ var _a;
897
+ queryGroup_1[total.id + '_' + field.selFieldId] = (_a = {}, _a['$' + total.type] = '$' + total.id + '_' + field.selFieldId, _a);
898
+ });
899
+ });
900
+ }
901
+ query_1.push({ $group: queryGroup_1 });
902
+ }
903
+ else {
904
+ queryProjection_1 = {
905
+ _id: 1
906
+ };
907
+ selectedFields.forEach(function (field) {
908
+ var fieldPath = (field && typeof field.fieldPath === 'string') ? field.fieldPath : '';
909
+ if (!fieldPath && field.leafValueType !== 'Count') {
910
+ return;
911
+ }
912
+ if (field.leafValueType === 'Average') {
913
+ queryProjection_1[field.id] = buildArrayAwareAverageFieldExpr(fieldPath);
914
+ }
915
+ else if (field.leafValueType === 'Sum') {
916
+ queryProjection_1[field.id] = buildArrayAwareNumericFieldExpr(fieldPath);
917
+ }
918
+ else if (field.leafValueType === 'Count') {
919
+ queryProjection_1[field.id] = { $sum: 1 };
920
+ }
921
+ else if (field.leafValueType === 'Minimum') {
922
+ queryProjection_1[field.id] = { $min: '$' + fieldPath.replace(/\.\$/g, '') };
923
+ }
924
+ else if (field.leafValueType === 'Maximum') {
925
+ queryProjection_1[field.id] = { $max: '$' + fieldPath.replace(/\.\$/g, '') };
926
+ }
927
+ else {
928
+ queryProjection_1[field.id] = '$' + fieldPath.replace(/\.\$/g, '');
929
+ }
930
+ });
931
+ customFields.forEach(function (cust) {
932
+ if (cust === 'Average') {
933
+ queryProjection_1[cust.selFieldId] = { $avg: '$' + cust.selFieldId };
934
+ }
935
+ else if (cust === 'Sum') {
936
+ queryProjection_1[cust.selFieldId] = { $sum: '$' + cust.selFieldId };
937
+ }
938
+ else if (cust === 'Count') {
939
+ queryProjection_1[cust.selFieldId] = { $sum: 1 };
940
+ }
941
+ else if (cust === 'Minimum') {
942
+ queryProjection_1[cust.selFieldId] = { $min: '$' + cust.selFieldId };
943
+ }
944
+ else if (cust === 'Maximum') {
945
+ queryProjection_1[cust.selFieldId] = { $max: '$' + cust.selFieldId };
946
+ }
947
+ else {
948
+ queryProjection_1[cust.selFieldId] = '$' + cust.selFieldId;
949
+ }
950
+ });
951
+ //Totals
952
+ if (fieldsTotal.length && (reportType === 'List' || reportType === 'Dated')) {
953
+ fieldsTotal.forEach(function (total) {
954
+ selectedFields.filter(function (a) { return a.fieldType === 'Number' || a.leafValueType === 'Count'; }).forEach(function (field) {
955
+ var _a;
956
+ var totalFieldPath = total.id + '_' + field.id;
957
+ if (total.type === 'sum') {
958
+ queryProjection_1[totalFieldPath] = buildArrayAwareNumericFieldExpr(totalFieldPath);
959
+ }
960
+ else if (total.type === 'avg') {
961
+ queryProjection_1[totalFieldPath] = buildArrayAwareAverageFieldExpr(totalFieldPath);
962
+ }
963
+ else {
964
+ queryProjection_1[totalFieldPath] = (_a = {}, _a['$' + total.type] = '$' + totalFieldPath, _a);
965
+ }
966
+ });
967
+ customFields.forEach(function (field) {
968
+ var _a;
969
+ queryProjection_1[total.id + '_' + field.selFieldId] = (_a = {}, _a['$' + total.type] = '$' + total.id + '_' + field.selFieldId, _a);
970
+ });
971
+ });
972
+ }
973
+ query_1.push({ $project: queryProjection_1 });
974
+ }
975
+ // SORT
976
+ if (rootOptions.sort) {
977
+ appendSafeSort(query_1, rootOptions.sort, selectedFields, customFields);
978
+ }
979
+ if (reportType === 'Group' && groupsRow.length > 1) {
980
+ _loop_1 = function (i) {
981
+ var _d;
982
+ var projQuery = { _id: 1 };
983
+ projQuery[groupsRow[i].id] = {
984
+ _id: (_d = {}, _d[groupsRow[i].id] = '$_id.' + groupsRow[i].id, _d)
985
+ };
986
+ if (i === groupsRow.length - 1) {
987
+ selectedFields.forEach(function (field) {
988
+ projQuery[groupsRow[i].id][field.id] = '$' + field.id;
989
+ });
990
+ customFields.forEach(function (field) {
991
+ projQuery[groupsRow[i].id][field.selFieldId] = '$' + field.selFieldId;
992
+ });
993
+ }
994
+ else {
995
+ projQuery[groupsRow[i].id][groupsRow[i + 1].id] = '$' + groupsRow[i + 1].id;
996
+ }
997
+ fieldsTotal.forEach(function (totField) {
998
+ selectedFields.filter(function (b) { return b.fieldType === 'Number' || b.leafValueType === 'Count'; }).forEach(function (selField) {
999
+ projQuery[totField.id + '_' + selField.id] = 1;
1000
+ projQuery[groupsRow[i].id][totField.id + '_' + selField.id] = '$' + totField.id + '_' + selField.id;
1001
+ });
1002
+ customFields.forEach(function (field) {
1003
+ projQuery[groupsRow[i].id][totField.id + '_' + field.selFieldId] = '$' + totField.id + '_' + field.selFieldId;
1004
+ });
1005
+ });
1006
+ query_1.push({ $project: projQuery });
1007
+ var grQuery = {
1008
+ _id: {}
1009
+ };
1010
+ for (var j = 0; j < i; j++) {
1011
+ grQuery._id[groupsRow[j].id] = '$_id.' + groupsRow[j].id;
1012
+ }
1013
+ grQuery[groupsRow[i].id] = {
1014
+ $push: '$' + groupsRow[i].id
1015
+ };
1016
+ fieldsTotal.forEach(function (totField) {
1017
+ selectedFields.filter(function (b) { return b.fieldType === 'Number' || b.leafValueType === 'Count'; }).forEach(function (selField) {
1018
+ var _a;
1019
+ grQuery[totField.id + '_' + selField.id] = (_a = {}, _a['$' + totField.type] = '$' + totField.id + '_' + selField.id, _a);
1020
+ });
1021
+ customFields.forEach(function (field) {
1022
+ var _a;
1023
+ grQuery[totField.id + '_' + field.selFieldId] = (_a = {}, _a['$' + totField.type] = '$' + totField.id + '_' + field.selFieldId, _a);
1024
+ });
1025
+ });
1026
+ query_1.push({ $group: grQuery });
1027
+ if (rootOptions.sort) {
1028
+ var sortKeys_1 = Object.keys(rootOptions.sort);
1029
+ var sort_1 = {};
1030
+ var groupString_1 = '';
1031
+ groupsRow.forEach(function (row, groupIndex) {
1032
+ if (groupIndex > 0) {
1033
+ groupString_1 += 'gr_' + (groupIndex + 1) + '.';
1034
+ }
1035
+ if (sortKeys_1.includes('_id.gr_' + (groupIndex + 1))) {
1036
+ sort_1[groupString_1 + '_id.gr_' + (groupIndex + 1)] = rootOptions.sort['_id.gr_' + (groupIndex + 1)];
1037
+ }
1038
+ else {
1039
+ sort_1[groupString_1 + '_id.gr_' + (groupIndex + 1)] = 1;
1040
+ }
1041
+ });
1042
+ sortKeys_1.filter(function (a) { return !a.startsWith('_id.gr_'); }).forEach(function (key) {
1043
+ sort_1[groupString_1 + key] = rootOptions.sort[key];
1044
+ });
1045
+ appendSafeSort(query_1, sort_1, selectedFields, customFields);
1046
+ }
1047
+ };
1048
+ for (i = groupsRow.length - 1; i >= 1; i--) {
1049
+ _loop_1(i);
1050
+ }
1051
+ }
1052
+ if (this.serverConfig['ROOT_URL'] === 'http://localhost:4200') {
1053
+ console.log('_____________ query __________');
1054
+ console.log(JSON.stringify(query_1, null, 2));
1055
+ }
1056
+ readPreference = this.serverConfig['ROOT_URL'] !== 'http://localhost:4200' ? 'secondary' : 'primary';
1057
+ queryResult = {
1058
+ count: 0,
1059
+ results: [],
1060
+ totals: {}
1061
+ };
1062
+ _c.label = 7;
1063
+ case 7:
1064
+ _c.trys.push([7, 9, , 10]);
1065
+ return [4 /*yield*/, executeReportBuilderQuery(modelCollection, query_1, rootOptions, fieldsTotal, selectedFields, customFields, readPreference)];
1066
+ case 8:
1067
+ queryResult = _c.sent();
1068
+ return [3 /*break*/, 10];
1069
+ case 9:
1070
+ err_2 = _c.sent();
1071
+ console.log(err_2);
1072
+ return [3 /*break*/, 10];
1073
+ case 10:
1074
+ tmpRes = [{
1075
+ count: queryResult.count,
1076
+ results: queryResult.results,
1077
+ totals: queryResult.totals
1078
+ }];
1079
+ return [2 /*return*/, tmpRes];
1080
+ }
1081
+ });
1082
+ });
1083
+ },
1084
+ workerTaskWeight: 2
1085
+ }
1086
+ });
1087
+ }
1088
+ function coerceReportBuilderNumeric(value) {
1089
+ if (Array.isArray(value)) {
1090
+ return value.map(function (v) { return coerceReportBuilderNumeric(v); }).reduce(function (a, b) { return a + b; }, 0);
1091
+ }
1092
+ var num = typeof value === 'number' ? value : (value !== null && value !== undefined ? Number(value) : 0);
1093
+ return isNaN(num) ? 0 : num;
1094
+ }
1095
+ function buildReportBuilderTotalsFieldKeySets(fieldsTotal, selectedFields, customFields) {
1096
+ if (fieldsTotal === void 0) { fieldsTotal = []; }
1097
+ if (selectedFields === void 0) { selectedFields = []; }
1098
+ if (customFields === void 0) { customFields = []; }
1099
+ var numericSelectedFields = selectedFields.filter(function (field) { return (field === null || field === void 0 ? void 0 : field.fieldType) === 'Number' || (field === null || field === void 0 ? void 0 : field.leafValueType) === 'Count'; });
1100
+ var sumKeys = new Set();
1101
+ var avgKeys = new Set();
1102
+ fieldsTotal.forEach(function (totalField) {
1103
+ numericSelectedFields.forEach(function (selectedField) {
1104
+ var key = "".concat(totalField.id, "_").concat(selectedField.id);
1105
+ if (!key) {
1106
+ return;
1107
+ }
1108
+ if (totalField.type === 'sum') {
1109
+ sumKeys.add(key);
1110
+ }
1111
+ else if (totalField.type === 'avg') {
1112
+ avgKeys.add(key);
1113
+ }
1114
+ });
1115
+ customFields.forEach(function (customField) {
1116
+ var customId = customField === null || customField === void 0 ? void 0 : customField.selFieldId;
1117
+ if (!customId) {
1118
+ return;
1119
+ }
1120
+ var key = "".concat(totalField.id, "_").concat(customId);
1121
+ if (totalField.type === 'sum') {
1122
+ sumKeys.add(key);
1123
+ }
1124
+ else if (totalField.type === 'avg') {
1125
+ avgKeys.add(key);
1126
+ }
1127
+ });
1128
+ });
1129
+ return { sumKeys: sumKeys, avgKeys: avgKeys };
1130
+ }
1131
+ function buildReportBuilderTotalsFromSums(fieldsTotal, selectedFields, customFields, sumValues, count) {
1132
+ if (fieldsTotal === void 0) { fieldsTotal = []; }
1133
+ if (selectedFields === void 0) { selectedFields = []; }
1134
+ if (customFields === void 0) { customFields = []; }
1135
+ if (sumValues === void 0) { sumValues = {}; }
1136
+ if (count === void 0) { count = 0; }
1137
+ var numericSelectedFields = selectedFields.filter(function (field) { return (field === null || field === void 0 ? void 0 : field.fieldType) === 'Number' || (field === null || field === void 0 ? void 0 : field.leafValueType) === 'Count'; });
1138
+ var totals = {};
1139
+ fieldsTotal.forEach(function (totalField) {
1140
+ numericSelectedFields.forEach(function (selectedField) {
1141
+ var key = "".concat(totalField.id, "_").concat(selectedField.id);
1142
+ var sum = coerceReportBuilderNumeric(sumValues[key]);
1143
+ if (totalField.type === 'sum') {
1144
+ totals[key] = sum;
1145
+ }
1146
+ else if (totalField.type === 'avg') {
1147
+ totals[key] = count ? (0, common_1.round)(sum / count) : 0;
1148
+ }
1149
+ });
1150
+ customFields.forEach(function (customField) {
1151
+ var customId = customField === null || customField === void 0 ? void 0 : customField.selFieldId;
1152
+ if (!customId) {
1153
+ return;
1154
+ }
1155
+ var key = "".concat(totalField.id, "_").concat(customId);
1156
+ var sum = coerceReportBuilderNumeric(sumValues[key]);
1157
+ if (totalField.type === 'sum') {
1158
+ totals[key] = sum;
1159
+ }
1160
+ else if (totalField.type === 'avg') {
1161
+ totals[key] = count ? (0, common_1.round)(sum / count) : 0;
1162
+ }
1163
+ });
1164
+ });
1165
+ return totals;
1166
+ }
1167
+ function buildReportBuilderNumericSumExpr(fieldKey) {
1168
+ var fieldExpr = '$' + fieldKey;
1169
+ return {
1170
+ $cond: [
1171
+ { $isArray: fieldExpr },
1172
+ {
1173
+ $reduce: {
1174
+ input: fieldExpr,
1175
+ initialValue: 0,
1176
+ in: {
1177
+ $add: [
1178
+ '$$value',
1179
+ { $convert: { input: '$$this', to: 'double', onError: 0, onNull: 0 } }
1180
+ ]
1181
+ }
1182
+ }
1183
+ },
1184
+ { $convert: { input: fieldExpr, to: 'double', onError: 0, onNull: 0 } }
1185
+ ]
1186
+ };
1187
+ }
1188
+ function executeReportBuilderQuery(modelCollection_1, query_2, rootOptions_1) {
1189
+ return __awaiter(this, arguments, void 0, function (modelCollection, query, rootOptions, fieldsTotal, selectedFields, customFields, readPreference) {
1190
+ var aggregateOptions, _a, sumKeys, avgKeys, allTotalKeys, resultsFacet, facet, totalsGroup_1, facetedQuery, facetedResult, facetDoc, count, results_1, totalsDoc_1, sumValues_1, totals_1, fullResult, rows, sumValues, results, totals;
1191
+ var _b, _c, _d;
1192
+ if (fieldsTotal === void 0) { fieldsTotal = []; }
1193
+ if (selectedFields === void 0) { selectedFields = []; }
1194
+ if (customFields === void 0) { customFields = []; }
1195
+ if (readPreference === void 0) { readPreference = 'primary'; }
1196
+ return __generator(this, function (_e) {
1197
+ switch (_e.label) {
1198
+ case 0:
1199
+ aggregateOptions = {
1200
+ allowDiskUse: true,
1201
+ readPreference: readPreference
1202
+ };
1203
+ _a = buildReportBuilderTotalsFieldKeySets(fieldsTotal, selectedFields, customFields), sumKeys = _a.sumKeys, avgKeys = _a.avgKeys;
1204
+ allTotalKeys = new Set(__spreadArray(__spreadArray([], __read(sumKeys), false), __read(avgKeys), false));
1205
+ if (!((rootOptions === null || rootOptions === void 0 ? void 0 : rootOptions.limit) && rootOptions.limit > 0)) return [3 /*break*/, 2];
1206
+ resultsFacet = [];
1207
+ if (rootOptions.skip && rootOptions.skip > 0) {
1208
+ resultsFacet.push({ $skip: rootOptions.skip });
1209
+ }
1210
+ resultsFacet.push({ $limit: rootOptions.limit });
1211
+ facet = {
1212
+ results: resultsFacet,
1213
+ count: [{ $count: 'count' }],
1214
+ totals: []
1215
+ };
1216
+ if (allTotalKeys.size) {
1217
+ totalsGroup_1 = {
1218
+ _id: null,
1219
+ __count: { $sum: 1 }
1220
+ };
1221
+ Array.from(allTotalKeys).forEach(function (key) {
1222
+ totalsGroup_1[key] = { $sum: buildReportBuilderNumericSumExpr(key) };
1223
+ });
1224
+ facet.totals = [
1225
+ { $group: totalsGroup_1 }
1226
+ ];
1227
+ }
1228
+ facetedQuery = query.concat([
1229
+ { $facet: facet }
1230
+ ]);
1231
+ return [4 /*yield*/, modelCollection.aggregate(facetedQuery, aggregateOptions, true)];
1232
+ case 1:
1233
+ facetedResult = _e.sent();
1234
+ facetDoc = Array.isArray(facetedResult) && facetedResult.length ? facetedResult[0] : {};
1235
+ count = ((_c = (_b = facetDoc === null || facetDoc === void 0 ? void 0 : facetDoc.count) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.count) || 0;
1236
+ results_1 = Array.isArray(facetDoc === null || facetDoc === void 0 ? void 0 : facetDoc.results) ? facetDoc.results : [];
1237
+ totalsDoc_1 = ((_d = facetDoc === null || facetDoc === void 0 ? void 0 : facetDoc.totals) === null || _d === void 0 ? void 0 : _d[0]) || {};
1238
+ sumValues_1 = {};
1239
+ Array.from(allTotalKeys).forEach(function (key) {
1240
+ sumValues_1[key] = coerceReportBuilderNumeric(totalsDoc_1[key]);
1241
+ });
1242
+ totals_1 = buildReportBuilderTotalsFromSums(fieldsTotal, selectedFields, customFields, sumValues_1, count);
1243
+ return [2 /*return*/, { count: count, results: results_1, totals: totals_1 }];
1244
+ case 2: return [4 /*yield*/, modelCollection.aggregate(query, aggregateOptions, true)];
1245
+ case 3:
1246
+ fullResult = _e.sent();
1247
+ rows = Array.isArray(fullResult) ? fullResult : [];
1248
+ sumValues = {};
1249
+ Array.from(allTotalKeys).forEach(function (key) {
1250
+ sumValues[key] = rows.map(function (row) { return coerceReportBuilderNumeric(row ? row[key] : 0); }).reduce(function (a, b) { return a + b; }, 0);
1251
+ });
1252
+ results = rows;
1253
+ if ((rootOptions === null || rootOptions === void 0 ? void 0 : rootOptions.skip) && rootOptions.skip > 0) {
1254
+ results = results.slice(rootOptions.skip);
1255
+ }
1256
+ if ((rootOptions === null || rootOptions === void 0 ? void 0 : rootOptions.limit) && rootOptions.limit > 0) {
1257
+ results = results.slice(0, rootOptions.limit);
1258
+ }
1259
+ totals = buildReportBuilderTotalsFromSums(fieldsTotal, selectedFields, customFields, sumValues, rows.length);
1260
+ return [2 /*return*/, {
1261
+ count: rows.length,
1262
+ results: results,
1263
+ totals: totals
1264
+ }];
1265
+ }
1266
+ });
1267
+ });
1268
+ }
1269
+ function buildCollectionTree(collectionName, lookupNode) {
1270
+ var _a;
1271
+ var lookupSchemaData = (0, schema_report_builder_1.getReportLookupSchemas)(collectionName).sort(function (a, b) { return a.collection_name.localeCompare(b.collection_name); });
1272
+ var lookupSchemaTree = ((_a = lookupSchemaData.find(function (a) { return a.is_root === true; })) === null || _a === void 0 ? void 0 : _a.tree) || {};
1273
+ var treeItems = (0, schema_report_builder_1.buildTree)(collectionName, lookupSchemaTree, lookupNode);
1274
+ attachLookupChildren(treeItems, lookupSchemaData, lookupSchemaTree);
1275
+ return { isLeaf: false, children: treeItems };
1276
+ }
1277
+ function attachLookupChildren(treeItems, lookupSchemaData, lookupSchemaTree) {
1278
+ Object.keys(lookupSchemaTree || {}).filter(function (a) { return a.endsWith('(Lookup)'); }).forEach(function (lookup) {
1279
+ var field = findFieldByPath(treeItems, lookup);
1280
+ if (field) {
1281
+ var lookupTree = lookupSchemaData.find(function (a) { return a.collection_name === lookupSchemaTree[lookup].lookup_collection; });
1282
+ if (lookupTree) {
1283
+ var childTree = (0, schema_report_builder_1.buildTree)(lookupSchemaTree[lookup].lookup_collection, lookupTree.tree, field);
1284
+ attachLookupChildren(childTree, lookupSchemaData, lookupTree.tree);
1285
+ field.children = childTree;
1286
+ }
1287
+ }
1288
+ });
1289
+ }
1290
+ function findFieldByPath(treeItems, lookupPath) {
1291
+ var fieldPath = lookupPath.split('.');
1292
+ var field = null;
1293
+ fieldPath.forEach(function (path) {
1294
+ if (!field) {
1295
+ field = treeItems.find(function (a) { return a.fieldName === path; });
1296
+ }
1297
+ else if (field.children) {
1298
+ field = field.children.find(function (a) { return a.fieldName === path; });
1299
+ }
1300
+ });
1301
+ return field;
1302
+ }
1303
+ function buildJoinLookupNode(collection_root, join, alias) {
1304
+ return {
1305
+ collection_name: collection_root,
1306
+ columnName: alias,
1307
+ fieldName: alias,
1308
+ fieldType: 'Lookup',
1309
+ fieldTypeName: 'Lookup',
1310
+ distinctFieldValues: [],
1311
+ fieldPath: alias,
1312
+ fieldPathName: alias,
1313
+ path: alias,
1314
+ lookup_collection: join.collection,
1315
+ lookup_local_key: join.local_key,
1316
+ lookup_foreign_key: join.foreign_key,
1317
+ lookup_as: alias,
1318
+ text: alias,
1319
+ value: alias,
1320
+ isLeaf: false,
1321
+ isActive: false,
1322
+ isSelected: false,
1323
+ is_join: false,
1324
+ depth: 0,
1325
+ leafValueType: '',
1326
+ leafFormatType: '',
1327
+ children: []
1328
+ };
1329
+ }
1330
+ function buildJoinAlias(join, joinIndex) {
1331
+ if (join.alias && join.alias.trim()) {
1332
+ return join.alias.trim();
1333
+ }
1334
+ var joinName = (0, common_1.toTitleCase)(join.collection.replace(/\_/g, ' ').replace(/-/g, ' '));
1335
+ var joinPath = (0, common_1.toTitleCase)(join.local_key.replace(/\.\$\./g, ' -> ').replace(/\./g, ' -> ').replace(/\_/g, ' '));
1336
+ return "".concat(joinName, " (").concat(joinPath || 'Join', ") (Lookup ").concat(joinIndex + 1, ")");
1337
+ }
1338
+ function buildArrayAwareNumericFieldExpr(fieldPath) {
1339
+ var normalizedFieldPath = (fieldPath || '').replace(/\.\$/g, '');
1340
+ if (!normalizedFieldPath) {
1341
+ return 0;
1342
+ }
1343
+ var fieldExpr = '$' + normalizedFieldPath;
1344
+ return {
1345
+ $cond: [
1346
+ { $isArray: fieldExpr },
1347
+ { $sum: { $ifNull: [fieldExpr, []] } },
1348
+ { $ifNull: [fieldExpr, 0] }
1349
+ ]
1350
+ };
1351
+ }
1352
+ function buildArrayAwareAverageFieldExpr(fieldPath) {
1353
+ var normalizedFieldPath = (fieldPath || '').replace(/\.\$/g, '');
1354
+ if (!normalizedFieldPath) {
1355
+ return 0;
1356
+ }
1357
+ var fieldExpr = '$' + normalizedFieldPath;
1358
+ return {
1359
+ $cond: [
1360
+ { $isArray: fieldExpr },
1361
+ {
1362
+ $cond: [
1363
+ { $gt: [{ $size: { $ifNull: [fieldExpr, []] } }, 0] },
1364
+ { $avg: { $ifNull: [fieldExpr, []] } },
1365
+ 0
1366
+ ]
1367
+ },
1368
+ { $ifNull: [fieldExpr, 0] }
1369
+ ]
1370
+ };
1371
+ }
1372
+ function appendSafeSort(query, sortSpec, selectedFields, customFields) {
1373
+ if (selectedFields === void 0) { selectedFields = []; }
1374
+ if (customFields === void 0) { customFields = []; }
1375
+ if (!sortSpec || !Object.keys(sortSpec).length) {
1376
+ return;
1377
+ }
1378
+ var safeAddFields = {};
1379
+ var safeSort = {};
1380
+ Object.keys(sortSpec).forEach(function (key) {
1381
+ if (key.startsWith('_id.')) {
1382
+ safeSort[key] = sortSpec[key];
1383
+ return;
1384
+ }
1385
+ if (isArrayLikeField(key, selectedFields, customFields)) {
1386
+ var safeKey = 'sort_' + key.replace(/\./g, '_');
1387
+ safeAddFields[safeKey] = {
1388
+ $cond: [
1389
+ { $isArray: '$' + key },
1390
+ { $size: { $ifNull: ['$' + key, []] } },
1391
+ '$' + key
1392
+ ]
1393
+ };
1394
+ safeSort[safeKey] = sortSpec[key];
1395
+ }
1396
+ else {
1397
+ safeSort[key] = sortSpec[key];
1398
+ }
1399
+ });
1400
+ if (Object.keys(safeAddFields).length) {
1401
+ query.push({ $addFields: safeAddFields });
1402
+ }
1403
+ if (Object.keys(safeSort).length) {
1404
+ query.push({ $sort: safeSort });
1405
+ }
1406
+ }
1407
+ function isArrayLikeField(sortKey, selectedFields, customFields) {
1408
+ if (selectedFields === void 0) { selectedFields = []; }
1409
+ if (customFields === void 0) { customFields = []; }
1410
+ var field = selectedFields.find(function (a) { return a.id === sortKey; });
1411
+ var custom = customFields.find(function (a) { return a.selFieldId === sortKey; });
1412
+ var leafValueType = field ? field.leafValueType : (custom ? custom.leafValueType : '');
1413
+ return leafValueType !== 'Average' &&
1414
+ leafValueType !== 'Sum' &&
1415
+ leafValueType !== 'Count' &&
1416
+ leafValueType !== 'Minimum' &&
1417
+ leafValueType !== 'Maximum' &&
1418
+ leafValueType !== 'First' &&
1419
+ leafValueType !== 'Last' &&
1420
+ leafValueType !== 'Unique';
1421
+ }
1422
+ function collectLookupAliases(selectedFields, filterArrayFields, groupsRow) {
1423
+ if (selectedFields === void 0) { selectedFields = []; }
1424
+ if (filterArrayFields === void 0) { filterArrayFields = []; }
1425
+ if (groupsRow === void 0) { groupsRow = []; }
1426
+ var aliases = new Set();
1427
+ var addAlias = function (alias) {
1428
+ var normalized = normalizeLookupAlias(alias);
1429
+ if (normalized) {
1430
+ aliases.add(normalized);
1431
+ }
1432
+ };
1433
+ (selectedFields || []).forEach(function (field) {
1434
+ if (field && (field.lookup_collection || (field.fieldPath && field.fieldPath.includes('(Lookup')))) {
1435
+ addAlias(field.lookup_as || extractLookupAlias(field.fieldPath));
1436
+ }
1437
+ });
1438
+ (filterArrayFields || []).forEach(function (field) {
1439
+ if (field && (field.lookup_collection || (field.fieldPath && field.fieldPath.includes('(Lookup')))) {
1440
+ addAlias(field.lookup_as || extractLookupAlias(field.fieldPath));
1441
+ }
1442
+ });
1443
+ (groupsRow || []).forEach(function (group) {
1444
+ if ((group === null || group === void 0 ? void 0 : group.treeItem) && (group.treeItem.lookup_collection || (group.treeItem.fieldPath && group.treeItem.fieldPath.includes('(Lookup')))) {
1445
+ addAlias(group.treeItem.lookup_as || extractLookupAlias(group.treeItem.fieldPath));
1446
+ }
1447
+ });
1448
+ return aliases;
1449
+ }
1450
+ function splitFiltersByLookup(filters, lookupAliases) {
1451
+ if (filters === void 0) { filters = []; }
1452
+ if (lookupAliases === void 0) { lookupAliases = new Set(); }
1453
+ var rootFilters = [];
1454
+ var lookupFilters = [];
1455
+ (filters || []).forEach(function (filter) {
1456
+ var summary = summarizeFilterTargets(filter, lookupAliases);
1457
+ if (summary.hasLookup) {
1458
+ // If the filter mixes root + lookup, keep it together in lookupFilters so it stays a single $match/$or
1459
+ lookupFilters.push(filter);
1460
+ }
1461
+ else {
1462
+ rootFilters.push(filter);
1463
+ }
1464
+ });
1465
+ return { rootFilters: rootFilters, lookupFilters: lookupFilters };
1466
+ }
1467
+ function summarizeFilterTargets(filter, lookupAliases) {
1468
+ var result = { hasLookup: false, hasRoot: false };
1469
+ if (!filter || typeof filter !== 'object') {
1470
+ return result;
1471
+ }
1472
+ Object.keys(filter).forEach(function (key) {
1473
+ if (key === '$or' || key === '$and') {
1474
+ var branch = filter[key];
1475
+ if (Array.isArray(branch)) {
1476
+ branch.forEach(function (child) {
1477
+ var childSummary = summarizeFilterTargets(child, lookupAliases);
1478
+ result.hasLookup = result.hasLookup || childSummary.hasLookup;
1479
+ result.hasRoot = result.hasRoot || childSummary.hasRoot;
1480
+ });
1481
+ }
1482
+ }
1483
+ else {
1484
+ var isLookup = isLookupPath(key, lookupAliases);
1485
+ if (isLookup) {
1486
+ result.hasLookup = true;
1487
+ }
1488
+ else {
1489
+ result.hasRoot = true;
1490
+ }
1491
+ }
1492
+ });
1493
+ return result;
1494
+ }
1495
+ function isLookupPath(path, lookupAliases) {
1496
+ if (!path) {
1497
+ return false;
1498
+ }
1499
+ var normalizedPath = path.replace(/\.\$/g, '');
1500
+ if (normalizedPath.includes('(Lookup')) {
1501
+ return true;
1502
+ }
1503
+ var rootKey = normalizedPath.split('.')[0];
1504
+ return lookupAliases.has(rootKey);
1505
+ }
1506
+ function extractLookupAlias(path) {
1507
+ if (!path || !path.includes('(Lookup')) {
1508
+ return '';
1509
+ }
1510
+ return path.replace(/\.\$/g, '').split('.')[0];
1511
+ }
1512
+ function normalizeLookupAlias(alias) {
1513
+ return (alias || '').replace(/\.\$/g, '').trim();
1514
+ }
1515
+ function collectRootDatePaths(collectionName) {
1516
+ var out = new Set();
1517
+ var collection = resolveio_server_app_1.ResolveIOServer.getMongoManager().collection(collectionName);
1518
+ var schema = (collection === null || collection === void 0 ? void 0 : collection.rbSchema) || {};
1519
+ Object.keys(schema).forEach(function (path) {
1520
+ var _a;
1521
+ if (((_a = schema[path]) === null || _a === void 0 ? void 0 : _a.rbType) === 'Date') {
1522
+ out.add(path.replace(/\.\$/g, ''));
1523
+ }
1524
+ });
1525
+ return out;
1526
+ }
1527
+ function coerceDateFilters(filters, datePaths) {
1528
+ if (filters === void 0) { filters = []; }
1529
+ var coerceDateValue = function (value) {
1530
+ if (value instanceof Date) {
1531
+ return value;
1532
+ }
1533
+ if (Array.isArray(value)) {
1534
+ return value.map(coerceDateValue);
1535
+ }
1536
+ if (typeof value === 'string' || typeof value === 'number') {
1537
+ var parsed = new Date(value);
1538
+ if (!isNaN(parsed.getTime())) {
1539
+ return parsed;
1540
+ }
1541
+ }
1542
+ return value;
1543
+ };
1544
+ var coerceFilterObject = function (obj) {
1545
+ if (!obj || typeof obj !== 'object') {
1546
+ return obj;
1547
+ }
1548
+ if (Array.isArray(obj)) {
1549
+ obj.forEach(coerceFilterObject);
1550
+ return obj;
1551
+ }
1552
+ if (obj.$or) {
1553
+ obj.$or = obj.$or.map(coerceFilterObject).filter(Boolean);
1554
+ return obj;
1555
+ }
1556
+ if (obj.$and) {
1557
+ obj.$and = obj.$and.map(coerceFilterObject).filter(Boolean);
1558
+ return obj;
1559
+ }
1560
+ Object.keys(obj).forEach(function (key) {
1561
+ if (key.startsWith('$')) {
1562
+ return;
1563
+ }
1564
+ var normalizedKey = key.replace(/\.\$/g, '');
1565
+ if (!datePaths.has(normalizedKey)) {
1566
+ return;
1567
+ }
1568
+ var value = obj[key];
1569
+ if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {
1570
+ Object.keys(value).forEach(function (op) {
1571
+ if (op.startsWith('$')) {
1572
+ value[op] = coerceDateValue(value[op]);
1573
+ }
1574
+ });
1575
+ }
1576
+ else {
1577
+ obj[key] = coerceDateValue(value);
1578
+ }
1579
+ });
1580
+ return obj;
1581
+ };
1582
+ (filters || []).forEach(coerceFilterObject);
1583
+ }
1584
+ // Helpers to support union-based joins (collection_joins without local/foreign key)
1585
+ function stripAliasFromPath(path, alias) {
1586
+ if (!path) {
1587
+ return path;
1588
+ }
1589
+ var cleanAlias = alias.replace(/\.\$/g, '');
1590
+ var cleanPath = path.replace(/\.\$/g, '');
1591
+ if (cleanPath.startsWith(cleanAlias + '.')) {
1592
+ return cleanPath.substring(cleanAlias.length + 1);
1593
+ }
1594
+ return cleanPath;
1595
+ }
1596
+ function buildCollectionPipeline(collectionName, alias, selectedFields, filters, filterArrays, isRoot) {
1597
+ if (selectedFields === void 0) { selectedFields = []; }
1598
+ if (filters === void 0) { filters = []; }
1599
+ if (filterArrays === void 0) { filterArrays = []; }
1600
+ if (isRoot === void 0) { isRoot = false; }
1601
+ var pipeline = [];
1602
+ var matchClauses = [];
1603
+ var matchArrayClauses = [];
1604
+ var targetAlias = isRoot ? '' : alias.replace(/\.\$/g, '');
1605
+ var mapFilterForCollection = function (filterObj, toArray) {
1606
+ if (!filterObj || typeof filterObj !== 'object') {
1607
+ return;
1608
+ }
1609
+ var mapped = mapFilterPaths(filterObj, targetAlias, isRoot);
1610
+ if (mapped) {
1611
+ (toArray ? matchArrayClauses : matchClauses).push(mapped);
1612
+ }
1613
+ };
1614
+ (filters || []).forEach(function (f) { return mapFilterForCollection(f, false); });
1615
+ (filterArrays || []).forEach(function (f) { return mapFilterForCollection(f, true); });
1616
+ if (matchClauses.length || matchArrayClauses.length) {
1617
+ var match = { $and: __spreadArray(__spreadArray([], __read(matchClauses), false), __read(matchArrayClauses), false) };
1618
+ pipeline.push({ $match: match });
1619
+ if (process.env.NODE_ENV !== 'production') {
1620
+ console.info('RB debug: collection pipeline match', {
1621
+ collection: collectionName,
1622
+ alias: targetAlias || collectionName,
1623
+ matchJson: JSON.stringify(match, null, 2)
1624
+ });
1625
+ }
1626
+ }
1627
+ // Projection mapping selected fields for this collection
1628
+ var projection = { _id: 1, __rb_collection: targetAlias || collectionName };
1629
+ (selectedFields || [])
1630
+ .filter(function (f) { return isFieldForCollection(f, collectionName, targetAlias); })
1631
+ .forEach(function (f) {
1632
+ var mappedPath = stripAliasFromPath(f.fieldPath || '', targetAlias || f.lookup_as || '');
1633
+ if (f.leafValueType === 'Average') {
1634
+ projection[f.id] = buildArrayAwareAverageFieldExpr(mappedPath);
1635
+ }
1636
+ else if (f.leafValueType === 'Sum') {
1637
+ projection[f.id] = buildArrayAwareNumericFieldExpr(mappedPath);
1638
+ }
1639
+ else if (f.leafValueType === 'Count') {
1640
+ projection[f.id] = { $sum: 1 };
1641
+ }
1642
+ else if (f.leafValueType === 'Minimum') {
1643
+ projection[f.id] = { $min: '$' + mappedPath };
1644
+ }
1645
+ else if (f.leafValueType === 'Maximum') {
1646
+ projection[f.id] = { $max: '$' + mappedPath };
1647
+ }
1648
+ else {
1649
+ projection[f.id] = '$' + mappedPath;
1650
+ }
1651
+ });
1652
+ pipeline.push({ $project: projection });
1653
+ return pipeline;
1654
+ }
1655
+ function isFieldForCollection(field, collectionName, alias) {
1656
+ if (!field) {
1657
+ return false;
1658
+ }
1659
+ // Root collection check
1660
+ if (!alias) {
1661
+ return field.collection_name === collectionName && (!field.lookup_collection || field.lookup_collection === '');
1662
+ }
1663
+ // Joined collection check
1664
+ return field.lookup_collection === collectionName || (field.lookup_as && field.lookup_as.replace(/\.\$/g, '') === alias);
1665
+ }
1666
+ function mapFilterPaths(filter, alias, isRoot) {
1667
+ if (!filter || typeof filter !== 'object') {
1668
+ return null;
1669
+ }
1670
+ if (Array.isArray(filter)) {
1671
+ return filter.map(function (f) { return mapFilterPaths(f, alias, isRoot); });
1672
+ }
1673
+ if (filter.$or) {
1674
+ var mapped = filter.$or.map(function (f) { return mapFilterPaths(f, alias, isRoot); }).filter(Boolean);
1675
+ return mapped.length ? { $or: mapped } : null;
1676
+ }
1677
+ if (filter.$and) {
1678
+ var mapped = filter.$and.map(function (f) { return mapFilterPaths(f, alias, isRoot); }).filter(Boolean);
1679
+ return mapped.length ? { $and: mapped } : null;
1680
+ }
1681
+ var out = {};
1682
+ Object.keys(filter).forEach(function (key) {
1683
+ var cleanKey = key.replace(/\.\$/g, '');
1684
+ if (!alias) {
1685
+ // root collection: ignore keys that start with a lookup alias
1686
+ if (cleanKey.includes('(Lookup')) {
1687
+ return;
1688
+ }
1689
+ if (lookupAliasMatches(cleanKey, alias)) {
1690
+ return;
1691
+ }
1692
+ out[cleanKey] = filter[key];
1693
+ }
1694
+ else {
1695
+ if (cleanKey.startsWith(alias + '.')) {
1696
+ out[cleanKey.substring(alias.length + 1)] = filter[key];
1697
+ }
1698
+ }
1699
+ });
1700
+ return Object.keys(out).length ? out : null;
1701
+ }
1702
+ function lookupAliasMatches(path, alias) {
1703
+ if (!path || !alias) {
1704
+ return false;
1705
+ }
1706
+ return path.startsWith(alias + '.') || path === alias;
1707
+ }
1708
+ function buildLayoutSortSpec(sortSpec, selectedFields) {
1709
+ if (sortSpec === void 0) { sortSpec = {}; }
1710
+ if (selectedFields === void 0) { selectedFields = []; }
1711
+ var outSort = __assign({}, sortSpec);
1712
+ var addFields = {};
1713
+ Object.keys(sortSpec || {}).forEach(function (key) {
1714
+ if (!key.startsWith('layout_col_')) {
1715
+ return;
1716
+ }
1717
+ var normalized = key.replace(/^layout_col_/, '');
1718
+ var parts = normalized.split('_');
1719
+ var idx = parseInt(parts[parts.length - 1], 10);
1720
+ if (isNaN(idx)) {
1721
+ return;
1722
+ }
1723
+ var layoutFields = (selectedFields || []).filter(function (f) { return typeof (f === null || f === void 0 ? void 0 : f.layoutColumnIndex) !== 'undefined' && f.layoutColumnIndex === idx; }).map(function (f) { return f.id; }).filter(Boolean);
1724
+ if (!layoutFields.length) {
1725
+ return;
1726
+ }
1727
+ // Build nested $ifNull chain to coalesce across layout column targets
1728
+ var coalesce = '';
1729
+ for (var i = layoutFields.length - 1; i >= 0; i--) {
1730
+ var fieldPath = '$' + layoutFields[i];
1731
+ if (i === layoutFields.length - 1) {
1732
+ coalesce = fieldPath;
1733
+ }
1734
+ else {
1735
+ coalesce = { $ifNull: [fieldPath, coalesce] };
1736
+ }
1737
+ }
1738
+ var sortKey = 'sort_' + key;
1739
+ addFields[sortKey] = coalesce;
1740
+ delete outSort[key];
1741
+ outSort[sortKey] = sortSpec[key];
1742
+ });
1743
+ return { sortSpec: outSort, addFields: addFields };
1744
+ }
1745
+ function remapFiltersToIds(filters, selectedFields) {
1746
+ if (filters === void 0) { filters = []; }
1747
+ if (selectedFields === void 0) { selectedFields = []; }
1748
+ var byPath = new Map();
1749
+ var layoutMap = new Map();
1750
+ (selectedFields || []).forEach(function (f) {
1751
+ if ((f === null || f === void 0 ? void 0 : f.fieldPath) && (f === null || f === void 0 ? void 0 : f.id)) {
1752
+ byPath.set(f.fieldPath.replace(/\.\$/g, ''), f.id);
1753
+ }
1754
+ if (typeof (f === null || f === void 0 ? void 0 : f.layoutColumnIndex) !== 'undefined') {
1755
+ var arr = layoutMap.get(f.layoutColumnIndex) || [];
1756
+ arr.push(f.id);
1757
+ layoutMap.set(f.layoutColumnIndex, arr);
1758
+ }
1759
+ });
1760
+ var remapObj = function (obj) {
1761
+ if (!obj || typeof obj !== 'object') {
1762
+ return obj;
1763
+ }
1764
+ if (Array.isArray(obj)) {
1765
+ return obj.map(remapObj);
1766
+ }
1767
+ if (obj.$or) {
1768
+ var mapped = obj.$or.map(remapObj).filter(Boolean);
1769
+ return mapped.length ? { $or: mapped } : null;
1770
+ }
1771
+ if (obj.$and) {
1772
+ var mapped = obj.$and.map(remapObj).filter(Boolean);
1773
+ return mapped.length ? { $and: mapped } : null;
1774
+ }
1775
+ var out = {};
1776
+ Object.keys(obj).forEach(function (key) {
1777
+ var cleanKey = key.replace(/\.\$/g, '');
1778
+ if (cleanKey.startsWith('layout_col_')) {
1779
+ // map to all field ids in that layout column index
1780
+ var normalized = cleanKey.replace(/^layout_col_/, '');
1781
+ var parts = normalized.split('_');
1782
+ var idx = parseInt(parts[parts.length - 1], 10);
1783
+ var targets = layoutMap.get(idx) || [];
1784
+ if (targets.length) {
1785
+ var mappedVal_1 = remapObj(obj[key]);
1786
+ out.$or = targets.map(function (id) {
1787
+ var _a;
1788
+ return (_a = {}, _a[id] = mappedVal_1, _a);
1789
+ });
1790
+ return;
1791
+ }
1792
+ }
1793
+ var mappedKey = byPath.get(cleanKey) || cleanKey;
1794
+ out[mappedKey] = remapObj(obj[key]);
1795
+ });
1796
+ return Object.keys(out).length ? out : null;
1797
+ };
1798
+ return (filters || []).map(remapObj).filter(Boolean);
1799
+ }
1800
+ function expandLayoutColumnFilters(filters, selectedFields) {
1801
+ if (filters === void 0) { filters = []; }
1802
+ if (selectedFields === void 0) { selectedFields = []; }
1803
+ var layoutCache = {};
1804
+ var resolveLayoutPaths = function (layoutKey) {
1805
+ if (layoutCache[layoutKey]) {
1806
+ return layoutCache[layoutKey];
1807
+ }
1808
+ var paths = [];
1809
+ var normalized = (layoutKey || '').replace(/^layout_col_/, '');
1810
+ var parts = normalized.split('_');
1811
+ var idx = parseInt(parts[parts.length - 1], 10);
1812
+ if (!isNaN(idx)) {
1813
+ paths = (selectedFields || [])
1814
+ .filter(function (f) { return f && (f.layoutColumnIndex === idx || (f.id || '').includes("f_layout_".concat(idx, "_"))); })
1815
+ .map(function (f) { return f.fieldPath ? f.fieldPath.replace(/\.\$/g, '') : ''; })
1816
+ .filter(function (p) { return !!p; });
1817
+ }
1818
+ layoutCache[layoutKey] = paths;
1819
+ return paths;
1820
+ };
1821
+ var expandFilterObject = function (obj) {
1822
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
1823
+ return obj;
1824
+ }
1825
+ if (obj.$or) {
1826
+ return { $or: obj.$or.map(expandFilterObject) };
1827
+ }
1828
+ if (obj.$and) {
1829
+ return { $and: obj.$and.map(expandFilterObject) };
1830
+ }
1831
+ var expanded = {};
1832
+ var replaced = false;
1833
+ Object.keys(obj).forEach(function (key) {
1834
+ var val = obj[key];
1835
+ if (key.startsWith('layout_col_')) {
1836
+ var paths = resolveLayoutPaths(key);
1837
+ if (paths.length) {
1838
+ replaced = true;
1839
+ expanded.$or = paths.map(function (path) {
1840
+ var _a;
1841
+ return (_a = {}, _a[path] = val, _a);
1842
+ });
1843
+ // Use console to trace layout filter expansion without requiring a logger on ResolveIOServer
1844
+ console.info('RB layout filter expansion', { layoutKey: key, paths: paths });
1845
+ }
1846
+ else {
1847
+ console.warn('RB layout filter expansion failed', { layoutKey: key, selectedFields: selectedFields });
1848
+ }
1849
+ }
1850
+ else {
1851
+ expanded[key] = val;
1852
+ }
1853
+ });
1854
+ return replaced ? expanded : obj;
1855
+ };
1856
+ return (filters || []).map(expandFilterObject);
1857
+ }
1858
+ function executeReportBuilderAi(payload, context) {
1859
+ return __awaiter(this, void 0, void 0, function () {
1860
+ var input, prompt, isSuperAdmin, guardrailsEnabled, guardrail, reportTypeResolution, reportType, collectionRoot, collectionJoins, idDateField, dateInterval, collections, fieldLimit, resolvedFields, usedFallbackFields, derivedFields, trimmedFields, arraySummary, systemPrompt, userPrompt, codexModel, codexClient, runOptions, responseText, usage, parsed, allowMongoRead, mongoPayload, mongoReadResult, error_1, message, mongoContext, usage2, sanitizeContext, patch, summaryNotes, idClient;
1861
+ return __generator(this, function (_a) {
1862
+ switch (_a.label) {
1863
+ case 0:
1864
+ input = payload || {};
1865
+ prompt = normalizeOptionalString(input.prompt);
1866
+ if (!prompt) {
1867
+ throw new Error('Prompt is required.');
1868
+ }
1869
+ return [4 /*yield*/, resolveIsSuperAdmin(context === null || context === void 0 ? void 0 : context.id_user)];
1870
+ case 1:
1871
+ isSuperAdmin = _a.sent();
1872
+ guardrailsEnabled = input.guardrails !== false && !isSuperAdmin;
1873
+ if (guardrailsEnabled) {
1874
+ guardrail = evaluateReportBuilderGuardrails(prompt);
1875
+ if (guardrail === null || guardrail === void 0 ? void 0 : guardrail.blocked) {
1876
+ return [2 /*return*/, guardrail];
1877
+ }
1878
+ }
1879
+ reportTypeResolution = resolveReportTypeForPrompt(input.report_type, prompt);
1880
+ reportType = reportTypeResolution.reportType;
1881
+ collectionRoot = normalizeOptionalString(input.collection_root);
1882
+ collectionJoins = Array.isArray(input.collection_joins) ? input.collection_joins : [];
1883
+ idDateField = normalizeOptionalString(input.id_date_field);
1884
+ dateInterval = normalizeDateInterval(input.date_interval) || reportTypeResolution.inferredDateInterval;
1885
+ collections = sanitizeCollections(input.available_collections || []);
1886
+ fieldLimit = normalizeFieldLimit(input.field_limit);
1887
+ resolvedFields = sanitizeFields(input.available_fields || []);
1888
+ usedFallbackFields = false;
1889
+ if (!resolvedFields.length && collections.length) {
1890
+ derivedFields = deriveFieldsFromCollections(collections);
1891
+ resolvedFields = sanitizeFields(derivedFields);
1892
+ usedFallbackFields = resolvedFields.length > 0;
1893
+ }
1894
+ trimmedFields = trimFieldsForPrompt(resolvedFields, fieldLimit, usedFallbackFields);
1895
+ arraySummary = buildArrayFieldSummary(trimmedFields.fields);
1896
+ systemPrompt = buildReportBuilderSystemPrompt(reportType);
1897
+ userPrompt = buildReportBuilderUserPrompt({
1898
+ prompt: prompt,
1899
+ reportType: reportType,
1900
+ reportName: normalizeOptionalString(input.report_name),
1901
+ collectionRoot: collectionRoot,
1902
+ collectionJoins: collectionJoins,
1903
+ idDateField: idDateField,
1904
+ dateInterval: dateInterval,
1905
+ collections: collections,
1906
+ fields: trimmedFields.fields,
1907
+ fieldMeta: {
1908
+ truncated: trimmedFields.truncated,
1909
+ total: trimmedFields.total,
1910
+ used: trimmedFields.fields.length
1911
+ },
1912
+ arraySummary: arraySummary
1913
+ });
1914
+ codexModel = resolveReportBuilderCodexModel(input.config);
1915
+ codexClient = getReportBuilderCodexClient();
1916
+ runOptions = {
1917
+ timeoutMs: resolveReportBuilderCodexTimeoutMs(input.config),
1918
+ threadOptions: resolveReportBuilderCodexThreadOptions(input.config, codexModel)
1919
+ };
1920
+ return [4 /*yield*/, codexClient.run(buildReportBuilderCodexPrompt(systemPrompt, userPrompt), runOptions)];
1921
+ case 2:
1922
+ responseText = _a.sent();
1923
+ usage = estimateUsage([
1924
+ { role: 'system', content: systemPrompt },
1925
+ { role: 'user', content: userPrompt }
1926
+ ], responseText, codexModel);
1927
+ parsed = safeJsonParse(responseText);
1928
+ allowMongoRead = input.allow_mongo_read === true;
1929
+ if (!(allowMongoRead && parsed && typeof parsed === 'object' && parsed.mongo_read)) return [3 /*break*/, 8];
1930
+ mongoPayload = resolveMongoReadPayload(parsed.mongo_read, input, collections);
1931
+ if (!mongoPayload) return [3 /*break*/, 8];
1932
+ mongoReadResult = null;
1933
+ _a.label = 3;
1934
+ case 3:
1935
+ _a.trys.push([3, 5, , 6]);
1936
+ return [4 /*yield*/, (0, ai_terminal_1.executeAiAssistantMongoRead)(mongoPayload, context)];
1937
+ case 4:
1938
+ mongoReadResult = _a.sent();
1939
+ return [3 /*break*/, 6];
1940
+ case 5:
1941
+ error_1 = _a.sent();
1942
+ message = error_1 instanceof Error ? error_1.message : String(error_1 || 'Mongo read failed.');
1943
+ mongoReadResult = { error: message };
1944
+ return [3 /*break*/, 6];
1945
+ case 6:
1946
+ mongoContext = buildMongoReadContext(mongoPayload, mongoReadResult);
1947
+ userPrompt = buildReportBuilderUserPrompt({
1948
+ prompt: prompt,
1949
+ reportType: reportType,
1950
+ reportName: normalizeOptionalString(input.report_name),
1951
+ collectionRoot: collectionRoot,
1952
+ collectionJoins: collectionJoins,
1953
+ idDateField: idDateField,
1954
+ dateInterval: dateInterval,
1955
+ collections: collections,
1956
+ fields: trimmedFields.fields,
1957
+ fieldMeta: {
1958
+ truncated: trimmedFields.truncated,
1959
+ total: trimmedFields.total,
1960
+ used: trimmedFields.fields.length
1961
+ },
1962
+ arraySummary: arraySummary,
1963
+ mongoReadResult: mongoContext
1964
+ });
1965
+ return [4 /*yield*/, codexClient.run(buildReportBuilderCodexPrompt(systemPrompt, userPrompt), runOptions)];
1966
+ case 7:
1967
+ responseText = _a.sent();
1968
+ usage2 = estimateUsage([
1969
+ { role: 'system', content: systemPrompt },
1970
+ { role: 'user', content: userPrompt }
1971
+ ], responseText, codexModel);
1972
+ usage = {
1973
+ inputTokens: usage.inputTokens + usage2.inputTokens,
1974
+ outputTokens: usage.outputTokens + usage2.outputTokens,
1975
+ totalTokens: usage.totalTokens + usage2.totalTokens
1976
+ };
1977
+ parsed = safeJsonParse(responseText);
1978
+ _a.label = 8;
1979
+ case 8:
1980
+ if (!parsed || typeof parsed !== 'object') {
1981
+ throw new Error('AI response was not valid JSON.');
1982
+ }
1983
+ sanitizeContext = buildSanitizerContext(collections, resolvedFields);
1984
+ patch = sanitizeReportBuilderPatch(parsed, sanitizeContext);
1985
+ patch.report_type = reportType;
1986
+ if (reportType === 'Dated' && !patch.date_interval && dateInterval) {
1987
+ patch.date_interval = dateInterval;
1988
+ }
1989
+ summaryNotes = buildPatchNotes(patch, {
1990
+ reportType: reportType,
1991
+ truncated: trimmedFields.truncated,
1992
+ totalFields: trimmedFields.total,
1993
+ usedFields: trimmedFields.fields.length,
1994
+ inferenceReason: reportTypeResolution.inferenceReason
1995
+ });
1996
+ return [4 /*yield*/, resolveClientId(input.id_client, context === null || context === void 0 ? void 0 : context.id_user)];
1997
+ case 9:
1998
+ idClient = _a.sent();
1999
+ return [4 /*yield*/, (0, openai_usage_ledger_manager_1.recordOpenAIUsage)({
2000
+ id_client: idClient || '',
2001
+ model: codexModel || 'unknown',
2002
+ input_tokens: usage.inputTokens,
2003
+ output_tokens: usage.outputTokens,
2004
+ total_tokens: usage.totalTokens,
2005
+ category: 'report-builder-ai',
2006
+ id_request: ''
2007
+ })];
2008
+ case 10:
2009
+ _a.sent();
2010
+ return [2 /*return*/, {
2011
+ patch: patch,
2012
+ notes: summaryNotes,
2013
+ usage: {
2014
+ input_tokens: usage.inputTokens,
2015
+ output_tokens: usage.outputTokens,
2016
+ total_tokens: usage.totalTokens
2017
+ },
2018
+ model: codexModel
2019
+ }];
2020
+ }
2021
+ });
2022
+ });
2023
+ }
2024
+ function buildReportBuilderSystemPrompt(reportType) {
2025
+ return [
2026
+ 'You are a report builder configuration assistant.',
2027
+ 'Return ONLY a JSON object (no markdown).',
2028
+ 'Schema keys:',
2029
+ '- report_name (string)',
2030
+ '- collection_root (string)',
2031
+ '- collection_joins (array of { collection, alias })',
2032
+ '- layout_columns (array of { header, field_path, collection, mode, text, leaf_value_type, leaf_format_type, show })',
2033
+ '- groups_row (array of field_path strings)',
2034
+ '- filters (array of { field_path, condition, value, high_value, boolean_value, is_rolling, rolling_interval })',
2035
+ '- sort (array of { field_path, order })',
2036
+ '- totals (array of { type, fields })',
2037
+ '- links (array of { field_first, field_second })',
2038
+ '- id_date_field (string)',
2039
+ '- date_interval (Seconds|Minutes|Hours|Daily|Weekly|Monthly|Quarterly|Yearly)',
2040
+ '- notes (string)',
2041
+ 'Use only provided collections and field_path values (they reflect the current models/collections).',
2042
+ 'Always set collection_root to the best matching collection from available_collections.',
2043
+ 'When available_fields spans multiple collections, choose collection_root first and then select fields whose collection_name matches collection_root or a join alias.',
2044
+ 'Prefer exact field_path values from available_fields; never invent field paths.',
2045
+ 'Translate the request into concrete layout_columns, groups_row, sort, totals, filters, and links whenever possible.',
2046
+ 'Every layout column must be complete: include a header plus at least one mapping with a valid field_path (or text mode with non-empty text). Do not return columns without mapped fields.',
2047
+ 'Unless the user explicitly asks for a different order, add sort entries for the primary grouping/identifier fields (groups_row or the first key layout_columns) using ascending order so results are alphabetical.',
2048
+ 'Always prioritize sort on popular business keys when available: name, company, item (fallback: title, label, customer). Keep ascending unless user asks otherwise.',
2049
+ 'If no popular key exists, add stable fallback sort using createdAt/date_created then _id.',
2050
+ 'Use filters with explicit boolean logic: $and for required constraints and $or for alternate matches.',
2051
+ 'Use custom fields when the request asks for derived metrics (ratios, percentages, margins, computed totals).',
2052
+ 'If the request specifies a time grain (daily/weekly/monthly/etc), set date_interval and id_date_field to the best matching date field.',
2053
+ 'Treat requests like "over the last X", "by month", "by quarter", and "by <time period>" as Dated report intent.',
2054
+ 'If you need sample records to confirm field choices, you may return JSON with {"mongo_read": { "collection": "<collection>", "query": {}, "options": {"limit": 5} }, "notes": "why you need data"} .',
2055
+ 'Only request mongo_read when necessary and only use collections from available_collections.',
2056
+ 'When mongo_read_result is present in the user context, use it to finalize the patch and do not request another read.',
2057
+ 'Use field_type to guide filters/totals (numeric fields for totals, date fields for date_interval, boolean fields for boolean_value).',
2058
+ 'If field_summary.truncated is true, only use provided fields and note missing needs in notes.',
2059
+ 'If you need joined data, add collection_joins with an alias and use the alias in field_path.',
2060
+ 'When fields require related records, use lookup paths and joins rather than guessing flat field names.',
2061
+ 'array_summary lists array roots and candidate key_fields for linking arrays.',
2062
+ 'If you select fields from multiple array roots, add links that align arrays using shared identifiers (_id or id_<x> style keys).',
2063
+ 'Avoid mixing unrelated array roots without links; prefer a single array root or non-array fields to prevent duplicate rows.',
2064
+ 'Return a single valid JSON object with double quotes and no trailing commas.',
2065
+ 'Omit keys you cannot confidently fill.',
2066
+ 'Conditions allowed: eq, ne, lt, lte, gt, gte, bw, nnull, null, regex.',
2067
+ "Report type: ".concat(reportType || 'List', ". Ensure groups_row is set for Group/Dated reports."),
2068
+ 'If unsure, leave a section empty instead of guessing.'
2069
+ ].join('\n');
2070
+ }
2071
+ function buildReportBuilderUserPrompt(input) {
2072
+ var context = {
2073
+ report_type: input.reportType || 'List',
2074
+ current: {
2075
+ report_name: input.reportName || '',
2076
+ collection_root: input.collectionRoot || '',
2077
+ collection_joins: input.collectionJoins || [],
2078
+ id_date_field: input.idDateField || '',
2079
+ date_interval: input.dateInterval || ''
2080
+ },
2081
+ available_collections: input.collections || [],
2082
+ available_fields: input.fields || [],
2083
+ field_summary: input.fieldMeta || undefined,
2084
+ array_summary: input.arraySummary || [],
2085
+ mongo_read_result: input.mongoReadResult || undefined,
2086
+ request: input.prompt
2087
+ };
2088
+ return JSON.stringify(context);
2089
+ }
2090
+ function resolveReportBuilderCodexTimeoutMs(config) {
2091
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
2092
+ var raw = normalizeOptionalNumber((config === null || config === void 0 ? void 0 : config.timeout_ms)
2093
+ || serverConfig['REPORT_BUILDER_CODEX_TIMEOUT_MS']
2094
+ || process.env.REPORT_BUILDER_CODEX_TIMEOUT_MS);
2095
+ if (raw && raw > 0) {
2096
+ return (0, common_1.round)(raw);
2097
+ }
2098
+ return DEFAULT_REPORT_BUILDER_CODEX_TIMEOUT_MS;
2099
+ }
2100
+ function resolveReportBuilderCodexModel(config) {
2101
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
2102
+ var overrideModel = normalizeOptionalString(config === null || config === void 0 ? void 0 : config.model);
2103
+ var raw = overrideModel
2104
+ || normalizeOptionalString(serverConfig['REPORT_BUILDER_CODEX_MODEL'] || process.env.REPORT_BUILDER_CODEX_MODEL)
2105
+ || normalizeOptionalString(serverConfig['AI_DASHBOARD_CODEX_MODEL'] || process.env.AI_DASHBOARD_CODEX_MODEL)
2106
+ || normalizeOptionalString(serverConfig['AI_TERMINAL_CODEX_MODEL'] || process.env.AI_TERMINAL_CODEX_MODEL)
2107
+ || normalizeOptionalString(serverConfig['AI_ASSISTANT_CODEX_MODEL'] || process.env.AI_ASSISTANT_CODEX_MODEL);
2108
+ return raw || DEFAULT_REPORT_BUILDER_CODEX_MODEL;
2109
+ }
2110
+ function resolveReportBuilderCodexFallbackModels(model) {
2111
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
2112
+ var primary = normalizeOptionalString(model || resolveReportBuilderCodexModel());
2113
+ var models = [];
2114
+ var push = function (value) {
2115
+ var normalized = normalizeOptionalString(value);
2116
+ if (!normalized || normalized === primary || models.includes(normalized)) {
2117
+ return;
2118
+ }
2119
+ models.push(normalized);
2120
+ };
2121
+ var parseList = function (value) { return normalizeOptionalString(value)
2122
+ .split(',')
2123
+ .map(function (entry) { return normalizeOptionalString(entry); })
2124
+ .filter(Boolean)
2125
+ .forEach(push); };
2126
+ parseList(serverConfig['REPORT_BUILDER_CODEX_FALLBACK_MODELS'] || process.env.REPORT_BUILDER_CODEX_FALLBACK_MODELS);
2127
+ push(serverConfig['REPORT_BUILDER_CODEX_FALLBACK_MODEL'] || process.env.REPORT_BUILDER_CODEX_FALLBACK_MODEL);
2128
+ parseList(serverConfig['AI_DASHBOARD_CODEX_FALLBACK_MODELS'] || process.env.AI_DASHBOARD_CODEX_FALLBACK_MODELS);
2129
+ push(serverConfig['AI_DASHBOARD_CODEX_FALLBACK_MODEL'] || process.env.AI_DASHBOARD_CODEX_FALLBACK_MODEL);
2130
+ parseList(serverConfig['AI_TERMINAL_CODEX_FALLBACK_MODELS'] || process.env.AI_TERMINAL_CODEX_FALLBACK_MODELS);
2131
+ push(serverConfig['AI_TERMINAL_CODEX_FALLBACK_MODEL'] || process.env.AI_TERMINAL_CODEX_FALLBACK_MODEL);
2132
+ parseList(serverConfig['AI_ASSISTANT_CODEX_FALLBACK_MODELS'] || process.env.AI_ASSISTANT_CODEX_FALLBACK_MODELS);
2133
+ push(serverConfig['AI_ASSISTANT_CODEX_FALLBACK_MODEL'] || process.env.AI_ASSISTANT_CODEX_FALLBACK_MODEL);
2134
+ if (!models.length) {
2135
+ push(DEFAULT_REPORT_BUILDER_CODEX_FALLBACK_MODEL);
2136
+ }
2137
+ return models;
2138
+ }
2139
+ function resolveReportBuilderCodexSettings() {
2140
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
2141
+ var apiKey = (serverConfig['OPENAI_API_KEY'] || process.env.OPENAI_API_KEY || '').trim();
2142
+ if (!apiKey) {
2143
+ throw new Error('AI API key missing. Add an AI API key to server config.');
2144
+ }
2145
+ var model = resolveReportBuilderCodexModel();
2146
+ var fallbackModels = resolveReportBuilderCodexFallbackModels(model);
2147
+ return __assign(__assign({ apiKey: apiKey, baseUrl: (serverConfig['OPENAI_BASE_URL'] || process.env.OPENAI_BASE_URL || '').trim() || undefined, model: model }, (fallbackModels.length ? { fallbackModel: fallbackModels[0], fallbackModels: fallbackModels } : {})), { maxRetries: normalizeOptionalNumber(serverConfig['OPENAI_MAX_RETRIES'] || process.env.OPENAI_MAX_RETRIES), retryDelayMs: normalizeOptionalNumber(serverConfig['OPENAI_RETRY_DELAY_MS'] || process.env.OPENAI_RETRY_DELAY_MS) });
2148
+ }
2149
+ function resolveReportBuilderCodexThreadOptions(config, model) {
2150
+ var serverConfig = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
2151
+ var effort = normalizeReasoningEffort((config === null || config === void 0 ? void 0 : config.reasoning_effort)
2152
+ || serverConfig['REPORT_BUILDER_CODEX_REASONING_EFFORT']
2153
+ || process.env.REPORT_BUILDER_CODEX_REASONING_EFFORT) || 'low';
2154
+ return __assign(__assign({}, (model ? { model: model } : {})), { sandboxMode: 'read-only', skipGitRepoCheck: true, modelReasoningEffort: effort, networkAccessEnabled: false, webSearchMode: 'disabled', webSearchEnabled: false, approvalPolicy: 'never' });
2155
+ }
2156
+ function getReportBuilderCodexClient() {
2157
+ if (!reportBuilderCodexClient) {
2158
+ reportBuilderCodexClient = new codex_client_1.CodexClient(resolveReportBuilderCodexSettings());
2159
+ }
2160
+ return reportBuilderCodexClient;
2161
+ }
2162
+ function buildReportBuilderCodexPrompt(systemPrompt, userPrompt) {
2163
+ return "System:\n".concat(systemPrompt, "\n\nUser:\n").concat(userPrompt).trim();
2164
+ }
2165
+ function resolveReportTypeForPrompt(inputType, prompt) {
2166
+ var requestedType = normalizeReportType(inputType);
2167
+ var inferredInterval = inferDateIntervalFromPrompt(prompt);
2168
+ if (!isDatedPrompt(prompt)) {
2169
+ return {
2170
+ reportType: requestedType,
2171
+ inferenceReason: '',
2172
+ inferredDateInterval: inferredInterval
2173
+ };
2174
+ }
2175
+ var reason = requestedType !== 'Dated'
2176
+ ? 'Auto-inferred Dated report from time-period language in the request.'
2177
+ : '';
2178
+ return {
2179
+ reportType: 'Dated',
2180
+ inferenceReason: reason,
2181
+ inferredDateInterval: inferredInterval
2182
+ };
2183
+ }
2184
+ function isDatedPrompt(prompt) {
2185
+ var text = normalizeOptionalString(prompt).toLowerCase();
2186
+ if (!text) {
2187
+ return false;
2188
+ }
2189
+ var patterns = [
2190
+ /\b(by|per)\s+(day|week|month|quarter|year|hour|minute|second)s?\b/i,
2191
+ /\b(daily|weekly|monthly|quarterly|yearly)\b/i,
2192
+ /\b(last|past|previous|recent)\s+(?:\d+|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)\s+(day|week|month|quarter|year|hour|minute|second)s?\b/i,
2193
+ /\bover\s+the\s+last\s+(?:\d+|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)\s+(day|week|month|quarter|year|hour|minute|second)s?\b/i,
2194
+ /\b(month|quarter|year)\s+over\s+(month|quarter|year)\b/i,
2195
+ /\b(over\s+time|time\s*series|trend(?:ing|s)?)\b/i,
2196
+ /\bby\s+(?:a\s+)?(?:time|date)\s+period\b/i,
2197
+ /\bby\s+period\b/i
2198
+ ];
2199
+ return patterns.some(function (pattern) { return pattern.test(text); });
2200
+ }
2201
+ function inferDateIntervalFromPrompt(prompt) {
2202
+ var text = normalizeOptionalString(prompt).toLowerCase();
2203
+ if (!text) {
2204
+ return '';
2205
+ }
2206
+ var mapping = [
2207
+ { interval: 'Quarterly', pattern: /\b(quarter|quarters|quarterly|qoq)\b/i },
2208
+ { interval: 'Monthly', pattern: /\b(month|months|monthly|mom)\b/i },
2209
+ { interval: 'Weekly', pattern: /\b(week|weeks|weekly|wow)\b/i },
2210
+ { interval: 'Daily', pattern: /\b(day|days|daily)\b/i },
2211
+ { interval: 'Yearly', pattern: /\b(year|years|yearly|yoy)\b/i },
2212
+ { interval: 'Hours', pattern: /\b(hour|hours|hourly)\b/i },
2213
+ { interval: 'Minutes', pattern: /\b(minute|minutes)\b/i },
2214
+ { interval: 'Seconds', pattern: /\b(second|seconds)\b/i }
2215
+ ];
2216
+ var matched = mapping.find(function (entry) { return entry.pattern.test(text); });
2217
+ return (matched === null || matched === void 0 ? void 0 : matched.interval) || '';
2218
+ }
2219
+ function normalizeReportType(value) {
2220
+ var normalized = normalizeOptionalString(value);
2221
+ if (normalized.toLowerCase() === 'group') {
2222
+ return 'Group';
2223
+ }
2224
+ if (normalized.toLowerCase() === 'dated') {
2225
+ return 'Dated';
2226
+ }
2227
+ return normalized ? (0, common_1.toTitleCase)(normalized) : 'List';
2228
+ }
2229
+ function normalizeOptionalString(value) {
2230
+ var raw = typeof value === 'string' ? value.trim() : '';
2231
+ return raw || '';
2232
+ }
2233
+ function normalizeOptionalNumber(value) {
2234
+ var parsed = Number(value);
2235
+ return Number.isFinite(parsed) ? parsed : undefined;
2236
+ }
2237
+ function normalizeReasoningEffort(value) {
2238
+ var normalized = normalizeOptionalString(value).toLowerCase();
2239
+ var allowed = new Set(['minimal', 'low', 'medium', 'high', 'xhigh']);
2240
+ return allowed.has(normalized) ? normalized : undefined;
2241
+ }
2242
+ function normalizeFieldLimit(value) {
2243
+ var parsed = Number(value);
2244
+ if (!Number.isFinite(parsed)) {
2245
+ return 600;
2246
+ }
2247
+ return Math.max(50, Math.min((0, common_1.round)(parsed), 2000));
2248
+ }
2249
+ function estimateUsage(messages, responseText, model) {
2250
+ var inputTokens = (0, tokenizer_1.countChatTokens)(messages, model);
2251
+ var outputTokens = (0, tokenizer_1.countTokens)(responseText || '', model);
2252
+ return {
2253
+ inputTokens: inputTokens,
2254
+ outputTokens: outputTokens,
2255
+ totalTokens: inputTokens + outputTokens
2256
+ };
2257
+ }
2258
+ function sanitizeCollections(raw) {
2259
+ var out = [];
2260
+ var seen = new Set();
2261
+ (raw || []).forEach(function (entry) {
2262
+ var collection = normalizeOptionalString(entry === null || entry === void 0 ? void 0 : entry.collection);
2263
+ if (!collection) {
2264
+ return;
2265
+ }
2266
+ var key = collection.toLowerCase();
2267
+ if (seen.has(key)) {
2268
+ return;
2269
+ }
2270
+ seen.add(key);
2271
+ out.push({
2272
+ collection: collection,
2273
+ name: normalizeOptionalString(entry === null || entry === void 0 ? void 0 : entry.name) || (0, common_1.toTitleCase)(collection.replace(/[-_]/g, ' '))
2274
+ });
2275
+ });
2276
+ return out;
2277
+ }
2278
+ function sanitizeFields(raw) {
2279
+ var out = [];
2280
+ var seen = new Set();
2281
+ (raw || []).forEach(function (entry) {
2282
+ var fieldPath = normalizeOptionalString((entry === null || entry === void 0 ? void 0 : entry.field_path) || (entry === null || entry === void 0 ? void 0 : entry.fieldPath));
2283
+ if (!fieldPath) {
2284
+ return;
2285
+ }
2286
+ var key = fieldPath.toLowerCase();
2287
+ if (seen.has(key)) {
2288
+ return;
2289
+ }
2290
+ seen.add(key);
2291
+ out.push({
2292
+ field_path: fieldPath,
2293
+ field_path_name: normalizeOptionalString((entry === null || entry === void 0 ? void 0 : entry.field_path_name) || (entry === null || entry === void 0 ? void 0 : entry.fieldPathName) || (entry === null || entry === void 0 ? void 0 : entry.field_name)) || fieldPath,
2294
+ field_type: normalizeOptionalString((entry === null || entry === void 0 ? void 0 : entry.field_type) || (entry === null || entry === void 0 ? void 0 : entry.fieldType) || (entry === null || entry === void 0 ? void 0 : entry.field_type_name) || (entry === null || entry === void 0 ? void 0 : entry.fieldTypeName)) || 'String',
2295
+ collection_name: normalizeOptionalString((entry === null || entry === void 0 ? void 0 : entry.collection_name) || (entry === null || entry === void 0 ? void 0 : entry.collectionName) || (entry === null || entry === void 0 ? void 0 : entry.collection)) || ''
2296
+ });
2297
+ });
2298
+ return out;
2299
+ }
2300
+ function resolveCollectionNameFromList(value, collections) {
2301
+ var e_1, _a;
2302
+ var key = normalizeKey(value);
2303
+ if (!key) {
2304
+ return '';
2305
+ }
2306
+ try {
2307
+ for (var _b = __values(collections || []), _c = _b.next(); !_c.done; _c = _b.next()) {
2308
+ var col = _c.value;
2309
+ if (normalizeKey(col.collection) === key || normalizeKey(col.name) === key) {
2310
+ return col.collection;
2311
+ }
2312
+ }
2313
+ }
2314
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2315
+ finally {
2316
+ try {
2317
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2318
+ }
2319
+ finally { if (e_1) throw e_1.error; }
2320
+ }
2321
+ return '';
2322
+ }
2323
+ function resolveMongoReadPayload(raw, input, collections) {
2324
+ if (!raw || typeof raw !== 'object') {
2325
+ return null;
2326
+ }
2327
+ var collection = resolveCollectionNameFromList(raw.collection || raw.collection_name || raw.collectionName, collections);
2328
+ if (!collection) {
2329
+ return null;
2330
+ }
2331
+ var query = raw.query && typeof raw.query === 'object' && !Array.isArray(raw.query) ? raw.query : {};
2332
+ var optionsRaw = raw.options && typeof raw.options === 'object' ? raw.options : {};
2333
+ var limitRaw = normalizeOptionalNumber(optionsRaw.limit);
2334
+ var skipRaw = normalizeOptionalNumber(optionsRaw.skip);
2335
+ var permissionView = normalizeOptionalString(input.permission_view || input.permissionView) || '/report-builder';
2336
+ var request = {
2337
+ collection: collection,
2338
+ database: normalizeOptionalString(raw.database) || undefined,
2339
+ query: query,
2340
+ options: {
2341
+ projection: optionsRaw.projection && typeof optionsRaw.projection === 'object' ? optionsRaw.projection : undefined,
2342
+ sort: optionsRaw.sort && typeof optionsRaw.sort === 'object' ? optionsRaw.sort : undefined,
2343
+ limit: limitRaw ? Math.min(Math.max((0, common_1.round)(limitRaw), 1), 10) : 5,
2344
+ skip: skipRaw ? Math.max((0, common_1.round)(skipRaw), 0) : undefined,
2345
+ includeTotal: optionsRaw.includeTotal === true
2346
+ },
2347
+ permissionView: permissionView || undefined,
2348
+ id_client: normalizeOptionalString(input.id_client) || undefined,
2349
+ mongo: input.mongo
2350
+ };
2351
+ return request;
2352
+ }
2353
+ function buildMongoReadContext(request, response) {
2354
+ var documents = Array.isArray(response === null || response === void 0 ? void 0 : response.documents) ? response.documents : [];
2355
+ var total = typeof (response === null || response === void 0 ? void 0 : response.total) === 'number' ? response.total : null;
2356
+ var sample = summarizeMongoDocuments(documents);
2357
+ return {
2358
+ request: {
2359
+ collection: request.collection,
2360
+ query: request.query || {},
2361
+ options: request.options || {}
2362
+ },
2363
+ result: {
2364
+ total: total,
2365
+ sample: sample,
2366
+ fields: extractMongoSampleFields(sample)
2367
+ }
2368
+ };
2369
+ }
2370
+ function summarizeMongoDocuments(documents) {
2371
+ var maxDocs = 5;
2372
+ return (documents || []).slice(0, maxDocs).map(function (doc) { return pruneMongoValue(doc, 0); });
2373
+ }
2374
+ function pruneMongoValue(value, depth) {
2375
+ var maxDepth = 3;
2376
+ var maxKeys = 30;
2377
+ var maxArray = 8;
2378
+ var maxString = 200;
2379
+ if (depth >= maxDepth) {
2380
+ return '[Truncated]';
2381
+ }
2382
+ if (Array.isArray(value)) {
2383
+ return value.slice(0, maxArray).map(function (item) { return pruneMongoValue(item, depth + 1); });
2384
+ }
2385
+ if (value && typeof value === 'object') {
2386
+ var keys = Object.keys(value);
2387
+ var trimmedKeys = keys.slice(0, maxKeys);
2388
+ var result_1 = {};
2389
+ trimmedKeys.forEach(function (key) {
2390
+ result_1[key] = pruneMongoValue(value[key], depth + 1);
2391
+ });
2392
+ if (keys.length > trimmedKeys.length) {
2393
+ result_1.__truncated__ = true;
2394
+ }
2395
+ return result_1;
2396
+ }
2397
+ if (typeof value === 'string' && value.length > maxString) {
2398
+ return value.slice(0, maxString) + '...';
2399
+ }
2400
+ return value;
2401
+ }
2402
+ function extractMongoSampleFields(samples) {
2403
+ var fields = new Set();
2404
+ (samples || []).forEach(function (sample) {
2405
+ if (!sample || typeof sample !== 'object') {
2406
+ return;
2407
+ }
2408
+ Object.keys(sample).forEach(function (key) { return fields.add(key); });
2409
+ });
2410
+ return Array.from(fields);
2411
+ }
2412
+ function collectTreeLeaves(items, res) {
2413
+ (items || []).forEach(function (item) {
2414
+ var _a;
2415
+ if (item === null || item === void 0 ? void 0 : item.isLeaf) {
2416
+ res.push(item);
2417
+ return;
2418
+ }
2419
+ if ((_a = item === null || item === void 0 ? void 0 : item.children) === null || _a === void 0 ? void 0 : _a.length) {
2420
+ collectTreeLeaves(item.children, res);
2421
+ }
2422
+ });
2423
+ }
2424
+ function deriveFieldsFromCollections(collections) {
2425
+ var fields = [];
2426
+ var seen = new Set();
2427
+ (collections || []).forEach(function (col) {
2428
+ var collectionName = normalizeOptionalString(col === null || col === void 0 ? void 0 : col.collection);
2429
+ if (!collectionName) {
2430
+ return;
2431
+ }
2432
+ var tree;
2433
+ try {
2434
+ tree = buildCollectionTree(collectionName);
2435
+ }
2436
+ catch (error) {
2437
+ var message = error instanceof Error ? error.message : String(error || 'Unknown error');
2438
+ console.warn('RB AI field derivation failed', { collection: collectionName, error: message });
2439
+ return;
2440
+ }
2441
+ var leaves = [];
2442
+ collectTreeLeaves((tree === null || tree === void 0 ? void 0 : tree.children) || [], leaves);
2443
+ leaves.forEach(function (leaf) {
2444
+ var fieldPath = normalizeOptionalString(leaf === null || leaf === void 0 ? void 0 : leaf.fieldPath);
2445
+ if (!fieldPath) {
2446
+ return;
2447
+ }
2448
+ var key = fieldPath.toLowerCase();
2449
+ if (seen.has(key)) {
2450
+ return;
2451
+ }
2452
+ seen.add(key);
2453
+ fields.push({
2454
+ field_path: fieldPath,
2455
+ field_path_name: normalizeOptionalString(leaf === null || leaf === void 0 ? void 0 : leaf.fieldPathName) || fieldPath,
2456
+ field_type: normalizeOptionalString(leaf === null || leaf === void 0 ? void 0 : leaf.fieldType) || 'String',
2457
+ collection_name: normalizeOptionalString((leaf === null || leaf === void 0 ? void 0 : leaf.collection_name) || (leaf === null || leaf === void 0 ? void 0 : leaf.collection)) || collectionName
2458
+ });
2459
+ });
2460
+ });
2461
+ return fields;
2462
+ }
2463
+ function trimFieldsForPrompt(fields, limit, balanceByCollection) {
2464
+ var e_2, _a;
2465
+ if (balanceByCollection === void 0) { balanceByCollection = false; }
2466
+ if (!fields || !fields.length) {
2467
+ return { fields: [], truncated: false, total: 0 };
2468
+ }
2469
+ if (fields.length <= limit) {
2470
+ return { fields: fields, truncated: false, total: fields.length };
2471
+ }
2472
+ if (balanceByCollection) {
2473
+ var buckets_1 = new Map();
2474
+ var order_1 = [];
2475
+ fields.forEach(function (field) {
2476
+ var _a;
2477
+ var key = normalizeOptionalString(field === null || field === void 0 ? void 0 : field.collection_name) || 'unknown';
2478
+ if (!buckets_1.has(key)) {
2479
+ buckets_1.set(key, []);
2480
+ order_1.push(key);
2481
+ }
2482
+ (_a = buckets_1.get(key)) === null || _a === void 0 ? void 0 : _a.push(field);
2483
+ });
2484
+ if (buckets_1.size > 1) {
2485
+ var trackers = order_1.map(function (key) { return ({
2486
+ key: key,
2487
+ list: buckets_1.get(key) || [],
2488
+ index: 0
2489
+ }); });
2490
+ var trimmed_1 = [];
2491
+ var added = true;
2492
+ while (trimmed_1.length < limit && added) {
2493
+ added = false;
2494
+ try {
2495
+ for (var trackers_1 = (e_2 = void 0, __values(trackers)), trackers_1_1 = trackers_1.next(); !trackers_1_1.done; trackers_1_1 = trackers_1.next()) {
2496
+ var tracker = trackers_1_1.value;
2497
+ if (trimmed_1.length >= limit) {
2498
+ break;
2499
+ }
2500
+ if (tracker.index < tracker.list.length) {
2501
+ trimmed_1.push(tracker.list[tracker.index]);
2502
+ tracker.index += 1;
2503
+ added = true;
2504
+ }
2505
+ }
2506
+ }
2507
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
2508
+ finally {
2509
+ try {
2510
+ if (trackers_1_1 && !trackers_1_1.done && (_a = trackers_1.return)) _a.call(trackers_1);
2511
+ }
2512
+ finally { if (e_2) throw e_2.error; }
2513
+ }
2514
+ }
2515
+ return { fields: trimmed_1, truncated: true, total: fields.length };
2516
+ }
2517
+ }
2518
+ var trimmed = fields.slice(0, limit);
2519
+ return { fields: trimmed, truncated: true, total: fields.length };
2520
+ }
2521
+ function buildArrayFieldSummary(fields) {
2522
+ var roots = new Map();
2523
+ (fields || []).forEach(function (field) {
2524
+ var fieldPath = normalizeOptionalString(field === null || field === void 0 ? void 0 : field.field_path);
2525
+ if (!fieldPath || !fieldPath.includes('.$')) {
2526
+ return;
2527
+ }
2528
+ var root = resolveArrayRoot(fieldPath);
2529
+ if (!root) {
2530
+ return;
2531
+ }
2532
+ var entry = roots.get(root);
2533
+ if (!entry) {
2534
+ entry = { root_path: root, key_fields: [], sample_fields: [] };
2535
+ roots.set(root, entry);
2536
+ }
2537
+ if (!entry.sample_fields.includes(fieldPath) && entry.sample_fields.length < 8) {
2538
+ entry.sample_fields.push(fieldPath);
2539
+ }
2540
+ if (isLinkCandidateFieldPath(fieldPath) && !entry.key_fields.includes(fieldPath) && entry.key_fields.length < 8) {
2541
+ entry.key_fields.push(fieldPath);
2542
+ }
2543
+ });
2544
+ return Array.from(roots.values());
2545
+ }
2546
+ function buildSanitizerContext(collections, fields) {
2547
+ var collectionIndex = new Map();
2548
+ var fieldIndex = new Map();
2549
+ var fieldNameIndex = new Map();
2550
+ collections.forEach(function (col) {
2551
+ var key = normalizeKey(col.collection);
2552
+ if (key) {
2553
+ collectionIndex.set(key, col);
2554
+ }
2555
+ var nameKey = normalizeKey(col.name);
2556
+ if (nameKey) {
2557
+ collectionIndex.set(nameKey, col);
2558
+ }
2559
+ });
2560
+ fields.forEach(function (field) {
2561
+ var pathKey = normalizePathKey(field.field_path);
2562
+ if (pathKey) {
2563
+ fieldIndex.set(pathKey, field);
2564
+ }
2565
+ var nameKey = normalizeKey(field.field_path_name);
2566
+ if (nameKey && !fieldNameIndex.has(nameKey)) {
2567
+ fieldNameIndex.set(nameKey, field.field_path);
2568
+ }
2569
+ });
2570
+ return { collectionIndex: collectionIndex, fieldIndex: fieldIndex, fieldNameIndex: fieldNameIndex };
2571
+ }
2572
+ function sanitizeReportBuilderPatch(raw, ctx) {
2573
+ var patch = {};
2574
+ if (!raw || typeof raw !== 'object') {
2575
+ return patch;
2576
+ }
2577
+ var reportName = normalizeOptionalString(raw.report_name || raw.reportName || raw.title);
2578
+ if (reportName) {
2579
+ patch.report_name = reportName.slice(0, 120);
2580
+ }
2581
+ var collectionRoot = resolveCollectionName(raw.collection_root || raw.collectionRoot, ctx);
2582
+ if (collectionRoot) {
2583
+ patch.collection_root = collectionRoot;
2584
+ }
2585
+ var joinsRaw = Array.isArray(raw.collection_joins || raw.joins) ? (raw.collection_joins || raw.joins) : [];
2586
+ var joins = [];
2587
+ joinsRaw.forEach(function (join) {
2588
+ var collection = resolveCollectionName((join === null || join === void 0 ? void 0 : join.collection) || (join === null || join === void 0 ? void 0 : join.name), ctx);
2589
+ if (!collection) {
2590
+ return;
2591
+ }
2592
+ var alias = sanitizeAlias(join === null || join === void 0 ? void 0 : join.alias);
2593
+ joins.push(__assign({ collection: collection }, (alias ? { alias: alias } : {})));
2594
+ });
2595
+ if (joins.length) {
2596
+ patch.collection_joins = joins;
2597
+ }
2598
+ var layoutColumnsRaw = Array.isArray(raw.layout_columns || raw.columns || raw.layout) ? (raw.layout_columns || raw.columns || raw.layout) : [];
2599
+ var layoutColumns = [];
2600
+ layoutColumnsRaw.forEach(function (col) {
2601
+ if (!col || typeof col !== 'object') {
2602
+ return;
2603
+ }
2604
+ var header = normalizeOptionalString(col.header || col.title || col.name);
2605
+ var fieldPath = resolveFieldPath(col.field_path || col.fieldPath || col.field || col.field_name || col.fieldName || col.path, ctx);
2606
+ if (!fieldPath && header) {
2607
+ fieldPath = resolveFieldPath(header, ctx);
2608
+ }
2609
+ var mappingsRaw = Array.isArray(col.mappings) ? col.mappings : [];
2610
+ var mappings = [];
2611
+ mappingsRaw.forEach(function (map) {
2612
+ var mappedField = resolveFieldPath((map === null || map === void 0 ? void 0 : map.field_path) || (map === null || map === void 0 ? void 0 : map.fieldPath) || (map === null || map === void 0 ? void 0 : map.field) || (map === null || map === void 0 ? void 0 : map.field_name) || (map === null || map === void 0 ? void 0 : map.fieldName) || (map === null || map === void 0 ? void 0 : map.path) || (map === null || map === void 0 ? void 0 : map.name), ctx);
2613
+ var mode = normalizeLayoutMode(map === null || map === void 0 ? void 0 : map.mode);
2614
+ var text = normalizeOptionalString(map === null || map === void 0 ? void 0 : map.text);
2615
+ var collection = resolveCollectionName(map === null || map === void 0 ? void 0 : map.collection, ctx);
2616
+ if (mode === 'text') {
2617
+ if (text) {
2618
+ mappings.push({
2619
+ mode: mode,
2620
+ text: text,
2621
+ collection: collection
2622
+ });
2623
+ }
2624
+ }
2625
+ else if (mappedField) {
2626
+ mappings.push({
2627
+ mode: mode,
2628
+ field_path: mappedField,
2629
+ collection: collection,
2630
+ leaf_value_type: normalizeOptionalString((map === null || map === void 0 ? void 0 : map.leaf_value_type) || (map === null || map === void 0 ? void 0 : map.leafValueType)),
2631
+ leaf_format_type: normalizeOptionalString((map === null || map === void 0 ? void 0 : map.leaf_format_type) || (map === null || map === void 0 ? void 0 : map.leafFormatType)),
2632
+ show: typeof (map === null || map === void 0 ? void 0 : map.show) === 'boolean' ? map.show : undefined
2633
+ });
2634
+ }
2635
+ });
2636
+ if (!mappings.length) {
2637
+ if (fieldPath) {
2638
+ mappings.push({ field_path: fieldPath, mode: normalizeLayoutMode(col.mode) });
2639
+ }
2640
+ else {
2641
+ var text = normalizeOptionalString(col.text);
2642
+ var mode = normalizeLayoutMode(col.mode);
2643
+ if ((mode === 'text' || text) && text) {
2644
+ mappings.push({
2645
+ mode: 'text',
2646
+ text: text,
2647
+ collection: resolveCollectionName(col.collection, ctx)
2648
+ });
2649
+ }
2650
+ }
2651
+ }
2652
+ if (!fieldPath) {
2653
+ var firstMapped = mappings.find(function (mapping) { return !!(mapping === null || mapping === void 0 ? void 0 : mapping.field_path); });
2654
+ if (firstMapped === null || firstMapped === void 0 ? void 0 : firstMapped.field_path) {
2655
+ fieldPath = firstMapped.field_path;
2656
+ }
2657
+ }
2658
+ if (!header && fieldPath) {
2659
+ var meta = ctx.fieldIndex.get(normalizePathKey(fieldPath));
2660
+ header = normalizeOptionalString(meta === null || meta === void 0 ? void 0 : meta.field_path_name);
2661
+ }
2662
+ if (!mappings.length) {
2663
+ return;
2664
+ }
2665
+ layoutColumns.push({
2666
+ header: header || '',
2667
+ field_path: fieldPath || '',
2668
+ collection: resolveCollectionName(col.collection, ctx),
2669
+ mode: normalizeLayoutMode(col.mode),
2670
+ text: normalizeOptionalString(col.text),
2671
+ mappings: mappings
2672
+ });
2673
+ });
2674
+ if (!layoutColumns.length && Array.isArray(raw.selected_fields)) {
2675
+ (raw.selected_fields || []).forEach(function (field) {
2676
+ var fieldPath = resolveFieldPath(field, ctx);
2677
+ if (!fieldPath) {
2678
+ return;
2679
+ }
2680
+ layoutColumns.push({
2681
+ header: '',
2682
+ field_path: fieldPath,
2683
+ mappings: [{ field_path: fieldPath }]
2684
+ });
2685
+ });
2686
+ }
2687
+ if (layoutColumns.length) {
2688
+ patch.layout_columns = layoutColumns;
2689
+ }
2690
+ var groupsRowRaw = Array.isArray(raw.groups_row) ? raw.groups_row : [];
2691
+ var groupsRow = groupsRowRaw.map(function (entry) { return resolveFieldPath(entry, ctx); }).filter(Boolean);
2692
+ if (groupsRow.length) {
2693
+ patch.groups_row = groupsRow;
2694
+ }
2695
+ var filtersRaw = Array.isArray(raw.filters) ? raw.filters : [];
2696
+ var filters = [];
2697
+ filtersRaw.forEach(function (filter) {
2698
+ var fieldPath = resolveFieldPath((filter === null || filter === void 0 ? void 0 : filter.field_path) || (filter === null || filter === void 0 ? void 0 : filter.fieldPath), ctx);
2699
+ if (!fieldPath) {
2700
+ return;
2701
+ }
2702
+ var fieldMeta = ctx.fieldIndex.get(normalizePathKey(fieldPath));
2703
+ var condition = normalizeFilterCondition(filter === null || filter === void 0 ? void 0 : filter.condition);
2704
+ if (!condition) {
2705
+ return;
2706
+ }
2707
+ var value = normalizeFilterValue(filter === null || filter === void 0 ? void 0 : filter.value, fieldMeta === null || fieldMeta === void 0 ? void 0 : fieldMeta.field_type);
2708
+ var highValue = normalizeFilterValue(filter === null || filter === void 0 ? void 0 : filter.high_value, fieldMeta === null || fieldMeta === void 0 ? void 0 : fieldMeta.field_type);
2709
+ var booleanValue = normalizeBooleanValue(filter === null || filter === void 0 ? void 0 : filter.boolean_value);
2710
+ filters.push({
2711
+ field_path: fieldPath,
2712
+ condition: condition,
2713
+ value: value,
2714
+ high_value: highValue,
2715
+ boolean_value: booleanValue,
2716
+ is_rolling: typeof (filter === null || filter === void 0 ? void 0 : filter.is_rolling) === 'boolean' ? filter.is_rolling : undefined,
2717
+ rolling_interval: normalizeOptionalString(filter === null || filter === void 0 ? void 0 : filter.rolling_interval)
2718
+ });
2719
+ });
2720
+ if (filters.length) {
2721
+ patch.filters = filters;
2722
+ }
2723
+ var sortRaw = Array.isArray(raw.sort) ? raw.sort : [];
2724
+ var sort = [];
2725
+ sortRaw.forEach(function (entry) {
2726
+ var fieldPath = resolveFieldPath((entry === null || entry === void 0 ? void 0 : entry.field_path) || (entry === null || entry === void 0 ? void 0 : entry.fieldPath), ctx);
2727
+ if (!fieldPath) {
2728
+ return;
2729
+ }
2730
+ sort.push({
2731
+ field_path: fieldPath,
2732
+ order: normalizeSortOrder(entry === null || entry === void 0 ? void 0 : entry.order)
2733
+ });
2734
+ });
2735
+ if (sort.length) {
2736
+ patch.sort = sort;
2737
+ }
2738
+ else {
2739
+ var defaultSortFields = buildDefaultSortFields(groupsRow, layoutColumns);
2740
+ if (defaultSortFields.length) {
2741
+ patch.sort = defaultSortFields.map(function (field_path) { return ({ field_path: field_path, order: 'asc' }); });
2742
+ }
2743
+ }
2744
+ var totalsRaw = Array.isArray(raw.totals) ? raw.totals : [];
2745
+ var totals = [];
2746
+ totalsRaw.forEach(function (total) {
2747
+ var type = normalizeTotalType(total === null || total === void 0 ? void 0 : total.type);
2748
+ var fields = Array.isArray(total === null || total === void 0 ? void 0 : total.fields) ? total.fields : [];
2749
+ var mappedFields = fields.map(function (field) { return resolveFieldPath(field, ctx); }).filter(Boolean);
2750
+ if (!type || !mappedFields.length) {
2751
+ return;
2752
+ }
2753
+ totals.push({ type: type, fields: mappedFields });
2754
+ });
2755
+ if (totals.length) {
2756
+ patch.totals = totals;
2757
+ }
2758
+ var linksRaw = Array.isArray(raw.links) ? raw.links : [];
2759
+ var links = [];
2760
+ linksRaw.forEach(function (link) {
2761
+ var first = resolveFieldPath((link === null || link === void 0 ? void 0 : link.field_first) || (link === null || link === void 0 ? void 0 : link.fieldFirst), ctx);
2762
+ var second = resolveFieldPath((link === null || link === void 0 ? void 0 : link.field_second) || (link === null || link === void 0 ? void 0 : link.fieldSecond), ctx);
2763
+ if (!first || !second) {
2764
+ return;
2765
+ }
2766
+ links.push({ field_first: first, field_second: second });
2767
+ });
2768
+ if (links.length) {
2769
+ patch.links = links;
2770
+ }
2771
+ var dateField = resolveFieldPath(raw.id_date_field || raw.date_field || raw.dateField, ctx);
2772
+ if (dateField) {
2773
+ patch.id_date_field = dateField;
2774
+ }
2775
+ var dateInterval = normalizeDateInterval(raw.date_interval || raw.dateInterval);
2776
+ if (dateInterval) {
2777
+ patch.date_interval = dateInterval;
2778
+ }
2779
+ var notes = normalizeOptionalString(raw.notes || raw.summary || raw.message);
2780
+ if (notes) {
2781
+ patch.notes = notes.slice(0, 400);
2782
+ }
2783
+ return patch;
2784
+ }
2785
+ function buildDefaultSortFields(groupsRow, layoutColumns) {
2786
+ var fields = [];
2787
+ var addField = function (fieldPath) {
2788
+ var normalized = normalizeOptionalString(fieldPath);
2789
+ if (normalized && !fields.includes(normalized)) {
2790
+ fields.push(normalized);
2791
+ }
2792
+ };
2793
+ (groupsRow || []).forEach(addField);
2794
+ if (fields.length) {
2795
+ return fields;
2796
+ }
2797
+ (layoutColumns || []).forEach(function (col) {
2798
+ var e_3, _a;
2799
+ if (!col || typeof col !== 'object') {
2800
+ return;
2801
+ }
2802
+ var fieldPath = '';
2803
+ var mappings = Array.isArray(col.mappings) ? col.mappings : [];
2804
+ try {
2805
+ for (var mappings_1 = __values(mappings), mappings_1_1 = mappings_1.next(); !mappings_1_1.done; mappings_1_1 = mappings_1.next()) {
2806
+ var mapping = mappings_1_1.value;
2807
+ if (mapping === null || mapping === void 0 ? void 0 : mapping.field_path) {
2808
+ fieldPath = mapping.field_path;
2809
+ break;
2810
+ }
2811
+ }
2812
+ }
2813
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
2814
+ finally {
2815
+ try {
2816
+ if (mappings_1_1 && !mappings_1_1.done && (_a = mappings_1.return)) _a.call(mappings_1);
2817
+ }
2818
+ finally { if (e_3) throw e_3.error; }
2819
+ }
2820
+ if (!fieldPath && col.field_path) {
2821
+ fieldPath = col.field_path;
2822
+ }
2823
+ addField(fieldPath);
2824
+ });
2825
+ return fields;
2826
+ }
2827
+ function buildPatchNotes(patch, meta) {
2828
+ var columns = Array.isArray(patch === null || patch === void 0 ? void 0 : patch.layout_columns) ? patch.layout_columns.length : 0;
2829
+ var groups = Array.isArray(patch === null || patch === void 0 ? void 0 : patch.groups_row) ? patch.groups_row.length : 0;
2830
+ var filters = Array.isArray(patch === null || patch === void 0 ? void 0 : patch.filters) ? patch.filters.length : 0;
2831
+ var joins = Array.isArray(patch === null || patch === void 0 ? void 0 : patch.collection_joins) ? patch.collection_joins.length : 0;
2832
+ var parts = [
2833
+ "AI suggested ".concat(columns, " column").concat(columns === 1 ? '' : 's'),
2834
+ groups ? "".concat(groups, " group").concat(groups === 1 ? '' : 's') : '',
2835
+ filters ? "".concat(filters, " filter").concat(filters === 1 ? '' : 's') : '',
2836
+ joins ? "".concat(joins, " join").concat(joins === 1 ? '' : 's') : ''
2837
+ ].filter(Boolean);
2838
+ var note = parts.length ? parts.join(', ') + '.' : 'AI suggestions ready.';
2839
+ if (patch === null || patch === void 0 ? void 0 : patch.notes) {
2840
+ note += " ".concat(patch.notes);
2841
+ }
2842
+ if (meta.inferenceReason) {
2843
+ note += " ".concat(meta.inferenceReason);
2844
+ }
2845
+ if (meta.truncated) {
2846
+ note += " Field list trimmed to ".concat(meta.usedFields, " of ").concat(meta.totalFields, " available fields.");
2847
+ }
2848
+ return note;
2849
+ }
2850
+ function normalizeLayoutMode(value) {
2851
+ var normalized = normalizeOptionalString(value).toLowerCase();
2852
+ return normalized === 'text' ? 'text' : 'variable';
2853
+ }
2854
+ function normalizeFilterCondition(value) {
2855
+ var allowed = new Set(['eq', 'ne', 'lt', 'lte', 'gt', 'gte', 'bw', 'nnull', 'null', 'regex']);
2856
+ var normalized = normalizeOptionalString(value).toLowerCase();
2857
+ return allowed.has(normalized) ? normalized : '';
2858
+ }
2859
+ function normalizeSortOrder(value) {
2860
+ var normalized = normalizeOptionalString(value).toLowerCase();
2861
+ return normalized === 'dsc' || normalized === 'desc' ? 'dsc' : 'asc';
2862
+ }
2863
+ function normalizeTotalType(value) {
2864
+ var normalized = normalizeOptionalString(value).toLowerCase();
2865
+ if (normalized === 'avg' || normalized === 'sum') {
2866
+ return normalized;
2867
+ }
2868
+ return '';
2869
+ }
2870
+ function normalizeDateInterval(value) {
2871
+ var normalized = normalizeOptionalString(value);
2872
+ if (!normalized) {
2873
+ return '';
2874
+ }
2875
+ var map = {
2876
+ seconds: 'Seconds',
2877
+ minutes: 'Minutes',
2878
+ hours: 'Hours',
2879
+ daily: 'Daily',
2880
+ weekly: 'Weekly',
2881
+ monthly: 'Monthly',
2882
+ quarterly: 'Quarterly',
2883
+ yearly: 'Yearly'
2884
+ };
2885
+ var key = normalized.toLowerCase();
2886
+ return map[key] || '';
2887
+ }
2888
+ function normalizeFilterValue(value, fieldType) {
2889
+ if (fieldType === 'Number') {
2890
+ var num = Number(value);
2891
+ return Number.isFinite(num) ? num : value;
2892
+ }
2893
+ if (fieldType === 'Boolean') {
2894
+ if (value === true || value === false) {
2895
+ return value;
2896
+ }
2897
+ if (typeof value === 'string') {
2898
+ return value.toLowerCase() === 'true';
2899
+ }
2900
+ return value;
2901
+ }
2902
+ if (fieldType === 'Date') {
2903
+ if (value instanceof Date) {
2904
+ return value;
2905
+ }
2906
+ if (typeof value === 'string') {
2907
+ var parsed = new Date(value);
2908
+ return isNaN(parsed.getTime()) ? value : parsed.toISOString();
2909
+ }
2910
+ }
2911
+ return value;
2912
+ }
2913
+ function normalizeBooleanValue(value) {
2914
+ if (value === true || value === false) {
2915
+ return value;
2916
+ }
2917
+ if (typeof value === 'string') {
2918
+ if (value.toLowerCase() === 'true') {
2919
+ return true;
2920
+ }
2921
+ if (value.toLowerCase() === 'false') {
2922
+ return false;
2923
+ }
2924
+ }
2925
+ return undefined;
2926
+ }
2927
+ function resolveCollectionName(value, ctx) {
2928
+ var key = normalizeKey(value);
2929
+ if (!key) {
2930
+ return '';
2931
+ }
2932
+ var found = ctx.collectionIndex.get(key);
2933
+ return found ? found.collection : '';
2934
+ }
2935
+ function resolveFieldPath(value, ctx) {
2936
+ var _a;
2937
+ var pathKey = normalizePathKey(value);
2938
+ if (pathKey && ctx.fieldIndex.has(pathKey)) {
2939
+ return ((_a = ctx.fieldIndex.get(pathKey)) === null || _a === void 0 ? void 0 : _a.field_path) || '';
2940
+ }
2941
+ var nameKey = normalizeKey(value);
2942
+ if (nameKey && ctx.fieldNameIndex.has(nameKey)) {
2943
+ return ctx.fieldNameIndex.get(nameKey) || '';
2944
+ }
2945
+ return '';
2946
+ }
2947
+ function sanitizeAlias(value) {
2948
+ var alias = normalizeOptionalString(value);
2949
+ if (!alias) {
2950
+ return '';
2951
+ }
2952
+ return alias.replace(/[^\w\- ]/g, '').trim().slice(0, 40);
2953
+ }
2954
+ function normalizeKey(value) {
2955
+ return normalizeOptionalString(value).toLowerCase().replace(/[^a-z0-9]+/g, '');
2956
+ }
2957
+ function normalizePathKey(value) {
2958
+ return normalizeOptionalString(value).toLowerCase();
2959
+ }
2960
+ function resolveArrayRoot(path) {
2961
+ var raw = normalizeOptionalString(path);
2962
+ if (!raw) {
2963
+ return '';
2964
+ }
2965
+ var idx = raw.indexOf('.$');
2966
+ if (idx === -1) {
2967
+ return '';
2968
+ }
2969
+ return raw.slice(0, idx);
2970
+ }
2971
+ function isLinkCandidateFieldPath(path) {
2972
+ var normalized = normalizeOptionalString(path).toLowerCase();
2973
+ if (!normalized) {
2974
+ return false;
2975
+ }
2976
+ var last = (normalized.split('.').pop() || '').replace(/\$/g, '');
2977
+ if (!last) {
2978
+ return false;
2979
+ }
2980
+ if (last === 'id' || last === '_id') {
2981
+ return true;
2982
+ }
2983
+ if (last.endsWith('_id') || last.endsWith('_uuid') || last.endsWith('_guid')) {
2984
+ return true;
2985
+ }
2986
+ if (last.startsWith('id_')) {
2987
+ return true;
2988
+ }
2989
+ return false;
2990
+ }
2991
+ function safeJsonParse(value) {
2992
+ if (!value) {
2993
+ return null;
2994
+ }
2995
+ try {
2996
+ return JSON.parse(value);
2997
+ }
2998
+ catch (_a) {
2999
+ var match = value.match(/\{[\s\S]*\}/);
3000
+ if (!match) {
3001
+ return null;
3002
+ }
3003
+ try {
3004
+ return JSON.parse(match[0]);
3005
+ }
3006
+ catch (_b) {
3007
+ return null;
3008
+ }
3009
+ }
3010
+ }
3011
+ function evaluateReportBuilderGuardrails(message) {
3012
+ var e_4, _a;
3013
+ var normalized = String(message || '').toLowerCase();
3014
+ var patterns = [
3015
+ { pattern: /\b(source\s*code|full\s*code|entire\s*code|repo\s*dump|repository|git\s*clone)\b/i, reason: 'Code access is restricted.' },
3016
+ { pattern: /\b(credentials?|passwords?|secrets?|tokens?)\b/i, reason: 'Credentials and secrets are restricted.' },
3017
+ { pattern: /\b(delete|drop|truncate)\s+(database|db|schema|table)\b/i, reason: 'Database operations are restricted.' },
3018
+ { pattern: /\b(shell|terminal|ssh|sudo|rm\s+-rf|chmod|chown)\b/i, reason: 'Server operations are restricted.' },
3019
+ { pattern: /\b(exploit|bypass|malware|phishing|ransomware|ddos|sql\s*injection)\b/i, reason: 'Security abuse is restricted.' },
3020
+ { pattern: /\b(credit\s*card|social\s*security|ssn|bank\s*account)\b/i, reason: 'Sensitive personal data is restricted.' }
3021
+ ];
3022
+ try {
3023
+ for (var patterns_1 = __values(patterns), patterns_1_1 = patterns_1.next(); !patterns_1_1.done; patterns_1_1 = patterns_1.next()) {
3024
+ var entry = patterns_1_1.value;
3025
+ if (entry.pattern.test(normalized)) {
3026
+ return {
3027
+ blocked: true,
3028
+ reason: entry.reason,
3029
+ response: 'I can’t help with that request because it could access restricted systems or data. Please describe the report you need (fields, filters, timeframe) and I can configure it safely.'
3030
+ };
3031
+ }
3032
+ }
3033
+ }
3034
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
3035
+ finally {
3036
+ try {
3037
+ if (patterns_1_1 && !patterns_1_1.done && (_a = patterns_1.return)) _a.call(patterns_1);
3038
+ }
3039
+ finally { if (e_4) throw e_4.error; }
3040
+ }
3041
+ return null;
3042
+ }
3043
+ function resolveIsSuperAdmin(id_user) {
3044
+ return __awaiter(this, void 0, void 0, function () {
3045
+ var user, _a;
3046
+ var _b;
3047
+ return __generator(this, function (_c) {
3048
+ switch (_c.label) {
3049
+ case 0:
3050
+ if (!id_user) {
3051
+ return [2 /*return*/, false];
3052
+ }
3053
+ _c.label = 1;
3054
+ case 1:
3055
+ _c.trys.push([1, 3, , 4]);
3056
+ return [4 /*yield*/, user_collection_1.Users.findById(id_user)];
3057
+ case 2:
3058
+ user = _c.sent();
3059
+ return [2 /*return*/, !!((_b = user === null || user === void 0 ? void 0 : user.roles) === null || _b === void 0 ? void 0 : _b.super_admin)];
3060
+ case 3:
3061
+ _a = _c.sent();
3062
+ return [2 /*return*/, false];
3063
+ case 4: return [2 /*return*/];
3064
+ }
3065
+ });
3066
+ });
3067
+ }
3068
+ function resolveClientId(idClientInput, idUser) {
3069
+ return __awaiter(this, void 0, void 0, function () {
3070
+ var normalized, user, fromOther, _a;
3071
+ var _b, _c;
3072
+ return __generator(this, function (_d) {
3073
+ switch (_d.label) {
3074
+ case 0:
3075
+ normalized = normalizeOptionalString(idClientInput);
3076
+ if (normalized) {
3077
+ return [2 /*return*/, normalized];
3078
+ }
3079
+ if (!idUser) {
3080
+ return [2 /*return*/, ''];
3081
+ }
3082
+ _d.label = 1;
3083
+ case 1:
3084
+ _d.trys.push([1, 3, , 4]);
3085
+ return [4 /*yield*/, user_collection_1.Users.findById(idUser)];
3086
+ case 2:
3087
+ user = _d.sent();
3088
+ fromOther = normalizeOptionalString(((_b = user === null || user === void 0 ? void 0 : user.other) === null || _b === void 0 ? void 0 : _b.id_client) || ((_c = user === null || user === void 0 ? void 0 : user.other) === null || _c === void 0 ? void 0 : _c.idClient));
3089
+ return [2 /*return*/, fromOther];
3090
+ case 3:
3091
+ _a = _d.sent();
3092
+ return [2 /*return*/, ''];
3093
+ case 4: return [2 /*return*/];
3094
+ }
3095
+ });
3096
+ });
3097
+ }
3098
+
3099
+ //# sourceMappingURL=report-builder.js.map