@resolveio/server-lib 22.2.32 → 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 -298
  374. package/methods/ai-terminal.js +0 -24872
  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
@@ -0,0 +1,921 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { MongoClient } from 'mongodb';
4
+ import {
5
+ buildAssistantDatedPivotDisplay,
6
+ buildDisplayTable,
7
+ classifyAssistantRequestType
8
+ } from '../src/methods/ai-terminal';
9
+
10
+ type EvalRow = Record<string, any>;
11
+
12
+ type EvalResult = {
13
+ id: string;
14
+ prompt: string;
15
+ classification: {
16
+ type: string;
17
+ dataQuestion: boolean;
18
+ source: string;
19
+ pass: boolean;
20
+ };
21
+ query: {
22
+ kind: 'read' | 'aggregate';
23
+ collection: string;
24
+ };
25
+ rowCount: number;
26
+ minRows: number;
27
+ pass: boolean;
28
+ notes?: string;
29
+ sample: EvalRow[];
30
+ error?: string;
31
+ };
32
+
33
+ type EvalContext = {
34
+ db: any;
35
+ now: Date;
36
+ startOfWeek: Date;
37
+ last30Days: Date;
38
+ last90Days: Date;
39
+ last2Weeks: Date;
40
+ last6Months: Date;
41
+ thisMonthStart: Date;
42
+ nextMonthStart: Date;
43
+ lastMonthStart: Date;
44
+ lastMonthEnd: Date;
45
+ targetBlendChemicalIds: Array<string>;
46
+ };
47
+
48
+ type EvalCase = {
49
+ id: string;
50
+ prompt: string;
51
+ minRows: number;
52
+ query: {
53
+ kind: 'read' | 'aggregate';
54
+ collection: string;
55
+ };
56
+ notes?: string;
57
+ run: (context: EvalContext) => Promise<EvalRow[]>;
58
+ };
59
+
60
+ function addDaysUtc(date: Date, days: number): Date {
61
+ return new Date(Date.UTC(
62
+ date.getUTCFullYear(),
63
+ date.getUTCMonth(),
64
+ date.getUTCDate() + days,
65
+ date.getUTCHours(),
66
+ date.getUTCMinutes(),
67
+ date.getUTCSeconds(),
68
+ date.getUTCMilliseconds()
69
+ ));
70
+ }
71
+
72
+ function addMonthsUtc(date: Date, months: number): Date {
73
+ return new Date(Date.UTC(
74
+ date.getUTCFullYear(),
75
+ date.getUTCMonth() + months,
76
+ date.getUTCDate(),
77
+ date.getUTCHours(),
78
+ date.getUTCMinutes(),
79
+ date.getUTCSeconds(),
80
+ date.getUTCMilliseconds()
81
+ ));
82
+ }
83
+
84
+ function startOfDayUtc(date: Date): Date {
85
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0));
86
+ }
87
+
88
+ function startOfWeekUtcMonday(date: Date): Date {
89
+ const day = date.getUTCDay();
90
+ const diff = (day + 6) % 7;
91
+ return startOfDayUtc(addDaysUtc(date, -diff));
92
+ }
93
+
94
+ function startOfMonthUtc(date: Date): Date {
95
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0));
96
+ }
97
+
98
+ function sumChemicalQuantityExpr(quantityField: 'delivered' | 'returned' | 'shipped') {
99
+ return {
100
+ $sum: {
101
+ $map: {
102
+ input: { $ifNull: ['$chemicals', []] },
103
+ as: 'chem',
104
+ in: { $ifNull: [`$$chem.${quantityField}.quantity`, 0] }
105
+ }
106
+ }
107
+ };
108
+ }
109
+
110
+ async function resolveExistingCollection(db: any, candidates: string[]): Promise<string | null> {
111
+ const rows = await db.listCollections({}, { nameOnly: true }).toArray();
112
+ const names = new Set(rows.map((row: any) => String(row?.name || '').trim()));
113
+ for (const candidate of candidates) {
114
+ if (names.has(candidate)) {
115
+ return candidate;
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+
121
+ const EVAL_CASES: EvalCase[] = [
122
+ {
123
+ id: 'wo_last20_this_week_group_status',
124
+ prompt: 'Show me the last 20 work orders created this week, grouped by status.',
125
+ minRows: 1,
126
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
127
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
128
+ {
129
+ $match: {
130
+ date_created: { $gte: ctx.startOfWeek, $lt: ctx.now }
131
+ }
132
+ },
133
+ { $sort: { date_created: -1 } },
134
+ { $limit: 20 },
135
+ {
136
+ $group: {
137
+ _id: { $ifNull: ['$status', 'Unknown'] },
138
+ work_order_count: { $sum: 1 }
139
+ }
140
+ },
141
+ { $sort: { work_order_count: -1, _id: 1 } },
142
+ {
143
+ $project: {
144
+ _id: 0,
145
+ status: '$_id',
146
+ work_order_count: 1
147
+ }
148
+ }
149
+ ]).toArray()
150
+ },
151
+ {
152
+ id: 'wo_last20_this_week_by_status_alias',
153
+ prompt: 'Show me the last 20 work orders created this week by status.',
154
+ minRows: 0,
155
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
156
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
157
+ {
158
+ $match: {
159
+ date_created: { $gte: ctx.startOfWeek, $lt: ctx.now }
160
+ }
161
+ },
162
+ { $sort: { date_created: -1 } },
163
+ { $limit: 20 },
164
+ {
165
+ $group: {
166
+ _id: { $ifNull: ['$status', 'Unknown'] },
167
+ work_order_count: { $sum: 1 }
168
+ }
169
+ },
170
+ { $sort: { work_order_count: -1, _id: 1 } },
171
+ {
172
+ $project: {
173
+ _id: 0,
174
+ status: '$_id',
175
+ work_order_count: 1
176
+ }
177
+ }
178
+ ]).toArray()
179
+ },
180
+ {
181
+ id: 'wo_completed_per_day_last_30d',
182
+ prompt: 'For the last 30 days, how many work orders were completed per day?',
183
+ minRows: 1,
184
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
185
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
186
+ {
187
+ $match: {
188
+ date_completed: { $gte: ctx.last30Days, $lt: ctx.now }
189
+ }
190
+ },
191
+ {
192
+ $group: {
193
+ _id: {
194
+ $dateToString: { format: '%Y-%m-%d', date: '$date_completed', timezone: 'UTC' }
195
+ },
196
+ completed_work_orders: { $sum: 1 }
197
+ }
198
+ },
199
+ { $sort: { _id: 1 } },
200
+ {
201
+ $project: {
202
+ _id: 0,
203
+ day_utc: '$_id',
204
+ completed_work_orders: 1
205
+ }
206
+ }
207
+ ]).toArray()
208
+ },
209
+ {
210
+ id: 'wo_top_customers_last_6m',
211
+ prompt: 'List the top 10 customers by number of work orders in the last 6 months.',
212
+ minRows: 1,
213
+ query: { kind: 'aggregate', collection: 'orders' },
214
+ run: async (ctx) => {
215
+ const collection = await resolveExistingCollection(ctx.db, ['work-order-dynamics', 'maintenance-orders', 'orders']);
216
+ if (!collection) {
217
+ return [];
218
+ }
219
+ return await ctx.db.collection(collection).aggregate([
220
+ {
221
+ $addFields: {
222
+ effective_date: {
223
+ $ifNull: [
224
+ '$date_created',
225
+ { $ifNull: ['$date_create', '$createdAt'] }
226
+ ]
227
+ },
228
+ customer_label: {
229
+ $ifNull: [
230
+ '$customer',
231
+ {
232
+ $ifNull: [
233
+ '$customer_name',
234
+ {
235
+ $ifNull: [
236
+ '$client_name',
237
+ {
238
+ $ifNull: [
239
+ { $toString: '$id_customer' },
240
+ { $ifNull: ['$qb_ListID_class', 'Unknown'] }
241
+ ]
242
+ }
243
+ ]
244
+ }
245
+ ]
246
+ }
247
+ ]
248
+ }
249
+ }
250
+ },
251
+ {
252
+ $match: {
253
+ effective_date: { $gte: ctx.last6Months, $lt: ctx.now },
254
+ 'deleted.date': { $exists: false }
255
+ }
256
+ },
257
+ {
258
+ $group: {
259
+ _id: '$customer_label',
260
+ work_order_count: { $sum: 1 }
261
+ }
262
+ },
263
+ { $sort: { work_order_count: -1, _id: 1 } },
264
+ { $limit: 10 },
265
+ {
266
+ $project: {
267
+ _id: 0,
268
+ customer: '$_id',
269
+ work_order_count: 1
270
+ }
271
+ }
272
+ ]).toArray();
273
+ }
274
+ },
275
+ {
276
+ id: 'wo_open_missing_required_fields',
277
+ prompt: 'Show open work orders with missing required fields (customer, location, or scheduled date).',
278
+ minRows: 0,
279
+ query: { kind: 'read', collection: 'work-order-dynamics' },
280
+ notes: 'A zero row count can be valid here if data quality is clean.',
281
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').find(
282
+ {
283
+ status: { $nin: ['Closed', 'Completed', 'Canceled'] },
284
+ $or: [
285
+ { customer: { $in: [null, '', 'N/A'] } },
286
+ { location: null },
287
+ { 'location.name': { $in: [null, '', 'N/A'] } },
288
+ { date_appointment_time: null }
289
+ ]
290
+ },
291
+ {
292
+ projection: {
293
+ _id: 1,
294
+ wo_string: 1,
295
+ status: 1,
296
+ customer: 1,
297
+ type: 1,
298
+ 'location.name': 1,
299
+ date_created: 1,
300
+ date_appointment_time: 1
301
+ },
302
+ sort: { date_created: -1 },
303
+ limit: 50
304
+ }
305
+ ).toArray()
306
+ },
307
+ {
308
+ id: 'blend_last10_summary',
309
+ prompt: 'For blending: summarize the last 10 blend tickets with product, total volume, and created date.',
310
+ minRows: 1,
311
+ query: { kind: 'aggregate', collection: 'chemical-blends' },
312
+ run: async (ctx) => await ctx.db.collection('chemical-blends').aggregate([
313
+ { $sort: { date: -1, createdAt: -1 } },
314
+ { $limit: 10 },
315
+ {
316
+ $project: {
317
+ _id: 1,
318
+ product: { $ifNull: ['$blend_name', '$chemical'] },
319
+ total_volume: '$chemical_recipe_quantity',
320
+ volume_unit: { $cond: [{ $eq: ['$blend_in_pounds', true] }, 'lb', 'gal'] },
321
+ created_date: { $ifNull: ['$date', '$createdAt'] },
322
+ batch_number: 1
323
+ }
324
+ }
325
+ ]).toArray()
326
+ },
327
+ {
328
+ id: 'blend_used_red_ultra_lift_last_30d',
329
+ prompt: 'Which blends used Chemical Red Ultra Lift in the last 30 days? Include lot/batch and volume.',
330
+ minRows: 0,
331
+ query: { kind: 'aggregate', collection: 'chemical-blends' },
332
+ notes: 'A zero row count is valid when this chemical is not present in the current 30-day window.',
333
+ run: async (ctx) => await ctx.db.collection('chemical-blends').aggregate([
334
+ {
335
+ $match: {
336
+ date: { $gte: ctx.last30Days, $lt: ctx.now }
337
+ }
338
+ },
339
+ { $unwind: '$blend_chemicals' },
340
+ {
341
+ $match: {
342
+ $or: [
343
+ { 'blend_chemicals.chemical': { $regex: 'Red\\s+Ultra\\s+Lift', $options: 'i' } },
344
+ { 'blend_chemicals.id_chemical': { $in: ctx.targetBlendChemicalIds } }
345
+ ]
346
+ }
347
+ },
348
+ { $sort: { date: -1 } },
349
+ {
350
+ $project: {
351
+ _id: 1,
352
+ blend_name: 1,
353
+ batch_number: 1,
354
+ blend_date: '$date',
355
+ chemical_used: '$blend_chemicals.chemical',
356
+ volume: {
357
+ $ifNull: ['$blend_chemicals.quantity_recipe_gallons', '$blend_chemicals.quantity_recipe']
358
+ },
359
+ volume_unit: { $ifNull: ['$blend_chemicals.unit', 'gal'] }
360
+ }
361
+ },
362
+ { $limit: 50 }
363
+ ]).toArray()
364
+ },
365
+ {
366
+ id: 'blend_throughput_by_day_last_2w',
367
+ prompt: 'Show blend throughput by day for the last 2 weeks.',
368
+ minRows: 1,
369
+ query: { kind: 'aggregate', collection: 'chemical-blends' },
370
+ run: async (ctx) => await ctx.db.collection('chemical-blends').aggregate([
371
+ {
372
+ $match: {
373
+ date: { $gte: ctx.last2Weeks, $lt: ctx.now }
374
+ }
375
+ },
376
+ {
377
+ $group: {
378
+ _id: {
379
+ $dateToString: { format: '%Y-%m-%d', date: '$date', timezone: 'UTC' }
380
+ },
381
+ blend_count: { $sum: 1 },
382
+ total_volume: { $sum: { $ifNull: ['$chemical_recipe_quantity', 0] } }
383
+ }
384
+ },
385
+ { $sort: { _id: 1 } },
386
+ {
387
+ $project: {
388
+ _id: 0,
389
+ day_utc: '$_id',
390
+ blend_count: 1,
391
+ total_volume: 1
392
+ }
393
+ }
394
+ ]).toArray()
395
+ },
396
+ {
397
+ id: 'invoice_top_customers_total_last_6m',
398
+ prompt: 'Show top 10 customers by invoice total in the last 6 months.',
399
+ minRows: 1,
400
+ query: { kind: 'aggregate', collection: 'invoices' },
401
+ run: async (ctx) => await ctx.db.collection('invoices').aggregate([
402
+ {
403
+ $match: {
404
+ date_created: { $gte: ctx.last6Months, $lt: ctx.now }
405
+ }
406
+ },
407
+ {
408
+ $group: {
409
+ _id: { $ifNull: ['$customer', 'Unknown'] },
410
+ invoice_count: { $sum: 1 },
411
+ invoice_total: {
412
+ $sum: {
413
+ $ifNull: ['$price', { $ifNull: ['$subtotal', 0] }]
414
+ }
415
+ }
416
+ }
417
+ },
418
+ { $sort: { invoice_total: -1, _id: 1 } },
419
+ { $limit: 10 },
420
+ {
421
+ $project: {
422
+ _id: 0,
423
+ customer: '$_id',
424
+ invoice_count: 1,
425
+ invoice_total: 1
426
+ }
427
+ }
428
+ ]).toArray()
429
+ },
430
+ {
431
+ id: 'invoice_revenue_monthly_grid_last_6m',
432
+ prompt: 'Break down my total revenue over the last 6 month by month',
433
+ minRows: 1,
434
+ query: { kind: 'aggregate', collection: 'invoices' },
435
+ run: async (ctx) => {
436
+ const rows = await ctx.db.collection('invoices').aggregate([
437
+ {
438
+ $match: {
439
+ date_created: { $gte: ctx.last6Months, $lt: ctx.now }
440
+ }
441
+ },
442
+ {
443
+ $group: {
444
+ _id: {
445
+ year: { $year: '$date_created' },
446
+ month: { $month: '$date_created' }
447
+ },
448
+ total_revenue: {
449
+ $sum: {
450
+ $ifNull: ['$price', { $ifNull: ['$subtotal', 0] }]
451
+ }
452
+ }
453
+ }
454
+ },
455
+ {
456
+ $project: {
457
+ _id: 0,
458
+ year: '$_id.year',
459
+ month: '$_id.month',
460
+ total_revenue: 1
461
+ }
462
+ },
463
+ { $sort: { year: 1, month: 1 } }
464
+ ]).toArray();
465
+ const display = buildDisplayTable(rows, { maxColumns: 40, maxRows: 500 });
466
+ const pivot = buildAssistantDatedPivotDisplay(display);
467
+ if (!pivot) {
468
+ throw new Error('Expected dated pivot grid for monthly revenue report.');
469
+ }
470
+ const monthColumns = pivot.columns.slice(1);
471
+ if (pivot.columns[0] !== 'Metric' || monthColumns.length < 2) {
472
+ throw new Error('Expected Metric + month columns in monthly revenue grid.');
473
+ }
474
+ return pivot.rows;
475
+ }
476
+ },
477
+ {
478
+ id: 'invoice_revenue_monthly_customer_grid_last_6m',
479
+ prompt: 'Break down my total revenue over the last 6 month by month by each customer',
480
+ minRows: 1,
481
+ query: { kind: 'aggregate', collection: 'invoices' },
482
+ run: async (ctx) => {
483
+ const rows = await ctx.db.collection('invoices').aggregate([
484
+ {
485
+ $match: {
486
+ date_created: { $gte: ctx.last6Months, $lt: ctx.now }
487
+ }
488
+ },
489
+ {
490
+ $group: {
491
+ _id: {
492
+ customer: { $ifNull: ['$customer', 'Unknown'] },
493
+ year: { $year: '$date_created' },
494
+ month: { $month: '$date_created' }
495
+ },
496
+ total_revenue: {
497
+ $sum: {
498
+ $ifNull: ['$price', { $ifNull: ['$subtotal', 0] }]
499
+ }
500
+ }
501
+ }
502
+ },
503
+ {
504
+ $project: {
505
+ _id: 0,
506
+ customer: '$_id.customer',
507
+ year: '$_id.year',
508
+ month: '$_id.month',
509
+ total_revenue: 1
510
+ }
511
+ },
512
+ { $sort: { customer: 1, year: 1, month: 1 } }
513
+ ]).toArray();
514
+ const display = buildDisplayTable(rows, { maxColumns: 50, maxRows: 2000 });
515
+ const pivot = buildAssistantDatedPivotDisplay(display);
516
+ if (!pivot) {
517
+ throw new Error('Expected dated pivot grid for customer monthly revenue report.');
518
+ }
519
+ const firstColumn = String(pivot.columns[0] || '').toLowerCase();
520
+ const monthColumns = pivot.columns.slice(1);
521
+ if (!firstColumn.includes('customer') || monthColumns.length < 2) {
522
+ throw new Error('Expected Customer + month header columns in customer revenue grid.');
523
+ }
524
+ return pivot.rows;
525
+ }
526
+ },
527
+ {
528
+ id: 'invoice_missing_invoiced_date_this_month',
529
+ prompt: 'List invoices missing an invoiced date but created this month.',
530
+ minRows: 1,
531
+ query: { kind: 'read', collection: 'invoices' },
532
+ run: async (ctx) => await ctx.db.collection('invoices').find(
533
+ {
534
+ date_created: { $gte: ctx.thisMonthStart, $lt: ctx.nextMonthStart },
535
+ $or: [
536
+ { date_invoiced: null },
537
+ { date_invoiced: { $exists: false } }
538
+ ]
539
+ },
540
+ {
541
+ projection: {
542
+ _id: 1,
543
+ invoice_number: 1,
544
+ invoice_number_string: 1,
545
+ customer: 1,
546
+ status: 1,
547
+ date_created: 1,
548
+ date_invoiced: 1,
549
+ price: 1
550
+ },
551
+ sort: { date_created: -1 },
552
+ limit: 50
553
+ }
554
+ ).toArray()
555
+ },
556
+ {
557
+ id: 'deliveries_per_driver_last_month',
558
+ prompt: 'Break down the number of deliveries per driver last month',
559
+ minRows: 1,
560
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
561
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
562
+ {
563
+ $match: {
564
+ date_completed: { $gte: ctx.lastMonthStart, $lt: ctx.lastMonthEnd },
565
+ status: { $in: ['Completed', 'Closed'] }
566
+ }
567
+ },
568
+ { $unwind: { path: '$drivers', preserveNullAndEmptyArrays: true } },
569
+ {
570
+ $group: {
571
+ _id: { $ifNull: ['$drivers.user', 'Unassigned'] },
572
+ delivery_count: { $sum: 1 }
573
+ }
574
+ },
575
+ { $sort: { delivery_count: -1, _id: 1 } },
576
+ {
577
+ $project: {
578
+ _id: 0,
579
+ driver: '$_id',
580
+ delivery_count: 1
581
+ }
582
+ }
583
+ ]).toArray()
584
+ },
585
+ {
586
+ id: 'last20_deliveries_product_volume_destination',
587
+ prompt: 'List the last 20 deliveries with product, volume, and destination.',
588
+ minRows: 1,
589
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
590
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
591
+ {
592
+ $match: {
593
+ status: { $in: ['Completed', 'Closed'] },
594
+ date_completed: { $type: 'date' }
595
+ }
596
+ },
597
+ { $sort: { date_completed: -1 } },
598
+ { $limit: 20 },
599
+ {
600
+ $project: {
601
+ _id: 1,
602
+ wo_string: 1,
603
+ customer: 1,
604
+ destination: '$location.name',
605
+ date_completed: 1,
606
+ products: {
607
+ $map: {
608
+ input: { $ifNull: ['$chemicals', []] },
609
+ as: 'chem',
610
+ in: '$$chem.chemical'
611
+ }
612
+ },
613
+ delivered_volume: sumChemicalQuantityExpr('delivered'),
614
+ returned_volume: sumChemicalQuantityExpr('returned'),
615
+ unit: {
616
+ $first: {
617
+ $map: {
618
+ input: { $ifNull: ['$chemicals', []] },
619
+ as: 'chem',
620
+ in: '$$chem.unit'
621
+ }
622
+ }
623
+ }
624
+ }
625
+ }
626
+ ]).toArray()
627
+ },
628
+ {
629
+ id: 'jobs_highest_treatment_volume_last_90d',
630
+ prompt: 'Which jobs have the highest treatment volume in the last 90 days?',
631
+ minRows: 1,
632
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
633
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
634
+ {
635
+ $match: {
636
+ date_completed: { $gte: ctx.last90Days, $lt: ctx.now },
637
+ 'job.id_job': { $exists: true, $ne: '' }
638
+ }
639
+ },
640
+ { $unwind: { path: '$chemicals', preserveNullAndEmptyArrays: true } },
641
+ {
642
+ $addFields: {
643
+ chemical_treatment_volume: {
644
+ $add: [
645
+ { $ifNull: ['$chemicals.delivered.quantity', 0] },
646
+ { $ifNull: ['$chemicals.returned.quantity', 0] }
647
+ ]
648
+ }
649
+ }
650
+ },
651
+ {
652
+ $group: {
653
+ _id: '$job.id_job',
654
+ job: { $first: '$job.job' },
655
+ customer: { $first: '$customer' },
656
+ treatment_volume: { $sum: '$chemical_treatment_volume' },
657
+ work_orders: { $addToSet: '$_id' }
658
+ }
659
+ },
660
+ {
661
+ $project: {
662
+ _id: 0,
663
+ job_id: '$_id',
664
+ job: 1,
665
+ customer: 1,
666
+ treatment_volume: 1,
667
+ work_order_count: { $size: '$work_orders' }
668
+ }
669
+ },
670
+ { $sort: { treatment_volume: -1, work_order_count: -1 } },
671
+ { $limit: 10 }
672
+ ]).toArray()
673
+ },
674
+ {
675
+ id: 'last20_completed_wo_customer_product_delivered_returned',
676
+ prompt: 'Break down the last 20 completed work orders and tell me what customer, what product and how much we delivered or returned',
677
+ minRows: 1,
678
+ query: { kind: 'aggregate', collection: 'work-order-dynamics' },
679
+ run: async (ctx) => await ctx.db.collection('work-order-dynamics').aggregate([
680
+ {
681
+ $match: {
682
+ status: { $in: ['Completed', 'Closed'] },
683
+ date_completed: { $type: 'date' }
684
+ }
685
+ },
686
+ { $sort: { date_completed: -1 } },
687
+ { $limit: 20 },
688
+ { $unwind: { path: '$chemicals', preserveNullAndEmptyArrays: true } },
689
+ {
690
+ $project: {
691
+ _id: 1,
692
+ wo_string: 1,
693
+ date_completed: 1,
694
+ customer: 1,
695
+ product: '$chemicals.chemical',
696
+ delivered_quantity: { $ifNull: ['$chemicals.delivered.quantity', 0] },
697
+ returned_quantity: { $ifNull: ['$chemicals.returned.quantity', 0] },
698
+ unit: '$chemicals.unit'
699
+ }
700
+ },
701
+ { $sort: { date_completed: -1, wo_string: -1 } }
702
+ ]).toArray()
703
+ },
704
+ {
705
+ id: 'support_ticket_billable_hours_per_user_per_month_last_6m',
706
+ prompt: 'Break up the support tickets last 6 months, give me a total per user per month of the amount of hours they are billing for',
707
+ minRows: 0,
708
+ query: { kind: 'aggregate', collection: 'support-tickets' },
709
+ notes: 'Zero rows are valid if support-ticket collection or ticket history is absent in this environment.',
710
+ run: async (ctx) => {
711
+ const collection = await resolveExistingCollection(ctx.db, ['support-tickets', 'supporttickets', 'support-ticket']);
712
+ if (!collection) {
713
+ return [];
714
+ }
715
+ return await ctx.db.collection(collection).aggregate([
716
+ {
717
+ $addFields: {
718
+ effective_date: { $ifNull: ['$date_created', '$createdAt'] },
719
+ effective_hours: { $ifNull: ['$billable_hours', { $ifNull: ['$estimated_billable_hours', 0] }] },
720
+ assigned_user_first: {
721
+ $let: {
722
+ vars: {
723
+ first_assigned: { $arrayElemAt: [{ $ifNull: ['$users_assigned', []] }, 0] }
724
+ },
725
+ in: {
726
+ $ifNull: ['$$first_assigned.user', '$$first_assigned.id_user']
727
+ }
728
+ }
729
+ }
730
+ }
731
+ },
732
+ {
733
+ $match: {
734
+ effective_date: { $gte: ctx.last6Months, $lt: ctx.now }
735
+ }
736
+ },
737
+ {
738
+ $group: {
739
+ _id: {
740
+ user: {
741
+ $ifNull: [
742
+ '$user_created',
743
+ {
744
+ $ifNull: [
745
+ '$client_user.user',
746
+ {
747
+ $ifNull: [
748
+ '$assigned_user_first',
749
+ { $ifNull: [{ $toString: '$id_user_created' }, 'Unknown User'] }
750
+ ]
751
+ }
752
+ ]
753
+ }
754
+ ]
755
+ },
756
+ month: { $dateToString: { format: '%Y-%m', date: '$effective_date', timezone: 'UTC' } }
757
+ },
758
+ billable_hours: { $sum: { $ifNull: ['$effective_hours', 0] } }
759
+ }
760
+ },
761
+ {
762
+ $project: {
763
+ _id: 0,
764
+ user: '$_id.user',
765
+ month: '$_id.month',
766
+ billable_hours: 1
767
+ }
768
+ },
769
+ { $sort: { user: 1, month: 1 } }
770
+ ]).toArray();
771
+ }
772
+ }
773
+ ];
774
+
775
+ async function resolveTargetBlendChemicalIds(db: any): Promise<Array<string>> {
776
+ const rows = await db.collection('chemicals')
777
+ .find(
778
+ { name: { $regex: 'Red\\s+Ultra\\s+Lift', $options: 'i' } },
779
+ { projection: { _id: 1 }, limit: 20 }
780
+ )
781
+ .toArray();
782
+ return rows.map((row: any) => String(row?._id || '')).filter(Boolean);
783
+ }
784
+
785
+ async function run(): Promise<void> {
786
+ const client = new MongoClient('mongodb://127.0.0.1:3001/?directConnection=true&serverSelectionTimeoutMS=5000');
787
+ await client.connect();
788
+ const db = client.db('resolveio');
789
+ const now = new Date();
790
+
791
+ const thisMonthStart = startOfMonthUtc(now);
792
+ const nextMonthStart = startOfMonthUtc(addMonthsUtc(thisMonthStart, 1));
793
+ const lastMonthStart = startOfMonthUtc(addMonthsUtc(thisMonthStart, -1));
794
+ const lastMonthEnd = thisMonthStart;
795
+ const context: EvalContext = {
796
+ db,
797
+ now,
798
+ startOfWeek: startOfWeekUtcMonday(now),
799
+ last30Days: addDaysUtc(now, -30),
800
+ last90Days: addDaysUtc(now, -90),
801
+ last2Weeks: addDaysUtc(now, -14),
802
+ last6Months: addMonthsUtc(now, -6),
803
+ thisMonthStart,
804
+ nextMonthStart,
805
+ lastMonthStart,
806
+ lastMonthEnd,
807
+ targetBlendChemicalIds: await resolveTargetBlendChemicalIds(db)
808
+ };
809
+
810
+ const caseFilter = String(process.env.AI_ASSISTANT_SNF_EVAL_CASES || '')
811
+ .split(',')
812
+ .map(value => value.trim())
813
+ .filter(Boolean);
814
+ const selectedCases = caseFilter.length
815
+ ? EVAL_CASES.filter(testCase => caseFilter.includes(testCase.id))
816
+ : EVAL_CASES;
817
+ if (!selectedCases.length) {
818
+ throw new Error('No matching SNF eval cases selected via AI_ASSISTANT_SNF_EVAL_CASES.');
819
+ }
820
+
821
+ const results: EvalResult[] = [];
822
+
823
+ for (const testCase of selectedCases) {
824
+ const classification = classifyAssistantRequestType(testCase.prompt);
825
+ const classificationPass = classification.type === 'data' && classification.dataQuestion === true;
826
+ try {
827
+ const rows = await testCase.run(context);
828
+ const rowCount = Array.isArray(rows) ? rows.length : 0;
829
+ const pass = classificationPass && rowCount >= testCase.minRows;
830
+ results.push({
831
+ id: testCase.id,
832
+ prompt: testCase.prompt,
833
+ classification: {
834
+ type: classification.type,
835
+ dataQuestion: classification.dataQuestion,
836
+ source: classification.source,
837
+ pass: classificationPass
838
+ },
839
+ query: testCase.query,
840
+ rowCount,
841
+ minRows: testCase.minRows,
842
+ pass,
843
+ notes: testCase.notes,
844
+ sample: rows.slice(0, 5)
845
+ });
846
+ }
847
+ catch (error: any) {
848
+ results.push({
849
+ id: testCase.id,
850
+ prompt: testCase.prompt,
851
+ classification: {
852
+ type: classification.type,
853
+ dataQuestion: classification.dataQuestion,
854
+ source: classification.source,
855
+ pass: classificationPass
856
+ },
857
+ query: testCase.query,
858
+ rowCount: 0,
859
+ minRows: testCase.minRows,
860
+ pass: false,
861
+ notes: testCase.notes,
862
+ sample: [],
863
+ error: String(error?.message || error || 'Unknown error')
864
+ });
865
+ }
866
+ }
867
+
868
+ await client.close();
869
+
870
+ const passCount = results.filter(result => result.pass).length;
871
+ const failCount = selectedCases.length - passCount;
872
+ const summary = {
873
+ total: selectedCases.length,
874
+ passed: passCount,
875
+ failed: failCount
876
+ };
877
+
878
+ const output = {
879
+ now: now.toISOString(),
880
+ window_utc: {
881
+ startOfWeek: context.startOfWeek.toISOString(),
882
+ last30Days: context.last30Days.toISOString(),
883
+ last90Days: context.last90Days.toISOString(),
884
+ last2Weeks: context.last2Weeks.toISOString(),
885
+ last6Months: context.last6Months.toISOString(),
886
+ thisMonthStart: context.thisMonthStart.toISOString(),
887
+ nextMonthStart: context.nextMonthStart.toISOString(),
888
+ lastMonthStart: context.lastMonthStart.toISOString(),
889
+ lastMonthEnd: context.lastMonthEnd.toISOString()
890
+ },
891
+ targetBlendChemicalIds: context.targetBlendChemicalIds,
892
+ summary,
893
+ results
894
+ };
895
+
896
+ const outputPath = path.join(process.cwd(), 'tmp', 'ai-assistant-snf-live-eval-output.json');
897
+ fs.writeFileSync(outputPath, JSON.stringify(output, null, 2));
898
+
899
+ console.log(`ai assistant snf live eval: ${passCount}/${selectedCases.length} passed`);
900
+ results.forEach((result) => {
901
+ const marker = result.pass ? 'PASS' : 'FAIL';
902
+ const classText = `${result.classification.type}/${result.classification.dataQuestion ? 'data' : 'non-data'}`;
903
+ console.log(`${marker} ${result.id} rows=${result.rowCount} class=${classText} query=${result.query.kind}:${result.query.collection}`);
904
+ if (result.error) {
905
+ console.log(` error=${result.error}`);
906
+ }
907
+ if (result.notes) {
908
+ console.log(` note=${result.notes}`);
909
+ }
910
+ });
911
+ console.log(`wrote ${outputPath}`);
912
+
913
+ if (failCount > 0) {
914
+ process.exitCode = 1;
915
+ }
916
+ }
917
+
918
+ run().catch((error) => {
919
+ console.error(error);
920
+ process.exit(1);
921
+ });