@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/exploratory-test.ts"],"sourcesContent":["/**\n * `cofactor exploratory-test` — start and inspect exploratory (ad-hoc) tests.\n *\n * An exploratory test is one agent-driven browser run against an application\n * from a free-text prompt. Not to be confused with `cofactor exploration`,\n * which runs product-map exploration cycles. Thin wrapper over\n * `POST/GET /adhoc-tests`.\n *\n * @module exploratory-test\n */\n\nimport process from 'node:process';\nimport { readFileSync } from 'node:fs';\nimport { hasFlag, resolveConfig, resolveOrgAppUrl } from './auth.js';\nimport {\n apiRequest,\n getApplicationArg,\n getPositionalArg,\n getScalarArgValue,\n resolveCredentialId,\n selectProperty,\n} from './cli-helpers.js';\nimport { stripTerminalControls, writeRawOutput } from './brand.js';\nimport {\n ADHOC_TEST_INSTRUCTIONS_MAX_LENGTH,\n EXPLORATORY_EFFORT_VALUES,\n REVIEW_FLAVOR_VALUES,\n} from '@chatsdet/types';\n\ntype ApiResult = { ok: boolean; error?: string; code?: string };\n\ntype StartResult = ApiResult & { adhocTestId?: string; jobId?: string };\n\ntype TestRow = {\n id: string;\n propertyName?: string;\n title: string | null;\n status: string;\n flavor: string;\n issuesFound: number;\n summary: string | null;\n};\n\ntype ListResult = ApiResult & {\n items?: TestRow[];\n pagination?: { page: number; pageSize: number; totalItems: number; totalPages: number };\n};\n\ntype TestDetail = TestRow & {\n targetKind: string | null;\n sandboxV2Environment: string | null;\n overallScore: number | null;\n startedAt: string | null;\n finishedAt: string | null;\n videoStorageKey: string | null;\n traceStorageKey: string | null;\n};\n\ntype GetResult = ApiResult & {\n data?: TestDetail;\n reviewFindings?: unknown[];\n browserSessions?: Array<{ videoStorageKey: string | null; traceStorageKey: string | null }>;\n};\n\nconst TERMINAL_STATUSES = new Set(['completed', 'failed', 'canceled']);\nconst DEFAULT_WAIT_TIMEOUT_SEC = 1800;\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\n\n/** Global flags that take a value, so the id after one of them is still found by `get`. */\nconst VALUE_FLAGS = ['--env', '--api-url', '--token', '--org'];\n\nfunction fail(message: string): never {\n console.error(`Error: ${message}`);\n process.exit(1);\n}\n\n/** The API's typed user error, code and message unchanged. */\nfunction failApi(result: ApiResult, fallback: string): never {\n const message = result.error ?? fallback;\n fail(result.code ? `${result.code}: ${message}` : message);\n}\n\nfunction printHelp(): void {\n console.log(\n [\n 'Usage: cofactor exploratory-test <sub-command> [options]',\n '',\n 'Start and inspect exploratory (ad-hoc) tests: an agent drives a browser from your prompt',\n 'and reports what it finds. (Not `cofactor exploration`, which runs product-map cycles.)',\n '',\n 'Sub-commands:',\n ' run --application <name|id> --prompt <text|@file> Start an exploratory test',\n ' get <id> Status, summary, findings, video/trace',\n ' list [--application <name|id>] Recent exploratory tests',\n ' (To run one on a schedule: cofactor schedule exploratory-test --help)',\n '',\n 'run options:',\n ` --prompt <text|@file> What to explore (up to ${ADHOC_TEST_INSTRUCTIONS_MAX_LENGTH} characters; @file reads a file)`,\n ' --flavor <f> functional (default) | ux | spec | fuzz (needs --sandbox-env)',\n ' --effort <e> fuzz only: quick (~5 min) | standard (~15, default) | deep (~30)',\n ' --environment <name|id> Run against a named live environment of the application',\n ' --sandbox-env <name> Run against a Sandboxes v2 environment of the application',\n ' (personas come from the environment; no --environment/--credential)',\n ' --credential <name|id> Sign in with this credential (live targets)',\n ' --wait Poll until the run finishes, then print status and URL;',\n ' exits non-zero unless it completed',\n ' --timeout <seconds> Max time to wait with --wait (default: 1800)',\n ' With no target flag the application\\'s default ad-hoc environment is used, else live.',\n ' Functional runs on a live environment can use its variables (cofactor env set-var):',\n ' name one in the prompt as $var.ENV.<name> and the agent types it by reference.',\n ' A sensitive value is never shown to the agent: it reads [REDACTED] in tool results,',\n ' files and the trace. Screenshots and video are not masked.',\n '',\n 'list options:',\n ' --flavor <f> Only this flavor',\n ' --page <n>, --page-size <n> Pagination',\n '',\n 'Common options:',\n ' --application <name|id> Application (alias: --property)',\n ' --org <name|id> Which logged-in org to act as',\n ' --env <env> Target environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ' --json Print machine-readable JSON',\n ].join('\\n')\n );\n}\n\nfunction readPrompt(value: string): string {\n let text = value;\n if (value.startsWith('@')) {\n try {\n text = readFileSync(value.slice(1), 'utf8');\n } catch (error) {\n fail(`Cannot read prompt file ${value.slice(1)}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n if (text.trim().length === 0) fail('--prompt is empty.');\n if (text.length > ADHOC_TEST_INSTRUCTIONS_MAX_LENGTH) {\n fail(`--prompt is ${text.length} characters; the limit is ${ADHOC_TEST_INSTRUCTIONS_MAX_LENGTH}.`);\n }\n return text;\n}\n\nfunction parseFlavor(argv: string[]): string | undefined {\n const flavor = getScalarArgValue(argv, '--flavor');\n if (flavor !== undefined && !(REVIEW_FLAVOR_VALUES as readonly string[]).includes(flavor)) {\n fail(`--flavor must be one of: ${REVIEW_FLAVOR_VALUES.join(', ')}`);\n }\n return flavor;\n}\n\nfunction parseEffort(argv: string[]): string | undefined {\n const effort = getScalarArgValue(argv, '--effort');\n if (effort !== undefined && !(EXPLORATORY_EFFORT_VALUES as readonly string[]).includes(effort)) {\n fail(`--effort must be one of: ${EXPLORATORY_EFFORT_VALUES.join(', ')}`);\n }\n return effort;\n}\n\n/** The web page for a run; one detail page serves every flavor. */\nfunction runUrl(appUrl: string, id: string): string {\n return `${appUrl}/exploratory/${id}`;\n}\n\nasync function resolveEnvironmentId(\n arg: string,\n propertyId: string,\n apiUrl: string,\n token: string\n): Promise<string> {\n const res = await apiRequest<ApiResult & { items?: Array<{ id: string; name: string }> }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/environments`\n );\n if (!res.ok) failApi(res, 'Failed to list environments');\n const environments = res.items ?? [];\n const byName = environments.filter((e) => e.name.toLowerCase() === arg.toLowerCase());\n if (byName.length > 1) fail(`Multiple environments match \"${arg}\" on this application. Use the id.`);\n const match = environments.find((e) => e.id === arg) ?? byName[0];\n if (!match) {\n fail(\n `Environment \"${arg}\" not found on this application. Known: ${\n environments.map((e) => e.name).join(', ') || '(none)'\n }`\n );\n }\n return match.id;\n}\n\nasync function buildTarget(\n argv: string[],\n propertyId: string,\n apiUrl: string,\n token: string\n): Promise<Record<string, unknown> | undefined> {\n const sandboxEnv = getScalarArgValue(argv, '--sandbox-env');\n const environment = getScalarArgValue(argv, '--environment');\n const credential = getScalarArgValue(argv, '--credential');\n\n if (sandboxEnv !== undefined) {\n if (environment !== undefined || credential !== undefined) {\n fail('--sandbox-env cannot be combined with --environment or --credential.');\n }\n return { kind: 'sandbox-v2-environment', environment: sandboxEnv };\n }\n if (environment === undefined && credential === undefined) return undefined;\n return {\n kind: 'live',\n ...(environment !== undefined\n ? { environmentId: await resolveEnvironmentId(environment, propertyId, apiUrl, token) }\n : {}),\n ...(credential !== undefined\n ? { credentialId: await resolveCredentialId(credential, propertyId, apiUrl, token) }\n : {}),\n };\n}\n\nasync function fetchTest(apiUrl: string, token: string, id: string): Promise<GetResult> {\n const result = await apiRequest<GetResult>(\n apiUrl,\n token,\n 'GET',\n `/adhoc-tests/${encodeURIComponent(id)}`\n );\n if (!result.ok || !result.data) failApi(result, 'Failed to read the exploratory test');\n return result;\n}\n\n/** Poll until the run is terminal; progress lines go to stderr so --json stays pipeable. */\nasync function waitForTerminal(\n apiUrl: string,\n token: string,\n id: string,\n timeoutSec: number,\n intervalMs: number\n): Promise<GetResult> {\n const deadline = Date.now() + timeoutSec * 1000;\n let lastStatus = '';\n for (;;) {\n const result = await apiRequest<GetResult>(apiUrl, token, 'GET', `/adhoc-tests/${encodeURIComponent(id)}`);\n if (!result.ok || !result.data) {\n failApi(result, `Failed to read ${id}; it keeps running. Check it with: cofactor exploratory-test get ${id}`);\n }\n const status = result.data.status;\n if (status !== lastStatus) {\n console.error(`Status: ${status}`);\n lastStatus = status;\n }\n if (TERMINAL_STATUSES.has(status)) return result;\n if (Date.now() >= deadline) {\n fail(`Timed out after ${timeoutSec}s waiting for ${id} (status: ${status}). It is still running.`);\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\nfunction printDetail(result: GetResult, url: string): void {\n const d = result.data!;\n console.log(`${d.id} ${d.status} ${d.flavor}${d.propertyName ? ` ${d.propertyName}` : ''}`);\n if (d.title) console.log(`Title: ${stripTerminalControls(d.title)}`);\n console.log(`URL: ${url}`);\n if (d.targetKind) {\n console.log(`Target: ${d.sandboxV2Environment ? `${d.targetKind} (${d.sandboxV2Environment})` : d.targetKind}`);\n }\n if (d.startedAt) console.log(`Started: ${d.startedAt}${d.finishedAt ? ` Finished: ${d.finishedAt}` : ''}`);\n const findings = result.reviewFindings?.length ?? 0;\n console.log(`Issues found: ${d.issuesFound}${findings > 0 ? ` Review findings: ${findings}` : ''}`);\n if (d.overallScore !== null && d.overallScore !== undefined) console.log(`Score: ${d.overallScore}`);\n const sessions = result.browserSessions ?? [];\n const hasVideo = sessions.some((s) => s.videoStorageKey) || Boolean(d.videoStorageKey);\n const hasTrace = sessions.some((s) => s.traceStorageKey) || Boolean(d.traceStorageKey);\n console.log(`Video: ${hasVideo ? 'available' : 'not available'} Trace: ${hasTrace ? 'available' : 'not available'}`);\n if (d.summary) console.log(`\\n${stripTerminalControls(d.summary)}`);\n}\n\nexport async function handleRun(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain: string | null | undefined,\n pollIntervalMs: number = DEFAULT_POLL_INTERVAL_MS\n): Promise<void> {\n const promptArg = getScalarArgValue(argv, '--prompt');\n if (promptArg === undefined) fail('Missing --prompt <text|@file>.');\n const instructions = readPrompt(promptArg);\n const flavor = parseFlavor(argv);\n const effort = parseEffort(argv);\n const timeoutArg = getScalarArgValue(argv, '--timeout');\n if (timeoutArg !== undefined && !/^[1-9]\\d*$/.test(timeoutArg)) fail('--timeout must be a positive whole number of seconds.');\n const timeoutSec = timeoutArg === undefined ? DEFAULT_WAIT_TIMEOUT_SEC : Number.parseInt(timeoutArg, 10);\n const json = hasFlag(argv, '--json');\n const wait = hasFlag(argv, '--wait');\n\n const property = await selectProperty(apiUrl, token, getApplicationArg(argv));\n if (!property) process.exit(1);\n const target = await buildTarget(argv, property.id, apiUrl, token);\n\n const started = await apiRequest<StartResult>(apiUrl, token, 'POST', '/adhoc-tests', {\n propertyId: property.id,\n instructions,\n ...(flavor ? { flavor } : {}),\n ...(effort ? { effort } : {}),\n ...(target ? { target } : {}),\n });\n if (!started.ok || !started.adhocTestId) failApi(started, 'Failed to start the exploratory test');\n const id = started.adhocTestId;\n const appUrl = resolveOrgAppUrl(apiUrl, appSubdomain);\n const url = runUrl(appUrl, id);\n\n if (!wait) {\n if (json) {\n writeRawOutput(JSON.stringify({ id, jobId: started.jobId, url }, null, 2));\n return;\n }\n console.log(`Started exploratory test ${id}`);\n console.log(`URL: ${url}`);\n console.log(`Inspect it: cofactor exploratory-test get ${id}`);\n return;\n }\n\n console.error(`Started exploratory test ${id}`);\n const finished = await waitForTerminal(apiUrl, token, id, timeoutSec, pollIntervalMs);\n if (json) {\n writeRawOutput(JSON.stringify({ ...finished, url }, null, 2));\n } else {\n printDetail(finished, url);\n }\n process.exitCode = finished.data!.status === 'completed' ? 0 : 1;\n}\n\nexport async function handleGet(\n argv: string[],\n apiUrl: string,\n token: string,\n appSubdomain: string | null | undefined\n): Promise<void> {\n const id = getPositionalArg(argv, VALUE_FLAGS);\n if (!id) fail('Missing exploratory test id.');\n const result = await fetchTest(apiUrl, token, id);\n const url = runUrl(resolveOrgAppUrl(apiUrl, appSubdomain), result.data!.id);\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify({ ...result, url }, null, 2));\n return;\n }\n printDetail(result, url);\n}\n\nexport async function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const flavor = parseFlavor(argv);\n const applicationArg = getApplicationArg(argv);\n const query = new URLSearchParams();\n if (applicationArg !== undefined) {\n const property = await selectProperty(apiUrl, token, applicationArg);\n if (!property) process.exit(1);\n query.set('propertyId', property.id);\n }\n if (flavor) query.set('flavor', flavor);\n const page = getScalarArgValue(argv, '--page');\n if (page !== undefined) query.set('page', page);\n const pageSize = getScalarArgValue(argv, '--page-size');\n if (pageSize !== undefined) query.set('pageSize', pageSize);\n\n const qs = query.toString();\n const result = await apiRequest<ListResult>(apiUrl, token, 'GET', `/adhoc-tests${qs ? `?${qs}` : ''}`);\n if (!result.ok) failApi(result, 'Failed to list exploratory tests');\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n const items = result.items ?? [];\n if (items.length === 0) {\n console.log('No exploratory tests found.');\n return;\n }\n for (const t of items) {\n const label = stripTerminalControls((t.title ?? t.summary ?? '').split('\\n')[0]!).slice(0, 60);\n console.log(\n `${t.id} ${t.status.padEnd(9)} ${t.flavor.padEnd(10)} issues=${String(t.issuesFound).padEnd(3)} ${t.propertyName ?? ''} ${label}`.trimEnd()\n );\n }\n const p = result.pagination;\n if (p && p.totalPages > p.page) {\n console.log(`\\nPage ${p.page} of ${p.totalPages} (${p.totalItems} total). Next: --page ${p.page + 1}`);\n }\n}\n\nexport async function runExploratoryTest(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n const { apiUrl, token, appSubdomain } = await resolveConfig(argv);\n switch (subCommand) {\n case 'run':\n await handleRun(rest, apiUrl, token, appSubdomain);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token, appSubdomain);\n break;\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/perf.ts","../../ids/src/registry.ts","../../ids/src/base58.ts","../../ids/src/prefixed-id.ts","../../ids/src/entity-link.ts","../../ids/src/types.ts","../../types/src/perf-config.ts","../../types/src/perf-result.ts","../../types/src/perf-round.ts","../../types/src/perf-render.ts"],"sourcesContent":["/** `cofactor perf`: measure two versions, or manage saved performance tests. */\nimport { readFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { parse } from 'yaml';\nimport { extractUuid } from '@chatsdet/ids';\nimport {\n PerfConfigSchema,\n StoredPerfConfigSchema,\n renderPerfResult,\n type PerfResult,\n type PerfRunHeadlineDelta,\n type PerfRunStatus,\n type PerfVerdict,\n type StoredPerfConfig,\n} from '@chatsdet/types/perf';\nimport { GLOBAL_VALUE_FLAGS, hasFlag, resolveConfig } from './auth.js';\nimport { printServedGuide } from './guide.js';\nimport { apiRequest, getPositionalArg, getScalarArgValue } from './cli-helpers.js';\nimport { resolveApplicationId } from './environment.js';\nimport {\n RULES_PATH,\n buildScheduleTriggerConfig,\n type AutomationRule,\n} from './automation-shared.js';\nimport { writeRawOutput } from './brand.js';\n\ntype PerfTest = {\n id: string;\n name: string;\n applicationId: string;\n environment: string;\n onMerge: boolean;\n config: StoredPerfConfig;\n};\ntype PerfRun = {\n id: string;\n status: PerfRunStatus;\n verdict: PerfVerdict | null;\n baseSha: string;\n headSha: string;\n result: PerfResult | null;\n error: string | null;\n};\ntype RunSummary = Pick<PerfRun, 'id' | 'status' | 'verdict' | 'baseSha' | 'headSha'> & {\n headlineDeltas: PerfRunHeadlineDelta[];\n};\ntype ApiResponse<T> = { ok: boolean; error?: string; code?: string; data?: T };\n\nconst TESTS = '/org/perf/tests';\nconst RUNS = '/org/perf/runs';\nconst ACTION = 'perf-test.run';\nconst TIMING_FLAGS = ['--schedule', '--cron', '--at', '--every', '--timezone'];\nconst VALUE_FLAGS = [\n ...GLOBAL_VALUE_FLAGS,\n ...TIMING_FLAGS,\n '--config',\n '--application',\n '--environment',\n '--test',\n '--base',\n '--head',\n '--name',\n '--limit',\n];\nconst USAGE = {\n run: 'run (--config perf.yaml --application <app> [--environment E] | --test <name|id>) [--base <version>] --head <version>',\n save: 'save --config perf.yaml --name <n> --application <app> [--environment E] [--on-merge] [<timing flag>]',\n guide: 'guide',\n list: 'list',\n get: 'get <test-name|ptest_id|prun_id>',\n runs: 'runs <test-name|ptest_id> [--limit N]',\n delete: 'delete <test-name|ptest_id>',\n};\ntype Command = keyof typeof USAGE;\n\nfunction printHelp(command: string | undefined): void {\n const usage = Object.hasOwn(USAGE, command ?? '') ? USAGE[command as Command] : undefined;\n console.log(\n [\n `Usage: cofactor perf ${usage ?? '<sub-command>'} [--json]`,\n '',\n ...Object.values(USAGE).map((line) => ` cofactor perf ${line}`),\n '',\n 'guide: prints the offline performance-test guide (no login needed).',\n 'run: validates YAML, inlines k6.script relative to perf.yaml, and waits for the run.',\n ' --head and --base take a commit SHA, a push id or a tag.',\n ' Base defaults to the environment head for GitHub apps, or the ready push before head for uploaded apps.',\n ' Polls every 5 seconds for at most 4 hours. A timeout leaves the run available via get.',\n 'save: replaces the test and its schedule by name. Without a timing flag or --on-merge, it is manual.',\n ' --on-merge runs the test for merges into the repository default branch (GitHub applications only).',\n ' Leaving --on-merge off clears the marker.',\n ' One timing flag: --schedule <text> | --cron <expr> | --at <HH:mm> | --every <30m|2h>',\n ' --timezone <zone> applies to the schedule (default UTC).',\n ' Scheduling requires the server automation action perf-test.run.',\n 'list: saved tests. get: a prun_ id selects a run; a ptest_ id or name selects a test.',\n 'runs: recent runs for a test, newest first; --limit defaults to 20 (1..100).',\n 'delete: deletes the test, its automation rules, and its runs (API cascade).',\n '',\n 'Common options:',\n ' --org <name|id> Logged-in organization; required explicitly for run, save, delete',\n ' --env <env> API environment (prod, dev, local); distinct from --environment',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ' --json Raw JSON on every sub-command; runs flatten PerfResult into run metadata',\n ' --help, -h Show help without authentication',\n '',\n 'Requires the sandbox-v2 organization flag. API-key scopes:',\n ' run/save: sandbox:create + sandbox:exec; run/get/runs reads: sandbox:read; delete: sandbox:edit.',\n ' save/list/delete also use automation rules routes and require full API-key access (*).',\n '',\n 'Exit codes (run):',\n ' 0 no_change or faster',\n ' 3 slower',\n ' 1 Failed run, polling timeout, or any error',\n 'Other sub-commands exit 0 on success, 1 on error.',\n ].join('\\n')\n );\n}\n\nfunction required(argv: string[], flag: string): string {\n const value = getScalarArgValue(argv, flag);\n if (!value) throw new Error(`${flag} is required.`);\n return value;\n}\n\nasync function readConfig(file: string): Promise<StoredPerfConfig> {\n const config = PerfConfigSchema.parse(parse(await readFile(file, 'utf8')));\n const { k6, ...rest } = config;\n if (!k6) return StoredPerfConfigSchema.parse(rest);\n const { script, ...load } = k6;\n const scriptSource = await readFile(resolve(dirname(file), script), 'utf8');\n return StoredPerfConfigSchema.parse({ ...rest, k6: { ...load, scriptSource } });\n}\n\nasync function request<T>(\n apiUrl: string,\n token: string,\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<T> {\n const response = await apiRequest<ApiResponse<T>>(apiUrl, token, method, path, body);\n if (!response.ok || response.data === undefined) {\n throw new Error(\n `${response.code ? `${response.code}: ` : ''}${response.error ?? `${method} ${path} failed`}`\n );\n }\n return response.data;\n}\n\nasync function resolveTest(apiUrl: string, token: string, name: string): Promise<PerfTest> {\n if (name.startsWith('ptest_'))\n return request(apiUrl, token, 'GET', `${TESTS}/${encodeURIComponent(name)}`);\n const tests = await request<PerfTest[]>(apiUrl, token, 'GET', TESTS);\n const test = tests.find((test) => test.name === name);\n if (!test) throw new Error(`Perf test \"${name}\" not found.`);\n return test;\n}\n\n/** Rules store UUIDs in actionConfig, while perf routes return prefixed IDs. */\nfunction testUuid(test: PerfTest): string {\n const id = extractUuid(test.id);\n if (!id) throw new Error(`Invalid perf test id: ${test.id}`);\n return id;\n}\n\nasync function listRules(apiUrl: string, token: string): Promise<AutomationRule[]> {\n const rules: AutomationRule[] = [];\n let page = 1;\n let totalPages: number;\n do {\n const response = await apiRequest<\n ApiResponse<AutomationRule[]> & { pagination: { totalPages: number } }\n >(apiUrl, token, 'GET', `${RULES_PATH}?actionType=${ACTION}&pageSize=100&page=${page}`);\n if (!response.ok || !response.data)\n throw new Error(response.error ?? 'Could not list perf automation rules.');\n rules.push(...response.data);\n totalPages = response.pagination.totalPages;\n page++;\n } while (page <= totalPages);\n return rules;\n}\n\nfunction rulesForTest(rules: AutomationRule[], test: PerfTest): AutomationRule[] {\n const id = testUuid(test);\n return rules.filter((rule) => rule.actionConfig.perf_test_id === id);\n}\n\nasync function deletePaths(paths: string[], apiUrl: string, token: string): Promise<void> {\n for (const path of paths) {\n const response = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n path\n );\n if (!response.ok) throw new Error(response.error ?? `DELETE ${path} failed`);\n }\n}\n\nfunction printRun(run: PerfRun, json: boolean): void {\n if (json) {\n const { result, ...metadata } = run;\n writeRawOutput(JSON.stringify({ ...metadata, ...result, rows: result?.rows ?? [] }, null, 2));\n } else if (run.status === 'completed' && run.result && run.verdict) {\n writeRawOutput(renderPerfResult({ ...run, result: run.result, verdict: run.verdict }));\n } else {\n writeRawOutput(`${run.id} ${run.status}${run.error ? ` ${run.error}` : ''}`);\n }\n}\n\nasync function run(argv: string[], apiUrl: string, token: string): Promise<number> {\n const configFile = getScalarArgValue(argv, '--config');\n const test = getScalarArgValue(argv, '--test');\n if (Boolean(configFile) === Boolean(test))\n throw new Error('Use exactly one of --config or --test.');\n if (\n test &&\n (getScalarArgValue(argv, '--application') || getScalarArgValue(argv, '--environment'))\n ) {\n throw new Error('--application and --environment are only valid with --config.');\n }\n const head = required(argv, '--head');\n const base = getScalarArgValue(argv, '--base');\n const target = test\n ? { perfTestId: (await resolveTest(apiUrl, token, test)).id }\n : {\n config: await readConfig(configFile!),\n applicationId: await resolveApplicationId(argv, apiUrl, token),\n environment: getScalarArgValue(argv, '--environment'),\n };\n const { id } = await request<{ id: string }>(apiUrl, token, 'POST', RUNS, {\n ...target,\n head,\n ...(base ? { base } : {}),\n });\n // Slice 4's job has a four-hour timeout (layer builds plus measured rounds).\n const deadline = Date.now() + 4 * 60 * 60 * 1000;\n while (Date.now() < deadline) {\n const current = await request<PerfRun>(\n apiUrl,\n token,\n 'GET',\n `${RUNS}/${encodeURIComponent(id)}`\n );\n if (current.status === 'failed') {\n printRun(current, hasFlag(argv, '--json'));\n return 1;\n }\n if (current.status === 'completed') {\n if (!current.result || !current.verdict)\n throw new Error(`Completed perf run ${id} has no result or verdict.`);\n printRun(current, hasFlag(argv, '--json'));\n return current.verdict === 'slower' ? 3 : 0;\n }\n await sleep(5000);\n }\n throw new Error(`Timed out waiting for ${id}. Inspect it with cofactor perf get ${id}.`);\n}\n\nasync function save(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = required(argv, '--name');\n const config = await readConfig(required(argv, '--config'));\n const applicationId = await resolveApplicationId(argv, apiUrl, token);\n const triggerConfig = await buildScheduleTriggerConfig(argv, apiUrl, token);\n const test = await request<PerfTest>(apiUrl, token, 'POST', TESTS, {\n name,\n config,\n applicationId,\n environment: getScalarArgValue(argv, '--environment'),\n ...(hasFlag(argv, '--on-merge') ? { onMerge: true } : {}),\n });\n const rules = rulesForTest(await listRules(apiUrl, token), test);\n await deletePaths(\n rules.map((rule) => `${RULES_PATH}/${encodeURIComponent(rule.id)}`),\n apiUrl,\n token\n );\n let rule: AutomationRule | undefined;\n if (triggerConfig) {\n const response = await apiRequest<ApiResponse<AutomationRule>>(\n apiUrl,\n token,\n 'POST',\n RULES_PATH,\n {\n name,\n enabled: true,\n triggerSource: 'schedule',\n triggerEvent: 'scheduled',\n triggerConfig,\n actionType: ACTION,\n actionConfig: { perf_test_id: testUuid(test) },\n }\n );\n if (!response.ok || !response.data) {\n throw new Error(\n `Saved ${test.id}, but could not create its schedule: ${response.error ?? 'rule creation failed'}`\n );\n }\n rule = response.data;\n }\n if (hasFlag(argv, '--json'))\n writeRawOutput(JSON.stringify({ ...test, ...(rule ? { rule } : {}) }, null, 2));\n else writeRawOutput(`Saved ${test.id} ${test.name}${rule ? ` schedule ${rule.id}` : ''}`);\n}\n\nasync function remove(test: PerfTest, apiUrl: string, token: string): Promise<void> {\n const rules = rulesForTest(await listRules(apiUrl, token), test);\n await deletePaths(\n [\n `${TESTS}/${encodeURIComponent(test.id)}`,\n ...rules.map((rule) => `${RULES_PATH}/${encodeURIComponent(rule.id)}`),\n ],\n apiUrl,\n token\n );\n}\n\nexport async function runPerf(argv: string[]): Promise<void> {\n const [command, ...rest] = argv;\n if (!command || command === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp(command);\n return;\n }\n if (command === 'guide') {\n await printServedGuide('perf', rest);\n return;\n }\n let code = 0;\n try {\n if (!Object.hasOwn(USAGE, command)) throw new Error(`Unknown perf command: ${command}`);\n // Require the identity selector before authentication or any mutating request.\n if (['run', 'save', 'delete'].includes(command)) required(rest, '--org');\n for (const flag of VALUE_FLAGS) {\n const value = getScalarArgValue(rest, flag);\n if (rest.includes(flag) && value === undefined) throw new Error(`${flag} requires a value.`);\n }\n const { apiUrl, token } = await resolveConfig(rest);\n const json = hasFlag(rest, '--json');\n if (command === 'run') code = await run(rest, apiUrl, token);\n else if (command === 'save') await save(rest, apiUrl, token);\n else if (command === 'list') {\n const [tests, rules] = await Promise.all([\n request<PerfTest[]>(apiUrl, token, 'GET', TESTS),\n listRules(apiUrl, token),\n ]);\n const listed = tests.map((test) => ({\n ...test,\n schedules: rulesForTest(rules, test),\n }));\n writeRawOutput(\n json\n ? JSON.stringify(listed, null, 2)\n : listed\n .map((test) => {\n const schedules = test.schedules\n .map(\n (rule) =>\n `${rule.id} [${rule.enabled ? 'enabled' : 'paused'}] ${JSON.stringify(rule.triggerConfig)}`\n )\n .join('; ');\n const modes = [\n ...(test.onMerge ? ['on-merge'] : []),\n ...(schedules ? [schedules] : []),\n ];\n return `${test.id} ${test.name} ${test.environment} ${modes.join(' ') || 'manual'}`;\n })\n .join('\\n') || 'No perf tests found.'\n );\n } else {\n const target = getPositionalArg(rest, VALUE_FLAGS);\n if (!target) throw new Error(`Usage: cofactor perf ${USAGE[command as Command]}`);\n if (command === 'get' && target.startsWith('prun_')) {\n printRun(\n await request<PerfRun>(apiUrl, token, 'GET', `${RUNS}/${encodeURIComponent(target)}`),\n json\n );\n } else {\n const test = await resolveTest(apiUrl, token, target);\n if (command === 'get')\n writeRawOutput(\n json\n ? JSON.stringify(test, null, 2)\n : `${test.id} ${test.name}\\non-merge: ${test.onMerge}\\n${JSON.stringify(test.config, null, 2)}`\n );\n else if (command === 'delete') {\n await remove(test, apiUrl, token);\n writeRawOutput(\n json ? JSON.stringify({ id: test.id, deleted: true }) : `Deleted ${test.id}`\n );\n } else {\n const limit = getScalarArgValue(rest, '--limit') ?? '20';\n if (!/^\\d+$/.test(limit) || Number(limit) < 1 || Number(limit) > 100)\n throw new Error('--limit must be an integer from 1 to 100.');\n const query = new URLSearchParams({ perfTestId: test.id, limit });\n const page = await request<{ items: RunSummary[]; nextCursor: string | null }>(\n apiUrl,\n token,\n 'GET',\n `${RUNS}?${query}`\n );\n writeRawOutput(\n json\n ? JSON.stringify(page, null, 2)\n : page.items\n .map((run) => `${run.id} ${run.status} ${run.verdict ?? '-'} ${run.headSha}`)\n .join('\\n') || 'No perf runs found.'\n );\n }\n }\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n code = 1;\n }\n if (code !== 0) process.exit(code);\n}\n","/**\n * Entity prefix registry — the central map from prefix to table metadata.\n *\n * Powers both ID encoding/decoding and the generic org-lookup middleware.\n * To add a new entity prefix, add an entry here and the system picks it up.\n *\n * @module EntityRegistry\n * @see docs/project/prefixed-ids.md\n */\n\nexport const EntityPrefix = {\n agentEval: 'aeval',\n agentEvalCase: 'aecase',\n agentEvalRun: 'aerun',\n agentEvalAttempt: 'aeatt',\n organization: 'org',\n workflow: 'wf',\n workflowTestExecution: 'exec',\n workflowTestRun: 'trun',\n workflowRun: 'wrun',\n adhocTest: 'adhoc',\n exploratoryTest: 'expt',\n perfTest: 'ptest',\n perfRun: 'prun',\n issue: 'iss',\n property: 'prop',\n credential: 'cred',\n credentialTemplate: 'ctpl',\n syntheticUniverse: 'su',\n syntheticUser: 'sp',\n syntheticUserRun: 'sr',\n userEvent: 'uev',\n userEventDashboard: 'ued',\n userEventDashboardCard: 'uedc',\n triageRun: 'trg',\n triageFinding: 'trgf',\n phoneNumber: 'phn',\n textMessage: 'sms',\n productArea: 'parea',\n productCapability: 'pcap',\n productCapabilityRule: 'prule',\n landingPage: 'lp',\n prReview: 'prr',\n digest: 'dig',\n explorationCycle: 'excy',\n explorationLead: 'exld',\n testSignInProvider: 'tsp',\n testSignInClient: 'tsc',\n testSignInGrant: 'tsg',\n pullRequestProofRecord: 'proof',\n} as const;\n\nexport type EntityPrefixValue = (typeof EntityPrefix)[keyof typeof EntityPrefix];\n\nexport type EntityRegistryEntry = {\n /** PostgreSQL table name */\n tableName: string;\n /** Column containing the owning org's ID. null for entities that ARE orgs. */\n orgIdColumn: string | null;\n /** Primary key column name (usually 'id') */\n idColumn: string;\n /** Build the frontend URL for this entity. Returns a path string. */\n buildUrl?: (opts: { prefixedId: string; parentPrefixedId?: string }) => string;\n /**\n * Uppercase prefix for this entity's *natural* code, when it has one.\n *\n * A few entities carry a short human-citable code alongside their opaque\n * prefixed id — `CAP-CMM-001` next to `pcap_…`. Both encodings answer \"what\n * kind of thing is this?\", so both are declared here rather than in a second\n * parallel vocabulary that could drift out of step with this one. Absent for\n * the entities addressed only by prefixed id.\n */\n naturalCodePrefix?: string;\n /** For entities whose URL requires a parent's ID (e.g., test runs need execution ID) */\n parentLookup?: {\n /** Foreign key column on this entity's table pointing to the parent */\n foreignKey: string;\n /** Prefix for encoding the parent entity's ID */\n parentPrefix: EntityPrefixValue;\n };\n};\n\nexport const ENTITY_REGISTRY: Record<EntityPrefixValue, EntityRegistryEntry> = {\n aeval: { tableName: 'agent_evals', orgIdColumn: 'org_id', idColumn: 'id' },\n aecase: { tableName: 'agent_eval_cases', orgIdColumn: 'org_id', idColumn: 'id' },\n aerun: { tableName: 'agent_eval_runs', orgIdColumn: 'org_id', idColumn: 'id' },\n aeatt: { tableName: 'agent_eval_attempts', orgIdColumn: 'org_id', idColumn: 'id' },\n org: {\n tableName: 'organizations',\n orgIdColumn: null,\n idColumn: 'id',\n },\n wf: {\n tableName: 'workflows',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/flows/${prefixedId}`,\n },\n exec: {\n tableName: 'workflow_test_executions',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/runs/test/${prefixedId}`,\n },\n trun: {\n tableName: 'workflow_test_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ parentPrefixedId }) => `/runs/test/${parentPrefixedId}`,\n parentLookup: {\n foreignKey: 'execution_id',\n parentPrefix: 'exec',\n },\n },\n wrun: {\n tableName: 'workflow_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n // Needs propertyId parent — not yet implemented\n },\n adhoc: {\n tableName: 'adhoc_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/exploratory/${prefixedId}`,\n },\n expt: {\n tableName: 'exploratory_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ptest: {\n tableName: 'perf_tests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n prun: {\n tableName: 'perf_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n iss: {\n tableName: 'issues',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/issues?issueId=${prefixedId}`,\n },\n prop: {\n tableName: 'org_properties',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/properties/${prefixedId}`,\n },\n cred: {\n tableName: 'org_property_credentials',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ctpl: {\n tableName: 'credential_templates',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n su: {\n tableName: 'synthetic_universes',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/synthetic-users/${prefixedId}`,\n },\n sp: {\n tableName: 'synthetic_users',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n sr: {\n tableName: 'synthetic_user_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n uev: {\n tableName: 'user_events',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n ued: {\n tableName: 'user_event_dashboards',\n orgIdColumn: null,\n idColumn: 'id',\n },\n uedc: {\n tableName: 'user_event_dashboard_cards',\n orgIdColumn: null,\n idColumn: 'id',\n },\n trg: {\n tableName: 'triage_runs',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ parentPrefixedId }) =>\n parentPrefixedId ? `/runs/test/${parentPrefixedId}?tab=triage` : '/runs/test',\n parentLookup: {\n foreignKey: 'workflow_test_execution_id',\n parentPrefix: 'exec',\n },\n },\n trgf: {\n tableName: 'triage_findings',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n phn: {\n tableName: 'messaging_phone_numbers',\n orgIdColumn: 'owner_org_id',\n idColumn: 'id',\n },\n sms: {\n tableName: 'text_messages',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n parea: {\n tableName: 'product_areas',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/product-map?area=${prefixedId}`,\n naturalCodePrefix: 'ARE',\n },\n pcap: {\n tableName: 'product_capabilities',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/product-map?capability=${prefixedId}`,\n naturalCodePrefix: 'CAP',\n },\n prule: {\n tableName: 'product_capability_rules',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n // No buildUrl: landing pages are authored from the CLI and served at\n // runcofactor.com/lp/<slug> — there is no in-app detail route to link to.\n //\n // Deliberately NO `lpv` prefix for landing_page_variants. That table has no\n // org_id column, and `orgIdColumn: null` does not mean \"child table\" here —\n // resolveEntityOrg (apps/api/src/middleware/resolve-entity-org.ts) reads it\n // as \"the ID *is* the orgId\" and compares the UUID against the caller's org,\n // so a variant routed through the generic middleware would be rejected for\n // the wrong reason. Variants are addressed by (page slug, variant name);\n // add a prefix only together with real parent-resolving lookup support.\n lp: {\n tableName: 'landing_pages',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n prr: {\n tableName: 'pr_reviews',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/pr-reviews/${prefixedId}`,\n },\n dig: {\n tableName: 'org_digests',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/digests/${prefixedId}`,\n },\n excy: {\n tableName: 'exploration_cycles',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/explore/cycles/${prefixedId}`,\n },\n exld: {\n tableName: 'exploration_leads',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsp: {\n tableName: 'test_sign_in_providers',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsc: {\n tableName: 'test_sign_in_clients',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n tsg: {\n tableName: 'test_sign_in_grants',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n },\n proof: {\n tableName: 'pull_request_proof_records',\n orgIdColumn: 'org_id',\n idColumn: 'id',\n buildUrl: ({ prefixedId }) => `/proofs/${prefixedId}`,\n },\n} as const;\n\n// Freeze the registry — sql.raw() safety depends on these being immutable string literals\nObject.freeze(ENTITY_REGISTRY);\n\n/** Strict SQL identifier pattern — registry values must match this. */\nconst SAFE_IDENT = /^[a-z_][a-z0-9_]*$/;\n\n// Validate all registry entries at module load time\nfor (const [prefix, entry] of Object.entries(ENTITY_REGISTRY)) {\n for (const field of [entry.tableName, entry.orgIdColumn, entry.idColumn].filter(\n Boolean\n ) as string[]) {\n if (!SAFE_IDENT.test(field)) {\n throw new Error(`Invalid identifier in ENTITY_REGISTRY['${prefix}']: \"${field}\"`);\n }\n }\n}\n\n/** All valid prefix strings, derived from the registry. */\nexport const VALID_PREFIXES = new Set<string>(Object.keys(ENTITY_REGISTRY));\n\n/** Look up a registry entry by prefix string. Returns undefined for unknown prefixes. */\nexport function getRegistryEntry(prefix: string): EntityRegistryEntry | undefined {\n return ENTITY_REGISTRY[prefix as EntityPrefixValue];\n}\n","/**\n * Base58 encoding/decoding using the Bitcoin alphabet.\n *\n * Encodes arbitrary byte arrays into URL-safe, human-readable strings\n * without ambiguous characters (0/O, l/1, +, /).\n *\n * @module Base58\n * @see docs/project/prefixed-ids.md\n */\n\nconst ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nconst BASE = 58;\n\nconst ALPHABET_MAP = new Map<string, number>();\nfor (let i = 0; i < ALPHABET.length; i++) {\n ALPHABET_MAP.set(ALPHABET[i]!, i);\n}\n\n/** Encode a Uint8Array into a base58 string. */\nexport function encodeBase58(bytes: Uint8Array): string {\n if (bytes.length === 0) return '';\n\n // Count leading zero bytes (they map to '1' in base58)\n let leadingZeros = 0;\n while (leadingZeros < bytes.length && bytes[leadingZeros] === 0) {\n leadingZeros++;\n }\n\n // Work on a copy as a big-endian number\n const digits: number[] = [];\n for (let i = leadingZeros; i < bytes.length; i++) {\n let carry = bytes[i]!;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j]! * 256;\n digits[j] = carry % BASE;\n carry = Math.floor(carry / BASE);\n }\n while (carry > 0) {\n digits.push(carry % BASE);\n carry = Math.floor(carry / BASE);\n }\n }\n\n // Build result: leading '1's + reversed digits\n let result = ALPHABET[0]!.repeat(leadingZeros);\n for (let i = digits.length - 1; i >= 0; i--) {\n result += ALPHABET[digits[i]!];\n }\n\n return result;\n}\n\n/** Decode a base58 string back to a Uint8Array. Returns null on invalid input. */\nexport function decodeBase58(str: string): Uint8Array | null {\n if (str.length === 0) return new Uint8Array(0);\n\n // Count leading '1's (they map to 0x00 bytes)\n let leadingOnes = 0;\n while (leadingOnes < str.length && str[leadingOnes] === ALPHABET[0]) {\n leadingOnes++;\n }\n\n const bytes: number[] = [];\n for (let i = leadingOnes; i < str.length; i++) {\n const value = ALPHABET_MAP.get(str[i]!);\n if (value === undefined) return null; // invalid character\n\n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j]! * BASE;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n // Combine leading zeros + reversed bytes\n const result = new Uint8Array(leadingOnes + bytes.length);\n // leadingOnes positions are already 0\n for (let i = 0; i < bytes.length; i++) {\n result[leadingOnes + i] = bytes[bytes.length - 1 - i]!;\n }\n\n return result;\n}\n","/**\n * Prefixed ID encoding, decoding, and parsing.\n *\n * Format: `{prefix}_{base58(uuid_bytes)}`\n * Example: `exec_6ByM4qP5NH7t4DtaCHeALh`\n *\n * @module PrefixedId\n * @see docs/project/prefixed-ids.md\n */\n\nimport { encodeBase58, decodeBase58 } from './base58.js';\nimport { VALID_PREFIXES, type EntityPrefixValue } from './registry.js';\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst PREFIXED_RE = /^([a-z]{2,6})_([1-9A-HJ-NP-Za-km-z]+)$/;\n\n/**\n * Whether a string is a UUID in the canonical hyphenated form.\n *\n * Callers that pass a path or query parameter straight into a `uuid` column\n * need this: Postgres rejects a value it cannot parse with `22P02` at bind\n * time, so the query fails outright instead of returning an empty result set.\n *\n * Deliberately stricter than Postgres, which also accepts the unhyphenated\n * 32-hex and brace-wrapped forms. We only ever emit the canonical form, so\n * `isUuid(x) === false` means \"not one of ours\", not \"Postgres would reject x\".\n */\nexport function isUuid(value: string): boolean {\n return UUID_RE.test(value);\n}\n\n/** Convert a UUID hex string (with or without hyphens) to a 16-byte Uint8Array. */\nfunction uuidToBytes(uuid: string): Uint8Array {\n const hex = uuid.replace(/-/g, '');\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/** Convert a 16-byte Uint8Array to a hyphenated UUID string. */\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Encode a raw UUID into a prefixed ID string. */\nexport function encodePrefixedId(prefix: EntityPrefixValue, uuid: string): string {\n const bytes = uuidToBytes(uuid);\n return `${prefix}_${encodeBase58(bytes)}`;\n}\n\n/** Decode a prefixed ID string back to { prefix, uuid }. Returns null on invalid input. */\nexport function decodePrefixedId(\n id: string\n): { prefix: EntityPrefixValue; uuid: string } | null {\n const match = id.match(PREFIXED_RE);\n if (!match) return null;\n\n const prefix = match[1]!;\n if (!VALID_PREFIXES.has(prefix)) return null;\n\n const decoded = decodeBase58(match[2]!);\n if (!decoded || decoded.length < 16 || decoded.length > 17) return null;\n\n // Base58 decoding may produce 17 bytes for some UUIDs — strip leading zero byte\n let normalized = decoded;\n if (decoded.length === 17) {\n if (decoded[0] !== 0) return null; // corrupted input\n normalized = decoded.slice(1);\n }\n\n return { prefix: prefix as EntityPrefixValue, uuid: bytesToUuid(normalized) };\n}\n\nexport type ParsedId =\n | { kind: 'prefixed'; prefix: EntityPrefixValue; uuid: string }\n | { kind: 'raw_uuid'; uuid: string }\n | { kind: 'invalid' };\n\n/**\n * Parse any ID input — accepts a prefixed ID, a raw UUID, or returns invalid.\n * This is the backwards-compatible entry point used during migration.\n */\nexport function parseAnyId(input: string): ParsedId {\n // Try prefixed first\n const decoded = decodePrefixedId(input);\n if (decoded) return { kind: 'prefixed', ...decoded };\n\n // Try raw UUID\n if (UUID_RE.test(input)) return { kind: 'raw_uuid', uuid: input.toLowerCase() };\n\n return { kind: 'invalid' };\n}\n\n","/**\n * Shared logic for finding bare registered prefixed entity IDs inside\n * markdown text — the single source for both the web app's\n * `EntityLinkMarkdown` linkifier and any server-side markdown-entity\n * resolution (e.g. product-map capability bodies).\n *\n * @module EntityLink\n */\n\nimport { EntityPrefix } from './registry.js';\n\nconst prefixAlternation = Object.values(EntityPrefix)\n .sort((left, right) => right.length - left.length)\n .join('|');\n\n/** Matches a bare registered prefixed entity ID, e.g. `wf_abc123`. */\nexport const BARE_ENTITY_ID = new RegExp(\n `(^|[^A-Za-z0-9_])((?:${prefixAlternation})_[1-9A-HJ-NP-Za-km-z]+)(?![A-Za-z0-9_])`,\n 'g'\n);\n\n/** Matches fenced code blocks, inline code, and existing markdown links — segments to skip. */\nexport const PROTECTED_MARKDOWN = /(```[\\s\\S]*?```|`[^`\\n]+`|\\[[^\\]]*\\]\\([^)]+\\))/g;\n\nfunction shortEntityId(id: string): string {\n if (id.length <= 18) return id;\n const separator = id.indexOf('_');\n return `${id.slice(0, separator + 1)}${id.slice(separator + 1, separator + 9)}…`;\n}\n\n/**\n * Splits markdown into segments, tagging each as protected (fenced code,\n * inline code, existing markdown links) or plain. Protected segments must be\n * left untouched by both linkification and entity-id extraction.\n */\nfunction splitProtectedSegments(markdown: string): Array<{ text: string; protected: boolean }> {\n return markdown\n .split(PROTECTED_MARKDOWN)\n .map((text) => ({ text, protected: Boolean(text.match(PROTECTED_MARKDOWN)) }));\n}\n\nfunction linkifyPlainSegment(segment: string): string {\n return segment.replace(BARE_ENTITY_ID, (_match, leading: string, id: string) => {\n return `${leading}[${shortEntityId(id)}](/lookup/${id})`;\n });\n}\n\n/**\n * Linkifies bare registered entity IDs while leaving fenced code blocks,\n * inline code, and existing markdown links untouched. Markdown links\n * intentionally route through `/lookup` so org checks and canonical entity\n * URLs stay centralized.\n */\nexport function linkifyEntityIds(markdown: string): string {\n return splitProtectedSegments(markdown)\n .map(({ text, protected: isProtected }) => (isProtected ? text : linkifyPlainSegment(text)))\n .join('');\n}\n\n/**\n * Extracts the bare registered prefixed entity IDs appearing in a markdown\n * string, skipping fenced code blocks, inline code, and existing markdown\n * links. Order-preserving, de-duplicated.\n */\nexport function extractEntityIds(markdown: string): string[] {\n const ids: string[] = [];\n const seen = new Set<string>();\n for (const { text, protected: isProtected } of splitProtectedSegments(markdown)) {\n if (isProtected) continue;\n for (const match of text.matchAll(BARE_ENTITY_ID)) {\n const id = match[2];\n if (id && !seen.has(id)) {\n seen.add(id);\n ids.push(id);\n }\n }\n }\n return ids;\n}\n","/**\n * Branded ID types for compile-time safety across the prefixed ID boundary.\n *\n * Per-entity types use template literals so the compiler enforces prefix matching:\n * FlowId = `wf_${string}` — only matches \"wf_abc123\", not \"exec_abc123\"\n * FlowUuid = Uuid & { __entity: 'wf' } — a UUID known to reference a workflow\n *\n * @module types\n * @see packages/ids/src/prefixed-id.ts\n */\n\nimport { parseAnyId } from './prefixed-id.js';\nimport type { EntityPrefix } from './registry.js';\n\n// ---------------------------------------------------------------------------\n// Base branded types\n// ---------------------------------------------------------------------------\n\n/** A raw UUID. What the DB stores. What repos, services, and DB code accept. */\nexport type Uuid = string & { readonly __brand: 'Uuid' };\n\n/** A prefixed entity ID like `wf_abc123`. What users see in URLs. */\nexport type EntityId = string & { readonly __brand: 'EntityId' };\n\n/** Union: accepts both prefixed IDs and raw UUIDs (route params during migration). */\nexport type AnyEntityId = EntityId | Uuid;\n\n// ---------------------------------------------------------------------------\n// Per-entity prefixed ID types (template literal — compiler checks the prefix)\n// ---------------------------------------------------------------------------\n\n/** Derive a prefixed ID type from a prefix string: `wf_${string}` */\ntype PrefixedId<P extends string> = `${P}_${string}` & { readonly __brand: 'EntityId' };\n\nexport type OrganizationId = PrefixedId<typeof EntityPrefix.organization>;\nexport type FlowId = PrefixedId<typeof EntityPrefix.workflow>;\nexport type ExecutionId = PrefixedId<typeof EntityPrefix.workflowTestExecution>;\nexport type TestRunId = PrefixedId<typeof EntityPrefix.workflowTestRun>;\nexport type WorkflowRunId = PrefixedId<typeof EntityPrefix.workflowRun>;\nexport type IssueId = PrefixedId<typeof EntityPrefix.issue>;\nexport type PropertyId = PrefixedId<typeof EntityPrefix.property>;\nexport type CredentialId = PrefixedId<typeof EntityPrefix.credential>;\nexport type PerfTestId = PrefixedId<typeof EntityPrefix.perfTest>;\nexport type PerfRunId = PrefixedId<typeof EntityPrefix.perfRun>;\n\n// ---------------------------------------------------------------------------\n// Per-entity UUID types (branded — a UUID known to reference a specific entity)\n// ---------------------------------------------------------------------------\n\n/** A UUID branded with the entity type it references. */\ntype EntityUuid<P extends string> = Uuid & { readonly __entity: P };\n\nexport type OrganizationUuid = EntityUuid<typeof EntityPrefix.organization>;\nexport type FlowUuid = EntityUuid<typeof EntityPrefix.workflow>;\nexport type ExecutionUuid = EntityUuid<typeof EntityPrefix.workflowTestExecution>;\nexport type TestRunUuid = EntityUuid<typeof EntityPrefix.workflowTestRun>;\nexport type WorkflowRunUuid = EntityUuid<typeof EntityPrefix.workflowRun>;\nexport type IssueUuid = EntityUuid<typeof EntityPrefix.issue>;\nexport type PropertyUuid = EntityUuid<typeof EntityPrefix.property>;\nexport type CredentialUuid = EntityUuid<typeof EntityPrefix.credential>;\nexport type PerfTestUuid = EntityUuid<typeof EntityPrefix.perfTest>;\nexport type PerfRunUuid = EntityUuid<typeof EntityPrefix.perfRun>;\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\n/** Brand a validated prefixed ID string. Returns null if not a valid prefixed format. */\nexport function toEntityId(value: string): EntityId | null {\n const parsed = parseAnyId(value);\n return parsed.kind === 'prefixed' ? (value as EntityId) : null;\n}\n\n/** Brand a known-valid UUID string. Use `extractUuid` for route params that may be prefixed. */\nexport function toUuid(value: string): Uuid | null {\n const parsed = parseAnyId(value);\n if (parsed.kind === 'raw_uuid') return parsed.uuid as Uuid;\n return null;\n}\n\n/** Brand any valid ID (prefixed or UUID). Returns null if invalid format. */\nexport function toAnyEntityId(value: string): AnyEntityId | null {\n const parsed = parseAnyId(value);\n return parsed.kind !== 'invalid' ? (value as AnyEntityId) : null;\n}\n\n// ---------------------------------------------------------------------------\n// Pure extraction (the main function most routes use)\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a UUID from any entity ID format (prefixed or raw UUID).\n *\n * Pure compute — no DB, no Effect, no org check. Returns a branded `Uuid`\n * that repos and services can accept. Returns null if unparseable.\n *\n * Most routes should use this. Only cross-org redirect endpoints need\n * the full `resolveEntityOrg` middleware.\n */\nexport function extractUuid(raw: string | null | undefined): Uuid | null {\n if (!raw) return null;\n const parsed = parseAnyId(raw);\n if (parsed.kind === 'prefixed') return parsed.uuid.toLowerCase() as Uuid;\n if (parsed.kind === 'raw_uuid') return parsed.uuid.toLowerCase() as Uuid;\n return null;\n}\n","import { z } from 'zod';\n\nconst k6Load = {\n vus: z.number().int().min(1).max(200),\n durationSeconds: z.number().int().min(10).max(300),\n as: z.string().min(1).optional(),\n};\n\ntype Estimable = {\n rounds: number;\n lighthouse?: { pages: readonly unknown[] };\n k6?: { durationSeconds: number };\n};\n\n/** Estimated time for both arms, including one warm-up, setup, and collection. */\nexport const estimatePerfSeconds = (config: Estimable): number =>\n (config.rounds + 1) *\n ((config.lighthouse?.pages.length ?? 0) * 45 + (config.k6?.durationSeconds ?? 0) + 30) *\n 2 +\n 600;\n\nconst perfBase = {\n rounds: z.number().int().min(5).max(15).default(7),\n lighthouse: z\n .strictObject({\n formFactor: z.enum(['desktop', 'mobile']),\n pages: z\n .array(z.strictObject({\n name: z.string().min(1).max(40).regex(/^[a-z0-9-]+$/),\n path: z\n .string()\n .startsWith('/')\n .refine((path) => !path.startsWith('//'), 'path must be relative, not protocol-relative')\n .refine((path) => !path.includes('\\\\'), 'path must not contain backslashes'),\n as: z.string().min(1).optional(),\n }))\n .min(1)\n .max(10),\n })\n .optional(),\n};\n\nconst withPerfRules = <S extends z.ZodType<Estimable>>(schema: S) =>\n schema\n .refine((config) => config.lighthouse !== undefined || config.k6 !== undefined, {\n message: 'configure at least one of lighthouse or k6',\n })\n .refine((config) => estimatePerfSeconds(config) <= 5400, {\n message: 'estimated run time exceeds 90 minutes; reduce rounds, pages or duration',\n });\n\n/** `perf.yaml` as written; the CLI resolves `k6.script` relative to this file. */\nexport const PerfConfigSchema = withPerfRules(\n z.strictObject({\n ...perfBase,\n k6: z.strictObject({ script: z.string().min(1), ...k6Load }).optional(),\n })\n);\n\n/** Config received and stored by the API after the CLI inlines the k6 script. */\nexport const StoredPerfConfigSchema = withPerfRules(\n z.strictObject({\n ...perfBase,\n k6: z.strictObject({ scriptSource: z.string().min(1).max(200_000), ...k6Load }).optional(),\n })\n);\n\nexport type PerfConfig = z.infer<typeof PerfConfigSchema>;\nexport type StoredPerfConfig = z.infer<typeof StoredPerfConfigSchema>;\n","import { z } from 'zod';\n\nexport const PerfArmSchema = z.enum(['base', 'head']);\nexport type PerfArm = z.infer<typeof PerfArmSchema>;\n\nexport const PerfVerdictSchema = z.enum(['faster', 'slower', 'no_change']);\nexport type PerfVerdict = z.infer<typeof PerfVerdictSchema>;\n\nexport const PerfRunStatusSchema = z.enum(['queued', 'running', 'completed', 'failed']);\nexport type PerfRunStatus = z.infer<typeof PerfRunStatusSchema>;\n\nexport const PERF_MIN_EFFECT = 0.1;\n\nexport interface PerfRow {\n id: string;\n flavor: 'lighthouse' | 'k6' | 'otel';\n label: string;\n unit: 'ms' | 'rps' | 'ratio' | 'bytes' | 'count';\n gated: boolean;\n base: { median: number; values: number[] };\n head: { median: number; values: number[] };\n /** Ratio of medians; rps flips the sign so positive means worse; ratio rows use percentage-point difference and zero-base rows use absolute difference. */\n deltaPct: number;\n /** Bootstrap confidence interval in the same unit as `deltaPct`. */\n ci95: [number, number];\n verdict: PerfVerdict;\n}\n\nexport type PerfRunHeadlineDelta = Pick<PerfRow, 'id' | 'label' | 'unit' | 'verdict'> & {\n baseMedian: number;\n deltaPct: number;\n absolute: boolean;\n ci95: [number, number];\n};\n\n/** Whether a row's delta and confidence interval use absolute units instead of a ratio. */\nexport function usesAbsoluteDifference(row: {\n unit: PerfRow['unit'];\n base: { values: number[] };\n}): boolean {\n return row.unit === 'ratio' || row.base.values.includes(0);\n}\n\nexport interface PerfSlowSpan {\n name: string;\n count: number;\n p95Ms: number;\n totalMs: number;\n}\n\nexport interface PerfResult {\n rounds: number;\n rows: PerfRow[];\n /** Null when neither arm received spans because the app has no OTel instrumentation. */\n otel: null | {\n topSlowSpans: { base: PerfSlowSpan[]; head: PerfSlowSpan[] };\n };\n tools: { lighthouse?: string; k6?: string; otelcol?: string };\n}\n","import { z } from 'zod';\nimport { StoredPerfConfigSchema } from './perf-config.js';\nimport { PerfArmSchema } from './perf-result.js';\n\n/** Config staged for one guest arm by the perf job. */\nexport const RunnerConfigSchema = StoredPerfConfigSchema.safeExtend({\n /** HTTPS URL for the claimed sandbox's public app port. */\n baseUrl: z.url({ protocol: /^https$/ }),\n otelExpected: z.boolean(),\n});\n\nexport type RunnerConfig = z.infer<typeof RunnerConfigSchema>;\n\nconst LighthousePageRoundSchema = z.strictObject({\n name: z.string().min(1),\n lcpMs: z.number().nonnegative(),\n tbtMs: z.number().nonnegative(),\n fcpMs: z.number().nonnegative(),\n cls: z.number().nonnegative(),\n speedIndexMs: z.number().nonnegative(),\n bytes: z.number().nonnegative(),\n finalUrl: z.string().min(1),\n documentStatus: z.number().int(),\n});\n\nconst K6RoundSchema = z.strictObject({\n p50Ms: z.number().nonnegative(),\n p95Ms: z.number().nonnegative(),\n requestsPerSecond: z.number().nonnegative(),\n errorRate: z.number().nonnegative(),\n});\n\nconst OtelEndpointRoundSchema = z.strictObject({\n endpoint: z.string().min(1),\n count: z.number().int().nonnegative(),\n p50Ms: z.number().nonnegative(),\n p95Ms: z.number().nonnegative(),\n});\n\nconst PerfRoundSlowSpanSchema = z.strictObject({\n name: z.string().min(1),\n count: z.number().int().nonnegative(),\n p95Ms: z.number().nonnegative(),\n totalMs: z.number().nonnegative(),\n});\n\n/** One runner JSONL record for a measured round on one arm. */\nexport const RoundSummarySchema = z.strictObject({\n round: z.number().int().positive(),\n arm: PerfArmSchema,\n lighthouse: z.array(LighthousePageRoundSchema).optional(),\n k6: K6RoundSchema.optional(),\n otel: z\n .strictObject({\n endpoints: z.array(OtelEndpointRoundSchema),\n topSlowSpans: z.array(PerfRoundSlowSpanSchema),\n })\n .optional(),\n});\n\nexport type RoundSummary = z.infer<typeof RoundSummarySchema>;\n","import { usesAbsoluteDifference } from './perf-result.js';\nimport type { PerfResult, PerfRow, PerfSlowSpan, PerfVerdict } from './perf-result.js';\n\nexport type PerfRenderInput = {\n id: string;\n verdict: PerfVerdict;\n baseSha: string;\n headSha: string;\n result: PerfResult;\n};\n\nexport function renderPerfResult(input: PerfRenderInput): string {\n const heading =\n input.verdict === 'slower' ? 'SLOWER' : input.verdict === 'faster' ? 'faster' : 'no change';\n const visibleRows = input.result.rows.filter(\n (row) =>\n row.gated ||\n (row.flavor === 'otel' &&\n row.id.endsWith(':p95') &&\n (row.base.values.length < input.result.rounds ||\n row.head.values.length < input.result.rounds))\n );\n const omittedUngatedRows = input.result.rows.filter((row) => !visibleRows.includes(row));\n const lines = [\n `## Perf: ${heading} (head ${shortSha(input.headSha)} vs base ${shortSha(input.baseSha)}, ${input.result.rounds} rounds)`,\n '',\n '| Metric | Base | Head | Delta | 95% CI | Verdict |',\n '|---|---|---|---|---|---|',\n ...visibleRows.map((row) => renderRow(row, input.result.rounds)),\n ];\n const ungated = omittedUngatedRows.length;\n if (ungated > 0)\n lines.push(\n '',\n `Not gated: ${ungated} more rows (${ungatedLabels(omittedUngatedRows)}). \\`--json\\` for all rows.`\n );\n const tools = [\n input.result.tools.lighthouse && `lighthouse ${input.result.tools.lighthouse}`,\n input.result.tools.k6 && `k6 ${input.result.tools.k6}`,\n input.result.tools.otelcol && `otelcol-contrib ${input.result.tools.otelcol}`,\n ].filter((tool): tool is string => tool !== undefined);\n if (ungated === 0) lines.push('');\n lines.push(`Tools: ${tools.length > 0 ? tools.join(', ') : 'none'}. Run: ${input.id}.`);\n if (input.verdict === 'slower' && input.result.otel) {\n lines.push(\n '',\n '### Slowest server spans (head)',\n '',\n ...renderSpans(input.result.otel.topSlowSpans.head.slice(0, 5))\n );\n const baseByName = new Map(\n input.result.otel.topSlowSpans.base.map((span) => [span.name, span])\n );\n const slower = input.result.otel.topSlowSpans.head.filter((span) => {\n const base = baseByName.get(span.name);\n return !base || span.p95Ms > base.p95Ms;\n });\n if (slower.length > 0)\n lines.push('', '### New or slower than base', '', ...renderSpans(slower));\n }\n return lines.join('\\n');\n}\n\nfunction ungatedLabels(rows: PerfRow[]): string {\n const labels = rows.map((row) => {\n if (row.id.endsWith(':fcp')) return 'FCP';\n if (row.id.endsWith(':cls')) return 'CLS';\n if (row.id.endsWith(':speed-index')) return 'speed index';\n if (row.id.endsWith(':bytes')) return 'bytes';\n if (row.id.endsWith(':p50')) return 'p50s';\n return row.label;\n });\n const order = ['FCP', 'CLS', 'speed index', 'bytes', 'p50s'];\n const standard = order.filter((label) => labels.includes(label));\n const extra = [...new Set(labels.filter((label) => !order.includes(label)))];\n return [...standard, ...extra].join(', ');\n}\n\nfunction renderRow(row: PerfRow, rounds: number): string {\n const sparseEndpoint =\n row.flavor === 'otel' &&\n row.id.endsWith(':p95') &&\n (row.base.values.length < rounds || row.head.values.length < rounds);\n const verdict = row.verdict === 'slower' ? 'SLOWER' : row.verdict.replace('_', ' ');\n const label = sparseEndpoint ? `${row.label} (not gated)` : row.label;\n return `| ${escapeCell(label)} | ${formatArmValue(row.base, row.unit)} | ${formatArmValue(row.head, row.unit)} | ${formatDelta(row)} | ${formatInterval(row)} | ${verdict} |`;\n}\n\nfunction formatArmValue(arm: PerfRow['base'], unit: PerfRow['unit']): string {\n return arm.values.length === 0 ? '-' : formatValue(arm.median, unit);\n}\n\nexport function formatValue(value: number, unit: PerfRow['unit']): string {\n switch (unit) {\n case 'ms':\n return `${round(value)} ms`;\n case 'rps':\n return `${round(value)}`;\n case 'ratio':\n return `${(value * 100).toFixed(1)}%`;\n case 'bytes':\n return `${round(value)} bytes`;\n case 'count':\n return `${round(value)}`;\n }\n}\n\nexport function formatDelta(row: PerfRow): string {\n const missingBase = row.base.values.length === 0;\n const missingHead = row.head.values.length === 0;\n if (missingBase) return 'new';\n if (missingHead) return 'removed';\n if (row.unit === 'ratio') return `${signed(row.deltaPct, 1)} pt`;\n const displayedDelta = row.unit === 'rps' ? -row.deltaPct : row.deltaPct;\n if (usesAbsoluteDifference(row)) {\n return `${signed(displayedDelta, 0)}${unitSuffix(row.unit)}`;\n }\n return `${signed(displayedDelta * 100, 1)}%`;\n}\n\nexport function formatInterval(row: PerfRow): string {\n const missingBase = row.base.values.length === 0;\n const missingHead = row.head.values.length === 0;\n if (missingBase || missingHead) return '-';\n const absolute = usesAbsoluteDifference(row);\n const suffix = row.unit === 'ratio' ? ' pt' : absolute ? unitSuffix(row.unit) : '%';\n const scale = row.unit === 'ratio' || absolute ? 1 : 100;\n const precision = suffix === '%' || row.unit === 'ratio' ? 1 : 0;\n const lowerBound = row.unit === 'rps' ? -row.ci95[1] : row.ci95[0];\n const upperBound = row.unit === 'rps' ? -row.ci95[0] : row.ci95[1];\n const lower = signed(lowerBound * scale, precision);\n const upper = signed(upperBound * scale, precision);\n return suffix === '%' ? `${lower}% .. ${upper}%` : `${lower} .. ${upper}${suffix}`;\n}\n\nexport function unitSuffix(unit: PerfRow['unit']): string {\n switch (unit) {\n case 'ms':\n return ' ms';\n case 'rps':\n return ' rps';\n case 'ratio':\n return ' pt';\n case 'bytes':\n return ' bytes';\n case 'count':\n return '';\n }\n}\n\nfunction renderSpans(spans: PerfSlowSpan[]): string[] {\n if (spans.length === 0) return ['No server spans.'];\n return [\n '| Name | Count | Worst round p95 | Total duration |',\n '|---|---:|---:|---:|',\n ...spans.map(\n (span) =>\n `| ${escapeCell(span.name)} | ${span.count} | ${round(span.p95Ms)} ms | ${round(span.totalMs)} ms |`\n ),\n ];\n}\n\nexport function shortSha(sha: string): string {\n return sha.slice(0, 7);\n}\n\nexport function signed(value: number, precision = 1): string {\n const rounded = Number(value.toFixed(precision));\n return `${rounded >= 0 ? '+' : ''}${rounded.toFixed(precision)}`;\n}\n\nfunction round(value: number): number {\n return Number(value.toFixed(1));\n}\n\nfunction escapeCell(value: string): string {\n return value.replaceAll('|', '\\\\|').replaceAll('\\n', ' ');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,gBAAgB;AACzB,SAAS,SAAS,eAAe;AACjC,SAAS,cAAc,aAAa;AACpC,SAAS,aAAa;;;ACMf,IAAM,eAAe;AAAA,EAC1B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAC1B;AAgCO,IAAM,kBAAkE;AAAA,EAC7E,OAAO,EAAE,WAAW,eAAe,aAAa,UAAU,UAAU,KAAK;AAAA,EACzE,QAAQ,EAAE,WAAW,oBAAoB,aAAa,UAAU,UAAU,KAAK;AAAA,EAC/E,OAAO,EAAE,WAAW,mBAAmB,aAAa,UAAU,UAAU,KAAK;AAAA,EAC7E,OAAO,EAAE,WAAW,uBAAuB,aAAa,UAAU,UAAU,KAAK;AAAA,EACjF,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,UAAU,UAAU;AAAA,EACpD;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,cAAc,UAAU;AAAA,EACxD;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,iBAAiB,MAAM,cAAc,gBAAgB;AAAA,IAClE,cAAc;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,EAEZ;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,gBAAgB,UAAU;AAAA,EAC1D;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,mBAAmB,UAAU;AAAA,EAC7D;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,eAAe,UAAU;AAAA,EACzD;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,oBAAoB,UAAU;AAAA,EAC9D;AAAA,EACA,IAAI;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,iBAAiB,MAC5B,mBAAmB,cAAc,gBAAgB,gBAAgB;AAAA,IACnE,cAAc;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,qBAAqB,UAAU;AAAA,IAC7D,mBAAmB;AAAA,EACrB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,2BAA2B,UAAU;AAAA,IACnE,mBAAmB;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI;AAAA,IACF,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,eAAe,UAAU;AAAA,EACzD;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,YAAY,UAAU;AAAA,EACtD;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,mBAAmB,UAAU;AAAA,EAC7D;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,EAAE,WAAW,MAAM,WAAW,UAAU;AAAA,EACrD;AACF;AAGA,OAAO,OAAO,eAAe;AAG7B,IAAM,aAAa;AAGnB,WAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC7D,aAAW,SAAS,CAAC,MAAM,WAAW,MAAM,aAAa,MAAM,QAAQ,EAAE;AAAA,IACvE;AAAA,EACF,GAAe;AACb,QAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,0CAA0C,MAAM,QAAQ,KAAK,GAAG;AAAA,IAClF;AAAA,EACF;AACF;AAGO,IAAM,iBAAiB,IAAI,IAAY,OAAO,KAAK,eAAe,CAAC;;;ACpT1E,IAAM,WAAW;AACjB,IAAM,OAAO;AAEb,IAAM,eAAe,oBAAI,IAAoB;AAC7C,SAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,eAAa,IAAI,SAAS,CAAC,GAAI,CAAC;AAClC;AAqCO,SAAS,aAAa,KAAgC;AAC3D,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AAG7C,MAAI,cAAc;AAClB,SAAO,cAAc,IAAI,UAAU,IAAI,WAAW,MAAM,SAAS,CAAC,GAAG;AACnE;AAAA,EACF;AAEA,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,aAAa,IAAI,IAAI,QAAQ,KAAK;AAC7C,UAAM,QAAQ,aAAa,IAAI,IAAI,CAAC,CAAE;AACtC,QAAI,UAAU,OAAW,QAAO;AAEhC,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,eAAS,MAAM,CAAC,IAAK;AACrB,YAAM,CAAC,IAAI,QAAQ;AACnB,gBAAU;AAAA,IACZ;AACA,WAAO,QAAQ,GAAG;AAChB,YAAM,KAAK,QAAQ,GAAI;AACvB,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,SAAS,IAAI,WAAW,cAAc,MAAM,MAAM;AAExD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,WAAO,cAAc,CAAC,IAAI,MAAM,MAAM,SAAS,IAAI,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;;;AC1EA,IAAM,UAAU;AAChB,IAAM,cAAc;AA4BpB,SAAS,YAAY,OAA2B;AAC9C,QAAM,MAAM,MAAM,KAAK,KAAK,EACzB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACV,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;AAC1G;AASO,SAAS,iBACd,IACoD;AACpD,QAAM,QAAQ,GAAG,MAAM,WAAW;AAClC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,MAAM,CAAC;AACtB,MAAI,CAAC,eAAe,IAAI,MAAM,EAAG,QAAO;AAExC,QAAM,UAAU,aAAa,MAAM,CAAC,CAAE;AACtC,MAAI,CAAC,WAAW,QAAQ,SAAS,MAAM,QAAQ,SAAS,GAAI,QAAO;AAGnE,MAAI,aAAa;AACjB,MAAI,QAAQ,WAAW,IAAI;AACzB,QAAI,QAAQ,CAAC,MAAM,EAAG,QAAO;AAC7B,iBAAa,QAAQ,MAAM,CAAC;AAAA,EAC9B;AAEA,SAAO,EAAE,QAAqC,MAAM,YAAY,UAAU,EAAE;AAC9E;AAWO,SAAS,WAAW,OAAyB;AAElD,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,QAAS,QAAO,EAAE,MAAM,YAAY,GAAG,QAAQ;AAGnD,MAAI,QAAQ,KAAK,KAAK,EAAG,QAAO,EAAE,MAAM,YAAY,MAAM,MAAM,YAAY,EAAE;AAE9E,SAAO,EAAE,MAAM,UAAU;AAC3B;;;ACrFA,IAAM,oBAAoB,OAAO,OAAO,YAAY,EACjD,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,EAChD,KAAK,GAAG;AAGJ,IAAM,iBAAiB,IAAI;AAAA,EAChC,wBAAwB,iBAAiB;AAAA,EACzC;AACF;;;ACgFO,SAAS,YAAY,KAA6C;AACvE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,OAAO,SAAS,WAAY,QAAO,OAAO,KAAK,YAAY;AAC/D,MAAI,OAAO,SAAS,WAAY,QAAO,OAAO,KAAK,YAAY;AAC/D,SAAO;AACT;;;ACzGA,SAAS,SAAS;AAElB,IAAM,SAAS;AAAA,EACb,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG;AAAA,EACjD,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AACjC;AASO,IAAM,sBAAsB,CAAC,YACjC,OAAO,SAAS,OACb,OAAO,YAAY,MAAM,UAAU,KAAK,MAAM,OAAO,IAAI,mBAAmB,KAAK,MACnF,IACF;AAEF,IAAM,WAAW;AAAA,EACf,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EACjD,YAAY,EACT,aAAa;AAAA,IACZ,YAAY,EAAE,KAAK,CAAC,WAAW,QAAQ,CAAC;AAAA,IACxC,OAAO,EACJ,MAAM,EAAE,aAAa;AAAA,MACpB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,cAAc;AAAA,MACpD,MAAM,EACH,OAAO,EACP,WAAW,GAAG,EACd,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,IAAI,GAAG,8CAA8C,EACvF,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,mCAAmC;AAAA,MAC7E,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACjC,CAAC,CAAC,EACD,IAAI,CAAC,EACL,IAAI,EAAE;AAAA,EACX,CAAC,EACA,SAAS;AACd;AAEA,IAAM,gBAAgB,CAAiC,WACrD,OACG,OAAO,CAAC,WAAW,OAAO,eAAe,UAAa,OAAO,OAAO,QAAW;AAAA,EAC9E,SAAS;AACX,CAAC,EACA,OAAO,CAAC,WAAW,oBAAoB,MAAM,KAAK,MAAM;AAAA,EACvD,SAAS;AACX,CAAC;AAGE,IAAM,mBAAmB;AAAA,EAC9B,EAAE,aAAa;AAAA,IACb,GAAG;AAAA,IACH,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE,SAAS;AAAA,EACxE,CAAC;AACH;AAGO,IAAM,yBAAyB;AAAA,EACpC,EAAE,aAAa;AAAA,IACb,GAAG;AAAA,IACH,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAO,GAAG,GAAG,OAAO,CAAC,EAAE,SAAS;AAAA,EAC3F,CAAC;AACH;;;ACjEA,SAAS,KAAAA,UAAS;AAEX,IAAM,gBAAgBA,GAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;AAG7C,IAAM,oBAAoBA,GAAE,KAAK,CAAC,UAAU,UAAU,WAAW,CAAC;AAGlE,IAAM,sBAAsBA,GAAE,KAAK,CAAC,UAAU,WAAW,aAAa,QAAQ,CAAC;AA4B/E,SAAS,uBAAuB,KAG3B;AACV,SAAO,IAAI,SAAS,WAAW,IAAI,KAAK,OAAO,SAAS,CAAC;AAC3D;;;ACzCA,SAAS,KAAAC,UAAS;AAKX,IAAM,qBAAqB,uBAAuB,WAAW;AAAA;AAAA,EAElE,SAASC,GAAE,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EACtC,cAAcA,GAAE,QAAQ;AAC1B,CAAC;AAID,IAAM,4BAA4BA,GAAE,aAAa;AAAA,EAC/C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,KAAKA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC5B,cAAcA,GAAE,OAAO,EAAE,YAAY;AAAA,EACrC,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,gBAAgBA,GAAE,OAAO,EAAE,IAAI;AACjC,CAAC;AAED,IAAM,gBAAgBA,GAAE,aAAa;AAAA,EACnC,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,mBAAmBA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC1C,WAAWA,GAAE,OAAO,EAAE,YAAY;AACpC,CAAC;AAED,IAAM,0BAA0BA,GAAE,aAAa;AAAA,EAC7C,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,YAAY;AAChC,CAAC;AAED,IAAM,0BAA0BA,GAAE,aAAa;AAAA,EAC7C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,OAAOA,GAAE,OAAO,EAAE,YAAY;AAAA,EAC9B,SAASA,GAAE,OAAO,EAAE,YAAY;AAClC,CAAC;AAGM,IAAM,qBAAqBA,GAAE,aAAa;AAAA,EAC/C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjC,KAAK;AAAA,EACL,YAAYA,GAAE,MAAM,yBAAyB,EAAE,SAAS;AAAA,EACxD,IAAI,cAAc,SAAS;AAAA,EAC3B,MAAMA,GACH,aAAa;AAAA,IACZ,WAAWA,GAAE,MAAM,uBAAuB;AAAA,IAC1C,cAAcA,GAAE,MAAM,uBAAuB;AAAA,EAC/C,CAAC,EACA,SAAS;AACd,CAAC;;;AC/CM,SAAS,iBAAiB,OAAgC;AAC/D,QAAM,UACJ,MAAM,YAAY,WAAW,WAAW,MAAM,YAAY,WAAW,WAAW;AAClF,QAAM,cAAc,MAAM,OAAO,KAAK;AAAA,IACpC,CAAC,QACC,IAAI,SACH,IAAI,WAAW,UACd,IAAI,GAAG,SAAS,MAAM,MACrB,IAAI,KAAK,OAAO,SAAS,MAAM,OAAO,UACrC,IAAI,KAAK,OAAO,SAAS,MAAM,OAAO;AAAA,EAC9C;AACA,QAAM,qBAAqB,MAAM,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,YAAY,SAAS,GAAG,CAAC;AACvF,QAAM,QAAQ;AAAA,IACZ,YAAY,OAAO,UAAU,SAAS,MAAM,OAAO,CAAC,YAAY,SAAS,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,MAAM;AAAA,IAC/G;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,YAAY,IAAI,CAAC,QAAQ,UAAU,KAAK,MAAM,OAAO,MAAM,CAAC;AAAA,EACjE;AACA,QAAM,UAAU,mBAAmB;AACnC,MAAI,UAAU;AACZ,UAAM;AAAA,MACJ;AAAA,MACA,cAAc,OAAO,eAAe,cAAc,kBAAkB,CAAC;AAAA,IACvE;AACF,QAAM,QAAQ;AAAA,IACZ,MAAM,OAAO,MAAM,cAAc,cAAc,MAAM,OAAO,MAAM,UAAU;AAAA,IAC5E,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,IACpD,MAAM,OAAO,MAAM,WAAW,mBAAmB,MAAM,OAAO,MAAM,OAAO;AAAA,EAC7E,EAAE,OAAO,CAAC,SAAyB,SAAS,MAAS;AACrD,MAAI,YAAY,EAAG,OAAM,KAAK,EAAE;AAChC,QAAM,KAAK,UAAU,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,UAAU,MAAM,EAAE,GAAG;AACtF,MAAI,MAAM,YAAY,YAAY,MAAM,OAAO,MAAM;AACnD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,YAAY,MAAM,OAAO,KAAK,aAAa,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,IAChE;AACA,UAAM,aAAa,IAAI;AAAA,MACrB,MAAM,OAAO,KAAK,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC;AAAA,IACrE;AACA,UAAM,SAAS,MAAM,OAAO,KAAK,aAAa,KAAK,OAAO,CAAC,SAAS;AAClE,YAAM,OAAO,WAAW,IAAI,KAAK,IAAI;AACrC,aAAO,CAAC,QAAQ,KAAK,QAAQ,KAAK;AAAA,IACpC,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,YAAM,KAAK,IAAI,+BAA+B,IAAI,GAAG,YAAY,MAAM,CAAC;AAAA,EAC5E;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,cAAc,MAAyB;AAC9C,QAAM,SAAS,KAAK,IAAI,CAAC,QAAQ;AAC/B,QAAI,IAAI,GAAG,SAAS,MAAM,EAAG,QAAO;AACpC,QAAI,IAAI,GAAG,SAAS,MAAM,EAAG,QAAO;AACpC,QAAI,IAAI,GAAG,SAAS,cAAc,EAAG,QAAO;AAC5C,QAAI,IAAI,GAAG,SAAS,QAAQ,EAAG,QAAO;AACtC,QAAI,IAAI,GAAG,SAAS,MAAM,EAAG,QAAO;AACpC,WAAO,IAAI;AAAA,EACb,CAAC;AACD,QAAM,QAAQ,CAAC,OAAO,OAAO,eAAe,SAAS,MAAM;AAC3D,QAAM,WAAW,MAAM,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAC/D,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,SAAS,KAAK,CAAC,CAAC,CAAC;AAC3E,SAAO,CAAC,GAAG,UAAU,GAAG,KAAK,EAAE,KAAK,IAAI;AAC1C;AAEA,SAAS,UAAU,KAAc,QAAwB;AACvD,QAAM,iBACJ,IAAI,WAAW,UACf,IAAI,GAAG,SAAS,MAAM,MACrB,IAAI,KAAK,OAAO,SAAS,UAAU,IAAI,KAAK,OAAO,SAAS;AAC/D,QAAM,UAAU,IAAI,YAAY,WAAW,WAAW,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAClF,QAAM,QAAQ,iBAAiB,GAAG,IAAI,KAAK,iBAAiB,IAAI;AAChE,SAAO,KAAK,WAAW,KAAK,CAAC,MAAM,eAAe,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,eAAe,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,OAAO;AAC3K;AAEA,SAAS,eAAe,KAAsB,MAA+B;AAC3E,SAAO,IAAI,OAAO,WAAW,IAAI,MAAM,YAAY,IAAI,QAAQ,IAAI;AACrE;AAEO,SAAS,YAAY,OAAe,MAA+B;AACxE,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,GAAG,MAAM,KAAK,CAAC;AAAA,IACxB,KAAK;AACH,aAAO,GAAG,MAAM,KAAK,CAAC;AAAA,IACxB,KAAK;AACH,aAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,IACpC,KAAK;AACH,aAAO,GAAG,MAAM,KAAK,CAAC;AAAA,IACxB,KAAK;AACH,aAAO,GAAG,MAAM,KAAK,CAAC;AAAA,EAC1B;AACF;AAEO,SAAS,YAAY,KAAsB;AAChD,QAAM,cAAc,IAAI,KAAK,OAAO,WAAW;AAC/C,QAAM,cAAc,IAAI,KAAK,OAAO,WAAW;AAC/C,MAAI,YAAa,QAAO;AACxB,MAAI,YAAa,QAAO;AACxB,MAAI,IAAI,SAAS,QAAS,QAAO,GAAG,OAAO,IAAI,UAAU,CAAC,CAAC;AAC3D,QAAM,iBAAiB,IAAI,SAAS,QAAQ,CAAC,IAAI,WAAW,IAAI;AAChE,MAAI,uBAAuB,GAAG,GAAG;AAC/B,WAAO,GAAG,OAAO,gBAAgB,CAAC,CAAC,GAAG,WAAW,IAAI,IAAI,CAAC;AAAA,EAC5D;AACA,SAAO,GAAG,OAAO,iBAAiB,KAAK,CAAC,CAAC;AAC3C;AAEO,SAAS,eAAe,KAAsB;AACnD,QAAM,cAAc,IAAI,KAAK,OAAO,WAAW;AAC/C,QAAM,cAAc,IAAI,KAAK,OAAO,WAAW;AAC/C,MAAI,eAAe,YAAa,QAAO;AACvC,QAAM,WAAW,uBAAuB,GAAG;AAC3C,QAAM,SAAS,IAAI,SAAS,UAAU,QAAQ,WAAW,WAAW,IAAI,IAAI,IAAI;AAChF,QAAM,QAAQ,IAAI,SAAS,WAAW,WAAW,IAAI;AACrD,QAAM,YAAY,WAAW,OAAO,IAAI,SAAS,UAAU,IAAI;AAC/D,QAAM,aAAa,IAAI,SAAS,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;AACjE,QAAM,aAAa,IAAI,SAAS,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;AACjE,QAAM,QAAQ,OAAO,aAAa,OAAO,SAAS;AAClD,QAAM,QAAQ,OAAO,aAAa,OAAO,SAAS;AAClD,SAAO,WAAW,MAAM,GAAG,KAAK,QAAQ,KAAK,MAAM,GAAG,KAAK,OAAO,KAAK,GAAG,MAAM;AAClF;AAEO,SAAS,WAAW,MAA+B;AACxD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,OAAiC;AACpD,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC,kBAAkB;AAClD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG,MAAM;AAAA,MACP,CAAC,SACC,KAAK,WAAW,KAAK,IAAI,CAAC,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,IACjG;AAAA,EACF;AACF;AAEO,SAAS,SAAS,KAAqB;AAC5C,SAAO,IAAI,MAAM,GAAG,CAAC;AACvB;AAEO,SAAS,OAAO,OAAe,YAAY,GAAW;AAC3D,QAAM,UAAU,OAAO,MAAM,QAAQ,SAAS,CAAC;AAC/C,SAAO,GAAG,WAAW,IAAI,MAAM,EAAE,GAAG,QAAQ,QAAQ,SAAS,CAAC;AAChE;AAEA,SAAS,MAAM,OAAuB;AACpC,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,WAAW,KAAK,KAAK,EAAE,WAAW,MAAM,GAAG;AAC1D;;;AThIA,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,eAAe,CAAC,cAAc,UAAU,QAAQ,WAAW,YAAY;AAC7E,IAAM,cAAc;AAAA,EAClB,GAAG;AAAA,EACH,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,QAAQ;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAGA,SAAS,UAAU,SAAmC;AACpD,QAAM,QAAQ,OAAO,OAAO,OAAO,WAAW,EAAE,IAAI,MAAM,OAAkB,IAAI;AAChF,UAAQ;AAAA,IACN;AAAA,MACE,wBAAwB,SAAS,eAAe;AAAA,MAChD;AAAA,MACA,GAAG,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC,SAAS,mBAAmB,IAAI,EAAE;AAAA,MAC/D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,SAAS,MAAgB,MAAsB;AACtD,QAAM,QAAQ,kBAAkB,MAAM,IAAI;AAC1C,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,GAAG,IAAI,eAAe;AAClD,SAAO;AACT;AAEA,eAAe,WAAW,MAAyC;AACjE,QAAM,SAAS,iBAAiB,MAAM,MAAM,MAAM,SAAS,MAAM,MAAM,CAAC,CAAC;AACzE,QAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,MAAI,CAAC,GAAI,QAAO,uBAAuB,MAAM,IAAI;AACjD,QAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,QAAM,eAAe,MAAM,SAAS,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,MAAM;AAC1E,SAAO,uBAAuB,MAAM,EAAE,GAAG,MAAM,IAAI,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;AAChF;AAEA,eAAe,QACb,QACA,OACA,QACA,MACA,MACY;AACZ,QAAM,WAAW,MAAM,WAA2B,QAAQ,OAAO,QAAQ,MAAM,IAAI;AACnF,MAAI,CAAC,SAAS,MAAM,SAAS,SAAS,QAAW;AAC/C,UAAM,IAAI;AAAA,MACR,GAAG,SAAS,OAAO,GAAG,SAAS,IAAI,OAAO,EAAE,GAAG,SAAS,SAAS,GAAG,MAAM,IAAI,IAAI,SAAS;AAAA,IAC7F;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAEA,eAAe,YAAY,QAAgB,OAAe,MAAiC;AACzF,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,QAAQ,QAAQ,OAAO,OAAO,GAAG,KAAK,IAAI,mBAAmB,IAAI,CAAC,EAAE;AAC7E,QAAM,QAAQ,MAAM,QAAoB,QAAQ,OAAO,OAAO,KAAK;AACnE,QAAM,OAAO,MAAM,KAAK,CAACC,UAASA,MAAK,SAAS,IAAI;AACpD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,cAAc,IAAI,cAAc;AAC3D,SAAO;AACT;AAGA,SAAS,SAAS,MAAwB;AACxC,QAAM,KAAK,YAAY,KAAK,EAAE;AAC9B,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE,EAAE;AAC3D,SAAO;AACT;AAEA,eAAe,UAAU,QAAgB,OAA0C;AACjF,QAAM,QAA0B,CAAC;AACjC,MAAI,OAAO;AACX,MAAI;AACJ,KAAG;AACD,UAAM,WAAW,MAAM,WAErB,QAAQ,OAAO,OAAO,GAAG,UAAU,eAAe,MAAM,sBAAsB,IAAI,EAAE;AACtF,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS;AAC5B,YAAM,IAAI,MAAM,SAAS,SAAS,uCAAuC;AAC3E,UAAM,KAAK,GAAG,SAAS,IAAI;AAC3B,iBAAa,SAAS,WAAW;AACjC;AAAA,EACF,SAAS,QAAQ;AACjB,SAAO;AACT;AAEA,SAAS,aAAa,OAAyB,MAAkC;AAC/E,QAAM,KAAK,SAAS,IAAI;AACxB,SAAO,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,iBAAiB,EAAE;AACrE;AAEA,eAAe,YAAY,OAAiB,QAAgB,OAA8B;AACxF,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,SAAS,SAAS,UAAU,IAAI,SAAS;AAAA,EAC7E;AACF;AAEA,SAAS,SAASC,MAAc,MAAqB;AACnD,MAAI,MAAM;AACR,UAAM,EAAE,QAAQ,GAAG,SAAS,IAAIA;AAChC,mBAAe,KAAK,UAAU,EAAE,GAAG,UAAU,GAAG,QAAQ,MAAM,QAAQ,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,EAC9F,WAAWA,KAAI,WAAW,eAAeA,KAAI,UAAUA,KAAI,SAAS;AAClE,mBAAe,iBAAiB,EAAE,GAAGA,MAAK,QAAQA,KAAI,QAAQ,SAASA,KAAI,QAAQ,CAAC,CAAC;AAAA,EACvF,OAAO;AACL,mBAAe,GAAGA,KAAI,EAAE,KAAKA,KAAI,MAAM,GAAGA,KAAI,QAAQ,KAAKA,KAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EAC/E;AACF;AAEA,eAAe,IAAI,MAAgB,QAAgB,OAAgC;AACjF,QAAM,aAAa,kBAAkB,MAAM,UAAU;AACrD,QAAM,OAAO,kBAAkB,MAAM,QAAQ;AAC7C,MAAI,QAAQ,UAAU,MAAM,QAAQ,IAAI;AACtC,UAAM,IAAI,MAAM,wCAAwC;AAC1D,MACE,SACC,kBAAkB,MAAM,eAAe,KAAK,kBAAkB,MAAM,eAAe,IACpF;AACA,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,QAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,QAAM,OAAO,kBAAkB,MAAM,QAAQ;AAC7C,QAAM,SAAS,OACX,EAAE,aAAa,MAAM,YAAY,QAAQ,OAAO,IAAI,GAAG,GAAG,IAC1D;AAAA,IACE,QAAQ,MAAM,WAAW,UAAW;AAAA,IACpC,eAAe,MAAM,qBAAqB,MAAM,QAAQ,KAAK;AAAA,IAC7D,aAAa,kBAAkB,MAAM,eAAe;AAAA,EACtD;AACJ,QAAM,EAAE,GAAG,IAAI,MAAM,QAAwB,QAAQ,OAAO,QAAQ,MAAM;AAAA,IACxE,GAAG;AAAA,IACH;AAAA,IACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,EACzB,CAAC;AAED,QAAM,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;AAC5C,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,IAAI,IAAI,mBAAmB,EAAE,CAAC;AAAA,IACnC;AACA,QAAI,QAAQ,WAAW,UAAU;AAC/B,eAAS,SAAS,QAAQ,MAAM,QAAQ,CAAC;AACzC,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,WAAW,aAAa;AAClC,UAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ;AAC9B,cAAM,IAAI,MAAM,sBAAsB,EAAE,4BAA4B;AACtE,eAAS,SAAS,QAAQ,MAAM,QAAQ,CAAC;AACzC,aAAO,QAAQ,YAAY,WAAW,IAAI;AAAA,IAC5C;AACA,UAAM,MAAM,GAAI;AAAA,EAClB;AACA,QAAM,IAAI,MAAM,yBAAyB,EAAE,uCAAuC,EAAE,GAAG;AACzF;AAEA,eAAe,KAAK,MAAgB,QAAgB,OAA8B;AAChF,QAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,QAAM,SAAS,MAAM,WAAW,SAAS,MAAM,UAAU,CAAC;AAC1D,QAAM,gBAAgB,MAAM,qBAAqB,MAAM,QAAQ,KAAK;AACpE,QAAM,gBAAgB,MAAM,2BAA2B,MAAM,QAAQ,KAAK;AAC1E,QAAM,OAAO,MAAM,QAAkB,QAAQ,OAAO,QAAQ,OAAO;AAAA,IACjE;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,kBAAkB,MAAM,eAAe;AAAA,IACpD,GAAI,QAAQ,MAAM,YAAY,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EACzD,CAAC;AACD,QAAM,QAAQ,aAAa,MAAM,UAAU,QAAQ,KAAK,GAAG,IAAI;AAC/D,QAAM;AAAA,IACJ,MAAM,IAAI,CAACC,UAAS,GAAG,UAAU,IAAI,mBAAmBA,MAAK,EAAE,CAAC,EAAE;AAAA,IAClE;AAAA,IACA;AAAA,EACF;AACA,MAAI;AACJ,MAAI,eAAe;AACjB,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,eAAe;AAAA,QACf,cAAc;AAAA,QACd;AAAA,QACA,YAAY;AAAA,QACZ,cAAc,EAAE,cAAc,SAAS,IAAI,EAAE;AAAA,MAC/C;AAAA,IACF;AACA,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,YAAM,IAAI;AAAA,QACR,SAAS,KAAK,EAAE,wCAAwC,SAAS,SAAS,sBAAsB;AAAA,MAClG;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,QAAQ,MAAM,QAAQ;AACxB,mBAAe,KAAK,UAAU,EAAE,GAAG,MAAM,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,GAAG,MAAM,CAAC,CAAC;AAAA,MAC3E,gBAAe,SAAS,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,cAAc,KAAK,EAAE,KAAK,EAAE,EAAE;AAC5F;AAEA,eAAe,OAAO,MAAgB,QAAgB,OAA8B;AAClF,QAAM,QAAQ,aAAa,MAAM,UAAU,QAAQ,KAAK,GAAG,IAAI;AAC/D,QAAM;AAAA,IACJ;AAAA,MACE,GAAG,KAAK,IAAI,mBAAmB,KAAK,EAAE,CAAC;AAAA,MACvC,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,UAAU,IAAI,mBAAmB,KAAK,EAAE,CAAC,EAAE;AAAA,IACvE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,QAAQ,MAA+B;AAC3D,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,MAAI,CAAC,WAAW,YAAY,UAAU,QAAQ,MAAM,UAAU,IAAI,GAAG;AACnE,cAAU,OAAO;AACjB;AAAA,EACF;AACA,MAAI,YAAY,SAAS;AACvB,UAAM,iBAAiB,QAAQ,IAAI;AACnC;AAAA,EACF;AACA,MAAI,OAAO;AACX,MAAI;AACF,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,EAAG,OAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AAEtF,QAAI,CAAC,OAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,EAAG,UAAS,MAAM,OAAO;AACvE,eAAW,QAAQ,aAAa;AAC9B,YAAM,QAAQ,kBAAkB,MAAM,IAAI;AAC1C,UAAI,KAAK,SAAS,IAAI,KAAK,UAAU,OAAW,OAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,IAC7F;AACA,UAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,cAAc,IAAI;AAClD,UAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,QAAI,YAAY,MAAO,QAAO,MAAM,IAAI,MAAM,QAAQ,KAAK;AAAA,aAClD,YAAY,OAAQ,OAAM,KAAK,MAAM,QAAQ,KAAK;AAAA,aAClD,YAAY,QAAQ;AAC3B,YAAM,CAAC,OAAO,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QACvC,QAAoB,QAAQ,OAAO,OAAO,KAAK;AAAA,QAC/C,UAAU,QAAQ,KAAK;AAAA,MACzB,CAAC;AACD,YAAM,SAAS,MAAM,IAAI,CAAC,UAAU;AAAA,QAClC,GAAG;AAAA,QACH,WAAW,aAAa,OAAO,IAAI;AAAA,MACrC,EAAE;AACF;AAAA,QACE,OACI,KAAK,UAAU,QAAQ,MAAM,CAAC,IAC9B,OACG,IAAI,CAAC,SAAS;AACb,gBAAM,YAAY,KAAK,UACpB;AAAA,YACC,CAAC,SACC,GAAG,KAAK,EAAE,KAAK,KAAK,UAAU,YAAY,QAAQ,KAAK,KAAK,UAAU,KAAK,aAAa,CAAC;AAAA,UAC7F,EACC,KAAK,IAAI;AACZ,gBAAM,QAAQ;AAAA,YACZ,GAAI,KAAK,UAAU,CAAC,UAAU,IAAI,CAAC;AAAA,YACnC,GAAI,YAAY,CAAC,SAAS,IAAI,CAAC;AAAA,UACjC;AACA,iBAAO,GAAG,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,WAAW,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ;AAAA,QACvF,CAAC,EACA,KAAK,IAAI,KAAK;AAAA,MACvB;AAAA,IACF,OAAO;AACL,YAAM,SAAS,iBAAiB,MAAM,WAAW;AACjD,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wBAAwB,MAAM,OAAkB,CAAC,EAAE;AAChF,UAAI,YAAY,SAAS,OAAO,WAAW,OAAO,GAAG;AACnD;AAAA,UACE,MAAM,QAAiB,QAAQ,OAAO,OAAO,GAAG,IAAI,IAAI,mBAAmB,MAAM,CAAC,EAAE;AAAA,UACpF;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,OAAO,MAAM,YAAY,QAAQ,OAAO,MAAM;AACpD,YAAI,YAAY;AACd;AAAA,YACE,OACI,KAAK,UAAU,MAAM,MAAM,CAAC,IAC5B,GAAG,KAAK,EAAE,KAAK,KAAK,IAAI;AAAA,YAAe,KAAK,OAAO;AAAA,EAAK,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AAAA,UAClG;AAAA,iBACO,YAAY,UAAU;AAC7B,gBAAM,OAAO,MAAM,QAAQ,KAAK;AAChC;AAAA,YACE,OAAO,KAAK,UAAU,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK,CAAC,IAAI,WAAW,KAAK,EAAE;AAAA,UAC5E;AAAA,QACF,OAAO;AACL,gBAAM,QAAQ,kBAAkB,MAAM,SAAS,KAAK;AACpD,cAAI,CAAC,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI;AAC/D,kBAAM,IAAI,MAAM,2CAA2C;AAC7D,gBAAM,QAAQ,IAAI,gBAAgB,EAAE,YAAY,KAAK,IAAI,MAAM,CAAC;AAChE,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG,IAAI,IAAI,KAAK;AAAA,UAClB;AACA;AAAA,YACE,OACI,KAAK,UAAU,MAAM,MAAM,CAAC,IAC5B,KAAK,MACF,IAAI,CAACD,SAAQ,GAAGA,KAAI,EAAE,KAAKA,KAAI,MAAM,KAAKA,KAAI,WAAW,GAAG,KAAKA,KAAI,OAAO,EAAE,EAC9E,KAAK,IAAI,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChF,WAAO;AAAA,EACT;AACA,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC;","names":["z","z","z","test","run","rule"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/property.ts","../src/property-skill.ts","../src/page-skill.ts","../src/recipe.ts"],"sourcesContent":["/**\n * CLI Property Management\n *\n * List properties and their linked GitHub repos.\n */\n\nimport process from 'node:process';\nimport { resolveConfig, hasFlag, getArgValue } from './auth.js';\nimport { fetchProperties, apiRequest, getApplicationArg } from './cli-helpers.js';\nimport { runPropertySkill } from './property-skill.js';\nimport { runPageSkill } from './page-skill.js';\nimport { runRecipe } from './recipe.js';\nimport { writeRawOutput } from './brand.js';\nimport { parseEnvVarDefinitions, updateEnvVarDefinitions } from './env-var-definitions.js';\n\nfunction pad(s: string, n: number): string {\n return s.padEnd(n);\n}\n\nfunction printHelp(): void {\n console.log(\n [\n 'canary application: Manage applications (alias: canary property)',\n '',\n 'Sub-commands:',\n ' list List all applications',\n ' create [options] Create a new application',\n ' update <name|id> [options] Update application settings',\n ' repo link [options] Link a GitHub repo to an application',\n ' repo update [options] Update an existing repo link',\n ' repo unlink [options] Unlink a GitHub repo from an application',\n ' skill <action> [options] Manage the application\\'s app skill (run `canary application skill help` for details)',\n ' page-skill <action> [options] Review the application\\'s page skills (run `canary application page-skill help` for details)',\n ' recipe <action> [options] Provision + audit the application\\'s interaction recipes (run `canary application recipe help` for details)',\n '',\n 'Create options:',\n ' --name <name> Application name (required)',\n ' --base-url <url> Application base URL (required)',\n ' An application tested only on sandboxes needs no create: `cofactor sandbox connect` or `push`',\n ' with a new --application name creates it, with its sandbox as the default environment.',\n ' --description <text> Optional description',\n ' --agent-context <text> Optional agent context (max 8000 chars)',\n ' --env-var <NAME[:sensitive]> Declare a per-environment variable (repeatable); values set per-environment, injected as $var.ENV.<NAME>',\n ' --login-path </path> Relative login page path appended to the environment URL (e.g. /login)',\n '',\n 'Update options:',\n ' --login-path </path> Set the relative login page path (empty string clears it)',\n ' --description <text> Set the description',\n ' --agent-context <text> Set the agent context',\n ' --env-var <NAME[:sensitive]> Declare a variable, or mark an existing one sensitive',\n ' (repeatable; never unmarks, values are not touched)',\n '',\n 'Repo link/update/unlink options:',\n ' --application <app_xxx|uuid> Application ID (required; alias: --property)',\n ' --repo <owner/name> Repo full name (required for link/unlink)',\n ' --repo-id <uuid> Repo link UUID (required for update)',\n ' --role <frontend|backend|...> Conventional role (free-form)',\n ' --root-dir <path> Monorepo subdirectory hint',\n ' --agent-hint <text> Free-form hint for the planner agent',\n '',\n 'Common options:',\n ' --json Output as JSON',\n ].join('\\n')\n );\n}\n\ntype GitHubRepo = {\n id: string;\n repoFullName: string;\n repoName: string;\n defaultBranch: string;\n rootDir: string | null;\n role: string | null;\n};\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const properties = await fetchProperties(apiUrl, token);\n\n if (json) {\n writeRawOutput(JSON.stringify(properties, null, 2));\n return;\n }\n\n if (properties.length === 0) {\n console.log('No applications found.');\n return;\n }\n\n console.log(`${pad('Name', 30)} ${pad('Base URL', 40)} ID`);\n for (const p of properties) {\n console.log(`${pad(p.name, 30)} ${pad(p.baseUrl, 40)} ${p.id}`);\n }\n\n // Show linked repos for each property\n console.log('');\n for (const p of properties) {\n const reposRes = await apiRequest<{ ok: boolean; items: GitHubRepo[] }>(\n apiUrl, token, 'GET', `/org/properties/${p.id}/github-repos`\n );\n const repos = reposRes.ok ? (reposRes.items ?? []) : [];\n if (repos.length > 0) {\n console.log(`${p.name} repos:`);\n for (const r of repos) {\n const dir = r.rootDir && r.rootDir !== '/' ? ` (${r.rootDir})` : '';\n const role = r.role ? ` [${r.role}]` : '';\n console.log(` ${r.repoFullName}:${r.defaultBranch}${role}${dir}`);\n }\n }\n }\n}\n\nfunction envVarDefinitionsOrExit(argv: string[]): Array<{ name: string; sensitive?: boolean }> {\n try {\n return parseEnvVarDefinitions(argv);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const name = getArgValue(argv, '--name');\n const baseUrl = getArgValue(argv, '--base-url');\n const description = getArgValue(argv, '--description');\n const agentContext = getArgValue(argv, '--agent-context');\n const loginPath = getArgValue(argv, '--login-path');\n const envVarDefinitions = envVarDefinitionsOrExit(argv);\n\n if (!name || !baseUrl) {\n console.error('Error: --name and --base-url are required.');\n console.error('Usage: canary application create --name <name> --base-url <url>');\n console.error(\n 'An application tested only on sandboxes needs no --base-url: `canary sandbox connect` or `push` with a new --application name creates it.'\n );\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {\n name,\n defaultEnvironment: { name: 'production', url: baseUrl },\n };\n if (description !== undefined) body.description = description;\n if (agentContext !== undefined) body.agentContext = agentContext;\n if (loginPath !== undefined) body.loginPath = loginPath;\n if (envVarDefinitions.length > 0) body.envVarDefinitions = envVarDefinitions;\n\n const result = await apiRequest<{ ok: boolean; id?: string; error?: string }>(\n apiUrl,\n token,\n 'POST',\n '/org/properties',\n body\n );\n\n if (!result.ok) {\n if (json) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n\n if (json) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`Created application \"${name}\" (${result.id})`);\n}\n\nasync function handleUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const appArg = argv.find((a) => !a.startsWith('-')) ?? getApplicationArg(argv);\n const loginPath = getArgValue(argv, '--login-path');\n const description = getArgValue(argv, '--description');\n const agentContext = getArgValue(argv, '--agent-context');\n const envVarDefinitions = envVarDefinitionsOrExit(argv);\n\n if (!appArg) {\n console.error('Error: Missing application name or ID.');\n console.error('Usage: canary application update <name|id> [--login-path </path>] [--description <text>]');\n process.exit(1);\n }\n if (\n loginPath === undefined &&\n description === undefined &&\n agentContext === undefined &&\n envVarDefinitions.length === 0\n ) {\n console.error(\n 'Error: No fields to update. Provide at least one of: --login-path, --description, --agent-context, --env-var'\n );\n process.exit(1);\n }\n\n const properties = await fetchProperties(apiUrl, token);\n const property = properties.find(\n (p) => p.id === appArg || p.name.toLowerCase() === appArg.toLowerCase()\n );\n if (!property) {\n console.error(`Error: Application \"${appArg}\" not found.`);\n if (properties.length > 0) {\n console.error('Available applications:');\n for (const p of properties) console.error(` - ${p.name} (${p.id})`);\n }\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n // Empty string clears the login path (sessions start at the environment URL).\n if (loginPath !== undefined) body.loginPath = loginPath;\n if (description !== undefined) body.description = description;\n if (agentContext !== undefined) body.agentContext = agentContext;\n\n if (Object.keys(body).length > 0) {\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'PUT',\n `/org/properties/${property.id}`,\n body\n );\n\n if (!result.ok) {\n if (json) {\n writeRawOutput(JSON.stringify(result, null, 2));\n } else {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n }\n process.exit(1);\n }\n }\n if (envVarDefinitions.length > 0) {\n await updateEnvVarDefinitions(property.id, envVarDefinitions, apiUrl, token);\n }\n\n if (json) {\n writeRawOutput(\n JSON.stringify(\n {\n ok: true,\n applicationId: property.id,\n updated: envVarDefinitions.length > 0 ? { ...body, envVarDefinitions } : body,\n },\n null,\n 2\n )\n );\n return;\n }\n\n console.log(`Updated application \"${property.name}\" (${property.id}):`);\n if (loginPath !== undefined) {\n console.log(` loginPath: -> ${loginPath || '(cleared — sessions start at the environment URL)'}`);\n }\n if (description !== undefined) console.log(' description: updated');\n if (agentContext !== undefined) console.log(' agentContext: updated');\n for (const d of envVarDefinitions) {\n console.log(` env var ${d.name}: declared${d.sensitive ? ', sensitive' : ''}`);\n }\n}\n\nasync function handleRepoLink(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const propertyId = getApplicationArg(argv);\n const repo = getArgValue(argv, '--repo');\n const role = getArgValue(argv, '--role');\n const rootDir = getArgValue(argv, '--root-dir');\n const agentHint = getArgValue(argv, '--agent-hint');\n\n if (!propertyId || !repo) {\n console.error('Error: --application and --repo are required.');\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { repoFullName: repo };\n if (role !== undefined) body.role = role;\n if (rootDir !== undefined) body.rootDir = rootDir;\n if (agentHint !== undefined) body.agentHint = agentHint;\n\n const result = await apiRequest<{ ok: boolean; id?: string; error?: string }>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${propertyId}/github-repos`,\n body\n );\n\n if (!result.ok) {\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.log(`Linked ${repo} to application ${propertyId} (${result.id})`);\n}\n\nasync function handleRepoUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const propertyId = getApplicationArg(argv);\n const repoId = getArgValue(argv, '--repo-id');\n const role = getArgValue(argv, '--role');\n const rootDir = getArgValue(argv, '--root-dir');\n const agentHint = getArgValue(argv, '--agent-hint');\n\n if (!propertyId || !repoId) {\n console.error('Error: --application and --repo-id are required.');\n process.exit(1);\n }\n\n const body: Record<string, unknown> = {};\n if (role !== undefined) body.role = role;\n if (rootDir !== undefined) body.rootDir = rootDir;\n if (agentHint !== undefined) body.agentHint = agentHint;\n\n const result = await apiRequest<{ ok: boolean; id?: string; error?: string }>(\n apiUrl,\n token,\n 'PATCH',\n `/org/properties/${propertyId}/github-repos/${repoId}`,\n body\n );\n\n if (!result.ok) {\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.log(`Updated repo link ${repoId}`);\n}\n\nasync function handleRepoUnlink(argv: string[], apiUrl: string, token: string): Promise<void> {\n const json = hasFlag(argv, '--json');\n const propertyId = getApplicationArg(argv);\n const repo = getArgValue(argv, '--repo');\n\n if (!propertyId || !repo) {\n console.error('Error: --application and --repo are required.');\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/properties/${propertyId}/github-repos/${encodeURIComponent(repo)}`\n );\n\n if (!result.ok) {\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (json) writeRawOutput(JSON.stringify(result, null, 2));\n else console.log(`Unlinked ${repo} from application ${propertyId}`);\n}\n\nasync function handleRepo(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n switch (action) {\n case 'link':\n await handleRepoLink(rest, apiUrl, token);\n break;\n case 'update':\n await handleRepoUpdate(rest, apiUrl, token);\n break;\n case 'unlink':\n await handleRepoUnlink(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown repo action: ${action ?? '(none)'}`);\n printHelp();\n process.exit(1);\n }\n}\n\nexport async function runProperty(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n // `application --env dev` (a flag, no sub-command) is asking for help too. The\n // skill, page-skill and recipe sub-commands answer --help with their own.\n const ownHelp = ['skill', 'page-skill', 'recipe'].includes(subCommand ?? '');\n if (!subCommand || subCommand.startsWith('-') || subCommand === 'help' || (hasFlag(argv, '--help', '-h') && !ownHelp)) {\n printHelp();\n return;\n }\n\n // `skill guide` and `skill help` are doc-only; skip auth resolution so\n // unauthenticated agents can discover the methodology before logging in.\n if (subCommand === 'skill') {\n const skillAction = rest[0];\n if (!skillAction || skillAction === 'help' || skillAction === 'guide') {\n await runPropertySkill(rest, '', '');\n return;\n }\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n const globalFlags = new Set(['--env', '--api-url', '--token', '--org']);\n const args = rest.filter((arg, i) => {\n if (globalFlags.has(arg)) return false;\n if (i > 0 && globalFlags.has(rest[i - 1])) return false;\n return true;\n });\n\n switch (subCommand) {\n case 'list':\n await handleList(args, apiUrl, token);\n break;\n case 'create':\n await handleCreate(args, apiUrl, token);\n break;\n case 'update':\n await handleUpdate(args, apiUrl, token);\n break;\n case 'repo':\n await handleRepo(args, apiUrl, token);\n break;\n case 'skill':\n await runPropertySkill(args, apiUrl, token);\n break;\n case 'page-skill':\n await runPageSkill(args, apiUrl, token);\n break;\n case 'recipe':\n await runRecipe(args, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI: `canary property skill` — manage a property's app skill\n *\n * App skill = the per-property knowledge base injected into the cloud workflow\n * browser agent's system prompt. CLI is a thin client over the existing\n * /org/properties/:id/context endpoints. Source defaults to 'cli' so authored\n * items are distinguishable from browser-bootstrap or human-manual edits.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { writeRawOutput } from \"./brand.js\";\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, getApplicationArg } from './cli-helpers.js';\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst GUIDE_PATH = join(HERE, 'property-skill-guide.md');\n\nconst SECTIONS = [\n 'general',\n 'technology',\n 'product',\n 'ui',\n 'tenancy',\n 'auth',\n 'roles_permissions',\n 'navigation',\n 'feature_gating',\n 'environments',\n 'data_lifecycle',\n 'async_realtime',\n 'localization',\n 'feedback_errors',\n 'idiosyncrasies',\n] as const;\ntype Section = (typeof SECTIONS)[number];\n\ntype ContextItem = {\n id: string;\n propertyId: string;\n section: Section;\n itemKey: string;\n itemLabel: string;\n content: string;\n version: number;\n source: 'bootstrap' | 'workflow' | 'manual' | 'cli';\n sourceId: string | null;\n createdBy: string | null;\n createdAt: string;\n};\n\ntype ListResponse = {\n ok: boolean;\n error?: string;\n data?: { items: ContextItem[]; grouped: Record<string, ContextItem[]> };\n};\n\nfunction printSkillHelp(): void {\n console.log(\n [\n 'canary application skill: Manage an application\\'s app skill (per-application knowledge for QA browser agents). Alias: canary property skill. (--property accepted as an alias for --application.)',\n '',\n 'Sub-commands:',\n ' guide Print the full authoring methodology (start here)',\n ' list [--application <id>] [--section S] [--format json|table]',\n ' get --application <id> --section S --key K [--version N] [--format json|md]',\n ' set --application <id> --section S --key K --label L --content @file|\"text\" [--source-id <repo@sha>]',\n ' delete --application <id> --section S --key K',\n ' history --application <id> --section S --key K [--format json|table]',\n ' export --application <id> [--format md|json]',\n ' import --application <id> --file <bundle.json> [--source-id <repo@sha>]',\n '',\n 'New to app skills? Run `canary application skill guide` for the authoring methodology.',\n '',\n 'Sections:',\n ' ' + SECTIONS.join(', '),\n '',\n 'Notes:',\n ' --content @path reads content from a file (preferred for multi-line markdown)',\n ' --content \"text\" literal content string',\n ' Source defaults to \"cli\". Provide --source-id <repo@sha> for provenance.',\n '',\n 'Bundle.json shape for import:',\n ' { \"items\": [ { \"section\": S, \"itemKey\": K, \"itemLabel\": L, \"content\": \"...\" }, ... ] }',\n ].join('\\n')\n );\n}\n\nfunction readContent(value: string): string {\n if (value.startsWith('@')) {\n const path = value.slice(1);\n return readFileSync(path, 'utf8');\n }\n return value;\n}\n\nfunction isSection(s: string | undefined): s is Section {\n return !!s && (SECTIONS as readonly string[]).includes(s);\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const section = getArgValue(argv, '--section');\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'table');\n\n if (!propertyId) {\n console.error('Error: --application is required (alias: --property).');\n process.exit(1);\n }\n\n const result = await apiRequest<ListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/context`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n let items = result.data?.items ?? [];\n if (section) items = items.filter((i) => i.section === section);\n\n if (format === 'json') {\n writeRawOutput(JSON.stringify(items, null, 2));\n return;\n }\n\n if (items.length === 0) {\n console.log('(no items)');\n return;\n }\n\n const grouped = new Map<string, ContextItem[]>();\n for (const item of items) {\n const arr = grouped.get(item.section) ?? [];\n arr.push(item);\n grouped.set(item.section, arr);\n }\n\n for (const sec of SECTIONS) {\n const arr = grouped.get(sec);\n if (!arr || arr.length === 0) continue;\n console.log(`\\n[${sec}]`);\n for (const item of arr) {\n const provenance = item.source === 'cli' && item.sourceId ? ` (${item.sourceId})` : item.source !== 'cli' ? ` (${item.source})` : '';\n // itemKey/itemLabel/provenance are customer-controlled — same class as\n // the record view above, so the whole line renders raw.\n writeRawOutput(` ${item.itemKey} — ${item.itemLabel}${provenance}`);\n }\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const section = getArgValue(argv, '--section');\n const itemKey = getArgValue(argv, '--key');\n const versionArg = getArgValue(argv, '--version');\n const format = getArgValue(argv, '--format') ?? 'md';\n\n if (!propertyId || !section || !itemKey) {\n console.error('Error: --application, --section, --key are required.');\n process.exit(1);\n }\n if (!isSection(section)) {\n console.error(`Error: invalid section \"${section}\". One of: ${SECTIONS.join(', ')}`);\n process.exit(1);\n }\n\n // Current value comes from list; specific version from history.\n if (versionArg) {\n const v = Number(versionArg);\n const result = await apiRequest<{ ok: boolean; error?: string; data?: ContextItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/context/history?section=${section}&itemKey=${encodeURIComponent(itemKey)}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n const item = (result.data ?? []).find((i) => i.version === v);\n if (!item) {\n console.error(`Error: no version ${v} for ${section}/${itemKey}`);\n process.exit(1);\n }\n printItem(item, format);\n return;\n }\n\n const result = await apiRequest<ListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/context`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n const item = (result.data?.items ?? []).find(\n (i) => i.section === section && i.itemKey === itemKey\n );\n if (!item) {\n console.error(`Error: no item ${section}/${itemKey}`);\n process.exit(1);\n }\n printItem(item, format);\n}\n\nfunction printItem(item: ContextItem, format: string): void {\n if (format === 'json') {\n writeRawOutput(JSON.stringify(item, null, 2));\n return;\n }\n // Every field here is customer-controlled (labels, keys, source ids, body),\n // so the WHOLE record renders raw — branding any part of it corrupts values.\n writeRawOutput(`# ${item.itemLabel}`);\n writeRawOutput(`section: ${item.section}`);\n writeRawOutput(`key: ${item.itemKey}`);\n writeRawOutput(`version: ${item.version}`);\n writeRawOutput(`source: ${item.source}${item.sourceId ? ` (${item.sourceId})` : ''}`);\n writeRawOutput('');\n writeRawOutput(item.content);\n}\n\nasync function handleSet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const section = getArgValue(argv, '--section');\n const itemKey = getArgValue(argv, '--key');\n const itemLabel = getArgValue(argv, '--label');\n const contentArg = getArgValue(argv, '--content');\n const sourceId = getArgValue(argv, '--source-id');\n\n if (!propertyId || !section || !itemKey || !itemLabel || contentArg === undefined) {\n console.error('Error: --application, --section, --key, --label, --content are required.');\n process.exit(1);\n }\n if (!isSection(section)) {\n console.error(`Error: invalid section \"${section}\". One of: ${SECTIONS.join(', ')}`);\n process.exit(1);\n }\n\n const content = readContent(contentArg);\n\n const body: Record<string, unknown> = {\n section,\n itemKey,\n itemLabel,\n content,\n source: 'cli',\n };\n if (sourceId !== undefined) body.sourceId = sourceId;\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: ContextItem }>(\n apiUrl,\n token,\n 'PUT',\n `/org/properties/${propertyId}/context/items`,\n body\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n console.log(`Set [${section}] ${itemKey} (v${result.data?.version ?? '?'})`);\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const section = getArgValue(argv, '--section');\n const itemKey = getArgValue(argv, '--key');\n\n if (!propertyId || !section || !itemKey) {\n console.error('Error: --application, --section, --key are required.');\n process.exit(1);\n }\n if (!isSection(section)) {\n console.error(`Error: invalid section \"${section}\". One of: ${SECTIONS.join(', ')}`);\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/properties/${propertyId}/context/items`,\n { section, itemKey }\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n console.log(`Deleted [${section}] ${itemKey}`);\n}\n\nasync function handleHistory(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const section = getArgValue(argv, '--section');\n const itemKey = getArgValue(argv, '--key');\n const format = getArgValue(argv, '--format') ?? 'table';\n\n if (!propertyId || !section || !itemKey) {\n console.error('Error: --application, --section, --key are required.');\n process.exit(1);\n }\n if (!isSection(section)) {\n console.error(`Error: invalid section \"${section}\". One of: ${SECTIONS.join(', ')}`);\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: ContextItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/context/history?section=${section}&itemKey=${encodeURIComponent(itemKey)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n const versions = result.data ?? [];\n if (format === 'json') {\n writeRawOutput(JSON.stringify(versions, null, 2));\n return;\n }\n if (versions.length === 0) {\n console.log('(no history)');\n return;\n }\n for (const v of versions) {\n const provenance = v.sourceId ? ` (${v.sourceId})` : '';\n console.log(`v${v.version} ${v.source}${provenance} ${v.createdAt}`);\n }\n}\n\nasync function handleExport(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const format = getArgValue(argv, '--format') ?? 'md';\n\n if (!propertyId) {\n console.error('Error: --application is required (alias: --property).');\n process.exit(1);\n }\n\n const result = await apiRequest<ListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/context`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n const items = result.data?.items ?? [];\n if (format === 'json') {\n writeRawOutput(JSON.stringify({ items }, null, 2));\n return;\n }\n\n const grouped = new Map<string, ContextItem[]>();\n for (const item of items) {\n const arr = grouped.get(item.section) ?? [];\n arr.push(item);\n grouped.set(item.section, arr);\n }\n for (const sec of SECTIONS) {\n const arr = grouped.get(sec);\n if (!arr || arr.length === 0) continue;\n console.log(`## ${sec}`);\n console.log('');\n for (const item of arr) {\n console.log(`### ${item.itemLabel} (\\`${item.itemKey}\\`)`);\n console.log('');\n console.log(item.content);\n console.log('');\n }\n }\n}\n\ntype BundleItem = { section: string; itemKey: string; itemLabel: string; content: string };\ntype Bundle = { items: BundleItem[] };\n\nasync function handleImport(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = getApplicationArg(argv);\n const file = getArgValue(argv, '--file');\n const sourceId = getArgValue(argv, '--source-id');\n\n if (!propertyId || !file) {\n console.error('Error: --application and --file are required.');\n process.exit(1);\n }\n\n let bundle: Bundle;\n try {\n bundle = JSON.parse(readFileSync(file, 'utf8')) as Bundle;\n } catch (err) {\n console.error(`Error parsing ${file}: ${(err as Error).message}`);\n process.exit(1);\n return;\n }\n\n if (!bundle.items || !Array.isArray(bundle.items)) {\n console.error('Error: bundle.json must have an \"items\" array.');\n process.exit(1);\n }\n\n let ok = 0;\n let fail = 0;\n for (const item of bundle.items) {\n if (!isSection(item.section)) {\n console.error(` ✗ [${item.section}] ${item.itemKey}: invalid section`);\n fail++;\n continue;\n }\n const body: Record<string, unknown> = {\n section: item.section,\n itemKey: item.itemKey,\n itemLabel: item.itemLabel,\n content: item.content,\n source: 'cli',\n };\n if (sourceId) body.sourceId = sourceId;\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: ContextItem }>(\n apiUrl,\n token,\n 'PUT',\n `/org/properties/${propertyId}/context/items`,\n body\n );\n\n if (result.ok) {\n console.log(` ✓ [${item.section}] ${item.itemKey} (v${result.data?.version ?? '?'})`);\n ok++;\n } else {\n console.error(` ✗ [${item.section}] ${item.itemKey}: ${result.error ?? 'Unknown error'}`);\n fail++;\n }\n }\n\n console.log(`\\nImported ${ok}/${ok + fail} items${fail ? ` (${fail} failed)` : ''}.`);\n if (fail > 0) process.exit(1);\n}\n\nfunction handleGuide(): void {\n try {\n const guide = readFileSync(GUIDE_PATH, 'utf8');\n process.stdout.write(guide);\n if (!guide.endsWith('\\n')) process.stdout.write('\\n');\n } catch (err) {\n console.error(`Error: could not read authoring guide at ${GUIDE_PATH}`);\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport async function runPropertySkill(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n\n if (!action || action === 'help' || hasFlag(argv, '--help', '-h')) {\n printSkillHelp();\n return;\n }\n\n switch (action) {\n case 'guide':\n handleGuide();\n return;\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'set':\n await handleSet(rest, apiUrl, token);\n break;\n case 'delete':\n await handleDelete(rest, apiUrl, token);\n break;\n case 'history':\n await handleHistory(rest, apiUrl, token);\n break;\n case 'export':\n await handleExport(rest, apiUrl, token);\n break;\n case 'import':\n await handleImport(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown skill action: ${action}`);\n printSkillHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI: `canary application page-skill` — review and correct a property's page skills\n *\n * Page skill = a per-page Markdown recipe the fast-drive browser agent reads\n * before acting on a specific page. These are authored by the agent at run time;\n * this CLI is the human audit + correction surface (list/get/versions/set/\n * archive/unarchive), a thin client over the /org/properties/:id/page-skills\n * endpoints.\n *\n * `set` exists because an agent-authored skill can be confidently WRONG, and\n * archiving the whole skill to fix one sentence throws away everything else it\n * observed correctly. Edits append a version, so the prior text stays readable\n * via `versions`.\n */\n\nimport { readFileSync } from 'node:fs';\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, getApplicationArg } from './cli-helpers.js';\nimport { writeRawOutput } from './brand.js';\n\ntype PageSkillListRow = {\n id: string;\n title: string;\n summary: string;\n tags: string[];\n matchType: 'glob' | 'regex';\n pathPattern: string;\n currentVersion: number;\n bodyBytes: number;\n updatedAt: string;\n archivedAt: string | null;\n};\n\ntype PageSkill = PageSkillListRow & { body: string; orgId: string; propertyId: string };\n\ntype PageSkillVersionRow = {\n version: number;\n title: string;\n summary: string;\n body: string;\n pathPattern: string;\n createdAt: string;\n};\n\ntype ListResponse = { ok: boolean; error?: string; data?: PageSkillListRow[] };\ntype GetResponse = { ok: boolean; error?: string; data?: PageSkill };\ntype VersionsResponse = { ok: boolean; error?: string; data?: PageSkillVersionRow[] };\ntype OkResponse = { ok: boolean; error?: string; code?: string; actualVersion?: number };\ntype SetResponse = OkResponse & { data?: PageSkill };\n\nfunction printHelp(): void {\n console.log(\n [\n \"canary application page-skill: Review and correct a property's page skills (per-page recipes authored by the browser agent).\",\n '',\n 'Sub-commands:',\n ' list --application <id> [--include-archived] [--pathname </path|url>] [--format json|table]',\n ' get --application <id> --id <skillId> [--format json|md]',\n ' versions --application <id> --id <skillId> [--format json|table]',\n ' set --application <id> --id <skillId> [--body @file|\"text\"] [--title T] [--summary S] [--tags a,b]',\n ' archive --application <id> --id <skillId>',\n ' unarchive --application <id> --id <skillId>',\n '',\n 'Notes:',\n ' --property is accepted as an alias for --application.',\n ' --pathname filters to the skill(s) that would actually be presented on that',\n ' page, using the same matcher the runtime uses. Accepts a path or a full URL.',\n ' set edits content only and appends a version — the prior text stays readable',\n ' via `versions`. It re-reads the current version and sends it as baseVersion, so',\n ' an agent write landing mid-edit is reported as a conflict instead of clobbered.',\n ' matchType/pathPattern are NOT editable: identity is (application, matchType,',\n ' pathPattern), so changing a pattern would fork a second skill rather than rename.',\n ' Re-target with archive + let the agent author the new pattern.',\n ' archive is a LOSSLESS prune: the skill drops out of the agent surface but',\n ' keeps its body + version history. unarchive restores it without a new version.',\n ].join('\\n')\n );\n}\n\n/** `@path` reads from a file; anything else is a literal (mirrors `application skill set`). */\nfunction readContent(value: string): string {\n if (value.startsWith('@')) {\n return readFileSync(value.slice(1), 'utf8');\n }\n return value;\n}\n\nfunction requirePropertyId(argv: string[]): string {\n const propertyId = getApplicationArg(argv);\n if (!propertyId) {\n console.error('Error: --application is required (alias: --property).');\n process.exit(1);\n }\n return propertyId;\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const includeArchived = hasFlag(argv, '--include-archived', '--all');\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'table');\n\n const pathname = getArgValue(argv, '--pathname');\n const params = new URLSearchParams();\n if (includeArchived) params.set('includeArchived', '1');\n if (pathname) params.set('pathname', pathname);\n const query = params.toString() ? `?${params.toString()}` : '';\n const result = await apiRequest<ListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/page-skills${query}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n const rows = result.data ?? [];\n if (format === 'json') {\n writeRawOutput(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (rows.length === 0) {\n console.log(\n pathname\n ? `No page skill matches ${pathname} — the agent gets no skill on that page.`\n : 'No page skills for this property.'\n );\n return;\n }\n\n for (const row of rows) {\n const flag = row.archivedAt ? ' [archived]' : '';\n console.log(\n `${row.pathPattern} (v${row.currentVersion}, ${row.bodyBytes}B)${flag}\\n` +\n ` id: ${row.id}\\n` +\n ` ${row.title} — ${row.summary}`\n );\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const skillId = getArgValue(argv, '--id');\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'md');\n if (!skillId) {\n console.error('Error: --id <skillId> is required.');\n process.exit(1);\n }\n\n const result = await apiRequest<GetResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/page-skills/${skillId}`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'not found'}`);\n process.exit(1);\n }\n\n const skill = result.data;\n if (format === 'json') {\n writeRawOutput(JSON.stringify(skill, null, 2));\n return;\n }\n\n console.log(\n `# ${skill.title}\\n` +\n `pattern: ${skill.pathPattern} (${skill.matchType})\\n` +\n `version: ${skill.currentVersion}${skill.archivedAt ? ' [archived]' : ''}\\n` +\n `tags: ${skill.tags.join(', ') || '(none)'}\\n\\n` +\n `${skill.summary}\\n\\n---\\n${skill.body}`\n );\n}\n\nasync function handleArchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const skillId = getArgValue(argv, '--id');\n if (!skillId) {\n console.error('Error: --id <skillId> is required.');\n process.exit(1);\n }\n\n const result = await apiRequest<OkResponse>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${propertyId}/page-skills/${skillId}/archive`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n console.log(`Archived page skill ${skillId} (restorable — the agent un-archives it on next upsert).`);\n}\n\nasync function handleVersions(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const skillId = getArgValue(argv, '--id');\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'table');\n if (!skillId) {\n console.error('Error: --id <skillId> is required.');\n process.exit(1);\n }\n\n const result = await apiRequest<VersionsResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/page-skills/${skillId}/versions`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'not found'}`);\n process.exit(1);\n }\n\n if (format === 'json') {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n\n for (const v of result.data) {\n console.log(`v${v.version} ${v.createdAt} ${v.body.length}B ${v.title}`);\n }\n}\n\nasync function handleSet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const skillId = getArgValue(argv, '--id');\n if (!skillId) {\n console.error('Error: --id <skillId> is required.');\n process.exit(1);\n }\n\n const rawBody = getArgValue(argv, '--body');\n const title = getArgValue(argv, '--title');\n const summary = getArgValue(argv, '--summary');\n const rawTags = getArgValue(argv, '--tags');\n if (rawBody === undefined && !title && !summary && rawTags === undefined) {\n console.error('Error: nothing to change — pass at least one of --body, --title, --summary, --tags.');\n process.exit(1);\n }\n\n // Read the current version so the edit is based on what is live right now. The\n // server rejects the write if an agent lands a version in between, rather than\n // silently overwriting it.\n const current = await apiRequest<GetResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/page-skills/${skillId}`\n );\n if (!current.ok || !current.data) {\n console.error(`Error: ${current.error ?? 'not found'}`);\n process.exit(1);\n }\n\n const payload: Record<string, unknown> = { baseVersion: current.data.currentVersion };\n if (rawBody !== undefined) payload.body = readContent(rawBody);\n if (title) payload.title = title;\n if (summary) payload.summary = summary;\n if (rawTags !== undefined) {\n payload.tags = rawTags\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n }\n\n const result = await apiRequest<SetResponse>(\n apiUrl,\n token,\n 'PUT',\n `/org/properties/${propertyId}/page-skills/${skillId}`,\n payload\n );\n if (!result.ok || !result.data) {\n if (result.code === 'PAGE_SKILL_VERSION_CONFLICT') {\n console.error(\n `Error: the skill changed while you were editing (now v${result.actualVersion ?? '?'}). ` +\n 're-read it with `get` and re-apply your change.'\n );\n process.exit(1);\n }\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n console.log(\n `Updated ${result.data.pathPattern} → v${result.data.currentVersion} ` +\n `(${result.data.body.length}B). Prior text kept — see \\`page-skill versions --id ${skillId}\\`.`\n );\n}\n\nasync function handleUnarchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const skillId = getArgValue(argv, '--id');\n if (!skillId) {\n console.error('Error: --id <skillId> is required.');\n process.exit(1);\n }\n\n const result = await apiRequest<OkResponse>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${propertyId}/page-skills/${skillId}/unarchive`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n console.log(`Restored page skill ${skillId} to the agent surface (no new version).`);\n}\n\nexport async function runPageSkill(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n\n if (!action || action === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n switch (action) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'versions':\n await handleVersions(rest, apiUrl, token);\n break;\n case 'set':\n await handleSet(rest, apiUrl, token);\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 default:\n console.error(`Unknown page-skill action: ${action}`);\n printHelp();\n process.exit(1);\n }\n}\n","/**\n * CLI: `canary application recipe` — provision + audit a property's interaction recipes\n *\n * Interaction recipe = a named, parameterized, re-entrant Playwright transaction\n * scoped to a property (an app-wide interaction mechanic — e.g. \"select an item\n * from a menu that self-dismisses\"). Recipes are normally minted by the browser\n * agent, but this CLI is the human surface: list/get for auditing, and\n * `upsert`/`archive` for MANUALLY provisioning a working recipe for a tricky\n * interaction the agent hasn't learned yet. Upsert runs the same server-side\n * lint as the agent tool. Thin client over /org/properties/:id/interaction-recipes.\n */\n\nimport { readFileSync } from 'node:fs';\nimport process from 'node:process';\nimport { getArgValue, hasFlag } from './auth.js';\nimport { apiRequest, getApplicationArg } from './cli-helpers.js';\nimport { writeRawOutput } from './brand.js';\n\ntype ArgsSchema = {\n properties?: Record<string, { type?: string } | undefined>;\n required?: unknown;\n};\n\ntype RecipeListRow = {\n id: string;\n slug: string;\n title: string;\n whenToUse: string;\n tags: string[];\n argsSchema: ArgsSchema;\n currentVersion: number;\n healthState: string;\n callCount: number;\n distinctWorkflowCount: number;\n successStreak: number;\n codeBytes: number;\n lastCalledAt: string | null;\n updatedAt: string | null;\n archivedAt: string | null;\n};\n\ntype Recipe = RecipeListRow & {\n code: string;\n docMarkdown: string | null;\n orgId: string;\n propertyId: string;\n};\n\n/**\n * Render a recipe's arg contract as a compact signature, e.g.\n * `menuName: string (required), itemName: string`. Empty schema → `(none)`.\n * Exported for testing.\n */\nexport function formatArgSignature(argsSchema: ArgsSchema): string {\n const properties = argsSchema.properties ?? {};\n const required = new Set(\n (Array.isArray(argsSchema.required) ? argsSchema.required : []).filter(\n (name): name is string => typeof name === 'string'\n )\n );\n const names = Object.keys(properties);\n if (names.length === 0) return '(none)';\n return names\n .map((name) => {\n const type = properties[name]?.type ?? 'any';\n return `${name}: ${type}${required.has(name) ? ' (required)' : ''}`;\n })\n .join(', ');\n}\n\n/**\n * Build an example `--args` JSON object with a placeholder per property, so an\n * agent gets a paste-ready call skeleton, e.g. `{\"menuName\":\"<string>\"}`.\n * Exported for testing.\n */\nexport function exampleArgsJson(argsSchema: ArgsSchema): string {\n const properties = argsSchema.properties ?? {};\n const example: Record<string, string> = {};\n for (const name of Object.keys(properties)) {\n example[name] = `<${properties[name]?.type ?? 'value'}>`;\n }\n return JSON.stringify(example);\n}\n\n/** Quote one argv value for safe copy/paste into a POSIX-compatible shell. */\nexport function shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n\n/** The exact command that runs a recipe against a live session. */\nexport function callCommand(propertyId: string, slug: string, argsSchema: ArgsSchema): string {\n const hasArgs = Object.keys(argsSchema.properties ?? {}).length > 0;\n const argsPart = hasArgs ? ` --args ${shellQuote(exampleArgsJson(argsSchema))}` : '';\n return `cofactor session call-recipe --application ${shellQuote(propertyId)} --slug ${shellQuote(slug)}${argsPart}`;\n}\n\ntype UpsertResult = {\n id: string;\n slug: string;\n title: string;\n currentVersion: number;\n healthState: string;\n};\n\ntype ListResponse = { ok: boolean; error?: string; data?: RecipeListRow[] };\ntype GetResponse = { ok: boolean; error?: string; data?: Recipe };\ntype UpsertResponse = {\n ok: boolean;\n error?: string;\n errors?: string[];\n warnings?: string[];\n data?: UpsertResult;\n};\ntype OkResponse = { ok: boolean; error?: string };\n\nfunction printHelp(): void {\n console.log(\n [\n \"canary application recipe: Provision + audit a property's interaction recipes.\",\n '',\n 'Interaction recipe = a named, re-entrant Playwright transaction for an app-wide',\n 'interaction mechanic (e.g. a self-dismissing menu). Normally minted by the agent;',\n 'these commands let you audit them and hand-provision working ones for tricky cases.',\n '',\n 'Sub-commands:',\n ' list --application <id> [--include-archived] [--format json|table]',\n ' get --application <id> --slug <slug> [--format json|code]',\n ' upsert --application <id> --file <recipe.json> [--base-version <n>]',\n ' archive --application <id> --slug <slug> [--reason <text>]',\n '',\n 'Running a recipe:',\n ' `list` and `get` print the exact ready-to-run command under \"run:\".',\n ' Run one against a live browser-testing session with:',\n \" cofactor session call-recipe --application <id> --slug <slug> --args '{...}'\",\n ' (In an interactive session, `macro` is unavailable — pre-resolve dynamic',\n ' values into --args — and `attach` is a no-op. Page-driving recipes work as-is.)',\n '',\n 'upsert --file expects a JSON object (argsSchema is a JSON Schema object):',\n ' {',\n ' \"slug\": \"select-from-transient-menu\",',\n ' \"title\": \"Select an item from a self-dismissing menu\",',\n ' \"whenToUse\": \"Menus in this app unmount seconds after opening.\",',\n ' \"tags\": [\"menu\", \"overlay\"],',\n ' \"argsSchema\": {',\n ' \"type\": \"object\",',\n ' \"properties\": { \"menuName\": { \"type\": \"string\" }, \"itemName\": { \"type\": \"string\" } },',\n ' \"required\": [\"menuName\", \"itemName\"]',\n ' },',\n ' \"code\": \"async ({ page, args }) => { /* open + click atomically */ }\",',\n ' \"docMarkdown\": \"optional usage notes\"',\n ' }',\n '',\n 'Notes:',\n ' --property is accepted as an alias for --application.',\n ' upsert runs the same server-side lint as the agent (rejects secrets/foreign',\n ' hosts/unreferenced args). Pass --base-version <current> to EDIT an existing',\n ' recipe; omit it to create. A hand-provisioned recipe starts at health',\n ' \"unverified\" and earns \"verified\" through the normal replay ladder.',\n ' archive is a LOSSLESS prune: re-running upsert on the same slug restores it.',\n ].join('\\n')\n );\n}\n\nfunction requirePropertyId(argv: string[]): string {\n const propertyId = getApplicationArg(argv);\n if (!propertyId) {\n console.error('Error: --application is required (alias: --property).');\n process.exit(1);\n }\n return propertyId;\n}\n\nfunction requireSlug(argv: string[]): string {\n const slug = getArgValue(argv, '--slug');\n if (!slug) {\n console.error('Error: --slug <slug> is required.');\n process.exit(1);\n }\n return slug;\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const includeArchived = hasFlag(argv, '--include-archived', '--all');\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'table');\n\n const query = includeArchived ? '?includeArchived=1' : '';\n const result = await apiRequest<ListResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/interaction-recipes${query}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n const rows = result.data ?? [];\n if (format === 'json') {\n writeRawOutput(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (rows.length === 0) {\n console.log('No interaction recipes for this property.');\n return;\n }\n\n for (const row of rows) {\n const flag = row.archivedAt ? ' [archived]' : '';\n const reuse = `${row.callCount} calls / ${row.distinctWorkflowCount} flows`;\n console.log(\n `${row.slug} (v${row.currentVersion}, ${row.healthState}, ${reuse}, ${row.codeBytes}B)${flag}\\n` +\n ` ${row.title} — ${row.whenToUse}\\n` +\n ` args: ${formatArgSignature(row.argsSchema)}` +\n (row.archivedAt\n ? '\\n run: (archived; restore with upsert before calling)'\n : `\\n run: ${callCommand(propertyId, row.slug, row.argsSchema)}`)\n );\n }\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const slug = requireSlug(argv);\n const format = getArgValue(argv, '--format') ?? (hasFlag(argv, '--json') ? 'json' : 'code');\n\n const result = await apiRequest<GetResponse>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/interaction-recipes/${encodeURIComponent(slug)}`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'not found'}`);\n process.exit(1);\n }\n\n const recipe = result.data;\n if (format === 'json') {\n writeRawOutput(JSON.stringify(recipe, null, 2));\n return;\n }\n\n console.log(\n `# ${recipe.title} (${recipe.slug})\\n` +\n `version: ${recipe.currentVersion} health: ${recipe.healthState}` +\n `${recipe.archivedAt ? ' [archived]' : ''}\\n` +\n `tags: ${recipe.tags.join(', ') || '(none)'}\\n` +\n `whenToUse: ${recipe.whenToUse}\\n` +\n `args: ${formatArgSignature(recipe.argsSchema)}\\n` +\n `run: ${callCommand(propertyId, recipe.slug, recipe.argsSchema)}\\n\\n` +\n `${recipe.code}` +\n (recipe.docMarkdown ? `\\n\\n---\\n${recipe.docMarkdown}` : '')\n );\n}\n\nasync function handleUpsert(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const file = getArgValue(argv, '--file');\n if (!file) {\n console.error('Error: --file <recipe.json> is required. See `recipe help` for the shape.');\n process.exit(1);\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(readFileSync(file, 'utf8')) as Record<string, unknown>;\n } catch (error) {\n console.error(\n `Error reading ${file}: ${error instanceof Error ? error.message : String(error)}`\n );\n process.exit(1);\n }\n\n const baseVersionArg = getArgValue(argv, '--base-version');\n if (baseVersionArg !== undefined) {\n const parsed = Number(baseVersionArg);\n if (!Number.isInteger(parsed) || parsed < 1) {\n console.error('Error: --base-version must be a positive integer.');\n process.exit(1);\n }\n payload.baseVersion = parsed;\n }\n\n const result = await apiRequest<UpsertResponse>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${propertyId}/interaction-recipes`,\n payload\n );\n\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'upsert failed'}`);\n if (result.errors?.length) {\n console.error('Lint errors:');\n for (const err of result.errors) console.error(` - ${err}`);\n }\n process.exit(1);\n }\n\n const saved = result.data;\n console.log(\n `Provisioned recipe \"${saved.slug}\" v${saved.currentVersion} (health: ${saved.healthState}).`\n );\n if (result.warnings?.length) {\n console.log('Lint warnings:');\n for (const warn of result.warnings) console.log(` - ${warn}`);\n }\n}\n\nasync function handleArchive(argv: string[], apiUrl: string, token: string): Promise<void> {\n const propertyId = requirePropertyId(argv);\n const slug = requireSlug(argv);\n const reason = getArgValue(argv, '--reason');\n\n const result = await apiRequest<OkResponse>(\n apiUrl,\n token,\n 'POST',\n `/org/properties/${propertyId}/interaction-recipes/${encodeURIComponent(slug)}/archive`,\n reason ? { reason } : {}\n );\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n console.log(\n `Archived interaction recipe \"${slug}\" (restorable — re-run upsert to bring it back).`\n );\n}\n\nexport async function runRecipe(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [action, ...rest] = argv;\n\n if (!action || action === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n switch (action) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'upsert':\n await handleUpsert(rest, apiUrl, token);\n break;\n case 'archive':\n await handleArchive(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown recipe action: ${action}`);\n printHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["process","result","item","readFileSync","process","readContent","readFileSync","process","handleList","handleGet","handleSet","readFileSync","process","printHelp","requirePropertyId","process","handleList","handleGet","readFileSync","handleArchive","printHelp","handleList","process"]}