@resolveio/server-lib 22.3.55 → 22.3.56

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 (691) hide show
  1. package/ai/assistant-core-heuristics.d.ts +11 -0
  2. package/ai/assistant-core-heuristics.js +356 -0
  3. package/ai/assistant-core-heuristics.js.map +1 -0
  4. package/ai/resolveio-platform-intelligence-memory-corpus.d.ts +3 -0
  5. package/ai/resolveio-platform-intelligence-memory-corpus.js +214 -0
  6. package/ai/resolveio-platform-intelligence-memory-corpus.js.map +1 -0
  7. package/ai/resolveio-platform-intelligence-memory.d.ts +20 -0
  8. package/ai/resolveio-platform-intelligence-memory.js +341 -0
  9. package/ai/resolveio-platform-intelligence-memory.js.map +1 -0
  10. package/{src/ai/resolveio-platform-intelligence-types.ts → ai/resolveio-platform-intelligence-types.d.ts} +15 -20
  11. package/ai/resolveio-platform-intelligence-types.js +4 -0
  12. package/ai/resolveio-platform-intelligence-types.js.map +1 -0
  13. package/ai/resolveio-platform-intelligence.d.ts +6 -0
  14. package/ai/resolveio-platform-intelligence.js +463 -0
  15. package/ai/resolveio-platform-intelligence.js.map +1 -0
  16. package/client-server-app.d.ts +1 -0
  17. package/client-server-app.js +68 -0
  18. package/client-server-app.js.map +1 -0
  19. package/collections/ai-terminal-conversation.collection.d.ts +2 -0
  20. package/collections/ai-terminal-conversation.collection.js +140 -0
  21. package/collections/ai-terminal-conversation.collection.js.map +1 -0
  22. package/collections/ai-terminal-issue-report.collection.d.ts +2 -0
  23. package/collections/ai-terminal-issue-report.collection.js +148 -0
  24. package/collections/ai-terminal-issue-report.collection.js.map +1 -0
  25. package/collections/ai-terminal-message.collection.d.ts +2 -0
  26. package/collections/ai-terminal-message.collection.js +121 -0
  27. package/collections/ai-terminal-message.collection.js.map +1 -0
  28. package/collections/app-setting.collection.d.ts +3 -0
  29. package/collections/app-setting.collection.js +103 -0
  30. package/collections/app-setting.collection.js.map +1 -0
  31. package/collections/app-status.collection.d.ts +3 -0
  32. package/collections/app-status.collection.js +57 -0
  33. package/collections/app-status.collection.js.map +1 -0
  34. package/collections/communication-metric.collection.d.ts +2 -0
  35. package/collections/communication-metric.collection.js +133 -0
  36. package/collections/communication-metric.collection.js.map +1 -0
  37. package/collections/counter.collection.d.ts +3 -0
  38. package/collections/counter.collection.js +56 -0
  39. package/collections/counter.collection.js.map +1 -0
  40. package/collections/cron-job-history.collection.d.ts +3 -0
  41. package/collections/cron-job-history.collection.js +137 -0
  42. package/collections/cron-job-history.collection.js.map +1 -0
  43. package/collections/cron-job.collection.d.ts +3 -0
  44. package/collections/cron-job.collection.js +92 -0
  45. package/collections/cron-job.collection.js.map +1 -0
  46. package/collections/customer-notification.collection.d.ts +3 -0
  47. package/collections/customer-notification.collection.js +130 -0
  48. package/collections/customer-notification.collection.js.map +1 -0
  49. package/collections/customer-portal-password.collection.d.ts +3 -0
  50. package/collections/customer-portal-password.collection.js +75 -0
  51. package/collections/customer-portal-password.collection.js.map +1 -0
  52. package/collections/email-history.collection.d.ts +3 -0
  53. package/collections/email-history.collection.js +127 -0
  54. package/collections/email-history.collection.js.map +1 -0
  55. package/collections/email-verified.collection.d.ts +3 -0
  56. package/collections/email-verified.collection.js +62 -0
  57. package/collections/email-verified.collection.js.map +1 -0
  58. package/collections/file.collection.d.ts +3 -0
  59. package/collections/file.collection.js +74 -0
  60. package/collections/file.collection.js.map +1 -0
  61. package/collections/flag-update.collection.d.ts +3 -0
  62. package/collections/flag-update.collection.js +57 -0
  63. package/collections/flag-update.collection.js.map +1 -0
  64. package/collections/flag.collection.d.ts +3 -0
  65. package/collections/flag.collection.js +57 -0
  66. package/collections/flag.collection.js.map +1 -0
  67. package/collections/log-method-latency.collection.d.ts +3 -0
  68. package/collections/log-method-latency.collection.js +77 -0
  69. package/collections/log-method-latency.collection.js.map +1 -0
  70. package/collections/log-subscription.collection.d.ts +3 -0
  71. package/collections/log-subscription.collection.js +80 -0
  72. package/collections/log-subscription.collection.js.map +1 -0
  73. package/collections/log.collection.d.ts +3 -0
  74. package/collections/log.collection.js +93 -0
  75. package/collections/log.collection.js.map +1 -0
  76. package/collections/logged-in-users.collection.d.ts +3 -0
  77. package/collections/logged-in-users.collection.js +67 -0
  78. package/collections/logged-in-users.collection.js.map +1 -0
  79. package/collections/monitor-cpu.collection.d.ts +3 -0
  80. package/collections/monitor-cpu.collection.js +65 -0
  81. package/collections/monitor-cpu.collection.js.map +1 -0
  82. package/collections/monitor-function.collection.d.ts +3 -0
  83. package/collections/monitor-function.collection.js +74 -0
  84. package/collections/monitor-function.collection.js.map +1 -0
  85. package/collections/monitor-memory.collection.d.ts +3 -0
  86. package/collections/monitor-memory.collection.js +77 -0
  87. package/collections/monitor-memory.collection.js.map +1 -0
  88. package/collections/monitor-mongo.collection.d.ts +3 -0
  89. package/collections/monitor-mongo.collection.js +71 -0
  90. package/collections/monitor-mongo.collection.js.map +1 -0
  91. package/collections/notification.collection.d.ts +3 -0
  92. package/collections/notification.collection.js +57 -0
  93. package/collections/notification.collection.js.map +1 -0
  94. package/collections/openai-usage-ledger.collection.d.ts +2 -0
  95. package/collections/openai-usage-ledger.collection.js +124 -0
  96. package/collections/openai-usage-ledger.collection.js.map +1 -0
  97. package/collections/report-builder-dashboard-builder.collection.d.ts +3 -0
  98. package/collections/report-builder-dashboard-builder.collection.js +109 -0
  99. package/collections/report-builder-dashboard-builder.collection.js.map +1 -0
  100. package/collections/report-builder-library.collection.d.ts +3 -0
  101. package/collections/report-builder-library.collection.js +87 -0
  102. package/collections/report-builder-library.collection.js.map +1 -0
  103. package/collections/report-builder-report.collection.d.ts +4 -0
  104. package/collections/report-builder-report.collection.js +184 -0
  105. package/collections/report-builder-report.collection.js.map +1 -0
  106. package/collections/user-group.collection.d.ts +4 -0
  107. package/collections/user-group.collection.js +89 -0
  108. package/collections/user-group.collection.js.map +1 -0
  109. package/collections/user-guide.collection.d.ts +3 -0
  110. package/collections/user-guide.collection.js +57 -0
  111. package/collections/user-guide.collection.js.map +1 -0
  112. package/collections/user.collection.d.ts +4 -0
  113. package/collections/user.collection.js +180 -0
  114. package/collections/user.collection.js.map +1 -0
  115. package/cron/cron.d.ts +14 -0
  116. package/cron/cron.js +216 -0
  117. package/cron/cron.js.map +1 -0
  118. package/fixtures/cron-jobs.d.ts +1 -0
  119. package/fixtures/cron-jobs.js +150 -0
  120. package/fixtures/cron-jobs.js.map +1 -0
  121. package/fixtures/init.d.ts +1 -0
  122. package/fixtures/init.js +91 -0
  123. package/fixtures/init.js.map +1 -0
  124. package/http/auth.d.ts +2 -0
  125. package/http/auth.js +906 -0
  126. package/http/auth.js.map +1 -0
  127. package/http/health.d.ts +1 -0
  128. package/http/health.js +11 -0
  129. package/http/health.js.map +1 -0
  130. package/http/home.d.ts +1 -0
  131. package/http/home.js +134 -0
  132. package/http/home.js.map +1 -0
  133. package/http/slow-query-publication.d.ts +2 -0
  134. package/http/slow-query-publication.js +99 -0
  135. package/http/slow-query-publication.js.map +1 -0
  136. package/index.d.ts +1 -0
  137. package/index.js +19 -0
  138. package/index.js.map +1 -0
  139. package/managers/ai-assistant-codex-manager.manager.d.ts +67 -0
  140. package/managers/ai-assistant-codex-manager.manager.js +1113 -0
  141. package/managers/ai-assistant-codex-manager.manager.js.map +1 -0
  142. package/managers/communication-metric.manager.d.ts +16 -0
  143. package/managers/communication-metric.manager.js +134 -0
  144. package/managers/communication-metric.manager.js.map +1 -0
  145. package/managers/cron.manager.d.ts +20 -0
  146. package/managers/cron.manager.js +534 -0
  147. package/managers/cron.manager.js.map +1 -0
  148. package/managers/customer-notification-content.manager.d.ts +55 -0
  149. package/managers/customer-notification-content.manager.js +158 -0
  150. package/managers/customer-notification-content.manager.js.map +1 -0
  151. package/managers/diagnostic-manager-bootstrap.d.ts +9 -0
  152. package/managers/diagnostic-manager-bootstrap.js +260 -0
  153. package/managers/diagnostic-manager-bootstrap.js.map +1 -0
  154. package/managers/error-auto-fix.manager.d.ts +149 -0
  155. package/managers/error-auto-fix.manager.js +3064 -0
  156. package/managers/error-auto-fix.manager.js.map +1 -0
  157. package/managers/local-log.manager.d.ts +18 -0
  158. package/managers/local-log.manager.js +88 -0
  159. package/managers/local-log.manager.js.map +1 -0
  160. package/managers/method.manager.d.ts +83 -0
  161. package/managers/method.manager.js +1941 -0
  162. package/managers/method.manager.js.map +1 -0
  163. package/managers/mongo.manager.d.ts +224 -0
  164. package/managers/mongo.manager.js +5000 -0
  165. package/managers/mongo.manager.js.map +1 -0
  166. package/managers/monitor.manager.d.ts +70 -0
  167. package/managers/monitor.manager.js +550 -0
  168. package/managers/monitor.manager.js.map +1 -0
  169. package/managers/openai-usage-ledger.manager.d.ts +15 -0
  170. package/managers/openai-usage-ledger.manager.js +144 -0
  171. package/managers/openai-usage-ledger.manager.js.map +1 -0
  172. package/managers/slow-query-verifier.manager.d.ts +144 -0
  173. package/managers/slow-query-verifier.manager.js +3857 -0
  174. package/managers/slow-query-verifier.manager.js.map +1 -0
  175. package/managers/slow-query.manager.d.ts +28 -0
  176. package/managers/slow-query.manager.js +468 -0
  177. package/managers/slow-query.manager.js.map +1 -0
  178. package/managers/subscription.manager.d.ts +169 -0
  179. package/managers/subscription.manager.js +3434 -0
  180. package/managers/subscription.manager.js.map +1 -0
  181. package/managers/websocket.manager.d.ts +73 -0
  182. package/managers/websocket.manager.js +673 -0
  183. package/managers/websocket.manager.js.map +1 -0
  184. package/managers/worker-dispatcher.manager.d.ts +120 -0
  185. package/managers/worker-dispatcher.manager.js +1266 -0
  186. package/managers/worker-dispatcher.manager.js.map +1 -0
  187. package/managers/worker-server.manager.d.ts +35 -0
  188. package/managers/worker-server.manager.js +582 -0
  189. package/managers/worker-server.manager.js.map +1 -0
  190. package/methods/accounts.d.ts +2 -0
  191. package/methods/accounts.js +624 -0
  192. package/methods/accounts.js.map +1 -0
  193. package/methods/ai-terminal.d.ts +336 -0
  194. package/methods/ai-terminal.js +22782 -0
  195. package/methods/ai-terminal.js.map +1 -0
  196. package/methods/app-settings.d.ts +2 -0
  197. package/methods/app-settings.js +169 -0
  198. package/methods/app-settings.js.map +1 -0
  199. package/methods/aws.d.ts +2 -0
  200. package/methods/aws.js +877 -0
  201. package/methods/aws.js.map +1 -0
  202. package/methods/collections.d.ts +2 -0
  203. package/methods/collections.js +719 -0
  204. package/methods/collections.js.map +1 -0
  205. package/methods/counters.d.ts +2 -0
  206. package/methods/counters.js +113 -0
  207. package/methods/counters.js.map +1 -0
  208. package/methods/cron-jobs.d.ts +2 -0
  209. package/methods/cron-jobs.js +2475 -0
  210. package/methods/cron-jobs.js.map +1 -0
  211. package/methods/customer-notifications.d.ts +2 -0
  212. package/methods/customer-notifications.js +528 -0
  213. package/methods/customer-notifications.js.map +1 -0
  214. package/methods/diagnostics.d.ts +2 -0
  215. package/methods/diagnostics.js +703 -0
  216. package/methods/diagnostics.js.map +1 -0
  217. package/methods/flag-updates.d.ts +2 -0
  218. package/methods/flag-updates.js +8 -0
  219. package/methods/flag-updates.js.map +1 -0
  220. package/methods/flags.d.ts +2 -0
  221. package/methods/flags.js +8 -0
  222. package/methods/flags.js.map +1 -0
  223. package/methods/logs.d.ts +2 -0
  224. package/methods/logs.js +751 -0
  225. package/methods/logs.js.map +1 -0
  226. package/methods/mongo-explorer.d.ts +2 -0
  227. package/methods/mongo-explorer.js +1808 -0
  228. package/methods/mongo-explorer.js.map +1 -0
  229. package/methods/monitor.d.ts +2 -0
  230. package/methods/monitor.js +543 -0
  231. package/methods/monitor.js.map +1 -0
  232. package/methods/pdf.d.ts +2 -0
  233. package/methods/pdf.js +1216 -0
  234. package/methods/pdf.js.map +1 -0
  235. package/methods/publications.d.ts +1 -0
  236. package/methods/publications.js +183 -0
  237. package/methods/publications.js.map +1 -0
  238. package/methods/report-builder.d.ts +2 -0
  239. package/methods/report-builder.js +3094 -0
  240. package/methods/report-builder.js.map +1 -0
  241. package/methods/support.d.ts +2 -0
  242. package/methods/support.js +430 -0
  243. package/methods/support.js.map +1 -0
  244. package/models/ai-terminal-conversation.model.d.ts +17 -0
  245. package/models/ai-terminal-conversation.model.js +4 -0
  246. package/models/ai-terminal-conversation.model.js.map +1 -0
  247. package/models/ai-terminal-issue-report.model.d.ts +19 -0
  248. package/models/ai-terminal-issue-report.model.js +4 -0
  249. package/models/ai-terminal-issue-report.model.js.map +1 -0
  250. package/models/ai-terminal-message.model.d.ts +22 -0
  251. package/models/ai-terminal-message.model.js +4 -0
  252. package/models/ai-terminal-message.model.js.map +1 -0
  253. package/models/app-setting.model.d.ts +16 -0
  254. package/models/app-setting.model.js +4 -0
  255. package/models/app-setting.model.js.map +1 -0
  256. package/{src/models/app-status.model.ts → models/app-status.model.d.ts} +2 -3
  257. package/models/app-status.model.js +4 -0
  258. package/models/app-status.model.js.map +1 -0
  259. package/{src/models/billing-logged-in-users.model.ts → models/billing-logged-in-users.model.d.ts} +4 -5
  260. package/models/billing-logged-in-users.model.js +4 -0
  261. package/models/billing-logged-in-users.model.js.map +1 -0
  262. package/models/collection-document.model.d.ts +21 -0
  263. package/models/collection-document.model.js +4 -0
  264. package/models/collection-document.model.js.map +1 -0
  265. package/models/communication-metric.model.d.ts +20 -0
  266. package/models/communication-metric.model.js +4 -0
  267. package/models/communication-metric.model.js.map +1 -0
  268. package/{src/models/counter.model.ts → models/counter.model.d.ts} +3 -4
  269. package/models/counter.model.js +4 -0
  270. package/models/counter.model.js.map +1 -0
  271. package/models/cron-job-history.model.d.ts +15 -0
  272. package/models/cron-job-history.model.js +4 -0
  273. package/models/cron-job-history.model.js.map +1 -0
  274. package/models/cron-job.model.d.ts +14 -0
  275. package/models/cron-job.model.js +4 -0
  276. package/models/cron-job.model.js.map +1 -0
  277. package/models/customer-notification.model.d.ts +26 -0
  278. package/models/customer-notification.model.js +4 -0
  279. package/models/customer-notification.model.js.map +1 -0
  280. package/models/customer-portal-password.model.d.ts +11 -0
  281. package/models/customer-portal-password.model.js +4 -0
  282. package/models/customer-portal-password.model.js.map +1 -0
  283. package/models/dialog.model.d.ts +23 -0
  284. package/models/dialog.model.js +4 -0
  285. package/models/dialog.model.js.map +1 -0
  286. package/models/email-history.model.d.ts +31 -0
  287. package/{src/models/email-history.model.ts → models/email-history.model.js} +4 -35
  288. package/models/email-history.model.js.map +1 -0
  289. package/{src/models/email-verified.model.ts → models/email-verified.model.d.ts} +5 -6
  290. package/models/email-verified.model.js +4 -0
  291. package/models/email-verified.model.js.map +1 -0
  292. package/{src/models/file.model.ts → models/file.model.d.ts} +7 -8
  293. package/models/file.model.js +4 -0
  294. package/models/file.model.js.map +1 -0
  295. package/{src/models/flag-update.model.ts → models/flag-update.model.d.ts} +3 -4
  296. package/models/flag-update.model.js +4 -0
  297. package/models/flag-update.model.js.map +1 -0
  298. package/{src/models/flag.model.ts → models/flag.model.d.ts} +3 -4
  299. package/models/flag.model.js +4 -0
  300. package/models/flag.model.js.map +1 -0
  301. package/models/log-method-latency.model.d.ts +10 -0
  302. package/models/log-method-latency.model.js +4 -0
  303. package/models/log-method-latency.model.js.map +1 -0
  304. package/{src/models/log-subscription.model.ts → models/log-subscription.model.d.ts} +9 -11
  305. package/models/log-subscription.model.js +4 -0
  306. package/models/log-subscription.model.js.map +1 -0
  307. package/models/log.model.d.ts +17 -0
  308. package/models/log.model.js +4 -0
  309. package/models/log.model.js.map +1 -0
  310. package/{src/models/logged-in-users.model.ts → models/logged-in-users.model.d.ts} +5 -6
  311. package/models/logged-in-users.model.js +4 -0
  312. package/models/logged-in-users.model.js.map +1 -0
  313. package/{src/models/method-response.model.ts → models/method-response.model.d.ts} +6 -7
  314. package/models/method-response.model.js +4 -0
  315. package/models/method-response.model.js.map +1 -0
  316. package/models/method.model.d.ts +26 -0
  317. package/models/method.model.js +4 -0
  318. package/models/method.model.js.map +1 -0
  319. package/{src/models/monitor-cpu.model.ts → models/monitor-cpu.model.d.ts} +7 -9
  320. package/models/monitor-cpu.model.js +4 -0
  321. package/models/monitor-cpu.model.js.map +1 -0
  322. package/models/monitor-function.model.d.ts +14 -0
  323. package/models/monitor-function.model.js +4 -0
  324. package/models/monitor-function.model.js.map +1 -0
  325. package/models/monitor-memory.model.d.ts +15 -0
  326. package/models/monitor-memory.model.js +4 -0
  327. package/models/monitor-memory.model.js.map +1 -0
  328. package/models/monitor-mongo.model.d.ts +13 -0
  329. package/models/monitor-mongo.model.js +4 -0
  330. package/models/monitor-mongo.model.js.map +1 -0
  331. package/{src/models/notification.model.ts → models/notification.model.d.ts} +4 -6
  332. package/models/notification.model.js +4 -0
  333. package/models/notification.model.js.map +1 -0
  334. package/models/openai-usage-ledger.model.d.ts +15 -0
  335. package/models/openai-usage-ledger.model.js +4 -0
  336. package/models/openai-usage-ledger.model.js.map +1 -0
  337. package/models/pagination.model.d.ts +11 -0
  338. package/models/pagination.model.js +28 -0
  339. package/models/pagination.model.js.map +1 -0
  340. package/models/permission.model.d.ts +12 -0
  341. package/models/permission.model.js +4 -0
  342. package/models/permission.model.js.map +1 -0
  343. package/models/report-builder-dashboard-builder.model.d.ts +25 -0
  344. package/models/report-builder-dashboard-builder.model.js +4 -0
  345. package/models/report-builder-dashboard-builder.model.js.map +1 -0
  346. package/models/report-builder-library.model.d.ts +17 -0
  347. package/models/report-builder-library.model.js +4 -0
  348. package/models/report-builder-library.model.js.map +1 -0
  349. package/models/report-builder-report.model.d.ts +121 -0
  350. package/models/report-builder-report.model.js +4 -0
  351. package/models/report-builder-report.model.js.map +1 -0
  352. package/models/report-builder.model.d.ts +61 -0
  353. package/models/report-builder.model.js +4 -0
  354. package/models/report-builder.model.js.map +1 -0
  355. package/models/select-data-label.model.d.ts +9 -0
  356. package/models/select-data-label.model.js +4 -0
  357. package/models/select-data-label.model.js.map +1 -0
  358. package/models/server-message.model.d.ts +32 -0
  359. package/models/server-message.model.js +4 -0
  360. package/models/server-message.model.js.map +1 -0
  361. package/models/slow-query-report.model.d.ts +23 -0
  362. package/models/slow-query-report.model.js +4 -0
  363. package/models/slow-query-report.model.js.map +1 -0
  364. package/models/subscription.model.d.ts +31 -0
  365. package/models/subscription.model.js +4 -0
  366. package/models/subscription.model.js.map +1 -0
  367. package/models/support-ticket.model.d.ts +87 -0
  368. package/models/support-ticket.model.js +4 -0
  369. package/models/support-ticket.model.js.map +1 -0
  370. package/models/user-group.model.d.ts +20 -0
  371. package/models/user-group.model.js +4 -0
  372. package/models/user-group.model.js.map +1 -0
  373. package/{src/models/user-guide.model.ts → models/user-guide.model.d.ts} +4 -5
  374. package/models/user-guide.model.js +4 -0
  375. package/models/user-guide.model.js.map +1 -0
  376. package/models/user.model.d.ts +84 -0
  377. package/models/user.model.js +4 -0
  378. package/models/user.model.js.map +1 -0
  379. package/package.json +1 -1
  380. package/private/images/ResolveIO.png +0 -0
  381. package/public_api.js +116 -0
  382. package/public_api.js.map +1 -0
  383. package/publications/ai-terminal.d.ts +1 -0
  384. package/publications/ai-terminal.js +122 -0
  385. package/publications/ai-terminal.js.map +1 -0
  386. package/publications/app-settings.d.ts +2 -0
  387. package/publications/app-settings.js +28 -0
  388. package/publications/app-settings.js.map +1 -0
  389. package/publications/app-status.d.ts +2 -0
  390. package/publications/app-status.js +16 -0
  391. package/publications/app-status.js.map +1 -0
  392. package/publications/cron-jobs.d.ts +2 -0
  393. package/publications/cron-jobs.js +88 -0
  394. package/publications/cron-jobs.js.map +1 -0
  395. package/publications/customer-notifications.d.ts +2 -0
  396. package/publications/customer-notifications.js +161 -0
  397. package/publications/customer-notifications.js.map +1 -0
  398. package/publications/files.d.ts +2 -0
  399. package/publications/files.js +36 -0
  400. package/publications/files.js.map +1 -0
  401. package/publications/flags-update.d.ts +2 -0
  402. package/publications/flags-update.js +22 -0
  403. package/publications/flags-update.js.map +1 -0
  404. package/publications/flags.d.ts +2 -0
  405. package/publications/flags.js +22 -0
  406. package/publications/flags.js.map +1 -0
  407. package/publications/logs.d.ts +2 -0
  408. package/publications/logs.js +164 -0
  409. package/publications/logs.js.map +1 -0
  410. package/publications/notifications.d.ts +2 -0
  411. package/publications/notifications.js +16 -0
  412. package/publications/notifications.js.map +1 -0
  413. package/publications/report-builder-dashboard-builders.d.ts +2 -0
  414. package/publications/report-builder-dashboard-builders.js +42 -0
  415. package/publications/report-builder-dashboard-builders.js.map +1 -0
  416. package/publications/report-builder-libraries.d.ts +2 -0
  417. package/publications/report-builder-libraries.js +90 -0
  418. package/publications/report-builder-libraries.js.map +1 -0
  419. package/publications/report-builder-reports.d.ts +2 -0
  420. package/publications/report-builder-reports.js +50 -0
  421. package/publications/report-builder-reports.js.map +1 -0
  422. package/publications/super-admin.d.ts +2 -0
  423. package/publications/super-admin.js +16 -0
  424. package/publications/super-admin.js.map +1 -0
  425. package/publications/user-groups.d.ts +1 -0
  426. package/publications/user-groups.js +16 -0
  427. package/publications/user-groups.js.map +1 -0
  428. package/publications/user-guides.d.ts +1 -0
  429. package/publications/user-guides.js +16 -0
  430. package/publications/user-guides.js.map +1 -0
  431. package/resolveio-server-app.d.ts +70 -0
  432. package/resolveio-server-app.js +801 -0
  433. package/resolveio-server-app.js.map +1 -0
  434. package/server-app.d.ts +228 -0
  435. package/server-app.js +3566 -0
  436. package/server-app.js.map +1 -0
  437. package/services/codex-client.d.ts +126 -0
  438. package/services/codex-client.js +1622 -0
  439. package/services/codex-client.js.map +1 -0
  440. package/services/openai-client.d.ts +46 -0
  441. package/services/openai-client.js +318 -0
  442. package/services/openai-client.js.map +1 -0
  443. package/types/error-report.d.ts +25 -0
  444. package/types/error-report.js +4 -0
  445. package/types/error-report.js.map +1 -0
  446. package/types/slow-query-report.d.ts +27 -0
  447. package/types/slow-query-report.js +6 -0
  448. package/types/slow-query-report.js.map +1 -0
  449. package/util/ai-qa-policy.d.ts +124 -0
  450. package/util/ai-qa-policy.js +707 -0
  451. package/util/ai-qa-policy.js.map +1 -0
  452. package/util/ai-runner-artifacts.d.ts +74 -0
  453. package/util/ai-runner-artifacts.js +531 -0
  454. package/util/ai-runner-artifacts.js.map +1 -0
  455. package/util/ai-runner-qa-auth.d.ts +5 -0
  456. package/util/ai-runner-qa-auth.js +357 -0
  457. package/util/ai-runner-qa-auth.js.map +1 -0
  458. package/util/ai-runner-qa-tools.d.ts +19 -0
  459. package/util/ai-runner-qa-tools.js +696 -0
  460. package/util/ai-runner-qa-tools.js.map +1 -0
  461. package/util/common.d.ts +31 -0
  462. package/util/common.js +683 -0
  463. package/util/common.js.map +1 -0
  464. package/util/customer-portal-password.d.ts +13 -0
  465. package/util/customer-portal-password.js +209 -0
  466. package/util/customer-portal-password.js.map +1 -0
  467. package/util/error-reporter.d.ts +52 -0
  468. package/util/error-reporter.js +326 -0
  469. package/util/error-reporter.js.map +1 -0
  470. package/util/error-tracking.d.ts +13 -0
  471. package/util/error-tracking.js +120 -0
  472. package/util/error-tracking.js.map +1 -0
  473. package/util/report-builder-unwinds.d.ts +15 -0
  474. package/util/report-builder-unwinds.js +156 -0
  475. package/util/report-builder-unwinds.js.map +1 -0
  476. package/util/runner-process-janitor.d.ts +25 -0
  477. package/util/runner-process-janitor.js +186 -0
  478. package/util/runner-process-janitor.js.map +1 -0
  479. package/util/schema-report-builder.d.ts +6 -0
  480. package/util/schema-report-builder.js +481 -0
  481. package/util/schema-report-builder.js.map +1 -0
  482. package/util/slow-query-reporter.d.ts +28 -0
  483. package/util/slow-query-reporter.js +226 -0
  484. package/util/slow-query-reporter.js.map +1 -0
  485. package/util/subscription-dependency-context.d.ts +34 -0
  486. package/util/subscription-dependency-context.js +1283 -0
  487. package/util/subscription-dependency-context.js.map +1 -0
  488. package/util/tokenizer.d.ts +5 -0
  489. package/util/tokenizer.js +41 -0
  490. package/util/tokenizer.js.map +1 -0
  491. package/workers/codex-runner.worker.d.ts +1 -0
  492. package/workers/codex-runner.worker.js +192 -0
  493. package/workers/codex-runner.worker.js.map +1 -0
  494. package/.nodemon.json +0 -5
  495. package/.vscode/settings.json +0 -21
  496. package/AGENTS.md +0 -189
  497. package/README.md +0 -22
  498. package/build_package.sh +0 -5
  499. package/compileDTS.pl +0 -64
  500. package/docs/ai-assistant-nightly-eval.md +0 -65
  501. package/docs/ai-assistant-preflight-checklist.md +0 -23
  502. package/docs/ai-assistant-report-builder-bridge-playbook.md +0 -115
  503. package/eslint-plugin-custom/index.js +0 -7
  504. package/eslint-plugin-custom/rules/no-filter-zero-index.js +0 -44
  505. package/eslint.config.js +0 -103
  506. package/gulpfile.js +0 -216
  507. package/methodAndPublicationListGenerator.py +0 -375
  508. package/mongodbensurers.js +0 -2
  509. package/mongostop.js +0 -3
  510. package/scripts/cleanup-bypassed-callmethod-logs.js +0 -616
  511. package/settings.development.json +0 -25
  512. package/settings.development.redacted.json +0 -25
  513. package/src/.env +0 -12
  514. package/src/ai/assistant-core-heuristics.ts +0 -379
  515. package/src/ai/resolveio-platform-intelligence-memory-corpus.ts +0 -185
  516. package/src/ai/resolveio-platform-intelligence-memory.ts +0 -325
  517. package/src/ai/resolveio-platform-intelligence.ts +0 -462
  518. package/src/client-server-app.ts +0 -12
  519. package/src/collections/ai-terminal-conversation.collection.ts +0 -91
  520. package/src/collections/ai-terminal-issue-report.collection.ts +0 -99
  521. package/src/collections/ai-terminal-message.collection.ts +0 -77
  522. package/src/collections/app-setting.collection.ts +0 -104
  523. package/src/collections/app-status.collection.ts +0 -58
  524. package/src/collections/communication-metric.collection.ts +0 -84
  525. package/src/collections/counter.collection.ts +0 -56
  526. package/src/collections/cron-job-history.collection.ts +0 -94
  527. package/src/collections/cron-job.collection.ts +0 -92
  528. package/src/collections/customer-notification.collection.ts +0 -131
  529. package/src/collections/customer-portal-password.collection.ts +0 -76
  530. package/src/collections/email-history.collection.ts +0 -127
  531. package/src/collections/email-verified.collection.ts +0 -62
  532. package/src/collections/file.collection.ts +0 -74
  533. package/src/collections/flag-update.collection.ts +0 -57
  534. package/src/collections/flag.collection.ts +0 -57
  535. package/src/collections/log-method-latency.collection.ts +0 -77
  536. package/src/collections/log-subscription.collection.ts +0 -80
  537. package/src/collections/log.collection.ts +0 -93
  538. package/src/collections/logged-in-users.collection.ts +0 -67
  539. package/src/collections/monitor-cpu.collection.ts +0 -65
  540. package/src/collections/monitor-function.collection.ts +0 -74
  541. package/src/collections/monitor-memory.collection.ts +0 -77
  542. package/src/collections/monitor-mongo.collection.ts +0 -71
  543. package/src/collections/notification.collection.ts +0 -57
  544. package/src/collections/openai-usage-ledger.collection.ts +0 -77
  545. package/src/collections/report-builder-dashboard-builder.collection.ts +0 -109
  546. package/src/collections/report-builder-library.collection.ts +0 -89
  547. package/src/collections/report-builder-report.collection.ts +0 -184
  548. package/src/collections/user-group.collection.ts +0 -89
  549. package/src/collections/user-guide.collection.ts +0 -57
  550. package/src/collections/user.collection.ts +0 -181
  551. package/src/cron/cron.ts +0 -117
  552. package/src/fixtures/cron-jobs.ts +0 -95
  553. package/src/fixtures/init.ts +0 -35
  554. package/src/http/auth.ts +0 -764
  555. package/src/http/health.ts +0 -7
  556. package/src/http/home.ts +0 -90
  557. package/src/http/slow-query-publication.ts +0 -49
  558. package/src/index.ts +0 -1
  559. package/src/managers/ai-assistant-codex-manager.manager.ts +0 -1131
  560. package/src/managers/communication-metric.manager.ts +0 -82
  561. package/src/managers/cron.manager.ts +0 -333
  562. package/src/managers/customer-notification-content.manager.ts +0 -236
  563. package/src/managers/diagnostic-manager-bootstrap.ts +0 -165
  564. package/src/managers/error-auto-fix.manager.ts +0 -2767
  565. package/src/managers/local-log.manager.ts +0 -113
  566. package/src/managers/method.manager.ts +0 -1827
  567. package/src/managers/mongo.manager.ts +0 -4575
  568. package/src/managers/monitor.manager.ts +0 -507
  569. package/src/managers/openai-usage-ledger.manager.ts +0 -116
  570. package/src/managers/slow-query-verifier.manager.ts +0 -3590
  571. package/src/managers/slow-query.manager.ts +0 -519
  572. package/src/managers/subscription.manager.ts +0 -3128
  573. package/src/managers/websocket.manager.ts +0 -746
  574. package/src/managers/worker-dispatcher.manager.ts +0 -1360
  575. package/src/managers/worker-server.manager.ts +0 -536
  576. package/src/methods/accounts.ts +0 -532
  577. package/src/methods/ai-terminal.ts +0 -23134
  578. package/src/methods/app-settings.ts +0 -114
  579. package/src/methods/aws.ts +0 -649
  580. package/src/methods/collections.ts +0 -641
  581. package/src/methods/counters.ts +0 -69
  582. package/src/methods/cron-jobs.ts +0 -2614
  583. package/src/methods/customer-notifications.ts +0 -458
  584. package/src/methods/diagnostics.ts +0 -616
  585. package/src/methods/flag-updates.ts +0 -7
  586. package/src/methods/flags.ts +0 -7
  587. package/src/methods/logs.ts +0 -657
  588. package/src/methods/mongo-explorer.ts +0 -1880
  589. package/src/methods/monitor.ts +0 -540
  590. package/src/methods/pdf.ts +0 -1236
  591. package/src/methods/publications.ts +0 -129
  592. package/src/methods/report-builder.ts +0 -3300
  593. package/src/methods/support.ts +0 -335
  594. package/src/models/ai-terminal-conversation.model.ts +0 -19
  595. package/src/models/ai-terminal-issue-report.model.ts +0 -21
  596. package/src/models/ai-terminal-message.model.ts +0 -24
  597. package/src/models/app-setting.model.ts +0 -17
  598. package/src/models/collection-document.model.ts +0 -24
  599. package/src/models/communication-metric.model.ts +0 -23
  600. package/src/models/cron-job-history.model.ts +0 -16
  601. package/src/models/cron-job.model.ts +0 -15
  602. package/src/models/customer-notification.model.ts +0 -28
  603. package/src/models/customer-portal-password.model.ts +0 -12
  604. package/src/models/dialog.model.ts +0 -25
  605. package/src/models/log-method-latency.model.ts +0 -11
  606. package/src/models/log.model.ts +0 -19
  607. package/src/models/method.model.ts +0 -25
  608. package/src/models/monitor-function.model.ts +0 -16
  609. package/src/models/monitor-memory.model.ts +0 -17
  610. package/src/models/monitor-mongo.model.ts +0 -15
  611. package/src/models/openai-usage-ledger.model.ts +0 -16
  612. package/src/models/pagination.model.ts +0 -35
  613. package/src/models/permission.model.ts +0 -14
  614. package/src/models/report-builder-dashboard-builder.model.ts +0 -29
  615. package/src/models/report-builder-library.model.ts +0 -20
  616. package/src/models/report-builder-report.model.ts +0 -136
  617. package/src/models/report-builder.model.ts +0 -68
  618. package/src/models/select-data-label.model.ts +0 -9
  619. package/src/models/server-message.model.ts +0 -31
  620. package/src/models/slow-query-report.model.ts +0 -23
  621. package/src/models/subscription.model.ts +0 -73
  622. package/src/models/support-ticket.model.ts +0 -104
  623. package/src/models/user-group.model.ts +0 -24
  624. package/src/models/user.model.ts +0 -96
  625. package/src/private/images/ResolveIO.png +0 -0
  626. package/src/publications/ai-terminal.ts +0 -73
  627. package/src/publications/app-settings.ts +0 -25
  628. package/src/publications/app-status.ts +0 -13
  629. package/src/publications/cron-jobs.ts +0 -40
  630. package/src/publications/customer-notifications.ts +0 -101
  631. package/src/publications/files.ts +0 -33
  632. package/src/publications/flags-update.ts +0 -19
  633. package/src/publications/flags.ts +0 -19
  634. package/src/publications/logs.ts +0 -163
  635. package/src/publications/notifications.ts +0 -13
  636. package/src/publications/report-builder-dashboard-builders.ts +0 -39
  637. package/src/publications/report-builder-libraries.ts +0 -41
  638. package/src/publications/report-builder-reports.ts +0 -47
  639. package/src/publications/super-admin.ts +0 -13
  640. package/src/publications/user-groups.ts +0 -12
  641. package/src/publications/user-guides.ts +0 -12
  642. package/src/resolveio-server-app.ts +0 -617
  643. package/src/server-app.ts +0 -3354
  644. package/src/services/codex-client.ts +0 -1223
  645. package/src/services/openai-client.ts +0 -265
  646. package/src/types/error-report.ts +0 -26
  647. package/src/types/js-tiktoken.d.ts +0 -11
  648. package/src/types/slow-query-report.ts +0 -28
  649. package/src/util/ai-qa-policy.ts +0 -879
  650. package/src/util/ai-runner-artifacts.ts +0 -430
  651. package/src/util/ai-runner-qa-auth.ts +0 -356
  652. package/src/util/ai-runner-qa-tools.ts +0 -708
  653. package/src/util/common.ts +0 -649
  654. package/src/util/customer-portal-password.ts +0 -183
  655. package/src/util/error-reporter.ts +0 -332
  656. package/src/util/error-tracking.ts +0 -79
  657. package/src/util/report-builder-unwinds.ts +0 -180
  658. package/src/util/runner-process-janitor.ts +0 -195
  659. package/src/util/schema-report-builder.ts +0 -448
  660. package/src/util/slow-query-reporter.ts +0 -216
  661. package/src/util/subscription-dependency-context.ts +0 -1096
  662. package/src/util/tokenizer.ts +0 -38
  663. package/src/workers/codex-runner.worker.ts +0 -142
  664. package/start_server.sh +0 -5
  665. package/tests/ai-assistant-corpus-build.ts +0 -484
  666. package/tests/ai-assistant-corpus-replay-e2e.ts +0 -774
  667. package/tests/ai-assistant-data-parity-e2e.ts +0 -1989
  668. package/tests/ai-assistant-eval-triage.ts +0 -831
  669. package/tests/ai-assistant-openai-e2e.ts +0 -1061
  670. package/tests/ai-assistant-openai-git-e2e.ts +0 -155
  671. package/tests/ai-assistant-preflight-matrix.ts +0 -215
  672. package/tests/ai-assistant-routing-eval.test.ts +0 -560
  673. package/tests/ai-assistant-snf-live-eval.ts +0 -975
  674. package/tests/ai-assistant-utils.test.ts +0 -2968
  675. package/tests/ai-runner-contract.test.ts +0 -287
  676. package/tests/error-reporter.test.ts +0 -145
  677. package/tests/method-publication-generator.test.ts +0 -46
  678. package/tests/report-builder-linking.test.ts +0 -79
  679. package/tests/resolveio-platform-intelligence.test.ts +0 -352
  680. package/tests/server-app-cron-owner.test.ts +0 -127
  681. package/tests/subscription-connect-race.test.ts +0 -158
  682. package/tests/subscription-dependency-context.test.ts +0 -324
  683. package/tests/subscription-manager-collection-tracking.test.ts +0 -86
  684. package/tests/subscription-manager-invalidation.test.ts +0 -86
  685. package/tsconfig.json +0 -34
  686. /package/{src/private → private}/email-templates/enrollment.html +0 -0
  687. /package/{src/private → private}/email-templates/forgot-password.html +0 -0
  688. /package/{src/private → private}/email-templates/support-ticket-deleted.html +0 -0
  689. /package/{src/private → private}/email-templates/support-ticket-modified.html +0 -0
  690. /package/{src/private → private}/email-templates/support-ticket.html +0 -0
  691. /package/{src/public_api.ts → public_api.d.ts} +0 -0
@@ -1,774 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { ResolveIOServer } from '../src/resolveio-server-app';
4
- import { classifyAssistantRequestType } from '../src/methods/ai-terminal';
5
-
6
- type CorpusPromptEntry = {
7
- id?: string;
8
- prompt?: string;
9
- score?: number;
10
- };
11
-
12
- type CorpusFile = {
13
- prompts?: CorpusPromptEntry[];
14
- };
15
-
16
- type ReplayResult = {
17
- id: string;
18
- prompt: string;
19
- pass: boolean;
20
- errors: string[];
21
- conversationId?: string;
22
- classification?: {
23
- type?: string;
24
- dataQuestion?: boolean;
25
- source?: string;
26
- };
27
- tool?: {
28
- type?: string;
29
- collection?: string;
30
- rowCount?: number;
31
- total?: number | null;
32
- columns?: string[];
33
- source?: string;
34
- };
35
- };
36
-
37
- type AssistantDirective = {
38
- type: 'read' | 'aggregate';
39
- payload: Record<string, any>;
40
- source: 'metadata.debug.directive' | 'assistant.directive_line';
41
- };
42
-
43
- function parseBoolean(value: any): boolean {
44
- return ['true', '1', 'yes', 'y', 'on'].includes(String(value || '').trim().toLowerCase());
45
- }
46
-
47
- function normalizeOptionalString(value: any): string {
48
- return String(value ?? '').trim();
49
- }
50
-
51
- function parseInteger(value: any, fallback: number, min: number, max: number): number {
52
- const parsed = Number(value);
53
- if (!Number.isFinite(parsed)) {
54
- return fallback;
55
- }
56
- return Math.min(Math.max(Math.round(parsed), min), max);
57
- }
58
-
59
- function loadDotEnvFile(filePath: string): Record<string, string> {
60
- const parsed: Record<string, string> = {};
61
- if (!fs.existsSync(filePath)) {
62
- return parsed;
63
- }
64
- const content = fs.readFileSync(filePath, 'utf8');
65
- content.split(/\r?\n/g).forEach((lineRaw) => {
66
- const line = lineRaw.trim();
67
- if (!line || line.startsWith('#')) {
68
- return;
69
- }
70
- const jsonLike = line.match(/^"([A-Za-z_][A-Za-z0-9_]*)"\s*:\s*(.+?)\s*,?$/);
71
- if (jsonLike?.[1]) {
72
- const key = jsonLike[1];
73
- let value = String(jsonLike[2] || '').trim();
74
- if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith('\'') && value.endsWith('\''))) {
75
- value = value.slice(1, -1);
76
- }
77
- if (key) {
78
- parsed[key] = value;
79
- }
80
- return;
81
- }
82
- const separator = line.indexOf('=');
83
- if (separator <= 0) {
84
- return;
85
- }
86
- const key = line.slice(0, separator).trim();
87
- let value = line.slice(separator + 1).trim();
88
- if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith('\'') && value.endsWith('\''))) {
89
- value = value.slice(1, -1);
90
- }
91
- if (key) {
92
- parsed[key] = value;
93
- }
94
- });
95
- return parsed;
96
- }
97
-
98
- function applyEnvFromServerDir(serverDir: string): void {
99
- const envFiles = [
100
- path.join(serverDir, '.env.codex'),
101
- path.join(serverDir, '.env.production'),
102
- path.join(serverDir, '.env')
103
- ];
104
- envFiles.forEach((filePath) => {
105
- const values = loadDotEnvFile(filePath);
106
- Object.keys(values).forEach((key) => {
107
- if (!process.env[key]) {
108
- process.env[key] = values[key];
109
- }
110
- });
111
- });
112
- }
113
-
114
- async function sleep(ms: number): Promise<void> {
115
- return await new Promise(resolve => setTimeout(resolve, ms));
116
- }
117
-
118
- async function pollFinalAssistantMessage(db: any, idConversation: string, timeoutMs = 180000): Promise<any> {
119
- const started = Date.now();
120
- while (Date.now() - started < timeoutMs) {
121
- const message = await db.collection('ai-terminal-messages').findOne(
122
- { id_conversation: idConversation, role: 'assistant' },
123
- { sort: { createdAt: -1 } }
124
- );
125
- if (message && message?.metadata?.pending !== true) {
126
- return message;
127
- }
128
- await sleep(1200);
129
- }
130
- throw new Error(`Timed out waiting for final assistant message (${idConversation}).`);
131
- }
132
-
133
- function buildMethodContext(methodManager: any, idUser: string): any {
134
- return Object.assign({}, methodManager, Object.getPrototypeOf(methodManager), {
135
- id_user: idUser,
136
- user: 'AI Corpus Replay',
137
- id_ws: 'ai-assistant-corpus-replay-e2e'
138
- });
139
- }
140
-
141
- async function callMethodAsUser(methodManager: any, idUser: string, method: string, payload: Record<string, any>): Promise<any> {
142
- const ctx = buildMethodContext(methodManager, idUser);
143
- return await methodManager.callMethod.call(ctx, method, payload);
144
- }
145
-
146
- async function findSuperAdminUserId(db: any): Promise<string> {
147
- const user = await db.collection('users').findOne(
148
- { 'roles.super_admin': true },
149
- { projection: { _id: 1 }, sort: { updatedAt: -1, createdAt: -1 } }
150
- );
151
- if (!user?._id) {
152
- throw new Error('Could not find super admin user.');
153
- }
154
- return String(user._id);
155
- }
156
-
157
- async function runPrompt(methodManager: any, db: any, idUser: string, prompt: string, appId: string): Promise<{ conversationId: string; message: any }> {
158
- const model = String(process.env.AI_ASSISTANT_CODEX_MODEL || process.env.OPENAI_MODEL || '').trim();
159
- const payload = {
160
- message: prompt,
161
- id_app: appId,
162
- max_history: 0,
163
- config: {
164
- ...(model ? { model } : {})
165
- }
166
- };
167
- const response = await callMethodAsUser(methodManager, idUser, 'aiCoderTerminalRunCodex', payload);
168
- const conversationId = String(response?.conversation?._id || response?.conversation?.id_conversation || '').trim();
169
- if (!conversationId) {
170
- throw new Error('No conversation id returned from aiCoderTerminalRunCodex.');
171
- }
172
- const message = await pollFinalAssistantMessage(db, conversationId);
173
- return { conversationId, message };
174
- }
175
-
176
- function parseDirectiveLine(content: string): AssistantDirective | null {
177
- const lines = String(content || '').split(/\r?\n/g);
178
- for (const lineRaw of lines) {
179
- const line = lineRaw.trim();
180
- if (!line) {
181
- continue;
182
- }
183
- const readPrefix = 'REPORT_BUILDER_READ:';
184
- const aggPrefix = 'REPORT_BUILDER_AGG:';
185
- let type: AssistantDirective['type'] | null = null;
186
- let jsonText = '';
187
- if (line.startsWith(readPrefix)) {
188
- type = 'read';
189
- jsonText = line.slice(readPrefix.length).trim();
190
- }
191
- else if (line.startsWith(aggPrefix)) {
192
- type = 'aggregate';
193
- jsonText = line.slice(aggPrefix.length).trim();
194
- }
195
- if (!type || !jsonText) {
196
- continue;
197
- }
198
- try {
199
- const payload = JSON.parse(jsonText);
200
- if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
201
- continue;
202
- }
203
- return {
204
- type,
205
- payload,
206
- source: 'assistant.directive_line'
207
- };
208
- }
209
- catch {
210
- continue;
211
- }
212
- }
213
- return null;
214
- }
215
-
216
- function extractDirectiveFromMessage(message: any): AssistantDirective | null {
217
- const debugDirective = message?.metadata?.debug?.directive;
218
- if (debugDirective && typeof debugDirective === 'object') {
219
- const normalizedType = normalizeOptionalString(debugDirective?.type).toLowerCase();
220
- if ((normalizedType === 'read' || normalizedType === 'aggregate')
221
- && debugDirective.payload
222
- && typeof debugDirective.payload === 'object'
223
- && !Array.isArray(debugDirective.payload)) {
224
- return {
225
- type: normalizedType as AssistantDirective['type'],
226
- payload: debugDirective.payload,
227
- source: 'metadata.debug.directive'
228
- };
229
- }
230
- const rawLineDirective = parseDirectiveLine(normalizeOptionalString(debugDirective?.rawLine));
231
- if (rawLineDirective) {
232
- return {
233
- ...rawLineDirective,
234
- source: 'metadata.debug.directive'
235
- };
236
- }
237
- }
238
- return parseDirectiveLine(normalizeOptionalString(message?.content));
239
- }
240
-
241
- function buildSyntheticToolResultFromDirective(directive: AssistantDirective, methodResponse: any): any {
242
- const display = methodResponse?.display && typeof methodResponse.display === 'object'
243
- ? methodResponse.display
244
- : {
245
- columns: [] as string[],
246
- rows: [] as Array<Record<string, any>>,
247
- rowCount: 0,
248
- truncated: false
249
- };
250
- const rowCount = Array.isArray(methodResponse?.documents)
251
- ? methodResponse.documents.length
252
- : Number(display?.rowCount || 0);
253
- const total = typeof methodResponse?.total === 'number' ? methodResponse.total : undefined;
254
- const collection = normalizeOptionalString(methodResponse?.debug?.collectionResolved)
255
- || normalizeOptionalString(methodResponse?.debug?.collection)
256
- || normalizeOptionalString(directive.payload?.collection);
257
- return {
258
- type: directive.type === 'aggregate' ? 'mongo_agg' : 'mongo_read',
259
- input: directive.payload,
260
- output: {
261
- display,
262
- total,
263
- collection: collection || undefined,
264
- rowCount,
265
- columns: Array.isArray(display?.columns) ? display.columns : [],
266
- truncated: display?.truncated === true
267
- }
268
- };
269
- }
270
-
271
- function toNormalizedKey(value: string): string {
272
- return String(value || '').toLowerCase().replace(/[^a-z0-9]+/g, '');
273
- }
274
-
275
- function parseNumericLoose(value: any): number | null {
276
- if (typeof value === 'number' && Number.isFinite(value)) {
277
- return value;
278
- }
279
- if (typeof value !== 'string') {
280
- return null;
281
- }
282
- const trimmed = value.trim();
283
- if (!trimmed) {
284
- return null;
285
- }
286
- const normalized = trimmed
287
- .replace(/\$/g, '')
288
- .replace(/,/g, '')
289
- .replace(/%/g, '')
290
- .replace(/\s+/g, '');
291
- if (!normalized || !/^[-+]?\d*\.?\d+$/.test(normalized)) {
292
- return null;
293
- }
294
- const parsed = Number(normalized);
295
- return Number.isFinite(parsed) ? parsed : null;
296
- }
297
-
298
- function normalizeCellValue(value: any): any {
299
- const numeric = parseNumericLoose(value);
300
- if (numeric !== null) {
301
- return Number(numeric.toFixed(6));
302
- }
303
- if (value instanceof Date) {
304
- return value.toISOString();
305
- }
306
- if (typeof value === 'string') {
307
- const trimmed = value.trim();
308
- const maybeDate = /[0-9]{4}-[0-9]{2}-[0-9]{2}/.test(trimmed) ? Date.parse(trimmed) : Number.NaN;
309
- if (Number.isFinite(maybeDate)) {
310
- return new Date(maybeDate).toISOString();
311
- }
312
- return trimmed;
313
- }
314
- if (value === undefined) {
315
- return null;
316
- }
317
- return value;
318
- }
319
-
320
- function normalizeDisplayRows(display: any): Array<Record<string, any>> {
321
- const rows = Array.isArray(display?.rows) ? display.rows : [];
322
- return rows.map((row: any) => {
323
- const next: Record<string, any> = {};
324
- Object.keys(row || {}).forEach((key) => {
325
- next[toNormalizedKey(key)] = normalizeCellValue((row as any)[key]);
326
- });
327
- return next;
328
- });
329
- }
330
-
331
- function normalizeDisplayColumns(display: any): string[] {
332
- const columns = Array.isArray(display?.columns) ? display.columns : [];
333
- return columns.map((column: any) => toNormalizedKey(String(column || ''))).filter(Boolean).sort();
334
- }
335
-
336
- function collectMonthColumns(columns: string[]): string[] {
337
- return columns.filter(column => /^\d{4}-\d{2}$/.test(String(column || '').trim()));
338
- }
339
-
340
- function parseMonthlyTotalsFromDisplay(display: any): Map<string, number> | null {
341
- if (!display || !Array.isArray(display.columns) || !Array.isArray(display.rows) || !display.rows.length) {
342
- return null;
343
- }
344
- const columns = display.columns.map((column: any) => String(column || '').trim());
345
- const monthColumns = collectMonthColumns(columns);
346
- if (monthColumns.length) {
347
- const firstColumn = columns[0] || '';
348
- const normalizedFirst = toNormalizedKey(firstColumn);
349
- if (normalizedFirst === 'metric') {
350
- const metricRow = display.rows.find((row: any) => {
351
- const metricValue = String(row?.[firstColumn] || '').toLowerCase();
352
- return metricValue.includes('revenue') || metricValue.includes('total');
353
- }) || display.rows[0];
354
- const result = new Map<string, number>();
355
- monthColumns.forEach((month) => {
356
- const numeric = parseNumericLoose(metricRow?.[month]);
357
- if (numeric !== null) {
358
- result.set(month, numeric);
359
- }
360
- });
361
- return result.size ? result : null;
362
- }
363
- const result = new Map<string, number>();
364
- monthColumns.forEach((month) => {
365
- let sum = 0;
366
- display.rows.forEach((row: any) => {
367
- const numeric = parseNumericLoose(row?.[month]);
368
- if (numeric !== null) {
369
- sum += numeric;
370
- }
371
- });
372
- result.set(month, sum);
373
- });
374
- return result;
375
- }
376
- const normalizedColumns = columns.map(toNormalizedKey);
377
- const monthColumnIndex = normalizedColumns.findIndex((column) => column.includes('month'));
378
- const totalColumnIndex = normalizedColumns.findIndex((column) => column.includes('revenue') || column.includes('total'));
379
- if (monthColumnIndex === -1 || totalColumnIndex === -1) {
380
- return null;
381
- }
382
- const monthColumn = columns[monthColumnIndex];
383
- const totalColumn = columns[totalColumnIndex];
384
- const result = new Map<string, number>();
385
- display.rows.forEach((row: any) => {
386
- const monthValue = String(row?.[monthColumn] || '').trim();
387
- if (!/^\d{4}-\d{2}$/.test(monthValue)) {
388
- return;
389
- }
390
- const numeric = parseNumericLoose(row?.[totalColumn]);
391
- if (numeric === null) {
392
- return;
393
- }
394
- result.set(monthValue, (result.get(monthValue) || 0) + numeric);
395
- });
396
- return result.size ? result : null;
397
- }
398
-
399
- function parseCustomerMonthTotalsFromDisplay(display: any): Map<string, number> | null {
400
- if (!display || !Array.isArray(display.columns) || !Array.isArray(display.rows) || !display.rows.length) {
401
- return null;
402
- }
403
- const columns = display.columns.map((column: any) => String(column || '').trim());
404
- const normalizedColumns = columns.map(toNormalizedKey);
405
- const monthColumns = collectMonthColumns(columns);
406
- const monthTotals = new Map<string, number>();
407
-
408
- if (monthColumns.length && normalizedColumns[0]?.includes('customer')) {
409
- display.rows.forEach((row: any) => {
410
- monthColumns.forEach((month) => {
411
- const total = parseNumericLoose(row?.[month]);
412
- if (total === null) {
413
- return;
414
- }
415
- monthTotals.set(month, (monthTotals.get(month) || 0) + total);
416
- });
417
- });
418
- return monthTotals.size ? monthTotals : null;
419
- }
420
-
421
- const monthColumnIndex = normalizedColumns.findIndex((column) => column.includes('month'));
422
- const totalColumnIndex = normalizedColumns.findIndex((column) => column.includes('revenue') || column.includes('total'));
423
- if (monthColumnIndex === -1 || totalColumnIndex === -1) {
424
- return null;
425
- }
426
- const monthColumn = columns[monthColumnIndex];
427
- const totalColumn = columns[totalColumnIndex];
428
- display.rows.forEach((row: any) => {
429
- const month = String(row?.[monthColumn] || '').trim();
430
- if (!/^\d{4}-\d{2}$/.test(month)) {
431
- return;
432
- }
433
- const total = parseNumericLoose(row?.[totalColumn]);
434
- if (total === null) {
435
- return;
436
- }
437
- monthTotals.set(month, (monthTotals.get(month) || 0) + total);
438
- });
439
- return monthTotals.size ? monthTotals : null;
440
- }
441
-
442
- function compareNumericMaps(expected: Map<string, number>, actual: Map<string, number>, tolerance = 0.05): string[] {
443
- const errors: string[] = [];
444
- const keys = new Set<string>([...Array.from(expected.keys()), ...Array.from(actual.keys())]);
445
- keys.forEach((key) => {
446
- const left = expected.get(key);
447
- const right = actual.get(key);
448
- if (left === undefined || right === undefined) {
449
- errors.push(`missing_or_extra_key:${key}`);
450
- return;
451
- }
452
- if (Math.abs(left - right) > tolerance) {
453
- errors.push(`mismatch:${key}:${left}:${right}`);
454
- }
455
- });
456
- return errors;
457
- }
458
-
459
- function compareReplayDisplay(toolDisplay: any, replayDisplay: any, toolRowCount: number, replayRowCount: number): string[] {
460
- const errors: string[] = [];
461
- if (toolRowCount === 0 && replayRowCount === 0) {
462
- return [];
463
- }
464
- const toolColumns = normalizeDisplayColumns(toolDisplay);
465
- const replayColumns = normalizeDisplayColumns(replayDisplay);
466
- if (toolRowCount !== replayRowCount) {
467
- errors.push(`Replay rowCount mismatch: tool_result=${toolRowCount}, replay=${replayRowCount}.`);
468
- }
469
- const sourceRows = normalizeDisplayRows(toolDisplay);
470
- const replayRows = normalizeDisplayRows(replayDisplay);
471
- const stringifySortedRows = (rows: Array<Record<string, any>>) => rows
472
- .map(row => JSON.stringify(row, Object.keys(row).sort()))
473
- .sort();
474
- const sourceSorted = stringifySortedRows(sourceRows);
475
- const replaySorted = stringifySortedRows(replayRows);
476
- if (sourceSorted.length === replaySorted.length) {
477
- let mismatch = false;
478
- for (let index = 0; index < sourceSorted.length; index += 1) {
479
- if (sourceSorted[index] !== replaySorted[index]) {
480
- mismatch = true;
481
- break;
482
- }
483
- }
484
- if (!mismatch) {
485
- return [];
486
- }
487
- }
488
- const alignRowsToKeys = (rows: Array<Record<string, any>>, keys: string[]) => rows.map((row) => {
489
- const next: Record<string, any> = {};
490
- keys.forEach((key) => {
491
- next[key] = Object.prototype.hasOwnProperty.call(row, key) ? row[key] : null;
492
- });
493
- return next;
494
- });
495
- const allRowKeys = Array.from(new Set([
496
- ...sourceRows.flatMap(row => Object.keys(row || {})),
497
- ...replayRows.flatMap(row => Object.keys(row || {}))
498
- ])).sort();
499
- if (allRowKeys.length) {
500
- const sourceAligned = stringifySortedRows(alignRowsToKeys(sourceRows, allRowKeys));
501
- const replayAligned = stringifySortedRows(alignRowsToKeys(replayRows, allRowKeys));
502
- if (sourceAligned.length === replayAligned.length) {
503
- let alignedMismatch = false;
504
- for (let index = 0; index < sourceAligned.length; index += 1) {
505
- if (sourceAligned[index] !== replayAligned[index]) {
506
- alignedMismatch = true;
507
- break;
508
- }
509
- }
510
- if (!alignedMismatch) {
511
- return [];
512
- }
513
- }
514
- }
515
- const sourceMonthly = parseMonthlyTotalsFromDisplay(toolDisplay);
516
- const replayMonthly = parseMonthlyTotalsFromDisplay(replayDisplay);
517
- if (sourceMonthly && replayMonthly && !compareNumericMaps(sourceMonthly, replayMonthly, 0.05).length) {
518
- return errors;
519
- }
520
- const sourceCustomerMonthly = parseCustomerMonthTotalsFromDisplay(toolDisplay);
521
- const replayCustomerMonthly = parseCustomerMonthTotalsFromDisplay(replayDisplay);
522
- if (sourceCustomerMonthly && replayCustomerMonthly && !compareNumericMaps(sourceCustomerMonthly, replayCustomerMonthly, 0.05).length) {
523
- return errors;
524
- }
525
- if (toolColumns.join('|') !== replayColumns.join('|')) {
526
- errors.push(`Replay columns mismatch: tool=[${toolColumns.join(',')}], replay=[${replayColumns.join(',')}].`);
527
- }
528
- errors.push(`Replay display mismatch: tool_result rows=${sourceRows.length}, replay rows=${replayRows.length}.`);
529
- return errors;
530
- }
531
-
532
- function containsAssistantInternalError(content: string): boolean {
533
- const text = String(content || '').toLowerCase();
534
- if (!text) {
535
- return false;
536
- }
537
- return text.includes('i ran into an internal error while preparing that response');
538
- }
539
-
540
- async function runReplayCase(
541
- methodManager: any,
542
- db: any,
543
- idUser: string,
544
- appId: string,
545
- entry: CorpusPromptEntry,
546
- index: number
547
- ): Promise<ReplayResult> {
548
- const id = normalizeOptionalString(entry.id) || `corpus_case_${String(index + 1).padStart(3, '0')}`;
549
- const prompt = normalizeOptionalString(entry.prompt);
550
- const result: ReplayResult = {
551
- id,
552
- prompt,
553
- pass: false,
554
- errors: []
555
- };
556
- if (!prompt) {
557
- result.errors.push('Prompt is empty.');
558
- return result;
559
- }
560
- try {
561
- const ai = await runPrompt(methodManager, db, idUser, prompt, appId);
562
- result.conversationId = ai.conversationId;
563
- const message = ai.message || {};
564
- const assistantContent = normalizeOptionalString(message?.content);
565
- const classification = classifyAssistantRequestType(prompt);
566
- result.classification = {
567
- type: classification.type,
568
- dataQuestion: classification.dataQuestion,
569
- source: classification.source
570
- };
571
- if (containsAssistantInternalError(assistantContent)) {
572
- result.errors.push('Assistant returned internal error response.');
573
- }
574
- let toolResult = message?.metadata?.tool_result;
575
- let toolSource = 'metadata.tool_result';
576
- if ((!toolResult?.input || !toolResult?.output) && classification.dataQuestion) {
577
- const directive = extractDirectiveFromMessage(message);
578
- if (!directive) {
579
- result.errors.push('No tool_result found for data question and no directive was recoverable.');
580
- }
581
- else {
582
- const replayMethod = directive.type === 'aggregate' ? 'aiAssistantMongoAggregate' : 'aiAssistantMongoRead';
583
- try {
584
- const directiveReplay = await callMethodAsUser(methodManager, idUser, replayMethod, directive.payload || {});
585
- toolResult = buildSyntheticToolResultFromDirective(directive, directiveReplay);
586
- toolSource = `synthetic_from_${directive.source}`;
587
- }
588
- catch (directiveError: any) {
589
- result.errors.push(`Directive replay failed: ${String(directiveError?.message || directiveError || 'unknown error')}`);
590
- }
591
- }
592
- }
593
- if (toolResult?.input && toolResult?.output) {
594
- const replayMethod = toolResult.type === 'mongo_agg' ? 'aiAssistantMongoAggregate' : 'aiAssistantMongoRead';
595
- const replay = await callMethodAsUser(methodManager, idUser, replayMethod, toolResult.input || {});
596
- const toolRowCount = Number(toolResult?.output?.rowCount || 0);
597
- const replayRowCount = Array.isArray(replay?.documents)
598
- ? replay.documents.length
599
- : Number(replay?.display?.rowCount || 0);
600
- const replayErrors = compareReplayDisplay(toolResult?.output?.display, replay?.display, toolRowCount, replayRowCount);
601
- if (replayErrors.length) {
602
- result.errors.push(...replayErrors);
603
- }
604
- result.tool = {
605
- type: normalizeOptionalString(toolResult?.type),
606
- collection: normalizeOptionalString(toolResult?.output?.collection) || normalizeOptionalString(toolResult?.input?.collection),
607
- rowCount: toolRowCount,
608
- total: typeof toolResult?.output?.total === 'number' ? toolResult.output.total : null,
609
- columns: Array.isArray(toolResult?.output?.columns) ? toolResult.output.columns : [],
610
- source: toolSource
611
- };
612
- }
613
- else if (classification.dataQuestion) {
614
- result.errors.push('Data question did not produce a usable tool_result.');
615
- }
616
- result.pass = result.errors.length === 0;
617
- return result;
618
- }
619
- catch (error: any) {
620
- result.errors.push(String(error?.message || error || 'Unknown error'));
621
- result.pass = false;
622
- return result;
623
- }
624
- }
625
-
626
- async function run(): Promise<void> {
627
- const repoRoot = process.cwd();
628
- const defaultServerDir = path.resolve(repoRoot, '../resolveio-all/geochem/server');
629
- const serverDir = normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_SERVER_DIR) || defaultServerDir;
630
- const settingsPath = path.join(serverDir, normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_SETTINGS) || 'settings.local.json');
631
- const appId = normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_APP_ID) || path.basename(path.dirname(serverDir));
632
- const corpusPath = path.join(repoRoot, normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_PATH) || 'tmp/ai-assistant-query-corpus.json');
633
- const outputPath = path.join(repoRoot, normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_REPLAY_OUTPUT) || 'tmp/ai-assistant-corpus-replay-e2e-output.json');
634
- const runLimit = parseInteger(process.env.AI_ASSISTANT_CORPUS_RUN_LIMIT, 40, 1, 500);
635
- const dryRun = parseBoolean(process.env.AI_ASSISTANT_CORPUS_DRY_RUN);
636
- const caseFilter = normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_CASES)
637
- .split(',')
638
- .map(value => value.trim())
639
- .filter(Boolean);
640
-
641
- if (!fs.existsSync(settingsPath)) {
642
- throw new Error(`Settings file not found: ${settingsPath}`);
643
- }
644
- if (!fs.existsSync(corpusPath)) {
645
- throw new Error(`Corpus file not found: ${corpusPath}`);
646
- }
647
-
648
- const corpus = JSON.parse(fs.readFileSync(corpusPath, 'utf8')) as CorpusFile;
649
- const prompts = Array.isArray(corpus?.prompts) ? corpus.prompts : [];
650
- const selected = prompts
651
- .filter((entry) => normalizeOptionalString(entry?.prompt))
652
- .filter((entry) => {
653
- if (!caseFilter.length) {
654
- return true;
655
- }
656
- const id = normalizeOptionalString(entry?.id);
657
- return !!id && caseFilter.includes(id);
658
- })
659
- .sort((a, b) => Number(b?.score || 0) - Number(a?.score || 0))
660
- .slice(0, runLimit);
661
-
662
- if (!selected.length) {
663
- throw new Error('No corpus prompts selected.');
664
- }
665
-
666
- if (dryRun) {
667
- console.log(JSON.stringify({
668
- mode: 'dry-run',
669
- serverDir,
670
- settingsPath,
671
- appId,
672
- corpusPath,
673
- outputPath,
674
- runLimit,
675
- selected: selected.map(entry => normalizeOptionalString(entry.id) || normalizeOptionalString(entry.prompt))
676
- }, null, 2));
677
- return;
678
- }
679
-
680
- applyEnvFromServerDir(serverDir);
681
- process.env.AI_ASSISTANT_WORKSPACE_ROOT = process.env.AI_ASSISTANT_WORKSPACE_ROOT || path.resolve(serverDir, '../..');
682
- if (!process.env.OPENAI_API_KEY) {
683
- throw new Error('OPENAI_API_KEY is required for corpus replay E2E run.');
684
- }
685
-
686
- const runtimeTmpDir = path.join(serverDir, 'tmp');
687
- const runtimeSrcDir = path.join(serverDir, 'src');
688
- const runtimeDir = fs.existsSync(path.join(runtimeTmpDir, 'server-app.js')) ? runtimeTmpDir : runtimeSrcDir;
689
- const clientRoutesPath = path.join(runtimeDir, 'client-routes');
690
- if (!fs.existsSync(clientRoutesPath) && !fs.existsSync(`${clientRoutesPath}.js`)) {
691
- throw new Error(`client-routes module not found under runtime dir: ${runtimeDir}`);
692
- }
693
- const { CLIENT_ROUTES } = require(clientRoutesPath);
694
- const serverConfig = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
695
- const envDatabase = normalizeOptionalString(process.env.DATABASE);
696
- const envMongoUrl = normalizeOptionalString(process.env.MONGO_URL);
697
- const envOplogUrl = normalizeOptionalString(process.env.OPLOG_URL);
698
- if (envDatabase) {
699
- serverConfig.DATABASE = envDatabase;
700
- }
701
- if (envMongoUrl) {
702
- serverConfig.MONGO_URL = envMongoUrl;
703
- }
704
- if (envOplogUrl) {
705
- serverConfig.OPLOG_URL = envOplogUrl;
706
- }
707
-
708
- const codexHome = process.env.CODEX_HOME || path.join(repoRoot, 'tmp', '.codex-ai-corpus');
709
- const codexSessions = path.join(codexHome, 'sessions');
710
- const codexZdotdir = process.env.AI_DASHBOARD_CODEX_ZDOTDIR || path.join(repoRoot, 'tmp', '.codex-zdotdir-corpus');
711
- fs.mkdirSync(codexSessions, { recursive: true });
712
- fs.mkdirSync(codexZdotdir, { recursive: true });
713
- process.env.CODEX_HOME = codexHome;
714
- process.env.AI_DASHBOARD_CODEX_ZDOTDIR = codexZdotdir;
715
- process.env.IS_WORKERS_ENABLED = 'false';
716
- process.env.IS_WORKER_INSTANCE = 'false';
717
- process.env.WORKER_INDEX = '';
718
- process.env.NODE_APP_INSTANCE = process.env.NODE_APP_INSTANCE || '8';
719
- process.env.AI_ASSISTANT_WORKER_DEBUG = process.env.AI_ASSISTANT_WORKER_DEBUG || 'false';
720
-
721
- await ResolveIOServer.create(serverConfig, CLIENT_ROUTES(), appId.toUpperCase(), runtimeDir, false, false);
722
- const mainServer = ResolveIOServer.getMainServer();
723
- const methodManager = mainServer?.getMethodManager();
724
- if (!methodManager) {
725
- throw new Error('MethodManager unavailable after ResolveIOServer initialization.');
726
- }
727
- await methodManager.waitUntilReady(120000);
728
-
729
- const dbName = normalizeOptionalString(serverConfig.DATABASE) || 'resolveio';
730
- const db = ResolveIOServer.getMongoConnection().db(dbName);
731
- const idUser = normalizeOptionalString(process.env.AI_ASSISTANT_CORPUS_USER_ID) || await findSuperAdminUserId(db);
732
- const now = new Date();
733
-
734
- const results: ReplayResult[] = [];
735
- for (let index = 0; index < selected.length; index += 1) {
736
- const entry = selected[index];
737
- const replayResult = await runReplayCase(methodManager, db, idUser, appId, entry, index);
738
- results.push(replayResult);
739
- const status = replayResult.pass ? 'PASS' : 'FAIL';
740
- const error = replayResult.errors.length ? `error=${replayResult.errors[0]}` : '';
741
- console.log(`${status} ${replayResult.id} ${error}`.trim());
742
- }
743
-
744
- const passed = results.filter((result) => result.pass).length;
745
- const failed = results.length - passed;
746
- const output = {
747
- now: now.toISOString(),
748
- serverDir,
749
- settingsPath,
750
- appId,
751
- database: dbName,
752
- corpusPath,
753
- total: results.length,
754
- passed,
755
- failed,
756
- results
757
- };
758
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
759
- fs.writeFileSync(outputPath, JSON.stringify(output, null, 2));
760
- console.log(`ai assistant corpus replay e2e: ${passed}/${results.length} passed`);
761
- console.log(`wrote ${outputPath}`);
762
- if (failed > 0) {
763
- process.exitCode = 1;
764
- }
765
- }
766
-
767
- run()
768
- .then(() => {
769
- process.exit(process.exitCode ?? 0);
770
- })
771
- .catch((error) => {
772
- console.error(error);
773
- process.exit(1);
774
- });