@runcofactor/cli 0.55.0 → 0.56.0

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 (248) hide show
  1. package/dist/{account-RHHS7HT4.js → account-CZYZD2JS.js} +5 -5
  2. package/dist/{alert-B5WEOKHP.js → alert-JQ4SDEB7.js} +8 -8
  3. package/dist/{api-catalog-UXONX3BR.js → api-catalog-IWQC35P2.js} +5 -5
  4. package/dist/{api-key-J3A4TJKN.js → api-key-GUDXIIEA.js} +5 -5
  5. package/dist/{attachment-ZQW7DR4G.js → attachment-CPZYOBUB.js} +5 -5
  6. package/dist/{auth-HQGKUZBS.js → auth-DS6MBVEI.js} +3 -3
  7. package/dist/{benchmark-TIKJA32J.js → benchmark-6HPCIQHD.js} +5 -5
  8. package/dist/{blackcat-Z5LNV2GS.js → blackcat-V3L63WFE.js} +3 -3
  9. package/dist/{chunk-JQG3V5E3.js → chunk-2E3STBHS.js} +2 -2
  10. package/dist/{chunk-KL2ARGH6.js → chunk-2OHYMT3A.js} +3 -3
  11. package/dist/{chunk-KL2ARGH6.js.map → chunk-2OHYMT3A.js.map} +1 -1
  12. package/dist/{chunk-W6DL4IP6.js → chunk-3LGCHNBC.js} +2 -2
  13. package/dist/{chunk-BJHAVM7Z.js → chunk-4MFMPC5P.js} +46 -2
  14. package/dist/chunk-4MFMPC5P.js.map +1 -0
  15. package/dist/{chunk-MB4FS35J.js → chunk-56HFZHQM.js} +8 -8
  16. package/dist/{chunk-CZDQVQ57.js → chunk-5OYWNS6D.js} +20 -9
  17. package/dist/chunk-5OYWNS6D.js.map +1 -0
  18. package/dist/{chunk-YTXZUWMN.js → chunk-62EXS76C.js} +6 -6
  19. package/dist/{chunk-QVMGXMP5.js → chunk-6ILWJFKY.js} +368 -6
  20. package/dist/chunk-6ILWJFKY.js.map +1 -0
  21. package/dist/{chunk-6X6ZTDXP.js → chunk-BDOL622T.js} +4 -4
  22. package/dist/{chunk-L4JQ236V.js → chunk-C3CXVX2B.js} +4 -4
  23. package/dist/{chunk-33U56YGD.js → chunk-CWICLBLU.js} +2 -1
  24. package/dist/{chunk-33U56YGD.js.map → chunk-CWICLBLU.js.map} +1 -1
  25. package/dist/{chunk-XM3WTJ7Y.js → chunk-DEVD2WD2.js} +2 -2
  26. package/dist/{chunk-WWUEKQLR.js → chunk-EWK44F6V.js} +3 -3
  27. package/dist/chunk-EWK44F6V.js.map +1 -0
  28. package/dist/{chunk-CQSQNDMV.js → chunk-FNHPTTRF.js} +7 -5
  29. package/dist/chunk-FNHPTTRF.js.map +1 -0
  30. package/dist/{chunk-Z72GWGH2.js → chunk-GCD4EHCD.js} +6 -6
  31. package/dist/{chunk-3KBYI6RR.js → chunk-H6ZMKNP7.js} +3 -3
  32. package/dist/{chunk-5OKCT6LF.js → chunk-IEWAH7W3.js} +5 -5
  33. package/dist/{chunk-TGI2AAOZ.js → chunk-IV4HRGKX.js} +77 -12
  34. package/dist/chunk-IV4HRGKX.js.map +1 -0
  35. package/dist/{chunk-635IQV6B.js → chunk-J2ZQULU3.js} +2 -2
  36. package/dist/{chunk-ZZZ33KTO.js → chunk-K2IDR6FR.js} +3 -3
  37. package/dist/{chunk-YEH7UIUY.js → chunk-KTZRI27M.js} +4 -4
  38. package/dist/{chunk-RV7FZ4ID.js → chunk-L644NMDI.js} +3 -3
  39. package/dist/{chunk-RV7FZ4ID.js.map → chunk-L644NMDI.js.map} +1 -1
  40. package/dist/{chunk-3TZABC7D.js → chunk-LFT7GUWS.js} +63 -17
  41. package/dist/chunk-LFT7GUWS.js.map +1 -0
  42. package/dist/{chunk-QHRWXCON.js → chunk-O7B2IYCZ.js} +11 -11
  43. package/dist/chunk-O7B2IYCZ.js.map +1 -0
  44. package/dist/{chunk-U3MRXQZS.js → chunk-RHWPZKRV.js} +24 -1
  45. package/dist/chunk-RHWPZKRV.js.map +1 -0
  46. package/dist/{chunk-OU4I3MEH.js → chunk-UJSW72LG.js} +3 -3
  47. package/dist/{chunk-R2CRH6JQ.js → chunk-VACACCD6.js} +3 -3
  48. package/dist/{chunk-EGWVL5XA.js → chunk-VMAR67FF.js} +2 -2
  49. package/dist/{chunk-ZH7HWVEE.js → chunk-VMJ7TBVM.js} +2 -2
  50. package/dist/chunk-WRRA4ATV.js +332 -0
  51. package/dist/chunk-WRRA4ATV.js.map +1 -0
  52. package/dist/{chunk-XWJJYZQC.js → chunk-XHEVDABB.js} +2 -2
  53. package/dist/{chunk-SCQVBLNR.js → chunk-XHGF6VC6.js} +4 -4
  54. package/dist/{credential-2IEZDTH3.js → credential-GJW7LGYP.js} +5 -5
  55. package/dist/{credential-template-S5WSOI3P.js → credential-template-UWBYKKWD.js} +5 -5
  56. package/dist/dev-PBW7BSOD.js +605 -0
  57. package/dist/dev-PBW7BSOD.js.map +1 -0
  58. package/dist/{digest-HQGL7H6E.js → digest-XEHGCJM4.js} +8 -8
  59. package/dist/{docs-CJQZVERZ.js → docs-KH4BCEQF.js} +5 -5
  60. package/dist/{doctor-EGK5AB77.js → doctor-FOXXE5SK.js} +3 -3
  61. package/dist/{environment-MWVXYEDU.js → environment-EBDPQTIS.js} +7 -7
  62. package/dist/{eval-F4NORBQI.js → eval-QZSSEICV.js} +67 -27
  63. package/dist/eval-QZSSEICV.js.map +1 -0
  64. package/dist/{exploration-JC7R7KTJ.js → exploration-LCGKRGOQ.js} +5 -5
  65. package/dist/{exploratory-test-BHK5FTMJ.js → exploratory-test-SGECQGIX.js} +6 -6
  66. package/dist/{external-run-UL5CKG54.js → external-run-2AJAI5O7.js} +9 -9
  67. package/dist/{feature-flag-NMO25TZN.js → feature-flag-P7N4WQIH.js} +5 -5
  68. package/dist/{feedback-3JNPSUXS.js → feedback-LAT7TQ2T.js} +6 -6
  69. package/dist/{flow-AYE4RTZN.js → flow-NH2DC6AP.js} +5 -5
  70. package/dist/{github-DM2DCXRY.js → github-FCEKBLXI.js} +6 -6
  71. package/dist/index.js +106 -408
  72. package/dist/index.js.map +1 -1
  73. package/dist/{init-CPDT5XAU.js → init-5U5EZOAW.js} +5 -5
  74. package/dist/{install-JZRNCHMO.js → install-X3UNVXKY.js} +5 -5
  75. package/dist/{issues-GRFJB52C.js → issues-4P6I3YQW.js} +8 -8
  76. package/dist/{knobs-3Y4QXWAD.js → knobs-JKTWJ6ZG.js} +5 -5
  77. package/dist/{landing-ABYL5WVG.js → landing-6AGLKI66.js} +7 -7
  78. package/dist/{list-WG5QB4NK.js → list-TWP2RP33.js} +5 -5
  79. package/dist/{local-KX24OR5Z.js → local-D75QE5TB.js} +7 -7
  80. package/dist/{login-MLJQAIFK.js → login-RBET4TIP.js} +5 -5
  81. package/dist/{mcp-DDTO54XD.js → mcp-562SUUMK.js} +11 -11
  82. package/dist/{metrics-BJLLOSPQ.js → metrics-4WF2GEPA.js} +5 -5
  83. package/dist/{monitor-E2CKGHPM.js → monitor-WJXH54H2.js} +5 -5
  84. package/dist/{perf-IX7JOMUE.js → perf-C6N6P7YG.js} +12 -361
  85. package/dist/perf-C6N6P7YG.js.map +1 -0
  86. package/dist/{product-2ECWM2JN.js → product-CYEQ7HOB.js} +5 -5
  87. package/dist/{product-map-O542LZQL.js → product-map-MSDLIFZY.js} +7 -7
  88. package/dist/{prompts-Y7O4XJ5P.js → prompts-ME53WPN4.js} +5 -5
  89. package/dist/{proofs-TNOBLSRP.js → proofs-D3G6ZUFP.js} +11 -9
  90. package/dist/{property-TZCGOZQG.js → property-5GLJNAVB.js} +29 -10
  91. package/dist/property-5GLJNAVB.js.map +1 -0
  92. package/dist/{psql-M66YSUXW.js → psql-EXAUDU3W.js} +5 -5
  93. package/dist/{record-3JINBRAR.js → record-EE7NGNKY.js} +6 -6
  94. package/dist/{redis-FOIBINYA.js → redis-M4EYWKOJ.js} +5 -5
  95. package/dist/{release-B4VWMVEI.js → release-4KUWVWWC.js} +5 -5
  96. package/dist/{runbook-EYMSE37E.js → runbook-AHU77ANQ.js} +5 -5
  97. package/dist/{sandbox-R6EMGOKR.js → sandbox-FBLJEYA2.js} +1910 -1629
  98. package/dist/sandbox-FBLJEYA2.js.map +1 -0
  99. package/dist/{scenarios-W7YNLBVO.js → scenarios-TU656T2B.js} +5 -5
  100. package/dist/{schedule-EDHQJUUZ.js → schedule-DXJI6SYO.js} +8 -8
  101. package/dist/{session-4N62APNQ.js → session-RUFTJHF4.js} +10 -10
  102. package/dist/{skill-XFGMNOVM.js → skill-ZK76GQ47.js} +7 -7
  103. package/dist/{skill-XFGMNOVM.js.map → skill-ZK76GQ47.js.map} +1 -1
  104. package/dist/skills/cofactor-debug-run/SKILL.md +2 -1
  105. package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
  106. package/dist/skills/cofactor-debug-run/version.json +1 -1
  107. package/dist/{slack-RUAXG6TB.js → slack-M3OKDVMY.js} +6 -6
  108. package/dist/{spec-ZZKMW7ER.js → spec-5MXEBLYR.js} +5 -5
  109. package/dist/{src-OKSAEHQS.js → src-2X5OQRPJ.js} +4 -4
  110. package/dist/{src-DGIVA22K.js → src-72EFBA2R.js} +3 -3
  111. package/dist/{src-ECZWYNSV.js → src-KH6WSBJV.js} +5 -5
  112. package/dist/{src-CQ2YAW7F.js → src-VLV36QYH.js} +127 -20
  113. package/dist/src-VLV36QYH.js.map +1 -0
  114. package/dist/{start-OCZGILRL.js → start-PDYBRB5T.js} +5 -5
  115. package/dist/{status-YTJ6YITG.js → status-VMVPVCDA.js} +5 -5
  116. package/dist/{tag-KBG4SWRL.js → tag-7KTDLPVU.js} +6 -6
  117. package/dist/{task-O6XRMHYE.js → task-QLFYZNKR.js} +6 -6
  118. package/dist/{teams-NFUHS7XI.js → teams-Y7BXCY6P.js} +7 -7
  119. package/dist/{test-suite-6BH3DESN.js → test-suite-6U22AYFG.js} +15 -14
  120. package/dist/test-suite-6U22AYFG.js.map +1 -0
  121. package/dist/{tickets-JU2STK4B.js → tickets-CQDJDNPY.js} +5 -5
  122. package/dist/{trace-NMSGKASJ.js → trace-QDORWXYX.js} +8 -8
  123. package/dist/{triage-JGECJJU5.js → triage-GY7M3UGG.js} +6 -6
  124. package/dist/{trigger-OSPEVCCQ.js → trigger-DLFAORX4.js} +9 -9
  125. package/dist/{update-check-FNP6RFZO.js → update-check-ES6XQ7OF.js} +4 -4
  126. package/dist/{upgrade-3PPBXFAT.js → upgrade-WKEOW5GS.js} +5 -5
  127. package/dist/{usage-QMCU2JIO.js → usage-E6FDTR3W.js} +7 -7
  128. package/dist/{utilities-7VHWTSJT.js → utilities-4Z6YX3L5.js} +6 -6
  129. package/dist/{visual-WIZSPTVK.js → visual-TA6LPVDJ.js} +5 -5
  130. package/dist/{workflow-23HKTJLS.js → workflow-B5FXS2CJ.js} +58 -31
  131. package/dist/workflow-B5FXS2CJ.js.map +1 -0
  132. package/dist/{workflow-cache-ACGM3BOI.js → workflow-cache-MNLEMRMM.js} +16 -16
  133. package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
  134. package/dist/{workflow-debug-TVLBNRCB.js → workflow-debug-TNBUGSBK.js} +11 -11
  135. package/dist/{workflow-feedback-GB5VPGE2.js → workflow-feedback-G2ZXAUGI.js} +5 -5
  136. package/dist/{workflow-fork-2IPJNR76.js → workflow-fork-6HHOMC2D.js} +5 -5
  137. package/dist/{workflow-promotion-QEQUXVUT.js → workflow-promotion-RG7L6JZT.js} +5 -5
  138. package/dist/{workflow-proposals-KHGTPMD4.js → workflow-proposals-ZNF2F3UE.js} +5 -5
  139. package/dist/{workflow-revisions-F5KQEEXB.js → workflow-revisions-TP64Z6FO.js} +5 -5
  140. package/dist/{workflow-status-66HC5MEA.js → workflow-status-5RG3JX56.js} +5 -5
  141. package/package.json +3 -2
  142. package/dist/chunk-3TZABC7D.js.map +0 -1
  143. package/dist/chunk-BJHAVM7Z.js.map +0 -1
  144. package/dist/chunk-CQSQNDMV.js.map +0 -1
  145. package/dist/chunk-CZDQVQ57.js.map +0 -1
  146. package/dist/chunk-QHRWXCON.js.map +0 -1
  147. package/dist/chunk-QVMGXMP5.js.map +0 -1
  148. package/dist/chunk-TGI2AAOZ.js.map +0 -1
  149. package/dist/chunk-U3MRXQZS.js.map +0 -1
  150. package/dist/chunk-WWUEKQLR.js.map +0 -1
  151. package/dist/eval-F4NORBQI.js.map +0 -1
  152. package/dist/perf-IX7JOMUE.js.map +0 -1
  153. package/dist/property-TZCGOZQG.js.map +0 -1
  154. package/dist/sandbox-R6EMGOKR.js.map +0 -1
  155. package/dist/src-CQ2YAW7F.js.map +0 -1
  156. package/dist/test-suite-6BH3DESN.js.map +0 -1
  157. package/dist/workflow-23HKTJLS.js.map +0 -1
  158. /package/dist/{account-RHHS7HT4.js.map → account-CZYZD2JS.js.map} +0 -0
  159. /package/dist/{alert-B5WEOKHP.js.map → alert-JQ4SDEB7.js.map} +0 -0
  160. /package/dist/{api-catalog-UXONX3BR.js.map → api-catalog-IWQC35P2.js.map} +0 -0
  161. /package/dist/{api-key-J3A4TJKN.js.map → api-key-GUDXIIEA.js.map} +0 -0
  162. /package/dist/{attachment-ZQW7DR4G.js.map → attachment-CPZYOBUB.js.map} +0 -0
  163. /package/dist/{auth-HQGKUZBS.js.map → auth-DS6MBVEI.js.map} +0 -0
  164. /package/dist/{benchmark-TIKJA32J.js.map → benchmark-6HPCIQHD.js.map} +0 -0
  165. /package/dist/{blackcat-Z5LNV2GS.js.map → blackcat-V3L63WFE.js.map} +0 -0
  166. /package/dist/{chunk-JQG3V5E3.js.map → chunk-2E3STBHS.js.map} +0 -0
  167. /package/dist/{chunk-W6DL4IP6.js.map → chunk-3LGCHNBC.js.map} +0 -0
  168. /package/dist/{chunk-MB4FS35J.js.map → chunk-56HFZHQM.js.map} +0 -0
  169. /package/dist/{chunk-YTXZUWMN.js.map → chunk-62EXS76C.js.map} +0 -0
  170. /package/dist/{chunk-6X6ZTDXP.js.map → chunk-BDOL622T.js.map} +0 -0
  171. /package/dist/{chunk-L4JQ236V.js.map → chunk-C3CXVX2B.js.map} +0 -0
  172. /package/dist/{chunk-XM3WTJ7Y.js.map → chunk-DEVD2WD2.js.map} +0 -0
  173. /package/dist/{chunk-Z72GWGH2.js.map → chunk-GCD4EHCD.js.map} +0 -0
  174. /package/dist/{chunk-3KBYI6RR.js.map → chunk-H6ZMKNP7.js.map} +0 -0
  175. /package/dist/{chunk-5OKCT6LF.js.map → chunk-IEWAH7W3.js.map} +0 -0
  176. /package/dist/{chunk-635IQV6B.js.map → chunk-J2ZQULU3.js.map} +0 -0
  177. /package/dist/{chunk-ZZZ33KTO.js.map → chunk-K2IDR6FR.js.map} +0 -0
  178. /package/dist/{chunk-YEH7UIUY.js.map → chunk-KTZRI27M.js.map} +0 -0
  179. /package/dist/{chunk-OU4I3MEH.js.map → chunk-UJSW72LG.js.map} +0 -0
  180. /package/dist/{chunk-R2CRH6JQ.js.map → chunk-VACACCD6.js.map} +0 -0
  181. /package/dist/{chunk-EGWVL5XA.js.map → chunk-VMAR67FF.js.map} +0 -0
  182. /package/dist/{chunk-ZH7HWVEE.js.map → chunk-VMJ7TBVM.js.map} +0 -0
  183. /package/dist/{chunk-XWJJYZQC.js.map → chunk-XHEVDABB.js.map} +0 -0
  184. /package/dist/{chunk-SCQVBLNR.js.map → chunk-XHGF6VC6.js.map} +0 -0
  185. /package/dist/{credential-2IEZDTH3.js.map → credential-GJW7LGYP.js.map} +0 -0
  186. /package/dist/{credential-template-S5WSOI3P.js.map → credential-template-UWBYKKWD.js.map} +0 -0
  187. /package/dist/{digest-HQGL7H6E.js.map → digest-XEHGCJM4.js.map} +0 -0
  188. /package/dist/{docs-CJQZVERZ.js.map → docs-KH4BCEQF.js.map} +0 -0
  189. /package/dist/{doctor-EGK5AB77.js.map → doctor-FOXXE5SK.js.map} +0 -0
  190. /package/dist/{environment-MWVXYEDU.js.map → environment-EBDPQTIS.js.map} +0 -0
  191. /package/dist/{exploration-JC7R7KTJ.js.map → exploration-LCGKRGOQ.js.map} +0 -0
  192. /package/dist/{exploratory-test-BHK5FTMJ.js.map → exploratory-test-SGECQGIX.js.map} +0 -0
  193. /package/dist/{external-run-UL5CKG54.js.map → external-run-2AJAI5O7.js.map} +0 -0
  194. /package/dist/{feature-flag-NMO25TZN.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
  195. /package/dist/{feedback-3JNPSUXS.js.map → feedback-LAT7TQ2T.js.map} +0 -0
  196. /package/dist/{flow-AYE4RTZN.js.map → flow-NH2DC6AP.js.map} +0 -0
  197. /package/dist/{github-DM2DCXRY.js.map → github-FCEKBLXI.js.map} +0 -0
  198. /package/dist/{init-CPDT5XAU.js.map → init-5U5EZOAW.js.map} +0 -0
  199. /package/dist/{install-JZRNCHMO.js.map → install-X3UNVXKY.js.map} +0 -0
  200. /package/dist/{issues-GRFJB52C.js.map → issues-4P6I3YQW.js.map} +0 -0
  201. /package/dist/{knobs-3Y4QXWAD.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
  202. /package/dist/{landing-ABYL5WVG.js.map → landing-6AGLKI66.js.map} +0 -0
  203. /package/dist/{list-WG5QB4NK.js.map → list-TWP2RP33.js.map} +0 -0
  204. /package/dist/{local-KX24OR5Z.js.map → local-D75QE5TB.js.map} +0 -0
  205. /package/dist/{login-MLJQAIFK.js.map → login-RBET4TIP.js.map} +0 -0
  206. /package/dist/{mcp-DDTO54XD.js.map → mcp-562SUUMK.js.map} +0 -0
  207. /package/dist/{metrics-BJLLOSPQ.js.map → metrics-4WF2GEPA.js.map} +0 -0
  208. /package/dist/{monitor-E2CKGHPM.js.map → monitor-WJXH54H2.js.map} +0 -0
  209. /package/dist/{product-2ECWM2JN.js.map → product-CYEQ7HOB.js.map} +0 -0
  210. /package/dist/{product-map-O542LZQL.js.map → product-map-MSDLIFZY.js.map} +0 -0
  211. /package/dist/{prompts-Y7O4XJ5P.js.map → prompts-ME53WPN4.js.map} +0 -0
  212. /package/dist/{proofs-TNOBLSRP.js.map → proofs-D3G6ZUFP.js.map} +0 -0
  213. /package/dist/{psql-M66YSUXW.js.map → psql-EXAUDU3W.js.map} +0 -0
  214. /package/dist/{record-3JINBRAR.js.map → record-EE7NGNKY.js.map} +0 -0
  215. /package/dist/{redis-FOIBINYA.js.map → redis-M4EYWKOJ.js.map} +0 -0
  216. /package/dist/{release-B4VWMVEI.js.map → release-4KUWVWWC.js.map} +0 -0
  217. /package/dist/{runbook-EYMSE37E.js.map → runbook-AHU77ANQ.js.map} +0 -0
  218. /package/dist/{scenarios-W7YNLBVO.js.map → scenarios-TU656T2B.js.map} +0 -0
  219. /package/dist/{schedule-EDHQJUUZ.js.map → schedule-DXJI6SYO.js.map} +0 -0
  220. /package/dist/{session-4N62APNQ.js.map → session-RUFTJHF4.js.map} +0 -0
  221. /package/dist/{slack-RUAXG6TB.js.map → slack-M3OKDVMY.js.map} +0 -0
  222. /package/dist/{spec-ZZKMW7ER.js.map → spec-5MXEBLYR.js.map} +0 -0
  223. /package/dist/{src-DGIVA22K.js.map → src-2X5OQRPJ.js.map} +0 -0
  224. /package/dist/{src-ECZWYNSV.js.map → src-72EFBA2R.js.map} +0 -0
  225. /package/dist/{src-OKSAEHQS.js.map → src-KH6WSBJV.js.map} +0 -0
  226. /package/dist/{start-OCZGILRL.js.map → start-PDYBRB5T.js.map} +0 -0
  227. /package/dist/{status-YTJ6YITG.js.map → status-VMVPVCDA.js.map} +0 -0
  228. /package/dist/{tag-KBG4SWRL.js.map → tag-7KTDLPVU.js.map} +0 -0
  229. /package/dist/{task-O6XRMHYE.js.map → task-QLFYZNKR.js.map} +0 -0
  230. /package/dist/{teams-NFUHS7XI.js.map → teams-Y7BXCY6P.js.map} +0 -0
  231. /package/dist/{tickets-JU2STK4B.js.map → tickets-CQDJDNPY.js.map} +0 -0
  232. /package/dist/{trace-NMSGKASJ.js.map → trace-QDORWXYX.js.map} +0 -0
  233. /package/dist/{triage-JGECJJU5.js.map → triage-GY7M3UGG.js.map} +0 -0
  234. /package/dist/{trigger-OSPEVCCQ.js.map → trigger-DLFAORX4.js.map} +0 -0
  235. /package/dist/{update-check-FNP6RFZO.js.map → update-check-ES6XQ7OF.js.map} +0 -0
  236. /package/dist/{upgrade-3PPBXFAT.js.map → upgrade-WKEOW5GS.js.map} +0 -0
  237. /package/dist/{usage-QMCU2JIO.js.map → usage-E6FDTR3W.js.map} +0 -0
  238. /package/dist/{utilities-7VHWTSJT.js.map → utilities-4Z6YX3L5.js.map} +0 -0
  239. /package/dist/{visual-WIZSPTVK.js.map → visual-TA6LPVDJ.js.map} +0 -0
  240. /package/dist/{workflow-cache-ACGM3BOI.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
  241. /package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
  242. /package/dist/{workflow-debug-TVLBNRCB.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
  243. /package/dist/{workflow-feedback-GB5VPGE2.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
  244. /package/dist/{workflow-fork-2IPJNR76.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
  245. /package/dist/{workflow-promotion-QEQUXVUT.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
  246. /package/dist/{workflow-proposals-KHGTPMD4.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
  247. /package/dist/{workflow-revisions-F5KQEEXB.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
  248. /package/dist/{workflow-status-66HC5MEA.js.map → workflow-status-5RG3JX56.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli-helpers.ts"],"sourcesContent":["/**\n * Shared CLI helpers for superadmin management commands (knobs, feature-flags).\n */\n\nimport { readFileSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { getCanaryTmpDir } from '@chatsdet/tmp';\nimport { VALID_MACRO_NAMES } from '@chatsdet/types';\nimport { getArgValue } from './auth.js';\nimport { apiFetch, exitOnFailure, isTerminalFailure } from './api-fetch.js';\nimport { decodeJwtPayload, isSuperadminToken } from './jwt.js';\n\n/**\n * Canonical hyphenated UUID, matching `isUuid` in `@chatsdet/ids`.\n * Kept as a RegExp for existing CLI callers using `UUID_RE.test()`.\n */\nexport const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport type LifecycleStage = 'active' | 'baking' | 'internal' | 'deprecated' | 'ready_for_cleanup';\n\n/** Stages knobs may use — `baking` (the oven) and `internal` are flag-only. */\nexport const KNOB_LIFECYCLE_STAGES: LifecycleStage[] = [\n 'active',\n 'deprecated',\n 'ready_for_cleanup',\n];\n\nexport function toLifecycleLabel(stage: LifecycleStage): string {\n switch (stage) {\n case 'baking':\n return 'baking';\n case 'internal':\n return 'internal';\n case 'deprecated':\n return 'deprecated';\n case 'ready_for_cleanup':\n return 'ready_for_cleanup';\n default:\n return 'active';\n }\n}\n\nexport function parseLifecycleStage(\n argv: string[],\n allowedStages: LifecycleStage[] = [\n 'active',\n 'baking',\n 'internal',\n 'deprecated',\n 'ready_for_cleanup',\n ]\n): LifecycleStage {\n const stage = getArgValue(argv, '--stage');\n if (!stage || !allowedStages.includes(stage as LifecycleStage)) {\n console.error(`Error: --stage is required and must be one of: ${allowedStages.join(', ')}`);\n process.exit(1);\n }\n return stage as LifecycleStage;\n}\n\n/**\n * Target-org id for superadmin cross-org commands (feature-flag, product,\n * account, task). `--org` is now the global identity selector — which of *your*\n * logged-in orgs to act as — so cross-org targeting uses `--target-org`.\n *\n * The two flags are mutually exclusive by design: a bare `--org` naming an org\n * you aren't logged into is already rejected by identity resolution (with a hint\n * to use `--target-org`); if it names one you ARE logged into, we stop here so a\n * superadmin action never silently runs under the wrong identity. Either way the\n * fix is the same — use `--target-org`.\n */\nexport function getTargetOrg(argv: string[]): string | undefined {\n const target = getArgValue(argv, '--target-org');\n if (target) return target;\n if (getArgValue(argv, '--org')) {\n console.error(\n 'Error: --org selects which of your logged-in orgs to act as. To target a ' +\n 'different org for this command, use --target-org.'\n );\n process.exit(1);\n }\n return undefined;\n}\n\n/** Drop exactly one trailing `\\n` or `\\r\\n`; any other trailing whitespace is part of the value. */\nexport function stripOneTrailingNewline(raw: string): string {\n if (raw.endsWith('\\r\\n')) return raw.slice(0, -2);\n if (raw.endsWith('\\n')) return raw.slice(0, -1);\n return raw;\n}\n\n/**\n * Resolve a `<text|@file>` flag value: `@path` reads that file, anything else\n * is the text itself. An unreadable file prints `Error reading <path>` and\n * exits 1 rather than surfacing a stack trace.\n */\nexport function readTextOrFile(value: string): string {\n if (!value.startsWith('@')) return value;\n const file = value.slice(1);\n try {\n return readFileSync(file, 'utf8');\n } catch (err) {\n console.error(`Error reading ${file}: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Connecting an integration from the CLI is admin-only (the API answers\n * `ADMIN_REQUIRED` to anyone else), so a member is told before a browser opens\n * or a question is asked. The role is the one `GET /cli-login/orgs` reports for\n * the token's org (as `cofactor orgs list` shows it); a superadmin passes, as on\n * the API. `integration` is the `cofactor` subcommand (`slack`, `github`).\n */\nexport async function requireOrgAdmin(\n apiUrl: string,\n token: string,\n integration: string,\n action: string\n): Promise<void> {\n if (isSuperadminToken(token)) return;\n const orgId = decodeJwtPayload(token)?.org_id;\n const result = await apiRequest<{\n ok: boolean;\n error?: string;\n organizations?: Array<{ id: string; name: string; role: string }>;\n }>(apiUrl, token, 'GET', '/cli-login/orgs');\n const die = (message: string): never => {\n console.error(`Error: ${message}`);\n return process.exit(1);\n };\n if (!result.ok) die(result.error ?? 'failed to read your role in this organization');\n const org = result.organizations?.find((o) => o.id === orgId);\n if (org?.role !== 'admin') {\n const label = integration[0].toUpperCase() + integration.slice(1);\n die(\n `Only organization admins can ${action} ${label}. Ask an admin of ${org?.name ?? 'this organization'} to run \\`cofactor ${integration} ${action}\\`.`\n );\n }\n}\n\n/** All of stdin as UTF-8 text (Node and Bun alike). */\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nexport async function apiRequest<T extends { ok: boolean; error?: string }>(\n apiUrl: string,\n token: string,\n method: string,\n path: string,\n body?: Record<string, unknown>,\n options?: { timeoutMs?: number }\n): Promise<T> {\n const result = await apiFetch(`${apiUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'Cofactor-CLI',\n },\n token,\n ...(options?.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!result.ok) {\n const { failure } = result;\n // Terminal kinds (auth/proxy/TLS) surface the full diagnostic and exit;\n // http-error falls through so the caller can pretty-print structured\n // user errors (unresolved vars, invalid macros, etc.).\n if (isTerminalFailure(failure)) exitOnFailure(failure);\n const text = failure.body ?? '';\n let errorMessage = failure.message;\n let parsed: Record<string, unknown> | null = null;\n try {\n const data = JSON.parse(text);\n if (data && typeof data === 'object') {\n parsed = data as Record<string, unknown>;\n if (typeof parsed.error === 'string') errorMessage = parsed.error;\n }\n } catch {\n /* keep failure.message */\n }\n return { ...parsed, ok: false, error: errorMessage } as T;\n }\n\n try {\n return (await result.response.json()) as T;\n } catch {\n return { ok: false, error: `Invalid JSON response (${result.response.status})` } as T;\n }\n}\n\n/** One environment option carried by the workflow-detail payload. */\nexport type WorkflowEnvOption = {\n id: string;\n name: string;\n type: string;\n isDefault: boolean;\n environmentKindId?: string | null;\n environmentKindName?: string | null;\n};\n\n/**\n * Fetch the environments available on a workflow's property (from the\n * workflow-detail payload). Shared by `workflow run --environment` and\n * `workflow patch --default-environment` so both resolve names identically.\n */\nexport async function fetchWorkflowEnvironments(\n apiUrl: string,\n token: string,\n workflowId: string\n): Promise<WorkflowEnvOption[]> {\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n workflow?: { environments?: WorkflowEnvOption[] };\n }>(apiUrl, token, 'GET', `/workflows/${workflowId}`);\n return res.workflow?.environments ?? [];\n}\n\n/**\n * Resolve a `--environment` argument (UUID or case-insensitive name) to an\n * environment id against the flow's property. Exits with an actionable error\n * listing the known environments when no match is found.\n */\nexport function resolveEnvironmentByNameOrId(envs: WorkflowEnvOption[], nameOrId: string): string {\n const match =\n envs.find((e) => e.id === nameOrId) ??\n envs.find((e) => e.name.toLowerCase() === nameOrId.toLowerCase()) ??\n envs.find((e) => e.environmentKindName?.toLowerCase() === nameOrId.toLowerCase());\n if (match) return match.id;\n // A bare UUID that isn't in the (possibly empty) known list may still be a\n // valid env the server will accept — e.g. a login-less flow with no resolved\n // property scope being pointed at a sandbox env. Pass it through and let the\n // server be the authority; only hard-fail on an unresolvable *name*.\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId)) {\n return nameOrId;\n }\n console.error(\n `Error: environment \"${nameOrId}\" not found on this flow's property. Known: ${\n envs.map((e) => `${e.name} (${e.type})`).join(', ') || '(none)'\n }`\n );\n process.exit(1);\n}\n\ntype UnresolvedRef = {\n nodeId?: string;\n nodeType?: string;\n field?: string;\n variable: string;\n};\n\n/**\n * Render a structured `userError` response from the workflow API into a\n * multi-line, actionable message. Recognizes `WORKFLOW_UNRESOLVED_VARIABLES`\n * and falls back to `✖ {code}: {message}` for other codes. Returns `null` if\n * the response body isn't a recognized structured error.\n */\nexport function renderWorkflowUserError(result: Record<string, unknown>): string | null {\n const code = typeof result.code === 'string' ? result.code : null;\n const message = typeof result.error === 'string' ? result.error : null;\n if (!code) return null;\n\n if (code === 'WORKFLOW_VALIDATION_FAILED') {\n type ValidationIssue = {\n nodeId?: string | null;\n nodeType?: string | null;\n field?: string;\n message?: string;\n code?: string;\n severity?: 'error' | 'warning';\n };\n const issues = Array.isArray(result.issues) ? (result.issues as ValidationIssue[]) : [];\n const errors = issues.filter((i) => (i.severity ?? 'error') === 'error');\n const warnings = issues.filter((i) => i.severity === 'warning');\n\n const lines: string[] = [\n `✖ Validation failed (${errors.length} error${errors.length === 1 ? '' : 's'}` +\n (warnings.length > 0\n ? `, ${warnings.length} warning${warnings.length === 1 ? '' : 's'}`\n : '') +\n ')',\n ];\n if (message) lines.push(` ${message}`);\n\n // Group by nodeId (null = flow-level).\n const byNode = new Map<string, ValidationIssue[]>();\n for (const issue of issues) {\n const key = issue.nodeId ?? '__flow__';\n const arr = byNode.get(key) ?? [];\n arr.push(issue);\n byNode.set(key, arr);\n }\n for (const [nodeKey, nodeIssues] of byNode) {\n const heading =\n nodeKey === '__flow__'\n ? 'Flow'\n : `Node ${nodeKey}${nodeIssues[0]?.nodeType ? ` (${nodeIssues[0].nodeType})` : ''}`;\n lines.push(` ${heading}:`);\n for (const issue of nodeIssues) {\n const sev = issue.severity === 'warning' ? '⚠' : '•';\n const field = issue.field ? `${issue.field} — ` : '';\n lines.push(` ${sev} ${field}${issue.message ?? ''}`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_UNRESOLVED_VARIABLES') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const refs = Array.isArray(result.refs) ? (result.refs as UnresolvedRef[]) : [];\n const variables = Array.isArray(result.variables)\n ? (result.variables as string[])\n : refs.map((r) => r.variable);\n\n if (refs.length > 0) {\n lines.push(' Unresolved references:');\n for (const ref of refs) {\n const loc = ref.field && ref.nodeId ? ` (node ${ref.nodeId}, ${ref.field})` : '';\n lines.push(` • $var.${ref.variable}${loc}`);\n }\n } else if (variables.length > 0) {\n lines.push(' Unresolved:');\n for (const v of variables) lines.push(` • $var.${v}`);\n }\n\n const macroHints = variables.filter((v) => VALID_MACRO_NAMES.has(v.toUpperCase()));\n if (macroHints.length > 0) {\n lines.push(' Hint: these look like macro names, not variables:');\n for (const v of macroHints) {\n lines.push(` $var.${v} → $${v.toUpperCase()}()`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_INVALID_INPUT_VALUES') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const issues = Array.isArray(result.issues)\n ? (result.issues as Array<{\n key?: string;\n value?: string;\n reason?: string;\n variables?: string[];\n }>)\n : [];\n for (const issue of issues) {\n const key = issue.key ?? '?';\n const value = issue.value ?? '';\n if (issue.reason === 'self_referential') {\n lines.push(` • ${key}: self-referential → ${value}`);\n lines.push(` Use a literal or point at a different upstream variable.`);\n } else if (issue.reason === 'macro_name_used_as_var') {\n lines.push(` • ${key}: macro name used as $var → ${value}`);\n for (const v of issue.variables ?? []) {\n lines.push(` $var.${v} → $${v.toUpperCase()}()`);\n }\n } else {\n lines.push(` • ${key}: ${issue.reason ?? 'invalid'} → ${value}`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_INVALID_MACRO') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const invalid = Array.isArray(result.invalid) ? (result.invalid as string[]) : [];\n const valid = Array.isArray(result.valid) ? (result.valid as string[]) : [];\n if (invalid.length > 0) {\n lines.push(` Invalid macro(s): ${invalid.map((n) => `$${n}()`).join(', ')}`);\n }\n if (valid.length > 0) {\n lines.push(` Valid macros: ${valid.map((n) => `$${n}()`).join(', ')}`);\n }\n return lines.join('\\n');\n }\n\n return `✖ ${code}${message ? `: ${message}` : ''}`;\n}\n\nexport async function downloadStorageState(opts: {\n apiUrl: string;\n token: string;\n propertyId: string;\n credentialId: string;\n prefix?: string;\n}): Promise<string | undefined> {\n const tmpFile = path.join(getCanaryTmpDir(), `${opts.prefix ?? 'canary-ss'}-${Date.now()}.json`);\n try {\n const res = await fetch(\n `${opts.apiUrl}/org/properties/${opts.propertyId}/credentials/${opts.credentialId}/storage-state/download`,\n {\n headers: { Authorization: `Bearer ${opts.token}` },\n redirect: 'follow',\n }\n );\n if (res.ok) {\n const body = await res.text();\n await fs.writeFile(tmpFile, body, 'utf-8');\n return tmpFile;\n }\n } catch {\n // Caller handles missing storage state\n }\n return undefined;\n}\n\n/* ── Credential selection ─────────────────────────────────────────────── */\n\nexport interface CredentialListItem {\n id: string;\n name: string;\n propertyId: string;\n propertyName?: string;\n propertyBaseUrl?: string;\n environmentId?: string | null;\n environmentName?: string | null;\n storageStateS3Key?: string | null;\n isDefault?: boolean;\n isEphemeral?: boolean;\n}\n\n/**\n * Fetch org credentials and let the user pick one interactively.\n *\n * @param credentialArg - Credential name or ID to auto-select, or undefined for interactive\n * @returns The selected credential, or null if none found / invalid selection\n */\nexport async function selectCredential(\n apiUrl: string,\n token: string,\n credentialArg?: string\n): Promise<CredentialListItem | null> {\n const credentials = await fetchList<CredentialListItem>(\n apiUrl,\n token,\n '/org/credentials',\n 'items'\n );\n\n if (credentials.length === 0) {\n console.error('No credentials found. Create one first in the web app.');\n return null;\n }\n\n if (credentialArg) {\n const match = credentials.find(\n (c) => c.id === credentialArg || c.name.toLowerCase() === credentialArg.toLowerCase()\n );\n if (!match) {\n console.error(`Credential \"${credentialArg}\" not found.`);\n console.error('Available credentials:');\n for (const c of credentials) {\n const env = c.environmentName ? ` — ${c.environmentName}` : '';\n const baseUrl = c.propertyBaseUrl ? ` — ${c.propertyBaseUrl}` : '';\n console.error(` - ${c.name} [${c.propertyName ?? c.propertyId}${env}${baseUrl}]`);\n }\n return null;\n }\n return match;\n }\n\n // Interactive selection\n console.log('\\nSelect a credential:\\n');\n const labels = credentials.map((c) => {\n const property = c.propertyName ?? c.propertyId;\n const env = c.environmentName ? ` — ${c.environmentName}` : '';\n const baseUrl = c.propertyBaseUrl ? ` — ${c.propertyBaseUrl}` : '';\n return `${c.name} [${property}${env}${baseUrl}]`;\n });\n\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n for (let i = 0; i < labels.length; i++) {\n console.log(` ${i + 1}. ${labels[i]}`);\n }\n rl.question('\\nEnter number: ', (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const idx = parseInt(answer, 10) - 1;\n if (isNaN(idx) || idx < 0 || idx >= credentials.length) {\n console.error('Invalid selection.');\n return null;\n }\n\n return credentials[idx];\n}\n\nexport type CredentialDetail = {\n id: string;\n name: string;\n authProvider?: string;\n /** Resolved login start URL (environment URL + relative login path) */\n loginUrl?: string | null;\n loginInstructions?: string | null;\n sessionVerificationGuidance?: string | null;\n data?: {\n username?: string;\n password?: string;\n email?: string;\n user?: string;\n mfaSecret?: string;\n apiKey?: string;\n customHeaders?: Record<string, string>;\n [key: string]: unknown;\n } | null;\n};\n\nexport async function fetchCredentialDetail(\n apiUrl: string,\n token: string,\n propertyId: string,\n credId: string\n): Promise<CredentialDetail | null> {\n const result = await apiRequest<{ ok: boolean; credential?: CredentialDetail; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/credentials/${credId}`\n );\n if (!result.ok || !result.credential) return null;\n return result.credential;\n}\n\n/**\n * Non-interactive credential lookup by id or case-insensitive name, narrowed by\n * application (id or case-insensitive name) when several match. Throws on none or ambiguous.\n */\nexport function findCredential(\n list: CredentialListItem[],\n ref: string,\n application?: string\n): CredentialListItem {\n const lower = ref.toLowerCase();\n let matches = list.filter((c) => c.id === ref || c.name.toLowerCase() === lower);\n if (matches.length === 0) throw new Error(`Credential \"${ref}\" not found.`);\n if (matches.length === 1) return matches[0]!;\n if (!application) {\n const options = matches.map((c) => ` - ${c.id} (${c.propertyName ?? c.propertyId})`);\n throw new Error(\n [`Multiple credentials match \"${ref}\". Pass --application to disambiguate.`, ...options].join(\n '\\n'\n )\n );\n }\n const app = application.toLowerCase();\n matches = matches.filter((c) => c.propertyId === application || c.propertyName?.toLowerCase() === app);\n if (matches.length === 0) {\n throw new Error(`Credential \"${ref}\" found, but none match application \"${application}\".`);\n }\n if (matches.length > 1) {\n throw new Error(`Multiple credentials match \"${ref}\" on application \"${application}\".`);\n }\n return matches[0]!;\n}\n\n/** The login identifier of a credential: username, else email, else user. */\nexport function credentialUsername(data: NonNullable<CredentialDetail['data']>): string | undefined {\n return data.username ?? data.email ?? data.user;\n}\n\n/**\n * Resolve a credential name or id to its UUID.\n *\n * The server runs `extractUuid` on `credentialId`, so a bare name is rejected\n * with an opaque invalid-id error. Resolving here is what makes\n * `--credential \"Superadmin User\"` mean what it looks like it means.\n */\nexport async function resolveCredentialId(\n arg: string,\n propertyId: string | undefined,\n apiUrl: string,\n token: string\n): Promise<string> {\n const all = await fetchList<CredentialListItem>(apiUrl, token, '/org/credentials', 'items');\n\n const byId = all.find((c) => c.id === arg);\n if (byId) return byId.id;\n\n // Narrow to the target's application when one is known. The same credential\n // name routinely exists on several applications, so match within the\n // selected application.\n const credentials = propertyId ? all.filter((c) => c.propertyId === propertyId) : all;\n\n const byName = credentials.filter((c) => c.name.toLowerCase() === arg.toLowerCase());\n if (byName.length === 1) return byName[0]!.id;\n if (byName.length > 1) {\n console.error(\n `Error: Multiple credentials match \"${arg}\"` +\n (propertyId ? ' on this application.' : '. Pass --application to narrow, or use the id.')\n );\n for (const c of byName) console.error(` - ${c.name} (${c.id}) env=${c.environmentName ?? ''}`);\n process.exit(1);\n }\n\n console.error(`Error: Credential \"${arg}\" not found.`);\n if (credentials.length > 0) {\n console.error('Available credentials:');\n for (const c of credentials) console.error(` - ${c.name} (${c.id})`);\n }\n process.exit(1);\n}\n\n/* ── Property selection ──────────────────────────────────────────────── */\n\ninterface PropertyListItem {\n id: string;\n name: string;\n baseUrl: string;\n}\n\nexport async function fetchProperties(apiUrl: string, token: string): Promise<PropertyListItem[]> {\n return fetchList<PropertyListItem>(apiUrl, token, '/org/properties', 'items');\n}\n\n/**\n * Read the application/property selector flag. `--application` is the user-facing\n * name; `--property` is kept as a backwards-compat alias (read second). Internally\n * this is still a \"property\" — the rename is cosmetic.\n */\nexport function getApplicationArg(argv: string[]): string | undefined {\n return getArgValue(argv, '--application') ?? getArgValue(argv, '--property');\n}\n\n/**\n * Return the first positional argument, excluding values consumed by the given\n * `--flag value` pairs.\n *\n * The obvious `argv.find(a => !a.startsWith('-'))` returns the FIRST FLAG VALUE\n * whenever a flag precedes the positional (`--application Acme my-target`),\n * which is the normal shape for every application-scoped command.\n */\nexport function getPositionalArg(\n argv: string[],\n flagsWithValues: string[]\n): string | undefined {\n return getPositionalArgs(argv, flagsWithValues).find((a) => !a.startsWith('-'));\n}\n\n/**\n * Every word that is not a `--flag` or the value of one of the given\n * `--flag value` pairs, in order (a `--flag=value` is one `--` token, so it is\n * skipped whole). Single-dash words are kept, because they can be free text\n * (`-5% latency`). Use this, not `argv.filter(a => !a.startsWith('--'))`, which\n * drops each flag but keeps its value, wherever positional words are joined\n * into free text such as a comment.\n */\nexport function getPositionalArgs(argv: string[], flagsWithValues: string[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (flagsWithValues.includes(a)) {\n i++;\n continue;\n }\n if (!a.startsWith('--')) out.push(a);\n }\n return out;\n}\n\n/** Global `--flag value` pairs a `guide` subcommand may be given (every command accepts them). */\nconst GUIDE_VALUE_FLAGS = ['--env', '--api-url', '--token', '--org'];\n\n/**\n * The section slug of a `<command> guide [section]` invocation. Skips global\n * flag values, so `guide --env production` prints the whole guide instead of\n * failing on an unknown section named \"production\".\n */\nexport function getGuideSectionArg(argv: string[]): string | undefined {\n return getPositionalArg(argv, GUIDE_VALUE_FLAGS);\n}\n\n/**\n * Read the application/property UUID flag. `--application-id` is the user-facing\n * name; `--property-id` is kept as a backwards-compat alias.\n */\nexport function getApplicationIdArg(argv: string[]): string | undefined {\n return getArgValue(argv, '--application-id') ?? getArgValue(argv, '--property-id');\n}\n\nexport async function selectProperty(\n apiUrl: string,\n token: string,\n hint?: string\n): Promise<PropertyListItem | null> {\n const properties = await fetchProperties(apiUrl, token);\n\n if (properties.length === 0) {\n console.error('No applications found. Create one first in the web app.');\n return null;\n }\n\n if (hint) {\n const match = properties.find(\n (p) => p.id === hint || p.name.toLowerCase() === hint.toLowerCase()\n );\n if (!match) {\n console.error(`Application \"${hint}\" not found.`);\n console.error('Available applications:');\n for (const p of properties) {\n console.error(` - ${p.name} (${p.baseUrl})`);\n }\n return null;\n }\n return match;\n }\n\n if (properties.length === 1) {\n // stderr: stdout may be carrying `--json` output.\n console.error(`Auto-selected application: ${properties[0].name}`);\n return properties[0];\n }\n\n if (!process.stdin.isTTY) {\n console.error('Multiple applications and no --application given. Pass one of:');\n for (const p of properties) {\n console.error(` --application \"${p.name}\" (${p.baseUrl})`);\n }\n return null;\n }\n\n return promptChoice(\n 'Select an application:',\n properties.map((p) => ({ label: `${p.name} — ${p.baseUrl}`, value: p }))\n );\n}\n\n/* ── Interactive prompt helpers ──────────────────────────────────────── */\n\n/**\n * Neither prompt waits on a stdin that is not a terminal: an agent or a script\n * piping the CLI would otherwise hang forever on a question nobody can answer.\n */\nfunction failNonInteractive(question: string): never {\n console.error(`Cannot prompt \"${question}\": stdin is not a terminal. Pass the value explicitly.`);\n process.exit(1);\n}\n\nexport async function promptInput(question: string, defaultValue?: string): Promise<string> {\n if (!process.stdin.isTTY) {\n if (defaultValue !== undefined) return defaultValue;\n failNonInteractive(question);\n }\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const prompt = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;\n const answer = await new Promise<string>((resolve) => {\n rl.question(prompt, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n return answer || defaultValue || '';\n}\n\nexport async function promptChoice<T>(\n question: string,\n options: Array<{ label: string; value: T }>\n): Promise<T | null> {\n if (!process.stdin.isTTY) {\n for (const option of options) console.error(` - ${option.label}`);\n failNonInteractive(question);\n }\n console.log(`\\n${question}\\n`);\n for (let i = 0; i < options.length; i++) {\n console.log(` ${i + 1}. ${options[i].label}`);\n }\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question('\\nEnter number: ', (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const idx = parseInt(answer, 10) - 1;\n if (isNaN(idx) || idx < 0 || idx >= options.length) {\n console.error('Invalid selection.');\n return null;\n }\n return options[idx].value;\n}\n\nexport async function uploadStorageState(opts: {\n apiUrl: string;\n token: string;\n propertyId: string;\n credentialId: string;\n storageState: unknown;\n}): Promise<{ ok: boolean; s3Key?: string; error?: string }> {\n const result = await apiFetch(\n `${opts.apiUrl}/org/properties/${opts.propertyId}/credentials/${opts.credentialId}/storage-state/upload`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${opts.token}`,\n 'Content-Type': 'application/json',\n },\n token: opts.token,\n body: JSON.stringify({ storageState: opts.storageState }),\n }\n );\n\n if (!result.ok) exitOnFailure(result.failure);\n\n return (await result.response.json()) as { ok: boolean; s3Key?: string; error?: string };\n}\n\n/* ── Repeatable-flag collection ──────────────────────────────────────── */\n\n/**\n * Collect every value for a repeatable flag (`getArgValue` only returns the\n * first). Accepts both `--key value` and `--key=value` forms.\n *\n * A `--key` with no usable value — missing, looking like the next flag (a\n * bare `-`-leading token), or blank after trimming — exits 1 naming the flag\n * rather than being silently dropped: `--layer A --layer` must not quietly\n * become one layer instead of two, and `--layer \"\"` must not push an empty\n * layer. The single validating implementation for the whole CLI — previously\n * duplicated (leniently, with the dangling-value bug) in `issue-create.ts`,\n * `automation-shared.ts`, and `sandbox.ts`.\n */\nexport function getArgValues(argv: string[], key: string): string[] {\n const out: string[] = [];\n const eqPrefix = `${key}=`;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === key) {\n const value = argv[i + 1];\n if (value === undefined || value.startsWith('-') || value.trim().length === 0) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n out.push(value);\n } else if (arg?.startsWith(eqPrefix)) {\n const value = arg.slice(eqPrefix.length);\n if (value.trim().length === 0) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n out.push(value);\n }\n }\n return out;\n}\n\n/**\n * `getArgValue` (auth.ts) returns whatever token follows the flag, including\n * another flag — `--name --failure-mode continue` would create a suite\n * literally named \"--failure-mode\", and `!body.name.trim()` never catches it\n * because the string isn't blank. Same validation `getArgValues` applies to\n * repeatable flags, scoped to these three scalar write flags rather than\n * changing `getArgValue` itself, which the whole CLI depends on staying\n * permissive.\n *\n * Checks the `--key=value` form first, returning its suffix verbatim — like\n * the hoisted `getArgValues`, that branch skips the leading-`-` check, so\n * `--description=\"- covers the checkout path\"` is the escape hatch for a\n * value that legitimately starts with `-` (the bare `--key value` form\n * rejects a leading `-` to catch a swallowed flag, which otherwise makes such\n * a value unrepresentable).\n *\n * @param opts.allowEmpty Accept a blank value (after trimming) instead of\n * erroring. Use only when blank has domain meaning, such as clearing a\n * description or sending an empty directory-area list.\n */\nexport function getScalarArgValue(\n argv: string[],\n key: string,\n opts?: { allowEmpty: boolean }\n): string | undefined {\n const eqPrefix = `${key}=`;\n const eqToken = argv.find((a) => a.startsWith(eqPrefix));\n if (eqToken !== undefined) {\n const value = eqToken.slice(eqPrefix.length);\n if (value.trim().length === 0 && !opts?.allowEmpty) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n return value;\n }\n\n const value = getArgValue(argv, key);\n if (value === undefined) return undefined;\n const blank = value.trim().length === 0;\n if (value.startsWith('-') || (blank && !opts?.allowEmpty)) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n return value;\n}\n\n/* ── Test suite selection ────────────────────────────────────────────── */\n\n/** One suite as returned by `GET /test-suites` — enough to resolve `<name|id>`. */\nexport type SuiteRef = {\n id: string;\n name: string;\n};\n\n/**\n * Resolve a `--suite <name|id>` (or bare `<id|name>` positional) argument\n * against `GET /test-suites`. An exact id match wins; otherwise falls back to\n * a case-insensitive name match. Lists the available suites on a miss.\n *\n * Shared by `test-suite`'s create/update/delete/members/set-members verbs and\n * `remote-test`'s `--suite` run flag, so suite name resolution has exactly one\n * implementation.\n */\nexport async function resolveTestSuite(\n arg: string,\n apiUrl: string,\n token: string\n): Promise<SuiteRef> {\n const res = await apiRequest<{ ok: boolean; error?: string; data?: SuiteRef[] }>(\n apiUrl,\n token,\n 'GET',\n '/test-suites'\n );\n if (!res.ok) {\n console.error(`Error: ${res.error ?? 'Failed to list test suites'}`);\n process.exit(1);\n }\n const suites = res.data ?? [];\n const match =\n suites.find((s) => s.id === arg) ?? suites.find((s) => s.name.toLowerCase() === arg.toLowerCase());\n if (!match) {\n // `arg` echoes the user's own --suite entry and `s.name` is server data —\n // write straight to stderr rather than through console.error, which the\n // `cofactor` binary brand-rewrites (a suite named \"Canary Smoke\" would\n // print as \"Cofactor Smoke\").\n process.stderr.write(`Error: Test suite \"${arg}\" not found.\\n`);\n if (suites.length > 0) {\n console.error('Available suites:');\n for (const s of suites) process.stderr.write(` - ${s.name} (${s.id})\\n`);\n }\n process.exit(1);\n }\n return match;\n}\n\nexport async function fetchList<T>(\n apiUrl: string,\n token: string,\n path: string,\n listKey: string\n): Promise<T[]> {\n const result = await apiFetch(`${apiUrl}${path}`, {\n headers: { Authorization: `Bearer ${token}` },\n token,\n });\n\n if (!result.ok) exitOnFailure(result.failure);\n\n const json = (await result.response.json()) as Record<string, unknown>;\n\n if (!json.ok) {\n console.error(`Error: ${json.error}`);\n process.exit(1);\n }\n\n return (json[listKey] as T[]) ?? [];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAIA,SAAS,oBAAoB;AAC7B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,aAAa;AAWb,IAAM,UAAU;AAKhB,IAAM,wBAA0C;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,iBAAiB,OAA+B;AAC9D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,oBACd,MACA,gBAAkC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACgB;AAChB,QAAM,QAAQ,YAAY,MAAM,SAAS;AACzC,MAAI,CAAC,SAAS,CAAC,cAAc,SAAS,KAAuB,GAAG;AAC9D,YAAQ,MAAM,kDAAkD,cAAc,KAAK,IAAI,CAAC,EAAE;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAaO,SAAS,aAAa,MAAoC;AAC/D,QAAM,SAAS,YAAY,MAAM,cAAc;AAC/C,MAAI,OAAQ,QAAO;AACnB,MAAI,YAAY,MAAM,OAAO,GAAG;AAC9B,YAAQ;AAAA,MACN;AAAA,IAEF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAGO,SAAS,wBAAwB,KAAqB;AAC3D,MAAI,IAAI,SAAS,MAAM,EAAG,QAAO,IAAI,MAAM,GAAG,EAAE;AAChD,MAAI,IAAI,SAAS,IAAI,EAAG,QAAO,IAAI,MAAM,GAAG,EAAE;AAC9C,SAAO;AACT;AAOO,SAAS,eAAe,OAAuB;AACpD,MAAI,CAAC,MAAM,WAAW,GAAG,EAAG,QAAO;AACnC,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,MAAI;AACF,WAAO,aAAa,MAAM,MAAM;AAAA,EAClC,SAAS,KAAK;AACZ,YAAQ,MAAM,iBAAiB,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AASA,eAAsB,gBACpB,QACA,OACA,aACA,QACe;AACf,MAAI,kBAAkB,KAAK,EAAG;AAC9B,QAAM,QAAQ,iBAAiB,KAAK,GAAG;AACvC,QAAM,SAAS,MAAM,WAIlB,QAAQ,OAAO,OAAO,iBAAiB;AAC1C,QAAM,MAAM,CAAC,YAA2B;AACtC,YAAQ,MAAM,UAAU,OAAO,EAAE;AACjC,WAAO,QAAQ,KAAK,CAAC;AAAA,EACvB;AACA,MAAI,CAAC,OAAO,GAAI,KAAI,OAAO,SAAS,+CAA+C;AACnF,QAAM,MAAM,OAAO,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAC5D,MAAI,KAAK,SAAS,SAAS;AACzB,UAAM,QAAQ,YAAY,CAAC,EAAE,YAAY,IAAI,YAAY,MAAM,CAAC;AAChE;AAAA,MACE,gCAAgC,MAAM,IAAI,KAAK,qBAAqB,KAAK,QAAQ,mBAAmB,sBAAsB,WAAW,IAAI,MAAM;AAAA,IACjJ;AAAA,EACF;AACF;AAGA,eAAsB,YAA6B;AACjD,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,MAAO,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AACvE,SAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AAC/C;AAEA,eAAsB,WACpB,QACA,OACA,QACAA,OACA,MACA,SACY;AACZ,QAAM,SAAS,MAAM,SAAS,GAAG,MAAM,GAAGA,KAAI,IAAI;AAAA,IAChD;AAAA,IACA,SAAS;AAAA,MACP,eAAe,UAAU,KAAK;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAI,SAAS,cAAc,SAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC3E,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,EAC/C,CAAC;AAED,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,EAAE,QAAQ,IAAI;AAIpB,QAAI,kBAAkB,OAAO,EAAG,eAAc,OAAO;AACrD,UAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAI,eAAe,QAAQ;AAC3B,QAAI,SAAyC;AAC7C,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,iBAAS;AACT,YAAI,OAAO,OAAO,UAAU,SAAU,gBAAe,OAAO;AAAA,MAC9D;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO,EAAE,GAAG,QAAQ,IAAI,OAAO,OAAO,aAAa;AAAA,EACrD;AAEA,MAAI;AACF,WAAQ,MAAM,OAAO,SAAS,KAAK;AAAA,EACrC,QAAQ;AACN,WAAO,EAAE,IAAI,OAAO,OAAO,0BAA0B,OAAO,SAAS,MAAM,IAAI;AAAA,EACjF;AACF;AAiBA,eAAsB,0BACpB,QACA,OACA,YAC8B;AAC9B,QAAM,MAAM,MAAM,WAIf,QAAQ,OAAO,OAAO,cAAc,UAAU,EAAE;AACnD,SAAO,IAAI,UAAU,gBAAgB,CAAC;AACxC;AAOO,SAAS,6BAA6B,MAA2B,UAA0B;AAChG,QAAM,QACJ,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,KAClC,KAAK,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS,YAAY,CAAC,KAChE,KAAK,KAAK,CAAC,MAAM,EAAE,qBAAqB,YAAY,MAAM,SAAS,YAAY,CAAC;AAClF,MAAI,MAAO,QAAO,MAAM;AAKxB,MAAI,kEAAkE,KAAK,QAAQ,GAAG;AACpF,WAAO;AAAA,EACT;AACA,UAAQ;AAAA,IACN,uBAAuB,QAAQ,+CAC7B,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,KAAK,QACzD;AAAA,EACF;AACA,UAAQ,KAAK,CAAC;AAChB;AAeO,SAAS,wBAAwB,QAAgD;AACtF,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,QAAM,UAAU,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAClE,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,SAAS,8BAA8B;AASzC,UAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAK,OAAO,SAA+B,CAAC;AACtF,UAAM,SAAS,OAAO,OAAO,CAAC,OAAO,EAAE,YAAY,aAAa,OAAO;AACvE,UAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS;AAE9D,UAAM,QAAkB;AAAA,MACtB,6BAAwB,OAAO,MAAM,SAAS,OAAO,WAAW,IAAI,KAAK,GAAG,MACzE,SAAS,SAAS,IACf,KAAK,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,KAAK,GAAG,KAC/D,MACJ;AAAA,IACJ;AACA,QAAI,QAAS,OAAM,KAAK,KAAK,OAAO,EAAE;AAGtC,UAAM,SAAS,oBAAI,IAA+B;AAClD,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,MAAM,UAAU;AAC5B,YAAM,MAAM,OAAO,IAAI,GAAG,KAAK,CAAC;AAChC,UAAI,KAAK,KAAK;AACd,aAAO,IAAI,KAAK,GAAG;AAAA,IACrB;AACA,eAAW,CAAC,SAAS,UAAU,KAAK,QAAQ;AAC1C,YAAM,UACJ,YAAY,aACR,SACA,QAAQ,OAAO,GAAG,WAAW,CAAC,GAAG,WAAW,KAAK,WAAW,CAAC,EAAE,QAAQ,MAAM,EAAE;AACrF,YAAM,KAAK,KAAK,OAAO,GAAG;AAC1B,iBAAW,SAAS,YAAY;AAC9B,cAAM,MAAM,MAAM,aAAa,YAAY,WAAM;AACjD,cAAM,QAAQ,MAAM,QAAQ,GAAG,MAAM,KAAK,aAAQ;AAClD,cAAM,KAAK,OAAO,GAAG,IAAI,KAAK,GAAG,MAAM,WAAW,EAAE,EAAE;AAAA,MACxD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,SAAS,iCAAiC;AAC5C,UAAM,QAAkB,CAAC,UAAK,IAAI,EAAE;AACpC,QAAI,QAAS,OAAM,KAAK,KAAK,OAAO,EAAE;AACtC,UAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAK,OAAO,OAA2B,CAAC;AAC9E,UAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAC3C,OAAO,YACR,KAAK,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE9B,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,KAAK,0BAA0B;AACrC,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,IAAI,SAAS,IAAI,SAAS,UAAU,IAAI,MAAM,KAAK,IAAI,KAAK,MAAM;AAC9E,cAAM,KAAK,mBAAc,IAAI,QAAQ,GAAG,GAAG,EAAE;AAAA,MAC/C;AAAA,IACF,WAAW,UAAU,SAAS,GAAG;AAC/B,YAAM,KAAK,eAAe;AAC1B,iBAAW,KAAK,UAAW,OAAM,KAAK,mBAAc,CAAC,EAAE;AAAA,IACzD;AAEA,UAAM,aAAa,UAAU,OAAO,CAAC,MAAM,kBAAkB,IAAI,EAAE,YAAY,CAAC,CAAC;AACjF,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,KAAK,qDAAqD;AAChE,iBAAW,KAAK,YAAY;AAC1B,cAAM,KAAK,YAAY,CAAC,cAAS,EAAE,YAAY,CAAC,IAAI;AAAA,MACtD;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,SAAS,iCAAiC;AAC5C,UAAM,QAAkB,CAAC,UAAK,IAAI,EAAE;AACpC,QAAI,QAAS,OAAM,KAAK,KAAK,OAAO,EAAE;AACtC,UAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IACrC,OAAO,SAMR,CAAC;AACL,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,QAAQ,MAAM,SAAS;AAC7B,UAAI,MAAM,WAAW,oBAAoB;AACvC,cAAM,KAAK,YAAO,GAAG,+BAA0B,KAAK,EAAE;AACtD,cAAM,KAAK,8DAA8D;AAAA,MAC3E,WAAW,MAAM,WAAW,0BAA0B;AACpD,cAAM,KAAK,YAAO,GAAG,sCAAiC,KAAK,EAAE;AAC7D,mBAAW,KAAK,MAAM,aAAa,CAAC,GAAG;AACrC,gBAAM,KAAK,YAAY,CAAC,cAAS,EAAE,YAAY,CAAC,IAAI;AAAA,QACtD;AAAA,MACF,OAAO;AACL,cAAM,KAAK,YAAO,GAAG,KAAK,MAAM,UAAU,SAAS,aAAQ,KAAK,EAAE;AAAA,MACpE;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,SAAS,0BAA0B;AACrC,UAAM,QAAkB,CAAC,UAAK,IAAI,EAAE;AACpC,QAAI,QAAS,OAAM,KAAK,KAAK,OAAO,EAAE;AACtC,UAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAK,OAAO,UAAuB,CAAC;AAChF,UAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,IAAK,OAAO,QAAqB,CAAC;AAC1E,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,KAAK,uBAAuB,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC9E;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,mBAAmB,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACxE;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,SAAO,UAAK,IAAI,GAAG,UAAU,KAAK,OAAO,KAAK,EAAE;AAClD;AAEA,eAAsB,qBAAqB,MAMX;AAC9B,QAAM,UAAU,KAAK,KAAK,gBAAgB,GAAG,GAAG,KAAK,UAAU,WAAW,IAAI,KAAK,IAAI,CAAC,OAAO;AAC/F,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,MAAM,mBAAmB,KAAK,UAAU,gBAAgB,KAAK,YAAY;AAAA,MACjF;AAAA,QACE,SAAS,EAAE,eAAe,UAAU,KAAK,KAAK,GAAG;AAAA,QACjD,UAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,IAAI,IAAI;AACV,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,GAAG,UAAU,SAAS,MAAM,OAAO;AACzC,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAuBA,eAAsB,iBACpB,QACA,OACA,eACoC;AACpC,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,YAAQ,MAAM,wDAAwD;AACtE,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AACjB,UAAM,QAAQ,YAAY;AAAA,MACxB,CAAC,MAAM,EAAE,OAAO,iBAAiB,EAAE,KAAK,YAAY,MAAM,cAAc,YAAY;AAAA,IACtF;AACA,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,eAAe,aAAa,cAAc;AACxD,cAAQ,MAAM,wBAAwB;AACtC,iBAAW,KAAK,aAAa;AAC3B,cAAM,MAAM,EAAE,kBAAkB,WAAM,EAAE,eAAe,KAAK;AAC5D,cAAM,UAAU,EAAE,kBAAkB,WAAM,EAAE,eAAe,KAAK;AAChE,gBAAQ,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,gBAAgB,EAAE,UAAU,GAAG,GAAG,GAAG,OAAO,GAAG;AAAA,MACnF;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,UAAQ,IAAI,0BAA0B;AACtC,QAAM,SAAS,YAAY,IAAI,CAAC,MAAM;AACpC,UAAM,WAAW,EAAE,gBAAgB,EAAE;AACrC,UAAM,MAAM,EAAE,kBAAkB,WAAM,EAAE,eAAe,KAAK;AAC5D,UAAM,UAAU,EAAE,kBAAkB,WAAM,EAAE,eAAe,KAAK;AAChE,WAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,GAAG,GAAG,GAAG,OAAO;AAAA,EAC/C,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,IACxC;AACA,OAAG,SAAS,oBAAoB,CAAC,QAAQ;AACvC,SAAG,MAAM;AACT,cAAQ,IAAI,KAAK,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,MAAM,SAAS,QAAQ,EAAE,IAAI;AACnC,MAAI,MAAM,GAAG,KAAK,MAAM,KAAK,OAAO,YAAY,QAAQ;AACtD,YAAQ,MAAM,oBAAoB;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,GAAG;AACxB;AAsBA,eAAsB,sBACpB,QACA,OACA,YACA,QACkC;AAClC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,UAAU,gBAAgB,MAAM;AAAA,EACrD;AACA,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,WAAY,QAAO;AAC7C,SAAO,OAAO;AAChB;AAMO,SAAS,eACd,MACA,KACA,aACoB;AACpB,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,UAAU,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,YAAY,MAAM,KAAK;AAC/E,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,eAAe,GAAG,cAAc;AAC1E,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,MAAI,CAAC,aAAa;AAChB,UAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,GAAG;AACrF,UAAM,IAAI;AAAA,MACR,CAAC,+BAA+B,GAAG,0CAA0C,GAAG,OAAO,EAAE;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,YAAY,YAAY;AACpC,YAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,eAAe,eAAe,EAAE,cAAc,YAAY,MAAM,GAAG;AACrG,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,eAAe,GAAG,wCAAwC,WAAW,IAAI;AAAA,EAC3F;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI,MAAM,+BAA+B,GAAG,qBAAqB,WAAW,IAAI;AAAA,EACxF;AACA,SAAO,QAAQ,CAAC;AAClB;AAGO,SAAS,mBAAmB,MAAiE;AAClG,SAAO,KAAK,YAAY,KAAK,SAAS,KAAK;AAC7C;AASA,eAAsB,oBACpB,KACA,YACA,QACA,OACiB;AACjB,QAAM,MAAM,MAAM,UAA8B,QAAQ,OAAO,oBAAoB,OAAO;AAE1F,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AACzC,MAAI,KAAM,QAAO,KAAK;AAKtB,QAAM,cAAc,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,eAAe,UAAU,IAAI;AAElF,QAAM,SAAS,YAAY,OAAO,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,IAAI,YAAY,CAAC;AACnF,MAAI,OAAO,WAAW,EAAG,QAAO,OAAO,CAAC,EAAG;AAC3C,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ;AAAA,MACN,sCAAsC,GAAG,OACtC,aAAa,0BAA0B;AAAA,IAC5C;AACA,eAAW,KAAK,OAAQ,SAAQ,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,MAAM,sBAAsB,GAAG,cAAc;AACrD,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,MAAM,wBAAwB;AACtC,eAAW,KAAK,YAAa,SAAQ,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG;AAAA,EACtE;AACA,UAAQ,KAAK,CAAC;AAChB;AAUA,eAAsB,gBAAgB,QAAgB,OAA4C;AAChG,SAAO,UAA4B,QAAQ,OAAO,mBAAmB,OAAO;AAC9E;AAOO,SAAS,kBAAkB,MAAoC;AACpE,SAAO,YAAY,MAAM,eAAe,KAAK,YAAY,MAAM,YAAY;AAC7E;AAUO,SAAS,iBACd,MACA,iBACoB;AACpB,SAAO,kBAAkB,MAAM,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AAChF;AAUO,SAAS,kBAAkB,MAAgB,iBAAqC;AACrF,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,gBAAgB,SAAS,CAAC,GAAG;AAC/B;AACA;AAAA,IACF;AACA,QAAI,CAAC,EAAE,WAAW,IAAI,EAAG,KAAI,KAAK,CAAC;AAAA,EACrC;AACA,SAAO;AACT;AAGA,IAAM,oBAAoB,CAAC,SAAS,aAAa,WAAW,OAAO;AAO5D,SAAS,mBAAmB,MAAoC;AACrE,SAAO,iBAAiB,MAAM,iBAAiB;AACjD;AAMO,SAAS,oBAAoB,MAAoC;AACtE,SAAO,YAAY,MAAM,kBAAkB,KAAK,YAAY,MAAM,eAAe;AACnF;AAEA,eAAsB,eACpB,QACA,OACA,MACkC;AAClC,QAAM,aAAa,MAAM,gBAAgB,QAAQ,KAAK;AAEtD,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,MAAM,yDAAyD;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,MAAM;AACR,UAAM,QAAQ,WAAW;AAAA,MACvB,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,KAAK,YAAY,MAAM,KAAK,YAAY;AAAA,IACpE;AACA,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,gBAAgB,IAAI,cAAc;AAChD,cAAQ,MAAM,yBAAyB;AACvC,iBAAW,KAAK,YAAY;AAC1B,gBAAQ,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,OAAO,GAAG;AAAA,MAC9C;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW,GAAG;AAE3B,YAAQ,MAAM,8BAA8B,WAAW,CAAC,EAAE,IAAI,EAAE;AAChE,WAAO,WAAW,CAAC;AAAA,EACrB;AAEA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,YAAQ,MAAM,gEAAgE;AAC9E,eAAW,KAAK,YAAY;AAC1B,cAAQ,MAAM,oBAAoB,EAAE,IAAI,SAAS,EAAE,OAAO,GAAG;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,WAAM,EAAE,OAAO,IAAI,OAAO,EAAE,EAAE;AAAA,EACzE;AACF;AAQA,SAAS,mBAAmB,UAAyB;AACnD,UAAQ,MAAM,kBAAkB,QAAQ,wDAAwD;AAChG,UAAQ,KAAK,CAAC;AAChB;AAEA,eAAsB,YAAY,UAAkB,cAAwC;AAC1F,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,QAAI,iBAAiB,OAAW,QAAO;AACvC,uBAAmB,QAAQ;AAAA,EAC7B;AACA,QAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,eAAe,GAAG,QAAQ,KAAK,YAAY,QAAQ,GAAG,QAAQ;AAC7E,QAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,OAAG,SAAS,QAAQ,CAAC,QAAQ;AAC3B,SAAG,MAAM;AACT,cAAQ,IAAI,KAAK,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AACD,SAAO,UAAU,gBAAgB;AACnC;AAEA,eAAsB,aACpB,UACA,SACmB;AACnB,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,eAAW,UAAU,QAAS,SAAQ,MAAM,OAAO,OAAO,KAAK,EAAE;AACjE,uBAAmB,QAAQ;AAAA,EAC7B;AACA,UAAQ,IAAI;AAAA,EAAK,QAAQ;AAAA,CAAI;AAC7B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/C;AACA,QAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,QAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,OAAG,SAAS,oBAAoB,CAAC,QAAQ;AACvC,SAAG,MAAM;AACT,cAAQ,IAAI,KAAK,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,MAAM,SAAS,QAAQ,EAAE,IAAI;AACnC,MAAI,MAAM,GAAG,KAAK,MAAM,KAAK,OAAO,QAAQ,QAAQ;AAClD,YAAQ,MAAM,oBAAoB;AAClC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,GAAG,EAAE;AACtB;AAEA,eAAsB,mBAAmB,MAMoB;AAC3D,QAAM,SAAS,MAAM;AAAA,IACnB,GAAG,KAAK,MAAM,mBAAmB,KAAK,UAAU,gBAAgB,KAAK,YAAY;AAAA,IACjF;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,KAAK;AAAA,QACnC,gBAAgB;AAAA,MAClB;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK,UAAU,EAAE,cAAc,KAAK,aAAa,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,GAAI,eAAc,OAAO,OAAO;AAE5C,SAAQ,MAAM,OAAO,SAAS,KAAK;AACrC;AAgBO,SAAS,aAAa,MAAgB,KAAuB;AAClE,QAAM,MAAgB,CAAC;AACvB,QAAM,WAAW,GAAG,GAAG;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,KAAK;AACf,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAI,UAAU,UAAa,MAAM,WAAW,GAAG,KAAK,MAAM,KAAK,EAAE,WAAW,GAAG;AAC7E,gBAAQ,MAAM,UAAU,GAAG,oBAAoB;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,KAAK,KAAK;AAAA,IAChB,WAAW,KAAK,WAAW,QAAQ,GAAG;AACpC,YAAM,QAAQ,IAAI,MAAM,SAAS,MAAM;AACvC,UAAI,MAAM,KAAK,EAAE,WAAW,GAAG;AAC7B,gBAAQ,MAAM,UAAU,GAAG,oBAAoB;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAsBO,SAAS,kBACd,MACA,KACA,MACoB;AACpB,QAAM,WAAW,GAAG,GAAG;AACvB,QAAM,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC;AACvD,MAAI,YAAY,QAAW;AACzB,UAAMC,SAAQ,QAAQ,MAAM,SAAS,MAAM;AAC3C,QAAIA,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC,MAAM,YAAY;AAClD,cAAQ,MAAM,UAAU,GAAG,oBAAoB;AAC/C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,QAAQ,MAAM,KAAK,EAAE,WAAW;AACtC,MAAI,MAAM,WAAW,GAAG,KAAM,SAAS,CAAC,MAAM,YAAa;AACzD,YAAQ,MAAM,UAAU,GAAG,oBAAoB;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAmBA,eAAsB,iBACpB,KACA,QACA,OACmB;AACnB,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,IAAI,IAAI;AACX,YAAQ,MAAM,UAAU,IAAI,SAAS,4BAA4B,EAAE;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,QAAQ,CAAC;AAC5B,QAAM,QACJ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,IAAI,YAAY,CAAC;AACnG,MAAI,CAAC,OAAO;AAKV,YAAQ,OAAO,MAAM,sBAAsB,GAAG;AAAA,CAAgB;AAC9D,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,MAAM,mBAAmB;AACjC,iBAAW,KAAK,OAAQ,SAAQ,OAAO,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,EAAE;AAAA,CAAK;AAAA,IAC1E;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAsB,UACpB,QACA,OACAD,OACA,SACc;AACd,QAAM,SAAS,MAAM,SAAS,GAAG,MAAM,GAAGA,KAAI,IAAI;AAAA,IAChD,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,GAAI,eAAc,OAAO,OAAO;AAE5C,QAAM,OAAQ,MAAM,OAAO,SAAS,KAAK;AAEzC,MAAI,CAAC,KAAK,IAAI;AACZ,YAAQ,MAAM,UAAU,KAAK,KAAK,EAAE;AACpC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAQ,KAAK,OAAO,KAAa,CAAC;AACpC;","names":["path","value"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/eval.ts","../../types/src/agent-eval-template.ts","../src/eval-bundle.ts","../src/eval-run.ts","../../types/src/agent-eval-render.ts","../src/eval-template.ts"],"sourcesContent":["/** `cofactor eval`: author agent evals, add cases, run them against a commit and compare models. */\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { gunzipSync } from 'node:zlib';\nimport { join } from 'node:path';\nimport { AGENT_EVAL_MAX_BUNDLE_BYTES, EvalConversationSchema } from '@chatsdet/types/agent-eval-template';\nimport { printServedGuide } from './guide.js';\nimport { GLOBAL_VALUE_FLAGS, hasFlag, resolveConfig } from './auth.js';\nimport { writeRawOutput } from './brand.js';\nimport {\n getPositionalArg,\n getPositionalArgs,\n getScalarArgValue,\n readStdin,\n} from './cli-helpers.js';\nimport { resolveApplicationId } from './environment.js';\nimport { EVALS, getEval, request, requestAll, requestText, type EvalDetail, type UploadReply } from './eval-api.js';\nimport { loadBundle, missingRequiredPaths } from './eval-bundle.js';\nimport { compareRuns, getRun, listRuns, runEval } from './eval-run.js';\nimport {\n EVAL_GITIGNORE,\n TemplateError,\n formatIssues,\n initRunbook,\n initTemplate,\n readPushPayload,\n} from './eval-template.js';\n\nconst USAGE = {\n guide: 'guide',\n init: 'init <name> [--application <app>] [--capability CAP-…]',\n push: 'push [<file>] --application <app>',\n show: 'show <name>',\n runbook: 'runbook <name>',\n list: 'list',\n cases: 'cases <name> [--download <dir>]',\n 'rm-case': 'rm-case <name> <key>',\n 'add-case':\n 'add-case <name> --key <k> --input <dir|file.tar.gz> --expected <file|-> --source \"<provenance>\" [--title <t>] [--conversation <file.json>]',\n run: 'run <name> [--model <alias>]... [--environment <env>] [--at <sha>] [--case <key>]... [--repeats N] [--parallel N] [--no-wait]',\n get: 'get <run-id> [--case <key>] [--transcript]',\n runs: 'runs <name> [--limit N]',\n compare: 'compare (<run-id>... | --batch <id>)',\n};\ntype Command = keyof typeof USAGE;\n\nconst VALUE_FLAGS = [\n ...GLOBAL_VALUE_FLAGS,\n '--application',\n '--capability',\n '--key',\n '--input',\n '--expected',\n '--source',\n '--title',\n '--conversation',\n '--model',\n '--environment',\n '--at',\n '--case',\n '--repeats',\n '--parallel',\n '--limit',\n '--batch',\n '--download',\n];\n/** How many positional arguments a sub-command needs (push, list and compare take none). */\nconst POSITIONALS: Partial<Record<Command, number>> = {\n show: 1, runbook: 1, cases: 1, 'rm-case': 2, 'add-case': 1, run: 1, get: 1, runs: 1,\n};\nconst WRITES: Command[] = ['push', 'add-case', 'rm-case', 'run'];\nconst DEFAULT_TEMPLATE_DIR = 'evals';\n\nfunction printHelp(command: string | undefined): void {\n const usage = Object.hasOwn(USAGE, command ?? '') ? USAGE[command as Command] : undefined;\n console.log(\n [\n `Usage: cofactor eval ${usage ?? '<sub-command>'} [--json]`,\n '',\n ...Object.values(USAGE).map((line) => ` cofactor eval ${line}`),\n '',\n 'guide: prints the agent-eval guide: the latest served copy, else the one bundled with this CLI (no login needed).',\n 'An eval runs an agent command against a set of cases at a commit, grades each attempt and reports',\n 'pass rate, cost and time per task. The template and runbook live in your repo under evals/.',\n '',\n 'init: writes evals/<name>.eval.yaml (a commented template with a script and an ai-judge grader),',\n ' evals/<name>.runbook.md and evals/.gitignore (*.tar.gz, _staging/). Refuses to overwrite.',\n 'push: validates the template locally, reads the runbook it names (relative to the YAML) and stores both;',\n ' re-pushing is idempotent. Defaults to evals/*.eval.yaml when exactly one exists. Needs --application.',\n ' Warns on a missing runbook heading; errors when \"## Finding real data\" or \"## Sanitizing\" is empty, or when',\n ' any section still has the \"<!-- cofactor:todo -->\" line that init writes (delete it once the section is written).',\n 'show/list/cases/runbook: read the stored eval, its cases (key, sha256, size, source) and runbook.',\n ' cases --download <dir> also writes each bundle as <dir>/<key>.tar (uncompressed, so its sha256 is the case\\'s sha256).',\n 'add-case: --input is a directory (tarred deterministically: sorted entries, fixed mtime, uid/gid 0) or a .tar.gz.',\n ' The sha256 shown is that of the uncompressed tar, so the same files give the same sha256 on any runtime',\n ' and dedup is by tar content; gzip is transport only.',\n ' The template\\'s input.require paths are checked first.',\n ' --expected is a JSON file, or - for stdin. --source says where the data came from and what corroborates the',\n ' label. Never include customer data in a case. --conversation <file.json> is required for a multi-turn eval.',\n 'rm-case: deletes a case that no run has used.',\n 'run: starts one run per --model (alias from the template; none means its default) and waits, printing one',\n ' section per model and then the comparison grid. --case and a --repeats that differs from the template make a partial run',\n ' that never counts for coverage or proofs. Polls every 5 seconds for at most 8.5 hours; a timeout leaves the',\n ' runs readable with get; the batch and run ids are printed to stderr before waiting. --no-wait prints the',\n ' ids and exits 0. --json prints an array with one entry per run, in order: the run\\'s result, or',\n ' {id, status, verdict, error} for a run with no result.',\n 'get: a run\\'s result. --case <key> narrows to one case; --case <key> --transcript adds a multi-turn attempt\\'s',\n ' conversation. runs: recent runs for an eval, newest first (--limit N).',\n 'compare: the grid for run ids or a --batch; --json prints the array of runs.',\n '',\n 'Common options:',\n ' --org <name|id> Logged-in organization; required explicitly for push, add-case, rm-case and run',\n ' --env <env> API environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ' --json Raw JSON on every sub-command except init',\n ' --help, -h Show help without authentication',\n '',\n 'Requires the sandbox-v2 organization flag. API-key scopes:',\n ' run: sandbox:create + sandbox:exec, named explicitly (sandbox:* does not grant sandbox:exec).',\n ' push, add-case, rm-case: sandbox:edit. show, list, cases, runbook, get, runs, compare: sandbox:read.',\n '',\n 'Exit codes (run):',\n ' 0 every run\\'s verdict is pass',\n ' 3 at least one run\\'s verdict is fail (the agent missed the pass bar; perf also exits 3 for \"slower\")',\n ' 1 a failed or cancelled run, a polling timeout, or any error',\n 'Other sub-commands exit 0 on success, 1 on error.',\n ].join('\\n')\n );\n}\n\nfunction required(argv: string[], flag: string): string {\n const value = getScalarArgValue(argv, flag);\n if (!value) throw new Error(`${flag} is required.`);\n return value;\n}\n\n/** `--expected` alone may be `-` (stdin), which the generic value check reads as a missing value. */\nfunction expectedArg(argv: string[]): string {\n const i = argv.findIndex((arg) => arg === '--expected' || arg.startsWith('--expected='));\n const value = i < 0 ? undefined : argv[i]!.startsWith('--expected=') ? argv[i]!.slice('--expected='.length) : argv[i + 1];\n if (!value || value.startsWith('--')) throw new Error('--expected is required: a JSON file, or - for stdin.');\n return value;\n}\n\nasync function readJson(path: string, label: string): Promise<unknown> {\n let text: string;\n try {\n text = path === '-' ? await readStdin() : await readFile(path, 'utf8');\n } catch (error) {\n throw new Error(`Cannot read ${label}: ${error instanceof Error ? error.message : String(error)}`);\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new Error(`${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\ntype Context = { argv: string[]; positionals: string[]; apiUrl: string; token: string; json: boolean };\n\n/** The first positional (an eval name or run id), or the sub-command's usage as the error. */\nfunction target(ctx: Context, command: Command): string {\n const value = ctx.positionals[0];\n if (!value) throw new Error(`Usage: cofactor eval ${USAGE[command]}`);\n return value;\n}\n\nasync function init(argv: string[]): Promise<void> {\n const name = getPositionalArg(argv, VALUE_FLAGS);\n if (!name) throw new Error(`Usage: cofactor eval ${USAGE.init}`);\n if (!/^[a-z0-9-]{2,40}$/.test(name) || name === 'runs' || name === 'compare')\n throw new Error('The eval name must be 2 to 40 lowercase letters, digits or dashes (and not \"runs\" or \"compare\").');\n const capability = getScalarArgValue(argv, '--capability');\n if (capability !== undefined && !/^CAP-[A-Z0-9]+-\\d{3,}$/.test(capability))\n throw new Error('--capability must be a product-map code such as CAP-CMM-001.');\n const files = [\n { path: join(DEFAULT_TEMPLATE_DIR, `${name}.eval.yaml`), text: initTemplate({ name, application: getScalarArgValue(argv, '--application'), capability }) },\n { path: join(DEFAULT_TEMPLATE_DIR, `${name}.runbook.md`), text: initRunbook(name) },\n ];\n const gitignore = join(DEFAULT_TEMPLATE_DIR, '.gitignore');\n const exists = async (path: string) => readFile(path).then(() => true, () => false);\n for (const file of files) {\n if (await exists(file.path)) throw new Error(`${file.path} already exists; not overwriting it.`);\n }\n await mkdir(DEFAULT_TEMPLATE_DIR, { recursive: true });\n const written = files.map((file) => file.path);\n for (const file of files) await writeFile(file.path, file.text, { flag: 'wx' });\n if (!(await exists(gitignore))) {\n await writeFile(gitignore, EVAL_GITIGNORE, { flag: 'wx' });\n written.push(gitignore);\n }\n writeRawOutput(\n hasFlag(argv, '--json')\n ? JSON.stringify({ written }, null, 2)\n : `${written.map((path) => `Wrote ${path}`).join('\\n')}\\nEdit the run command and graders, write each runbook section and delete its <!-- cofactor:todo --> line, then: cofactor eval push ${files[0]!.path} --application <app> --org <org>`\n );\n}\n\nasync function defaultTemplateFile(): Promise<string> {\n const found = (await readdir(DEFAULT_TEMPLATE_DIR).catch(() => [])).filter((f) => f.endsWith('.eval.yaml'));\n if (found.length !== 1)\n throw new Error(\n found.length === 0\n ? `No ${DEFAULT_TEMPLATE_DIR}/*.eval.yaml found; pass the template file.`\n : `Several templates in ${DEFAULT_TEMPLATE_DIR}/ (${found.join(', ')}); pass the one to push.`\n );\n return join(DEFAULT_TEMPLATE_DIR, found[0]!);\n}\n\nasync function push({ argv, apiUrl, token, json }: Context): Promise<void> {\n const file = getPositionalArg(argv, VALUE_FLAGS) ?? (await defaultTemplateFile());\n const payload = await readPushPayload(file);\n for (const warning of payload.warnings) console.error(`Warning: ${warning}`);\n const applicationId = await resolveApplicationId(argv, apiUrl, token);\n const pushed = await request<{ id: string; name: string }>(apiUrl, token, 'PUT', EVALS, {\n applicationId,\n definition: payload.definition,\n runbook: payload.runbook,\n });\n const detail = await getEval(apiUrl, token, pushed.name);\n if (json) {\n writeRawOutput(JSON.stringify({ ...detail, warnings: payload.warnings }, null, 2));\n return;\n }\n writeRawOutput(\n [\n `Pushed ${detail.name} (${detail.id})`,\n `Cases: ${detail.cases.length}`,\n `Capabilities: ${detail.capabilities.map((c) => c.code).join(', ') || 'none'}`,\n ].join('\\n')\n );\n}\n\nfunction describeEval(detail: EvalDetail): string {\n const d = detail.definition;\n return [\n `${detail.name} ${detail.id}`,\n d.description,\n `Application: ${detail.applicationId}`,\n `Mode: ${d.mode}`,\n `Run: ${d.run.split('\\n')[0]}${d.run.includes('\\n') ? ' …' : ''}`,\n `Models: ${Object.entries(d.agent.models).map(([alias, m]) => `${alias}${alias === d.agent.default ? '*' : ''} (${m.model})`).join(', ')}`,\n `Graders: ${d.graders.map((g) => `${g.id} [${g.kind}]`).join(', ')}`,\n `Repeats: ${d.repeats}, pass at least ${d.passAtLeast}, bar ${Math.round(d.passBar * 100)}%, ${d.attemptSeconds}s per attempt`,\n `Capabilities: ${detail.capabilities.map((c) => `${c.code} ${c.title}`).join('; ') || 'none'}`,\n `Cases: ${detail.cases.length}`,\n ].join('\\n');\n}\n\nasync function listEvals({ apiUrl, token, json }: Context): Promise<void> {\n const evals = await requestAll<{ id: string; name: string; applicationId: string; description: string; caseCount: number; latestVerdict: 'pass' | 'fail' | null }>(apiUrl, token, EVALS);\n writeRawOutput(\n json\n ? JSON.stringify(evals, null, 2)\n : evals.map((e) => `${e.name} ${e.id} ${e.caseCount} cases ${e.latestVerdict ?? '-'} ${e.description}`).join('\\n') || 'No evals found.'\n );\n}\n\nasync function showEval(ctx: Context): Promise<void> {\n const detail = await getEval(ctx.apiUrl, ctx.token, target(ctx, 'show'));\n writeRawOutput(ctx.json ? JSON.stringify(detail, null, 2) : describeEval(detail));\n}\n\n// A tar may unpack to more than the gzip limit; the same bound the bundle reader uses for archives.\nconst DOWNLOAD_MAX_TAR_BYTES = 4 * AGENT_EVAL_MAX_BUNDLE_BYTES;\n\n/** Fetch every case bundle through its signed URL and write it, gunzipped, as `<dir>/<key>.tar` (the tar whose sha256 is the case's content address). */\nasync function downloadBundles(ctx: Context, evaluation: EvalDetail, dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n for (const { key } of evaluation.cases) {\n // The key becomes a file name: never trust the server for that.\n if (!/^[a-z0-9][a-z0-9-]*$/.test(key)) throw new Error(`Refusing to download case \"${key}\": its key is not a plain file name.`);\n const { url } = await request<{ url: string }>(\n ctx.apiUrl,\n ctx.token,\n 'GET',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/cases/${encodeURIComponent(key)}/bundle`\n );\n const target = new URL(url);\n if (target.protocol !== 'https:' && !['localhost', '127.0.0.1'].includes(target.hostname))\n throw new Error(`Refusing to download case ${key} over ${target.protocol}.`);\n const response = await fetch(target, { redirect: 'error' });\n if (!response.ok) throw new Error(`Downloading the bundle of case ${key} failed (${response.status}).`);\n await writeFile(join(dir, `${key}.tar`), gunzipSync(Buffer.from(await response.arrayBuffer()), { maxOutputLength: DOWNLOAD_MAX_TAR_BYTES }));\n }\n console.error(`Downloaded ${evaluation.cases.length} case bundle${evaluation.cases.length === 1 ? '' : 's'} to ${dir}`);\n}\n\nasync function listCases(ctx: Context): Promise<void> {\n const evaluation = await getEval(ctx.apiUrl, ctx.token, target(ctx, 'cases'));\n const { cases } = evaluation;\n const download = getScalarArgValue(ctx.argv, '--download');\n if (download) await downloadBundles(ctx, evaluation, download);\n writeRawOutput(\n ctx.json\n ? JSON.stringify(cases, null, 2)\n : cases.map((c) => `${c.key} ${c.bundleSha256.slice(0, 12)} ${c.bundleBytes} bytes ${c.title} [${c.source}]`).join('\\n') || 'No cases.'\n );\n}\n\nasync function showRunbook(ctx: Context): Promise<void> {\n const name = target(ctx, 'runbook');\n const text = await requestText(ctx.apiUrl, ctx.token, `${EVALS}/${encodeURIComponent(name)}/runbook`);\n writeRawOutput(ctx.json ? JSON.stringify({ name, runbook: text }, null, 2) : text.trimEnd());\n}\n\nasync function removeCase(ctx: Context): Promise<void> {\n const name = target(ctx, 'rm-case');\n const key = ctx.positionals[1];\n if (!key) throw new Error(`Usage: cofactor eval ${USAGE['rm-case']}`);\n const evaluation = await getEval(ctx.apiUrl, ctx.token, name);\n await request(ctx.apiUrl, ctx.token, 'DELETE', `${EVALS}/${encodeURIComponent(evaluation.id)}/cases/${encodeURIComponent(key)}`);\n writeRawOutput(ctx.json ? JSON.stringify({ eval: name, key, deleted: true }) : `Removed case ${key} from ${name}`);\n}\n\nasync function addCase(ctx: Context): Promise<void> {\n const { argv, apiUrl, token, json } = ctx;\n const name = target(ctx, 'add-case');\n const key = required(argv, '--key');\n const input = required(argv, '--input');\n const expectedSource = expectedArg(argv);\n const source = required(argv, '--source');\n const conversationFile = getScalarArgValue(argv, '--conversation');\n if (!/^[a-z0-9][a-z0-9-]{0,99}$/.test(key))\n throw new Error('--key must be lowercase letters, digits and dashes, starting with a letter or digit (at most 100 characters).');\n\n const expected = await readJson(expectedSource, expectedSource === '-' ? 'the expected value on stdin' : `--expected ${expectedSource}`);\n let conversation: unknown;\n if (conversationFile) {\n const parsed = EvalConversationSchema.safeParse(await readJson(conversationFile, `--conversation ${conversationFile}`));\n if (!parsed.success)\n throw new TemplateError(`${conversationFile} is not a valid conversation:`, formatIssues(parsed.error));\n conversation = parsed.data;\n }\n\n const evaluation = await getEval(apiUrl, token, name);\n const multiTurn = evaluation.definition.mode === 'multi-turn';\n if (multiTurn && !conversation) throw new Error(`${name} is multi-turn: pass --conversation <file.json>.`);\n if (!multiTurn && conversation) throw new Error(`${name} is single-turn: --conversation is only for multi-turn evals.`);\n\n const bundle = await loadBundle(input);\n const missing = missingRequiredPaths(bundle.entries, evaluation.definition.input.require);\n if (missing.length)\n throw new Error(`The bundle is missing required input path(s): ${missing.join(', ')} (the template's input.require).`);\n\n const evalPath = `${EVALS}/${encodeURIComponent(evaluation.id)}`;\n const upload = await request<UploadReply>(apiUrl, token, 'POST', `${evalPath}/uploads`, {\n sha256: bundle.sha256,\n gzipSha256: bundle.gzipSha256,\n bytes: bundle.bytes,\n });\n const deduplicated = upload.status === 'exists';\n if (upload.status === 'upload') {\n const response = await fetch(upload.url, { method: 'PUT', headers: upload.headers, body: new Uint8Array(bundle.archive) });\n if (!response.ok)\n throw new Error(`Uploading the bundle failed (${response.status}): ${(await response.text()).slice(0, 300)}`);\n }\n await request(apiUrl, token, 'POST', `${evalPath}/cases`, {\n key,\n title: getScalarArgValue(argv, '--title') ?? key,\n sha256: bundle.sha256,\n expected,\n source,\n ...(conversation ? { conversation } : {}),\n });\n const result = { eval: name, key, sha256: bundle.sha256, bytes: bundle.bytes, deduplicated };\n writeRawOutput(\n json\n ? JSON.stringify(result, null, 2)\n : `Added case ${key} to ${name}\\nsha256 ${bundle.sha256} (${bundle.bytes} bytes local gzip), ${deduplicated ? 'deduplicated: the bundle already existed' : 'uploaded'}`\n );\n}\n\n/** One handler per authenticated sub-command; a number is the process exit code. */\nconst HANDLERS: Record<Exclude<Command, 'init' | 'guide'>, (ctx: Context) => Promise<number | void>> = {\n push,\n show: showEval,\n runbook: showRunbook,\n list: listEvals,\n cases: listCases,\n 'rm-case': removeCase,\n 'add-case': addCase,\n run: (ctx) => runEval(ctx.argv, target(ctx, 'run'), ctx.apiUrl, ctx.token),\n get: (ctx) => getRun(ctx.argv, target(ctx, 'get'), ctx.apiUrl, ctx.token),\n runs: (ctx) => listRuns(ctx.argv, target(ctx, 'runs'), ctx.apiUrl, ctx.token),\n compare: (ctx) => compareRuns(ctx.argv, ctx.positionals, ctx.apiUrl, ctx.token),\n};\n\nexport async function runEvalCommand(argv: string[]): Promise<void> {\n const [command, ...rest] = argv;\n if (!command || command === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp(command === 'help' ? rest[0] : command);\n return;\n }\n if (command === 'guide') {\n await printServedGuide('eval', rest);\n return;\n }\n let code = 0;\n try {\n if (!Object.hasOwn(USAGE, command)) throw new Error(`Unknown eval command: ${command}`);\n const cmd = command as Exclude<Command, 'guide'>;\n // Require the identity selector before authentication or any mutating request.\n if (WRITES.includes(cmd)) required(rest, '--org');\n // --expected is checked by expectedArg: its value may be a bare \"-\".\n for (const flag of VALUE_FLAGS.filter((flag) => flag !== '--expected')) {\n if (rest.includes(flag) && getScalarArgValue(rest, flag) === undefined) throw new Error(`${flag} requires a value.`);\n }\n const positionals = getPositionalArgs(rest, VALUE_FLAGS);\n // Usage errors come before authentication.\n if (positionals.length < (POSITIONALS[cmd] ?? 0)) throw new Error(`Usage: cofactor eval ${USAGE[cmd]}`);\n if (cmd === 'init') {\n await init(rest);\n } else {\n const { apiUrl, token } = await resolveConfig(rest);\n const ctx = { argv: rest, positionals, apiUrl, token, json: hasFlag(rest, '--json') };\n code = (await HANDLERS[cmd](ctx)) ?? 0;\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n code = 1;\n }\n if (code !== 0) process.exit(code);\n}\n","/**\n * Agent evaluation shared contracts.\n * @module agent-eval-template\n * @see docs/project/conventions.md\n */\nimport { z } from 'zod';\n\nexport const AGENT_EVAL_MAX_BUNDLE_BYTES = 512 * 1024 ** 2;\nexport const AGENT_EVAL_MAX_TOTAL_BUNDLE_BYTES = 2 * 1024 ** 3;\n\nconst ModelSchema = z.strictObject({\n provider: z.enum(['anthropic', 'azure']),\n model: z.string().min(1),\n});\n\n// Upper case like sandbox secret names; EVAL_* is the attempt's own contract and would be overwritten.\nconst EnvName = z\n .string()\n .regex(/^[A-Z_][A-Z0-9_]*$/, 'Must be an upper-case environment variable name')\n .refine((name) => !name.startsWith('EVAL_'), 'EVAL_ names are reserved for the attempt environment');\n/**\n * Where an agent reads its model configuration: the env var names the attempt sets for one provider. An entry\n * replaces all of that provider's standard names (spec D8; azure's two key and two URL names become one each) and is\n * needed only when the agent reads other names.\n */\nconst ProviderEnvSchema = z.strictObject({\n env: z\n .strictObject({\n apiKey: EnvName, // gets the attempt's scoped proxy token\n baseUrl: EnvName, // gets the proxy URL for the provider's wire\n model: EnvName, // gets the model id\n })\n .refine((env) => new Set(Object.values(env)).size === 3, 'apiKey, baseUrl and model must be different names'),\n});\n\nconst ScriptGrader = z.strictObject({\n id: z.string().regex(/^[a-z0-9-]+$/),\n kind: z.literal('script'),\n command: z.string().min(1),\n});\nconst JudgeGrader = z.strictObject({\n id: z.string().regex(/^[a-z0-9-]+$/),\n kind: z.literal('ai-judge'),\n rubric: z.string().min(20),\n scale: z.enum(['binary', '1-5']),\n passAt: z.number().int().min(2).max(5).optional(), // required when scale is '1-5'\n judge: ModelSchema,\n});\n\nexport const AgentEvalTemplateSchema = z\n .strictObject({\n version: z.literal(1),\n name: z\n .string()\n .regex(/^[a-z0-9-]{2,40}$/)\n .refine((n) => n !== 'runs' && n !== 'compare'), // reserved route segments\n description: z.string().min(1).max(500),\n proves: z.strictObject({ capabilities: z.array(z.string().regex(/^CAP-/)).min(1) }), // resolved within the application given at push\n runbook: z.string().min(1), // path relative to this file\n mode: z.enum(['single-turn', 'multi-turn']).default('single-turn'),\n run: z.string().min(1), // shell command, cwd = repo root of the commit; multi-turn: the agent process, JSONL on stdin/stdout\n simulator: ModelSchema.optional(), // required when mode is multi-turn: pins the simulated-user model\n input: z.strictObject({\n description: z.string().min(1),\n require: z.array(z.string()).default([]),\n }),\n agent: z.strictObject({\n models: z\n .record(z.string().regex(/^[a-z0-9-]+$/), ModelSchema)\n .refine((m) => Object.keys(m).length >= 1),\n default: z.string(), // must be a key of models\n providers: z\n .strictObject({ anthropic: ProviderEnvSchema.optional(), azure: ProviderEnvSchema.optional() })\n .optional(), // absent, or an absent entry: the standard names; every entry's provider must be used by a model\n }),\n graders: z.array(z.discriminatedUnion('kind', [ScriptGrader, JudgeGrader])).min(1),\n repeats: z.number().int().min(1).max(7).default(3),\n passAtLeast: z.number().int().min(1).default(2), // <= repeats\n passBar: z.number().min(0.1).max(1), // minimum case pass rate for the eval to pass\n attemptSeconds: z.number().int().min(30).max(1700), // grader commands get a fixed 120 s\n })\n .superRefine((template, ctx) => {\n if (!Object.hasOwn(template.agent.models, template.agent.default)) {\n ctx.addIssue({\n code: 'custom',\n path: ['agent', 'default'],\n message: 'Default must name an agent model alias',\n });\n }\n const used = new Set<string>(Object.values(template.agent.models).map((m) => m.provider));\n for (const [provider, entry] of Object.entries(template.agent.providers ?? {})) {\n if (entry && !used.has(provider)) {\n ctx.addIssue({\n code: 'custom',\n path: ['agent', 'providers', provider],\n message: `No agent model uses provider ${provider}; remove this entry or add a model that uses it`,\n });\n }\n }\n if (template.passAtLeast > template.repeats) {\n ctx.addIssue({\n code: 'custom',\n path: ['passAtLeast'],\n message: 'passAtLeast must not exceed repeats',\n });\n }\n const ids = new Set<string>();\n template.graders.forEach((grader, index) => {\n if (ids.has(grader.id)) {\n ctx.addIssue({\n code: 'custom',\n path: ['graders', index, 'id'],\n message: 'Grader ids must be unique',\n });\n }\n ids.add(grader.id);\n if (grader.kind === 'ai-judge' && grader.scale === '1-5' && grader.passAt === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['graders', index, 'passAt'],\n message: 'A 1-5 judge requires passAt',\n });\n }\n });\n if ((template.mode === 'multi-turn') !== (template.simulator !== undefined)) {\n ctx.addIssue({\n code: 'custom',\n path: ['simulator'],\n message: 'A simulator is required exactly when mode is multi-turn',\n });\n }\n });\nexport type AgentEvalTemplate = z.infer<typeof AgentEvalTemplateSchema>;\n\n/** A multi-turn case's conversation; null on a single-turn case. */\nexport const EvalConversationSchema = z.discriminatedUnion('kind', [\n z.strictObject({ kind: z.literal('scripted'), turns: z.array(z.string().min(1)).min(1) }),\n z.strictObject({\n kind: z.literal('simulated'),\n persona: z.string().min(1),\n goal: z.string().min(1),\n facts: z.array(z.string()),\n stopWhen: z.string().min(1),\n maxTurns: z.number().int().min(2).max(30),\n }),\n]);\nexport type EvalConversation = z.infer<typeof EvalConversationSchema>;\n","/**\n * Case bundles for `cofactor eval add-case`: a deterministic tar of a directory (gzipped for\n * upload), a reader for an existing .tar.gz, and the `input.require` check. The content address\n * `sha256` is the hash of the uncompressed tar, which this file fully specifies, so the same files\n * give the same sha256 on any runtime and identical bundles deduplicate across cases and evals\n * (spec D4, D11). Gzip is transport only: its bytes depend on the runtime's zlib, so they are\n * hashed separately as `gzipSha256` for the upload's integrity check.\n */\nimport { createHash } from 'node:crypto';\nimport { lstat, readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { gunzipSync, gzipSync } from 'node:zlib';\nimport { AGENT_EVAL_MAX_BUNDLE_BYTES } from '@chatsdet/types/agent-eval-template';\n\nconst BLOCK = 512;\n// Memory guards for this process, not the server's limit (which is on the archive's bytes and is\n// enforced by the API): a directory's raw size, and what an archive may unpack to.\nconst MAX_RAW_BYTES = AGENT_EVAL_MAX_BUNDLE_BYTES;\nconst MAX_UNPACKED_BYTES = 4 * AGENT_EVAL_MAX_BUNDLE_BYTES;\n\n/** `sha256` addresses the uncompressed tar; `archive` is the gzip that gets uploaded, with its own hash and size. */\nexport type BundleSource = {\n sha256: string;\n gzipSha256: string;\n bytes: number;\n archive: Buffer;\n entries: string[];\n};\n\nconst sha256Hex = (data: Buffer): string => createHash('sha256').update(data).digest('hex');\n\nfunction octal(value: number, width: number): string {\n return `${value.toString(8).padStart(width - 1, '0')}\\0`;\n}\n\n/** Split a path into the ustar `prefix` and `name` fields, which hold 155 and 100 bytes. */\nfunction splitName(path: string): { prefix: string; name: string } {\n if (Buffer.byteLength(path) <= 100) return { prefix: '', name: path };\n for (let i = path.indexOf('/'); i !== -1; i = path.indexOf('/', i + 1)) {\n const prefix = path.slice(0, i);\n const name = path.slice(i + 1);\n if (Buffer.byteLength(prefix) <= 155 && Buffer.byteLength(name) <= 100) return { prefix, name };\n }\n throw new Error(`Path is too long for a bundle (limit 255 bytes): ${path}`);\n}\n\nfunction header(path: string, size: number, type: '0' | '5', mode: number): Buffer {\n const { prefix, name } = splitName(path);\n const block = Buffer.alloc(BLOCK);\n block.write(name, 0, 'utf8');\n block.write(octal(mode, 8), 100, 'ascii');\n block.write(octal(0, 8), 108, 'ascii'); // uid\n block.write(octal(0, 8), 116, 'ascii'); // gid\n block.write(octal(size, 12), 124, 'ascii');\n block.write(octal(0, 12), 136, 'ascii'); // fixed mtime\n block.fill(0x20, 148, 156); // checksum placeholder is spaces\n block.write(type, 156, 'ascii');\n block.write('ustar\\0', 257, 'ascii');\n block.write('00', 263, 'ascii');\n // uname and gname stay empty: no owner names in the archive.\n block.write(prefix, 345, 'utf8');\n const checksum = block.reduce((sum, byte) => sum + byte, 0);\n block.write(`${checksum.toString(8).padStart(6, '0')}\\0 `, 148, 'ascii');\n return block;\n}\n\ntype Entry = { path: string; absolute: string; directory: boolean; mode: number; size: number };\n\n/** Entries in byte order of their NFC-normalized names, so macOS (NFD) and Linux file systems agree. */\nasync function walk(root: string, real = '', archive = ''): Promise<Entry[]> {\n const names = (await readdir(real ? join(root, real) : root))\n .map((name) => ({ real: name, archive: name.normalize('NFC') }))\n .sort((a, b) => Buffer.compare(Buffer.from(a.archive), Buffer.from(b.archive)));\n const entries: Entry[] = [];\n for (const name of names) {\n const realPath = real ? `${real}/${name.real}` : name.real;\n const path = archive ? `${archive}/${name.archive}` : name.archive;\n const absolute = join(root, realPath);\n const stats = await lstat(absolute);\n if (stats.isDirectory()) {\n entries.push({ path, absolute, directory: true, mode: 0o755, size: 0 });\n entries.push(...(await walk(root, realPath, path)));\n } else if (stats.isFile()) {\n entries.push({\n path,\n absolute,\n directory: false,\n mode: stats.mode & 0o111 ? 0o755 : 0o644,\n size: stats.size,\n });\n } else {\n throw new Error(\n `Cannot bundle ${path}: only regular files and directories are supported (no symlinks or devices).`\n );\n }\n }\n return entries;\n}\n\n/** Tar a directory deterministically: sorted entries, mtime 0, uid and gid 0, no owner names. */\nexport async function tarDirectory(root: string): Promise<Buffer> {\n const entries = await walk(root);\n const total = entries.reduce((sum, entry) => sum + entry.size, 0);\n if (total > MAX_RAW_BYTES) {\n throw new Error(`The input directory holds ${total} bytes; the CLI bundles at most ${MAX_RAW_BYTES}. Prune it.`);\n }\n const parts: Buffer[] = [];\n for (const entry of entries) {\n if (entry.directory) {\n parts.push(header(`${entry.path}/`, 0, '5', entry.mode));\n continue;\n }\n const content = await readFile(entry.absolute);\n parts.push(header(entry.path, content.length, '0', entry.mode), content);\n const padding = (BLOCK - (content.length % BLOCK)) % BLOCK;\n if (padding) parts.push(Buffer.alloc(padding));\n }\n parts.push(Buffer.alloc(BLOCK * 2));\n return Buffer.concat(parts);\n}\n\nfunction readString(block: Buffer, start: number, length: number): string {\n const slice = block.subarray(start, start + length);\n const end = slice.indexOf(0);\n return slice.subarray(0, end === -1 ? length : end).toString('utf8');\n}\n\nfunction normalize(path: string): string {\n return path.replace(/^(\\.\\/)+/, '').replace(/\\/+$/, '');\n}\n\n/** Entry paths of an uncompressed tar (ustar, GNU long names and pax `path` records). */\nexport function listTarEntries(tar: Buffer): string[] {\n const entries: string[] = [];\n let longName: string | null = null;\n let offset = 0;\n while (offset + BLOCK <= tar.length) {\n const block = tar.subarray(offset, offset + BLOCK);\n if (block.every((byte) => byte === 0)) break;\n const stored = Number.parseInt(readString(block, 148, 8).trim(), 8);\n const actual = block.reduce((sum, byte, i) => sum + (i >= 148 && i < 156 ? 0x20 : byte), 0);\n if (stored !== actual) throw new Error('not a valid tar archive (bad header checksum)');\n const size = Number.parseInt(readString(block, 124, 12).trim() || '0', 8);\n const type = String.fromCharCode(block[156] || 0x30);\n const body = tar.subarray(offset + BLOCK, offset + BLOCK + size);\n offset += BLOCK + Math.ceil(size / BLOCK) * BLOCK;\n if (type === 'L') {\n longName = readString(body, 0, body.length);\n continue;\n }\n if (type === 'x') {\n const record = body.toString('utf8').match(/\\d+ path=([^\\n]*)\\n/);\n if (record?.[1]) longName = record[1];\n continue;\n }\n if (type === 'g') continue;\n const prefix = readString(block, 345, 155);\n if (['1', '2', '3', '4', '6'].includes(type))\n throw new Error(`the archive holds a link or device entry (${readString(block, 0, 100)}); only files and directories are supported`);\n const name = longName ?? (prefix ? `${prefix}/${readString(block, 0, 100)}` : readString(block, 0, 100));\n longName = null;\n entries.push(normalize(name));\n }\n return entries;\n}\n\n/** Load an input (a directory or a .tar.gz) as a bundle, with its entry list, the tar's sha256 and the gzip's size and hash. */\nexport async function loadBundle(input: string): Promise<BundleSource> {\n let stats;\n try {\n stats = await lstat(input);\n } catch {\n throw new Error(`--input ${input} does not exist.`);\n }\n let tar: Buffer;\n if (stats.isDirectory()) {\n tar = await tarDirectory(input);\n } else if (stats.isFile() && /\\.(tar\\.gz|tgz)$/.test(input)) {\n if (stats.size > AGENT_EVAL_MAX_BUNDLE_BYTES)\n throw new Error(`${input} is ${stats.size} bytes; a bundle is limited to ${AGENT_EVAL_MAX_BUNDLE_BYTES}. Prune it.`);\n const gzip = await readFile(input);\n try {\n tar = gunzipSync(gzip, { maxOutputLength: MAX_UNPACKED_BYTES });\n } catch {\n throw new Error(`--input ${input} is not a valid gzip file, or unpacks to more than ${MAX_UNPACKED_BYTES} bytes.`);\n }\n } else {\n throw new Error('--input must be a directory or a .tar.gz file.');\n }\n // Always re-gzipped here, even for a .tar.gz input: the upload is then a single-member gzip from\n // this CLI, whatever the input held. Gzip is transport only; the content address is the tar's hash.\n const archive = gzipSync(tar, { level: 9 });\n let entries: string[];\n try {\n entries = listTarEntries(tar);\n } catch (error) {\n throw new Error(`--input ${input}: ${error instanceof Error ? error.message : String(error)}.`);\n }\n return {\n sha256: sha256Hex(tar),\n gzipSha256: sha256Hex(archive),\n bytes: archive.length,\n archive,\n entries,\n };\n}\n\n/** The `input.require` paths the bundle does not contain (a path may name a file or a directory). */\nexport function missingRequiredPaths(entries: string[], required: string[]): string[] {\n return required.filter((path) => {\n const wanted = normalize(path);\n return !entries.some((entry) => entry === wanted || entry.startsWith(`${wanted}/`));\n });\n}\n","/** `cofactor eval run|get|runs|compare`: start runs, wait for them and print their results. */\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { renderAgentEvalCompare, renderAgentEvalRun } from '@chatsdet/types/agent-eval-render';\nimport type {\n AgentEvalCompareResult,\n AgentEvalRunResult,\n AgentEvalTranscriptEntry,\n} from '@chatsdet/types/agent-eval-result';\nimport { hasFlag } from './auth.js';\nimport { writeRawOutput } from './brand.js';\nimport { getArgValues, getScalarArgValue } from './cli-helpers.js';\nimport { EVALS, getEval, request, requestTolerant } from './eval-api.js';\n\ntype RunStatus = AgentEvalRunResult['status'];\ntype Verdict = 'pass' | 'fail' | null;\n/** `GET /org/agent-evals/runs/:id`: the run row, its stored result once finished, and its attempts. */\ntype RunDetail = {\n id: string;\n batchId: string;\n status: RunStatus;\n verdict: Verdict;\n error: string | null;\n modelAlias: string;\n result: AgentEvalRunResult | null;\n attempts: { attemptIndex: number; transcript: AgentEvalTranscriptEntry[] | null; case: { key: string } }[];\n};\n/** One item of `GET /org/agent-evals/:name/runs`. */\ntype RunSummary = {\n id: string;\n batchId: string;\n modelAlias: string;\n commitSha: string;\n status: RunStatus;\n verdict: Verdict;\n error: string | null;\n};\n\n/** Tests shorten the interval. */\nexport const pollSettings = { intervalMs: 5000 };\n// The run job has an eight-hour budget; wait a little past it before giving up.\nconst WAIT_MS = 8.5 * 60 * 60 * 1000;\nconst MAX_TRANSIENT_FAILURES = 5;\nconst FINISHED: RunStatus[] = ['completed', 'failed', 'cancelled'];\n\nfunction intFlag(argv: string[], flag: string): number | undefined {\n const value = getScalarArgValue(argv, flag);\n if (value === undefined) return undefined;\n if (!/^\\d+$/.test(value)) throw new Error(`${flag} must be a whole number.`);\n return Number(value);\n}\n\nconst runPath = (id: string, transcript = false) =>\n `${EVALS}/runs/${encodeURIComponent(id)}${transcript ? '?transcript=1' : ''}`;\n\nconst describeRun = (run: RunDetail) =>\n `${run.id} ${run.modelAlias} ${run.status}${run.verdict ? ` ${run.verdict}` : ''}${run.error ? ` ${run.error}` : ''}`;\n\nconst stub = (run: RunDetail) => ({ id: run.id, status: run.status, verdict: run.verdict, error: run.error });\n\n/** 0 when every run passed, 1 for a failed or cancelled run, 3 when a run's verdict is fail. */\nfunction exitCodeFor(runs: { status: RunStatus; verdict: Verdict }[]): number {\n if (runs.some((run) => run.status !== 'completed')) return 1;\n return runs.some((run) => run.verdict !== 'pass') ? 3 : 0;\n}\n\n/**\n * Wait for every run of a batch. One light list request per tick covers the batch; each run's full\n * detail is fetched once when all are finished. Network errors and 5xx replies are tolerated up to\n * five in a row; auth and 4xx errors end the wait at once.\n */\nasync function waitForRuns(\n apiUrl: string,\n token: string,\n evalName: string,\n started: { batchId: string; runIds: string[] }\n): Promise<RunDetail[]> {\n const ids = `batch ${started.batchId}; runs ${started.runIds.join(', ')}`;\n let transient = 0;\n const get = async <T>(path: string): Promise<T | null> => {\n const reply = await requestTolerant<T>(apiUrl, token, path);\n if ('data' in reply) {\n transient = 0;\n return reply.data;\n }\n if (++transient >= MAX_TRANSIENT_FAILURES)\n throw new Error(`Giving up after ${transient} failed polls (${reply.transient}). Still readable: ${ids}.`);\n return null;\n };\n const deadline = Date.now() + WAIT_MS;\n for (;;) {\n if (Date.now() >= deadline)\n throw new Error(`Timed out waiting for the runs. Inspect them with cofactor eval get <run-id>: ${ids}.`);\n const page = await get<{ items: RunSummary[] }>(`${EVALS}/${encodeURIComponent(evalName)}/runs?limit=100`);\n if (page) {\n const statuses = new Map(page.items.map((item) => [item.id, item.status]));\n // A run beyond the first page is looked up directly.\n const known = await Promise.all(\n started.runIds.map(async (id) => statuses.get(id) ?? (await get<RunDetail>(runPath(id)))?.status)\n );\n if (known.every((status) => status !== undefined && FINISHED.includes(status))) break;\n }\n await sleep(pollSettings.intervalMs);\n }\n const details: RunDetail[] = [];\n for (const id of started.runIds) {\n let detail: RunDetail | null = null;\n while (!(detail = await get<RunDetail>(runPath(id)))) await sleep(pollSettings.intervalMs);\n details.push(detail);\n }\n return details;\n}\n\nexport async function runEval(argv: string[], name: string, apiUrl: string, token: string): Promise<number> {\n const json = hasFlag(argv, '--json');\n const models = getArgValues(argv, '--model');\n const cases = getArgValues(argv, '--case');\n const at = getScalarArgValue(argv, '--at');\n const environment = getScalarArgValue(argv, '--environment');\n const repeats = intFlag(argv, '--repeats');\n const parallel = intFlag(argv, '--parallel');\n const evaluation = await getEval(apiUrl, token, name);\n const started = await request<{ batchId: string; runIds: string[] }>(\n apiUrl,\n token,\n 'POST',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/runs`,\n {\n ...(models.length ? { models } : {}),\n ...(environment ? { environment } : {}),\n ...(at ? { at } : {}),\n ...(cases.length ? { cases } : {}),\n ...(repeats !== undefined ? { repeats } : {}),\n ...(parallel !== undefined ? { parallel } : {}),\n }\n );\n if (hasFlag(argv, '--no-wait')) {\n writeRawOutput(\n json\n ? JSON.stringify(started, null, 2)\n : `Started batch ${started.batchId}\\n${started.runIds.join('\\n')}\\nRead results with: cofactor eval get <run-id> | cofactor eval compare --batch ${started.batchId}`\n );\n return 0;\n }\n // Printed before waiting so an interrupted or failed wait still leaves the ids to read results with.\n console.error(\n `Started batch ${started.batchId}; runs ${started.runIds.join(', ')}. If this is interrupted, read results with cofactor eval get <run-id> or cofactor eval compare --batch ${started.batchId}.`\n );\n const details = await waitForRuns(apiUrl, token, name, started);\n const results = details.flatMap((run) => (run.result ? [run.result] : []));\n if (json) {\n writeRawOutput(JSON.stringify(details.map((run) => run.result ?? stub(run)), null, 2));\n } else {\n const compare =\n details.length > 1 && results.length === details.length\n ? await request<AgentEvalCompareResult>(apiUrl, token, 'GET', `${EVALS}/compare?batch=${encodeURIComponent(started.batchId)}`)\n : null;\n if (results.length)\n writeRawOutput(\n [...results.map(renderAgentEvalRun), ...(compare ? [renderAgentEvalCompare(compare)] : [])].join('\\n').trimEnd()\n );\n for (const run of details.filter((run) => !run.result || run.status !== 'completed')) console.error(describeRun(run));\n }\n return exitCodeFor(details);\n}\n\nexport async function getRun(argv: string[], target: string, apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const caseKey = getScalarArgValue(argv, '--case');\n const transcript = hasFlag(argv, '--transcript');\n if (transcript && !caseKey) throw new Error('--transcript needs --case <key>: transcripts are large, so the CLI prints one case at a time.');\n const run = await request<RunDetail>(apiUrl, token, 'GET', runPath(target, transcript));\n if (!run.result) {\n writeRawOutput(json ? JSON.stringify(stub(run), null, 2) : describeRun(run));\n return;\n }\n const result: AgentEvalRunResult = {\n ...run.result,\n cases: run.result.cases\n .filter((c) => caseKey === undefined || c.key === caseKey)\n .map((c) => ({\n ...c,\n attempts: c.attempts.map((attempt) => ({\n ...attempt,\n transcript: transcript\n ? (run.attempts.find((a) => a.case.key === c.key && a.attemptIndex === attempt.index)?.transcript ?? attempt.transcript)\n : attempt.transcript,\n })),\n })),\n };\n if (caseKey && result.cases.length === 0) throw new Error(`Run ${target} has no case \"${caseKey}\".`);\n if (json) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n const lines = [renderAgentEvalRun(result).trimEnd()];\n if (transcript) {\n for (const attempt of result.cases.flatMap((c) => c.attempts)) {\n lines.push('', `Transcript, attempt ${attempt.index}:`);\n lines.push(\n ...(attempt.transcript?.length\n ? attempt.transcript.map((entry) => `${entry.role}: ${entry.text}`)\n : ['(none: this eval is not multi-turn, or the attempt did not run)'])\n );\n }\n }\n writeRawOutput(lines.join('\\n'));\n}\n\nexport async function listRuns(argv: string[], name: string, apiUrl: string, token: string): Promise<void> {\n const limit = intFlag(argv, '--limit');\n const page = await request<{ items: RunSummary[]; nextCursor: string | null }>(\n apiUrl,\n token,\n 'GET',\n `${EVALS}/${encodeURIComponent(name)}/runs${limit !== undefined ? `?limit=${limit}` : ''}`\n );\n writeRawOutput(\n hasFlag(argv, '--json')\n ? JSON.stringify(page, null, 2)\n : page.items\n .map((run) => `${run.id} ${run.modelAlias} ${run.status} ${run.verdict ?? '-'} ${run.commitSha.slice(0, 7)} batch ${run.batchId}`)\n .join('\\n') || 'No runs found.'\n );\n}\n\nexport async function compareRuns(argv: string[], ids: string[], apiUrl: string, token: string): Promise<void> {\n const batch = getScalarArgValue(argv, '--batch');\n if (Boolean(batch) === (ids.length > 0)) throw new Error('Use either one or more run ids or --batch <id>.');\n const query = batch ? `batch=${encodeURIComponent(batch)}` : `runs=${ids.map(encodeURIComponent).join(',')}`;\n const comparison = await request<AgentEvalCompareResult>(apiUrl, token, 'GET', `${EVALS}/compare?${query}`);\n writeRawOutput(\n hasFlag(argv, '--json') ? JSON.stringify(comparison.runs, null, 2) : renderAgentEvalCompare(comparison).trimEnd()\n );\n}\n","/** Pure markdown rendering shared by CLI and tests. Tokens per task are averaged here from server-provided case means. */\nimport type {\n AgentEvalCaseResult,\n AgentEvalCompareResult,\n AgentEvalRunResult,\n AgentEvalTokens,\n} from './agent-eval-result.js';\n\nconst cell = (value: string) => value.replaceAll('|', '\\\\|').replace(/\\r?\\n/g, ' ');\nconst percent = (value: number) => `${Math.round(value * 100)}%`;\nconst money = (cents: number | null, incomplete = false) =>\n cents === null ? 'unpriced' : `$${(cents / 100).toFixed(2)}${incomplete ? '*' : ''}`;\nconst minutes = (ms: number) => (ms / 60_000).toFixed(1);\nconst tokenCount = (n: number) =>\n n >= 1000 ? `${(n / 1000).toFixed(n >= 100_000 ? 0 : 1)}k` : `${Math.round(n)}`;\nconst tokenPair = (tokens: AgentEvalTokens) =>\n `${tokenCount(tokens.input)} / ${tokenCount(tokens.output)}`;\n/** Mean tokens per task, averaged from the server's per-case means; shared by the CLI markdown and the run page. */\nexport const meanTaskTokens = (result: AgentEvalRunResult): AgentEvalTokens => {\n const cases = result.cases;\n const mean = (key: keyof AgentEvalTokens) =>\n cases.length ? cases.reduce((n, c) => n + c.tokensPerAttempt[key], 0) / cases.length : 0;\n return {\n input: mean('input'),\n output: mean('output'),\n cacheRead: mean('cacheRead'),\n cacheCreation: mean('cacheCreation'),\n };\n};\nconst verdict = (r: AgentEvalRunResult) => (r.verdict ?? r.status).toUpperCase();\n\nexport function renderAgentEvalRun(result: AgentEvalRunResult): string {\n const s = result.summary;\n const taskTokens = meanTaskTokens(result);\n const warning = result.warnings.length\n ? ` [WARNING: ${result.warnings.map(cell).join('; ')}]`\n : '';\n // userSim is non-null exactly for a multi-turn eval (D16); single-turn output stays unchanged.\n const multiTurn = s.userSim !== null;\n const turnsToSuccess = (c: AgentEvalCaseResult) => {\n const passing = c.attempts.flatMap((a) => (a.passed && a.turns !== null ? [a.turns] : []));\n return passing.length ? (passing.reduce((n, t) => n + t, 0) / passing.length).toFixed(1) : '-';\n };\n const lines = [\n `## Eval ${cell(result.eval)}: ${verdict(result)} (${s.casesPassed}/${s.cases} cases, bar ${percent(result.passBar)}) — ${cell(result.model.alias)} (${cell(result.model.id)}) @ ${result.commit.slice(0, 7)}, ${result.repeats} repeats${warning}`,\n '',\n `| Case | Result | Attempts | Score | ${multiTurn ? 'Turns | ' : ''}Cost/attempt | Time/attempt | Tokens in/out |`,\n `|---|---|---|---|${multiTurn ? '---|' : ''}---|---|---|`,\n ...result.cases.map(\n (c) =>\n `| ${cell(c.key)} | ${c.passed ? 'PASS' : 'FAIL'} | ${c.passedAttempts}/${c.attempts.length} | ${c.meanScore.toFixed(1)} | ${multiTurn ? `${turnsToSuccess(c)} | ` : ''}${money(\n c.costCentsPerAttempt,\n c.attempts.some((a) => !a.costComplete)\n )} | ${minutes(c.durationMsPerAttempt)} min | ${tokenPair(c.tokensPerAttempt)} |`\n ),\n '',\n `Per task: ${money(s.costCentsPerTask, s.incompleteCalls > 0)} | ${minutes(s.durationMsPerTask)} min | ${tokenCount(taskTokens.input)} in / ${tokenCount(taskTokens.output)} out. Total: ${money(s.costCents, s.incompleteCalls > 0)} for ${s.attempts} attempts, ${Math.round(result.cases.flatMap((c) => c.attempts).reduce((n, a) => n + a.durationMs, 0) / 60_000)} min of agent time.`,\n ];\n const judges = [\n ...new Set(\n result.cases\n .flatMap((c) => c.attempts.flatMap((a) => a.grades))\n .filter((g) => g.kind === 'ai-judge')\n .map((g) => g.judgeModel)\n ),\n ];\n lines.push(\n `Judge (${judges.length ? judges.map((m) => cell(m ?? 'unknown')).join(', ') : 'none'}, pinned): ${s.judge.calls} calls, ${money(s.judge.costCents)}, not included above.`\n );\n if (s.userSim) {\n const models = [\n ...new Set(\n result.cases.flatMap((c) =>\n c.attempts.flatMap((a) => a.calls.filter((call) => call.role === 'user-sim').map((call) => call.model))\n )\n ),\n ];\n lines.push(\n `User-sim (${models.length ? models.map(cell).join(', ') : 'none'}, pinned): ${s.userSim.calls} calls, ${money(s.userSim.costCents)}, not included above.`\n );\n }\n const failures = result.cases.flatMap((c) =>\n c.attempts.flatMap((a) => [\n ...a.grades\n .filter((g) => !g.pass)\n .map((g) => `${cell(c.key)} #${a.index}: ${cell(g.grader)}: ${cell(g.reason)}`),\n ...(a.error && !a.grades.some((g) => !g.pass && (g.reason === a.error || g.error === a.error))\n ? [`${cell(c.key)} #${a.index}: ${cell(a.error)}`]\n : []),\n ])\n );\n lines.push(`Failed grades: ${failures.length ? failures.join('; ') : 'none'}.`);\n if (result.error) lines.push(`Error: ${cell(result.error)}.`);\n if (s.incompleteCalls) lines.push('* Cost is a lower bound because agent calls were incomplete.');\n lines.push(\n `Warnings: ${result.warnings.length ? result.warnings.map(cell).join('; ') : 'none'}. Run: ${result.id}.`\n );\n return `${lines.join('\\n')}\\n`;\n}\n\nexport function renderAgentEvalCompare(result: AgentEvalCompareResult): string {\n const lines = [\n `## Eval compare: ${cell(result.eval)} @ ${result.commit.slice(0, 7)}${result.batchId ? ` (batch ${result.batchId})` : ''}`,\n '',\n '| Model | Verdict | Pass rate | Mean score | Cost/task | Time/task | Tokens/task in/out |',\n '|---|---|---|---|---|---|---|',\n ...result.runs.map(\n (r) =>\n `| ${cell(r.model.alias)} (${cell(r.model.id)}) | ${verdict(r)} | ${percent(r.summary.passRate)} | ${r.summary.meanScore.toFixed(1)} | ${money(r.summary.costCentsPerTask, r.summary.incompleteCalls > 0)} | ${minutes(r.summary.durationMsPerTask)} min | ${tokenPair(meanTaskTokens(r))} |`\n ),\n '',\n `| Case | ${result.runs.map((r) => cell(r.model.alias)).join(' | ')} |`,\n `|---|${result.runs.map(() => '---|').join('')}`,\n ...result.cases.map(\n (c) =>\n `| ${cell(c.key)} | ${c.models\n .map(\n ({ result: r }) =>\n `${r.passedAttempts}/${r.attempts.length} ${r.passed ? 'PASS' : 'FAIL'} ${money(\n r.costCentsPerAttempt,\n r.attempts.some((a) => !a.costComplete)\n )} ${minutes(r.durationMsPerAttempt)}m`\n )\n .join(' | ')} |`\n ),\n ];\n for (const r of result.runs)\n if (r.warnings.length)\n lines.push(`Warnings (${cell(r.model.alias)}): ${r.warnings.map(cell).join('; ')}.`);\n if (result.runs.some((r) => r.summary.incompleteCalls > 0))\n lines.push('* Cost is a lower bound because agent calls were incomplete.');\n return `${lines.join('\\n')}\\n`;\n}\n","/** Authoring side of `cofactor eval`: the `init` files and the local checks `push` runs. */\nimport { readFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { parse } from 'yaml';\nimport type { ZodError } from 'zod';\nimport {\n AgentEvalTemplateSchema,\n type AgentEvalTemplate,\n} from '@chatsdet/types/agent-eval-template';\n\n/** `eval init` writes this line first in every runbook section; `eval push` refuses a runbook that still has one. */\nexport const RUNBOOK_TODO_MARKER = '<!-- cofactor:todo -->';\n\n/** The fixed runbook headings, in order, each with the prompt `eval init` writes under it. */\nexport const RUNBOOK_SECTIONS: readonly { heading: string; prompt: string }[] = [\n {\n heading: 'What this eval proves',\n prompt: \"Describe the agent's job in one paragraph and the capabilities it backs.\",\n },\n {\n heading: 'Anatomy of a case',\n prompt:\n 'List the files in $EVAL_INPUT, what the expected value holds, and what a good case teaches.',\n },\n {\n heading: 'Finding real data',\n prompt:\n 'Say where in production the inputs live: exact cofactor commands, queries and ids, and how to pick varied cases.',\n },\n {\n heading: 'Labeling',\n prompt:\n 'Say how the expected value is decided and what must corroborate it; never the agent\\'s own output alone.',\n },\n {\n heading: 'Sanitizing',\n prompt:\n 'Say what to strip or replace before upload, the check to run, and the neutral names to use (Acme, example.com).',\n },\n {\n heading: 'Synthesizing scenarios',\n prompt:\n 'Say how to make a case when no real one exists (mutate a frozen input) and how to mark it synthetic in --source.',\n },\n {\n heading: 'Adding the case',\n prompt: 'Give the exact eval add-case command shape for this eval.',\n },\n { heading: 'Known traps', prompt: 'Record what has gone wrong before.' },\n];\n\n/** Headings whose section must not be empty: real data and sanitizing are what keep customer data out of cases. */\nconst REQUIRED_SECTIONS = ['Finding real data', 'Sanitizing'];\n\nexport const EVAL_GITIGNORE = '*.tar.gz\\n_staging/\\n';\n\nexport function initRunbook(name: string): string {\n return [\n `# ${name} runbook`,\n '',\n ...RUNBOOK_SECTIONS.flatMap(({ heading, prompt }) => [`## ${heading}`, '', RUNBOOK_TODO_MARKER, `<!-- ${prompt} -->`, '']),\n ].join('\\n');\n}\n\nexport function initTemplate(opts: {\n name: string;\n application?: string;\n capability?: string;\n}): string {\n const capability = opts.capability ?? 'CAP-REPLACE-ME';\n const application = opts.application ?? '<application>';\n return `# Agent eval: ${opts.name}\n# Push it with:\n# cofactor eval push evals/${opts.name}.eval.yaml --application ${application} --org <org>\n# Add cases with:\n# cofactor eval add-case ${opts.name} --key <key> --input <dir> --expected <file> --source \"<provenance>\" --org <org>\n# Run it with:\n# cofactor eval run ${opts.name} --org <org>\nversion: 1\nname: ${opts.name}\ndescription: Replace with one sentence on what this agent must get right.\n\n# Capabilities in the application's product map that this eval proves (CAP- codes).\nproves:\n capabilities:\n - ${capability}\n\n# Runbook for whoever adds cases; path relative to this file. Stored with the eval.\nrunbook: ${opts.name}.runbook.md\n\n# single-turn: \\`run\\` is executed once per attempt. multi-turn: \\`run\\` is the agent process,\n# speaking JSONL on stdin/stdout, and a \\`simulator\\` model is required (cases then need a conversation).\nmode: single-turn\n\n# Shell command run at the repository root of the evaluated commit. It reads its case from\n# $EVAL_INPUT and writes its answer to $EVAL_OUTPUT/answer.* (answer.json, answer.txt, ...).\n# Model calls go to the injected base URL (agent.providers below); never use a real key.\nrun: ./scripts/run-agent.sh\n\ninput:\n description: What the files in a case's input directory contain.\n # Paths every case bundle must contain (files or directories); checked before upload.\n require:\n - input.json\n\nagent:\n models:\n # alias: provider (anthropic | azure) and model id. Aliases are what --model takes.\n sonnet:\n provider: anthropic\n model: claude-sonnet-4-6\n default: sonnet\n # Each attempt sets the selected provider's key (a proxy token), base URL (the metering proxy) and\n # model id, under these standard names unless an entry below maps them:\n # anthropic: ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL\n # azure: OPENAI_API_KEY, AZURE_OPENAI_API_KEY, OPENAI_BASE_URL, AZURE_OPENAI_BASE_URL, OPENAI_MODEL\n # Only if the agent reads other names (upper case, never EVAL_*; an entry replaces all of that provider's\n # standard names), copy them from where its code builds the model client, e.g.\n # createAnthropic({ apiKey: process.env.AGENT_CLAUDE_KEY, baseURL: process.env.AGENT_CLAUDE_URL }):\n # providers:\n # anthropic:\n # env: { apiKey: AGENT_CLAUDE_KEY, baseUrl: AGENT_CLAUDE_URL, model: AGENT_CLAUDE_MODEL }\n\ngraders:\n # A script grader runs after the agent exits with EVAL_INPUT, EVAL_OUTPUT and EVAL_EXPECTED\n # (the case's expected value as a JSON file). Its last stdout line is\n # {\"pass\": true, \"score\": 1, \"reason\": \"why\"}. Anything else is a grader error.\n - id: answer-matches-expected\n kind: script\n command: ./scripts/grade-answer.sh\n\n # An ai-judge scores a rubric against the answer and the case's expected value.\n # The judge model is pinned. scale is binary or 1-5; a 1-5 scale requires passAt.\n - id: answer-quality\n kind: ai-judge\n rubric: The answer states the same root cause as the expected value and cites evidence from the input.\n scale: 1-5\n passAt: 4\n judge:\n provider: anthropic\n model: claude-opus-4-8\n\n# Each case runs \\`repeats\\` times and passes when at least \\`passAtLeast\\` attempts pass.\nrepeats: 3\npassAtLeast: 2\n\n# The eval passes when this share of cases pass.\npassBar: 0.5\n\n# Time limit per attempt, in seconds (30 to 1700).\nattemptSeconds: 600\n`;\n}\n\n/** Zod issues as one readable line each: `graders.1.passAt: A 1-5 judge requires passAt`. */\nexport function formatIssues(error: ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.map(String).join('.');\n return `${path || '(template)'}: ${issue.message}`;\n });\n}\n\nexport class TemplateError extends Error {\n constructor(heading: string, lines: string[]) {\n super(`${heading}\\n${lines.map((line) => ` ${line}`).join('\\n')}`);\n }\n}\n\nexport type PushPayload = {\n definition: AgentEvalTemplate;\n runbook: string;\n warnings: string[];\n};\n\nfunction sectionBodies(runbook: string): Map<string, string> {\n const sections = new Map<string, string>();\n let current: string | null = null;\n for (const line of runbook.split(/\\r?\\n/)) {\n const heading = line.match(/^##\\s+(.+?)\\s*$/);\n if (heading) {\n current = heading[1]!;\n sections.set(current, '');\n } else if (current !== null) {\n sections.set(current, `${sections.get(current)}${line}\\n`);\n }\n }\n return sections;\n}\n\n/** Missing headings are warnings; an empty required section or a section still holding the todo marker is an error. */\nexport function checkRunbook(runbook: string): { errors: string[]; warnings: string[] } {\n const sections = sectionBodies(runbook);\n const errors: string[] = [];\n const warnings: string[] = [];\n const todo = [...sections].filter(([, body]) => body.split('\\n').some((line) => line.trim() === RUNBOOK_TODO_MARKER));\n if (todo.length) {\n errors.push(\n `Runbook still has ${RUNBOOK_TODO_MARKER} in: ${todo.map(([heading]) => `\"## ${heading}\"`).join(', ')}. Write each section, then delete its marker line.`\n );\n }\n for (const { heading } of RUNBOOK_SECTIONS) {\n const body = sections.get(heading);\n const empty = body === undefined || body.replace(/<!--[\\s\\S]*?-->/g, '').trim() === '';\n if (body === undefined) warnings.push(`Runbook has no \"## ${heading}\" section.`);\n if (REQUIRED_SECTIONS.includes(heading) && empty) {\n errors.push(`Runbook section \"## ${heading}\" is empty; write it before pushing.`);\n }\n }\n return { errors, warnings };\n}\n\n/** Parse and validate a template file and read its runbook, relative to the YAML. */\nexport async function readPushPayload(file: string): Promise<PushPayload> {\n let source: string;\n try {\n source = await readFile(file, 'utf8');\n } catch {\n throw new Error(`Cannot read ${file}.`);\n }\n let raw: unknown;\n try {\n raw = parse(source);\n } catch (error) {\n throw new Error(`${file} is not valid YAML: ${error instanceof Error ? error.message : String(error)}`);\n }\n const parsed = AgentEvalTemplateSchema.safeParse(raw);\n if (!parsed.success) throw new TemplateError(`${file} is not a valid eval template:`, formatIssues(parsed.error));\n const runbookPath = resolve(dirname(file), parsed.data.runbook);\n const inside = relative(dirname(resolve(file)), runbookPath);\n if (isAbsolute(parsed.data.runbook) || inside === '..' || inside.startsWith(`..${sep}`) || isAbsolute(inside))\n throw new Error(`The template's runbook (${parsed.data.runbook}) must be a path inside the template's directory.`);\n let runbook: string;\n try {\n runbook = await readFile(runbookPath, 'utf8');\n } catch {\n throw new Error(`Cannot read the runbook ${runbookPath} (the template's runbook: ${parsed.data.runbook}).`);\n }\n const { errors, warnings } = checkRunbook(runbook);\n if (errors.length) throw new TemplateError(`${runbookPath} cannot be pushed:`, errors);\n return { definition: parsed.data, runbook, warnings };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,OAAO,YAAAA,WAAU,WAAAC,UAAS,iBAAiB;AACpD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACErB,SAAS,SAAS;AAEX,IAAM,8BAA8B,MAAM,QAAQ;AAClD,IAAM,oCAAoC,IAAI,QAAQ;AAE7D,IAAM,cAAc,EAAE,aAAa;AAAA,EACjC,UAAU,EAAE,KAAK,CAAC,aAAa,OAAO,CAAC;AAAA,EACvC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AACzB,CAAC;AAGD,IAAM,UAAU,EACb,OAAO,EACP,MAAM,sBAAsB,iDAAiD,EAC7E,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,OAAO,GAAG,sDAAsD;AAMrG,IAAM,oBAAoB,EAAE,aAAa;AAAA,EACvC,KAAK,EACF,aAAa;AAAA,IACZ,QAAQ;AAAA;AAAA,IACR,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,EACT,CAAC,EACA,OAAO,CAAC,QAAQ,IAAI,IAAI,OAAO,OAAO,GAAG,CAAC,EAAE,SAAS,GAAG,mDAAmD;AAChH,CAAC;AAED,IAAM,eAAe,EAAE,aAAa;AAAA,EAClC,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc;AAAA,EACnC,MAAM,EAAE,QAAQ,QAAQ;AAAA,EACxB,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,CAAC;AACD,IAAM,cAAc,EAAE,aAAa;AAAA,EACjC,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc;AAAA,EACnC,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC1B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;AAAA,EACzB,OAAO,EAAE,KAAK,CAAC,UAAU,KAAK,CAAC;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAChD,OAAO;AACT,CAAC;AAEM,IAAM,0BAA0B,EACpC,aAAa;AAAA,EACZ,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,MAAM,EACH,OAAO,EACP,MAAM,mBAAmB,EACzB,OAAO,CAAC,MAAM,MAAM,UAAU,MAAM,SAAS;AAAA;AAAA,EAChD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA;AAAA,EAClF,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,EACzB,MAAM,EAAE,KAAK,CAAC,eAAe,YAAY,CAAC,EAAE,QAAQ,aAAa;AAAA,EACjE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,EACrB,WAAW,YAAY,SAAS;AAAA;AAAA,EAChC,OAAO,EAAE,aAAa;AAAA,IACpB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,CAAC;AAAA,EACD,OAAO,EAAE,aAAa;AAAA,IACpB,QAAQ,EACL,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,GAAG,WAAW,EACpD,OAAO,CAAC,MAAM,OAAO,KAAK,CAAC,EAAE,UAAU,CAAC;AAAA,IAC3C,SAAS,EAAE,OAAO;AAAA;AAAA,IAClB,WAAW,EACR,aAAa,EAAE,WAAW,kBAAkB,SAAS,GAAG,OAAO,kBAAkB,SAAS,EAAE,CAAC,EAC7F,SAAS;AAAA;AAAA,EACd,CAAC;AAAA,EACD,SAAS,EAAE,MAAM,EAAE,mBAAmB,QAAQ,CAAC,cAAc,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACjF,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACjD,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAC9C,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC;AAAA;AAAA,EAClC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AAAA;AACnD,CAAC,EACA,YAAY,CAAC,UAAU,QAAQ;AAC9B,MAAI,CAAC,OAAO,OAAO,SAAS,MAAM,QAAQ,SAAS,MAAM,OAAO,GAAG;AACjE,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,SAAS,SAAS;AAAA,MACzB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,OAAO,IAAI,IAAY,OAAO,OAAO,SAAS,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AACxF,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,aAAa,CAAC,CAAC,GAAG;AAC9E,QAAI,SAAS,CAAC,KAAK,IAAI,QAAQ,GAAG;AAChC,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,SAAS,aAAa,QAAQ;AAAA,QACrC,SAAS,gCAAgC,QAAQ;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,SAAS,cAAc,SAAS,SAAS;AAC3C,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,aAAa;AAAA,MACpB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,MAAM,oBAAI,IAAY;AAC5B,WAAS,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AAC1C,QAAI,IAAI,IAAI,OAAO,EAAE,GAAG;AACtB,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,OAAO,IAAI;AAAA,QAC7B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,IAAI,OAAO,EAAE;AACjB,QAAI,OAAO,SAAS,cAAc,OAAO,UAAU,SAAS,OAAO,WAAW,QAAW;AACvF,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,OAAO,QAAQ;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACD,MAAK,SAAS,SAAS,kBAAmB,SAAS,cAAc,SAAY;AAC3E,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,WAAW;AAAA,MAClB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF,CAAC;AAII,IAAM,yBAAyB,EAAE,mBAAmB,QAAQ;AAAA,EACjE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,UAAU,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EACxF,EAAE,aAAa;AAAA,IACb,MAAM,EAAE,QAAQ,WAAW;AAAA,IAC3B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IACzB,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC1B,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC1C,CAAC;AACH,CAAC;;;ACzID,SAAS,kBAAkB;AAC3B,SAAS,OAAO,SAAS,gBAAgB;AACzC,SAAS,YAAY;AACrB,SAAS,YAAY,gBAAgB;AAGrC,IAAM,QAAQ;AAGd,IAAM,gBAAgB;AACtB,IAAM,qBAAqB,IAAI;AAW/B,IAAM,YAAY,CAAC,SAAyB,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAE1F,SAAS,MAAM,OAAe,OAAuB;AACnD,SAAO,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,QAAQ,GAAG,GAAG,CAAC;AACtD;AAGA,SAAS,UAAU,MAAgD;AACjE,MAAI,OAAO,WAAW,IAAI,KAAK,IAAK,QAAO,EAAE,QAAQ,IAAI,MAAM,KAAK;AACpE,WAAS,IAAI,KAAK,QAAQ,GAAG,GAAG,MAAM,IAAI,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,GAAG;AACtE,UAAM,SAAS,KAAK,MAAM,GAAG,CAAC;AAC9B,UAAM,OAAO,KAAK,MAAM,IAAI,CAAC;AAC7B,QAAI,OAAO,WAAW,MAAM,KAAK,OAAO,OAAO,WAAW,IAAI,KAAK,IAAK,QAAO,EAAE,QAAQ,KAAK;AAAA,EAChG;AACA,QAAM,IAAI,MAAM,oDAAoD,IAAI,EAAE;AAC5E;AAEA,SAAS,OAAO,MAAc,MAAc,MAAiB,MAAsB;AACjF,QAAM,EAAE,QAAQ,KAAK,IAAI,UAAU,IAAI;AACvC,QAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,QAAM,MAAM,MAAM,GAAG,MAAM;AAC3B,QAAM,MAAM,MAAM,MAAM,CAAC,GAAG,KAAK,OAAO;AACxC,QAAM,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,OAAO;AACrC,QAAM,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,OAAO;AACrC,QAAM,MAAM,MAAM,MAAM,EAAE,GAAG,KAAK,OAAO;AACzC,QAAM,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,OAAO;AACtC,QAAM,KAAK,IAAM,KAAK,GAAG;AACzB,QAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,QAAM,MAAM,WAAW,KAAK,OAAO;AACnC,QAAM,MAAM,MAAM,KAAK,OAAO;AAE9B,QAAM,MAAM,QAAQ,KAAK,MAAM;AAC/B,QAAM,WAAW,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,MAAM,CAAC;AAC1D,QAAM,MAAM,GAAG,SAAS,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,OAAO,KAAK,OAAO;AACvE,SAAO;AACT;AAKA,eAAe,KAAK,MAAc,OAAO,IAAI,UAAU,IAAsB;AAC3E,QAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,IAAI,GACxD,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,SAAS,KAAK,UAAU,KAAK,EAAE,EAAE,EAC9D,KAAK,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,KAAK,EAAE,OAAO,GAAG,OAAO,KAAK,EAAE,OAAO,CAAC,CAAC;AAChF,QAAM,UAAmB,CAAC;AAC1B,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK;AACtD,UAAM,OAAO,UAAU,GAAG,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK;AAC3D,UAAM,WAAW,KAAK,MAAM,QAAQ;AACpC,UAAM,QAAQ,MAAM,MAAM,QAAQ;AAClC,QAAI,MAAM,YAAY,GAAG;AACvB,cAAQ,KAAK,EAAE,MAAM,UAAU,WAAW,MAAM,MAAM,KAAO,MAAM,EAAE,CAAC;AACtE,cAAQ,KAAK,GAAI,MAAM,KAAK,MAAM,UAAU,IAAI,CAAE;AAAA,IACpD,WAAW,MAAM,OAAO,GAAG;AACzB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,MAAM,MAAM,OAAO,KAAQ,MAAQ;AAAA,QACnC,MAAM,MAAM;AAAA,MACd,CAAC;AAAA,IACH,OAAO;AACL,YAAM,IAAI;AAAA,QACR,iBAAiB,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,aAAa,MAA+B;AAChE,QAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,QAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,MAAM,CAAC;AAChE,MAAI,QAAQ,eAAe;AACzB,UAAM,IAAI,MAAM,6BAA6B,KAAK,mCAAmC,aAAa,aAAa;AAAA,EACjH;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,OAAO,GAAG,MAAM,IAAI,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC;AACvD;AAAA,IACF;AACA,UAAM,UAAU,MAAM,SAAS,MAAM,QAAQ;AAC7C,UAAM,KAAK,OAAO,MAAM,MAAM,QAAQ,QAAQ,KAAK,MAAM,IAAI,GAAG,OAAO;AACvE,UAAM,WAAW,QAAS,QAAQ,SAAS,SAAU;AACrD,QAAI,QAAS,OAAM,KAAK,OAAO,MAAM,OAAO,CAAC;AAAA,EAC/C;AACA,QAAM,KAAK,OAAO,MAAM,QAAQ,CAAC,CAAC;AAClC,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEA,SAAS,WAAW,OAAe,OAAe,QAAwB;AACxE,QAAM,QAAQ,MAAM,SAAS,OAAO,QAAQ,MAAM;AAClD,QAAM,MAAM,MAAM,QAAQ,CAAC;AAC3B,SAAO,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,GAAG,EAAE,SAAS,MAAM;AACrE;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,YAAY,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACxD;AAGO,SAAS,eAAe,KAAuB;AACpD,QAAM,UAAoB,CAAC;AAC3B,MAAI,WAA0B;AAC9B,MAAI,SAAS;AACb,SAAO,SAAS,SAAS,IAAI,QAAQ;AACnC,UAAM,QAAQ,IAAI,SAAS,QAAQ,SAAS,KAAK;AACjD,QAAI,MAAM,MAAM,CAAC,SAAS,SAAS,CAAC,EAAG;AACvC,UAAM,SAAS,OAAO,SAAS,WAAW,OAAO,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC;AAClE,UAAM,SAAS,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,OAAO,KAAK,OAAO,IAAI,MAAM,KAAO,OAAO,CAAC;AAC1F,QAAI,WAAW,OAAQ,OAAM,IAAI,MAAM,+CAA+C;AACtF,UAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,EAAE,EAAE,KAAK,KAAK,KAAK,CAAC;AACxE,UAAM,OAAO,OAAO,aAAa,MAAM,GAAG,KAAK,EAAI;AACnD,UAAM,OAAO,IAAI,SAAS,SAAS,OAAO,SAAS,QAAQ,IAAI;AAC/D,cAAU,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI;AAC5C,QAAI,SAAS,KAAK;AAChB,iBAAW,WAAW,MAAM,GAAG,KAAK,MAAM;AAC1C;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,YAAM,SAAS,KAAK,SAAS,MAAM,EAAE,MAAM,qBAAqB;AAChE,UAAI,SAAS,CAAC,EAAG,YAAW,OAAO,CAAC;AACpC;AAAA,IACF;AACA,QAAI,SAAS,IAAK;AAClB,UAAM,SAAS,WAAW,OAAO,KAAK,GAAG;AACzC,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI;AACzC,YAAM,IAAI,MAAM,6CAA6C,WAAW,OAAO,GAAG,GAAG,CAAC,6CAA6C;AACrI,UAAM,OAAO,aAAa,SAAS,GAAG,MAAM,IAAI,WAAW,OAAO,GAAG,GAAG,CAAC,KAAK,WAAW,OAAO,GAAG,GAAG;AACtG,eAAW;AACX,YAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAGA,eAAsB,WAAW,OAAsC;AACrE,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,MAAM,KAAK;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,MAAM,WAAW,KAAK,kBAAkB;AAAA,EACpD;AACA,MAAI;AACJ,MAAI,MAAM,YAAY,GAAG;AACvB,UAAM,MAAM,aAAa,KAAK;AAAA,EAChC,WAAW,MAAM,OAAO,KAAK,mBAAmB,KAAK,KAAK,GAAG;AAC3D,QAAI,MAAM,OAAO;AACf,YAAM,IAAI,MAAM,GAAG,KAAK,OAAO,MAAM,IAAI,kCAAkC,2BAA2B,aAAa;AACrH,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACF,YAAM,WAAW,MAAM,EAAE,iBAAiB,mBAAmB,CAAC;AAAA,IAChE,QAAQ;AACN,YAAM,IAAI,MAAM,WAAW,KAAK,sDAAsD,kBAAkB,SAAS;AAAA,IACnH;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAGA,QAAM,UAAU,SAAS,KAAK,EAAE,OAAO,EAAE,CAAC;AAC1C,MAAI;AACJ,MAAI;AACF,cAAU,eAAe,GAAG;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,WAAW,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,GAAG;AAAA,EAChG;AACA,SAAO;AAAA,IACL,QAAQ,UAAU,GAAG;AAAA,IACrB,YAAY,UAAU,OAAO;AAAA,IAC7B,OAAO,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,qBAAqB,SAAmBC,WAA8B;AACpF,SAAOA,UAAS,OAAO,CAAC,SAAS;AAC/B,UAAM,SAAS,UAAU,IAAI;AAC7B,WAAO,CAAC,QAAQ,KAAK,CAAC,UAAU,UAAU,UAAU,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC;AAAA,EACpF,CAAC;AACH;;;ACpNA,SAAS,cAAc,aAAa;;;ACOpC,IAAM,OAAO,CAAC,UAAkB,MAAM,WAAW,KAAK,KAAK,EAAE,QAAQ,UAAU,GAAG;AAClF,IAAM,UAAU,CAAC,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC7D,IAAM,QAAQ,CAAC,OAAsB,aAAa,UAChD,UAAU,OAAO,aAAa,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG,aAAa,MAAM,EAAE;AACpF,IAAM,UAAU,CAAC,QAAgB,KAAK,KAAQ,QAAQ,CAAC;AACvD,IAAM,aAAa,CAAC,MAClB,KAAK,MAAO,IAAI,IAAI,KAAM,QAAQ,KAAK,MAAU,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,MAAM,CAAC,CAAC;AAC/E,IAAM,YAAY,CAAC,WACjB,GAAG,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,OAAO,MAAM,CAAC;AAErD,IAAM,iBAAiB,CAAC,WAAgD;AAC7E,QAAM,QAAQ,OAAO;AACrB,QAAM,OAAO,CAAC,QACZ,MAAM,SAAS,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,iBAAiB,GAAG,GAAG,CAAC,IAAI,MAAM,SAAS;AACzF,SAAO;AAAA,IACL,OAAO,KAAK,OAAO;AAAA,IACnB,QAAQ,KAAK,QAAQ;AAAA,IACrB,WAAW,KAAK,WAAW;AAAA,IAC3B,eAAe,KAAK,eAAe;AAAA,EACrC;AACF;AACA,IAAM,UAAU,CAAC,OAA2B,EAAE,WAAW,EAAE,QAAQ,YAAY;AAExE,SAAS,mBAAmB,QAAoC;AACrE,QAAM,IAAI,OAAO;AACjB,QAAM,aAAa,eAAe,MAAM;AACxC,QAAM,UAAU,OAAO,SAAS,SAC5B,cAAc,OAAO,SAAS,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,MAClD;AAEJ,QAAM,YAAY,EAAE,YAAY;AAChC,QAAM,iBAAiB,CAAC,MAA2B;AACjD,UAAM,UAAU,EAAE,SAAS,QAAQ,CAAC,MAAO,EAAE,UAAU,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,CAAE;AACzF,WAAO,QAAQ,UAAU,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,QAAQ,QAAQ,QAAQ,CAAC,IAAI;AAAA,EAC7F;AACA,QAAM,QAAQ;AAAA,IACZ,WAAW,KAAK,OAAO,IAAI,CAAC,KAAK,QAAQ,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,KAAK,eAAe,QAAQ,OAAO,OAAO,CAAC,YAAO,KAAK,OAAO,MAAM,KAAK,CAAC,KAAK,KAAK,OAAO,MAAM,EAAE,CAAC,OAAO,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,OAAO,WAAW,OAAO;AAAA,IACjP;AAAA,IACA,wCAAwC,YAAY,aAAa,EAAE;AAAA,IACnE,oBAAoB,YAAY,SAAS,EAAE;AAAA,IAC3C,GAAG,OAAO,MAAM;AAAA,MACd,CAAC,MACC,KAAK,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,SAAS,MAAM,MAAM,EAAE,cAAc,IAAI,EAAE,SAAS,MAAM,MAAM,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,GAAG;AAAA,QACxK,EAAE;AAAA,QACF,EAAE,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY;AAAA,MACxC,CAAC,MAAM,QAAQ,EAAE,oBAAoB,CAAC,UAAU,UAAU,EAAE,gBAAgB,CAAC;AAAA,IACjF;AAAA,IACA;AAAA,IACA,aAAa,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,MAAM,QAAQ,EAAE,iBAAiB,CAAC,UAAU,WAAW,WAAW,KAAK,CAAC,SAAS,WAAW,WAAW,MAAM,CAAC,gBAAgB,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,QAAQ,cAAc,KAAK,MAAM,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,CAAC,IAAI,GAAM,CAAC;AAAA,EACxW;AACA,QAAM,SAAS;AAAA,IACb,GAAG,IAAI;AAAA,MACL,OAAO,MACJ,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,EAClD,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EACnC,IAAI,CAAC,MAAM,EAAE,UAAU;AAAA,IAC5B;AAAA,EACF;AACA,QAAM;AAAA,IACJ,UAAU,OAAO,SAAS,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,cAAc,EAAE,MAAM,KAAK,WAAW,MAAM,EAAE,MAAM,SAAS,CAAC;AAAA,EACrJ;AACA,MAAI,EAAE,SAAS;AACb,UAAM,SAAS;AAAA,MACb,GAAG,IAAI;AAAA,QACL,OAAO,MAAM;AAAA,UAAQ,CAAC,MACpB,EAAE,SAAS,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,UAAU,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,QACxG;AAAA,MACF;AAAA,IACF;AACA,UAAM;AAAA,MACJ,aAAa,OAAO,SAAS,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,cAAc,EAAE,QAAQ,KAAK,WAAW,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,IACrI;AAAA,EACF;AACA,QAAM,WAAW,OAAO,MAAM;AAAA,IAAQ,CAAC,MACrC,EAAE,SAAS,QAAQ,CAAC,MAAM;AAAA,MACxB,GAAG,EAAE,OACF,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EACrB,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,EAAE;AAAA,MAChF,GAAI,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IACzF,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,CAAC,EAAE,IAC/C,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,QAAM,KAAK,kBAAkB,SAAS,SAAS,SAAS,KAAK,IAAI,IAAI,MAAM,GAAG;AAC9E,MAAI,OAAO,MAAO,OAAM,KAAK,UAAU,KAAK,OAAO,KAAK,CAAC,GAAG;AAC5D,MAAI,EAAE,gBAAiB,OAAM,KAAK,8DAA8D;AAChG,QAAM;AAAA,IACJ,aAAa,OAAO,SAAS,SAAS,OAAO,SAAS,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,UAAU,OAAO,EAAE;AAAA,EACxG;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEO,SAAS,uBAAuB,QAAwC;AAC7E,QAAM,QAAQ;AAAA,IACZ,oBAAoB,KAAK,OAAO,IAAI,CAAC,MAAM,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,UAAU,WAAW,OAAO,OAAO,MAAM,EAAE;AAAA,IACzH;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,KAAK;AAAA,MACb,CAAC,MACC,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,KAAK,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,QAAQ,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,QAAQ,UAAU,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,QAAQ,kBAAkB,EAAE,QAAQ,kBAAkB,CAAC,CAAC,MAAM,QAAQ,EAAE,QAAQ,iBAAiB,CAAC,UAAU,UAAU,eAAe,CAAC,CAAC,CAAC;AAAA,IAC7R;AAAA,IACA;AAAA,IACA,YAAY,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA,IACnE,QAAQ,OAAO,KAAK,IAAI,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAC9C,GAAG,OAAO,MAAM;AAAA,MACd,CAAC,MACC,KAAK,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OACrB;AAAA,QACC,CAAC,EAAE,QAAQ,EAAE,MACX,GAAG,EAAE,cAAc,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE,SAAS,SAAS,MAAM,IAAI;AAAA,UACxE,EAAE;AAAA,UACF,EAAE,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY;AAAA,QACxC,CAAC,IAAI,QAAQ,EAAE,oBAAoB,CAAC;AAAA,MACxC,EACC,KAAK,KAAK,CAAC;AAAA,IAClB;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS;AACb,YAAM,KAAK,aAAa,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AACvF,MAAI,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,QAAQ,kBAAkB,CAAC;AACvD,UAAM,KAAK,8DAA8D;AAC3E,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;;;AD9FO,IAAM,eAAe,EAAE,YAAY,IAAK;AAE/C,IAAM,UAAU,MAAM,KAAK,KAAK;AAChC,IAAM,yBAAyB;AAC/B,IAAM,WAAwB,CAAC,aAAa,UAAU,WAAW;AAEjE,SAAS,QAAQ,MAAgB,MAAkC;AACjE,QAAM,QAAQ,kBAAkB,MAAM,IAAI;AAC1C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,GAAG,IAAI,0BAA0B;AAC3E,SAAO,OAAO,KAAK;AACrB;AAEA,IAAM,UAAU,CAAC,IAAY,aAAa,UACxC,GAAG,KAAK,SAAS,mBAAmB,EAAE,CAAC,GAAG,aAAa,kBAAkB,EAAE;AAE7E,IAAM,cAAc,CAAC,QACnB,GAAG,IAAI,EAAE,KAAK,IAAI,UAAU,KAAK,IAAI,MAAM,GAAG,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK,EAAE;AAEzH,IAAM,OAAO,CAAC,SAAoB,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,SAAS,IAAI,SAAS,OAAO,IAAI,MAAM;AAG3G,SAAS,YAAY,MAAyD;AAC5E,MAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,EAAG,QAAO;AAC3D,SAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY,MAAM,IAAI,IAAI;AAC1D;AAOA,eAAe,YACb,QACA,OACA,UACA,SACsB;AACtB,QAAM,MAAM,SAAS,QAAQ,OAAO,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC;AACvE,MAAI,YAAY;AAChB,QAAM,MAAM,OAAU,SAAoC;AACxD,UAAM,QAAQ,MAAM,gBAAmB,QAAQ,OAAO,IAAI;AAC1D,QAAI,UAAU,OAAO;AACnB,kBAAY;AACZ,aAAO,MAAM;AAAA,IACf;AACA,QAAI,EAAE,aAAa;AACjB,YAAM,IAAI,MAAM,mBAAmB,SAAS,kBAAkB,MAAM,SAAS,sBAAsB,GAAG,GAAG;AAC3G,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS;AACP,QAAI,KAAK,IAAI,KAAK;AAChB,YAAM,IAAI,MAAM,iFAAiF,GAAG,GAAG;AACzG,UAAM,OAAO,MAAM,IAA6B,GAAG,KAAK,IAAI,mBAAmB,QAAQ,CAAC,iBAAiB;AACzG,QAAI,MAAM;AACR,YAAM,WAAW,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC;AAEzE,YAAM,QAAQ,MAAM,QAAQ;AAAA,QAC1B,QAAQ,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,EAAE,MAAM,MAAM,IAAe,QAAQ,EAAE,CAAC,IAAI,MAAM;AAAA,MAClG;AACA,UAAI,MAAM,MAAM,CAAC,WAAW,WAAW,UAAa,SAAS,SAAS,MAAM,CAAC,EAAG;AAAA,IAClF;AACA,UAAM,MAAM,aAAa,UAAU;AAAA,EACrC;AACA,QAAM,UAAuB,CAAC;AAC9B,aAAW,MAAM,QAAQ,QAAQ;AAC/B,QAAI,SAA2B;AAC/B,WAAO,EAAE,SAAS,MAAM,IAAe,QAAQ,EAAE,CAAC,GAAI,OAAM,MAAM,aAAa,UAAU;AACzF,YAAQ,KAAK,MAAM;AAAA,EACrB;AACA,SAAO;AACT;AAEA,eAAsB,QAAQ,MAAgB,MAAc,QAAgB,OAAgC;AAC1G,QAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,QAAM,SAAS,aAAa,MAAM,SAAS;AAC3C,QAAM,QAAQ,aAAa,MAAM,QAAQ;AACzC,QAAM,KAAK,kBAAkB,MAAM,MAAM;AACzC,QAAM,cAAc,kBAAkB,MAAM,eAAe;AAC3D,QAAM,UAAU,QAAQ,MAAM,WAAW;AACzC,QAAM,WAAW,QAAQ,MAAM,YAAY;AAC3C,QAAM,aAAa,MAAM,QAAQ,QAAQ,OAAO,IAAI;AACpD,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,KAAK,IAAI,mBAAmB,WAAW,EAAE,CAAC;AAAA,IAC7C;AAAA,MACE,GAAI,OAAO,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAClC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAI,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,MACnB,GAAI,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC;AAAA,MAChC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,MAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B;AAAA,MACE,OACI,KAAK,UAAU,SAAS,MAAM,CAAC,IAC/B,iBAAiB,QAAQ,OAAO;AAAA,EAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,kFAAqF,QAAQ,OAAO;AAAA,IACxK;AACA,WAAO;AAAA,EACT;AAEA,UAAQ;AAAA,IACN,iBAAiB,QAAQ,OAAO,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC,2GAA2G,QAAQ,OAAO;AAAA,EAC/L;AACA,QAAM,UAAU,MAAM,YAAY,QAAQ,OAAO,MAAM,OAAO;AAC9D,QAAM,UAAU,QAAQ,QAAQ,CAAC,QAAS,IAAI,SAAS,CAAC,IAAI,MAAM,IAAI,CAAC,CAAE;AACzE,MAAI,MAAM;AACR,mBAAe,KAAK,UAAU,QAAQ,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EACvF,OAAO;AACL,UAAM,UACJ,QAAQ,SAAS,KAAK,QAAQ,WAAW,QAAQ,SAC7C,MAAM,QAAgC,QAAQ,OAAO,OAAO,GAAG,KAAK,kBAAkB,mBAAmB,QAAQ,OAAO,CAAC,EAAE,IAC3H;AACN,QAAI,QAAQ;AACV;AAAA,QACE,CAAC,GAAG,QAAQ,IAAI,kBAAkB,GAAG,GAAI,UAAU,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,CAAE,EAAE,KAAK,IAAI,EAAE,QAAQ;AAAA,MACjH;AACF,eAAW,OAAO,QAAQ,OAAO,CAACC,SAAQ,CAACA,KAAI,UAAUA,KAAI,WAAW,WAAW,EAAG,SAAQ,MAAM,YAAY,GAAG,CAAC;AAAA,EACtH;AACA,SAAO,YAAY,OAAO;AAC5B;AAEA,eAAsB,OAAO,MAAgBC,SAAgB,QAAgB,OAA8B;AACzG,QAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,QAAM,UAAU,kBAAkB,MAAM,QAAQ;AAChD,QAAM,aAAa,QAAQ,MAAM,cAAc;AAC/C,MAAI,cAAc,CAAC,QAAS,OAAM,IAAI,MAAM,+FAA+F;AAC3I,QAAM,MAAM,MAAM,QAAmB,QAAQ,OAAO,OAAO,QAAQA,SAAQ,UAAU,CAAC;AACtF,MAAI,CAAC,IAAI,QAAQ;AACf,mBAAe,OAAO,KAAK,UAAU,KAAK,GAAG,GAAG,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC;AAC3E;AAAA,EACF;AACA,QAAM,SAA6B;AAAA,IACjC,GAAG,IAAI;AAAA,IACP,OAAO,IAAI,OAAO,MACf,OAAO,CAAC,MAAM,YAAY,UAAa,EAAE,QAAQ,OAAO,EACxD,IAAI,CAAC,OAAO;AAAA,MACX,GAAG;AAAA,MACH,UAAU,EAAE,SAAS,IAAI,CAAC,aAAa;AAAA,QACrC,GAAG;AAAA,QACH,YAAY,aACP,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,QAAQ,EAAE,OAAO,EAAE,iBAAiB,QAAQ,KAAK,GAAG,cAAc,QAAQ,aAC3G,QAAQ;AAAA,MACd,EAAE;AAAA,IACJ,EAAE;AAAA,EACN;AACA,MAAI,WAAW,OAAO,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,OAAOA,OAAM,iBAAiB,OAAO,IAAI;AACnG,MAAI,MAAM;AACR,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,mBAAmB,MAAM,EAAE,QAAQ,CAAC;AACnD,MAAI,YAAY;AACd,eAAW,WAAW,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC7D,YAAM,KAAK,IAAI,uBAAuB,QAAQ,KAAK,GAAG;AACtD,YAAM;AAAA,QACJ,GAAI,QAAQ,YAAY,SACpB,QAAQ,WAAW,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAChE,CAAC,iEAAiE;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACA,iBAAe,MAAM,KAAK,IAAI,CAAC;AACjC;AAEA,eAAsB,SAAS,MAAgB,MAAc,QAAgB,OAA8B;AACzG,QAAM,QAAQ,QAAQ,MAAM,SAAS;AACrC,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,KAAK,IAAI,mBAAmB,IAAI,CAAC,QAAQ,UAAU,SAAY,UAAU,KAAK,KAAK,EAAE;AAAA,EAC1F;AACA;AAAA,IACE,QAAQ,MAAM,QAAQ,IAClB,KAAK,UAAU,MAAM,MAAM,CAAC,IAC5B,KAAK,MACF,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,IAAI,UAAU,KAAK,IAAI,MAAM,KAAK,IAAI,WAAW,GAAG,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,OAAO,EAAE,EACrI,KAAK,IAAI,KAAK;AAAA,EACvB;AACF;AAEA,eAAsB,YAAY,MAAgB,KAAe,QAAgB,OAA8B;AAC7G,QAAM,QAAQ,kBAAkB,MAAM,SAAS;AAC/C,MAAI,QAAQ,KAAK,MAAO,IAAI,SAAS,EAAI,OAAM,IAAI,MAAM,iDAAiD;AAC1G,QAAM,QAAQ,QAAQ,SAAS,mBAAmB,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,kBAAkB,EAAE,KAAK,GAAG,CAAC;AAC1G,QAAM,aAAa,MAAM,QAAgC,QAAQ,OAAO,OAAO,GAAG,KAAK,YAAY,KAAK,EAAE;AAC1G;AAAA,IACE,QAAQ,MAAM,QAAQ,IAAI,KAAK,UAAU,WAAW,MAAM,MAAM,CAAC,IAAI,uBAAuB,UAAU,EAAE,QAAQ;AAAA,EAClH;AACF;;;AExOA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,SAAS,YAAY,UAAU,SAAS,WAAW;AAC5D,SAAS,aAAa;AAQf,IAAM,sBAAsB;AAG5B,IAAM,mBAAmE;AAAA,EAC9E;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,EAAE,SAAS,eAAe,QAAQ,qCAAqC;AACzE;AAGA,IAAM,oBAAoB,CAAC,qBAAqB,YAAY;AAErD,IAAM,iBAAiB;AAEvB,SAAS,YAAY,MAAsB;AAChD,SAAO;AAAA,IACL,KAAK,IAAI;AAAA,IACT;AAAA,IACA,GAAG,iBAAiB,QAAQ,CAAC,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,OAAO,IAAI,IAAI,qBAAqB,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAAA,EAC3H,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,aAAa,MAIlB;AACT,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,cAAc,KAAK,eAAe;AACxC,SAAO,iBAAiB,KAAK,IAAI;AAAA;AAAA,+BAEJ,KAAK,IAAI,4BAA4B,WAAW;AAAA;AAAA,6BAElD,KAAK,IAAI;AAAA;AAAA,wBAEd,KAAK,IAAI;AAAA;AAAA,QAEzB,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMT,UAAU;AAAA;AAAA;AAAA,WAGP,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgEpB;AAGO,SAAS,aAAa,OAA2B;AACtD,SAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AACjC,UAAM,OAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAC5C,WAAO,GAAG,QAAQ,YAAY,KAAK,MAAM,OAAO;AAAA,EAClD,CAAC;AACH;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB,OAAiB;AAC5C,UAAM,GAAG,OAAO;AAAA,EAAK,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACpE;AACF;AAQA,SAAS,cAAc,SAAsC;AAC3D,QAAM,WAAW,oBAAI,IAAoB;AACzC,MAAI,UAAyB;AAC7B,aAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,UAAM,UAAU,KAAK,MAAM,iBAAiB;AAC5C,QAAI,SAAS;AACX,gBAAU,QAAQ,CAAC;AACnB,eAAS,IAAI,SAAS,EAAE;AAAA,IAC1B,WAAW,YAAY,MAAM;AAC3B,eAAS,IAAI,SAAS,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI;AAAA,CAAI;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,aAAa,SAA2D;AACtF,QAAM,WAAW,cAAc,OAAO;AACtC,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,QAAM,OAAO,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,mBAAmB,CAAC;AACpH,MAAI,KAAK,QAAQ;AACf,WAAO;AAAA,MACL,qBAAqB,mBAAmB,QAAQ,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IACvG;AAAA,EACF;AACA,aAAW,EAAE,QAAQ,KAAK,kBAAkB;AAC1C,UAAM,OAAO,SAAS,IAAI,OAAO;AACjC,UAAM,QAAQ,SAAS,UAAa,KAAK,QAAQ,oBAAoB,EAAE,EAAE,KAAK,MAAM;AACpF,QAAI,SAAS,OAAW,UAAS,KAAK,sBAAsB,OAAO,YAAY;AAC/E,QAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO;AAChD,aAAO,KAAK,uBAAuB,OAAO,sCAAsC;AAAA,IAClF;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAGA,eAAsB,gBAAgB,MAAoC;AACxE,MAAI;AACJ,MAAI;AACF,aAAS,MAAMC,UAAS,MAAM,MAAM;AAAA,EACtC,QAAQ;AACN,UAAM,IAAI,MAAM,eAAe,IAAI,GAAG;AAAA,EACxC;AACA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,GAAG,IAAI,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACxG;AACA,QAAM,SAAS,wBAAwB,UAAU,GAAG;AACpD,MAAI,CAAC,OAAO,QAAS,OAAM,IAAI,cAAc,GAAG,IAAI,kCAAkC,aAAa,OAAO,KAAK,CAAC;AAChH,QAAM,cAAc,QAAQ,QAAQ,IAAI,GAAG,OAAO,KAAK,OAAO;AAC9D,QAAM,SAAS,SAAS,QAAQ,QAAQ,IAAI,CAAC,GAAG,WAAW;AAC3D,MAAI,WAAW,OAAO,KAAK,OAAO,KAAK,WAAW,QAAQ,OAAO,WAAW,KAAK,GAAG,EAAE,KAAK,WAAW,MAAM;AAC1G,UAAM,IAAI,MAAM,2BAA2B,OAAO,KAAK,OAAO,mDAAmD;AACnH,MAAI;AACJ,MAAI;AACF,cAAU,MAAMA,UAAS,aAAa,MAAM;AAAA,EAC9C,QAAQ;AACN,UAAM,IAAI,MAAM,2BAA2B,WAAW,6BAA6B,OAAO,KAAK,OAAO,IAAI;AAAA,EAC5G;AACA,QAAM,EAAE,QAAQ,SAAS,IAAI,aAAa,OAAO;AACjD,MAAI,OAAO,OAAQ,OAAM,IAAI,cAAc,GAAG,WAAW,sBAAsB,MAAM;AACrF,SAAO,EAAE,YAAY,OAAO,MAAM,SAAS,SAAS;AACtD;;;ALrNA,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YACE;AAAA,EACF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AACX;AAGA,IAAM,cAAc;AAAA,EAClB,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,cAAgD;AAAA,EACpD,MAAM;AAAA,EAAG,SAAS;AAAA,EAAG,OAAO;AAAA,EAAG,WAAW;AAAA,EAAG,YAAY;AAAA,EAAG,KAAK;AAAA,EAAG,KAAK;AAAA,EAAG,MAAM;AACpF;AACA,IAAM,SAAoB,CAAC,QAAQ,YAAY,WAAW,KAAK;AAC/D,IAAM,uBAAuB;AAE7B,SAAS,UAAU,SAAmC;AACpD,QAAM,QAAQ,OAAO,OAAO,OAAO,WAAW,EAAE,IAAI,MAAM,OAAkB,IAAI;AAChF,UAAQ;AAAA,IACN;AAAA,MACE,wBAAwB,SAAS,eAAe;AAAA,MAChD;AAAA,MACA,GAAG,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC,SAAS,mBAAmB,IAAI,EAAE;AAAA,MAC/D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,SAAS,MAAgB,MAAsB;AACtD,QAAM,QAAQ,kBAAkB,MAAM,IAAI;AAC1C,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,GAAG,IAAI,eAAe;AAClD,SAAO;AACT;AAGA,SAAS,YAAY,MAAwB;AAC3C,QAAM,IAAI,KAAK,UAAU,CAAC,QAAQ,QAAQ,gBAAgB,IAAI,WAAW,aAAa,CAAC;AACvF,QAAM,QAAQ,IAAI,IAAI,SAAY,KAAK,CAAC,EAAG,WAAW,aAAa,IAAI,KAAK,CAAC,EAAG,MAAM,cAAc,MAAM,IAAI,KAAK,IAAI,CAAC;AACxH,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,EAAG,OAAM,IAAI,MAAM,sDAAsD;AAC5G,SAAO;AACT;AAEA,eAAe,SAAS,MAAc,OAAiC;AACrE,MAAI;AACJ,MAAI;AACF,WAAO,SAAS,MAAM,MAAM,UAAU,IAAI,MAAMC,UAAS,MAAM,MAAM;AAAA,EACvE,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,eAAe,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACnG;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,GAAG,KAAK,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACzG;AACF;AAKA,SAAS,OAAO,KAAc,SAA0B;AACtD,QAAM,QAAQ,IAAI,YAAY,CAAC;AAC/B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wBAAwB,MAAM,OAAO,CAAC,EAAE;AACpE,SAAO;AACT;AAEA,eAAe,KAAK,MAA+B;AACjD,QAAM,OAAO,iBAAiB,MAAM,WAAW;AAC/C,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,wBAAwB,MAAM,IAAI,EAAE;AAC/D,MAAI,CAAC,oBAAoB,KAAK,IAAI,KAAK,SAAS,UAAU,SAAS;AACjE,UAAM,IAAI,MAAM,kGAAkG;AACpH,QAAM,aAAa,kBAAkB,MAAM,cAAc;AACzD,MAAI,eAAe,UAAa,CAAC,yBAAyB,KAAK,UAAU;AACvE,UAAM,IAAI,MAAM,8DAA8D;AAChF,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAMC,MAAK,sBAAsB,GAAG,IAAI,YAAY,GAAG,MAAM,aAAa,EAAE,MAAM,aAAa,kBAAkB,MAAM,eAAe,GAAG,WAAW,CAAC,EAAE;AAAA,IACzJ,EAAE,MAAMA,MAAK,sBAAsB,GAAG,IAAI,aAAa,GAAG,MAAM,YAAY,IAAI,EAAE;AAAA,EACpF;AACA,QAAM,YAAYA,MAAK,sBAAsB,YAAY;AACzD,QAAM,SAAS,OAAO,SAAiBD,UAAS,IAAI,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK;AAClF,aAAW,QAAQ,OAAO;AACxB,QAAI,MAAM,OAAO,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,GAAG,KAAK,IAAI,sCAAsC;AAAA,EACjG;AACA,QAAM,MAAM,sBAAsB,EAAE,WAAW,KAAK,CAAC;AACrD,QAAM,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAC7C,aAAW,QAAQ,MAAO,OAAM,UAAU,KAAK,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,CAAC;AAC9E,MAAI,CAAE,MAAM,OAAO,SAAS,GAAI;AAC9B,UAAM,UAAU,WAAW,gBAAgB,EAAE,MAAM,KAAK,CAAC;AACzD,YAAQ,KAAK,SAAS;AAAA,EACxB;AACA;AAAA,IACE,QAAQ,MAAM,QAAQ,IAClB,KAAK,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC,IACnC,GAAG,QAAQ,IAAI,CAAC,SAAS,SAAS,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,oIAAuI,MAAM,CAAC,EAAG,IAAI;AAAA,EAC/M;AACF;AAEA,eAAe,sBAAuC;AACpD,QAAM,SAAS,MAAME,SAAQ,oBAAoB,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,CAAC;AAC1G,MAAI,MAAM,WAAW;AACnB,UAAM,IAAI;AAAA,MACR,MAAM,WAAW,IACb,MAAM,oBAAoB,gDAC1B,wBAAwB,oBAAoB,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACxE;AACF,SAAOD,MAAK,sBAAsB,MAAM,CAAC,CAAE;AAC7C;AAEA,eAAe,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,GAA2B;AACzE,QAAM,OAAO,iBAAiB,MAAM,WAAW,KAAM,MAAM,oBAAoB;AAC/E,QAAM,UAAU,MAAM,gBAAgB,IAAI;AAC1C,aAAW,WAAW,QAAQ,SAAU,SAAQ,MAAM,YAAY,OAAO,EAAE;AAC3E,QAAM,gBAAgB,MAAM,qBAAqB,MAAM,QAAQ,KAAK;AACpE,QAAM,SAAS,MAAM,QAAsC,QAAQ,OAAO,OAAO,OAAO;AAAA,IACtF;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,QAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,OAAO,IAAI;AACvD,MAAI,MAAM;AACR,mBAAe,KAAK,UAAU,EAAE,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG,MAAM,CAAC,CAAC;AACjF;AAAA,EACF;AACA;AAAA,IACE;AAAA,MACE,UAAU,OAAO,IAAI,KAAK,OAAO,EAAE;AAAA,MACnC,UAAU,OAAO,MAAM,MAAM;AAAA,MAC7B,iBAAiB,OAAO,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,IAC9E,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,aAAa,QAA4B;AAChD,QAAM,IAAI,OAAO;AACjB,SAAO;AAAA,IACL,GAAG,OAAO,IAAI,KAAK,OAAO,EAAE;AAAA,IAC5B,EAAE;AAAA,IACF,gBAAgB,OAAO,aAAa;AAAA,IACpC,SAAS,EAAE,IAAI;AAAA,IACf,QAAQ,EAAE,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,IAAI,IAAI,YAAO,EAAE;AAAA,IAC/D,WAAW,OAAO,QAAQ,EAAE,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,UAAU,EAAE,MAAM,UAAU,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IACxI,YAAY,EAAE,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IAClE,YAAY,EAAE,OAAO,mBAAmB,EAAE,WAAW,SAAS,KAAK,MAAM,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,cAAc;AAAA,IAC/G,iBAAiB,OAAO,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,IAC5F,UAAU,OAAO,MAAM,MAAM;AAAA,EAC/B,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,UAAU,EAAE,QAAQ,OAAO,KAAK,GAA2B;AACxE,QAAM,QAAQ,MAAM,WAA+I,QAAQ,OAAO,KAAK;AACvL;AAAA,IACE,OACI,KAAK,UAAU,OAAO,MAAM,CAAC,IAC7B,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,iBAAiB,GAAG,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI,KAAK;AAAA,EAC9H;AACF;AAEA,eAAe,SAAS,KAA6B;AACnD,QAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC;AACvE,iBAAe,IAAI,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC;AAClF;AAGA,IAAM,yBAAyB,IAAI;AAGnC,eAAe,gBAAgB,KAAc,YAAwB,KAA4B;AAC/F,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,aAAW,EAAE,IAAI,KAAK,WAAW,OAAO;AAEtC,QAAI,CAAC,uBAAuB,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,8BAA8B,GAAG,sCAAsC;AAC9H,UAAM,EAAE,IAAI,IAAI,MAAM;AAAA,MACpB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA,GAAG,KAAK,IAAI,mBAAmB,WAAW,EAAE,CAAC,UAAU,mBAAmB,GAAG,CAAC;AAAA,IAChF;AACA,UAAME,UAAS,IAAI,IAAI,GAAG;AAC1B,QAAIA,QAAO,aAAa,YAAY,CAAC,CAAC,aAAa,WAAW,EAAE,SAASA,QAAO,QAAQ;AACtF,YAAM,IAAI,MAAM,6BAA6B,GAAG,SAASA,QAAO,QAAQ,GAAG;AAC7E,UAAM,WAAW,MAAM,MAAMA,SAAQ,EAAE,UAAU,QAAQ,CAAC;AAC1D,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,kCAAkC,GAAG,YAAY,SAAS,MAAM,IAAI;AACtG,UAAM,UAAUF,MAAK,KAAK,GAAG,GAAG,MAAM,GAAGG,YAAW,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC,GAAG,EAAE,iBAAiB,uBAAuB,CAAC,CAAC;AAAA,EAC7I;AACA,UAAQ,MAAM,cAAc,WAAW,MAAM,MAAM,eAAe,WAAW,MAAM,WAAW,IAAI,KAAK,GAAG,OAAO,GAAG,EAAE;AACxH;AAEA,eAAe,UAAU,KAA6B;AACpD,QAAM,aAAa,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC;AAC5E,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,WAAW,kBAAkB,IAAI,MAAM,YAAY;AACzD,MAAI,SAAU,OAAM,gBAAgB,KAAK,YAAY,QAAQ;AAC7D;AAAA,IACE,IAAI,OACA,KAAK,UAAU,OAAO,MAAM,CAAC,IAC7B,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,aAAa,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,WAAW,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,KAAK;AAAA,EACpI;AACF;AAEA,eAAe,YAAY,KAA6B;AACtD,QAAM,OAAO,OAAO,KAAK,SAAS;AAClC,QAAM,OAAO,MAAM,YAAY,IAAI,QAAQ,IAAI,OAAO,GAAG,KAAK,IAAI,mBAAmB,IAAI,CAAC,UAAU;AACpG,iBAAe,IAAI,OAAO,KAAK,UAAU,EAAE,MAAM,SAAS,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC7F;AAEA,eAAe,WAAW,KAA6B;AACrD,QAAM,OAAO,OAAO,KAAK,SAAS;AAClC,QAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB,MAAM,SAAS,CAAC,EAAE;AACpE,QAAM,aAAa,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,IAAI;AAC5D,QAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,UAAU,GAAG,KAAK,IAAI,mBAAmB,WAAW,EAAE,CAAC,UAAU,mBAAmB,GAAG,CAAC,EAAE;AAC/H,iBAAe,IAAI,OAAO,KAAK,UAAU,EAAE,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC,IAAI,gBAAgB,GAAG,SAAS,IAAI,EAAE;AACnH;AAEA,eAAe,QAAQ,KAA6B;AAClD,QAAM,EAAE,MAAM,QAAQ,OAAO,KAAK,IAAI;AACtC,QAAM,OAAO,OAAO,KAAK,UAAU;AACnC,QAAM,MAAM,SAAS,MAAM,OAAO;AAClC,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,QAAM,iBAAiB,YAAY,IAAI;AACvC,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAM,mBAAmB,kBAAkB,MAAM,gBAAgB;AACjE,MAAI,CAAC,4BAA4B,KAAK,GAAG;AACvC,UAAM,IAAI,MAAM,+GAA+G;AAEjI,QAAM,WAAW,MAAM,SAAS,gBAAgB,mBAAmB,MAAM,gCAAgC,cAAc,cAAc,EAAE;AACvI,MAAI;AACJ,MAAI,kBAAkB;AACpB,UAAM,SAAS,uBAAuB,UAAU,MAAM,SAAS,kBAAkB,kBAAkB,gBAAgB,EAAE,CAAC;AACtH,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,cAAc,GAAG,gBAAgB,iCAAiC,aAAa,OAAO,KAAK,CAAC;AACxG,mBAAe,OAAO;AAAA,EACxB;AAEA,QAAM,aAAa,MAAM,QAAQ,QAAQ,OAAO,IAAI;AACpD,QAAM,YAAY,WAAW,WAAW,SAAS;AACjD,MAAI,aAAa,CAAC,aAAc,OAAM,IAAI,MAAM,GAAG,IAAI,kDAAkD;AACzG,MAAI,CAAC,aAAa,aAAc,OAAM,IAAI,MAAM,GAAG,IAAI,+DAA+D;AAEtH,QAAM,SAAS,MAAM,WAAW,KAAK;AACrC,QAAM,UAAU,qBAAqB,OAAO,SAAS,WAAW,WAAW,MAAM,OAAO;AACxF,MAAI,QAAQ;AACV,UAAM,IAAI,MAAM,iDAAiD,QAAQ,KAAK,IAAI,CAAC,kCAAkC;AAEvH,QAAM,WAAW,GAAG,KAAK,IAAI,mBAAmB,WAAW,EAAE,CAAC;AAC9D,QAAM,SAAS,MAAM,QAAqB,QAAQ,OAAO,QAAQ,GAAG,QAAQ,YAAY;AAAA,IACtF,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,EAChB,CAAC;AACD,QAAM,eAAe,OAAO,WAAW;AACvC,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,WAAW,MAAM,MAAM,OAAO,KAAK,EAAE,QAAQ,OAAO,SAAS,OAAO,SAAS,MAAM,IAAI,WAAW,OAAO,OAAO,EAAE,CAAC;AACzH,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,gCAAgC,SAAS,MAAM,OAAO,MAAM,SAAS,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAChH;AACA,QAAM,QAAQ,QAAQ,OAAO,QAAQ,GAAG,QAAQ,UAAU;AAAA,IACxD;AAAA,IACA,OAAO,kBAAkB,MAAM,SAAS,KAAK;AAAA,IAC7C,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,IACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,EACzC,CAAC;AACD,QAAM,SAAS,EAAE,MAAM,MAAM,KAAK,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,aAAa;AAC3F;AAAA,IACE,OACI,KAAK,UAAU,QAAQ,MAAM,CAAC,IAC9B,cAAc,GAAG,OAAO,IAAI;AAAA,SAAY,OAAO,MAAM,KAAK,OAAO,KAAK,uBAAuB,eAAe,6CAA6C,UAAU;AAAA,EACzK;AACF;AAGA,IAAM,WAAiG;AAAA,EACrG;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,KAAK,CAAC,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI,QAAQ,IAAI,KAAK;AAAA,EACzE,KAAK,CAAC,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI,QAAQ,IAAI,KAAK;AAAA,EACxE,MAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,OAAO,KAAK,MAAM,GAAG,IAAI,QAAQ,IAAI,KAAK;AAAA,EAC5E,SAAS,CAAC,QAAQ,YAAY,IAAI,MAAM,IAAI,aAAa,IAAI,QAAQ,IAAI,KAAK;AAChF;AAEA,eAAsB,eAAe,MAA+B;AAClE,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,MAAI,CAAC,WAAW,YAAY,UAAU,QAAQ,MAAM,UAAU,IAAI,GAAG;AACnE,cAAU,YAAY,SAAS,KAAK,CAAC,IAAI,OAAO;AAChD;AAAA,EACF;AACA,MAAI,YAAY,SAAS;AACvB,UAAM,iBAAiB,QAAQ,IAAI;AACnC;AAAA,EACF;AACA,MAAI,OAAO;AACX,MAAI;AACF,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,EAAG,OAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AACtF,UAAM,MAAM;AAEZ,QAAI,OAAO,SAAS,GAAG,EAAG,UAAS,MAAM,OAAO;AAEhD,eAAW,QAAQ,YAAY,OAAO,CAACC,UAASA,UAAS,YAAY,GAAG;AACtE,UAAI,KAAK,SAAS,IAAI,KAAK,kBAAkB,MAAM,IAAI,MAAM,OAAW,OAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,IACrH;AACA,UAAM,cAAc,kBAAkB,MAAM,WAAW;AAEvD,QAAI,YAAY,UAAU,YAAY,GAAG,KAAK,GAAI,OAAM,IAAI,MAAM,wBAAwB,MAAM,GAAG,CAAC,EAAE;AACtG,QAAI,QAAQ,QAAQ;AAClB,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,cAAc,IAAI;AAClD,YAAM,MAAM,EAAE,MAAM,MAAM,aAAa,QAAQ,OAAO,MAAM,QAAQ,MAAM,QAAQ,EAAE;AACpF,aAAQ,MAAM,SAAS,GAAG,EAAE,GAAG,KAAM;AAAA,IACvC;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,WAAO;AAAA,EACT;AACA,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC;","names":["readFile","readdir","gunzipSync","join","required","run","target","readFile","readFile","readFile","join","readdir","target","gunzipSync","flag"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/perf.ts","../../ids/src/registry.ts","../../ids/src/base58.ts","../../ids/src/prefixed-id.ts","../../ids/src/entity-link.ts","../../ids/src/types.ts","../../types/src/perf-config.ts","../../types/src/perf-result.ts","../../types/src/perf-round.ts","../../types/src/perf-render.ts"],"sourcesContent":["/** `cofactor perf`: measure two versions, or manage saved performance tests. */\nimport { readFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { parse } from 'yaml';\nimport { extractUuid } from '@chatsdet/ids';\nimport {\n PerfConfigSchema,\n StoredPerfConfigSchema,\n renderPerfResult,\n type PerfResult,\n type PerfRunHeadlineDelta,\n type PerfRunStatus,\n type PerfVerdict,\n type StoredPerfConfig,\n} from '@chatsdet/types/perf';\nimport { GLOBAL_VALUE_FLAGS, hasFlag, resolveConfig } from './auth.js';\nimport { printServedGuide } from './guide.js';\nimport { apiRequest, getPositionalArg, getScalarArgValue } from './cli-helpers.js';\nimport { resolveApplicationId } from './environment.js';\nimport {\n RULES_PATH,\n buildScheduleTriggerConfig,\n type AutomationRule,\n} from './automation-shared.js';\nimport { writeRawOutput } from './brand.js';\n\ntype PerfTest = {\n id: string;\n name: string;\n applicationId: string;\n environment: string;\n onMerge: boolean;\n config: StoredPerfConfig;\n};\ntype PerfRun = {\n id: string;\n status: PerfRunStatus;\n verdict: PerfVerdict | null;\n baseSha: string;\n headSha: string;\n result: PerfResult | null;\n error: string | null;\n};\ntype RunSummary = Pick<PerfRun, 'id' | 'status' | 'verdict' | 'baseSha' | 'headSha'> & {\n headlineDeltas: PerfRunHeadlineDelta[];\n};\ntype ApiResponse<T> = { ok: boolean; error?: string; code?: string; data?: T };\n\nconst TESTS = '/org/perf/tests';\nconst RUNS = '/org/perf/runs';\nconst ACTION = 'perf-test.run';\nconst TIMING_FLAGS = ['--schedule', '--cron', '--at', '--every', '--timezone'];\nconst VALUE_FLAGS = [\n ...GLOBAL_VALUE_FLAGS,\n ...TIMING_FLAGS,\n '--config',\n '--application',\n '--environment',\n '--test',\n '--base',\n '--head',\n '--name',\n '--limit',\n];\nconst USAGE = {\n run: 'run (--config perf.yaml --application <app> [--environment E] | --test <name|id>) [--base <version>] --head <version>',\n save: 'save --config perf.yaml --name <n> --application <app> [--environment E] [--on-merge] [<timing flag>]',\n guide: 'guide',\n list: 'list',\n get: 'get <test-name|ptest_id|prun_id>',\n runs: 'runs <test-name|ptest_id> [--limit N]',\n delete: 'delete <test-name|ptest_id>',\n};\ntype Command = keyof typeof USAGE;\n\nfunction printHelp(command: string | undefined): void {\n const usage = Object.hasOwn(USAGE, command ?? '') ? USAGE[command as Command] : undefined;\n console.log(\n [\n `Usage: cofactor perf ${usage ?? '<sub-command>'} [--json]`,\n '',\n ...Object.values(USAGE).map((line) => ` cofactor perf ${line}`),\n '',\n 'guide: prints the offline performance-test guide (no login needed).',\n 'run: validates YAML, inlines k6.script relative to perf.yaml, and waits for the run.',\n ' --head and --base take a commit SHA, a push id or a tag.',\n ' Base defaults to the environment head for GitHub apps, or the ready push before head for uploaded apps.',\n ' Polls every 5 seconds for at most 4 hours. A timeout leaves the run available via get.',\n 'save: replaces the test and its schedule by name. Without a timing flag or --on-merge, it is manual.',\n ' --on-merge runs the test for merges into the repository default branch (GitHub applications only).',\n ' Leaving --on-merge off clears the marker.',\n ' One timing flag: --schedule <text> | --cron <expr> | --at <HH:mm> | --every <30m|2h>',\n ' --timezone <zone> applies to the schedule (default UTC).',\n ' Scheduling requires the server automation action perf-test.run.',\n 'list: saved tests. get: a prun_ id selects a run; a ptest_ id or name selects a test.',\n 'runs: recent runs for a test, newest first; --limit defaults to 20 (1..100).',\n 'delete: deletes the test, its automation rules, and its runs (API cascade).',\n '',\n 'Common options:',\n ' --org <name|id> Logged-in organization; required explicitly for run, save, delete',\n ' --env <env> API environment (prod, dev, local); distinct from --environment',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ' --json Raw JSON on every sub-command; runs flatten PerfResult into run metadata',\n ' --help, -h Show help without authentication',\n '',\n 'Requires the sandbox-v2 organization flag. API-key scopes:',\n ' run/save: sandbox:create + sandbox:exec; run/get/runs reads: sandbox:read; delete: sandbox:edit.',\n ' save/list/delete also use automation rules routes and require full API-key access (*).',\n '',\n 'Exit codes (run):',\n ' 0 no_change or faster',\n ' 3 slower',\n ' 1 Failed run, polling timeout, or any error',\n 'Other sub-commands exit 0 on success, 1 on error.',\n ].join('\\n')\n );\n}\n\nfunction required(argv: string[], flag: string): string {\n const value = getScalarArgValue(argv, flag);\n if (!value) throw new Error(`${flag} is required.`);\n return value;\n}\n\nasync function readConfig(file: string): Promise<StoredPerfConfig> {\n const config = PerfConfigSchema.parse(parse(await readFile(file, 'utf8')));\n const { k6, ...rest } = config;\n if (!k6) return StoredPerfConfigSchema.parse(rest);\n const { script, ...load } = k6;\n const scriptSource = await readFile(resolve(dirname(file), script), 'utf8');\n return StoredPerfConfigSchema.parse({ ...rest, k6: { ...load, scriptSource } });\n}\n\nasync function request<T>(\n apiUrl: string,\n token: string,\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const response = await apiRequest<ApiResponse<T>>(apiUrl, token, method, path, body);\n if (!response.ok || response.data === undefined) {\n throw new Error(\n `${response.code ? `${response.code}: ` : ''}${response.error ?? `${method} ${path} failed`}`\n );\n }\n return response.data;\n}\n\nasync function resolveTest(apiUrl: string, token: string, name: string): Promise<PerfTest> {\n if (name.startsWith('ptest_'))\n return request(apiUrl, token, 'GET', `${TESTS}/${encodeURIComponent(name)}`);\n const tests = await request<PerfTest[]>(apiUrl, token, 'GET', TESTS);\n const test = tests.find((test) => test.name === name);\n if (!test) throw new Error(`Perf test \"${name}\" not found.`);\n return test;\n}\n\n/** Rules store UUIDs in actionConfig, while perf routes return prefixed IDs. */\nfunction testUuid(test: PerfTest): string {\n const id = extractUuid(test.id);\n if (!id) throw new Error(`Invalid perf test id: ${test.id}`);\n return id;\n}\n\nasync function listRules(apiUrl: string, token: string): Promise<AutomationRule[]> {\n const rules: AutomationRule[] = [];\n let page = 1;\n let totalPages: number;\n do {\n const response = await apiRequest<\n ApiResponse<AutomationRule[]> & { pagination: { totalPages: number } }\n >(apiUrl, token, 'GET', `${RULES_PATH}?actionType=${ACTION}&pageSize=100&page=${page}`);\n if (!response.ok || !response.data)\n throw new Error(response.error ?? 'Could not list perf automation rules.');\n rules.push(...response.data);\n totalPages = response.pagination.totalPages;\n page++;\n } while (page <= totalPages);\n return rules;\n}\n\nfunction rulesForTest(rules: AutomationRule[], test: PerfTest): AutomationRule[] {\n const id = testUuid(test);\n return rules.filter((rule) => rule.actionConfig.perf_test_id === id);\n}\n\nasync function deletePaths(paths: string[], apiUrl: string, token: string): Promise<void> {\n for (const path of paths) {\n const response = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n path\n );\n if (!response.ok) throw new Error(response.error ?? `DELETE ${path} failed`);\n }\n}\n\nfunction printRun(run: PerfRun, json: boolean): void {\n if (json) {\n const { result, ...metadata } = run;\n writeRawOutput(JSON.stringify({ ...metadata, ...result, rows: result?.rows ?? [] }, null, 2));\n } else if (run.status === 'completed' && run.result && run.verdict) {\n writeRawOutput(renderPerfResult({ ...run, result: run.result, verdict: run.verdict }));\n } else {\n writeRawOutput(`${run.id} ${run.status}${run.error ? ` ${run.error}` : ''}`);\n }\n}\n\nasync function run(argv: string[], apiUrl: string, token: string): Promise<number> {\n const configFile = getScalarArgValue(argv, '--config');\n const test = getScalarArgValue(argv, '--test');\n if (Boolean(configFile) === Boolean(test))\n throw new Error('Use exactly one of --config or --test.');\n if (\n test &&\n (getScalarArgValue(argv, '--application') || getScalarArgValue(argv, '--environment'))\n ) {\n throw new Error('--application and --environment are only valid with --config.');\n }\n const head = required(argv, '--head');\n const base = getScalarArgValue(argv, '--base');\n const target = test\n ? { perfTestId: (await resolveTest(apiUrl, token, test)).id }\n : {\n config: await readConfig(configFile!),\n applicationId: await resolveApplicationId(argv, apiUrl, token),\n environment: getScalarArgValue(argv, '--environment'),\n };\n const { id } = await request<{ id: string }>(apiUrl, token, 'POST', RUNS, {\n ...target,\n head,\n ...(base ? { base } : {}),\n });\n // Slice 4's job has a four-hour timeout (layer builds plus measured rounds).\n const deadline = Date.now() + 4 * 60 * 60 * 1000;\n while (Date.now() < deadline) {\n const current = await request<PerfRun>(\n apiUrl,\n token,\n 'GET',\n `${RUNS}/${encodeURIComponent(id)}`\n );\n if (current.status === 'failed') {\n printRun(current, hasFlag(argv, '--json'));\n return 1;\n }\n if (current.status === 'completed') {\n if (!current.result || !current.verdict)\n throw new Error(`Completed perf run ${id} has no result or verdict.`);\n printRun(current, hasFlag(argv, '--json'));\n return current.verdict === 'slower' ? 3 : 0;\n }\n await sleep(5000);\n }\n throw new Error(`Timed out waiting for ${id}. Inspect it with cofactor perf get ${id}.`);\n}\n\nasync function save(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = required(argv, '--name');\n const config = await readConfig(required(argv, '--config'));\n const applicationId = await resolveApplicationId(argv, apiUrl, token);\n const triggerConfig = await buildScheduleTriggerConfig(argv, apiUrl, token);\n const test = await request<PerfTest>(apiUrl, token, 'POST', TESTS, {\n name,\n config,\n applicationId,\n environment: getScalarArgValue(argv, '--environment'),\n ...(hasFlag(argv, '--on-merge') ? { onMerge: true } : {}),\n });\n const rules = rulesForTest(await listRules(apiUrl, token), test);\n await deletePaths(\n rules.map((rule) => `${RULES_PATH}/${encodeURIComponent(rule.id)}`),\n apiUrl,\n token\n );\n let rule: AutomationRule | undefined;\n if (triggerConfig) {\n const response = await apiRequest<ApiResponse<AutomationRule>>(\n apiUrl,\n token,\n 'POST',\n RULES_PATH,\n {\n name,\n enabled: true,\n triggerSource: 'schedule',\n triggerEvent: 'scheduled',\n triggerConfig,\n actionType: ACTION,\n actionConfig: { perf_test_id: testUuid(test) },\n }\n );\n if (!response.ok || !response.data) {\n throw new Error(\n `Saved ${test.id}, but could not create its schedule: ${response.error ?? 'rule creation failed'}`\n );\n }\n rule = response.data;\n }\n if (hasFlag(argv, '--json'))\n writeRawOutput(JSON.stringify({ ...test, ...(rule ? { rule } : {}) }, null, 2));\n else writeRawOutput(`Saved ${test.id} ${test.name}${rule ? ` schedule ${rule.id}` : ''}`);\n}\n\nasync function remove(test: PerfTest, apiUrl: string, token: string): Promise<void> {\n const rules = rulesForTest(await listRules(apiUrl, token), test);\n await deletePaths(\n [\n `${TESTS}/${encodeURIComponent(test.id)}`,\n ...rules.map((rule) => `${RULES_PATH}/${encodeURIComponent(rule.id)}`),\n ],\n apiUrl,\n token\n );\n}\n\nexport async function runPerf(argv: string[]): Promise<void> {\n const [command, ...rest] = argv;\n if (!command || command === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp(command);\n return;\n }\n if (command === 'guide') {\n await printServedGuide('perf', rest);\n return;\n }\n let code = 0;\n try {\n if (!Object.hasOwn(USAGE, command)) throw new Error(`Unknown perf command: ${command}`);\n // Require the identity selector before authentication or any mutating request.\n if (['run', 'save', 'delete'].includes(command)) required(rest, '--org');\n for (const flag of VALUE_FLAGS) {\n const value = getScalarArgValue(rest, flag);\n if (rest.includes(flag) && value === undefined) throw new Error(`${flag} requires a value.`);\n }\n const { apiUrl, token } = await resolveConfig(rest);\n const json = hasFlag(rest, '--json');\n if (command === 'run') code = await run(rest, apiUrl, token);\n else if (command === 'save') await save(rest, apiUrl, token);\n else if (command === 'list') {\n const [tests, rules] = await Promise.all([\n request<PerfTest[]>(apiUrl, token, 'GET', TESTS),\n listRules(apiUrl, token),\n ]);\n const listed = tests.map((test) => ({\n ...test,\n schedules: rulesForTest(rules, test),\n }));\n writeRawOutput(\n json\n ? JSON.stringify(listed, null, 2)\n : listed\n .map((test) => {\n const schedules = test.schedules\n .map(\n (rule) =>\n `${rule.id} [${rule.enabled ? 'enabled' : 'paused'}] ${JSON.stringify(rule.triggerConfig)}`\n )\n .join('; ');\n const modes = [\n ...(test.onMerge ? ['on-merge'] : []),\n ...(schedules ? [schedules] : []),\n ];\n return `${test.id} ${test.name} ${test.environment} ${modes.join(' ') || 'manual'}`;\n })\n .join('\\n') || 'No perf tests found.'\n );\n } else {\n const target = getPositionalArg(rest, VALUE_FLAGS);\n if (!target) throw new Error(`Usage: cofactor perf ${USAGE[command as Command]}`);\n if (command === 'get' && target.startsWith('prun_')) {\n printRun(\n await request<PerfRun>(apiUrl, token, 'GET', `${RUNS}/${encodeURIComponent(target)}`),\n json\n );\n } else {\n const test = await resolveTest(apiUrl, token, target);\n if (command === 'get')\n writeRawOutput(\n json\n ? JSON.stringify(test, null, 2)\n : `${test.id} ${test.name}\\non-merge: ${test.onMerge}\\n${JSON.stringify(test.config, null, 2)}`\n );\n else if (command === 'delete') {\n await remove(test, apiUrl, token);\n writeRawOutput(\n json ? JSON.stringify({ id: test.id, deleted: true }) : `Deleted ${test.id}`\n );\n } else {\n const limit = getScalarArgValue(rest, '--limit') ?? '20';\n if (!/^\\d+$/.test(limit) || Number(limit) < 1 || Number(limit) > 100)\n throw new Error('--limit must be an integer from 1 to 100.');\n const query = new URLSearchParams({ perfTestId: test.id, limit });\n const page = await request<{ items: RunSummary[]; nextCursor: string | null }>(\n apiUrl,\n token,\n 'GET',\n `${RUNS}?${query}`\n );\n writeRawOutput(\n json\n ? JSON.stringify(page, null, 2)\n : page.items\n .map((run) => `${run.id} ${run.status} ${run.verdict ?? '-'} ${run.headSha}`)\n .join('\\n') || 'No perf runs found.'\n );\n }\n }\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n code = 1;\n }\n if (code !== 0) process.exit(code);\n}\n","/**\n * Entity prefix registry — the central map from prefix to table metadata.\n *\n * Powers both ID encoding/decoding and the generic org-lookup middleware.\n * To add a new entity prefix, add an entry here and the system picks it up.\n *\n * @module EntityRegistry\n * @see docs/project/prefixed-ids.md\n */\n\nexport const EntityPrefix = {\n agentEval: 'aeval',\n agentEvalCase: 'aecase',\n agentEvalRun: 'aerun',\n agentEvalAttempt: 'aeatt',\n organization: 'org',\n workflow: 'wf',\n workflowTestExecution: 'exec',\n workflowTestRun: 'trun',\n workflowRun: 'wrun',\n adhocTest: 'adhoc',\n exploratoryTest: 'expt',\n perfTest: 'ptest',\n perfRun: 'prun',\n issue: 'iss',\n property: 'prop',\n credential: 'cred',\n credentialTemplate: 'ctpl',\n syntheticUniverse: 'su',\n syntheticUser: 'sp',\n syntheticUserRun: 'sr',\n userEvent: 'uev',\n userEventDashboard: 'ued',\n userEventDashboardCard: 'uedc',\n triageRun: 'trg',\n triageFinding: 'trgf',\n phoneNumber: 'phn',\n textMessage: 'sms',\n productArea: 'parea',\n productCapability: 'pcap',\n productCapabilityRule: 'prule',\n landingPage: 'lp',\n prReview: 'prr',\n digest: 'dig',\n explorationCycle: 'excy',\n explorationLead: 'exld',\n testSignInProvider: 'tsp',\n testSignInClient: 'tsc',\n testSignInGrant: 'tsg',\n pullRequestProofRecord: 'proof',\n} as const;\n\nexport type EntityPrefixValue = (typeof EntityPrefix)[keyof typeof EntityPrefix];\n\nexport type EntityRegistryEntry = {\n /** PostgreSQL table name */\n tableName: string;\n /** Column containing the owning org's ID. null for entities that ARE orgs. */\n orgIdColumn: string | null;\n /** Primary key column name (usually 'id') */\n idColumn: string;\n /** Build the frontend URL for this entity. Returns a path string. */\n buildUrl?: (opts: { prefixedId: string; parentPrefixedId?: string }) => string;\n /**\n * Uppercase prefix for this entity's *natural* code, when it has one.\n *\n * A few entities carry a short human-citable code alongside their opaque\n * prefixed id — `CAP-CMM-001` next to `pcap_…`. Both encodings answer \"what\n * kind of thing is this?\", so both are declared here rather than in a second\n * parallel vocabulary that could drift out of step with this one. Absent for\n * the entities addressed only by prefixed id.\n */\n naturalCodePrefix?: string;\n /** For entities whose URL requires a parent's ID (e.g., test runs need execution ID) */\n parentLookup?: {\n /** Foreign key column on this entity's table pointing to the parent */\n foreignKey: string;\n /** Prefix for encoding the parent entity's ID */\n parentPrefix: EntityPrefixValue;\n };\n};\n\nexport const ENTITY_REGISTRY: Record<EntityPrefixValue, EntityRegistryEntry> = {\n aeval: { tableName: 'agent_evals', orgIdColumn: 'org_id', idColumn: 'id' },\n aecase: { tableName: 'agent_eval_cases', orgIdColumn: 'org_id', idColumn: 'id' },\n aerun: { tableName: 'agent_eval_runs', orgIdColumn: 'org_id', idColumn: 'id' },\n aeatt: { tableName: 'agent_eval_attempts', orgIdColumn: 'org_id', idColumn: 'id' },\n org: {\n tableName: 'organizations',\n orgIdColumn: null,\n idColumn: 'id',\n },\n wf: {\n tableName: 'workflows',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/flows/${prefixedId}`,\n },\n exec: {\n tableName: 'workflow_test_executions',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/runs/test/${prefixedId}`,\n },\n trun: {\n tableName: 'workflow_test_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ parentPrefixedId }) => `/runs/test/${parentPrefixedId}`,\n parentLookup: {\n foreignKey: 'execution_id',\n parentPrefix: 'exec',\n },\n },\n wrun: {\n tableName: 'workflow_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n // Needs propertyId parent — not yet implemented\n },\n adhoc: {\n tableName: 'adhoc_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/exploratory/${prefixedId}`,\n },\n expt: {\n tableName: 'exploratory_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ptest: {\n tableName: 'perf_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n prun: {\n tableName: 'perf_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n iss: {\n tableName: 'issues',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/issues?issueId=${prefixedId}`,\n },\n prop: {\n tableName: 'org_properties',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/properties/${prefixedId}`,\n },\n cred: {\n tableName: 'org_property_credentials',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ctpl: {\n tableName: 'credential_templates',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n su: {\n tableName: 'synthetic_universes',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/synthetic-users/${prefixedId}`,\n },\n sp: {\n tableName: 'synthetic_users',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n sr: {\n tableName: 'synthetic_user_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n uev: {\n tableName: 'user_events',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ued: {\n tableName: 'user_event_dashboards',\n orgIdColumn: null,\n idColumn: 'id',\n },\n uedc: {\n tableName: 'user_event_dashboard_cards',\n orgIdColumn: null,\n idColumn: 'id',\n },\n trg: {\n tableName: 'triage_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ parentPrefixedId }) =>\n parentPrefixedId ? `/runs/test/${parentPrefixedId}?tab=triage` : '/runs/test',\n parentLookup: {\n foreignKey: 'workflow_test_execution_id',\n parentPrefix: 'exec',\n },\n },\n trgf: {\n tableName: 'triage_findings',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n phn: {\n tableName: 'messaging_phone_numbers',\n orgIdColumn: 'owner_org_id',\n idColumn: 'id',\n },\n sms: {\n tableName: 'text_messages',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n parea: {\n tableName: 'product_areas',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/product-map?area=${prefixedId}`,\n naturalCodePrefix: 'ARE',\n },\n pcap: {\n tableName: 'product_capabilities',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/product-map?capability=${prefixedId}`,\n naturalCodePrefix: 'CAP',\n },\n prule: {\n tableName: 'product_capability_rules',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n // No buildUrl: landing pages are authored from the CLI and served at\n // runcofactor.com/lp/<slug> — there is no in-app detail route to link to.\n //\n // Deliberately NO `lpv` prefix for landing_page_variants. That table has no\n // org_id column, and `orgIdColumn: null` does not mean \"child table\" here —\n // resolveEntityOrg (apps/api/src/middleware/resolve-entity-org.ts) reads it\n // as \"the ID *is* the orgId\" and compares the UUID against the caller's org,\n // so a variant routed through the generic middleware would be rejected for\n // the wrong reason. Variants are addressed by (page slug, variant name);\n // add a prefix only together with real parent-resolving lookup support.\n lp: {\n tableName: 'landing_pages',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n prr: {\n tableName: 'pr_reviews',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/pr-reviews/${prefixedId}`,\n },\n dig: {\n tableName: 'org_digests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/digests/${prefixedId}`,\n },\n excy: {\n tableName: 'exploration_cycles',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/explore/cycles/${prefixedId}`,\n },\n exld: {\n tableName: 'exploration_leads',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsp: {\n tableName: 'test_sign_in_providers',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsc: {\n tableName: 'test_sign_in_clients',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsg: {\n tableName: 'test_sign_in_grants',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n proof: {\n tableName: 'pull_request_proof_records',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/proofs/${prefixedId}`,\n },\n} as const;\n\n// Freeze the registry — sql.raw() safety depends on these being immutable string literals\nObject.freeze(ENTITY_REGISTRY);\n\n/** Strict SQL identifier pattern — registry values must match this. */\nconst SAFE_IDENT = /^[a-z_][a-z0-9_]*$/;\n\n// Validate all registry entries at module load time\nfor (const [prefix, entry] of Object.entries(ENTITY_REGISTRY)) {\n for (const field of [entry.tableName, entry.orgIdColumn, entry.idColumn].filter(\n Boolean\n ) as string[]) {\n if (!SAFE_IDENT.test(field)) {\n throw new Error(`Invalid identifier in ENTITY_REGISTRY['${prefix}']: \"${field}\"`);\n }\n }\n}\n\n/** All valid prefix strings, derived from the registry. */\nexport const VALID_PREFIXES = new Set<string>(Object.keys(ENTITY_REGISTRY));\n\n/** Look up a registry entry by prefix string. Returns undefined for unknown prefixes. */\nexport function getRegistryEntry(prefix: string): EntityRegistryEntry | undefined {\n return ENTITY_REGISTRY[prefix as EntityPrefixValue];\n}\n","/**\n * Base58 encoding/decoding using the Bitcoin alphabet.\n *\n * Encodes arbitrary byte arrays into URL-safe, human-readable strings\n * without ambiguous characters (0/O, l/1, +, /).\n *\n * @module Base58\n * @see docs/project/prefixed-ids.md\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nconst BASE = 58;\n\nconst ALPHABET_MAP = new Map<string, number>();\nfor (let i = 0; i < ALPHABET.length; i++) {\n ALPHABET_MAP.set(ALPHABET[i]!, i);\n}\n\n/** Encode a Uint8Array into a base58 string. */\nexport function encodeBase58(bytes: Uint8Array): string {\n if (bytes.length === 0) return '';\n\n // Count leading zero bytes (they map to '1' in base58)\n let leadingZeros = 0;\n while (leadingZeros < bytes.length && bytes[leadingZeros] === 0) {\n leadingZeros++;\n }\n\n // Work on a copy as a big-endian number\n const digits: number[] = [];\n for (let i = leadingZeros; i < bytes.length; i++) {\n let carry = bytes[i]!;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j]! * 256;\n digits[j] = carry % BASE;\n carry = Math.floor(carry / BASE);\n }\n while (carry > 0) {\n digits.push(carry % BASE);\n carry = Math.floor(carry / BASE);\n }\n }\n\n // Build result: leading '1's + reversed digits\n let result = ALPHABET[0]!.repeat(leadingZeros);\n for (let i = digits.length - 1; i >= 0; i--) {\n result += ALPHABET[digits[i]!];\n }\n\n return result;\n}\n\n/** Decode a base58 string back to a Uint8Array. Returns null on invalid input. */\nexport function decodeBase58(str: string): Uint8Array | null {\n if (str.length === 0) return new Uint8Array(0);\n\n // Count leading '1's (they map to 0x00 bytes)\n let leadingOnes = 0;\n while (leadingOnes < str.length && str[leadingOnes] === ALPHABET[0]) {\n leadingOnes++;\n }\n\n const bytes: number[] = [];\n for (let i = leadingOnes; i < str.length; i++) {\n const value = ALPHABET_MAP.get(str[i]!);\n if (value === undefined) return null; // invalid character\n\n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j]! * BASE;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n // Combine leading zeros + reversed bytes\n const result = new Uint8Array(leadingOnes + bytes.length);\n // leadingOnes positions are already 0\n for (let i = 0; i < bytes.length; i++) {\n result[leadingOnes + i] = bytes[bytes.length - 1 - i]!;\n }\n\n return result;\n}\n","/**\n * Prefixed ID encoding, decoding, and parsing.\n *\n * Format: `{prefix}_{base58(uuid_bytes)}`\n * Example: `exec_6ByM4qP5NH7t4DtaCHeALh`\n *\n * @module PrefixedId\n * @see docs/project/prefixed-ids.md\n */\n\nimport { encodeBase58, decodeBase58 } from './base58.js';\nimport { VALID_PREFIXES, type EntityPrefixValue } from './registry.js';\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst PREFIXED_RE = /^([a-z]{2,6})_([1-9A-HJ-NP-Za-km-z]+)$/;\n\n/**\n * Whether a string is a UUID in the canonical hyphenated form.\n *\n * Callers that pass a path or query parameter straight into a `uuid` column\n * need this: Postgres rejects a value it cannot parse with `22P02` at bind\n * time, so the query fails outright instead of returning an empty result set.\n *\n * Deliberately stricter than Postgres, which also accepts the unhyphenated\n * 32-hex and brace-wrapped forms. We only ever emit the canonical form, so\n * `isUuid(x) === false` means \"not one of ours\", not \"Postgres would reject x\".\n */\nexport function isUuid(value: string): boolean {\n return UUID_RE.test(value);\n}\n\n/** Convert a UUID hex string (with or without hyphens) to a 16-byte Uint8Array. */\nfunction uuidToBytes(uuid: string): Uint8Array {\n const hex = uuid.replace(/-/g, '');\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/** Convert a 16-byte Uint8Array to a hyphenated UUID string. */\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Encode a raw UUID into a prefixed ID string. */\nexport function encodePrefixedId(prefix: EntityPrefixValue, uuid: string): string {\n const bytes = uuidToBytes(uuid);\n return `${prefix}_${encodeBase58(bytes)}`;\n}\n\n/** Decode a prefixed ID string back to { prefix, uuid }. Returns null on invalid input. */\nexport function decodePrefixedId(\n id: string\n): { prefix: EntityPrefixValue; uuid: string } | null {\n const match = id.match(PREFIXED_RE);\n if (!match) return null;\n\n const prefix = match[1]!;\n if (!VALID_PREFIXES.has(prefix)) return null;\n\n const decoded = decodeBase58(match[2]!);\n if (!decoded || decoded.length < 16 || decoded.length > 17) return null;\n\n // Base58 decoding may produce 17 bytes for some UUIDs — strip leading zero byte\n let normalized = decoded;\n if (decoded.length === 17) {\n if (decoded[0] !== 0) return null; // corrupted input\n normalized = decoded.slice(1);\n }\n\n return { prefix: prefix as EntityPrefixValue, uuid: bytesToUuid(normalized) };\n}\n\nexport type ParsedId =\n | { kind: 'prefixed'; prefix: EntityPrefixValue; uuid: string }\n | { kind: 'raw_uuid'; uuid: string }\n | { kind: 'invalid' };\n\n/**\n * Parse any ID input — accepts a prefixed ID, a raw UUID, or returns invalid.\n * This is the backwards-compatible entry point used during migration.\n */\nexport function parseAnyId(input: string): ParsedId {\n // Try prefixed first\n const decoded = decodePrefixedId(input);\n if (decoded) return { kind: 'prefixed', ...decoded };\n\n // Try raw UUID\n if (UUID_RE.test(input)) return { kind: 'raw_uuid', uuid: input.toLowerCase() };\n\n return { kind: 'invalid' };\n}\n\n","/**\n * Shared logic for finding bare registered prefixed entity IDs inside\n * markdown text — the single source for both the web app's\n * `EntityLinkMarkdown` linkifier and any server-side markdown-entity\n * resolution (e.g. product-map capability bodies).\n *\n * @module EntityLink\n */\n\nimport { EntityPrefix } from './registry.js';\n\nconst prefixAlternation = Object.values(EntityPrefix)\n .sort((left, right) => right.length - left.length)\n .join('|');\n\n/** Matches a bare registered prefixed entity ID, e.g. `wf_abc123`. */\nexport const BARE_ENTITY_ID = new RegExp(\n `(^|[^A-Za-z0-9_])((?:${prefixAlternation})_[1-9A-HJ-NP-Za-km-z]+)(?![A-Za-z0-9_])`,\n 'g'\n);\n\n/** Matches fenced code blocks, inline code, and existing markdown links — segments to skip. */\nexport const PROTECTED_MARKDOWN = /(```[\\s\\S]*?```|`[^`\\n]+`|\\[[^\\]]*\\]\\([^)]+\\))/g;\n\nfunction shortEntityId(id: string): string {\n if (id.length <= 18) return id;\n const separator = id.indexOf('_');\n return `${id.slice(0, separator + 1)}${id.slice(separator + 1, separator + 9)}…`;\n}\n\n/**\n * Splits markdown into segments, tagging each as protected (fenced code,\n * inline code, existing markdown links) or plain. Protected segments must be\n * left untouched by both linkification and entity-id extraction.\n */\nfunction splitProtectedSegments(markdown: string): Array<{ text: string; protected: boolean }> {\n return markdown\n .split(PROTECTED_MARKDOWN)\n .map((text) => ({ text, protected: Boolean(text.match(PROTECTED_MARKDOWN)) }));\n}\n\nfunction linkifyPlainSegment(segment: string): string {\n return segment.replace(BARE_ENTITY_ID, (_match, leading: string, id: string) => {\n return `${leading}[${shortEntityId(id)}](/lookup/${id})`;\n });\n}\n\n/**\n * Linkifies bare registered entity IDs while leaving fenced code blocks,\n * inline code, and existing markdown links untouched. Markdown links\n * intentionally route through `/lookup` so org checks and canonical entity\n * URLs stay centralized.\n */\nexport function linkifyEntityIds(markdown: string): string {\n return splitProtectedSegments(markdown)\n .map(({ text, protected: isProtected }) => (isProtected ? text : linkifyPlainSegment(text)))\n .join('');\n}\n\n/**\n * Extracts the bare registered prefixed entity IDs appearing in a markdown\n * string, skipping fenced code blocks, inline code, and existing markdown\n * links. Order-preserving, de-duplicated.\n */\nexport function extractEntityIds(markdown: string): string[] {\n const ids: string[] = [];\n const seen = new Set<string>();\n for (const { text, protected: isProtected } of splitProtectedSegments(markdown)) {\n if (isProtected) continue;\n for (const match of text.matchAll(BARE_ENTITY_ID)) {\n const id = match[2];\n if (id && !seen.has(id)) {\n seen.add(id);\n ids.push(id);\n }\n }\n }\n return ids;\n}\n","/**\n * Branded ID types for compile-time safety across the prefixed ID boundary.\n *\n * Per-entity types use template literals so the compiler enforces prefix matching:\n * FlowId = `wf_${string}` — only matches \"wf_abc123\", not \"exec_abc123\"\n * FlowUuid = Uuid & { __entity: 'wf' } — a UUID known to reference a workflow\n *\n * @module types\n * @see packages/ids/src/prefixed-id.ts\n */\n\nimport { parseAnyId } from './prefixed-id.js';\nimport type { EntityPrefix } from './registry.js';\n\n// ---------------------------------------------------------------------------\n// Base branded types\n// ---------------------------------------------------------------------------\n\n/** A raw UUID. What the DB stores. What repos, services, and DB code accept. */\nexport type Uuid = string & { readonly __brand: 'Uuid' };\n\n/** A prefixed entity ID like `wf_abc123`. What users see in URLs. */\nexport type EntityId = string & { readonly __brand: 'EntityId' };\n\n/** Union: accepts both prefixed IDs and raw UUIDs (route params during migration). */\nexport type AnyEntityId = EntityId | Uuid;\n\n// ---------------------------------------------------------------------------\n// Per-entity prefixed ID types (template literal — compiler checks the prefix)\n// ---------------------------------------------------------------------------\n\n/** Derive a prefixed ID type from a prefix string: `wf_${string}` */\ntype PrefixedId<P extends string> = `${P}_${string}` & { readonly __brand: 'EntityId' };\n\nexport type OrganizationId = PrefixedId<typeof EntityPrefix.organization>;\nexport type FlowId = PrefixedId<typeof EntityPrefix.workflow>;\nexport type ExecutionId = PrefixedId<typeof EntityPrefix.workflowTestExecution>;\nexport type TestRunId = PrefixedId<typeof EntityPrefix.workflowTestRun>;\nexport type WorkflowRunId = PrefixedId<typeof EntityPrefix.workflowRun>;\nexport type IssueId = PrefixedId<typeof EntityPrefix.issue>;\nexport type PropertyId = PrefixedId<typeof EntityPrefix.property>;\nexport type CredentialId = PrefixedId<typeof EntityPrefix.credential>;\nexport type PerfTestId = PrefixedId<typeof EntityPrefix.perfTest>;\nexport type PerfRunId = PrefixedId<typeof EntityPrefix.perfRun>;\n\n// ---------------------------------------------------------------------------\n// Per-entity UUID types (branded — a UUID known to reference a specific entity)\n// ---------------------------------------------------------------------------\n\n/** A UUID branded with the entity type it references. */\ntype EntityUuid<P extends string> = Uuid & { readonly __entity: P };\n\nexport type OrganizationUuid = EntityUuid<typeof EntityPrefix.organization>;\nexport type FlowUuid = EntityUuid<typeof EntityPrefix.workflow>;\nexport type ExecutionUuid = EntityUuid<typeof EntityPrefix.workflowTestExecution>;\nexport type TestRunUuid = EntityUuid<typeof EntityPrefix.workflowTestRun>;\nexport type WorkflowRunUuid = EntityUuid<typeof EntityPrefix.workflowRun>;\nexport type IssueUuid = EntityUuid<typeof EntityPrefix.issue>;\nexport type PropertyUuid = EntityUuid<typeof EntityPrefix.property>;\nexport type CredentialUuid = EntityUuid<typeof EntityPrefix.credential>;\nexport type PerfTestUuid = EntityUuid<typeof EntityPrefix.perfTest>;\nexport type PerfRunUuid = EntityUuid<typeof EntityPrefix.perfRun>;\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\n/** Brand a validated prefixed ID string. Returns null if not a valid prefixed format. */\nexport function toEntityId(value: string): EntityId | null {\n const parsed = parseAnyId(value);\n return parsed.kind === 'prefixed' ? (value as EntityId) : null;\n}\n\n/** Brand a known-valid UUID string. Use `extractUuid` for route params that may be prefixed. */\nexport function toUuid(value: string): Uuid | null {\n const parsed = parseAnyId(value);\n if (parsed.kind === 'raw_uuid') return parsed.uuid as Uuid;\n return null;\n}\n\n/** Brand any valid ID (prefixed or UUID). Returns null if invalid format. */\nexport function toAnyEntityId(value: string): AnyEntityId | null {\n const parsed = parseAnyId(value);\n return parsed.kind !== 'invalid' ? (value as AnyEntityId) : null;\n}\n\n// ---------------------------------------------------------------------------\n// Pure extraction (the main function most routes use)\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a UUID from any entity ID format (prefixed or raw UUID).\n *\n * Pure compute — no DB, no Effect, no org check. Returns a branded `Uuid`\n * that repos and services can accept. Returns null if unparseable.\n *\n * Most routes should use this. Only cross-org redirect endpoints need\n * the full `resolveEntityOrg` middleware.\n */\nexport function extractUuid(raw: string | null | undefined): Uuid | null {\n if (!raw) return null;\n const parsed = parseAnyId(raw);\n if (parsed.kind === 'prefixed') return parsed.uuid.toLowerCase() as Uuid;\n if (parsed.kind === 'raw_uuid') return parsed.uuid.toLowerCase() as Uuid;\n return null;\n}\n","import { z } from 'zod';\n\nconst k6Load = {\n vus: z.number().int().min(1).max(200),\n durationSeconds: z.number().int().min(10).max(300),\n as: z.string().min(1).optional(),\n};\n\ntype Estimable = {\n rounds: number;\n lighthouse?: { pages: readonly unknown[] };\n k6?: { durationSeconds: number };\n};\n\n/** Estimated time for both arms, including one warm-up, setup, and collection. */\nexport const estimatePerfSeconds = (config: Estimable): number =>\n (config.rounds + 1) *\n ((config.lighthouse?.pages.length ?? 0) * 45 + (config.k6?.durationSeconds ?? 0) + 30) *\n 2 +\n 600;\n\nconst perfBase = {\n rounds: z.number().int().min(5).max(15).default(7),\n lighthouse: z\n .strictObject({\n formFactor: z.enum(['desktop', 'mobile']),\n pages: z\n .array(z.strictObject({\n name: z.string().min(1).max(40).regex(/^[a-z0-9-]+$/),\n path: z\n .string()\n .startsWith('/')\n .refine((path) => !path.startsWith('//'), 'path must be relative, not protocol-relative')\n .refine((path) => !path.includes('\\\\'), 'path must not contain backslashes'),\n as: z.string().min(1).optional(),\n }))\n .min(1)\n .max(10),\n })\n .optional(),\n};\n\nconst withPerfRules = <S extends z.ZodType<Estimable>>(schema: S) =>\n schema\n .refine((config) => config.lighthouse !== undefined || config.k6 !== undefined, {\n message: 'configure at least one of lighthouse or k6',\n })\n .refine((config) => estimatePerfSeconds(config) <= 5400, {\n message: 'estimated run time exceeds 90 minutes; reduce rounds, pages or duration',\n });\n\n/** `perf.yaml` as written; the CLI resolves `k6.script` relative to this file. */\nexport const PerfConfigSchema = withPerfRules(\n z.strictObject({\n ...perfBase,\n k6: z.strictObject({ script: z.string().min(1), ...k6Load }).optional(),\n })\n);\n\n/** Config received and stored by the API after the CLI inlines the k6 script. */\nexport const StoredPerfConfigSchema = withPerfRules(\n z.strictObject({\n ...perfBase,\n k6: z.strictObject({ scriptSource: z.string().min(1).max(200_000), ...k6Load }).optional(),\n })\n);\n\nexport type PerfConfig = z.infer<typeof PerfConfigSchema>;\nexport type StoredPerfConfig = z.infer<typeof StoredPerfConfigSchema>;\n","import { z } from 'zod';\n\nexport const PerfArmSchema = z.enum(['base', 'head']);\nexport type PerfArm = z.infer<typeof PerfArmSchema>;\n\nexport const PerfVerdictSchema = z.enum(['faster', 'slower', 'no_change']);\nexport type PerfVerdict = z.infer<typeof PerfVerdictSchema>;\n\nexport const PerfRunStatusSchema = z.enum(['queued', 'running', 'completed', 'failed']);\nexport type PerfRunStatus = z.infer<typeof PerfRunStatusSchema>;\n\nexport const PERF_MIN_EFFECT = 0.1;\n\nexport interface PerfRow {\n id: string;\n flavor: 'lighthouse' | 'k6' | 'otel';\n label: string;\n unit: 'ms' | 'rps' | 'ratio' | 'bytes' | 'count';\n gated: boolean;\n base: { median: number; values: number[] };\n head: { median: number; values: number[] };\n /** Ratio of medians; rps flips the sign so positive means worse; ratio rows use percentage-point difference and zero-base rows use absolute difference. */\n deltaPct: number;\n /** Bootstrap confidence interval in the same unit as `deltaPct`. */\n ci95: [number, number];\n verdict: PerfVerdict;\n}\n\nexport type PerfRunHeadlineDelta = Pick<PerfRow, 'id' | 'label' | 'unit' | 'verdict'> & {\n baseMedian: number;\n deltaPct: number;\n absolute: boolean;\n ci95: [number, number];\n};\n\n/** Whether a row's delta and confidence interval use absolute units instead of a ratio. */\nexport function usesAbsoluteDifference(row: {\n unit: PerfRow['unit'];\n base: { values: number[] };\n}): boolean {\n return row.unit === 'ratio' || row.base.values.includes(0);\n}\n\nexport interface PerfSlowSpan {\n name: string;\n count: number;\n p95Ms: number;\n totalMs: number;\n}\n\nexport interface PerfResult {\n rounds: number;\n rows: PerfRow[];\n /** Null when neither arm received spans because the app has no OTel instrumentation. */\n otel: null | {\n topSlowSpans: { base: PerfSlowSpan[]; head: PerfSlowSpan[] };\n };\n tools: { lighthouse?: string; k6?: string; otelcol?: string };\n}\n","import { z } from 'zod';\nimport { StoredPerfConfigSchema } from './perf-config.js';\nimport { PerfArmSchema } from './perf-result.js';\n\n/** Config staged for one guest arm by the perf job. */\nexport const RunnerConfigSchema = StoredPerfConfigSchema.safeExtend({\n /** HTTPS URL for the claimed sandbox's public app port. */\n baseUrl: z.url({ protocol: /^https$/ }),\n otelExpected: z.boolean(),\n});\n\nexport type RunnerConfig = z.infer<typeof RunnerConfigSchema>;\n\nconst LighthousePageRoundSchema = z.strictObject({\n name: z.string().min(1),\n lcpMs: z.number().nonnegative(),\n tbtMs: z.number().nonnegative(),\n fcpMs: z.number().nonnegative(),\n cls: z.number().nonnegative(),\n speedIndexMs: z.number().nonnegative(),\n bytes: z.number().nonnegative(),\n finalUrl: z.string().min(1),\n documentStatus: z.number().int(),\n});\n\nconst K6RoundSchema = z.strictObject({\n p50Ms: z.number().nonnegative(),\n p95Ms: z.number().nonnegative(),\n requestsPerSecond: z.number().nonnegative(),\n errorRate: z.number().nonnegative(),\n});\n\nconst OtelEndpointRoundSchema = z.strictObject({\n endpoint: z.string().min(1),\n count: z.number().int().nonnegative(),\n p50Ms: z.number().nonnegative(),\n p95Ms: z.number().nonnegative(),\n});\n\nconst PerfRoundSlowSpanSchema = z.strictObject({\n name: z.string().min(1),\n count: z.number().int().nonnegative(),\n p95Ms: z.number().nonnegative(),\n totalMs: z.number().nonnegative(),\n});\n\n/** One runner JSONL record for a measured round on one arm. */\nexport const RoundSummarySchema = z.strictObject({\n round: z.number().int().positive(),\n arm: PerfArmSchema,\n lighthouse: z.array(LighthousePageRoundSchema).optional(),\n k6: K6RoundSchema.optional(),\n otel: z\n .strictObject({\n endpoints: z.array(OtelEndpointRoundSchema),\n topSlowSpans: z.array(PerfRoundSlowSpanSchema),\n })\n .optional(),\n});\n\nexport type RoundSummary = z.infer<typeof RoundSummarySchema>;\n","import { usesAbsoluteDifference } from './perf-result.js';\nimport type { PerfResult, PerfRow, PerfSlowSpan, PerfVerdict } from './perf-result.js';\n\nexport type PerfRenderInput = {\n id: string;\n verdict: PerfVerdict;\n baseSha: string;\n headSha: string;\n result: PerfResult;\n};\n\nexport function renderPerfResult(input: PerfRenderInput): string {\n const heading =\n input.verdict === 'slower' ? 'SLOWER' : input.verdict === 'faster' ? 'faster' : 'no change';\n const visibleRows = input.result.rows.filter(\n (row) =>\n row.gated ||\n (row.flavor === 'otel' &&\n row.id.endsWith(':p95') &&\n (row.base.values.length < input.result.rounds ||\n row.head.values.length < input.result.rounds))\n );\n const omittedUngatedRows = input.result.rows.filter((row) => !visibleRows.includes(row));\n const lines = [\n `## Perf: ${heading} (head ${shortSha(input.headSha)} vs base ${shortSha(input.baseSha)}, ${input.result.rounds} rounds)`,\n '',\n '| Metric | Base | Head | Delta | 95% CI | Verdict |',\n '|---|---|---|---|---|---|',\n ...visibleRows.map((row) => renderRow(row, input.result.rounds)),\n ];\n const ungated = omittedUngatedRows.length;\n if (ungated > 0)\n lines.push(\n '',\n `Not gated: ${ungated} more rows (${ungatedLabels(omittedUngatedRows)}). \\`--json\\` for all rows.`\n );\n const tools = [\n input.result.tools.lighthouse && `lighthouse ${input.result.tools.lighthouse}`,\n input.result.tools.k6 && `k6 ${input.result.tools.k6}`,\n input.result.tools.otelcol && `otelcol-contrib ${input.result.tools.otelcol}`,\n ].filter((tool): tool is string => tool !== undefined);\n if (ungated === 0) lines.push('');\n lines.push(`Tools: ${tools.length > 0 ? tools.join(', ') : 'none'}. Run: ${input.id}.`);\n if (input.verdict === 'slower' && input.result.otel) {\n lines.push(\n '',\n '### Slowest server spans (head)',\n '',\n ...renderSpans(input.result.otel.topSlowSpans.head.slice(0, 5))\n );\n const baseByName = new Map(\n input.result.otel.topSlowSpans.base.map((span) => [span.name, span])\n );\n const slower = input.result.otel.topSlowSpans.head.filter((span) => {\n const base = baseByName.get(span.name);\n return !base || span.p95Ms > base.p95Ms;\n });\n if (slower.length > 0)\n lines.push('', '### New or slower than base', '', ...renderSpans(slower));\n }\n return lines.join('\\n');\n}\n\nfunction ungatedLabels(rows: PerfRow[]): string {\n const labels = rows.map((row) => {\n if (row.id.endsWith(':fcp')) return 'FCP';\n if (row.id.endsWith(':cls')) return 'CLS';\n if (row.id.endsWith(':speed-index')) return 'speed index';\n if (row.id.endsWith(':bytes')) return 'bytes';\n if (row.id.endsWith(':p50')) return 'p50s';\n return row.label;\n });\n const order = ['FCP', 'CLS', 'speed index', 'bytes', 'p50s'];\n const standard = order.filter((label) => labels.includes(label));\n const extra = [...new Set(labels.filter((label) => !order.includes(label)))];\n return [...standard, ...extra].join(', ');\n}\n\nfunction renderRow(row: PerfRow, rounds: number): string {\n const sparseEndpoint =\n row.flavor === 'otel' &&\n row.id.endsWith(':p95') &&\n (row.base.values.length < rounds || row.head.values.length < rounds);\n const verdict = row.verdict === 'slower' ? 'SLOWER' : row.verdict.replace('_', ' ');\n const label = sparseEndpoint ? `${row.label} (not gated)` : row.label;\n return `| ${escapeCell(label)} | ${formatArmValue(row.base, row.unit)} | ${formatArmValue(row.head, row.unit)} | ${formatDelta(row)} | ${formatInterval(row)} | ${verdict} |`;\n}\n\nfunction formatArmValue(arm: PerfRow['base'], unit: PerfRow['unit']): string {\n return arm.values.length === 0 ? '-' : formatValue(arm.median, unit);\n}\n\nexport function formatValue(value: number, unit: PerfRow['unit']): string {\n switch (unit) {\n case 'ms':\n return `${round(value)} ms`;\n case 'rps':\n return `${round(value)}`;\n case 'ratio':\n return `${(value * 100).toFixed(1)}%`;\n case 'bytes':\n return `${round(value)} bytes`;\n case 'count':\n return `${round(value)}`;\n }\n}\n\nexport function formatDelta(row: PerfRow): string {\n const missingBase = row.base.values.length === 0;\n const missingHead = row.head.values.length === 0;\n if (missingBase) return 'new';\n if (missingHead) return 'removed';\n if (row.unit === 'ratio') return `${signed(row.deltaPct, 1)} pt`;\n const displayedDelta = row.unit === 'rps' ? -row.deltaPct : row.deltaPct;\n if (usesAbsoluteDifference(row)) {\n return `${signed(displayedDelta, 0)}${unitSuffix(row.unit)}`;\n }\n return `${signed(displayedDelta * 100, 1)}%`;\n}\n\nexport function formatInterval(row: PerfRow): string {\n const missingBase = row.base.values.length === 0;\n const missingHead = row.head.values.length === 0;\n if (missingBase || missingHead) return '-';\n const absolute = usesAbsoluteDifference(row);\n const suffix = row.unit === 'ratio' ? ' pt' : absolute ? unitSuffix(row.unit) : '%';\n const scale = row.unit === 'ratio' || absolute ? 1 : 100;\n const precision = suffix === '%' || row.unit === 'ratio' ? 1 : 0;\n const lowerBound = row.unit === 'rps' ? -row.ci95[1] : row.ci95[0];\n const upperBound = row.unit === 'rps' ? -row.ci95[0] : row.ci95[1];\n const lower = signed(lowerBound * scale, precision);\n const upper = signed(upperBound * scale, precision);\n return suffix === '%' ? `${lower}% .. ${upper}%` : `${lower} .. ${upper}${suffix}`;\n}\n\nexport function unitSuffix(unit: PerfRow['unit']): string {\n switch (unit) {\n case 'ms':\n return ' ms';\n case 'rps':\n return ' rps';\n case 'ratio':\n return ' pt';\n case 'bytes':\n return ' bytes';\n case 'count':\n return '';\n }\n}\n\nfunction renderSpans(spans: PerfSlowSpan[]): string[] {\n if (spans.length === 0) return ['No server spans.'];\n return [\n '| Name | Count | Worst round p95 | Total duration |',\n '|---|---:|---:|---:|',\n ...spans.map(\n (span) =>\n `| ${escapeCell(span.name)} | ${span.count} | ${round(span.p95Ms)} ms | ${round(span.totalMs)} ms |`\n ),\n ];\n}\n\nexport function shortSha(sha: string): string {\n return sha.slice(0, 7);\n}\n\nexport function signed(value: number, precision = 1): string {\n const rounded = Number(value.toFixed(precision));\n return `${rounded >= 0 ? '+' : ''}${rounded.toFixed(precision)}`;\n}\n\nfunction round(value: number): number {\n return Number(value.toFixed(1));\n}\n\nfunction escapeCell(value: string): string {\n return value.replaceAll('|', '\\\\|').replaceAll('\\n', ' ');\n}\n"],"mappings":"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","names":["z","z","z","test","run","rule"]}