@resolveio/server-lib 22.3.219 → 22.3.221

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