@runcofactor/cli 0.54.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 (253) hide show
  1. package/README.md +2 -1
  2. package/dist/{account-6YJAU53I.js → account-CZYZD2JS.js} +5 -5
  3. package/dist/{alert-Z7V2ZUEW.js → alert-JQ4SDEB7.js} +8 -8
  4. package/dist/{api-catalog-UEDTRM6E.js → api-catalog-IWQC35P2.js} +5 -5
  5. package/dist/{api-key-V5GEPRRG.js → api-key-GUDXIIEA.js} +5 -5
  6. package/dist/{attachment-M7VZ6GSE.js → attachment-CPZYOBUB.js} +5 -5
  7. package/dist/{auth-DVTMWJKF.js → auth-DS6MBVEI.js} +3 -3
  8. package/dist/{benchmark-KZJZYUTQ.js → benchmark-6HPCIQHD.js} +5 -5
  9. package/dist/{blackcat-QJXYDE66.js → blackcat-V3L63WFE.js} +3 -3
  10. package/dist/{chunk-FLDIN6VX.js → chunk-2E3STBHS.js} +2 -2
  11. package/dist/{chunk-KNWKOKM7.js → chunk-2OHYMT3A.js} +20 -11
  12. package/dist/chunk-2OHYMT3A.js.map +1 -0
  13. package/dist/{chunk-L4Y5PZUE.js → chunk-3LGCHNBC.js} +2 -2
  14. package/dist/{chunk-ZFN5FWN2.js → chunk-4MFMPC5P.js} +46 -2
  15. package/dist/chunk-4MFMPC5P.js.map +1 -0
  16. package/dist/{chunk-2M4PZK6Q.js → chunk-56HFZHQM.js} +8 -8
  17. package/dist/{chunk-AQOHNAEN.js → chunk-5OYWNS6D.js} +20 -9
  18. package/dist/chunk-5OYWNS6D.js.map +1 -0
  19. package/dist/{chunk-RA2NRAWU.js → chunk-62EXS76C.js} +6 -6
  20. package/dist/{chunk-HGEJHS45.js → chunk-6ILWJFKY.js} +368 -6
  21. package/dist/chunk-6ILWJFKY.js.map +1 -0
  22. package/dist/{chunk-4EWSONHO.js → chunk-BDOL622T.js} +4 -4
  23. package/dist/{chunk-T6EQFICG.js → chunk-C3CXVX2B.js} +4 -4
  24. package/dist/{chunk-33U56YGD.js → chunk-CWICLBLU.js} +2 -1
  25. package/dist/{chunk-33U56YGD.js.map → chunk-CWICLBLU.js.map} +1 -1
  26. package/dist/{chunk-MQQCUU5S.js → chunk-DEVD2WD2.js} +2 -2
  27. package/dist/{chunk-TRC63RSK.js → chunk-EWK44F6V.js} +3 -3
  28. package/dist/chunk-EWK44F6V.js.map +1 -0
  29. package/dist/{chunk-Q7UAEFW5.js → chunk-FNHPTTRF.js} +7 -5
  30. package/dist/chunk-FNHPTTRF.js.map +1 -0
  31. package/dist/{chunk-JAIMLQOU.js → chunk-GCD4EHCD.js} +6 -6
  32. package/dist/{chunk-7MRZWPVC.js → chunk-H6ZMKNP7.js} +3 -3
  33. package/dist/{chunk-ZOPVBINJ.js → chunk-IEWAH7W3.js} +5 -5
  34. package/dist/{chunk-74TU6PGO.js → chunk-IV4HRGKX.js} +77 -12
  35. package/dist/chunk-IV4HRGKX.js.map +1 -0
  36. package/dist/{chunk-ZO5MSM4Q.js → chunk-J2ZQULU3.js} +2 -2
  37. package/dist/{chunk-IVWWYKAM.js → chunk-K2IDR6FR.js} +3 -3
  38. package/dist/{chunk-QGP67JOK.js → chunk-KTZRI27M.js} +4 -4
  39. package/dist/{chunk-HESV3F6U.js → chunk-L644NMDI.js} +3 -3
  40. package/dist/{chunk-HESV3F6U.js.map → chunk-L644NMDI.js.map} +1 -1
  41. package/dist/{chunk-LPQTXBJF.js → chunk-LFT7GUWS.js} +63 -17
  42. package/dist/chunk-LFT7GUWS.js.map +1 -0
  43. package/dist/{chunk-O7MBDOMO.js → chunk-O7B2IYCZ.js} +30 -14
  44. package/dist/chunk-O7B2IYCZ.js.map +1 -0
  45. package/dist/{chunk-R2CVV7QT.js → chunk-RHWPZKRV.js} +28 -1
  46. package/dist/chunk-RHWPZKRV.js.map +1 -0
  47. package/dist/{chunk-3YNR6U6Q.js → chunk-UJSW72LG.js} +3 -3
  48. package/dist/{chunk-G2SCV2CY.js → chunk-VACACCD6.js} +3 -3
  49. package/dist/{chunk-CV22445U.js → chunk-VMAR67FF.js} +2 -2
  50. package/dist/{chunk-QYHJUHL7.js → chunk-VMJ7TBVM.js} +2 -2
  51. package/dist/chunk-WRRA4ATV.js +332 -0
  52. package/dist/chunk-WRRA4ATV.js.map +1 -0
  53. package/dist/{chunk-YACDH6MJ.js → chunk-XHEVDABB.js} +2 -2
  54. package/dist/{chunk-7VBX2M4F.js → chunk-XHGF6VC6.js} +4 -4
  55. package/dist/{credential-546ER7WQ.js → credential-GJW7LGYP.js} +5 -5
  56. package/dist/{credential-template-BWMEBGBN.js → credential-template-UWBYKKWD.js} +5 -5
  57. package/dist/dev-PBW7BSOD.js +605 -0
  58. package/dist/dev-PBW7BSOD.js.map +1 -0
  59. package/dist/{digest-NIVBDDI2.js → digest-XEHGCJM4.js} +8 -8
  60. package/dist/{docs-AK4MDP6K.js → docs-KH4BCEQF.js} +5 -5
  61. package/dist/{doctor-NCLA47EL.js → doctor-FOXXE5SK.js} +3 -3
  62. package/dist/{environment-X3PV5IN2.js → environment-EBDPQTIS.js} +7 -7
  63. package/dist/{eval-5FZKYZ6O.js → eval-QZSSEICV.js} +67 -27
  64. package/dist/eval-QZSSEICV.js.map +1 -0
  65. package/dist/{exploration-2RVGIUKT.js → exploration-LCGKRGOQ.js} +5 -5
  66. package/dist/{exploratory-test-SJ5HFI3L.js → exploratory-test-SGECQGIX.js} +13 -5
  67. package/dist/exploratory-test-SGECQGIX.js.map +1 -0
  68. package/dist/{external-run-4NDVAHQB.js → external-run-2AJAI5O7.js} +9 -9
  69. package/dist/{feature-flag-C4IRE724.js → feature-flag-P7N4WQIH.js} +5 -5
  70. package/dist/{feedback-337OZCKC.js → feedback-LAT7TQ2T.js} +6 -6
  71. package/dist/{flow-D7ZLBKCH.js → flow-NH2DC6AP.js} +5 -5
  72. package/dist/{github-LKXYIALH.js → github-FCEKBLXI.js} +6 -6
  73. package/dist/index.js +106 -408
  74. package/dist/index.js.map +1 -1
  75. package/dist/{init-GKEC6LPH.js → init-5U5EZOAW.js} +5 -5
  76. package/dist/{install-K45SAT2V.js → install-X3UNVXKY.js} +5 -5
  77. package/dist/{issues-2HMTQYWR.js → issues-4P6I3YQW.js} +8 -8
  78. package/dist/{knobs-KUCGLO5Z.js → knobs-JKTWJ6ZG.js} +5 -5
  79. package/dist/{landing-KAET2I73.js → landing-6AGLKI66.js} +7 -7
  80. package/dist/{list-GDV4UYWV.js → list-TWP2RP33.js} +5 -5
  81. package/dist/{local-NFOSJLLV.js → local-D75QE5TB.js} +7 -7
  82. package/dist/{login-Y77HWROY.js → login-RBET4TIP.js} +5 -5
  83. package/dist/{mcp-CPCFMU6B.js → mcp-562SUUMK.js} +11 -11
  84. package/dist/{metrics-Y245ST63.js → metrics-4WF2GEPA.js} +5 -5
  85. package/dist/{monitor-BUDWSC3S.js → monitor-WJXH54H2.js} +5 -5
  86. package/dist/{perf-3JOAXPHP.js → perf-C6N6P7YG.js} +12 -361
  87. package/dist/perf-C6N6P7YG.js.map +1 -0
  88. package/dist/{product-CXL3YTMD.js → product-CYEQ7HOB.js} +5 -5
  89. package/dist/{product-map-656BTU74.js → product-map-MSDLIFZY.js} +7 -7
  90. package/dist/{prompts-3SZ7O5E6.js → prompts-ME53WPN4.js} +5 -5
  91. package/dist/{proofs-4CSCCSNL.js → proofs-D3G6ZUFP.js} +11 -9
  92. package/dist/{property-IEKBXRVY.js → property-5GLJNAVB.js} +29 -10
  93. package/dist/property-5GLJNAVB.js.map +1 -0
  94. package/dist/{psql-M4CM6TSI.js → psql-EXAUDU3W.js} +5 -5
  95. package/dist/{record-QP4TYZBS.js → record-EE7NGNKY.js} +6 -6
  96. package/dist/{redis-KG47IGJV.js → redis-M4EYWKOJ.js} +5 -5
  97. package/dist/{release-QHPSQULK.js → release-4KUWVWWC.js} +5 -5
  98. package/dist/{runbook-YVBG2QK3.js → runbook-AHU77ANQ.js} +5 -5
  99. package/dist/{sandbox-ZXDZTCCN.js → sandbox-FBLJEYA2.js} +1917 -1633
  100. package/dist/sandbox-FBLJEYA2.js.map +1 -0
  101. package/dist/{scenarios-2SX2NUCD.js → scenarios-TU656T2B.js} +5 -5
  102. package/dist/{schedule-P6F7MLXX.js → schedule-DXJI6SYO.js} +8 -8
  103. package/dist/{session-SZMCZTPE.js → session-RUFTJHF4.js} +10 -10
  104. package/dist/{skill-D4XFW6QI.js → skill-ZK76GQ47.js} +111 -13
  105. package/dist/skill-ZK76GQ47.js.map +1 -0
  106. package/dist/skills/cofactor-debug-run/SKILL.md +6 -1
  107. package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
  108. package/dist/skills/cofactor-debug-run/history/2.0.9.md +319 -0
  109. package/dist/skills/cofactor-debug-run/version.json +1 -1
  110. package/dist/{slack-UDXTPOSW.js → slack-M3OKDVMY.js} +6 -6
  111. package/dist/{spec-YCBBIV27.js → spec-5MXEBLYR.js} +5 -5
  112. package/dist/{src-DY7GLRO2.js → src-2X5OQRPJ.js} +4 -4
  113. package/dist/{src-NG7DRE5A.js → src-72EFBA2R.js} +3 -3
  114. package/dist/{src-DEGBASCD.js → src-KH6WSBJV.js} +5 -5
  115. package/dist/{src-ZKVNVLXY.js → src-VLV36QYH.js} +127 -20
  116. package/dist/src-VLV36QYH.js.map +1 -0
  117. package/dist/{start-ZYZSORPY.js → start-PDYBRB5T.js} +5 -5
  118. package/dist/{status-ESIG6A7W.js → status-VMVPVCDA.js} +5 -5
  119. package/dist/{tag-3K5Y25AR.js → tag-7KTDLPVU.js} +6 -6
  120. package/dist/{task-JLNX7O3M.js → task-QLFYZNKR.js} +6 -6
  121. package/dist/{teams-F4IU3EXE.js → teams-Y7BXCY6P.js} +7 -7
  122. package/dist/{test-suite-QHDUW5W5.js → test-suite-6U22AYFG.js} +15 -14
  123. package/dist/test-suite-6U22AYFG.js.map +1 -0
  124. package/dist/{tickets-NBL5WACL.js → tickets-CQDJDNPY.js} +5 -5
  125. package/dist/{trace-ZKYAI5JF.js → trace-QDORWXYX.js} +8 -8
  126. package/dist/{triage-5NWCREUM.js → triage-GY7M3UGG.js} +6 -6
  127. package/dist/{trigger-KXYYY5IR.js → trigger-DLFAORX4.js} +9 -9
  128. package/dist/{update-check-Q2URVJLC.js → update-check-ES6XQ7OF.js} +4 -4
  129. package/dist/{upgrade-4XSASC7U.js → upgrade-WKEOW5GS.js} +5 -5
  130. package/dist/{usage-UY7VZYVY.js → usage-E6FDTR3W.js} +7 -7
  131. package/dist/{utilities-53NXNLA7.js → utilities-4Z6YX3L5.js} +6 -6
  132. package/dist/{visual-IJAT7X7D.js → visual-TA6LPVDJ.js} +5 -5
  133. package/dist/{workflow-OQNH2FIS.js → workflow-B5FXS2CJ.js} +92 -36
  134. package/dist/workflow-B5FXS2CJ.js.map +1 -0
  135. package/dist/{workflow-cache-FP6MKLVR.js → workflow-cache-MNLEMRMM.js} +16 -16
  136. package/dist/{workflow-cache-convergence-resolve-HS5KO7US.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
  137. package/dist/{workflow-debug-EM55H2QE.js → workflow-debug-TNBUGSBK.js} +11 -11
  138. package/dist/{workflow-feedback-GNWNWVHH.js → workflow-feedback-G2ZXAUGI.js} +5 -5
  139. package/dist/{workflow-fork-M5AQWST7.js → workflow-fork-6HHOMC2D.js} +5 -5
  140. package/dist/{workflow-promotion-HYULZDYL.js → workflow-promotion-RG7L6JZT.js} +5 -5
  141. package/dist/{workflow-proposals-EN327FSE.js → workflow-proposals-ZNF2F3UE.js} +5 -5
  142. package/dist/{workflow-revisions-ZMTVNWRW.js → workflow-revisions-TP64Z6FO.js} +5 -5
  143. package/dist/{workflow-status-FNAJG34W.js → workflow-status-5RG3JX56.js} +5 -5
  144. package/package.json +3 -2
  145. package/dist/chunk-74TU6PGO.js.map +0 -1
  146. package/dist/chunk-AQOHNAEN.js.map +0 -1
  147. package/dist/chunk-HGEJHS45.js.map +0 -1
  148. package/dist/chunk-KNWKOKM7.js.map +0 -1
  149. package/dist/chunk-LPQTXBJF.js.map +0 -1
  150. package/dist/chunk-O7MBDOMO.js.map +0 -1
  151. package/dist/chunk-Q7UAEFW5.js.map +0 -1
  152. package/dist/chunk-R2CVV7QT.js.map +0 -1
  153. package/dist/chunk-TRC63RSK.js.map +0 -1
  154. package/dist/chunk-ZFN5FWN2.js.map +0 -1
  155. package/dist/eval-5FZKYZ6O.js.map +0 -1
  156. package/dist/exploratory-test-SJ5HFI3L.js.map +0 -1
  157. package/dist/perf-3JOAXPHP.js.map +0 -1
  158. package/dist/property-IEKBXRVY.js.map +0 -1
  159. package/dist/sandbox-ZXDZTCCN.js.map +0 -1
  160. package/dist/skill-D4XFW6QI.js.map +0 -1
  161. package/dist/src-ZKVNVLXY.js.map +0 -1
  162. package/dist/test-suite-QHDUW5W5.js.map +0 -1
  163. package/dist/workflow-OQNH2FIS.js.map +0 -1
  164. /package/dist/{account-6YJAU53I.js.map → account-CZYZD2JS.js.map} +0 -0
  165. /package/dist/{alert-Z7V2ZUEW.js.map → alert-JQ4SDEB7.js.map} +0 -0
  166. /package/dist/{api-catalog-UEDTRM6E.js.map → api-catalog-IWQC35P2.js.map} +0 -0
  167. /package/dist/{api-key-V5GEPRRG.js.map → api-key-GUDXIIEA.js.map} +0 -0
  168. /package/dist/{attachment-M7VZ6GSE.js.map → attachment-CPZYOBUB.js.map} +0 -0
  169. /package/dist/{auth-DVTMWJKF.js.map → auth-DS6MBVEI.js.map} +0 -0
  170. /package/dist/{benchmark-KZJZYUTQ.js.map → benchmark-6HPCIQHD.js.map} +0 -0
  171. /package/dist/{blackcat-QJXYDE66.js.map → blackcat-V3L63WFE.js.map} +0 -0
  172. /package/dist/{chunk-FLDIN6VX.js.map → chunk-2E3STBHS.js.map} +0 -0
  173. /package/dist/{chunk-L4Y5PZUE.js.map → chunk-3LGCHNBC.js.map} +0 -0
  174. /package/dist/{chunk-2M4PZK6Q.js.map → chunk-56HFZHQM.js.map} +0 -0
  175. /package/dist/{chunk-RA2NRAWU.js.map → chunk-62EXS76C.js.map} +0 -0
  176. /package/dist/{chunk-4EWSONHO.js.map → chunk-BDOL622T.js.map} +0 -0
  177. /package/dist/{chunk-T6EQFICG.js.map → chunk-C3CXVX2B.js.map} +0 -0
  178. /package/dist/{chunk-MQQCUU5S.js.map → chunk-DEVD2WD2.js.map} +0 -0
  179. /package/dist/{chunk-JAIMLQOU.js.map → chunk-GCD4EHCD.js.map} +0 -0
  180. /package/dist/{chunk-7MRZWPVC.js.map → chunk-H6ZMKNP7.js.map} +0 -0
  181. /package/dist/{chunk-ZOPVBINJ.js.map → chunk-IEWAH7W3.js.map} +0 -0
  182. /package/dist/{chunk-ZO5MSM4Q.js.map → chunk-J2ZQULU3.js.map} +0 -0
  183. /package/dist/{chunk-IVWWYKAM.js.map → chunk-K2IDR6FR.js.map} +0 -0
  184. /package/dist/{chunk-QGP67JOK.js.map → chunk-KTZRI27M.js.map} +0 -0
  185. /package/dist/{chunk-3YNR6U6Q.js.map → chunk-UJSW72LG.js.map} +0 -0
  186. /package/dist/{chunk-G2SCV2CY.js.map → chunk-VACACCD6.js.map} +0 -0
  187. /package/dist/{chunk-CV22445U.js.map → chunk-VMAR67FF.js.map} +0 -0
  188. /package/dist/{chunk-QYHJUHL7.js.map → chunk-VMJ7TBVM.js.map} +0 -0
  189. /package/dist/{chunk-YACDH6MJ.js.map → chunk-XHEVDABB.js.map} +0 -0
  190. /package/dist/{chunk-7VBX2M4F.js.map → chunk-XHGF6VC6.js.map} +0 -0
  191. /package/dist/{credential-546ER7WQ.js.map → credential-GJW7LGYP.js.map} +0 -0
  192. /package/dist/{credential-template-BWMEBGBN.js.map → credential-template-UWBYKKWD.js.map} +0 -0
  193. /package/dist/{digest-NIVBDDI2.js.map → digest-XEHGCJM4.js.map} +0 -0
  194. /package/dist/{docs-AK4MDP6K.js.map → docs-KH4BCEQF.js.map} +0 -0
  195. /package/dist/{doctor-NCLA47EL.js.map → doctor-FOXXE5SK.js.map} +0 -0
  196. /package/dist/{environment-X3PV5IN2.js.map → environment-EBDPQTIS.js.map} +0 -0
  197. /package/dist/{exploration-2RVGIUKT.js.map → exploration-LCGKRGOQ.js.map} +0 -0
  198. /package/dist/{external-run-4NDVAHQB.js.map → external-run-2AJAI5O7.js.map} +0 -0
  199. /package/dist/{feature-flag-C4IRE724.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
  200. /package/dist/{feedback-337OZCKC.js.map → feedback-LAT7TQ2T.js.map} +0 -0
  201. /package/dist/{flow-D7ZLBKCH.js.map → flow-NH2DC6AP.js.map} +0 -0
  202. /package/dist/{github-LKXYIALH.js.map → github-FCEKBLXI.js.map} +0 -0
  203. /package/dist/{init-GKEC6LPH.js.map → init-5U5EZOAW.js.map} +0 -0
  204. /package/dist/{install-K45SAT2V.js.map → install-X3UNVXKY.js.map} +0 -0
  205. /package/dist/{issues-2HMTQYWR.js.map → issues-4P6I3YQW.js.map} +0 -0
  206. /package/dist/{knobs-KUCGLO5Z.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
  207. /package/dist/{landing-KAET2I73.js.map → landing-6AGLKI66.js.map} +0 -0
  208. /package/dist/{list-GDV4UYWV.js.map → list-TWP2RP33.js.map} +0 -0
  209. /package/dist/{local-NFOSJLLV.js.map → local-D75QE5TB.js.map} +0 -0
  210. /package/dist/{login-Y77HWROY.js.map → login-RBET4TIP.js.map} +0 -0
  211. /package/dist/{mcp-CPCFMU6B.js.map → mcp-562SUUMK.js.map} +0 -0
  212. /package/dist/{metrics-Y245ST63.js.map → metrics-4WF2GEPA.js.map} +0 -0
  213. /package/dist/{monitor-BUDWSC3S.js.map → monitor-WJXH54H2.js.map} +0 -0
  214. /package/dist/{product-CXL3YTMD.js.map → product-CYEQ7HOB.js.map} +0 -0
  215. /package/dist/{product-map-656BTU74.js.map → product-map-MSDLIFZY.js.map} +0 -0
  216. /package/dist/{prompts-3SZ7O5E6.js.map → prompts-ME53WPN4.js.map} +0 -0
  217. /package/dist/{proofs-4CSCCSNL.js.map → proofs-D3G6ZUFP.js.map} +0 -0
  218. /package/dist/{psql-M4CM6TSI.js.map → psql-EXAUDU3W.js.map} +0 -0
  219. /package/dist/{record-QP4TYZBS.js.map → record-EE7NGNKY.js.map} +0 -0
  220. /package/dist/{redis-KG47IGJV.js.map → redis-M4EYWKOJ.js.map} +0 -0
  221. /package/dist/{release-QHPSQULK.js.map → release-4KUWVWWC.js.map} +0 -0
  222. /package/dist/{runbook-YVBG2QK3.js.map → runbook-AHU77ANQ.js.map} +0 -0
  223. /package/dist/{scenarios-2SX2NUCD.js.map → scenarios-TU656T2B.js.map} +0 -0
  224. /package/dist/{schedule-P6F7MLXX.js.map → schedule-DXJI6SYO.js.map} +0 -0
  225. /package/dist/{session-SZMCZTPE.js.map → session-RUFTJHF4.js.map} +0 -0
  226. /package/dist/{slack-UDXTPOSW.js.map → slack-M3OKDVMY.js.map} +0 -0
  227. /package/dist/{spec-YCBBIV27.js.map → spec-5MXEBLYR.js.map} +0 -0
  228. /package/dist/{src-DEGBASCD.js.map → src-2X5OQRPJ.js.map} +0 -0
  229. /package/dist/{src-DY7GLRO2.js.map → src-72EFBA2R.js.map} +0 -0
  230. /package/dist/{src-NG7DRE5A.js.map → src-KH6WSBJV.js.map} +0 -0
  231. /package/dist/{start-ZYZSORPY.js.map → start-PDYBRB5T.js.map} +0 -0
  232. /package/dist/{status-ESIG6A7W.js.map → status-VMVPVCDA.js.map} +0 -0
  233. /package/dist/{tag-3K5Y25AR.js.map → tag-7KTDLPVU.js.map} +0 -0
  234. /package/dist/{task-JLNX7O3M.js.map → task-QLFYZNKR.js.map} +0 -0
  235. /package/dist/{teams-F4IU3EXE.js.map → teams-Y7BXCY6P.js.map} +0 -0
  236. /package/dist/{tickets-NBL5WACL.js.map → tickets-CQDJDNPY.js.map} +0 -0
  237. /package/dist/{trace-ZKYAI5JF.js.map → trace-QDORWXYX.js.map} +0 -0
  238. /package/dist/{triage-5NWCREUM.js.map → triage-GY7M3UGG.js.map} +0 -0
  239. /package/dist/{trigger-KXYYY5IR.js.map → trigger-DLFAORX4.js.map} +0 -0
  240. /package/dist/{update-check-Q2URVJLC.js.map → update-check-ES6XQ7OF.js.map} +0 -0
  241. /package/dist/{upgrade-4XSASC7U.js.map → upgrade-WKEOW5GS.js.map} +0 -0
  242. /package/dist/{usage-UY7VZYVY.js.map → usage-E6FDTR3W.js.map} +0 -0
  243. /package/dist/{utilities-53NXNLA7.js.map → utilities-4Z6YX3L5.js.map} +0 -0
  244. /package/dist/{visual-IJAT7X7D.js.map → visual-TA6LPVDJ.js.map} +0 -0
  245. /package/dist/{workflow-cache-FP6MKLVR.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
  246. /package/dist/{workflow-cache-convergence-resolve-HS5KO7US.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
  247. /package/dist/{workflow-debug-EM55H2QE.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
  248. /package/dist/{workflow-feedback-GNWNWVHH.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
  249. /package/dist/{workflow-fork-M5AQWST7.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
  250. /package/dist/{workflow-promotion-HYULZDYL.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
  251. /package/dist/{workflow-proposals-EN327FSE.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
  252. /package/dist/{workflow-revisions-ZMTVNWRW.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
  253. /package/dist/{workflow-status-FNAJG34W.js.map → workflow-status-5RG3JX56.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workflow.ts","../src/workflow-create.ts","../src/workflow-get.ts","../src/workflow-format.ts","../src/workflow-list.ts","../src/workflow-cancel.ts","../src/workflow-run.ts","../src/cache-only-failure.ts","../src/workflow-runs.ts","../src/workflow-sync.ts","../src/workflow-api-sequence.ts","../src/workflow-api-sequence-cmds.ts","../src/workflow-seed-create.ts"],"sourcesContent":["/**\n * CLI Workflow Management\n *\n * Inspect workflow definitions and steps from the terminal.\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport {\n apiRequest,\n fetchWorkflowEnvironments,\n readTextOrFile,\n renderWorkflowUserError,\n stripOneTrailingNewline,\n resolveEnvironmentByNameOrId,\n} from './cli-helpers.js';\nimport { fetchOrExit } from './api-fetch.js';\nimport { applyWorkflowTagFlags } from './tag.js';\nimport { specExtension, writeRawOutput } from './brand.js';\nimport { handleWorkflowCreate } from './workflow-create.js';\nimport { handleWorkflowGet } from './workflow-get.js';\nimport { handleWorkflowList } from './workflow-list.js';\nimport { handleWorkflowCancel } from './workflow-cancel.js';\nimport { handleWorkflowRun } from './workflow-run.js';\nimport { runWorkflowRuns } from './workflow-runs.js';\nimport { handleWorkflowSync } from './workflow-sync.js';\nimport { handleWorkflowGenerateApiSequence } from './workflow-api-sequence.js';\nimport { handleWorkflowApiSequence } from './workflow-api-sequence-cmds.js';\nimport { handleWorkflowSeedCreate } from './workflow-seed-create.js';\nimport { topoOrderNodes } from '@chatsdet/workflow-diff';\nimport { printServedGuide } from './guide.js';\nimport {\n USER_SETTABLE_WORKFLOW_STATUSES,\n WORKFLOW_FLOW_TYPES,\n isWorkflowFlowType,\n isBrowserViewportPreset,\n} from '@chatsdet/types';\nimport type { PullWorkflow } from '@chatsdet/canary-spec';\nimport { getNodeTitle, type WorkflowDetailResponse } from './workflow-format.js';\n\nexport { shouldPrintWorkflowUrlTrailer } from './workflow-get.js';\n\nconst WORKFLOW_STATUS_DESCRIPTIONS: Record<\n (typeof USER_SETTABLE_WORKFLOW_STATUSES)[number],\n string\n> = {\n draft: 'not yet approved — no human has signed off on the spec',\n approved: 'a human verified the test checks the right thing',\n};\n\nconst formatWorkflowStatusList = (): string =>\n USER_SETTABLE_WORKFLOW_STATUSES.map((s) => `${s} (${WORKFLOW_STATUS_DESCRIPTIONS[s]})`).join(\n ', '\n );\n\n/* ── Patch Handler ───────────────────────────────────────────────────── */\n\ntype WorkflowUpdateResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string; name: string; status: string; flowType: string };\n};\n\nexport async function handlePatch(argv: string[], apiUrl: string, token: string): Promise<void> {\n const viewport = getArgValue(argv, '--viewport');\n const workflowId = argv.find((a) => !a.startsWith('-') && a !== viewport);\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error(\n 'Usage: canary workflow patch <workflowId> [--name ...] [--description <text|@file>] [--preflight <text|@file>] [--cleanup <text|@file>] [--status ...] [--flow-type ...] [--viewport <preset|default>] [--default-environment <name|id>] [--clear-default-environment] [--any-environment] [--eligible-env-types permanent,sandbox] [--eligible-environments <names|ids>]'\n );\n process.exit(1);\n }\n\n if (hasFlag(argv, '--viewport') && viewport === undefined) {\n console.error('Error: --viewport requires a preset or default.');\n process.exit(1);\n }\n\n const name = getArgValue(argv, '--name');\n const description = getArgValue(argv, '--description');\n const preflight = getArgValue(argv, '--preflight');\n const cleanup = getArgValue(argv, '--cleanup');\n const status = getArgValue(argv, '--status');\n const flowType = getArgValue(argv, '--flow-type');\n const seedOutputsJsonRaw = getArgValue(argv, '--seed-outputs-json');\n const seedOutputsFile = getArgValue(argv, '--seed-outputs-file');\n const teardownEnabledRaw = getArgValue(argv, '--teardown-enabled');\n const jsonOutput = hasFlag(argv, '--json');\n\n // Environment config flags (resolved name→id against the flow's property).\n const defaultEnvironment = getArgValue(argv, '--default-environment');\n const clearDefaultEnvironment = hasFlag(argv, '--clear-default-environment');\n const anyEnvironment = hasFlag(argv, '--any-environment');\n const eligibleEnvTypes = getArgValue(argv, '--eligible-env-types');\n const eligibleEnvironments = getArgValue(argv, '--eligible-environments');\n const hasEnvFlag =\n defaultEnvironment !== undefined ||\n clearDefaultEnvironment ||\n anyEnvironment ||\n eligibleEnvTypes !== undefined ||\n eligibleEnvironments !== undefined;\n\n const hasTagFlag =\n getArgValue(argv, '--tags') !== undefined ||\n getArgValue(argv, '--tags-add') !== undefined ||\n getArgValue(argv, '--tags-remove') !== undefined ||\n getArgValue(argv, '--tag-id') !== undefined;\n\n if (\n !name &&\n !description &&\n preflight === undefined &&\n cleanup === undefined &&\n !status &&\n !flowType &&\n !seedOutputsJsonRaw &&\n !seedOutputsFile &&\n teardownEnabledRaw === undefined &&\n viewport === undefined &&\n !hasTagFlag &&\n !hasEnvFlag\n ) {\n console.error(\n 'Error: No fields to update. Provide at least one of: --name, --description, --preflight, --cleanup, --status, --flow-type, --seed-outputs-json, --seed-outputs-file, --teardown-enabled, --viewport, --tags, --tags-add, --tags-remove, --tag-id, --default-environment, --clear-default-environment, --any-environment, --eligible-env-types, --eligible-environments'\n );\n process.exit(1);\n }\n\n if (teardownEnabledRaw !== undefined && teardownEnabledRaw !== 'true' && teardownEnabledRaw !== 'false') {\n console.error('Error: --teardown-enabled takes true or false.');\n process.exit(1);\n }\n\n if (anyEnvironment && (eligibleEnvTypes !== undefined || eligibleEnvironments !== undefined)) {\n console.error(\n 'Error: --any-environment is mutually exclusive with --eligible-env-types / --eligible-environments.'\n );\n process.exit(1);\n }\n if (clearDefaultEnvironment && defaultEnvironment !== undefined) {\n console.error(\n 'Error: --clear-default-environment is mutually exclusive with --default-environment.'\n );\n process.exit(1);\n }\n\n if (status && !(USER_SETTABLE_WORKFLOW_STATUSES as readonly string[]).includes(status)) {\n console.error(`Error: Invalid status \"${status}\". Valid: ${formatWorkflowStatusList()}`);\n process.exit(1);\n }\n\n if (flowType && !isWorkflowFlowType(flowType)) {\n console.error(\n `Error: Invalid flow type \"${flowType}\". Must be one of: ${WORKFLOW_FLOW_TYPES.join(', ')}`\n );\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (viewport !== undefined) {\n if (viewport !== 'default' && !isBrowserViewportPreset(viewport)) {\n console.error('Error: --viewport requires desktop, desktop_large, laptop, tablet, mobile, or default.');\n process.exit(1);\n }\n body.viewportSize = viewport === 'default' ? null : viewport;\n }\n if (name) body.name = name;\n const descriptionText = description ? stripOneTrailingNewline(readTextOrFile(description)) : '';\n if (descriptionText) body.description = descriptionText;\n // `!== undefined` (not truthiness, unlike --description) so `--preflight \"\"`\n // clears notes an author is moving out of a stale preflight.\n if (preflight !== undefined) body.preflight = stripOneTrailingNewline(readTextOrFile(preflight)) || null;\n if (cleanup !== undefined) body.cleanup = stripOneTrailingNewline(readTextOrFile(cleanup)) || null;\n if (status) body.status = status;\n if (flowType) body.flowType = flowType;\n if (teardownEnabledRaw !== undefined) body.teardownEnabled = teardownEnabledRaw === 'true';\n\n if (seedOutputsJsonRaw || seedOutputsFile) {\n let raw: string;\n if (seedOutputsFile) {\n try {\n raw = await fs.readFile(seedOutputsFile, 'utf-8');\n } catch (err) {\n console.error(\n `Error reading ${seedOutputsFile}: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n } else {\n raw = seedOutputsJsonRaw!;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n throw new Error('seedOutputsJson must be a JSON array');\n }\n body.seedOutputsJson = parsed;\n } catch (err) {\n console.error(\n `Error: Invalid --seed-outputs-json: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n }\n\n // Environment config: resolve named envs against the flow's property (the\n // GET payload already carries `environments` + eligibility), then build the\n // `defaultEnvironmentId` / `environmentConstraints` body fields.\n if (hasEnvFlag) {\n if (anyEnvironment) body.environmentConstraints = null;\n if (eligibleEnvTypes !== undefined) {\n const types = eligibleEnvTypes\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n const valid = ['permanent', 'ephemeral', 'local', 'sandbox'];\n const bad = types.filter((t) => !valid.includes(t));\n if (bad.length > 0) {\n console.error(`Error: invalid env type(s): ${bad.join(', ')}. Valid: ${valid.join(', ')}`);\n process.exit(1);\n }\n body.environmentConstraints = { mode: 'envTypes', types };\n }\n if (clearDefaultEnvironment) body.defaultEnvironmentId = null;\n\n const needsResolution = defaultEnvironment !== undefined || eligibleEnvironments !== undefined;\n if (needsResolution) {\n const envs = await fetchWorkflowEnvironments(apiUrl, token, workflowId);\n if (defaultEnvironment !== undefined) {\n body.defaultEnvironmentId = resolveEnvironmentByNameOrId(envs, defaultEnvironment);\n }\n if (eligibleEnvironments !== undefined) {\n const ids = eligibleEnvironments\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean)\n .map((nameOrId) => resolveEnvironmentByNameOrId(envs, nameOrId));\n body.environmentConstraints = { mode: 'only', environmentIds: ids };\n }\n }\n }\n\n let tagResult: Awaited<ReturnType<typeof applyWorkflowTagFlags>> = null;\n\n if (Object.keys(body).length > 0) {\n const result = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}`,\n body\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n }\n\n if (hasTagFlag) {\n try {\n tagResult = await applyWorkflowTagFlags({ apiUrl, token, argv, workflowId });\n } catch (err) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(\n { ok: false, error: err instanceof Error ? err.message : String(err) },\n null,\n 2\n )\n );\n } else {\n console.error(`Error applying tags:\\n${err instanceof Error ? err.message : String(err)}`);\n }\n process.exit(1);\n }\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(\n { ok: true, workflowId, updated: body, tags: tagResult?.tagIds ?? null },\n null,\n 2\n )\n );\n return;\n }\n\n const updatedKeys = Object.keys(body);\n if (updatedKeys.length > 0) {\n console.log(`Workflow ${workflowId} updated (${updatedKeys.join(', ')}).`);\n }\n if (tagResult) {\n console.log(`Tags: ${tagResult.tagIds.length} assigned.`);\n }\n}\n\n/* ── Archive / Unarchive Handlers ────────────────────────────────────── */\n\nasync function handleArchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow archive <workflowId> [--yes] [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const skipConfirm = hasFlag(argv, '--yes', '-y');\n\n if (!skipConfirm) {\n if (!process.stdin.isTTY) {\n console.error(\n 'Error: Archiving requires confirmation. Pass --yes (or -y) for non-interactive use.'\n );\n process.exit(1);\n }\n process.stdout.write(\n `Archive workflow ${workflowId}? It will be hidden from lists and skipped by test suites. [y/N] `\n );\n const answer = await new Promise<string>((resolve) => {\n process.stdin.setEncoding('utf-8');\n process.stdin.once('data', (chunk) => resolve(String(chunk).trim().toLowerCase()));\n });\n if (answer !== 'y' && answer !== 'yes') {\n console.error('Aborted.');\n process.exit(1);\n }\n }\n\n type ArchiveResult = { ok: boolean; success?: boolean; archived?: boolean; error?: string };\n const result = await apiRequest<ArchiveResult>(\n apiUrl,\n token,\n 'DELETE',\n `/workflows/${workflowId}`\n );\n\n if (result.error) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n renderWorkflowUserError(result);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.log(\n `Archived workflow ${workflowId}. Use 'canary workflow unarchive ${workflowId}' to restore.`\n );\n }\n}\n\nasync function handleUnarchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow unarchive <workflowId> [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n type UnarchiveResult = { ok: boolean; error?: string };\n const result = await apiRequest<UnarchiveResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/unarchive`,\n {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n renderWorkflowUserError(result);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.log(`Restored workflow ${workflowId}.`);\n }\n}\n\n/* ── Approve / Promote / Pause Handlers ──────────────────────────────── */\n\nconst APPROVAL_GUIDANCE = [\n 'Approving a test asserts that a HUMAN has verified it tests the right thing.',\n '',\n 'If you are an agent running this command on behalf of a user:',\n ' - Describe to the user what this test does and what approval means.',\n ' - Confirm the user has personally verified the test is correct.',\n ' - Only re-run with --yes after the user explicitly confirms.',\n '',\n 'Approval alone does NOT include the test in suites — a flow becomes eligible for',\n 'suite runs once it is approved AND has passed at least once.',\n].join('\\n');\n\nasync function handleApprove(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow approve <workflowId> [--yes] [--json]');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n\n if (!hasFlag(argv, '--yes')) {\n console.error(APPROVAL_GUIDANCE);\n console.error(`\\nRe-run with --yes to approve: canary workflow approve ${workflowId} --yes`);\n process.exit(1);\n }\n\n type ApproveResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; status: string; approvedAt: string | null };\n };\n const result = await apiRequest<ApproveResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/approve`,\n {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n console.log(`Workflow ${workflowId} approved.`);\n console.log(\n `It becomes eligible for suite runs once it has also passed at least once ` +\n `(run it with: canary workflow run ${workflowId}).`\n );\n}\n\n// Promote a flow into suite runs (promotion model / `workflow.eligibility` flag OFF).\n// The CLI can't cheaply resolve the org's flag, so both `promote` and `pause`/`unpause`\n// stay available; the server branches on the org model for pause/unpause.\nasync function handlePromote(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow promote <workflowId> [--force] [--json]');\n process.exit(1);\n }\n\n const force = hasFlag(argv, '--force');\n const jsonOutput = hasFlag(argv, '--json');\n\n type PromoteResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; promotion: string | null };\n };\n const result = await apiRequest<PromoteResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/promote`,\n force ? { force: true } : {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n const hint =\n result.code === 'FLOW_NOT_READY_TO_PROMOTE'\n ? '\\n Trigger a successful run first (canary workflow run <id>), or pass --force.'\n : result.code === 'PROMOTION_REQUIRES_APPROVAL'\n ? `\\n Approve the test first: canary workflow approve ${workflowId} --yes\\n (Approval asserts a human verified the test checks the right thing — it cannot be forced.)`\n : '';\n console.error(`Error: ${result.error}${hint}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n console.log(`Workflow ${workflowId} promoted — it will run when test suites run.`);\n}\n\nasync function handlePauseToggle(\n argv: string[],\n apiUrl: string,\n token: string,\n paused: boolean\n): Promise<void> {\n const action = paused ? 'pause' : 'unpause';\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error(`Usage: canary workflow ${action} <workflowId> [--reason \"...\"] [--json]`);\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const reason = getArgValue(argv, '--reason');\n\n type PauseResult = {\n ok: boolean;\n error?: string;\n code?: string;\n workflow?: { id: string; name: string; paused: boolean };\n };\n const result = await apiRequest<PauseResult>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/${action}`,\n reason ? { reason } : {}\n );\n\n if (result.error) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: true, workflowId, workflow: result.workflow ?? null }, null, 2)\n );\n return;\n }\n if (paused) {\n console.log(`Workflow ${workflowId} paused — excluded from suite runs until unpaused.`);\n } else {\n console.log(`Workflow ${workflowId} unpaused — it runs in suites again once eligible.`);\n }\n}\n\n/* ── Node Patch Handler ──────────────────────────────────────────────── */\n\nfunction getAllArgValues(argv: string[], flag: string): string[] {\n const values: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n values.push(argv[i + 1]!);\n i++;\n }\n }\n return values;\n}\n\nexport async function handleNodePatch(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n const workflowId = positional[0];\n const nodeId = positional[1];\n\n if (!workflowId || !nodeId) {\n console.error('Error: Missing workflow ID and/or node ID.');\n console.error(\n 'Usage: canary workflow node patch <workflowId> <nodeId> --set-input key=value [--config \\'{\"...\"}\\'] [--json]'\n );\n process.exit(1);\n }\n\n const configArg = getArgValue(argv, '--config');\n const setInputArgs = getAllArgValues(argv, '--set-input');\n const jsonOutput = hasFlag(argv, '--json');\n\n if (!configArg && setInputArgs.length === 0) {\n console.error(\n 'Error: No changes specified. Provide --set-input key=value and/or --config \\'{\"...\"}\\''\n );\n process.exit(1);\n }\n\n // Build configJson from flags\n let configJson: Record<string, unknown> = {};\n\n if (configArg) {\n try {\n configJson = JSON.parse(configArg) as Record<string, unknown>;\n } catch (e) {\n console.error(\n `Error: Invalid JSON in --config: ${e instanceof Error ? e.message : String(e)}`\n );\n process.exit(1);\n }\n }\n\n // Fetch current state for before/after diff\n const getRes = await fetchOrExit(`${apiUrl}/workflows/${workflowId}`, {\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n });\n const getResult = (await getRes.json()) as WorkflowDetailResponse;\n if (!getResult.workflow) {\n console.error(`Error: Workflow not found.`);\n process.exit(1);\n }\n\n const existingNode = getResult.workflow.nodes.find((n) => n.id === nodeId);\n if (!existingNode) {\n console.error(`Error: Node ${nodeId} not found in workflow ${workflowId}.`);\n console.error('\\nAvailable nodes:');\n for (const n of topoOrderNodes(getResult.workflow.nodes, getResult.workflow.edges ?? [])) {\n console.error(` ${n.id} [${n.nodeType}] ${getNodeTitle(n)}`);\n }\n process.exit(1);\n }\n\n // The server merges configJson one level deep, so inputValues is replaced\n // wholesale: seed it from the node's current inputs so only named keys change.\n if (configJson.inputValues !== undefined || setInputArgs.length > 0) {\n const inputValues: Record<string, unknown> = {\n ...(existingNode.configJson?.inputValues as Record<string, unknown> | undefined),\n ...(configJson.inputValues as Record<string, unknown> | undefined),\n };\n for (const arg of setInputArgs) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx === -1) {\n console.error(`Error: --set-input must be key=value, got: \"${arg}\"`);\n process.exit(1);\n }\n inputValues[arg.slice(0, eqIdx)] = arg.slice(eqIdx + 1);\n }\n configJson.inputValues = inputValues;\n }\n\n // Apply the patch\n const patchRes = await fetchOrExit(`${apiUrl}/workflows/${workflowId}/nodes/${nodeId}`, {\n method: 'PUT',\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n body: JSON.stringify({ configJson }),\n });\n\n if (!patchRes.ok) {\n const errBody = await patchRes.text();\n if (jsonOutput) {\n console.log(errBody || JSON.stringify({ ok: false, status: patchRes.status }, null, 2));\n } else {\n let rendered: string | null = null;\n try {\n const parsed = JSON.parse(errBody) as Record<string, unknown>;\n rendered = renderWorkflowUserError(parsed);\n } catch {\n rendered = null;\n }\n console.error(rendered ?? `Error (${patchRes.status}): ${errBody.slice(0, 500)}`);\n }\n process.exit(1);\n }\n\n const patchResult = (await patchRes.json()) as { node: PullWorkflow['nodes'][number] };\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: true, node: patchResult.node }, null, 2));\n return;\n }\n\n // Show before/after diff\n const title = getNodeTitle(existingNode);\n console.log(`Updated node [${existingNode.nodeType}] \"${title}\" (${nodeId}):\\n`);\n\n const oldConfig = existingNode.configJson ?? {};\n for (const [key, newVal] of Object.entries(configJson)) {\n if (\n typeof newVal === 'object' &&\n newVal !== null &&\n typeof oldConfig[key] === 'object' &&\n oldConfig[key] !== null\n ) {\n // Diff nested objects (e.g. inputValues)\n const oldObj = oldConfig[key] as Record<string, unknown>;\n const newObj = newVal as Record<string, unknown>;\n for (const [subKey, subVal] of Object.entries(newObj)) {\n const oldVal = oldObj[subKey];\n if (oldVal !== subVal) {\n console.log(\n ` ${key}.${subKey}: ${JSON.stringify(oldVal ?? null)} -> ${JSON.stringify(subVal)}`\n );\n }\n }\n } else {\n const oldVal = oldConfig[key];\n if (oldVal !== newVal) {\n console.log(` ${key}: ${JSON.stringify(oldVal ?? null)} -> ${JSON.stringify(newVal)}`);\n }\n }\n }\n}\n\n/* ── Help & Entry Point ───────────────────────────────────────────────── */\n\nfunction printWorkflowHelp(): void {\n console.log(\n [\n 'Usage: canary workflow <sub-command> [options]',\n '',\n ' Tip: Run \"canary workflow guide\" for the full authoring reference',\n ' (node types, playbooks, macros, seeds, assertions, best practices, visual checkpoints)',\n '',\n 'Sub-commands:',\n ' guide [section] [--json] Authoring guide (node-types, macros, visual-checkpoints, etc.)',\n ' list [options] List workflows',\n ' get <workflowId> [options] Get workflow definition with steps',\n ' create [options] Create workflow from JSON',\n ' sync <workflowId> [options] Replace all nodes (same format as create)',\n ' fork <verb> Create a fork / map fork nodes back to origin',\n ' patch <workflowId> [options] Update workflow properties',\n ' approve <workflowId> [--yes] [--json] Mark the test as human-verified (spec is right)',\n ' promote <workflowId> [--force] [--json] Include the test in suite runs (promotion model; requires approval)',\n ' set-promotion <workflowId> --promote-on merge|never|deploy:<stage> [--target-suite <suite>]... Configure proof promotion (never: archived at merge); target suites replace the current list',\n ' status <workflowId> [--set <status>] Show or change the management status (blocked, paused, …)',\n ' events <workflowId> [--limit <n>] [--json] Audit timeline: status changes + node (de)activations',\n ' revisions <list|get|restore> <workflowId> [number] Immutable definition history',\n ' event ticket <wfId> <eventId> --add|--remove Attach/detach tickets on an event',\n ' pause <workflowId> [--reason \"…\"] [--json] Exclude the test from suite runs (idempotent)',\n ' unpause <workflowId> [--reason \"…\"] [--json] Re-include the test in suite runs (idempotent)',\n ' archive <workflowId> [--yes] [--json] Soft-delete: hide from lists, skip in test suites (reversible)',\n ' unarchive <workflowId> [--json] Restore a previously archived workflow',\n ' run <workflowId> [--cache-only] [options] Trigger a workflow execution (--cache-only waits; --sandbox <id>: on a sandbox you claimed)',\n ' cancel <runId> [--workflow <id>] [--json] Cancel a running workflow run',\n ' api-sequence <verb> <workflowId> Manage the API sequence attached to a workflow',\n ' generate-api-sequence <workflowId> [opts] (deprecated alias for `api-sequence generate`)',\n ' seed <sub-command> Create seed workflows',\n ' node <sub-command> Manage individual nodes',\n ' runs <sub-command> Query workflow run results',\n ' debug <runId|sub-command> Debug a run (overview/steps/cache/thoughts/logs/trace)',\n '',\n 'List options:',\n ' --search <query> Search by name',\n ` --flow-type <type> Filter: ${WORKFLOW_FLOW_TYPES.join(', ')}`,\n ' --status <status> Filter: draft, approved',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 25)',\n ' --json Output raw JSON',\n '',\n 'Get options:',\n ' --format json|markdown|spec Output format (default: json)',\n ' --json Shorthand for --format json',\n ` --markdown Shorthand for editable ${specExtension} spec output`,\n ' --output <file> Write output to file',\n '',\n 'Create options:',\n ' --from-stdin Read workflow JSON from stdin (default)',\n ' --from-file <path> Read workflow JSON from file',\n ' --api-only Create an API-only workflow with a backing ApiSequence',\n ' Requires: --name <name>, and',\n ' --sequence-from-file <path> or --sequence-from-stdin',\n ' Optional: --credential <id>, --guidance <text>',\n ' Input shape: { steps, description?, stopOnFailure?, exports? }',\n ' Returns: { workflowId, apiSequenceId, nodeId }',\n ' --tags <names> Comma-separated tag names to assign (names, not IDs)',\n ' --tag-id <ids> Comma-separated raw tag IDs (escape hatch)',\n '',\n ' Input: { name, nodes: [{ nodeType, configJson }] }',\n ' Run \"canary workflow guide node-types\" for available node types.',\n ' Run \"canary workflow guide macros\" for dynamic test data ($EMAIL(), $RANDOM_STRING(6), etc.)',\n '',\n 'Sync options:',\n ' --from-file <path> Read nodes JSON from file',\n ' --from-stdin Read nodes JSON from stdin',\n ' --no-snapshot Skip creating a draft snapshot before sync',\n ' --propose Create a proposal instead of applying directly',\n ' --title <title> Proposal title (with --propose)',\n ' --description <desc> Proposal description (with --propose)',\n ' --json Output raw JSON',\n '',\n ' Sync accepts the same minimal node format as create.',\n ' Edges, IDs, positions, and ordering are auto-generated when omitted.',\n ' Input: { nodes: [{ nodeType, configJson }] }',\n '',\n ' When using --propose on an existing workflow, run `canary workflow get',\n \" <id>` first and reuse each node's existing `id` for steps you intend\",\n ' to keep. Only omit `id` for genuinely new steps. Without ID reuse the',\n ' proposal will diff as a full remove-everything/add-everything rewrite.',\n '',\n 'Patch options:',\n ' --name <name> Update workflow name',\n ' --description <text|@file> Update description: the spirit of the test, in one or two sentences',\n ' --preflight <text|@file> Update preflight: what the test depends on (data, flags, third parties; \"\" clears)',\n \" --cleanup <text|@file> Update cleanup: how the test's side effects get reset (\\\"\\\" clears)\",\n ' --status <status> Set status (approval axis). Valid:',\n ' draft — not yet approved',\n ' approved — a human verified the test checks the right thing',\n ' (suite inclusion is derived eligibility — approved AND',\n ' passed at least once — with a separate pause/unpause toggle;',\n ' reliability is tracked automatically by health)',\n ` --flow-type <type> Set type: ${WORKFLOW_FLOW_TYPES.join(', ')}`,\n ' --viewport <preset|default> Save a viewport for ordinary runs and suites; default inherits the organization setting',\n ' --seed-outputs-json <json> Replace seedOutputsJson (array) — seed flows only',\n ' --seed-outputs-file <path> Replace seedOutputsJson from a JSON file',\n ' --teardown-enabled <true|false> Run the paired teardown after each consuming flow — seed flows only',\n ' --tags <names> Replace tags with these names (comma-separated)',\n ' --tags-add <names> Add these tag names to the existing set',\n ' --tags-remove <names> Remove these tag names from the existing set',\n ' --tag-id <ids> Raw tag IDs (comma-separated)',\n ' --json Output raw JSON',\n '',\n 'Approve options:',\n ' --yes Confirm approval (required non-interactively)',\n ' --json Output raw JSON',\n '',\n ' Approval asserts a human verified the test checks the right thing.',\n ' Agents: describe the test to the user and confirm they personally',\n ' verified it before re-running with --yes.',\n '',\n 'Promote options (promotion model):',\n ' --force Promote without requiring a successful run (skips the',\n ' run gate; the approval gate can never be forced)',\n ' --json Output raw JSON',\n '',\n ' Promote includes the test in suite runs on the legacy promotion model.',\n ' Requires the test to be approved, and (without --force) a passing run.',\n '',\n 'Status options (management status — the manual lifecycle axis):',\n ' --set <status> Transition to: active, paused, blocked,',\n ' under_construction, deprecated',\n ' --reason <text|@file> Auditable reason recorded on the change event',\n ' --ticket <iss_…|url> Attach a ticket to the event (repeatable) —',\n ' an internal issue id or an external Linear/Jira URL',\n ' --json Output raw JSON',\n '',\n ' Distinct from approval (`patch --status`) and computed health. Any',\n ' non-active status excludes the flow from suite runs. Every change is',\n ' recorded as a workflow event (who/when/why) shown in the Comments tab',\n ' and via `workflow events`. Without --set, prints all three axes.',\n '',\n 'Pause / unpause options:',\n ' --reason <text> Auditable reason recorded on the change event',\n ' --json Output raw JSON',\n '',\n ' On the eligibility model, a flow is eligible for suite runs once it is',\n ' approved AND has passed at least once — no explicit promote step. Pause',\n ' excludes a flow from suite runs; unpause re-includes it. Both are',\n ' idempotent (equivalent to `status --set paused|active`). Suites always',\n ' execute the live definition — edits take effect immediately.',\n '',\n 'Run options:',\n ' --viewport <preset> Override the saved workflow viewport for this run only',\n ' --environment <name|id> Run against this environment of the workflow\\'s application (e.g. a sandbox environment)',\n ' --cache-only Replay workflow actions only and wait for completion; authentication may use AI login',\n ' --stream Follow execution until completion',\n ' --json Output raw JSON',\n '',\n 'API Sequence sub-commands:',\n ' api-sequence get <wf> Show config + steps',\n ' api-sequence update <wf> --from-file <f> Replace config',\n ' api-sequence execute <wf> Run the sequence',\n ' api-sequence delete <wf> Delete the sequence',\n ' api-sequence set-api-only <wf> [--off] Toggle workflow apiOnly flag',\n ' api-sequence generate <wf> [--prompt ...] AI-generate a config (streams)',\n '',\n ' Run \"canary workflow guide api-sequences\" for step shape and template syntax.',\n '',\n 'Seed sub-commands:',\n ' seed create [options] Create a seed workflow with outputs',\n '',\n 'Seed create options:',\n ' --name <name> Seed workflow name (required unless JSON input)',\n ' --description <desc> Description',\n ' --output <key:name[:desc]> Declare an output (repeatable)',\n ' --outputs-json <json> Full outputs array as inline JSON',\n ' --from-stdin Read full config from stdin',\n ' --from-file <path> Read full config from file',\n ' --no-teardown Skip creating paired teardown workflow',\n ' --status <status> Initial status (default: draft)',\n ' --json Output raw JSON',\n '',\n 'Node sub-commands:',\n \" node patch <workflowId> <nodeId> [options] Update a node's config\",\n ' node deactivate <wfId> <nodeId> [--reason \"…\"] Skip this node during runs (audited event)',\n ' node activate <wfId> <nodeId> [--reason \"…\"] Re-enable a deactivated node (audited event)',\n '',\n 'Node patch options:',\n ' --set-input key=value Set an inputValue (repeatable)',\n ' --config \\'{\"...\"}\\' Merge arbitrary configJson (partial update)',\n ' --json Output raw JSON',\n '',\n 'Runs sub-commands:',\n ' runs list <workflowId> List runs for a workflow',\n ' runs get <workflowId> <runId> Get run detail with steps',\n ' runs diagnostics <workflowId> <runId> Get failure diagnostic',\n '',\n 'Cache sub-commands:',\n ' cache status <workflowId> Show per-node cache version, health, recent failures',\n ' cache clear <workflowId> [--node <id>] [--below-version <n>] [--stale-only] [--mode all]',\n ' Targeted cache invalidation (rows kept, isValid=false)',\n ' cache clear <workflowId> --mode hard --yes DESTRUCTIVE: delete cache rows, strip playbookSteps,',\n ' null lastRunId. Same as the UI \"Reset flow\" button',\n ' cache optimize <workflowId> [--run <runId>] Enqueue the async cache-optimizer job',\n ' cache optimize-dry --run <runId> [--workflow <id>] Run local deterministic optimizer dry-run',\n ' cache convergence-report <convergenceRunId> [--out <f>] Markdown review doc for a cache-convergence run',\n ' cache convergence-resolve <convergenceRunId> [--reason <t>] Drop a run parked awaiting review (does not merge the fork)',\n '',\n 'Feedback sub-commands:',\n ' feedback list --workflow <id> Show pending + answered/canceled feedback requests',\n ' feedback answer <requestId> --workflow <id> Answer a parked maintenance run\\'s question',\n ' --answer intentional|bug --explanation \"<text>\" (resumes the convergence run)',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\nexport async function runWorkflow(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help') {\n printWorkflowHelp();\n return;\n }\n\n if (subCommand === 'debug' && hasFlag(rest, '--help', '-h')) {\n const { handleWorkflowDebug } = await import('./workflow-debug.js');\n await handleWorkflowDebug(rest, '', '');\n return;\n }\n\n if (hasFlag(argv, '--help', '-h')) {\n printWorkflowHelp();\n return;\n }\n\n if (subCommand === 'guide') {\n await printServedGuide('workflow', rest);\n return;\n }\n\n if (subCommand === 'set-promotion') {\n const { apiUrl, token } = await resolveConfig(argv);\n const { handleWorkflowPromotion } = await import('./workflow-promotion.js');\n await handleWorkflowPromotion(rest, apiUrl, token);\n return;\n }\n\n const { apiUrl, token, appSubdomain } = await resolveConfig(argv);\n\n switch (subCommand) {\n case 'list':\n await handleWorkflowList(rest, apiUrl, token);\n break;\n case 'get':\n await handleWorkflowGet(rest, apiUrl, token, appSubdomain);\n break;\n case 'create':\n await handleWorkflowCreate(rest, apiUrl, token, appSubdomain);\n break;\n case 'patch':\n await handlePatch(rest, apiUrl, token);\n break;\n case 'approve':\n await handleApprove(rest, apiUrl, token);\n break;\n case 'promote':\n await handlePromote(rest, apiUrl, token);\n break;\n case 'pause':\n await handlePauseToggle(rest, apiUrl, token, true);\n break;\n case 'unpause':\n await handlePauseToggle(rest, apiUrl, token, false);\n break;\n case 'archive':\n await handleArchive(rest, apiUrl, token);\n break;\n case 'unarchive':\n await handleUnarchive(rest, apiUrl, token);\n break;\n case 'cancel':\n await handleWorkflowCancel(rest, apiUrl, token);\n break;\n case 'run':\n await handleWorkflowRun(rest, apiUrl, token, appSubdomain);\n break;\n case 'runs':\n await runWorkflowRuns(rest, apiUrl, token);\n break;\n case 'status': {\n const { handleWorkflowStatus } = await import('./workflow-status.js');\n await handleWorkflowStatus(rest, apiUrl, token);\n break;\n }\n case 'events': {\n const { handleWorkflowEvents } = await import('./workflow-status.js');\n await handleWorkflowEvents(rest, apiUrl, token);\n break;\n }\n case 'revisions': {\n const { handleWorkflowRevisions } = await import('./workflow-revisions.js');\n await handleWorkflowRevisions(rest, apiUrl, token);\n break;\n }\n case 'event': {\n const [eventSub, ...eventRest] = rest;\n if (eventSub === 'ticket') {\n const { handleWorkflowEventTicket } = await import('./workflow-status.js');\n await handleWorkflowEventTicket(eventRest, apiUrl, token);\n } else {\n console.error(`Unknown event sub-command: ${eventSub ?? '(none)'}`);\n printWorkflowHelp();\n process.exit(1);\n }\n break;\n }\n case 'node': {\n const [nodeSub, ...nodeRest] = rest;\n if (nodeSub === 'patch') {\n await handleNodePatch(nodeRest, apiUrl, token);\n } else if (nodeSub === 'deactivate' || nodeSub === 'activate') {\n // Audited toggle: hits the dedicated endpoint, which patches\n // configJson.deactivated AND records a workflow event with actor +\n // --reason. A deactivated node is skipped during runs (step status\n // `skipped`), letting you converge a flow node-by-node from the front.\n const { handleNodeDeactivateToggle } = await import('./workflow-status.js');\n await handleNodeDeactivateToggle(nodeRest, apiUrl, token, nodeSub === 'deactivate');\n } else {\n console.error(`Unknown node sub-command: ${nodeSub ?? '(none)'}`);\n printWorkflowHelp();\n process.exit(1);\n }\n break;\n }\n case 'seed': {\n const [seedSub, ...seedRest] = rest;\n if (seedSub === 'create') {\n await handleWorkflowSeedCreate(seedRest, apiUrl, token, appSubdomain);\n } else {\n console.error(`Unknown seed sub-command: ${seedSub ?? '(none)'}`);\n printWorkflowHelp();\n process.exit(1);\n }\n break;\n }\n case 'sync':\n await handleWorkflowSync(rest, apiUrl, token);\n break;\n case 'fork': {\n const { handleWorkflowFork } = await import('./workflow-fork.js');\n await handleWorkflowFork(rest, apiUrl, token);\n break;\n }\n case 'proposals': {\n const { handleWorkflowProposals } = await import('./workflow-proposals.js');\n await handleWorkflowProposals(rest, apiUrl, token);\n break;\n }\n case 'generate-api-sequence':\n // Deprecated alias — forwards to `api-sequence generate`.\n await handleWorkflowGenerateApiSequence(rest, apiUrl, token);\n break;\n case 'api-sequence':\n await handleWorkflowApiSequence(rest, apiUrl, token);\n break;\n case 'cache': {\n const { handleWorkflowCache } = await import('./workflow-cache.js');\n await handleWorkflowCache(rest, apiUrl, token);\n break;\n }\n case 'debug': {\n const { handleWorkflowDebug } = await import('./workflow-debug.js');\n await handleWorkflowDebug(rest, apiUrl, token);\n break;\n }\n case 'feedback': {\n const { handleWorkflowFeedback } = await import('./workflow-feedback.js');\n await handleWorkflowFeedback(rest, apiUrl, token);\n break;\n }\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printWorkflowHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI Workflow Creation\n *\n * Creates a workflow with nodes and edges atomically via the API.\n * Supports reading workflow JSON from stdin or file.\n *\n * @module workflow-create\n */\n\nimport fs from \"node:fs/promises\";\nimport process from \"node:process\";\nimport type { WorkflowFlowType } from \"@chatsdet/types\";\nimport { getArgValue, hasFlag, resolveOrgAppUrl } from \"./auth.js\";\nimport { renderWorkflowUserError, type CredentialListItem } from \"./cli-helpers.js\";\nimport { fetchOrExit } from \"./api-fetch.js\";\nimport { applyWorkflowTagFlags } from \"./tag.js\";\nimport { normalizeNodeType, NODE_TYPE_LABEL } from \"@chatsdet/types\";\nimport type { BrowserViewportPreset } from '@chatsdet/types';\nimport { writeRawOutput } from './brand.js';\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\ntype WorkflowNodeInput = {\n nodeType: string;\n configJson?: Record<string, unknown>;\n};\n\ntype WorkflowCreateInput = {\n name: string;\n description?: string;\n status?: \"draft\" | \"approved\";\n flowType?: WorkflowFlowType;\n createdVia?: string;\n propertyId?: string;\n credentialId?: string;\n viewportSize?: BrowserViewportPreset | null;\n nodes: WorkflowNodeInput[];\n};\n\ntype CreateResponse = {\n ok: boolean;\n error?: string;\n /** Set on structured user errors (e.g. WORKFLOW_VALIDATION_FAILED). */\n code?: string;\n /** Per-node validation issues, surfaced via renderWorkflowUserError. */\n issues?: unknown[];\n warnings?: string[];\n workflow?: {\n id: string;\n name: string;\n status: string;\n flowType: string;\n createdVia: string | null;\n };\n nodes?: Array<{ id: string; nodeType: string; orderIndex: number }>;\n edges?: Array<{ id: string; sourceNodeId: string; targetNodeId: string }>;\n};\n\n/* ── Input Reading ───────────────────────────────────────────────────── */\n\nasync function readFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n const stdin = process.stdin;\n\n if (stdin.isTTY) {\n throw new Error(\"No input on stdin. Pipe workflow JSON or use --from-file.\");\n }\n\n return new Promise((resolve, reject) => {\n stdin.on(\"data\", (chunk) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n stdin.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n stdin.on(\"error\", reject);\n });\n}\n\nasync function readWorkflowInput(argv: string[]): Promise<WorkflowCreateInput> {\n let raw: string;\n\n const fromFile = getArgValue(argv, \"--from-file\");\n if (fromFile) {\n try {\n raw = await fs.readFile(fromFile, \"utf-8\");\n } catch (err) {\n throw new Error(`Failed to read file ${fromFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalid JSON input. Please provide valid workflow JSON.\");\n }\n\n const input = parsed as WorkflowCreateInput;\n\n if (!input.name || typeof input.name !== \"string\") {\n throw new Error('Workflow JSON must include a \"name\" string field.');\n }\n\n if (!Array.isArray(input.nodes) || input.nodes.length === 0) {\n throw new Error('Workflow JSON must include a non-empty \"nodes\" array.');\n }\n\n // Source the allowlist from the canonical node-type set so it never drifts\n // from the server enum (`workflowNodeTypeEnum`). NODE_TYPE_LABEL's keys are\n // that set — including sandbox_action, audio, audio-assertion, and visual_checkpoint.\n const validNodeTypes = Object.keys(NODE_TYPE_LABEL);\n for (const node of input.nodes) {\n // Accept \"acting-as\" as an alias for \"login\" — keep persisted type canonical.\n if (typeof node.nodeType === \"string\") {\n node.nodeType = normalizeNodeType(node.nodeType);\n }\n if (!node.nodeType || !validNodeTypes.includes(node.nodeType)) {\n throw new Error(\n `Invalid nodeType \"${node.nodeType}\". Valid types: ${validNodeTypes.join(\", \")}`\n );\n }\n }\n\n return input;\n}\n\n/* ── Credential Resolution ──────────────────────────────────────────── */\n\nasync function fetchOrgCredentials(\n apiUrl: string,\n token: string\n): Promise<CredentialListItem[]> {\n const res = await fetch(`${apiUrl}/org/credentials`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { ok: boolean; items: CredentialListItem[] };\n return (data.items ?? []).filter((c) => !c.isEphemeral);\n}\n\n/**\n * Resolve a credential for login nodes that are missing credentialId.\n * Resolution order:\n * 1. Match by credentialName, when given; a name that matches nothing is an\n * error, never another credential (a login node must sign in as who it names)\n * 2. Pick the default credential (isDefault: true)\n * 3. Pick the only non-local credential (if exactly one)\n * 4. Error with available credentials listed so the caller can retry\n */\nasync function resolveCredential(\n apiUrl: string,\n token: string,\n credentialName?: string\n): Promise<{ credentialId: string; credentialName: string; propertyId?: string }> {\n const credentials = await fetchOrgCredentials(apiUrl, token);\n\n if (credentials.length === 0) {\n throw new Error(\n \"No credentials found for this organization. Create one in the web app first.\"\n );\n }\n\n // 1. Match by name if provided\n if (credentialName) {\n const match = credentials.find(\n (c) => c.name.toLowerCase() === credentialName.toLowerCase()\n );\n if (match) {\n const isLocal = /\\blocal\\b/i.test(match.name);\n if (isLocal) {\n console.warn(\n `Warning: Credential \"${match.name}\" appears to be local-only. ` +\n `The workflow may fail in deployed environments. Consider using a non-local credential.`\n );\n }\n return { credentialId: match.id, credentialName: match.name, propertyId: match.propertyId };\n }\n throw new Error(\n `No credential is named \"${credentialName}\". Set the login node's credentialId, ` +\n `or credentialSource \"from_template\" with credentialTemplateId for a persona.\\n\\n` +\n `Available credentials:\\n${credentialLines(credentials)}`\n );\n }\n\n // 2. Pick the default credential\n const defaults = credentials.filter((c) => c.isDefault);\n if (defaults.length === 1) {\n console.log(`Auto-selected default credential: ${defaults[0].name} (${defaults[0].id})`);\n return { credentialId: defaults[0].id, credentialName: defaults[0].name, propertyId: defaults[0].propertyId };\n }\n\n // 3. Pick the only non-local credential\n const nonLocal = credentials.filter((c) => !/\\blocal\\b/i.test(c.name));\n if (nonLocal.length === 1) {\n console.log(`Auto-selected credential: ${nonLocal[0].name} (${nonLocal[0].id})`);\n return { credentialId: nonLocal[0].id, credentialName: nonLocal[0].name, propertyId: nonLocal[0].propertyId };\n }\n\n // 4. Ambiguous — list credentials and error\n throw new Error(\n `Cannot auto-resolve credential. Specify credentialId in the login node configJson.\\n\\n` +\n `Available credentials:\\n${credentialLines(credentials)}`\n );\n}\n\nfunction credentialLines(credentials: CredentialListItem[]): string {\n return credentials\n .map((c) => ` ${c.id} ${c.name}${c.isDefault ? \" (default)\" : \"\"}${c.propertyName ? ` — ${c.propertyName}` : \"\"}`)\n .join(\"\\n\");\n}\n\n/* ── API-only workflow branch ────────────────────────────────────────── */\n\ntype ApiSequenceConfig = {\n steps: unknown[];\n description?: string;\n stopOnFailure?: boolean;\n exports?: unknown[];\n};\n\nasync function readApiSequenceConfig(argv: string[]): Promise<ApiSequenceConfig> {\n const fromFile = getArgValue(argv, \"--sequence-from-file\");\n const fromStdin = hasFlag(argv, \"--sequence-from-stdin\");\n\n if (!fromFile && !fromStdin) {\n throw new Error(\n \"--api-only needs a sequence with at least one step: pass --sequence-from-file <path> or --sequence-from-stdin.\"\n );\n }\n\n let raw: string;\n if (fromFile) {\n raw = await fs.readFile(fromFile, \"utf-8\");\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalid JSON for sequence config.\");\n }\n\n const cfg = parsed as ApiSequenceConfig;\n if (!cfg || !Array.isArray(cfg.steps)) {\n throw new Error('Sequence config must be { \"steps\": [...] }.');\n }\n return cfg;\n}\n\nasync function handleApiOnlyCreate(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain?: string | null\n): Promise<void> {\n const name = getArgValue(argv, \"--name\");\n if (!name) {\n console.error('Error: --api-only requires --name <workflow name>.');\n process.exit(1);\n }\n\n const credentialId = getArgValue(argv, \"--credential\");\n const guidance = getArgValue(argv, \"--guidance\");\n\n let config: ApiSequenceConfig;\n try {\n config = await readApiSequenceConfig(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { name, config };\n if (credentialId) body.credentialId = credentialId;\n if (guidance) body.guidancePrompt = guidance;\n\n const res = await fetchOrExit(`${apiUrl}/api-sequences/create-with-workflow`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n token,\n body: JSON.stringify(body),\n });\n\n const raw = (await res.json().catch(() => ({}))) as {\n ok: boolean;\n error?: string;\n code?: string;\n issues?: Array<{ path: string; code: string; message: string; hint?: string }>;\n data?: { workflowId: string; apiSequenceId: string; nodeId?: string };\n };\n\n if (!res.ok || !raw.ok || !raw.data) {\n const jsonOutput = hasFlag(argv, \"--json\") || !process.stdout.isTTY;\n if (raw.code === 'API_SEQUENCE_INVALID' && Array.isArray(raw.issues)) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(\n {\n ok: false,\n error: raw.error ?? 'API sequence configuration is invalid',\n code: 'API_SEQUENCE_INVALID',\n issueCount: raw.issues.length,\n issues: raw.issues,\n },\n null,\n 2,\n ),\n );\n } else {\n console.error(`Error: ${raw.error ?? 'API sequence configuration is invalid'}`);\n console.error(`Found ${raw.issues.length} issue${raw.issues.length === 1 ? '' : 's'}:`);\n console.error('');\n for (const issue of raw.issues) {\n console.error(` ${issue.path || '(root)'} [${issue.code}] :: ${issue.message}`);\n if (issue.hint) console.error(` hint: ${issue.hint}`);\n }\n }\n process.exit(1);\n }\n console.error(`Error: ${raw.error ?? `${res.status} ${res.statusText}`}`);\n process.exit(1);\n }\n\n if (hasFlag(argv, \"--json\") || !process.stdout.isTTY) {\n writeRawOutput(JSON.stringify({ ok: true, data: raw.data }, null, 2));\n return;\n }\n\n const appUrl = resolveOrgAppUrl(apiUrl, appSubdomain);\n console.log(`\\n\\u2713 API-only workflow created: ${name}`);\n console.log(` Workflow ID: ${raw.data.workflowId}`);\n console.log(` API Sequence ID: ${raw.data.apiSequenceId}`);\n if (raw.data.nodeId) console.log(` Node ID: ${raw.data.nodeId}`);\n console.log(` Steps: ${config.steps.length}`);\n console.log(` URL: ${appUrl}/flows/${raw.data.workflowId}`);\n console.log(`\\n Next:`);\n console.log(` canary workflow api-sequence get ${raw.data.workflowId}`);\n console.log(` canary workflow api-sequence update ${raw.data.workflowId} --from-file seq.json`);\n console.log(` canary workflow api-sequence execute ${raw.data.workflowId}`);\n}\n\n/* ── Main Handler ────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowCreate(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain?: string | null\n): Promise<void> {\n if (hasFlag(argv, \"--api-only\")) {\n await handleApiOnlyCreate(argv, apiUrl, token, appSubdomain);\n return;\n }\n\n // Auto-publish was removed with the approval/eligibility lifecycle split:\n // a human approves, and a flow becomes eligible for suites once it has also\n // passed at least once (no explicit promote step).\n if (hasFlag(argv, \"--run-and-publish\")) {\n console.error(\n \"Error: --run-and-publish was removed. Run the test (canary workflow run <id>) and\\n\" +\n \"approve it (canary workflow approve <id> --yes); it becomes eligible for suites once it has passed.\"\n );\n process.exit(1);\n }\n\n // 1. Read and validate input\n let input: WorkflowCreateInput;\n try {\n input = await readWorkflowInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // 2. Resolve credentials for login nodes missing credentialId\n const loginNodes = input.nodes.filter((n) => n.nodeType === \"login\");\n for (const loginNode of loginNodes) {\n const config = loginNode.configJson ?? {};\n // Only a static login names a stored credential; a persona (from_template),\n // a seed's credential or a credential input resolves at run time. Mirrors\n // the server's `needsStaticCredentialResolution` (workflow-node-name-resolution.ts).\n const resolvesAtRunTime =\n config.credentialSource === \"from_template\" ||\n config.credentialSource === \"from_seed\" ||\n Boolean(config.credentialTemplateId || config.credentialInputName || config.seedCredentialRef);\n if (!resolvesAtRunTime && config.performLogin !== false && !config.credentialId && !input.credentialId) {\n try {\n const resolved = await resolveCredential(\n apiUrl,\n token,\n config.credentialName as string | undefined\n );\n config.credentialId = resolved.credentialId;\n config.credentialName = resolved.credentialName;\n loginNode.configJson = config;\n if (resolved.propertyId && !input.propertyId) {\n input.propertyId = resolved.propertyId;\n }\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n }\n\n // All flows start as drafts — approval is an explicit follow-up step\n // (canary workflow approve). A flow becomes eligible for suites once it is\n // approved AND has passed at least once. Reliability is tracked separately\n // by the workflow's `health` (starts at `unverified`).\n input.createdVia = \"cli\";\n\n // 4. Create workflow via API\n const res = await fetchOrExit(`${apiUrl}/workflows/create-with-nodes`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n token,\n body: JSON.stringify(input),\n });\n\n const result = (await res.json()) as CreateResponse;\n\n if (!result.ok || !result.workflow) {\n // Surface per-node validation detail (WORKFLOW_VALIDATION_FAILED carries an\n // `issues` array) instead of the bare catalog message. Same renderer the\n // `workflow run` path uses.\n const rendered = renderWorkflowUserError(result as unknown as Record<string, unknown>);\n console.error(rendered ?? `Error: ${result.error ?? \"Failed to create workflow\"}`);\n process.exit(1);\n }\n\n const { workflow, nodes, edges } = result;\n\n const { warnings } = result;\n\n console.log(`\\n\\u2713 Workflow created: ${workflow.name}`);\n console.log(` ID: ${workflow.id}`);\n console.log(` Status: ${workflow.status}`);\n console.log(` Nodes: ${nodes?.length ?? 0}`);\n console.log(` Edges: ${edges?.length ?? 0}`);\n\n if (warnings && warnings.length > 0) {\n console.log(`\\n Warnings:`);\n for (const w of warnings) {\n console.log(` \\u26A0 ${w}`);\n }\n }\n\n const appUrl = resolveOrgAppUrl(apiUrl, appSubdomain);\n console.log(` URL: ${appUrl}/flows/${workflow.id}`);\n\n // 5. Apply --tags / --tag-id if provided.\n try {\n const tagResult = await applyWorkflowTagFlags({\n apiUrl,\n token,\n argv,\n workflowId: workflow.id,\n });\n if (tagResult) {\n console.log(` Tags: ${tagResult.tagIds.length} assigned`);\n }\n } catch (err) {\n console.error(`\\nError applying tags:\\n${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n console.log(\n `\\n Next: run it (canary workflow run ${workflow.id}) and approve it ` +\n `(canary workflow approve ${workflow.id} --yes). Once approved and passing, ` +\n `it becomes eligible for suite runs.`\n );\n}\n","import fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag, resolveOrgAppUrl } from './auth.js';\nimport { apiFetch, exitOnFailure } from './api-fetch.js';\nimport { writeRawOutput } from './brand.js';\nimport {\n formatWorkflowJson,\n formatWorkflowMarkdown,\n type WorkflowDetailResponse,\n} from './workflow-format.js';\n\n/**\n * Whether `workflow get` should append the human-readable `URL: …` trailer.\n *\n * The trailer is a courtesy for a human at a terminal running the bare\n * `workflow get <id>` (which defaults to pretty JSON). It must NOT be emitted\n * for any explicitly requested machine/file format — `--json` / `--format json`\n * or the markdown/spec formats — because the trailing non-JSON line breaks\n * downstream parsers piping stdout.\n */\nexport function shouldPrintWorkflowUrlTrailer(argv: string[]): boolean {\n const jsonOutput = hasFlag(argv, '--json') || getArgValue(argv, '--format') === 'json';\n const markdownOutput =\n hasFlag(argv, '--markdown') ||\n getArgValue(argv, '--format') === 'markdown' ||\n getArgValue(argv, '--format') === 'spec';\n return !jsonOutput && !markdownOutput;\n}\n\nexport async function handleWorkflowGet(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain?: string | null\n): Promise<void> {\n const workflowId = argv[0];\n if (!workflowId || workflowId.startsWith('--')) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow get <workflowId>');\n process.exit(1);\n }\n\n const markdownOutput =\n hasFlag(argv, '--markdown') ||\n getArgValue(argv, '--format') === 'markdown' ||\n getArgValue(argv, '--format') === 'spec';\n const outputFile = getArgValue(argv, '--output');\n\n const apiRes = await apiFetch(`${apiUrl}/workflows/${workflowId}`, {\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n token,\n });\n if (!apiRes.ok) exitOnFailure(apiRes.failure);\n const result = (await apiRes.response.json()) as WorkflowDetailResponse;\n\n if (result.error === 'WORKFLOW_NOT_FOUND') {\n console.error('Error: Workflow not found.');\n process.exit(1);\n }\n if (result.error === 'WORKFLOW_WRONG_ORG') {\n console.error(\n `Error: Workflow belongs to another org: ${result.targetOrgName ?? result.targetOrgId}`\n );\n process.exit(1);\n }\n if (!result.workflow) {\n console.error(`Error: ${result.error ?? 'Unexpected response'}`);\n process.exit(1);\n }\n\n const workflow = result.workflow;\n let output: string;\n\n if (markdownOutput) {\n output = formatWorkflowMarkdown(workflow);\n } else {\n // Default to JSON for agent-friendly output\n output = JSON.stringify(formatWorkflowJson(workflow), null, 2);\n }\n\n if (outputFile) {\n try {\n await fs.writeFile(outputFile, output, 'utf-8');\n console.log(`Written to ${outputFile}`);\n } catch (err) {\n console.error(\n `Error writing to ${outputFile}: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n return;\n }\n\n writeRawOutput(output);\n\n if (shouldPrintWorkflowUrlTrailer(argv)) {\n const appUrl = resolveOrgAppUrl(apiUrl, appSubdomain);\n console.log(`\\nURL: ${appUrl}/flows/${workflowId}`);\n }\n}\n","import { NODE_TYPE_LABEL } from '@chatsdet/types';\nimport { workflowToSpec, type PullWorkflow } from '@chatsdet/canary-spec';\nimport { topoOrderNodes } from '@chatsdet/workflow-diff';\n\ntype SeedOutput = {\n dataKey: string;\n name: string;\n description?: string;\n displayLabel: string;\n propertyId: string;\n attributes?: Record<string, unknown>;\n credentialOutput?: Record<string, unknown>;\n};\n\nexport type WorkflowSummary = PullWorkflow & {\n seedOutputsJson?: SeedOutput[] | null;\n};\n\nexport type WorkflowDetailResponse = {\n ok?: boolean;\n error?: string;\n workflow?: WorkflowSummary;\n targetOrgId?: string;\n targetOrgName?: string;\n};\n\n/** Environment fields the workflow-detail payload carries for `workflow get`. */\ntype WorkflowEnvFields = {\n viewportSize?: import('@chatsdet/types').BrowserViewportPreset | null;\n defaultEnvironmentId?: string | null;\n environments?: Array<{ id: string; name: string; type: string; isDefault: boolean }>;\n eligibleEnvironmentIds?: string[];\n passByEnvironment?: Array<{\n environmentId: string;\n environmentName: string;\n environmentType: string;\n everPassed: boolean;\n passed: number;\n total: number;\n health: string;\n }>;\n};\n\nexport function truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 1) + '…';\n}\n\nexport function getNodeTitle(node: PullWorkflow['nodes'][number]): string {\n const c = node.configJson ?? {};\n switch (node.nodeType) {\n case 'login':\n return (c.credentialName as string) || NODE_TYPE_LABEL.login;\n case 'navigate':\n return (c.pageTitle as string) || truncate((c.pageUrl as string) || 'Navigate', 40);\n case 'action':\n return (\n (c.customActionTitle as string) || truncate((c.actionDescription as string) || 'Action', 50)\n );\n case 'assertion':\n return truncate((c.condition as string) || 'Assertion', 50);\n case 'setup':\n return (c.setupFlowName as string) || 'Setup';\n case 'seed':\n return (c.seedWorkflowName as string) || 'Seed';\n case 'wait':\n return 'Wait';\n case 'condition':\n return truncate((c.conditionDescription as string) || 'Condition', 50);\n case 'visual_checkpoint':\n return truncate((c.name as string) || NODE_TYPE_LABEL.visual_checkpoint, 50);\n case 'end':\n return 'End';\n case 'api_sequence':\n return 'API Sequence';\n default:\n return node.nodeType;\n }\n}\n\nfunction getCleanConfig(node: PullWorkflow['nodes'][number]): Record<string, unknown> {\n const c = node.configJson ?? {};\n switch (node.nodeType) {\n case 'login':\n // Keep the credential wiring metadata, not secrets. Passwords/tokens live\n // on credential records, never in configJson.\n return pick(c, [\n 'credentialName',\n 'performLogin',\n 'credentialSource',\n 'credentialTemplateId',\n 'credentialTemplateName',\n 'credentialId',\n 'seedCredentialRef',\n ]);\n case 'navigate':\n return {\n ...pick(c, ['pageUrl', 'pageTitle']),\n ...(c.openInNewTab ? { openInNewTab: true } : {}),\n };\n case 'action':\n return pick(c, [\n 'actionDescription',\n 'playbookSteps',\n 'inputValues',\n 'declaredOutputs',\n 'capturedVariableKeys',\n 'dataRequirements',\n 'inlineAssertions',\n 'alwaysUseAgent',\n ]);\n case 'assertion':\n // Mirrors what the markdown spec shows. Legacy `strict: true` means\n // severity 'fail' and an unset severity reads as 'warn' (canary-spec\n // authored-fields), so JSON reports the same value markdown does.\n return {\n ...pick(c, ['condition', 'description', 'expectedOutcome', 'strict', 'alwaysUseAgent']),\n severity: c.severity ?? (c.strict === true ? 'fail' : 'warn'),\n };\n case 'setup':\n return pick(c, ['setupFlowId', 'setupFlowName']);\n case 'seed':\n return pick(c, ['seedWorkflowId', 'seedWorkflowName', 'snapshotVersion']);\n case 'end':\n return pick(c, ['outcome']);\n case 'wait':\n case 'condition':\n case 'api_sequence':\n return c;\n default:\n return c;\n }\n}\n\nfunction pick(obj: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (obj[key] !== undefined && obj[key] !== null) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\nexport function formatWorkflowMarkdown(workflow: WorkflowSummary): string {\n const seedOutputs = workflow.seedOutputsJson ?? workflow.seedOutputs;\n return workflowToSpec({ ...workflow, seedOutputs });\n}\n\nexport function formatWorkflowJson(workflow: WorkflowSummary): object {\n const sorted = topoOrderNodes(workflow.nodes, workflow.edges ?? []);\n const seedOutputs = workflow.seedOutputsJson;\n const env = workflow as WorkflowSummary & WorkflowEnvFields;\n\n return {\n workflow: {\n id: workflow.id,\n name: workflow.name,\n description: workflow.description,\n preflight: workflow.preflight,\n cleanup: workflow.cleanup,\n status: workflow.status,\n flowType: workflow.flowType,\n ...(env.viewportSize !== undefined ? { viewportSize: env.viewportSize } : {}),\n ...(seedOutputs && seedOutputs.length > 0 ? { seedOutputs } : {}),\n ...(env.defaultEnvironmentId !== undefined\n ? { defaultEnvironmentId: env.defaultEnvironmentId }\n : {}),\n ...(env.eligibleEnvironmentIds ? { eligibleEnvironmentIds: env.eligibleEnvironmentIds } : {}),\n ...(env.passByEnvironment && env.passByEnvironment.length > 0\n ? {\n passByEnvironment: env.passByEnvironment.map((p) => ({\n environment: `${p.environmentName} (${p.environmentType})`,\n everPassed: p.everPassed,\n passed: p.passed,\n total: p.total,\n health: p.health,\n })),\n }\n : {}),\n },\n steps: sorted.map((node, i) => ({\n index: i + 1,\n nodeId: node.id,\n nodeType: node.nodeType,\n // An untitled action reports null: a title derived from its instruction text must not be\n // mistaken for an authored one when an author copies steps back into a sync file.\n title:\n node.nodeType === 'action' && !(node.configJson?.customActionTitle as string | undefined)\n ? null\n : getNodeTitle(node),\n config: getCleanConfig(node),\n })),\n };\n}\n","import process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { writeRawOutput } from './brand.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { truncate } from './workflow-format.js';\n\nexport type WorkflowListPagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\nexport type WorkflowListItem = {\n id: string;\n name: string;\n status: string;\n flowType: string;\n nodeCount?: number;\n};\n\nexport type WorkflowListResponse = {\n ok: boolean;\n error?: string;\n data: WorkflowListItem[];\n pagination: WorkflowListPagination;\n};\n\nexport function formatWorkflowListTable(args: {\n data: readonly WorkflowListItem[];\n pagination: WorkflowListPagination;\n}): string {\n const lines = [\n `Workflows: ${args.pagination.totalItems} total (page ${args.pagination.page}/${args.pagination.totalPages})`,\n '',\n ];\n\n if (args.data.length === 0) {\n lines.push('No workflows found.');\n return lines.join('\\n');\n }\n\n const idW = 36;\n const nameW = 30;\n const statusW = 12;\n const typeW = 10;\n\n lines.push(\n ['ID'.padEnd(idW), 'Name'.padEnd(nameW), 'Status'.padEnd(statusW), 'Type'.padEnd(typeW)].join(\n ' '\n )\n );\n\n for (const workflow of args.data) {\n lines.push(\n [\n workflow.id.padEnd(idW),\n truncate(workflow.name, nameW).padEnd(nameW),\n workflow.status.padEnd(statusW),\n workflow.flowType.padEnd(typeW),\n ].join(' ')\n );\n }\n\n return lines.join('\\n');\n}\n\nexport async function handleWorkflowList(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n\n const params = new URLSearchParams();\n const search = getArgValue(argv, '--search');\n const flowType = getArgValue(argv, '--flow-type');\n const status = getArgValue(argv, '--status');\n const page = getArgValue(argv, '--page');\n const pageSize = getArgValue(argv, '--page-size');\n\n if (search) params.set('search', search);\n if (flowType) params.set('flowType', flowType);\n if (status) params.set('status', status);\n if (page) params.set('page', page);\n if (pageSize) params.set('pageSize', pageSize);\n\n const qs = params.toString();\n const path = `/workflows${qs ? `?${qs}` : ''}`;\n\n const result = await apiRequest<WorkflowListResponse>(apiUrl, token, 'GET', path);\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ data: result.data, pagination: result.pagination }, null, 2));\n return;\n }\n\n writeRawOutput(formatWorkflowListTable({ data: result.data, pagination: result.pagination }));\n}\n","/**\n * `cofactor workflow cancel <runId>`: cancel a workflow run through\n * `POST /workflows/:workflowId/runs/:runId/cancel`.\n *\n * @module\n */\n\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { writeRawOutput } from './brand.js';\nimport { resolveWorkflowIdForRun } from './workflow-debug.js';\n\nconst USAGE = 'Usage: cofactor workflow cancel <runId> [--workflow <workflowId>] [--json]';\n\nexport async function handleWorkflowCancel(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [runId] = argv.filter((a, i) => !a.startsWith('-') && argv[i - 1] !== '--workflow');\n if (!runId) {\n console.error('Error: Missing run ID.');\n console.error(USAGE);\n process.exit(1);\n }\n let workflowId: string;\n try {\n workflowId = await resolveWorkflowIdForRun({ runId, explicitWorkflowId: getArgValue(argv, '--workflow'), apiUrl, token });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n console.error(' Pass --workflow <workflowId> explicitly.');\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/runs/${runId}/cancel`,\n {}\n );\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else if (result.ok) {\n console.log(`Cancelled run ${runId}.`);\n } else {\n console.error(`Error: ${result.error ?? 'could not cancel the run'}`);\n }\n if (!result.ok) process.exit(1);\n}\n","/**\n * CLI handler for triggering a workflow execution.\n *\n * Usage:\n * canary workflow run <workflowId> [options]\n * --cache-only waits for the run to reach a terminal status.\n *\n * @module WorkflowRunCLI\n */\n\nimport process from 'node:process';\nimport { getArgValue, hasFlag, resolveOrgAppUrl } from './auth.js';\nimport {\n apiRequest,\n fetchWorkflowEnvironments,\n renderWorkflowUserError,\n resolveEnvironmentByNameOrId,\n} from './cli-helpers.js';\nimport { statusIcon } from './cli-format.js';\nimport { formatCacheOnlyFailure, getCacheOnlyFailure } from './cache-only-failure.js';\nimport { writeRawOutput } from './brand.js';\nimport { resolveApplicationId } from './environment.js';\nimport { isBrowserViewportPreset } from '@chatsdet/types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ExecuteResponse = {\n ok: boolean;\n error?: string;\n runId: string;\n streamId: string;\n};\n\ntype RunStatusResponse = {\n ok: boolean;\n error?: string;\n data: {\n run: {\n id: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n metadataJson: Record<string, unknown> | null;\n };\n };\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowRun(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain: string | null | undefined\n): Promise<void> {\n // `--environment` takes a value; exclude that token when picking the\n // positional workflow id so `run --environment staging <wf>` still works.\n const environmentArg = getArgValue(argv, '--environment');\n const viewportArg = getArgValue(argv, '--viewport');\n const claimScopeArg = getArgValue(argv, '--claim-scope');\n const browserModeArg = getArgValue(argv, '--browser-mode');\n const sandboxArg = getArgValue(argv, '--sandbox');\n const previewArg = getArgValue(argv, '--preview');\n const applicationArg = getArgValue(argv, '--application') ?? getArgValue(argv, '--property');\n const flagValues = new Set(\n [environmentArg, viewportArg, claimScopeArg, browserModeArg, sandboxArg, previewArg, applicationArg].filter((v): v is string =>\n Boolean(v)\n )\n );\n const workflowId = argv.find((a) => !a.startsWith('-') && !flagValues.has(a));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error(\n 'Usage: canary workflow run <workflowId> [--environment <name|id>] [--sandbox <id> | --preview <pr> --application <name|id>] [--browser-mode <headed|headless>] [--cache-only] [--stream] [--json]'\n );\n console.error(' --cache-only Replay cached actions only and wait for completion.');\n console.error(' --sandbox Run on a sandbox you claimed (`cofactor sandbox claim`) instead of a fresh copy.');\n console.error(\" --preview Run on a private copy of a pull request's preview at its applied head (needs --application).\");\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const stream = hasFlag(argv, '--stream');\n const cacheOnly = hasFlag(argv, '--cache-only');\n const waitForTerminal = stream || cacheOnly;\n const requestBody: Record<string, unknown> = {\n triggerSource: 'cli_direct',\n };\n if (hasFlag(argv, '--viewport') && !isBrowserViewportPreset(viewportArg)) {\n console.error('Error: --viewport requires desktop, desktop_large, laptop, tablet, or mobile.');\n process.exit(1);\n }\n if (viewportArg !== undefined) requestBody.viewportSize = viewportArg;\n if (cacheOnly) {\n requestBody.cacheOnly = true;\n }\n if (claimScopeArg) {\n requestBody.claimScope = claimScopeArg;\n }\n // The run uses this claimed sandbox (and the files synced into it), and never destroys it.\n if (sandboxArg) {\n requestBody.sandboxV2SandboxId = sandboxArg;\n }\n // A private copy of the pull request's preview, so the run is true of that commit.\n if (previewArg) {\n const prNumber = Number(previewArg);\n if (!/^[1-9]\\d*$/.test(previewArg)) {\n console.error('Error: --preview takes a pull request number.');\n process.exit(1);\n }\n if (sandboxArg) {\n console.error('Error: --preview and --sandbox name different sandboxes; pass one.');\n process.exit(1);\n }\n requestBody.preview = { applicationId: await resolveApplicationId(argv, apiUrl, token), prNumber };\n }\n if (browserModeArg) {\n if (browserModeArg !== 'headed' && browserModeArg !== 'headless') {\n console.error('Error: --browser-mode must be headed or headless.');\n process.exit(1);\n }\n requestBody.browserMode = browserModeArg;\n }\n\n // Optional environment override. Resolve a name/id against the flow's\n // property and pass `environmentId` to the execute endpoint. When omitted the\n // server falls back to the workflow's configured `defaultEnvironmentId` (then\n // credential-bound / property-default env), so a plain run targets the\n // sandbox once the flow's default is set via `workflow patch`.\n let resolvedEnvironmentId: string | undefined;\n if (environmentArg) {\n const envs = await fetchWorkflowEnvironments(apiUrl, token, workflowId);\n resolvedEnvironmentId = resolveEnvironmentByNameOrId(envs, environmentArg);\n requestBody.environmentId = resolvedEnvironmentId;\n }\n\n // Trigger execution\n const result = await apiRequest<ExecuteResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/execute`,\n requestBody\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n const rendered = renderWorkflowUserError(result as unknown as Record<string, unknown>);\n console.error(rendered ?? `Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n const { runId } = result;\n const url = `${resolveOrgAppUrl(apiUrl, appSubdomain)}/flows/${workflowId}?runId=${runId}`;\n\n if (jsonOutput && !waitForTerminal) {\n writeRawOutput(JSON.stringify({ ok: true, runId, streamId: result.streamId, url }, null, 2));\n return;\n }\n\n if (!waitForTerminal) {\n console.log(`Run triggered successfully.`);\n console.log(` Run ID: ${runId}`);\n console.log(` URL: ${url}`);\n if (environmentArg) {\n console.log(` Environment: ${environmentArg} (${resolvedEnvironmentId})`);\n }\n console.log(`\\nCheck status: canary workflow runs get ${workflowId} ${runId}`);\n return;\n }\n\n // Stream and cache-only modes poll run status until completion.\n if (!jsonOutput) {\n console.log(`Run triggered (${runId}). Waiting for completion...\\n`);\n }\n\n const terminalStatuses = new Set([\n 'completed',\n 'success',\n 'passed',\n 'failed',\n 'inconclusive',\n 'canceled',\n 'timeout',\n ]);\n let lastStatus = '';\n let firstPoll = true;\n\n for (;;) {\n if (!firstPoll) await sleep(3000);\n firstPoll = false;\n\n const status = await apiRequest<RunStatusResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!status.ok) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(status, null, 2));\n } else {\n console.error(`Error polling status: ${status.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n const run = status.data.run;\n\n if (cacheOnly && run.metadataJson?.cacheOnly !== true) {\n const isTerminal = terminalStatuses.has(run.status);\n const cancellation = isTerminal\n ? null\n : await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/runs/${runId}/cancel`,\n {}\n );\n const cancellationMessage = isTerminal\n ? 'The run was already terminal before it could be canceled.'\n : cancellation?.ok\n ? 'The run was canceled before polling continued.'\n : `Automatic cancellation failed: ${cancellation?.error ?? 'unknown error'}`;\n const error =\n 'Cache-only safety check failed: the created run did not persist cacheOnly=true. ' +\n cancellationMessage +\n ' Cancellation acknowledgment does not prove the run is quiescent; wait for its full job and agent tree to stop before retrying or restoring cache rows.';\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(\n { ok: false, runId, streamId: result.streamId, url, status: run.status, error },\n null,\n 2\n )\n );\n } else {\n console.error(`Error: ${error}`);\n console.error(`Run ID: ${runId}`);\n }\n process.exit(1);\n }\n\n if (!jsonOutput && run.status !== lastStatus) {\n console.log(` ${statusIcon(run.status)} ${run.status}`);\n lastStatus = run.status;\n }\n\n if (terminalStatuses.has(run.status)) {\n const cacheOnlyFailure = getCacheOnlyFailure(run.metadataJson);\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(\n {\n ok: !['failed', 'timeout', 'canceled'].includes(run.status),\n runId,\n streamId: result.streamId,\n url,\n status: run.status,\n error: run.errorMessage,\n ...(cacheOnlyFailure ? { cacheOnlyFailure } : {}),\n },\n null,\n 2\n )\n );\n } else {\n if (run.errorMessage) {\n writeRawOutput(`\\nError: ${run.errorMessage}`);\n }\n if (run.status === 'failed' && cacheOnlyFailure) {\n console.log('');\n for (const line of formatCacheOnlyFailure(cacheOnlyFailure)) {\n writeRawOutput(line);\n }\n }\n console.log(`\\nRun finished: ${run.status}`);\n console.log(`URL: ${url}`);\n console.log(`Details: canary workflow runs get ${workflowId} ${runId}`);\n }\n\n if (run.status === 'inconclusive') {\n process.exit(2);\n }\n if (run.status === 'failed' || run.status === 'timeout' || run.status === 'canceled') {\n process.exit(1);\n }\n return;\n }\n }\n}\n","export type CacheOnlyFailureReport = {\n nodeId: string;\n nodeName: string;\n stepIndex: number;\n nodeHash?: string;\n cacheId?: string;\n failureClass: string;\n cacheOutcome: string;\n cacheOutcomeReason?: string;\n failureCategory?: string;\n failedStepOrder?: number;\n error?: string;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction hasOptionalString(record: Record<string, unknown>, key: string): boolean {\n return record[key] === undefined || typeof record[key] === 'string';\n}\n\nexport function isCacheOnlyFailureReport(value: unknown): value is CacheOnlyFailureReport {\n if (!isRecord(value)) return false;\n\n return (\n typeof value.nodeId === 'string' &&\n typeof value.nodeName === 'string' &&\n typeof value.stepIndex === 'number' &&\n typeof value.failureClass === 'string' &&\n typeof value.cacheOutcome === 'string' &&\n hasOptionalString(value, 'nodeHash') &&\n hasOptionalString(value, 'cacheId') &&\n hasOptionalString(value, 'cacheOutcomeReason') &&\n hasOptionalString(value, 'failureCategory') &&\n (value.failedStepOrder === undefined || typeof value.failedStepOrder === 'number') &&\n hasOptionalString(value, 'error')\n );\n}\n\nexport function getCacheOnlyFailure(\n metadataJson: Record<string, unknown> | null | undefined\n): CacheOnlyFailureReport | null {\n const report = metadataJson?.cacheOnlyFailure;\n return isCacheOnlyFailureReport(report) ? report : null;\n}\n\nexport function formatCacheOnlyFailure(report: CacheOnlyFailureReport): string[] {\n const lines = [\n 'Cache-only failure:',\n ` Node: ${report.nodeName}`,\n ` Failure class: ${report.failureClass}`,\n ` Cache outcome: ${report.cacheOutcome}`,\n ];\n\n if (report.cacheOutcomeReason) {\n lines.push(` Reason: ${report.cacheOutcomeReason}`);\n }\n if (report.failedStepOrder !== undefined) {\n lines.push(` Failed step order: ${report.failedStepOrder}`);\n }\n if (report.error) {\n lines.push(` Error: ${report.error}`);\n }\n\n return lines;\n}\n","/**\n * CLI subcommand for querying workflow run results.\n *\n * Usage:\n * canary workflow runs list <workflowId> [options]\n * canary workflow runs get <workflowId> <runId> [options]\n * canary workflow runs diagnostics <workflowId> <runId> [options]\n *\n * @module WorkflowRunsCLI\n */\n\nimport process from 'node:process';\nimport { elapsedTestAttemptMs } from '@chatsdet/types';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport {\n statusIcon,\n formatRelative,\n computeDuration,\n formatElapsedDurationMs,\n formatRecordedUtcTimestamp,\n pad,\n} from './cli-format.js';\nimport { writeRawOutput } from './brand.js';\nimport { formatCacheOnlyFailure, getCacheOnlyFailure } from './cache-only-failure.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Pagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\ntype RunSummary = {\n id: string;\n status: string;\n createdAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n browserMode: string | null;\n stepTotals: { total: number; passed: number; failed: number } | null;\n snapshotVersion: number | null;\n};\n\ntype RunListResponse = {\n ok: boolean;\n error?: string;\n data: { runs: RunSummary[] };\n pagination: Pagination;\n};\n\ntype RunStep = {\n id: string;\n runId: string;\n nodeId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n orderIndex: number;\n metadataJson: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype RunDetail = {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n metadataJson: Record<string, unknown> | null;\n steps: RunStep[];\n draftSnapshot: { id: string; version: string; basePublishedVersion: number } | null;\n};\n\ntype RunDetailResponse = {\n ok: boolean;\n error?: string;\n data: { run: RunDetail };\n};\n\ntype DiagnosticJson = {\n category?: string;\n title?: string;\n analysis?: string;\n recommendation?: string;\n smokingGun?: { type: string; description: string; detail?: string } | null;\n triage?: { matchedIssueShortcode?: string };\n};\n\ntype FailureDiagnosticResponse = {\n ok: boolean;\n error?: string;\n data: {\n id: string;\n status: string;\n diagnostic: DiagnosticJson | null;\n createdAt: string;\n updatedAt: string;\n } | null;\n};\n\ntype RawDiagnosticsResponse = {\n ok: boolean;\n error?: string;\n consoleLogs: Array<{ level: string; text: string; timestamp?: string }>;\n networkRequests: Array<{ method: string; url: string; status: number }>;\n};\n\nfunction nativeRunElapsedMs(\n run: Pick<RunDetail, 'status' | 'startedAt' | 'finishedAt'>\n): number | null {\n if (run.finishedAt) return elapsedTestAttemptMs(run.startedAt, run.finishedAt);\n if (run.status.toLowerCase() === 'running' && run.startedAt) {\n return elapsedTestAttemptMs(run.startedAt, new Date().toISOString());\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\ntype AnnotatedRun = RunSummary & { side: 'browser' | 'api' };\n\ntype ApiSequenceRunRow = {\n id: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n createdAt?: string;\n};\n\ntype ApiSequenceByWorkflow = {\n ok: boolean;\n error?: string;\n data?: { id: string } | null;\n};\n\ntype ApiSequenceRunsResponse = {\n ok: boolean;\n error?: string;\n data: ApiSequenceRunRow[];\n pagination?: Pagination;\n};\n\nasync function fetchBrowserRuns(\n apiUrl: string,\n token: string,\n workflowId: string,\n page: string,\n pageSize: string\n): Promise<{ runs: RunSummary[]; pagination: Pagination } | { error: string }> {\n const params = new URLSearchParams({ page, pageSize });\n const result = await apiRequest<RunListResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs?${params}`\n );\n if (!result.ok) return { error: result.error ?? 'Unknown error' };\n return { runs: result.data.runs, pagination: result.pagination };\n}\n\nasync function fetchApiRuns(\n apiUrl: string,\n token: string,\n workflowId: string,\n page: string,\n pageSize: string\n): Promise<\n { runs: RunSummary[]; pagination: Pagination | null } | { error: string; code?: string }\n> {\n const seqRes = await apiRequest<ApiSequenceByWorkflow & { code?: string }>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/by-workflow/${workflowId}`\n );\n if (!seqRes.ok) {\n return {\n error: seqRes.error ?? 'Unknown error',\n ...(seqRes.code ? { code: seqRes.code } : {}),\n };\n }\n if (!seqRes.data) return { runs: [], pagination: null };\n const params = new URLSearchParams({ page, pageSize });\n const runsRes = await apiRequest<ApiSequenceRunsResponse>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/${seqRes.data.id}/runs?${params}`\n );\n if (!runsRes.ok) return { error: runsRes.error ?? 'Unknown error' };\n const runs: RunSummary[] = (runsRes.data ?? []).map((r) => ({\n id: r.id,\n status: r.status,\n createdAt: r.createdAt ?? r.startedAt ?? new Date(0).toISOString(),\n startedAt: r.startedAt,\n finishedAt: r.finishedAt,\n errorMessage: r.errorMessage,\n browserMode: null,\n stepTotals: null,\n snapshotVersion: null,\n }));\n return { runs, pagination: runsRes.pagination ?? null };\n}\n\nasync function handleRunsList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID. Usage: canary workflow runs list <workflowId>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const page = getArgValue(argv, '--page') ?? '1';\n const pageSize = getArgValue(argv, '--page-size') ?? '10';\n const explicitSide = getArgValue(argv, '--side') ?? getArgValue(argv, '--mode');\n const sideArg = (explicitSide ?? 'all').toLowerCase();\n\n if (!['all', 'api', 'browser'].includes(sideArg)) {\n console.error(`Error: --side must be one of: all, api, browser (got \"${sideArg}\")`);\n process.exit(1);\n }\n\n const annotated: AnnotatedRun[] = [];\n let browserPagination: Pagination | null = null;\n let apiPagination: Pagination | null = null;\n\n if (sideArg === 'browser' || sideArg === 'all') {\n const browser = await fetchBrowserRuns(apiUrl, token, workflowId, page, pageSize);\n if ('error' in browser) {\n console.error(`Error: ${browser.error}`);\n process.exit(1);\n }\n browserPagination = browser.pagination;\n for (const r of browser.runs) annotated.push({ ...r, side: 'browser' });\n }\n\n if (sideArg === 'api' || sideArg === 'all') {\n const api = await fetchApiRuns(apiUrl, token, workflowId, page, pageSize);\n if ('error' in api) {\n // When --side wasn't explicit and the workflow simply has no api-sequence,\n // don't hard-fail the whole listing — just skip the api leg.\n const isMissingSequence = api.code === 'API_SEQUENCE_NOT_FOUND';\n if (!explicitSide && isMissingSequence) {\n if (!jsonOutput) {\n console.error('Note: workflow has no api-sequence — showing browser runs only.');\n }\n } else {\n console.error(`Error: ${api.error}`);\n process.exit(1);\n }\n } else {\n apiPagination = api.pagination;\n for (const r of api.runs) annotated.push({ ...r, side: 'api' });\n }\n }\n\n annotated.sort((a, b) => {\n const ta = new Date(a.startedAt ?? a.createdAt).getTime();\n const tb = new Date(b.startedAt ?? b.createdAt).getTime();\n return tb - ta;\n });\n\n if (jsonOutput) {\n writeRawOutput(\n JSON.stringify(\n {\n ok: true,\n data: { runs: annotated },\n pagination: { browser: browserPagination, api: apiPagination },\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (annotated.length === 0) {\n console.log('No runs found.');\n return;\n }\n\n console.log(`Runs (${annotated.length} shown, side=${sideArg})\\n`);\n const idW = 36;\n const sideW = 8;\n const statusW = 12;\n const durationW = 10;\n console.log(\n [\n 'ID'.padEnd(idW),\n 'Side'.padEnd(sideW),\n 'Status'.padEnd(statusW),\n 'Duration'.padEnd(durationW),\n 'Started',\n ].join(' ')\n );\n\n for (const run of annotated) {\n const icon = statusIcon(run.status);\n const dur = computeDuration(run.startedAt, run.finishedAt);\n const time = formatRelative(run.startedAt ?? run.createdAt);\n console.log(\n [\n run.id.padEnd(idW),\n pad(run.side, sideW),\n `${icon} ${pad(run.status, statusW - 3)}`,\n pad(dur, durationW),\n time,\n ].join(' ')\n );\n }\n console.log('');\n}\n\nasync function handleRunsGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a, index) =>\n !a.startsWith('-') && !['--step', '--api-call'].includes(argv[index - 1] ?? '')\n );\n const [workflowId, runId] = positional;\n if (!workflowId || !runId) {\n console.error('Error: Missing arguments. Usage: cofactor workflow runs get <workflowId> <runId>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const runStepId = getArgValue(argv, '--step');\n const apiStepId = getArgValue(argv, '--api-call');\n if (argv.some((arg) => ['--step', '--api-call'].some(\n (flag) => arg === flag || arg.startsWith(`${flag}=`)\n ))) {\n if (!runStepId || runStepId.startsWith('-') || !apiStepId || apiStepId.startsWith('-')) {\n console.error('Error: --step <runStepId> and --api-call <apiStepId> must be used together.');\n process.exit(1);\n }\n const result = await apiRequest<{\n ok: boolean;\n error?: string;\n data: { stepId: string; body: string | null; requestBody: string | null };\n }>(apiUrl, token, 'GET',\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}` +\n `/steps/${encodeURIComponent(runStepId)}/api-calls/${encodeURIComponent(apiStepId)}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n writeRawOutput(`Request body:\\n${result.data.requestBody ?? ''}`);\n writeRawOutput(`Response body:\\n${result.data.body ?? ''}`);\n }\n return;\n }\n\n const result = await apiRequest<RunDetailResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n const { run } = result.data;\n const elapsed = nativeRunElapsedMs(run);\n const ended =\n !run.finishedAt && run.status.toLowerCase() === 'running'\n ? 'Running'\n : formatRecordedUtcTimestamp(run.finishedAt);\n const cacheOnly = run.metadataJson?.cacheOnly === true;\n const cacheOnlyFailure = getCacheOnlyFailure(run.metadataJson);\n\n console.log(`Run: ${run.id}`);\n console.log(`Status: ${statusIcon(run.status)} ${run.status}`);\n if (cacheOnly) {\n console.log('Mode: cache-only');\n }\n console.log(`Started: ${formatRecordedUtcTimestamp(run.startedAt)}`);\n console.log(`Ended: ${ended}`);\n console.log(`Total Time: ${formatElapsedDurationMs(elapsed)}`);\n\n if (run.errorMessage) {\n writeRawOutput(`Error: ${run.errorMessage}`);\n }\n\n if (run.draftSnapshot) {\n console.log(\n `Snapshot: v${run.draftSnapshot.version} (base: v${run.draftSnapshot.basePublishedVersion})`\n );\n }\n\n if (cacheOnlyFailure) {\n console.log('');\n for (const line of formatCacheOnlyFailure(cacheOnlyFailure)) {\n console.log(line);\n }\n }\n\n const steps = (run.steps ?? []).sort((a, b) => a.orderIndex - b.orderIndex);\n\n if (steps.length === 0) {\n console.log('\\nNo steps recorded.');\n return;\n }\n\n console.log(`\\nSteps (${steps.length}):`);\n for (const step of steps) {\n const idx = String(step.orderIndex + 1).padStart(2);\n const icon = statusIcon(step.status);\n const nodeId = step.nodeId.slice(0, 8);\n const dur = computeDuration(step.startedAt, step.finishedAt);\n\n console.log(` ${idx}. ${icon} ${pad(nodeId, 10)} ${dur}`);\n\n if (step.errorMessage) {\n writeRawOutput(` Error: ${step.errorMessage}`);\n }\n }\n\n console.log('');\n}\n\nasync function handleRunsDiagnostics(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error(\n 'Error: Missing arguments. Usage: canary workflow runs diagnostics <workflowId> <runId>'\n );\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n\n // Try AI failure diagnostic first\n const result = await apiRequest<FailureDiagnosticResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/failure-diagnostic`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput && result.data) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.data) {\n const { status, diagnostic } = result.data;\n\n if (status === 'pending' || status === 'running') {\n console.log(`Diagnostic is still in progress (status: ${status}).`);\n return;\n }\n\n if (status === 'failed') {\n console.log('Diagnostic analysis failed.');\n return;\n }\n\n if (diagnostic) {\n console.log('Failure Diagnostic');\n console.log(`Status: ${status}`);\n if (diagnostic.category) {\n console.log(`Category: ${diagnostic.category}`);\n }\n if (diagnostic.title) {\n writeRawOutput(`Title: ${diagnostic.title}`);\n }\n if (diagnostic.triage) {\n writeRawOutput(`Repeat: confirmed repeat failure${diagnostic.triage.matchedIssueShortcode ? ` (issue ${diagnostic.triage.matchedIssueShortcode})` : ''}`);\n }\n\n if (diagnostic.analysis) {\n console.log('');\n console.log('Analysis:');\n writeRawOutput(` ${diagnostic.analysis}`);\n }\n\n if (diagnostic.recommendation) {\n console.log('');\n console.log('Recommendation:');\n writeRawOutput(` ${diagnostic.recommendation}`);\n }\n\n if (diagnostic.smokingGun) {\n console.log('');\n console.log('Smoking Gun:');\n writeRawOutput(` > ${diagnostic.smokingGun.description}`);\n if (diagnostic.smokingGun.detail) {\n writeRawOutput(` ${diagnostic.smokingGun.detail}`);\n }\n }\n\n console.log('');\n return;\n }\n }\n\n // Fall back to raw console/network diagnostics\n const rawResult = await apiRequest<RawDiagnosticsResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/diagnostics`\n );\n\n if (!rawResult.ok) {\n console.log('No diagnostic available for this run.');\n return;\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(rawResult, null, 2));\n return;\n }\n\n const hasConsole = rawResult.consoleLogs && rawResult.consoleLogs.length > 0;\n const hasNetwork = rawResult.networkRequests && rawResult.networkRequests.length > 0;\n\n if (!hasConsole && !hasNetwork) {\n console.log('No diagnostic data available for this run.');\n return;\n }\n\n if (hasConsole) {\n console.log(`Console Logs (${rawResult.consoleLogs.length}):`);\n for (const log of rawResult.consoleLogs.slice(0, 50)) {\n const level = log.level.toUpperCase().padEnd(7);\n writeRawOutput(` [${level}] ${log.text}`);\n }\n if (rawResult.consoleLogs.length > 50) {\n console.log(` ... and ${rawResult.consoleLogs.length - 50} more`);\n }\n console.log('');\n }\n\n if (hasNetwork) {\n console.log(`Network Requests (${rawResult.networkRequests.length}):`);\n for (const req of rawResult.networkRequests.slice(0, 30)) {\n const statusStr = req.status >= 400 ? `${req.status} !!!` : String(req.status);\n writeRawOutput(` ${req.method.padEnd(6)} ${statusStr.padEnd(8)} ${req.url}`);\n }\n if (rawResult.networkRequests.length > 30) {\n console.log(` ... and ${rawResult.networkRequests.length - 30} more`);\n }\n console.log('');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printRunsHelp(): void {\n console.log(\n [\n 'Usage: canary workflow runs <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' list <workflowId> [options] List runs for a workflow',\n ' get <workflowId> <runId> [options] Get run timing, detail, and steps',\n ' diagnostics <workflowId> <runId> [options] Get failure diagnostic',\n '',\n 'List options:',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 10)',\n ' --side <side> Filter: browser, api, all (default: all). Alias: --mode',\n '',\n 'Get options:',\n ' --step <runStepId> --api-call <apiStepId> Print stored (capped) request/response bodies',\n '',\n 'Output options:',\n ' --json Output raw JSON',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ].join('\\n')\n );\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport async function runWorkflowRuns(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printRunsHelp();\n return;\n }\n\n switch (subCommand) {\n case 'list':\n await handleRunsList(rest, apiUrl, token);\n break;\n case 'get':\n await handleRunsGet(rest, apiUrl, token);\n break;\n case 'diagnostics':\n await handleRunsDiagnostics(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printRunsHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI handler for syncing a workflow's DAG (nodes + edges) atomically.\n *\n * Reads the new state from a JSON file or stdin, creates a draft snapshot\n * of the current state for safety, then replaces all nodes and edges.\n *\n * Input is flexible — the CLI auto-fills missing fields:\n * - Node `id` and `orderIndex` are auto-generated\n * - `edges` array is optional — linear sequential edges are created\n * - Accepts the same minimal format as `canary workflow create`\n *\n * Usage:\n * canary workflow sync <workflowId> --from-file <path>\n * cat state.json | canary workflow sync <workflowId> --from-stdin\n *\n * Minimal input: { \"nodes\": [{ \"nodeType\": \"login\", \"configJson\": {} }, ...] }\n *\n * @module WorkflowSyncCLI\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { alignSnapshotNodeIds, type AlignNode } from '@chatsdet/workflow-diff';\nimport { normalizeNodeType } from '@chatsdet/types';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { readFromStdin } from './cli-format.js';\nimport { writeRawOutput } from './brand.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SyncResponse = {\n ok: boolean;\n error?: string;\n snapshotVersion?: string;\n};\n\ntype ProposalResponse = {\n ok: boolean;\n error?: string;\n data?: {\n id: string;\n title: string;\n status: string;\n };\n};\n\n// ---------------------------------------------------------------------------\n// Auto-fill helpers\n// ---------------------------------------------------------------------------\n\ntype RawNode = Record<string, unknown>;\ntype RawEdge = Record<string, unknown>;\n\nfunction normalizeNodesAndEdges(\n rawNodes: RawNode[],\n rawEdges?: RawEdge[]\n): { nodes: RawNode[]; edges: RawEdge[] } {\n // Fill missing node fields with defaults\n const nodes = rawNodes.map((node, i) => ({\n ...node,\n id: (node.id as string) ?? crypto.randomUUID(),\n orderIndex: (node.orderIndex as number) ?? i,\n configJson: (node.configJson as Record<string, unknown>) ?? {},\n }));\n\n // If edges provided, just fill missing IDs\n if (rawEdges && rawEdges.length > 0) {\n const edges = rawEdges.map((edge) => ({\n ...edge,\n id: (edge.id as string) ?? crypto.randomUUID(),\n }));\n return { nodes, edges };\n }\n\n // Auto-generate linear sequential edges\n const edges: RawEdge[] = [];\n for (let i = 0; i < nodes.length - 1; i++) {\n edges.push({\n id: crypto.randomUUID(),\n sourceNodeId: nodes[i].id,\n targetNodeId: nodes[i + 1].id,\n edgeType: 'default',\n });\n }\n\n return { nodes, edges };\n}\n\n// ---------------------------------------------------------------------------\n// Input reading\n// ---------------------------------------------------------------------------\n\nasync function readSyncInput(argv: string[]): Promise<{ nodes: RawNode[]; edges?: RawEdge[] }> {\n const filePath = getArgValue(argv, '--from-file');\n const fromStdin = hasFlag(argv, '--from-stdin');\n\n let raw: string;\n if (filePath) {\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n console.error(`Error reading file: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n } else if (fromStdin) {\n try {\n raw = await readFromStdin();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n } else {\n console.error('Error: Must provide --from-file <path> or --from-stdin');\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n console.error('Error: Invalid JSON input');\n process.exit(1);\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // Normalize \"acting-as\" → \"login\" on user-supplied node entries so callers\n // can use the new spelling without breaking the canonical persisted type.\n const normalizeNodes = (raw: unknown[]): RawNode[] => {\n return raw.map((entry) => {\n if (entry && typeof entry === 'object' && 'nodeType' in entry) {\n const node = entry as RawNode;\n if (typeof node.nodeType === 'string') {\n node.nodeType = normalizeNodeType(node.nodeType);\n }\n }\n return entry as RawNode;\n });\n };\n\n // Direct format: { nodes: [...], edges?: [...] }\n if (Array.isArray(obj.nodes)) {\n return {\n nodes: normalizeNodes(obj.nodes),\n edges: Array.isArray(obj.edges) ? obj.edges : undefined,\n };\n }\n\n // Wrapped format from `canary workflow get`: { workflow: { nodes: [...], edges: [...] } }\n const workflow = obj.workflow as Record<string, unknown> | undefined;\n if (workflow && Array.isArray(workflow.nodes)) {\n return {\n nodes: normalizeNodes(workflow.nodes),\n edges: Array.isArray(workflow.edges) ? workflow.edges : undefined,\n };\n }\n\n console.error('Error: JSON must contain a \"nodes\" array.');\n console.error('Accepted formats:');\n console.error(' { \"nodes\": [{ \"nodeType\": \"login\", \"configJson\": {} }, ...] }');\n console.error(' { \"nodes\": [...], \"edges\": [...] }');\n console.error(' { \"workflow\": { \"nodes\": [...], \"edges\": [...] } }');\n console.error('');\n console.error('Edges, IDs, positions, and ordering are auto-generated when omitted.');\n process.exit(1);\n}\n\n// ---------------------------------------------------------------------------\n// Current-workflow ID alignment (for --propose)\n// ---------------------------------------------------------------------------\n\ntype WorkflowGetResponse = {\n ok: boolean;\n error?: string;\n workflow?: {\n id: string;\n nodes?: Array<{\n id: string;\n nodeType: string;\n orderIndex?: number;\n configJson?: Record<string, unknown> | null;\n }>;\n };\n};\n\nasync function alignWithCurrentWorkflow(\n apiUrl: string,\n token: string,\n workflowId: string,\n nodes: RawNode[],\n edges: RawEdge[],\n): Promise<{ nodes: RawNode[]; edges: RawEdge[] }> {\n // Best-effort: a failed fetch (network blip, 404, permissions) shouldn't\n // block the proposal — the server-side aligner will still run.\n let currentNodes: AlignNode[] = [];\n try {\n const current = await apiRequest<WorkflowGetResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}`,\n );\n if (current.ok && current.workflow?.nodes) {\n currentNodes = current.workflow.nodes.map((n) => ({\n id: n.id,\n nodeType: n.nodeType,\n orderIndex: n.orderIndex,\n configJson: n.configJson ?? {},\n }));\n }\n } catch {\n // Swallow — alignment is a best-effort optimization on the client.\n }\n\n if (currentNodes.length === 0) {\n return { nodes, edges };\n }\n\n const proposedSnapshot = {\n nodes: nodes.map((n) => ({\n id: String(n.id),\n nodeType: String(n.nodeType ?? ''),\n orderIndex: typeof n.orderIndex === 'number' ? n.orderIndex : undefined,\n configJson: (n.configJson as Record<string, unknown> | null | undefined) ?? {},\n })),\n edges: edges.map((e) => ({\n id: String(e.id),\n sourceNodeId: String(e.sourceNodeId),\n targetNodeId: String(e.targetNodeId),\n edgeType: (e.edgeType as string | null | undefined) ?? null,\n })),\n };\n\n const { snapshot } = alignSnapshotNodeIds(proposedSnapshot, currentNodes);\n\n // Splice aligned IDs back onto the original raw nodes/edges so any extra\n // fields callers passed through (canonicalPageId, etc.) are preserved.\n const alignedNodes: RawNode[] = nodes.map((n, i) => ({\n ...n,\n id: snapshot.nodes[i]!.id,\n }));\n const alignedEdges: RawEdge[] = edges.map((e, i) => ({\n ...e,\n sourceNodeId: snapshot.edges[i]!.sourceNodeId,\n targetNodeId: snapshot.edges[i]!.targetNodeId,\n }));\n\n return { nodes: alignedNodes, edges: alignedEdges };\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowSync(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n console.error('Usage: canary workflow sync <workflowId> --from-file <path>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const noSnapshot = hasFlag(argv, '--no-snapshot');\n const propose = hasFlag(argv, '--propose');\n const proposalTitle = getArgValue(argv, '--title');\n const proposalDescription = getArgValue(argv, '--description');\n\n const raw = await readSyncInput(argv);\n const { nodes, edges } = normalizeNodesAndEdges(raw.nodes, raw.edges);\n\n // --propose: create a proposal instead of applying directly\n if (propose) {\n const title = proposalTitle ?? `CLI sync proposal (${nodes.length} nodes)`;\n\n // Reuse existing workflow node IDs whenever a proposed step lines up with\n // a current step (same nodeType + orderIndex). Without this the diff\n // engine — which matches by node.id — sees the proposal as a wholesale\n // rewrite even when only a few configs changed. The server-side aligner\n // is the authoritative pass; doing it here too keeps CLI output sensible\n // and gives agents a clean diff even before they round-trip through the\n // API.\n const aligned = await alignWithCurrentWorkflow(apiUrl, token, workflowId, nodes, edges);\n\n const result = await apiRequest<ProposalResponse>(\n apiUrl,\n token,\n 'POST',\n `/workflows/${workflowId}/proposals`,\n {\n title,\n description: proposalDescription ?? null,\n snapshotJson: { nodes: aligned.nodes, edges: aligned.edges },\n source: 'api',\n }\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Proposal created for workflow ${workflowId} (${nodes.length} nodes, ${edges.length} edges).`);\n if (result.data?.id) {\n console.log(`Proposal ID: ${result.data.id}`);\n }\n return;\n }\n\n const result = await apiRequest<SyncResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}/draft-state`,\n { nodes, edges, createSnapshot: !noSnapshot }\n );\n\n if (!result.ok) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: false, error: result.error ?? 'Unknown error' }, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Workflow ${workflowId} synced (${nodes.length} nodes, ${edges.length} edges).`);\n if (result.snapshotVersion) {\n console.log(`Draft snapshot created: ${result.snapshotVersion}`);\n }\n}\n","/**\n * CLI handler for generating an API sequence from a workflow.\n *\n * Generates from the latest successful run (default) or from a text prompt.\n * Streams progress events via SSE and outputs the resulting ApiSequenceConfig.\n *\n * Usage:\n * canary workflow generate-api-sequence <workflowId> [--guidance \"text\"] [--json]\n * canary workflow generate-api-sequence --prompt \"Create user\" [--property <id>] [--json]\n *\n * @module WorkflowApiSequenceCLI\n */\n\nimport process from 'node:process';\nimport { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { writeRawOutput } from './brand.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype GenerateResponse = {\n ok: boolean;\n error?: string;\n generationId?: string;\n};\n\ntype ApiSequenceEvent = {\n emittedAt: string;\n workflowId: string;\n} & (\n | { eventType: 'progress'; message: string }\n | { eventType: 'tool-call'; toolName: string; args: unknown }\n | { eventType: 'tool-result'; toolName: string; result: unknown; success: boolean }\n | { eventType: 'text'; delta: string }\n | {\n eventType: 'complete';\n config: unknown;\n summary: string;\n propertyId: string | null;\n credentialId: string | null;\n }\n | { eventType: 'error'; message: string }\n);\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleWorkflowGenerateApiSequence(\n argv: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n const prompt = getArgValue(argv, '--prompt');\n const guidance = getArgValue(argv, '--guidance');\n const propertyId = getArgValue(argv, '--property');\n const jsonOutput = hasFlag(argv, '--json');\n const verbose = hasFlag(argv, '--verbose', '-v');\n\n if (!workflowId && !prompt) {\n console.error('Error: Provide a workflow ID or --prompt.');\n console.error('');\n console.error('Usage:');\n console.error(' canary workflow generate-api-sequence <workflowId> [--guidance \"text\"]');\n console.error(' canary workflow generate-api-sequence --prompt \"Create user\" [--property <id>]');\n process.exit(1);\n }\n\n // 1. Trigger generation\n let endpoint: string;\n let body: Record<string, unknown>;\n\n if (workflowId && !prompt) {\n // Generate from latest successful run\n endpoint = '/api-sequence-agent/generate-from-run';\n body = { workflowId };\n if (guidance) body.guidancePrompt = guidance;\n if (!jsonOutput) {\n console.error(`Generating API sequence from latest run of workflow ${workflowId}...`);\n }\n } else {\n // Generate from prompt\n endpoint = '/api-sequence-agent/generate';\n body = { prompt: prompt! };\n if (propertyId) body.propertyId = propertyId;\n if (workflowId) body.workflowId = workflowId;\n if (!jsonOutput) {\n console.error(`Generating API sequence from prompt...`);\n }\n }\n\n let triggerRes: Response;\n try {\n triggerRes = await fetch(`${apiUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n if (triggerRes.status === 403) {\n const data = (await triggerRes.json().catch(() => ({}))) as { error?: string };\n console.error(`Error: ${data.error ?? 'This feature is not enabled for your organization.'}`);\n process.exit(1);\n }\n\n if (!triggerRes.ok) {\n const data = (await triggerRes.json().catch(() => ({}))) as { error?: string };\n console.error(`Error: ${data.error ?? `${triggerRes.status} ${triggerRes.statusText}`}`);\n process.exit(1);\n }\n\n const triggerData = (await triggerRes.json()) as GenerateResponse;\n if (!triggerData.ok || !triggerData.generationId) {\n console.error(`Error: ${triggerData.error ?? 'Failed to start generation'}`);\n process.exit(1);\n }\n\n const { generationId } = triggerData;\n\n // 2. Subscribe to SSE stream\n const streamUrl = `${apiUrl}/api-sequence-agent/stream?generationId=${generationId}`;\n\n let streamRes: Response;\n try {\n streamRes = await fetch(streamUrl, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'text/event-stream',\n },\n });\n } catch (err) {\n console.error(`Failed to connect to event stream: ${err}`);\n process.exit(1);\n }\n\n if (!streamRes.ok || !streamRes.body) {\n console.error(`Failed to connect to event stream: ${streamRes.status}`);\n process.exit(1);\n }\n\n // 3. Parse SSE events\n let resultConfig: unknown = null;\n let resultSummary = '';\n let hasCompleted = false;\n let exitCode = 0;\n\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data || event.event !== 'api-sequence-generation') return;\n\n try {\n const data = JSON.parse(event.data) as ApiSequenceEvent;\n\n switch (data.eventType) {\n case 'progress':\n if (!jsonOutput) console.error(` ${data.message}`);\n break;\n\n case 'tool-call':\n if (verbose) console.error(` [tool] ${data.toolName}`);\n break;\n\n case 'tool-result':\n if (verbose) {\n const icon = data.success ? '\\u2713' : '\\u2717';\n console.error(` [tool] ${icon} ${data.toolName}`);\n }\n break;\n\n case 'text':\n // Accumulate but don't print deltas in non-verbose mode\n if (verbose) process.stderr.write(data.delta);\n break;\n\n case 'complete':\n resultConfig = data.config;\n resultSummary = data.summary;\n hasCompleted = true;\n break;\n\n case 'error':\n console.error(`\\nError: ${data.message}`);\n exitCode = 1;\n hasCompleted = true;\n break;\n }\n } catch {\n // Ignore parse errors for keepalive etc.\n }\n },\n });\n\n const reader = streamRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (!hasCompleted) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 4. Output result\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n\n if (!resultConfig) {\n console.error('Generation completed but no config was returned.');\n process.exit(1);\n }\n\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: true, config: resultConfig, summary: resultSummary }, null, 2));\n } else {\n if (resultSummary) {\n console.error('');\n console.error(resultSummary);\n }\n console.error('');\n writeRawOutput(JSON.stringify(resultConfig, null, 2));\n }\n}\n","/**\n * `canary workflow api-sequence <verb>` — manage the API sequence attached to an\n * api-only workflow.\n *\n * All verbs take a workflowId (not a raw apiSequenceId) to match the agent's\n * mental model: \"the sequence attached to this workflow\". The CLI resolves the\n * apiSequenceId via GET /api-sequences/by-workflow/:workflowId in one extra hop.\n *\n * Output auto-detects JSON (piped) vs text (TTY); --json/--text force either.\n *\n * @module WorkflowApiSequenceCmdsCLI\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { handleWorkflowGenerateApiSequence } from './workflow-api-sequence.js';\nimport { writeRawOutput } from './brand.js';\n\n/* ── Arg helpers ───────────────────────────────────────────────────────── */\n\nfunction getArg(argv: string[], key: string): string | undefined {\n const prefix = `${key}=`;\n const eq = argv.find((a) => a.startsWith(prefix));\n if (eq) return eq.slice(prefix.length);\n return getArgValue(argv, key);\n}\n\nfunction wantsJson(argv: string[]): boolean {\n if (hasFlag(argv, '--json')) return true;\n if (hasFlag(argv, '--text')) return false;\n return !process.stdout.isTTY;\n}\n\nfunction emit(argv: string[], textFallback: string, json: unknown): void {\n if (wantsJson(argv)) {\n writeRawOutput(JSON.stringify(json, null, 2));\n } else {\n console.log(textFallback);\n }\n}\n\nasync function readJsonInput(argv: string[]): Promise<unknown> {\n const fromFile = getArg(argv, '--from-file');\n let raw: string;\n if (fromFile) {\n raw = await fs.readFile(fromFile, 'utf-8');\n } else if (hasFlag(argv, '--from-stdin') || !process.stdin.isTTY) {\n raw = await readStdin();\n } else {\n throw new Error('Provide --from-file <path> or pipe JSON on stdin.');\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error('Invalid JSON input.');\n }\n}\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n process.stdin.on('error', reject);\n });\n}\n\n/* ── Types ─────────────────────────────────────────────────────────────── */\n\ninterface ApiSequenceStep {\n id?: string;\n endpointId?: string;\n method?: string;\n path?: string;\n [k: string]: unknown;\n}\n\ninterface ApiSequenceConfig {\n steps: ApiSequenceStep[];\n description?: string;\n stopOnFailure?: boolean;\n exports?: unknown[];\n}\n\ninterface ApiSequenceRecord {\n id: string;\n workflowId: string;\n orgId: string;\n credentialId: string | null;\n config: ApiSequenceConfig;\n status: string;\n guidancePrompt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ByWorkflowResponse {\n ok: boolean;\n error?: string;\n code?: string;\n data?: ApiSequenceRecord | null;\n}\n\ninterface ExecuteResponse {\n ok: boolean;\n error?: string;\n data?: { runId: string; status: string };\n}\n\ninterface ValidationIssue {\n path: string;\n code: string;\n message: string;\n hint?: string;\n}\n\ninterface GenericResponse {\n ok: boolean;\n error?: string;\n code?: string;\n issues?: ValidationIssue[];\n data?: unknown;\n}\n\n/**\n * Handle an error response from an api-sequence mutation. If the server\n * returned API_SEQUENCE_INVALID, emit a dense, machine-parseable report\n * so a coding agent can iterate: JSON mode emits `{ok:false, error, code,\n * issues}` to stdout; text mode writes `path [CODE] :: message` lines to\n * stderr. Always exits 1.\n *\n * Returns without exiting for non-validation errors so the caller can\n * fall back to its own error formatting.\n */\nfunction reportAndMaybeExit(\n argv: string[],\n result: { ok: boolean; error?: string; code?: string; issues?: ValidationIssue[] },\n): void {\n if (result.ok) return;\n\n if (result.code === 'API_SEQUENCE_INVALID' && Array.isArray(result.issues)) {\n if (wantsJson(argv)) {\n // stdout, so agents piping to jq get the full structured payload.\n writeRawOutput(JSON.stringify(\n {\n ok: false,\n error: result.error ?? 'API sequence configuration is invalid',\n code: 'API_SEQUENCE_INVALID',\n issueCount: result.issues.length,\n issues: result.issues,\n },\n null,\n 2,\n ),\n );\n } else {\n console.error(`Error: ${result.error ?? 'API sequence configuration is invalid'}`);\n console.error(\n `Found ${result.issues.length} issue${result.issues.length === 1 ? '' : 's'}:`,\n );\n console.error('');\n // Dense form: one issue per line, `path [CODE] :: message` — grep/jq-friendly.\n for (const issue of result.issues) {\n console.error(` ${issue.path || '(root)'} [${issue.code}] :: ${issue.message}`);\n if (issue.hint) console.error(` hint: ${issue.hint}`);\n }\n console.error('');\n console.error(\n 'Re-run with --json for machine-readable output, or fix the listed fields and retry.',\n );\n }\n process.exit(1);\n }\n\n // Non-validation error — caller-provided formatting.\n return;\n}\n\n/* ── Dispatcher ────────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowApiSequence(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n const [verb, ...rest] = argv;\n switch (verb) {\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'update':\n await handleUpdate(rest, apiUrl, token);\n break;\n case 'execute':\n case 'run':\n await handleExecute(rest, apiUrl, token);\n break;\n case 'delete':\n await handleDelete(rest, apiUrl, token);\n break;\n case 'set-api-only':\n await handleSetApiOnly(rest, apiUrl, token);\n break;\n case 'generate':\n await handleWorkflowGenerateApiSequence(rest, apiUrl, token);\n break;\n default:\n printHelp();\n process.exit(verb ? 1 : 0);\n }\n}\n\nfunction printHelp() {\n console.error(\n [\n 'Usage: canary workflow api-sequence <verb> <workflowId> [options]',\n '',\n 'Verbs:',\n ' get <wf> fetch the sequence attached to the workflow',\n ' update <wf> --from-file <f> replace config (steps, description, exports...); creates the sequence if the workflow has none',\n ' update <wf> --from-stdin replace config from piped JSON',\n ' execute <wf> run the sequence; returns { runId, status }',\n ' delete <wf> delete the api-sequence record (keeps workflow)',\n ' set-api-only <wf> [--off] toggle the workflow\\'s apiOnly flag',\n ' generate <wf> [--prompt ...] AI-generate a config (streams progress)',\n '',\n 'Global options:',\n ' --json force JSON output',\n ' --text force pretty-text output (default when stdout is a TTY)',\n '',\n 'Config shape (for update): { steps: [...], description?, stopOnFailure?, exports? }',\n 'Run \"canary workflow guide api-sequences\" for step shape and template syntax.',\n ].join('\\n'),\n );\n}\n\n/* ── Helpers ───────────────────────────────────────────────────────────── */\n\nasync function fetchSequenceByWorkflow(\n apiUrl: string,\n token: string,\n workflowId: string,\n): Promise<ApiSequenceRecord> {\n const res = await apiRequest<ByWorkflowResponse>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/by-workflow/${workflowId}`,\n );\n if (!res.ok) {\n console.error(`Error: ${res.error ?? 'Failed to fetch sequence'}`);\n process.exit(1);\n }\n if (!res.data) {\n console.error(`Error: Workflow ${workflowId} has no attached API sequence.`);\n console.error('Create one with: canary workflow create --api-only --name <n> --sequence-from-file seq.json');\n process.exit(1);\n }\n return res.data;\n}\n\n/* ── Handlers ──────────────────────────────────────────────────────────── */\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n emit(argv, renderSequence(seq), seq);\n}\n\nasync function handleUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = await readJsonInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const config = parsed as ApiSequenceConfig;\n if (!config || !Array.isArray(config.steps)) {\n console.error('Error: Input must have a \"steps\" array. Got: ' + JSON.stringify(config));\n process.exit(1);\n }\n\n // A workflow with no sequence yet gets one created from this config.\n const existing = await apiRequest<ByWorkflowResponse>(\n apiUrl,\n token,\n 'GET',\n `/api-sequences/by-workflow/${workflowId}`,\n );\n // The server answers 404 API_SEQUENCE_NOT_FOUND when the workflow has none.\n const absent = !existing.ok && existing.code === 'API_SEQUENCE_NOT_FOUND';\n if (!existing.ok && !absent) {\n console.error(`Error: ${existing.error ?? 'Failed to fetch sequence'}`);\n process.exit(1);\n }\n const seq = existing.data;\n\n const result = seq\n ? await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'PUT',\n `/api-sequences/${seq.id}/config`,\n { config },\n )\n : await apiRequest<GenericResponse>(apiUrl, token, 'POST', '/api-sequences/save', {\n workflowId,\n config,\n });\n\n reportAndMaybeExit(argv, result);\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Update failed'}`);\n process.exit(1);\n }\n\n emit(\n argv,\n seq\n ? `Updated api-sequence ${seq.id} (workflow ${workflowId}). Steps: ${config.steps.length}.`\n : `Created api-sequence for workflow ${workflowId}. Steps: ${config.steps.length}.`,\n result,\n );\n}\n\nasync function handleExecute(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n\n const result = await apiRequest<ExecuteResponse>(\n apiUrl,\n token,\n 'POST',\n `/api-sequences/${seq.id}/execute`,\n );\n\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'Execute failed'}`);\n process.exit(1);\n }\n\n emit(\n argv,\n `Run started: ${result.data.runId} (status: ${result.data.status})\\n` +\n `Inspect: canary workflow runs get ${workflowId} ${result.data.runId}`,\n result,\n );\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const seq = await fetchSequenceByWorkflow(apiUrl, token, workflowId);\n\n const result = await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'DELETE',\n `/api-sequences/${seq.id}`,\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Delete failed'}`);\n process.exit(1);\n }\n\n emit(argv, `Deleted api-sequence ${seq.id} (workflow ${workflowId}).`, result);\n}\n\nasync function handleSetApiOnly(\n argv: string[],\n apiUrl: string,\n token: string,\n): Promise<void> {\n const workflowId = argv.find((a) => !a.startsWith('-'));\n if (!workflowId) {\n console.error('Error: Missing workflow ID.');\n printHelp();\n process.exit(1);\n }\n\n const apiOnly = !hasFlag(argv, '--off');\n\n const result = await apiRequest<GenericResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${workflowId}/api-only`,\n { apiOnly },\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Update failed'}`);\n process.exit(1);\n }\n\n emit(argv, `Workflow ${workflowId} apiOnly=${apiOnly}.`, result);\n}\n\n/* ── Rendering ─────────────────────────────────────────────────────────── */\n\nfunction renderSequence(seq: ApiSequenceRecord): string {\n const lines: string[] = [];\n lines.push(`API Sequence ${seq.id}`);\n lines.push(` Workflow: ${seq.workflowId}`);\n lines.push(` Status: ${seq.status}`);\n if (seq.credentialId) lines.push(` Credential: ${seq.credentialId}`);\n if (seq.config.description) lines.push(` Description: ${seq.config.description}`);\n lines.push(` stopOnFailure: ${seq.config.stopOnFailure ?? false}`);\n lines.push('');\n\n const steps = seq.config.steps ?? [];\n if (steps.length === 0) {\n lines.push(' (no steps — use `api-sequence update` to add)');\n } else {\n lines.push(` Steps (${steps.length}):`);\n steps.forEach((step, i) => {\n const method = String(step.method ?? '??').toUpperCase().padEnd(6);\n const path = step.path ?? '(no path)';\n const id = step.id ? ` [${step.id}]` : '';\n lines.push(` ${String(i + 1).padStart(2)}. ${method} ${path}${id}`);\n if (step.endpointId) lines.push(` endpointId: ${step.endpointId}`);\n });\n }\n\n const exports = seq.config.exports ?? [];\n if (exports.length > 0) {\n lines.push('');\n lines.push(` Exports: ${JSON.stringify(exports)}`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI Seed Workflow Creation\n *\n * Creates a seed workflow shell with outputs and an optional paired teardown.\n * Supports flag-based and JSON-based input.\n *\n * @module workflow-seed-create\n */\n\nimport fs from 'node:fs/promises';\nimport process from 'node:process';\nimport { getArgValue, hasFlag, resolveOrgAppUrl } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { writeRawOutput } from './brand.js';\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\ntype SeedOutput = {\n dataKey: string;\n name: string;\n displayLabel: string;\n description?: string;\n credentialOutput?: Record<string, unknown>;\n};\n\ntype SeedCreateInput = {\n name: string;\n description?: string;\n status?: 'draft' | 'approved';\n outputs?: SeedOutput[];\n};\n\ntype WorkflowResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string; name: string; status: string; flowType: string };\n};\n\ntype WorkflowUpdateResponse = {\n ok: boolean;\n error?: string;\n workflow?: { id: string };\n};\n\n/* ── Helpers ──────────────────────────────────────────────────────────── */\n\nfunction getAllArgValues(argv: string[], flag: string): string[] {\n const values: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === flag && i + 1 < argv.length) {\n values.push(argv[i + 1]!);\n i++;\n }\n }\n return values;\n}\n\n/**\n * Parse an --output flag value: \"dataKey:Name[:description]\"\n */\nfunction parseOutputFlag(value: string): SeedOutput {\n const parts = value.split(':');\n if (parts.length < 2) {\n throw new Error(\n `Invalid --output format: \"${value}\". Expected \"dataKey:Name\" or \"dataKey:Name:Description\".`\n );\n }\n const [dataKey, name, ...descParts] = parts;\n const description = descParts.length > 0 ? descParts.join(':') : undefined;\n return {\n dataKey: dataKey!.trim(),\n name: name!.trim(),\n displayLabel: name!.trim(),\n description: description?.trim() || undefined,\n };\n}\n\nasync function readFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n const stdin = process.stdin;\n\n if (stdin.isTTY) {\n throw new Error('No input on stdin. Pipe JSON or use --from-file.');\n }\n\n return new Promise((resolve, reject) => {\n stdin.on('data', (chunk) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stdin.on('error', reject);\n });\n}\n\nasync function readJsonInput(argv: string[]): Promise<SeedCreateInput> {\n let raw: string;\n\n const fromFile = getArgValue(argv, '--from-file');\n if (fromFile) {\n try {\n raw = await fs.readFile(fromFile, 'utf-8');\n } catch (err) {\n throw new Error(`Failed to read file ${fromFile}: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n raw = await readFromStdin();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error('Invalid JSON input.');\n }\n\n const input = parsed as SeedCreateInput;\n if (!input.name || typeof input.name !== 'string') {\n throw new Error('JSON input must include a \"name\" string field.');\n }\n\n // Normalize outputs: default displayLabel to name if missing\n if (Array.isArray(input.outputs)) {\n for (const out of input.outputs) {\n if (!out.dataKey || !out.name) {\n throw new Error('Each output must have \"dataKey\" and \"name\" fields.');\n }\n if (!out.displayLabel) {\n out.displayLabel = out.name;\n }\n }\n }\n\n return input;\n}\n\nfunction resolveInput(argv: string[]): Promise<SeedCreateInput> | SeedCreateInput {\n const fromFile = getArgValue(argv, '--from-file');\n const fromStdin = hasFlag(argv, '--from-stdin');\n\n // JSON input mode\n if (fromFile || fromStdin) {\n return readJsonInput(argv);\n }\n\n // Flag-based input mode\n const name = getArgValue(argv, '--name');\n if (!name) {\n console.error('Error: --name is required (or use --from-stdin / --from-file for JSON input).');\n console.error('Usage: canary workflow seed create --name <name> [--output key:name[:desc]] ...');\n process.exit(1);\n }\n\n const description = getArgValue(argv, '--description');\n const status = getArgValue(argv, '--status') as 'draft' | 'approved' | undefined;\n\n // Parse --output flags\n const outputFlags = getAllArgValues(argv, '--output');\n const outputs: SeedOutput[] = outputFlags.map(parseOutputFlag);\n\n // Parse --outputs-json for complex outputs (credential configs etc.)\n const outputsJsonRaw = getArgValue(argv, '--outputs-json');\n if (outputsJsonRaw) {\n try {\n const parsed = JSON.parse(outputsJsonRaw) as SeedOutput[];\n if (!Array.isArray(parsed)) throw new Error('not an array');\n for (const out of parsed) {\n if (!out.dataKey || !out.name) {\n throw new Error('Each output must have \"dataKey\" and \"name\" fields.');\n }\n if (!out.displayLabel) out.displayLabel = out.name;\n }\n outputs.push(...parsed);\n } catch (err) {\n console.error(`Error: Invalid --outputs-json: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n\n return { name, description: description || undefined, status, outputs };\n}\n\n/* ── Main Handler ────────────────────────────────────────────────────── */\n\nexport async function handleWorkflowSeedCreate(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain?: string | null\n): Promise<void> {\n if (hasFlag(argv, '--help', '-h')) {\n printSeedCreateHelp();\n return;\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const noTeardown = hasFlag(argv, '--no-teardown');\n\n let input: SeedCreateInput;\n try {\n input = await resolveInput(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // 1. Create seed workflow\n const seedResult = await apiRequest<WorkflowResponse>(\n apiUrl,\n token,\n 'POST',\n '/workflows',\n {\n name: input.name,\n description: input.description,\n status: input.status ?? 'draft',\n flowType: 'seed',\n createdVia: 'cli',\n }\n );\n\n // Success = a workflow row came back. `POST /workflows` historically omitted\n // `ok` from its envelope, so gating on `ok` alone reported false failures even\n // though the seed was created; presence of `workflow` is the reliable signal.\n if (!seedResult.workflow) {\n if (jsonOutput) {\n writeRawOutput(JSON.stringify({ ok: false, error: seedResult.error ?? 'Failed to create seed workflow' }, null, 2));\n } else {\n console.error(`Error: ${seedResult.error ?? 'Failed to create seed workflow'}`);\n }\n process.exit(1);\n }\n\n const seedId = seedResult.workflow.id;\n const appUrl = resolveOrgAppUrl(apiUrl, appSubdomain);\n\n // 2. Set seed outputs if provided\n let outputsSaved = false;\n if (input.outputs && input.outputs.length > 0) {\n const outputsResult = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${seedId}`,\n { seedOutputsJson: input.outputs }\n );\n\n if (outputsResult.ok || outputsResult.workflow) {\n outputsSaved = true;\n } else {\n console.warn(`Warning: Seed created but failed to save outputs: ${outputsResult.error ?? 'Unknown error'}`);\n }\n }\n\n // 3. Create paired teardown (unless --no-teardown)\n let teardownId: string | undefined;\n let teardownName: string | undefined;\n if (!noTeardown) {\n const tdName = `Teardown: ${input.name}`;\n const tdResult = await apiRequest<WorkflowResponse>(\n apiUrl,\n token,\n 'POST',\n '/workflows',\n {\n name: tdName,\n description: `Cleans up seed data from \"${input.name}\"`,\n status: 'draft',\n flowType: 'teardown',\n createdVia: 'cli',\n }\n );\n\n if (tdResult.workflow) {\n teardownId = tdResult.workflow.id;\n teardownName = tdName;\n\n // 4. Link teardown to seed\n const linkResult = await apiRequest<WorkflowUpdateResponse>(\n apiUrl,\n token,\n 'PUT',\n `/workflows/${seedId}`,\n { teardownWorkflowId: teardownId }\n );\n\n if (!linkResult.ok && !linkResult.workflow) {\n console.warn(`Warning: Teardown created but failed to link to seed: ${linkResult.error ?? 'Unknown error'}`);\n }\n } else {\n console.warn(`Warning: Failed to create paired teardown: ${tdResult.error ?? 'Unknown error'}`);\n }\n }\n\n // 5. Output results\n if (jsonOutput) {\n const result: Record<string, unknown> = {\n ok: true,\n seed: {\n id: seedId,\n name: input.name,\n status: input.status ?? 'draft',\n flowType: 'seed',\n outputs: outputsSaved ? input.outputs : [],\n url: `${appUrl}/flows/${seedId}`,\n },\n };\n if (teardownId) {\n result.teardown = {\n id: teardownId,\n name: teardownName,\n status: 'draft',\n flowType: 'teardown',\n url: `${appUrl}/flows/${teardownId}`,\n };\n }\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n\\u2713 Seed workflow created: ${input.name}`);\n console.log(` ID: ${seedId}`);\n console.log(` Status: ${input.status ?? 'draft'}`);\n if (input.outputs && input.outputs.length > 0) {\n const keys = input.outputs.map((o) => o.dataKey).join(', ');\n console.log(` Outputs: ${keys}${!outputsSaved ? ' (save failed)' : ''}`);\n }\n console.log(` URL: ${appUrl}/flows/${seedId}`);\n\n if (teardownId) {\n console.log(`\\n\\u2713 Teardown workflow created: ${teardownName}`);\n console.log(` ID: ${teardownId}`);\n console.log(` URL: ${appUrl}/flows/${teardownId}`);\n }\n}\n\nfunction printSeedCreateHelp(): void {\n console.log(\n [\n 'Usage: canary workflow seed create [options]',\n '',\n 'Create a seed workflow with declared outputs and an optional paired teardown.',\n '',\n 'Flag-based input:',\n ' --name <name> Seed workflow name (required)',\n ' --description <desc> Description',\n ' --output <key:name[:desc]> Declare an output (repeatable)',\n ' --outputs-json <json> Full outputs array as inline JSON (for credential configs)',\n ' --no-teardown Skip creating paired teardown workflow',\n ' --status <status> Initial status (default: draft)',\n ' --json Output raw JSON',\n '',\n 'JSON input:',\n ' --from-stdin Read full config from stdin',\n ' --from-file <path> Read full config from file',\n '',\n 'Examples:',\n ' canary workflow seed create --name \"Create Project\" --output \"project_id:Project ID\"',\n '',\n ' canary workflow seed create --from-stdin <<\\'EOF\\'',\n ' {',\n ' \"name\": \"Create Test User\",',\n ' \"outputs\": [{',\n ' \"dataKey\": \"user_cred\",',\n ' \"name\": \"Test User Credential\",',\n ' \"credentialOutput\": {',\n ' \"fieldMapping\": { \"username\": \"$generate.email\", \"password\": \"Test123!\" },',\n ' \"emailPrefix\": \"testuser\",',\n ' \"createInboxRecipient\": true',\n ' }',\n ' }]',\n ' }',\n ' EOF',\n ].join('\\n')\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,OAAOA,SAAQ;AACf,OAAOC,eAAa;;;ACEpB,OAAO,QAAQ;AACf,OAAO,aAAa;AAkDpB,eAAeC,iBAAiC;AAC9C,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAQ,QAAQ;AAEtB,MAAI,MAAM,OAAO;AACf,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,GAAG,QAAQ,CAAC,UAAU;AAC1B,aAAO,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IACpE,CAAC;AACD,UAAM,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AACtE,UAAM,GAAG,SAAS,MAAM;AAAA,EAC1B,CAAC;AACH;AAEA,eAAe,kBAAkB,MAA8C;AAC7E,MAAI;AAEJ,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,MAAM,GAAG,SAAS,UAAU,OAAO;AAAA,IAC3C,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,uBAAuB,QAAQ,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACxG;AAAA,EACF,OAAO;AACL,UAAM,MAAMA,eAAc;AAAA,EAC5B;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,QAAM,QAAQ;AAEd,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AACjD,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,WAAW,GAAG;AAC3D,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAKA,QAAM,iBAAiB,OAAO,KAAK,eAAe;AAClD,aAAW,QAAQ,MAAM,OAAO;AAE9B,QAAI,OAAO,KAAK,aAAa,UAAU;AACrC,WAAK,WAAW,kBAAkB,KAAK,QAAQ;AAAA,IACjD;AACA,QAAI,CAAC,KAAK,YAAY,CAAC,eAAe,SAAS,KAAK,QAAQ,GAAG;AAC7D,YAAM,IAAI;AAAA,QACR,qBAAqB,KAAK,QAAQ,mBAAmB,eAAe,KAAK,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAIA,eAAe,oBACb,QACA,OAC+B;AAC/B,QAAM,MAAM,MAAM,MAAM,GAAG,MAAM,oBAAoB;AAAA,IACnD,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,EAC9C,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW;AACxD;AAWA,eAAe,kBACb,QACA,OACA,gBACgF;AAChF,QAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK;AAE3D,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAgB;AAClB,UAAM,QAAQ,YAAY;AAAA,MACxB,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,eAAe,YAAY;AAAA,IAC7D;AACA,QAAI,OAAO;AACT,YAAM,UAAU,aAAa,KAAK,MAAM,IAAI;AAC5C,UAAI,SAAS;AACX,gBAAQ;AAAA,UACN,wBAAwB,MAAM,IAAI;AAAA,QAEpC;AAAA,MACF;AACA,aAAO,EAAE,cAAc,MAAM,IAAI,gBAAgB,MAAM,MAAM,YAAY,MAAM,WAAW;AAAA,IAC5F;AACA,UAAM,IAAI;AAAA,MACR,2BAA2B,cAAc;AAAA;AAAA;AAAA,EAEZ,gBAAgB,WAAW,CAAC;AAAA,IAC3D;AAAA,EACF;AAGA,QAAM,WAAW,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS;AACtD,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,qCAAqC,SAAS,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,EAAE,EAAE,GAAG;AACvF,WAAO,EAAE,cAAc,SAAS,CAAC,EAAE,IAAI,gBAAgB,SAAS,CAAC,EAAE,MAAM,YAAY,SAAS,CAAC,EAAE,WAAW;AAAA,EAC9G;AAGA,QAAM,WAAW,YAAY,OAAO,CAAC,MAAM,CAAC,aAAa,KAAK,EAAE,IAAI,CAAC;AACrE,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,6BAA6B,SAAS,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,EAAE,EAAE,GAAG;AAC/E,WAAO,EAAE,cAAc,SAAS,CAAC,EAAE,IAAI,gBAAgB,SAAS,CAAC,EAAE,MAAM,YAAY,SAAS,CAAC,EAAE,WAAW;AAAA,EAC9G;AAGA,QAAM,IAAI;AAAA,IACR;AAAA;AAAA;AAAA,EAC2B,gBAAgB,WAAW,CAAC;AAAA,EACzD;AACF;AAEA,SAAS,gBAAgB,aAA2C;AAClE,SAAO,YACJ,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,YAAY,eAAe,EAAE,GAAG,EAAE,eAAe,WAAM,EAAE,YAAY,KAAK,EAAE,EAAE,EAClH,KAAK,IAAI;AACd;AAWA,eAAe,sBAAsB,MAA4C;AAC/E,QAAM,WAAW,YAAY,MAAM,sBAAsB;AACzD,QAAM,YAAY,QAAQ,MAAM,uBAAuB;AAEvD,MAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,UAAU;AACZ,UAAM,MAAM,GAAG,SAAS,UAAU,OAAO;AAAA,EAC3C,OAAO;AACL,UAAM,MAAMA,eAAc;AAAA,EAC5B;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,MAAM;AACZ,MAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,IAAI,KAAK,GAAG;AACrC,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,eAAe,oBACb,MACA,QACA,OACA,cACe;AACf,QAAM,OAAO,YAAY,MAAM,QAAQ;AACvC,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,YAAY,MAAM,cAAc;AACrD,QAAM,WAAW,YAAY,MAAM,YAAY;AAE/C,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,sBAAsB,IAAI;AAAA,EAC3C,SAAS,KAAK;AACZ,YAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAgC,EAAE,MAAM,OAAO;AACrD,MAAI,aAAc,MAAK,eAAe;AACtC,MAAI,SAAU,MAAK,iBAAiB;AAEpC,QAAM,MAAM,MAAM,YAAY,GAAG,MAAM,uCAAuC;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,KAAK;AAAA,MAC9B,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,QAAM,MAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAQ9C,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACnC,UAAM,aAAa,QAAQ,MAAM,QAAQ,KAAK,CAAC,QAAQ,OAAO;AAC9D,QAAI,IAAI,SAAS,0BAA0B,MAAM,QAAQ,IAAI,MAAM,GAAG;AACpE,UAAI,YAAY;AACd;AAAA,UAAe,KAAK;AAAA,YAChB;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,IAAI,SAAS;AAAA,cACpB,MAAM;AAAA,cACN,YAAY,IAAI,OAAO;AAAA,cACvB,QAAQ,IAAI;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU,IAAI,SAAS,uCAAuC,EAAE;AAC9E,gBAAQ,MAAM,SAAS,IAAI,OAAO,MAAM,SAAS,IAAI,OAAO,WAAW,IAAI,KAAK,GAAG,GAAG;AACtF,gBAAQ,MAAM,EAAE;AAChB,mBAAW,SAAS,IAAI,QAAQ;AAC9B,kBAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,MAAM,IAAI,QAAQ,MAAM,OAAO,EAAE;AAC/E,cAAI,MAAM,KAAM,SAAQ,MAAM,aAAa,MAAM,IAAI,EAAE;AAAA,QACzD;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,UAAU,IAAI,SAAS,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE,EAAE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,MAAM,QAAQ,KAAK,CAAC,QAAQ,OAAO,OAAO;AACpD,mBAAe,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC;AACpE;AAAA,EACF;AAEA,QAAM,SAAS,iBAAiB,QAAQ,YAAY;AACpD,UAAQ,IAAI;AAAA,oCAAuC,IAAI,EAAE;AACzD,UAAQ,IAAI,sBAAsB,IAAI,KAAK,UAAU,EAAE;AACvD,UAAQ,IAAI,sBAAsB,IAAI,KAAK,aAAa,EAAE;AAC1D,MAAI,IAAI,KAAK,OAAQ,SAAQ,IAAI,sBAAsB,IAAI,KAAK,MAAM,EAAE;AACxE,UAAQ,IAAI,sBAAsB,OAAO,MAAM,MAAM,EAAE;AACvD,UAAQ,IAAI,sBAAsB,MAAM,UAAU,IAAI,KAAK,UAAU,EAAE;AACvE,UAAQ,IAAI;AAAA,QAAW;AACvB,UAAQ,IAAI,wCAAwC,IAAI,KAAK,UAAU,EAAE;AACzE,UAAQ,IAAI,2CAA2C,IAAI,KAAK,UAAU,uBAAuB;AACjG,UAAQ,IAAI,4CAA4C,IAAI,KAAK,UAAU,EAAE;AAC/E;AAIA,eAAsB,qBACpB,MACA,QACA,OACA,cACe;AACf,MAAI,QAAQ,MAAM,YAAY,GAAG;AAC/B,UAAM,oBAAoB,MAAM,QAAQ,OAAO,YAAY;AAC3D;AAAA,EACF;AAKA,MAAI,QAAQ,MAAM,mBAAmB,GAAG;AACtC,YAAQ;AAAA,MACN;AAAA,IAEF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,kBAAkB,IAAI;AAAA,EACtC,SAAS,KAAK;AACZ,YAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAa,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AACnE,aAAW,aAAa,YAAY;AAClC,UAAM,SAAS,UAAU,cAAc,CAAC;AAIxC,UAAM,oBACJ,OAAO,qBAAqB,mBAC5B,OAAO,qBAAqB,eAC5B,QAAQ,OAAO,wBAAwB,OAAO,uBAAuB,OAAO,iBAAiB;AAC/F,QAAI,CAAC,qBAAqB,OAAO,iBAAiB,SAAS,CAAC,OAAO,gBAAgB,CAAC,MAAM,cAAc;AACtG,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,QACT;AACA,eAAO,eAAe,SAAS;AAC/B,eAAO,iBAAiB,SAAS;AACjC,kBAAU,aAAa;AACvB,YAAI,SAAS,cAAc,CAAC,MAAM,YAAY;AAC5C,gBAAM,aAAa,SAAS;AAAA,QAC9B;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAMA,QAAM,aAAa;AAGnB,QAAM,MAAM,MAAM,YAAY,GAAG,MAAM,gCAAgC;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,KAAK;AAAA,MAC9B,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,MAAM,KAAK,UAAU,KAAK;AAAA,EAC5B,CAAC;AAED,QAAM,SAAU,MAAM,IAAI,KAAK;AAE/B,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,UAAU;AAIlC,UAAM,WAAW,wBAAwB,MAA4C;AACrF,YAAQ,MAAM,YAAY,UAAU,OAAO,SAAS,2BAA2B,EAAE;AACjF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,UAAU,OAAO,MAAM,IAAI;AAEnC,QAAM,EAAE,SAAS,IAAI;AAErB,UAAQ,IAAI;AAAA,2BAA8B,SAAS,IAAI,EAAE;AACzD,UAAQ,IAAI,SAAS,SAAS,EAAE,EAAE;AAClC,UAAQ,IAAI,aAAa,SAAS,MAAM,EAAE;AAC1C,UAAQ,IAAI,YAAY,OAAO,UAAU,CAAC,EAAE;AAC5C,UAAQ,IAAI,YAAY,OAAO,UAAU,CAAC,EAAE;AAE5C,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,YAAQ,IAAI;AAAA,YAAe;AAC3B,eAAW,KAAK,UAAU;AACxB,cAAQ,IAAI,cAAc,CAAC,EAAE;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,SAAS,iBAAiB,QAAQ,YAAY;AACpD,UAAQ,IAAI,UAAU,MAAM,UAAU,SAAS,EAAE,EAAE;AAGnD,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,SAAS;AAAA,IACvB,CAAC;AACD,QAAI,WAAW;AACb,cAAQ,IAAI,WAAW,UAAU,OAAO,MAAM,WAAW;AAAA,IAC3D;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM;AAAA;AAAA,EAA2B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC3F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ;AAAA,IACN;AAAA,sCAAyC,SAAS,EAAE,6CACtB,SAAS,EAAE;AAAA,EAE3C;AACF;;;AC/dA,OAAOC,SAAQ;AACf,OAAOC,cAAa;;;AC0Cb,SAAS,SAAS,MAAc,KAAqB;AAC1D,MAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,SAAO,KAAK,MAAM,GAAG,MAAM,CAAC,IAAI;AAClC;AAEO,SAAS,aAAa,MAA6C;AACxE,QAAM,IAAI,KAAK,cAAc,CAAC;AAC9B,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AACH,aAAQ,EAAE,kBAA6B,gBAAgB;AAAA,IACzD,KAAK;AACH,aAAQ,EAAE,aAAwB,SAAU,EAAE,WAAsB,YAAY,EAAE;AAAA,IACpF,KAAK;AACH,aACG,EAAE,qBAAgC,SAAU,EAAE,qBAAgC,UAAU,EAAE;AAAA,IAE/F,KAAK;AACH,aAAO,SAAU,EAAE,aAAwB,aAAa,EAAE;AAAA,IAC5D,KAAK;AACH,aAAQ,EAAE,iBAA4B;AAAA,IACxC,KAAK;AACH,aAAQ,EAAE,oBAA+B;AAAA,IAC3C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,SAAU,EAAE,wBAAmC,aAAa,EAAE;AAAA,IACvE,KAAK;AACH,aAAO,SAAU,EAAE,QAAmB,gBAAgB,mBAAmB,EAAE;AAAA,IAC7E,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,KAAK;AAAA,EAChB;AACF;AAEA,SAAS,eAAe,MAA8D;AACpF,QAAM,IAAI,KAAK,cAAc,CAAC;AAC9B,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AAGH,aAAO,KAAK,GAAG;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AACH,aAAO;AAAA,QACL,GAAG,KAAK,GAAG,CAAC,WAAW,WAAW,CAAC;AAAA,QACnC,GAAI,EAAE,eAAe,EAAE,cAAc,KAAK,IAAI,CAAC;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO,KAAK,GAAG;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AAIH,aAAO;AAAA,QACL,GAAG,KAAK,GAAG,CAAC,aAAa,eAAe,mBAAmB,UAAU,gBAAgB,CAAC;AAAA,QACtF,UAAU,EAAE,aAAa,EAAE,WAAW,OAAO,SAAS;AAAA,MACxD;AAAA,IACF,KAAK;AACH,aAAO,KAAK,GAAG,CAAC,eAAe,eAAe,CAAC;AAAA,IACjD,KAAK;AACH,aAAO,KAAK,GAAG,CAAC,kBAAkB,oBAAoB,iBAAiB,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,KAAK,GAAG,CAAC,SAAS,CAAC;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,KAAK,KAA8B,MAAyC;AACnF,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,GAAG,MAAM,UAAa,IAAI,GAAG,MAAM,MAAM;AAC/C,aAAO,GAAG,IAAI,IAAI,GAAG;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,UAAmC;AACxE,QAAM,cAAc,SAAS,mBAAmB,SAAS;AACzD,SAAO,eAAe,EAAE,GAAG,UAAU,YAAY,CAAC;AACpD;AAEO,SAAS,mBAAmB,UAAmC;AACpE,QAAM,SAAS,eAAe,SAAS,OAAO,SAAS,SAAS,CAAC,CAAC;AAClE,QAAM,cAAc,SAAS;AAC7B,QAAM,MAAM;AAEZ,SAAO;AAAA,IACL,UAAU;AAAA,MACR,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,aAAa,SAAS;AAAA,MACtB,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,GAAI,IAAI,iBAAiB,SAAY,EAAE,cAAc,IAAI,aAAa,IAAI,CAAC;AAAA,MAC3E,GAAI,eAAe,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,MAC/D,GAAI,IAAI,yBAAyB,SAC7B,EAAE,sBAAsB,IAAI,qBAAqB,IACjD,CAAC;AAAA,MACL,GAAI,IAAI,yBAAyB,EAAE,wBAAwB,IAAI,uBAAuB,IAAI,CAAC;AAAA,MAC3F,GAAI,IAAI,qBAAqB,IAAI,kBAAkB,SAAS,IACxD;AAAA,QACE,mBAAmB,IAAI,kBAAkB,IAAI,CAAC,OAAO;AAAA,UACnD,aAAa,GAAG,EAAE,eAAe,KAAK,EAAE,eAAe;AAAA,UACvD,YAAY,EAAE;AAAA,UACd,QAAQ,EAAE;AAAA,UACV,OAAO,EAAE;AAAA,UACT,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,MACJ,IACA,CAAC;AAAA,IACP;AAAA,IACA,OAAO,OAAO,IAAI,CAAC,MAAM,OAAO;AAAA,MAC9B,OAAO,IAAI;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA;AAAA;AAAA,MAGf,OACE,KAAK,aAAa,YAAY,CAAE,KAAK,YAAY,oBAC7C,OACA,aAAa,IAAI;AAAA,MACvB,QAAQ,eAAe,IAAI;AAAA,IAC7B,EAAE;AAAA,EACJ;AACF;;;AD9KO,SAAS,8BAA8B,MAAyB;AACrE,QAAM,aAAa,QAAQ,MAAM,QAAQ,KAAK,YAAY,MAAM,UAAU,MAAM;AAChF,QAAM,iBACJ,QAAQ,MAAM,YAAY,KAC1B,YAAY,MAAM,UAAU,MAAM,cAClC,YAAY,MAAM,UAAU,MAAM;AACpC,SAAO,CAAC,cAAc,CAAC;AACzB;AAEA,eAAsB,kBACpB,MACA,QACA,OACA,cACe;AACf,QAAM,aAAa,KAAK,CAAC;AACzB,MAAI,CAAC,cAAc,WAAW,WAAW,IAAI,GAAG;AAC9C,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,yCAAyC;AACvD,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBACJ,QAAQ,MAAM,YAAY,KAC1B,YAAY,MAAM,UAAU,MAAM,cAClC,YAAY,MAAM,UAAU,MAAM;AACpC,QAAM,aAAa,YAAY,MAAM,UAAU;AAE/C,QAAM,SAAS,MAAM,SAAS,GAAG,MAAM,cAAc,UAAU,IAAI;AAAA,IACjE,SAAS,EAAE,eAAe,UAAU,KAAK,IAAI,gBAAgB,mBAAmB;AAAA,IAChF;AAAA,EACF,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,eAAc,OAAO,OAAO;AAC5C,QAAM,SAAU,MAAM,OAAO,SAAS,KAAK;AAE3C,MAAI,OAAO,UAAU,sBAAsB;AACzC,YAAQ,MAAM,4BAA4B;AAC1C,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,OAAO,UAAU,sBAAsB;AACzC,YAAQ;AAAA,MACN,2CAA2C,OAAO,iBAAiB,OAAO,WAAW;AAAA,IACvF;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,CAAC,OAAO,UAAU;AACpB,YAAQ,MAAM,UAAU,OAAO,SAAS,qBAAqB,EAAE;AAC/D,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,OAAO;AACxB,MAAI;AAEJ,MAAI,gBAAgB;AAClB,aAAS,uBAAuB,QAAQ;AAAA,EAC1C,OAAO;AAEL,aAAS,KAAK,UAAU,mBAAmB,QAAQ,GAAG,MAAM,CAAC;AAAA,EAC/D;AAEA,MAAI,YAAY;AACd,QAAI;AACF,YAAMC,IAAG,UAAU,YAAY,QAAQ,OAAO;AAC9C,cAAQ,IAAI,cAAc,UAAU,EAAE;AAAA,IACxC,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,oBAAoB,UAAU,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACrF;AACA,MAAAD,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,iBAAe,MAAM;AAErB,MAAI,8BAA8B,IAAI,GAAG;AACvC,UAAM,SAAS,iBAAiB,QAAQ,YAAY;AACpD,YAAQ,IAAI;AAAA,OAAU,MAAM,UAAU,UAAU,EAAE;AAAA,EACpD;AACF;;;AEnGA,OAAOE,cAAa;AA4Bb,SAAS,wBAAwB,MAG7B;AACT,QAAM,QAAQ;AAAA,IACZ,cAAc,KAAK,WAAW,UAAU,gBAAgB,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,UAAU;AAAA,IAC1G;AAAA,EACF;AAEA,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,UAAM,KAAK,qBAAqB;AAChC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,MAAM;AACZ,QAAM,QAAQ;AACd,QAAM,UAAU;AAChB,QAAM,QAAQ;AAEd,QAAM;AAAA,IACJ,CAAC,KAAK,OAAO,GAAG,GAAG,OAAO,OAAO,KAAK,GAAG,SAAS,OAAO,OAAO,GAAG,OAAO,OAAO,KAAK,CAAC,EAAE;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,KAAK,MAAM;AAChC,UAAM;AAAA,MACJ;AAAA,QACE,SAAS,GAAG,OAAO,GAAG;AAAA,QACtB,SAAS,SAAS,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA,QAC3C,SAAS,OAAO,OAAO,OAAO;AAAA,QAC9B,SAAS,SAAS,OAAO,KAAK;AAAA,MAChC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,mBACpB,MACA,QACA,OACe;AACf,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAEzC,QAAM,SAAS,IAAI,gBAAgB;AACnC,QAAM,SAAS,YAAY,MAAM,UAAU;AAC3C,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,QAAM,SAAS,YAAY,MAAM,UAAU;AAC3C,QAAM,OAAO,YAAY,MAAM,QAAQ;AACvC,QAAM,WAAW,YAAY,MAAM,aAAa;AAEhD,MAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,MAAI,SAAU,QAAO,IAAI,YAAY,QAAQ;AAC7C,MAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,MAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,MAAI,SAAU,QAAO,IAAI,YAAY,QAAQ;AAE7C,QAAM,KAAK,OAAO,SAAS;AAC3B,QAAM,OAAO,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE;AAE5C,QAAM,SAAS,MAAM,WAAiC,QAAQ,OAAO,OAAO,IAAI;AAEhF,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AACtC,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,EAAE,MAAM,OAAO,MAAM,YAAY,OAAO,WAAW,GAAG,MAAM,CAAC,CAAC;AAC5F;AAAA,EACF;AAEA,iBAAe,wBAAwB,EAAE,MAAM,OAAO,MAAM,YAAY,OAAO,WAAW,CAAC,CAAC;AAC9F;;;AChGA,OAAOC,cAAa;AAMpB,IAAM,QAAQ;AAEd,eAAsB,qBAAqB,MAAgB,QAAgB,OAA8B;AACvG,QAAM,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,YAAY;AACxF,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,wBAAwB;AACtC,YAAQ,MAAM,KAAK;AACnB,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,wBAAwB,EAAE,OAAO,oBAAoB,YAAY,MAAM,YAAY,GAAG,QAAQ,MAAM,CAAC;AAAA,EAC1H,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,MAAM,iDAAiD;AAC/D,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,SAAS,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,MAAM,QAAQ,GAAG;AAC3B,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChD,WAAW,OAAO,IAAI;AACpB,YAAQ,IAAI,iBAAiB,KAAK,GAAG;AAAA,EACvC,OAAO;AACL,YAAQ,MAAM,UAAU,OAAO,SAAS,0BAA0B,EAAE;AAAA,EACtE;AACA,MAAI,CAAC,OAAO,GAAI,CAAAA,SAAQ,KAAK,CAAC;AAChC;;;ACpCA,OAAOC,cAAa;;;ACIpB,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,QAAiC,KAAsB;AAChF,SAAO,OAAO,GAAG,MAAM,UAAa,OAAO,OAAO,GAAG,MAAM;AAC7D;AAEO,SAAS,yBAAyB,OAAiD;AACxF,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,SACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,aAAa,YAC1B,OAAO,MAAM,cAAc,YAC3B,OAAO,MAAM,iBAAiB,YAC9B,OAAO,MAAM,iBAAiB,YAC9B,kBAAkB,OAAO,UAAU,KACnC,kBAAkB,OAAO,SAAS,KAClC,kBAAkB,OAAO,oBAAoB,KAC7C,kBAAkB,OAAO,iBAAiB,MACzC,MAAM,oBAAoB,UAAa,OAAO,MAAM,oBAAoB,aACzE,kBAAkB,OAAO,OAAO;AAEpC;AAEO,SAAS,oBACd,cAC+B;AAC/B,QAAM,SAAS,cAAc;AAC7B,SAAO,yBAAyB,MAAM,IAAI,SAAS;AACrD;AAEO,SAAS,uBAAuB,QAA0C;AAC/E,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,WAAW,OAAO,QAAQ;AAAA,IAC1B,oBAAoB,OAAO,YAAY;AAAA,IACvC,oBAAoB,OAAO,YAAY;AAAA,EACzC;AAEA,MAAI,OAAO,oBAAoB;AAC7B,UAAM,KAAK,aAAa,OAAO,kBAAkB,EAAE;AAAA,EACrD;AACA,MAAI,OAAO,oBAAoB,QAAW;AACxC,UAAM,KAAK,wBAAwB,OAAO,eAAe,EAAE;AAAA,EAC7D;AACA,MAAI,OAAO,OAAO;AAChB,UAAM,KAAK,YAAY,OAAO,KAAK,EAAE;AAAA,EACvC;AAEA,SAAO;AACT;;;ADZA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAMA,eAAsB,kBACpB,MACA,QACA,OACA,cACe;AAGf,QAAM,iBAAiB,YAAY,MAAM,eAAe;AACxD,QAAM,cAAc,YAAY,MAAM,YAAY;AAClD,QAAM,gBAAgB,YAAY,MAAM,eAAe;AACvD,QAAM,iBAAiB,YAAY,MAAM,gBAAgB;AACzD,QAAM,aAAa,YAAY,MAAM,WAAW;AAChD,QAAM,aAAa,YAAY,MAAM,WAAW;AAChD,QAAM,iBAAiB,YAAY,MAAM,eAAe,KAAK,YAAY,MAAM,YAAY;AAC3F,QAAM,aAAa,IAAI;AAAA,IACrB,CAAC,gBAAgB,aAAa,eAAe,gBAAgB,YAAY,YAAY,cAAc,EAAE;AAAA,MAAO,CAAC,MAC3G,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AACA,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;AAC5E,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,MAAM,qEAAqE;AACnF,YAAQ,MAAM,kGAAkG;AAChH,YAAQ,MAAM,8GAA8G;AAC5H,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,SAAS,QAAQ,MAAM,UAAU;AACvC,QAAM,YAAY,QAAQ,MAAM,cAAc;AAC9C,QAAM,kBAAkB,UAAU;AAClC,QAAM,cAAuC;AAAA,IAC3C,eAAe;AAAA,EACjB;AACA,MAAI,QAAQ,MAAM,YAAY,KAAK,CAAC,wBAAwB,WAAW,GAAG;AACxE,YAAQ,MAAM,+EAA+E;AAC7F,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,gBAAgB,OAAW,aAAY,eAAe;AAC1D,MAAI,WAAW;AACb,gBAAY,YAAY;AAAA,EAC1B;AACA,MAAI,eAAe;AACjB,gBAAY,aAAa;AAAA,EAC3B;AAEA,MAAI,YAAY;AACd,gBAAY,qBAAqB;AAAA,EACnC;AAEA,MAAI,YAAY;AACd,UAAM,WAAW,OAAO,UAAU;AAClC,QAAI,CAAC,aAAa,KAAK,UAAU,GAAG;AAClC,cAAQ,MAAM,+CAA+C;AAC7D,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,YAAY;AACd,cAAQ,MAAM,oEAAoE;AAClF,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY,UAAU,EAAE,eAAe,MAAM,qBAAqB,MAAM,QAAQ,KAAK,GAAG,SAAS;AAAA,EACnG;AACA,MAAI,gBAAgB;AAClB,QAAI,mBAAmB,YAAY,mBAAmB,YAAY;AAChE,cAAQ,MAAM,mDAAmD;AACjE,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY,cAAc;AAAA,EAC5B;AAOA,MAAI;AACJ,MAAI,gBAAgB;AAClB,UAAM,OAAO,MAAM,0BAA0B,QAAQ,OAAO,UAAU;AACtE,4BAAwB,6BAA6B,MAAM,cAAc;AACzE,gBAAY,gBAAgB;AAAA,EAC9B;AAGA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,YAAM,WAAW,wBAAwB,MAA4C;AACrF,cAAQ,MAAM,YAAY,UAAU,OAAO,SAAS,eAAe,EAAE;AAAA,IACvE;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,MAAM,GAAG,iBAAiB,QAAQ,YAAY,CAAC,UAAU,UAAU,UAAU,KAAK;AAExF,MAAI,cAAc,CAAC,iBAAiB;AAClC,mBAAe,KAAK,UAAU,EAAE,IAAI,MAAM,OAAO,UAAU,OAAO,UAAU,IAAI,GAAG,MAAM,CAAC,CAAC;AAC3F;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB;AACpB,YAAQ,IAAI,6BAA6B;AACzC,YAAQ,IAAI,aAAa,KAAK,EAAE;AAChC,YAAQ,IAAI,aAAa,GAAG,EAAE;AAC9B,QAAI,gBAAgB;AAClB,cAAQ,IAAI,kBAAkB,cAAc,KAAK,qBAAqB,GAAG;AAAA,IAC3E;AACA,YAAQ,IAAI;AAAA,yCAA4C,UAAU,IAAI,KAAK,EAAE;AAC7E;AAAA,EACF;AAGA,MAAI,CAAC,YAAY;AACf,YAAQ,IAAI,kBAAkB,KAAK;AAAA,CAAgC;AAAA,EACrE;AAEA,QAAM,mBAAmB,oBAAI,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,aAAS;AACP,QAAI,CAAC,UAAW,OAAM,MAAM,GAAI;AAChC,gBAAY;AAEZ,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU,SAAS,KAAK;AAAA,IACxC;AAEA,QAAI,CAAC,OAAO,IAAI;AACd,UAAI,YAAY;AACd,uBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAChD,OAAO;AACL,gBAAQ,MAAM,yBAAyB,OAAO,SAAS,eAAe,EAAE;AAAA,MAC1E;AACA,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,MAAM,OAAO,KAAK;AAExB,QAAI,aAAa,IAAI,cAAc,cAAc,MAAM;AACrD,YAAM,aAAa,iBAAiB,IAAI,IAAI,MAAM;AAClD,YAAM,eAAe,aACjB,OACA,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,UAAU,SAAS,KAAK;AAAA,QACtC,CAAC;AAAA,MACH;AACJ,YAAM,sBAAsB,aACxB,8DACA,cAAc,KACZ,mDACA,kCAAkC,cAAc,SAAS,eAAe;AAC9E,YAAM,QACJ,qFACA,sBACA;AAEF,UAAI,YAAY;AACd;AAAA,UAAe,KAAK;AAAA,YAChB,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,UAAU,KAAK,QAAQ,IAAI,QAAQ,MAAM;AAAA,YAC9E;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU,KAAK,EAAE;AAC/B,gBAAQ,MAAM,WAAW,KAAK,EAAE;AAAA,MAClC;AACA,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,cAAc,IAAI,WAAW,YAAY;AAC5C,cAAQ,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE;AACvD,mBAAa,IAAI;AAAA,IACnB;AAEA,QAAI,iBAAiB,IAAI,IAAI,MAAM,GAAG;AACpC,YAAM,mBAAmB,oBAAoB,IAAI,YAAY;AAE7D,UAAI,YAAY;AACd;AAAA,UAAe,KAAK;AAAA,YAChB;AAAA,cACE,IAAI,CAAC,CAAC,UAAU,WAAW,UAAU,EAAE,SAAS,IAAI,MAAM;AAAA,cAC1D;AAAA,cACA,UAAU,OAAO;AAAA,cACjB;AAAA,cACA,QAAQ,IAAI;AAAA,cACZ,OAAO,IAAI;AAAA,cACX,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,YACjD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,IAAI,cAAc;AACpB,yBAAe;AAAA,SAAY,IAAI,YAAY,EAAE;AAAA,QAC/C;AACA,YAAI,IAAI,WAAW,YAAY,kBAAkB;AAC/C,kBAAQ,IAAI,EAAE;AACd,qBAAW,QAAQ,uBAAuB,gBAAgB,GAAG;AAC3D,2BAAe,IAAI;AAAA,UACrB;AAAA,QACF;AACA,gBAAQ,IAAI;AAAA,gBAAmB,IAAI,MAAM,EAAE;AAC3C,gBAAQ,IAAI,QAAQ,GAAG,EAAE;AACzB,gBAAQ,IAAI,qCAAqC,UAAU,IAAI,KAAK,EAAE;AAAA,MACxE;AAEA,UAAI,IAAI,WAAW,gBAAgB;AACjC,QAAAA,SAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa,IAAI,WAAW,YAAY;AACpF,QAAAA,SAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,EACF;AACF;;;AEzSA,OAAOC,cAAa;AAwGpB,SAAS,mBACP,KACe;AACf,MAAI,IAAI,WAAY,QAAO,qBAAqB,IAAI,WAAW,IAAI,UAAU;AAC7E,MAAI,IAAI,OAAO,YAAY,MAAM,aAAa,IAAI,WAAW;AAC3D,WAAO,qBAAqB,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AA8BA,eAAe,iBACb,QACA,OACA,YACA,MACA,UAC6E;AAC7E,QAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACrD,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,SAAS,MAAM;AAAA,EACzC;AACA,MAAI,CAAC,OAAO,GAAI,QAAO,EAAE,OAAO,OAAO,SAAS,gBAAgB;AAChE,SAAO,EAAE,MAAM,OAAO,KAAK,MAAM,YAAY,OAAO,WAAW;AACjE;AAEA,eAAe,aACb,QACA,OACA,YACA,MACA,UAGA;AACA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B,UAAU;AAAA,EAC1C;AACA,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,OAAO,OAAO,SAAS;AAAA,MACvB,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,CAAC,OAAO,KAAM,QAAO,EAAE,MAAM,CAAC,GAAG,YAAY,KAAK;AACtD,QAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACrD,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,OAAO,KAAK,EAAE,SAAS,MAAM;AAAA,EACjD;AACA,MAAI,CAAC,QAAQ,GAAI,QAAO,EAAE,OAAO,QAAQ,SAAS,gBAAgB;AAClE,QAAM,QAAsB,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,IAC1D,IAAI,EAAE;AAAA,IACN,QAAQ,EAAE;AAAA,IACV,WAAW,EAAE,aAAa,EAAE,cAAa,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,IACjE,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,IACd,cAAc,EAAE;AAAA,IAChB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB,EAAE;AACF,SAAO,EAAE,MAAM,YAAY,QAAQ,cAAc,KAAK;AACxD;AAEA,eAAe,eAAe,MAAgB,QAAgB,OAA8B;AAC1F,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,2EAA2E;AACzF,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,OAAO,YAAY,MAAM,QAAQ,KAAK;AAC5C,QAAM,WAAW,YAAY,MAAM,aAAa,KAAK;AACrD,QAAM,eAAe,YAAY,MAAM,QAAQ,KAAK,YAAY,MAAM,QAAQ;AAC9E,QAAM,WAAW,gBAAgB,OAAO,YAAY;AAEpD,MAAI,CAAC,CAAC,OAAO,OAAO,SAAS,EAAE,SAAS,OAAO,GAAG;AAChD,YAAQ,MAAM,yDAAyD,OAAO,IAAI;AAClF,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAA4B,CAAC;AACnC,MAAI,oBAAuC;AAC3C,MAAI,gBAAmC;AAEvC,MAAI,YAAY,aAAa,YAAY,OAAO;AAC9C,UAAM,UAAU,MAAM,iBAAiB,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAChF,QAAI,WAAW,SAAS;AACtB,cAAQ,MAAM,UAAU,QAAQ,KAAK,EAAE;AACvC,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,wBAAoB,QAAQ;AAC5B,eAAW,KAAK,QAAQ,KAAM,WAAU,KAAK,EAAE,GAAG,GAAG,MAAM,UAAU,CAAC;AAAA,EACxE;AAEA,MAAI,YAAY,SAAS,YAAY,OAAO;AAC1C,UAAM,MAAM,MAAM,aAAa,QAAQ,OAAO,YAAY,MAAM,QAAQ;AACxE,QAAI,WAAW,KAAK;AAGlB,YAAM,oBAAoB,IAAI,SAAS;AACvC,UAAI,CAAC,gBAAgB,mBAAmB;AACtC,YAAI,CAAC,YAAY;AACf,kBAAQ,MAAM,sEAAiE;AAAA,QACjF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU,IAAI,KAAK,EAAE;AACnC,QAAAA,SAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,OAAO;AACL,sBAAgB,IAAI;AACpB,iBAAW,KAAK,IAAI,KAAM,WAAU,KAAK,EAAE,GAAG,GAAG,MAAM,MAAM,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,YAAU,KAAK,CAAC,GAAG,MAAM;AACvB,UAAM,KAAK,IAAI,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ;AACxD,UAAM,KAAK,IAAI,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ;AACxD,WAAO,KAAK;AAAA,EACd,CAAC;AAED,MAAI,YAAY;AACd;AAAA,MACE,KAAK;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,MAAM,EAAE,MAAM,UAAU;AAAA,UACxB,YAAY,EAAE,SAAS,mBAAmB,KAAK,cAAc;AAAA,QAC/D;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAI,gBAAgB;AAC5B;AAAA,EACF;AAEA,UAAQ,IAAI,SAAS,UAAU,MAAM,gBAAgB,OAAO;AAAA,CAAK;AACjE,QAAM,MAAM;AACZ,QAAM,QAAQ;AACd,QAAM,UAAU;AAChB,QAAM,YAAY;AAClB,UAAQ;AAAA,IACN;AAAA,MACE,KAAK,OAAO,GAAG;AAAA,MACf,OAAO,OAAO,KAAK;AAAA,MACnB,SAAS,OAAO,OAAO;AAAA,MACvB,WAAW,OAAO,SAAS;AAAA,MAC3B;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,aAAW,OAAO,WAAW;AAC3B,UAAM,OAAO,WAAW,IAAI,MAAM;AAClC,UAAM,MAAM,gBAAgB,IAAI,WAAW,IAAI,UAAU;AACzD,UAAM,OAAO,eAAe,IAAI,aAAa,IAAI,SAAS;AAC1D,YAAQ;AAAA,MACN;AAAA,QACE,IAAI,GAAG,OAAO,GAAG;AAAA,QACjB,IAAI,IAAI,MAAM,KAAK;AAAA,QACnB,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,UAAU,CAAC,CAAC;AAAA,QACvC,IAAI,KAAK,SAAS;AAAA,QAClB;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,cAAc,MAAgB,QAAgB,OAA8B;AACzF,QAAM,aAAa,KAAK;AAAA,IAAO,CAAC,GAAG,UACjC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,UAAU,YAAY,EAAE,SAAS,KAAK,QAAQ,CAAC,KAAK,EAAE;AAAA,EAChF;AACA,QAAM,CAAC,YAAY,KAAK,IAAI;AAC5B,MAAI,CAAC,cAAc,CAAC,OAAO;AACzB,YAAQ,MAAM,kFAAkF;AAChG,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,YAAY,YAAY,MAAM,QAAQ;AAC5C,QAAM,YAAY,YAAY,MAAM,YAAY;AAChD,MAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,UAAU,YAAY,EAAE;AAAA,IAC9C,CAAC,SAAS,QAAQ,QAAQ,IAAI,WAAW,GAAG,IAAI,GAAG;AAAA,EACrD,CAAC,GAAG;AACF,QAAI,CAAC,aAAa,UAAU,WAAW,GAAG,KAAK,CAAC,aAAa,UAAU,WAAW,GAAG,GAAG;AACtF,cAAQ,MAAM,6EAA6E;AAC3F,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAMC,UAAS,MAAM;AAAA,MAIlB;AAAA,MAAQ;AAAA,MAAO;AAAA,MAChB,cAAc,mBAAmB,UAAU,CAAC,SAAS,mBAAmB,KAAK,CAAC,UACpE,mBAAmB,SAAS,CAAC,cAAc,mBAAmB,SAAS,CAAC;AAAA,IACpF;AACA,QAAI,CAACA,QAAO,IAAI;AACd,cAAQ,MAAM,UAAUA,QAAO,SAAS,eAAe,EAAE;AACzD,MAAAD,SAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,YAAY;AACd,qBAAe,KAAK,UAAUC,SAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,qBAAe;AAAA,EAAkBA,QAAO,KAAK,eAAe,EAAE,EAAE;AAChE,qBAAe;AAAA,EAAmBA,QAAO,KAAK,QAAQ,EAAE,EAAE;AAAA,IAC5D;AACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,SAAS,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AACzD,IAAAD,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,EACF;AAEA,QAAM,EAAE,IAAI,IAAI,OAAO;AACvB,QAAM,UAAU,mBAAmB,GAAG;AACtC,QAAM,QACJ,CAAC,IAAI,cAAc,IAAI,OAAO,YAAY,MAAM,YAC5C,YACA,2BAA2B,IAAI,UAAU;AAC/C,QAAM,YAAY,IAAI,cAAc,cAAc;AAClD,QAAM,mBAAmB,oBAAoB,IAAI,YAAY;AAE7D,UAAQ,IAAI,aAAa,IAAI,EAAE,EAAE;AACjC,UAAQ,IAAI,aAAa,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE;AAC/D,MAAI,WAAW;AACb,YAAQ,IAAI,sBAAsB;AAAA,EACpC;AACA,UAAQ,IAAI,eAAe,2BAA2B,IAAI,SAAS,CAAC,EAAE;AACtE,UAAQ,IAAI,eAAe,KAAK,EAAE;AAClC,UAAQ,IAAI,eAAe,wBAAwB,OAAO,CAAC,EAAE;AAE7D,MAAI,IAAI,cAAc;AACpB,mBAAe,aAAa,IAAI,YAAY,EAAE;AAAA,EAChD;AAEA,MAAI,IAAI,eAAe;AACrB,YAAQ;AAAA,MACN,cAAc,IAAI,cAAc,OAAO,YAAY,IAAI,cAAc,oBAAoB;AAAA,IAC3F;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,YAAQ,IAAI,EAAE;AACd,eAAW,QAAQ,uBAAuB,gBAAgB,GAAG;AAC3D,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAE1E,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,sBAAsB;AAClC;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,SAAY,MAAM,MAAM,IAAI;AACxC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,KAAK,aAAa,CAAC,EAAE,SAAS,CAAC;AAClD,UAAM,OAAO,WAAW,KAAK,MAAM;AACnC,UAAM,SAAS,KAAK,OAAO,MAAM,GAAG,CAAC;AACrC,UAAM,MAAM,gBAAgB,KAAK,WAAW,KAAK,UAAU;AAE3D,YAAQ,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC,IAAI,GAAG,EAAE;AAE1D,QAAI,KAAK,cAAc;AACrB,qBAAe,iBAAiB,KAAK,YAAY,EAAE;AAAA,IACrD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,sBAAsB,MAAgB,QAAgB,OAA8B;AACjG,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACxD,MAAI,WAAW,SAAS,GAAG;AACzB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,CAAC,YAAY,KAAK,IAAI;AAC5B,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAGzC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,SAAS,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AACzD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,cAAc,OAAO,MAAM;AAC7B,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,EACF;AAEA,MAAI,OAAO,MAAM;AACf,UAAM,EAAE,QAAQ,WAAW,IAAI,OAAO;AAEtC,QAAI,WAAW,aAAa,WAAW,WAAW;AAChD,cAAQ,IAAI,4CAA4C,MAAM,IAAI;AAClE;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,cAAQ,IAAI,6BAA6B;AACzC;AAAA,IACF;AAEA,QAAI,YAAY;AACd,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,eAAe,MAAM,EAAE;AACnC,UAAI,WAAW,UAAU;AACvB,gBAAQ,IAAI,eAAe,WAAW,QAAQ,EAAE;AAAA,MAClD;AACA,UAAI,WAAW,OAAO;AACpB,uBAAe,eAAe,WAAW,KAAK,EAAE;AAAA,MAClD;AACA,UAAI,WAAW,QAAQ;AACrB,uBAAe,uCAAuC,WAAW,OAAO,wBAAwB,WAAW,WAAW,OAAO,qBAAqB,MAAM,EAAE,EAAE;AAAA,MAC9J;AAEA,UAAI,WAAW,UAAU;AACvB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW;AACvB,uBAAe,KAAK,WAAW,QAAQ,EAAE;AAAA,MAC3C;AAEA,UAAI,WAAW,gBAAgB;AAC7B,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,iBAAiB;AAC7B,uBAAe,KAAK,WAAW,cAAc,EAAE;AAAA,MACjD;AAEA,UAAI,WAAW,YAAY;AACzB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,cAAc;AAC1B,uBAAe,OAAO,WAAW,WAAW,WAAW,EAAE;AACzD,YAAI,WAAW,WAAW,QAAQ;AAChC,yBAAe,OAAO,WAAW,WAAW,MAAM,EAAE;AAAA,QACtD;AAAA,MACF;AAEA,cAAQ,IAAI,EAAE;AACd;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,SAAS,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,UAAU,IAAI;AACjB,YAAQ,IAAI,uCAAuC;AACnD;AAAA,EACF;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AACjD;AAAA,EACF;AAEA,QAAM,aAAa,UAAU,eAAe,UAAU,YAAY,SAAS;AAC3E,QAAM,aAAa,UAAU,mBAAmB,UAAU,gBAAgB,SAAS;AAEnF,MAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,YAAQ,IAAI,4CAA4C;AACxD;AAAA,EACF;AAEA,MAAI,YAAY;AACd,YAAQ,IAAI,iBAAiB,UAAU,YAAY,MAAM,IAAI;AAC7D,eAAW,OAAO,UAAU,YAAY,MAAM,GAAG,EAAE,GAAG;AACpD,YAAM,QAAQ,IAAI,MAAM,YAAY,EAAE,OAAO,CAAC;AAC9C,qBAAe,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE;AAAA,IAC3C;AACA,QAAI,UAAU,YAAY,SAAS,IAAI;AACrC,cAAQ,IAAI,aAAa,UAAU,YAAY,SAAS,EAAE,OAAO;AAAA,IACnE;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,YAAQ,IAAI,qBAAqB,UAAU,gBAAgB,MAAM,IAAI;AACrE,eAAW,OAAO,UAAU,gBAAgB,MAAM,GAAG,EAAE,GAAG;AACxD,YAAM,YAAY,IAAI,UAAU,MAAM,GAAG,IAAI,MAAM,SAAS,OAAO,IAAI,MAAM;AAC7E,qBAAe,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,UAAU,OAAO,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE;AAAA,IAC9E;AACA,QAAI,UAAU,gBAAgB,SAAS,IAAI;AACzC,cAAQ,IAAI,aAAa,UAAU,gBAAgB,SAAS,EAAE,OAAO;AAAA,IACvE;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAMA,SAAS,gBAAsB;AAC7B,UAAQ;AAAA,IACN;AAAA,MACE;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;AAMA,eAAsB,gBACpB,MACA,QACA,OACe;AACf,QAAM,CAAC,YAAY,GAAG,IAAI,IAAI;AAE9B,MAAI,CAAC,cAAc,eAAe,UAAU,QAAQ,MAAM,UAAU,IAAI,GAAG;AACzE,kBAAc;AACd;AAAA,EACF;AAEA,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,YAAM,eAAe,MAAM,QAAQ,KAAK;AACxC;AAAA,IACF,KAAK;AACH,YAAM,cAAc,MAAM,QAAQ,KAAK;AACvC;AAAA,IACF,KAAK;AACH,YAAM,sBAAsB,MAAM,QAAQ,KAAK;AAC/C;AAAA,IACF;AACE,cAAQ,MAAM,wBAAwB,UAAU,EAAE;AAClD,oBAAc;AACd,MAAAA,SAAQ,KAAK,CAAC;AAAA,EAClB;AACF;;;AC3mBA,OAAO,YAAY;AACnB,OAAOE,SAAQ;AACf,OAAOC,cAAa;AAmCpB,SAAS,uBACP,UACA,UACwC;AAExC,QAAM,QAAQ,SAAS,IAAI,CAAC,MAAM,OAAO;AAAA,IACvC,GAAG;AAAA,IACH,IAAK,KAAK,MAAiB,OAAO,WAAW;AAAA,IAC7C,YAAa,KAAK,cAAyB;AAAA,IAC3C,YAAa,KAAK,cAA0C,CAAC;AAAA,EAC/D,EAAE;AAGF,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,UAAMC,SAAQ,SAAS,IAAI,CAAC,UAAU;AAAA,MACpC,GAAG;AAAA,MACH,IAAK,KAAK,MAAiB,OAAO,WAAW;AAAA,IAC/C,EAAE;AACF,WAAO,EAAE,OAAO,OAAAA,OAAM;AAAA,EACxB;AAGA,QAAM,QAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,KAAK;AAAA,MACT,IAAI,OAAO,WAAW;AAAA,MACtB,cAAc,MAAM,CAAC,EAAE;AAAA,MACvB,cAAc,MAAM,IAAI,CAAC,EAAE;AAAA,MAC3B,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,MAAM;AACxB;AAMA,eAAe,cAAc,MAAkE;AAC7F,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,QAAM,YAAY,QAAQ,MAAM,cAAc;AAE9C,MAAI;AACJ,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,MAAMC,IAAG,SAAS,UAAU,OAAO;AAAA,IAC3C,SAAS,KAAK;AACZ,cAAQ,MAAM,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACvF,MAAAC,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,WAAW,WAAW;AACpB,QAAI;AACF,YAAM,MAAM,cAAc;AAAA,IAC5B,SAAS,KAAK;AACZ,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,wDAAwD;AACtE,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,YAAQ,MAAM,2BAA2B;AACzC,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM;AAIZ,QAAM,iBAAiB,CAACC,SAA8B;AACpD,WAAOA,KAAI,IAAI,CAAC,UAAU;AACxB,UAAI,SAAS,OAAO,UAAU,YAAY,cAAc,OAAO;AAC7D,cAAM,OAAO;AACb,YAAI,OAAO,KAAK,aAAa,UAAU;AACrC,eAAK,WAAW,kBAAkB,KAAK,QAAQ;AAAA,QACjD;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO,eAAe,IAAI,KAAK;AAAA,MAC/B,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,WAAW,IAAI;AACrB,MAAI,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC7C,WAAO;AAAA,MACL,OAAO,eAAe,SAAS,KAAK;AAAA,MACpC,OAAO,MAAM,QAAQ,SAAS,KAAK,IAAI,SAAS,QAAQ;AAAA,IAC1D;AAAA,EACF;AAEA,UAAQ,MAAM,2CAA2C;AACzD,UAAQ,MAAM,mBAAmB;AACjC,UAAQ,MAAM,iEAAiE;AAC/E,UAAQ,MAAM,sCAAsC;AACpD,UAAQ,MAAM,sDAAsD;AACpE,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,sEAAsE;AACpF,EAAAD,SAAQ,KAAK,CAAC;AAChB;AAoBA,eAAe,yBACb,QACA,OACA,YACA,OACA,OACiD;AAGjD,MAAI,eAA4B,CAAC;AACjC,MAAI;AACF,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,IAC1B;AACA,QAAI,QAAQ,MAAM,QAAQ,UAAU,OAAO;AACzC,qBAAe,QAAQ,SAAS,MAAM,IAAI,CAAC,OAAO;AAAA,QAChD,IAAI,EAAE;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,YAAY,EAAE;AAAA,QACd,YAAY,EAAE,cAAc,CAAC;AAAA,MAC/B,EAAE;AAAA,IACJ;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAEA,QAAM,mBAAmB;AAAA,IACvB,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,IAAI,OAAO,EAAE,EAAE;AAAA,MACf,UAAU,OAAO,EAAE,YAAY,EAAE;AAAA,MACjC,YAAY,OAAO,EAAE,eAAe,WAAW,EAAE,aAAa;AAAA,MAC9D,YAAa,EAAE,cAA6D,CAAC;AAAA,IAC/E,EAAE;AAAA,IACF,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,IAAI,OAAO,EAAE,EAAE;AAAA,MACf,cAAc,OAAO,EAAE,YAAY;AAAA,MACnC,cAAc,OAAO,EAAE,YAAY;AAAA,MACnC,UAAW,EAAE,YAA0C;AAAA,IACzD,EAAE;AAAA,EACJ;AAEA,QAAM,EAAE,SAAS,IAAI,qBAAqB,kBAAkB,YAAY;AAIxE,QAAM,eAA0B,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,IACnD,GAAG;AAAA,IACH,IAAI,SAAS,MAAM,CAAC,EAAG;AAAA,EACzB,EAAE;AACF,QAAM,eAA0B,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,IACnD,GAAG;AAAA,IACH,cAAc,SAAS,MAAM,CAAC,EAAG;AAAA,IACjC,cAAc,SAAS,MAAM,CAAC,EAAG;AAAA,EACnC,EAAE;AAEF,SAAO,EAAE,OAAO,cAAc,OAAO,aAAa;AACpD;AAMA,eAAsB,mBACpB,MACA,QACA,OACe;AACf,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,6DAA6D;AAC3E,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,aAAa,QAAQ,MAAM,eAAe;AAChD,QAAM,UAAU,QAAQ,MAAM,WAAW;AACzC,QAAM,gBAAgB,YAAY,MAAM,SAAS;AACjD,QAAM,sBAAsB,YAAY,MAAM,eAAe;AAE7D,QAAM,MAAM,MAAM,cAAc,IAAI;AACpC,QAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,IAAI,OAAO,IAAI,KAAK;AAGpE,MAAI,SAAS;AACX,UAAM,QAAQ,iBAAiB,sBAAsB,MAAM,MAAM;AASjE,UAAM,UAAU,MAAM,yBAAyB,QAAQ,OAAO,YAAY,OAAO,KAAK;AAEtF,UAAME,UAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,MACxB;AAAA,QACE;AAAA,QACA,aAAa,uBAAuB;AAAA,QACpC,cAAc,EAAE,OAAO,QAAQ,OAAO,OAAO,QAAQ,MAAM;AAAA,QAC3D,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,CAACA,QAAO,IAAI;AACd,UAAI,YAAY;AACd,uBAAe,KAAK,UAAU,EAAE,IAAI,OAAO,OAAOA,QAAO,SAAS,gBAAgB,GAAG,MAAM,CAAC,CAAC;AAAA,MAC/F,OAAO;AACL,gBAAQ,MAAM,UAAUA,QAAO,SAAS,eAAe,EAAE;AAAA,MAC3D;AACA,MAAAF,SAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,YAAY;AACd,qBAAe,KAAK,UAAUE,SAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,IACF;AAEA,YAAQ,IAAI,iCAAiC,UAAU,KAAK,MAAM,MAAM,WAAW,MAAM,MAAM,UAAU;AACzG,QAAIA,QAAO,MAAM,IAAI;AACnB,cAAQ,IAAI,gBAAgBA,QAAO,KAAK,EAAE,EAAE;AAAA,IAC9C;AACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,EAAE,OAAO,OAAO,gBAAgB,CAAC,WAAW;AAAA,EAC9C;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,OAAO,SAAS,gBAAgB,GAAG,MAAM,CAAC,CAAC;AAAA,IAC/F,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAAA,IAC3D;AACA,IAAAF,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,EACF;AAEA,UAAQ,IAAI,YAAY,UAAU,YAAY,MAAM,MAAM,WAAW,MAAM,MAAM,UAAU;AAC3F,MAAI,OAAO,iBAAiB;AAC1B,YAAQ,IAAI,2BAA2B,OAAO,eAAe,EAAE;AAAA,EACjE;AACF;;;ACnVA,OAAOG,cAAa;AACpB,SAAS,oBAA6C;AAoCtD,eAAsB,kCACpB,MACA,QACA,OACe;AACf,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,QAAM,SAAS,YAAY,MAAM,UAAU;AAC3C,QAAM,WAAW,YAAY,MAAM,YAAY;AAC/C,QAAM,aAAa,YAAY,MAAM,YAAY;AACjD,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,UAAU,QAAQ,MAAM,aAAa,IAAI;AAE/C,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC1B,YAAQ,MAAM,2CAA2C;AACzD,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,QAAQ;AACtB,YAAQ,MAAM,0EAA0E;AACxF,YAAQ,MAAM,kFAAkF;AAChG,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACJ,MAAI;AAEJ,MAAI,cAAc,CAAC,QAAQ;AAEzB,eAAW;AACX,WAAO,EAAE,WAAW;AACpB,QAAI,SAAU,MAAK,iBAAiB;AACpC,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,uDAAuD,UAAU,KAAK;AAAA,IACtF;AAAA,EACF,OAAO;AAEL,eAAW;AACX,WAAO,EAAE,OAAgB;AACzB,QAAI,WAAY,MAAK,aAAa;AAClC,QAAI,WAAY,MAAK,aAAa;AAClC,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,wCAAwC;AAAA,IACxD;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,IAAI;AAAA,MAC/C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,MAAM,6BAA6B,GAAG,EAAE;AAChD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAAW,WAAW,KAAK;AAC7B,UAAM,OAAQ,MAAM,WAAW,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACtD,YAAQ,MAAM,UAAU,KAAK,SAAS,oDAAoD,EAAE;AAC5F,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,WAAW,IAAI;AAClB,UAAM,OAAQ,MAAM,WAAW,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACtD,YAAQ,MAAM,UAAU,KAAK,SAAS,GAAG,WAAW,MAAM,IAAI,WAAW,UAAU,EAAE,EAAE;AACvF,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAe,MAAM,WAAW,KAAK;AAC3C,MAAI,CAAC,YAAY,MAAM,CAAC,YAAY,cAAc;AAChD,YAAQ,MAAM,UAAU,YAAY,SAAS,4BAA4B,EAAE;AAC3E,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,aAAa,IAAI;AAGzB,QAAM,YAAY,GAAG,MAAM,2CAA2C,YAAY;AAElF,MAAI;AACJ,MAAI;AACF,gBAAY,MAAM,MAAM,WAAW;AAAA,MACjC,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,MAAM,sCAAsC,GAAG,EAAE;AACzD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,UAAU,MAAM,CAAC,UAAU,MAAM;AACpC,YAAQ,MAAM,sCAAsC,UAAU,MAAM,EAAE;AACtE,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,eAAwB;AAC5B,MAAI,gBAAgB;AACpB,MAAI,eAAe;AACnB,MAAI,WAAW;AAEf,QAAM,SAAS,aAAa;AAAA,IAC1B,SAAS,CAAC,UAA8B;AACtC,UAAI,CAAC,MAAM,QAAQ,MAAM,UAAU,0BAA2B;AAE9D,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAElC,gBAAQ,KAAK,WAAW;AAAA,UACtB,KAAK;AACH,gBAAI,CAAC,WAAY,SAAQ,MAAM,KAAK,KAAK,OAAO,EAAE;AAClD;AAAA,UAEF,KAAK;AACH,gBAAI,QAAS,SAAQ,MAAM,YAAY,KAAK,QAAQ,EAAE;AACtD;AAAA,UAEF,KAAK;AACH,gBAAI,SAAS;AACX,oBAAM,OAAO,KAAK,UAAU,WAAW;AACvC,sBAAQ,MAAM,YAAY,IAAI,IAAI,KAAK,QAAQ,EAAE;AAAA,YACnD;AACA;AAAA,UAEF,KAAK;AAEH,gBAAI,QAAS,CAAAA,SAAQ,OAAO,MAAM,KAAK,KAAK;AAC5C;AAAA,UAEF,KAAK;AACH,2BAAe,KAAK;AACpB,4BAAgB,KAAK;AACrB,2BAAe;AACf;AAAA,UAEF,KAAK;AACH,oBAAQ,MAAM;AAAA,SAAY,KAAK,OAAO,EAAE;AACxC,uBAAW;AACX,2BAAe;AACf;AAAA,QACJ;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,UAAU,KAAK,UAAU;AACxC,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI;AACF,WAAO,CAAC,cAAc;AACpB,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,aAAO,KAAK,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IACrD;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,MAAI,aAAa,GAAG;AAClB,IAAAA,SAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,MAAI,CAAC,cAAc;AACjB,YAAQ,MAAM,kDAAkD;AAChE,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,EAAE,IAAI,MAAM,QAAQ,cAAc,SAAS,cAAc,GAAG,MAAM,CAAC,CAAC;AAAA,EACpG,OAAO;AACL,QAAI,eAAe;AACjB,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,aAAa;AAAA,IAC7B;AACA,YAAQ,MAAM,EAAE;AAChB,mBAAe,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,EACtD;AACF;;;AC9NA,OAAOC,SAAQ;AACf,OAAOC,cAAa;AAQpB,SAAS,OAAO,MAAgB,KAAiC;AAC/D,QAAM,SAAS,GAAG,GAAG;AACrB,QAAM,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,CAAC;AAChD,MAAI,GAAI,QAAO,GAAG,MAAM,OAAO,MAAM;AACrC,SAAO,YAAY,MAAM,GAAG;AAC9B;AAEA,SAAS,UAAU,MAAyB;AAC1C,MAAI,QAAQ,MAAM,QAAQ,EAAG,QAAO;AACpC,MAAI,QAAQ,MAAM,QAAQ,EAAG,QAAO;AACpC,SAAO,CAACC,SAAQ,OAAO;AACzB;AAEA,SAAS,KAAK,MAAgB,cAAsB,MAAqB;AACvE,MAAI,UAAU,IAAI,GAAG;AACnB,mBAAe,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC9C,OAAO;AACL,YAAQ,IAAI,YAAY;AAAA,EAC1B;AACF;AAEA,eAAe,cAAc,MAAkC;AAC7D,QAAM,WAAW,OAAO,MAAM,aAAa;AAC3C,MAAI;AACJ,MAAI,UAAU;AACZ,UAAM,MAAMC,IAAG,SAAS,UAAU,OAAO;AAAA,EAC3C,WAAW,QAAQ,MAAM,cAAc,KAAK,CAACD,SAAQ,MAAM,OAAO;AAChE,UAAM,MAAM,UAAU;AAAA,EACxB,OAAO;AACL,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACF;AAEA,SAAS,YAA6B;AACpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,IAAAA,SAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,aAAO,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IACpE,CAAC;AACD,IAAAA,SAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AAC9E,IAAAA,SAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;AAqEA,SAAS,mBACP,MACA,QACM;AACN,MAAI,OAAO,GAAI;AAEf,MAAI,OAAO,SAAS,0BAA0B,MAAM,QAAQ,OAAO,MAAM,GAAG;AAC1E,QAAI,UAAU,IAAI,GAAG;AAEnB;AAAA,QAAe,KAAK;AAAA,UAChB;AAAA,YACE,IAAI;AAAA,YACJ,OAAO,OAAO,SAAS;AAAA,YACvB,MAAM;AAAA,YACN,YAAY,OAAO,OAAO;AAAA,YAC1B,QAAQ,OAAO;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,SAAS,uCAAuC,EAAE;AACjF,cAAQ;AAAA,QACN,SAAS,OAAO,OAAO,MAAM,SAAS,OAAO,OAAO,WAAW,IAAI,KAAK,GAAG;AAAA,MAC7E;AACA,cAAQ,MAAM,EAAE;AAEhB,iBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,MAAM,IAAI,QAAQ,MAAM,OAAO,EAAE;AAC/E,YAAI,MAAM,KAAM,SAAQ,MAAM,aAAa,MAAM,IAAI,EAAE;AAAA,MACzD;AACA,cAAQ,MAAM,EAAE;AAChB,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA;AACF;AAIA,eAAsB,0BACpB,MACA,QACA,OACe;AACf,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,YAAM,UAAU,MAAM,QAAQ,KAAK;AACnC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,MAAM,QAAQ,KAAK;AACtC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,cAAc,MAAM,QAAQ,KAAK;AACvC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,MAAM,QAAQ,KAAK;AACtC;AAAA,IACF,KAAK;AACH,YAAM,iBAAiB,MAAM,QAAQ,KAAK;AAC1C;AAAA,IACF,KAAK;AACH,YAAM,kCAAkC,MAAM,QAAQ,KAAK;AAC3D;AAAA,IACF;AACE,gBAAU;AACV,MAAAA,SAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;AAEA,SAAS,YAAY;AACnB,UAAQ;AAAA,IACN;AAAA,MACE;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;AAIA,eAAe,wBACb,QACA,OACA,YAC4B;AAC5B,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B,UAAU;AAAA,EAC1C;AACA,MAAI,CAAC,IAAI,IAAI;AACX,YAAQ,MAAM,UAAU,IAAI,SAAS,0BAA0B,EAAE;AACjE,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,CAAC,IAAI,MAAM;AACb,YAAQ,MAAM,mBAAmB,UAAU,gCAAgC;AAC3E,YAAQ,MAAM,6FAA6F;AAC3G,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,IAAI;AACb;AAIA,eAAe,UAAU,MAAgB,QAAgB,OAA8B;AACrF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,MAAM,wBAAwB,QAAQ,OAAO,UAAU;AACnE,OAAK,MAAM,eAAe,GAAG,GAAG,GAAG;AACrC;AAEA,eAAe,aAAa,MAAgB,QAAgB,OAA8B;AACxF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,cAAc,IAAI;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS;AACf,MAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC3C,YAAQ,MAAM,kDAAkD,KAAK,UAAU,MAAM,CAAC;AACtF,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B,UAAU;AAAA,EAC1C;AAEA,QAAM,SAAS,CAAC,SAAS,MAAM,SAAS,SAAS;AACjD,MAAI,CAAC,SAAS,MAAM,CAAC,QAAQ;AAC3B,YAAQ,MAAM,UAAU,SAAS,SAAS,0BAA0B,EAAE;AACtE,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,SAAS;AAErB,QAAM,SAAS,MACX,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,IAAI,EAAE;AAAA,IACxB,EAAE,OAAO;AAAA,EACX,IACA,MAAM,WAA4B,QAAQ,OAAO,QAAQ,uBAAuB;AAAA,IAC9E;AAAA,IACA;AAAA,EACF,CAAC;AAEL,qBAAmB,MAAM,MAAM;AAC/B,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AACzD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA;AAAA,IACE;AAAA,IACA,MACI,wBAAwB,IAAI,EAAE,cAAc,UAAU,aAAa,OAAO,MAAM,MAAM,MACtF,qCAAqC,UAAU,YAAY,OAAO,MAAM,MAAM;AAAA,IAClF;AAAA,EACF;AACF;AAEA,eAAe,cAAc,MAAgB,QAAgB,OAA8B;AACzF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,MAAM,wBAAwB,QAAQ,OAAO,UAAU;AAEnE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,IAAI,EAAE;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAQ,MAAM,UAAU,OAAO,SAAS,gBAAgB,EAAE;AAC1D,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA;AAAA,IACE;AAAA,IACA,gBAAgB,OAAO,KAAK,KAAK,aAAa,OAAO,KAAK,MAAM;AAAA,oCACzB,UAAU,IAAI,OAAO,KAAK,KAAK;AAAA,IACtE;AAAA,EACF;AACF;AAEA,eAAe,aAAa,MAAgB,QAAgB,OAA8B;AACxF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,MAAM,wBAAwB,QAAQ,OAAO,UAAU;AAEnE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,IAAI,EAAE;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AACzD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,OAAK,MAAM,wBAAwB,IAAI,EAAE,cAAc,UAAU,MAAM,MAAM;AAC/E;AAEA,eAAe,iBACb,MACA,QACA,OACe;AACf,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,CAAC,QAAQ,MAAM,OAAO;AAEtC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,EAAE,QAAQ;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AACzD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,OAAK,MAAM,YAAY,UAAU,YAAY,OAAO,KAAK,MAAM;AACjE;AAIA,SAAS,eAAe,KAAgC;AACtD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gBAAgB,IAAI,EAAE,EAAE;AACnC,QAAM,KAAK,kBAAkB,IAAI,UAAU,EAAE;AAC7C,QAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE;AACzC,MAAI,IAAI,aAAc,OAAM,KAAK,kBAAkB,IAAI,YAAY,EAAE;AACrE,MAAI,IAAI,OAAO,YAAa,OAAM,KAAK,kBAAkB,IAAI,OAAO,WAAW,EAAE;AACjF,QAAM,KAAK,oBAAoB,IAAI,OAAO,iBAAiB,KAAK,EAAE;AAClE,QAAM,KAAK,EAAE;AAEb,QAAM,QAAQ,IAAI,OAAO,SAAS,CAAC;AACnC,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,KAAK,sDAAiD;AAAA,EAC9D,OAAO;AACL,UAAM,KAAK,YAAY,MAAM,MAAM,IAAI;AACvC,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,SAAS,OAAO,KAAK,UAAU,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC;AACjE,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,MAAM;AACvC,YAAM,KAAK,OAAO,OAAO,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,EAAE;AACrE,UAAI,KAAK,WAAY,OAAM,KAAK,uBAAuB,KAAK,UAAU,EAAE;AAAA,IAC1E,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,IAAI,OAAO,WAAW,CAAC;AACvC,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,cAAc,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,EACpD;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACpcA,OAAOE,SAAQ;AACf,OAAOC,eAAa;AAoCpB,SAAS,gBAAgB,MAAgB,MAAwB;AAC/D,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAC3C,aAAO,KAAK,KAAK,IAAI,CAAC,CAAE;AACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,gBAAgB,OAA2B;AAClD,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI;AAAA,MACR,6BAA6B,KAAK;AAAA,IACpC;AAAA,EACF;AACA,QAAM,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI;AACtC,QAAM,cAAc,UAAU,SAAS,IAAI,UAAU,KAAK,GAAG,IAAI;AACjE,SAAO;AAAA,IACL,SAAS,QAAS,KAAK;AAAA,IACvB,MAAM,KAAM,KAAK;AAAA,IACjB,cAAc,KAAM,KAAK;AAAA,IACzB,aAAa,aAAa,KAAK,KAAK;AAAA,EACtC;AACF;AAEA,eAAeC,iBAAiC;AAC9C,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAQC,UAAQ;AAEtB,MAAI,MAAM,OAAO;AACf,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,GAAG,QAAQ,CAAC,UAAU;AAC1B,aAAO,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IACpE,CAAC;AACD,UAAM,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AACtE,UAAM,GAAG,SAAS,MAAM;AAAA,EAC1B,CAAC;AACH;AAEA,eAAeC,eAAc,MAA0C;AACrE,MAAI;AAEJ,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,MAAMC,IAAG,SAAS,UAAU,OAAO;AAAA,IAC3C,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,uBAAuB,QAAQ,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACxG;AAAA,EACF,OAAO;AACL,UAAM,MAAMH,eAAc;AAAA,EAC5B;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,QAAM,QAAQ;AACd,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AACjD,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAGA,MAAI,MAAM,QAAQ,MAAM,OAAO,GAAG;AAChC,eAAW,OAAO,MAAM,SAAS;AAC/B,UAAI,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM;AAC7B,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AACA,UAAI,CAAC,IAAI,cAAc;AACrB,YAAI,eAAe,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAA4D;AAChF,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,QAAM,YAAY,QAAQ,MAAM,cAAc;AAG9C,MAAI,YAAY,WAAW;AACzB,WAAOE,eAAc,IAAI;AAAA,EAC3B;AAGA,QAAM,OAAO,YAAY,MAAM,QAAQ;AACvC,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,+EAA+E;AAC7F,YAAQ,MAAM,iFAAiF;AAC/F,IAAAD,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,YAAY,MAAM,eAAe;AACrD,QAAM,SAAS,YAAY,MAAM,UAAU;AAG3C,QAAM,cAAc,gBAAgB,MAAM,UAAU;AACpD,QAAM,UAAwB,YAAY,IAAI,eAAe;AAG7D,QAAM,iBAAiB,YAAY,MAAM,gBAAgB;AACzD,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,cAAc;AACxC,UAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,OAAM,IAAI,MAAM,cAAc;AAC1D,iBAAW,OAAO,QAAQ;AACxB,YAAI,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM;AAC7B,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AACA,YAAI,CAAC,IAAI,aAAc,KAAI,eAAe,IAAI;AAAA,MAChD;AACA,cAAQ,KAAK,GAAG,MAAM;AAAA,IACxB,SAAS,KAAK;AACZ,cAAQ,MAAM,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAClG,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,aAAa,eAAe,QAAW,QAAQ,QAAQ;AACxE;AAIA,eAAsB,yBACpB,MACA,QACA,OACA,cACe;AACf,MAAI,QAAQ,MAAM,UAAU,IAAI,GAAG;AACjC,wBAAoB;AACpB;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,aAAa,QAAQ,MAAM,eAAe;AAEhD,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,aAAa,IAAI;AAAA,EACjC,SAAS,KAAK;AACZ,YAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1E,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAKA,MAAI,CAAC,WAAW,UAAU;AACxB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,WAAW,SAAS,iCAAiC,GAAG,MAAM,CAAC,CAAC;AAAA,IACpH,OAAO;AACL,cAAQ,MAAM,UAAU,WAAW,SAAS,gCAAgC,EAAE;AAAA,IAChF;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW,SAAS;AACnC,QAAM,SAAS,iBAAiB,QAAQ,YAAY;AAGpD,MAAI,eAAe;AACnB,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAM,gBAAgB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,EAAE,iBAAiB,MAAM,QAAQ;AAAA,IACnC;AAEA,QAAI,cAAc,MAAM,cAAc,UAAU;AAC9C,qBAAe;AAAA,IACjB,OAAO;AACL,cAAQ,KAAK,qDAAqD,cAAc,SAAS,eAAe,EAAE;AAAA,IAC5G;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACJ,MAAI,CAAC,YAAY;AACf,UAAM,SAAS,aAAa,MAAM,IAAI;AACtC,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa,6BAA6B,MAAM,IAAI;AAAA,QACpD,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,SAAS,UAAU;AACrB,mBAAa,SAAS,SAAS;AAC/B,qBAAe;AAGf,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,MAAM;AAAA,QACpB,EAAE,oBAAoB,WAAW;AAAA,MACnC;AAEA,UAAI,CAAC,WAAW,MAAM,CAAC,WAAW,UAAU;AAC1C,gBAAQ,KAAK,yDAAyD,WAAW,SAAS,eAAe,EAAE;AAAA,MAC7G;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,8CAA8C,SAAS,SAAS,eAAe,EAAE;AAAA,IAChG;AAAA,EACF;AAGA,MAAI,YAAY;AACd,UAAM,SAAkC;AAAA,MACtC,IAAI;AAAA,MACJ,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM,UAAU;AAAA,QACxB,UAAU;AAAA,QACV,SAAS,eAAe,MAAM,UAAU,CAAC;AAAA,QACzC,KAAK,GAAG,MAAM,UAAU,MAAM;AAAA,MAChC;AAAA,IACF;AACA,QAAI,YAAY;AACd,aAAO,WAAW;AAAA,QAChB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,KAAK,GAAG,MAAM,UAAU,UAAU;AAAA,MACpC;AAAA,IACF;AACA,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9C;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,gCAAmC,MAAM,IAAI,EAAE;AAC3D,UAAQ,IAAI,SAAS,MAAM,EAAE;AAC7B,UAAQ,IAAI,aAAa,MAAM,UAAU,OAAO,EAAE;AAClD,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAM,OAAO,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAC1D,YAAQ,IAAI,cAAc,IAAI,GAAG,CAAC,eAAe,mBAAmB,EAAE,EAAE;AAAA,EAC1E;AACA,UAAQ,IAAI,UAAU,MAAM,UAAU,MAAM,EAAE;AAE9C,MAAI,YAAY;AACd,YAAQ,IAAI;AAAA,oCAAuC,YAAY,EAAE;AACjE,YAAQ,IAAI,SAAS,UAAU,EAAE;AACjC,YAAQ,IAAI,UAAU,MAAM,UAAU,UAAU,EAAE;AAAA,EACpD;AACF;AAEA,SAAS,sBAA4B;AACnC,UAAQ;AAAA,IACN;AAAA,MACE;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;;;AZ3UA,IAAM,+BAGF;AAAA,EACF,OAAO;AAAA,EACP,UAAU;AACZ;AAEA,IAAM,2BAA2B,MAC/B,gCAAgC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,6BAA6B,CAAC,CAAC,GAAG,EAAE;AAAA,EACtF;AACF;AAUF,eAAsB,YAAY,MAAgB,QAAgB,OAA8B;AAC9F,QAAM,WAAW,YAAY,MAAM,YAAY;AAC/C,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,MAAM,QAAQ;AACxE,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAG,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,MAAM,YAAY,KAAK,aAAa,QAAW;AACzD,YAAQ,MAAM,iDAAiD;AAC/D,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,YAAY,MAAM,QAAQ;AACvC,QAAM,cAAc,YAAY,MAAM,eAAe;AACrD,QAAM,YAAY,YAAY,MAAM,aAAa;AACjD,QAAM,UAAU,YAAY,MAAM,WAAW;AAC7C,QAAM,SAAS,YAAY,MAAM,UAAU;AAC3C,QAAM,WAAW,YAAY,MAAM,aAAa;AAChD,QAAM,qBAAqB,YAAY,MAAM,qBAAqB;AAClE,QAAM,kBAAkB,YAAY,MAAM,qBAAqB;AAC/D,QAAM,qBAAqB,YAAY,MAAM,oBAAoB;AACjE,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAGzC,QAAM,qBAAqB,YAAY,MAAM,uBAAuB;AACpE,QAAM,0BAA0B,QAAQ,MAAM,6BAA6B;AAC3E,QAAM,iBAAiB,QAAQ,MAAM,mBAAmB;AACxD,QAAM,mBAAmB,YAAY,MAAM,sBAAsB;AACjE,QAAM,uBAAuB,YAAY,MAAM,yBAAyB;AACxE,QAAM,aACJ,uBAAuB,UACvB,2BACA,kBACA,qBAAqB,UACrB,yBAAyB;AAE3B,QAAM,aACJ,YAAY,MAAM,QAAQ,MAAM,UAChC,YAAY,MAAM,YAAY,MAAM,UACpC,YAAY,MAAM,eAAe,MAAM,UACvC,YAAY,MAAM,UAAU,MAAM;AAEpC,MACE,CAAC,QACD,CAAC,eACD,cAAc,UACd,YAAY,UACZ,CAAC,UACD,CAAC,YACD,CAAC,sBACD,CAAC,mBACD,uBAAuB,UACvB,aAAa,UACb,CAAC,cACD,CAAC,YACD;AACA,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,uBAAuB,UAAa,uBAAuB,UAAU,uBAAuB,SAAS;AACvG,YAAQ,MAAM,gDAAgD;AAC9D,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,mBAAmB,qBAAqB,UAAa,yBAAyB,SAAY;AAC5F,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,2BAA2B,uBAAuB,QAAW;AAC/D,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,UAAU,CAAE,gCAAsD,SAAS,MAAM,GAAG;AACtF,YAAQ,MAAM,0BAA0B,MAAM,aAAa,yBAAyB,CAAC,EAAE;AACvF,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY,CAAC,mBAAmB,QAAQ,GAAG;AAC7C,YAAQ;AAAA,MACN,6BAA6B,QAAQ,sBAAsB,oBAAoB,KAAK,IAAI,CAAC;AAAA,IAC3F;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAgC,CAAC;AACvC,MAAI,aAAa,QAAW;AAC1B,QAAI,aAAa,aAAa,CAAC,wBAAwB,QAAQ,GAAG;AAChE,cAAQ,MAAM,wFAAwF;AACtG,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,eAAe,aAAa,YAAY,OAAO;AAAA,EACtD;AACA,MAAI,KAAM,MAAK,OAAO;AACtB,QAAM,kBAAkB,cAAc,wBAAwB,eAAe,WAAW,CAAC,IAAI;AAC7F,MAAI,gBAAiB,MAAK,cAAc;AAGxC,MAAI,cAAc,OAAW,MAAK,YAAY,wBAAwB,eAAe,SAAS,CAAC,KAAK;AACpG,MAAI,YAAY,OAAW,MAAK,UAAU,wBAAwB,eAAe,OAAO,CAAC,KAAK;AAC9F,MAAI,OAAQ,MAAK,SAAS;AAC1B,MAAI,SAAU,MAAK,WAAW;AAC9B,MAAI,uBAAuB,OAAW,MAAK,kBAAkB,uBAAuB;AAEpF,MAAI,sBAAsB,iBAAiB;AACzC,QAAI;AACJ,QAAI,iBAAiB;AACnB,UAAI;AACF,cAAM,MAAMC,IAAG,SAAS,iBAAiB,OAAO;AAAA,MAClD,SAAS,KAAK;AACZ,gBAAQ;AAAA,UACN,iBAAiB,eAAe,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACvF;AACA,QAAAD,UAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,OAAO;AACL,YAAM;AAAA,IACR;AACA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,WAAK,kBAAkB;AAAA,IACzB,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,uCAAuC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACzF;AACA,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAKA,MAAI,YAAY;AACd,QAAI,eAAgB,MAAK,yBAAyB;AAClD,QAAI,qBAAqB,QAAW;AAClC,YAAM,QAAQ,iBACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,YAAM,QAAQ,CAAC,aAAa,aAAa,SAAS,SAAS;AAC3D,YAAM,MAAM,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;AAClD,UAAI,IAAI,SAAS,GAAG;AAClB,gBAAQ,MAAM,+BAA+B,IAAI,KAAK,IAAI,CAAC,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE;AACzF,QAAAA,UAAQ,KAAK,CAAC;AAAA,MAChB;AACA,WAAK,yBAAyB,EAAE,MAAM,YAAY,MAAM;AAAA,IAC1D;AACA,QAAI,wBAAyB,MAAK,uBAAuB;AAEzD,UAAM,kBAAkB,uBAAuB,UAAa,yBAAyB;AACrF,QAAI,iBAAiB;AACnB,YAAM,OAAO,MAAM,0BAA0B,QAAQ,OAAO,UAAU;AACtE,UAAI,uBAAuB,QAAW;AACpC,aAAK,uBAAuB,6BAA6B,MAAM,kBAAkB;AAAA,MACnF;AACA,UAAI,yBAAyB,QAAW;AACtC,cAAM,MAAM,qBACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,aAAa,6BAA6B,MAAM,QAAQ,CAAC;AACjE,aAAK,yBAAyB,EAAE,MAAM,QAAQ,gBAAgB,IAAI;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAA+D;AAEnE,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,IAAI;AACd,UAAI,YAAY;AACd,uBAAe,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,OAAO,SAAS,gBAAgB,GAAG,MAAM,CAAC,CAAC;AAAA,MAC/F,OAAO;AACL,gBAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,EAAE;AAAA,MAC3D;AACA,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAY;AACd,QAAI;AACF,kBAAY,MAAM,sBAAsB,EAAE,QAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,IAC7E,SAAS,KAAK;AACZ,UAAI,YAAY;AACd;AAAA,UAAe,KAAK;AAAA,YAChB,EAAE,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,YACrE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM;AAAA,EAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,MAC3F;AACA,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAY;AACd;AAAA,MAAe,KAAK;AAAA,QAChB,EAAE,IAAI,MAAM,YAAY,SAAS,MAAM,MAAM,WAAW,UAAU,KAAK;AAAA,QACvE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,KAAK,IAAI;AACpC,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAI,YAAY,UAAU,aAAa,YAAY,KAAK,IAAI,CAAC,IAAI;AAAA,EAC3E;AACA,MAAI,WAAW;AACb,YAAQ,IAAI,SAAS,UAAU,OAAO,MAAM,YAAY;AAAA,EAC1D;AACF;AAIA,eAAe,cAAc,MAAgB,QAAgB,OAA8B;AACzF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,8DAA8D;AAC5E,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,cAAc,QAAQ,MAAM,SAAS,IAAI;AAE/C,MAAI,CAAC,aAAa;AAChB,QAAI,CAACA,UAAQ,MAAM,OAAO;AACxB,cAAQ;AAAA,QACN;AAAA,MACF;AACA,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AACA,IAAAA,UAAQ,OAAO;AAAA,MACb,oBAAoB,UAAU;AAAA,IAChC;AACA,UAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,YAAY;AACpD,MAAAA,UAAQ,MAAM,YAAY,OAAO;AACjC,MAAAA,UAAQ,MAAM,KAAK,QAAQ,CAAC,UAAU,QAAQ,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,IACnF,CAAC;AACD,QAAI,WAAW,OAAO,WAAW,OAAO;AACtC,cAAQ,MAAM,UAAU;AACxB,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,EAC1B;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,8BAAwB,MAAM;AAAA,IAChC;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChD,OAAO;AACL,YAAQ;AAAA,MACN,qBAAqB,UAAU,oCAAoC,UAAU;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,MAAgB,QAAgB,OAA8B;AAC3F,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,wDAAwD;AACtE,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAGzC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,8BAAwB,MAAM;AAAA,IAChC;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChD,OAAO;AACL,YAAQ,IAAI,qBAAqB,UAAU,GAAG;AAAA,EAChD;AACF;AAIA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,eAAe,cAAc,MAAgB,QAAgB,OAA8B;AACzF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,8DAA8D;AAC5E,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAEzC,MAAI,CAAC,QAAQ,MAAM,OAAO,GAAG;AAC3B,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM;AAAA,wDAA2D,UAAU,QAAQ;AAC3F,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAQA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,IACxC;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd;AAAA,MAAe,KAAK,UAAU,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,YAAY,KAAK,GAAG,MAAM,CAAC;AAAA,IAClG;AACA;AAAA,EACF;AACA,UAAQ,IAAI,YAAY,UAAU,YAAY;AAC9C,UAAQ;AAAA,IACN,8GACuC,UAAU;AAAA,EACnD;AACF;AAKA,eAAe,cAAc,MAAgB,QAAgB,OAA8B;AACzF,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,gEAAgE;AAC9E,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,QAAQ,MAAM,SAAS;AACrC,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAQzC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,EAC7B;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,YAAM,OACJ,OAAO,SAAS,8BACZ,oFACA,OAAO,SAAS,gCACd;AAAA,oDAAuD,UAAU;AAAA,qGACjE;AACR,cAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,EAAE;AAAA,IAC/C;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd;AAAA,MAAe,KAAK,UAAU,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,YAAY,KAAK,GAAG,MAAM,CAAC;AAAA,IAClG;AACA;AAAA,EACF;AACA,UAAQ,IAAI,YAAY,UAAU,oDAA+C;AACnF;AAEA,eAAe,kBACb,MACA,QACA,OACA,QACe;AACf,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACtD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,MAAM,0BAA0B,MAAM,yCAAyC;AACvF,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,QAAM,SAAS,YAAY,MAAM,UAAU;AAQ3C,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU,IAAI,MAAM;AAAA,IAClC,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EACzB;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI,YAAY;AACd,qBAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChD,OAAO;AACL,cAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,IACxC;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd;AAAA,MAAe,KAAK,UAAU,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,YAAY,KAAK,GAAG,MAAM,CAAC;AAAA,IAClG;AACA;AAAA,EACF;AACA,MAAI,QAAQ;AACV,YAAQ,IAAI,YAAY,UAAU,yDAAoD;AAAA,EACxF,OAAO;AACL,YAAQ,IAAI,YAAY,UAAU,yDAAoD;AAAA,EACxF;AACF;AAIA,SAASE,iBAAgB,MAAgB,MAAwB;AAC/D,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAC3C,aAAO,KAAK,KAAK,IAAI,CAAC,CAAE;AACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,gBACpB,MACA,QACA,OACe;AACf,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACxD,QAAM,aAAa,WAAW,CAAC;AAC/B,QAAM,SAAS,WAAW,CAAC;AAE3B,MAAI,CAAC,cAAc,CAAC,QAAQ;AAC1B,YAAQ,MAAM,4CAA4C;AAC1D,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAF,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,YAAY,MAAM,UAAU;AAC9C,QAAM,eAAeE,iBAAgB,MAAM,aAAa;AACxD,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAEzC,MAAI,CAAC,aAAa,aAAa,WAAW,GAAG;AAC3C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,IAAAF,UAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,aAAsC,CAAC;AAE3C,MAAI,WAAW;AACb,QAAI;AACF,mBAAa,KAAK,MAAM,SAAS;AAAA,IACnC,SAAS,GAAG;AACV,cAAQ;AAAA,QACN,oCAAoC,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,MAChF;AACA,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,YAAY,GAAG,MAAM,cAAc,UAAU,IAAI;AAAA,IACpE,SAAS,EAAE,eAAe,UAAU,KAAK,IAAI,gBAAgB,mBAAmB;AAAA,IAChF;AAAA,EACF,CAAC;AACD,QAAM,YAAa,MAAM,OAAO,KAAK;AACrC,MAAI,CAAC,UAAU,UAAU;AACvB,YAAQ,MAAM,4BAA4B;AAC1C,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,UAAU,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACzE,MAAI,CAAC,cAAc;AACjB,YAAQ,MAAM,eAAe,MAAM,0BAA0B,UAAU,GAAG;AAC1E,YAAQ,MAAM,oBAAoB;AAClC,eAAW,KAAK,eAAe,UAAU,SAAS,OAAO,UAAU,SAAS,SAAS,CAAC,CAAC,GAAG;AACxF,cAAQ,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,KAAK,aAAa,CAAC,CAAC,EAAE;AAAA,IAC/D;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,MAAI,WAAW,gBAAgB,UAAa,aAAa,SAAS,GAAG;AACnE,UAAM,cAAuC;AAAA,MAC3C,GAAI,aAAa,YAAY;AAAA,MAC7B,GAAI,WAAW;AAAA,IACjB;AACA,eAAW,OAAO,cAAc;AAC9B,YAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,UAAI,UAAU,IAAI;AAChB,gBAAQ,MAAM,+CAA+C,GAAG,GAAG;AACnE,QAAAA,UAAQ,KAAK,CAAC;AAAA,MAChB;AACA,kBAAY,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,IACxD;AACA,eAAW,cAAc;AAAA,EAC3B;AAGA,QAAM,WAAW,MAAM,YAAY,GAAG,MAAM,cAAc,UAAU,UAAU,MAAM,IAAI;AAAA,IACtF,QAAQ;AAAA,IACR,SAAS,EAAE,eAAe,UAAU,KAAK,IAAI,gBAAgB,mBAAmB;AAAA,IAChF;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAI,YAAY;AACd,cAAQ,IAAI,WAAW,KAAK,UAAU,EAAE,IAAI,OAAO,QAAQ,SAAS,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,IACxF,OAAO;AACL,UAAI,WAA0B;AAC9B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,mBAAW,wBAAwB,MAAM;AAAA,MAC3C,QAAQ;AACN,mBAAW;AAAA,MACb;AACA,cAAQ,MAAM,YAAY,UAAU,SAAS,MAAM,MAAM,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAClF;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAe,MAAM,SAAS,KAAK;AAEzC,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,YAAY,KAAK,GAAG,MAAM,CAAC,CAAC;AAC5E;AAAA,EACF;AAGA,QAAM,QAAQ,aAAa,YAAY;AACvC,UAAQ,IAAI,iBAAiB,aAAa,QAAQ,MAAM,KAAK,MAAM,MAAM;AAAA,CAAM;AAE/E,QAAM,YAAY,aAAa,cAAc,CAAC;AAC9C,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,QACE,OAAO,WAAW,YAClB,WAAW,QACX,OAAO,UAAU,GAAG,MAAM,YAC1B,UAAU,GAAG,MAAM,MACnB;AAEA,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,SAAS;AACf,iBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,cAAM,SAAS,OAAO,MAAM;AAC5B,YAAI,WAAW,QAAQ;AACrB,kBAAQ;AAAA,YACN,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,UAAU,UAAU,IAAI,CAAC,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,UACpF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,SAAS,UAAU,GAAG;AAC5B,UAAI,WAAW,QAAQ;AACrB,gBAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,UAAU,UAAU,IAAI,CAAC,OAAO,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,oBAA0B;AACjC,UAAQ;AAAA,IACN;AAAA,MACE;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,mCAAmC,oBAAoB,KAAK,IAAI,CAAC;AAAA,MACjE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,oDAAoD,aAAa;AAAA,MACjE;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,MACA,uCAAuC,oBAAoB,KAAK,IAAI,CAAC;AAAA,MACrE;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;AA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","names":["fs","process","readFromStdin","fs","process","process","fs","process","process","process","process","process","process","process","process","result","fs","process","edges","fs","process","raw","result","process","process","fs","process","process","fs","fs","process","readFromStdin","process","readJsonInput","fs","process","fs","getAllArgValues","apiUrl","token"]}