@resolveio/server-lib 22.2.33 → 22.2.34

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