@resolveio/server-lib 22.3.176 → 22.3.178

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/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-run.collection.d.ts +3 -0
  20. package/collections/ai-run.collection.js +170 -0
  21. package/collections/ai-run.collection.js.map +1 -0
  22. package/collections/ai-terminal-conversation.collection.d.ts +2 -0
  23. package/collections/ai-terminal-conversation.collection.js +140 -0
  24. package/collections/ai-terminal-conversation.collection.js.map +1 -0
  25. package/collections/ai-terminal-issue-report.collection.d.ts +2 -0
  26. package/collections/ai-terminal-issue-report.collection.js +148 -0
  27. package/collections/ai-terminal-issue-report.collection.js.map +1 -0
  28. package/collections/ai-terminal-message.collection.d.ts +2 -0
  29. package/collections/ai-terminal-message.collection.js +121 -0
  30. package/collections/ai-terminal-message.collection.js.map +1 -0
  31. package/collections/app-setting.collection.d.ts +3 -0
  32. package/collections/app-setting.collection.js +103 -0
  33. package/collections/app-setting.collection.js.map +1 -0
  34. package/collections/app-status.collection.d.ts +3 -0
  35. package/collections/app-status.collection.js +57 -0
  36. package/collections/app-status.collection.js.map +1 -0
  37. package/collections/communication-metric.collection.d.ts +2 -0
  38. package/collections/communication-metric.collection.js +133 -0
  39. package/collections/communication-metric.collection.js.map +1 -0
  40. package/collections/counter.collection.d.ts +3 -0
  41. package/collections/counter.collection.js +56 -0
  42. package/collections/counter.collection.js.map +1 -0
  43. package/collections/cron-job-history.collection.d.ts +3 -0
  44. package/collections/cron-job-history.collection.js +137 -0
  45. package/collections/cron-job-history.collection.js.map +1 -0
  46. package/collections/cron-job.collection.d.ts +3 -0
  47. package/collections/cron-job.collection.js +92 -0
  48. package/collections/cron-job.collection.js.map +1 -0
  49. package/collections/customer-notification.collection.d.ts +3 -0
  50. package/collections/customer-notification.collection.js +130 -0
  51. package/collections/customer-notification.collection.js.map +1 -0
  52. package/collections/customer-portal-password.collection.d.ts +3 -0
  53. package/collections/customer-portal-password.collection.js +75 -0
  54. package/collections/customer-portal-password.collection.js.map +1 -0
  55. package/collections/email-history.collection.d.ts +3 -0
  56. package/collections/email-history.collection.js +134 -0
  57. package/collections/email-history.collection.js.map +1 -0
  58. package/collections/email-verified.collection.d.ts +3 -0
  59. package/collections/email-verified.collection.js +62 -0
  60. package/collections/email-verified.collection.js.map +1 -0
  61. package/collections/file.collection.d.ts +3 -0
  62. package/collections/file.collection.js +74 -0
  63. package/collections/file.collection.js.map +1 -0
  64. package/collections/flag-update.collection.d.ts +3 -0
  65. package/collections/flag-update.collection.js +57 -0
  66. package/collections/flag-update.collection.js.map +1 -0
  67. package/collections/flag.collection.d.ts +3 -0
  68. package/collections/flag.collection.js +57 -0
  69. package/collections/flag.collection.js.map +1 -0
  70. package/collections/log-method-latency.collection.d.ts +3 -0
  71. package/collections/log-method-latency.collection.js +77 -0
  72. package/collections/log-method-latency.collection.js.map +1 -0
  73. package/collections/log-subscription.collection.d.ts +3 -0
  74. package/collections/log-subscription.collection.js +80 -0
  75. package/collections/log-subscription.collection.js.map +1 -0
  76. package/collections/log.collection.d.ts +3 -0
  77. package/collections/log.collection.js +93 -0
  78. package/collections/log.collection.js.map +1 -0
  79. package/collections/logged-in-users.collection.d.ts +3 -0
  80. package/collections/logged-in-users.collection.js +67 -0
  81. package/collections/logged-in-users.collection.js.map +1 -0
  82. package/collections/monitor-cpu.collection.d.ts +3 -0
  83. package/collections/monitor-cpu.collection.js +65 -0
  84. package/collections/monitor-cpu.collection.js.map +1 -0
  85. package/collections/monitor-function.collection.d.ts +3 -0
  86. package/collections/monitor-function.collection.js +74 -0
  87. package/collections/monitor-function.collection.js.map +1 -0
  88. package/collections/monitor-memory.collection.d.ts +3 -0
  89. package/collections/monitor-memory.collection.js +77 -0
  90. package/collections/monitor-memory.collection.js.map +1 -0
  91. package/collections/monitor-mongo.collection.d.ts +3 -0
  92. package/collections/monitor-mongo.collection.js +71 -0
  93. package/collections/monitor-mongo.collection.js.map +1 -0
  94. package/collections/notification.collection.d.ts +3 -0
  95. package/collections/notification.collection.js +57 -0
  96. package/collections/notification.collection.js.map +1 -0
  97. package/collections/openai-usage-ledger.collection.d.ts +2 -0
  98. package/collections/openai-usage-ledger.collection.js +188 -0
  99. package/collections/openai-usage-ledger.collection.js.map +1 -0
  100. package/collections/report-builder-dashboard-builder.collection.d.ts +3 -0
  101. package/collections/report-builder-dashboard-builder.collection.js +109 -0
  102. package/collections/report-builder-dashboard-builder.collection.js.map +1 -0
  103. package/collections/report-builder-library.collection.d.ts +3 -0
  104. package/collections/report-builder-library.collection.js +87 -0
  105. package/collections/report-builder-library.collection.js.map +1 -0
  106. package/collections/report-builder-report.collection.d.ts +4 -0
  107. package/collections/report-builder-report.collection.js +184 -0
  108. package/collections/report-builder-report.collection.js.map +1 -0
  109. package/collections/user-group.collection.d.ts +4 -0
  110. package/collections/user-group.collection.js +89 -0
  111. package/collections/user-group.collection.js.map +1 -0
  112. package/collections/user-guide.collection.d.ts +3 -0
  113. package/collections/user-guide.collection.js +57 -0
  114. package/collections/user-guide.collection.js.map +1 -0
  115. package/collections/user.collection.d.ts +4 -0
  116. package/collections/user.collection.js +180 -0
  117. package/collections/user.collection.js.map +1 -0
  118. package/cron/cron.d.ts +14 -0
  119. package/cron/cron.js +216 -0
  120. package/cron/cron.js.map +1 -0
  121. package/fixtures/cron-jobs.d.ts +1 -0
  122. package/fixtures/cron-jobs.js +150 -0
  123. package/fixtures/cron-jobs.js.map +1 -0
  124. package/fixtures/init.d.ts +1 -0
  125. package/fixtures/init.js +91 -0
  126. package/fixtures/init.js.map +1 -0
  127. package/http/auth.d.ts +2 -0
  128. package/http/auth.js +951 -0
  129. package/http/auth.js.map +1 -0
  130. package/http/health.d.ts +1 -0
  131. package/http/health.js +11 -0
  132. package/http/health.js.map +1 -0
  133. package/http/home.d.ts +1 -0
  134. package/http/home.js +134 -0
  135. package/http/home.js.map +1 -0
  136. package/http/slow-query-publication.d.ts +2 -0
  137. package/http/slow-query-publication.js +99 -0
  138. package/http/slow-query-publication.js.map +1 -0
  139. package/index.d.ts +1 -0
  140. package/index.js +19 -0
  141. package/index.js.map +1 -0
  142. package/managers/ai-assistant-codex-manager.manager.d.ts +67 -0
  143. package/managers/ai-assistant-codex-manager.manager.js +1113 -0
  144. package/managers/ai-assistant-codex-manager.manager.js.map +1 -0
  145. package/managers/ai-run-evidence.manager.d.ts +36 -0
  146. package/managers/ai-run-evidence.manager.js +377 -0
  147. package/managers/ai-run-evidence.manager.js.map +1 -0
  148. package/managers/communication-metric.manager.d.ts +16 -0
  149. package/managers/communication-metric.manager.js +134 -0
  150. package/managers/communication-metric.manager.js.map +1 -0
  151. package/managers/cron.manager.d.ts +20 -0
  152. package/managers/cron.manager.js +534 -0
  153. package/managers/cron.manager.js.map +1 -0
  154. package/managers/customer-notification-content.manager.d.ts +55 -0
  155. package/managers/customer-notification-content.manager.js +158 -0
  156. package/managers/customer-notification-content.manager.js.map +1 -0
  157. package/managers/diagnostic-manager-bootstrap.d.ts +9 -0
  158. package/managers/diagnostic-manager-bootstrap.js +260 -0
  159. package/managers/diagnostic-manager-bootstrap.js.map +1 -0
  160. package/managers/error-auto-fix.manager.d.ts +149 -0
  161. package/managers/error-auto-fix.manager.js +3064 -0
  162. package/managers/error-auto-fix.manager.js.map +1 -0
  163. package/managers/local-log.manager.d.ts +18 -0
  164. package/managers/local-log.manager.js +88 -0
  165. package/managers/local-log.manager.js.map +1 -0
  166. package/managers/method.manager.d.ts +84 -0
  167. package/managers/method.manager.js +1964 -0
  168. package/managers/method.manager.js.map +1 -0
  169. package/managers/mongo.manager.d.ts +224 -0
  170. package/managers/mongo.manager.js +5000 -0
  171. package/managers/mongo.manager.js.map +1 -0
  172. package/managers/monitor.manager.d.ts +70 -0
  173. package/managers/monitor.manager.js +550 -0
  174. package/managers/monitor.manager.js.map +1 -0
  175. package/managers/openai-usage-ledger.manager.d.ts +30 -0
  176. package/managers/openai-usage-ledger.manager.js +142 -0
  177. package/managers/openai-usage-ledger.manager.js.map +1 -0
  178. package/managers/slow-query-verifier.manager.d.ts +144 -0
  179. package/managers/slow-query-verifier.manager.js +3857 -0
  180. package/managers/slow-query-verifier.manager.js.map +1 -0
  181. package/managers/slow-query.manager.d.ts +28 -0
  182. package/managers/slow-query.manager.js +468 -0
  183. package/managers/slow-query.manager.js.map +1 -0
  184. package/managers/subscription.manager.d.ts +169 -0
  185. package/managers/subscription.manager.js +3434 -0
  186. package/managers/subscription.manager.js.map +1 -0
  187. package/managers/websocket.manager.d.ts +73 -0
  188. package/managers/websocket.manager.js +673 -0
  189. package/managers/websocket.manager.js.map +1 -0
  190. package/managers/worker-dispatcher.manager.d.ts +120 -0
  191. package/managers/worker-dispatcher.manager.js +1266 -0
  192. package/managers/worker-dispatcher.manager.js.map +1 -0
  193. package/managers/worker-server.manager.d.ts +35 -0
  194. package/managers/worker-server.manager.js +582 -0
  195. package/managers/worker-server.manager.js.map +1 -0
  196. package/methods/accounts.d.ts +2 -0
  197. package/methods/accounts.js +624 -0
  198. package/methods/accounts.js.map +1 -0
  199. package/methods/ai-terminal.d.ts +338 -0
  200. package/methods/ai-terminal.js +23454 -0
  201. package/methods/ai-terminal.js.map +1 -0
  202. package/methods/app-settings.d.ts +2 -0
  203. package/methods/app-settings.js +169 -0
  204. package/methods/app-settings.js.map +1 -0
  205. package/methods/aws.d.ts +2 -0
  206. package/methods/aws.js +877 -0
  207. package/methods/aws.js.map +1 -0
  208. package/methods/collections.d.ts +2 -0
  209. package/methods/collections.js +719 -0
  210. package/methods/collections.js.map +1 -0
  211. package/methods/counters.d.ts +2 -0
  212. package/methods/counters.js +113 -0
  213. package/methods/counters.js.map +1 -0
  214. package/methods/cron-jobs.d.ts +2 -0
  215. package/methods/cron-jobs.js +2475 -0
  216. package/methods/cron-jobs.js.map +1 -0
  217. package/methods/customer-notifications.d.ts +2 -0
  218. package/methods/customer-notifications.js +528 -0
  219. package/methods/customer-notifications.js.map +1 -0
  220. package/methods/diagnostics.d.ts +2 -0
  221. package/methods/diagnostics.js +703 -0
  222. package/methods/diagnostics.js.map +1 -0
  223. package/methods/flag-updates.d.ts +2 -0
  224. package/methods/flag-updates.js +8 -0
  225. package/methods/flag-updates.js.map +1 -0
  226. package/methods/flags.d.ts +2 -0
  227. package/methods/flags.js +8 -0
  228. package/methods/flags.js.map +1 -0
  229. package/methods/logs.d.ts +2 -0
  230. package/methods/logs.js +751 -0
  231. package/methods/logs.js.map +1 -0
  232. package/methods/mongo-explorer.d.ts +2 -0
  233. package/methods/mongo-explorer.js +1808 -0
  234. package/methods/mongo-explorer.js.map +1 -0
  235. package/methods/monitor.d.ts +2 -0
  236. package/methods/monitor.js +543 -0
  237. package/methods/monitor.js.map +1 -0
  238. package/methods/pdf.d.ts +2 -0
  239. package/methods/pdf.js +1216 -0
  240. package/methods/pdf.js.map +1 -0
  241. package/methods/publications.d.ts +1 -0
  242. package/methods/publications.js +183 -0
  243. package/methods/publications.js.map +1 -0
  244. package/methods/report-builder.d.ts +2 -0
  245. package/methods/report-builder.js +3094 -0
  246. package/methods/report-builder.js.map +1 -0
  247. package/methods/support.d.ts +2 -0
  248. package/methods/support.js +430 -0
  249. package/methods/support.js.map +1 -0
  250. package/models/ai-run.model.d.ts +19 -0
  251. package/models/ai-run.model.js +4 -0
  252. package/models/ai-run.model.js.map +1 -0
  253. package/models/ai-terminal-conversation.model.d.ts +17 -0
  254. package/models/ai-terminal-conversation.model.js +4 -0
  255. package/models/ai-terminal-conversation.model.js.map +1 -0
  256. package/models/ai-terminal-issue-report.model.d.ts +19 -0
  257. package/models/ai-terminal-issue-report.model.js +4 -0
  258. package/models/ai-terminal-issue-report.model.js.map +1 -0
  259. package/models/ai-terminal-message.model.d.ts +22 -0
  260. package/models/ai-terminal-message.model.js +4 -0
  261. package/models/ai-terminal-message.model.js.map +1 -0
  262. package/models/app-setting.model.d.ts +16 -0
  263. package/models/app-setting.model.js +4 -0
  264. package/models/app-setting.model.js.map +1 -0
  265. package/{src/models/app-status.model.ts → models/app-status.model.d.ts} +2 -3
  266. package/models/app-status.model.js +4 -0
  267. package/models/app-status.model.js.map +1 -0
  268. package/{src/models/billing-logged-in-users.model.ts → models/billing-logged-in-users.model.d.ts} +4 -5
  269. package/models/billing-logged-in-users.model.js +4 -0
  270. package/models/billing-logged-in-users.model.js.map +1 -0
  271. package/models/collection-document.model.d.ts +21 -0
  272. package/models/collection-document.model.js +4 -0
  273. package/models/collection-document.model.js.map +1 -0
  274. package/models/communication-metric.model.d.ts +20 -0
  275. package/models/communication-metric.model.js +4 -0
  276. package/models/communication-metric.model.js.map +1 -0
  277. package/{src/models/counter.model.ts → models/counter.model.d.ts} +3 -4
  278. package/models/counter.model.js +4 -0
  279. package/models/counter.model.js.map +1 -0
  280. package/models/cron-job-history.model.d.ts +15 -0
  281. package/models/cron-job-history.model.js +4 -0
  282. package/models/cron-job-history.model.js.map +1 -0
  283. package/models/cron-job.model.d.ts +14 -0
  284. package/models/cron-job.model.js +4 -0
  285. package/models/cron-job.model.js.map +1 -0
  286. package/models/customer-notification.model.d.ts +26 -0
  287. package/models/customer-notification.model.js +4 -0
  288. package/models/customer-notification.model.js.map +1 -0
  289. package/models/customer-portal-password.model.d.ts +11 -0
  290. package/models/customer-portal-password.model.js +4 -0
  291. package/models/customer-portal-password.model.js.map +1 -0
  292. package/models/dialog.model.d.ts +23 -0
  293. package/models/dialog.model.js +4 -0
  294. package/models/dialog.model.js.map +1 -0
  295. package/models/email-history.model.d.ts +32 -0
  296. package/{src/models/email-history.model.ts → models/email-history.model.js} +4 -36
  297. package/models/email-history.model.js.map +1 -0
  298. package/{src/models/email-verified.model.ts → models/email-verified.model.d.ts} +5 -6
  299. package/models/email-verified.model.js +4 -0
  300. package/models/email-verified.model.js.map +1 -0
  301. package/{src/models/file.model.ts → models/file.model.d.ts} +7 -8
  302. package/models/file.model.js +4 -0
  303. package/models/file.model.js.map +1 -0
  304. package/{src/models/flag-update.model.ts → models/flag-update.model.d.ts} +3 -4
  305. package/models/flag-update.model.js +4 -0
  306. package/models/flag-update.model.js.map +1 -0
  307. package/{src/models/flag.model.ts → models/flag.model.d.ts} +3 -4
  308. package/models/flag.model.js +4 -0
  309. package/models/flag.model.js.map +1 -0
  310. package/models/log-method-latency.model.d.ts +10 -0
  311. package/models/log-method-latency.model.js +4 -0
  312. package/models/log-method-latency.model.js.map +1 -0
  313. package/{src/models/log-subscription.model.ts → models/log-subscription.model.d.ts} +9 -11
  314. package/models/log-subscription.model.js +4 -0
  315. package/models/log-subscription.model.js.map +1 -0
  316. package/models/log.model.d.ts +17 -0
  317. package/models/log.model.js +4 -0
  318. package/models/log.model.js.map +1 -0
  319. package/{src/models/logged-in-users.model.ts → models/logged-in-users.model.d.ts} +5 -6
  320. package/models/logged-in-users.model.js +4 -0
  321. package/models/logged-in-users.model.js.map +1 -0
  322. package/{src/models/method-response.model.ts → models/method-response.model.d.ts} +6 -7
  323. package/models/method-response.model.js +4 -0
  324. package/models/method-response.model.js.map +1 -0
  325. package/models/method.model.d.ts +26 -0
  326. package/models/method.model.js +4 -0
  327. package/models/method.model.js.map +1 -0
  328. package/{src/models/monitor-cpu.model.ts → models/monitor-cpu.model.d.ts} +7 -9
  329. package/models/monitor-cpu.model.js +4 -0
  330. package/models/monitor-cpu.model.js.map +1 -0
  331. package/models/monitor-function.model.d.ts +14 -0
  332. package/models/monitor-function.model.js +4 -0
  333. package/models/monitor-function.model.js.map +1 -0
  334. package/models/monitor-memory.model.d.ts +15 -0
  335. package/models/monitor-memory.model.js +4 -0
  336. package/models/monitor-memory.model.js.map +1 -0
  337. package/models/monitor-mongo.model.d.ts +13 -0
  338. package/models/monitor-mongo.model.js +4 -0
  339. package/models/monitor-mongo.model.js.map +1 -0
  340. package/{src/models/notification.model.ts → models/notification.model.d.ts} +4 -6
  341. package/models/notification.model.js +4 -0
  342. package/models/notification.model.js.map +1 -0
  343. package/models/openai-usage-ledger.model.d.ts +30 -0
  344. package/models/openai-usage-ledger.model.js +4 -0
  345. package/models/openai-usage-ledger.model.js.map +1 -0
  346. package/models/pagination.model.d.ts +11 -0
  347. package/models/pagination.model.js +28 -0
  348. package/models/pagination.model.js.map +1 -0
  349. package/models/permission.model.d.ts +12 -0
  350. package/models/permission.model.js +4 -0
  351. package/models/permission.model.js.map +1 -0
  352. package/models/report-builder-dashboard-builder.model.d.ts +25 -0
  353. package/models/report-builder-dashboard-builder.model.js +4 -0
  354. package/models/report-builder-dashboard-builder.model.js.map +1 -0
  355. package/models/report-builder-library.model.d.ts +17 -0
  356. package/models/report-builder-library.model.js +4 -0
  357. package/models/report-builder-library.model.js.map +1 -0
  358. package/models/report-builder-report.model.d.ts +121 -0
  359. package/models/report-builder-report.model.js +4 -0
  360. package/models/report-builder-report.model.js.map +1 -0
  361. package/models/report-builder.model.d.ts +61 -0
  362. package/models/report-builder.model.js +4 -0
  363. package/models/report-builder.model.js.map +1 -0
  364. package/models/select-data-label.model.d.ts +9 -0
  365. package/models/select-data-label.model.js +4 -0
  366. package/models/select-data-label.model.js.map +1 -0
  367. package/models/server-message.model.d.ts +32 -0
  368. package/models/server-message.model.js +4 -0
  369. package/models/server-message.model.js.map +1 -0
  370. package/models/slow-query-report.model.d.ts +23 -0
  371. package/models/slow-query-report.model.js +4 -0
  372. package/models/slow-query-report.model.js.map +1 -0
  373. package/models/subscription.model.d.ts +31 -0
  374. package/models/subscription.model.js +4 -0
  375. package/models/subscription.model.js.map +1 -0
  376. package/models/support-ticket.model.d.ts +87 -0
  377. package/models/support-ticket.model.js +4 -0
  378. package/models/support-ticket.model.js.map +1 -0
  379. package/models/user-group.model.d.ts +20 -0
  380. package/models/user-group.model.js +4 -0
  381. package/models/user-group.model.js.map +1 -0
  382. package/{src/models/user-guide.model.ts → models/user-guide.model.d.ts} +4 -5
  383. package/models/user-guide.model.js +4 -0
  384. package/models/user-guide.model.js.map +1 -0
  385. package/models/user.model.d.ts +84 -0
  386. package/models/user.model.js +4 -0
  387. package/models/user.model.js.map +1 -0
  388. package/package.json +1 -1
  389. package/private/images/ResolveIO.png +0 -0
  390. package/public_api.js +127 -0
  391. package/public_api.js.map +1 -0
  392. package/publications/ai-terminal.d.ts +1 -0
  393. package/publications/ai-terminal.js +122 -0
  394. package/publications/ai-terminal.js.map +1 -0
  395. package/publications/app-settings.d.ts +2 -0
  396. package/publications/app-settings.js +28 -0
  397. package/publications/app-settings.js.map +1 -0
  398. package/publications/app-status.d.ts +2 -0
  399. package/publications/app-status.js +16 -0
  400. package/publications/app-status.js.map +1 -0
  401. package/publications/cron-jobs.d.ts +2 -0
  402. package/publications/cron-jobs.js +88 -0
  403. package/publications/cron-jobs.js.map +1 -0
  404. package/publications/customer-notifications.d.ts +2 -0
  405. package/publications/customer-notifications.js +161 -0
  406. package/publications/customer-notifications.js.map +1 -0
  407. package/publications/files.d.ts +2 -0
  408. package/publications/files.js +36 -0
  409. package/publications/files.js.map +1 -0
  410. package/publications/flags-update.d.ts +2 -0
  411. package/publications/flags-update.js +22 -0
  412. package/publications/flags-update.js.map +1 -0
  413. package/publications/flags.d.ts +2 -0
  414. package/publications/flags.js +22 -0
  415. package/publications/flags.js.map +1 -0
  416. package/publications/logs.d.ts +2 -0
  417. package/publications/logs.js +164 -0
  418. package/publications/logs.js.map +1 -0
  419. package/publications/notifications.d.ts +2 -0
  420. package/publications/notifications.js +16 -0
  421. package/publications/notifications.js.map +1 -0
  422. package/publications/report-builder-dashboard-builders.d.ts +2 -0
  423. package/publications/report-builder-dashboard-builders.js +42 -0
  424. package/publications/report-builder-dashboard-builders.js.map +1 -0
  425. package/publications/report-builder-libraries.d.ts +2 -0
  426. package/publications/report-builder-libraries.js +90 -0
  427. package/publications/report-builder-libraries.js.map +1 -0
  428. package/publications/report-builder-reports.d.ts +2 -0
  429. package/publications/report-builder-reports.js +50 -0
  430. package/publications/report-builder-reports.js.map +1 -0
  431. package/publications/super-admin.d.ts +2 -0
  432. package/publications/super-admin.js +16 -0
  433. package/publications/super-admin.js.map +1 -0
  434. package/publications/user-groups.d.ts +1 -0
  435. package/publications/user-groups.js +16 -0
  436. package/publications/user-groups.js.map +1 -0
  437. package/publications/user-guides.d.ts +1 -0
  438. package/publications/user-guides.js +16 -0
  439. package/publications/user-guides.js.map +1 -0
  440. package/resolveio-server-app.d.ts +70 -0
  441. package/resolveio-server-app.js +801 -0
  442. package/resolveio-server-app.js.map +1 -0
  443. package/server-app.d.ts +228 -0
  444. package/server-app.js +3566 -0
  445. package/server-app.js.map +1 -0
  446. package/services/codex-client.d.ts +128 -0
  447. package/services/codex-client.js +1629 -0
  448. package/services/codex-client.js.map +1 -0
  449. package/services/openai-client.d.ts +46 -0
  450. package/services/openai-client.js +318 -0
  451. package/services/openai-client.js.map +1 -0
  452. package/types/error-report.d.ts +25 -0
  453. package/types/error-report.js +4 -0
  454. package/types/error-report.js.map +1 -0
  455. package/types/slow-query-report.d.ts +27 -0
  456. package/types/slow-query-report.js +6 -0
  457. package/types/slow-query-report.js.map +1 -0
  458. package/util/ai-qa-policy.d.ts +124 -0
  459. package/util/ai-qa-policy.js +736 -0
  460. package/util/ai-qa-policy.js.map +1 -0
  461. package/util/ai-run-evidence-adapters.d.ts +73 -0
  462. package/util/ai-run-evidence-adapters.js +3087 -0
  463. package/util/ai-run-evidence-adapters.js.map +1 -0
  464. package/util/ai-run-evidence-dashboard.d.ts +84 -0
  465. package/util/ai-run-evidence-dashboard.js +336 -0
  466. package/util/ai-run-evidence-dashboard.js.map +1 -0
  467. package/util/ai-run-evidence-eval.d.ts +86 -0
  468. package/util/ai-run-evidence-eval.js +1015 -0
  469. package/util/ai-run-evidence-eval.js.map +1 -0
  470. package/util/ai-run-evidence.d.ts +244 -0
  471. package/util/ai-run-evidence.js +792 -0
  472. package/util/ai-run-evidence.js.map +1 -0
  473. package/util/ai-runner-artifacts.d.ts +82 -0
  474. package/util/ai-runner-artifacts.js +713 -0
  475. package/util/ai-runner-artifacts.js.map +1 -0
  476. package/util/ai-runner-manager-autopilot.d.ts +210 -0
  477. package/util/ai-runner-manager-autopilot.js +642 -0
  478. package/util/ai-runner-manager-autopilot.js.map +1 -0
  479. package/util/ai-runner-manager-policy.d.ts +653 -0
  480. package/util/ai-runner-manager-policy.js +2880 -0
  481. package/util/ai-runner-manager-policy.js.map +1 -0
  482. package/util/ai-runner-qa-auth.d.ts +5 -0
  483. package/util/ai-runner-qa-auth.js +822 -0
  484. package/util/ai-runner-qa-auth.js.map +1 -0
  485. package/util/ai-runner-qa-tools.d.ts +26 -0
  486. package/util/ai-runner-qa-tools.js +3029 -0
  487. package/util/ai-runner-qa-tools.js.map +1 -0
  488. package/util/aicoder-runner-v6.d.ts +367 -0
  489. package/util/aicoder-runner-v6.js +1925 -0
  490. package/util/aicoder-runner-v6.js.map +1 -0
  491. package/util/common.d.ts +31 -0
  492. package/util/common.js +683 -0
  493. package/util/common.js.map +1 -0
  494. package/util/customer-portal-password.d.ts +13 -0
  495. package/util/customer-portal-password.js +209 -0
  496. package/util/customer-portal-password.js.map +1 -0
  497. package/util/error-reporter.d.ts +52 -0
  498. package/util/error-reporter.js +326 -0
  499. package/util/error-reporter.js.map +1 -0
  500. package/util/error-tracking.d.ts +13 -0
  501. package/util/error-tracking.js +120 -0
  502. package/util/error-tracking.js.map +1 -0
  503. package/util/openai-usage-cost.d.ts +6 -0
  504. package/util/openai-usage-cost.js +103 -0
  505. package/util/openai-usage-cost.js.map +1 -0
  506. package/util/report-builder-unwinds.d.ts +15 -0
  507. package/util/report-builder-unwinds.js +156 -0
  508. package/util/report-builder-unwinds.js.map +1 -0
  509. package/util/runner-process-janitor.d.ts +27 -0
  510. package/util/runner-process-janitor.js +208 -0
  511. package/util/runner-process-janitor.js.map +1 -0
  512. package/util/schema-report-builder.d.ts +6 -0
  513. package/util/schema-report-builder.js +481 -0
  514. package/util/schema-report-builder.js.map +1 -0
  515. package/util/slow-query-reporter.d.ts +28 -0
  516. package/util/slow-query-reporter.js +226 -0
  517. package/util/slow-query-reporter.js.map +1 -0
  518. package/util/subscription-dependency-context.d.ts +34 -0
  519. package/util/subscription-dependency-context.js +1283 -0
  520. package/util/subscription-dependency-context.js.map +1 -0
  521. package/util/support-runner-v5.d.ts +841 -0
  522. package/util/support-runner-v5.js +3723 -0
  523. package/util/support-runner-v5.js.map +1 -0
  524. package/util/tokenizer.d.ts +5 -0
  525. package/util/tokenizer.js +41 -0
  526. package/util/tokenizer.js.map +1 -0
  527. package/workers/codex-runner.worker.d.ts +1 -0
  528. package/workers/codex-runner.worker.js +192 -0
  529. package/workers/codex-runner.worker.js.map +1 -0
  530. package/.nodemon.json +0 -5
  531. package/.vscode/settings.json +0 -21
  532. package/AGENTS.md +0 -195
  533. package/README.md +0 -22
  534. package/build_package.sh +0 -5
  535. package/compileDTS.pl +0 -64
  536. package/docs/ai-assistant-nightly-eval.md +0 -65
  537. package/docs/ai-assistant-preflight-checklist.md +0 -23
  538. package/docs/ai-assistant-report-builder-bridge-playbook.md +0 -115
  539. package/eslint-plugin-custom/index.js +0 -7
  540. package/eslint-plugin-custom/rules/no-filter-zero-index.js +0 -44
  541. package/eslint.config.js +0 -103
  542. package/gulpfile.js +0 -216
  543. package/methodAndPublicationListGenerator.py +0 -375
  544. package/mongodbensurers.js +0 -2
  545. package/mongostop.js +0 -3
  546. package/scripts/cleanup-bypassed-callmethod-logs.js +0 -616
  547. package/settings.development.json +0 -25
  548. package/settings.development.redacted.json +0 -25
  549. package/src/.env +0 -12
  550. package/src/ai/assistant-core-heuristics.ts +0 -379
  551. package/src/ai/resolveio-platform-intelligence-memory-corpus.ts +0 -185
  552. package/src/ai/resolveio-platform-intelligence-memory.ts +0 -325
  553. package/src/ai/resolveio-platform-intelligence.ts +0 -462
  554. package/src/client-server-app.ts +0 -12
  555. package/src/collections/ai-run.collection.ts +0 -117
  556. package/src/collections/ai-terminal-conversation.collection.ts +0 -91
  557. package/src/collections/ai-terminal-issue-report.collection.ts +0 -99
  558. package/src/collections/ai-terminal-message.collection.ts +0 -77
  559. package/src/collections/app-setting.collection.ts +0 -104
  560. package/src/collections/app-status.collection.ts +0 -58
  561. package/src/collections/communication-metric.collection.ts +0 -84
  562. package/src/collections/counter.collection.ts +0 -56
  563. package/src/collections/cron-job-history.collection.ts +0 -94
  564. package/src/collections/cron-job.collection.ts +0 -92
  565. package/src/collections/customer-notification.collection.ts +0 -131
  566. package/src/collections/customer-portal-password.collection.ts +0 -76
  567. package/src/collections/email-history.collection.ts +0 -134
  568. package/src/collections/email-verified.collection.ts +0 -62
  569. package/src/collections/file.collection.ts +0 -74
  570. package/src/collections/flag-update.collection.ts +0 -57
  571. package/src/collections/flag.collection.ts +0 -57
  572. package/src/collections/log-method-latency.collection.ts +0 -77
  573. package/src/collections/log-subscription.collection.ts +0 -80
  574. package/src/collections/log.collection.ts +0 -93
  575. package/src/collections/logged-in-users.collection.ts +0 -67
  576. package/src/collections/monitor-cpu.collection.ts +0 -65
  577. package/src/collections/monitor-function.collection.ts +0 -74
  578. package/src/collections/monitor-memory.collection.ts +0 -77
  579. package/src/collections/monitor-mongo.collection.ts +0 -71
  580. package/src/collections/notification.collection.ts +0 -57
  581. package/src/collections/openai-usage-ledger.collection.ts +0 -131
  582. package/src/collections/report-builder-dashboard-builder.collection.ts +0 -109
  583. package/src/collections/report-builder-library.collection.ts +0 -89
  584. package/src/collections/report-builder-report.collection.ts +0 -184
  585. package/src/collections/user-group.collection.ts +0 -89
  586. package/src/collections/user-guide.collection.ts +0 -57
  587. package/src/collections/user.collection.ts +0 -181
  588. package/src/cron/cron.ts +0 -117
  589. package/src/fixtures/cron-jobs.ts +0 -95
  590. package/src/fixtures/init.ts +0 -35
  591. package/src/http/auth.ts +0 -818
  592. package/src/http/health.ts +0 -7
  593. package/src/http/home.ts +0 -90
  594. package/src/http/slow-query-publication.ts +0 -49
  595. package/src/index.ts +0 -1
  596. package/src/managers/ai-assistant-codex-manager.manager.ts +0 -1131
  597. package/src/managers/ai-run-evidence.manager.ts +0 -264
  598. package/src/managers/communication-metric.manager.ts +0 -82
  599. package/src/managers/cron.manager.ts +0 -333
  600. package/src/managers/customer-notification-content.manager.ts +0 -236
  601. package/src/managers/diagnostic-manager-bootstrap.ts +0 -165
  602. package/src/managers/error-auto-fix.manager.ts +0 -2767
  603. package/src/managers/local-log.manager.ts +0 -113
  604. package/src/managers/method.manager.ts +0 -1857
  605. package/src/managers/mongo.manager.ts +0 -4575
  606. package/src/managers/monitor.manager.ts +0 -507
  607. package/src/managers/openai-usage-ledger.manager.ts +0 -112
  608. package/src/managers/slow-query-verifier.manager.ts +0 -3590
  609. package/src/managers/slow-query.manager.ts +0 -519
  610. package/src/managers/subscription.manager.ts +0 -3128
  611. package/src/managers/websocket.manager.ts +0 -746
  612. package/src/managers/worker-dispatcher.manager.ts +0 -1360
  613. package/src/managers/worker-server.manager.ts +0 -536
  614. package/src/methods/accounts.ts +0 -532
  615. package/src/methods/ai-terminal.ts +0 -23825
  616. package/src/methods/app-settings.ts +0 -114
  617. package/src/methods/aws.ts +0 -649
  618. package/src/methods/collections.ts +0 -641
  619. package/src/methods/counters.ts +0 -69
  620. package/src/methods/cron-jobs.ts +0 -2614
  621. package/src/methods/customer-notifications.ts +0 -458
  622. package/src/methods/diagnostics.ts +0 -616
  623. package/src/methods/flag-updates.ts +0 -7
  624. package/src/methods/flags.ts +0 -7
  625. package/src/methods/logs.ts +0 -657
  626. package/src/methods/mongo-explorer.ts +0 -1880
  627. package/src/methods/monitor.ts +0 -540
  628. package/src/methods/pdf.ts +0 -1236
  629. package/src/methods/publications.ts +0 -129
  630. package/src/methods/report-builder.ts +0 -3300
  631. package/src/methods/support.ts +0 -335
  632. package/src/models/ai-run.model.ts +0 -27
  633. package/src/models/ai-terminal-conversation.model.ts +0 -19
  634. package/src/models/ai-terminal-issue-report.model.ts +0 -21
  635. package/src/models/ai-terminal-message.model.ts +0 -24
  636. package/src/models/app-setting.model.ts +0 -17
  637. package/src/models/collection-document.model.ts +0 -24
  638. package/src/models/communication-metric.model.ts +0 -23
  639. package/src/models/cron-job-history.model.ts +0 -16
  640. package/src/models/cron-job.model.ts +0 -15
  641. package/src/models/customer-notification.model.ts +0 -28
  642. package/src/models/customer-portal-password.model.ts +0 -12
  643. package/src/models/dialog.model.ts +0 -25
  644. package/src/models/log-method-latency.model.ts +0 -11
  645. package/src/models/log.model.ts +0 -19
  646. package/src/models/method.model.ts +0 -25
  647. package/src/models/monitor-function.model.ts +0 -16
  648. package/src/models/monitor-memory.model.ts +0 -17
  649. package/src/models/monitor-mongo.model.ts +0 -15
  650. package/src/models/openai-usage-ledger.model.ts +0 -56
  651. package/src/models/pagination.model.ts +0 -35
  652. package/src/models/permission.model.ts +0 -14
  653. package/src/models/report-builder-dashboard-builder.model.ts +0 -29
  654. package/src/models/report-builder-library.model.ts +0 -20
  655. package/src/models/report-builder-report.model.ts +0 -136
  656. package/src/models/report-builder.model.ts +0 -68
  657. package/src/models/select-data-label.model.ts +0 -9
  658. package/src/models/server-message.model.ts +0 -31
  659. package/src/models/slow-query-report.model.ts +0 -23
  660. package/src/models/subscription.model.ts +0 -73
  661. package/src/models/support-ticket.model.ts +0 -104
  662. package/src/models/user-group.model.ts +0 -24
  663. package/src/models/user.model.ts +0 -96
  664. package/src/private/images/ResolveIO.png +0 -0
  665. package/src/publications/ai-terminal.ts +0 -73
  666. package/src/publications/app-settings.ts +0 -25
  667. package/src/publications/app-status.ts +0 -13
  668. package/src/publications/cron-jobs.ts +0 -40
  669. package/src/publications/customer-notifications.ts +0 -101
  670. package/src/publications/files.ts +0 -33
  671. package/src/publications/flags-update.ts +0 -19
  672. package/src/publications/flags.ts +0 -19
  673. package/src/publications/logs.ts +0 -163
  674. package/src/publications/notifications.ts +0 -13
  675. package/src/publications/report-builder-dashboard-builders.ts +0 -39
  676. package/src/publications/report-builder-libraries.ts +0 -41
  677. package/src/publications/report-builder-reports.ts +0 -47
  678. package/src/publications/super-admin.ts +0 -13
  679. package/src/publications/user-groups.ts +0 -12
  680. package/src/publications/user-guides.ts +0 -12
  681. package/src/resolveio-server-app.ts +0 -617
  682. package/src/server-app.ts +0 -3354
  683. package/src/services/codex-client.ts +0 -1231
  684. package/src/services/openai-client.ts +0 -265
  685. package/src/types/error-report.ts +0 -26
  686. package/src/types/js-tiktoken.d.ts +0 -11
  687. package/src/types/slow-query-report.ts +0 -28
  688. package/src/util/ai-qa-policy.ts +0 -925
  689. package/src/util/ai-run-evidence-adapters.ts +0 -3292
  690. package/src/util/ai-run-evidence-dashboard.ts +0 -313
  691. package/src/util/ai-run-evidence-eval.ts +0 -1054
  692. package/src/util/ai-run-evidence.ts +0 -1124
  693. package/src/util/ai-runner-artifacts.ts +0 -586
  694. package/src/util/ai-runner-manager-autopilot.ts +0 -961
  695. package/src/util/ai-runner-manager-policy.ts +0 -4193
  696. package/src/util/ai-runner-qa-auth.ts +0 -821
  697. package/src/util/ai-runner-qa-tools.ts +0 -3045
  698. package/src/util/aicoder-runner-v6.ts +0 -2510
  699. package/src/util/common.ts +0 -649
  700. package/src/util/customer-portal-password.ts +0 -183
  701. package/src/util/error-reporter.ts +0 -332
  702. package/src/util/error-tracking.ts +0 -79
  703. package/src/util/openai-usage-cost.ts +0 -114
  704. package/src/util/report-builder-unwinds.ts +0 -180
  705. package/src/util/runner-process-janitor.ts +0 -219
  706. package/src/util/schema-report-builder.ts +0 -448
  707. package/src/util/slow-query-reporter.ts +0 -216
  708. package/src/util/subscription-dependency-context.ts +0 -1096
  709. package/src/util/support-runner-v5.ts +0 -4785
  710. package/src/util/tokenizer.ts +0 -38
  711. package/src/workers/codex-runner.worker.ts +0 -142
  712. package/start_server.sh +0 -5
  713. package/tests/ai-assistant-corpus-build.ts +0 -484
  714. package/tests/ai-assistant-corpus-replay-e2e.ts +0 -774
  715. package/tests/ai-assistant-data-parity-e2e.ts +0 -1989
  716. package/tests/ai-assistant-eval-triage.ts +0 -831
  717. package/tests/ai-assistant-openai-e2e.ts +0 -1061
  718. package/tests/ai-assistant-openai-git-e2e.ts +0 -155
  719. package/tests/ai-assistant-preflight-matrix.ts +0 -215
  720. package/tests/ai-assistant-routing-eval.test.ts +0 -560
  721. package/tests/ai-assistant-snf-live-eval.ts +0 -975
  722. package/tests/ai-assistant-utils.test.ts +0 -3057
  723. package/tests/ai-manager-autopilot-snapshot.test.ts +0 -193
  724. package/tests/ai-manager-recovery-checkpoint.test.ts +0 -1136
  725. package/tests/ai-run-eval.test.ts +0 -112
  726. package/tests/ai-run-evidence.test.ts +0 -1403
  727. package/tests/ai-runner-contract.test.ts +0 -488
  728. package/tests/aicoder-runner-v6.test.ts +0 -676
  729. package/tests/error-reporter.test.ts +0 -145
  730. package/tests/method-publication-generator.test.ts +0 -46
  731. package/tests/report-builder-linking.test.ts +0 -79
  732. package/tests/resolveio-platform-intelligence.test.ts +0 -352
  733. package/tests/server-app-cron-owner.test.ts +0 -127
  734. package/tests/subscription-connect-race.test.ts +0 -158
  735. package/tests/subscription-dependency-context.test.ts +0 -324
  736. package/tests/subscription-manager-collection-tracking.test.ts +0 -86
  737. package/tests/subscription-manager-invalidation.test.ts +0 -86
  738. package/tests/support-runner-v5.test.ts +0 -1166
  739. package/tsconfig.json +0 -34
  740. /package/{src/private → private}/email-templates/enrollment.html +0 -0
  741. /package/{src/private → private}/email-templates/forgot-password.html +0 -0
  742. /package/{src/private → private}/email-templates/support-ticket-deleted.html +0 -0
  743. /package/{src/private → private}/email-templates/support-ticket-modified.html +0 -0
  744. /package/{src/private → private}/email-templates/support-ticket.html +0 -0
  745. /package/{src/public_api.ts → public_api.d.ts} +0 -0
@@ -1,1403 +0,0 @@
1
- import * as assert from 'node:assert/strict';
2
- import {
3
- buildAIRun,
4
- buildAIRunCost,
5
- buildAIQaRun,
6
- classifyAIRunOutcome,
7
- normalizeOpenAIUsageRowsForCosting,
8
- redactAIRunTrainingExample
9
- } from '../src/util/ai-run-evidence';
10
- import {
11
- buildAICoderAIRunFromEvidence,
12
- buildAssistantAIRunFromEvidence,
13
- buildSupportAIRunFromEvidence
14
- } from '../src/util/ai-run-evidence-adapters';
15
- import {
16
- classifyAIRunFailureClass,
17
- decideAIRunRetry
18
- } from '../src/util/ai-run-evidence-eval';
19
- import { estimateOpenAIUsageCost } from '../src/util/openai-usage-cost';
20
-
21
- const routeOnlyQa = buildAIQaRun({
22
- infraChecks: [
23
- { name: 'puppeteer_require', status: 'pass' },
24
- { name: 'chrome_executable', status: 'pass' }
25
- ],
26
- compile: { status: 'pass', artifactPath: '.build-output/build-client.log' },
27
- routeProbes: [{
28
- route: '/billing/dashboard',
29
- status: 'pass',
30
- screenshot: 'qa-artifacts/route-ready.jpg',
31
- caption: 'Route loaded.'
32
- }]
33
- });
34
-
35
- assert.equal(routeOnlyQa.outcome, 'route_only_pass');
36
- assert.equal(routeOnlyQa.gateResults.some((gate) => gate.key === 'qa_business_assertion' && gate.status === 'blocked'), true);
37
- assert.equal(classifyAIRunOutcome({ qa: routeOnlyQa }).outcome, 'qa_incomplete');
38
- assert.equal(classifyAIRunOutcome({ qa: routeOnlyQa, scorecardPassed: true }).outcome, 'false_pass');
39
-
40
- const infraFailedQa = buildAIQaRun({
41
- infraChecks: [
42
- { name: 'puppeteer_require', status: 'blocked', message: 'Unable to require puppeteer.' }
43
- ]
44
- });
45
- assert.equal(infraFailedQa.outcome, 'infra_failed');
46
- assert.equal(classifyAIRunOutcome({ qa: infraFailedQa }).outcome, 'qa_infra_failed');
47
-
48
- const compileFailedQa = buildAIQaRun({
49
- infraChecks: [{ name: 'chrome_executable', status: 'pass' }],
50
- compile: { status: 'stale', staleEvidence: true, artifactPath: '.build-output/build-client.log' }
51
- });
52
- assert.equal(compileFailedQa.outcome, 'compile_failed');
53
- assert.equal(classifyAIRunOutcome({ qa: compileFailedQa }).outcome, 'build_failed');
54
-
55
- const businessPassedQa = buildAIQaRun({
56
- infraChecks: [{ name: 'chrome_launch', status: 'pass' }],
57
- compile: { status: 'pass' },
58
- routeProbes: [{ route: '/report', status: 'pass' }],
59
- businessAssertions: [{
60
- assertion: 'Report exports include seeded rows.',
61
- status: 'pass',
62
- dataProof: '3 seeded rows rendered and exported.',
63
- artifactPaths: ['qa-artifacts/report-proof.json']
64
- }]
65
- });
66
- assert.equal(businessPassedQa.outcome, 'business_assertion_passed');
67
- assert.equal(classifyAIRunOutcome({
68
- qa: businessPassedQa,
69
- status: 'Passed',
70
- phase: 'COMPLETE',
71
- scorecardPassed: true,
72
- deployStatus: 'pass',
73
- publishStatus: 'published',
74
- sampleDataStatus: 'pass'
75
- }).outcome, 'accepted');
76
-
77
- const releaseBlocked = classifyAIRunOutcome({
78
- qa: businessPassedQa,
79
- scorecardPassed: true,
80
- deployStatus: 'Backend health smoke failed',
81
- publishStatus: 'No such remote origin',
82
- sampleDataStatus: 'empty collections detected'
83
- });
84
- assert.equal(releaseBlocked.outcome, 'release_blocked');
85
- assert.ok(releaseBlocked.gates.some((gate) => gate.key === 'release' && gate.status === 'fail'));
86
-
87
- const builtRun = buildAIRun({
88
- source: 'aicoder_app',
89
- sourceIds: { appId: 'app-1', jobId: 'job-1' },
90
- title: 'Layflat Pressure Optimizer',
91
- status: 'Passed',
92
- phase: 'COMPLETE',
93
- events: [],
94
- qa: businessPassedQa,
95
- scorecardPassed: true,
96
- deployStatus: 'pass',
97
- publishStatus: 'published',
98
- sampleDataStatus: 'pass'
99
- });
100
- assert.equal(builtRun.outcome, 'accepted');
101
- assert.equal(builtRun.sourceIds.appId, 'app-1');
102
-
103
- const cost = buildAIRunCost([
104
- { model: 'gpt-5.3-codex', category: 'review', input_tokens: 1000, cached_input_tokens: 100, output_tokens: 250, cost_estimate: 1.23456789 },
105
- { model: 'gpt-5.4-mini', category: 'qa', inputTokens: 200, outputTokens: 50, estimatedUsd: 0.12 },
106
- {
107
- model: 'gpt-5.3-codex',
108
- category: 'manual-monitoring',
109
- usage_source: 'manual_codex',
110
- usage_surface: 'aicoder',
111
- cost_basis: 'manual_estimate',
112
- is_manual: true,
113
- is_untracked: true,
114
- untracked_reason: 'Sidecar Codex session watched the Layflat builder.',
115
- input_tokens: 3000,
116
- output_tokens: 700,
117
- cost_estimate: 7.5
118
- }
119
- ]);
120
- assert.equal(cost.inputTokens, 4200);
121
- assert.equal(cost.cachedInputTokens, 100);
122
- assert.equal(cost.outputTokens, 1000);
123
- assert.equal(cost.categories.review.count, 1);
124
- assert.deepEqual(cost.models, ['gpt-5.3-codex', 'gpt-5.4-mini']);
125
- assert.equal(cost.sources?.manual_codex.estimatedUsd, 7.5);
126
- assert.equal(cost.sources?.manual_codex.manualCount, 1);
127
- assert.equal(cost.sources?.manual_codex.untrackedCount, 1);
128
- assert.equal(cost.surfaces?.aicoder.estimatedUsd, 7.5);
129
- assert.equal(cost.manualEstimatedUsd, 7.5);
130
- assert.equal(cost.untrackedEstimatedUsd, 7.5);
131
- assert.equal(cost.untrackedWarnings?.includes('Sidecar Codex session watched the Layflat builder.'), true);
132
-
133
- const costOnlyManual = buildAIRunCost([
134
- {
135
- model: 'codex-manual',
136
- category: 'manual-codex',
137
- usage_source: 'manual_codex',
138
- usage_surface: 'support',
139
- cost_basis: 'manual_estimate',
140
- is_manual: true,
141
- is_untracked: true,
142
- untracked_reason: 'Codex sidecar monitored support runner 004421.',
143
- input_tokens: 0,
144
- output_tokens: 0,
145
- total_tokens: 0,
146
- cost_estimate: 23.75
147
- }
148
- ]);
149
- assert.equal(costOnlyManual.totalTokens, 0);
150
- assert.equal(costOnlyManual.estimatedUsd, 23.75);
151
- assert.equal(costOnlyManual.manualEstimatedUsd, 23.75);
152
- assert.equal(costOnlyManual.untrackedEstimatedUsd, 23.75);
153
- assert.equal(costOnlyManual.sources?.manual_codex.count, 1);
154
- assert.equal(costOnlyManual.surfaces?.support.estimatedUsd, 23.75);
155
-
156
- const normalizedUsageRows = normalizeOpenAIUsageRowsForCosting([
157
- {
158
- model: 'gpt-5.5',
159
- category: 'ai-dashboard-codex:master:file-body',
160
- id_conversation: 'thread-1',
161
- timestamp: '2026-06-13T10:00:00.000Z',
162
- input_tokens: 1000,
163
- cached_input_tokens: 800,
164
- output_tokens: 100,
165
- total_tokens: 1100,
166
- cost_estimate: 1
167
- },
168
- {
169
- model: 'gpt-5.5',
170
- category: 'ai-dashboard-codex:master:file-body',
171
- id_conversation: 'thread-1',
172
- timestamp: '2026-06-13T10:01:00.000Z',
173
- input_tokens: 1500,
174
- cached_input_tokens: 1000,
175
- output_tokens: 140,
176
- total_tokens: 1640,
177
- cost_estimate: 1.4
178
- }
179
- ]);
180
- assert.equal(normalizedUsageRows[1].input_tokens, 500);
181
- assert.equal(normalizedUsageRows[1].cached_input_tokens, 200);
182
- assert.equal(normalizedUsageRows[1].output_tokens, 40);
183
- assert.equal(normalizedUsageRows[1].cost_estimate, 0.4);
184
-
185
- const cumulativeCost = buildAIRunCost([
186
- {
187
- model: 'gpt-5.5',
188
- category: 'ai-dashboard-codex:master:file-body',
189
- id_conversation: 'thread-1',
190
- timestamp: '2026-06-13T10:00:00.000Z',
191
- input_tokens: 1000,
192
- cached_input_tokens: 800,
193
- output_tokens: 100,
194
- total_tokens: 1100,
195
- cost_estimate: 1
196
- },
197
- {
198
- model: 'gpt-5.5',
199
- category: 'ai-dashboard-codex:master:file-body',
200
- id_conversation: 'thread-1',
201
- timestamp: '2026-06-13T10:01:00.000Z',
202
- input_tokens: 1500,
203
- cached_input_tokens: 1000,
204
- output_tokens: 140,
205
- total_tokens: 1640,
206
- cost_estimate: 1.4
207
- }
208
- ]);
209
- assert.equal(cumulativeCost.inputTokens, 1500);
210
- assert.equal(cumulativeCost.cachedInputTokens, 1000);
211
- assert.equal(cumulativeCost.outputTokens, 140);
212
- assert.equal(cumulativeCost.estimatedUsd, 1.4);
213
- assert.equal(estimateOpenAIUsageCost('gpt-5.4-2026-03-10', 1000, 100, 500), 0.002875);
214
- assert.equal(estimateOpenAIUsageCost('gpt-5.3-codex', 1000, 100, 500), 0.00575);
215
- assert.equal(estimateOpenAIUsageCost('gpt-5.4-codex', 1000, 100, 500), 0.002875);
216
- assert.equal(estimateOpenAIUsageCost('codex-mini-latest', 1000, 100, 500), 0.000863);
217
-
218
- const redacted = redactAIRunTrainingExample({
219
- runId: 'run-1',
220
- source: 'ai_assistant',
221
- inputSummary: 'Mongo URL mongodb://user:password@host/db and email test@example.com',
222
- actionSummary: 'Used key sk-12345678901234567890',
223
- outcome: 'rejected',
224
- evidence: ['ghp_12345678901234567890 appears here']
225
- });
226
- assert.match(redacted.inputSummary, /\[redacted-mongo-url\]/);
227
- assert.match(redacted.inputSummary, /\[redacted-email\]/);
228
- assert.match(redacted.actionSummary, /\[redacted-secret\]/);
229
- assert.match(redacted.evidence[0], /\[redacted-secret\]/);
230
-
231
- const supportRootCauseEntryContract = {
232
- contract_id: 'support-root-cause-entry-test',
233
- version: 'support_root_cause_entry_v1',
234
- status: 'required',
235
- required_output: {
236
- object_key: 'support_diagnosis_gate',
237
- status: 'passed',
238
- required_fields: [
239
- 'issue_case',
240
- 'issue_class',
241
- 'accepted_hypothesis',
242
- 'rejected_alternatives',
243
- 'failing_path',
244
- 'owner_files',
245
- 'proof_plan',
246
- 'evidence'
247
- ]
248
- },
249
- owner_file_policy: {
250
- max_files: 8,
251
- exact_files_only: true,
252
- edits_outside_owner_files_require_revised_diagnosis: true
253
- },
254
- business_proof_policy: {
255
- requires_aiqa_business_assertion: true,
256
- requires_before_action_after: true,
257
- route_load_screenshot_scorecard_model_claim_not_acceptance: true,
258
- required_artifacts: ['runner-evidence/diagnosis-gate.json', 'qa-artifacts/aiqa-business-assertion.json']
259
- },
260
- failure_policy: {
261
- repeated_failure_without_new_evidence_parks_run: true,
262
- infra_compile_puppeteer_startup_failures_route_to_infra_repair: true,
263
- similar_tickets_and_commits_are_advisory_only: true
264
- },
265
- issue_class_probes: [
266
- 'no_op_submit',
267
- 'missing_wrong_data',
268
- 'filter_query_mismatch',
269
- 'invoice_pdf_export',
270
- 'upload_import',
271
- 'route_auth_hydration',
272
- 'slow_query_performance'
273
- ].map((issueClass) => ({
274
- issue_class: issueClass,
275
- required_paths: ['frontend_event', 'backend_method'],
276
- required_evidence: ['before/action/after business state'],
277
- false_pass_blockers: ['route loaded only']
278
- }))
279
- };
280
-
281
- const supportRun = buildSupportAIRunFromEvidence({
282
- ticket: { _id: 'ticket-004421', ticketNumber: '004421', title: 'QA route only false pass' },
283
- job: {
284
- _id: 'support-job-1',
285
- status: 'Running',
286
- phase: 'QA',
287
- supportRootCauseEntryContract,
288
- supportV5DiagnosisGate: {
289
- issue_case: {
290
- customer_complaint: 'Support ticket list shows tickets from the wrong customer after applying a customer filter.',
291
- expected_result: 'Only tickets for Customer B should appear when Customer B is selected.',
292
- observed_result: 'A Customer A ticket remains visible while filtered to Customer B.',
293
- route_module: '/support tickets list',
294
- account_customer_context: 'Support admin reviewing ticket 004421 for Customer B.',
295
- reproduction_status: 'reproduced'
296
- },
297
- issue_class: 'filter_query_mismatch',
298
- status: 'passed',
299
- accepted_hypothesis: {
300
- statement: 'The ticket list query ignores the customer filter.',
301
- falsifiable_test: 'Apply the Customer B filter and compare the returned rows with the persisted customer id for each ticket.',
302
- evidence: ['QA artifact shows Customer A ticket visible while Customer B filter is active.']
303
- },
304
- rejected_alternatives: [
305
- 'Frontend select state was not the root cause because the network payload includes the selected Customer B filter.',
306
- 'Authentication was not the root cause because the affected support admin can load the ticket list route.'
307
- ],
308
- failing_path: {
309
- frontend: 'Support ticket customer filter submits selected customer id.',
310
- backend: 'server/src/publications/support-tickets.ts ticket list publication',
311
- data_query: 'Mongo ticket query does not constrain by selected customer id.',
312
- description: 'Filter input reaches the backend, but the publication query returns rows outside the selected customer.'
313
- },
314
- owner_files: ['server/src/publications/support-tickets.ts'],
315
- proof_plan: {
316
- before: 'Customer A ticket appears while filtered to Customer B.',
317
- action: 'Apply the Customer B filter and reload the ticket list.',
318
- after: 'Only Customer B tickets are listed.',
319
- business_assertion: 'The wrong-customer ticket is absent after filtering.',
320
- data_assertion: 'Every returned ticket row has customerId equal to Customer B.',
321
- artifact_expectation: 'QA stores before/action/after row snapshots and the filtered publication payload.',
322
- business_proof_contract: {
323
- issue_class: 'filter_query_mismatch',
324
- setup_state: 'Seed or select one Customer A ticket and one Customer B ticket.',
325
- action_under_test: 'Apply the Customer B filter on the support ticket list.',
326
- expected_business_state_change: 'Rows outside Customer B are excluded while Customer B rows remain visible.',
327
- prohibited_false_pass: 'Route load or non-empty table without row/customer proof.',
328
- proof_artifacts: ['qa-artifacts/support-filter-before-after.json'],
329
- data_or_dom_assertion: 'DOM rows and publication payload contain only Customer B ticket ids.'
330
- }
331
- },
332
- evidence: [{
333
- type: 'ticket',
334
- summary: 'Ticket 004421 reports wrong-customer tickets appearing after a customer filter is applied.'
335
- }, {
336
- type: 'qa',
337
- summary: 'Browser QA reproduced Customer A ticket visible while Customer B filter was active.',
338
- artifactPath: 'qa-artifacts/support-filter-reproduction.json'
339
- }, {
340
- type: 'code',
341
- summary: 'Publication owner file contains the query that returns support ticket rows.'
342
- }]
343
- },
344
- supportV5AutonomousDecision: {
345
- nextActionContract: {
346
- contractId: 'support-next-action-safe-repair',
347
- action: 'run_owner_scoped_repair',
348
- label: 'Run owner-scoped repair',
349
- primaryCommand: 'run_support_v5_owner_scoped_repair',
350
- lane: 'build',
351
- stepType: 'owner_scoped_repair',
352
- safeToAutoRun: true,
353
- requiresHumanApproval: false,
354
- canRunWithoutCodexMonitor: true,
355
- codexFallbackRequired: false,
356
- rootCauseFirstSatisfied: true,
357
- preconditions: ['SupportDiagnosisGate passed.'],
358
- successEvidence: ['AIQaBusinessAssertion mapped to proof_plan.'],
359
- stopConditions: ['Same failure class repeats without new evidence.'],
360
- ownerFiles: ['server/src/publications/support-tickets.ts'],
361
- decisionBasis: {
362
- diagnosisValid: true,
363
- ownerFilesReady: true,
364
- proofPlanReady: true,
365
- businessProofReady: false,
366
- evidenceFreshnessStatus: 'fresh',
367
- evidenceStrength: 'medium',
368
- failureClass: 'product_code',
369
- sameFailureCount: 0,
370
- hotfixCommitRequired: true,
371
- liveHotfixBlockedUntilCommit: false
372
- }
373
- }
374
- }
375
- },
376
- taskEvents: [{ message: 'Route loaded in browser.', phase: 'qa' }],
377
- qaEvidence: {
378
- infraChecks: [{ name: 'puppeteer_require', status: 'pass' }],
379
- compile: { status: 'pass' },
380
- routeProbes: [{ route: '/support/004421', status: 'pass', screenshot: 'qa-artifacts/route.jpg' }],
381
- hotfixEvidence: {
382
- channel: 'backend_js',
383
- target: {
384
- host: 'backend.resolveio.com',
385
- path: '/var/app/current/http/runner-manager-selftest.js'
386
- },
387
- compiledArtifactPath: 'dist/http/runner-manager-selftest.js',
388
- remoteChecksumBefore: '1111111111111111111111111111111111111111111111111111111111111111',
389
- remoteChecksumAfter: '2222222222222222222222222222222222222222222222222222222222222222',
390
- sourceCommitSha: '6fd400e1d8c961c1e88820292c323e688fdcc0a4',
391
- githubCommitUrl: 'https://github.com/resolveio/resolveio-all/commit/6fd400e1d8c961c1e88820292c323e688fdcc0a4',
392
- gitPushStatus: 'passed',
393
- restartEvidence: 'nodejs restarted on all support hosts',
394
- healthCheckStatus: 'passed',
395
- selfTestStatus: 'passed'
396
- },
397
- scorecardPassed: true
398
- }
399
- });
400
- assert.equal(supportRun.source, 'support_ticket');
401
- assert.equal(supportRun.sourceIds.ticketNumber, '004421');
402
- assert.equal(supportRun.outcome, 'false_pass');
403
- assert.equal(supportRun.metadata?.diagnosis?.issueClass, 'filter_query_mismatch');
404
- assert.equal(supportRun.metadata?.rootCauseEntryContract?.contractId, 'support-root-cause-entry-test');
405
- assert.equal(supportRun.metadata?.rootCauseEntryContract?.issueClassProbeCount, 7);
406
- assert.deepEqual(supportRun.metadata?.diagnosis?.ownerFiles, ['server/src/publications/support-tickets.ts']);
407
- assert.equal(supportRun.events.some((event) => event.category === 'support_diagnosis_evidence_pack'), true);
408
- assert.equal(supportRun.gates.some((gate) => gate.key === 'support_diagnosis_evidence_pack' && gate.status === 'pass'), true);
409
- assert.equal(supportRun.metadata?.diagnosisEvidencePack?.readOnly, true);
410
- assert.equal(supportRun.metadata?.diagnosisEvidencePack?.sourceEditsAllowed, false);
411
- assert.equal(supportRun.metadata?.diagnosisEvidencePack?.issueClassProbeCount, 7);
412
- assert.equal(supportRun.events.some((event) => event.category === 'diagnosis_gate'), true);
413
- assert.equal(supportRun.events.some((event) => event.category === 'support_root_cause_entry_contract'), true);
414
- assert.equal(supportRun.gates.some((gate) => gate.key === 'support_root_cause_entry_contract' && gate.status === 'pass'), true);
415
- assert.equal(supportRun.events.some((event) => event.category === 'support_next_action_contract'), true);
416
- assert.equal(supportRun.gates.some((gate) => gate.key === 'support_next_action_contract' && gate.status === 'pass'), true);
417
- assert.equal(supportRun.metadata?.nextActionContract?.canRunWithoutCodexMonitor, true);
418
- assert.equal(supportRun.metadata?.nextActionContract?.hotfixCommitRequired, true);
419
- assert.equal(supportRun.metadata?.nextActionContract?.liveHotfixBlockedUntilCommit, false);
420
- assert.equal(supportRun.events.some((event) => event.type === 'hotfix' && event.category === 'backend_js'), true);
421
- assert.equal(supportRun.gates.some((gate) => gate.key === 'hotfix_evidence' && gate.status === 'pass'), true);
422
- assert.equal(supportRun.gates.some((gate) => gate.key === 'hotfix_commit_proof' && gate.status === 'pass'), true);
423
- assert.equal(supportRun.events.some((event) => event.category === 'hotfix_commit_proof' && event.metadata?.passed === true), true);
424
- assert.equal(supportRun.gates.some((gate) => gate.key === 'qa_business_assertion' && gate.status === 'blocked'), true);
425
-
426
- const supportInvalidRootCauseContractRun = buildSupportAIRunFromEvidence({
427
- ticket: { _id: 'ticket-invalid-root-cause', ticketNumber: '004422', title: 'Invalid root cause contract' },
428
- job: {
429
- _id: 'support-job-invalid-root-cause',
430
- status: 'Running',
431
- phase: 'Planning',
432
- supportRootCauseEntryContract: {
433
- contract_id: 'support-root-cause-entry-invalid',
434
- required_output: {
435
- object_key: 'support_diagnosis_gate',
436
- required_fields: ['issue_case']
437
- },
438
- owner_file_policy: {
439
- max_files: 50
440
- },
441
- business_proof_policy: {},
442
- failure_policy: {},
443
- issue_class_probes: [{ issue_class: 'no_op_submit' }]
444
- }
445
- }
446
- });
447
- const invalidRootCauseGate = supportInvalidRootCauseContractRun.gates.find((gate) => gate.key === 'support_root_cause_entry_contract');
448
- assert.equal(invalidRootCauseGate?.status, 'fail');
449
- assert.match(String(invalidRootCauseGate?.reason || ''), /missing required output fields|issue-class probes/i);
450
-
451
- const supportHotfixBlockedUntilCommitRun = buildSupportAIRunFromEvidence({
452
- ticket: { _id: 'ticket-hotfix-commit-blocked', ticketNumber: '004777', title: 'Hotfix must be committed' },
453
- job: {
454
- _id: 'support-hotfix-commit-blocked',
455
- status: 'Running',
456
- phase: 'Release',
457
- support_v5_autonomous_decision: {
458
- next_action_contract: {
459
- contract_id: 'support-next-action-hotfix-blocked',
460
- action: 'apply_live_hotfix',
461
- label: 'Apply live hotfix',
462
- primary_command: 'run_support_v5_live_hotfix',
463
- lane: 'release',
464
- step_type: 'hotfix',
465
- safe_to_auto_run: false,
466
- requires_human_approval: true,
467
- can_run_without_codex_monitor: false,
468
- codex_fallback_required: true,
469
- codex_fallback_reason: 'Live hotfix cannot proceed until commit proof is pushed.',
470
- success_evidence: ['sourceCommitSha', 'githubCommitUrl', 'gitPushStatus=passed'],
471
- decision_basis: {
472
- failure_class: 'release',
473
- hotfix_commit_required: true,
474
- live_hotfix_blocked_until_commit: true,
475
- same_failure_count: 1
476
- }
477
- }
478
- }
479
- }
480
- });
481
- const supportHotfixBlockedGate = supportHotfixBlockedUntilCommitRun.gates.find((gate) => gate.key === 'support_next_action_contract');
482
- assert.equal(supportHotfixBlockedGate?.status, 'blocked');
483
- assert.match(String(supportHotfixBlockedGate?.reason || ''), /GitHub commit proof/i);
484
- assert.equal(supportHotfixBlockedGate?.metadata?.codexFallbackRequired, true);
485
- assert.equal(supportHotfixBlockedUntilCommitRun.metadata?.nextActionContract?.liveHotfixBlockedUntilCommit, true);
486
-
487
- const supportMissingNextActionContractRun = buildSupportAIRunFromEvidence({
488
- ticket: { _id: 'ticket-missing-next-action', ticketNumber: '004778', title: 'Support V5 missing next action' },
489
- job: {
490
- _id: 'support-missing-next-action',
491
- status: 'Running',
492
- phase: 'Manager',
493
- supportWorkflowMode: 'support_v5',
494
- supportV5SupervisorState: {
495
- status: 'active',
496
- activeStep: 'manager_recovery',
497
- activeBlocker: 'Runner needs a structured next action.'
498
- },
499
- supportV5StepHistory: [{
500
- lane: 'qa',
501
- stepType: 'business_proof',
502
- outcome: 'needs_repair',
503
- failureClass: 'business',
504
- blocker: 'Business proof missing after route-only QA.',
505
- evidenceHash: 'route-only-no-next-action'
506
- }]
507
- }
508
- });
509
- const supportMissingNextActionGate = supportMissingNextActionContractRun.gates.find((gate) => gate.key === 'support_next_action_contract');
510
- assert.equal(supportMissingNextActionGate?.status, 'blocked');
511
- assert.equal(supportMissingNextActionGate?.metadata?.missingContract, true);
512
- assert.equal(supportMissingNextActionGate?.metadata?.canRunWithoutCodexMonitor, false);
513
- assert.equal(supportMissingNextActionGate?.metadata?.codexFallbackRequired, true);
514
- assert.equal(supportMissingNextActionContractRun.outcome, 'manual_handoff');
515
- assert.match(String(supportMissingNextActionContractRun.nextAction || ''), /validated next-action contract/i);
516
- assert.equal(supportMissingNextActionContractRun.metadata?.nextActionContract?.status, 'blocked');
517
- assert.equal(supportMissingNextActionContractRun.events.some((event) => event.category === 'support_next_action_contract'), true);
518
-
519
- const supportRepairBeforeDiagnosisRun = buildSupportAIRunFromEvidence({
520
- ticket: { _id: 'ticket-repair-before-diagnosis', ticketNumber: '004502', title: 'Repair started before diagnosis' },
521
- job: {
522
- _id: 'support-job-repair-before-diagnosis',
523
- status: 'Running',
524
- phase: 'Build',
525
- supportV5StepHistory: [{
526
- lane: 'build',
527
- stepType: 'build_repair',
528
- outcome: 'needs_repair',
529
- failureClass: 'product_code',
530
- blocker: 'Save action still fails.',
531
- changedFiles: ['server/src/methods/support-ticket-save.ts'],
532
- evidenceHash: 'repair-without-diagnosis'
533
- }]
534
- },
535
- qaEvidence: {
536
- compile: { status: 'pass' },
537
- routeProbes: [{ route: '/support/004502', status: 'pass' }]
538
- }
539
- });
540
- const supportRepairBeforeDiagnosisGate = supportRepairBeforeDiagnosisRun.gates.find((gate) => gate.key === 'support_diagnosis_before_repair');
541
- assert.equal(supportRepairBeforeDiagnosisGate?.status, 'blocked');
542
- assert.equal(supportRepairBeforeDiagnosisGate?.metadata?.diagnosisValid, false);
543
- assert.equal(supportRepairBeforeDiagnosisGate?.metadata?.allowedDispatchAction, 'run_read_only_diagnosis');
544
- assert.equal(supportRepairBeforeDiagnosisGate?.metadata?.productRepairAllowed, false);
545
- assert.equal(supportRepairBeforeDiagnosisRun.outcome, 'manual_handoff');
546
- assert.match(String(supportRepairBeforeDiagnosisGate?.reason || ''), /Support product repair is blocked/i);
547
- assert.match(String(supportRepairBeforeDiagnosisRun.nextAction || ''), /read-only support diagnosis/i);
548
- assert.equal(supportRepairBeforeDiagnosisRun.metadata?.diagnosisBeforeRepair?.allowedDispatchAction, 'run_read_only_diagnosis');
549
- assert.deepEqual(supportRepairBeforeDiagnosisRun.metadata?.diagnosisBeforeRepair?.changedFiles, ['server/src/methods/support-ticket-save.ts']);
550
- assert.equal(supportRepairBeforeDiagnosisRun.events.some((event) => event.category === 'support_diagnosis_before_repair'), true);
551
-
552
- const supportUnpushedHotfixRun = buildSupportAIRunFromEvidence({
553
- ticket: { _id: 'ticket-004421-hotfix', ticketNumber: '004421', title: 'Unpushed backend hotfix guard' },
554
- job: {
555
- _id: 'support-job-unpushed-hotfix',
556
- status: 'Running',
557
- phase: 'Release',
558
- supportV5DiagnosisGate: supportRun.metadata?.diagnosis
559
- },
560
- qaEvidence: {
561
- infraChecks: [{ name: 'puppeteer_require', status: 'pass' }],
562
- compile: { status: 'pass' },
563
- routeProbes: [{ route: '/support/004421', status: 'pass' }],
564
- hotfixEvidence: {
565
- channel: 'backend_js',
566
- target: {
567
- host: 'backend.resolveio.com',
568
- path: '/var/app/current/http/runner-manager-selftest.js'
569
- },
570
- compiledArtifactPath: 'dist/http/runner-manager-selftest.js',
571
- remoteChecksumBefore: '1111111111111111111111111111111111111111111111111111111111111111',
572
- remoteChecksumAfter: '2222222222222222222222222222222222222222222222222222222222222222',
573
- sourceCommitSha: '6fd400e1d8c961c1e88820292c323e688fdcc0a4',
574
- githubCommitUrl: 'https://github.com/resolveio/resolveio-all/commit/6fd400e1d8c961c1e88820292c323e688fdcc0a4',
575
- restartEvidence: 'nodejs restarted on all support hosts',
576
- healthCheckStatus: 'passed',
577
- selfTestStatus: 'passed'
578
- }
579
- }
580
- });
581
- const supportUnpushedHotfixGate = supportUnpushedHotfixRun.gates.find((gate) => gate.key === 'hotfix_evidence');
582
- assert.equal(supportUnpushedHotfixGate?.status, 'fail');
583
- assert.match(String(supportUnpushedHotfixGate?.reason || ''), /gitPushStatus|GitHub/i);
584
- const supportUnpushedHotfixCommitGate = supportUnpushedHotfixRun.gates.find((gate) => gate.key === 'hotfix_commit_proof');
585
- assert.equal(supportUnpushedHotfixCommitGate?.status, 'blocked');
586
- assert.equal(supportUnpushedHotfixCommitGate?.metadata?.managerMustCommitBeforeHotfix, true);
587
- assert.equal(supportUnpushedHotfixRun.outcome, 'release_blocked');
588
- assert.equal(supportUnpushedHotfixRun.events.some((event) => event.type === 'hotfix' && event.metadata?.hotfixSatisfied === false), true);
589
- assert.equal(supportUnpushedHotfixRun.events.some((event) => event.category === 'hotfix_commit_proof' && event.metadata?.managerMustCommitBeforeHotfix === true), true);
590
-
591
- const supportRepeatedFailureRun = buildSupportAIRunFromEvidence({
592
- ticket: { _id: 'ticket-repeated-failure', ticketNumber: '004500', title: 'Repeated support failure' },
593
- job: {
594
- _id: 'support-job-repeated-failure',
595
- status: 'Running',
596
- phase: 'Build',
597
- supportV5Budget: { maxRepeatedNoProgress: 2 },
598
- supportV5StepHistory: [
599
- {
600
- lane: 'repair',
601
- stepType: 'workflow_build',
602
- outcome: 'needs_repair',
603
- failureClass: 'product_code',
604
- blocker: 'Save action still throws TypeError.',
605
- evidenceHash: 'save-typeerror-before',
606
- artifactPaths: ['qa/save-before.log']
607
- },
608
- {
609
- lane: 'repair',
610
- stepType: 'workflow_build',
611
- outcome: 'needs_repair',
612
- failureClass: 'product_code',
613
- blocker: 'Save action still throws TypeError.',
614
- evidenceHash: 'save-typeerror-before',
615
- artifactPaths: ['qa/save-before.log']
616
- }
617
- ]
618
- },
619
- qaEvidence: {
620
- compile: { status: 'pass' },
621
- routeProbes: [{ route: '/support/004500', status: 'pass' }]
622
- }
623
- });
624
- const repeatedFailureGate = supportRepeatedFailureRun.gates.find((gate) => gate.key === 'manager_no_blind_loop_policy');
625
- assert.equal(repeatedFailureGate?.status, 'blocked');
626
- assert.equal(repeatedFailureGate?.metadata?.action, 'park_repeated_failure');
627
- assert.equal(repeatedFailureGate?.metadata?.requiresNewEvidence, true);
628
- assert.equal(repeatedFailureGate?.metadata?.productRepairAllowed, false);
629
- assert.equal(supportRepeatedFailureRun.outcome, 'manual_handoff');
630
- assert.equal(supportRepeatedFailureRun.events.some((event) => event.category === 'manager_no_blind_loop_policy'), true);
631
- assert.equal(supportRepeatedFailureRun.metadata?.managerNoBlindLoopPolicy?.requiresNewEvidence, true);
632
-
633
- const supportInfraRetryRun = buildSupportAIRunFromEvidence({
634
- ticket: { _id: 'ticket-infra-retry', ticketNumber: '004501', title: 'Support infra retry' },
635
- job: {
636
- _id: 'support-job-infra-retry',
637
- status: 'Running',
638
- phase: 'QA',
639
- supportV5StepHistory: [{
640
- lane: 'qa',
641
- stepType: 'workflow_qa',
642
- outcome: 'needs_repair',
643
- failureClass: 'infra',
644
- blocker: 'Chrome executable missing.',
645
- evidenceHash: 'chrome-missing',
646
- artifactPaths: ['qa/chrome-preflight.log']
647
- }]
648
- },
649
- qaEvidence: {
650
- infraChecks: [{ name: 'chrome_executable', status: 'blocked', message: 'Chrome executable missing.', path: 'qa/chrome-preflight.log' }]
651
- }
652
- });
653
- const infraRetryGate = supportInfraRetryRun.gates.find((gate) => gate.key === 'manager_no_blind_loop_policy');
654
- assert.equal(infraRetryGate?.status, 'warn');
655
- assert.equal(infraRetryGate?.metadata?.action, 'retry_infra');
656
- assert.equal(infraRetryGate?.metadata?.productRepairFailure, false);
657
- assert.equal(infraRetryGate?.metadata?.dispatchAction, 'run_infra_repair');
658
- assert.equal(supportInfraRetryRun.outcome, 'qa_infra_failed');
659
-
660
- const supportGenericBusinessProofRun = buildSupportAIRunFromEvidence({
661
- ticket: { _id: 'ticket-004421', ticketNumber: '004421', title: 'Generic support proof' },
662
- job: {
663
- _id: 'support-job-generic-proof',
664
- status: 'Closed',
665
- phase: 'COMPLETE',
666
- supportV5DiagnosisGate: supportRun.metadata?.diagnosis
667
- },
668
- qaEvidence: {
669
- infraChecks: [{ name: 'puppeteer_require', status: 'pass' }],
670
- compile: { status: 'pass' },
671
- routeProbes: [{ route: '/support', status: 'pass' }],
672
- scorecardPassed: true,
673
- businessAssertions: [{
674
- assertion: 'The route loads and the ticket page has visible controls.',
675
- status: 'pass',
676
- route: '/support',
677
- action: 'Open the ticket page.',
678
- expected: 'Visible controls render.',
679
- observed: 'Visible controls rendered.',
680
- dataProof: 'Screenshot showed page content.'
681
- }]
682
- }
683
- });
684
- assert.equal(supportGenericBusinessProofRun.outcome, 'false_pass');
685
- assert.equal(supportGenericBusinessProofRun.gates.some((gate) => gate.key === 'support_diagnosis_business_proof' && gate.status === 'blocked'), true);
686
-
687
- const supportBusinessProofRun = buildSupportAIRunFromEvidence({
688
- ticket: { _id: 'ticket-004430', ticketNumber: '004430', title: 'Filtered support ticket list' },
689
- job: {
690
- _id: 'support-job-2',
691
- status: 'Closed',
692
- phase: 'COMPLETE',
693
- supportV5DiagnosisGate: supportRun.metadata?.diagnosis
694
- },
695
- qaEvidence: {
696
- infraChecks: [{ name: 'puppeteer_require', status: 'pass' }],
697
- compile: { status: 'pass' },
698
- routeProbes: [{ route: '/support', status: 'pass' }],
699
- businessAssertions: [{
700
- assertion: 'Wrong-customer ticket is absent after applying the customer filter.',
701
- status: 'pass',
702
- route: '/support',
703
- action: 'Apply customer filter and reload.',
704
- expected: 'Only Customer B tickets are visible.',
705
- observed: 'Customer A ticket was not rendered.',
706
- dataProof: 'DOM and query proof matched the diagnosis proof plan.'
707
- }]
708
- }
709
- });
710
- assert.equal(supportBusinessProofRun.outcome, 'accepted');
711
-
712
- const supportJobStoredBusinessProofRun = buildSupportAIRunFromEvidence({
713
- ticket: { _id: 'ticket-004431', ticketNumber: '004431', title: 'Stored support business proof' },
714
- job: {
715
- _id: 'support-job-stored-proof',
716
- status: 'Closed',
717
- phase: 'COMPLETE',
718
- supportV5DiagnosisGate: supportRun.metadata?.diagnosis,
719
- supportQaValidationCursor: {
720
- route_probe: { route: '/support', status: 'pass', screenshot: 'qa-artifacts/stored-route.png' },
721
- business_assertions: [{
722
- assertion: 'Wrong-customer ticket is absent after applying the customer filter.',
723
- status: 'pass',
724
- route: '/support',
725
- action: 'Apply customer filter and reload.',
726
- expected: 'Only Customer B tickets are visible.',
727
- observed: 'Customer A ticket was not rendered.',
728
- dataProof: 'DOM and query proof matched the diagnosis proof plan.',
729
- artifactPaths: ['qa-artifacts/stored-business-proof.json'],
730
- metadata: { supportDiagnosisProof: true }
731
- }]
732
- },
733
- supportV5AutonomousDecision: {
734
- business_proof_readiness: {
735
- ready: true,
736
- status: 'passed',
737
- reason: 'Stored support business proof matched the diagnosis.',
738
- artifact_paths: ['qa-artifacts/stored-business-proof.json']
739
- },
740
- customer_reply_policy: {
741
- action: 'draft_resolution_reply',
742
- canDraftCustomerReply: true,
743
- canSendCustomerReply: false,
744
- confidenceLevel: 'high',
745
- safety: 'safe_to_draft',
746
- reason: 'support_reply_resolution_draft_allowed_after_business_proof',
747
- humanReviewPacket: {
748
- reviewType: 'customer_resolution_reply',
749
- primaryAction: 'review_customer_reply',
750
- customerFacingDraftAllowed: true,
751
- customerSendAllowed: false,
752
- requiresHumanApproval: true,
753
- evidenceRefs: ['qa-artifacts/stored-business-proof.json']
754
- }
755
- }
756
- }
757
- }
758
- });
759
- assert.equal(supportJobStoredBusinessProofRun.outcome, 'accepted');
760
- assert.equal(supportJobStoredBusinessProofRun.qa?.businessAssertions.length, 1);
761
- assert.equal(supportJobStoredBusinessProofRun.gates.some((gate) => gate.key === 'support_business_proof_readiness' && gate.status === 'pass'), true);
762
- assert.equal(supportJobStoredBusinessProofRun.metadata?.businessProofReadiness?.ready, true);
763
- assert.equal(supportJobStoredBusinessProofRun.gates.some((gate) => gate.key === 'support_customer_reply_policy' && gate.status === 'warn'), true);
764
- assert.equal(supportJobStoredBusinessProofRun.metadata?.customerReplyPolicy?.reviewType, 'customer_resolution_reply');
765
- assert.equal(supportJobStoredBusinessProofRun.metadata?.customerReplyPolicy?.canSendCustomerReply, false);
766
-
767
- const supportRouteOnlyReadinessRun = buildSupportAIRunFromEvidence({
768
- ticket: { _id: 'ticket-004432', ticketNumber: '004432', title: 'Stored route-only support proof' },
769
- job: {
770
- _id: 'support-job-route-only-readiness',
771
- status: 'Closed',
772
- phase: 'COMPLETE',
773
- supportV5DiagnosisGate: supportRun.metadata?.diagnosis,
774
- supportQaValidationCursor: {
775
- workflow_probe: {
776
- route: '/support',
777
- status: 'pass',
778
- screenshot: 'qa-artifacts/route-only.png',
779
- message: 'Route loaded but no business assertion ran.'
780
- }
781
- },
782
- supportV5AutonomousDecision: {
783
- business_proof_readiness: {
784
- ready: false,
785
- status: 'route_only',
786
- reason: 'Route probe is not business proof.',
787
- blockers: ['Run the issue-class business assertion.'],
788
- artifact_paths: ['qa-artifacts/route-only.png']
789
- }
790
- }
791
- }
792
- });
793
- assert.notEqual(supportRouteOnlyReadinessRun.outcome, 'accepted');
794
- assert.equal(supportRouteOnlyReadinessRun.gates.some((gate) => gate.key === 'support_business_proof_readiness' && gate.status === 'blocked'), true);
795
- assert.equal(supportRouteOnlyReadinessRun.metadata?.businessProofReadiness?.status, 'route_only');
796
-
797
- const aicoderJourneyContract = {
798
- app_archetype: 'optimizer',
799
- primary_actor: 'Operations planner',
800
- primary_goal: 'Create a saved hose pressure recommendation for a field route.',
801
- primary_workflow_id: 'layflat-optimizer',
802
- first_screen: {
803
- route: '/dashboard/hub',
804
- purpose: 'Command center showing active scenarios and next optimizer action.',
805
- visible_cta: 'Start optimizer scenario',
806
- next_step: 'Open assumptions for the seeded route.'
807
- },
808
- north_star_workflow: [{
809
- position: 'first',
810
- id: 'start-scenario',
811
- route: '/dashboard/hub',
812
- visible_cta: 'Start optimizer scenario',
813
- data_input_or_selection: 'Select North Field route.',
814
- method_or_calculation: 'local calculation path optimizerScenarioDraft',
815
- expected_state_transition: 'Scenario assumptions panel opens.',
816
- success_confirmation: 'Scenario ready badge appears.',
817
- next_step_destination: '/dashboard/hub?scenario=active'
818
- }, {
819
- position: 'next',
820
- id: 'run-optimizer',
821
- route: '/dashboard/hub',
822
- visible_cta: 'Run optimization',
823
- data_input_or_selection: 'Confirm pressure limit, terrain, pump, and hose specs.',
824
- method_or_calculation: 'local calculation path runLayflatPressureOptimizer and server method saveOptimizerResult',
825
- expected_state_transition: 'Alternatives table and recommendation card update.',
826
- success_confirmation: 'Recommendation calculated badge appears.',
827
- next_step_destination: '/dashboard/hub?result=compare'
828
- }, {
829
- position: 'last',
830
- id: 'save-report',
831
- route: '/reports/optimizer',
832
- visible_cta: 'Save recommendation report',
833
- data_input_or_selection: 'Choose the recommended hose plan.',
834
- method_or_calculation: 'server method publishOptimizerRecommendation',
835
- expected_state_transition: 'Saved report row appears.',
836
- success_confirmation: 'Recommendation saved message appears.',
837
- final_result: 'Saved optimizer recommendation with exportable pressure report.'
838
- }],
839
- secondary_workflows: [
840
- { id: 'setup', route: '/manage/settings', purpose: 'Maintain pump defaults.' },
841
- { id: 'report-export', route: '/reports/optimizer', purpose: 'Review saved recommendations.' },
842
- { id: 'recovery', route: '/dashboard/hub', purpose: 'Handle invalid pressure states.' }
843
- ],
844
- screen_sequence: [{
845
- route: '/dashboard/hub',
846
- screen_purpose: 'Command center with seeded scenario and embedded optimizer action.',
847
- visible_cta: 'Start optimizer scenario',
848
- action: 'Open scenario assumptions',
849
- method_or_calculation: 'local calculation path optimizerScenarioDraft',
850
- expected_next_state: 'Scenario assumptions are visible.',
851
- data_shown: 'Seeded route, elevation, pump, hose, and pressure-limit records.'
852
- }, {
853
- route: '/dashboard/hub',
854
- screen_purpose: 'Run optimizer and compare alternatives.',
855
- visible_cta: 'Run optimization',
856
- action: 'Calculate pressure recommendation',
857
- method_or_calculation: 'local calculation path runLayflatPressureOptimizer',
858
- expected_next_state: 'Recommendation and alternatives update.',
859
- data_shown: 'Comparison table and recommendation card.'
860
- }, {
861
- route: '/reports/optimizer',
862
- screen_purpose: 'Save and export recommendation report.',
863
- visible_cta: 'Save recommendation report',
864
- action: 'Persist recommendation report',
865
- method_or_calculation: 'server method publishOptimizerRecommendation',
866
- expected_next_state: 'Saved report row and export button visible.',
867
- data_shown: 'Saved recommendation and calculated pressure.'
868
- }],
869
- data_story: {
870
- seeded_scenario: 'North Field irrigation route with elevation changes, pumps, and hose alternatives.',
871
- records: ['North Field route', 'Pump A', 'Pump B', '4-inch layflat hose', '6-inch layflat hose'],
872
- relationships: ['Route uses pump options', 'Pump options feed hose alternatives', 'Optimization result belongs to scenario'],
873
- non_empty_states: ['Dashboard KPIs show pressure and flow.', 'Reports table shows saved recommendation row.']
874
- },
875
- completion_states: [
876
- 'Recommendation card shows selected hose and pressure margin.',
877
- 'Report route lists saved recommendation with export action.'
878
- ],
879
- qa_assertions: [{
880
- id: 'login-hub',
881
- route: '/dashboard/hub',
882
- action: 'Login and land on dashboard hub.',
883
- expected_dom_or_data_proof: 'Hub shows seeded North Field scenario and non-empty KPIs.'
884
- }, {
885
- id: 'primary-hub-action',
886
- route: '/dashboard/hub',
887
- action: 'Click Start optimizer scenario.',
888
- expected_dom_or_data_proof: 'Scenario assumptions panel opens with seeded route and pump records.'
889
- }, {
890
- id: 'workflow-completion',
891
- route: '/dashboard/hub',
892
- action: 'Run optimization and save recommendation.',
893
- expected_dom_or_data_proof: 'Saved recommendation report row appears with calculated pressure result.'
894
- }, {
895
- id: 'mobile-viewport',
896
- route: '/dashboard/hub',
897
- action: 'Repeat primary optimizer path at mobile viewport 390x844.',
898
- expected_dom_or_data_proof: 'Mobile hub shows non-empty scenario and recommendation controls.',
899
- viewport: '390x844 mobile'
900
- }, {
901
- id: 'empty-error-recovery',
902
- route: '/dashboard/hub',
903
- action: 'Clear scenario input and submit invalid pressure limit.',
904
- expected_dom_or_data_proof: 'Empty/error recovery message appears and Start optimizer scenario remains available.'
905
- }]
906
- };
907
- const aicoderWorkflowQaRows = aicoderJourneyContract.qa_assertions.map((row, index) => ({
908
- index: index + 1,
909
- workflowId: 'layflat-optimizer',
910
- stepId: row.id,
911
- route: row.route,
912
- action: row.action,
913
- assertion: row.expected_dom_or_data_proof,
914
- expectedState: row.expected_dom_or_data_proof,
915
- status: 'pass',
916
- artifactPaths: [`qa-artifacts/${row.id}.json`]
917
- }));
918
-
919
- const aicoderRun = buildAICoderAIRunFromEvidence({
920
- app: { _id: 'layflat-app', name: 'Layflat Pressure Optimizer', domain: 'layflat.resolveio.app' },
921
- job: {
922
- _id: 'aicoder-job-1',
923
- phase: 'COMPLETE',
924
- status: 'Passed',
925
- managerHotfixEvidence: {
926
- channel: 'backend_js',
927
- target: {
928
- host: 'backend.aicoder.resolveio.com',
929
- path: '/var/app/current/http/runner-manager-selftest.js'
930
- },
931
- compiledArtifactPath: 'dist/http/runner-manager-selftest.js',
932
- remoteChecksumAfter: '3333333333333333333333333333333333333333333333333333333333333333',
933
- sourceCommitSha: '6fd400e1d8c961c1e88820292c323e688fdcc0a4',
934
- githubCommitUrl: 'https://github.com/resolveio/resolveio-all/commit/6fd400e1d8c961c1e88820292c323e688fdcc0a4',
935
- gitPushStatus: 'passed',
936
- restartEvidence: 'nodejs restarted on AICoder hosts',
937
- healthCheckStatus: 'passed',
938
- selfTestStatus: 'passed'
939
- }
940
- },
941
- qaEvidence: {
942
- journeyContract: aicoderJourneyContract,
943
- workflowQaRows: aicoderWorkflowQaRows,
944
- scorecardPassed: true,
945
- deployStatus: 'pass',
946
- publishStatus: 'published',
947
- sampleDataStatus: 'empty seed collections',
948
- compile: { status: 'pass' },
949
- routeProbes: [{ route: '/optimizer', status: 'pass' }],
950
- businessAssertions: [{
951
- stepId: 'workflow-completion',
952
- workflowId: 'layflat-optimizer',
953
- route: '/dashboard/hub',
954
- assertion: 'Saved recommendation report row appears with calculated pressure result.',
955
- status: 'pass',
956
- dataProof: 'Seeded hose row produced a pressure result.'
957
- }]
958
- }
959
- });
960
- assert.equal(aicoderRun.source, 'aicoder_app');
961
- assert.equal(aicoderRun.outcome, 'release_blocked');
962
- assert.equal(aicoderRun.events.some((event) => event.type === 'hotfix' && event.metadata?.hotfixSatisfied === true), true);
963
- assert.equal(aicoderRun.gates.some((gate) => gate.key === 'hotfix_commit_proof' && gate.status === 'pass'), true);
964
- assert.equal(aicoderRun.gates.some((gate) => gate.key === 'aicoder_workflow_proof_readiness' && gate.status === 'fail'), true);
965
- assert.equal(aicoderRun.metadata?.workflowProofReadiness?.status, 'release_blocked');
966
-
967
- const aicoderRouteOnlyRun = buildAICoderAIRunFromEvidence({
968
- app: { _id: 'route-only-app', name: 'Route Only App' },
969
- job: {
970
- _id: 'aicoder-route-only',
971
- phase: 'COMPLETE',
972
- status: 'Passed',
973
- workflowProofCheckpoint: {
974
- required: true,
975
- status: 'waiting_for_workflow_proof',
976
- readinessStatus: 'workflow_qa_required',
977
- nextGate: 'workflow_qa',
978
- workflowProofFingerprint: 'aicoder-workflow-proof-route-only',
979
- artifactFingerprint: 'aicoder-workflow-artifacts-route-only',
980
- requiredEvidence: ['AIQaBusinessAssertion tied to journey_contract.qa_assertions'],
981
- requiredResetEvidence: ['new workflow proof fingerprint', 'fresh workflow QA artifact'],
982
- successRequiresWorkflowBusinessProof: true,
983
- blocksProductRepairUntilJourneyContract: false,
984
- blocksPublishUntilWorkflowProof: true,
985
- blocksPublishUntilReleaseGate: false,
986
- blocksWowUiUntilWorkflowProof: true,
987
- nextAction: 'Run workflow QA from the journey contract before publish or wow UI polish.'
988
- }
989
- },
990
- qaEvidence: {
991
- journeyContract: aicoderJourneyContract,
992
- scorecardPassed: true,
993
- compile: { status: 'pass' },
994
- routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
995
- deployStatus: 'pass',
996
- publishStatus: 'published',
997
- sampleDataStatus: 'pass'
998
- }
999
- });
1000
- assert.equal(aicoderRouteOnlyRun.outcome, 'false_pass');
1001
- assert.equal(aicoderRouteOnlyRun.gates.some((gate) => gate.key === 'aicoder_workflow_proof_readiness' && gate.status === 'blocked'), true);
1002
- assert.equal(aicoderRouteOnlyRun.gates.some((gate) => gate.key === 'aicoder_workflow_proof_checkpoint' && gate.status === 'blocked'), true);
1003
- assert.equal(aicoderRouteOnlyRun.metadata?.workflowProofReadiness?.status, 'route_only');
1004
- assert.equal(aicoderRouteOnlyRun.metadata?.workflowProofCheckpoint?.blocksPublishUntilWorkflowProof, true);
1005
- assert.equal(aicoderRouteOnlyRun.metadata?.workflowProofCheckpoint?.blocksWowUiUntilWorkflowProof, true);
1006
- assert.equal(aicoderRouteOnlyRun.events.some((event) => event.category === 'aicoder_workflow_proof_checkpoint'), true);
1007
-
1008
- const aicoderMissingJourneyContractRun = buildAICoderAIRunFromEvidence({
1009
- app: { _id: 'missing-journey-app', name: 'Missing Journey App' },
1010
- job: {
1011
- _id: 'aicoder-missing-journey',
1012
- phase: 'COMPLETE',
1013
- status: 'Passed'
1014
- },
1015
- qaEvidence: {
1016
- scorecardPassed: true,
1017
- compile: { status: 'pass' },
1018
- routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
1019
- deployStatus: 'pass',
1020
- publishStatus: 'published',
1021
- sampleDataStatus: 'pass'
1022
- }
1023
- });
1024
- const aicoderMissingJourneyGate = aicoderMissingJourneyContractRun.gates.find((gate) => gate.key === 'aicoder_journey_contract');
1025
- assert.equal(aicoderMissingJourneyContractRun.outcome, 'false_pass');
1026
- assert.equal(aicoderMissingJourneyGate?.status, 'blocked');
1027
- assert.equal(aicoderMissingJourneyGate?.metadata?.valid, false);
1028
- assert.equal(aicoderMissingJourneyGate?.metadata?.blocksBuildUntilValid, true);
1029
- assert.ok(Array.isArray(aicoderMissingJourneyGate?.metadata?.issueCodes));
1030
- assert.ok((aicoderMissingJourneyGate?.metadata?.issueCodes || []).includes('missing_contract'));
1031
- assert.equal(aicoderMissingJourneyContractRun.metadata?.journeyContract?.valid, false);
1032
- assert.equal(aicoderMissingJourneyContractRun.metadata?.workflowProofReadiness?.status, 'missing_journey_contract');
1033
- assert.equal(classifyAIRunFailureClass(aicoderMissingJourneyContractRun), 'journey_contract');
1034
- const aicoderMissingJourneyRetry = decideAIRunRetry({ currentRun: aicoderMissingJourneyContractRun });
1035
- assert.equal(aicoderMissingJourneyRetry.action, 'retry_journey_contract');
1036
- assert.match(String(aicoderMissingJourneyRetry.nextAction || ''), /APP_JOURNEY_CONTRACT/i);
1037
- assert.equal(aicoderMissingJourneyContractRun.events.some((event) => event.category === 'aicoder_journey_contract'), true);
1038
-
1039
- const aicoderRepeatedJourneyRun = buildAICoderAIRunFromEvidence({
1040
- app: { _id: 'repeated-journey-app', name: 'Repeated Journey App' },
1041
- job: {
1042
- _id: 'aicoder-repeated-journey',
1043
- phase: 'Build',
1044
- status: 'Running',
1045
- aicoderV6Budget: { maxRepeatedNoProgress: 2 },
1046
- aicoderV6StepHistory: [{
1047
- lane: 'aicoder',
1048
- stepType: 'journey_validation',
1049
- outcome: 'needs_repair',
1050
- failureClass: 'workflow',
1051
- blocker: 'Journey contract still has no last saved/exported result.',
1052
- evidenceHash: 'journey-missing-final-result',
1053
- artifactPaths: ['qa/journey-contract-review.json']
1054
- }, {
1055
- lane: 'aicoder',
1056
- stepType: 'journey_validation',
1057
- outcome: 'needs_repair',
1058
- failureClass: 'workflow',
1059
- blocker: 'Journey contract still has no last saved/exported result.',
1060
- evidenceHash: 'journey-missing-final-result',
1061
- artifactPaths: ['qa/journey-contract-review.json']
1062
- }]
1063
- },
1064
- qaEvidence: {
1065
- journeyContract: aicoderJourneyContract,
1066
- compile: { status: 'pass' },
1067
- routeProbes: [{ route: '/dashboard/hub', status: 'pass' }]
1068
- }
1069
- });
1070
- const aicoderRepeatedJourneyGate = aicoderRepeatedJourneyRun.gates.find((gate) => gate.key === 'manager_no_blind_loop_policy');
1071
- assert.equal(aicoderRepeatedJourneyGate?.status, 'blocked');
1072
- assert.equal(aicoderRepeatedJourneyGate?.metadata?.action, 'park_repeated_failure');
1073
- assert.equal(aicoderRepeatedJourneyGate?.metadata?.requiresNewEvidence, true);
1074
- assert.equal(aicoderRepeatedJourneyGate?.metadata?.productRepairAllowed, false);
1075
- assert.equal(aicoderRepeatedJourneyRun.outcome, 'manual_handoff');
1076
- assert.equal(aicoderRepeatedJourneyRun.events.some((event) => event.category === 'manager_no_blind_loop_policy'), true);
1077
- assert.equal(aicoderRepeatedJourneyRun.metadata?.managerNoBlindLoopPolicy?.requiresNewEvidence, true);
1078
-
1079
- const aicoderInfraRetryRun = buildAICoderAIRunFromEvidence({
1080
- app: { _id: 'aicoder-infra-retry-app', name: 'AICoder Infra Retry App' },
1081
- job: {
1082
- _id: 'aicoder-infra-retry',
1083
- phase: 'QA',
1084
- status: 'Running',
1085
- aicoderV6StepHistory: [{
1086
- lane: 'qa',
1087
- stepType: 'workflow_qa',
1088
- outcome: 'needs_repair',
1089
- failureClass: 'infra',
1090
- blocker: 'Puppeteer module is missing before workflow QA can run.',
1091
- evidenceHash: 'puppeteer-module-missing',
1092
- artifactPaths: ['qa/puppeteer-preflight.log']
1093
- }]
1094
- },
1095
- qaEvidence: {
1096
- infraChecks: [{
1097
- name: 'puppeteer_require',
1098
- status: 'blocked',
1099
- message: 'Cannot find module puppeteer.',
1100
- path: 'qa/puppeteer-preflight.log'
1101
- }]
1102
- }
1103
- });
1104
- const aicoderInfraRetryGate = aicoderInfraRetryRun.gates.find((gate) => gate.key === 'manager_no_blind_loop_policy');
1105
- assert.equal(aicoderInfraRetryGate?.status, 'warn');
1106
- assert.equal(aicoderInfraRetryGate?.metadata?.action, 'retry_infra');
1107
- assert.equal(aicoderInfraRetryGate?.metadata?.productRepairFailure, false);
1108
- assert.equal(aicoderInfraRetryGate?.metadata?.dispatchAction, 'run_infra_repair');
1109
- assert.equal(aicoderInfraRetryRun.outcome, 'qa_infra_failed');
1110
-
1111
- const aicoderFreshProofRun = buildAICoderAIRunFromEvidence({
1112
- app: { _id: 'fresh-proof-app', name: 'Fresh Proof App' },
1113
- job: { _id: 'aicoder-fresh-proof', phase: 'COMPLETE', status: 'Passed' },
1114
- qaEvidence: {
1115
- journeyContract: aicoderJourneyContract,
1116
- workflowQaRows: aicoderWorkflowQaRows,
1117
- scorecardPassed: true,
1118
- compile: { status: 'pass' },
1119
- routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
1120
- deployStatus: 'pass',
1121
- publishStatus: 'published',
1122
- sampleDataStatus: 'pass',
1123
- businessAssertions: [{
1124
- stepId: 'workflow-completion',
1125
- route: '/dashboard/hub',
1126
- assertion: 'Saved recommendation report row appears with calculated pressure result.',
1127
- status: 'pass',
1128
- dataProof: 'Seeded hose row produced a pressure result.',
1129
- artifactPaths: ['qa-artifacts/workflow-completion.json']
1130
- }]
1131
- }
1132
- });
1133
- const freshProofFingerprint = String(aicoderFreshProofRun.metadata?.workflowProofReadiness?.workflowProofFingerprint || '');
1134
- assert.match(freshProofFingerprint, /^aicoder-workflow-proof-/);
1135
-
1136
- const aicoderStaleProofRun = buildAICoderAIRunFromEvidence({
1137
- app: { _id: 'stale-proof-app', name: 'Stale Proof App' },
1138
- job: { _id: 'aicoder-stale-proof', phase: 'COMPLETE', status: 'Passed' },
1139
- qaEvidence: {
1140
- journeyContract: aicoderJourneyContract,
1141
- workflowQaRows: aicoderWorkflowQaRows,
1142
- scorecardPassed: true,
1143
- compile: { status: 'pass' },
1144
- routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
1145
- deployStatus: 'pass',
1146
- publishStatus: 'published',
1147
- sampleDataStatus: 'pass',
1148
- previousWorkflowProofFingerprint: freshProofFingerprint,
1149
- businessAssertions: [{
1150
- stepId: 'workflow-completion',
1151
- route: '/dashboard/hub',
1152
- assertion: 'Saved recommendation report row appears with calculated pressure result.',
1153
- status: 'pass',
1154
- dataProof: 'Seeded hose row produced a pressure result.',
1155
- artifactPaths: ['qa-artifacts/workflow-completion.json']
1156
- }]
1157
- }
1158
- });
1159
- assert.equal(aicoderStaleProofRun.metadata?.workflowProofReadiness?.status, 'stale_workflow_proof');
1160
- assert.equal(aicoderStaleProofRun.metadata?.workflowProofReadiness?.proofFreshness, 'same_as_previous');
1161
- assert.equal(aicoderStaleProofRun.gates.some((gate) => gate.key === 'aicoder_workflow_proof_readiness' && gate.status === 'blocked'), true);
1162
-
1163
- const assistantRun = buildAssistantAIRunFromEvidence({
1164
- conversation: { _id: 'conversation-1', title: 'Invoice query', status: 'Closed', accepted: true },
1165
- messages: [{ role: 'assistant', content: 'Used the current date window.' }],
1166
- answerQuality: {
1167
- queryStatus: 'ok',
1168
- requiresCurrentDate: true,
1169
- currentDateUsed: '2026-06-16',
1170
- expectedCurrentDate: '2026-06-16',
1171
- legalQueryShape: true,
1172
- queryExecutions: [{
1173
- id: 'tool-result-invoices-june-2026',
1174
- tool: 'aiAssistantMongoRead',
1175
- status: 'ok',
1176
- collection: 'invoices',
1177
- resultCount: 3
1178
- }],
1179
- citations: [{ id: 'tool-result-invoices-june-2026' }],
1180
- confidence: { level: 'high' },
1181
- nextActions: ['Review the returned June 2026 invoice rows.']
1182
- },
1183
- correctnessChecks: [{
1184
- assertion: 'Date window uses the actual current month.',
1185
- status: 'pass',
1186
- expected: 'June 2026',
1187
- observed: 'June 2026'
1188
- }]
1189
- });
1190
- assert.equal(assistantRun.source, 'ai_assistant');
1191
- assert.equal(assistantRun.outcome, 'accepted');
1192
- assert.equal(assistantRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'pass'), true);
1193
- assert.equal(assistantRun.metadata?.answerQuality?.queryStatus, 'ok');
1194
- assert.equal(assistantRun.metadata?.answerQuality?.queryEvidencePresent, true);
1195
- assert.equal(assistantRun.events.some((event) => event.type === 'assistant_query' && event.metadata?.collection === 'invoices'), true);
1196
-
1197
- const assistantNoDataRun = buildAssistantAIRunFromEvidence({
1198
- conversation: { _id: 'conversation-no-data', title: 'No invoice query', status: 'Closed', accepted: true },
1199
- messages: [{ role: 'assistant', content: 'No invoices were found for June 2026.' }],
1200
- answerQuality: {
1201
- queryStatus: 'no_data',
1202
- noDataConfirmed: true,
1203
- requiresCurrentDate: true,
1204
- currentDateUsed: '2026-06-16',
1205
- expectedCurrentDate: '2026-06-16',
1206
- legalQueryShape: true,
1207
- queryExecutions: [{
1208
- id: 'tool-result-empty-invoices-june-2026',
1209
- tool: 'aiAssistantMongoRead',
1210
- status: 'no_data',
1211
- collection: 'invoices',
1212
- resultCount: 0
1213
- }],
1214
- citationRefs: ['tool-result-empty-invoices-june-2026'],
1215
- confidenceLevel: 'high',
1216
- nextActions: ['Verify the date range or customer filter if invoices were expected.']
1217
- }
1218
- });
1219
- assert.equal(assistantNoDataRun.outcome, 'accepted');
1220
- assert.equal(assistantNoDataRun.metadata?.answerQuality?.queryStatus, 'no_data');
1221
- assert.equal(assistantNoDataRun.metadata?.answerQuality?.noDataConfirmed, true);
1222
- assert.equal(assistantNoDataRun.metadata?.answerQuality?.queryEvidencePresent, true);
1223
-
1224
- const assistantCitationOnlyRun = buildAssistantAIRunFromEvidence({
1225
- conversation: { _id: 'conversation-citation-only', title: 'Citation-only answer', status: 'Closed', accepted: true },
1226
- messages: [{ role: 'assistant', content: 'Found invoices for June 2026.' }],
1227
- answerQuality: {
1228
- queryStatus: 'ok',
1229
- requiresCurrentDate: true,
1230
- currentDateUsed: '2026-06-16',
1231
- expectedCurrentDate: '2026-06-16',
1232
- legalQueryShape: true,
1233
- citationRefs: ['tool-result-invoices-june-2026'],
1234
- confidenceLevel: 'high',
1235
- nextActions: ['Open the invoice list.']
1236
- }
1237
- });
1238
- assert.notEqual(assistantCitationOnlyRun.outcome, 'accepted');
1239
- assert.equal(assistantCitationOnlyRun.metadata?.answerQuality?.status, 'missing_query_proof');
1240
- assert.equal(assistantCitationOnlyRun.metadata?.answerQuality?.queryEvidenceRequired, true);
1241
- assert.equal(assistantCitationOnlyRun.metadata?.answerQuality?.queryEvidencePresent, false);
1242
- assert.equal(classifyAIRunFailureClass(assistantCitationOnlyRun), 'assistant_missing_evidence');
1243
- assert.equal(decideAIRunRetry({ currentRun: assistantCitationOnlyRun }).action, 'retry_assistant_answer_quality');
1244
-
1245
- const assistantWrongDateRun = buildAssistantAIRunFromEvidence({
1246
- conversation: { _id: 'conversation-wrong-date', title: 'Wrong month query', status: 'Closed', accepted: true },
1247
- messages: [{ role: 'assistant', content: 'Used May 2026.' }],
1248
- answerQuality: {
1249
- queryStatus: 'ok',
1250
- requiresCurrentDate: true,
1251
- currentDateUsed: '2026-05-01',
1252
- expectedCurrentDate: '2026-06-16',
1253
- legalQueryShape: true,
1254
- citationRefs: ['tool-result-wrong-month'],
1255
- confidenceLevel: 'high',
1256
- nextActions: ['Rerun using the actual current date.']
1257
- }
1258
- });
1259
- assert.notEqual(assistantWrongDateRun.outcome, 'accepted');
1260
- assert.equal(assistantWrongDateRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'fail'), true);
1261
- assert.equal(assistantWrongDateRun.metadata?.answerQuality?.status, 'date_incorrect');
1262
- assert.equal(classifyAIRunFailureClass(assistantWrongDateRun), 'assistant_date_window');
1263
- assert.equal(decideAIRunRetry({ currentRun: assistantWrongDateRun }).action, 'retry_assistant_date_window');
1264
-
1265
- const assistantMissingDateWindowRun = buildAssistantAIRunFromEvidence({
1266
- conversation: { _id: 'conversation-missing-window', title: 'Missing date window', status: 'Closed', accepted: true },
1267
- messages: [{ role: 'assistant', content: 'Used the current date but did not record the query window.' }],
1268
- answerQuality: {
1269
- queryStatus: 'ok',
1270
- requiresCurrentDate: true,
1271
- currentDateUsed: '2026-06-16',
1272
- expectedCurrentDate: '2026-06-16',
1273
- requiresDateWindow: true,
1274
- citationRefs: ['tool-result-no-window'],
1275
- confidenceLevel: 'high',
1276
- nextActions: ['Rerun with concrete date-window evidence.']
1277
- }
1278
- });
1279
- assert.notEqual(assistantMissingDateWindowRun.outcome, 'accepted');
1280
- assert.equal(assistantMissingDateWindowRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'fail'), true);
1281
- assert.equal(assistantMissingDateWindowRun.metadata?.answerQuality?.status, 'missing_date_window');
1282
- assert.equal(assistantMissingDateWindowRun.metadata?.answerQuality?.dateWindowRequired, true);
1283
- assert.equal(assistantMissingDateWindowRun.metadata?.answerQuality?.dateWindowPresent, false);
1284
- assert.equal(classifyAIRunFailureClass(assistantMissingDateWindowRun), 'assistant_date_window');
1285
- assert.equal(decideAIRunRetry({ currentRun: assistantMissingDateWindowRun }).action, 'retry_assistant_date_window');
1286
-
1287
- const assistantIllegalProjectionRun = buildAssistantAIRunFromEvidence({
1288
- conversation: { _id: 'conversation-illegal-query', title: 'Illegal Mongo projection', status: 'Closed', accepted: true },
1289
- messages: [{ role: 'assistant', content: 'Mongo query failed.' }],
1290
- answerQuality: {
1291
- queryStatus: 'ok',
1292
- requiresCurrentDate: false,
1293
- mongoQuery: {
1294
- collection: 'invoices',
1295
- filter: { customerId: 'customer-1' },
1296
- projection: { 'lineItems.$.amount': 1 }
1297
- },
1298
- citationRefs: ['tool-result-illegal-projection'],
1299
- confidenceLevel: 'high',
1300
- nextActions: ['Rewrite the projection using a legal aggregation or full field projection.']
1301
- }
1302
- });
1303
- assert.notEqual(assistantIllegalProjectionRun.outcome, 'accepted');
1304
- assert.equal(assistantIllegalProjectionRun.metadata?.answerQuality?.status, 'illegal_query_shape');
1305
- assert.equal(classifyAIRunFailureClass(assistantIllegalProjectionRun), 'assistant_query_shape');
1306
- assert.equal(decideAIRunRetry({ currentRun: assistantIllegalProjectionRun }).action, 'retry_assistant_query_shape');
1307
-
1308
- const assistantQueryErrorRun = buildAssistantAIRunFromEvidence({
1309
- conversation: { _id: 'conversation-query-error', title: 'Query error answer', status: 'Closed', accepted: true },
1310
- messages: [{ role: 'assistant', content: 'No invoices were found.' }],
1311
- answerQuality: {
1312
- queryStatus: 'query_error',
1313
- requiresCurrentDate: false,
1314
- legalQueryShape: true,
1315
- citationRefs: ['tool-result-query-error'],
1316
- confidenceLevel: 'high',
1317
- nextActions: ['Fix the query error and retry before answering.']
1318
- }
1319
- });
1320
- assert.notEqual(assistantQueryErrorRun.outcome, 'accepted');
1321
- assert.equal(assistantQueryErrorRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'blocked'), true);
1322
- assert.equal(assistantQueryErrorRun.metadata?.answerQuality?.queryStatus, 'query_error');
1323
- assert.equal(classifyAIRunFailureClass(assistantQueryErrorRun), 'assistant_query_error');
1324
- assert.equal(decideAIRunRetry({ currentRun: assistantQueryErrorRun }).action, 'retry_assistant_query');
1325
-
1326
- const assistantPermissionErrorRun = buildAssistantAIRunFromEvidence({
1327
- conversation: { _id: 'conversation-permission-error', title: 'Permission error answer', status: 'Closed', accepted: true },
1328
- messages: [{ role: 'assistant', content: 'No invoices were found.' }],
1329
- answerQuality: {
1330
- queryStatus: 'permission_error',
1331
- requiresCurrentDate: false,
1332
- citationRefs: ['tool-result-permission-error'],
1333
- confidenceLevel: 'high',
1334
- nextActions: ['Ask an authorized user to grant invoice access before answering.']
1335
- }
1336
- });
1337
- assert.notEqual(assistantPermissionErrorRun.outcome, 'accepted');
1338
- assert.equal(assistantPermissionErrorRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'blocked'), true);
1339
- assert.equal(assistantPermissionErrorRun.metadata?.answerQuality?.queryStatus, 'permission_error');
1340
- assert.equal(classifyAIRunFailureClass(assistantPermissionErrorRun), 'assistant_permission');
1341
- assert.equal(decideAIRunRetry({ currentRun: assistantPermissionErrorRun }).action, 'request_assistant_permission');
1342
-
1343
- const assistantMissingQualityRun = buildAssistantAIRunFromEvidence({
1344
- conversation: { _id: 'conversation-missing-quality', title: 'Missing assistant answerQuality', status: 'Closed', accepted: true },
1345
- messages: [{ role: 'assistant', content: 'Invoices look fine.' }]
1346
- });
1347
- assert.notEqual(assistantMissingQualityRun.outcome, 'accepted');
1348
- assert.equal(assistantMissingQualityRun.gates.some((gate) => gate.key === 'assistant_answer_quality' && gate.status === 'blocked'), true);
1349
- assert.equal(assistantMissingQualityRun.metadata?.answerQuality?.status, 'missing_data_source');
1350
- assert.equal(classifyAIRunFailureClass(assistantMissingQualityRun), 'assistant_missing_evidence');
1351
- assert.equal(decideAIRunRetry({ currentRun: assistantMissingQualityRun }).action, 'retry_assistant_answer_quality');
1352
-
1353
- const assistantAnswerRun = buildAssistantAIRunFromEvidence({
1354
- runId: 'ai-run:ai_assistant:chat:conversation-1:message-2',
1355
- requestId: 'request-1',
1356
- messageId: 'message-2',
1357
- conversation: { _id: 'conversation-1', title: 'Invoice query', status: 'Closed' },
1358
- messages: [
1359
- { _id: 'message-1', role: 'user', content: 'Show invoices for this month.' },
1360
- {
1361
- _id: 'message-2',
1362
- role: 'assistant',
1363
- content: 'Found 3 invoices for June 2026.',
1364
- usage: { model: 'gpt-5.4-mini' }
1365
- }
1366
- ],
1367
- answerQuality: {
1368
- queryStatus: 'ok',
1369
- requiresCurrentDate: true,
1370
- currentDateUsed: '2026-06-16',
1371
- expectedCurrentDate: '2026-06-16',
1372
- legalQueryShape: true,
1373
- queryExecutions: [{
1374
- id: 'tool-result-invoices-june-2026',
1375
- tool: 'aiAssistantMongoRead',
1376
- status: 'ok',
1377
- collection: 'invoices',
1378
- resultCount: 3
1379
- }],
1380
- citationRefs: ['tool-result-invoices-june-2026'],
1381
- confidenceLevel: 'high',
1382
- nextActions: ['Open the invoice list filtered to June 2026.']
1383
- },
1384
- usageLedger: [{
1385
- model: 'gpt-5.4-mini',
1386
- category: 'ai-terminal',
1387
- usage_source: 'ai_assistant',
1388
- usage_surface: 'assistant',
1389
- usage_phase: 'chat',
1390
- input_tokens: 100,
1391
- output_tokens: 50,
1392
- total_tokens: 150,
1393
- cost_estimate: 0.02
1394
- }]
1395
- });
1396
- assert.equal(assistantAnswerRun.id, 'ai-run:ai_assistant:chat:conversation-1:message-2');
1397
- assert.equal(assistantAnswerRun.sourceIds.requestId, 'request-1');
1398
- assert.equal(assistantAnswerRun.sourceIds.messageId, 'message-2');
1399
- assert.equal(assistantAnswerRun.events.some((event) => event.type === 'assistant_message' && event.metadata?.model === 'gpt-5.4-mini'), true);
1400
- assert.equal(assistantAnswerRun.events.some((event) => event.type === 'assistant_query' && event.metadata?.id === 'tool-result-invoices-june-2026'), true);
1401
- assert.equal(assistantAnswerRun.cost?.surfaces?.assistant.estimatedUsd, 0.02);
1402
-
1403
- console.log('ai run evidence tests passed');