@qwen-code/qwen-code 0.21.9 → 0.21.10

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 (218) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +1 -1
  2. package/bundled/qc-helper/docs/features/status-line.md +13 -13
  3. package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
  4. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +14 -10
  5. package/bundled/review/SKILL.md +2 -2
  6. package/chunks/{MaxSizedBox-6BZANW7X.js → MaxSizedBox-FKXYULMW.js} +5 -5
  7. package/chunks/{StandaloneSessionPicker-VDC5KE7T.js → StandaloneSessionPicker-OQS3M7AY.js} +19 -19
  8. package/chunks/{acp-startup-profiler-B5BYAMYQ.js → acp-startup-profiler-VNTFWYAC.js} +2 -2
  9. package/chunks/{acpAgent-F2NSBCUF.js → acpAgent-AGS6HLQQ.js} +95 -43
  10. package/chunks/{agent-VOHJOEBB.js → agent-4NCVO27U.js} +5 -5
  11. package/chunks/{agent-headless-J5NFOPHP.js → agent-headless-HYEHZFH6.js} +5 -5
  12. package/chunks/{anthropicContentGenerator-SSFE2753.js → anthropicContentGenerator-D3Y4RFT4.js} +1 -1
  13. package/chunks/{bridge-NQIZZLAS.js → bridge-FHINXZMN.js} +8 -8
  14. package/chunks/{channel-settings-store-VIY2OENO.js → channel-settings-store-OXYG5S5X.js} +11 -11
  15. package/chunks/{channel-worker-group-MSHT6CWR.js → channel-worker-group-WQP4RCDO.js} +3 -3
  16. package/chunks/{channel-worker-manager-XXD3GDSK.js → channel-worker-manager-MRDFAKIM.js} +3 -3
  17. package/chunks/{chunk-7AEPJGL4.js → chunk-26CXSA6V.js} +1 -1
  18. package/chunks/{chunk-KTQGGPGV.js → chunk-2PLNY5TN.js} +4 -4
  19. package/chunks/{chunk-G2TX5ZXC.js → chunk-47PEPJO7.js} +3 -3
  20. package/chunks/{chunk-3XVDTHBJ.js → chunk-4MKXUHXY.js} +2 -2
  21. package/chunks/{chunk-D7BXVKSF.js → chunk-4WL6SY4F.js} +1 -1
  22. package/chunks/{chunk-P3RBMQ4P.js → chunk-5MZCSWI4.js} +4 -4
  23. package/chunks/{chunk-LP2QGNSP.js → chunk-624NHDGB.js} +3 -1
  24. package/chunks/{chunk-FBMCDU63.js → chunk-6LP743KE.js} +4 -4
  25. package/chunks/{chunk-II6G3EY6.js → chunk-7GTMV7UE.js} +339 -213
  26. package/chunks/{chunk-4XQNB3KN.js → chunk-A7XMDZRI.js} +2 -2
  27. package/chunks/{chunk-PNBBJOCP.js → chunk-AAE6SR4Q.js} +1 -1
  28. package/chunks/{chunk-JUWS2Z5K.js → chunk-ABVRJU3D.js} +5 -5
  29. package/chunks/{chunk-IOEZE2YT.js → chunk-AEL7KN2O.js} +1 -1
  30. package/chunks/{chunk-OGDIJKHK.js → chunk-AQAJJMRR.js} +1 -1
  31. package/chunks/{chunk-AKJQSWV4.js → chunk-BSI645OU.js} +2 -2
  32. package/chunks/{chunk-FCLHHEUK.js → chunk-D27I6YJT.js} +11 -11
  33. package/chunks/{chunk-P2FK2HBV.js → chunk-DCZEPFB4.js} +2 -2
  34. package/chunks/{chunk-GAKGOXTC.js → chunk-EBZ6BJTF.js} +1 -1
  35. package/chunks/{chunk-KSAFZ5TA.js → chunk-ECWR5LQR.js} +1 -1
  36. package/chunks/{chunk-XX7QFP34.js → chunk-EI3NWELG.js} +116 -62
  37. package/chunks/{chunk-P4ZEZSJZ.js → chunk-F24A2JBM.js} +260 -65
  38. package/chunks/{chunk-DH5YXSIF.js → chunk-F6WDTQ3M.js} +2 -2
  39. package/chunks/{chunk-ZOSTTOUJ.js → chunk-GWVUR3QZ.js} +1 -1
  40. package/chunks/{chunk-BZP4QPNK.js → chunk-IBUGFUXC.js} +9 -9
  41. package/chunks/{chunk-SCAZZ3Q4.js → chunk-IRZ2ZH72.js} +4 -4
  42. package/chunks/{chunk-OGNFHGIG.js → chunk-IWTMYQ32.js} +4 -4
  43. package/chunks/{chunk-CG3WBKJK.js → chunk-JT7XS4YW.js} +1 -1
  44. package/chunks/{chunk-MTCYGTWH.js → chunk-KID7K6H2.js} +4 -4
  45. package/chunks/{chunk-DGEIYUC3.js → chunk-KM73TBQ4.js} +7 -1
  46. package/chunks/{chunk-TZ6KJ44L.js → chunk-KONVMRK7.js} +1 -1
  47. package/chunks/{scheduler-YNQNOU2E.js → chunk-KZ22NXBY.js} +238 -110
  48. package/chunks/{chunk-RBHQXGDK.js → chunk-LLCWZQCU.js} +1 -1
  49. package/chunks/{chunk-UJUM2SRN.js → chunk-MIKXJYZB.js} +27 -26
  50. package/chunks/{chunk-THIKWITR.js → chunk-NDU63YLI.js} +2 -2
  51. package/chunks/{chunk-ATMO54WE.js → chunk-NEOXOWYH.js} +2 -2
  52. package/chunks/{chunk-QSNSL4R4.js → chunk-NRLFZWCT.js} +1 -1
  53. package/chunks/{chunk-TQCYNLNJ.js → chunk-NV65ZUVM.js} +1 -1
  54. package/chunks/{chunk-HZGBKOX3.js → chunk-O3EU6GMH.js} +2 -2
  55. package/chunks/{chunk-46YJDYCU.js → chunk-OCSFNUU4.js} +7 -7
  56. package/chunks/{chunk-T5RLUXWJ.js → chunk-OJUQF2PL.js} +2 -2
  57. package/chunks/{chunk-ZTQSOV56.js → chunk-OONWZLFK.js} +3 -3
  58. package/chunks/{chunk-23VQTELM.js → chunk-P3BJLFSZ.js} +1 -1
  59. package/chunks/{chunk-BIRWP6LU.js → chunk-Q3AL4JQ3.js} +1 -1
  60. package/chunks/{chunk-CMOBWHWW.js → chunk-QBJYSIQ4.js} +1 -1
  61. package/chunks/{chunk-XTY5DN4Y.js → chunk-QG3FFJYU.js} +1 -1
  62. package/chunks/{chunk-W3FSZSF2.js → chunk-QGNOFE5E.js} +1 -1
  63. package/chunks/{chunk-3WDYBTTI.js → chunk-QJMOAMXT.js} +4 -4
  64. package/chunks/{chunk-67N6HB5H.js → chunk-QUI267ZP.js} +1 -0
  65. package/chunks/{chunk-K4ADGWHU.js → chunk-TRRF5BSP.js} +1 -1
  66. package/chunks/{chunk-7GOYZQPR.js → chunk-UBX6NL47.js} +3 -3
  67. package/chunks/{chunk-WP5VOXF7.js → chunk-UEOKWYGY.js} +1 -1
  68. package/chunks/{chunk-HADWBW5R.js → chunk-UMD7WQTR.js} +4 -4
  69. package/chunks/{chunk-RVSTTOJ4.js → chunk-URKIBIFC.js} +2 -2
  70. package/chunks/{chunk-7S4JBJLU.js → chunk-VSFKIRRW.js} +3 -3
  71. package/chunks/{chunk-ZBXGWQ4S.js → chunk-VWKER4ZH.js} +2 -2
  72. package/chunks/{chunk-M2PNLYGY.js → chunk-W5UC37EE.js} +2 -0
  73. package/chunks/{chunk-BT6GQIEJ.js → chunk-X2UOOG5V.js} +1 -1
  74. package/chunks/{chunk-WGK4TSB7.js → chunk-XVHYA33G.js} +3 -3
  75. package/chunks/{chunk-BAMN6XSD.js → chunk-Y3OVRWRY.js} +1 -1
  76. package/chunks/{chunk-PVOGHGSF.js → chunk-Y4R47ZUH.js} +6 -6
  77. package/chunks/{chunk-LZZLUCRS.js → chunk-YF5MALI4.js} +3 -3
  78. package/chunks/{chunk-5RBDAGC6.js → chunk-YWPSGJFI.js} +2 -2
  79. package/chunks/{chunk-MHP476D3.js → chunk-Z4JX4NSH.js} +52 -39
  80. package/chunks/{chunk-T6HEQR2Q.js → chunk-ZJ4W6SUY.js} +1 -1
  81. package/chunks/{chunk-UYAUA63Q.js → chunk-ZRBMO3C7.js} +1 -1
  82. package/chunks/{chunk-KTKYGS2P.js → chunk-ZZCWJWTF.js} +8 -1
  83. package/chunks/{computer-use-PMZ7ICGY.js → computer-use-WQFK33Z3.js} +5 -5
  84. package/chunks/{contextCommand-GEZU7YHE.js → contextCommand-7EOZND7C.js} +7 -7
  85. package/chunks/{core-runtime-HRJI2MN6.js → core-runtime-FGMQRM6E.js} +5 -5
  86. package/chunks/{create-sub-session-VBNVI4YU.js → create-sub-session-QM2K5HLZ.js} +6 -6
  87. package/chunks/{daemon-POSQPD3G.js → daemon-GWD7BT6E.js} +46 -5
  88. package/chunks/{daemon-status-provider-N4CRQKFI.js → daemon-status-provider-L3J6GKCT.js} +12 -12
  89. package/chunks/{daemon-trust-policy-BHO3JUHM.js → daemon-trust-policy-4PHPY23S.js} +11 -11
  90. package/chunks/{daemon-trust-policy-monitor-YEKJ2726.js → daemon-trust-policy-monitor-6UKEABN5.js} +11 -11
  91. package/chunks/{deferred-core-runtime-SH57E3J3.js → deferred-core-runtime-67GJXHXS.js} +5 -5
  92. package/chunks/{earlyInputCapture-B2JJ2HME.js → earlyInputCapture-IWMYR6OB.js} +5 -5
  93. package/chunks/{edit-7FTXENAN.js → edit-ZFGROCAF.js} +5 -5
  94. package/chunks/{enter-worktree-JPHV2PBG.js → enter-worktree-TZZZCDM5.js} +5 -5
  95. package/chunks/{enterPlanMode-CGBJ3AHJ.js → enterPlanMode-U77BI3R6.js} +5 -5
  96. package/chunks/{environment-LXASZAHD.js → environment-HC37DS2I.js} +7 -7
  97. package/chunks/{errors-XIGVT2AD.js → errors-6AG54JPD.js} +7 -7
  98. package/chunks/{exit-worktree-DKSGXW65.js → exit-worktree-UYYWFPNK.js} +5 -5
  99. package/chunks/{exitPlanMode-THFL2HYN.js → exitPlanMode-RWJR2KGB.js} +5 -5
  100. package/chunks/{fast-path-4NXAT5UL.js → fast-path-F5FSZ3O7.js} +2 -2
  101. package/chunks/{gemini-B3N6FACU.js → gemini-NKQHYM36.js} +76 -52
  102. package/chunks/{geminiContentGenerator-YYFE2HIE.js → geminiContentGenerator-HCWZOUX3.js} +1 -1
  103. package/chunks/{glob-BPHSCFJP.js → glob-3PDXKBAO.js} +5 -5
  104. package/chunks/{goal-tools-PXWN5VK3.js → goal-tools-SWNB6GP4.js} +1 -1
  105. package/chunks/{grep-ROZIRFLU.js → grep-5HZKZYVD.js} +5 -5
  106. package/chunks/{handleAutoUpdate-WV6SPZQB.js → handleAutoUpdate-NHFSGYTF.js} +9 -9
  107. package/chunks/{i18n-YWJWPQKD.js → i18n-Q27KKNDL.js} +6 -6
  108. package/chunks/{image-gen-SISRZ6FS.js → image-gen-2Z2RJ6W7.js} +1 -1
  109. package/chunks/{initializer-66OAD6GO.js → initializer-Y5DJLT43.js} +11 -11
  110. package/chunks/{installationInfo-3YUGIP36.js → installationInfo-XXB75T7O.js} +6 -6
  111. package/chunks/{list-VEYR66XB.js → list-YHNQ32CS.js} +14 -14
  112. package/chunks/{loadedSettingsAdapter-V2JCPCYD.js → loadedSettingsAdapter-GHUQK7H4.js} +11 -11
  113. package/chunks/{loggingContentGenerator-RBLNDREC.js → loggingContentGenerator-6NTFBM7Q.js} +1 -1
  114. package/chunks/{managed-npm-update-C5ID5R4R.js → managed-npm-update-SPHYQUWZ.js} +6 -6
  115. package/chunks/{mcp-OZ54NZJQ.js → mcp-EA3KO6FS.js} +11 -11
  116. package/chunks/{monitor-7Y4TVFTK.js → monitor-ZBBPAA54.js} +5 -5
  117. package/chunks/{nonInteractiveCli-QEK4LHAC.js → nonInteractiveCli-NNOR56HU.js} +35 -35
  118. package/chunks/{notebook-edit-OG35EBGY.js → notebook-edit-5W3FW7Z2.js} +5 -5
  119. package/chunks/{openaiContentGenerator-443BNRPJ.js → openaiContentGenerator-TQANPEVZ.js} +1 -1
  120. package/chunks/{pidfile-ZK4OLRZA.js → pidfile-EQOBLH4E.js} +5 -5
  121. package/chunks/{processUtils-4YGB4RUZ.js → processUtils-7XQG7EHS.js} +2 -2
  122. package/chunks/{qwenContentGenerator-D5C2LCSZ.js → qwenContentGenerator-BKCPHHXU.js} +5 -5
  123. package/chunks/{qwenOAuth2-Z4YQBMYN.js → qwenOAuth2-BJ6PQKE6.js} +1 -1
  124. package/chunks/{read-file-EXTJLWMU.js → read-file-KKTXGIZD.js} +1 -1
  125. package/chunks/{resumeHistoryUtils-UPCGRJUL.js → resumeHistoryUtils-6N6XGJJW.js} +8 -8
  126. package/chunks/{ripGrep-QBVIRCU4.js → ripGrep-SJVAAYDV.js} +5 -5
  127. package/chunks/{run-qwen-serve-ZYGJNE3E.js → run-qwen-serve-BCKBCAMX.js} +34 -34
  128. package/chunks/{runtime-BZZ4LWCP.js → runtime-E2437YKL.js} +12 -12
  129. package/chunks/scheduler-K3D5Z655.js +108 -0
  130. package/chunks/{serve-LJHAXDCH.js → serve-IH4XR5IL.js} +11 -11
  131. package/chunks/{server-ADMLELR6.js → server-UD6INW7J.js} +616 -245
  132. package/chunks/{session-YKZXFFTM.js → session-GR4ZEVW4.js} +43 -44
  133. package/chunks/{settings-EQBUAQ7Y.js → settings-5O24D3OJ.js} +10 -10
  134. package/chunks/{shell-3QZOJGTT.js → shell-UTLWLG5G.js} +5 -5
  135. package/chunks/{skill-UWSSMXE7.js → skill-QQAZL4VO.js} +1 -1
  136. package/chunks/{skill-settings-T6MLB7NU.js → skill-settings-P3YHJVBZ.js} +10 -10
  137. package/chunks/{spawnChannel-VS7ZFUFP.js → spawnChannel-UAQMH6Y6.js} +5 -5
  138. package/chunks/{standalone-update-2W26SRRO.js → standalone-update-QP742MGP.js} +7 -7
  139. package/chunks/{startInteractiveUI-CVS7K3D6.js → startInteractiveUI-YCS6AEPN.js} +1209 -926
  140. package/chunks/{team-create-4WFTNNUL.js → team-create-WFH7OCDQ.js} +5 -5
  141. package/chunks/{team-plan-approval-DBYI33S3.js → team-plan-approval-EGTT53MV.js} +5 -5
  142. package/chunks/{terminal-image-renderer-S5WPPQKH.js → terminal-image-renderer-BWRESAQ7.js} +5 -5
  143. package/chunks/{theme-manager-LI2RIOVR.js → theme-manager-ZNDGAHJN.js} +5 -5
  144. package/chunks/{tool-search-4773EUQ4.js → tool-search-TI5PTIBF.js} +1 -1
  145. package/chunks/{total-session-admission-PAY5CH2Z.js → total-session-admission-66UDSOHO.js} +9 -9
  146. package/chunks/{trustedFolders-FRSLE674.js → trustedFolders-4KYHA4IG.js} +6 -6
  147. package/chunks/{update-relaunch-ZSFQTU6M.js → update-relaunch-WB6LGIF2.js} +5 -5
  148. package/chunks/{updateCheck-AXWSO7KA.js → updateCheck-LOS5GYFC.js} +8 -8
  149. package/chunks/{useAutoAcceptIndicator-VHLXIA7U.js → useAutoAcceptIndicator-MHAPY52L.js} +11 -11
  150. package/chunks/{validateNonInterActiveAuth-PDJECMFU.js → validateNonInterActiveAuth-QV22HNQU.js} +32 -32
  151. package/chunks/{version-RBN764QS.js → version-DALWZHKQ.js} +1 -1
  152. package/chunks/{web-fetch-7BJK42AF.js → web-fetch-JMJVMYFE.js} +1 -1
  153. package/chunks/{web-search-L2CILQXV.js → web-search-DNDUIPU5.js} +2 -2
  154. package/chunks/{workflow-5VH2R74I.js → workflow-JGNN64PM.js} +6 -6
  155. package/chunks/{workspace-providers-status-OZTQ6JFH.js → workspace-providers-status-K22B3Z6B.js} +13 -13
  156. package/chunks/{workspace-registration-store-IX5RJQS5.js → workspace-registration-store-LRJG7QA4.js} +1 -1
  157. package/chunks/{workspace-registry-73N4BGG4.js → workspace-registry-KVXIFM36.js} +9 -9
  158. package/chunks/{workspace-service-I5RUPSNV.js → workspace-service-PO4AAKKT.js} +15 -15
  159. package/chunks/{workspace-skills-status-DMK6VYDO.js → workspace-skills-status-DDYCBVSH.js} +11 -11
  160. package/chunks/{workspace-trust-reconciler-QX4RL3TC.js → workspace-trust-reconciler-DOZPCVHG.js} +15 -15
  161. package/chunks/{write-file-UGDD5UTS.js → write-file-TT6MWIKC.js} +5 -5
  162. package/chunks/{zoom-image-ZAHEO3YP.js → zoom-image-CNC77ZMA.js} +1 -1
  163. package/cli.js +13 -13
  164. package/package.json +3 -3
  165. package/web-shell/assets/{arc-CHY4saMJ.js → arc-CDk0d60K.js} +1 -1
  166. package/web-shell/assets/{architectureDiagram-3BPJPVTR-Bu6CwvHj.js → architectureDiagram-3BPJPVTR-h-W3I2lP.js} +1 -1
  167. package/web-shell/assets/{blockDiagram-GPEHLZMM-XGt6iGf_.js → blockDiagram-GPEHLZMM-D1pvSmZg.js} +1 -1
  168. package/web-shell/assets/{c4Diagram-AAUBKEIU-CBbYl19W.js → c4Diagram-AAUBKEIU-ByAm5ZNf.js} +1 -1
  169. package/web-shell/assets/channel-DPFUV4oi.js +1 -0
  170. package/web-shell/assets/{chunk-2J33WTMH-BEhmVrdx.js → chunk-2J33WTMH-VrGPPOGV.js} +1 -1
  171. package/web-shell/assets/{chunk-4BX2VUAB-fQLyE0Bg.js → chunk-4BX2VUAB-B7hTowgG.js} +1 -1
  172. package/web-shell/assets/{chunk-55IACEB6-yGdtyx4a.js → chunk-55IACEB6-j1Fq8DpE.js} +1 -1
  173. package/web-shell/assets/{chunk-727SXJPM-DYbX2GLo.js → chunk-727SXJPM-UjABYpF2.js} +1 -1
  174. package/web-shell/assets/{chunk-AQP2D5EJ-DyKTEsYn.js → chunk-AQP2D5EJ-D4uBItrs.js} +1 -1
  175. package/web-shell/assets/{chunk-FMBD7UC4-D8Uy_GzX.js → chunk-FMBD7UC4-DeFbKlb8.js} +1 -1
  176. package/web-shell/assets/{chunk-ND2GUHAM-C8wNR2K7.js → chunk-ND2GUHAM-rQJ8TIgT.js} +1 -1
  177. package/web-shell/assets/{chunk-QZHKN3VN-BnybNxnt.js → chunk-QZHKN3VN-DAGcRxvq.js} +1 -1
  178. package/web-shell/assets/classDiagram-4FO5ZUOK-CLm0hVvw.js +1 -0
  179. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CLm0hVvw.js +1 -0
  180. package/web-shell/assets/{cose-bilkent-S5V4N54A-jq4uiFRp.js → cose-bilkent-S5V4N54A-MaE7MJSt.js} +1 -1
  181. package/web-shell/assets/{dagre-BM42HDAG-Bs7oye1U.js → dagre-BM42HDAG-DzijYGSb.js} +1 -1
  182. package/web-shell/assets/{diagram-2AECGRRQ-BHGGJNyM.js → diagram-2AECGRRQ-WdbG7WnX.js} +1 -1
  183. package/web-shell/assets/{diagram-5GNKFQAL-BJezVLGT.js → diagram-5GNKFQAL-NYutsBnw.js} +1 -1
  184. package/web-shell/assets/{diagram-KO2AKTUF-5JzQN_rL.js → diagram-KO2AKTUF-Dqg0eBY0.js} +1 -1
  185. package/web-shell/assets/{diagram-LMA3HP47-BlPYOgY9.js → diagram-LMA3HP47-C7vRP2Lb.js} +1 -1
  186. package/web-shell/assets/{diagram-OG6HWLK6-CtMHEaFK.js → diagram-OG6HWLK6-B2sEPpPt.js} +1 -1
  187. package/web-shell/assets/{erDiagram-TEJ5UH35-CRNdq2AB.js → erDiagram-TEJ5UH35-a4zIbzm8.js} +1 -1
  188. package/web-shell/assets/{flowDiagram-I6XJVG4X-De1WwLzu.js → flowDiagram-I6XJVG4X-BK9y89ya.js} +1 -1
  189. package/web-shell/assets/{ganttDiagram-6RSMTGT7-YbWfL5Zn.js → ganttDiagram-6RSMTGT7-wUQTSNvV.js} +1 -1
  190. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DzCN8bmd.js → gitGraphDiagram-PVQCEYII-Dnzt4SAi.js} +1 -1
  191. package/web-shell/assets/{index-CocPvF9Q.js → index-BA3wUcKL.js} +1 -1
  192. package/web-shell/assets/{index-BDOGGGaN.css → index-BjC3yjjL.css} +2 -2
  193. package/web-shell/assets/index-QzFq6w7o.js +1775 -0
  194. package/web-shell/assets/{infoDiagram-5YYISTIA-DLHoopnE.js → infoDiagram-5YYISTIA-DcaoToij.js} +1 -1
  195. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-XnbU04SS.js → ishikawaDiagram-YF4QCWOH-DzduqhP2.js} +1 -1
  196. package/web-shell/assets/{journeyDiagram-JHISSGLW-CipPyEeJ.js → journeyDiagram-JHISSGLW-BvviZR_O.js} +1 -1
  197. package/web-shell/assets/{kanban-definition-UN3LZRKU-DrSeyE5d.js → kanban-definition-UN3LZRKU-Efm2JxY3.js} +1 -1
  198. package/web-shell/assets/{linear-LrBKnAo_.js → linear-DtY3IbOs.js} +1 -1
  199. package/web-shell/assets/{mermaid.core-C3U9UVmf.js → mermaid.core-PzpFqoMe.js} +5 -5
  200. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DqRWgC9H.js → mindmap-definition-RKZ34NQL-BLlTkHS0.js} +1 -1
  201. package/web-shell/assets/{pieDiagram-4H26LBE5-BNXY5p6H.js → pieDiagram-4H26LBE5-D-mKF-jE.js} +1 -1
  202. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-Ccj9QzE4.js → quadrantDiagram-W4KKPZXB-DYCzslGm.js} +1 -1
  203. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CjPM2_gx.js → requirementDiagram-4Y6WPE33-Dfpxlk7R.js} +1 -1
  204. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C0RsvKbj.js → sankeyDiagram-5OEKKPKP-D5cRaaxh.js} +1 -1
  205. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-ClN1P5z7.js → sequenceDiagram-3UESZ5HK-s04DReiS.js} +1 -1
  206. package/web-shell/assets/{stateDiagram-AJRCARHV-By0eiB2Y.js → stateDiagram-AJRCARHV-01UNFgnb.js} +1 -1
  207. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DXb5olqv.js +1 -0
  208. package/web-shell/assets/{timeline-definition-PNZ67QCA-g_iaSQgv.js → timeline-definition-PNZ67QCA-DX8_wZBC.js} +1 -1
  209. package/web-shell/assets/{vennDiagram-CIIHVFJN-y9ZqJ-TD.js → vennDiagram-CIIHVFJN-BK0FlBme.js} +1 -1
  210. package/web-shell/assets/{wardley-L42UT6IY-BVVfaxpF.js → wardley-L42UT6IY-DkPc9UlD.js} +1 -1
  211. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-D3ooZKZT.js → wardleyDiagram-YWT4CUSO-DNKkpDAo.js} +1 -1
  212. package/web-shell/assets/{xychartDiagram-2RQKCTM6-6GXrY6M1.js → xychartDiagram-2RQKCTM6-CiPwg8QG.js} +1 -1
  213. package/web-shell/index.html +2 -2
  214. package/web-shell/assets/channel-B40srHOa.js +0 -1
  215. package/web-shell/assets/classDiagram-4FO5ZUOK-qumcXQW_.js +0 -1
  216. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-qumcXQW_.js +0 -1
  217. package/web-shell/assets/index-DSH2KrMc.js +0 -1771
  218. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Ds0WlK3F.js +0 -1
@@ -2,13 +2,13 @@
2
2
  "use strict";
3
3
  import {
4
4
  listCommand
5
- } from "./chunk-SCAZZ3Q4.js";
5
+ } from "./chunk-IRZ2ZH72.js";
6
6
  import {
7
7
  serveCommand
8
- } from "./chunk-LZZLUCRS.js";
8
+ } from "./chunk-YF5MALI4.js";
9
9
  import {
10
10
  getErrorMessage as getErrorMessage2
11
- } from "./chunk-P2FK2HBV.js";
11
+ } from "./chunk-DCZEPFB4.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-KTQGGPGV.js";
36
+ } from "./chunk-2PLNY5TN.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-ATMO54WE.js";
56
+ } from "./chunk-NEOXOWYH.js";
57
57
  import {
58
58
  getExtensionManager,
59
59
  requestChoicePluginNonInteractive,
60
60
  requestConsentNonInteractive,
61
61
  requestConsentOrFail,
62
62
  resolveExtensionCommandScope
63
- } from "./chunk-HADWBW5R.js";
63
+ } from "./chunk-UMD7WQTR.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-MTCYGTWH.js";
136
+ } from "./chunk-KID7K6H2.js";
137
137
  import {
138
138
  loadSettings
139
- } from "./chunk-JUWS2Z5K.js";
139
+ } from "./chunk-ABVRJU3D.js";
140
140
  import {
141
141
  detectSystemLanguage,
142
142
  getCurrentLanguage,
143
143
  initializeI18n,
144
144
  resolveLanguageSetting,
145
145
  t
146
- } from "./chunk-WP5VOXF7.js";
146
+ } from "./chunk-UEOKWYGY.js";
147
147
  import {
148
148
  loadEnvironment
149
- } from "./chunk-T6HEQR2Q.js";
149
+ } from "./chunk-ZJ4W6SUY.js";
150
150
  import {
151
151
  resolveAcpChannelFallback,
152
152
  scrubAndReportInheritedLoaderEnv
153
153
  } from "./chunk-VFMASYQA.js";
154
154
  import {
155
155
  getCliVersion
156
- } from "./chunk-IOEZE2YT.js";
156
+ } from "./chunk-AEL7KN2O.js";
157
157
  import {
158
158
  getPackageJson
159
159
  } from "./chunk-VJNBRRZG.js";
160
160
  import {
161
161
  isWorkspaceTrusted
162
- } from "./chunk-ZOSTTOUJ.js";
162
+ } from "./chunk-GWVUR3QZ.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-XX7QFP34.js";
204
+ } from "./chunk-EI3NWELG.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-POSQPD3G.js");
2734
+ const sdk = await import("./daemon-GWD7BT6E.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-POSQPD3G.js");
2920
+ const sdk = await import("./daemon-GWD7BT6E.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-POSQPD3G.js");
3031
+ sdk = await import("./daemon-GWD7BT6E.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-POSQPD3G.js");
3111
+ sdk = await import("./daemon-GWD7BT6E.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-POSQPD3G.js");
3237
+ return await import("./daemon-GWD7BT6E.js");
3238
3238
  }
3239
3239
  __name(loadDaemonSdk, "loadDaemonSdk");
3240
3240
  function selectedChannelNames(channelsConfig, selection) {
@@ -7097,7 +7097,13 @@ __name(contextRoleRunsInThisReview, "contextRoleRunsInThisReview");
7097
7097
 
7098
7098
  // packages/cli/src/commands/review/lib/deadline.ts
7099
7099
  init_esbuild_shims();
7100
- import { mkdirSync as mkdirSync5, readFileSync as readFileSync8, statSync as statSync4, writeFileSync as writeFileSync5 } from "node:fs";
7100
+ import {
7101
+ mkdirSync as mkdirSync5,
7102
+ readFileSync as readFileSync8,
7103
+ rmSync as rmSync4,
7104
+ statSync as statSync4,
7105
+ writeFileSync as writeFileSync5
7106
+ } from "node:fs";
7101
7107
  import { join as join9 } from "node:path";
7102
7108
  var DEADLINE_ENV = "QWEN_REVIEW_DEADLINE_EPOCH";
7103
7109
  var RESERVE_ENV = "QWEN_REVIEW_DEADLINE_RESERVE_SECONDS";
@@ -7260,6 +7266,7 @@ function roundCapStopEntryZh(cap) {
7260
7266
  __name(roundCapStopEntryZh, "roundCapStopEntryZh");
7261
7267
  function writeRoundCapStop(planPath, cap, round, nowMs = Date.now()) {
7262
7268
  try {
7269
+ if (readBudgetStop(planPath) !== null) return;
7263
7270
  const dir = promptRecordDir(planPath);
7264
7271
  mkdirSync5(dir, { recursive: true });
7265
7272
  const stop = {
@@ -7279,6 +7286,7 @@ function writeRoundCapStop(planPath, cap, round, nowMs = Date.now()) {
7279
7286
  __name(writeRoundCapStop, "writeRoundCapStop");
7280
7287
  function writeBudgetStop(planPath, spent, round, nowMs = Date.now()) {
7281
7288
  try {
7289
+ if (readBudgetStop(planPath) !== null) return;
7282
7290
  const dir = promptRecordDir(planPath);
7283
7291
  mkdirSync5(dir, { recursive: true });
7284
7292
  const stop = {
@@ -7310,12 +7318,19 @@ function readBudgetStop(planPath) {
7310
7318
  }
7311
7319
  }
7312
7320
  __name(readBudgetStop, "readBudgetStop");
7321
+ function clearBudgetStop(planPath) {
7322
+ try {
7323
+ rmSync4(join9(promptRecordDir(planPath), STOP_FILE), { force: true });
7324
+ } catch {
7325
+ }
7326
+ }
7327
+ __name(clearBudgetStop, "clearBudgetStop");
7313
7328
  function reverseAuditBudgetMessage(spent, round) {
7314
7329
  const minutesLeft = Math.max(0, Math.floor(spent.remainingSeconds / 60));
7315
7330
  const reserveMinutes = Math.round(spent.reserveSeconds / 60);
7316
7331
  const roundMinutes = Math.round(spent.expectedRoundSeconds / 60);
7317
7332
  const which = round !== void 0 ? `round ${round}` : "the next round";
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.`;
7333
+ 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; when the deadline is within that floor, stop waiting on any verifier batch still out and compose with the tags in hand. Do NOT re-verify findings already confirmed in earlier rounds, and do NOT invent a fresh re-verification pass. Then compose and submit \u2014 a review that stops here still reports everything it proved; a review that runs past its deadline is killed holding all of it.`;
7319
7334
  }
7320
7335
  __name(reverseAuditBudgetMessage, "reverseAuditBudgetMessage");
7321
7336
 
@@ -8041,7 +8056,8 @@ function verificationGaps(planPath, opts, env = process.env) {
8041
8056
  (k) => k === "reverse-audit" || k.startsWith("reverse-audit--")
8042
8057
  );
8043
8058
  const reverse = bestDelivery(reverseKeys);
8044
- const budgetStopped = readBudgetStop(planPath) !== null;
8059
+ const stop = readBudgetStop(planPath);
8060
+ const budgetStopped = stop !== null && stop.cause !== "round-cap";
8045
8061
  const reverseByDesign = budgetStopped && reverse === "not-built";
8046
8062
  const reverseGap = !balancedMedium && !reverseByDesign && reverse !== "ok";
8047
8063
  if (reverseGap) {
@@ -12712,7 +12728,7 @@ import {
12712
12728
  openSync as openSync2,
12713
12729
  writeSync,
12714
12730
  closeSync as closeSync2,
12715
- rmSync as rmSync4,
12731
+ rmSync as rmSync5,
12716
12732
  lstatSync as lstatSync4,
12717
12733
  existsSync as existsSync7,
12718
12734
  constants
@@ -12782,7 +12798,7 @@ __name(writeSkillArgs, "writeSkillArgs");
12782
12798
  function clearSkillArgs(skillName) {
12783
12799
  const path3 = skillArgsPath(skillName);
12784
12800
  try {
12785
- rmSync4(path3, { force: true });
12801
+ rmSync5(path3, { force: true });
12786
12802
  } catch (err) {
12787
12803
  debugLogger3.warn(
12788
12804
  `Could not clear skill args for ${skillName}: ${err.message}`
@@ -14894,7 +14910,7 @@ function admitReverseAuditRound(planPath, round, cap) {
14894
14910
  if (typeof round === "number" && round > cap) {
14895
14911
  writeRoundCapStop(planPath, cap, round);
14896
14912
  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.`
14913
+ `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, verify them 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; when the deadline is within that floor, stop waiting on any verifier batch still out and compose with the tags in hand. Do NOT re-verify findings already confirmed in earlier rounds, and do NOT invent a fresh re-verification pass. Then proceed to Step 6.`
14898
14914
  );
14899
14915
  process.exitCode = 4;
14900
14916
  return false;
@@ -14912,9 +14928,10 @@ function admitReverseAuditRound(planPath, round, cap) {
14912
14928
  return true;
14913
14929
  }
14914
14930
  __name(admitReverseAuditRound, "admitReverseAuditRound");
14915
- function refuseConverged() {
14931
+ function refuseConverged(planPath) {
14932
+ clearBudgetStop(planPath);
14916
14933
  writeStderrLine(
14917
- "CONVERGED: every chunk holds two consecutive substantive dry audits; the reverse audit has converged \u2014 stop the loop and proceed to Step 6. This is a clean convergence, not a gap: no unreviewedDimensions entry is owed."
14934
+ "CONVERGED: every chunk holds two consecutive substantive dry audits; the reverse audit has converged \u2014 stop the loop and proceed to Step 6. This is a clean convergence, not a gap: no unreviewedDimensions entry is owed. If an earlier round-cap or budget refusal told you to add its stop entry to unreviewedDimensions, remove it now \u2014 this convergence supersedes it."
14918
14935
  );
14919
14936
  process.exitCode = 5;
14920
14937
  }
@@ -14937,7 +14954,7 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14937
14954
  }
14938
14955
  }
14939
14956
  if (schedule !== null && schedule.converged) {
14940
- refuseConverged();
14957
+ refuseConverged(planPath);
14941
14958
  return;
14942
14959
  }
14943
14960
  if (role === "reverse-audit" && !admitReverseAuditRound(
@@ -15177,7 +15194,7 @@ function runAgentPrompt(args) {
15177
15194
  schedule = null;
15178
15195
  }
15179
15196
  if (schedule !== null && schedule.converged) {
15180
- refuseConverged();
15197
+ refuseConverged(args.plan);
15181
15198
  return;
15182
15199
  }
15183
15200
  }
@@ -15296,14 +15313,29 @@ var agentPromptCommand = {
15296
15313
  // packages/cli/src/commands/review/build-test.ts
15297
15314
  init_esbuild_shims();
15298
15315
  import { spawnSync as spawnSync3 } from "node:child_process";
15299
- import {
15300
- existsSync as existsSync9,
15301
- readFileSync as readFileSync23,
15302
- rmSync as rmSync5,
15303
- statfsSync,
15304
- writeFileSync as writeFileSync18
15305
- } from "node:fs";
15306
- import { join as join16, resolve as resolve18 } from "node:path";
15316
+ import { existsSync as existsSync10, readFileSync as readFileSync23, writeFileSync as writeFileSync18 } from "node:fs";
15317
+ import { join as join17, resolve as resolve18 } from "node:path";
15318
+
15319
+ // packages/cli/src/commands/review/lib/npm-toolchain.ts
15320
+ init_esbuild_shims();
15321
+ import { existsSync as existsSync9, rmSync as rmSync6 } from "node:fs";
15322
+ import { join as join16 } from "node:path";
15323
+
15324
+ // packages/cli/src/commands/review/lib/disk.ts
15325
+ init_esbuild_shims();
15326
+ import { statfsSync } from "node:fs";
15327
+ var INSTALL_MIN_FREE_BYTES = 3 * 1024 ** 3;
15328
+ var BUILD_MIN_FREE_BYTES = 1024 ** 3;
15329
+ function freeDiskBytes(dir) {
15330
+ try {
15331
+ const s = statfsSync(dir);
15332
+ return s.bavail * s.bsize;
15333
+ } catch {
15334
+ return null;
15335
+ }
15336
+ }
15337
+ __name(freeDiskBytes, "freeDiskBytes");
15338
+ var gib = /* @__PURE__ */ __name((bytes) => (bytes / 1024 ** 3).toFixed(1), "gib");
15307
15339
 
15308
15340
  // packages/cli/src/commands/review/lib/workspaces.ts
15309
15341
  init_esbuild_shims();
@@ -15596,7 +15628,8 @@ function resolveTestScope(input) {
15596
15628
  }
15597
15629
  __name(resolveTestScope, "resolveTestScope");
15598
15630
 
15599
- // packages/cli/src/commands/review/build-test.ts
15631
+ // packages/cli/src/commands/review/lib/npm-toolchain.ts
15632
+ var BUDGET_MIN_ATTEMPT_MS = 15e3;
15600
15633
  function shellArg(dir) {
15601
15634
  return `"${dir.replace(/[\\"$`]/g, "\\$&")}"`;
15602
15635
  }
@@ -15609,81 +15642,6 @@ function testCommand(dir) {
15609
15642
  return dir === "." ? "npm test" : `npm test --workspace=${shellArg(dir)}`;
15610
15643
  }
15611
15644
  __name(testCommand, "testCommand");
15612
- var KEEP_HEAD = 2e3;
15613
- var KEEP_TAIL = 6e3;
15614
- function spawnTimedOut(r) {
15615
- return r.error?.code === "ETIMEDOUT" || r.signal === "SIGTERM" && r.status === null;
15616
- }
15617
- __name(spawnTimedOut, "spawnTimedOut");
15618
- var MODULE_ERROR_RE = /Cannot find module '[^']+'|Could not resolve "[^"]+"/;
15619
- var RUNNER_SUMMARY_RE = /^\s*(?:Tests?|Test Files):?\s+\d/;
15620
- var ANSI_SGR_RE = /\x1b\[[0-9;]*m/g;
15621
- function trimOutput(s) {
15622
- if (s.length <= KEEP_HEAD + KEEP_TAIL) return s;
15623
- const middle = s.slice(KEEP_HEAD, s.length - KEEP_TAIL);
15624
- const RESCUE_MAX = 40;
15625
- const rescued = middle.split("\n").filter(
15626
- (l) => MODULE_ERROR_RE.test(l) || RUNNER_SUMMARY_RE.test(l.replace(ANSI_SGR_RE, ""))
15627
- ).slice(0, RESCUE_MAX);
15628
- const omitted = s.length - KEEP_HEAD - KEEP_TAIL;
15629
- const marker = rescued.length ? `
15630
-
15631
- ... [${omitted} characters omitted; module-resolution errors and runner summaries kept] ...
15632
- ${rescued.join("\n")}
15633
-
15634
- ` : `
15635
-
15636
- ... [${omitted} characters omitted] ...
15637
-
15638
- `;
15639
- return s.slice(0, KEEP_HEAD) + marker + s.slice(-KEEP_TAIL);
15640
- }
15641
- __name(trimOutput, "trimOutput");
15642
- var INSTALL_MIN_FREE_BYTES = 3 * 1024 ** 3;
15643
- var BUILD_MIN_FREE_BYTES = 1024 ** 3;
15644
- var BUDGET_MIN_ATTEMPT_MS = 15e3;
15645
- function freeDiskBytes(dir) {
15646
- try {
15647
- const s = statfsSync(dir);
15648
- return s.bavail * s.bsize;
15649
- } catch {
15650
- return null;
15651
- }
15652
- }
15653
- __name(freeDiskBytes, "freeDiskBytes");
15654
- var gib = /* @__PURE__ */ __name((bytes) => (bytes / 1024 ** 3).toFixed(1), "gib");
15655
- function buildRunEnv(base = process.env) {
15656
- return {
15657
- ...base,
15658
- CI: "1",
15659
- npm_config_yes: "true",
15660
- QWEN_SKIP_PREPARE: "1"
15661
- };
15662
- }
15663
- __name(buildRunEnv, "buildRunEnv");
15664
- function run(command, cwd, timeoutMs) {
15665
- const started = Date.now();
15666
- const r = spawnSync3(command, {
15667
- cwd,
15668
- shell: true,
15669
- encoding: "utf8",
15670
- timeout: timeoutMs,
15671
- maxBuffer: 64 * 1024 * 1024,
15672
- // A build that asks a question is a build that hangs until the deadline.
15673
- stdio: ["ignore", "pipe", "pipe"],
15674
- env: buildRunEnv()
15675
- });
15676
- const timedOut = spawnTimedOut(r);
15677
- return {
15678
- command,
15679
- exitCode: r.status,
15680
- seconds: Math.round((Date.now() - started) / 1e3),
15681
- timedOut,
15682
- output: trimOutput(`${r.stdout ?? ""}${r.stderr ?? ""}`),
15683
- deadlineMs: timeoutMs
15684
- };
15685
- }
15686
- __name(run, "run");
15687
15645
  function unresolvedWorkspaceDeps(output, packages) {
15688
15646
  const known = new Map(packages.map((p) => [p.name, p.dir]));
15689
15647
  const found = /* @__PURE__ */ new Set();
@@ -15698,34 +15656,13 @@ function unresolvedWorkspaceDeps(output, packages) {
15698
15656
  return [...found];
15699
15657
  }
15700
15658
  __name(unresolvedWorkspaceDeps, "unresolvedWorkspaceDeps");
15701
- function changedFilesFrom(planPath) {
15702
- let parsed;
15703
- try {
15704
- parsed = JSON.parse(readFileSync23(planPath, "utf8"));
15705
- } catch (err) {
15706
- throw new Error(
15707
- `build-test: cannot read the plan ${planPath}: ${err.message}`
15708
- );
15709
- }
15710
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
15711
- throw new Error(
15712
- `build-test: the plan ${planPath} is not a JSON object (got ${parsed === null ? "null" : Array.isArray(parsed) ? "an array" : typeof parsed}).`
15713
- );
15714
- }
15715
- const report = parsed;
15716
- const files = Array.isArray(report.files) ? report.files : [];
15717
- return files.map((f) => f?.path).filter((p) => typeof p === "string" && p.length > 0);
15718
- }
15719
- __name(changedFilesFrom, "changedFilesFrom");
15720
- function runBuildTest(args) {
15721
- const root = resolve18(args.worktree);
15659
+ function runNpmToolchain(args) {
15660
+ const { root, changedFiles: changed, exec } = args;
15722
15661
  const perCommandMs = args.timeout * 1e3;
15723
15662
  const callBudgetMs = (args.budget ?? Math.max(args.timeout, args.timeout * 2 - 30)) * 1e3;
15724
15663
  const runStarted = Date.now();
15725
15664
  const remainingMs = /* @__PURE__ */ __name(() => callBudgetMs - (Date.now() - runStarted), "remainingMs");
15726
15665
  const deadlineSecs = /* @__PURE__ */ __name((r) => Math.round((r.deadlineMs ?? perCommandMs) / 1e3), "deadlineSecs");
15727
- const exec = args.exec ?? run;
15728
- const changed = changedFilesFrom(args.plan);
15729
15666
  const unsupportedReport = /* @__PURE__ */ __name((note) => ({
15730
15667
  toolchain: "unsupported",
15731
15668
  affected: [],
@@ -15749,7 +15686,7 @@ function runBuildTest(args) {
15749
15686
  }
15750
15687
  if (unmodeled || !singleRoot && (globs.length === 0 || packages.length === 0)) {
15751
15688
  return unsupportedReport(
15752
- unmodeled ? "This repo uses a workspace glob shape this command does not model (e.g. `**`, an inner `*`, or a `foo-*` prefix), so it cannot safely decide which packages the diff touches. Fall back to the build/test precedence in your brief, and give each command a deadline it can actually meet." : "No npm package here to scope (no workspaces, and the root has no build/test script). Fall back to the build/test precedence in your brief \u2014 installing dependencies first \u2014 and give each command a deadline it can actually meet."
15689
+ unmodeled ? "This repo uses a workspace glob shape this command does not model (e.g. `**`, an inner `*`, or a `foo-*` prefix), so it cannot safely decide which packages the diff touches. Fall back to the build/test precedence in your brief, and give each command a deadline it can actually meet." : globs.length > 0 ? "This repo declares npm workspaces, but none resolve to a package with a readable manifest, so there is nothing to scope. Fall back to the build/test precedence in your brief \u2014 installing dependencies first \u2014 and give each command a deadline it can actually meet." : "No npm package here to scope (no workspaces, and the root has no build/test script). Fall back to the build/test precedence in your brief \u2014 installing dependencies first \u2014 and give each command a deadline it can actually meet."
15753
15690
  );
15754
15691
  }
15755
15692
  const affected = singleRoot ? changed.length > 0 ? ["."] : [] : affectedWorkspaces(changed, globs);
@@ -15831,7 +15768,7 @@ function runBuildTest(args) {
15831
15768
  if (install.timedOut) results.timedOut.push(install.command);
15832
15769
  if (install.timedOut) {
15833
15770
  try {
15834
- rmSync5(join16(root, "node_modules"), {
15771
+ rmSync6(join16(root, "node_modules"), {
15835
15772
  recursive: true,
15836
15773
  force: true,
15837
15774
  maxRetries: 3
@@ -15845,10 +15782,16 @@ function runBuildTest(args) {
15845
15782
  return results;
15846
15783
  }
15847
15784
  }
15785
+ const frameInstallFailure = /* @__PURE__ */ __name(() => {
15786
+ if (results.install && results.install.exitCode !== 0) {
15787
+ results.note = `\`${results.install.command}\` exited ${results.install.exitCode} but left a usable \`node_modules\`, so the run went ahead. The install failure is an environment/infrastructure result \u2014 report it as informational, never as a Critical, and never against this PR. ` + results.note;
15788
+ }
15789
+ }, "frameInstallFailure");
15848
15790
  const freeForBuild = freeDiskBytes(root);
15849
15791
  if (freeForBuild !== null && freeForBuild < BUILD_MIN_FREE_BYTES) {
15850
15792
  results.ok = false;
15851
15793
  results.note = `Insufficient disk space (${gib(freeForBuild)}G free, need ~${gib(BUILD_MIN_FREE_BYTES)}G): skipped the build and tests rather than fill the disk mid-compile. This is an environment issue, not a code finding \u2014 report it as informational.`;
15794
+ frameInstallFailure();
15852
15795
  return results;
15853
15796
  }
15854
15797
  const alsoBuild = [];
@@ -15902,6 +15845,7 @@ function runBuildTest(args) {
15902
15845
  results.note = failure.timedOut ? `\`${failure.command}\` ran out of time (${deadlineSecs(failure)}s). That is an infrastructure result, not a defect in the diff \u2014 report it as informational.` : `\`${failure.command}\` failed. Correlate the errors below with the diff: a compile error in a file the PR changed is a Critical; one in a file it did not touch is a pre-existing failure, and belongs in the terminal, not on the PR.`;
15903
15846
  results.buildSet = (rootBuildSkipped ? set.filter((d) => d !== ".") : set).filter((d) => !notBuilt.includes(d));
15904
15847
  results.widenedWith = [...widened];
15848
+ frameInstallFailure();
15905
15849
  return results;
15906
15850
  }
15907
15851
  results.build = results.build.filter((r) => r !== failure);
@@ -15933,7 +15877,7 @@ function runBuildTest(args) {
15933
15877
  }
15934
15878
  const remaining = remainingMs();
15935
15879
  if (remaining < BUDGET_MIN_ATTEMPT_MS) {
15936
- notRun.push(...runnableDirs.slice(i).filter((d) => !untestable.has(d)));
15880
+ notRun.push(...runnableDirs.slice(i));
15937
15881
  break;
15938
15882
  }
15939
15883
  const r = exec(testCommand(dir), root, Math.min(perCommandMs, remaining));
@@ -15965,7 +15909,10 @@ function runBuildTest(args) {
15965
15909
  if (args.buildOnly) {
15966
15910
  testsClause = ". Tests were not run (build-only).";
15967
15911
  } else if (!testScope) {
15968
- testsClause = results.test.length === 0 ? ", but the package defines no test script, so no tests ran." : " and ran the tests of the changed ones. Everything passed.";
15912
+ testsClause = results.test.length === 0 ? notRun.length > 0 ? (
15913
+ // The loop pushed the suite to notRun: the script exists.
15914
+ ", but the whole-call budget was spent before any suite could run."
15915
+ ) : ", but the package defines no test script, so no tests ran." : " and ran the tests of the changed ones. Everything passed.";
15969
15916
  } else if (testScope.workspaces.length === 0) {
15970
15917
  testsClause = testScope.notRun?.length ? ", but the whole-call budget was spent before any suite could run." : ", but no workspace in scope defines a test script, so no tests ran.";
15971
15918
  } else {
@@ -15989,11 +15936,190 @@ function runBuildTest(args) {
15989
15936
  if (partialNote && !results.testScope) {
15990
15937
  results.note = results.note ? `${results.note} ${partialNote}.` : partialNote;
15991
15938
  }
15992
- if (results.install && results.install.exitCode !== 0) {
15993
- results.note = `\`${results.install.command}\` exited ${results.install.exitCode} but left a usable \`node_modules\`, so the build and test below ran anyway and their results stand. The install failure is an environment/infrastructure result \u2014 report it as informational, never as a Critical, and never against this PR. ` + results.note;
15994
- }
15939
+ frameInstallFailure();
15995
15940
  return results;
15996
15941
  }
15942
+ __name(runNpmToolchain, "runNpmToolchain");
15943
+ var npmToolchainAdapter = {
15944
+ // A root package.json alone is not an npm build project — docs sites, husky,
15945
+ // and lint configs put one in Java repos. Apply only when runNpmToolchain can
15946
+ // actually scope something: MODELED workspaces that resolve to at least one
15947
+ // package, or a root build/test script. Mirroring the run-side gate here
15948
+ // matters at mixed roots: an unmodeled-glob declaration (`packages/**`,
15949
+ // `foo-*`) or a zero-package glob used to apply npm anyway, block a second
15950
+ // adapter's selection, and drop the repo to the very `unsupported` handoff
15951
+ // this guard exists to prevent — even though npm.run would immediately
15952
+ // concede unsupported and the other adapter alone would have succeeded.
15953
+ // When ZERO adapters
15954
+ // apply at an npm-shaped root, runBuildTest delegates here anyway so the
15955
+ // report carries runNpmToolchain's precise handoff note (the unmodeled-glob
15956
+ // gate below is that diagnostic path, not dead code).
15957
+ applies: /* @__PURE__ */ __name((root) => {
15958
+ const globs = readWorkspaceGlobs(root);
15959
+ if (globs.length > 0) {
15960
+ return !hasUnmodeledWorkspaceGlob(globs) && readWorkspacePackages(root).packages.length > 0;
15961
+ }
15962
+ return readRootPackage(root) !== null;
15963
+ }, "applies"),
15964
+ run: runNpmToolchain
15965
+ };
15966
+
15967
+ // packages/cli/src/commands/review/lib/toolchain.ts
15968
+ init_esbuild_shims();
15969
+ function selectToolchainAdapter(root, adapters) {
15970
+ const applicable = adapters.filter((adapter) => adapter.applies(root));
15971
+ return {
15972
+ adapter: applicable.length === 1 ? applicable[0] : null,
15973
+ applicable
15974
+ };
15975
+ }
15976
+ __name(selectToolchainAdapter, "selectToolchainAdapter");
15977
+
15978
+ // packages/cli/src/commands/review/build-test.ts
15979
+ var toolchainAdapters = [
15980
+ npmToolchainAdapter
15981
+ ];
15982
+ var KEEP_HEAD = 2e3;
15983
+ var KEEP_TAIL = 6e3;
15984
+ function spawnTimedOut(r) {
15985
+ return r.error?.code === "ETIMEDOUT" || r.signal === "SIGTERM" && r.status === null;
15986
+ }
15987
+ __name(spawnTimedOut, "spawnTimedOut");
15988
+ var MODULE_ERROR_RE = /Cannot find module '[^']+'|Could not resolve "[^"]+"/;
15989
+ var RUNNER_SUMMARY_RE = /^\s*(?:Tests?|Test Files):?\s+\d/;
15990
+ var ANSI_SGR_RE = /\x1b\[[0-9;]*m/g;
15991
+ function trimOutput(s) {
15992
+ if (s.length <= KEEP_HEAD + KEEP_TAIL) return s;
15993
+ const middle = s.slice(KEEP_HEAD, s.length - KEEP_TAIL);
15994
+ const RESCUE_MAX = 40;
15995
+ const rescued = middle.split("\n").filter(
15996
+ (l) => MODULE_ERROR_RE.test(l) || RUNNER_SUMMARY_RE.test(l.replace(ANSI_SGR_RE, ""))
15997
+ ).slice(0, RESCUE_MAX);
15998
+ const omitted = s.length - KEEP_HEAD - KEEP_TAIL;
15999
+ const marker = rescued.length ? `
16000
+
16001
+ ... [${omitted} characters omitted; module-resolution errors and runner summaries kept] ...
16002
+ ${rescued.join("\n")}
16003
+
16004
+ ` : `
16005
+
16006
+ ... [${omitted} characters omitted] ...
16007
+
16008
+ `;
16009
+ return s.slice(0, KEEP_HEAD) + marker + s.slice(-KEEP_TAIL);
16010
+ }
16011
+ __name(trimOutput, "trimOutput");
16012
+ function buildRunEnv(base = process.env) {
16013
+ return {
16014
+ ...base,
16015
+ CI: "1",
16016
+ npm_config_yes: "true",
16017
+ QWEN_SKIP_PREPARE: "1"
16018
+ };
16019
+ }
16020
+ __name(buildRunEnv, "buildRunEnv");
16021
+ function run(command, cwd, timeoutMs) {
16022
+ const started = Date.now();
16023
+ const deadlineMs = Math.max(1, Math.round(timeoutMs));
16024
+ const r = spawnSync3(command, {
16025
+ cwd,
16026
+ shell: true,
16027
+ encoding: "utf8",
16028
+ timeout: deadlineMs,
16029
+ maxBuffer: 64 * 1024 * 1024,
16030
+ // A build that asks a question is a build that hangs until the deadline.
16031
+ stdio: ["ignore", "pipe", "pipe"],
16032
+ env: buildRunEnv()
16033
+ });
16034
+ const timedOut = spawnTimedOut(r);
16035
+ return {
16036
+ command,
16037
+ exitCode: r.status,
16038
+ seconds: Math.round((Date.now() - started) / 1e3),
16039
+ timedOut,
16040
+ output: trimOutput(`${r.stdout ?? ""}${r.stderr ?? ""}`),
16041
+ deadlineMs
16042
+ };
16043
+ }
16044
+ __name(run, "run");
16045
+ function changedFilesFrom(planPath) {
16046
+ let parsed;
16047
+ try {
16048
+ parsed = JSON.parse(readFileSync23(planPath, "utf8"));
16049
+ } catch (err) {
16050
+ throw new Error(
16051
+ `build-test: cannot read the plan ${planPath}: ${err.message}`
16052
+ );
16053
+ }
16054
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
16055
+ throw new Error(
16056
+ `build-test: the plan ${planPath} is not a JSON object (got ${parsed === null ? "null" : Array.isArray(parsed) ? "an array" : typeof parsed}).`
16057
+ );
16058
+ }
16059
+ const report = parsed;
16060
+ const files = Array.isArray(report.files) ? report.files : [];
16061
+ return files.map((f) => f?.path).filter((p) => typeof p === "string" && p.length > 0);
16062
+ }
16063
+ __name(changedFilesFrom, "changedFilesFrom");
16064
+ function runBuildTest(args) {
16065
+ if (!Number.isFinite(args.timeout)) {
16066
+ throw new Error(
16067
+ `build-test: --timeout must be a finite number of seconds (got ${String(args.timeout)}).`
16068
+ );
16069
+ }
16070
+ if (args.budget !== void 0 && !Number.isFinite(args.budget)) {
16071
+ throw new Error(
16072
+ `build-test: --budget must be a finite number of seconds (got ${String(args.budget)}).`
16073
+ );
16074
+ }
16075
+ const root = resolve18(args.worktree);
16076
+ const changedFiles = changedFilesFrom(args.plan);
16077
+ const runArgs = {
16078
+ root,
16079
+ changedFiles,
16080
+ timeout: args.timeout,
16081
+ install: args.install,
16082
+ buildOnly: args.buildOnly,
16083
+ budget: args.budget,
16084
+ exec: args.exec ?? run
16085
+ };
16086
+ const { adapter, applicable } = selectToolchainAdapter(
16087
+ root,
16088
+ toolchainAdapters
16089
+ );
16090
+ if (!adapter) {
16091
+ if (applicable.length > 1) {
16092
+ return {
16093
+ toolchain: "unsupported",
16094
+ affected: [],
16095
+ buildSet: [],
16096
+ widenedWith: [],
16097
+ install: null,
16098
+ build: [],
16099
+ test: [],
16100
+ ok: true,
16101
+ timedOut: [],
16102
+ note: "More than one toolchain applies at the repository root. build-test will not guess which one owns this diff, so it ran nothing \u2014 report the ambiguity as a handoff instead of substituting ad hoc build or test commands."
16103
+ };
16104
+ }
16105
+ if (existsSync10(join17(root, "package.json"))) {
16106
+ return npmToolchainAdapter.run(runArgs);
16107
+ }
16108
+ return {
16109
+ toolchain: "unsupported",
16110
+ affected: [],
16111
+ buildSet: [],
16112
+ widenedWith: [],
16113
+ install: null,
16114
+ build: [],
16115
+ test: [],
16116
+ ok: true,
16117
+ timedOut: [],
16118
+ note: "No supported npm project here to scope. Fall back to the build/test precedence in your brief \u2014 installing dependencies first \u2014 and give each command a deadline it can actually meet."
16119
+ };
16120
+ }
16121
+ return adapter.run(runArgs);
16122
+ }
15997
16123
  __name(runBuildTest, "runBuildTest");
15998
16124
  var buildTestCommand = {
15999
16125
  command: "build-test",
@@ -16019,7 +16145,7 @@ var buildTestCommand = {
16019
16145
  }).option("install", {
16020
16146
  type: "boolean",
16021
16147
  default: true,
16022
- describe: "Run `npm ci` first when node_modules is absent"
16148
+ describe: "Fetch dependencies first: `npm ci` when node_modules is absent"
16023
16149
  }).option("build-only", {
16024
16150
  type: "boolean",
16025
16151
  default: false,
@@ -16044,25 +16170,25 @@ var buildTestCommand = {
16044
16170
  init_esbuild_shims();
16045
16171
  import { spawnSync as spawnSync5 } from "node:child_process";
16046
16172
  import {
16047
- existsSync as existsSync10,
16173
+ existsSync as existsSync11,
16048
16174
  mkdirSync as mkdirSync19,
16049
16175
  readFileSync as readFileSync24,
16050
- rmSync as rmSync7,
16176
+ rmSync as rmSync8,
16051
16177
  statSync as statSync12,
16052
16178
  writeFileSync as writeFileSync19
16053
16179
  } from "node:fs";
16054
- import { dirname as dirname17, join as join17, resolve as resolve19 } from "node:path";
16180
+ import { dirname as dirname17, join as join18, resolve as resolve19 } from "node:path";
16055
16181
 
16056
16182
  // packages/cli/src/commands/review/lib/worktree.ts
16057
16183
  init_esbuild_shims();
16058
16184
  import { spawnSync as spawnSync4 } from "node:child_process";
16059
- import { rmSync as rmSync6 } from "node:fs";
16185
+ import { rmSync as rmSync7 } from "node:fs";
16060
16186
  function discardWorktree(cwd, tree) {
16061
16187
  const sweep = spawnSync4("git", ["worktree", "remove", "--force", tree], {
16062
16188
  cwd,
16063
16189
  encoding: "utf8"
16064
16190
  });
16065
- rmSync6(tree, { recursive: true, force: true });
16191
+ rmSync7(tree, { recursive: true, force: true });
16066
16192
  return sweep;
16067
16193
  }
16068
16194
  __name(discardWorktree, "discardWorktree");
@@ -16116,14 +16242,14 @@ function runBaseTree(args) {
16116
16242
  );
16117
16243
  }
16118
16244
  const worktree = resolve19(args.worktree);
16119
- if (!existsSync10(worktree)) {
16245
+ if (!existsSync11(worktree)) {
16120
16246
  return unavailable(`the review worktree ${worktree} does not exist`);
16121
16247
  }
16122
16248
  const tree = baseWorktreePath(worktree);
16123
- const marker = /* @__PURE__ */ __name(() => join17(tree, ".qwen-review-base-ok"), "marker");
16124
- const failedMarker = /* @__PURE__ */ __name(() => join17(tree, ".qwen-review-base-failed"), "failedMarker");
16249
+ const marker = /* @__PURE__ */ __name(() => join18(tree, ".qwen-review-base-ok"), "marker");
16250
+ const failedMarker = /* @__PURE__ */ __name(() => join18(tree, ".qwen-review-base-failed"), "failedMarker");
16125
16251
  try {
16126
- if (existsSync10(tree) && readFileSync24(marker(), "utf8").trim() === baseSha && gitOut(tree, "rev-parse", "HEAD") === baseSha) {
16252
+ if (existsSync11(tree) && readFileSync24(marker(), "utf8").trim() === baseSha && gitOut(tree, "rev-parse", "HEAD") === baseSha) {
16127
16253
  return {
16128
16254
  available: true,
16129
16255
  path: tree,
@@ -16135,7 +16261,7 @@ function runBaseTree(args) {
16135
16261
  } catch {
16136
16262
  }
16137
16263
  try {
16138
- if (existsSync10(tree) && readFileSync24(failedMarker(), "utf8").trim() === baseSha) {
16264
+ if (existsSync11(tree) && readFileSync24(failedMarker(), "utf8").trim() === baseSha) {
16139
16265
  return {
16140
16266
  available: false,
16141
16267
  path: tree,
@@ -16150,7 +16276,7 @@ function runBaseTree(args) {
16150
16276
  try {
16151
16277
  const age = Date.now() - statSync12(lock).mtimeMs;
16152
16278
  if (age > 30 * 60 * 1e3) {
16153
- rmSync7(lock, { recursive: true, force: true });
16279
+ rmSync8(lock, { recursive: true, force: true });
16154
16280
  }
16155
16281
  } catch {
16156
16282
  }
@@ -16169,7 +16295,7 @@ function runBaseTree(args) {
16169
16295
  try {
16170
16296
  return buildBaseTree(baseSha);
16171
16297
  } finally {
16172
- rmSync7(lock, { recursive: true, force: true });
16298
+ rmSync8(lock, { recursive: true, force: true });
16173
16299
  }
16174
16300
  function buildBaseTree(baseSha2) {
16175
16301
  let sweep;
@@ -16270,7 +16396,7 @@ var baseTreeCommand = {
16270
16396
  // packages/cli/src/commands/review/test-delta.ts
16271
16397
  init_esbuild_shims();
16272
16398
  import { spawnSync as spawnSync6 } from "node:child_process";
16273
- import { existsSync as existsSync11, mkdirSync as mkdirSync20, readFileSync as readFileSync25, writeFileSync as writeFileSync20 } from "node:fs";
16399
+ import { existsSync as existsSync12, mkdirSync as mkdirSync20, readFileSync as readFileSync25, writeFileSync as writeFileSync20 } from "node:fs";
16274
16400
  import { dirname as dirname18, resolve as resolve20 } from "node:path";
16275
16401
  var ANSI_SGR_RE2 = /\x1b\[[0-9;]*m/g;
16276
16402
  var RERUNNABLE_COMMAND_RE = /^npm test(?: --workspace="[\w@./-]+")?$/;
@@ -16350,7 +16476,7 @@ function runTestDelta(args) {
16350
16476
  `cannot read the build-test report ${args.report}: ${err.message}`
16351
16477
  );
16352
16478
  }
16353
- if (!existsSync11(baseline)) {
16479
+ if (!existsSync12(baseline)) {
16354
16480
  return empty(
16355
16481
  `the base tree ${baseline} does not exist \u2014 run \`qwen review base-tree\` first`
16356
16482
  );
@@ -16501,11 +16627,11 @@ import {
16501
16627
  mkdirSync as mkdirSync21,
16502
16628
  writeFileSync as writeFileSync21,
16503
16629
  readFileSync as readFileSync26,
16504
- existsSync as existsSync12,
16505
- rmSync as rmSync8,
16630
+ existsSync as existsSync13,
16631
+ rmSync as rmSync9,
16506
16632
  statSync as statSync13
16507
16633
  } from "node:fs";
16508
- import { dirname as dirname19, join as join18, resolve as resolve21 } from "node:path";
16634
+ import { dirname as dirname19, join as join19, resolve as resolve21 } from "node:path";
16509
16635
  import { tmpdir as tmpdir2 } from "node:os";
16510
16636
  var SERVER_NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
16511
16637
  function shellQuote(v) {
@@ -16623,12 +16749,12 @@ function runDrive(args) {
16623
16749
  waitMs(POLL_MS);
16624
16750
  }
16625
16751
  }
16626
- const dir = join18(tmpdir2(), `qwen-review-drive-${server}`);
16752
+ const dir = join19(tmpdir2(), `qwen-review-drive-${server}`);
16627
16753
  mkdirSync21(dir, { recursive: true });
16628
- const scriptPath = join18(dir, "drive.sh");
16629
- const logPath = args.logPath ?? join18(dir, "drive.log");
16630
- const sentinelPath = join18(dir, "drive.rc");
16631
- rmSync8(sentinelPath, { force: true });
16754
+ const scriptPath = join19(dir, "drive.sh");
16755
+ const logPath = args.logPath ?? join19(dir, "drive.log");
16756
+ const sentinelPath = join19(dir, "drive.rc");
16757
+ rmSync9(sentinelPath, { force: true });
16632
16758
  writeFileSync21(scriptPath, wrapScript(args.script, sentinelPath), "utf8");
16633
16759
  const droveFrom = Date.now();
16634
16760
  let output = "";
@@ -16659,8 +16785,8 @@ function runDrive(args) {
16659
16785
  }
16660
16786
  const deadline = droveFrom + args.timeout * 1e3;
16661
16787
  for (; ; ) {
16662
- output = existsSync12(logPath) ? readFileSync26(logPath, "utf8") : "";
16663
- exitCode = existsSync12(sentinelPath) ? sentinelExitCode(readFileSync26(sentinelPath, "utf8")) : null;
16788
+ output = existsSync13(logPath) ? readFileSync26(logPath, "utf8") : "";
16789
+ exitCode = existsSync13(sentinelPath) ? sentinelExitCode(readFileSync26(sentinelPath, "utf8")) : null;
16664
16790
  if (exitCode !== null) {
16665
16791
  outcome = "completed";
16666
16792
  break;
@@ -16674,7 +16800,7 @@ function runDrive(args) {
16674
16800
  }
16675
16801
  } finally {
16676
16802
  tmux("kill-server");
16677
- if (!args.logPath) rmSync8(dir, { recursive: true, force: true });
16803
+ if (!args.logPath) rmSync9(dir, { recursive: true, force: true });
16678
16804
  }
16679
16805
  const { text, truncated } = trimCapture(output);
16680
16806
  const droveForMs = Date.now() - droveFrom;
@@ -17927,14 +18053,14 @@ import {
17927
18053
  readdirSync as readdirSync7,
17928
18054
  writeFileSync as writeFileSync24,
17929
18055
  readFileSync as readFileSync29,
17930
- rmSync as rmSync9,
18056
+ rmSync as rmSync10,
17931
18057
  lstatSync as lstatSync5,
17932
- existsSync as existsSync13,
18058
+ existsSync as existsSync14,
17933
18059
  statSync as statSync14,
17934
18060
  symlinkSync
17935
18061
  } from "node:fs";
17936
18062
  import { createRequire } from "node:module";
17937
- import { dirname as dirname22, join as join19, isAbsolute as isAbsolute5, sep as sep7 } from "node:path";
18063
+ import { dirname as dirname22, join as join20, isAbsolute as isAbsolute5, sep as sep7 } from "node:path";
17938
18064
  var FIXTURE_DIR_RE = /(^|\/)(__fixtures__|__mocks__|__snapshots__|fixtures)\//;
17939
18065
  function planTestEfficacy(files, workspaceGlobs) {
17940
18066
  const tests = files.filter((f) => f.kind === "test").map((f) => f.path);
@@ -18458,7 +18584,7 @@ function gitOut2(cwd, ...args) {
18458
18584
  }
18459
18585
  __name(gitOut2, "gitOut");
18460
18586
  function findVitestBin(worktree, resolveModule = createRequire(
18461
- join19(worktree, "noop.js")
18587
+ join20(worktree, "noop.js")
18462
18588
  ).resolve) {
18463
18589
  let pkgPath;
18464
18590
  try {
@@ -18474,7 +18600,7 @@ function findVitestBin(worktree, resolveModule = createRequire(
18474
18600
  if (!bin) {
18475
18601
  throw new Error(`vitest package at ${pkgPath} declares no "vitest" bin`);
18476
18602
  }
18477
- return join19(dirname22(pkgPath), bin);
18603
+ return join20(dirname22(pkgPath), bin);
18478
18604
  }
18479
18605
  __name(findVitestBin, "findVitestBin");
18480
18606
  function gitCapture(cwd, ...args) {
@@ -18500,7 +18626,7 @@ function safeRmWithin(worktree, relPath) {
18500
18626
  const parts = relPath.split(/[/\\]+/).filter((s) => s && s !== ".");
18501
18627
  let cur = worktree;
18502
18628
  for (let i = 0; i < parts.length; i++) {
18503
- cur = join19(cur, parts[i]);
18629
+ cur = join20(cur, parts[i]);
18504
18630
  let st;
18505
18631
  try {
18506
18632
  st = lstatSync5(cur);
@@ -18513,7 +18639,7 @@ function safeRmWithin(worktree, relPath) {
18513
18639
  );
18514
18640
  }
18515
18641
  }
18516
- rmSync9(cur, { force: true });
18642
+ rmSync10(cur, { force: true });
18517
18643
  }
18518
18644
  __name(safeRmWithin, "safeRmWithin");
18519
18645
  var existsAtBase = /* @__PURE__ */ __name((cwd, base, path3) => existsAtRev(cwd, base, path3), "existsAtBase");
@@ -18525,15 +18651,15 @@ __name(probeCleanupFailureDetail, "probeCleanupFailureDetail");
18525
18651
  function exposeDependencies(probeTree, dependencyRoot) {
18526
18652
  const done = { linked: 0, failed: 0 };
18527
18653
  if (probeTree === dependencyRoot) return done;
18528
- const source = join19(dependencyRoot, "node_modules");
18529
- const target = join19(probeTree, "node_modules");
18530
- if (!existsSync13(source) || existsSync13(target)) return done;
18654
+ const source = join20(dependencyRoot, "node_modules");
18655
+ const target = join20(probeTree, "node_modules");
18656
+ if (!existsSync14(source) || existsSync14(target)) return done;
18531
18657
  mkdirSync25(target);
18532
18658
  const linkType = process.platform === "win32" ? "junction" : "dir";
18533
18659
  for (const entry of readdirSync7(source, { withFileTypes: true })) {
18534
18660
  if (entry.name === ".vite" || entry.name === ".vite-temp") continue;
18535
- const sourceEntry = join19(source, entry.name);
18536
- const targetEntry = join19(target, entry.name);
18661
+ const sourceEntry = join20(source, entry.name);
18662
+ const targetEntry = join20(target, entry.name);
18537
18663
  let sourceStats;
18538
18664
  try {
18539
18665
  sourceStats = lstatSync5(sourceEntry);
@@ -18561,7 +18687,7 @@ function exposeDependencies(probeTree, dependencyRoot) {
18561
18687
  }
18562
18688
  for (const pkg of pkgs) {
18563
18689
  try {
18564
- symlinkSync(join19(sourceEntry, pkg), join19(targetEntry, pkg), linkType);
18690
+ symlinkSync(join20(sourceEntry, pkg), join20(targetEntry, pkg), linkType);
18565
18691
  done.linked++;
18566
18692
  } catch {
18567
18693
  done.failed++;
@@ -18707,7 +18833,7 @@ function newSideLength(header) {
18707
18833
  __name(newSideLength, "newSideLength");
18708
18834
  function runOneHunkProbe(probeTree, hunk, probes, deadlineAt, now = Date.now) {
18709
18835
  const { patch: _patch, ...meta } = hunk;
18710
- const abs = join19(probeTree, hunk.file);
18836
+ const abs = join20(probeTree, hunk.file);
18711
18837
  let original;
18712
18838
  try {
18713
18839
  original = readFileSync29(abs, "utf8");
@@ -18742,7 +18868,7 @@ function runOneHunkProbe(probeTree, hunk, probes, deadlineAt, now = Date.now) {
18742
18868
  }
18743
18869
  __name(runOneHunkProbe, "runOneHunkProbe");
18744
18870
  function runControlMutant(probeTree, probeFile, deadlineAt, now = Date.now) {
18745
- const abs = join19(probeTree, probeFile);
18871
+ const abs = join20(probeTree, probeFile);
18746
18872
  let original;
18747
18873
  try {
18748
18874
  original = readFileSync29(abs, "utf8");
@@ -18768,7 +18894,7 @@ __qcIt('QWEN-REVIEW-POSITIVE-CONTROL', () => {
18768
18894
  }
18769
18895
  __name(runControlMutant, "runControlMutant");
18770
18896
  function runOneMutant(probeTree, mutant, probes, deadlineAt, now = Date.now, dependencyRoot = probeTree) {
18771
- const abs = join19(probeTree, mutant.file);
18897
+ const abs = join20(probeTree, mutant.file);
18772
18898
  const original = readFileSync29(abs, "utf8");
18773
18899
  const lines = original.split("\n");
18774
18900
  if ((lines[mutant.line - 1] ?? "").trim() !== mutant.statement) {
@@ -18846,8 +18972,8 @@ async function runTestEfficacy(args) {
18846
18972
  globs
18847
18973
  );
18848
18974
  for (const p of revert) {
18849
- const norm = join19(worktree, p);
18850
- const root = join19(worktree, ".");
18975
+ const norm = join20(worktree, p);
18976
+ const root = join20(worktree, ".");
18851
18977
  if (isAbsolute5(p) || norm !== root && !norm.startsWith(root + sep7)) {
18852
18978
  throw new Error(
18853
18979
  `refusing to run: revert path escapes the worktree: ${JSON.stringify(p)}`
@@ -19119,7 +19245,7 @@ async function runTestEfficacy(args) {
19119
19245
  } catch (e) {
19120
19246
  removeError = e;
19121
19247
  }
19122
- if (existsSync13(probeTree)) {
19248
+ if (existsSync14(probeTree)) {
19123
19249
  cleanupFailure = probeCleanupFailureDetail(
19124
19250
  probeTree,
19125
19251
  removeError,
@@ -19296,8 +19422,8 @@ var testEfficacyCommand = {
19296
19422
 
19297
19423
  // packages/cli/src/commands/review/test-plan.ts
19298
19424
  init_esbuild_shims();
19299
- import { existsSync as existsSync14, mkdirSync as mkdirSync26, readFileSync as readFileSync30, writeFileSync as writeFileSync25 } from "node:fs";
19300
- import { dirname as dirname23, join as join20, normalize, resolve as resolve24 } from "node:path";
19425
+ import { existsSync as existsSync15, mkdirSync as mkdirSync26, readFileSync as readFileSync30, writeFileSync as writeFileSync25 } from "node:fs";
19426
+ import { dirname as dirname23, join as join21, normalize, resolve as resolve24 } from "node:path";
19301
19427
  var PLAN_NAME_RE = /(test\s*plan|\btesting\b|how\s+(?:has\s+this|to)\s+(?:been\s+)?test(?:ed)?|测试计划|测试方案|测试步骤)/i;
19302
19428
  var HEADING_LINE_RE = /^(#{1,6})(?:[ \t](.*))?$/;
19303
19429
  var BOLD_LINE_RE = /^\*\*([^*\n]+)\*\*:?\s*$/;
@@ -19500,7 +19626,7 @@ function rulePath(text, worktree, changed) {
19500
19626
  };
19501
19627
  }
19502
19628
  const ignored = isGitIgnored(worktree, path3);
19503
- if (existsSync14(join20(worktree, path3))) {
19629
+ if (existsSync15(join21(worktree, path3))) {
19504
19630
  return {
19505
19631
  kind: "path",
19506
19632
  text,
@@ -19571,7 +19697,7 @@ function ruleCommand(text, worktree, buildTest) {
19571
19697
  let rootScripts = [];
19572
19698
  try {
19573
19699
  const rootPkg = JSON.parse(
19574
- readFileSync30(join20(worktree, "package.json"), "utf8")
19700
+ readFileSync30(join21(worktree, "package.json"), "utf8")
19575
19701
  );
19576
19702
  rootScripts = Object.keys(rootPkg.scripts ?? {});
19577
19703
  } catch {
@@ -19585,7 +19711,7 @@ function ruleCommand(text, worktree, buildTest) {
19585
19711
  for (const dir of skipped) {
19586
19712
  try {
19587
19713
  const pkg = JSON.parse(
19588
- readFileSync30(join20(worktree, dir, "package.json"), "utf8")
19714
+ readFileSync30(join21(worktree, dir, "package.json"), "utf8")
19589
19715
  );
19590
19716
  for (const s of Object.keys(pkg?.scripts ?? {})) defined.add(s);
19591
19717
  } catch {
@@ -19787,8 +19913,8 @@ var testPlanCommand = {
19787
19913
  // packages/cli/src/commands/review/cleanup.ts
19788
19914
  init_esbuild_shims();
19789
19915
  import { execFileSync as execFileSync5 } from "node:child_process";
19790
- import { existsSync as existsSync15, readFileSync as readFileSync31, readdirSync as readdirSync8, rmSync as rmSync10 } from "node:fs";
19791
- import { join as join21 } from "node:path";
19916
+ import { existsSync as existsSync16, readFileSync as readFileSync31, readdirSync as readdirSync8, rmSync as rmSync11 } from "node:fs";
19917
+ import { join as join22 } from "node:path";
19792
19918
  var AUTOMATION_MARKER = "<!-- qwen-";
19793
19919
  function isAutomationComment(body) {
19794
19920
  return (body ?? "").trimStart().startsWith(AUTOMATION_MARKER);
@@ -19970,7 +20096,7 @@ function runCleanup(target) {
19970
20096
  report("probe worktree", probeWorktreePath(wt));
19971
20097
  report("base worktree", baseWorktreePath(wt));
19972
20098
  try {
19973
- rmSync10(`${baseWorktreePath(wt)}.lock`, { recursive: true, force: true });
20099
+ rmSync11(`${baseWorktreePath(wt)}.lock`, { recursive: true, force: true });
19974
20100
  } catch (err) {
19975
20101
  writeStderrLine(
19976
20102
  `note: could not remove base lock ${baseWorktreePath(wt)}.lock: ${err.message}`
@@ -19993,7 +20119,7 @@ function runCleanup(target) {
19993
20119
  const prefix = tmpPrefix(target);
19994
20120
  let tmpEntries = [];
19995
20121
  try {
19996
- tmpEntries = existsSync15(REVIEW_TMP_DIR) ? readdirSync8(REVIEW_TMP_DIR) : [];
20122
+ tmpEntries = existsSync16(REVIEW_TMP_DIR) ? readdirSync8(REVIEW_TMP_DIR) : [];
19997
20123
  } catch (err) {
19998
20124
  writeStderrLine(
19999
20125
  `Failed to read ${REVIEW_TMP_DIR}: ${err.message}`
@@ -20001,9 +20127,9 @@ function runCleanup(target) {
20001
20127
  }
20002
20128
  for (const file of tmpEntries) {
20003
20129
  if (!file.startsWith(prefix)) continue;
20004
- const full = join21(REVIEW_TMP_DIR, file);
20130
+ const full = join22(REVIEW_TMP_DIR, file);
20005
20131
  try {
20006
- rmSync10(full, { recursive: true, force: true });
20132
+ rmSync11(full, { recursive: true, force: true });
20007
20133
  writeStdoutLine(`Removed temp file: ${full}`);
20008
20134
  removedAny = true;
20009
20135
  } catch (err) {
@@ -20035,7 +20161,7 @@ var cleanupCommand = {
20035
20161
  // packages/cli/src/commands/review/cost-ledger.ts
20036
20162
  init_esbuild_shims();
20037
20163
  import { mkdirSync as mkdirSync27, readFileSync as readFileSync32, statSync as statSync15, writeFileSync as writeFileSync26 } from "node:fs";
20038
- import { dirname as dirname24, join as join22, resolve as resolve25 } from "node:path";
20164
+ import { dirname as dirname24, join as join23, resolve as resolve25 } from "node:path";
20039
20165
  function readUsage(file, floorMs) {
20040
20166
  const raw = readFileSync32(file, "utf8");
20041
20167
  const events = [];
@@ -20178,7 +20304,7 @@ __name(planFloorMs, "planFloorMs");
20178
20304
  function computeLedger(planPath, env = process.env) {
20179
20305
  const floorMs = planFloorMs(planPath);
20180
20306
  const { projectDir, sessionId, dir } = transcriptPaths(env);
20181
- const chatFile = join22(projectDir, "chats", `${sessionId}.jsonl`);
20307
+ const chatFile = join23(projectDir, "chats", `${sessionId}.jsonl`);
20182
20308
  let mainEvents;
20183
20309
  try {
20184
20310
  mainEvents = readUsage(chatFile, floorMs).events;
@@ -20203,7 +20329,7 @@ function computeLedger(planPath, env = process.env) {
20203
20329
  const agents = [];
20204
20330
  const agentEvents = [];
20205
20331
  for (const f of files) {
20206
- const full = join22(dir, f);
20332
+ const full = join23(dir, f);
20207
20333
  let mtimeMs;
20208
20334
  try {
20209
20335
  mtimeMs = statSync15(full).mtimeMs;
@@ -20349,7 +20475,7 @@ var costLedgerCommand = {
20349
20475
  init_esbuild_shims();
20350
20476
  import { spawn, execFileSync as execFileSync6 } from "node:child_process";
20351
20477
  import { readdirSync as readdirSync9, readFileSync as readFileSync33, realpathSync as realpathSync6, statSync as statSync16 } from "node:fs";
20352
- import { dirname as dirname25, join as join23, resolve as resolve26 } from "node:path";
20478
+ import { dirname as dirname25, join as join24, resolve as resolve26 } from "node:path";
20353
20479
  var COMPOSED_PATTERN = /^qwen-review-.*composed\.json$/;
20354
20480
  var COMPOSED_POLL_MS = 250;
20355
20481
  var SIGNAL_EXIT_CODES = {
@@ -20383,7 +20509,7 @@ function newestArtifactSince(dir, pattern, startMs) {
20383
20509
  }
20384
20510
  for (const name of names) {
20385
20511
  if (!pattern.test(name)) continue;
20386
- const path3 = join23(dir, name);
20512
+ const path3 = join24(dir, name);
20387
20513
  let mtime;
20388
20514
  try {
20389
20515
  mtime = statSync16(path3).mtimeMs;
@@ -20638,7 +20764,7 @@ var runCommand = {
20638
20764
  // packages/cli/src/commands/review/save-artifact.ts
20639
20765
  init_esbuild_shims();
20640
20766
  import {
20641
- existsSync as existsSync16,
20767
+ existsSync as existsSync17,
20642
20768
  lstatSync as lstatSync6,
20643
20769
  mkdirSync as mkdirSync28,
20644
20770
  readFileSync as readFileSync34,
@@ -20647,7 +20773,7 @@ import {
20647
20773
  import {
20648
20774
  dirname as dirname26,
20649
20775
  isAbsolute as isAbsolute6,
20650
- join as join24,
20776
+ join as join25,
20651
20777
  relative as relative6,
20652
20778
  resolve as resolve27,
20653
20779
  sep as sep8,
@@ -20677,8 +20803,8 @@ function rejectSymlinkPath(root, path3, label2) {
20677
20803
  const rel = relative6(root, path3);
20678
20804
  let current = root;
20679
20805
  for (const segment of rel.split(sep8)) {
20680
- current = join24(current, segment);
20681
- if (existsSync16(current) && lstatSync6(current).isSymbolicLink()) {
20806
+ current = join25(current, segment);
20807
+ if (existsSync17(current) && lstatSync6(current).isSymbolicLink()) {
20682
20808
  throw new Error(`${label2} must not traverse a symbolic link.`);
20683
20809
  }
20684
20810
  }
@@ -20686,7 +20812,7 @@ function rejectSymlinkPath(root, path3, label2) {
20686
20812
  __name(rejectSymlinkPath, "rejectSymlinkPath");
20687
20813
  function sameFile2(left, right) {
20688
20814
  if (left === right) return true;
20689
- if (!existsSync16(left) || !existsSync16(right)) return false;
20815
+ if (!existsSync17(left) || !existsSync17(right)) return false;
20690
20816
  const leftStat = statSync17(left);
20691
20817
  const rightStat = statSync17(right);
20692
20818
  return leftStat.dev === rightStat.dev && leftStat.ino === rightStat.ino;
@@ -21139,10 +21265,10 @@ var updateCommand3 = {
21139
21265
  stdioHelpers,
21140
21266
  { updateEventEmitter }
21141
21267
  ] = await Promise.all([
21142
- import("./settings-EQBUAQ7Y.js"),
21143
- import("./updateCheck-AXWSO7KA.js"),
21144
- import("./installationInfo-3YUGIP36.js"),
21145
- import("./standalone-update-2W26SRRO.js"),
21268
+ import("./settings-5O24D3OJ.js"),
21269
+ import("./updateCheck-LOS5GYFC.js"),
21270
+ import("./installationInfo-XXB75T7O.js"),
21271
+ import("./standalone-update-QP742MGP.js"),
21146
21272
  import("./stdioHelpers-7A2EE64Z.js"),
21147
21273
  import("./updateEventEmitter-5MKC7BLQ.js")
21148
21274
  ]);
@@ -22304,7 +22430,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
22304
22430
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
22305
22431
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
22306
22432
  terminalImageRenderSupportProvider: interactive ? async () => {
22307
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-S5WPPQKH.js");
22433
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-BWRESAQ7.js");
22308
22434
  return getTerminalImageRenderSupport();
22309
22435
  } : void 0,
22310
22436
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),