@qwen-code/qwen-code 0.21.8-nightly.20260810.55e20db328 → 0.21.9

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 (211) hide show
  1. package/README.md +2 -1
  2. package/bundled/qc-helper/docs/configuration/settings.md +2 -1
  3. package/bundled/qc-helper/docs/features/code-review.md +2 -0
  4. package/bundled/qc-helper/docs/qwen-serve.md +38 -37
  5. package/bundled/review/SKILL.md +7 -7
  6. package/chunks/{MaxSizedBox-A52T4GEU.js → MaxSizedBox-6BZANW7X.js} +3 -3
  7. package/chunks/{StandaloneSessionPicker-4J654SOB.js → StandaloneSessionPicker-VDC5KE7T.js} +19 -16
  8. package/chunks/{acpAgent-65AM4AOR.js → acpAgent-F2NSBCUF.js} +49 -40
  9. package/chunks/{agent-SVQ7U7NJ.js → agent-VOHJOEBB.js} +3 -3
  10. package/chunks/{agent-headless-XXGY2SQO.js → agent-headless-J5NFOPHP.js} +3 -3
  11. package/chunks/{bridge-Y32B5S3G.js → bridge-NQIZZLAS.js} +4 -4
  12. package/chunks/{channel-settings-store-OW43U6VB.js → channel-settings-store-VIY2OENO.js} +11 -9
  13. package/chunks/{chunk-OR6R3IUW.js → chunk-23VQTELM.js} +1 -1
  14. package/chunks/{chunk-VHXPSL57.js → chunk-3WDYBTTI.js} +4 -4
  15. package/chunks/{chunk-FAD7OC7V.js → chunk-3XVDTHBJ.js} +2 -2
  16. package/chunks/{chunk-7XX5IBXL.js → chunk-46YJDYCU.js} +6 -6
  17. package/chunks/{chunk-FYB4GIDW.js → chunk-4XQNB3KN.js} +2 -2
  18. package/chunks/chunk-5EJZE3FP.js +140 -0
  19. package/chunks/{chunk-DPMJLKUP.js → chunk-5RBDAGC6.js} +2 -2
  20. package/chunks/{chunk-D2D7J3EW.js → chunk-7AEPJGL4.js} +1 -1
  21. package/chunks/{chunk-HKI3KHAO.js → chunk-7GOYZQPR.js} +19 -1976
  22. package/chunks/{chunk-2ASQDZSJ.js → chunk-7S4JBJLU.js} +3 -3
  23. package/chunks/{chunk-EISUQQPS.js → chunk-ATMO54WE.js} +2 -2
  24. package/chunks/{chunk-NZMXUSKS.js → chunk-BAMN6XSD.js} +1 -1
  25. package/chunks/{chunk-2545EHZR.js → chunk-BIRWP6LU.js} +1 -1
  26. package/chunks/{chunk-UGUKH3SU.js → chunk-BZP4QPNK.js} +9 -9
  27. package/chunks/{chunk-AUWN7BAG.js → chunk-D7BXVKSF.js} +1 -1
  28. package/chunks/{chunk-TXO5BMR2.js → chunk-DH5YXSIF.js} +2 -2
  29. package/chunks/{chunk-OSVH4SMN.js → chunk-FBMCDU63.js} +3 -3
  30. package/chunks/{chunk-GY24H6IA.js → chunk-FCLHHEUK.js} +10 -10
  31. package/chunks/{chunk-FWWQIFDT.js → chunk-G2TX5ZXC.js} +3 -3
  32. package/chunks/{chunk-HDYQYYWB.js → chunk-GAKGOXTC.js} +1 -1
  33. package/chunks/{chunk-TWFFY5BP.js → chunk-HADWBW5R.js} +4 -4
  34. package/chunks/{chunk-E2N554HK.js → chunk-HZGBKOX3.js} +2 -2
  35. package/chunks/{chunk-V47QNK5W.js → chunk-II6G3EY6.js} +288 -72
  36. package/chunks/{chunk-ZV7LTLFE.js → chunk-IOEZE2YT.js} +1 -1
  37. package/chunks/chunk-JUWS2Z5K.js +1995 -0
  38. package/chunks/{chunk-F3II4BTZ.js → chunk-K4ADGWHU.js} +1 -1
  39. package/chunks/{chunk-5ZTS3OQ3.js → chunk-KSAFZ5TA.js} +1 -1
  40. package/chunks/{chunk-KMS57JDD.js → chunk-KTKYGS2P.js} +29 -6
  41. package/chunks/{chunk-HWXGX534.js → chunk-KTQGGPGV.js} +3 -3
  42. package/chunks/{chunk-ZIKTCMQF.js → chunk-LZZLUCRS.js} +5 -5
  43. package/chunks/{chunk-S5CULOHB.js → chunk-MHP476D3.js} +64 -21
  44. package/chunks/{chunk-PNVPFARW.js → chunk-MTCYGTWH.js} +4 -4
  45. package/chunks/{chunk-WQYWK4DG.js → chunk-OGDIJKHK.js} +1 -1
  46. package/chunks/{chunk-WH6QMLUW.js → chunk-OGNFHGIG.js} +3 -3
  47. package/chunks/{chunk-P5ULXPK5.js → chunk-P2FK2HBV.js} +2 -2
  48. package/chunks/{chunk-5WZL724W.js → chunk-P3RBMQ4P.js} +3 -3
  49. package/chunks/{chunk-4EOURKA4.js → chunk-P4ZEZSJZ.js} +177 -17
  50. package/chunks/{chunk-RQ6U2JJQ.js → chunk-PNBBJOCP.js} +1 -1
  51. package/chunks/{chunk-E2T7FLDU.js → chunk-PVOGHGSF.js} +5 -5
  52. package/chunks/{chunk-EUVOKP6Y.js → chunk-QSNSL4R4.js} +1 -1
  53. package/chunks/{chunk-RYQMJCUO.js → chunk-RBHQXGDK.js} +1 -1
  54. package/chunks/{chunk-ZI5IH2HP.js → chunk-RVSTTOJ4.js} +2 -2
  55. package/chunks/{chunk-OW2BWT2P.js → chunk-SCAZZ3Q4.js} +4 -4
  56. package/chunks/{chunk-OBP6QWD5.js → chunk-T5RLUXWJ.js} +2 -2
  57. package/chunks/{chunk-KP25NJNM.js → chunk-T6HEQR2Q.js} +16 -5
  58. package/chunks/{chunk-RMPLEWF3.js → chunk-THIKWITR.js} +2 -2
  59. package/chunks/{chunk-V2226RFW.js → chunk-TQCYNLNJ.js} +1 -1
  60. package/chunks/{chunk-O277O7U6.js → chunk-TZ6KJ44L.js} +1 -1
  61. package/chunks/{chunk-ZCJBCKL5.js → chunk-UJUM2SRN.js} +115 -29
  62. package/chunks/{chunk-3KJQZEN3.js → chunk-UYAUA63Q.js} +1 -1
  63. package/chunks/chunk-VFMASYQA.js +389 -0
  64. package/chunks/chunk-VGHZT6JR.js +51 -0
  65. package/chunks/{chunk-H4JC7LZX.js → chunk-W3FSZSF2.js} +1 -1
  66. package/chunks/{chunk-YFRFZCIP.js → chunk-WGK4TSB7.js} +3 -3
  67. package/chunks/{chunk-BL65MO72.js → chunk-WP5VOXF7.js} +6 -127
  68. package/chunks/{chunk-T2O6NIOY.js → chunk-XTY5DN4Y.js} +1 -1
  69. package/chunks/{chunk-47ZUMGGY.js → chunk-XX7QFP34.js} +56 -55
  70. package/chunks/{chunk-ZSNBQXMZ.js → chunk-YTFDX4PR.js} +8 -3
  71. package/chunks/{chunk-F6TUUA2U.js → chunk-ZBXGWQ4S.js} +2 -2
  72. package/chunks/{chunk-YR7ZQ4RD.js → chunk-ZOSTTOUJ.js} +1 -1
  73. package/chunks/{chunk-UAB6J2IE.js → chunk-ZTQSOV56.js} +3 -3
  74. package/chunks/{computer-use-SLN7DV2E.js → computer-use-PMZ7ICGY.js} +3 -3
  75. package/chunks/{contextCommand-EHFYX6FW.js → contextCommand-GEZU7YHE.js} +6 -5
  76. package/chunks/{core-runtime-FBSP5IIG.js → core-runtime-HRJI2MN6.js} +3 -3
  77. package/chunks/{create-sub-session-WC7YGVSL.js → create-sub-session-VBNVI4YU.js} +3 -3
  78. package/chunks/{daemon-VSX3FHTY.js → daemon-POSQPD3G.js} +26 -3
  79. package/chunks/{daemon-status-provider-WW2AD2T7.js → daemon-status-provider-N4CRQKFI.js} +8 -8
  80. package/chunks/{daemon-trust-policy-E4MAYWPI.js → daemon-trust-policy-BHO3JUHM.js} +11 -9
  81. package/chunks/{daemon-trust-policy-monitor-XVIDV6T4.js → daemon-trust-policy-monitor-YEKJ2726.js} +11 -9
  82. package/chunks/{deferred-core-runtime-5SVUC6UC.js → deferred-core-runtime-SH57E3J3.js} +3 -3
  83. package/chunks/{earlyInputCapture-72FYHYRD.js → earlyInputCapture-B2JJ2HME.js} +3 -3
  84. package/chunks/{edit-SWVVWHXW.js → edit-7FTXENAN.js} +5 -3
  85. package/chunks/{enter-worktree-2HF6WQEO.js → enter-worktree-JPHV2PBG.js} +3 -3
  86. package/chunks/{enterPlanMode-OW6S7L4P.js → enterPlanMode-CGBJ3AHJ.js} +3 -3
  87. package/chunks/{environment-LRTBTDXH.js → environment-LXASZAHD.js} +6 -6
  88. package/chunks/{errors-4CO2DME6.js → errors-XIGVT2AD.js} +5 -5
  89. package/chunks/{exit-worktree-GHJEIRGL.js → exit-worktree-DKSGXW65.js} +3 -3
  90. package/chunks/{exitPlanMode-JVP4FNNK.js → exitPlanMode-THFL2HYN.js} +3 -3
  91. package/chunks/{fast-path-HCCY7GR2.js → fast-path-4NXAT5UL.js} +3 -3
  92. package/chunks/{fast-path-settings-MN5QQQET.js → fast-path-settings-RPAVBD7P.js} +2 -2
  93. package/chunks/{gemini-V3YVRKXU.js → gemini-B3N6FACU.js} +39 -44
  94. package/chunks/{geminiContentGenerator-LVPMQUWX.js → geminiContentGenerator-YYFE2HIE.js} +1 -1
  95. package/chunks/{glob-7HRXHYDR.js → glob-BPHSCFJP.js} +3 -3
  96. package/chunks/{grep-BITQUON5.js → grep-ROZIRFLU.js} +3 -3
  97. package/chunks/{handleAutoUpdate-DKFY454S.js → handleAutoUpdate-WV6SPZQB.js} +8 -7
  98. package/chunks/{i18n-53BQIQSH.js → i18n-YWJWPQKD.js} +8 -6
  99. package/chunks/{image-gen-H62FLDFB.js → image-gen-SISRZ6FS.js} +1 -1
  100. package/chunks/{initializer-Q7NUQRSU.js → initializer-66OAD6GO.js} +11 -9
  101. package/chunks/{installationInfo-BWFHT7WU.js → installationInfo-3YUGIP36.js} +4 -4
  102. package/chunks/{list-OWQKR6JK.js → list-VEYR66XB.js} +14 -12
  103. package/chunks/{loadedSettingsAdapter-HNPKQMFA.js → loadedSettingsAdapter-V2JCPCYD.js} +11 -9
  104. package/chunks/{loggingContentGenerator-A5I3VQUC.js → loggingContentGenerator-RBLNDREC.js} +1 -1
  105. package/chunks/{managed-npm-update-CUUJGUTV.js → managed-npm-update-C5ID5R4R.js} +4 -4
  106. package/chunks/{mcp-GJSC7ZPO.js → mcp-OZ54NZJQ.js} +11 -9
  107. package/chunks/{monitor-TZ2II7JM.js → monitor-7Y4TVFTK.js} +3 -3
  108. package/chunks/{nonInteractiveCli-22RS4EVH.js → nonInteractiveCli-QEK4LHAC.js} +35 -33
  109. package/chunks/{notebook-edit-YZC3YPY2.js → notebook-edit-OG35EBGY.js} +4 -3
  110. package/chunks/{openaiContentGenerator-OIGO5XNF.js → openaiContentGenerator-443BNRPJ.js} +1 -1
  111. package/chunks/{pidfile-QJQ65RJ2.js → pidfile-ZK4OLRZA.js} +3 -3
  112. package/chunks/{processUtils-V5VSDIKS.js → processUtils-4YGB4RUZ.js} +2 -2
  113. package/chunks/{qwenContentGenerator-HXM25BGB.js → qwenContentGenerator-D5C2LCSZ.js} +3 -3
  114. package/chunks/{qwenOAuth2-7MTMS2Z5.js → qwenOAuth2-Z4YQBMYN.js} +1 -1
  115. package/chunks/{read-file-PMGXB3ZB.js → read-file-EXTJLWMU.js} +1 -1
  116. package/chunks/{resumeHistoryUtils-YUTPLHUH.js → resumeHistoryUtils-UPCGRJUL.js} +7 -6
  117. package/chunks/{ripGrep-XUS66YIV.js → ripGrep-QBVIRCU4.js} +3 -3
  118. package/chunks/{run-qwen-serve-4NVSU75L.js → run-qwen-serve-ZYGJNE3E.js} +67 -51
  119. package/chunks/{runtime-QLRVP6HM.js → runtime-BZZ4LWCP.js} +12 -10
  120. package/chunks/{scheduler-PBB2NSOP.js → scheduler-YNQNOU2E.js} +131 -11
  121. package/chunks/{serve-BWKTRX72.js → serve-LJHAXDCH.js} +11 -9
  122. package/chunks/{server-E7CH7WPK.js → server-ADMLELR6.js} +256 -750
  123. package/chunks/{session-QEKSJ6YU.js → session-YKZXFFTM.js} +36 -34
  124. package/chunks/{settings-BRAOSJIM.js → settings-EQBUAQ7Y.js} +10 -8
  125. package/chunks/{shell-OF3CK4AT.js → shell-3QZOJGTT.js} +3 -3
  126. package/chunks/{skill-HLH2NO2H.js → skill-UWSSMXE7.js} +1 -1
  127. package/chunks/{skill-settings-DRPU7YI5.js → skill-settings-T6MLB7NU.js} +10 -8
  128. package/chunks/{spawnChannel-4KO7YTFM.js → spawnChannel-VS7ZFUFP.js} +3 -3
  129. package/chunks/{standalone-update-DJN2R3YW.js → standalone-update-2W26SRRO.js} +6 -5
  130. package/chunks/{startInteractiveUI-O3WQQ2WC.js → startInteractiveUI-CVS7K3D6.js} +55 -45
  131. package/chunks/{team-create-2E4ACBJD.js → team-create-4WFTNNUL.js} +3 -3
  132. package/chunks/{team-plan-approval-LWIDXYOA.js → team-plan-approval-DBYI33S3.js} +3 -3
  133. package/chunks/{terminal-image-renderer-PJM7663W.js → terminal-image-renderer-S5WPPQKH.js} +3 -3
  134. package/chunks/{theme-manager-FDQTM3RP.js → theme-manager-LI2RIOVR.js} +3 -3
  135. package/chunks/{tool-search-TL5ZXBF4.js → tool-search-4773EUQ4.js} +1 -1
  136. package/chunks/{total-session-admission-LS6EY5KT.js → total-session-admission-PAY5CH2Z.js} +4 -4
  137. package/chunks/{trustedFolders-5RWP5OB7.js → trustedFolders-FRSLE674.js} +4 -4
  138. package/chunks/{update-relaunch-HWQ4USKY.js → update-relaunch-ZSFQTU6M.js} +5 -5
  139. package/chunks/{updateCheck-EZMBTEIR.js → updateCheck-AXWSO7KA.js} +7 -6
  140. package/chunks/{useAutoAcceptIndicator-JDMI627A.js → useAutoAcceptIndicator-VHLXIA7U.js} +11 -9
  141. package/chunks/{validateNonInterActiveAuth-RRUHC5RO.js → validateNonInterActiveAuth-PDJECMFU.js} +32 -30
  142. package/chunks/{version-XS4UTKUX.js → version-RBN764QS.js} +1 -1
  143. package/chunks/{web-fetch-2JV7H6OM.js → web-fetch-7BJK42AF.js} +1 -1
  144. package/chunks/{web-search-RCTN2GAM.js → web-search-L2CILQXV.js} +2 -2
  145. package/chunks/{workflow-6MKLKQ6R.js → workflow-5VH2R74I.js} +4 -4
  146. package/chunks/{workspace-providers-status-YZ2IJ4DK.js → workspace-providers-status-OZTQ6JFH.js} +13 -11
  147. package/chunks/{workspace-registration-store-IYN72LBS.js → workspace-registration-store-IX5RJQS5.js} +1 -1
  148. package/chunks/{workspace-registry-7LFBZQLT.js → workspace-registry-73N4BGG4.js} +4 -4
  149. package/chunks/{workspace-service-2EHSPRJB.js → workspace-service-I5RUPSNV.js} +14 -12
  150. package/chunks/{workspace-skills-status-5VJ2D5HN.js → workspace-skills-status-DMK6VYDO.js} +11 -9
  151. package/chunks/{workspace-trust-reconciler-X2LZ6XCI.js → workspace-trust-reconciler-QX4RL3TC.js} +12 -10
  152. package/chunks/{write-file-CJK6SCCF.js → write-file-UGDD5UTS.js} +3 -3
  153. package/chunks/{zoom-image-BVW4RFYW.js → zoom-image-ZAHEO3YP.js} +1 -1
  154. package/cli.js +12 -12
  155. package/package.json +3 -3
  156. package/web-shell/assets/{arc-DDtoJrAW.js → arc-CHY4saMJ.js} +1 -1
  157. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BAInIW4O.js → architectureDiagram-3BPJPVTR-Bu6CwvHj.js} +1 -1
  158. package/web-shell/assets/{blockDiagram-GPEHLZMM-ChPDk7fP.js → blockDiagram-GPEHLZMM-XGt6iGf_.js} +1 -1
  159. package/web-shell/assets/{c4Diagram-AAUBKEIU-Cd9BJuUy.js → c4Diagram-AAUBKEIU-CBbYl19W.js} +1 -1
  160. package/web-shell/assets/channel-B40srHOa.js +1 -0
  161. package/web-shell/assets/{chunk-2J33WTMH-COQkLp56.js → chunk-2J33WTMH-BEhmVrdx.js} +1 -1
  162. package/web-shell/assets/{chunk-4BX2VUAB-GUJshQ_l.js → chunk-4BX2VUAB-fQLyE0Bg.js} +1 -1
  163. package/web-shell/assets/{chunk-55IACEB6-Boaa7c10.js → chunk-55IACEB6-yGdtyx4a.js} +1 -1
  164. package/web-shell/assets/{chunk-727SXJPM-CcRXaly2.js → chunk-727SXJPM-DYbX2GLo.js} +1 -1
  165. package/web-shell/assets/{chunk-AQP2D5EJ-BY0OARHh.js → chunk-AQP2D5EJ-DyKTEsYn.js} +1 -1
  166. package/web-shell/assets/{chunk-FMBD7UC4-DLFQfv0S.js → chunk-FMBD7UC4-D8Uy_GzX.js} +1 -1
  167. package/web-shell/assets/{chunk-ND2GUHAM-C_S0u-D2.js → chunk-ND2GUHAM-C8wNR2K7.js} +1 -1
  168. package/web-shell/assets/{chunk-QZHKN3VN-DP9m64hw.js → chunk-QZHKN3VN-BnybNxnt.js} +1 -1
  169. package/web-shell/assets/classDiagram-4FO5ZUOK-qumcXQW_.js +1 -0
  170. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-qumcXQW_.js +1 -0
  171. package/web-shell/assets/{cose-bilkent-S5V4N54A-CGY6zGE1.js → cose-bilkent-S5V4N54A-jq4uiFRp.js} +1 -1
  172. package/web-shell/assets/{dagre-BM42HDAG-yB7whKNn.js → dagre-BM42HDAG-Bs7oye1U.js} +1 -1
  173. package/web-shell/assets/{diagram-2AECGRRQ-Bdlc59La.js → diagram-2AECGRRQ-BHGGJNyM.js} +1 -1
  174. package/web-shell/assets/{diagram-5GNKFQAL-BUClP18L.js → diagram-5GNKFQAL-BJezVLGT.js} +1 -1
  175. package/web-shell/assets/{diagram-KO2AKTUF-aZm08kjn.js → diagram-KO2AKTUF-5JzQN_rL.js} +1 -1
  176. package/web-shell/assets/{diagram-LMA3HP47-7DGwEkxC.js → diagram-LMA3HP47-BlPYOgY9.js} +1 -1
  177. package/web-shell/assets/{diagram-OG6HWLK6-CAGKayxx.js → diagram-OG6HWLK6-CtMHEaFK.js} +1 -1
  178. package/web-shell/assets/{erDiagram-TEJ5UH35-CptoHHQi.js → erDiagram-TEJ5UH35-CRNdq2AB.js} +1 -1
  179. package/web-shell/assets/{flowDiagram-I6XJVG4X-CNOH0s7Q.js → flowDiagram-I6XJVG4X-De1WwLzu.js} +1 -1
  180. package/web-shell/assets/{ganttDiagram-6RSMTGT7-CCQuCU3y.js → ganttDiagram-6RSMTGT7-YbWfL5Zn.js} +1 -1
  181. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-B7gv9f4E.js → gitGraphDiagram-PVQCEYII-DzCN8bmd.js} +1 -1
  182. package/web-shell/assets/index-BDOGGGaN.css +5 -0
  183. package/web-shell/assets/{index-BoUPVvpf.js → index-CocPvF9Q.js} +1 -1
  184. package/web-shell/assets/index-DSH2KrMc.js +1771 -0
  185. package/web-shell/assets/{infoDiagram-5YYISTIA-Bb3KYEbR.js → infoDiagram-5YYISTIA-DLHoopnE.js} +1 -1
  186. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DWEzbAGi.js → ishikawaDiagram-YF4QCWOH-XnbU04SS.js} +1 -1
  187. package/web-shell/assets/{journeyDiagram-JHISSGLW-CmxwEqeb.js → journeyDiagram-JHISSGLW-CipPyEeJ.js} +1 -1
  188. package/web-shell/assets/{kanban-definition-UN3LZRKU-Ci0gDD8O.js → kanban-definition-UN3LZRKU-DrSeyE5d.js} +1 -1
  189. package/web-shell/assets/{linear-BqxZqGhS.js → linear-LrBKnAo_.js} +1 -1
  190. package/web-shell/assets/{mermaid.core-BDAFffHv.js → mermaid.core-C3U9UVmf.js} +5 -5
  191. package/web-shell/assets/{mindmap-definition-RKZ34NQL-Btvx-xvS.js → mindmap-definition-RKZ34NQL-DqRWgC9H.js} +1 -1
  192. package/web-shell/assets/{pieDiagram-4H26LBE5-CKAg7yG7.js → pieDiagram-4H26LBE5-BNXY5p6H.js} +1 -1
  193. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIt8E1mC.js → quadrantDiagram-W4KKPZXB-Ccj9QzE4.js} +1 -1
  194. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BA7mQWQJ.js → requirementDiagram-4Y6WPE33-CjPM2_gx.js} +1 -1
  195. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-D0JppnVU.js → sankeyDiagram-5OEKKPKP-C0RsvKbj.js} +1 -1
  196. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-29DIQFjB.js → sequenceDiagram-3UESZ5HK-ClN1P5z7.js} +1 -1
  197. package/web-shell/assets/{stateDiagram-AJRCARHV-iiXMdK--.js → stateDiagram-AJRCARHV-By0eiB2Y.js} +1 -1
  198. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Ds0WlK3F.js +1 -0
  199. package/web-shell/assets/{timeline-definition-PNZ67QCA-CeF7ngSW.js → timeline-definition-PNZ67QCA-g_iaSQgv.js} +1 -1
  200. package/web-shell/assets/{vennDiagram-CIIHVFJN-Beilq8D6.js → vennDiagram-CIIHVFJN-y9ZqJ-TD.js} +1 -1
  201. package/web-shell/assets/{wardley-L42UT6IY-DOYjY4zO.js → wardley-L42UT6IY-BVVfaxpF.js} +1 -1
  202. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-Dtqp8o18.js → wardleyDiagram-YWT4CUSO-D3ooZKZT.js} +1 -1
  203. package/web-shell/assets/{xychartDiagram-2RQKCTM6-cdAc0Dfv.js → xychartDiagram-2RQKCTM6-6GXrY6M1.js} +1 -1
  204. package/web-shell/index.html +2 -2
  205. package/chunks/chunk-R4ZA6GBK.js +0 -208
  206. package/web-shell/assets/channel-0OQklTfP.js +0 -1
  207. package/web-shell/assets/classDiagram-4FO5ZUOK-CZ4-apsu.js +0 -1
  208. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CZ4-apsu.js +0 -1
  209. package/web-shell/assets/index-D1YQXYsB.css +0 -5
  210. package/web-shell/assets/index-J4N7zCmU.js +0 -1768
  211. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CEGK3l80.js +0 -1
@@ -2,13 +2,13 @@
2
2
  "use strict";
3
3
  import {
4
4
  listCommand
5
- } from "./chunk-OW2BWT2P.js";
5
+ } from "./chunk-SCAZZ3Q4.js";
6
6
  import {
7
7
  serveCommand
8
- } from "./chunk-ZIKTCMQF.js";
8
+ } from "./chunk-LZZLUCRS.js";
9
9
  import {
10
10
  getErrorMessage as getErrorMessage2
11
- } from "./chunk-P5ULXPK5.js";
11
+ } from "./chunk-P2FK2HBV.js";
12
12
  import {
13
13
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
14
14
  ObservedChannelContactStore
@@ -33,7 +33,7 @@ import {
33
33
  collectProviderModelsForProtocol,
34
34
  getAuthTypeFromEnv,
35
35
  resolveCliGenerationConfig
36
- } from "./chunk-HWXGX534.js";
36
+ } from "./chunk-KTQGGPGV.js";
37
37
  import {
38
38
  resolveSkillSettings
39
39
  } from "./chunk-Z4X5MTRT.js";
@@ -53,14 +53,14 @@ import {
53
53
  registerToolCallDispatch,
54
54
  selectFirstModel,
55
55
  sessionsPath
56
- } from "./chunk-EISUQQPS.js";
56
+ } from "./chunk-ATMO54WE.js";
57
57
  import {
58
58
  getExtensionManager,
59
59
  requestChoicePluginNonInteractive,
60
60
  requestConsentNonInteractive,
61
61
  requestConsentOrFail,
62
62
  resolveExtensionCommandScope
63
- } from "./chunk-TWFFY5BP.js";
63
+ } from "./chunk-HADWBW5R.js";
64
64
  import {
65
65
  parseChannelConfig
66
66
  } from "./chunk-LHEC5V6G.js";
@@ -133,33 +133,33 @@ import {
133
133
  assembleMcpServers,
134
134
  getPendingGatedMcpServers,
135
135
  mcpCommand
136
- } from "./chunk-PNVPFARW.js";
136
+ } from "./chunk-MTCYGTWH.js";
137
137
  import {
138
138
  loadSettings
139
- } from "./chunk-HKI3KHAO.js";
139
+ } from "./chunk-JUWS2Z5K.js";
140
140
  import {
141
141
  detectSystemLanguage,
142
142
  getCurrentLanguage,
143
143
  initializeI18n,
144
144
  resolveLanguageSetting,
145
145
  t
146
- } from "./chunk-BL65MO72.js";
146
+ } from "./chunk-WP5VOXF7.js";
147
147
  import {
148
148
  loadEnvironment
149
- } from "./chunk-KP25NJNM.js";
149
+ } from "./chunk-T6HEQR2Q.js";
150
150
  import {
151
151
  resolveAcpChannelFallback,
152
152
  scrubAndReportInheritedLoaderEnv
153
- } from "./chunk-R4ZA6GBK.js";
153
+ } from "./chunk-VFMASYQA.js";
154
154
  import {
155
155
  getCliVersion
156
- } from "./chunk-ZV7LTLFE.js";
156
+ } from "./chunk-IOEZE2YT.js";
157
157
  import {
158
158
  getPackageJson
159
159
  } from "./chunk-VJNBRRZG.js";
160
160
  import {
161
161
  isWorkspaceTrusted
162
- } from "./chunk-YR7ZQ4RD.js";
162
+ } from "./chunk-ZOSTTOUJ.js";
163
163
  import {
164
164
  require_strip_json_comments
165
165
  } from "./chunk-NPQ5ZKRP.js";
@@ -201,7 +201,7 @@ import {
201
201
  unquoteCStylePath,
202
202
  updateChannelMemoryEntry,
203
203
  updateSetting
204
- } from "./chunk-47ZUMGGY.js";
204
+ } from "./chunk-XX7QFP34.js";
205
205
  import {
206
206
  nextFireTime,
207
207
  parseCron
@@ -2731,7 +2731,7 @@ var stopCommand = {
2731
2731
  if (argv["daemon-url"]) {
2732
2732
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2733
2733
  try {
2734
- const sdk = await import("./daemon-VSX3FHTY.js");
2734
+ const sdk = await import("./daemon-POSQPD3G.js");
2735
2735
  const client = new sdk.DaemonClient({
2736
2736
  baseUrl: argv["daemon-url"],
2737
2737
  ...token ? { token } : {}
@@ -2917,7 +2917,7 @@ var statusCommand = {
2917
2917
  if (argv["daemon-url"]) {
2918
2918
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2919
2919
  try {
2920
- const sdk = await import("./daemon-VSX3FHTY.js");
2920
+ const sdk = await import("./daemon-POSQPD3G.js");
2921
2921
  const client = new sdk.DaemonClient({
2922
2922
  baseUrl: argv["daemon-url"],
2923
2923
  ...token ? { token } : {}
@@ -3028,7 +3028,7 @@ var reloadCommand = {
3028
3028
  const token = resolveToken(argv.token);
3029
3029
  let sdk;
3030
3030
  try {
3031
- sdk = await import("./daemon-VSX3FHTY.js");
3031
+ sdk = await import("./daemon-POSQPD3G.js");
3032
3032
  } catch (err) {
3033
3033
  writeStderrLine(
3034
3034
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
@@ -3108,7 +3108,7 @@ var setCommand2 = {
3108
3108
  const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
3109
3109
  let sdk;
3110
3110
  try {
3111
- sdk = await import("./daemon-VSX3FHTY.js");
3111
+ sdk = await import("./daemon-POSQPD3G.js");
3112
3112
  } catch (error) {
3113
3113
  writeStderrLine(
3114
3114
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
@@ -3234,7 +3234,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
3234
3234
  }
3235
3235
  __name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
3236
3236
  async function loadDaemonSdk() {
3237
- return await import("./daemon-VSX3FHTY.js");
3237
+ return await import("./daemon-POSQPD3G.js");
3238
3238
  }
3239
3239
  __name(loadDaemonSdk, "loadDaemonSdk");
3240
3240
  function selectedChannelNames(channelsConfig, selection) {
@@ -4882,6 +4882,12 @@ function execGhWithRetry(args, options) {
4882
4882
  __name(execGhWithRetry, "execGhWithRetry");
4883
4883
  var ghHost;
4884
4884
  var HOSTNAME_RE = /^[A-Za-z0-9.-]+(?::\d+)?$/;
4885
+ var REPO_SEGMENT = /^[A-Za-z0-9._-]+$/;
4886
+ function isOwnerRepo(repo) {
4887
+ const parts = repo.split("/");
4888
+ return parts.length === 2 && parts.every((p) => REPO_SEGMENT.test(p) && p !== "." && p !== "..");
4889
+ }
4890
+ __name(isOwnerRepo, "isOwnerRepo");
4885
4891
  function setGhHost(host) {
4886
4892
  if (host === void 0 || host === "") {
4887
4893
  ghHost = void 0;
@@ -7096,6 +7102,8 @@ import { join as join9 } from "node:path";
7096
7102
  var DEADLINE_ENV = "QWEN_REVIEW_DEADLINE_EPOCH";
7097
7103
  var RESERVE_ENV = "QWEN_REVIEW_DEADLINE_RESERVE_SECONDS";
7098
7104
  var DEFAULT_RESERVE_SECONDS = 4800;
7105
+ var DEFAULT_COMPOSE_FLOOR_SECONDS = 1200;
7106
+ var COMPOSE_FLOOR_ENV = "QWEN_REVIEW_DEADLINE_COMPOSE_FLOOR_SECONDS";
7099
7107
  var DEFAULT_ROUND_SECONDS = 1800;
7100
7108
  var MIN_OBSERVED_ROUND_SECONDS = 600;
7101
7109
  var STAMPS_FILE = "budget-rounds.json";
@@ -7154,17 +7162,31 @@ function expectedRoundSeconds(planPath, round, nowMs = Date.now()) {
7154
7162
  return Math.max(MIN_OBSERVED_ROUND_SECONDS, maxSeconds);
7155
7163
  }
7156
7164
  __name(expectedRoundSeconds, "expectedRoundSeconds");
7157
- function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now()) {
7165
+ function readDeadlineSeconds(env) {
7158
7166
  const raw = env[DEADLINE_ENV];
7159
7167
  if (raw === void 0 || raw.trim() === "") return null;
7160
7168
  const deadline = Number(raw);
7161
7169
  if (!Number.isFinite(deadline) || deadline <= 0) return null;
7162
- let reserve = DEFAULT_RESERVE_SECONDS;
7163
- const reserveRaw = env[RESERVE_ENV];
7164
- if (reserveRaw !== void 0 && reserveRaw.trim() !== "") {
7165
- const r = Number(reserveRaw);
7166
- if (Number.isFinite(r) && r >= 0) reserve = r;
7170
+ return deadline;
7171
+ }
7172
+ __name(readDeadlineSeconds, "readDeadlineSeconds");
7173
+ function readNonNegativeSeconds(env, key, fallback) {
7174
+ const raw = env[key];
7175
+ if (raw !== void 0 && raw.trim() !== "") {
7176
+ const v = Number(raw);
7177
+ if (Number.isFinite(v) && v >= 0) return v;
7167
7178
  }
7179
+ return fallback;
7180
+ }
7181
+ __name(readNonNegativeSeconds, "readNonNegativeSeconds");
7182
+ function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now()) {
7183
+ const deadline = readDeadlineSeconds(env);
7184
+ if (deadline === null) return null;
7185
+ const reserve = readNonNegativeSeconds(
7186
+ env,
7187
+ RESERVE_ENV,
7188
+ DEFAULT_RESERVE_SECONDS
7189
+ );
7168
7190
  const remainingSeconds = Math.floor(deadline - nowMs / 1e3);
7169
7191
  if (remainingSeconds >= reserve + roundCostSeconds) return null;
7170
7192
  return {
@@ -7174,6 +7196,26 @@ function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now())
7174
7196
  };
7175
7197
  }
7176
7198
  __name(reverseAuditBudgetExhausted, "reverseAuditBudgetExhausted");
7199
+ function verifyBudgetExhausted(env, nowMs = Date.now()) {
7200
+ const deadline = readDeadlineSeconds(env);
7201
+ if (deadline === null) return null;
7202
+ const floor = readNonNegativeSeconds(
7203
+ env,
7204
+ COMPOSE_FLOOR_ENV,
7205
+ DEFAULT_COMPOSE_FLOOR_SECONDS
7206
+ );
7207
+ if (floor <= 0) return null;
7208
+ const remainingSeconds = Math.floor(deadline - nowMs / 1e3);
7209
+ if (remainingSeconds > floor) return null;
7210
+ return { remainingSeconds, composeFloorSeconds: floor };
7211
+ }
7212
+ __name(verifyBudgetExhausted, "verifyBudgetExhausted");
7213
+ function verifyBudgetMessage(spent) {
7214
+ const minutesLeft = Math.max(0, Math.floor(spent.remainingSeconds / 60));
7215
+ const floorMinutes = Math.round(spent.composeFloorSeconds / 60);
7216
+ return `VERIFY BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 at or below the ${floorMinutes}-minute floor compose-review and submission need, so no verification shard will be built. This is a termination rule, not an error: do not rebuild the verifier. Proceed to Step 6 NOW and compose. Findings still carrying \`\u2014 [unverified]\` keep that tag: compose-review caps the verdict on it and never treats an unverified finding as a confirmed blocker \u2014 everything earlier rounds confirmed still posts. A review that stops verifying here reports what it proved; one that keeps verifying past this floor is killed before it posts anything.`;
7217
+ }
7218
+ __name(verifyBudgetMessage, "verifyBudgetMessage");
7177
7219
  var BUDGET_STOP_PHRASE = "review time budget";
7178
7220
  function budgetStopDisclosure(round) {
7179
7221
  const which = round !== void 0 ? `round ${round}` : "the next round";
@@ -7196,6 +7238,45 @@ function budgetStopEntryZh(round) {
7196
7238
  return `${d.subjectZh}\u2014\u2014${d.reasonZh}`;
7197
7239
  }
7198
7240
  __name(budgetStopEntryZh, "budgetStopEntryZh");
7241
+ var ROUND_CAP_PHRASE = "reverse-audit round cap";
7242
+ function roundCapStopDisclosure(cap) {
7243
+ return {
7244
+ subject: "reverse audit",
7245
+ reason: `did not converge within the ${ROUND_CAP_PHRASE} of ${cap}`,
7246
+ subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
7247
+ reasonZh: `\u5728 ${cap} \u8F6E\u7684\u53CD\u5BA1\u8F6E\u6570\u4E0A\u9650\u5185\u672A\u6536\u655B`
7248
+ };
7249
+ }
7250
+ __name(roundCapStopDisclosure, "roundCapStopDisclosure");
7251
+ function roundCapStopEntry(cap) {
7252
+ const d = roundCapStopDisclosure(cap);
7253
+ return `${d.subject} \u2014 ${d.reason}`;
7254
+ }
7255
+ __name(roundCapStopEntry, "roundCapStopEntry");
7256
+ function roundCapStopEntryZh(cap) {
7257
+ const d = roundCapStopDisclosure(cap);
7258
+ return `${d.subjectZh}\u2014\u2014${d.reasonZh}`;
7259
+ }
7260
+ __name(roundCapStopEntryZh, "roundCapStopEntryZh");
7261
+ function writeRoundCapStop(planPath, cap, round, nowMs = Date.now()) {
7262
+ try {
7263
+ const dir = promptRecordDir(planPath);
7264
+ mkdirSync5(dir, { recursive: true });
7265
+ const stop = {
7266
+ cause: "round-cap",
7267
+ cap,
7268
+ entry: roundCapStopEntry(cap),
7269
+ entryZh: roundCapStopEntryZh(cap),
7270
+ round: round ?? null,
7271
+ remainingSeconds: 0,
7272
+ reserveSeconds: 0,
7273
+ atMs: nowMs
7274
+ };
7275
+ writeFileSync5(join9(dir, STOP_FILE), JSON.stringify(stop, null, 2));
7276
+ } catch {
7277
+ }
7278
+ }
7279
+ __name(writeRoundCapStop, "writeRoundCapStop");
7199
7280
  function writeBudgetStop(planPath, spent, round, nowMs = Date.now()) {
7200
7281
  try {
7201
7282
  const dir = promptRecordDir(planPath);
@@ -7234,13 +7315,16 @@ function reverseAuditBudgetMessage(spent, round) {
7234
7315
  const reserveMinutes = Math.round(spent.reserveSeconds / 60);
7235
7316
  const roundMinutes = Math.round(spent.expectedRoundSeconds / 60);
7236
7317
  const which = round !== void 0 ? `round ${round}` : "the next round";
7237
- return `BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 not enough for the ~${roundMinutes}-minute round being asked for plus the ${reserveMinutes}-minute reserve kept for its verification, compose-review and submission \u2014 so no further reverse-audit round will be built. This is the loop's termination rule, not an error: do not rebuild ${which} and do not relaunch auditors. A budget-stop marker has been recorded and compose-review will disclose it and cap the verdict itself; also add exactly this entry to unreviewedDimensions so the terminal report says it too \u2014 \`${budgetStopEntry(round)}\` \u2014 and proceed to Step 6 with the findings already confirmed. Spend what time remains only on verifying findings already in hand, composing, and submitting. A review that stops here still reports everything it proved; a review that runs past its deadline is killed holding all of it.`;
7318
+ return `BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 not enough for the ~${roundMinutes}-minute round being asked for plus the ${reserveMinutes}-minute reserve kept for its verification, compose-review and submission \u2014 so no further reverse-audit round will be built. This is the loop's termination rule, not an error: do not rebuild ${which} and do not relaunch auditors. A budget-stop marker has been recorded and compose-review will disclose it and cap the verdict itself; also add exactly this entry to unreviewedDimensions so the terminal report says it too \u2014 \`${budgetStopEntry(round)}\` \u2014 and proceed to Step 6. Verify the last round's findings ONLY through \`agent-prompt --role verify\` (never a hand-rolled agent) \u2014 it is gated on the compose floor and will refuse once too little time remains, leaving any still-\`[unverified]\` findings tagged for compose-review to cap \u2014 then compose and submit. Do NOT re-verify findings already confirmed in earlier rounds. A review that stops here still reports everything it proved; a review that runs past its deadline is killed holding all of it.`;
7238
7319
  }
7239
7320
  __name(reverseAuditBudgetMessage, "reverseAuditBudgetMessage");
7240
7321
 
7241
7322
  // packages/cli/src/commands/review/lib/budget.ts
7242
7323
  init_esbuild_shims();
7243
7324
  var SWEEP_FLOOR = 25;
7325
+ var MAX_REVERSE_AUDIT_ROUNDS = 5;
7326
+ var HUGE_REVERSE_AUDIT_ROUNDS = 3;
7327
+ var HUGE_DIFF_FLOOR = 3e3;
7244
7328
  var SPECIALIST_FLOOR = 80;
7245
7329
  var LINES_PER_ANGLE = 60;
7246
7330
  var MIN_INLINE_ANGLES = 3;
@@ -7262,16 +7346,28 @@ function reviewBudget(input) {
7262
7346
  return {
7263
7347
  inlineAngles,
7264
7348
  sweep: effective >= SWEEP_FLOOR,
7265
- specialistCap: src >= SPECIALIST_FLOOR ? 2 : 0,
7349
+ // Agent 8 sheds in the huge zone. A specialist is a whole-diff pass on
7350
+ // top of the base fan-out, and on a diff too big to finish that extra
7351
+ // pass is the marginal cost that guarantees zero posted output — while
7352
+ // the per-chunk fan-out already covers the ground. Finishability over
7353
+ // an added depth pass, in exactly the band where the review otherwise
7354
+ // posts nothing.
7355
+ specialistCap: src >= SPECIALIST_FLOOR && effective < HUGE_DIFF_FLOOR ? 2 : 0,
7266
7356
  verifyShard: VERIFY_SHARD,
7267
7357
  agentToolBudget: clamp(
7268
7358
  MIN_AGENT_TOOL_BUDGET + Math.floor(effective / LINES_PER_TOOL_CALL),
7269
7359
  MIN_AGENT_TOOL_BUDGET,
7270
7360
  MAX_AGENT_TOOL_BUDGET
7271
- )
7361
+ ),
7362
+ reverseAuditRounds: effective >= HUGE_DIFF_FLOOR ? HUGE_REVERSE_AUDIT_ROUNDS : MAX_REVERSE_AUDIT_ROUNDS
7272
7363
  };
7273
7364
  }
7274
7365
  __name(reviewBudget, "reviewBudget");
7366
+ function reverseAuditRoundCap(budget) {
7367
+ const v = budget?.reverseAuditRounds;
7368
+ return typeof v === "number" && Number.isInteger(v) && v >= HUGE_REVERSE_AUDIT_ROUNDS && v <= MAX_REVERSE_AUDIT_ROUNDS ? v : MAX_REVERSE_AUDIT_ROUNDS;
7369
+ }
7370
+ __name(reverseAuditRoundCap, "reverseAuditRoundCap");
7275
7371
  var MAX_TOTAL_TOOL_CALLS = 200;
7276
7372
  function launchToolBudget(planBudget, territoryLines, mandatoryReads) {
7277
7373
  const base = clamp(
@@ -7293,10 +7389,10 @@ function launchToolBudget(planBudget, territoryLines, mandatoryReads) {
7293
7389
  );
7294
7390
  }
7295
7391
  __name(launchToolBudget, "launchToolBudget");
7296
- var BUDGET_GAP_LINE_RE = /^[ \t]*(?:[-*+]|\d+[.)])?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+?)[ \t]*$/i;
7392
+ var BUDGET_GAP_LINE_RE = /^(?:[ \t]*(?:[-*+]|\d+[.)]))?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+)$/i;
7297
7393
  var GAP_HINT_RE = /budget gap|预算(?:缺口|不足|用尽)/i;
7298
7394
  var INLINE_BUDGET_GAP_RE = /(?:budget gap|预算(?:缺口|不足|用尽))[*_~`]{0,3}[ \t]*[::]/i;
7299
- var PLACEHOLDER_GAP_RE = /^(?:<[^>]*>|none\b.*|n\/a\b.*|nothing\b.*|no (?:gaps?|checks?)\b.*|[-—*_~`]+)$/i;
7395
+ var PLACEHOLDER_GAP_RE = /^(?:<[^>]*>$|[-—*_~`]+$|(?:none|n\/a|nothing|no (?:gaps?|checks?))\b(?:[.!…,;:\s]*$|\s+(?:skipped|found|to report)\b[.!…,;:\s]*$|\s*[-—–]\s*(?:stayed\s+(?:under|within|below)\s+budget\b[.!…,;:\s]*$|(?:all|every(?:thing)?|planned|further|no further)\b(?:(?!\b(?:but|except|excepting|excluding)\b).)*(?<!\b(?:none|nothing|no|zero|never|not)\s)\b(?:complete[ds]?|done|finished|covered)\b[.!…,;:\s]*$)|\s*\(\s*(?:all|every(?:thing)?)\b(?:(?!\b(?:but|except|excepting|excluding)\b)[^()])*(?<!\b(?:none|nothing|no|zero|never|not)\s)\b(?:complete[ds]?|done|finished|covered)\b[.!…,;:\s]*\)\s*$))/i;
7300
7396
  var MAX_GAP_LENGTH = 160;
7301
7397
  var MAX_GAPS_PER_AGENT = 8;
7302
7398
  var DANGEROUS_CHARS_RE = (
@@ -7326,6 +7422,13 @@ function stripWrappers(s) {
7326
7422
  return out;
7327
7423
  }
7328
7424
  __name(stripWrappers, "stripWrappers");
7425
+ var TRAILING_GAP_CHAR_RE = /[.!…,;:\s]/;
7426
+ function stripTrailingGapChars(s) {
7427
+ let end = s.length;
7428
+ while (end > 0 && TRAILING_GAP_CHAR_RE.test(s.charAt(end - 1))) end--;
7429
+ return s.slice(0, end);
7430
+ }
7431
+ __name(stripTrailingGapChars, "stripTrailingGapChars");
7329
7432
  function truncateGap(s) {
7330
7433
  const points = [...s];
7331
7434
  return points.length > MAX_GAP_LENGTH ? `${points.slice(0, MAX_GAP_LENGTH).join("")}\u2026` : s;
@@ -7343,7 +7446,8 @@ function budgetGapDisclosures(finalText) {
7343
7446
  }
7344
7447
  if (inFence) continue;
7345
7448
  if (/^[ \t]*>/.test(line)) continue;
7346
- const m = BUDGET_GAP_LINE_RE.exec(line.replace(DANGEROUS_CHARS_RE, " "));
7449
+ const sanitized = line.replace(DANGEROUS_CHARS_RE, " ").trimEnd();
7450
+ const m = BUDGET_GAP_LINE_RE.exec(sanitized);
7347
7451
  if (!m) continue;
7348
7452
  let raw = m[2] ?? "";
7349
7453
  if (m[1] === "`") {
@@ -7351,11 +7455,12 @@ function budgetGapDisclosures(finalText) {
7351
7455
  raw = raw.slice(0, -1);
7352
7456
  }
7353
7457
  raw = stripWrappers(raw.trim()).trim();
7354
- const normalized = raw.replace(/[.!…,;:\s]+$/, "").trim();
7355
- if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(normalized)) {
7458
+ const normalized = stripTrailingGapChars(raw).trim();
7459
+ const unparenthesized = normalized.startsWith("(") && normalized.endsWith(")") ? normalized.slice(1, -1).trim() : normalized;
7460
+ if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(unparenthesized)) {
7356
7461
  continue;
7357
7462
  }
7358
- const key = normalized.toLowerCase();
7463
+ const key = stripTrailingGapChars(unparenthesized).toLowerCase();
7359
7464
  if (seen.has(key)) continue;
7360
7465
  seen.add(key);
7361
7466
  gaps.push(truncateGap(raw));
@@ -8132,6 +8237,82 @@ function withMarker(line) {
8132
8237
  return line.startsWith(CRITICAL_PREFIX) ? line : `${CRITICAL_PREFIX} ${line}`;
8133
8238
  }
8134
8239
  __name(withMarker, "withMarker");
8240
+ function planPrIdentity(plan) {
8241
+ if (typeof plan !== "object" || plan === null) return null;
8242
+ const p = plan;
8243
+ const ownerRepo = typeof p.ownerRepo === "string" && isOwnerRepo(p.ownerRepo) ? p.ownerRepo : null;
8244
+ const prNumber = isPositivePrNumber(p.prNumber) ? String(p.prNumber) : null;
8245
+ const host = typeof p.host === "string" && HOSTNAME_RE.test(p.host) ? p.host : null;
8246
+ return ownerRepo && prNumber ? { ownerRepo, prNumber, host } : null;
8247
+ }
8248
+ __name(planPrIdentity, "planPrIdentity");
8249
+ function prIdentityFromPlan(planPath) {
8250
+ if (!planPath) return null;
8251
+ try {
8252
+ return planPrIdentity(JSON.parse(readFileSync10(planPath, "utf8")));
8253
+ } catch {
8254
+ return null;
8255
+ }
8256
+ }
8257
+ __name(prIdentityFromPlan, "prIdentityFromPlan");
8258
+ function linkifyCommentRefs(text, pr) {
8259
+ if (!pr || text.includes("](")) return text;
8260
+ const host = (resolveGhHost(pr.host ?? getGhHost()) ?? "github.com").toLowerCase().replace(/:0*443$/, "").replace(/\.$/, "").replace(/^www\.github\.com$/, "github.com");
8261
+ const base = `https://${host}/${pr.ownerRepo}/pull/${pr.prNumber}`;
8262
+ const commentRef = host === "github.com" ? /\b(issue-level )?comment (\d{6,})\b/gi : /\b(issue-level )?comment (\d+)\b/gi;
8263
+ const issueLevelEntry = /\bissue(?:-level)?\s+comment\b/i.test(text);
8264
+ return text.replace(
8265
+ commentRef,
8266
+ (_m, issueLevel, id) => issueLevel || issueLevelEntry ? `[${issueLevel ?? ""}comment ${id}](${base}#issuecomment-${id})` : `[comment ${id}](${base}#discussion_r${id})`
8267
+ );
8268
+ }
8269
+ __name(linkifyCommentRefs, "linkifyCommentRefs");
8270
+ function formatCannotTell(cannotTell, pr) {
8271
+ const parsed = cannotTell.map((raw) => {
8272
+ const unmarked = raw.startsWith(CRITICAL_PREFIX) ? raw.slice(CRITICAL_PREFIX.length).trim() : raw;
8273
+ const line = linkifyCommentRefs(
8274
+ unmarked.includes("\n") ? unmarked.split("\n").map((seg) => seg.trim()).filter((seg) => seg !== "").join(" ") : unmarked,
8275
+ pr
8276
+ );
8277
+ const idx = line.indexOf(" \u2014 ");
8278
+ return idx === -1 ? { head: line, reason: null } : {
8279
+ head: line.slice(0, idx),
8280
+ reason: line.slice(idx + 3).trim() || null
8281
+ };
8282
+ });
8283
+ const groups = [];
8284
+ const byReason = /* @__PURE__ */ new Map();
8285
+ for (const p of parsed) {
8286
+ const existing = p.reason === null ? void 0 : byReason.get(p.reason);
8287
+ if (existing) {
8288
+ existing.heads.push(p.head);
8289
+ continue;
8290
+ }
8291
+ const group = { reason: p.reason, heads: [p.head] };
8292
+ groups.push(group);
8293
+ if (p.reason !== null) byReason.set(p.reason, group);
8294
+ }
8295
+ const lines = [];
8296
+ for (const { reason, heads } of groups) {
8297
+ if (heads.length === 1) {
8298
+ lines.push(
8299
+ `- ${CRITICAL_PREFIX} ${heads[0]}${reason === null ? "" : ` \u2014 ${reason}`}`
8300
+ );
8301
+ } else {
8302
+ lines.push(
8303
+ `- ${CRITICAL_PREFIX} ${heads.length} entries \u2014 ${reason}:`,
8304
+ ...heads.map((head) => ` - ${head}`)
8305
+ );
8306
+ }
8307
+ }
8308
+ return {
8309
+ en: `Unresolved, please confirm:
8310
+
8311
+ ${lines.join("\n")}`,
8312
+ zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A\u5171 ${cannotTell.length} \u6761\uFF08\u539F\u6587\u672A\u7FFB\u8BD1\uFF0C\u5217\u8868\u89C1\u4E0A\u65B9\u82F1\u6587\u90E8\u5206\uFF09\u3002`
8313
+ };
8314
+ }
8315
+ __name(formatCannotTell, "formatCannotTell");
8135
8316
  function toCount(value, field) {
8136
8317
  if (value === void 0 || value === null) return 0;
8137
8318
  if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
@@ -8153,7 +8334,7 @@ function toStringList(value, field) {
8153
8334
  }
8154
8335
  __name(toStringList, "toStringList");
8155
8336
  function stripReviewFooter(entry) {
8156
- return entry.replace(REVIEW_FOOTER_RE, "");
8337
+ return entry.includes(FOOTER_MARKER) ? entry.replace(REVIEW_FOOTER_RE, "") : entry;
8157
8338
  }
8158
8339
  __name(stripReviewFooter, "stripReviewFooter");
8159
8340
  function toBool(value, field) {
@@ -8236,12 +8417,16 @@ function composeReviewBody(input, cliVersion) {
8236
8417
  if (input.planPath) {
8237
8418
  const stop = readBudgetStop(input.planPath);
8238
8419
  if (stop !== null) {
8420
+ const isRoundCap = stop.cause === "round-cap";
8421
+ const phrase = isRoundCap ? ROUND_CAP_PHRASE : BUDGET_STOP_PHRASE;
8239
8422
  for (let i = unreviewed.length - 1; i >= 0; i--) {
8240
- if (unreviewed[i].includes(BUDGET_STOP_PHRASE)) {
8423
+ if (unreviewed[i].includes(phrase)) {
8241
8424
  unreviewed.splice(i, 1);
8242
8425
  }
8243
8426
  }
8244
- budgetEntry = budgetStopDisclosure(stop.round ?? void 0);
8427
+ budgetEntry = isRoundCap ? roundCapStopDisclosure(
8428
+ typeof stop.cap === "number" ? stop.cap : MAX_REVERSE_AUDIT_ROUNDS
8429
+ ) : budgetStopDisclosure(stop.round ?? void 0);
8245
8430
  coverageEntries.push(budgetEntry);
8246
8431
  }
8247
8432
  }
@@ -8620,12 +8805,7 @@ ${footer}`;
8620
8805
  zh: reason ? `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014${reasonZh}\u3002` : `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u3002`
8621
8806
  });
8622
8807
  }
8623
- const cannotTellBlock = cannotTell.length === 0 ? [] : [
8624
- {
8625
- en: `Unresolved, please confirm: ${cannotTell.map((l) => withMarker(l)).join(" ")}`,
8626
- zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A${cannotTell.map((l) => withMarker(l)).join(" ")}`
8627
- }
8628
- ];
8808
+ const cannotTellBlock = cannotTell.length === 0 ? [] : [formatCannotTell(cannotTell, prIdentityFromPlan(input.planPath))];
8629
8809
  const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l)).map((l) => ({ en: l, zh: l }));
8630
8810
  const contextUnavailableClause = {
8631
8811
  en: "Reviewed diff-only \u2014 the PR\u2019s existing discussion could not be fetched, so this is not an approval and not a no-blockers claim.",
@@ -8747,6 +8927,7 @@ ${footer}`;
8747
8927
  zh: `${suggestionsDiscarded} \u6761\u5EFA\u8BAE\u7EA7\u53D1\u73B0\u65E0\u6CD5\u951A\u5B9A\u5230\u6539\u52A8\u884C\uFF0C\u5DF2\u4E22\u5F03\uFF1B\u6B64\u5904\u65E0\u9700\u8FDB\u4E00\u6B65\u5904\u7406\u3002`
8748
8928
  });
8749
8929
  }
8930
+ const openerCount = clauses.length;
8750
8931
  clauses.push(...cannotTellBlock);
8751
8932
  clauses.push(...notReviewedParts);
8752
8933
  clauses.push(...unverifiedTagsBlock);
@@ -8756,9 +8937,19 @@ ${footer}`;
8756
8937
  if (downgradedFrom === "Request changes" || criticalsUnverified) {
8757
8938
  clauses.push(...bodyCriticalBlock);
8758
8939
  }
8940
+ const openerParts = clauses.slice(0, openerCount);
8941
+ const paragraphs = [
8942
+ ...openerParts.length > 0 ? [
8943
+ {
8944
+ en: openerParts.map((c2) => c2.en).join(" "),
8945
+ zh: openerParts.map((c2) => c2.zh).join(" ")
8946
+ }
8947
+ ] : [],
8948
+ ...clauses.slice(openerCount)
8949
+ ];
8759
8950
  return {
8760
8951
  event: event2,
8761
- body: render(clauses, " "),
8952
+ body: render(paragraphs, "\n\n"),
8762
8953
  baseEvent,
8763
8954
  cappedBy,
8764
8955
  downgraded,
@@ -8956,14 +9147,14 @@ function bilingualFromPlan(planPath, fetchPrBody2 = fetchPrBodyViaGh) {
8956
9147
  } catch {
8957
9148
  return false;
8958
9149
  }
8959
- if (typeof plan?.prDescriptionHasHan === "boolean") {
8960
- return plan.prDescriptionHasHan;
9150
+ const han = plan?.prDescriptionHasHan;
9151
+ if (typeof han === "boolean") {
9152
+ return han;
8961
9153
  }
8962
- const ownerRepo = typeof plan?.ownerRepo === "string" && plan.ownerRepo ? plan.ownerRepo : void 0;
8963
- const prNumber = isPositivePrNumber(plan?.prNumber) ? String(plan.prNumber) : void 0;
8964
- if (!ownerRepo || !prNumber) return false;
9154
+ const pr = planPrIdentity(plan);
9155
+ if (!pr) return false;
8965
9156
  try {
8966
- return new RegExp("\\p{Script=Han}", "u").test(fetchPrBody2(ownerRepo, prNumber));
9157
+ return new RegExp("\\p{Script=Han}", "u").test(fetchPrBody2(pr.ownerRepo, pr.prNumber));
8967
9158
  } catch {
8968
9159
  return false;
8969
9160
  }
@@ -13580,7 +13771,6 @@ import { dirname as dirname16, join as join14, resolve as resolve17 } from "node
13580
13771
  init_esbuild_shims();
13581
13772
  import { readFileSync as readFileSync20, statSync as statSync11 } from "node:fs";
13582
13773
  import { resolve as resolve16, sep as sep6 } from "node:path";
13583
- var REVERSE_AUDIT_MAX_ROUNDS = 5;
13584
13774
  var RECORD_KEY_RE = /^reverse-audit--chunk-(\d+)--round-(\d+)--[0-9a-f]+$/;
13585
13775
  var REVERSE_AUDIT_MARKER = "reverse-audit";
13586
13776
  function bakedRanges(prompt, diffPath) {
@@ -13745,8 +13935,9 @@ function scheduleReverseAuditRound(planPath, chunkIds, round, env = process.env,
13745
13935
  dryRounds: [lastTwo[0].round, lastTwo[1].round],
13746
13936
  // The next even round — this branch only runs on odd rounds, so
13747
13937
  // that is always round + 1. Whether the cap allows it is the note
13748
- // composer's question, not the schedule's (see
13749
- // REVERSE_AUDIT_MAX_ROUNDS).
13938
+ // composer's question, not the schedule's: the plan's cap
13939
+ // (`reverseAuditRoundCap` in budget.ts, floored at the huge-diff
13940
+ // tier's 3) is what the admission gate enforces.
13750
13941
  nextColdCheck: round + 1
13751
13942
  });
13752
13943
  }
@@ -14699,7 +14890,15 @@ function requireAuditableChunks(report) {
14699
14890
  return chunks;
14700
14891
  }
14701
14892
  __name(requireAuditableChunks, "requireAuditableChunks");
14702
- function admitReverseAuditRound(planPath, round) {
14893
+ function admitReverseAuditRound(planPath, round, cap) {
14894
+ if (typeof round === "number" && round > cap) {
14895
+ writeRoundCapStop(planPath, cap, round);
14896
+ writeStderrLine(
14897
+ `ROUND CAP: the plan's reverse-audit round cap is ${cap}, and round ${round} is past it. This is a termination rule, not an error \u2014 do not rebuild or retry. A marker has been recorded and compose-review will cap the verdict; still add \`${roundCapStopEntry(cap)}\` to unreviewedDimensions so the terminal report agrees. If the cap round reported findings whose verdicts have not landed, launch their verifiers alone and wait, then proceed to Step 6.`
14898
+ );
14899
+ process.exitCode = 4;
14900
+ return false;
14901
+ }
14703
14902
  const spent = reverseAuditBudgetExhausted(
14704
14903
  process.env,
14705
14904
  expectedRoundSeconds(planPath, round)
@@ -14723,7 +14922,8 @@ __name(refuseConverged, "refuseConverged");
14723
14922
  function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14724
14923
  const chunks = requireAuditableChunks(report);
14725
14924
  let schedule = null;
14726
- if (role === "reverse-audit" && round !== void 0 && round >= 3) {
14925
+ const retirementReadsFrom = 3;
14926
+ if (role === "reverse-audit" && round !== void 0 && round >= retirementReadsFrom) {
14727
14927
  try {
14728
14928
  schedule = scheduleReverseAuditRound(
14729
14929
  planPath,
@@ -14740,7 +14940,11 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14740
14940
  refuseConverged();
14741
14941
  return;
14742
14942
  }
14743
- if (role === "reverse-audit" && !admitReverseAuditRound(planPath, round)) {
14943
+ if (role === "reverse-audit" && !admitReverseAuditRound(
14944
+ planPath,
14945
+ round,
14946
+ reverseAuditRoundCap(report.budget)
14947
+ )) {
14744
14948
  return;
14745
14949
  }
14746
14950
  const dueSet = schedule === null ? null : new Set(schedule.due);
@@ -14772,10 +14976,11 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14772
14976
  ` + printed;
14773
14977
  });
14774
14978
  const scope = skipped.length === 0 ? "one per chunk" : `one per chunk still under audit (${skipped.length} retired chunk(s) skipped; the retirement note after the end-of-round line says which \u2014 relay it to the terminal)`;
14979
+ const planRoundCap = reverseAuditRoundCap(report.budget);
14775
14980
  const retirementNote = skipped.length === 0 ? [] : [
14776
14981
  `retirement: a chunk whose two most recent audits are substantive dry receipts is cold-checked on alternating rounds instead of audited on every one; a cold check that yields returns it to every-round auditing. Skipped this round:
14777
14982
  ` + skipped.map(
14778
- (s) => `chunk ${s.chunkId} \u2014 retired: dry in rounds ${s.dryRounds[0]} and ${s.dryRounds[1]}, ` + (s.nextColdCheck > REVERSE_AUDIT_MAX_ROUNDS ? `certificate final \u2014 the ${REVERSE_AUDIT_MAX_ROUNDS}-round hard cap leaves the loop no round for a cold check` : `next cold check round ${s.nextColdCheck}`)
14983
+ (s) => `chunk ${s.chunkId} \u2014 retired: dry in rounds ${s.dryRounds.join(" and ")}, ` + (s.nextColdCheck > planRoundCap ? `certificate final \u2014 the ${planRoundCap}-round cap leaves the loop no round for a cold check` : `next cold check round ${s.nextColdCheck}`)
14779
14984
  ).join("\n")
14780
14985
  ];
14781
14986
  writeStdoutLine(
@@ -14942,9 +15147,21 @@ function runAgentPrompt(args) {
14942
15147
  );
14943
15148
  }
14944
15149
  }
14945
- if (args.role === "reverse-audit" && !hasChunk && !args.allChunks && !admitReverseAuditRound(args.plan, args.round)) {
15150
+ if (args.role === "reverse-audit" && !hasChunk && !args.allChunks && !admitReverseAuditRound(
15151
+ args.plan,
15152
+ args.round,
15153
+ reverseAuditRoundCap(report.budget)
15154
+ )) {
14946
15155
  return;
14947
15156
  }
15157
+ if (args.role === "verify") {
15158
+ const spent = verifyBudgetExhausted(process.env);
15159
+ if (spent !== null) {
15160
+ writeStderrLine(verifyBudgetMessage(spent));
15161
+ process.exitCode = 4;
15162
+ return;
15163
+ }
15164
+ }
14948
15165
  if (args.role === "reverse-audit" && hasChunk && !readRoundStamps(args.plan).some((s) => s.round === (args.round ?? null))) {
14949
15166
  if (args.round !== void 0) {
14950
15167
  let schedule = null;
@@ -14964,7 +15181,12 @@ function runAgentPrompt(args) {
14964
15181
  return;
14965
15182
  }
14966
15183
  }
14967
- if (!admitReverseAuditRound(args.plan, args.round)) return;
15184
+ if (!admitReverseAuditRound(
15185
+ args.plan,
15186
+ args.round,
15187
+ reverseAuditRoundCap(report.budget)
15188
+ ))
15189
+ return;
14968
15190
  }
14969
15191
  if (args.allChunks && args.role && findingsContent !== void 0) {
14970
15192
  runAllChunks(
@@ -15021,7 +15243,7 @@ function runAgentPrompt(args) {
15021
15243
  __name(runAgentPrompt, "runAgentPrompt");
15022
15244
  var agentPromptCommand = {
15023
15245
  command: "agent-prompt",
15024
- describe: "Build a review agent's launch prompt from the plan (the diff path, its line ranges and the agent's own brief are welded in, not left to the caller to remember). Exit codes: 0 built; 4 the review time budget refused another reverse-audit round (a termination rule, not an error \u2014 see the BUDGET line on stderr); 5 the reverse audit CONVERGED \u2014 every chunk holds two consecutive substantive dry audits and none is due a cold check, so stop the loop and proceed to Step 6 (also a termination rule, and a clean one: no disclosure is owed); anything else is a bad call or a broken plan.",
15246
+ describe: "Build a review agent's launch prompt from the plan (the diff path, its line ranges and the agent's own brief are welded in, not left to the caller to remember). Exit codes: 0 built; 4 a build was refused \u2014 the review time budget refused another reverse-audit round (BUDGET line on stderr), the plan's round cap refused one (ROUND CAP line), or the compose floor refused a verifier so compose/submit still fit (VERIFY BUDGET line) \u2014 all termination rules, not errors: stop and compose, do not retry; 5 the reverse audit CONVERGED \u2014 every chunk holds two consecutive substantive dry audits and none is due a cold check, so stop the loop and proceed to Step 6 (also a termination rule, and a clean one: no disclosure is owed); anything else is a bad call or a broken plan.",
15025
15247
  builder: /* @__PURE__ */ __name((yargs) => yargs.option("plan", {
15026
15248
  type: "string",
15027
15249
  demandOption: true,
@@ -17527,15 +17749,9 @@ function inconsistencies(payload, event2) {
17527
17749
  return problems;
17528
17750
  }
17529
17751
  __name(inconsistencies, "inconsistencies");
17530
- var REPO_SEGMENT = /^[A-Za-z0-9._-]+$/;
17531
- function isRepo(repo) {
17532
- const parts = repo.split("/");
17533
- return parts.length === 2 && parts.every((p) => REPO_SEGMENT.test(p) && p !== "." && p !== "..");
17534
- }
17535
- __name(isRepo, "isRepo");
17536
17752
  function runSubmit(args, cliVersion = "unknown") {
17537
17753
  setGhHost(args.host);
17538
- if (!isRepo(args.repo)) {
17754
+ if (!isOwnerRepo(args.repo)) {
17539
17755
  throw new Error(
17540
17756
  `--repo ${JSON.stringify(args.repo)} is not <owner>/<repo>.`
17541
17757
  );
@@ -20923,10 +21139,10 @@ var updateCommand3 = {
20923
21139
  stdioHelpers,
20924
21140
  { updateEventEmitter }
20925
21141
  ] = await Promise.all([
20926
- import("./settings-BRAOSJIM.js"),
20927
- import("./updateCheck-EZMBTEIR.js"),
20928
- import("./installationInfo-BWFHT7WU.js"),
20929
- import("./standalone-update-DJN2R3YW.js"),
21142
+ import("./settings-EQBUAQ7Y.js"),
21143
+ import("./updateCheck-AXWSO7KA.js"),
21144
+ import("./installationInfo-3YUGIP36.js"),
21145
+ import("./standalone-update-2W26SRRO.js"),
20930
21146
  import("./stdioHelpers-7A2EE64Z.js"),
20931
21147
  import("./updateEventEmitter-5MKC7BLQ.js")
20932
21148
  ]);
@@ -22088,7 +22304,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
22088
22304
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
22089
22305
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
22090
22306
  terminalImageRenderSupportProvider: interactive ? async () => {
22091
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-PJM7663W.js");
22307
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-S5WPPQKH.js");
22092
22308
  return getTerminalImageRenderSupport();
22093
22309
  } : void 0,
22094
22310
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),